/**********************************************************************/ /** 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; }