Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

175 lines
4.2 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 1999
//
// File: npd.h
//
//--------------------------------------------------------------------------
#ifndef NPD_H
#define NPD_H
#ifndef COMDBG_H
#include <comdbg.h>
#endif
// {118B559C-6D8C-11d0-B503-00C04FD9080A}
extern const GUID IID_PersistData;
#if _MSC_VER < 1100
class PersistData : public IUnknown, public CComObjectRoot
#else
class __declspec(uuid("118B559C-6D8C-11d0-B503-00C04FD9080A")) PersistData :
public IUnknown, public CComObjectRoot
#endif
{
public:
BEGIN_COM_MAP(PersistData)
COM_INTERFACE_ENTRY(PersistData)
END_COM_MAP()
DECLARE_NOT_AGGREGATABLE(PersistData)
HRESULT Initialize(IStorage* pRoot, BOOL bSameAsLoad)
{
m_spRoot = pRoot;
ASSERT(m_spRoot != NULL);
if (m_spRoot == NULL)
return E_INVALIDARG;
m_bSameAsLoad = bSameAsLoad;
if (bSameAsLoad)
return Open();
return Create();
}
HRESULT Create(IStorage* pRoot)
{
m_spRoot = pRoot;
ASSERT(m_spRoot != NULL);
if (m_spRoot == NULL)
return E_INVALIDARG;
m_bSameAsLoad = TRUE;
return Create();
}
HRESULT Open(IStorage* pRoot)
{
m_spRoot = pRoot;
ASSERT(m_spRoot != NULL);
if (m_spRoot == NULL)
return E_INVALIDARG;
m_bSameAsLoad = TRUE;
return Open();
}
IStorage* GetRoot()
{
return m_spRoot;
}
BOOL SameAsLoad()
{
return m_bSameAsLoad;
}
void SetSameAsLoad(BOOL bSame = TRUE)
{
m_bSameAsLoad = bSame;
}
void ClearSameAsLoad()
{
m_bSameAsLoad = FALSE;
}
IStream* GetTreeStream()
{
return m_spTreeStream;
}
IStorage* GetNodeStorage()
{
return m_spNodeStorage;
}
protected:
explicit PersistData()
: m_bSameAsLoad(TRUE)
{
}
virtual ~PersistData()
{
}
private:
IStoragePtr m_spRoot;
BOOL m_bSameAsLoad;
IStreamPtr m_spTreeStream;
IStoragePtr m_spNodeStorage;
explicit PersistData(const PersistData&);
// No copy.
PersistData& operator=(const PersistData&);
// No copy.
HRESULT Create()
{
ASSERT(m_bSameAsLoad || (!m_bSameAsLoad && m_spRoot != NULL));
if (!m_bSameAsLoad && m_spRoot == NULL)
return E_INVALIDARG;
// Create the stream for the tree
HRESULT hr = CreateDebugStream(m_spRoot, L"tree",
STGM_CREATE | STGM_SHARE_EXCLUSIVE | STGM_READWRITE, L"\\tree",
&m_spTreeStream);
ASSERT(SUCCEEDED(hr) && m_spTreeStream != NULL);
if (FAILED(hr))
return hr;
// Create the storage for the nodes
hr = CreateDebugStorage(m_spRoot, L"nodes",
STGM_CREATE | STGM_SHARE_EXCLUSIVE | STGM_READWRITE, L"\\nodes",
&m_spNodeStorage);
ASSERT(SUCCEEDED(hr) && m_spNodeStorage != NULL);
if (FAILED(hr))
return hr;
return S_OK;
}
HRESULT Open()
{
ASSERT(m_bSameAsLoad || (!m_bSameAsLoad && m_spRoot != NULL));
if (!m_bSameAsLoad && m_spRoot == NULL)
return E_INVALIDARG;
// Open the stream for the trees persistent data.
HRESULT hr = OpenDebugStream(m_spRoot, L"tree",
STGM_SHARE_EXCLUSIVE | STGM_READWRITE, L"\\tree", &m_spTreeStream);
ASSERT(SUCCEEDED(hr) && m_spTreeStream != NULL);
if (FAILED(hr))
return hr;
// Open the storage for the nodes
hr = OpenDebugStorage(m_spRoot, L"nodes",
STGM_SHARE_EXCLUSIVE | STGM_READWRITE, L"\\nodes",
&m_spNodeStorage);
ASSERT(SUCCEEDED(hr) && m_spNodeStorage != NULL);
if (FAILED(hr))
return hr;
return S_OK;
}
}; // class PersistData
DEFINE_COM_SMARTPTR(PersistData); // PersistDataPtr
#endif // NPD_H