FileStream.h
上传用户:smh666999
上传日期:2007-01-14
资源大小:553k
文件大小:4k
源码类别:

BREW编程

开发平台:

Visual C++

  1. #ifndef _filestraam_h_
  2. #define _filestraam_h_
  3. #include "BrewString.h"
  4. #include "AEEStdlib.h"
  5. #include "AEEAppGen.h"
  6. #include "AEEFile.h"
  7. #include "CbkDispatcher.h"
  8. //A few utility macros; We shall eventually move this into the AEE Services.
  9. #define ISDIGIT(c)  ( (unsigned) ((c) - '0') < 10)
  10. #define ISALPHA(c)  ( (unsigned) ( ((c)|32) - 'a') < 26 )
  11. #define ISALNUM(c)  ( ISDIGIT(c) || ISALPHA(c) )
  12. struct FDS: public IRelease
  13. {
  14. static void createFileDataStruct(FDS*& ds)
  15. {
  16. if (ds==0)
  17. ds = new FDS();
  18. }
  19. virtual void releaseResource( ) 
  20. {
  21. delete this;
  22. }
  23. virtual int getUID( ) 
  24. {
  25. return 500;
  26. }
  27. static int getID()
  28. {
  29. return 500;
  30. }
  31. template <class R>
  32. static FDS* initDataStruct(R* rr, char* address, const String& params )
  33. {
  34. FDS* ds=static_cast<FDS*>(rr->getRegistered(FDS::getID()));
  35. FDS::createFileDataStruct(ds);
  36. ds->address = address;
  37. ds->parameters = params;
  38. if (!ds->data.isEmpty())
  39. ds->data="";
  40. rr->registerResource(ds);
  41. return ds;
  42. }
  43. char* address;
  44. String parameters;
  45. String data;
  46. int error;
  47. UINT bufSize;
  48. private:
  49. FDS() :  bufSize(2)
  50. {}
  51. FDS( const FDS &Value );
  52. const FDS &operator = ( const FDS &Rhs );
  53. };
  54. template <class Y, class F>
  55. struct pkCBK;
  56. class FileStream 
  57. {
  58. public:
  59. FileStream(IShell* shell,  IExecute* pp, FDS* ds) :
  60. shell_(shell),
  61. processPolicy_(pp), 
  62. f_(0),
  63. fMgr_(0),
  64. buf_(new char[ds->bufSize+1]),
  65. ds_(ds)
  66. {
  67. }
  68. ~FileStream();
  69. int init();
  70. int initConnection();
  71. void reset();
  72. private:
  73. void write();
  74. void read();
  75. void onError( int errorCode) ;
  76. void onData( ) ;
  77. void releaseResources();
  78. void releaseResource();
  79. private:
  80. IShell* shell_;
  81. IFileMgr *fMgr_;
  82. IFile *f_;
  83. IExecute* processPolicy_; 
  84. char* buf_;
  85. typedef pkCBK0<FileStream, void (FileStream::*)()> P;
  86. P p_;
  87. typedef pkAEECBK<FileStream> A;
  88. A a_;
  89. FDS* ds_;
  90. private:
  91. FileStream( const FileStream &Value );
  92. const FileStream &operator = ( const FileStream &Rhs );
  93. };
  94. FileStream::~FileStream()
  95. {
  96. releaseResources();
  97. }
  98. void FileStream::releaseResource()
  99. {
  100. if (f_) 
  101. {
  102. IFILE_Cancel(f_, 0, 0);
  103. IFILE_Release(f_);
  104. f_ = 0;
  105. }
  106. }
  107. void FileStream::reset()
  108. {
  109. releaseResource();
  110. }
  111. void FileStream::releaseResources()
  112. {
  113. releaseResource();
  114. if (fMgr_)
  115. {
  116. IFILEMGR_Release(fMgr_);
  117. fMgr_ = 0;
  118. }
  119. delete[] buf_;
  120. buf_ = 0;
  121. }
  122. int FileStream::init()
  123. int err;
  124. if ((err = ISHELL_CreateInstance(shell_, AEECLSID_FILEMGR, (void**)(&fMgr_))) != SUCCESS) 
  125. {
  126. return err; 
  127. }
  128. if (!fMgr_)
  129. {
  130. return EFAILED;
  131. }
  132. return SUCCESS;
  133. }
  134. int FileStream::initConnection()
  135. {
  136. if (f_)
  137. {
  138. return SUCCESS; //safe approach if a connection is tried 
  139. //before ending the previous one - isReusable==true
  140. }
  141. /*AEE*/OpenFileMode mode;
  142. if (ds_->parameters.isEmpty())
  143. {
  144. mode = _OFM_READ;
  145. }
  146. else
  147. {
  148. mode = IFILEMGR_Test(fMgr_, ds_->address) != SUCCESS? _OFM_CREATE : _OFM_READWRITE;
  149. }
  150. f_ = IFILEMGR_OpenFile(fMgr_, ds_->address, mode);
  151. if (!f_) 
  152. {
  153. return IFILEMGR_GetLastError(fMgr_);
  154. }
  155. if (mode == _OFM_READ)
  156. {
  157. p_.setCallback(this, &FileStream::read);
  158. a_.setCallback(this, &FileStream::read, shell_);
  159. }
  160. else
  161. {
  162. a_.setCallback(this, &FileStream::write, shell_);
  163. }
  164. a_();
  165. return SUCCESS;
  166. }
  167. void FileStream::write ()
  168. {
  169. const char *psz = ds_->parameters.toCharArray();
  170. int rv = IFILE_Write(f_, 
  171. (byte *)psz, (uint16)ds_->bufSize);
  172. if (rv == 0) 
  173. {
  174. onError(IFILEMGR_GetLastError(fMgr_)) ;
  175. return;
  176. }
  177. int len = ds_->parameters.length();
  178. if (rv < len)
  179. {
  180. ds_->parameters.partialString(rv, len);
  181. a_();
  182. return;
  183. }
  184. onData();
  185. return;
  186. }
  187. void FileStream::read ()
  188. {
  189. if (!f_)
  190. {
  191. DBGPRINTF("file == 0 in read");
  192. onError(EFAILED);
  193. return;
  194. }
  195. int32 rv = IFILE_Read(f_, buf_, ds_->bufSize);
  196. if (rv > 0) 
  197. {
  198. buf_[rv] = 0;
  199. ds_->data += buf_;
  200. IFILE_Readable(f_, (PFNNOTIFY)P::callbackHandler, &p_);
  201. return;
  202. }
  203. else if (rv == 0) 
  204. {
  205. onData();
  206. return;
  207. }
  208. }
  209. void FileStream::onError( int errorCode) {
  210. ds_->error = errorCode;
  211. ds_->data = "";
  212. processPolicy_->onCbk() ;
  213. }
  214. void FileStream::onData( ) {
  215. ds_->error = SUCCESS;
  216. processPolicy_->onCbk() ;
  217. }
  218. #endif