void WebConferenceFactory::vqConferenceFeedback(const AmArg& args, AmArg& ret) { assertArgCStr(args.get(0)); assertArgCStr(args.get(1)); assertArgCStr(args.get(2)); assertArgCStr(args.get(3)); assertArgInt(args.get(4)); string room = args.get(0).asCStr(); string adminpin = args.get(1).asCStr(); string sender = args.get(2).asCStr(); string comment = args.get(3).asCStr(); int opinion = args.get(4).asInt(); saveFeedback("CO|||"+ room + "|||" + adminpin + "|||" + int2str(opinion) + "|||" + sender + "|||" + comment +"|||" + int2str(time(NULL)) + "|||\n"); ret.push(0); ret.push("OK"); }
void AmArg2DSMStrMap(const AmArg& arg, map<string, string>& vars) { for (AmArg::ValueStruct::const_iterator it=arg.begin(); it != arg.end(); it++) { if (it->second.getType() == AmArg::CStr) vars[it->first] = it->second.asCStr(); else if (it->second.getType() == AmArg::Array) { vars[it->first+"_size"] = int2str((unsigned int)it->second.size()); for (size_t i=0;i<it->second.size();i++) { if (it->second.get(i).getType() == AmArg::CStr) vars[it->first+"_"+int2str((unsigned int)i)] = it->second.get(i).asCStr(); else vars[it->first+"_"+int2str((unsigned int)i)] = AmArg::print(it->second.get(i)); } } else { vars[it->first] = AmArg::print(it->second); } } }
void DSMFactory::preloadModules(const AmArg& args, AmArg& ret) { AmConfigReader cfg; if(cfg.loadFile(AmConfig::ModConfigPath + string(MOD_NAME ".conf"))) { ret.push(500); ret.push("loading config file " +AmConfig::ModConfigPath + string(MOD_NAME ".conf")); return ; } string err; string ModPath = cfg.getParameter("mod_path"); int res = preloadModules(cfg, err, ModPath); if (res<0) { ret.push(500); ret.push(err); } else { ret.push(200); ret.push("modules preloaded"); } }
void JsonRPCServerModule::execRpc(const AmArg& args, AmArg& ret) { AmArg none_params; AmArg& params = none_params; if (args.size()>7) params = args.get(7); AmArg u_none_params; AmArg& udata = u_none_params; if (args.size()>8) udata = args.get(8); JsonRPCServerLoop::execRpc(// evq_link, notification_link, request_link args.get(0).asCStr(), args.get(1).asCStr(), args.get(2).asCStr(), // flags args.get(3).asInt(), // host, port, method args.get(4).asCStr(), args.get(5).asInt(), args.get(6).asCStr(), params, udata, ret); }
void SBCFactory::listProfiles(const AmArg& args, AmArg& ret) { profiles_mut.lock(); for (std::map<string, SBCCallProfile>::iterator it= call_profiles.begin(); it != call_profiles.end(); it++) { AmArg p; p["name"] = it->first; p["md5"] = it->second.md5hash; p["path"] = it->second.profile_file; ret.push((p)); } profiles_mut.unlock(); }
AmArg ConferenceRoomParticipant::asArgArray() { AmArg res; res.push(AmArg(localtag.c_str())); res.push(AmArg(number.c_str())); res.push(AmArg((int)status)); res.push(AmArg(last_reason.c_str())); res.push(AmArg((int)muted)); res.push(AmArg(participant_id)); return res; }
void AnnRecorderDialog::saveMessage(FILE* fp) { string msg_name = params["type"]+".wav"; DBG("message name is '%s'\n", msg_name.c_str()); AmArg di_args,ret; di_args.push((params["domain"]+DOMAIN_PROMPT_SUFFIX).c_str()); // domain di_args.push(params["user"].c_str()); // user di_args.push(msg_name.c_str()); // message name AmArg df; MessageDataFile df_arg(fp); df.setBorrowedPointer(&df_arg); di_args.push(df); try { msg_storage->invoke("msg_new",di_args,ret); } catch(string& s) { ERROR("invoking msg_new: '%s'\n", s.c_str()); } catch(...) { ERROR("invoking msg_new.\n"); } // TODO: evaluate ret return value }
void SBCFactory::reloadProfile(const AmArg& args, AmArg& ret) { bool failed = false; string res = "OK"; AmArg p; if (!args[0].hasMember("name")) { ret.push(400); ret.push("Parameters error: expected ['name': profile_name] "); return; } profiles_mut.lock(); std::map<string, SBCCallProfile>::iterator it= call_profiles.find(args[0]["name"].asCStr()); if (it == call_profiles.end()) { res = "profile '"+string(args[0]["name"].asCStr())+"' not found"; failed = true; } else { SBCCallProfile new_cp; if (!new_cp.readFromConfiguration(it->first, it->second.profile_file)) { ERROR("reading call profile file '%s'\n", it->second.profile_file.c_str()); res = "Error reading call profile for "+it->first+" from "+it->second.profile_file; failed = true; } else { it->second = new_cp; p["name"] = it->first; p["md5"] = it->second.md5hash; p["path"] = it->second.profile_file; } } profiles_mut.unlock(); if (!failed) { ret.push(200); ret.push(res); ret.push(p); } else { ret.push(500); ret.push(res); } }
string DIDial::dialout_auth(const string& application, const string& user, const string& from, const string& to, const string& a_realm, const string& a_user, const string& a_pwd ) { DBG("dialout application '%s', user '%s', from '%s', to '%s'", application.c_str(), user.c_str(), from.c_str(), to.c_str()); AmArg* a = new AmArg(); a->setBorrowedPointer(new UACAuthCred(a_realm, a_user, a_pwd)); AmSession* s = AmUAC::dialout(user.c_str(), application, to, "<" + from + ">", from, "<" + to + ">", string(""), // callid a); if (s) return s->getLocalTag(); else return "<failed>\n"; }
void XMLRPC2DIServer::amarg2xmlrpcval(const AmArg& a, XmlRpcValue& result) { switch (a.getType()) { case AmArg::CStr: // DBG("a->X CSTR\n"); result = string(a.asCStr()); break; case AmArg::Int: // DBG("a->X INT\n"); result=a.asInt(); break; case AmArg::Double: // DBG("a->X DOUBLE\n"); result=a.asDouble(); break; case AmArg::Array: // DBG("a->X ARRAY size %u\n", a.size()); result.setSize(a.size()); for (size_t i=0;i<a.size();i++) { // duh... recursion... amarg2xmlrpcval(a.get(i), result[i]); } break; case AmArg::Struct: // DBG("a->X STRUCT size %u\n", a.size()); for (AmArg::ValueStruct::const_iterator it = a.begin(); it != a.end(); it++) { // duh... recursion... amarg2xmlrpcval(it->second, result[it->first]); } break; default: { WARN("unsupported return value type %d\n", a.getType()); } break; // TODO: do sth with the data here ? } }
void WebConferenceFactory::getRoomPassword(const AmArg& args, AmArg& ret) { string pwd = args.get(0).asCStr(); string room = args.get(1).asCStr(); if ((!MasterPassword.length()) || pwd != MasterPassword) { ret.push(403); ret.push("Wrong Master Password.\n"); return; } int res_code = 404; string res = "Room does not exist."; rooms_mut.lock(); map<string, ConferenceRoom>::iterator it = rooms.find(room); if (it != rooms.end()) { res = it->second.adminpin; res_code = 0; } rooms_mut.unlock(); ret.push(res_code); ret.push(res.c_str()); }
void JsonRPCServerModule::sendMessage(const AmArg& args, AmArg& ret) { AmArg none_params; AmArg& params = none_params; if (args.size()>5) params = args.get(5); AmArg u_none_params; AmArg& udata = u_none_params; if (args.size()>6) udata = args.get(6); JsonRPCServerLoop::sendMessage(args.get(0).asCStr(), // conn_id, args.get(1).asInt(), // type, (0 == reply) args.get(2).asCStr(), // method, args.get(3).asCStr(), // id args.get(4).asCStr(), // reply_sink params, udata, ret); }
void DSMFactory::loadDSM(const AmArg& args, AmArg& ret) { string dsm_name = args.get(0).asCStr(); AmConfigReader cfg; if(cfg.loadFile(AmConfig::ModConfigPath + string(MOD_NAME ".conf"))) { ret.push(500); ret.push("loading config file " +AmConfig::ModConfigPath + string(MOD_NAME ".conf")); return; } string DiagPath = cfg.getParameter("diag_path"); if (DiagPath.length() && DiagPath[DiagPath.length()-1] != '/') DiagPath += '/'; string ModPath = cfg.getParameter("mod_path"); string dsm_file_name = DiagPath+dsm_name+".dsm"; string res = "OK"; ScriptConfigs_mut.lock(); try { if (MainScriptConfig.diags->hasDiagram(dsm_name)) { ret.push(400); ret.push("DSM named '" + dsm_name + "' already loaded (use reloadDSMs to reload all)"); } else { if (!MainScriptConfig.diags->loadFile(dsm_file_name, dsm_name, ModPath, DebugDSM)) { ret.push(500); ret.push("error loading "+dsm_name+" from "+ dsm_file_name); } else { ret.push(200); ret.push("loaded "+dsm_name+" from "+ dsm_file_name); } } } catch(...) { ScriptConfigs_mut.unlock(); throw; } ScriptConfigs_mut.unlock(); }
void WebConferenceFactory::vqRoomFeedback(const AmArg& args, AmArg& ret) { assertArgCStr(args.get(0)); assertArgCStr(args.get(1)); assertArgInt(args.get(2)); string room = args.get(0).asCStr(); string adminpin = args.get(1).asCStr(); int opinion = args.get(2).asInt(); saveFeedback(string("RO "+ room + "|||" + adminpin + "|||" + int2str(opinion) + "|||" + int2str(time(NULL)) + "|||\n")); ret.push(0); ret.push("OK"); }
static RestParams::Format getFormat(const AmArg &values, RestParams::Format _default) { if (!values.hasMember("format")) return _default; const AmArg &a = values["format"]; if (!isArgCStr(a)) throw string("configuration error: wrong arg type\n"); const char *str = a.asCStr(); if (str) { if (strcmp(str, "text") == 0) return RestParams::TEXT; if (strcmp(str, "json") == 0) return RestParams::JSON; if (strcmp(str, "xml") == 0) return RestParams::XML; } throw string("invalid format parameter value\n"); return _default; }
void XMLRPC2DIServer::amarg2xmlrpcval(AmArg& a, XmlRpcValue& result) { switch (a.getType()) { case AmArg::CStr: result = string(a.asCStr()); break; case AmArg::Int: result=a.asInt(); break; case AmArg::Double: result=a.asDouble(); break; case AmArg::Array: result.setSize(a.size()); for (size_t i=0;i<a.size();i++) { // duh... recursion... amarg2xmlrpcval(a.get(i), result[i]); } break; default: { WARN("unsupported return value type %d\n", a.getType()); } break; // TODO: do sth with the data here ? } }
void UserTimer::invoke(const string& method, const AmArg& args, AmArg& ret) { if(method == "setTimer"){ setTimer(args.get(0).asInt(), args.get(1).asInt(), args.get(2).asCStr()); } else if(method == "removeTimer"){ removeTimer(args.get(0).asInt(), args.get(1).asCStr()); } else if(method == "removeUserTimers"){ removeUserTimers(args.get(0).asCStr()); } else throw AmDynInvoke::NotImplemented(method); }
void WebConferenceFactory::resetFeedback(const AmArg& args, AmArg& ret) { assertArgCStr(args.get(0)); string feedback_filename = args.get(0).asCStr(); feedback_file.close(); if (!feedback_filename.empty()) { feedback_file.open(feedback_filename.c_str(), std::ios::out); if (!feedback_file.good()) { ERROR("opening new feedback file '%s'\n", feedback_filename.c_str()); ret.push(-1); ret.push("error opening new feedback file"); } else { DBG("successfully opened new feedback file '%s'\n", feedback_filename.c_str()); ret.push(0); ret.push("OK"); } } else { ret.push(-2); ret.push("no filename given"); } }
void DSMFactory::preloadModule(const AmArg& args, AmArg& ret) { string mod_name = args.get(0).asCStr(); string mod_path = args.get(1).asCStr(); if (!preload_reader.importModule("import("+mod_name+")", mod_path)) { ret.push(500); ret.push("importing module '"+mod_name+"' for preload"); return; } DSMModule* last_loaded = preload_reader.mods.back(); if (last_loaded) { if (last_loaded->preload()) { ret.push(500); ret.push("Error while preloading '"+mod_name+"'"); return; } } ret.push(200); ret.push("module preloaded."); return; }
void XMLRPC2DI::sendRequest(const AmArg& args, AmArg& ret) { string app_name = args.get(0).asCStr(); string method = args.get(1).asCStr(); AmArg& params = args.get(2); while (true) { XMLRPCServerEntry* srv = getServer(app_name); if (NULL == srv) { ret.push(-1); ret.push("no active connections"); return; } XmlRpcClient c((const char*)srv->server.c_str(), (int)srv->port, (const char*)srv->uri.empty()?NULL:srv->uri.c_str() #ifdef HAVE_XMLRPCPP_SSL , false #endif ); XmlRpcValue x_args, x_result; XMLRPC2DIServer::amarg2xmlrpcval(params, x_args); if (c.execute(method.c_str(), x_args, x_result) && !c.isFault()) { DBG("successfully executed method %s on server %s:%d\n", method.c_str(), srv->server.c_str(), srv->port); ret.push(0); ret.push("OK"); ret.assertArray(3); XMLRPC2DIServer::xmlrpcval2amarg(x_result, ret[2]); return; } else { DBG("executing method %s failed on server %s:%d\n", method.c_str(), srv->server.c_str(), srv->port); srv->set_failed(); } } }
void DSMFactory::hasDSM(const AmArg& args, AmArg& ret) { string conf_name; if (args.size()>1 && isArgCStr(args.get(1))) conf_name = args.get(1).asCStr(); bool res; ScriptConfigs_mut.lock(); try { res = hasDSM(args.get(0).asCStr(), conf_name); } catch(...) { ScriptConfigs_mut.unlock(); throw; } ScriptConfigs_mut.unlock(); if (res) ret.push("1"); else ret.push("0"); }
void XMLRPC2DIServer::xmlrpcval2amarg(XmlRpcValue& v, AmArg& a, unsigned int start_index) { if (v.valid()) { for (int i=start_index; i<v.size();i++) { switch (v[i].getType()) { case XmlRpcValue::TypeInt: { /* DBG("X->A INT\n");*/ a.push(AmArg((int)v[i])); } break; case XmlRpcValue::TypeDouble:{ /* DBG("X->A DBL\n");*/ a.push(AmArg((double)v[i])); } break; case XmlRpcValue::TypeString:{ /* DBG("X->A STR\n");*/ a.push(AmArg(((string)v[i]).c_str())); } break; case XmlRpcValue::TypeArray: { // DBG("X->A ARR\n"); a.push(AmArg()); a[a.size()-1].assertArray(0); AmArg arr; xmlrpcval2amarg(v[i], a[a.size()-1], 0); } break; // TODO: support more types (datetime, struct, ...) default: throw XmlRpcException("unsupported parameter type", 400); }; } } }
void SBCFactory::setRegexMap(const AmArg& args, AmArg& ret) { if (!args[0].hasMember("name") || !args[0].hasMember("file") || !isArgCStr(args[0]["name"]) || !isArgCStr(args[0]["file"])) { ret.push(400); ret.push("Parameters error: expected ['name': <name>, 'file': <file name>]"); return; } string m_name = args[0]["name"].asCStr(); string m_file = args[0]["file"].asCStr(); RegexMappingVector v; if (!read_regex_mapping(m_file, "=>", "SBC regex mapping", v)) { ERROR("reading regex mapping from '%s'\n", m_file.c_str()); ret.push(401); ret.push("Error reading regex mapping from file"); return; } regex_mappings.setRegexMap(m_name, v); ret.push(200); ret.push("OK"); }
void DSMFactory::reloadDSMs(const AmArg& args, AmArg& ret) { DSMStateDiagramCollection* new_diags = new DSMStateDiagramCollection(); AmConfigReader cfg; if(cfg.loadFile(AmConfig::ModConfigPath + string(MOD_NAME ".conf"))) { ret.push(500); ret.push("loading config file " +AmConfig::ModConfigPath + string(MOD_NAME ".conf")); return ; } string DiagPath = cfg.getParameter("diag_path"); if (DiagPath.length() && DiagPath[DiagPath.length()-1] != '/') DiagPath += '/'; string ModPath = cfg.getParameter("mod_path"); string LoadDiags = cfg.getParameter("load_diags"); vector<string> diags_names = explode(LoadDiags, ","); for (vector<string>::iterator it= diags_names.begin(); it != diags_names.end(); it++) { if (!new_diags->loadFile(DiagPath+*it+".dsm", *it, DiagPath, ModPath, DebugDSM, CheckDSM)) { ERROR("loading %s from %s\n", it->c_str(), (DiagPath+*it+".dsm").c_str()); ret.push(500); ret.push("loading " +*it+ " from "+ DiagPath+*it+".dsm"); return; } } ScriptConfigs_mut.lock(); old_diags.insert(MainScriptConfig.diags); MainScriptConfig.diags = new_diags; ScriptConfigs_mut.unlock(); ret.push(200); ret.push("DSMs reloaded"); }
void DSMFactory::invoke(const string& method, const AmArg& args, AmArg& ret) { if (method == "postDSMEvent"){ assertArgCStr(args.get(0)) DSMEvent* ev = new DSMEvent(); for (size_t i=0;i<args[1].size();i++) ev->params[args[1][i][0].asCStr()] = args[1][i][1].asCStr(); if (AmSessionContainer::instance()->postEvent(args.get(0).asCStr(), ev)) { ret.push(AmArg(200)); ret.push(AmArg("OK")); } else { ret.push(AmArg(404)); ret.push(AmArg("Session not found")); } } else if (method == "reloadDSMs"){ reloadDSMs(args,ret); } else if (method == "loadDSM"){ args.assertArrayFmt("s"); loadDSM(args,ret); } else if (method == "loadDSMWithPath"){ args.assertArrayFmt("sss"); loadDSMWithPaths(args,ret); } else if (method == "preloadModules"){ preloadModules(args,ret); } else if (method == "preloadModule"){ args.assertArrayFmt("ss"); preloadModule(args,ret); } else if (method == "hasDSM"){ args.assertArrayFmt("s"); hasDSM(args,ret); } else if (method == "listDSMs"){ listDSMs(args,ret); } else if (method == "registerApplication"){ args.assertArrayFmt("s"); registerApplication(args,ret); } else if (method == "loadConfig"){ args.assertArrayFmt("ss"); loadConfig(args,ret); } else if(method == "_list"){ ret.push(AmArg("postDSMEvent")); ret.push(AmArg("reloadDSMs")); ret.push(AmArg("loadDSM")); ret.push(AmArg("loadDSMWithPaths")); ret.push(AmArg("preloadModules")); ret.push(AmArg("preloadModule")); ret.push(AmArg("loadConfig")); ret.push(AmArg("hasDSM")); ret.push(AmArg("listDSMs")); ret.push(AmArg("registerApplication")); } else throw AmDynInvoke::NotImplemented(method); }
void WebConferenceFactory::roomInfo(const AmArg& args, AmArg& ret) { assertArgCStr(args.get(0)); assertArgCStr(args.get(1)); string room = args.get(0).asCStr(); string adminpin = args.get(1).asCStr();; rooms_mut.lock(); ConferenceRoom* r = getRoom(room, adminpin); if (NULL == r) { ret.push(1); ret.push("wrong adminpin"); // for consistency, add an empty array AmArg a; a.assertArray(0); ret.push(a); } else { ret.push(0); ret.push("OK"); ret.push(r->asArgArray()); } rooms_mut.unlock(); }
void WebConferenceFactory::dialout(const AmArg& args, AmArg& ret) { for (int i=0;i<6;i++) assertArgCStr(args.get(i)); string room = args.get(0).asCStr(); string adminpin = args.get(1).asCStr(); string callee = args.get(2).asCStr(); string from_user = args.get(3).asCStr(); string domain = args.get(4).asCStr(); string auth_user = args.get(5).asCStr(); string auth_pwd = args.get(6).asCStr(); string callee_domain; string headers; try { assertArgCStr(args.get(7)); headers = args.get(7).asCStr(); int i, len; len = headers.length(); for (i = 0; i < len; i++) { if (headers[i] == '|') headers[i] = '\n'; } if (headers[len - 1] != '\n') { headers += '\n'; } } catch (AmArg::OutOfBoundsException &e) { headers = ""; } try { assertArgCStr(args.get(8)); callee_domain = args.get(8).asCStr(); } catch (AmArg::OutOfBoundsException &e) { callee_domain = domain; } string from = "sip:" + from_user + "@" + domain; string to = "sip:" + callee + "@" + callee_domain; // check adminpin rooms_mut.lock(); // sweep rooms (if necessary) sweepRooms(); ConferenceRoom* r = getRoom(room, adminpin); rooms_mut.unlock(); if (NULL == r) { ret.push(1); ret.push("wrong adminpin"); ret.push(""); return; } DBG("dialout webconference room '%s', from '%s', to '%s'", room.c_str(), from.c_str(), to.c_str()); AmArg* a = new AmArg(); a->setBorrowedPointer(new UACAuthCred("", auth_user, auth_pwd)); AmSession* s = AmUAC::dialout(room.c_str(), APP_NAME, to, "<" + from + ">", from, "<" + to + ">", string(""), // callid headers, // headers a); if (s) { string localtag = s->getLocalTag(); ret.push(0); ret.push("OK"); ret.push(localtag.c_str()); newParticipant(room, localtag, to); updateStatus(room, localtag, ConferenceRoomParticipant::Connecting, "INVITE"); } else { ret.push(1); ret.push("internal error"); ret.push(""); } }
void SBCFactory::invoke(const string& method, const AmArg& args, AmArg& ret) { if (method == "listProfiles"){ listProfiles(args, ret); } else if (method == "reloadProfiles"){ reloadProfiles(args,ret); } else if (method == "loadProfile"){ args.assertArrayFmt("u"); loadProfile(args,ret); } else if (method == "reloadProfile"){ args.assertArrayFmt("u"); reloadProfile(args,ret); } else if (method == "getActiveProfile"){ getActiveProfile(args,ret); } else if (method == "setActiveProfile"){ args.assertArrayFmt("u"); setActiveProfile(args,ret); } else if (method == "getRegexMapNames"){ getRegexMapNames(args,ret); } else if (method == "setRegexMap"){ args.assertArrayFmt("u"); setRegexMap(args,ret); } else if (method == "loadCallcontrolModules"){ args.assertArrayFmt("s"); loadCallcontrolModules(args,ret); } else if (method == "postControlCmd"){ args.assertArrayFmt("ss"); // at least call-ltag, cmd postControlCmd(args,ret); } else if(method == "_list"){ ret.push(AmArg("listProfiles")); ret.push(AmArg("reloadProfiles")); ret.push(AmArg("reloadProfile")); ret.push(AmArg("loadProfile")); ret.push(AmArg("getActiveProfile")); ret.push(AmArg("setActiveProfile")); ret.push(AmArg("getRegexMapNames")); ret.push(AmArg("setRegexMap")); ret.push(AmArg("loadCallcontrolModules")); ret.push(AmArg("postControlCmd")); ret.push(AmArg("printCallStats")); } else if(method == "printCallStats"){ B2BMediaStatistics::instance()->getReport(args, ret); } else throw AmDynInvoke::NotImplemented(method); }
void JsonRPCServerModule::invoke(const string& method, const AmArg& args, AmArg& ret) { if (method == "execRpc"){ // todo: add connection id args.assertArrayFmt("sssisis"); // evq_link, notificationReceiver, requestReceiver, // flags(i), host, port (i), method, [params] if (args.size() > 7) { if (!isArgArray(args.get(7)) && !isArgStruct(args.get(7))) { ERROR("internal error: params to JSON-RPC must be struct or array\n"); throw AmArg::TypeMismatchException(); } } execRpc(args, ret); // sendRequestList(args, ret); } else if (method == "sendMessage"){ args.assertArrayFmt("sisss"); // conn_id, type, method, id, reply_sink, [params] if (args.size() > 5) { if (!isArgArray(args.get(5)) && !isArgStruct(args.get(5))) { ERROR("internal error: params to JSON-RPC must be struct or array\n"); throw AmArg::TypeMismatchException(); } } sendMessage(args, ret); } else if (method == "execServerFunction"){ args.assertArrayFmt("ss"); // method, id, params JsonRpcServer::execRpc(args.get(0).asCStr(), args.get(1).asCStr(), args.get(2), ret); // JsonRpcServer::execRpc(args, ret); } else if (method == "getServerPort"){ ret.push(port); } else if(method == "_list"){ ret.push(AmArg("execRpc")); ret.push(AmArg("sendMessage")); ret.push(AmArg("getServerPort")); ret.push(AmArg("execServerFunction")); // ret.push(AmArg("newConnection")); // ret.push(AmArg("sendRequest")); // ret.push(AmArg("sendRequestList")); } else throw AmDynInvoke::NotImplemented(method); }
void WebConferenceFactory::serverInfo(const AmArg& args, AmArg& ret) { ret.push(getServerInfoString().c_str()); }