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.
 
 
 
 
 
 

399 lines
9.7 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: urlmon.hxx
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 12-22-95 JohannP (Johann Posch) Created
//
//----------------------------------------------------------------------------
#ifndef _URLMON_HXX_
#define _URLMON_HXX_
#include <urlint.h>
#include <wininet.h>
#include <sem.hxx>
#include <debug.h>
#define SZPROTOCOLROOT "PROTOCOLS\\Handler\\"
#define SZCLASS "CLSID"
#define SZALL "*"
#define SZNAMESPACEROOT "PROTOCOLS\\Name-Space Handler\\"
#define SZHANDLER "HANDLER"
#define ULPROTOCOLLEN 32
//extern char szMimeKey[] = "MIME\\Database\\Content Type\\";
//const ULONG ulMimeKeyLen = ((sizeof(szMimeKey)/sizeof(char))-1);
#define SZMIMEKEY "MIME\\Database\\Content Type\\"
#define ULMIMEKEYLEN 32
// move this to public header file
#define S_NEEDMOREDATA ((HRESULT)0x00000002L)
#define BSCF_ASYNCDATANOTIFICATION 0x00010000
#define BSCF_DATAFULLYAVAILABLE 0x00020000
#define BINDF_NEEDFILE ((BINDF) 0x00000040)
#define BINDSTATUS_ERROR ((BINDSTATUS)0xf0000000)
#define BINDSTATUS_INTERNAL ((BINDSTATUS)0xf1000000)
#define BINDSTATUS_INTERNALASYNC ((BINDSTATUS)0xf2000000)
// BUGBUG: find maximum mime size
#define SZMIMESIZE_MAX 128
// download buffer per request, can this
#define DNLD_BUFFER_SIZE 8192
#define SNIFFDATA_SIZE 2048
#define MAX_URL_SIZE INTERNET_MAX_URL_LENGTH
#define CU_NO_CANONICALIZE 0x00000000
#define CU_CANONICALIZE 0x00000001
STDAPI ConstructURL(LPBC pBC, LPMONIKER pmkContext, LPMONIKER pmkToLeft,
LPWSTR pwzURLRelative, LPWSTR pwzURLFull, DWORD cURLSize,
DWORD dwFlags);
// global variable
extern HINTERNET g_hSession;
LPCSTR GetUserAgentString();
//+---------------------------------------------------------------------------
//
// Class: CRefCount ()
//
// Purpose: Safe class for refcounting
//
// Interface: CRefCount()
// CRefCount(LONG lValue)
// LONG operator++() prefix
// LONG operator--() prefix
// LONG operator++(int) postfix
// LONG operator--(int) postfix
// LONG operator++(int) cast operator
//
// History: 1-19-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
class CRefCount
{
public:
CRefCount()
{
_cRefs = 1;
}
CRefCount(LONG lVal)
{
_cRefs = lVal;
}
// prefix operators
LONG operator++()
{
InterlockedIncrement(&_cRefs);
return _cRefs;
}
LONG operator--()
{
InterlockedDecrement(&_cRefs);
return _cRefs;
}
// postfix operators
LONG operator++(int)
{
return InterlockedIncrement(&_cRefs);
}
LONG operator--(int)
{
return InterlockedDecrement(&_cRefs);
}
// LONG cast operator
operator LONG()
{
return _cRefs;
}
private:
LONG _cRefs;
};
#define DLD_PROTOCOL_NONE 0
#define DLD_PROTOCOL_HTTP 1
#define DLD_PROTOCOL_FTP 2
#define DLD_PROTOCOL_GOPHER 3
#define DLD_PROTOCOL_FILE 4
#define DLD_PROTOCOL_LOCAL 5
#define DLD_PROTOCOL_HTTPS 6
#define DLD_PROTOCOL_STREAM 7
// # of internal Protocols
#define INTERNAL_PROTOCOL_MAX 8
//+---------------------------------------------------------------------------
//
// Class: CEnumFmtEtc ()
//
// Purpose: Class for formatetc enumerator
//
// Interface: Create --
// QueryInterface --
// AddRef --
// Release --
// Next --
// Skip --
// Reset --
// Clone --
// Initialize --
//
// History: 1-19-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
class CEnumFmtEtc : public IEnumFORMATETC
{
public:
// Create and return a IEnumFormatEtc object.
// Return the object if successful, NULL otherwise.
static CEnumFmtEtc * Create(UINT cfmtetc, FORMATETC* rgfmtetc);
// *** IUnknown methods ***
STDMETHODIMP QueryInterface(REFIID iid, void **ppvObj);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
// *** IEnumFormatEtc methods ***
STDMETHODIMP Next(ULONG celt, FORMATETC * rgelt, ULONG * pceltFetched);
STDMETHODIMP Skip(ULONG celt);
STDMETHODIMP Reset(void);
STDMETHODIMP Clone(IEnumFORMATETC ** ppenum);
private:
CEnumFmtEtc() : _CRefs()
{
_iNext = 0;
_cElements = 0;
_pFmtEtc = NULL;
}
~CEnumFmtEtc()
{
if (_pFmtEtc)
{
delete _pFmtEtc;
}
}
BOOL Initialize(UINT cfmtetc, FORMATETC* rgfmtetc, UINT iPos);
private:
CRefCount _CRefs; // refcount
UINT _iNext; // zero-based item that will next be enumerated
UINT _cElements;
FORMATETC *_pFmtEtc; // has at least one item
};
class CMediaType;
class CMediaTypeHolder;
class CMediaTypeNode;
typedef enum _tagDATAFORMAT
{
DATAFORMAT_UNKNOWN = 0
,DATAFORMAT_AMBIGUOUS
,DATAFORMAT_KNOWN
,DATAFORMAT_TEXT
,DATAFORMAT_BINARY
,DATAFORMAT_TEXTORBINARY
} DATAFORMAT;
typedef struct _tagMediaInfo
{
LPSTR _pszType;
CLIPFORMAT _cfFormat;
DWORD _dwDataFormat;
CLSID _clsID;
} MediaInfo;
class CMediaType : public MediaInfo
{
public:
CMediaType()
{
_pszType = 0;
_cfFormat = 0;
_clsID = CLSID_NULL;
_dwDataFormat = 0;
}
void Initialize(LPSTR szType, CLIPFORMAT cfFormat);
void Initialize(CLIPFORMAT cfFormat, CLSID *pClsID);
LPSTR GetTypeString(void)
{
return _pszType;
}
CLIPFORMAT GetClipFormat(void)
{
return _cfFormat;
}
void SetClipFormat(CLIPFORMAT cf)
{
_cfFormat = cf;
}
DWORD GetDataFormat()
{
return _dwDataFormat;
}
void SetClsID(CLSID *pClsID)
{
_clsID = *pClsID;
}
void GetClsID(CLSID *pClsID)
{
*pClsID = _clsID;
}
private:
// LPSTR _pszType;
// CLIPFORMAT _cfFormat;
// CLSID _clsID;
// DWORD _dwDataFormat;
};
class CMediaTypeHolder : public IMediaHolder
{
public:
CMediaTypeHolder();
~CMediaTypeHolder();
// unknown methods
STDMETHOD(QueryInterface) ( REFIID riid, LPVOID FAR* ppvObj);
STDMETHOD_(ULONG,AddRef) (void);
STDMETHOD_(ULONG,Release) (void);
// mediahoder methods
STDMETHOD(RegisterClassMapping)(
DWORD ctypes,
LPCSTR rgszNames[],
CLSID rgClsIDs[],
DWORD dwReserved);
STDMETHOD(FindClassMapping)(
LPCSTR szMime,
CLSID *pClassID,
DWORD dwReserved);
HRESULT RegisterW(UINT ctypes, const LPCWSTR* rgszTypes, CLIPFORMAT* rgcfTypes);
HRESULT Register(UINT ctypes, const LPCSTR* rgszTypes, CLIPFORMAT* rgcfTypes);
HRESULT RegisterMediaInfo(UINT ctypes, MediaInfo *pMediaInfo, BOOL fFree);
HRESULT RegisterClass(UINT ctypes, const LPCSTR* rgszTypes, CLSID *rgclsID);
HRESULT FindCMediaType(LPCSTR pszMimeStr, CMediaType **ppCMType);
HRESULT FindCMediaType(CLIPFORMAT cfFormat, CMediaType **ppCMType);
private: // methods
private: // data
CRefCount _CRefs; // refcount class
CMediaTypeNode *_pCMTNode;
};
class CMediaTypeNode
{
public:
CMediaTypeNode(CMediaType *pCMType, LPSTR pszTextBuffer, UINT cElements,
CMediaTypeNode *pNext, BOOL fFree = TRUE)
{
_pCMType = pCMType;
_pszTextBuffer = pszTextBuffer;
_cElements = cElements;
_pNext = pNext;
_fFree = fFree;
}
~CMediaTypeNode()
{
if (_pszTextBuffer)
{
delete _pszTextBuffer;
}
if (_fFree)
{
delete _pCMType;
}
}
CMediaType *GetMediaTypeArray(void)
{
return _pCMType;
}
LPSTR GetTextBuffer(void)
{
return _pszTextBuffer;
}
UINT GetElementCount(void)
{
return _cElements;
}
CMediaTypeNode *GetNextNode()
{
return _pNext;
}
void SetNextNode(CMediaTypeNode *pNode)
{
_pNext = pNode;
}
private: // data
CMediaType *_pCMType;
LPSTR _pszTextBuffer;
UINT _cElements;
BOOL _fFree;
CMediaTypeNode *_pNext;
};
CMediaTypeHolder *GetMediaTypeHolder();
extern CMediaTypeHolder *g_pCMHolder;
extern CMutexSem g_mxsMedia; // single access to media holder
HRESULT FindMediaString(CLIPFORMAT cfFormat, LPSTR *ppStr);
HRESULT FindMediaType(LPSTR pszType, CLIPFORMAT *cfType);
HRESULT RegisterDefaultMediaType();
inline HRESULT InternalRegisterDefaultMediaType();
LPSTR FindFileExtension(LPSTR pszFileName);
HRESULT GetMimeFromExt(LPSTR pszExt, LPSTR pszMime, DWORD *pcbMime);
// helper routines
LPSTR StringAFromCLSID(CLSID *pclsid);
HRESULT CLSIDFromStringA(LPSTR pszClsid, CLSID *pclsid);
#define GUIDSTR_MAX (1+ 8 + 1 + 4 + 1 + 4 + 1 + 4 + 1 + 12 + 1 + 1)
#define CLSIDSTR_MAX (GUIDSTR_MAX)
#endif //_URLMON_HXX_