]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/configuration/sgconfig/parser_message.cpp
b4607996cd788dbcb78b004d696c0de34c4cd587
[stg.git] / projects / stargazer / plugins / configuration / sgconfig / parser_message.cpp
1 /*
2  *    This program is free software; you can redistribute it and/or modify
3  *    it under the terms of the GNU General Public License as published by
4  *    the Free Software Foundation; either version 2 of the License, or
5  *    (at your option) any later version.
6  *
7  *    This program is distributed in the hope that it will be useful,
8  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
9  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  *    GNU General Public License for more details.
11  *
12  *    You should have received a copy of the GNU General Public License
13  *    along with this program; if not, write to the Free Software
14  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15  */
16
17 /*
18  *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
19  *    Author : Maxim Mamontov <faust@stargazer.dp.ua>
20  */
21
22 #include "parser_message.h"
23
24 #include "stg/users.h"
25 #include "stg/user.h"
26
27 #include <cstring>
28
29 extern volatile time_t stgTime; // So sad...
30
31 using STG::PARSER::SEND_MESSAGE;
32
33 const char * SEND_MESSAGE::tag = "Message";
34
35 int SEND_MESSAGE::Start(void *, const char *el, const char **attr)
36 {
37     if (strcasecmp(el, m_tag.c_str()) != 0)
38         return -1;
39
40     for (size_t i = 0; i < 14; i++)
41         if (attr[i] == NULL)
42         {
43             m_result = res_params_error;
44             CreateAnswer();
45             printfd(__FILE__, "To few parameters\n");
46             return 0;
47         }
48
49     for (size_t i = 0; i < 14; i += 2)
50     {
51         if (strcasecmp(attr[i], "login") == 0)
52             ParseLogins(attr[i + 1]);
53
54         if (strcasecmp(attr[i], "MsgVer") == 0)
55         {
56             str2x(attr[i + 1], m_msg.header.ver);
57             if (m_msg.header.ver != 1)
58                 m_result = res_params_error;
59         }
60
61         if (strcasecmp(attr[i], "MsgType") == 0)
62         {
63             str2x(attr[i + 1], m_msg.header.type);
64             if (m_msg.header.type != 1)
65                 m_result = res_params_error;
66         }
67
68         if (strcasecmp(attr[i], "Repeat") == 0)
69         {
70             str2x(attr[i + 1], m_msg.header.repeat);
71             if (m_msg.header.repeat < 0)
72                 m_result = res_params_error;
73         }
74
75         if (strcasecmp(attr[i], "RepeatPeriod") == 0)
76             str2x(attr[i + 1], m_msg.header.repeatPeriod);
77
78         if (strcasecmp(attr[i], "ShowTime") == 0)
79             str2x(attr[i + 1], m_msg.header.showTime);
80
81         if (strcasecmp(attr[i], "Text") == 0)
82         {
83             Decode21str(m_msg.text, attr[i + 1]);
84             m_result = res_ok;
85         }
86     }
87     return 0;
88 }
89
90 int SEND_MESSAGE::End(void *, const char *el)
91 {
92     if (strcasecmp(el, m_tag.c_str()) != 0)
93         return -1;
94
95     m_result = res_unknown;
96     for (unsigned i = 0; i < m_logins.size(); i++)
97     {
98         if (m_users.FindByName(m_logins[i], &m_user))
99         {
100             printfd(__FILE__, "User not found. %s\n", m_logins[i].c_str());
101             continue;
102         }
103         m_msg.header.creationTime = static_cast<unsigned int>(stgTime);
104         m_user->AddMessage(&m_msg);
105         m_result = res_ok;
106     }
107     CreateAnswer();
108     return 0;
109 }
110
111 int SEND_MESSAGE::ParseLogins(const char * login)
112 {
113     char * p;
114     char * l = new char[strlen(login) + 1];
115     strcpy(l, login);
116     p = strtok(l, ":");
117     m_logins.clear();
118     while (p)
119     {
120         m_logins.push_back(p);
121         p = strtok(NULL, ":");
122     }
123
124     delete[] l;
125     return 0;
126 }
127
128 void SEND_MESSAGE::CreateAnswer()
129 {
130     switch (m_result)
131     {
132         case res_ok:
133             m_answer = "<SendMessageResult value=\"ok\"/>";
134             break;
135         case res_params_error:
136             m_answer = "<SendMessageResult value=\"Parameters error.\"/>";
137             break;
138         case res_unknown:
139             m_answer = "<SendMessageResult value=\"Unknown user.\"/>";
140             break;
141     }
142 }