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