00001
00032 #ifndef LL_LLLFSTHREAD_H
00033 #define LL_LLLFSTHREAD_H
00034
00035 #include <queue>
00036 #include <string>
00037 #include <map>
00038 #include <set>
00039
00040 #include "llapr.h"
00041
00042 #include "llqueuedthread.h"
00043
00044
00045
00046
00047
00048 class LLLFSThread : public LLQueuedThread
00049 {
00050
00051 public:
00052 enum operation_t {
00053 FILE_READ,
00054 FILE_WRITE,
00055 FILE_RENAME,
00056 FILE_REMOVE
00057 };
00058
00059
00060 public:
00061
00062 class Responder : public LLThreadSafeRefCount
00063 {
00064 protected:
00065 ~Responder();
00066 public:
00067 virtual void completed(S32 bytes) = 0;
00068 };
00069
00070 class Request : public QueuedRequest
00071 {
00072 protected:
00073 virtual ~Request();
00074
00075 public:
00076 Request(LLLFSThread* thread,
00077 handle_t handle, U32 priority,
00078 operation_t op, const LLString& filename,
00079 U8* buffer, S32 offset, S32 numbytes,
00080 Responder* responder);
00081
00082 S32 getBytes()
00083 {
00084 return mBytes;
00085 }
00086 S32 getBytesRead()
00087 {
00088 return mBytesRead;
00089 }
00090 S32 getOperation()
00091 {
00092 return mOperation;
00093 }
00094 U8* getBuffer()
00095 {
00096 return mBuffer;
00097 }
00098 const LLString& getFilename()
00099 {
00100 return mFileName;
00101 }
00102
00103 bool processRequest();
00104 void finishRequest(bool completed);
00105 void deleteRequest();
00106
00107 private:
00108 LLLFSThread* mThread;
00109 operation_t mOperation;
00110
00111 LLString mFileName;
00112
00113 U8* mBuffer;
00114 S32 mOffset;
00115 S32 mBytes;
00116 S32 mBytesRead;
00117
00118 LLPointer<Responder> mResponder;
00119 };
00120
00121
00122 public:
00123 LLLFSThread(bool threaded = TRUE);
00124 ~LLLFSThread();
00125
00126
00127 handle_t read(const LLString& filename,
00128 U8* buffer, S32 offset, S32 numbytes,
00129 Responder* responder, U32 pri=0);
00130 handle_t write(const LLString& filename,
00131 U8* buffer, S32 offset, S32 numbytes,
00132 Responder* responder, U32 pri=0);
00133
00134
00135 U32 priorityCounter() { return mPriorityCounter-- & PRIORITY_LOWBITS; }
00136
00137
00138 static void initClass(bool local_is_threaded = TRUE);
00139 static S32 updateClass(U32 ms_elapsed);
00140 static void cleanupClass();
00141
00142
00143 private:
00144 U32 mPriorityCounter;
00145
00146 public:
00147 static LLLFSThread* sLocal;
00148 };
00149
00150
00151
00152
00153 #endif // LL_LLLFSTHREAD_H