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.

651 lines
18 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992 - 1995.
  5. //
  6. // File: urlmon.hxx
  7. //
  8. // Contents:
  9. //
  10. // Classes:
  11. //
  12. // Functions:
  13. //
  14. // History: 12-22-95 JohannP (Johann Posch) Created
  15. //
  16. //----------------------------------------------------------------------------
  17. #ifndef _URLMON_HXX_
  18. #define _URLMON_HXX_
  19. #include <urlint.h>
  20. #include <wininet.h>
  21. #include <sem.hxx>
  22. #include <debug.h>
  23. #include <w95wraps.h>
  24. #ifdef _SBS_
  25. #define CLSID_StdURLMoniker CLSID_SBS_StdURLMoniker
  26. #define CLSID_UrlMkBindCtx CLSID_SBS_UrlMkBindCtx
  27. #define CLSID_HttpSProtocol CLSID_SBS_HttpSProtocol
  28. #define CLSID_HttpProtocol CLSID_SBS_HttpProtocol
  29. #define CLSID_FtpProtocol CLSID_SBS_FtpProtocol
  30. #define CLSID_GopherProtocol CLSID_SBS_GopherProtocol
  31. #define CLSID_FileProtocol CLSID_SBS_FileProtocol
  32. #define CLSID_MkProtocol CLSID_SBS_MkProtocol
  33. #define CLSID_SoftDistExt CLSID_SBS_SoftDistExt
  34. #define CLSID_InternetSecurityManager CLSID_SBS_InternetSecurityManager
  35. #define CLSID_InternetZoneManager CLSID_SBS_InternetZoneManager
  36. #define CLSID_DeCompMimeFilter CLSID_SBS_DeCompMimeFilter
  37. #define CLSID_StdEncodingFilterFac CLSID_SBS_StdEncodingFilterFac
  38. #define CLSID_CdlProtocol CLSID_SBS_CdlProtocol
  39. #define CLSID_ClassInstallFilter CLSID_SBS_ClassInstallFilter
  40. #endif //_SBS_
  41. #define SZPROTOCOLROOT "PROTOCOLS\\Handler\\"
  42. #define SZCLASS "CLSID"
  43. #define SZALL "*"
  44. #define SZNAMESPACEROOT "PROTOCOLS\\Name-Space Handler\\"
  45. #define SZHANDLER "HANDLER"
  46. #define SZFILTERROOT "PROTOCOLS\\Filter\\"
  47. #define ULPROTOCOLLEN 32
  48. #define SZ_SH_PROTOCOLROOT "SOFTWARE\\Classes\\PROTOCOLS\\Handler\\"
  49. #define SZ_SH_NAMESPACEROOT "SOFTWARE\\Classes\\PROTOCOLS\\Name-Space Handler\\"
  50. #define SZ_SH_FILTERROOT "SOFTWARE\\Classes\\PROTOCOLS\\Filter\\"
  51. //extern char szMimeKey[] = "MIME\\Database\\Content Type\\";
  52. //const ULONG ulMimeKeyLen = ((sizeof(szMimeKey)/sizeof(char))-1);
  53. #define SZMIMEKEY "MIME\\Database\\Content Type\\"
  54. #define ULMIMEKEYLEN 32
  55. // move this to public header file
  56. #define S_NEEDMOREDATA ((HRESULT)0x00000002L)
  57. #define BSCF_ASYNCDATANOTIFICATION 0x00010000
  58. #define BINDSTATUS_ERROR ((BINDSTATUS)0xf0000000)
  59. #define BINDSTATUS_INTERNAL ((BINDSTATUS)0xf1000000)
  60. #define BINDSTATUS_INTERNALASYNC ((BINDSTATUS)0xf2000000)
  61. #define BINDSTATUS_RESULT ((BINDSTATUS)0xf4000000)
  62. // BUGBUG: find maximum mime size
  63. #define SZMIMESIZE_MAX 128
  64. // download buffer per request, can this
  65. #define DNLD_BUFFER_SIZE 8192
  66. #define SNIFFDATA_SIZE 2048
  67. #define MAX_URL_SIZE INTERNET_MAX_URL_LENGTH
  68. #define CU_NO_CANONICALIZE 0x00000000
  69. #define CU_CANONICALIZE 0x00000001
  70. #define CU_STANDARD_FORM 0x00000002
  71. STDAPI ConstructURL(LPBC pBC, LPMONIKER pmkContext, LPMONIKER pmkToLeft,
  72. LPWSTR pwzURLRelative, LPWSTR pwzURLFull, DWORD cURLSize,
  73. DWORD dwFlags);
  74. // global variable
  75. extern HINTERNET g_hSession;
  76. LPCSTR GetUserAgentString();
  77. void WideCharToMultiByteWithMlang(LPCWSTR wzFrom, LPSTR szTo, int cchTo, DWORD dwCodePage);
  78. inline void W2A(LPCWSTR lpwszWide, LPSTR lpszAnsi, int cchAnsi, DWORD dwCodePage = 0)
  79. {
  80. if( !dwCodePage )
  81. {
  82. if(!WideCharToMultiByte(CP_ACP,0,lpwszWide,-1,lpszAnsi,cchAnsi,NULL,NULL))
  83. {
  84. // truncated - make sure to null terminate
  85. lpszAnsi[cchAnsi - 1] = 0;
  86. }
  87. }
  88. else
  89. {
  90. WideCharToMultiByteWithMlang(lpwszWide,lpszAnsi,cchAnsi,dwCodePage);
  91. }
  92. }
  93. inline void A2W(LPSTR lpszAnsi,LPWSTR lpwszWide, int cchAnsi)
  94. {
  95. if(!MultiByteToWideChar(CP_ACP,0,lpszAnsi,-1,lpwszWide,cchAnsi))
  96. {
  97. // truncated - make sure to null terminate
  98. lpwszWide[cchAnsi - 1] = 0;
  99. }
  100. }
  101. #define CchWzLen(x) wcslen(x)
  102. #define CchSzLen(x) strlen(x)
  103. LPSTR SzW2ADynamic(LPCWSTR wzFrom, LPSTR szTo, int cchTo, BOOL fTaskMalloc);
  104. LPWSTR WzA2WDynamic(LPCSTR szFrom, LPWSTR wzTo, int cwchTo, BOOL fTaskMalloc);
  105. LPWSTR OLESTRDuplicate(LPCWSTR ws);
  106. // Security manager functions.
  107. // functions called by the security manager
  108. BOOL IsHierarchicalScheme(DWORD dwScheme);
  109. BOOL IsHierarchicalUrl(LPCWSTR pwszUrl);
  110. // functions exported by the security manager.
  111. STDAPI InternetCreateSecurityManager(IUnknown *pUnkOuter, REFIID riid, void **ppvObj, DWORD dwReserved);
  112. STDAPI InternetCreateZoneManager(IUnknown *pUnkOuter, REFIID riid, void **ppvObj, DWORD dwReserved);
  113. BOOL ZonesInit( );
  114. VOID ZonesUnInit( );
  115. //+---------------------------------------------------------------------------
  116. //
  117. // Function: DupA2W
  118. //
  119. // Synopsis: duplicates an ansi string to a wide string
  120. //
  121. // Arguments: [lpszAnsi] --
  122. //
  123. // History: 7-20-96 JohannP (Johann Posch) Created
  124. //
  125. // Notes:
  126. //
  127. //----------------------------------------------------------------------------
  128. inline LPWSTR DupA2W(const LPSTR lpszAnsi)
  129. {
  130. return WzA2WDynamic(lpszAnsi, NULL, 0, FALSE);
  131. }
  132. //+---------------------------------------------------------------------------
  133. //
  134. // Function: DupW2A
  135. //
  136. // Synopsis: duplicates a wide string to an ansi string
  137. //
  138. // Arguments: [pwz] --
  139. //
  140. // History: 7-20-96 JohannP (Johann Posch) Created
  141. //
  142. // Notes:
  143. //
  144. //----------------------------------------------------------------------------
  145. inline LPSTR DupW2A(const WCHAR *pwz)
  146. {
  147. return SzW2ADynamic(pwz, NULL, 0, FALSE);
  148. }
  149. /*---------------------------------------------------------------------------
  150. SzDupWzToSz
  151. Duplicate a wide string to an ansi string.
  152. If 'fTaskMalloc', allocation is done thru IMalloc,
  153. otherwise it is done thru new.
  154. The caller must destroy it using IMalloc or
  155. delete operator, as appropriate.
  156. -----------------------------------------------------------------------------*/
  157. inline char *SzDupWzToSz(const WCHAR *pwz, BOOL fTaskMalloc)
  158. {
  159. return SzW2ADynamic(pwz, NULL, 0, fTaskMalloc);
  160. }
  161. /*----------------------------------------------------------------------------
  162. IsStatusOK
  163. Checks for status codes that are considered "normal" from an urlmon
  164. perspective i.e. no special action or error code paths should be taken
  165. in these cases.
  166. -----------------------------------------------------------------------------*/
  167. inline BOOL IsStatusOk(DWORD dwStatus)
  168. {
  169. return ((dwStatus == HTTP_STATUS_OK) || (dwStatus == HTTP_STATUS_RETRY_WITH));
  170. }
  171. //+---------------------------------------------------------------------------
  172. //
  173. // Class: CRefCount ()
  174. //
  175. // Purpose: Safe class for refcounting
  176. //
  177. // Interface: CRefCount()
  178. // CRefCount(LONG lValue)
  179. // LONG operator++() prefix
  180. // LONG operator--() prefix
  181. // LONG operator++(int) postfix
  182. // LONG operator--(int) postfix
  183. // LONG operator++(int) cast operator
  184. //
  185. // History: 1-19-96 JohannP (Johann Posch) Created
  186. //
  187. // Notes:
  188. //
  189. //----------------------------------------------------------------------------
  190. class CRefCount
  191. {
  192. public:
  193. CRefCount()
  194. {
  195. _cRefs = 1;
  196. }
  197. CRefCount(LONG lVal)
  198. {
  199. _cRefs = lVal;
  200. }
  201. LONG Set(ULONG newValue)
  202. {
  203. return InterlockedExchange(&_cRefs, newValue);
  204. }
  205. // prefix operators
  206. LONG operator++()
  207. {
  208. return InterlockedIncrement(&_cRefs);
  209. }
  210. LONG operator--()
  211. {
  212. return InterlockedDecrement(&_cRefs);
  213. }
  214. // postfix operators
  215. LONG operator++(int)
  216. {
  217. return InterlockedIncrement(&_cRefs) - 1;
  218. }
  219. LONG operator--(int)
  220. {
  221. return InterlockedDecrement(&_cRefs) + 1;
  222. }
  223. // LONG cast operator
  224. operator LONG()
  225. {
  226. return _cRefs;
  227. }
  228. private:
  229. LONG _cRefs;
  230. };
  231. #define DLD_PROTOCOL_NONE 0
  232. #define DLD_PROTOCOL_HTTP 1
  233. #define DLD_PROTOCOL_FTP 2
  234. #define DLD_PROTOCOL_GOPHER 3
  235. #define DLD_PROTOCOL_FILE 4
  236. #define DLD_PROTOCOL_LOCAL 5
  237. #define DLD_PROTOCOL_HTTPS 6
  238. #define DLD_PROTOCOL_STREAM 7
  239. // # of internal Protocols
  240. #define INTERNAL_PROTOCOL_MAX 8
  241. //+---------------------------------------------------------------------------
  242. //
  243. // Class: CEnumFmtEtc ()
  244. //
  245. // Purpose: Class for formatetc enumerator
  246. //
  247. // Interface: Create --
  248. // QueryInterface --
  249. // AddRef --
  250. // Release --
  251. // Next --
  252. // Skip --
  253. // Reset --
  254. // Clone --
  255. // Initialize --
  256. //
  257. // History: 1-19-96 JohannP (Johann Posch) Created
  258. //
  259. // Notes:
  260. //
  261. //----------------------------------------------------------------------------
  262. class CEnumFmtEtc : public IEnumFORMATETC
  263. {
  264. public:
  265. // Create and return a IEnumFormatEtc object.
  266. // Return the object if successful, NULL otherwise.
  267. static CEnumFmtEtc * Create(UINT cfmtetc, FORMATETC* rgfmtetc);
  268. // *** IUnknown methods ***
  269. STDMETHODIMP QueryInterface(REFIID iid, void **ppvObj);
  270. STDMETHODIMP_(ULONG) AddRef(void);
  271. STDMETHODIMP_(ULONG) Release(void);
  272. // *** IEnumFormatEtc methods ***
  273. STDMETHODIMP Next(ULONG celt, FORMATETC * rgelt, ULONG * pceltFetched);
  274. STDMETHODIMP Skip(ULONG celt);
  275. STDMETHODIMP Reset(void);
  276. STDMETHODIMP Clone(IEnumFORMATETC ** ppenum);
  277. private:
  278. CEnumFmtEtc() : _CRefs()
  279. {
  280. _iNext = 0;
  281. _cElements = 0;
  282. _pFmtEtc = NULL;
  283. }
  284. ~CEnumFmtEtc()
  285. {
  286. if (_pFmtEtc)
  287. {
  288. delete _pFmtEtc;
  289. }
  290. }
  291. BOOL Initialize(UINT cfmtetc, FORMATETC* rgfmtetc, UINT iPos);
  292. private:
  293. CRefCount _CRefs; // refcount
  294. UINT _iNext; // zero-based item that will next be enumerated
  295. UINT _cElements;
  296. FORMATETC *_pFmtEtc; // has at least one item
  297. };
  298. class CMediaType;
  299. class CMediaTypeHolder;
  300. class CMediaTypeNode;
  301. typedef enum _tagDATAFORMAT
  302. {
  303. DATAFORMAT_UNKNOWN = 0
  304. ,DATAFORMAT_AMBIGUOUS
  305. ,DATAFORMAT_KNOWN
  306. ,DATAFORMAT_TEXT
  307. ,DATAFORMAT_BINARY
  308. ,DATAFORMAT_TEXTORBINARY
  309. } DATAFORMAT;
  310. #define MI_GOTCLSID 0x00000010
  311. #define MI_GOTMIMEFLAGS 0x00000020
  312. #define MI_GOTCLSINFO 0x00000040
  313. #define MI_CLASSLOOKUP 0x00000100
  314. typedef struct _tagMediaInfo
  315. {
  316. LPSTR _pszType;
  317. CLIPFORMAT _cfFormat;
  318. DWORD _dwDataFormat;
  319. CLSID _clsID;
  320. DWORD _dwInitFlags;
  321. DWORD _dwMimeFlags;
  322. DWORD _dwClsCtx;
  323. } MediaInfo;
  324. class CMediaType : public MediaInfo
  325. {
  326. public:
  327. CMediaType()
  328. {
  329. _pszType = 0;
  330. _cfFormat = 0;
  331. _clsID = CLSID_NULL;
  332. _dwDataFormat = 0;
  333. }
  334. void Initialize(LPSTR szType, CLIPFORMAT cfFormat);
  335. void Initialize(CLIPFORMAT cfFormat, CLSID *pClsID);
  336. LPSTR GetTypeString(void)
  337. {
  338. return _pszType;
  339. }
  340. CLIPFORMAT GetClipFormat(void)
  341. {
  342. return _cfFormat;
  343. }
  344. void SetClipFormat(CLIPFORMAT cf)
  345. {
  346. _cfFormat = cf;
  347. }
  348. DWORD GetDataFormat()
  349. {
  350. return _dwDataFormat;
  351. }
  352. void SetClsID(CLSID *pClsID)
  353. {
  354. _clsID = *pClsID;
  355. _dwInitFlags |= (MI_GOTCLSID | MI_CLASSLOOKUP);
  356. }
  357. HRESULT GetClsID(CLSID *pClsID)
  358. {
  359. if (_dwInitFlags & MI_GOTCLSID)
  360. {
  361. UrlMkAssert((_clsID != CLSID_NULL));
  362. *pClsID = _clsID;
  363. }
  364. return (_dwInitFlags & MI_GOTCLSID) ? S_OK : E_FAIL;
  365. }
  366. void SetMimeInfo(CLSID &rClsID, DWORD dwMimeFlags)
  367. {
  368. _clsID = rClsID;
  369. _dwMimeFlags = dwMimeFlags;
  370. _dwInitFlags |= (MI_GOTCLSID | MI_GOTMIMEFLAGS | MI_CLASSLOOKUP);
  371. }
  372. void SetClsCtx(DWORD dwClsCtx)
  373. {
  374. _dwClsCtx = dwClsCtx;
  375. _dwInitFlags |= MI_GOTCLSINFO;
  376. }
  377. HRESULT GetClsCtx(DWORD *pdwClsCtx)
  378. {
  379. if (_dwInitFlags & MI_GOTCLSINFO)
  380. {
  381. UrlMkAssert((_clsID != CLSID_NULL));
  382. *pdwClsCtx = _dwClsCtx;
  383. }
  384. return (_dwInitFlags & MI_GOTCLSINFO) ? S_OK : E_FAIL;
  385. }
  386. BOOL IsLookupDone()
  387. {
  388. return (_dwInitFlags & MI_CLASSLOOKUP);
  389. }
  390. void SetLookupDone(BOOL fSet = TRUE)
  391. {
  392. if (fSet)
  393. {
  394. _dwInitFlags |= MI_CLASSLOOKUP;
  395. }
  396. else
  397. {
  398. _dwInitFlags &= ~MI_CLASSLOOKUP;
  399. }
  400. }
  401. private:
  402. // LPSTR _pszType;
  403. // CLIPFORMAT _cfFormat;
  404. // CLSID _clsID;
  405. // DWORD _dwDataFormat;
  406. };
  407. class CMediaTypeHolder : public IMediaHolder
  408. {
  409. public:
  410. CMediaTypeHolder();
  411. ~CMediaTypeHolder();
  412. // unknown methods
  413. STDMETHOD(QueryInterface) ( REFIID riid, LPVOID FAR* ppvObj);
  414. STDMETHOD_(ULONG,AddRef) (void);
  415. STDMETHOD_(ULONG,Release) (void);
  416. // mediahoder methods
  417. STDMETHOD(RegisterClassMapping)(
  418. DWORD ctypes,
  419. LPCSTR rgszNames[],
  420. CLSID rgClsIDs[],
  421. DWORD dwReserved);
  422. STDMETHOD(FindClassMapping)(
  423. LPCSTR szMime,
  424. CLSID *pClassID,
  425. DWORD dwReserved);
  426. HRESULT RegisterW(UINT ctypes, const LPCWSTR* rgszTypes, CLIPFORMAT* rgcfTypes);
  427. HRESULT Register(UINT ctypes, const LPCSTR* rgszTypes, CLIPFORMAT* rgcfTypes);
  428. HRESULT RegisterMediaInfo(UINT ctypes, MediaInfo *pMediaInfo, BOOL fFree);
  429. HRESULT RegisterClass(UINT ctypes, const LPCSTR* rgszTypes, CLSID *rgclsID);
  430. HRESULT FindCMediaType(LPCSTR pszMimeStr, CMediaType **ppCMType);
  431. HRESULT FindCMediaType(CLIPFORMAT cfFormat, CMediaType **ppCMType);
  432. private: // methods
  433. private: // data
  434. CRefCount _CRefs; // refcount class
  435. CMediaTypeNode *_pCMTNode;
  436. };
  437. class CMediaTypeNode
  438. {
  439. public:
  440. CMediaTypeNode(CMediaType *pCMType, LPSTR pszTextBuffer, UINT cElements,
  441. CMediaTypeNode *pNext, BOOL fFree = TRUE)
  442. {
  443. _pCMType = pCMType;
  444. _pszTextBuffer = pszTextBuffer;
  445. _cElements = cElements;
  446. _pNext = pNext;
  447. _fFree = fFree;
  448. }
  449. ~CMediaTypeNode()
  450. {
  451. if (_pszTextBuffer)
  452. {
  453. delete _pszTextBuffer;
  454. }
  455. if (_fFree)
  456. {
  457. delete _pCMType;
  458. }
  459. }
  460. CMediaType *GetMediaTypeArray(void)
  461. {
  462. return _pCMType;
  463. }
  464. LPSTR GetTextBuffer(void)
  465. {
  466. return _pszTextBuffer;
  467. }
  468. UINT GetElementCount(void)
  469. {
  470. return _cElements;
  471. }
  472. CMediaTypeNode *GetNextNode()
  473. {
  474. return _pNext;
  475. }
  476. void SetNextNode(CMediaTypeNode *pNode)
  477. {
  478. _pNext = pNode;
  479. }
  480. private: // data
  481. CMediaType *_pCMType;
  482. LPSTR _pszTextBuffer;
  483. UINT _cElements;
  484. BOOL _fFree;
  485. CMediaTypeNode *_pNext;
  486. };
  487. CMediaTypeHolder *GetMediaTypeHolder();
  488. extern CMediaTypeHolder *g_pCMHolder;
  489. extern CMutexSem g_mxsMedia; // single access to media holder
  490. HRESULT FindMediaString(CLIPFORMAT cfFormat, LPSTR *ppStr);
  491. HRESULT FindMediaType(LPSTR pszType, CLIPFORMAT *cfType);
  492. HRESULT RegisterDefaultMediaType();
  493. inline HRESULT InternalRegisterDefaultMediaType();
  494. LPSTR FindFileExtension(LPSTR pszFileName);
  495. HRESULT GetMimeFromExt(LPSTR pszExt, LPSTR pszMime, DWORD *pcbMime);
  496. HRESULT GetMimeInfo(LPSTR pszMime, CLSID *pclsid, DWORD dwFlags, DWORD *pdwMimeFlags);
  497. //
  498. // MIME FLAGS
  499. //
  500. #define MIMEFLAGS_IGNOREMIME_CLASSID 0x00000001
  501. //HRESULT FindMediaTypeClsID(LPCSTR pszType, LPCLSID pclsid, DWORD dwFlags);
  502. HRESULT FindMediaTypeClassInfo(LPCSTR pszType, LPCSTR pszFileName, LPCLSID pclsid, DWORD *pdwClsCtx, DWORD dwFlags);
  503. HRESULT GetClsIDInfo(CLSID *pclsid, DWORD ClsCtxIn, DWORD *pClsCtx);
  504. // helper routines
  505. LPSTR StringAFromCLSID(CLSID *pclsid);
  506. HRESULT CLSIDFromStringA(LPSTR pszClsid, CLSID *pclsid);
  507. #define GUIDSTR_MAX (1+ 8 + 1 + 4 + 1 + 4 + 1 + 4 + 1 + 12 + 1 + 1)
  508. #define CLSIDSTR_MAX (GUIDSTR_MAX)
  509. class CLifePtr
  510. {
  511. public:
  512. CLifePtr() : _CRefs()
  513. {
  514. }
  515. virtual ~CLifePtr()
  516. {
  517. }
  518. STDMETHODIMP_(ULONG) AddRef(void)
  519. {
  520. #ifdef _EAPP_HXX_
  521. EProtAssert((_CRefs));
  522. #else
  523. TransAssert((_CRefs));
  524. #endif
  525. LONG lRet = ++_CRefs;
  526. #ifdef _EAPP_HXX_
  527. EProtDebugOut((DEB_SESSION, "%p IN/OUT CLifePtr::AddRef (cRefs:%ld)\n", this,lRet));
  528. #else
  529. TransDebugOut((DEB_SESSION, "%p IN/OUT CLifePtr::AddRef (cRefs:%ld)\n", this,lRet));
  530. #endif
  531. return lRet;
  532. }
  533. STDMETHODIMP_(ULONG) Release(void)
  534. {
  535. #ifdef _EAPP_HXX_
  536. EProtAssert((_CRefs));
  537. #else
  538. TransAssert((_CRefs));
  539. #endif
  540. LONG lRet = --_CRefs;
  541. if (_CRefs == 0)
  542. {
  543. delete this;
  544. }
  545. #ifdef _EAPP_HXX_
  546. EProtDebugOut((DEB_SESSION, "%p IN/OUT CLifePtr::Release (cRefs:%ld)\n",this,lRet));
  547. #else
  548. TransDebugOut((DEB_SESSION, "%p IN/OUT CLifePtr::Release (cRefs:%ld)\n",this,lRet));
  549. #endif
  550. return lRet;
  551. }
  552. private:
  553. CRefCount _CRefs; // the total refcount of this object
  554. };
  555. #endif //_URLMON_HXX_