Leaked source code of windows server 2003
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.
 
 
 
 
 
 

266 lines
5.9 KiB

//
// Microsoft Windows Media Technologies
// Copyright (C) Microsoft Corporation, 1999 - 2001. All rights reserved.
//
//
// OperationHelper.cpp : Implementation of COperationHelper
//
#include "progPCH.h"
#include "ProgHelp.h"
#include "Sac.h"
#include "SCClient.h"
#include "OperationHelper.h"
#include "StrSafe.h"
//
// Constructor/Destructor
//
COperationHelper::COperationHelper()
{
m_eStatus = E_OPERATION_NOTHING;
m_hFile = INVALID_HANDLE_VALUE;
memset( m_pszFileName, __T('\0'), MAX_PATH * sizeof( TCHAR ) ); //memset is fine; sizeof arg1 == sizeof arg3
m_pSACClient = NULL;
}
COperationHelper::~COperationHelper()
{
if( m_hFile != INVALID_HANDLE_VALUE )
{
CloseHandle(m_hFile);
}
}
//
// IWMDMOperation
//
// IWMDMOperation::BeginRead
//
HRESULT COperationHelper::BeginRead()
{
// m_eStatus = E_OPERATION_RECEIVING;
return E_NOTIMPL;
}
// IWMDMOperation::BeginWrite
// Start sending data
HRESULT COperationHelper::BeginWrite()
{
m_eStatus = E_OPERATION_SENDING;
if( _tcslen( m_pszFileName ) == 0 )
{
return E_FAIL;
}
m_hFile = CreateFile( m_pszFileName, // file name
GENERIC_READ, // access mode
FILE_SHARE_READ, // share mode
NULL, // SD
OPEN_EXISTING, // how to create
FILE_ATTRIBUTE_NORMAL, // file attributes
NULL ); // handle to template file
if( m_hFile == INVALID_HANDLE_VALUE )
{
return E_FAIL;
}
return S_OK;
}
// IWMDMOperation::GetObjectName
//
HRESULT COperationHelper::GetObjectName(LPWSTR pwszName, UINT nMaxChars)
{
USES_CONVERSION;
TCHAR* pszNoPath;
if (pwszName == NULL)
{
return E_POINTER;
}
if (nMaxChars == 0)
{
return E_INVALIDARG;
}
if( m_pszFileName == NULL || _tcslen( m_pszFileName ) == 0 )
{
return E_FAIL;
}
pszNoPath = _tcsrchr( m_pszFileName, __T('\\') );
if( pszNoPath == NULL ) pszNoPath = m_pszFileName;
else pszNoPath++;
WCHAR* wcp = A2W(pszNoPath);
return HRESULT_CODE(StringCchCopyW(pwszName, nMaxChars, wcp));
}
// IWMDMOperation::SetObjectName
//
HRESULT COperationHelper::SetObjectName(LPWSTR pwszName, UINT nMaxChars)
{
return E_NOTIMPL;
}
// IWMDMOperation::GetObjectAttributes
//
HRESULT COperationHelper::GetObjectAttributes(DWORD *pdwAttributes, _WAVEFORMATEX *pFormat)
{
DWORD dwAttrib;
USES_CONVERSION;
if( pdwAttributes == NULL ) return E_INVALIDARG;
if( _tcslen( m_pszFileName ) == 0 ) return E_FAIL;
dwAttrib = GetFileAttributes(m_pszFileName);
*pdwAttributes = 0;
if( dwAttrib & FILE_ATTRIBUTE_DIRECTORY )
*pdwAttributes |= WMDM_FILE_ATTR_FOLDER;
else
*pdwAttributes |= WMDM_FILE_ATTR_FILE;
*pdwAttributes |= WMDM_FILE_CREATE_OVERWRITE;
return S_OK;
}
// IWMDMOperation::SetObjectAttributes
//
HRESULT COperationHelper::SetObjectAttributes(DWORD dwAttributes, _WAVEFORMATEX *pFormat)
{
return E_NOTIMPL;
}
// IWMDMOperation::GetObjectTotalSize
//
HRESULT COperationHelper::GetObjectTotalSize(DWORD *pdwSize, DWORD *pdwHighSize)
{
if( pdwSize == NULL || m_hFile == INVALID_HANDLE_VALUE )
{
return E_INVALIDARG;
}
*pdwSize = GetFileSize(m_hFile, pdwHighSize );
return S_OK;
}
// IWMDMOperation::SetObjectTotalSize
//
HRESULT COperationHelper::SetObjectTotalSize(DWORD dwSize, DWORD dwHighSize)
{
return E_NOTIMPL;
}
// IWMDMOperation::TransferObjectData
//
HRESULT COperationHelper::TransferObjectData(BYTE *pData,DWORD *pdwSize, BYTE *pbMac)
{
DWORD dwReadLen;
DWORD dwMacVerifyLen = WMDM_MAC_LENGTH;
DWORD dwMacLen = WMDM_MAC_LENGTH;
if( pData == NULL || pdwSize == NULL || pbMac == NULL )
{
return E_INVALIDARG;
}
if( m_eStatus != E_OPERATION_SENDING && m_eStatus != E_OPERATION_RECEIVING )
{
return E_FAIL;
}
// Sending
if( m_eStatus == E_OPERATION_SENDING )
{
if( m_pSACClient == NULL )
{
return E_FAIL;
}
dwReadLen = *pdwSize;
if( ReadFile(m_hFile, pData, dwReadLen, pdwSize, NULL) == FALSE )
{
return E_FAIL;
}
HMAC hMAC;
// Create the MAC to return to caller
m_pSACClient->MACInit(&hMAC);
m_pSACClient->MACUpdate(hMAC, (BYTE*)(pData), *pdwSize);
m_pSACClient->MACUpdate(hMAC, (BYTE*)(pdwSize), sizeof(DWORD));
m_pSACClient->MACFinal(hMAC, (BYTE*)pbMac);
m_pSACClient->EncryptParam((BYTE*)(pData), *pdwSize);
}
// Receiving
else
{
return E_NOTIMPL;
}
return S_OK;
}
// IWMDMOperation::End
//
HRESULT COperationHelper::End(HRESULT *phCompletionCode, IUnknown *pNewObject)
{
m_eStatus = E_OPERATION_NOTHING;
CloseHandle(m_hFile);
m_hFile = INVALID_HANDLE_VALUE;
return S_OK;
}
//
// IWMDMOperation
//
// IWMDMOperation::SetFileName
//
STDMETHODIMP COperationHelper::SetFileName(LPWSTR pwszFileName)
{
USES_CONVERSION;
if (pwszFileName == NULL)
{
return E_POINTER;
}
if (pwszFileName[0] == L'\0')
{
return E_INVALIDARG;
}
return HRESULT_CODE(StringCbCopy(m_pszFileName, sizeof(m_pszFileName), W2T(pwszFileName)));
}
// IWMDMOperation::SetSAC
// Passing pointer to CSecureChannelClient object
STDMETHODIMP COperationHelper::SetSAC( void* pSACClient)
{
if( pSACClient == NULL )
{
return E_INVALIDARG;
}
if( m_pSACClient != NULL )
{
return E_FAIL;
}
m_pSACClient = (CSecureChannelClient*)pSACClient;
return S_OK;
}