/*
    sievejob.h

    KMail, the KDE mail client.
    Copyright (c) 2002 Marc Mutz <mutz@kde.org>

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License,
    version 2.0, as published by the Free Software Foundation.
    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, US
*/

#ifndef __KMAIL_SIEVE_JOB_H__
#define __KMAIL_SIEVE_JOB_H__

#include <tqobject.h>
#include <tqvaluestack.h>
#include <tqstring.h>
#include <tqstringlist.h>
#include <tqcstring.h>

#include <kurl.h>
#include <tdeio/global.h>

class TQTextDecoder;
namespace TDEIO {
  class Job;
}

namespace KMail {

  class SieveJob : public TQObject {
    TQ_OBJECT
  
  protected:
    enum Command { Get, Put, Activate, Deactivate, SearchActive, List, Delete };
    SieveJob( const KURL & url, const TQString & script,
	      const TQValueStack<Command> & commands,
	      TQObject * parent=0, const char * name=0 );
    SieveJob( const KURL & url, const TQString & script,
	      const TQValueStack<Command> & commands,
	      bool showProgressInfo,
	      TQObject * parent=0, const char * name=0 );
    virtual ~SieveJob();

  public:
    enum Existence { DontKnow, Yes, No };

    /**
     * Store a Sieve script. If @param makeActive is set, also mark the
     * script active
     */
    static SieveJob * put( const KURL & dest, const TQString & script,
			   bool makeActive, bool wasActive );

    /**
     * Get a specific Sieve script
     */
    static SieveJob * get( const KURL & src, bool showProgressInfo=true );

    /**
     * List all available scripts
     */
    static SieveJob * list( const KURL & url );

    static SieveJob * del( const KURL & url );

    static SieveJob * activate( const KURL & url );

    static SieveJob * desactivate( const KURL & url );

    void kill( bool quiet=true );

    const TQStringList & sieveCapabilities() const {
      return mSieveCapabilities;
    }

    bool fileExists() const {
      return mFileExists;
    }

  signals:
    void gotScript( KMail::SieveJob * job, bool success,
		    const TQString & script, bool active );

    /**
     * We got the list of available scripts
     *
     * @param scriptList is the list of script filenames
     * @param activeScript lists the filename of the active script, or an
     *        empty string if no script is active.
     */
    void gotList( KMail::SieveJob *job, bool success,
                  const TQStringList &scriptList, const TQString &activeScript );

    void result(  KMail::SieveJob * job, bool success,
                  const TQString & script, bool active );

    void item( KMail::SieveJob * job, const TQString & filename, bool active );

  protected:
    void schedule( Command command, bool showProgressInfo );

  protected slots:
    void slotData( TDEIO::Job *, const TQByteArray & ); // for get
    void slotDataReq( TDEIO::Job *, TQByteArray & ); // for put
    void slotEntries( TDEIO::Job *, const TDEIO::UDSEntryList & ); // for listDir
    void slotResult( TDEIO::Job * ); // for all commands

  protected:
    KURL mUrl;
    TDEIO::Job * mJob;
    TQTextDecoder * mDec;
    TQString mScript;
    TQString mActiveScriptName;
    Existence mFileExists;
    TQStringList mSieveCapabilities;
    TQValueStack<Command> mCommands;
    bool mShowProgressInfo;

    // List of Sieve scripts on the server, used by @ref list()
    TQStringList mAvailableScripts;
  };

} // namespace KMail

#endif // __KMAIL_SIEVE_JOB_H__
