1 /*
2  * SNAC - Server
3  *
4  * Copyright (C) 2001 Barnaby Gray <barnaby@beedesign.co.uk>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
19  *
20  */
21 
22 #ifndef SNAC_SRV_H
23 #define SNAC_SRV_H
24 
25 #include <string>
26 #include <time.h>
27 #include "SNAC-base.h"
28 #include "ICQ.h"
29 #include "constants.h"
30 #include "Contact.h"
31 
32 namespace ICQ2000 {
33 
34   // Server Messages (Family 0x0015) - messages through the server
35   const unsigned short SNAC_SRV_Error = 0x0001;
36   const unsigned short SNAC_SRV_Send = 0x0002;
37   const unsigned short SNAC_SRV_Response = 0x0003;
38 
39   /*
40    * SRV_Response is very generic - ICQ have hacked all the extra ICQ
41    * functionality into this one
42    */
43 
44   // --------------------- Server (Family 0x0015) SNACs ---------
45 
46   class SrvFamilySNAC : virtual public SNAC {
47    public:
Family()48     unsigned short Family() const { return SNAC_FAM_SRV; }
49   };
50 
51   class SrvSendSNAC : public SrvFamilySNAC, public OutSNAC {
52    protected:
53     std::string m_text, m_destination, m_senders_name;
54     unsigned int m_senders_UIN;
55     bool m_delivery_receipt;
56 
57     void OutputBody(Buffer& b) const;
58 
59    public:
60     SrvSendSNAC(const std::string& text, const std::string& destination,
61 		unsigned int senders_UIN, const std::string& senders_name, bool delrpt);
62 
Subtype()63     unsigned short Subtype() const { return SNAC_SRV_Send; }
64   };
65 
66   class SrvRequestOfflineSNAC : public SrvFamilySNAC, public OutSNAC {
67    private:
68     unsigned int m_uin;
69 
70    protected:
71     void OutputBody(Buffer& b) const;
72 
73    public:
74     SrvRequestOfflineSNAC(unsigned int uin);
75 
Subtype()76     unsigned short Subtype() const { return SNAC_SRV_Send; }
77   };
78 
79   class SrvAckOfflineSNAC : public SrvFamilySNAC, public OutSNAC {
80    private:
81     unsigned int m_uin;
82 
83    protected:
84     void OutputBody(Buffer& b) const;
85 
86    public:
87     SrvAckOfflineSNAC(unsigned int uin);
88 
Subtype()89     unsigned short Subtype() const { return SNAC_SRV_Send; }
90   };
91 
92   class SrvRequestSimpleUserInfo : public SrvFamilySNAC, public OutSNAC {
93    private:
94     unsigned int m_my_uin, m_user_uin;
95 
96    protected:
97     void OutputBody(Buffer& b) const;
98 
99    public:
100     SrvRequestSimpleUserInfo(unsigned int my_uin, unsigned int user_uin);
Subtype()101     unsigned short Subtype() const { return SNAC_SRV_Send; }
102   };
103 
104   class SrvRequestShortWP : public SrvFamilySNAC, public OutSNAC {
105    protected:
106     unsigned int m_my_uin;
107     std::string m_nickname, m_firstname, m_lastname;
108     void OutputBody(Buffer& b) const;
109 
110    public:
111     SrvRequestShortWP(unsigned int my_uin, const std::string& nickname,
112 		      const std::string& firstname, const std::string& lastname);
113 
Subtype()114     unsigned short Subtype() const { return SNAC_SRV_Send; }
115   };
116 
117   class SrvRequestFullWP : public SrvFamilySNAC, public OutSNAC {
118    private:
119     unsigned int m_my_uin;
120     std::string m_nickname, m_firstname, m_lastname, m_email;
121     unsigned short m_min_age, m_max_age;
122     unsigned char m_sex;
123     unsigned char m_language;
124     std::string m_city, m_state, m_company_name, m_department, m_position;
125     unsigned short m_country;
126     bool m_only_online;
127 
128    protected:
129     void OutputBody(Buffer& b) const;
130 
131    public:
132     SrvRequestFullWP(unsigned int my_uin, const std::string& nickname, const std::string& firstname,
133 		     const std::string& lastname, const std::string& email, unsigned short min_age, unsigned short max_age,
134 		     unsigned char sex, unsigned char language, const std::string& city, const std::string& state,
135 		     unsigned short country, const std::string& company_name, const std::string& department,
136 		     const std::string& position, bool only_online);
137 
Subtype()138     unsigned short Subtype() const { return SNAC_SRV_Send; }
139   };
140 
141   class SrvRequestKeywordSearch : public SrvFamilySNAC, public OutSNAC
142   {
143    private:
144     unsigned int m_my_uin;
145     std::string m_keyword;
146 
147    protected:
148     void OutputBody(Buffer& b) const;
149 
150   public:
151     SrvRequestKeywordSearch(unsigned int my_uin, const std::string& keyword);
Subtype()152     unsigned short Subtype() const { return SNAC_SRV_Send; }
153   };
154 
155   class SrvRequestDetailUserInfo : public SrvFamilySNAC, public OutSNAC {
156    private:
157     unsigned int m_my_uin, m_user_uin;
158 
159    protected:
160     void OutputBody(Buffer& b) const;
161 
162    public:
163     SrvRequestDetailUserInfo(unsigned int my_uin, unsigned int user_uin);
Subtype()164     unsigned short Subtype() const { return SNAC_SRV_Send; }
165   };
166 
167   class SrvUpdateMainHomeInfo : public SrvFamilySNAC, public OutSNAC {
168     private:
169       unsigned int m_my_uin;
170       const Contact::MainHomeInfo& m_main_home_info;
171 
172     protected:
173       void OutputBody(Buffer& b) const;
174 
175     public:
176       SrvUpdateMainHomeInfo(unsigned int my_uin, const Contact::MainHomeInfo& main_home_info);
Subtype()177       unsigned short Subtype() const { return SNAC_SRV_Send; }
178  };
179 
180   class SrvUpdateWorkInfo : public SrvFamilySNAC, public OutSNAC {
181     private:
182       unsigned int m_my_uin;
183       const Contact::WorkInfo& m_work_info;
184 
185     protected:
186       void OutputBody(Buffer& b) const;
187 
188     public:
189       SrvUpdateWorkInfo(unsigned int my_uin, const Contact::WorkInfo& work_info);
Subtype()190       unsigned short Subtype() const { return SNAC_SRV_Send; }
191  };
192 
193   class SrvUpdateHomepageInfo : public SrvFamilySNAC, public OutSNAC {
194     private:
195       unsigned int m_my_uin;
196       const Contact::HomepageInfo& m_homepage_info;
197 
198     protected:
199       void OutputBody(Buffer& b) const;
200 
201     public:
202       SrvUpdateHomepageInfo(unsigned int my_uin, const Contact::HomepageInfo& homepage_info);
Subtype()203       unsigned short Subtype() const { return SNAC_SRV_Send; }
204  };
205 
206   class SrvUpdateAboutInfo : public SrvFamilySNAC, public OutSNAC {
207     private:
208       unsigned int m_my_uin;
209       const std::string& m_about_info;
210 
211     protected:
212       void OutputBody(Buffer& b) const;
213 
214     public:
215       SrvUpdateAboutInfo(unsigned int my_uin, const std::string& about_info);
Subtype()216       unsigned short Subtype() const { return SNAC_SRV_Send; }
217  };
218 
219   class SrvRequestRandomChat : public SrvFamilySNAC, public OutSNAC {
220     private:
221       unsigned int m_my_uin;
222       unsigned short m_random_group;
223 
224     protected:
225       void OutputBody(Buffer& b) const;
226 
227     public:
228       SrvRequestRandomChat(unsigned int my_uin, unsigned short random_group);
Subtype()229       unsigned short Subtype() const { return SNAC_SRV_Send; }
230  };
231 
232   class SrvSetRandomChatGroup : public SrvFamilySNAC, public OutSNAC {
233     private:
234       unsigned int m_my_uin;
235       unsigned short m_random_group;
236 
237     protected:
238       void OutputBody(Buffer& b) const;
239 
240     public:
241       SrvSetRandomChatGroup(unsigned int my_uin, unsigned short random_group);
Subtype()242       unsigned short Subtype() const { return SNAC_SRV_Send; }
243  };
244 
245   const unsigned short SrvResponse_Error          = 0x0001;
246   const unsigned short SrvResponse_AckMainHomeInfoChange = 0x0064; // used to be SrvResponse_SMS
247   const unsigned short SrvResponse_AckWorkInfoChange	 = 0x006E;
248   const unsigned short SrvResponse_AckHomepageInfoChange = 0x0078;
249   const unsigned short SrvResponse_AckAboutInfoChange	 = 0x0082;
250   const unsigned short SrvResponse_AckRandomGroupSet     = 0x0370;
251   const unsigned short SrvResponse_SMS_Done       = 0x0096;
252   const unsigned short SrvResponse_SimpleUI       = 0x0190;
253   const unsigned short SrvResponse_SimpleUI_Done  = 0x019a;
254   const unsigned short SrvResponse_SearchUI       = 0x01a4;
255   const unsigned short SrvResponse_SearchUI_Done  = 0x01ae;
256   const unsigned short SrvResponse_MainHomeInfo   = 0x00c8;
257   const unsigned short SrvResponse_WorkInfo       = 0x00d2;
258   const unsigned short SrvResponse_HomePageInfo   = 0x00dc;
259   const unsigned short SrvResponse_AboutInfo      = 0x00e6;
260   const unsigned short SrvResponse_EmailInfo      = 0x00eb;
261   const unsigned short SrvResponse_InterestInfo   = 0x00f0;
262   const unsigned short SrvResponse_BackgroundInfo = 0x00fa;
263   const unsigned short SrvResponse_RandomChatFound = 0x0366;
264   const unsigned short SrvResponse_Unknown        = 0x010e;
265 
266   class SrvResponseSNAC : public SrvFamilySNAC, public InSNAC {
267    public:
268     enum ResponseType {
269       OfflineMessage,
270       OfflineMessagesComplete,
271       SMS_Error,
272       SMS_Response,
273       SimpleUserInfo,
274       SearchSimpleUserInfo,
275       RMainHomeInfo,
276       RHomepageInfo,
277       REmailInfo,
278       RUnknown,
279       RWorkInfo,
280       RAboutInfo,
281       RInterestInfo,
282       RBackgroundInfo,
283       AckMainHomeInfoChange,
284       AckHomepageInfoChange,
285       AckWorkInfoChange,
286       AckAboutInfoChange,
287       RandomChatFound,
288       RandomGroupSet
289     };
290 
291    protected:
292     ResponseType m_type;
293 
294     // SMS Response fields
295     std::string m_source, m_network, m_message_id, m_messages_left;
296     bool m_deliverable, m_smtp_deliverable;
297     int m_error_id;
298     std::string m_error_param;
299     std::string m_smtp_from, m_smtp_to, m_smtp_subject;
300 
301     // Offline Message fields
302     time_t m_time;
303     unsigned int m_sender_UIN;
304     ICQSubType *m_icqsubtype;
305 
306     // SimpleUserInfo fields
307     bool m_empty_contact;
308     unsigned int m_uin;
309     std::string m_alias, m_firstname, m_lastname, m_email;
310     bool m_last_in_search;
311 
312     // DetailedUserInfo fields
313     Contact::MainHomeInfo m_main_home_info;
314     Contact::HomepageInfo m_homepage_info;
315     Contact::EmailInfo m_email_info;
316     Contact::WorkInfo m_work_info;
317     Contact::BackgroundInfo m_background_info;
318     Contact::PersonalInterestInfo m_personal_interest_info;
319     std::string m_about;
320     unsigned char m_sex, m_age;
321 
322     bool m_authreq;
323     Status m_status;
324     unsigned int m_more_results;
325 
326     void ParseBody(Buffer& b);
327     void ParseICQResponse(Buffer& b);
328     void ParseOfflineMessage(Buffer& b);
329     void ParseInfoChangeAck(Buffer &b, unsigned short subtype);
330     void ParseSMSError(Buffer& b);
331     void ParseSMSResponse(Buffer& b);
332     void ParseSimpleUserInfo(Buffer &b, unsigned short subtype);
333     void ParseDetailedUserInfo(Buffer &b, unsigned short subtype);
334     void ParseRandomChatFound(Buffer& b);
335     void ParseRandomGroupSetAck(Buffer& b);
336 
337    public:
338     SrvResponseSNAC();
339     ~SrvResponseSNAC();
340 
getType()341     ResponseType getType() const { return m_type; }
getSource()342     std::string getSource() const { return m_source; }
deliverable()343     bool deliverable() const { return m_deliverable; }
smtp_deliverable()344     bool smtp_deliverable() const { return m_smtp_deliverable; }
345 
getSMTPFrom()346     std::string getSMTPFrom() const { return m_smtp_from; }
getSMTPTo()347     std::string getSMTPTo() const { return m_smtp_to; }
getSMTPSubject()348     std::string getSMTPSubject() const { return m_smtp_subject; }
349 
getNetwork()350     std::string getNetwork() const { return m_network; }
getMessageId()351     std::string getMessageId() const { return m_message_id; }
getMessagesLeft()352     std::string getMessagesLeft() const { return m_messages_left; }
getErrorId()353     int getErrorId() const { return m_error_id; }
getErrorParam()354     std::string getErrorParam() const { return m_error_param; }
355 
getICQSubType()356     ICQSubType *getICQSubType() const { return m_icqsubtype; }
getSenderUIN()357     unsigned int getSenderUIN() const { return m_sender_UIN; }
getTime()358     time_t getTime() const { return m_time; }
359 
isEmptyContact()360     bool isEmptyContact() const { return m_empty_contact; }
getUIN()361     unsigned int getUIN() const { return m_uin; }
getAlias()362     std::string getAlias() const { return m_alias; }
getFirstName()363     std::string getFirstName() const { return m_firstname; }
getLastName()364     std::string getLastName() const { return m_lastname; }
getEmail()365     std::string getEmail() const { return m_email; }
getAuthReq()366     bool getAuthReq() const { return m_authreq; }
getStatus()367     Status getStatus() const { return m_status; }
368 
isLastInSearch()369     bool isLastInSearch() const { return m_last_in_search; }
getNumberMoreResults()370     unsigned int getNumberMoreResults() const { return m_more_results; }
371 
372 
Subtype()373     unsigned short Subtype() const { return SNAC_SRV_Response; }
374 
375     // detailed user info structures
getMainHomeInfo()376     Contact::MainHomeInfo& getMainHomeInfo() { return m_main_home_info; }
getHomepageInfo()377     Contact::HomepageInfo& getHomepageInfo() { return m_homepage_info; }
getEmailInfo()378     Contact::EmailInfo& getEmailInfo() { return m_email_info; }
getWorkInfo()379     Contact::WorkInfo& getWorkInfo() { return m_work_info; }
getBackgroundInfo()380     Contact::BackgroundInfo& getBackgroundInfo() { return m_background_info; }
getPersonalInterestInfo()381     Contact::PersonalInterestInfo& getPersonalInterestInfo() { return m_personal_interest_info; }
getAboutInfo()382     std::string getAboutInfo() const { return m_about; }
383   };
384 
385 }
386 
387 #endif
388