VfFsys.h
上传用户:surprise9
上传日期:2007-01-04
资源大小:426k
文件大小:10k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // This is part of the WAR SOFTWARE SERIES initiated by Jarle Aase
  2. // Copyright 1996 by Jarle Aase. All rights reserved.
  3. // See the "War Software Series Licende Agreement" for details concerning 
  4. // use and distribution.
  5. // ---
  6. // This source code, executables and programs containing source code or
  7. // binaries or proprietetary technology from the War Software Series are
  8. // NOT alloed used, viewed or tested by any governmental agencies in
  9. // any countries. This includes the government, departments, police, 
  10. // military etc.
  11. // ---
  12. // This file is intended for use with Tab space = 2
  13. // Created and maintained in MSVC Developer Studio
  14. // ---
  15. // NAME : VfFsys.h
  16. // PURPOSE : Header file War Daemon Virtual File System
  17. // PROGRAM : 
  18. // DATE : March 13 1997
  19. // AUTHOR : Jarle Aase
  20. // ---
  21. //
  22. // Exports are done in the .def file.
  23. // DLL_VFSYS_ exports are used by vfsys native plugins only
  24. // 
  25. // REVISION HISTORY
  26. // 
  27. #ifdef DLL_VFSYS_EXPORT
  28. #define DLL_VFSYS_ __declspec(dllexport)
  29. #else
  30. #define DLL_VFSYS_ __declspec(dllimport)
  31. #endif
  32. #define FSYS_DIR_MAX_UMASK 2
  33. #define DRIVER_NAME_LEN 32
  34. #define DRIVER_TABLE_SIZE 32
  35. #define PLUGIN_TABLE_SIZE 32
  36. #define DEFAULT_NEW_FILE_PERMS 0666
  37. #define DEFAULT_NEW_DIR_PERMS 0777
  38. struct FILE_SYSTEM
  39. {
  40. char DOSPath[MAX_PATH]; // Network or DOS path
  41. char Vpath[MAX_PATH]; // Virtual path to root node
  42. int DevIdx; // Index to device driver
  43. char LoginName[32];
  44. char LoginPwd[32];
  45. DWORD FlushDelay;
  46. BOOL DoCopy;
  47. SMEM RootNode; // Root directory node for the file system
  48. SMEM Next; // Single linked list
  49. };
  50. struct FILE_NODE
  51. {
  52. public:
  53. DWORD Perms; // Permissions
  54. USER User; // Owner
  55. USER Class; // Class
  56. SMEM MoreUsers; // USER[] List of more users with class permission
  57. FLEN Size;
  58. FILETIME CreationTime;
  59. FILETIME LastWriteDate;
  60. FILETIME lastDlTime;
  61. DWORD DlCount;
  62. unsigned f_OpenCnt : 16; // Number of open handles
  63. unsigned f_Deleted : 1; // Deleted
  64. unsigned f_DeleteFile : 1; // If deleted, also delete the physical file
  65. unsigned f_Locked : 1; // Exclusive lock
  66. unsigned f_UseCopy: 1; // Use the copy for normal file access
  67. unsigned f_UseHome: 1; // Use original for nornal file access
  68. unsigned f_CopyToHome : 1; // Uploaded file needs to be copyed to home
  69. unsigned f_PseudoName : 1; // The filename is not the physical DOS name
  70. unsigned f_IsVirtual: 1; // Virtual node
  71. unsigned f_IsRefreshed : 1; // Used to flag files that are found during rescan
  72. unsigned f_BufIsSMEM : 1; // Buf SMEM, must be freed at destruction
  73. unsigned f_LinkNotResolved : 1; // Link must be resolved
  74. // Linking
  75. SMEM Next;
  76. SMEM Prev;
  77. SMEM Father;
  78. LPCSTR Name; // File name as wee see it
  79.  // If NULL, act as if the dir we link to was this
  80. LPCSTR Comment;
  81. LPCSTR RealName; // Real file name (for .lnk and other extensions)
  82. LPCSTR LinkTo; // This is a link to --> ..
  83. SMEM Buf; // Buffer for packed data
  84. };
  85. typedef struct FILE_NODE * LPFILE_NODE;
  86. typedef const LPFILE_NODE LPCFILE_NODE;
  87. struct DIR_NODE
  88. {
  89. FILE_NODE FileNode;
  90. enum // Umask
  91. {
  92. DEF_PERM_FILE,
  93. DEF_PERM_DIR,
  94. };
  95. DWORD m_DefaultPerms[FSYS_DIR_MAX_UMASK];
  96. SMEM m_FileSystem;
  97. CWarTimer Timer; // Timeout until rescan
  98. SMEM Son;
  99. DWORD SpecialNewFilePerm; // If set, use these permissions on new files
  100. unsigned f_Dirty : 1; // security information needs to be flushed
  101. unsigned f_DoScan: 1; // Full scanning is not performed
  102. char Buf[sizeof(int)];
  103. };
  104. class DLL_VFSYS_ CFileList : public CLinkedList
  105. {
  106. public:
  107. ~CFileList();
  108. void Add(FILE_NODE *pNode){AddFirst((LPVOID)pNode);}
  109. BOOL ListRaw(CString& cReturnBuf, DWORD Flags = 0);
  110. };
  111. class DLL_VFSYS_ CPseudoFileInfo
  112. {
  113. public:
  114. const FILE_NODE *pNode;
  115. CString m_Name;
  116. LPCSTR FileName() const 
  117. {
  118. if (m_Name.IsEmpty())
  119. return pNode->Name;
  120. else
  121. return m_Name;
  122. }
  123. CString MakeFileNameASCII()
  124. {
  125. LPCSTR p = pNode->Name;
  126. m_Name.Empty();
  127. while(p)
  128. m_Name += *p++;
  129. return m_Name;
  130. }
  131. BOOL Hide(int State)
  132. {
  133. //ASSERT(FALSE);
  134. return FALSE;
  135. }
  136. FLEN GetFileLength() {return pNode->Size;}
  137. FLEN GetFileBlocks() {return GetFileLength() / (FLEN)512;}
  138. int GetInode() {return (int)pNode;};
  139. int GetLinks() {return 1;}
  140. const LPFILETIME GetModifyTime() const {return (const LPFILETIME)&pNode->LastWriteDate;}
  141. const LPFILETIME GetAccessTime() const {return (const LPFILETIME)&pNode->LastWriteDate;;}
  142. const LPFILETIME GetCreationTime() const {return (const LPFILETIME)&pNode->CreationTime;}
  143. const LPFILETIME GetLastModeTime() const {return (const LPFILETIME)&pNode->LastWriteDate;;}
  144. BOOL IsDirectory() {return (pNode->Perms & NODE_DIR);}
  145. BOOL IsLink() {return (pNode->Perms & NODE_LINK);}
  146. BOOL IsReadOnly() {return (pNode->Perms & NODE_READONLY);}
  147. int GetFileNameLen() {return strlen(FileName());}
  148. LPCSTR GetComment() {return pNode->Comment ? pNode->Comment : "";}
  149. DWORD GetDLC() {return pNode->DlCount;}
  150. LPCSTR GetUserName(CString& cBuf) const
  151. {
  152. if (!pNode->User || !CUsr::FindUser(pNode->User,cBuf))
  153. return "root";
  154. return (LPCSTR)cBuf;
  155. }
  156. LPCSTR GetGroupName(CString& cBuf) const
  157. {
  158. if (!pNode->Class || !CUsr::FindUser(pNode->Class,cBuf))
  159. return "root";
  160. return (LPCSTR)cBuf;
  161. return "root";
  162. }
  163. void operator =(struct FILE_NODE * pn)
  164. {
  165. m_Name.Empty();
  166. pNode = pn;
  167. //return *this;
  168. }
  169. operator DWORD () {return pNode->Perms;}
  170. operator LPCFILE_NODE() {return (LPCFILE_NODE)pNode;}
  171. };
  172. enum // shmem user pointers 
  173. {
  174. USERPTR_ROOTNODE = 0, // VfSys master node
  175. USERPTR_DEVDRV, // Global device driver table
  176. USERPTR_FSYS, // File system list
  177. USERPTR_PLUGINS, // Plugins global table
  178. };
  179. // Shared memory list of device drivers
  180. // Each process must create a table of drivers
  181. // where the index of the drivers are the same
  182. // as the shared memory table.
  183. struct GLOBAL_FSYS_DRIVERS_HDR
  184. {
  185. char Name[DRIVER_TABLE_SIZE][DRIVER_NAME_LEN];
  186. };
  187. class CDeviceDriver : public CFileSystemTemplate
  188. {
  189. public:
  190. };
  191. struct LOCAL_FSYS_DRIVERS_HDR
  192. {
  193. CDeviceDriver *pDevDr;
  194. HINSTANCE hDll;
  195. };
  196. // Shared memory list of fsys plugins
  197. // Each process must create a table of plugins
  198. // where the index of the drivers are the same
  199. // as the shared memory table.
  200. // These plugins are written for VfSys
  201. struct VFSYS_PLUGIN_HDR
  202. {
  203. char Name[32]; // Dll name
  204. char Pattern[64];
  205. DWORD dwFlags;
  206. };
  207. struct GLOBAL_VFSYS_PLUGIN_HDR
  208. {
  209. struct VFSYS_PLUGIN_HDR Plugin[PLUGIN_TABLE_SIZE];
  210. };
  211. struct LOCAL_VFSYS_PLUGIN_HDR
  212. {
  213. HINSTANCE hDll;
  214. DWORD (*OnFoundFile)(
  215. SMEM smDir, // Parent directory
  216. CFileInfo& Info, // File info from device
  217. SMEM smNode, // Node, 0 if new file
  218. CString& RealName, //File system name
  219. CString& VisualName, // The name the user will see
  220. CString& LinkTo, // Link to
  221. LPCSTR FsysPath, // File system path to parent dir
  222. FILE_SYSTEM *pFsys, // Current file system
  223. CDeviceDriver *pDev // Current device
  224. );
  225. };
  226. class DLL_VFSYS_ CPathArray : public CStringArray
  227. {
  228. public:
  229. void ParsePathToArray(LPCSTR Path);
  230. };
  231. ///////////////////////////////////////////////////////////
  232. // Prototypes
  233. DLL_VFSYS_ BOOL OpenFsys(HWND *phWnd, LPCSTR IniFilePath);
  234. DLL_VFSYS_ BOOL CreateMasterFsys(LPCSTR IniFilePath);
  235. DLL_VFSYS_ BOOL MountFsys(LPCSTR Path, LPCSTR Vpath, LPCSTR Driver, LPCSTR User, LPCSTR Pwd, int Copy, int Timeout, LPCSTR IniFilePath, LPCSTR Tag);
  236. DLL_VFSYS_ BOOL SyncDeviceDrivers();
  237. DLL_VFSYS_ int MountDeviceDriver(LPCSTR Driver);
  238. DLL_VFSYS_ int FindDeviceDriver(LPCSTR Name);
  239. DLL_VFSYS_ BOOL CreateRootNode(SMEM smFsys);
  240. DLL_VFSYS_ BOOL CreateDirNode(SMEM& smDirNode, LPCSTR Name, LPCSTR RealName, LPCSTR LinkTo, SMEM *psmFather, LPCSTR Comment);
  241. DLL_VFSYS_ BOOL CreateFileNode(SMEM& smNode, LPCSTR Name, LPCSTR RealName, LPCSTR LinkTo, SMEM *psmFather, LPCSTR Comment);
  242. DLL_VFSYS_ void SyncPlugins();
  243. DLL_VFSYS_ void InitializeFileNode(
  244.  FILE_NODE *pNode, 
  245.  LPSTR Buf, 
  246.  LPCSTR Name, 
  247.  LPCSTR RealName, 
  248.  LPCSTR LinkTo,
  249.  LPCSTR Comment);
  250. DLL_VFSYS_ BOOL AllocDirNode(
  251. SMEM& smNode, 
  252. LPCSTR Name, 
  253. LPCSTR RealName, 
  254. LPCSTR LinkTo, 
  255. SMEM *psmFather, 
  256. LPCSTR Comment);
  257. DLL_VFSYS_ BOOL AllocFileNode(
  258.  SMEM& smNode, 
  259.  LPCSTR Name, 
  260.  LPCSTR RealName, 
  261.  LPCSTR LinkTo, 
  262.  SMEM *psmFather, 
  263.  LPCSTR Comment);
  264. DLL_VFSYS_ DWORD GetDataBufLen(
  265.  LPCSTR Name, 
  266.  LPCSTR RealName, 
  267.  LPCSTR Comment,
  268.  LPCSTR LinkTo);
  269. DLL_VFSYS_ BOOL ChangeNodeInformation(
  270.  FILE_NODE *pNode,
  271.  LPCSTR Name, 
  272.  LPCSTR RealName,
  273.  LPCSTR LinkTo, 
  274.  LPCSTR Comment);
  275. DLL_VFSYS_ BOOL ScanPath(LPCSTR Path, BOOL FullScanToPath, BOOL Recursive, BOOL Force);
  276. DLL_VFSYS_ BOOL ScanDir(SMEM smDir, LPCSTR Pattern, BOOL Force);
  277. DLL_VFSYS_ void ScanDown(SMEM smDir, BOOL Force);
  278. DLL_VFSYS_ SMEM FindNode(SMEM& smDir, LPCSTR Name);
  279. DLL_VFSYS_ CString ResolveFsysPath(SMEM smNode, SMEM& smFsys);
  280. DLL_VFSYS_ CString ResolveVfSysPathFromDosPath(LPCSTR DOSPath);
  281. DLL_VFSYS_ void MarkAllNodesAsNotRefreshed(SMEM smNode, LPCSTR Pattern);
  282. DLL_VFSYS_ void LinkToFather(SMEM smNode, SMEM smFather);
  283. DLL_VFSYS_ void DeleteNode(SMEM smNode);
  284. DLL_VFSYS_ void DeleteTree(SMEM smDir);
  285. DLL_VFSYS_ BOOL FindNodeFromPath(SMEM &smDir, CPathArray& PathArray);
  286. DLL_VFSYS_ BOOL FindNodeFromPath(SMEM& smDir, LPCSTR Path);
  287. DLL_VFSYS_ void CopyFileNode(FILE_NODE *pDstNode, FILE_NODE *pSrcNode);
  288. DLL_VFSYS_ void CopyDirNode(DIR_NODE *pDstNode, DIR_NODE *pSrcNode);
  289. DLL_VFSYS_ void FreeFsysNode(SMEM& smNode, BOOL KillExtraToo = TRUE);
  290. DLL_VFSYS_ void UnlinkNode(SMEM smNode);
  291. DLL_VFSYS_ BOOL ScanForBusyFiles(SMEM smDir);
  292. #include "VirtualFileSystem.h"
  293. #ifndef EXT
  294. #define EXT extern
  295. #endif
  296. // Global variables
  297. DLL_VFSYS_ EXT CVirtualFileSystem *pVfSys;
  298. DLL_VFSYS_ EXT CSharedBlksMem *pSmem;
  299. DLL_VFSYS_ EXT CRWLock *pLock;
  300. DLL_VFSYS_ EXT LOCAL_FSYS_DRIVERS_HDR LocalDeviceDrivers[DRIVER_TABLE_SIZE];
  301. DLL_VFSYS_ EXT LOCAL_VFSYS_PLUGIN_HDR LocalPluginTable[PLUGIN_TABLE_SIZE];
  302. DLL_VFSYS_ EXT GLOBAL_VFSYS_PLUGIN_HDR *pGlobalPluginHdr;
  303. // Plugin return codes
  304. #define LINK_PRESENT_NOT_RESOLVED 0x00000001