filedb_palmos.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:6k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: filedb_palmos.c 332 2005-11-06 14:31:57Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../common.h"
  24. #if defined(TARGET_PALMOS)
  25. #include "pace.h"
  26. typedef struct filedb
  27. {
  28. stream Stream;
  29. tchar_t URL[MAXPATH];
  30. FileHand File;
  31. int Length;
  32. int Pos;
  33. bool_t Silent;
  34. bool_t Create;
  35. DmSearchStateType SearchState;
  36. LocalID CurrentDB; 
  37. const tchar_t* Exts;
  38. bool_t ExtFilter;
  39. } filedb;
  40. static int Get(filedb* p, int No, void* Data, int Size)
  41. {
  42. int Result = ERR_INVALID_PARAM;
  43. switch (No)
  44. {
  45. case STREAM_URL: GETSTRING(p->URL); break;
  46. case STREAM_SILENT: GETVALUE(p->Silent,bool_t); break;
  47. case STREAM_LENGTH: GETVALUECOND(p->Length,int,p->Length>=0); break;
  48. case STREAM_CREATE: GETVALUE(p->Create,bool_t); break;
  49. }
  50. return Result;
  51. }
  52. static int Read(filedb* p,void* Data,int Size)
  53. {
  54. Err Error;
  55. Int32 Readed = FileRead(p->File,Data,1,Size,&Error);
  56. if (Readed > 0)
  57. p->Pos += Readed;
  58. else
  59. if (Error != fileErrEOF)
  60. Readed = -1;
  61. return Readed;
  62. }
  63. static int ReadBlock(filedb* p,block* Block,int Ofs,int Size)
  64. {
  65. Err Error;
  66. Int32 Readed;
  67. if (IsHeapStorage(Block))
  68. Readed = FileDmRead(p->File,(void*)Block->Ptr,Ofs,1,Size,&Error);
  69. else
  70. Readed = FileRead(p->File,(void*)(Block->Ptr+Ofs),1,Size,&Error);
  71. if (Readed > 0)
  72. p->Pos += Readed;
  73. else
  74. if (Error != fileErrEOF)
  75. Readed = -1;
  76. return Readed;
  77. }
  78. static int Seek(filedb* p,int Pos,int SeekMode)
  79. {
  80. FileOriginEnum Origin;
  81. Err Error;
  82. switch (SeekMode)
  83. {
  84. default:
  85. case SEEK_SET: Origin = fileOriginBeginning; break;
  86. case SEEK_CUR: Origin = fileOriginCurrent; break;
  87. case SEEK_END: Origin = fileOriginEnd; break;
  88. }
  89. Error = FileSeek(p->File,Pos,Origin);
  90. if (Error == errNone || Error == fileErrEOF)
  91. {
  92. p->Pos = FileTell(p->File,NULL,NULL);
  93. return p->Pos;
  94. }
  95. return -1;
  96. }
  97. static int Open(filedb* p, const tchar_t* URL, bool_t ReOpen)
  98. {
  99. if (p->File)
  100. {
  101. FileClose(p->File);
  102. p->File = NULL;
  103. }
  104. p->Length = -1;
  105. if (!ReOpen)
  106. p->URL[0] = 0;
  107. #ifdef MULTITHREAD
  108. else
  109. ThreadSleep(GetTimeFreq()/5);
  110. #endif
  111. if (URL && URL[0])
  112. {
  113. p->File = FileOpen(0,GetMime(URL,NULL,0,NULL), 0, 0, fileModeReadOnly | fileModeAnyTypeCreator, NULL);
  114. if (!p->File)
  115. {
  116. if (!ReOpen && !p->Silent)
  117. ShowError(0,ERR_ID,ERR_FILE_NOT_FOUND,URL);
  118. return ERR_FILE_NOT_FOUND;
  119. }
  120. tcscpy_s(p->URL,TSIZEOF(p->URL),URL);
  121. if (ReOpen)
  122. FileSeek(p->File,p->Pos,fileOriginBeginning);
  123. else
  124. {
  125. p->Length = -1;
  126. if (FileSeek(p->File,0,fileOriginEnd) == errNone)
  127. p->Length = FileTell(p->File,NULL,NULL);
  128. FileSeek(p->File,0,fileOriginBeginning);
  129. }
  130. p->Pos = FileTell(p->File,NULL,NULL);
  131. }
  132. return ERR_NONE;
  133. }
  134. bool_t DBFrom(uint16_t Card,uint32_t DB,tchar_t* URL,int URLLen)
  135. {
  136. char Name[48];
  137. UInt16 Attr = 0;
  138. DmDatabaseInfo(Card,DB,Name,&Attr,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
  139. if (Attr & dmHdrAttrStream)
  140. {
  141. stprintf_s(URL,URLLen,T("mem://%s"),Name);
  142. return 1;
  143. }
  144. return 0;
  145. }
  146. static int EnumDir(filedb* p,const tchar_t* URL,const tchar_t* Exts,bool_t ExtFilter,streamdir* Item)
  147. {
  148. Boolean New = 0;
  149. UInt16 card; 
  150. if (URL)
  151. {
  152. p->CurrentDB = 0;
  153. p->Exts = Exts;
  154. p->ExtFilter = ExtFilter;
  155. New = 1;
  156. }
  157. Item->FileName[0] = 0;
  158. Item->DisplayName[0] = 0;
  159. while (DmGetNextDatabaseByTypeCreator(New, &p->SearchState, 0, 0, 0, &card, &p->CurrentDB)==errNone)
  160. {
  161. char Name[48];
  162. UInt16 Attr = 0;
  163. UInt32 Date = (UInt32)-1;
  164. UInt32 Size = 0;
  165. DmDatabaseInfo(card,p->CurrentDB,Name,&Attr,NULL,NULL,&Date,NULL,NULL,NULL,NULL,NULL,NULL);
  166. if (Attr & dmHdrAttrStream)
  167. {
  168. Item->Type = CheckExts(Name,p->Exts);
  169. if (Item->Type || !p->ExtFilter)
  170. {
  171. DmDatabaseSize(card,p->CurrentDB,NULL,NULL,&Size);
  172. tcscpy_s(Item->FileName,TSIZEOF(Item->FileName),Name);
  173. Item->Date = Date;
  174. Item->Size = Size;
  175. return ERR_NONE;
  176. }
  177. }
  178. New = 0;
  179. }
  180. return ERR_END_OF_FILE;
  181. }
  182. static int Set(filedb* p, int No, const void* Data, int Size)
  183. {
  184. int Result = ERR_INVALID_PARAM;
  185. switch (No)
  186. {
  187. case STREAM_SILENT: SETVALUE(p->Silent,bool_t,ERR_NONE); break;
  188. case STREAM_CREATE: SETVALUE(p->Create,bool_t,ERR_NONE); break;
  189. case STREAM_URL: Result = Open(p,(const tchar_t*)Data,0); break;
  190. }
  191. return Result;
  192. }
  193. static int Create(filedb* p)
  194. {
  195. p->Stream.Get = (nodeget)Get;
  196. p->Stream.Set = (nodeset)Set;
  197. p->Stream.Read = (streamread)Read;
  198. p->Stream.ReadBlock = (streamreadblock)ReadBlock;
  199. p->Stream.Seek = (streamseek)Seek;
  200. p->Stream.EnumDir = (streamenumdir)EnumDir;
  201. return ERR_NONE;
  202. }
  203. static void Delete(filedb* p)
  204. {
  205. Open(p,NULL,0);
  206. }
  207. static const nodedef FileDb =
  208. {
  209. sizeof(filedb),
  210. FILEDB_ID,
  211. STREAM_CLASS,
  212. PRI_MINIMUM,
  213. (nodecreate)Create,
  214. (nodedelete)Delete,
  215. };
  216. void FileDb_Init()
  217. {
  218. NodeRegisterClass(&FileDb);
  219. }
  220. void FileDb_Done()
  221. {
  222. NodeUnRegisterClass(FILEDB_ID);
  223. }
  224. #endif