//  -*-C++-*-           emacs magic for .h files
/*

 $Id: tar.h,v 1.24 2000/05/16 18:52:14 ezust Exp $

  ark -- archiver for the KDE project

  Copyright (C)

  1997-1999: Rob Palmbos palm9744@kettering.edu
  1999: Francois-Xavier Duranceau duranceau@kde.org
  1999-2000: Corel Corporation (author: Emily Ezust, emilye@corel.com)

  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; either version 2
  of the License, or (at your option) any later version.

  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., 675 Mass Ave, Cambridge, MA 02139, USA.

*/

#ifndef TAR_H
#define TAR_H

#include <unistd.h>

// Qt includes
#include <qdir.h>
#include <qobject.h>
#include <qstring.h>
#include <qstrlist.h>


// KDE includes
#include <kprocess.h>
#include <ktar.h>

// ark includes

#include "arch.h"
#include "arksettings.h"

class Viewer;

// TarArch can read Tar files and Tar files compressed with gzip.
// It doesn't yet know how to list Tar files compressed with other
// compressors because the listing part is done through KTar.
// If it could be listed though, the rest would work.
// The reason we use KTar for listing is that the output tar -tvf is
// of unreliable format.

class TarArch : public Arch
{
  Q_OBJECT
public:
  TarArch( ArkSettings *_settings, Viewer *_gui, const QString & _filename);
  virtual ~TarArch();
	
  virtual void open();
  virtual void create();
	
  virtual void addFile( QStringList *);
  virtual void addDir(const QString &);
  virtual void remove(QStringList *);
  virtual void unarchFile(QStringList *, const QString & _destDir="");
	
  virtual int getEditFlag();

  QString getCompressor();
  QString getUnCompressor();

public slots:
  void updateProgress( KProcess *_kp, char *_buffer, int _bufflen);
  void openFinished( KProcess * );
  void updateFinished( KProcess * );
  void createTmpFinished( KProcess * );
  void createTmpProgress( KProcess *_kp, char *_buffer, int _bufflen);
  void slotAddFinished(KProcess *);
  void slotListingDone(KProcess *);
  void slotDeleteExited(KProcess *);

private:  // methods
  void updateArch();
  void createTmp();
  void setHeaders();
  void processDir(const KTarDirectory *tardir, const QString & root);
  void deleteOldFiles(QStringList *list, bool bAddOnlyNew);
  QString getEntry(const QString & filename);

private: // data
  QString m_archiver_program;
 // if the tar is compressed, this is the temporary uncompressed tar.
  QString tmpfile;
  bool compressed;

  // for use with createTmp and updateArch
  bool createTmpInProgress;
  bool updateInProgress;

  // for use with deleteOldFiles
  bool deleteInProgress;
  FILE *fd;
  
};

#endif /* TAR_H */
