// NilXForm.cpp -- Implementation of the Null Transform Instance #include "stdafx.h" HRESULT CNull_TransformInstance::CreateFromILockBytes (IUnknown *pUnkOuter, ILockBytes *pLKB, ITransformInstance **ppTransformInstance) { CNull_TransformInstance *pNT = New CNull_TransformInstance(pUnkOuter); return FinishSetup(pNT? pNT->m_ImpITransformInstance.InitFromLockBytes(pLKB) : STG_E_INSUFFICIENTMEMORY, pNT, IID_ITransformInstance, (PPVOID) ppTransformInstance ); } CNull_TransformInstance::CImpITransformInstance::CImpITransformInstance (CNull_TransformInstance *pBackObj, IUnknown *punkOuter) : IITTransformInstance(pBackObj, punkOuter) { m_pLKB = NULL; m_cbSpaceSize = 0; } CNull_TransformInstance::CImpITransformInstance::~CImpITransformInstance() { if (m_pLKB) { m_pLKB->Flush(); m_pLKB->Release(); } } HRESULT CNull_TransformInstance::CImpITransformInstance::InitFromLockBytes(ILockBytes *pLKB) { m_pLKB = pLKB; STATSTG statstg; HRESULT hr = m_pLKB->Stat(&statstg, STATFLAG_NONAME); if (SUCCEEDED(hr)) m_cbSpaceSize = statstg.cbSize; return hr; } // ITransformInstance interfaces: HRESULT STDMETHODCALLTYPE CNull_TransformInstance::CImpITransformInstance::ReadAt (ULARGE_INTEGER uliOffset, void *pv, ULONG cb, ULONG *pcbRead, ImageSpan *pSpan ) { HRESULT hr = m_pLKB->ReadAt((CULINT(uliOffset) + CULINT(pSpan->uliHandle)).Uli(), pv,cb, pcbRead ); return hr; } HRESULT STDMETHODCALLTYPE CNull_TransformInstance::CImpITransformInstance::WriteAt (ULARGE_INTEGER ulOffset, const void *pv, ULONG cb, ULONG *pcbWritten, ImageSpan *pSpan ) { RonM_ASSERT(m_pLKB); CULINT ullOffset, ullSize, ullWriteOffset, ullWriteLimit, ullReadEOS; ullOffset = pSpan->uliHandle; ullSize = pSpan->uliSize; ullReadEOS = ullOffset + ullSize; ullWriteOffset = ullOffset + ulOffset; ullWriteLimit = ullWriteOffset + cb; CSyncWith sw(g_csITFS); if (ullWriteOffset != ullReadEOS || (ullReadEOS.NonZero() && ullWriteOffset > ullReadEOS)) return STG_E_INVALIDPARAMETER; if (ullWriteLimit < ullWriteOffset) // Wrapped around 64-bit address space? ullWriteLimit = 0; HRESULT hr = m_pLKB->WriteAt(ullWriteOffset.Uli(), pv, (ullWriteLimit - ullWriteOffset).Uli().LowPart, pcbWritten ); ullWriteLimit = ullWriteOffset + *pcbWritten; if (m_cbSpaceSize < ullWriteLimit) m_cbSpaceSize = ullWriteLimit; CULINT ullSizeNew; ullSizeNew = ullWriteLimit - ullWriteOffset; if (SUCCEEDED(hr)) pSpan->uliSize = (CULINT(pSpan->uliSize) + CULINT(*pcbWritten)).Uli(); return hr; } HRESULT STDMETHODCALLTYPE CNull_TransformInstance::CImpITransformInstance::Flush() { RonM_ASSERT(m_pLKB); return m_pLKB->Flush(); } HRESULT CNull_TransformInstance::CImpITransformInstance::SpaceSize(ULARGE_INTEGER *puliSize) { RonM_ASSERT(m_pLKB); *puliSize = m_cbSpaceSize.Uli(); return NO_ERROR; }