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