windows-nt/Source/XPSP1/NT/com/ole32/stg/ref/rexpdf.cxx

233 lines
6.6 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+--------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1992.
//
// File: rpubdf.cxx
//
// Contents: CRootPubDocFile implementation
//
//---------------------------------------------------------------
#include "dfhead.cxx"
#include "h/header.hxx"
#include "h/rexpdf.hxx"
#include "dfbasis.hxx"
#include "h/tchar.h"
// Priority mode lock permissions
#define PRIORITY_PERMS DF_READ
//+--------------------------------------------------------------
//
// Member: CRootExposedDocFile::CRootExposedDocFile, public
//
// Synopsis: Ctor - Initializes empty object
//
//---------------------------------------------------------------
CRootExposedDocFile::CRootExposedDocFile(CDFBasis *pdfb) :
CExposedDocFile(NULL, NULL, 0, ROOT_LUID, NULL, NULL, NULL, pdfb)
{
olDebugOut((DEB_ITRACE, "CRootExposedDocFile constructor called\n"));
}
//+--------------------------------------------------------------
//
// Member: CRootExposedDocFile::Init, private
//
// Synopsis: Dependent root initialization
//
// Arguments: [plstBase] - Base
// [snbExclude] - Limited instantiation exclusions
// [dwStartFlags] - Startup flags
//
// Returns: Appropriate status code
//
//---------------------------------------------------------------
SCODE CRootExposedDocFile::Init( ILockBytes *plstBase,
SNBW snbExclude,
DWORD const dwStartFlags)
{
CDocFile *pdf;
SCODE sc;
CMStream *pms;
olDebugOut((DEB_ITRACE, "In CRootExposedDocFile::Init()\n"));
if (snbExclude)
{
olChk(DllMultiStreamFromStream(&pms, &plstBase, dwStartFlags));
olMemTo(EH_pms,
pdf = new CDocFile(pms, SIDROOT, ROOT_LUID, _pilbBase));
pdf->AddRef();
olChkTo(EH_pdf, pdf->ExcludeEntries(pdf, snbExclude));
olChkTo(EH_pdf, pms->Flush(0));
pdf->Release();
}
plstBase->AddRef();
_pilbBase = plstBase;
olDebugOut((DEB_ITRACE, "Out CRootExposedDocFile::Init()\n"));
return S_OK;
EH_pdf:
pdf->Release();
EH_pms:
DllReleaseMultiStream(pms);
EH_Err:
return sc;
}
//+--------------------------------------------------------------
//
// Member: CRootExposedDocFile::InitRoot, public
//
// Synopsis: Initialising a root storage
//
// Arguments: [plstBase] - Base LStream
// [dwStartFlags] - How to start things
// [df] - Transactioning flags
// [snbExclude] - Parital instantiation list
// [ppdfb] - Basis pointer return
//
// Returns: Appropriate status code
//
// Modifies: [ppdfb]
//
//---------------------------------------------------------------
SCODE CRootExposedDocFile::InitRoot( ILockBytes *plstBase,
DWORD const dwStartFlags,
DFLAGS const df,
SNBW snbExclude)
{
CDocFile *pdfBase;
SCODE sc, scConv = S_OK;
STATSTG statstg;
olDebugOut((DEB_ITRACE, "In CRootExposedDocFile::InitRoot("
"%p, %lX, %lX, %p)\n",
plstBase, dwStartFlags, df, snbExclude));
// Exclusion only works with a plain open
olAssert(snbExclude == NULL ||
(dwStartFlags & (RSF_CREATEFLAGS | RSF_CONVERT)) == 0);
olHChk(plstBase->Stat(&statstg, STATFLAG_NONAME));
olChkTo(EH_GetPriority,
Init(plstBase, snbExclude, dwStartFlags));
scConv = DllMultiStreamFromStream(&_pmsBase, &_pilbBase,
dwStartFlags);
if (scConv == STG_E_INVALIDHEADER)
scConv = STG_E_FILEALREADYEXISTS;
olChkTo(EH_pfstScratchInit, scConv);
olMemTo(EH_pmsBase,
pdfBase = new CDocFile(_pmsBase, SIDROOT, ROOT_LUID, _pilbBase));
pdfBase->AddRef();
_pdf = pdfBase;
_df = df;
olDebugOut((DEB_ITRACE, "Out CRootExposedDocFile::InitRoot\n"));
return scConv;
EH_pmsBase:
DllReleaseMultiStream(_pmsBase);
EH_pfstScratchInit:
EH_GetPriority:
EH_Err:
return sc;
}
//+--------------------------------------------------------------
//
// Member: CRootExposedDocFile::~CRootExposedDocFile,
// public virutal
//
// Synopsis: dtor (virtual)
//
//---------------------------------------------------------------
CRootExposedDocFile::~CRootExposedDocFile(void)
{
olDebugOut((DEB_TRACE, "In CRootExposedDocFile::~CRootExposedDocFile\n"));
olAssert(_cReferences == 0);
if (SUCCEEDED(CheckReverted()))
{
if (_pilbBase) {
_pilbBase->Release();
_pilbBase = NULL;
}
}
olDebugOut((DEB_TRACE, "Out CRootExposedDocFile::~CRootExposedDocFile\n"));
}
//+-------------------------------------------------------------------
//
// Member: CRootExposedDocFile::Stat, public
// virtual fr. CExposedDocFile
//
// Synopsis: Fills in a stat buffer from the base LStream
//
// Arguments: [pstatstg] - Stat buffer
// [grfStatFlag] - Stat flags
//
// Returns: Appropriate status code
//
// Modifies: [pstatstg]
//
//--------------------------------------------------------------------
SCODE CRootExposedDocFile::Stat(STATSTGW *pstatstgw, DWORD grfStatFlag)
{
SCODE sc;
STATSTG *pstatstg= (STATSTG*)pstatstgw;
olDebugOut((DEB_ITRACE, "In CRootExposedDocFile::Stat(%p, %lu)\n",
pstatstg, grfStatFlag));
olChk(ValidateOutBuffer(pstatstg, sizeof(STATSTGW)));
olChk(VerifyStatFlag(grfStatFlag));
olChk(CheckReverted());
olHChk(_pilbBase->Stat(pstatstg, grfStatFlag));
pstatstg->type = STGTY_STORAGE;
ULISet32(pstatstg->cbSize, 0); // size undefined for storage obj
pstatstg->grfLocksSupported = 0;
pstatstg->reserved = 0;
if (pstatstg->pwcsName)
{
// pilbBase returns either wide or ansi names depending on
// system type, so we have to convert to ANSI char if neccessay
WCHAR *pwcs;
olChkTo(EH_pwcsName,
DfAllocWC(_tcslen(pstatstg->pwcsName)+1, &pwcs));
TTOW(pstatstg->pwcsName, pwcs, _tcslen(pstatstg->pwcsName)+1);
delete[] pstatstg->pwcsName;
pstatstgw->pwcsName = pwcs;
}
pstatstg->grfMode = DFlagsToMode(_df);
olChkTo(EH_pwcsName, _pdf->GetClass(&pstatstg->clsid));
olChkTo(EH_pwcsName, _pdf->GetStateBits(&pstatstg->grfStateBits));
olDebugOut((DEB_ITRACE, "Out CRootExposedDocFile::Stat\n"));
return S_OK;
EH_pwcsName:
if (pstatstg->pwcsName)
delete[] pstatstg->pwcsName;
EH_Err:
return sc;
}