More work on subscription events, and relaying through world.

This commit is contained in:
KimLS
2014-08-01 18:29:41 -07:00
parent 002f5e3bcc
commit 40b555a55b
18 changed files with 657 additions and 72 deletions
+6 -5
View File
@@ -8,15 +8,16 @@ extern std::map<std::string, MethodHandler> unauthorized_methods;
void register_authorized_methods()
{
authorized_methods["token_auth"] = std::make_pair(0, handle_method_token_auth);
authorized_methods["list_zones"] = std::make_pair(10, handle_method_no_args);
authorized_methods["get_zone_info"] = std::make_pair(10, handle_method_get_zone_info);
authorized_methods["subscribe"] = std::make_pair(10, handle_method_subscribe);
authorized_methods["WebInterface::Authorize"] = std::make_pair(0, handle_method_token_auth);
authorized_methods["World::ListZones"] = std::make_pair(10, handle_method_no_args);
authorized_methods["World::GetZoneDetails"] = std::make_pair(10, handle_method_get_zone_info);
authorized_methods["Zone::Subscribe"] = std::make_pair(10, handle_method_subscribe);
authorized_methods["Zone::Unsubscribe"] = std::make_pair(10, handle_method_subscribe);
}
void register_unauthorized_methods()
{
unauthorized_methods["token_auth"] = handle_method_token_auth;
unauthorized_methods["WebInterface::Authorize"] = handle_method_token_auth;
}
void register_methods()
+15
View File
@@ -13,8 +13,13 @@ void WriteWebCallResponseString(per_session_data_eqemu *session, rapidjson::Docu
else {
writer.String(doc["id"].GetString());
}
writer.String("result");
writer.StartObject();
writer.String("value");
writer.String(result.c_str());
writer.EndObject();
writer.String("error");
if (error) {
writer.Bool(true);
@@ -39,8 +44,13 @@ void WriteWebCallResponseInt(per_session_data_eqemu *session, rapidjson::Documen
else {
writer.String(doc["id"].GetString());
}
writer.String("result");
writer.StartObject();
writer.String("value");
writer.Int(result);
writer.EndObject();
writer.String("error");
if (error) {
writer.Bool(true);
@@ -65,8 +75,13 @@ void WriteWebCallResponseBoolean(per_session_data_eqemu *session, rapidjson::Doc
else {
writer.String(doc["id"].GetString());
}
writer.String("result");
writer.StartObject();
writer.String("value");
writer.Bool(result);
writer.EndObject();
writer.String("error");
if (error) {
writer.Bool(true);
+114 -11
View File
@@ -74,17 +74,24 @@ void WorldServer::Process(){
pack->ReadString(error);
uint32 param_count = pack->ReadUInt32();
std::vector<std::string> params;
std::map<std::string, std::string> params;
for(uint32 i = 0; i < param_count; ++i) {
char *p = new char[pack->ReadUInt32() + 1];
pack->ReadString(p);
params.push_back(p);
safe_delete_array(p);
char *first = new char[pack->ReadUInt32() + 1];
pack->ReadString(first);
char *second = new char[pack->ReadUInt32() + 1];
pack->ReadString(second);
params[first] = second;
safe_delete_array(first);
safe_delete_array(second);
}
//send the response to client...
rapidjson::StringBuffer s;
rapidjson::Writer<rapidjson::StringBuffer> writer(s);
writer.StartObject();
writer.String("id");
if(strlen(id) == 0) {
@@ -103,14 +110,15 @@ void WorldServer::Process(){
writer.String("error");
writer.Null();
writer.String("result");
writer.StartArray();
uint32 p_sz = (uint32)params.size();
for(uint32 i = 0; i < p_sz; ++i) {
writer.String(params[i].c_str());
writer.StartObject();
auto iter = params.begin();
while(iter != params.end()) {
writer.String(iter->first.c_str());
writer.String(iter->second.c_str());
++iter;
}
writer.EndArray();
writer.EndObject();
}
writer.EndObject();
if(sessions.count(session_id) != 0) {
@@ -123,6 +131,101 @@ void WorldServer::Process(){
safe_delete_array(error);
break;
}
case ServerOP_WIRemoteCallToClient:
{
char *session_id = nullptr;
char *method = nullptr;
DumpPacket(pack);
session_id = new char[pack->ReadUInt32() + 1];
pack->ReadString(session_id);
method = new char[pack->ReadUInt32() + 1];
pack->ReadString(method);
uint32 param_count = pack->ReadUInt32();
std::vector<std::string> params(param_count);
for(uint32 i = 0; i < param_count; ++i) {
char *p = new char[pack->ReadUInt32() + 1];
pack->ReadString(p);
params[i] = p;
safe_delete_array(p);
}
rapidjson::StringBuffer s;
rapidjson::Writer<rapidjson::StringBuffer> writer(s);
writer.StartObject();
writer.String("id");
writer.Null();
writer.String("method");
writer.String(method);
writer.String("params");
writer.StartArray();
for(uint32 i = 0; i < param_count; ++i) {
writer.String(params[i].c_str());
}
writer.EndArray();
writer.EndObject();
if(sessions.count(session_id) != 0) {
per_session_data_eqemu *session = sessions[session_id];
session->send_queue->push_back(s.GetString());
}
safe_delete_array(session_id);
safe_delete_array(method);
break;
}
case ServerOP_WIClientSession:
{
std::vector<std::string> invalidate;
uint32 zone_id = pack->ReadUInt32();
uint32 instance_id = pack->ReadUInt32();
uint32 count = pack->ReadUInt32();
for(uint32 i = 0; i < count; ++i) {
char *p = new char[pack->ReadUInt32() + 1];
pack->ReadString(p);
if(sessions.count(p) == 0) {
invalidate.push_back(p);
}
safe_delete_array(p);
}
if(invalidate.size() != 0) {
uint32 sz = 12;
size_t isz = invalidate.size();
for(size_t i = 0; i < isz; ++i) {
sz += invalidate[i].size();
sz += 5;
}
ServerPacket *pack = new ServerPacket(ServerOP_WIClientSessionResponse, sz);
pack->WriteUInt32((uint32)zone_id);
pack->WriteUInt32((uint32)instance_id);
pack->WriteUInt32((uint32)invalidate.size());
for(size_t i = 0; i < isz; ++i) {
pack->WriteUInt32((uint32)invalidate[i].size());
pack->WriteString(invalidate[i].c_str());
}
SendPacket(pack);
safe_delete(pack);
}
break;
}
}
}