//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1995. // // File: media.cxx // // Contents: // // Classes: // // Functions: // // History: 1-20-96 JohannP (Johann Posch) Created // //---------------------------------------------------------------------------- #include PerfDbgTag(tagMedia, "Urlmon", "Log Media methods", DEB_FORMAT); PerfDbgTag(tagMediaApi, "Urlmon", "Log Media API", DEB_ASYNCAPIS); #if 1 CHAR vszTextPlain[] = "text/plain"; CHAR vszTextRichText[] = "text/richtext"; CHAR vszImageXBitmap[] = "image/x-xbitmap"; CHAR vszApplicationPostscript[] = "application/postscript"; CHAR vszApplicationBase64[] = "application/base64"; CHAR vszApplicationMacBinhex[] = "application/macbinhex40"; CHAR vszApplicationPdf[] = "application/pdf"; CHAR vszAudioAiff[] = "audio/x-aiff"; CHAR vszAudioBasic[] = "audio/basic"; CHAR vszAudioWav[] = "audio/wav"; CHAR vszImageGif[] = "image/gif"; CHAR vszImagePJpeg[] = "image/pjpeg"; CHAR vszImageJpeg[] = "image/jpeg"; CHAR vszImageTiff[] = "image/tiff"; CHAR vszImagePng[] = "image/x-png"; CHAR vszImagePng2[] = "image/png"; CHAR vszImageBmp[] = "image/bmp"; CHAR vszImageJG[] = "image/x-jg"; CHAR vszImageArt[] = "image/x-art"; CHAR vszImageEmf[] = "image/x-emf"; CHAR vszImageWmf[] = "image/x-wmf"; CHAR vszVideoAvi[] = "video/avi"; CHAR vszVideoMS[] = "video/x-msvideo"; CHAR vszVideoMpeg[] = "video/mpeg"; CHAR vszApplicationCompressed[] = "application/x-compressed"; CHAR vszApplicationZipCompressed[] = "application/x-zip-compressed"; CHAR vszApplicationGzipCompressed[] = "application/x-gzip-compressed"; CHAR vszApplicationMSDownload[] = "application/x-msdownload"; CHAR vszApplicationJava[] = "application/java"; CHAR vszApplicationOctetStream[] = "application/octet-stream"; CHAR vszTextHTML[] = "text/html"; CHAR vszApplicationCDF[] = "application/x-cdf"; CHAR vszApplicationCommonDataFormat[] = "application/x-netcdf"; CHAR vszTextScriptlet[] = "text/scriptlet"; #endif const GUID IID_IMediaHolder = {0x79eac9ce, 0xbaf9, 0x11ce, {0x8c, 0x82, 0x00, 0xaa, 0x00, 0x4b, 0xa9, 0x0b}}; #define XCLSID_MsHtml {0x25336920, 0x03F9, 0x11cf, {0x8F, 0xD0, 0x00, 0xAA, 0x00, 0x68, 0x6F, 0x13}} #define XCLSID_CDFVIEW {0xf39a0dc0, 0x9cc8, 0x11d0, {0xa5, 0x99, 0x0, 0xc0, 0x4f, 0xd6, 0x44, 0x33}} BOOL g_fDefaultMediaRegistered = FALSE; static MediaInfo rgMediaInfo[] = { { vszTextHTML , 0, DATAFORMAT_TEXTORBINARY, XCLSID_MsHtml, 0x00000070 ,0 ,CLSCTX_INPROC } ,{ vszTextPlain , 0, DATAFORMAT_AMBIGUOUS, {0} ,0 ,0 ,0 } ,{ vszTextRichText , 0, DATAFORMAT_TEXT, {0} ,0 ,0 ,0 } ,{ vszImageXBitmap , 0, DATAFORMAT_TEXT, {0} ,0 ,0 ,0 } ,{ vszApplicationPostscript , 0, DATAFORMAT_TEXT, {0} ,0 ,0 ,0 } ,{ vszApplicationBase64 , 0, DATAFORMAT_TEXT, {0} ,0 ,0 ,0 } ,{ vszApplicationMacBinhex , 0, DATAFORMAT_TEXT, {0} ,0 ,0 ,0 } ,{ vszApplicationPdf , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszAudioAiff , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszAudioBasic , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszAudioWav , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszImageGif , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszImagePJpeg , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszImageJpeg , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszImageTiff , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszImagePng , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszImagePng2 , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszImageBmp , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszImageJG , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszImageArt , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszImageEmf , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszImageWmf , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszVideoAvi , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszVideoMS , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszVideoMpeg , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszApplicationCompressed , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszApplicationZipCompressed , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszApplicationGzipCompressed , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszApplicationJava , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszApplicationMSDownload , 0, DATAFORMAT_BINARY, {0} ,0 ,0 ,0 } ,{ vszApplicationOctetStream , 0, DATAFORMAT_AMBIGUOUS, {0} ,0 ,0 ,0 } ,{ vszApplicationCDF , 0, DATAFORMAT_TEXT, XCLSID_CDFVIEW ,(MI_GOTCLSID | MI_CLASSLOOKUP) ,0 ,CLSCTX_INPROC } ,{ vszApplicationCommonDataFormat , 0, DATAFORMAT_AMBIGUOUS, {0} ,0 ,0 ,0 } ,{ vszTextScriptlet , 0, DATAFORMAT_TEXT, {0} ,0 ,0 ,0 } }; CMediaTypeHolder *g_pCMHolder = NULL; //+--------------------------------------------------------------------------- // // Function: GetMediaTypeHolder // // Synopsis: Retrieves the media type holder for this apartment // // Arguments: (none) // // Returns: // // History: 1-20-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- CMediaTypeHolder *GetMediaTypeHolder() { PerfDbgLog(tagMediaApi, NULL, "+GetMediaTypeHolder"); #ifdef PER_THREAD CUrlMkTls tls; CMediaTypeHolder *pCMHolder; if ((pCMHolder = tls->pCMediaHolder) == NULL) { tls->pCMediaHolder = pCMHolder = new CMediaTypeHolder(); } #else CLock lck(g_mxsMedia); if (g_pCMHolder == NULL) { g_pCMHolder = new CMediaTypeHolder(); } #endif //PER_THREAD PerfDbgLog1(tagMediaApi, NULL, "-GetMediaTypeHolder (pCMHolder:%lx)", g_pCMHolder); return g_pCMHolder; } void CMediaType::Initialize(LPSTR szType, CLIPFORMAT cfFormat) { _pszType = szType; _cfFormat = cfFormat; } void CMediaType::Initialize(CLIPFORMAT cfFormat, CLSID *pClsID) { _pszType = NULL; _cfFormat = cfFormat; _clsID = *pClsID; _dwInitFlags |= MI_GOTCLSID; } CMediaTypeHolder::CMediaTypeHolder() : _CRefs() { _pCMTNode = NULL; } CMediaTypeHolder::~CMediaTypeHolder() { CMediaTypeNode *pCMTNode, *pNext; pCMTNode = _pCMTNode; // Delete everything that was allocated by Register. while (pCMTNode) { pNext = pCMTNode->GetNextNode(); delete pCMTNode; pCMTNode = pNext; } _pCMTNode = NULL; } //+--------------------------------------------------------------------------- // // Method: CMediaTypeHolder::RegisterW // // Synopsis: // // Arguments: [ctypes] -- // [rgszTypes] -- // [rgcfTypes] -- // // Returns: // // History: 3-22-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- HRESULT CMediaTypeHolder::RegisterW(UINT ctypes, const LPCWSTR* rgszTypes, CLIPFORMAT* rgcfTypes) { PerfDbgLog(tagMedia, this, "+CMediaTypeHolder::Register"); HRESULT hr = NOERROR; UINT i; if (ctypes) { ULONG ulSize; LPCWSTR pwzStr; LPSTR pszStr; LPSTR pszHelp; LPSTR pszTextBuffer; CMediaType *pCMType; CMediaTypeNode *pCMTNode; // Calculate size of single buffer needed to hold all strings. for (ulSize = i = 0; i < ctypes; i++) { pwzStr = *(rgszTypes + i); ulSize += wcslen(pwzStr) + 1; //PerfDbgLog2(tagMedia, this, "CMTHolder::Register(sz:%ws; len:%ld)", pszStr, ulSize)); } pszTextBuffer = pszStr = new CHAR[ulSize]; if (!pszTextBuffer) { hr = E_OUTOFMEMORY; goto RegisterExit; } pCMType = new CMediaType[ctypes]; if (!pCMType) { delete pszTextBuffer; hr = E_OUTOFMEMORY; goto RegisterExit; } pCMTNode = new CMediaTypeNode(pCMType, pszTextBuffer, ctypes, _pCMTNode); if (!pCMTNode) { delete pCMType; delete pszTextBuffer; hr = E_OUTOFMEMORY; goto RegisterExit; } pszHelp = pszStr; for (i = 0; i < ctypes; i++) { pwzStr = *(rgszTypes + i); //wcscpy(pszHelp, pszStr); W2A(pwzStr, pszHelp, wcslen(pwzStr) + 1); (pCMType + i)->Initialize(pszHelp, *(rgcfTypes + i)); pszHelp += strlen(pszHelp) + 1; } // New node is first on list. _pCMTNode = pCMTNode; } RegisterExit: PerfDbgLog1(tagMedia, this, "-CMediaTypeHolder::Register (hr:%lx)", hr); return hr; } //+--------------------------------------------------------------------------- // // Method: CMediaTypeHolder::Register // // Synopsis: // // Arguments: [ctypes] -- // [rgszTypes] -- // [rgcfTypes] -- // // Returns: // // History: 3-22-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- HRESULT CMediaTypeHolder::Register(UINT ctypes, const LPCSTR* rgszTypes, CLIPFORMAT* rgcfTypes) { PerfDbgLog(tagMedia, this, "+CMediaTypeHolder::Register"); HRESULT hr = NOERROR; UINT i; if (ctypes) { ULONG ulSize; LPCSTR pszStr; LPSTR pszNewStr; LPSTR pszHelp; LPSTR pszTextBuffer; CMediaType *pCMType; CMediaTypeNode *pCMTNode; // Calculate size of single buffer needed to hold all strings. for (ulSize = i = 0; i < ctypes; i++) { pszStr = *(rgszTypes + i); ulSize += strlen(pszStr) + 1; //PerfDbgLog2(tagMedia, this, "CMTHolder::Register(sz:%s; len:%ld)", pszStr, ulSize)); } pszTextBuffer = pszNewStr = new CHAR[ulSize]; if (!pszTextBuffer) { hr = E_OUTOFMEMORY; goto RegisterExit; } pCMType = new CMediaType[ctypes]; if (!pCMType) { delete pszTextBuffer; hr = E_OUTOFMEMORY; goto RegisterExit; } pCMTNode = new CMediaTypeNode(pCMType, pszTextBuffer, ctypes, _pCMTNode); if (!pCMTNode) { delete pCMType; delete pszTextBuffer; hr = E_OUTOFMEMORY; goto RegisterExit; } pszHelp = pszNewStr; for (i = 0; i < ctypes; i++) { pszStr = *(rgszTypes + i); StrNCpy(pszHelp, pszStr, strlen(pszStr) + 1); *(rgcfTypes + i) = (CLIPFORMAT) RegisterClipboardFormat(pszStr); (pCMType + i)->Initialize(pszHelp, *(rgcfTypes + i)); pszHelp += strlen(pszHelp) + 1; } // New node is first on list. if (!_pCMTNode) { _pCMTNode = pCMTNode; } else { CMediaTypeNode *pCMTNext = _pCMTNode->GetNextNode(); _pCMTNode->SetNextNode(pCMTNode); pCMTNode->SetNextNode(pCMTNext); } } RegisterExit: PerfDbgLog1(tagMedia, this, "-CMediaTypeHolder::Register (hr:%lx)", hr); return hr; } //+--------------------------------------------------------------------------- // // Method: CMediaTypeHolder::Register // // Synopsis: // // Arguments: [ctypes] -- // [rgszTypes] -- // [rgcfTypes] -- // // Returns: // // History: 3-22-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- HRESULT CMediaTypeHolder::RegisterMediaInfo(UINT ctypes, MediaInfo *pMediaInfo, BOOL fFree) { PerfDbgLog(tagMedia, this, "+CMediaTypeHolder::RegisterMediaInfo"); HRESULT hr = NOERROR; UINT i; if (ctypes) { CMediaType *pCMType; CMediaTypeNode *pCMTNode; // Calculate size of single buffer needed to hold all strings. pCMType = (CMediaType *)pMediaInfo; if (!pCMType) { goto RegisterExit; } pCMTNode = new CMediaTypeNode(pCMType, NULL, ctypes, _pCMTNode, FALSE); if (!pCMTNode) { hr = E_OUTOFMEMORY; goto RegisterExit; } for (i = 0; i < ctypes; i++) { CMediaType *pCMT = (pCMType + i); CLIPFORMAT cf = (CLIPFORMAT) RegisterClipboardFormat(pCMT->GetTypeString()); pCMT->SetClipFormat(cf); } // New node is first on list. _pCMTNode = pCMTNode; } RegisterExit: PerfDbgLog1(tagMedia, this, "-CMediaTypeHolder::RegisterMediaInfo (hr:%lx)", hr); return hr; } //+--------------------------------------------------------------------------- // // Method: CMediaTypeHolder::FindCMediaType // // Synopsis: // // Arguments: [pszMimeStr] -- // [ppCMType] -- // // Returns: // // History: 3-26-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- HRESULT CMediaTypeHolder::FindCMediaType(CLIPFORMAT cfFormat, CMediaType **ppCMType) { PerfDbgLog(tagMedia, this, "+CMediaTypeHolder::FindCMediaType"); HRESULT hr = E_INVALIDARG; CMediaTypeNode *pCMTNode; CMediaType *pCMType; UINT i; UrlMkAssert((ppCMType)); *ppCMType = NULL; pCMTNode = _pCMTNode; if (!pCMTNode) { hr = E_FAIL; } else while (pCMTNode) { pCMType = pCMTNode->GetMediaTypeArray(); for (i = 0; i < pCMTNode->GetElementCount(); i++) { if (cfFormat == (pCMType + i)->GetClipFormat()) { *ppCMType = pCMType + i; hr = NOERROR; break; } } if (*ppCMType) { break; } pCMTNode = pCMTNode->GetNextNode(); } PerfDbgLog1(tagMedia, this, "-CMediaTypeHolder::FindCMediaType (hr:%lx)", hr); return hr; } //+--------------------------------------------------------------------------- // // Method: CMediaTypeHolder::FindCMediaType // // Synopsis: // // Arguments: [pszMimeStr] -- // [ppCMType] -- // // Returns: // // History: 3-28-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- HRESULT CMediaTypeHolder::FindCMediaType(LPCSTR pszMimeStr, CMediaType **ppCMType) { PerfDbgLog(tagMedia, this, "+CMediaTypeHolder::FindCMediaType"); HRESULT hr = E_INVALIDARG; CMediaTypeNode *pCMTNode; CMediaType *pCMType; UINT i; *ppCMType = NULL; pCMTNode = _pCMTNode; if (!pCMTNode) { hr = E_FAIL; } else while (pCMTNode) { pCMType = pCMTNode->GetMediaTypeArray(); for (i = 0; i < pCMTNode->GetElementCount(); i++) { if (!stricmp(pszMimeStr, (pCMType + i)->GetTypeString())) { *ppCMType = pCMType + i; hr = NOERROR; break; } } if (*ppCMType) { break; } pCMTNode = pCMTNode->GetNextNode(); } PerfDbgLog1(tagMedia, this, "-CMediaTypeHolder::FindCMediaType (hr:%lx)", hr); return hr; } //+--------------------------------------------------------------------------- // // Method: CMediaTypeHolder::QueryInterface // // Synopsis: // // Arguments: [riid] -- // [ppv] -- // // Returns: // // History: 11-11-95 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP CMediaTypeHolder::QueryInterface( REFIID riid, void **ppv ) { HRESULT hr = NOERROR; PerfDbgLog2(tagMedia, this, "+CMediaTypeHolder::QueryInterface (%lx, %lx)", riid, ppv); if ( IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IMediaHolder)) { *ppv = (void FAR *)this; AddRef(); } else { *ppv = NULL; hr = E_NOINTERFACE; } PerfDbgLog2(tagMedia, this, "-CMediaTypeHolder::QueryInterface (%lx)[%lx]", hr, *ppv); return hr; } //+--------------------------------------------------------------------------- // // Method: CMediaTypeHolder::AddRef // // Synopsis: // // Arguments: [void] -- // // Returns: // // History: 11-11-95 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP_(ULONG) CMediaTypeHolder::AddRef( void ) { LONG lRet = _CRefs++; PerfDbgLog1(tagMedia, this, "CMediaTypeHolder::AddRef (%ld)", lRet); return lRet; } //+--------------------------------------------------------------------------- // // Method: CMediaTypeHolder::Release // // Synopsis: // // Arguments: [void] -- // // Returns: // // History: 11-11-95 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP_(ULONG) CMediaTypeHolder::Release( void ) { PerfDbgLog(tagMedia, this, "+CMediaTypeHolder::Release"); LONG lRet = --_CRefs; if (_CRefs == 0) { delete this; } PerfDbgLog1(tagMedia, this, "-CMediaTypeHolder::Release (%ld)", lRet); return lRet; } //+--------------------------------------------------------------------------- // // Method: CMediaTypeHolder::RegisterClassMapping // // Synopsis: registers a class mapping for given mimes strings // // Arguments: [ctypes] -- // [rgszNames] -- // [rgClsIDs] -- // [dwReserved] -- // // Returns: // // History: 8-20-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP CMediaTypeHolder::RegisterClassMapping (DWORD ctypes, LPCSTR rgszNames[], CLSID rgClsIDs[], DWORD dwReserved) { PerfDbgLog(tagMedia, this, "+CMediaTypeHolder::RegisterClassMapping"); HRESULT hr = RegisterClass(ctypes, rgszNames, rgClsIDs ); PerfDbgLog1(tagMedia, this, "-CMediaTypeHolder::RegisterClassMapping (hr:%lX)", hr); return hr; } //+--------------------------------------------------------------------------- // // Method: CMediaTypeHolder::FindClassMapping // // Synopsis: returns the class for a given mime if registered // // Arguments: [szMime] -- // [pClassID] -- // [dwReserved] -- // // Returns: // // History: 8-20-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP CMediaTypeHolder::FindClassMapping(LPCSTR szMime, CLSID *pClassID, DWORD dwReserved) { PerfDbgLog(tagMedia, this, "+CMediaTypeHolder::FindClassMapping"); HRESULT hr = NOERROR; CLIPFORMAT cfTypes = CF_NULL; TransAssert((pClassID)); *pClassID = CLSID_NULL; cfTypes = (CLIPFORMAT) RegisterClipboardFormat(szMime); if (cfTypes != CF_NULL) { CMediaType *pCMType = NULL; hr = FindCMediaType(cfTypes, &pCMType); if (hr == NOERROR) { TransAssert((pCMType)); hr = pCMType->GetClsID(pClassID); } } else { hr = E_INVALIDARG; } PerfDbgLog1(tagMedia, this, "-CMediaTypeHolder::FindClassMapping (hr:%lx)", hr); return hr; } //+--------------------------------------------------------------------------- // // Method: CMediaTypeHolder::RegisterClass // // Synopsis: // // Arguments: [ctypes] -- // [rgszTypes] -- // [rgcfTypes] -- // // Returns: // // History: 3-22-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- HRESULT CMediaTypeHolder::RegisterClass(UINT ctypes, const LPCSTR* rgszTypes, CLSID *rgclsID) { PerfDbgLog(tagMedia, this, "+CMediaTypeHolder::RegisterClass"); HRESULT hr = NOERROR; UINT i; if (ctypes) { ULONG ulSize; CMediaType *pCMType; CMediaTypeNode *pCMTNode; // Calculate size of single buffer needed to hold all strings. pCMType = new CMediaType[ctypes]; if (!pCMType) { hr = E_OUTOFMEMORY; goto RegisterExit; } pCMTNode = new CMediaTypeNode(pCMType, NULL, ctypes, _pCMTNode); if (!pCMTNode) { delete pCMType; hr = E_OUTOFMEMORY; goto RegisterExit; } for (i = 0; i < ctypes; i++) { CLIPFORMAT cfTypes; LPCSTR pszStr = *(rgszTypes + i); cfTypes = (CLIPFORMAT) RegisterClipboardFormat(pszStr); pCMType[i].Initialize(cfTypes,(rgclsID + i)); } // New node is first on list. _pCMTNode = pCMTNode; } RegisterExit: PerfDbgLog1(tagMedia, this, "-CMediaTypeHolder::RegisterClass (hr:%lx)", hr); return hr; } //+--------------------------------------------------------------------------- // // Function: RegisterDefaultMediaType // // Synopsis: // // Arguments: (none) // // Returns: // // History: 3-28-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- HRESULT RegisterDefaultMediaType() { PerfDbgLog(tagMediaApi, NULL, "+RegisterDefaultMediaType"); HRESULT hr = InternalRegisterDefaultMediaType(); PerfDbgLog(tagMediaApi, NULL, "-RegisterDefaultMediaType"); return hr; } //+--------------------------------------------------------------------------- // // Function: InternalRegisterDefaultMediaType // // Synopsis: // // Arguments: (none) // // Returns: // // History: 7-24-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- HRESULT InternalRegisterDefaultMediaType() { HRESULT hr = NOERROR; PerfDbgLog(tagMediaApi, NULL, "+InternalRegisterDefaultMediaType"); static DWORD s_dwfHonorTextPlain = 42; CLock lck(g_mxsMedia); // Provide a registry hook for enabling urlmon to honor // text/plain, rather than defer to the extension. // Previously, this was considered ambiguous due to compat // reasons with older servers sending this for unknown content types. // // TODO: Consider making this the default behavior because // other browsers (e.g. Nav 4.61) are moving in this // direction. if (s_dwfHonorTextPlain == 42) { HKEY hKey; DWORD dwType; DWORD dwSize = sizeof(s_dwfHonorTextPlain); s_dwfHonorTextPlain = 0; if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", 0, KEY_QUERY_VALUE, &hKey)) { if (ERROR_SUCCESS != RegQueryValueEx(hKey, TEXT("IsTextPlainHonored"), NULL, &dwType, (LPBYTE)&s_dwfHonorTextPlain, &dwSize)) s_dwfHonorTextPlain = 0; RegCloseKey(hKey); } // rgMediaInfo is a static global, so we only need to do this once. if (s_dwfHonorTextPlain) { DWORD d = 0; dwSize = sizeof(rgMediaInfo)/sizeof(MediaInfo); for (d = 0; d < dwSize; d++) { if (!lstrcmp(vszTextPlain, rgMediaInfo[d]._pszType)) { rgMediaInfo[d]._dwDataFormat = DATAFORMAT_TEXTORBINARY; // remove the ambiguity break; } } } } if (g_fDefaultMediaRegistered == FALSE) { CMediaTypeHolder *pCMHolder; g_fDefaultMediaRegistered = TRUE; pCMHolder = GetMediaTypeHolder(); if (pCMHolder) { DWORD dwSize =sizeof(rgMediaInfo)/sizeof(MediaInfo); hr = pCMHolder->RegisterMediaInfo(dwSize,rgMediaInfo,FALSE); } else { hr = E_OUTOFMEMORY; } } PerfDbgLog(tagMediaApi, NULL, "-InternalRegisterDefaultMediaType"); return hr; } //+--------------------------------------------------------------------------- // // Function: FindMediaType // // Synopsis: // // Arguments: [pwzType] -- // [cfType] -- // // Returns: // // History: 3-22-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- HRESULT FindMediaType(LPCSTR pszType, CLIPFORMAT *cfType) { HRESULT hr = E_OUTOFMEMORY; PerfDbgLog(tagMediaApi, NULL, "+FindMediaType"); CMediaTypeHolder *pCMHolder; CLock lck(g_mxsMedia); UrlMkAssert((cfType)); InternalRegisterDefaultMediaType(); if ((pszType == NULL) || (cfType == CF_NULL)) { hr = E_INVALIDARG; } else if ((pCMHolder = GetMediaTypeHolder()) != NULL) { CMediaType *pCMType; *cfType = CF_NULL; hr = pCMHolder->FindCMediaType(pszType, &pCMType); if (hr == NOERROR) { *cfType = pCMType->GetClipFormat(); } } else { hr = E_FAIL; } PerfDbgLog(tagMediaApi, NULL, "-FindMediaType"); return hr; } //+--------------------------------------------------------------------------- // // Function: FindMediaTypeW // // Synopsis: // // Arguments: [pwzType] -- // [cfType] -- // // Returns: // // History: 3-22-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- HRESULT FindMediaTypeW(LPCWSTR pwzType, CLIPFORMAT *pcfType) { HRESULT hr = E_NOTIMPL; PerfDbgLog(tagMediaApi, NULL, "+FindMediaTypeW"); CMediaTypeHolder *pCMHolder; CLock lck(g_mxsMedia); char szMime[SZMIMESIZE_MAX]; W2A(pwzType, szMime, SZMIMESIZE_MAX); if (FindMediaType((LPCSTR)szMime,pcfType) != NOERROR) { *pcfType = (CLIPFORMAT) RegisterClipboardFormat(szMime); hr = NOERROR; } PerfDbgLog(tagMediaApi, NULL, "-FindMediaTypeW"); return hr; } //+--------------------------------------------------------------------------- // // Function: FindMediaString // // Synopsis: // // Arguments: [cfFormat] -- // [ppStr] -- // // Returns: // // History: 3-29-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- HRESULT FindMediaString(CLIPFORMAT cfFormat, LPSTR *ppStr) { HRESULT hr = E_OUTOFMEMORY; PerfDbgLog1(tagMediaApi, NULL, "+FindMediaString (cfFormat:%d)", cfFormat); CMediaTypeHolder *pCMHolder; CLock lck(g_mxsMedia); UrlMkAssert((cfFormat)); InternalRegisterDefaultMediaType(); if ((pCMHolder = GetMediaTypeHolder()) != NULL) { CMediaType *pCMType = NULL; hr = pCMHolder->FindCMediaType(cfFormat, &pCMType); if ((hr == NOERROR) && pCMType) { *ppStr = pCMType->GetTypeString(); UrlMkAssert((*ppStr)); } else { hr = E_FAIL; } } else { hr = E_FAIL; } PerfDbgLog2(tagMediaApi, NULL, "-FindMediaString (clFormat:%d -> szMime:%s)",cfFormat,hr?"":*ppStr); return hr; } //+--------------------------------------------------------------------------- // // Function: FindMediaTypeFormat // // Synopsis: // // Arguments: [pszType] -- // [cfType] -- // [pdwFormat] -- // // Returns: // // History: 7-23-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- HRESULT FindMediaTypeFormat(LPCWSTR pwzType, CLIPFORMAT *cfType, DWORD *pdwFormat) { HRESULT hr = E_OUTOFMEMORY; PerfDbgLog(tagMediaApi, NULL, "+FindMediaTypeFormat"); CMediaTypeHolder *pCMHolder; CLock lck(g_mxsMedia); UrlMkAssert((cfType)); LPSTR pszType = DupW2A(pwzType); InternalRegisterDefaultMediaType(); if ((pszType == NULL) || (cfType == CF_NULL) || (!pdwFormat)) { hr = E_INVALIDARG; } else if ((pCMHolder = GetMediaTypeHolder()) != NULL) { CMediaType *pCMType; *cfType = CF_NULL; hr = pCMHolder->FindCMediaType(pszType, &pCMType); if (hr == NOERROR) { *cfType = pCMType->GetClipFormat(); *pdwFormat = pCMType->GetDataFormat(); } } else { hr = E_FAIL; } if (pszType) { delete pszType; } PerfDbgLog4(tagMediaApi, NULL, "-FindMediaTypeFormat (hr:%lx Mime:%ws, cf:%ld, DataFormat:%ld)", hr, pwzType, cfType, *pdwFormat); return hr; } //+--------------------------------------------------------------------------- // // Function: FindMediaTypeClassInfo // // Synopsis: // // Arguments: [pszType] -- // [pclsid] -- // [pdwClsCtx] -- // // Returns: // // History: 7-23-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- HRESULT FindMediaTypeClassInfo(LPCSTR pszType, LPCSTR pszFileName, LPCLSID pclsid, DWORD *pdwClsCtx, DWORD dwFlags) { HRESULT hr = E_OUTOFMEMORY; PerfDbgLog(tagMediaApi, NULL,"+FindMediaTypeClassInfo\n"); CMediaTypeHolder *pCMHolder; BOOL fChecked = FALSE; CLock lck(g_mxsMedia); UrlMkAssert((pclsid)); InternalRegisterDefaultMediaType(); if ((pszType == NULL) || (!pclsid)) { hr = E_INVALIDARG; } else if ((pCMHolder = GetMediaTypeHolder()) != NULL) { CMediaType *pCMType; *pclsid = CLSID_NULL; hr = pCMHolder->FindCMediaType(pszType, &pCMType); if ( hr == NOERROR && !(dwFlags & MIMEFLAGS_IGNOREMIME_CLASSID) ) { fChecked = TRUE; hr = pCMType->GetClsID(pclsid); if (hr == NOERROR) { hr = pCMType->GetClsCtx(pdwClsCtx); if (hr != NOERROR) { hr = GetClsIDInfo(pclsid, 0, pdwClsCtx); if (hr == NOERROR) { pCMType->SetClsCtx(*pdwClsCtx); } } } else if (!pCMType->IsLookupDone()) { pCMType->SetLookupDone(); // // find the clsid and clsctx DWORD dwMimeFlags = 0; hr = GetMimeInfo((LPSTR)pszType, pclsid, FALSE, &dwMimeFlags); if (hr == NOERROR) { pCMType->SetMimeInfo(*pclsid, dwMimeFlags); hr = GetClsIDInfo(pclsid, 0, pdwClsCtx); if (hr == NOERROR) { pCMType->SetClsCtx(*pdwClsCtx); } } // no class found yet - try the filename if (hr != NOERROR && pszFileName) { WCHAR wzFileName[MAX_PATH]; A2W((LPSTR)pszFileName,wzFileName, MAX_PATH); hr = GetClassFile(wzFileName, pclsid); if (hr == NOERROR) { // do not trust filename-app/oc combination // example: a.doc and a.xls are both marked as app/oc if( strcmp(pszType, "application/octet-stream")) { // found a class for this mime pCMType->SetMimeInfo(*pclsid, dwMimeFlags); hr = GetClsIDInfo(pclsid, 0, pdwClsCtx); if (hr == NOERROR) { pCMType->SetClsCtx(*pdwClsCtx); } } else { pCMType->SetLookupDone(FALSE); } } } } } if ( (hr != NOERROR || (dwFlags & MIMEFLAGS_IGNOREMIME_CLASSID) ) && !fChecked ) { hr = GetClassMime((LPSTR)pszType, pclsid, (dwFlags & MIMEFLAGS_IGNOREMIME_CLASSID)); } } else { hr = E_FAIL; } PerfDbgLog1(tagMediaApi, NULL, "-FindMediaTypeClassInfo (hr:%lx)\n",hr); return hr; }