PageRenderTime 57ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/MicroFrameworkPK_v4_1/Solutions/Windows2/TinyCLR/FS.cpp

https://bitbucket.org/pmfsampaio/netmf-lpc
C++ | 386 lines | 287 code | 85 blank | 14 comment | 40 complexity | 276cf56b175230e39f04f6cf6b874e65 MD5 | raw file
  1. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. using namespace System;
  6. using namespace System::Runtime::InteropServices;
  7. using namespace Microsoft::SPOT::Emulator;
  8. using namespace Microsoft::SPOT::Emulator::FS;
  9. //--//
  10. STREAM_DRIVER_DETAILS* g_Emulator_FS_DriverDetails;
  11. FileSystemVolume* g_Emulator_FS_Volumes;
  12. UINT32 g_Emulator_FS_NumVolumes;
  13. //--//
  14. void WINDOWS_STREAMING_Initialize()
  15. {
  16. }
  17. BOOL WINDOWS_STREAMING_InitializeVolume( const VOLUME_ID* volume )
  18. {
  19. if(volume->blockStorageDevice != NULL) return FALSE;
  20. return TRUE;
  21. }
  22. BOOL WINDOWS_STREAMING_UninitializeVolume( const VOLUME_ID* volume )
  23. {
  24. return TRUE;
  25. }
  26. STREAM_DRIVER_DETAILS* WINDOWS_STREAMING_DriverDetails( const VOLUME_ID* volume )
  27. {
  28. if(volume->volumeId < g_Emulator_FS_NumVolumes)
  29. {
  30. return &(g_Emulator_FS_DriverDetails[volume->volumeId]);
  31. }
  32. return NULL;
  33. }
  34. HRESULT WINDOWS_STREAMING_Open( const VOLUME_ID* volume, LPCWSTR path, UINT32* fileHandle )
  35. {
  36. if(volume->blockStorageDevice != NULL) return CLR_E_FAIL;
  37. return EmulatorNative::GetIFSDriver()->Open( volume->volumeId, gcnew String( path ), (UINT32 %)*fileHandle );
  38. }
  39. HRESULT WINDOWS_STREAMING_Close( UINT32 handle )
  40. {
  41. return EmulatorNative::GetIFSDriver()->Close( handle );
  42. }
  43. HRESULT WINDOWS_STREAMING_Read( UINT32 handle, BYTE* buffer, int size, int* bytesRead )
  44. {
  45. return EmulatorNative::GetIFSDriver()->Read( handle, IntPtr( buffer ), size, (int %)*bytesRead );
  46. }
  47. HRESULT WINDOWS_STREAMING_Write( UINT32 handle, BYTE* buffer, int size, int* bytesWritten )
  48. {
  49. return EmulatorNative::GetIFSDriver()->Write( handle, IntPtr( buffer ), size, (int %)*bytesWritten );
  50. }
  51. HRESULT WINDOWS_STREAMING_Flush( UINT32 handle )
  52. {
  53. return EmulatorNative::GetIFSDriver()->Flush( handle );
  54. }
  55. HRESULT WINDOWS_STREAMING_Seek( UINT32 handle, INT64 offset, UINT32 seekOrigin, INT64* position )
  56. {
  57. return EmulatorNative::GetIFSDriver()->Seek( handle, offset, seekOrigin, (INT64 %)*position );
  58. }
  59. HRESULT WINDOWS_STREAMING_GetLength( UINT32 handle, INT64* length )
  60. {
  61. return EmulatorNative::GetIFSDriver()->GetLength( handle, (INT64 %)*length );
  62. }
  63. HRESULT WINDOWS_STREAMING_SetLength( UINT32 handle, INT64 length )
  64. {
  65. return EmulatorNative::GetIFSDriver()->SetLength( handle, length );
  66. }
  67. STREAM_DRIVER_INTERFACE g_WINDOWS_STREAMING_DriverInterface =
  68. {
  69. &WINDOWS_STREAMING_Initialize,
  70. &WINDOWS_STREAMING_InitializeVolume,
  71. &WINDOWS_STREAMING_UninitializeVolume,
  72. &WINDOWS_STREAMING_DriverDetails,
  73. &WINDOWS_STREAMING_Open,
  74. &WINDOWS_STREAMING_Close,
  75. &WINDOWS_STREAMING_Read,
  76. &WINDOWS_STREAMING_Write,
  77. &WINDOWS_STREAMING_Flush,
  78. &WINDOWS_STREAMING_Seek,
  79. &WINDOWS_STREAMING_GetLength,
  80. &WINDOWS_STREAMING_SetLength
  81. };
  82. HRESULT WINDOWS_FILE_SYSTEM_FindOpen( const VOLUME_ID* volume, LPCWSTR path, UINT32* handle )
  83. {
  84. if(volume->blockStorageDevice != NULL) return CLR_E_FAIL;
  85. return EmulatorNative::GetIFSDriver()->FindOpen( volume->volumeId, gcnew String( path ), (UINT32 %)*handle );
  86. }
  87. HRESULT WINDOWS_FILE_SYSTEM_FindNext( UINT32 handle, FS_FILEINFO* fi, BOOL* fileFound )
  88. {
  89. FsFileInfo fileInfo;
  90. bool found = false;
  91. int hr = EmulatorNative::GetIFSDriver()->FindNext( handle, (FsFileInfo %) fileInfo, (bool %) found );
  92. if ((hr == 0) && (found))
  93. {
  94. *fileFound = TRUE;
  95. fi->Attributes = fileInfo.Attributes;
  96. fi->CreationTime = fileInfo.CreationTime;
  97. fi->LastAccessTime = fileInfo.LastAccessTime;
  98. fi->LastWriteTime = fileInfo.LastWriteTime;
  99. fi->Size = fileInfo.Size;
  100. if(fileInfo.FileName->Length >= (int)fi->FileNameSize)
  101. {
  102. return CLR_E_PATH_TOO_LONG;
  103. }
  104. pin_ptr<const wchar_t> wch = PtrToStringChars( fileInfo.FileName );
  105. /// ISSUE 07/22/2008-munirula: Remove string copy code below once
  106. /// something like lstrncpyW is found.
  107. UINT16* w = (UINT16 *)wch;
  108. int i = 0;
  109. for(;;)
  110. {
  111. if (i >= fileInfo.FileName->Length || i >= FS_MAX_PATH_LENGTH - 1)
  112. {
  113. fi->FileName[i] = 0;
  114. break;
  115. }
  116. fi->FileName[i] = w[i];
  117. if (w[i] == 0)
  118. break;
  119. i++;
  120. }
  121. }
  122. else
  123. {
  124. *fileFound = FALSE;
  125. }
  126. return hr;
  127. }
  128. HRESULT WINDOWS_FILE_SYSTEM_FindClose( UINT32 handle )
  129. {
  130. return EmulatorNative::GetIFSDriver()->FindClose( handle );
  131. }
  132. HRESULT WINDOWS_FILE_SYSTEM_GetFileInfo( const VOLUME_ID* volume, LPCWSTR path, FS_FILEINFO* fi, BOOL* fileFound )
  133. {
  134. FsFileInfo fileInfo;
  135. bool found = false;
  136. int hr = EmulatorNative::GetIFSDriver()->GetFileInfo( volume->volumeId, gcnew String( path ), (FsFileInfo %)fileInfo, (bool %)found );
  137. if ((hr == 0) && (found))
  138. {
  139. fi->Attributes = fileInfo.Attributes;
  140. fi->CreationTime = fileInfo.CreationTime;
  141. fi->LastAccessTime = fileInfo.LastAccessTime;
  142. fi->LastWriteTime = fileInfo.LastWriteTime;
  143. fi->Size = fileInfo.Size;
  144. *fileFound = TRUE;
  145. }
  146. else
  147. {
  148. *fileFound = FALSE;
  149. }
  150. return hr;
  151. }
  152. HRESULT WINDOWS_FILE_SYSTEM_CreateDirectory( const VOLUME_ID* volume, LPCWSTR path )
  153. {
  154. if(volume->blockStorageDevice != NULL) return CLR_E_FAIL;
  155. return EmulatorNative::GetIFSDriver()->CreateDirectory( volume->volumeId, gcnew String( path ) );
  156. }
  157. HRESULT WINDOWS_FILE_SYSTEM_Move( const VOLUME_ID* volume, LPCWSTR oldPath, LPCWSTR newPath )
  158. {
  159. if(volume->blockStorageDevice != NULL) return CLR_E_FAIL;
  160. return EmulatorNative::GetIFSDriver()->Move( volume->volumeId, gcnew String( oldPath ), gcnew String( newPath ) );
  161. }
  162. HRESULT WINDOWS_FILE_SYSTEM_Delete( const VOLUME_ID* volume, LPCWSTR path )
  163. {
  164. if(volume->blockStorageDevice != NULL) return CLR_E_FAIL;
  165. return EmulatorNative::GetIFSDriver()->Delete( volume->volumeId, gcnew String( path ) );
  166. }
  167. HRESULT WINDOWS_FILE_SYSTEM_GetAttributes( const VOLUME_ID* volume, LPCWSTR path, UINT32* attributes )
  168. {
  169. if(volume->blockStorageDevice != NULL) return CLR_E_FAIL;
  170. return EmulatorNative::GetIFSDriver()->GetAttributes( volume->volumeId, gcnew String( path ), (UINT32 %)*attributes );
  171. }
  172. HRESULT WINDOWS_FILE_SYSTEM_SetAttributes( const VOLUME_ID* volume, LPCWSTR path, UINT32 attributes )
  173. {
  174. if(volume->blockStorageDevice != NULL) return CLR_E_FAIL;
  175. return EmulatorNative::GetIFSDriver()->SetAttributes( volume->volumeId, gcnew System::String( path ), attributes );
  176. }
  177. HRESULT WINDOWS_FILE_SYSTEM_Format( const VOLUME_ID* volume, UINT32 parameter )
  178. {
  179. if(volume->blockStorageDevice != NULL) return CLR_E_FAIL;
  180. return EmulatorNative::GetIFSDriver()->Format( volume->volumeId, parameter );
  181. }
  182. BOOL WINDOWS_FILE_SYSTEM_IsLoadableMedia( BlockStorageDevice* driverInterface, UINT32* numVolumes )
  183. {
  184. numVolumes = 0;
  185. return FALSE;
  186. }
  187. HRESULT WINDOWS_FILE_SYSTEM_GetSizeInfo( const VOLUME_ID* volume, INT64* totalSize, INT64* totalFreeSpace )
  188. {
  189. return EmulatorNative::GetIFSDriver()->GetSizeInfo( volume->volumeId, (INT64 %)*totalSize, (INT64%)*totalFreeSpace );
  190. }
  191. HRESULT WINDOWS_FILE_SYSTEM_FlushAll( const VOLUME_ID* volume )
  192. {
  193. return EmulatorNative::GetIFSDriver()->FlushAll( volume->volumeId );
  194. }
  195. FILESYSTEM_DRIVER_INTERFACE g_WINDOWS_FILE_SYSTEM_DriverInterface =
  196. {
  197. &WINDOWS_FILE_SYSTEM_FindOpen,
  198. &WINDOWS_FILE_SYSTEM_FindNext,
  199. &WINDOWS_FILE_SYSTEM_FindClose,
  200. &WINDOWS_FILE_SYSTEM_GetFileInfo,
  201. &WINDOWS_FILE_SYSTEM_CreateDirectory,
  202. &WINDOWS_FILE_SYSTEM_Move,
  203. &WINDOWS_FILE_SYSTEM_Delete,
  204. &WINDOWS_FILE_SYSTEM_GetAttributes,
  205. &WINDOWS_FILE_SYSTEM_SetAttributes,
  206. &WINDOWS_FILE_SYSTEM_Format,
  207. &WINDOWS_FILE_SYSTEM_IsLoadableMedia,
  208. &WINDOWS_FILE_SYSTEM_GetSizeInfo,
  209. &WINDOWS_FILE_SYSTEM_FlushAll,
  210. "WINFS",
  211. 0,
  212. };
  213. //--//
  214. void FS_AddVolumes()
  215. {
  216. FileSystemVolume* volume;
  217. STREAM_DRIVER_DETAILS* sdd;
  218. int numVolumes;
  219. pin_ptr<const unsigned char> nameSpace;
  220. FILESYSTEM_DRIVER_INTERFACE* fsDriver;
  221. STREAM_DRIVER_INTERFACE* streamDriver;
  222. BlockStorageDevice* bsd;
  223. UINT32 volumeId;
  224. array<InternalDriverDetails>^ volumes;
  225. volumes = EmulatorNative::GetIFSDriver()->GetVolumesInfo();
  226. numVolumes = volumes->Length;
  227. g_Emulator_FS_Volumes = new FileSystemVolume [numVolumes];
  228. g_Emulator_FS_DriverDetails = new STREAM_DRIVER_DETAILS[numVolumes];
  229. g_Emulator_FS_NumVolumes = numVolumes;
  230. memset( g_Emulator_FS_Volumes, 0, sizeof(FileSystemVolume) * numVolumes );
  231. for(int i = 0; i < numVolumes; i++)
  232. {
  233. if(volumes[i].IsNative)
  234. {
  235. fsDriver = NULL;
  236. for(int j = 0; j < (int)g_InstalledFSCount; j++)
  237. {
  238. String^ fsName = gcnew String( g_AvailableFSInterfaces[j].fsDriver->Name );
  239. if(fsName->Equals( volumes[i].FileSystemName ))
  240. {
  241. fsDriver = g_AvailableFSInterfaces[j].fsDriver;
  242. streamDriver = g_AvailableFSInterfaces[j].streamDriver;
  243. }
  244. }
  245. if(!fsDriver)
  246. {
  247. // throw exception instead?
  248. continue;
  249. }
  250. bsd = &g_Emulator_BS_Devices[volumes[i].BlockStorageDeviceContext];
  251. volumeId = volumes[i].VolumeId;
  252. }
  253. else
  254. {
  255. // Set up the DriverDetails first, because AddVolume need these info for validatation
  256. sdd = &(g_Emulator_FS_DriverDetails[i]);
  257. sdd->bufferingStrategy = (FS_BUFFERING_STRATEGY)(int)(volumes[i].BufferingStrategy);
  258. sdd->canRead = volumes[i].CanRead;
  259. sdd->canWrite = volumes[i].CanWrite;
  260. sdd->canSeek = volumes[i].CanSeek;
  261. sdd->readTimeout = volumes[i].ReadTimeout;
  262. sdd->writeTimeout = volumes[i].WriteTimeout;
  263. sdd->inputBufferSize = volumes[i].InputBufferSize;
  264. sdd->outputBufferSize = volumes[i].OutputBufferSize;
  265. if(volumes[i].InputBuffer != nullptr)
  266. {
  267. sdd->inputBufferSize = volumes[i].InputBuffer->Length;
  268. sdd->inputBuffer = new BYTE[sdd->inputBufferSize];
  269. }
  270. if(volumes[i].OutputBuffer != nullptr)
  271. {
  272. sdd->outputBufferSize = volumes[i].OutputBuffer->Length;
  273. sdd->outputBuffer = new BYTE[sdd->outputBufferSize];
  274. }
  275. fsDriver = &g_WINDOWS_FILE_SYSTEM_DriverInterface;
  276. streamDriver = &g_WINDOWS_STREAMING_DriverInterface;
  277. bsd = NULL;
  278. volumeId = i;
  279. }
  280. nameSpace = &(volumes[i].Namespace[0]);
  281. volume = &(g_Emulator_FS_Volumes[i]);
  282. // The index into the g_Emulator_FS_Volumes will be used as volumeId so the emulator
  283. // file system driver can differentiate between different volumes
  284. FileSystemVolumeList::AddVolume( volume, (LPCSTR)nameSpace, volumes[i].SerialNumber, volumes[i].DeviceFlags,
  285. streamDriver, fsDriver, bsd, volumeId, FALSE );
  286. }
  287. }
  288. void FS_MountRemovableVolumes()
  289. {
  290. return EmulatorNative::GetIBlockStorageDriver()->MountInsertedRemovableDevices();
  291. }
  292. //--//
  293. extern FILESYSTEM_DRIVER_INTERFACE g_FAT32_FILE_SYSTEM_DriverInterface;
  294. extern STREAM_DRIVER_INTERFACE g_FAT32_STREAM_DriverInterface;
  295. //--//
  296. FILESYSTEM_INTERFACES g_AvailableFSInterfaces[] =
  297. {
  298. { &g_WINDOWS_FILE_SYSTEM_DriverInterface, &g_WINDOWS_STREAMING_DriverInterface },
  299. { &g_FAT32_FILE_SYSTEM_DriverInterface , &g_FAT32_STREAM_DriverInterface },
  300. };
  301. const size_t g_InstalledFSCount = ARRAYSIZE(g_AvailableFSInterfaces);