libmsn 4.2.1
/home/salem/libmsn/tags/libmsn-4.2/msn/notificationserver.h
00001 #ifndef __msn_notificationserver_h__
00002 #define __msn_notificationserver_h__
00003 
00004 /*
00005  * notificationserver.h
00006  * libmsn
00007  *
00008  * Created by Mark Rowe on Mon Mar 22 2004.
00009  * Refactored by Tiago Salem Herrmann on 08/2007.
00010  * Copyright (c) 2004 Mark Rowe. All rights reserved.
00011  * Copyright (c) 2007 Tiago Salem Herrmann. All rights reserved
00012  *
00013  * This program is free software; you can redistribute it and/or modify
00014  * it under the terms of the GNU General Public License as published by
00015  * the Free Software Foundation; either version 2 of the License, or
00016  * (at your option) any later version.
00017  *
00018  * This program is distributed in the hope that it will be useful,
00019  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00020  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00021  * GNU General Public License for more details.
00022  *
00023  * You should have received a copy of the GNU General Public License
00024  * along with this program; if not, write to the Free Software
00025  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00026  */
00027 
00028 #include <msn/connection.h>
00029 #include <msn/authdata.h>
00030 #include <msn/errorcodes.h>
00031 #include <msn/buddy.h>
00032 #include <msn/passport.h>
00033 #include <stdexcept>
00034 #include <msn/externals.h>
00035 #include <msn/msnobject.h>
00036 #include <msn/soap.h>
00037 #include <cassert>
00038 #include <sys/types.h>
00039 
00040 #include "libmsn_export.h"
00041 
00042 #ifdef _WIN32
00043 typedef unsigned uint;
00044 #endif
00045 
00046 namespace MSN
00047 {    
00048     class SwitchboardServerConnection;
00049     
00052     class LIBMSN_EXPORT ListSyncInfo
00053     {
00054 public:
00057         enum SyncProgress
00058         {
00059             LST_AB = 1,        
00060             LST_AL = 2,        
00061             LST_BL = 4,        
00062             LST_RL = 8,        
00063             LST_PL = 16,       
00064             COMPLETE_BLP = 32  
00065         };
00066         
00067         
00071         enum PrivacySetting
00072         {
00073             ALLOW = 'A', 
00074             BLOCK = 'B' 
00075         };
00076         
00079         enum NewReverseListEntryAction
00080         {
00081             PROMPT = 'A',
00082             DONT_PROMPT = 'N'
00083         };
00084 
00085 
00088         std::map<std::string, Buddy *> contactList;
00089         
00090         std::string myDisplayName;
00091        
00092         std::map<std::string, Group> groups;
00093         
00096         unsigned int progress;
00097         
00098         unsigned int usersRemaining, groupsRemaining;
00099 
00102         std::string lastChange;
00103 
00109         char privacySetting;
00110         
00116         char reverseListPrompting;
00117         
00118         ListSyncInfo(std::string lastChange_) : 
00119             progress(0), lastChange(lastChange_), 
00120             privacySetting(ListSyncInfo::ALLOW), reverseListPrompting(ListSyncInfo::PROMPT) {};
00121     };
00122     
00123     // Intermediate steps in connection:
00124     class LIBMSN_EXPORT connectinfo
00125     {
00126 public:
00127         Passport username;
00128         std::string password;
00129         std::string cookie;
00130         
00131         connectinfo(const Passport & username_, const std::string & password_) : username(username_), password(password_), cookie("") {};
00132     };    
00133         
00140     class LIBMSN_EXPORT NotificationServerConnection : public Connection
00141     {
00142 private:
00143         typedef void (NotificationServerConnection::*NotificationServerCallback)(std::vector<std::string> & args, int trid, void *);
00144 
00145         std::string token;
00146         class AuthData : public ::MSN::AuthData
00147         {
00148 public:
00149             std::string password;
00150             
00151             AuthData(const Passport & passport_,
00152                      const std::string & password_) : 
00153                 ::MSN::AuthData(passport_), password(password_) {} ;
00154         };
00155         NotificationServerConnection::AuthData auth;
00156         int synctrid;
00157 
00158 public:
00159         MSNObject msnobj;
00160        
00164         NotificationServerConnection(Passport username, std::string password, Callbacks & cb);
00165         
00166         virtual ~NotificationServerConnection();
00167         virtual void dispatchCommand(std::vector<std::string> & args);
00168         
00172         const std::vector<SwitchboardServerConnection *> & switchboardConnections();
00173         
00174         /* Add a SwitchboardServerConnection to the list of connections that have
00175          *  been started from this connection.
00176          */
00177         void addSwitchboardConnection(SwitchboardServerConnection *);
00178 
00179         /* Add the @p Soap object to the list of connections that have
00180          *  been started from this connection.
00181          */
00182         void addSoapConnection(Soap *);
00183 
00184         /* Remove a SwitchboardServerConnection from the list of connections that have
00185          *  been started from this connection.
00186          */
00187         void removeSwitchboardConnection(SwitchboardServerConnection *);
00188 
00189         /* Remove the @p Soap object from the list of connections that have
00190          *  been started from this connection.
00191          */
00192         void removeSoapConnection(Soap *);
00193         
00202         Connection *connectionWithSocket(void *sock);
00203         
00209         SwitchboardServerConnection *switchboardWithOnlyUser(Passport username);
00210         
00219         void setCapabilities(uint m_clientId);
00220 
00221         void disconnectNS();
00222 
00225         void setState(BuddyStatus state, uint clientID);
00226         
00229         void setBLP(char setting);
00230 
00237         void completeConnection(std::map<std::string,int > & allContacts, void *data);
00238 
00243         void setFriendlyName(std::string friendlyName, bool updateServer = false) throw (std::runtime_error);
00244 
00248         bool change_DisplayPicture(std::string filename);
00249 
00252         void setPersonalStatus(personalInfo pInfo);
00253 
00256         void addToList(MSN::ContactList list, Passport buddyName);
00257         
00260         void removeFromList(MSN::ContactList list, Passport buddyName);
00261 
00265         void addToAddressBook(Passport buddyName, std::string displayName);
00266 
00269         void delFromAddressBook(std::string contactId, std::string passport);
00270 
00276         void enableContactOnAddressBook(std::string contactId, std::string passport);
00277 
00280         void disableContactOnAddressBook(std::string contactId, std::string passport);
00281 
00284         void blockContact(Passport buddyName);
00285 
00288         void unblockContact(Passport buddyName);
00289 
00292         void addToGroup(std::string groupId, std::string contactId);
00293 
00296         void removeFromGroup(std::string groupId, std::string contactId);
00297         
00300         void addGroup(std::string groupName);
00301 
00304         void removeGroup(std::string groupId);
00305 
00308         void renameGroup(std::string groupId, std::string newGroupName);
00309         
00316         void synchronizeContactList(std::string lastChange="0");
00317         
00320         void sendPing();
00321         
00324         void requestSwitchboardConnection(const void *tag);
00325 
00328         void get_oim(std::string id, bool markAsRead);
00329 
00332         void delete_oim(std::string id);
00333 
00336         void send_oim(Soap::OIM oim);
00337     
00338         void getInboxUrl();
00339  
00340         /* when we have to send more than 1 ADL command, we need to keep this here to track */
00341         std::list<std::string> adl_packets;
00342 
00343         /* Our current Display Name */
00344         std::string myDisplayName;
00345 
00346         /* Our passport */
00347         std::string myPassport;
00348 
00349         /* Sum of capabilities of the user */
00350         uint m_clientId;
00351         
00352         char bplSetting;
00353 
00354         /* Our IP number reported by notification server */
00355         std::string server_reported_ip;
00356 
00357         /* Our TCP source port reported by notification server */
00358         std::string server_reported_port;
00359 
00360         std::string login_time;
00361 
00362         std::string MSPAuth;
00363 
00364         std::string sid;
00365 
00366         std::string kv;
00367 
00368         /* 1 if our email is verified, 0 if not */
00369         std::string server_email_verified;
00370 
00371         /* Says if we are direct connected based on server's report */
00372         bool direct_connection;
00373        
00374         virtual void connect(const std::string & hostname, unsigned int port);
00375 
00376         virtual void connect(const std::string & hostname, unsigned int port, 
00377                 const Passport & username,  
00378                 const std::string & password);
00379 
00380         virtual void disconnect();
00381         
00382         virtual void addCallback(NotificationServerCallback cb, int trid, void *data);
00383         
00384         virtual void removeCallback(int trid);
00385         
00386         virtual void socketConnectionCompleted();
00387         
00388         enum NotificationServerState
00389         {
00390             NS_DISCONNECTED,
00391             NS_CONNECTING,
00392             NS_CONNECTED,
00393             NS_SYNCHRONISING,
00394             NS_ONLINE
00395         };
00396 
00397         connectinfo *info;
00398         NotificationServerState connectionState() const { return this->_connectionState; };
00399         Callbacks & externalCallbacks;
00400         virtual NotificationServerConnection *myNotificationServer() { return this; };
00401         void gotTickets(Soap & soapConnection, std::vector<MSN::Soap::sitesToAuth> sitesToAuthList);
00402         void gotLists(Soap &soapConnection);
00403         void gotAddressBook(Soap &soapConnection);
00404         void gotOIM(Soap & soapConnection, bool success, std::string id, std::string message);
00405         void gotOIMLockkey(Soap & soapConnection, std::string lockkey);
00406         void gotOIMSendConfirmation(Soap & soapConnection, int id, bool sent);
00407         void gotOIMDeleteConfirmation(Soap & soapConnection, std::string id, bool deleted);
00408         void gotSoapMailData(Soap & soapConnection, std::string maildata);
00409         void gotChangeDisplayNameConfirmation(Soap & soapConnection, std::string displayName, bool changed);
00410         void gotDelContactFromGroupConfirmation(Soap & soapConnection,
00411                     bool deleted,
00412                     std::string newVersion,
00413                     std::string groupId,
00414                     std::string contactId);
00415 
00416         void gotAddContactToGroupConfirmation(Soap & soapConnection,
00417                     bool added,
00418                     std::string newVersion,
00419                     std::string groupId,
00420                     std::string contactId);
00421 
00422         void gotAddGroupConfirmation(Soap & soapConnection,
00423                     bool added,
00424                     std::string newVersion,
00425                     std::string groupName,
00426                     std::string groupId);
00427 
00428         void gotDelGroupConfirmation(Soap & soapConnection,
00429                     bool removed,
00430                     std::string newVersion,
00431                     std::string groupId);
00432 
00433         void gotRenameGroupConfirmation(Soap & soapConnection,
00434                     bool renamed,
00435                     std::string newVersion,
00436                     std::string newGroupName,
00437                     std::string groupId);
00438 
00439         void gotAddContactToAddressBookConfirmation(Soap & soapConnection,
00440                     bool added,
00441                     std::string newVersion,
00442                     std::string passport,
00443                     std::string displayName,
00444                     std::string guid);
00445 
00446         void gotDelContactFromAddressBookConfirmation(Soap & soapConnection,
00447                     bool removed,
00448                     std::string newVersion,
00449                     std::string contactId,
00450                     std::string passport);
00451 
00452         void gotEnableContactOnAddressBookConfirmation(Soap & soapConnection,
00453                     bool enabled,
00454                     std::string newVersion,
00455                     std::string contactId,
00456                     std::string passport);
00457 
00458         void gotDisableContactOnAddressBookConfirmation(Soap & soapConnection,
00459                     bool disabled,
00460                     std::string newVersion,
00461                     std::string contactId,
00462                     std::string passport);
00463 
00464         void gotAddContactToListConfirmation(Soap & soapConnection,
00465                     bool added,
00466                     std::string newVersion,
00467                     std::string passport,
00468                     MSN::ContactList list);
00469 
00470         void gotDelContactFromListConfirmation(Soap & soapConnection,
00471                     bool deleted,
00472                     std::string newVersion,
00473                     std::string passport,
00474                     MSN::ContactList list);
00475 
00476 protected:
00477         virtual void handleIncomingData();
00478         NotificationServerState _connectionState;
00479         
00480         void setConnectionState(NotificationServerState s) { this->_connectionState = s; };
00481         void assertConnectionStateIs(NotificationServerState s) { assert(this->_connectionState == s); };
00482         void assertConnectionStateIsNot(NotificationServerState s) { assert(this->_connectionState != s); };
00483         void assertConnectionStateIsAtLeast(NotificationServerState s) { assert(this->_connectionState >= s); };        
00484 private:
00485         std::vector<SwitchboardServerConnection *> _switchboardConnections;
00486         std::vector<Soap *> _SoapConnections;
00487         std::map<int, std::pair<NotificationServerCallback, void *> > callbacks;
00488 
00489         ListSyncInfo *listInfo;
00490 
00491         std::vector<MSN::Soap::sitesToAuth> sitesToAuthList;
00492         std::vector<MSN::Soap::OIM> SentQueuedOIMs;
00493         std::vector<std::string> DeletedQueuedOIMs;
00494 
00495         std::string lockkey;
00496         bool generatingLockkey;
00497         bool removingOIM;
00498 
00499         void sendQueuedOIMs();
00500 
00501         // mdi value got by tweener
00502         std::string mdi;
00503 
00504         virtual void disconnectForTransfer();        
00505             
00506         static std::map<std::string, void (NotificationServerConnection::*)(std::vector<std::string> &)> commandHandlers;
00507         static std::map<std::string, void (NotificationServerConnection::*)(std::vector<std::string> &, std::string, std::string)> messageHandlers;
00508 
00509         void registerHandlers();
00510         void handle_OUT(std::vector<std::string> & args);
00511         void handle_RML(std::vector<std::string> & args);
00512         void handle_BLP(std::vector<std::string> & args);
00513         void handle_CHG(std::vector<std::string> & args);
00514         void handle_CHL(std::vector<std::string> & args);
00515         void handle_ILN(std::vector<std::string> & args);
00516         void handle_NLN(std::vector<std::string> & args);
00517         void handle_FLN(std::vector<std::string> & args);
00518         void handle_MSG(std::vector<std::string> & args);
00519         void handle_RNG(std::vector<std::string> & args);
00520         void handle_PRP(std::vector<std::string> & args);
00521         void handle_UBX(std::vector<std::string> & args);
00522         void handle_GCF(std::vector<std::string> & args);
00523         void handle_ADL(std::vector<std::string> & args);
00524         void handle_UBN(std::vector<std::string> & args);
00525         void handle_FQY(std::vector<std::string> & args);
00526         
00527         void callback_NegotiateCVR(std::vector<std::string> & args, int trid, void *data);
00528         void callback_TransferToSwitchboard(std::vector<std::string> & args, int trid, void *data);
00529         void callback_RequestUSR(std::vector<std::string> & args, int trid, void *data);
00530         void callback_PassportAuthentication(std::vector<std::string> & args, int trid, void * data);        
00531         void callback_AuthenticationComplete(std::vector<std::string> & args, int trid, void * data);
00532         void callback_initialBPL(std::vector<std::string> & args, int trid, void *data);
00533         void callback_URL(std::vector<std::string> & args, int trid, void *data);
00534     
00535 
00536         void message_initial_email_notification(std::vector<std::string> & args, std::string mime, std::string body);
00537         void message_email_notification(std::vector<std::string> & args, std::string mime, std::string body);
00538         void message_msmsgsprofile(std::vector<std::string> & args, std::string mime, std::string body);
00539         void message_initialmdatanotification(std::vector<std::string> & args, std::string mime, std::string body);
00540         void message_oimnotification(std::vector<std::string> & args, std::string mime, std::string body);
00541 
00542         void gotMailData(std::string maildata);
00543 
00544     };
00545     
00546 }
00547 
00548 
00549 #endif
 All Classes Namespaces Functions Variables Enumerations Enumerator