2025-11-28 00:35:46 +09:00

165 lines
4.2 KiB
C++

/**************************************************************************
THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright 2001 Microsoft Corporation. All Rights Reserved.
**************************************************************************/
/**************************************************************************
File: PropLdr.cpp
Description: CTSFPersistentPropertyLoader implementation.
**************************************************************************/
/**************************************************************************
#include statements
**************************************************************************/
#include "PropLdr.h"
/**************************************************************************
CTSFPersistentPropertyLoader::CTSFPersistentPropertyLoader()
**************************************************************************/
CTSFPersistentPropertyLoader::CTSFPersistentPropertyLoader(TF_PERSISTENT_PROPERTY_HEADER_ACP *pHdr, IStream *pStream)
{
m_ObjRefCount = 1;
m_hdr = *pHdr;
m_pb = (BYTE *)GlobalAlloc(GPTR, pHdr->cb);
if(m_pb)
{
pStream->Read(m_pb, pHdr->cb, NULL);
}
}
/**************************************************************************
CTSFPersistentPropertyLoader::~CTSFPersistentPropertyLoader()
**************************************************************************/
CTSFPersistentPropertyLoader::~CTSFPersistentPropertyLoader()
{
if(m_pb)
{
GlobalFree(m_pb);
}
}
///////////////////////////////////////////////////////////////////////////
//
// IUnknown Implementation
//
/**************************************************************************
CTSFPersistentPropertyLoader::QueryInterface()
**************************************************************************/
STDAPI CTSFPersistentPropertyLoader::QueryInterface(REFIID riid, void **ppvObj)
{
if(ppvObj == NULL)
{
return E_POINTER;
}
*ppvObj = NULL;
if (IsEqualIID(riid, IID_IUnknown) ||
IsEqualIID(riid, IID_ITfPersistentPropertyLoaderACP))
{
*ppvObj = (ITfPersistentPropertyLoaderACP*)this;
}
if (*ppvObj == NULL)
{
return E_NOINTERFACE;
}
AddRef();
return S_OK;
}
/**************************************************************************
CTSFPersistentPropertyLoader::AddRef()
**************************************************************************/
STDAPI_(ULONG) CTSFPersistentPropertyLoader::AddRef()
{
m_ObjRefCount++;
return m_ObjRefCount;
}
/**************************************************************************
CTSFPersistentPropertyLoader::Release()
**************************************************************************/
STDAPI_(ULONG) CTSFPersistentPropertyLoader::Release()
{
if(--m_ObjRefCount == 0)
{
delete this;
return 0;
}
return m_ObjRefCount;
}
///////////////////////////////////////////////////////////////////////////
//
// ITfPersistentPropertyLoaderACP Implementation
//
// we count on the given TF_PERSISTENT_PROPERTY_HEADER_ACP structure for the place
// to be loaded.
/**************************************************************************
CTSFPersistentPropertyLoader::LoadProperty()
**************************************************************************/
STDMETHODIMP CTSFPersistentPropertyLoader::LoadProperty(const TF_PERSISTENT_PROPERTY_HEADER_ACP *pHdr, IStream **ppStream)
{
HRESULT hr;
IStream *pStream;
*ppStream = NULL;
if (m_pb == NULL)
return E_FAIL; // failed initial mem alloc
//create a stream to return
hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream);
if(SUCCEEDED(hr))
{
//write the property data into the stream
hr = pStream->Write(m_pb, m_hdr.cb, NULL);
if(SUCCEEDED(hr))
{
LARGE_INTEGER li;
li.QuadPart = 0;
hr = pStream->Seek(li, STREAM_SEEK_SET, NULL);
if(SUCCEEDED(hr))
{
*ppStream = pStream;
}
}
}
return hr;
}