|
|
//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1997
//
// File: cmime.cxx
//
// Contents: MimeType object
//
// History: 04-1-97 krishnag Created.
//
//----------------------------------------------------------------------------
#include "iis.hxx"
#pragma hdrstop
// Class CMimeType
DEFINE_Simple_IDispatch_Implementation(CMimeType)
CMimeType::CMimeType(): _pDispMgr(NULL), _lpMimeType(NULL), _lpExtension(NULL) { ENLIST_TRACKING(CMimeType); }
HRESULT CMimeType::CreateMimeType( REFIID riid, void **ppvObj ) { CMimeType FAR * pMimeType = NULL; HRESULT hr = S_OK;
hr = AllocateMimeTypeObject(&pMimeType); BAIL_ON_FAILURE(hr);
hr = pMimeType->QueryInterface(riid, ppvObj); BAIL_ON_FAILURE(hr);
pMimeType->Release();
RRETURN(hr);
error: delete pMimeType;
RRETURN(hr);
}
CMimeType::~CMimeType( ) { if (_lpMimeType) { FreeADsStr(_lpMimeType); }
if (_lpExtension) { FreeADsStr(_lpExtension); }
delete _pDispMgr; }
STDMETHODIMP CMimeType::QueryInterface( REFIID iid, LPVOID FAR* ppv ) { if (IsEqualIID(iid, IID_IUnknown)) { *ppv = (IISMimeType FAR *) this; } else if (IsEqualIID(iid, IID_IISMimeType)) { *ppv = (IISMimeType FAR *) this; } else if (IsEqualIID(iid, IID_IDispatch)) { *ppv = (IISMimeType FAR *) this; } else { *ppv = NULL; return E_NOINTERFACE; } AddRef(); return NOERROR; }
HRESULT CMimeType::InitFromIISString( LPWSTR pszStr ) { LPWSTR pszToken = NULL; DWORD dwLen = 0;
if (!pszStr) { return S_FALSE; }
//
// get length of pszStr; do not count ',' ; + 1 for null pointer and -1
// for ',' so dwLen is = wcslen
//
dwLen = (DWORD)wcslen(pszStr);
//
// first token is extension
//
pszToken = wcstok(pszStr, L","); if (pszToken) { _lpExtension = AllocADsStr(pszToken);
//
// second token is mimetype
//
if (wcslen(pszStr) + 1 < dwLen) { pszToken = pszStr + wcslen(pszStr) + 1; _lpMimeType = AllocADsStr(pszToken); } }
return S_OK; }
HRESULT CMimeType::CopyMimeType( LPWSTR *ppszMimeType ) { HRESULT hr = S_OK; LPWSTR pszMimeType = NULL; DWORD dwLen = 0;
if (!ppszMimeType) { return S_FALSE; }
if (_lpExtension) { dwLen = (DWORD)wcslen(_lpExtension); }
if (_lpMimeType) { dwLen += (DWORD)wcslen(_lpMimeType); }
//
// dwLen +2 to include comma and null terminator
//
pszMimeType = (LPWSTR)AllocADsMem((dwLen+2) * sizeof(WCHAR));
if (!pszMimeType) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); }
//
// empty contents
//
wcscpy(pszMimeType, L"");
if (_lpExtension) { wcscpy(pszMimeType, _lpExtension); }
wcscat(pszMimeType, L",");
if (_lpMimeType) { wcscat(pszMimeType, _lpMimeType); }
pszMimeType[wcslen(pszMimeType)] = L'\0';
*ppszMimeType = pszMimeType;
error:
RRETURN(hr); }
HRESULT CMimeType::AllocateMimeTypeObject( CMimeType ** ppMimeType ) { CMimeType FAR * pMimeType = NULL; CAggregatorDispMgr FAR * pDispMgr = NULL; HRESULT hr = S_OK;
pMimeType = new CMimeType(); if (pMimeType == NULL) { hr = E_OUTOFMEMORY; } BAIL_ON_FAILURE(hr);
pDispMgr = new CAggregatorDispMgr; if (pDispMgr == NULL) { hr = E_OUTOFMEMORY; } if (FAILED(hr)) { delete pMimeType; } BAIL_ON_FAILURE(hr);
hr = pDispMgr->LoadTypeInfoEntry( LIBID_IISOle, IID_IISMimeType, (IISMimeType *)pMimeType, DISPID_REGULAR ); if (FAILED(hr)) { delete pMimeType; } BAIL_ON_FAILURE(hr);
pMimeType->_pDispMgr = pDispMgr; *ppMimeType = pMimeType;
RRETURN(hr);
error:
delete pDispMgr;
RRETURN(hr);
}
STDMETHODIMP CMimeType::get_MimeType(THIS_ BSTR FAR * retval) { HRESULT hr = S_OK;
hr = ADsAllocString(_lpMimeType, retval); RRETURN(hr); }
STDMETHODIMP CMimeType::put_MimeType(THIS_ BSTR bstrMimeType) { if (!bstrMimeType) { RRETURN(E_FAIL); } if (_lpMimeType) { FreeADsStr(_lpMimeType); } _lpMimeType = AllocADsStr(bstrMimeType); if (!_lpMimeType) { RRETURN(E_OUTOFMEMORY); }
RRETURN(S_OK);
}
STDMETHODIMP CMimeType::get_Extension(THIS_ BSTR FAR * retval) { HRESULT hr = S_OK;
hr = ADsAllocString(_lpExtension, retval); RRETURN(hr); }
STDMETHODIMP CMimeType::put_Extension(THIS_ BSTR bstrExtension) { if (!bstrExtension) { RRETURN(E_FAIL); } if (_lpExtension) { FreeADsStr(_lpExtension); } _lpExtension = AllocADsStr(bstrExtension); if (!_lpExtension) { RRETURN(E_OUTOFMEMORY); }
RRETURN(S_OK);
}
|