text: /**********************************************************************
   * LeechCraft - modular cross-platform feature rich internet client.
   * Copyright (C) 2006-2014  Georg Rudoy
   *
   * Boost Software License - Version 1.0 - August 17th, 2003
   *
   * Permission is hereby granted, free of charge, to any person or organization
   * obtaining a copy of the software and accompanying documentation covered by
   * this license (the "Software") to use, reproduce, display, distribute,
   * execute, and transmit the Software, and to prepare derivative works of the
   * Software, and to permit third-parties to whom the Software is furnished to
   * do so, all subject to the following:
   *
   * The copyright notices in the Software and this entire statement, including
   * the above license grant, this restriction and the following disclaimer,
   * must be included in all copies of the Software, in whole or in part, and
   * all derivative works of the Software, unless such copies or derivative
   * works are solely in the form of machine-executable object code generated by
   * a source language processor.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
   * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
   * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
   * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
   * DEALINGS IN THE SOFTWARE.
   **********************************************************************/
  
  #pragma once
  
  #include <QObject>
  #include <QList>
  #include <QPair>
  #include <interfaces/azoth/iclentry.h>
  #include <interfaces/azoth/iupdatablechatentry.h>
  
  namespace LeechCraft
  {
  namespace Azoth
  {
  namespace Murm
  {
  	class VkAccount;
  	class VkMessage;
  	struct MessageInfo;
  	struct FullMessageInfo;
  
  	class EntryBase : public QObject
  					, public ICLEntry
  					, public IUpdatableChatEntry
  	{
  		Q_OBJECT
  		Q_INTERFACES (LeechCraft::Azoth::ICLEntry
  				LeechCraft::Azoth::IUpdatableChatEntry)
  	protected:
  		VkAccount * const Account_;
  		QList<VkMessage*> Messages_;
  
  		bool HasUnread_ = false;
  	public:
  		EntryBase (VkAccount*);
  
  		virtual void Send (VkMessage*) = 0;
  		void Store (VkMessage*);
  
  		QObject* GetQObject () override;
  		IAccount* GetParentAccount () const override;
  
  		IMessage* CreateMessage (IMessage::Type type, const QString& variant, const QString& body) override;
  		QList<IMessage*> GetAllMessages () const override;
  		void PurgeMessages (const QDateTime& before) override;
  
  		void MarkMsgsRead () override;
  	protected:
  		void HandleAttaches (VkMessage*, const MessageInfo&, const FullMessageInfo&);
  	private:
  		void HandleFullMessageInfo (const FullMessageInfo&, VkMessage*);
  		void PerformReplacements (QList<QPair<QString, QString>>, QString&);
  	signals:
  		void gotMessage (QObject*) override;
  		void statusChanged (const EntryStatus&, const QString&) override;
  		void availableVariantsChanged (const QStringList&) override;
  		void nameChanged (const QString&) override;
  		void groupsChanged (const QStringList&) override;
  		void chatPartStateChanged (const ChatPartState&, const QString&) override;
  		void permsChanged () override;
  		void entryGenerallyChanged () override;
  
  		void performJS (const QString&) override;
  	};
  }
  }
  }
  