124 lines
3 KiB
C
124 lines
3 KiB
C
|
/*--------------------------------------------------------------------------*
|
||
|
*
|
||
|
* Microsoft Windows
|
||
|
* Copyright (C) Microsoft Corporation, 1999 - 1999
|
||
|
*
|
||
|
* File: serial.h
|
||
|
*
|
||
|
* Contents: Object serialization class definitions
|
||
|
*
|
||
|
* History: 11-Feb-99 vivekj Created
|
||
|
*
|
||
|
*--------------------------------------------------------------------------*/
|
||
|
|
||
|
#pragma once
|
||
|
#ifndef SERIAL_H
|
||
|
#define SERIAL_H
|
||
|
|
||
|
/*+-------------------------------------------------------------------------*
|
||
|
* class CSerialObject
|
||
|
*
|
||
|
*
|
||
|
* PURPOSE: Base class for objects that can be serialized.
|
||
|
*
|
||
|
*+-------------------------------------------------------------------------*/
|
||
|
class CSerialObject
|
||
|
{
|
||
|
public:
|
||
|
HRESULT Read (IStream &stm);
|
||
|
|
||
|
protected: // implemented by the derived class
|
||
|
// virtual CStr GetName() =0;
|
||
|
virtual UINT GetVersion() =0;
|
||
|
|
||
|
// return values for ReadSerialObject: S_OK: succeeded, S_FALSE: unknown version
|
||
|
// E_UNEXPECTED: catastrophic error.
|
||
|
virtual HRESULT ReadSerialObject (IStream &stm, UINT nVersion /*,LARGE_INTEGER nBytes*/) = 0;
|
||
|
};
|
||
|
|
||
|
/*+-------------------------------------------------------------------------*
|
||
|
* class CSerialObjectRW
|
||
|
*
|
||
|
*
|
||
|
* PURPOSE: Provided to separate from CSerialObject the "Write" functionality
|
||
|
* which is much less frequently used
|
||
|
*
|
||
|
*+-------------------------------------------------------------------------*/
|
||
|
class CSerialObjectRW : public CSerialObject
|
||
|
{
|
||
|
public:
|
||
|
HRESULT Write(IStream &stm);
|
||
|
|
||
|
protected: // implemented by the derived class
|
||
|
|
||
|
virtual HRESULT WriteSerialObject(IStream &stm) = 0;
|
||
|
};
|
||
|
|
||
|
//############################################################################
|
||
|
//############################################################################
|
||
|
//
|
||
|
// template functions - std::list class
|
||
|
//
|
||
|
//############################################################################
|
||
|
//############################################################################
|
||
|
template<class T, class Al>
|
||
|
HRESULT Read(IStream& stm, std::list<T, Al>& l)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
try
|
||
|
{
|
||
|
int cSize;
|
||
|
stm >> cSize;
|
||
|
|
||
|
for(int i=0 ; i<cSize; i++)
|
||
|
{
|
||
|
T t;
|
||
|
hr = t.Read(stm); // read the underlying object
|
||
|
BREAK_ON_FAIL (hr);
|
||
|
|
||
|
l.push_back(t); // add it to the list
|
||
|
}
|
||
|
}
|
||
|
catch (_com_error& err)
|
||
|
{
|
||
|
hr = err.Error();
|
||
|
ASSERT (false && "Caught _com_error");
|
||
|
}
|
||
|
|
||
|
return (hr);
|
||
|
}
|
||
|
|
||
|
template<class T, class Al>
|
||
|
HRESULT Write(IStream& stm, std::list<T, Al>& l)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
try
|
||
|
{
|
||
|
int cSize = l.size();
|
||
|
|
||
|
// write out the length
|
||
|
stm << cSize;
|
||
|
|
||
|
// write out the members
|
||
|
for(std::list<T, Al>::iterator it = l.begin(); it != l.end(); ++it)
|
||
|
{
|
||
|
hr = it->Write (stm);
|
||
|
BREAK_ON_FAIL (hr);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
catch (_com_error& err)
|
||
|
{
|
||
|
hr = err.Error();
|
||
|
ASSERT (false && "Caught _com_error");
|
||
|
}
|
||
|
|
||
|
return (hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
#endif // SERIAL_H
|