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 class KArchiveDirectory;
00033 class KArchiveFile;
00034
00040 class KArchive
00041 {
00042 protected:
00048 KArchive( QIODevice * dev );
00049
00050 public:
00051 virtual ~KArchive();
00052
00059 virtual bool open( int mode );
00060
00067 virtual void close();
00068
00073 bool isOpened() const { return m_open; }
00074
00080 int mode() const { return m_mode; }
00081
00086 QIODevice * device() const { return m_dev; }
00087
00093 const KArchiveDirectory* directory() const;
00094
00105 bool addLocalFile( const QString& fileName, const QString& destName );
00106
00118 bool addLocalDirectory( const QString& path, const QString& destName );
00119
00131 virtual bool writeDir( const QString& name, const QString& user, const QString& group ) = 0;
00132
00150 bool writeDir( const QString& name, const QString& user, const QString& group,
00151 mode_t perm, time_t atime, time_t mtime, time_t ctime );
00152
00167 bool writeSymLink(const QString &name, const QString &target,
00168 const QString &user, const QString &group,
00169 mode_t perm, time_t atime, time_t mtime, time_t ctime);
00170
00184 virtual bool writeFile( const QString& name, const QString& user, const QString& group, uint size, const char* data );
00185
00207 bool writeFile( const QString& name, const QString& user, const QString& group,
00208 uint size, mode_t perm, time_t atime, time_t mtime,
00209 time_t ctime, const char* data );
00210
00225 virtual bool prepareWriting( const QString& name, const QString& user, const QString& group, uint size ) = 0;
00226
00248 bool prepareWriting( const QString& name, const QString& user,
00249 const QString& group, uint size, mode_t perm,
00250 time_t atime, time_t mtime, time_t ctime );
00251
00256 bool writeData( const char* data, uint size );
00257
00263 virtual bool doneWriting( uint size ) = 0;
00264
00265 protected:
00271 virtual bool openArchive( int mode ) = 0;
00272
00277 virtual bool closeArchive() = 0;
00278
00286 virtual KArchiveDirectory* rootDir();
00287
00294 KArchiveDirectory * findOrCreate( const QString & path );
00295
00299 void setDevice( QIODevice *dev );
00300
00304 void setRootDir( KArchiveDirectory *rootDir );
00305
00306 private:
00307 QIODevice * m_dev;
00308 bool m_open;
00309 char m_mode;
00310 protected:
00311 virtual void virtual_hook( int id, void* data );
00312
00313 enum { VIRTUAL_WRITE_DATA = 1, VIRTUAL_WRITE_SYMLINK, VIRTUAL_WRITE_DIR,
00314 VIRTUAL_WRITE_FILE, VIRTUAL_PREPARE_WRITING };
00315 bool prepareWriting_impl( const QString& name, const QString& user,
00316 const QString& group, uint size, mode_t perm,
00317 time_t atime, time_t mtime, time_t ctime );
00318 struct PrepareWritingParams {
00319 const QString *name;
00320 const QString *user;
00321 const QString *group;
00322 uint size;
00323 mode_t perm;
00324 time_t atime, mtime, ctime;
00325 bool retval;
00326 };
00327 bool writeFile_impl( const QString& name, const QString& user,
00328 const QString& group, uint size, mode_t perm,
00329 time_t atime, time_t mtime, time_t ctime,
00330 const char* data );
00331 struct WriteFileParams {
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 const char *data;
00339 bool retval;
00340 };
00341 bool writeDir_impl(const QString& name, const QString& user,
00342 const QString& group, mode_t perm,
00343 time_t atime, time_t mtime, time_t ctime);
00344 struct WriteDirParams {
00345 const QString *name;
00346 const QString *user;
00347 const QString *group;
00348 mode_t perm;
00349 time_t atime, mtime, ctime;
00350 bool retval;
00351 };
00352 bool writeSymLink_impl(const QString &name, const QString &target,
00353 const QString &user, const QString &group,
00354 mode_t perm, time_t atime, time_t mtime, time_t ctime);
00355 struct WriteSymlinkParams {
00356 const QString *name;
00357 const QString *target;
00358 const QString *user;
00359 const QString *group;
00360 mode_t perm;
00361 time_t atime, mtime, ctime;
00362 bool retval;
00363 };
00364 bool writeData_impl( const char* data, uint size );
00365 struct WriteDataParams {
00366 const char* data;
00367 uint size;
00368 bool retval;
00369 };
00370 private:
00371 class KArchivePrivate;
00372 KArchivePrivate * d;
00373 };
00374
00382 class KArchiveEntry
00383 {
00384 public:
00395 KArchiveEntry( KArchive* archive, const QString& name, int access, int date,
00396 const QString& user, const QString& group,
00397 const QString &symlink );
00398
00399 virtual ~KArchiveEntry() { }
00400
00405 QDateTime datetime() const;
00406
00411 int date() const { return m_date; }
00412
00417 QString name() const { return m_name; }
00423 mode_t permissions() const { return m_access; }
00428 QString user() const { return m_user; }
00433 QString group() const { return m_group; }
00434
00439 QString symlink() const { return m_symlink; }
00440
00445 virtual bool isFile() const { return false; }
00446
00451 virtual bool isDirectory() const { return false; }
00452
00453 protected:
00454 KArchive* archive() const { return m_archive; }
00455
00456 private:
00457 QString m_name;
00458 int m_date;
00459 mode_t m_access;
00460 QString m_user;
00461 QString m_group;
00462 QString m_symlink;
00463 KArchive* m_archive;
00464 protected:
00465 virtual void virtual_hook( int id, void* data );
00466 private:
00467 class KArchiveEntryPrivate* d;
00468 };
00469
00477 class KArchiveFile : public KArchiveEntry
00478 {
00479 public:
00492 KArchiveFile( KArchive* archive, const QString& name, int access, int date,
00493 const QString& user, const QString& group, const QString &symlink,
00494 int pos, int size );
00495
00496 virtual ~KArchiveFile() { }
00497
00502 int position() const;
00507 int size() const;
00512 void setSize( int s ) { m_size = s; }
00513
00519 virtual QByteArray data() const;
00520
00529 QIODevice *device() const;
00530
00535 virtual bool isFile() const { return true; }
00536
00542 void copyTo(const QString& dest) const;
00543
00544 private:
00545 int m_pos;
00546 int m_size;
00547 protected:
00548 virtual void virtual_hook( int id, void* data );
00549 private:
00550 class KArchiveFilePrivate* d;
00551 };
00552
00560 class KArchiveDirectory : public KArchiveEntry
00561 {
00562 public:
00573 KArchiveDirectory( KArchive* archive, const QString& name, int access, int date,
00574 const QString& user, const QString& group,
00575 const QString& symlink);
00576
00577 virtual ~KArchiveDirectory() { }
00578
00583 QStringList entries() const;
00589 KArchiveEntry* entry( QString name );
00595 const KArchiveEntry* entry( QString name ) const;
00596
00601 void addEntry( KArchiveEntry* );
00602
00607 virtual bool isDirectory() const { return true; }
00608
00616 void copyTo(const QString& dest, bool recursive = true) const;
00617
00618 private:
00619 QDict<KArchiveEntry> m_entries;
00620 protected:
00621 virtual void virtual_hook( int id, void* data );
00622 private:
00623 class KArchiveDirectoryPrivate* d;
00624 };
00625
00626 #endif