// StorageFactory.cpp : Implementation of CDelme2App and DLL registration. #include "stdafx.h" #include "StorageFactory.h" HRESULT STDMETHODCALLTYPE SetIStorage( IN IStorage *pIStorage, IN const EnStorageMode enStorageMode, OUT ITStorage **ppStorage) { LOG((MSP_TRACE, "CTStorageFactory::SetIStorage - enter")); LOG((MSP_TRACE, "CTStorageFactory::SetIStorage - completed")); return E_NOTIMPL; } HRESULT OpenStorage( IN const OLECHAR *pwcsStorageName, EnStorageMode enStorageMode, OUT ITStorage **ppStorage) { LOG((MSP_TRACE, "CTStorageFactory::OpenStorage - enter")); // // check arguments // if (IsBadWritePtr(ppStorage, sizeof(ITStorage*))) { LOG((MSP_ERROR, "CTStorageFactory::OpenStorage - bad pointer passed in ppStorage %p", ppStorage)); return E_POINTER; } // // don't return garbage if we fail // *ppStorage = NULL; if (IsBadStringPtr(pwcsStorageName, -1)) { LOG((MSP_ERROR, "CTStorageFactory::PrepareStorage - bad pointer passed in pwcsStorageName %p", pwcsStorageName)); return E_POINTER; } LOG((MSP_TRACE, "CTStorageFactory::OpenStorage - opening [%S] in mode [%x]", pwcsStorageName, enStorageMode)); // // get file extension // OLECHAR *pszExtention = wcsrchr(pwcsStorageName, '.'); // // make sure file has extension // if (NULL == pszExtention) { LOG((MSP_ERROR, "CTStorageFactory::OpenStorage - file name %S does not have extentsion", pwcsStorageName)); return TAPI_E_NOTSUPPORTED; } // // extension follows the dot. // pszExtention++; // // (pszExtention is still valid -- if the dot was at the end, // we now point to \0) // CLSID clsID; // // check extention. we currently only support AVI and wav // make this logic more flexible if we want to support asf, wma, wmv) // if (0 == _wcsicmp(pszExtention, L"avi")) { LOG((MSP_TRACE, "CTStorageFactory::OpenStorage - creating avi storage unit")); // // create avi storage // clsID = CLSID_TStorageUnitAVI; } else if (0 == _wcsicmp(pszExtention, L"wav")) { LOG((MSP_TRACE, "CTStorageFactory::OpenStorage - creating wav storage unit")); // // create wav storage // clsID = CLSID_TStorageUnitAVI; } else { // // failed to recognize file type // LOG((MSP_ERROR, "CTStorageFactory::OpenStorage - unrecognized file type")); return TAPI_E_NOTSUPPORTED; } // // we know the storage unit class id. attemt to create it // ITStorage *pStorageUnit = NULL; HRESULT hr = CoCreateInstance(clsID, NULL, CLSCTX_ALL, IID_ITStorage, (void**)&pStorageUnit ); if (FAILED(hr)) { LOG((MSP_ERROR, "CTStorageFactory::OpenStorage - failed to instantiate storage unit")); return hr; } // // configure storage unit with file name // hr = pStorageUnit->Initialize(pwcsStorageName, enStorageMode); // // if failed, cleanup and bail out // if (FAILED(hr)) { LOG((MSP_ERROR, "CTStorageFactory::OpenStorage - failed to initialize storage unit, hr = %lx", hr)); pStorageUnit->Release(); return hr; } // // everything went well -- return ITStorage interface of the storage unit // we have just created // *ppStorage = pStorageUnit; LOG((MSP_TRACE, "CTStorageFactory::OpenStorage - exit. returning storage unit %p", *ppStorage)); return S_OK; }