/*****************************************************************************\
* MODULE: stream.cxx
*
* The module contains the stream interface for file and memory access
*
* Copyright (C) 1997-1998 Microsoft Corporation
*
* History:
*   09/20/00    Weihaic     Created
*
\*****************************************************************************/


#include "precomp.h"
#include "priv.h"

CStream::CStream ():
   m_dwCurPos (0),
   m_bValid(FALSE)
{
}

BOOL
CStream::Reset (
    VOID) 
{
    return SetPtr(0);
}
    
BOOL
CStream::GetTotalSize (
    PDWORD  pdwSize) CONST
{
    BOOL bRet = FALSE;

    if (m_bValid && pdwSize) {
        *pdwSize = m_dwTotalSize;

        bRet = TRUE;
    }

    return bRet;
}
    
CMemStream::CMemStream (
    PBYTE pMem,
    DWORD dwTotalSize):
    m_pMem (pMem)
{
    m_dwTotalSize = dwTotalSize;
    m_bValid = TRUE;
}
    
        
BOOL
CMemStream::SetPtr (
    DWORD dwPos)
{
    BOOL bRet = FALSE;

    if (m_dwCurPos < m_dwTotalSize)
    {
        m_dwCurPos = dwPos;
        bRet = TRUE;
    }

    return bRet;
}
        
BOOL
CMemStream::Read (
    PBYTE   pBuf,
    DWORD   dwBufSize,
    PDWORD  pdwSizeRead)
{
    DWORD dwSizeLeft = m_dwTotalSize - m_dwCurPos;

    *pdwSizeRead = (dwSizeLeft > dwBufSize)?dwBufSize:dwSizeLeft;

    CopyMemory (pBuf, m_pMem + m_dwCurPos, *pdwSizeRead);

    return TRUE;
}



CFileStream::CFileStream (
    HANDLE hFile):
    m_hFile (hFile)
{
    BOOL bRet = FALSE;
    LARGE_INTEGER LargeSize; 

    if (GetFileSizeEx (m_hFile, &LargeSize) && LargeSize.HighPart == 0) {
        m_dwTotalSize = LargeSize.LowPart;
        bRet = TRUE;
    }
    
    m_bValid = bRet;
}
    
BOOL
CFileStream::SetPtr (
    DWORD dwPos)
{
    BOOL bRet = FALSE;
    LARGE_INTEGER LargePos; 

    LargePos.LowPart = dwPos;
    LargePos.HighPart = 0;

    if (m_bValid) {
        
        if (SetFilePointerEx (m_hFile, LargePos, NULL, FILE_BEGIN)) {
            m_dwCurPos = dwPos;
            bRet = TRUE;
        }
    }
    return bRet;
}
        
BOOL
CFileStream::Read (
    PBYTE   pBuf,
    DWORD   dwBufSize,
    PDWORD  pdwSizeRead)
{
    BOOL bRet = FALSE;
    
    if (m_bValid) {

        if (ReadFile (m_hFile, pBuf, dwBufSize, pdwSizeRead, NULL)) {
            m_dwCurPos+= *pdwSizeRead;
            bRet = TRUE;
        }

    }
    return bRet;
}