Sophie

Sophie

distrib > Mandriva > 2011.0 > i586 > media > contrib-release-debug > by-pkgid > 69710aa523c75aae90cbd19e022a4e3b > files > 234

centerim-debug-4.22.10-1mdv2011.0.i586.rpm

#ifndef __MSNHOOK_H__
#define __MSNHOOK_H__

#include "abstracthook.h"

#ifdef BUILD_MSN

#include "msn/msn.h"

struct msnbuddy {
    msnbuddy(const string &anick, const string &afriendly = "", int agid = -1)
	: nick(anick), friendly(afriendly), gid(agid) { }

    string nick, friendly;
    int gid;

    bool operator == (const string &anick) const
	{ return nick == anick; }
    bool operator != (const string &anick) const
	{ return nick != anick; }
};

class msncallbacks : public MSN::Callbacks {
    public:
        void registerSocket(int s, int read, int write);
        void unregisterSocket(int s);
        void showError(MSN::Connection * conn, std::string msg);
        void buddyChangedStatus(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname, MSN::BuddyStatus state);
        void buddyOffline(MSN::Connection * conn, MSN::Passport buddy);
        void log(int writing, const char* buf);
        void gotFriendlyName(MSN::Connection * conn, std::string friendlyname);
        void gotBuddyListInfo(MSN::NotificationServerConnection * conn, MSN::ListSyncInfo * data);
        void gotLatestListSerial(MSN::Connection * conn, int serial);
        void gotGTC(MSN::Connection * conn, char c);
        void gotBLP(MSN::Connection * conn, char c);
        void gotNewReverseListEntry(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname);
        void addedListEntry(MSN::Connection * conn, std::string list, MSN::Passport buddy, int groupID);
        void removedListEntry(MSN::Connection * conn, std::string list, MSN::Passport buddy, int groupID);
        void addedGroup(MSN::Connection * conn, std::string groupName, int groupID);
        void removedGroup(MSN::Connection * conn, int groupID);
        void renamedGroup(MSN::Connection * conn, int groupID, std::string newGroupName);
        void gotSwitchboard(MSN::SwitchboardServerConnection * conn, const void * tag);
        void buddyJoinedConversation(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy, std::string friendlyname, int is_initial);
        void buddyLeftConversation(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy);
        void gotInstantMessage(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy, std::string friendlyname, MSN::Message * msg);
        void failedSendingMessage(MSN::Connection * conn);
        void buddyTyping(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname);
        void gotInitialEmailNotification(MSN::Connection * conn, int unread_inbox, int unread_folders);
        void gotNewEmailNotification(MSN::Connection * conn, std::string from, std::string subject);
        void gotFileTransferInvitation(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname, MSN::FileTransferInvitation * inv);
        void fileTransferProgress(MSN::FileTransferInvitation * inv, std::string status, unsigned long recv, unsigned long total);
        void fileTransferFailed(MSN::FileTransferInvitation * inv, int error, std::string message);
        void fileTransferSucceeded(MSN::FileTransferInvitation * inv);
        void gotNewConnection(MSN::Connection * conn);
        void closingConnection(MSN::Connection * conn);
        void changedStatus(MSN::Connection * conn, MSN::BuddyStatus state);
        int connectToServer(std::string server, int port, bool *connected);
        int listenOnPort(int port);
        std::string getOurIP();
        std::string getSecureHTTPProxy();
};

class msnhook : public abstracthook {

