00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __karchive_h
00022 #define __karchive_h
00023
00024 #include <sys/stat.h>
00025 #include <sys/types.h>
00026
00027 #include <qdatetime.h>
00028 #include <qstring.h>
00029 #include <qstringlist.h>
00030 #include <qdict.h>
00031
00032 #include <kdelibs_export.h>
00033
00034 class KArchiveDirectory;
00035 class KArchiveFile;
00036
00042 class KIO_EXPORT KArchive
00043 {
00044 protected:
00050 KArchive( QIODevice * dev );
00051
00052 public:
00053 virtual ~KArchive();
00054
00061 virtual bool open( int mode );
00062
00069 virtual void close();
00070
00076
00077 bool closeSucceeded() const;
00078
00083 bool isOpened() const { return m_open; }
00084
00090 int mode() const { return m_mode; }
00091
00096 QIODevice * device() const { return m_dev; }
00097
00103 const KArchiveDirectory* directory() const;
00104
00115 bool addLocalFile( const QString& fileName, const QString& destName );
00116
00128 bool addLocalDirectory( const QString& path, const QString& destName );
00129
00142 virtual bool writeDir( const QString& name, const QString& user, const QString& group ) = 0;
00143
00161 bool writeDir( const QString& name, const QString& user, const QString& group,
00162 mode_t perm, time_t atime, time_t mtime, time_t ctime );
00163
00178 bool writeSymLink(const QString &name, const QString &target,
00179 const QString &user, const QString &group,
00180 mode_t perm, time_t atime, time_t mtime, time_t ctime);
00181
00195 virtual bool writeFile( const QString& name, const QString& user, const QString& group, uint size, const char* data );
00196
00218 bool writeFile( const QString& name, const QString& user, const QString& group,
00219 uint size, mode_t perm, time_t atime, time_t mtime,
00220 time_t ctime, const char* data );
00221
00238 virtual bool prepareWriting( const QString& name, const QString& user, const QString& group, uint size ) = 0;
00239
00261 bool prepareWriting( const QString& name, const QString& user,
00262 const QString& group, uint size, mode_t perm,
00263 time_t atime, time_t mtime, time_t ctime );
00264
00269 bool writeData( const char* data, uint size );
00270
00276 virtual bool doneWriting( uint size ) = 0;
00277
00278 protected:
00284 virtual bool openArchive( int mode ) = 0;
00285
00290 virtual bool closeArchive() = 0;
00291
00299 virtual KArchiveDirectory* rootDir();
00300
00307 KArchiveDirectory * findOrCreate( const QString & path );
00308
00312 void setDevice( QIODevice *dev );
00313
00317 void setRootDir( KArchiveDirectory *rootDir );
00318
00319 private:
00320 QIODevice * m_dev;
00321 bool m_open;
00322 char m_mode;
00323 protected:
00324 virtual void virtual_hook( int id, void* data );
00325
00326 enum { VIRTUAL_WRITE_DATA = 1, VIRTUAL_WRITE_SYMLINK, VIRTUAL_WRITE_DIR,
00327 VIRTUAL_WRITE_FILE, VIRTUAL_PREPARE_WRITING };
00328 bool prepareWriting_impl( const QString& name, const QString& user,
00329 const QString& group, uint size, mode_t perm,
00330 time_t atime, time_t mtime, time_t ctime );
00331 struct PrepareWritingParams {
00332 const QString *name;
00333 const QString *user;
00334 const QString *group;
00335 uint size;
00336 mode_t perm;
00337 time_t atime, mtime, ctime;
00338 bool retval;
00339 };
00340 bool writeFile_impl( const QString& name, const QString& user,
00341 const QString& group, uint size, mode_t perm,
00342 time_t atime, time_t mtime, time_t ctime,
00343 const char* data );
00344 struct WriteFileParams {
00345 const QString *name;
00346 const QString *user;
00347 const QString *group;
00348 uint size;
00349 mode_t perm;
00350 time_t atime, mtime, ctime;
00351 const char *data;
00352 bool retval;
00353 };
00354 bool writeDir_impl(const QString& name, const QString& user,
00355 const QString& group, mode_t perm,
00356 time_t atime, time_t mtime, time_t ctime);
00357 struct WriteDirParams {
00358 const QString *name;
00359 const QString *user;
00360 const QString *group;
00361 mode_t perm;
00362 time_t atime, mtime, ctime;
00363 bool retval;
00364 };
00365 bool writeSymLink_impl(const QString &name, const QString &target,
00366 const QString &user, const QString &group,
00367 mode_t perm, time_t atime, time_t mtime, time_t ctime);
00368 struct WriteSymlinkParams {
00369 const QString *name;
00370 const QString *target;
00371 const QString *user;
00372 const QString *group;
00373 mode_t perm;
00374 time_t atime, mtime, ctime;
00375 bool retval;
00376 };
00377 bool writeData_impl( const char* data, uint size );
00378 struct WriteDataParams {
00379 const char* data;
00380 uint size;
00381 bool retval;
00382 };
00383 private:
00384 class KArchivePrivate;
00385 KArchivePrivate * d;
00386
00387 protected:
00388 QString decodeEntryName( const QCString & name );
00389 };
00390
00398 class KIO_EXPORT KArchiveEntry
00399 {
00400 public:
00411 KArchiveEntry( KArchive* archive, const QString& name, int access, int date,
00412 const QString& user, const QString& group,
00413 const QString &symlink );
00414
00415 virtual ~KArchiveEntry() { }
00416
00421 QDateTime datetime() const;
00422
00427 int date() const { return m_date; }
00428
00433 QString name() const { return m_name; }
00439 mode_t permissions() const { return m_access; }
00444 QString user() const { return m_user; }
00449 QString group() const { return m_group; }
00450
00455 QString symlink() const { return m_symlink; }
00456
00461 virtual bool isFile() const { return false; }
00462
00467 virtual bool isDirectory() const { return false; }
00468
00469 protected:
00470 KArchive* archive() const { return m_archive; }
00471
00472 private:
00473 QString m_name;
00474 int m_date;
00475 mode_t m_access;
00476 QString m_user;
00477 QString m_group;
00478 QString m_symlink;
00479 KArchive* m_archive;
00480 protected:
00481 virtual void virtual_hook( int id, void* data );
00482 private:
00483 class KArchiveEntryPrivate* d;
00484 };
00485
00493 class KIO_EXPORT KArchiveFile : public KArchiveEntry
00494 {
00495 public:
00508 KArchiveFile( KArchive* archive, const QString& name, int access, int date,
00509 const QString& user, const QString& group, const QString &symlink,
00510 int pos, int size );
00511
00512 virtual ~KArchiveFile() { }
00513
00518 int position() const;
00523 int size() const;
00528 void setSize( int s ) { m_size = s; }
00529
00535 virtual QByteArray data() const;
00536
00545 QIODevice *device() const;
00546
00551 virtual bool isFile() const { return true; }
00552
00558 void copyTo(const QString& dest) const;
00559
00560 private:
00561 int m_pos;
00562 int m_size;
00563 protected:
00564 virtual void virtual_hook( int id, void* data );
00565 private:
00566 class KArchiveFilePrivate* d;
00567 };
00568
00576 class KIO_EXPORT KArchiveDirectory : public KArchiveEntry
00577 {
00578 public:
00589 KArchiveDirectory( KArchive* archive, const QString& name, int access, int date,
00590 const QString& user, const QString& group,
00591 const QString& symlink);
00592
00593 virtual ~KArchiveDirectory() { }
00594
00599 QStringList entries() const;
00605 KArchiveEntry* entry( QString name );
00611 const KArchiveEntry* entry( QString name ) const;
00612
00617 void addEntry( KArchiveEntry* );
00618
00623 virtual bool isDirectory() const { return true; }
00624
00632 void copyTo(const QString& dest, bool recursive = true) const;
00633
00634 private:
00635 QDict<KArchiveEntry> m_entries;
00636 protected:
00637 virtual void virtual_hook( int id, void* data );
00638 private:
00639 class KArchiveDirectoryPrivate* d;
00640 };
00641
00642 #endif