WindowsXP-SP1/com/oleutest/simpsvr/ips.cpp
2020-09-30 16:53:49 +02:00

655 lines
15 KiB
C++

//**********************************************************************
// File name: ips.cpp
//
// Implementation file for the CSimpSvrApp Class
//
// Functions:
//
// See ips.h for a list of member functions.
//
// Copyright (c) 1993 Microsoft Corporation. All rights reserved.
//**********************************************************************
#include "pre.h"
#include "obj.h"
#include "ips.h"
#include "app.h"
#include "doc.h"
DEFINE_GUID(GUID_SIMPLE, 0xBCF6D4A0, 0xBE8C, 0x1068, 0xB6, 0xD4, 0x00, 0xDD, 0x01, 0x0C, 0x05, 0x09);
//**********************************************************************
//
// CPersistStorage::QueryInterface
//
// Purpose:
// Used for interface negotiation
//
// Parameters:
//
// REFIID riid - Interface being queried for.
//
// LPVOID FAR *ppvObj - Out pointer for the interface.
//
// Return Value:
//
// S_OK - Success
// E_NOINTERFACE - Failure
//
// Function Calls:
// Function Location
//
// CSimpSvrObj::QueryInterface OBJ.CPP
//
//
//********************************************************************
STDMETHODIMP CPersistStorage::QueryInterface ( REFIID riid, LPVOID FAR* ppvObj)
{
TestDebugOut(TEXT("In CPersistStorage::QueryInterface\r\n"));
// need to NULL the out parameter
return m_lpObj->QueryInterface(riid, ppvObj);
}
//**********************************************************************
//
// CPersistStorage::AddRef
//
// Purpose:
//
// Increments the reference count on CSimpSvrObj. Since CPersistStorage
// is a nested class of CSimpSvrObj, we don't need an extra reference
// count for CPersistStorage. We can safely use the reference count of
// CSimpSvrObj.
//
//
// Parameters:
//
// None
//
// Return Value:
//
// The new reference count of CSimpSvrObj
//
// Function Calls:
// Function Location
//
// OuputDebugString Windows API
// CSimpSvrObj::AddRef OBJ.CPP
//
//
//********************************************************************
STDMETHODIMP_(ULONG) CPersistStorage::AddRef ()
{
TestDebugOut(TEXT("In CPersistStorage::AddRef\r\n"));
return m_lpObj->AddRef();
}
//**********************************************************************
//
// CPersistStorage::Release
//
// Purpose:
//
// Decrements the reference count on CSimpSvrObj. Since CPersistStorage
// is a nested class of CSimpSvrObj, we don't need an extra reference
// count for CPersistStorage. We can safely use the reference count of
// CSimpSvrObj.
//
// Parameters:
//
// None
//
// Return Value:
//
// The new reference count of CSimpSvrObj
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// CSimpSvrObj::Release OBJ.CPP
//
//
//********************************************************************
STDMETHODIMP_(ULONG) CPersistStorage::Release ()
{
TestDebugOut(TEXT("In CPersistStorage::Release\r\n"));
return m_lpObj->Release();
}
//**********************************************************************
//
// CPersistStorage::InitNew
//
// Purpose:
//
// Used to give a new OLE object a ptr to its storage.
//
// Parameters:
//
// LPSTORAGE pStg - Pointer to the storage
//
// Return Value:
// S_OK
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// IStorage::Release OLE
// IStorage::AddRef OLE
//
//
//********************************************************************
STDMETHODIMP CPersistStorage::InitNew (LPSTORAGE pStg)
{
TestDebugOut(TEXT("In CPersistStorage::InitNew\r\n"));
// release any streams and storages that may be open
ReleaseStreamsAndStorage();
m_lpObj->m_lpStorage = pStg;
// AddRef the new Storage
if (m_lpObj->m_lpStorage)
m_lpObj->m_lpStorage->AddRef();
CreateStreams(m_lpObj->m_lpStorage);
return ResultFromScode(S_OK);
}
//**********************************************************************
//
// CPersistStorage::GetClassID
//
// Purpose:
//
// Returns the CLSID of this object.
//
// Parameters:
//
// LPCLSID lpClassID - Out ptr in which to return the CLSID
//
// Return Value:
//
// S_OK
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
//
//
//********************************************************************
STDMETHODIMP CPersistStorage::GetClassID ( LPCLSID lpClassID)
{
TestDebugOut(TEXT("In CPersistStorage::GetClassID\r\n"));
*lpClassID = GUID_SIMPLE;
return ResultFromScode( S_OK );
}
//**********************************************************************
//
// CPersistStorage::Save
//
// Purpose:
//
// Instructs the object to save itself into the storage.
//
// Parameters:
//
// LPSTORAGE pStgSave - Storage in which the object should be saved
//
// BOOL fSameAsLoad - TRUE if pStgSave is the same as the storage
// that the object was originally created with.
//
// Return Value:
//
// S_OK
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// CPersistStorage::InitNew IPS.CPP
// CSimpSvrObj::SaveToStorage OBJ.CPP
//
//
// Comments:
//
// A real app will want better error checking in this method.
//
//********************************************************************
STDMETHODIMP CPersistStorage::Save ( LPSTORAGE pStgSave, BOOL fSameAsLoad)
{
TestDebugOut(TEXT("In CPersistStorage::Save\r\n"));
// save the data
m_lpObj->SaveToStorage (pStgSave, fSameAsLoad);
m_lpObj->m_fSaveWithSameAsLoad = fSameAsLoad;
m_lpObj->m_fNoScribbleMode = TRUE;
return ResultFromScode( S_OK );
}
//**********************************************************************
//
// CPersistStorage::SaveCompleted
//
// Purpose:
//
// Called when the container is finished saving the object
//
// Parameters:
//
// LPSTORAGE pStgNew - ptr to the new storage
//
// Return Value:
//
// S_OK
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
//
//
//********************************************************************
STDMETHODIMP CPersistStorage::SaveCompleted ( LPSTORAGE pStgNew)
{
TestDebugOut(TEXT("In CPersistStorage::SaveCompleted\r\n"));
if (pStgNew)
{
ReleaseStreamsAndStorage();
m_lpObj->m_lpStorage = pStgNew;
m_lpObj->m_lpStorage->AddRef();
OpenStreams(pStgNew);
}
/* OLE2NOTE: it is only legal to perform a Save or SaveAs operation
** on an embedded object. if the document is a file-based document
** then we can not be changed to a IStorage-base object.
**
** fSameAsLoad lpStgNew Type of Save Send OnSave
** ---------------------------------------------------------
** TRUE NULL SAVE YES
** TRUE ! NULL SAVE * YES
** FALSE ! NULL SAVE AS YES
** FALSE NULL SAVE COPY AS NO
**
** * this is a strange case that is possible. it is inefficient
** for the caller; it would be better to pass lpStgNew==NULL for
** the Save operation.
*/
if ( pStgNew || m_lpObj->m_fSaveWithSameAsLoad)
{
if (m_lpObj->m_fNoScribbleMode)
if (
m_lpObj->GetOleAdviseHolder()->SendOnSave()!=S_OK
// normally would clear a
// dirty bit
)
TestDebugOut(TEXT("SendOnSave fails\n"));
m_lpObj->m_fSaveWithSameAsLoad = FALSE;
}
m_lpObj->m_fNoScribbleMode = FALSE;
return ResultFromScode( S_OK );
}
//**********************************************************************
//
// CPersistStorage::Load
//
// Purpose:
//
// Instructs the object to be loaded from storage.
//
// Parameters:
//
// LPSTORAGE pStg - Ptr to the storage in which to be loaded
//
// Return Value:
//
// S_OK
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// CSimpSvrObj::LoadFromStorage OBJ.CPP
//
//
// Comments:
//
// A real app will want better error checking in this method.
//
//********************************************************************
STDMETHODIMP CPersistStorage::Load ( LPSTORAGE pStg)
{
TestDebugOut(TEXT("In CPersistStorage::Load\r\n"));
// remember the storage
if (m_lpObj->m_lpStorage)
{
m_lpObj->m_lpStorage->Release();
m_lpObj->m_lpStorage = NULL;
}
m_lpObj->m_lpStorage = pStg;
m_lpObj->m_lpStorage->AddRef();
OpenStreams(m_lpObj->m_lpStorage);
m_lpObj->LoadFromStorage();
return ResultFromScode( S_OK );
}
//**********************************************************************
//
// CPersistStorage::IsDirty
//
// Purpose:
//
// Returns whether or not the object is dirty w/respect to its
// Storage
//
// Parameters:
//
// None
//
// Return Value:
// S_OK
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
//
//
// Comments:
//
// This sample does not implement this function, although a
// real application should.
//
//********************************************************************
STDMETHODIMP CPersistStorage::IsDirty()
{
TestDebugOut(TEXT("In CPersistStorage::IsDirty\r\n"));
return ResultFromScode( S_OK );
}
//**********************************************************************
//
// CPersistStorage::HandsOffStorage
//
// Purpose:
//
// Forces the object to release its handle to its storage.
//
// Parameters:
//
// None
//
// Return Value:
//
// S_OK
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// IStorage::Release OLE
//
//********************************************************************
STDMETHODIMP CPersistStorage::HandsOffStorage ()
{
TestDebugOut(TEXT("In CPersistStorage::HandsOffStorage\r\n"));
ReleaseStreamsAndStorage();
return ResultFromScode( S_OK );
}
//**********************************************************************
//
// CPersistStorage::CreateStreams
//
// Purpose:
//
// Creates the streams that are held open for the object's lifetime.
//
// Parameters:
//
// LPSTORAGE lpStg - Storage in which to create the streams
//
// Return Value:
//
// none
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// IStorage::Release OLE
// IStream::Release OLE
// IStorage::CreateStream OLE
//
//
//********************************************************************
void CPersistStorage::CreateStreams(LPSTORAGE lpStg)
{
if (m_lpObj->m_lpColorStm)
m_lpObj->m_lpColorStm->Release();
if (m_lpObj->m_lpSizeStm)
m_lpObj->m_lpSizeStm->Release();
// create a stream to save the colors
if (
lpStg->CreateStream ( OLESTR("RGB"),
STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
0,
0,
&m_lpObj->m_lpColorStm)
!=S_OK
)
TestDebugOut(TEXT("CreateStreams fails\n"));
// create a stream to save the size
if (
lpStg->CreateStream ( OLESTR("size"),
STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
0,
0,
&m_lpObj->m_lpSizeStm)
!=S_OK
)
TestDebugOut(TEXT("CreateStreams fails\n"));
}
//**********************************************************************
//
// CPersistStorage::OpenStreams
//
// Purpose:
//
// Opens the streams in a storage.
//
// Parameters:
//
// LPSTORAGE lpStg - Storage in which to open the streams.
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// IStream::Release OLE
// IStorage::OpenStream OLE
//
//
//********************************************************************
void CPersistStorage::OpenStreams(LPSTORAGE lpStg)
{
if (m_lpObj->m_lpColorStm)
m_lpObj->m_lpColorStm->Release();
if (m_lpObj->m_lpSizeStm)
m_lpObj->m_lpSizeStm->Release();
// open the color stream
if (
lpStg->OpenStream ( OLESTR("RGB"),
0,
STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
0,
&m_lpObj->m_lpColorStm)
!=S_OK
)
TestDebugOut(TEXT("OpenStream fails\n"));
// open the color stream
if (
lpStg->OpenStream ( OLESTR("size"),
0,
STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
0,
&m_lpObj->m_lpSizeStm)
!=S_OK
)
TestDebugOut(TEXT("OpenStream fails\n"));
}
//**********************************************************************
//
// CPersistStorage::ReleaseStreamsAndStorage
//
// Purpose:
//
// Releases the stream and storage ptrs
//
// Parameters:
//
// None
//
// Return Value:
// None
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// IStream::Release OLE
// IStorage::Release OLE
//
//********************************************************************
void CPersistStorage::ReleaseStreamsAndStorage()
{
if (m_lpObj->m_lpColorStm)
{
m_lpObj->m_lpColorStm->Release();
m_lpObj->m_lpColorStm = NULL;
}
if (m_lpObj->m_lpSizeStm)
{
m_lpObj->m_lpSizeStm->Release();
m_lpObj->m_lpSizeStm = NULL;
}
if (m_lpObj->m_lpStorage)
{
m_lpObj->m_lpStorage->Release();
m_lpObj->m_lpStorage = NULL;
}
}
//**********************************************************************
//
// CPersistStorage::CreateStreams
//
// Purpose:
//
// Creates temporary streams in a storage.
//
// Parameters:
//
// LPSTORAGE lpStg - Pointer to the storage
//
// LPSTREAM FAR* lplpTempColor - Color Stream
//
// LPSTREAM FAR* lplpTempSize - Size Stream
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// IStorage::Release OLE
//
//
//********************************************************************
void CPersistStorage::CreateStreams(LPSTORAGE lpStg,
LPSTREAM FAR* lplpTempColor,
LPSTREAM FAR* lplpTempSize)
{
// create a stream to save the colors
if (
lpStg->CreateStream ( OLESTR("RGB"),
STGM_READWRITE | STGM_SHARE_EXCLUSIVE |
STGM_CREATE,
0,
0,
lplpTempColor)
!=S_OK
)
TestDebugOut(TEXT("CreateStreams fails\n"));
// create a stream to save the size
if (
lpStg->CreateStream ( OLESTR("size"),
STGM_READWRITE | STGM_SHARE_EXCLUSIVE |
STGM_CREATE,
0,
0,
lplpTempSize)
!=S_OK
)
TestDebugOut(TEXT("CreateStreams fails\n"));
}