    friend void msncallbacks::registerSocket(int s, int reading, int writing);
    friend void msncallbacks::unregisterSocket(int s);
    friend void msncallbacks::showError(MSN::Connection * conn, string msg);
    friend void msncallbacks::buddyChangedStatus(MSN::Connection * conn, MSN::Passport buddy, string friendlyname, MSN::BuddyStatus state);
    friend void msncallbacks::buddyOffline(MSN::Connection * conn, MSN::Passport buddy);
    friend void msncallbacks::log(int writing, const char* buf);
    friend void msncallbacks::gotFriendlyName(MSN::Connection * conn, string friendlyname);
    friend void msncallbacks::gotBuddyListInfo(MSN::NotificationServerConnection * conn, MSN::ListSyncInfo * data);
    friend void msncallbacks::gotLatestListSerial(MSN::Connection * conn, int serial);
    friend void msncallbacks::gotGTC(MSN::Connection * conn, char c);
    friend void msncallbacks::gotBLP(MSN::Connection * conn, char c);
    friend void msncallbacks::gotNewReverseListEntry(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname);
    friend void msncallbacks::addedListEntry(MSN::Connection * conn, std::string list, MSN::Passport buddy, int groupID);
    friend void msncallbacks::removedListEntry(MSN::Connection * conn, std::string list, MSN::Passport buddy, int groupID);
    friend void msncallbacks::addedGroup(MSN::Connection * conn, string groupName, int groupID);
    friend void msncallbacks::removedGroup(MSN::Connection * conn, int groupID);
    friend void msncallbacks::renamedGroup(MSN::Connection * conn, int groupID, string newGroupName);
    friend void msncallbacks::gotSwitchboard(MSN::SwitchboardServerConnection * conn, const void * tag);
    friend void msncallbacks::buddyJoinedConversation(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy, std::string friendlyname, int is_initial);
    friend void msncallbacks::buddyLeftConversation(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy);
    friend void msncallbacks::gotInstantMessage(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy, std::string friendlyname, MSN::Message * msg);
    friend void msncallbacks::failedSendingMessage(MSN::Connection * conn);
    friend void msncallbacks::buddyTyping(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname);
    friend void msncallbacks::gotInitialEmailNotification(MSN::Connection * conn, int unread_inbox, int unread_folders);
    friend void msncallbacks::gotNewEmailNotification(MSN::Connection * conn, string from, string subject);
    friend void msncallbacks::gotFileTransferInvitation(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname, MSN::FileTransferInvitation * inv);
    friend void msncallbacks::fileTransferProgress(MSN::FileTransferInvitation * inv, string status, unsigned long recv, unsigned long total);
    friend void msncallbacks::fileTransferFailed(MSN::FileTransferInvitation * inv, int error, string message);
    friend void msncallbacks::fileTransferSucceeded(MSN::FileTransferInvitation * inv);
    friend void msncallbacks::gotNewConnection(MSN::Connection * conn);
    friend void msncallbacks::closingConnection(MSN::Connection * conn);
    friend void msncallbacks::changedStatus(MSN::Connection * conn, MSN::BuddyStatus state);
    friend int msncallbacks::connectToServer(string server, int port, bool *connected);
    friend int msncallbacks::listenOnPort(int port);
    friend string msncallbacks::getOurIP();
    friend string msncallbacks::getSecureHTTPProxy();

    protected:
	imstatus ourstatus;
	bool fonline, flogged, readinfo, destroying;
	MSN::NotificationServerConnection conn;
	msncallbacks cb;
	time_t timer_ping;

	struct qevent {
	    enum qetype { qeMsg, qeFile };

	    qetype type;
	    string nick, text;

	    qevent(qetype atype, const string &anick, const string &atext):
		type(atype), nick(anick), text(atext) { }
	};

	map<string, vector<msnbuddy> > slst;
	map<string, MSN::SwitchboardServerConnection *> lconn;

	vector<int> rfds, wfds;
	map<int, string> mgroups;
	map<string, string> friendlynicks;
	map<imfile, pair<MSN::FileTransferInvitation *, string> > transferinfo;

	void checkfriendly(icqcontact *c, const string friendlynick,
	    bool forcefetch = false);

	void checkinlist(imcontact ic);
	int findgroup(const imcontact &ic, string &gname) const;

	void removeuser(const imcontact &ic, bool report);
	bool getfevent(MSN::FileTransferInvitation *fhandle, imfile &fr);
	void statusupdate(string buddy, string friendlyname, imstatus status);

	void sendmsn(MSN::SwitchboardServerConnection *conn, const qevent *ctx);

    public:
	msnhook();
	virtual ~msnhook();

	void init();

	void connect();
	void disconnect();
	void exectimers();
	void main();

	void getsockets(fd_set &rf, fd_set &wf, fd_set &ef, int &hsocket) const;
	bool isoursocket(fd_set &rf, fd_set &wf, fd_set &ef) const;

	bool online() const;
	bool logged() const;
	bool isconnecting() const;
	bool enabled() const;

	bool send(const imevent &ev);

	void sendnewuser(const imcontact &c);
	void removeuser(const imcontact &ic);
	void requestinfo(const imcontact &ic);

	void sendupdateuserinfo(const icqcontact &c);

	void setautostatus(imstatus st);
	imstatus getstatus() const;

	void lookup(const imsearchparams &params, verticalmenu &dest);
	vector<icqcontact *> getneedsync();

	bool knowntransfer(const imfile &fr) const;
	void replytransfer(const imfile &fr, bool accept, const string &localpath = string());
	void aborttransfer(const imfile &fr);

	void updatecontact(icqcontact *c);
	void renamegroup(const string &oldname, const string &newname);
};

extern msnhook mhook;

#endif

#endif