/*
   Copyright (C) 2008 Norbert Frese <nf2 at scheinwelt at>

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public
   License (LGPL) as published by the Free Software Foundation;
   either version 2 of the License, or (at your option) any later
   version.

   This library 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
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public License
   along with this library; see the file COPYING.LIB.  If not, write to
   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   Boston, MA 02110-1301, USA.
*/

#ifndef __giobridge_h__
#define __giobridge_h__

#include <kio/global.h>
#include <kio/slavebase.h>

#include <QtCore/QObject>
#include <QtCore/QHash>


#include <sys/types.h>
#include <sys/stat.h>

#include <stdio.h>
#include <unistd.h>

#include <glib.h>
#include <gio/gio.h>

#include "giobridge-errormapper.h"

#define GIOBRIDGE_DEBUG_AREA 27378
#define CUSTOM_MIMETYTPE_GVFS_MOUNT "inode/remote-gvfs-mount"

class GioBridge : public QObject, public KIO::SlaveBase
{
    Q_OBJECT

public:
    GioBridge( const QByteArray &pool, const QByteArray &app);
    virtual ~GioBridge();
  
    virtual void get( const KUrl& url );
    virtual void put( const KUrl& url, int _mode,
  		    KIO::JobFlags _flags );
    virtual void copy( const KUrl &src, const KUrl &dest,
                       int mode, KIO::JobFlags flags );
    virtual void rename( const KUrl &src, const KUrl &dest,
                         KIO::JobFlags flags );
    virtual void symlink( const QString &target, const KUrl &dest,
                          KIO::JobFlags flags );
  
    virtual void stat( const KUrl& url );
    virtual void listDir( const KUrl& url );
    virtual void mkdir( const KUrl& url, int permissions );
    virtual void chmod( const KUrl& url, int permissions );
    virtual void chown( const KUrl& url, const QString& owner, const QString& group );
    virtual void setModificationTime( const KUrl& url, const QDateTime& mtime );
    virtual void del( const KUrl& url, bool isfile);
    
    virtual void open( const KUrl &url, QIODevice::OpenMode mode );
    virtual void read( KIO::filesize_t size );
    virtual void write( const QByteArray &data );
    virtual void seek( KIO::filesize_t offset );
    virtual void close();    

protected Q_SLOTS:
    void slotProcessedSize( KIO::filesize_t _bytes );
    void slotInfoMessage( const QString & msg );

private:
    bool mountAndStatAgain(GError * err, const KUrl & url, GError ** mountErr);
    bool mountAndListAgain(GError * err, const KUrl & url, GError ** mountErr);  
    void followLink(const KUrl url);
    void errorTranslated(GError * err, GioBridgeErrorMapper::OperationHint opHint, const KUrl & url, const KUrl & targetUrl = KUrl());
    
    // for ::open()
    GFileInputStream* gFileInputStream;
    GFileOutputStream* gFileOutputStream;
    QByteArray openPath;
};

#endif
