mirror of https://github.com/tongzx/nt5src
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
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
|