windows-nt/Source/XPSP1/NT/net/mmc/common/xstream.cpp
2020-09-26 16:20:57 +08:00

418 lines
9.3 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
/**********************************************************************/
/*
xstream.cpp
FILE HISTORY:
*/
#include "stdafx.h"
#include "tfschar.h"
#include "xstream.h"
/*!--------------------------------------------------------------------------
XferStream::XferStream
-
Author: KennT
---------------------------------------------------------------------------*/
XferStream::XferStream(IStream *pstm, Mode mode)
{
m_spstm.Set(pstm);
m_mode = mode;
m_dwSize = 0;
}
/*!--------------------------------------------------------------------------
XferStream::XferDWORD
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT XferStream::XferDWORD(ULONG ulId, DWORD *pdwData)
{
ULONG id;
HRESULT hr = hrOK;
CORg( _XferObjectId(&ulId) );
Assert( XFER_TYPE_FROM_TAG(ulId) == XFER_DWORD );
if (XFER_TYPE_FROM_TAG(ulId) != XFER_DWORD)
return E_INVALIDARG;
CORg( _XferDWORD(pdwData) );
Error:
return hr;
}
/*!--------------------------------------------------------------------------
XferStream::XferCString
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT XferStream::XferCString(ULONG ulId, CString *pstData)
{
HRESULT hr = hrOK;
ULONG cbLength;
LPWSTR pswzData;
CORg( _XferObjectId(&ulId) );
Assert( XFER_TYPE_FROM_TAG(ulId) == XFER_STRING );
if (XFER_TYPE_FROM_TAG(ulId) != XFER_STRING)
return E_INVALIDARG;
CORg( _XferCString(pstData) );
Error:
return hr;
}
/*!--------------------------------------------------------------------------
XferStream::XferLARGEINTEGER
-
Author: EricDav
---------------------------------------------------------------------------*/
HRESULT XferStream::XferLARGEINTEGER(ULONG ulId, LARGE_INTEGER *pliData)
{
ULONG id;
HRESULT hr = hrOK;
CORg( _XferObjectId(&ulId) );
Assert( XFER_TYPE_FROM_TAG(ulId) == XFER_LARGEINTEGER );
if (XFER_TYPE_FROM_TAG(ulId) != XFER_LARGEINTEGER)
return E_INVALIDARG;
CORg( _XferDWORD(&pliData->LowPart) );
CORg( _XferLONG(&pliData->HighPart) );
Error:
return hr;
}
/*!--------------------------------------------------------------------------
XferStream::XferDWORDArray
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT XferStream::XferDWORDArray(ULONG ulId, ULONG *pcArray, DWORD *pdwArray)
{
HRESULT hr = hrOK;
ULONG i;
CORg( _XferObjectId(&ulId) );
Assert( XFER_TYPE_FROM_TAG(ulId) == XFER_DWORD_ARRAY );
if (XFER_TYPE_FROM_TAG(ulId) != XFER_DWORD_ARRAY)
return E_INVALIDARG;
CORg( _XferDWORD(pcArray) );
for (i=0; i<*pcArray; i++)
{
// Xfer each dword
hr = _XferDWORD(pdwArray+i);
if (!FHrSucceeded(hr))
break;
}
Error:
return hr;
}
/*!--------------------------------------------------------------------------
XferStream::XferCStringArray
-
Author: EricDav
---------------------------------------------------------------------------*/
HRESULT XferStream::XferCStringArray(ULONG ulId, CStringArray *pstrArray)
{
HRESULT hr = hrOK;
ULONG i, cArray;
LPWSTR pswzData;
CORg( _XferObjectId(&ulId) );
Assert( XFER_TYPE_FROM_TAG(ulId) == XFER_STRING_ARRAY );
if (XFER_TYPE_FROM_TAG(ulId) != XFER_STRING_ARRAY)
return E_INVALIDARG;
if (m_mode == XferStream::MODE_WRITE)
{
cArray = (ULONG)pstrArray->GetSize();
}
CORg( _XferDWORD(&cArray) );
if (m_mode == XferStream::MODE_READ)
{
pstrArray->SetSize(cArray);
}
for (i = 0; i < cArray; i++)
{
_XferCString( &((*pstrArray)[i]) );
if (!FHrSucceeded(hr))
break;
}
Error:
return hr;
}
/*!--------------------------------------------------------------------------
XferStream::XferDWORDArray
-
Author: EricDav
---------------------------------------------------------------------------*/
HRESULT XferStream::XferDWORDArray(ULONG ulId, CDWordArray * pdwArray)
{
HRESULT hr = hrOK;
ULONG i, cArray;
CORg( _XferObjectId(&ulId) );
Assert( XFER_TYPE_FROM_TAG(ulId) == XFER_DWORD_ARRAY );
if (XFER_TYPE_FROM_TAG(ulId) != XFER_DWORD_ARRAY)
return E_INVALIDARG;
if (m_mode == XferStream::MODE_WRITE)
{
cArray = (ULONG)pdwArray->GetSize();
}
CORg( _XferDWORD(&cArray) );
if (m_mode == XferStream::MODE_READ)
{
pdwArray->SetSize(cArray);
}
for (i = 0; i < cArray; i++)
{
// Xfer each dword
hr = _XferDWORD( &((*pdwArray)[i]) );
if (!FHrSucceeded(hr))
break;
}
Error:
return hr;
}
/*!--------------------------------------------------------------------------
XferStream::_XferObjectId
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT XferStream::_XferObjectId(ULONG *pulId)
{
ULONG id = 0;
HRESULT hr = hrOK;
if (m_mode == XferStream::MODE_WRITE)
id = *pulId;
hr = _XferDWORD(&id);
*pulId = id;
return hr;
}
/*!--------------------------------------------------------------------------
XferStream::_XferDWORD
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT XferStream::_XferDWORD(DWORD *pdw)
{
ULONG cbBytes;
HRESULT hr = hrOK;
switch (m_mode)
{
case XferStream::MODE_READ:
hr = m_spstm->Read(pdw, sizeof(DWORD), &cbBytes);
Assert(cbBytes == sizeof(DWORD));
if (cbBytes != sizeof(DWORD))
hr = E_FAIL;
break;
case XferStream::MODE_WRITE:
hr = m_spstm->Write(pdw, sizeof(DWORD), &cbBytes);
Assert(cbBytes == sizeof(DWORD));
break;
case XferStream::MODE_SIZE:
m_dwSize += sizeof(DWORD);
break;
default:
hr = E_INVALIDARG;
Panic1("Unknown XferStream mode! %d\n", m_mode);
break;
}
return hr;
}
/*!--------------------------------------------------------------------------
XferStream::_XferLONG
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT XferStream::_XferLONG(LONG * pdl)
{
return _XferDWORD((DWORD *) pdl);
}
/*!--------------------------------------------------------------------------
XferStream::_XferCString
-
Author: EricDav
---------------------------------------------------------------------------*/
HRESULT XferStream::_XferCString(CString * pstData)
{
HRESULT hr = hrOK;
ULONG cbLength;
LPWSTR pswzData;
Assert(pstData);
switch (m_mode)
{
case XferStream::MODE_READ:
hr = _XferDWORD(&cbLength);
if (FHrSucceeded(hr))
{
pswzData = (LPWSTR) alloca(cbLength);
hr = _XferBytes((LPBYTE) pswzData, cbLength);
if (FHrSucceeded(hr))
*pstData = W2CT(pswzData);
}
break;
case XferStream::MODE_SIZE:
case XferStream::MODE_WRITE:
cbLength = (pstData->GetLength()+1) * sizeof(WCHAR);
// round the length up to a multiple of 4
cbLength = (cbLength + 3) & 0xFFFFFFFC;
hr = _XferDWORD(&cbLength);
if (FHrSucceeded(hr))
{
pswzData = (LPWSTR) alloca(cbLength);
StrCpyWFromT(pswzData, (LPCTSTR) *pstData);
hr = _XferBytes((LPBYTE) pswzData, cbLength);
}
break;
default:
hr = E_INVALIDARG;
Panic1("Unknown XferStream mode! %d\n", m_mode);
break;
}
return hr;
}
/*!--------------------------------------------------------------------------
XferStream::_XferBytes
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT XferStream::_XferBytes(LPBYTE pData, ULONG cbLength)
{
ULONG cbBytes;
HRESULT hr = hrOK;
switch (m_mode)
{
case XferStream::MODE_READ:
hr = m_spstm->Read(pData, cbLength, &cbBytes);
Assert(cbBytes == cbLength);
break;
case XferStream::MODE_WRITE:
hr = m_spstm->Write(pData, cbLength, &cbBytes);
Assert(cbBytes == cbLength);
break;
case XferStream::MODE_SIZE:
m_dwSize += cbLength;
break;
default:
hr = E_INVALIDARG;
Panic1("Unknown XferStream mode! %d\n", m_mode);
break;
}
return hr;
}
/*!--------------------------------------------------------------------------
XferStream::XferColumnData
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT XferStream::XferColumnData(ULONG ulId, ULONG *pcData, ColumnData *pData)
{
HRESULT hr = hrOK;
ULONG i;
CORg( _XferObjectId(&ulId) );
Assert( XFER_TYPE_FROM_TAG(ulId) == XFER_COLUMNDATA_ARRAY );
if (XFER_TYPE_FROM_TAG(ulId) != XFER_COLUMNDATA_ARRAY)
return E_INVALIDARG;
CORg( _XferDWORD(pcData) );
for (i=0; i<*pcData; i++)
{
// Xfer each dword
hr = _XferLONG(&(pData[i].m_nPosition));
Assert(pData[i].m_nPosition != 0);
if (FHrSucceeded(hr))
hr = _XferDWORD(&(pData[i].m_dwWidth));
if (!FHrSucceeded(hr))
break;
}
Error:
return hr;
}
/*!--------------------------------------------------------------------------
XferStream::XferRect
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT XferStream::XferRect(ULONG ulId, RECT *prc)
{
HRESULT hr = hrOK;
CORg( _XferObjectId(&ulId) );
Assert( XFER_TYPE_FROM_TAG(ulId) == XFER_RECT );
if (XFER_TYPE_FROM_TAG(ulId) != XFER_RECT)
return E_INVALIDARG;
CORg( _XferDWORD((DWORD *) &(prc->top)) );
CORg( _XferDWORD((DWORD *) &(prc->left)) );
CORg( _XferDWORD((DWORD *) &(prc->bottom)) );
CORg( _XferDWORD((DWORD *) &(prc->right)) );
Error:
return hr;
}