Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

253 lines
5.4 KiB

// EmFile.cpp : Implementation of CEmFile
#include "stdafx.h"
#include "Emsvc.h"
#include "EmFile.h"
/////////////////////////////////////////////////////////////////////////////
// CEmFile
STDMETHODIMP CEmFile::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_IEmFile
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (::InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
CEmFile::CEmFile()
{
m_hEmFile = INVALID_HANDLE_VALUE;
m_bstrFileName = NULL;
}
CEmFile::~CEmFile()
{
if( m_hEmFile != INVALID_HANDLE_VALUE ) {
CloseHandle( m_hEmFile );
m_hEmFile = INVALID_HANDLE_VALUE;
}
if( m_bstrFileName ) { SysFreeString( m_bstrFileName ); m_bstrFileName = NULL; }
}
STDMETHODIMP CEmFile::Read(void *pv, ULONG cb, ULONG *pcbRead)
{
_ASSERTE( pv != NULL );
_ASSERTE( cb != 0L );
_ASSERTE( m_hEmFile != INVALID_HANDLE_VALUE );
HRESULT hr = E_FAIL;
__try
{
if( pv == NULL || cb == 0L ) { hr = E_INVALIDARG; goto qRead; }
if( m_hEmFile == INVALID_HANDLE_VALUE ) { hr = EMERROR_OBJECTNOTINITIALIZED; goto qRead; }
if( ReadFile(
m_hEmFile,
pv,
cb,
pcbRead,
NULL
) == false ) {
hr = HRESULT_FROM_WIN32(GetLastError()); goto qRead;
}
hr = S_OK;
qRead:
if( FAILED(hr) ) {
}
}
__except ( EXCEPTION_EXECUTE_HANDLER, 1 ) {
hr = E_UNEXPECTED;
_ASSERTE( false );
}
return hr;
}
STDMETHODIMP CEmFile::Write(void const *pv, ULONG cb, ULONG *pcbWritten)
{
// TODO: Add your implementation code here
return E_NOTIMPL;
}
STDMETHODIMP CEmFile::Seek(LARGE_INTEGER dlibMove, ULONG dwOrigin, ULARGE_INTEGER *plibNewPosition)
{
// TODO: Add your implementation code here
return E_NOTIMPL;
}
STDMETHODIMP CEmFile::SetSize(ULARGE_INTEGER libNewSize)
{
// TODO: Add your implementation code here
return E_NOTIMPL;
}
STDMETHODIMP CEmFile::CopyTo(IStream *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
{
// TODO: Add your implementation code here
return E_NOTIMPL;
}
STDMETHODIMP CEmFile::Commit(DWORD grfCommitFlags)
{
// TODO: Add your implementation code here
return E_NOTIMPL;
}
STDMETHODIMP CEmFile::Revert()
{
// TODO: Add your implementation code here
return E_NOTIMPL;
}
STDMETHODIMP CEmFile::LockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
{
// TODO: Add your implementation code here
return E_NOTIMPL;
}
STDMETHODIMP CEmFile::UnlockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
{
// TODO: Add your implementation code here
return E_NOTIMPL;
}
STDMETHODIMP CEmFile::Stat(STATSTG *pstatstg, DWORD grfStatFlag)
{
// TODO: Add your implementation code here
return E_NOTIMPL;
}
STDMETHODIMP CEmFile::Clone(IStream **ppstm)
{
// TODO: Add your implementation code here
return E_NOTIMPL;
}
STDMETHODIMP CEmFile::InitFile(BSTR bstrFileName)
{
_ASSERTE( bstrFileName != NULL );
HRESULT hr = E_FAIL;
__try
{
if( bstrFileName == NULL ){ hr = E_INVALIDARG; goto qInitFile; }
m_bstrFileName = SysAllocString( bstrFileName );
_ASSERTE( m_bstrFileName != NULL );
if( m_bstrFileName == NULL ) { hr = E_OUTOFMEMORY; goto qInitFile; }
hr = CreateEmFile();
if( FAILED(hr) ) { goto qInitFile; }
hr = S_OK;
qInitFile:
if( FAILED(hr) ) {
if( m_bstrFileName ) { SysFreeString( m_bstrFileName ); m_bstrFileName = NULL; }
}
}
__except ( EXCEPTION_EXECUTE_HANDLER, 1 ) {
hr = E_UNEXPECTED;
if( m_bstrFileName ) { SysFreeString( m_bstrFileName ); m_bstrFileName = NULL; }
_ASSERTE( false );
}
return hr;
}
HRESULT
CEmFile::CreateEmFile
(
IN DWORD dwDesiredAccess /*= GENERIC_READ*/,
IN DWORD dwShareMode /*= FILE_SHARE_READ*/,
IN LPSECURITY_ATTRIBUTES lpSecurityAttributes /*= NULL*/,
IN DWORD dwCreationDisposition /*= OPEN_EXISTING*/,
IN DWORD dwFlagsAndAttributes /*= FILE_ATTRIBUTE_NORMAL*/,
IN HANDLE hTemplateFile /*= NULL*/
)
{
HRESULT hr = E_FAIL;
DWORD dwLastRet = 0L;
__try
{
m_hEmFile = ::CreateFile (
m_bstrFileName,
dwDesiredAccess,
dwShareMode,
lpSecurityAttributes,
dwCreationDisposition,
dwFlagsAndAttributes,
hTemplateFile
);
if( m_hEmFile == INVALID_HANDLE_VALUE ) {
hr = HRESULT_FROM_WIN32( GetLastError() );
goto qCreateEmFile;
}
hr = S_OK;
qCreateEmFile:
if( FAILED(hr) ) {
if( m_hEmFile != INVALID_HANDLE_VALUE ) {
CloseHandle( m_hEmFile );
m_hEmFile = INVALID_HANDLE_VALUE;
}
}
}
__except ( EXCEPTION_EXECUTE_HANDLER, 1 ) {
hr = E_UNEXPECTED;
if( m_hEmFile != INVALID_HANDLE_VALUE ) {
CloseHandle( m_hEmFile );
m_hEmFile = INVALID_HANDLE_VALUE;
}
_ASSERTE( false );
}
return hr;
}