#include "messages_methods.h" #include "rpcconfig.h" #include "stg/users.h" #include "stg/user.h" #include "stg/message.h" #include "stg/common.h" #include // xmlrpc-c devs have missed something :) extern volatile time_t stgTime; //------------------------------------------------------------------------------ void METHOD_MESSAGE_SEND::execute(xmlrpc_c::paramList const & paramList, xmlrpc_c::value * const retvalPtr) { std::string cookie = paramList.getString(0); std::vector logins(paramList.getArray(1)); std::map msgInfo(paramList.getStruct(2)); paramList.verifyEnd(3); ADMIN_INFO adminInfo; if (config->GetAdminInfo(cookie, &adminInfo)) { *retvalPtr = xmlrpc_c::value_boolean(false); return; } STG::Message message; std::map::iterator it; if ((it = msgInfo.find("version")) == msgInfo.end()) { message.header.ver = 1; // Default value } else { message.header.ver = xmlrpc_c::value_int(it->second); } if ((it = msgInfo.find("type")) == msgInfo.end()) { message.header.type = 1; // default value } else { message.header.type = xmlrpc_c::value_int(it->second); } if ((it = msgInfo.find("repeat")) == msgInfo.end()) { *retvalPtr = xmlrpc_c::value_boolean(false); return; } message.header.repeat = xmlrpc_c::value_int(it->second); if ((it = msgInfo.find("repeat_period")) == msgInfo.end()) { *retvalPtr = xmlrpc_c::value_boolean(false); return; } message.header.repeatPeriod = xmlrpc_c::value_int(it->second); if ((it = msgInfo.find("show_time")) == msgInfo.end()) { *retvalPtr = xmlrpc_c::value_boolean(false); return; } message.header.showTime = xmlrpc_c::value_int(it->second); if ((it = msgInfo.find("text")) == msgInfo.end()) { *retvalPtr = xmlrpc_c::value_boolean(false); return; } message.text = IconvString(xmlrpc_c::value_string(it->second), "UTF-8", "CP1251"); message.header.creationTime = static_cast(stgTime); message.header.lastSendTime = 0; std::vector::iterator lit; for (lit = logins.begin(); lit != logins.end(); ++lit) { using UserPtr = STG::User*; UserPtr ui; if (users->FindByName(xmlrpc_c::value_string(*lit), &ui)) { printfd(__FILE__, "METHOD_MESSAGE_SEND::execute(): 'User '%s' not found'\n", std::string(xmlrpc_c::value_string(*lit)).c_str()); } else { ui->AddMessage(&message); } } *retvalPtr = xmlrpc_c::value_boolean(true); }