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
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_
|
|
|