/*************************************************************************** * Copyright (C) 2003-2007 by Joachim Eibl * * joachim.eibl at gmx.de * * * * 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. * ***************************************************************************/ #ifndef FILEACCESS_H #define FILEACCESS_H #include #include #include #include #include #include #include #include #include bool wildcardMultiMatch( const TQString& wildcard, const TQString& testString, bool bCaseSensitive ); class t_DirectoryList; class FileAccess { public: FileAccess(); ~FileAccess(); FileAccess( const TQString& name, bool bWantToWrite=false ); // name: local file or dirname or url (when supported) FileAccess( const TQString& workingDir, const TQString& name, bool bWantToWrite=false ); // name: local file or dirname or url (when supported) void setFile( const TQString& name, bool bWantToWrite=false ); bool isValid() const; bool isFile() const; bool isDir() const; bool isSymLink() const; bool exists() const; long size() const; // Size as returned by stat(). long sizeForReading(); // If the size can't be determined by stat() then the file is copied to a local temp file. bool isReadable() const; bool isWritable() const; bool isExecutable() const; bool isHidden() const; TQString readLink() const; TQDateTime created() const; TQDateTime lastModified() const; TQDateTime lastRead() const; TQString fileName() const; // Just the name-part of the path, without parent directories TQString filePath() const; // The path-string that was used during construction TQString prettyAbsPath() const; KURL url() const; TQString absFilePath() const; bool isLocal() const; bool readFile(void* pDestBuffer, unsigned long maxLength ); bool writeFile(const void* pSrcBuffer, unsigned long length ); bool listDir( t_DirectoryList* pDirList, bool bRecursive, bool bFindHidden, const TQString& filePattern, const TQString& fileAntiPattern, const TQString& dirAntiPattern, bool bFollowDirLinks, bool bUseCvsIgnore ); bool copyFile( const TQString& destUrl ); bool createBackup( const TQString& bakExtension ); static TQString tempFileName(); static bool removeTempFile( const TQString& ); bool removeFile(); static bool removeFile( const TQString& ); static bool makeDir( const TQString& ); static bool removeDir( const TQString& ); static bool exists( const TQString& ); static TQString cleanDirPath( const TQString& ); //bool chmod( const TQString& ); bool rename( const TQString& ); static bool symLink( const TQString& linkTarget, const TQString& linkLocation ); void addPath( const TQString& txt ); TQString getStatusText(); private: void setUdsEntry( const TDEIO::UDSEntry& e ); KURL m_url; bool m_bLocal; bool m_bValidData; unsigned long m_size; TQDateTime m_modificationTime; TQDateTime m_accessTime; TQDateTime m_creationTime; bool m_bReadable; bool m_bWritable; bool m_bExecutable; bool m_bExists; bool m_bFile; bool m_bDir; bool m_bSymLink; bool m_bHidden; long m_fileType; // for testing only TQString m_workingDir; TQString m_linkTarget; TQString m_user; TQString m_group; TQString m_name; TQString m_path; TQString m_absFilePath; TQString m_localCopy; TQString m_statusText; // Might contain an error string, when the last operation didn't succeed. friend class FileAccessJobHandler; }; class t_DirectoryList : public std::list {}; class FileAccessJobHandler : public TQObject { Q_OBJECT public: FileAccessJobHandler( FileAccess* pFileAccess ); bool get( void* pDestBuffer, long maxLength ); bool put( const void* pSrcBuffer, long maxLength, bool bOverwrite, bool bResume=false, int permissions=-1 ); bool stat(int detailLevel=2, bool bWantToWrite=false ); bool copyFile( const TQString& dest ); bool rename( const TQString& dest ); bool listDir( t_DirectoryList* pDirList, bool bRecursive, bool bFindHidden, const TQString& filePattern, const TQString& fileAntiPattern, const TQString& dirAntiPattern, bool bFollowDirLinks, bool bUseCvsIgnore ); bool mkDir( const TQString& dirName ); bool rmDir( const TQString& dirName ); bool removeFile( const TQString& dirName ); bool symLink( const TQString& linkTarget, const TQString& linkLocation ); private: FileAccess* m_pFileAccess; bool m_bSuccess; // Data needed during Job long m_transferredBytes; char* m_pTransferBuffer; // Needed during get or put long m_maxLength; TQString m_filePattern; TQString m_fileAntiPattern; TQString m_dirAntiPattern; t_DirectoryList* m_pDirList; bool m_bFindHidden; bool m_bRecursive; bool m_bFollowDirLinks; bool scanLocalDirectory( const TQString& dirName, t_DirectoryList* dirList ); private slots: void slotStatResult( TDEIO::Job* ); void slotSimpleJobResult( TDEIO::Job* pJob ); void slotPutJobResult( TDEIO::Job* pJob ); void slotGetData(TDEIO::Job*,const TQByteArray&); void slotPutData(TDEIO::Job*, TQByteArray&); void slotListDirInfoMessage( TDEIO::Job*, const TQString& msg ); void slotListDirProcessNewEntries( TDEIO::Job *, const TDEIO::UDSEntryList& l ); void slotPercent( TDEIO::Job* pJob, unsigned long percent ); }; class ProgressDialog : public TQDialog { Q_OBJECT public: ProgressDialog( TQWidget* pParent ); void setStayHidden( bool bStayHidden ); void setInformation( const TQString& info, bool bRedrawUpdate=true ); void setInformation( const TQString& info, double dCurrent, bool bRedrawUpdate=true ); void setCurrent( double dCurrent, bool bRedrawUpdate=true ); void step( bool bRedrawUpdate=true ); void setMaxNofSteps( int dMaxNofSteps ); void push(); void pop(bool bRedrawUpdate=true); // The progressbar goes from 0 to 1 usually. // By supplying a subrange transformation the subCurrent-values // 0 to 1 will be transformed to dMin to dMax instead. // Requirement: 0 < dMin < dMax < 1 void setRangeTransformation( double dMin, double dMax ); void setSubRangeTransformation( double dMin, double dMax ); void exitEventLoop(); void enterEventLoop( TDEIO::Job* pJob, const TQString& jobInfo ); bool wasCancelled(); void show(); void hide(); virtual void timerEvent(TQTimerEvent*); private: struct ProgressLevelData { ProgressLevelData() { m_dCurrent=0; m_maxNofSteps=1; m_dRangeMin=0; m_dRangeMax=1; m_dSubRangeMin = 0; m_dSubRangeMax = 1; } double m_dCurrent; int m_maxNofSteps; // when step() is used. double m_dRangeMax; double m_dRangeMin; double m_dSubRangeMax; double m_dSubRangeMin; }; std::list m_progressStack; int m_progressDelayTimer; KProgress* m_pProgressBar; KProgress* m_pSubProgressBar; TQLabel* m_pInformation; TQLabel* m_pSubInformation; TQLabel* m_pSlowJobInfo; TQPushButton* m_pAbortButton; void recalc(bool bRedrawUpdate); TQTime m_t1; TQTime m_t2; bool m_bWasCancelled; TDEIO::Job* m_pJob; TQString m_currentJobInfo; // Needed if the job doesn't stop after a reasonable time. bool m_bStayHidden; protected: virtual void reject(); private slots: void delayedHide(); void slotAbort(); }; // When using the ProgressProxy you need not take care of the push and pop, except when explicit. class ProgressProxy { public: ProgressProxy(); ~ProgressProxy(); void setInformation( const TQString& info, bool bRedrawUpdate=true ); void setInformation( const TQString& info, double dCurrent, bool bRedrawUpdate=true ); void setCurrent( double dCurrent, bool bRedrawUpdate=true ); void step( bool bRedrawUpdate=true ); void setMaxNofSteps( int dMaxNofSteps ); bool wasCancelled(); void setRangeTransformation( double dMin, double dMax ); void setSubRangeTransformation( double dMin, double dMax ); private: }; extern ProgressDialog* g_pProgressDialog; #endif