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