/*=========================================================================
| KCardDAV
|--------------------------------------------------------------------------
| (c) 2010  Timothy Pearson
|
| This project is released under the GNU General Public License.
| Please see the file COPYING for more details.
|--------------------------------------------------------------------------
| Job class for accessing remote address books.
 ========================================================================*/

/*=========================================================================
| INCLUDES
 ========================================================================*/

#ifndef KABCDAV_JOB_H
#define KABCDAV_JOB_H

#include <tqthread.h>
#include <tqstring.h>
#include <tqdatetime.h>
#include <tqapplication.h>

extern "C" {
    #include <libcarddav/carddav.h>
}

namespace KABC {

/*=========================================================================
| CLASS
 ========================================================================*/

/**
 * Calendar job.
 */
class CardDavJob : public TQThread {

public:

    /**
     * @param url URL to load.
     */
    CardDavJob(const TQString& url = TQString());

    virtual ~CardDavJob();

    /**
     * Sets a new URL to load.
     */
    virtual void setUrl(const TQString& s) {
        mUrl = s;
    }

    /**
     * Sets whether to use UID (false) or URI (true) as an object's unique identifier
     */
    virtual void setUseURI(bool b) {
        mUseURI = b;
    }

    /**
     * Sets the parent qobject.
     */
    virtual void setParent(TQObject *s) {
        mParent = s;
    }

    /**
     * Sets the type (0==read, 1==write)
     */
    virtual void setType(int s) {
        mType = s;
    }

    /**
     * @return URL to load.
     */
    virtual TQString url() const {
        return mUrl;
    }

    /**
     * @return whether to use UID (false) or URI (true) as an object's unique identifier
     */
    virtual bool getUseURI() {
         return mUseURI;
    }

    /**
     * @return parent object
     */
    virtual TQObject *parent() {
        return mParent;
    }

    /**
     * @return type
     */
    virtual int type() {
        return mType;
    }

    /**
     * @return true if downloading process failed.
     */
    virtual bool error() const {
        return mError;
    }

    /**
     * @return an error string.
     */
    virtual TQString errorString() const {
        return mErrorString;
    }

    /**
     * @return an error number.
     */
    virtual long errorNumber() const {
        return mErrorNumber;
    }

protected:

    virtual void run();

    /**
     * Main run method for jobs. Jobs should not override run() method.
     * Instead of this they should override this one.
     * @param carddavRuntime specific libcarddav runtime information. This pointer should not be saved for the usage
     * outside of runJob.
     * @return libcarddav response code (see CARDDAV_RESPONSE)
     */
    virtual int runJob(runtime_info* carddavRuntime) = 0;

    /**
     * Some cleaning. Jobs may (and usually should) override this method.
     */
    virtual void cleanJob() {
        mError = false;
        mErrorString = "";
        mErrorNumber = 0;
    }

    /**
     * Sets an error string to @p err. Also sets an error flag.
     */
    void setErrorString(const TQString& str, const long number);

    /**
     * Process an error.
     * Subclasses can overwrite this method, if some special error message handling
     * should be done. Call setErrorString() to set the error after processing is done.
     * @param err error structure.
     */
    virtual void processError(const carddav_error* err);

private:

    TQString mUrl;
    bool mError;
    TQString mErrorString;
    long mErrorNumber;
    TQObject *mParent;
    int mType;
    bool mUseURI;

    void enableCarddavDebug(runtime_info*);
};

} // namespace KABC

#endif // KABCDAV_JOB_H