HRESULT LoadPropertyStoreFromStream(IStream *pstm, REFIID riid, void **ppv) { *ppv = NULL; STATSTG stat; HRESULT hr = pstm->Stat(&stat, STATFLAG_NONAME); if (SUCCEEDED(hr)) { IPersistStream *pps; hr = PSCreateMemoryPropertyStore(IID_PPV_ARGS(&pps)); if (SUCCEEDED(hr)) { if (stat.cbSize.QuadPart == 0) { hr = S_OK; // empty stream => empty property store } else if (stat.cbSize.QuadPart > (128 * 1024)) { hr = STG_E_MEDIUMFULL; // can't be that large } else { hr = pps->Load(pstm); } if (SUCCEEDED(hr)) { hr = pps->QueryInterface(riid, ppv); } pps->Release(); } } return hr; }
HRESULT CPkcs7::SaveIntoJavaClassFile(FILEHANDLE hFile,LPCOLESTR wszFileName,BOOL fClearDirty) // Save this signed data (presumably already signed) into the right place in the class file { HRESULT hr = S_OK; CFileStream stm; if (stm.OpenFileForWriting(hFile, wszFileName, FALSE)) { IPersistStream* pPerStream; hr = CJavaClassFile::CreateInstance(NULL, IID_IPersistStream, (LPVOID*)&pPerStream); if (hr == S_OK) { hr = pPerStream->Load(&stm); // load the class file if (hr == S_OK) { BLOB b; hr = CPersistMemoryHelper2::Save(&b, FALSE); // get our bits if (hr == S_OK) { IInsertSig* pSig; hr = pPerStream->QueryInterface(IID_IInsertSig, (LPVOID*)&pSig); if (hr == S_OK) { hr = pSig->SaveSig(&b); // stuff our bits in pSig->Release(); } FreeTaskMem(b); } if (hr == S_OK) { stm.Reset(); stm.Truncate(); hr = pPerStream->Save(&stm, FALSE); // save the class file } } pPerStream->Release(); } } else hr = HError(); if (hr == S_OK && fClearDirty) m_isDirty = FALSE; return hr; }
HRESULT CPkcs7::LoadFromJavaClassFile(FILEHANDLE hFile,LPCOLESTR wszFileName) // Load this signed data from this Java class file { HRESULT hr = S_OK; CFileStream stm; if (stm.OpenFileForReading(hFile, wszFileName)) { IPersistStream* pPerStream; hr = CJavaClassFile::CreateInstance(NULL, IID_IPersistStream, (LPVOID*)&pPerStream); if (hr == S_OK) { hr = pPerStream->Load(&stm); // load the class file if (hr == S_OK) { IInsertSig* pSig; hr = pPerStream->QueryInterface(IID_IInsertSig, (LPVOID*)&pSig); if (hr == S_OK) { BLOB b; hr = pSig->LoadSig(&b); // get our bits back out if (hr == S_OK) { hr = CPersistMemoryHelper2::Load(&b); // load our bits FreeTaskMem(b); } pSig->Release(); } } pPerStream->Release(); } } else hr = HError(); return hr; }