Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

478 lines
11 KiB

  1. /*++
  2. Copyright (c) 1994 Microsoft Corporation
  3. Module Name:
  4. ftp.hxx
  5. Abstract:
  6. Contains client-side FTP handle class
  7. Author:
  8. Richard L Firth (rfirth) 03-Jan-1996
  9. Revision History:
  10. 03-Jan-1996 rfirth
  11. Created
  12. --*/
  13. //
  14. // classes
  15. //
  16. /*++
  17. Class Description:
  18. This class defines the FTP_FIND_HANDLE_OBJECT.
  19. Private Member functions:
  20. None.
  21. Public Member functions:
  22. GetHandle : Virtual function that gets the handle value from
  23. the generic object handle.
  24. --*/
  25. //
  26. // Bit masks for dwFtpFindBools...
  27. //
  28. #define FTPFIND_ISHTML 0x00000001 // set if contents are wrapped in HTML
  29. #define FTPFIND_ISEMPTY 0x00000002 // set if FtpFindFirst was already done
  30. class FTP_FIND_HANDLE_OBJECT : public INTERNET_CONNECT_HANDLE_OBJECT {
  31. private:
  32. HINTERNET _FindHandle;
  33. CLOSE_HANDLE_FUNC _wCloseFunction;
  34. DWORD _dwFtpFindBools; // encodes flags
  35. HTML_STATE _HtmlState;
  36. LPSTR _lpszUrl;
  37. LPSTR _lpszDirEntry;
  38. //
  39. // _QueryBuffer - buffer used to query socket data available
  40. //
  41. LPVOID _QueryBuffer;
  42. //
  43. // _QueryBufferLength - length of _QueryBuffer
  44. //
  45. DWORD _QueryBufferLength;
  46. //
  47. // _QueryOffset - offset of next read from _QueryBuffer
  48. //
  49. DWORD _QueryOffset;
  50. //
  51. // _QueryBytesAvailable - number of bytes we think are available for this
  52. // socket in the query buffer
  53. //
  54. DWORD _QueryBytesAvailable;
  55. public:
  56. FTP_FIND_HANDLE_OBJECT(
  57. INTERNET_CONNECT_HANDLE_OBJECT * InternetConnectObj,
  58. LPTSTR SearchString,
  59. LPWIN32_FIND_DATA Buffer,
  60. DWORD_PTR dwContext
  61. );
  62. FTP_FIND_HANDLE_OBJECT(
  63. INTERNET_CONNECT_HANDLE_OBJECT * Parent,
  64. HINTERNET Child,
  65. CLOSE_HANDLE_FUNC wCloseFunc,
  66. DWORD_PTR dwContext
  67. );
  68. virtual ~FTP_FIND_HANDLE_OBJECT(VOID);
  69. virtual HINTERNET GetHandle(VOID);
  70. virtual HINTERNET_HANDLE_TYPE GetHandleType(VOID) {
  71. return (_dwFtpFindBools & FTPFIND_ISHTML)?
  72. TypeFtpFindHandleHtml : TypeFtpFindHandle;
  73. }
  74. virtual VOID SetHtml(VOID) {
  75. _HtmlState = HTML_STATE_START;
  76. _dwFtpFindBools |= FTPFIND_ISHTML;
  77. }
  78. virtual VOID SetHtmlState(HTML_STATE State) {
  79. _HtmlState = State;
  80. }
  81. virtual HTML_STATE GetHtmlState(VOID) {
  82. return _HtmlState;
  83. }
  84. virtual LPSTR GetUrl(VOID) {
  85. return _lpszUrl;
  86. }
  87. virtual VOID SetUrl(LPSTR Url) {
  88. _lpszUrl = Url;
  89. }
  90. virtual VOID SetDirEntry(LPSTR DirEntry) {
  91. _lpszDirEntry = DirEntry;
  92. }
  93. virtual LPSTR GetDirEntry(VOID) {
  94. return _lpszDirEntry;
  95. }
  96. VOID SetFindHandle(HINTERNET hInternet) {
  97. INET_ASSERT(_FindHandle == NULL);
  98. _FindHandle = hInternet;
  99. }
  100. DWORD AllocateQueryBuffer(VOID) {
  101. INET_ASSERT(_QueryBuffer == NULL);
  102. INET_ASSERT(_QueryBufferLength == 0);
  103. INET_ASSERT(_QueryOffset == 0);
  104. INET_ASSERT(_QueryBytesAvailable == 0);
  105. _QueryBuffer = ALLOCATE_MEMORY(LMEM_FIXED,
  106. DEFAULT_HTML_QUERY_BUFFER_LENGTH
  107. );
  108. if (_QueryBuffer != NULL) {
  109. _QueryBufferLength = DEFAULT_HTML_QUERY_BUFFER_LENGTH;
  110. return ERROR_SUCCESS;
  111. }
  112. return ERROR_NOT_ENOUGH_MEMORY;
  113. }
  114. VOID FreeQueryBuffer(VOID) {
  115. if (_QueryBuffer != NULL) {
  116. DEBUG_PRINT(API,
  117. INFO,
  118. ("Freeing FTP query buffer %#x\n",
  119. _QueryBuffer
  120. ));
  121. FREE_MEMORY((HLOCAL)_QueryBuffer);
  122. _QueryBuffer = NULL;
  123. _QueryBufferLength = 0;
  124. _QueryOffset = 0;
  125. _QueryBytesAvailable = 0;
  126. }
  127. }
  128. BOOL HaveQueryData(VOID) {
  129. return (_QueryBytesAvailable != 0) ? TRUE : FALSE;
  130. }
  131. DWORD CopyQueriedData(LPVOID lpBuffer, DWORD dwBufferLength) {
  132. INET_ASSERT(lpBuffer != NULL);
  133. INET_ASSERT(dwBufferLength != 0);
  134. DWORD len = min(_QueryBytesAvailable, dwBufferLength);
  135. if (len != 0) {
  136. memcpy(lpBuffer,
  137. (LPVOID)((LPBYTE)_QueryBuffer + _QueryOffset),
  138. len
  139. );
  140. DEBUG_PRINT(API,
  141. INFO,
  142. ("Copied %d bytes from query buffer @ %#x - %d left\n",
  143. len,
  144. (LPBYTE)_QueryBuffer + _QueryOffset,
  145. _QueryBytesAvailable - len
  146. ));
  147. _QueryOffset += len;
  148. _QueryBytesAvailable -= len;
  149. }
  150. return len;
  151. }
  152. DWORD
  153. QueryHtmlDataAvailable(
  154. OUT LPDWORD lpdwNumberOfBytesAvailable
  155. );
  156. BOOL IsEmpty (void) {
  157. return _dwFtpFindBools & FTPFIND_ISEMPTY;
  158. }
  159. void SetIsEmpty (void) {
  160. _dwFtpFindBools |= FTPFIND_ISEMPTY;
  161. }
  162. };
  163. /*++
  164. Class Description:
  165. This class defines the FTP_FILE_HANDLE_OBJECT.
  166. Private Member functions:
  167. None.
  168. Public Member functions:
  169. GetHandle : Virtual function that gets the handle value from the
  170. generic object handle.
  171. --*/
  172. class FTP_FILE_HANDLE_OBJECT : public INTERNET_CONNECT_HANDLE_OBJECT {
  173. private:
  174. HINTERNET _FileHandle;
  175. CLOSE_HANDLE_FUNC _wCloseFunction;
  176. BOOL _IsHtml;
  177. HTML_STATE _HtmlState;
  178. LPSTR _lpszUrl;
  179. LPSTR _lpszDirEntry;
  180. LPSTR _lpszFileName;
  181. public:
  182. //FTP_FILE_HANDLE_OBJECT(
  183. // INTERNET_CONNECT_HANDLE_OBJECT * InternetConnectObj,
  184. // LPTSTR lpszFileName,
  185. // DWORD fdwAccess,
  186. // DWORD dwFlags,
  187. // DWORD dwContext
  188. // );
  189. FTP_FILE_HANDLE_OBJECT(
  190. INTERNET_CONNECT_HANDLE_OBJECT * Parent,
  191. HINTERNET Child,
  192. CLOSE_HANDLE_FUNC wCloseFunc,
  193. DWORD_PTR dwContext
  194. );
  195. virtual ~FTP_FILE_HANDLE_OBJECT(VOID);
  196. virtual HINTERNET GetHandle(VOID);
  197. virtual HINTERNET_HANDLE_TYPE GetHandleType(VOID) {
  198. return _IsHtml ? TypeFtpFileHandleHtml : TypeFtpFileHandle;
  199. }
  200. virtual VOID SetHtml(VOID) {
  201. _HtmlState = HTML_STATE_START;
  202. _IsHtml = TRUE;
  203. }
  204. virtual VOID SetHtmlState(HTML_STATE State) {
  205. _HtmlState = State;
  206. }
  207. virtual HTML_STATE GetHtmlState(VOID) {
  208. return _HtmlState;
  209. }
  210. virtual LPSTR GetUrl(VOID) {
  211. return _lpszUrl;
  212. }
  213. virtual VOID SetUrl(LPSTR Url) {
  214. _lpszUrl = Url;
  215. }
  216. virtual VOID SetDirEntry(LPSTR DirEntry) {
  217. _lpszDirEntry = DirEntry;
  218. }
  219. virtual LPSTR GetDirEntry(VOID) {
  220. return _lpszDirEntry;
  221. }
  222. DWORD SetFileName(LPCSTR lpszFileName) {
  223. _lpszFileName = NewString(lpszFileName);
  224. if ( _lpszFileName == NULL )
  225. {
  226. return ERROR_NOT_ENOUGH_MEMORY;
  227. }
  228. else
  229. {
  230. return ERROR_SUCCESS;
  231. }
  232. }
  233. LPSTR GetFileName(VOID) {
  234. return _lpszFileName;
  235. }
  236. VOID SetFileHandle(HINTERNET hInternet) {
  237. INET_ASSERT(_FileHandle == NULL);
  238. _FileHandle = hInternet;
  239. }
  240. };
  241. #ifdef EXTENDED_ERROR_HTML
  242. /*++
  243. Class Description:
  244. This class defines the FTP_ERROR_HANDLE_OBJECT.
  245. Private Member functions:
  246. None.
  247. Public Member functions:
  248. GetHandle : Virtual function that gets the handle value from the
  249. generic object handle.
  250. --*/
  251. class FTP_ERROR_HANDLE_OBJECT : public INTERNET_CONNECT_HANDLE_OBJECT {
  252. private:
  253. LPSTR m_lpszErrorText;
  254. DWORD m_dwErrorTextLength;
  255. LPVOID m_QueryBuffer;
  256. DWORD m_QueryBufferLength;
  257. DWORD m_QueryOffset;
  258. DWORD m_QueryBytesAvailable;
  259. HTML_STATE m_HtmlState;
  260. public:
  261. FTP_ERROR_HANDLE_OBJECT(
  262. INTERNET_CONNECT_HANDLE_OBJECT * InternetConnectObj
  263. );
  264. virtual ~FTP_ERROR_HANDLE_OBJECT();
  265. virtual HINTERNET_HANDLE_TYPE GetHandleType(VOID) {
  266. return TypeFtpFileHandleHtml;
  267. }
  268. virtual VOID SetHtmlState(HTML_STATE State) {
  269. m_HtmlState = State;
  270. }
  271. virtual HTML_STATE GetHtmlState(VOID) {
  272. return m_HtmlState;
  273. }
  274. DWORD SetErrorText(VOID);
  275. DWORD
  276. GetErrorText(
  277. OUT LPSTR lpszBuffer,
  278. IN DWORD dwBytesToRead,
  279. OUT LPDWORD lpdwNumberOfBytesRead
  280. );
  281. DWORD AllocateQueryBuffer(VOID) {
  282. INET_ASSERT(m_QueryBuffer == NULL);
  283. INET_ASSERT(m_QueryBufferLength == 0);
  284. INET_ASSERT(m_QueryOffset == 0);
  285. INET_ASSERT(m_QueryBytesAvailable == 0);
  286. m_QueryBuffer = ALLOCATE_MEMORY(LMEM_FIXED,
  287. DEFAULT_HTML_QUERY_BUFFER_LENGTH
  288. );
  289. if (m_QueryBuffer != NULL) {
  290. m_QueryBufferLength = DEFAULT_HTML_QUERY_BUFFER_LENGTH;
  291. return ERROR_SUCCESS;
  292. } else {
  293. return ERROR_NOT_ENOUGH_MEMORY;
  294. }
  295. }
  296. VOID FreeQueryBuffer(VOID) {
  297. if (m_QueryBuffer != NULL) {
  298. DEBUG_PRINT(API,
  299. INFO,
  300. ("Freeing FTP query buffer %#x\n",
  301. m_QueryBuffer
  302. ));
  303. FREE_MEMORY((HLOCAL)m_QueryBuffer);
  304. m_QueryBuffer = NULL;
  305. m_QueryBufferLength = 0;
  306. m_QueryOffset = 0;
  307. m_QueryBytesAvailable = 0;
  308. }
  309. }
  310. BOOL HaveQueryData(VOID) {
  311. return (m_QueryBytesAvailable != 0) ? TRUE : FALSE;
  312. }
  313. DWORD CopyQueriedData(LPVOID lpBuffer, DWORD dwBufferLength) {
  314. INET_ASSERT(lpBuffer != NULL);
  315. INET_ASSERT(dwBufferLength != 0);
  316. DWORD len = min(m_QueryBytesAvailable, dwBufferLength);
  317. if (len != 0) {
  318. memcpy(lpBuffer,
  319. (LPVOID)((LPBYTE)m_QueryBuffer + m_QueryOffset),
  320. len
  321. );
  322. DEBUG_PRINT(API,
  323. INFO,
  324. ("Copied %d bytes from query buffer @ %#x - %d left\n",
  325. len,
  326. (LPBYTE)m_QueryBuffer + m_QueryOffset,
  327. m_QueryBytesAvailable - len
  328. ));
  329. m_QueryOffset += len;
  330. m_QueryBytesAvailable -= len;
  331. }
  332. return len;
  333. }
  334. DWORD
  335. QueryHtmlDataAvailable(
  336. OUT LPDWORD lpdwNumberOfBytesAvailable
  337. );
  338. };
  339. //
  340. // prototypes
  341. //
  342. DWORD
  343. RMakeFtpErrorObjectHandle(
  344. IN HINTERNET hConnect,
  345. OUT LPHINTERNET lphError
  346. );
  347. #endif