#if !defined(HISTORYSTATS_GUARD_MIRANDACONTACT_H) #define HISTORYSTATS_GUARD_MIRANDACONTACT_H #include "_globals.h" #include #include /* * MirandaContact */ class MirandaContact : private pattern::NotCopyable { public: struct EventInfo { HANDLE hContact; DBEVENTINFO dbe; int nAllocated; // int nDuplicates; }; struct ContactInfo { HANDLE hContact; HANDLE hEvent; EventInfo ei; }; typedef std::vector SourceHandles; private: // general info ext::string m_strNick; ext::string m_strProtocol; ext::string m_strGroup; SourceHandles m_Sources; // internal data ext::a::string m_strMetaProto; protected: // reading messages std::vector m_CIs; std::list m_EIs; std::list m_SpareEIs; private: // reading messages void stripMetaID(DBEVENTINFO& dbe); protected: // reading messages void fetchSlot(int i); virtual void fillQueue() = 0; public: explicit MirandaContact(const ext::string& strNick, const ext::string& strProtocol, const ext::string& strGroup, const SourceHandles& sources); virtual ~MirandaContact(); // general info const ext::string& getNick() const { return m_strNick; } const ext::string& getProtocol() const { return m_strProtocol; } const ext::string& getGroup() const { return m_strGroup; } const SourceHandles& getSources() const { return m_Sources; } // merge void merge(const MirandaContact& other); // reading messages void beginRead(); void endRead(); bool hasNext() { return !m_EIs.empty(); } const DBEVENTINFO& getNext() { return m_EIs.front().dbe; } void readNext(); }; /* * MirandaContactTolerantMerge */ class MirandaContactTolerantMerge : private pattern::NotCopyable , public MirandaContact { protected: // reading message virtual void fillQueue(); public: explicit MirandaContactTolerantMerge(const ext::string& strNick, const ext::string& strProtocol, const ext::string& strGroup, const SourceHandles& sources) : MirandaContact(strNick, strProtocol, strGroup, sources) { } }; /* * MirandaContactStrictMerge */ class MirandaContactStrictMerge : private pattern::NotCopyable , public MirandaContact { protected: // reading message virtual void fillQueue(); public: explicit MirandaContactStrictMerge(const ext::string& strNick, const ext::string& strProtocol, const ext::string& strGroup, const SourceHandles& sources) : MirandaContact(strNick, strProtocol, strGroup, sources) { } }; /* * MirandaContactNoMerge */ class MirandaContactNoMerge : private pattern::NotCopyable , public MirandaContact { protected: // reading message virtual void fillQueue(); public: explicit MirandaContactNoMerge(const ext::string& strNick, const ext::string& strProtocol, const ext::string& strGroup, const SourceHandles& sources) : MirandaContact(strNick, strProtocol, strGroup, sources) { } }; /* * MirandaContactFactory */ class MirandaContactFactory : public pattern::NotInstantiable { public: static MirandaContact* makeMirandaContact(int MergeMode, const ext::string& strNick, const ext::string& strProtocol, const ext::string& strGroup, const MirandaContact::SourceHandles& sources); }; #endif // HISTORYSTATS_GUARD_MIRANDACONTACT_H