/*
 * kmacctimap.h
 *
 * Copyright (c) 2000-2002 Michael Haeckel <haeckel@kde.org>
 *
 * This file is based on popaccount.h by Don Sanders
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; version 2 of the License
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */

#ifndef KMAcctImap_h
#define KMAcctImap_h

#include "imapaccountbase.h"
#include <tqdict.h>

class KMFolderImap;
class KMFolderTreeItem;
namespace KMail {
  class ImapJob;
  class ActionScheduler;
}
namespace TDEIO {
  class Job;
}
class FolderStorage;

//-----------------------------------------------------------------------------
class KMAcctImap: public KMail::ImapAccountBase
{
  TQ_OBJECT
  
  friend class KMail::ImapJob;

public:
  virtual ~KMAcctImap();

  /** A weak assignment operator */
  virtual void pseudoAssign( const KMAccount * a );

  /**
   * Inherited methods.
   */
  virtual TQString type(void) const;
  virtual void processNewMail(bool);
  ConnectionState makeConnection();

  /**
   * Kill all jobs related the the specified folder/msg
   */
  virtual void ignoreJobsForMessage( KMMessage * msg );
  virtual void ignoreJobsForFolder( KMFolder * folder );
  virtual void removeSlaveJobsForFolder( KMFolder * folder );

  /**
   * Kill the slave if any jobs are active
   */
  virtual void killAllJobs( bool disconnectSlave=false );

  /**
   * Set the top level pseudo folder
   */
  virtual void setImapFolder(KMFolderImap *);

  /**
   * Starts the folderlisting for the root folder
   */
  virtual void listDirectory();

  /**
   * Read config file entries. This method is called by the account
   * manager when a new account is created. The config group is
   * already properly set by the caller.
   */
  virtual void readConfig(TDEConfig& config);

  /**
   * Returns the root folder of this account
   */
  virtual FolderStorage* rootFolder() const;

  /**
   * Queues a message for automatic filtering
   */
  void execFilters(TQ_UINT32 serNum);
    
public slots:
  /**
   * updates the new-mail-check folderlist
   */
  void slotFiltered(TQ_UINT32 serNum);
  void slotUpdateFolderList();

protected:
  friend class ::AccountManager;
  KMAcctImap(AccountManager* owner, const TQString& accountName, uint id);
  /**
   * Handle an error coming from a TDEIO job
   * See ImapAccountBase::handleJobError for details.
   */
  virtual bool handleError( int error, const TQString &errorMsg, TDEIO::Job* job, const TQString& context, bool abortSync = false );
  virtual void cancelMailCheck();

  TQPtrList<KMail::ImapJob> mJobList;
  TQGuardedPtr<KMFolderImap> mFolder;

protected slots:
  /** new-mail-notification for the current folder (is called via folderComplete) */
  void postProcessNewMail(KMFolderImap*, bool);
  /**
   * new-mail-notification for not-selected folders (is called via
   * numUnreadMsgsChanged)
   */
  void postProcessNewMail( KMFolder * f );

  /**
   * hooked up to the progress item signaling cancellation.
   * Cleanup and reset state.
   */
  void slotMailCheckCanceled();

  /**
   * called to reset the connection error status
   */
  void slotResetConnectionError();
    
  /**
   * Slots for automatic filtering
   */
  void slotFolderSelected( KMFolderImap*, bool );
  int slotFilterMsg( KMMessage* );

private:
  int mCountRemainChecks;
  /** used to reset connection errors */
  TQTimer mErrorTimer;
  TQValueList<TQ_UINT32> mFilterSerNums;
  TQDict<int> mFilterSerNumsToSave;
  KMail::ActionScheduler *mScheduler;
};

#endif /*KMAcctImap_h*/
