]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/configuration/rpcconfig/messages_methods.cpp
Optimized sending answers in sgconfig.
[stg.git] / projects / stargazer / plugins / configuration / rpcconfig / messages_methods.cpp
1 #include <ostream> // xmlrpc-c devs have missed something :)
2
3 #include "stg/message.h"
4 #include "stg/common.h"
5 #include "messages_methods.h"
6 #include "rpcconfig.h"
7
8 extern volatile time_t stgTime;
9
10 //------------------------------------------------------------------------------
11
12 void METHOD_MESSAGE_SEND::execute(xmlrpc_c::paramList const & paramList,
13                                   xmlrpc_c::value *   const   retvalPtr)
14 {
15 std::string cookie = paramList.getString(0);
16 std::vector<xmlrpc_c::value> logins(paramList.getArray(1));
17 std::map<std::string, xmlrpc_c::value> msgInfo(paramList.getStruct(2));
18 paramList.verifyEnd(3);
19
20 ADMIN_INFO adminInfo;
21
22 if (config->GetAdminInfo(cookie, &adminInfo))
23     {
24     *retvalPtr = xmlrpc_c::value_boolean(false);
25     return;
26     }
27
28 STG_MSG message;
29
30 std::map<std::string, xmlrpc_c::value>::iterator it;
31
32 if ((it = msgInfo.find("version")) == msgInfo.end())
33     {
34     message.header.ver = 1; // Default value
35     }
36 else
37     {
38     message.header.ver = xmlrpc_c::value_int(it->second);
39     }
40
41 if ((it = msgInfo.find("type")) == msgInfo.end())
42     {
43     message.header.type = 1; // default value
44     }
45 else
46     {
47     message.header.type = xmlrpc_c::value_int(it->second);
48     }
49
50 if ((it = msgInfo.find("repeat")) == msgInfo.end())
51     {
52     *retvalPtr = xmlrpc_c::value_boolean(false);
53     return;
54     }
55 message.header.repeat = xmlrpc_c::value_int(it->second);
56
57 if ((it = msgInfo.find("repeat_period")) == msgInfo.end())
58     {
59     *retvalPtr = xmlrpc_c::value_boolean(false);
60     return;
61     }
62 message.header.repeatPeriod = xmlrpc_c::value_int(it->second);
63
64 if ((it = msgInfo.find("show_time")) == msgInfo.end())
65     {
66     *retvalPtr = xmlrpc_c::value_boolean(false);
67     return;
68     }
69 message.header.showTime = xmlrpc_c::value_int(it->second);
70
71 if ((it = msgInfo.find("text")) == msgInfo.end())
72     {
73     *retvalPtr = xmlrpc_c::value_boolean(false);
74     return;
75     }
76 message.text = IconvString(xmlrpc_c::value_string(it->second), "UTF-8", "CP1251");
77
78 message.header.creationTime = static_cast<int>(stgTime);
79 message.header.lastSendTime = 0;
80
81 std::vector<xmlrpc_c::value>::iterator lit;
82 for (lit = logins.begin(); lit != logins.end(); ++lit)
83     {
84     USER_PTR ui;
85     if (users->FindByName(xmlrpc_c::value_string(*lit), &ui))
86         {
87         printfd(__FILE__, "METHOD_MESSAGE_SEND::execute(): 'User '%s' not found'\n", std::string(xmlrpc_c::value_string(*lit)).c_str());
88         }
89     else
90         {
91         ui->AddMessage(&message);
92         }
93     }
94
95 *retvalPtr = xmlrpc_c::value_boolean(true);
96 }