joachim99@8
|
1 /***************************************************************************
|
joachim99@69
|
2 * Copyright (C) 2003-2006 by Joachim Eibl *
|
joachim99@69
|
3 * joachim.eibl at gmx.de *
|
joachim99@8
|
4 * *
|
joachim99@8
|
5 * This program is free software; you can redistribute it and/or modify *
|
joachim99@8
|
6 * it under the terms of the GNU General Public License as published by *
|
joachim99@8
|
7 * the Free Software Foundation; either version 2 of the License, or *
|
joachim99@8
|
8 * (at your option) any later version. *
|
joachim99@8
|
9 ***************************************************************************/
|
joachim99@8
|
10
|
joachim99@8
|
11 #ifndef FILEACCESS_H
|
joachim99@8
|
12 #define FILEACCESS_H
|
joachim99@8
|
13
|
joachim99@75
|
14 #include <QDialog>
|
joachim99@75
|
15 #include <QDateTime>
|
joachim99@75
|
16
|
joachim99@8
|
17 #include <kprogress.h>
|
joachim99@8
|
18 #include <kio/job.h>
|
joachim99@8
|
19 #include <kio/jobclasses.h>
|
joachim99@8
|
20 #include <kurldrag.h>
|
joachim99@75
|
21
|
joachim99@8
|
22 #include <list>
|
joachim99@8
|
23
|
joachim99@69
|
24 bool wildcardMultiMatch( const QString& wildcard, const QString& testString, bool bCaseSensitive );
|
joachim99@69
|
25
|
joachim99@8
|
26 class t_DirectoryList;
|
joachim99@8
|
27
|
joachim99@8
|
28 class FileAccess
|
joachim99@8
|
29 {
|
joachim99@8
|
30 public:
|
joachim99@8
|
31 FileAccess();
|
joachim99@8
|
32 ~FileAccess();
|
joachim99@8
|
33 FileAccess( const QString& name, bool bWantToWrite=false ); // name: local file or dirname or url (when supported)
|
joachim99@8
|
34 void setFile( const QString& name, bool bWantToWrite=false );
|
joachim99@8
|
35
|
joachim99@8
|
36 bool isValid() const;
|
joachim99@8
|
37 bool isFile() const;
|
joachim99@8
|
38 bool isDir() const;
|
joachim99@8
|
39 bool isSymLink() const;
|
joachim99@8
|
40 bool exists() const;
|
joachim99@8
|
41 long size() const; // Size as returned by stat().
|
joachim99@8
|
42 long sizeForReading(); // If the size can't be determined by stat() then the file is copied to a local temp file.
|
joachim99@8
|
43 bool isReadable() const;
|
joachim99@8
|
44 bool isWritable() const;
|
joachim99@8
|
45 bool isExecutable() const;
|
joachim99@8
|
46 bool isHidden() const;
|
joachim99@8
|
47 QString readLink() const;
|
joachim99@8
|
48
|
joachim99@8
|
49 QDateTime created() const;
|
joachim99@8
|
50 QDateTime lastModified() const;
|
joachim99@8
|
51 QDateTime lastRead() const;
|
joachim99@8
|
52
|
joachim99@8
|
53 QString fileName() const; // Just the name-part of the path, without parent directories
|
joachim99@8
|
54 QString filePath() const; // The path-string that was used during construction
|
joachim99@8
|
55 QString prettyAbsPath() const;
|
joachim99@8
|
56 KURL url() const;
|
joachim99@8
|
57 QString absFilePath() const;
|
joachim99@8
|
58
|
joachim99@8
|
59 bool isLocal() const;
|
joachim99@8
|
60
|
joachim99@8
|
61 bool readFile(void* pDestBuffer, unsigned long maxLength );
|
joachim99@58
|
62 bool writeFile(const void* pSrcBuffer, unsigned long length );
|
joachim99@8
|
63 bool listDir( t_DirectoryList* pDirList, bool bRecursive, bool bFindHidden,
|
joachim99@8
|
64 const QString& filePattern, const QString& fileAntiPattern,
|
joachim99@8
|
65 const QString& dirAntiPattern, bool bFollowDirLinks, bool bUseCvsIgnore );
|
joachim99@8
|
66 bool copyFile( const QString& destUrl );
|
joachim99@8
|
67 bool createBackup( const QString& bakExtension );
|
joachim99@8
|
68
|
joachim99@8
|
69 static QString tempFileName();
|
joachim99@73
|
70 static bool removeTempFile( const QString& );
|
joachim99@8
|
71 bool removeFile();
|
joachim99@8
|
72 static bool removeFile( const QString& );
|
joachim99@8
|
73 static bool makeDir( const QString& );
|
joachim99@8
|
74 static bool removeDir( const QString& );
|
joachim99@8
|
75 static bool exists( const QString& );
|
joachim99@8
|
76 static QString cleanDirPath( const QString& );
|
joachim99@8
|
77
|
joachim99@8
|
78 //bool chmod( const QString& );
|
joachim99@8
|
79 bool rename( const QString& );
|
joachim99@8
|
80 static bool symLink( const QString& linkTarget, const QString& linkLocation );
|
joachim99@8
|
81
|
joachim99@8
|
82 void addPath( const QString& txt );
|
joachim99@8
|
83 QString getStatusText();
|
joachim99@8
|
84 private:
|
joachim99@8
|
85 void setUdsEntry( const KIO::UDSEntry& e );
|
joachim99@8
|
86 KURL m_url;
|
joachim99@8
|
87 bool m_bLocal;
|
joachim99@8
|
88 bool m_bValidData;
|
joachim99@8
|
89
|
joachim99@8
|
90 unsigned long m_size;
|
joachim99@8
|
91 QDateTime m_modificationTime;
|
joachim99@8
|
92 QDateTime m_accessTime;
|
joachim99@8
|
93 QDateTime m_creationTime;
|
joachim99@8
|
94 bool m_bReadable;
|
joachim99@8
|
95 bool m_bWritable;
|
joachim99@8
|
96 bool m_bExecutable;
|
joachim99@8
|
97 bool m_bExists;
|
joachim99@8
|
98 bool m_bFile;
|
joachim99@8
|
99 bool m_bDir;
|
joachim99@8
|
100 bool m_bSymLink;
|
joachim99@8
|
101 bool m_bHidden;
|
joachim99@8
|
102 long m_fileType; // for testing only
|
joachim99@8
|
103
|
joachim99@8
|
104 QString m_linkTarget;
|
joachim99@8
|
105 QString m_user;
|
joachim99@8
|
106 QString m_group;
|
joachim99@8
|
107 QString m_name;
|
joachim99@8
|
108 QString m_path;
|
joachim99@8
|
109 QString m_absFilePath;
|
joachim99@8
|
110 QString m_localCopy;
|
joachim99@8
|
111 QString m_statusText; // Might contain an error string, when the last operation didn't succeed.
|
joachim99@8
|
112
|
joachim99@8
|
113 friend class FileAccessJobHandler;
|
joachim99@8
|
114 };
|
joachim99@8
|
115
|
joachim99@8
|
116 class t_DirectoryList : public std::list<FileAccess>
|
joachim99@8
|
117 {};
|
joachim99@8
|
118
|
joachim99@8
|
119
|
joachim99@8
|
120 class FileAccessJobHandler : public QObject
|
joachim99@8
|
121 {
|
joachim99@8
|
122 Q_OBJECT
|
joachim99@8
|
123 public:
|
joachim99@8
|
124 FileAccessJobHandler( FileAccess* pFileAccess );
|
joachim99@8
|
125
|
joachim99@8
|
126 bool get( void* pDestBuffer, long maxLength );
|
joachim99@58
|
127 bool put( const void* pSrcBuffer, long maxLength, bool bOverwrite, bool bResume=false, int permissions=-1 );
|
joachim99@8
|
128 bool stat(int detailLevel=2, bool bWantToWrite=false );
|
joachim99@8
|
129 bool copyFile( const QString& dest );
|
joachim99@8
|
130 bool rename( const QString& dest );
|
joachim99@8
|
131 bool listDir( t_DirectoryList* pDirList, bool bRecursive, bool bFindHidden,
|
joachim99@8
|
132 const QString& filePattern, const QString& fileAntiPattern,
|
joachim99@8
|
133 const QString& dirAntiPattern, bool bFollowDirLinks, bool bUseCvsIgnore );
|
joachim99@8
|
134 bool mkDir( const QString& dirName );
|
joachim99@8
|
135 bool rmDir( const QString& dirName );
|
joachim99@8
|
136 bool removeFile( const QString& dirName );
|
joachim99@8
|
137 bool symLink( const QString& linkTarget, const QString& linkLocation );
|
joachim99@8
|
138
|
joachim99@8
|
139 private:
|
joachim99@8
|
140 FileAccess* m_pFileAccess;
|
joachim99@8
|
141 bool m_bSuccess;
|
joachim99@8
|
142
|
joachim99@8
|
143 // Data needed during Job
|
joachim99@8
|
144 long m_transferredBytes;
|
joachim99@8
|
145 char* m_pTransferBuffer; // Needed during get or put
|
joachim99@8
|
146 long m_maxLength;
|
joachim99@8
|
147
|
joachim99@8
|
148 QString m_filePattern;
|
joachim99@8
|
149 QString m_fileAntiPattern;
|
joachim99@8
|
150 QString m_dirAntiPattern;
|
joachim99@8
|
151 t_DirectoryList* m_pDirList;
|
joachim99@8
|
152 bool m_bFindHidden;
|
joachim99@8
|
153 bool m_bRecursive;
|
joachim99@8
|
154 bool m_bFollowDirLinks;
|
joachim99@8
|
155
|
joachim99@8
|
156 bool scanLocalDirectory( const QString& dirName, t_DirectoryList* dirList );
|
joachim99@8
|
157
|
joachim99@8
|
158 private slots:
|
joachim99@8
|
159 void slotStatResult( KIO::Job* );
|
joachim99@8
|
160 void slotSimpleJobResult( KIO::Job* pJob );
|
joachim99@8
|
161 void slotPutJobResult( KIO::Job* pJob );
|
joachim99@8
|
162
|
joachim99@8
|
163 void slotGetData(KIO::Job*,const QByteArray&);
|
joachim99@8
|
164 void slotPutData(KIO::Job*, QByteArray&);
|
joachim99@8
|
165
|
joachim99@8
|
166 void slotListDirInfoMessage( KIO::Job*, const QString& msg );
|
joachim99@8
|
167 void slotListDirProcessNewEntries( KIO::Job *, const KIO::UDSEntryList& l );
|
joachim99@8
|
168
|
joachim99@8
|
169 void slotPercent( KIO::Job* pJob, unsigned long percent );
|
joachim99@8
|
170 };
|
joachim99@8
|
171
|
joachim99@8
|
172 class ProgressDialog : public QDialog
|
joachim99@8
|
173 {
|
joachim99@8
|
174 Q_OBJECT
|
joachim99@8
|
175 public:
|
joachim99@8
|
176 ProgressDialog( QWidget* pParent );
|
joachim99@8
|
177
|
joachim99@8
|
178 void setInformation( const QString& info, bool bRedrawUpdate=true );
|
joachim99@8
|
179 void setInformation( const QString& info, double dCurrent, bool bRedrawUpdate=true );
|
joachim99@66
|
180 void setCurrent( double dCurrent, bool bRedrawUpdate=true );
|
joachim99@66
|
181 void step( bool bRedrawUpdate=true );
|
joachim99@66
|
182 void setMaxNofSteps( int dMaxNofSteps );
|
joachim99@66
|
183 void push();
|
joachim99@66
|
184 void pop(bool bRedrawUpdate=true);
|
joachim99@8
|
185
|
joachim99@8
|
186 // The progressbar goes from 0 to 1 usually.
|
joachim99@8
|
187 // By supplying a subrange transformation the subCurrent-values
|
joachim99@8
|
188 // 0 to 1 will be transformed to dMin to dMax instead.
|
joachim99@8
|
189 // Requirement: 0 < dMin < dMax < 1
|
joachim99@66
|
190 void setRangeTransformation( double dMin, double dMax );
|
joachim99@8
|
191 void setSubRangeTransformation( double dMin, double dMax );
|
joachim99@8
|
192
|
joachim99@8
|
193 void exitEventLoop();
|
joachim99@51
|
194 void enterEventLoop( KIO::Job* pJob, const QString& jobInfo );
|
joachim99@8
|
195
|
joachim99@8
|
196 bool wasCancelled();
|
joachim99@8
|
197 void show();
|
joachim99@8
|
198 void hide();
|
joachim99@66
|
199
|
joachim99@51
|
200 virtual void timerEvent(QTimerEvent*);
|
joachim99@8
|
201 private:
|
joachim99@66
|
202
|
joachim99@66
|
203 struct ProgressLevelData
|
joachim99@66
|
204 {
|
joachim99@66
|
205 ProgressLevelData()
|
joachim99@66
|
206 {
|
joachim99@66
|
207 m_dCurrent=0; m_maxNofSteps=1; m_dRangeMin=0; m_dRangeMax=1;
|
joachim99@66
|
208 m_dSubRangeMin = 0; m_dSubRangeMax = 1;
|
joachim99@66
|
209 }
|
joachim99@66
|
210 double m_dCurrent;
|
joachim99@66
|
211 int m_maxNofSteps; // when step() is used.
|
joachim99@66
|
212 double m_dRangeMax;
|
joachim99@66
|
213 double m_dRangeMin;
|
joachim99@66
|
214 double m_dSubRangeMax;
|
joachim99@66
|
215 double m_dSubRangeMin;
|
joachim99@66
|
216 };
|
joachim99@66
|
217 std::list<ProgressLevelData> m_progressStack;
|
joachim99@69
|
218
|
joachim99@69
|
219 int m_progressDelayTimer;
|
joachim99@70
|
220 std::list<QEventLoop*> m_eventLoopStack;
|
joachim99@66
|
221
|
joachim99@8
|
222 KProgress* m_pProgressBar;
|
joachim99@8
|
223 KProgress* m_pSubProgressBar;
|
joachim99@8
|
224 QLabel* m_pInformation;
|
joachim99@8
|
225 QLabel* m_pSubInformation;
|
joachim99@51
|
226 QLabel* m_pSlowJobInfo;
|
joachim99@51
|
227 QPushButton* m_pAbortButton;
|
joachim99@8
|
228 void recalc(bool bRedrawUpdate);
|
joachim99@8
|
229 QTime m_t1;
|
joachim99@8
|
230 QTime m_t2;
|
joachim99@8
|
231 bool m_bWasCancelled;
|
joachim99@51
|
232 KIO::Job* m_pJob;
|
joachim99@51
|
233 QString m_currentJobInfo; // Needed if the job doesn't stop after a reasonable time.
|
joachim99@8
|
234 protected:
|
joachim99@8
|
235 virtual void reject();
|
joachim99@8
|
236 private slots:
|
joachim99@8
|
237 void delayedHide();
|
joachim99@51
|
238 void slotAbort();
|
joachim99@8
|
239 };
|
joachim99@8
|
240
|
joachim99@66
|
241 // When using the ProgressProxy you need not take care of the push and pop, except when explicit.
|
joachim99@66
|
242 class ProgressProxy
|
joachim99@66
|
243 {
|
joachim99@66
|
244 public:
|
joachim99@66
|
245 ProgressProxy();
|
joachim99@66
|
246 ~ProgressProxy();
|
joachim99@66
|
247
|
joachim99@66
|
248 void setInformation( const QString& info, bool bRedrawUpdate=true );
|
joachim99@66
|
249 void setInformation( const QString& info, double dCurrent, bool bRedrawUpdate=true );
|
joachim99@66
|
250 void setCurrent( double dCurrent, bool bRedrawUpdate=true );
|
joachim99@66
|
251 void step( bool bRedrawUpdate=true );
|
joachim99@66
|
252 void setMaxNofSteps( int dMaxNofSteps );
|
joachim99@66
|
253 bool wasCancelled();
|
joachim99@66
|
254 void setRangeTransformation( double dMin, double dMax );
|
joachim99@66
|
255 void setSubRangeTransformation( double dMin, double dMax );
|
joachim99@66
|
256 private:
|
joachim99@66
|
257 };
|
joachim99@66
|
258
|
joachim99@8
|
259 extern ProgressDialog* g_pProgressDialog;
|
joachim99@8
|
260
|
joachim99@8
|
261
|
joachim99@8
|
262
|
joachim99@8
|
263 #endif
|
joachim99@8
|
264
|