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.
356 lines
7.8 KiB
356 lines
7.8 KiB
#include "stdafx.h"
|
|
#include "storageglobals.h"
|
|
#include "device.h"
|
|
#include "storage.h"
|
|
//#include "findleak.h"
|
|
|
|
//DECLARE_THIS_FILE;
|
|
|
|
//
|
|
// Initializtion
|
|
//
|
|
|
|
CStorageGlobals::CStorageGlobals()
|
|
{
|
|
memset(m_szStartPath, 0, sizeof(m_szStartPath) );
|
|
}
|
|
|
|
HRESULT CStorageGlobals::Init(LPCWSTR szStartPath, IMDSPDevice *pDevice)
|
|
{
|
|
DWORD dwAttrib;
|
|
if( NULL == szStartPath || NULL == pDevice)
|
|
{
|
|
return( E_INVALIDARG );
|
|
}
|
|
|
|
HRESULT hr = StringCbCopyW(m_szStartPath, sizeof(m_szStartPath), szStartPath);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
hr = HRESULT_FROM_WIN32(HRESULT_CODE(hr));
|
|
}
|
|
else
|
|
{
|
|
if( wcslen(m_szStartPath) > 1 )
|
|
{
|
|
LPWSTR szChop = wcschr( &m_szStartPath[1], L'\\' );
|
|
if( szChop )
|
|
{
|
|
WCHAR chSave = *szChop;
|
|
*szChop = _T('\0');
|
|
|
|
dwAttrib = CeGetFileAttributes( m_szStartPath );
|
|
if( ! ( ( dwAttrib & FILE_ATTRIBUTE_DIRECTORY ) &&
|
|
( dwAttrib & FILE_ATTRIBUTE_TEMPORARY ) ) )
|
|
{
|
|
m_szStartPath[1] = L'\0';
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dwAttrib = CeGetFileAttributes( m_szStartPath );
|
|
if( ! ( ( dwAttrib & FILE_ATTRIBUTE_DIRECTORY ) &&
|
|
( dwAttrib & FILE_ATTRIBUTE_TEMPORARY ) ) )
|
|
{
|
|
m_szStartPath[1] = L'\0';
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_szStartPath[1] = L'\0';
|
|
}
|
|
|
|
m_spDevice = pDevice;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//
|
|
// IMDSPStorageGloabls
|
|
//
|
|
|
|
STDMETHODIMP CStorageGlobals::GetCapabilities ( DWORD *pdwCapabilities )
|
|
{
|
|
if( NULL == pdwCapabilities )
|
|
{
|
|
return( E_INVALIDARG );
|
|
}
|
|
|
|
*pdwCapabilities = WMDM_STORAGECAP_FOLDERSINROOT | WMDM_STORAGECAP_FILESINROOT | WMDM_STORAGECAP_FOLDERSINFOLDERS | WMDM_STORAGECAP_FILESINFOLDERS;
|
|
|
|
return( S_OK );
|
|
}
|
|
|
|
STDMETHODIMP CStorageGlobals::GetSerialNumber ( PWMDMID pSerialNum, BYTE abMac[ 20 ] )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = CeUtilGetSerialNumber( m_szStartPath, pSerialNum, NULL, 0 );
|
|
|
|
if( hr == S_OK )
|
|
{
|
|
// MAC the parameters
|
|
HMAC hMAC;
|
|
hr = g_pAppSCServer->MACInit(&hMAC);
|
|
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
hr = g_pAppSCServer->MACUpdate(hMAC, (BYTE*)(pSerialNum), sizeof(WMDMID));
|
|
}
|
|
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
hr = g_pAppSCServer->MACFinal(hMAC, abMac);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = WMDM_E_NOTSUPPORTED;
|
|
}
|
|
|
|
return( hr );
|
|
}
|
|
|
|
STDMETHODIMP CStorageGlobals::GetTotalSize ( DWORD *pdwFreeLow, DWORD *pdwFreeHigh )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
WCHAR wszTestPath[MAX_PATH];
|
|
LPCWSTR pszTestPath = wszTestPath;
|
|
|
|
memset( wszTestPath, 0, sizeof(wszTestPath) );
|
|
|
|
if( wcslen( m_szStartPath ) > 1 )
|
|
{
|
|
_snwprintf( wszTestPath, sizeof(wszTestPath)/sizeof(wszTestPath[0]) - 1, L"%s\\", m_szStartPath );
|
|
}
|
|
else
|
|
{
|
|
pszTestPath = m_szStartPath;
|
|
}
|
|
|
|
ULARGE_INTEGER liAvailFree;
|
|
ULARGE_INTEGER liTotalBytes;
|
|
ULARGE_INTEGER liTotalFree;
|
|
|
|
liAvailFree.QuadPart = 0;
|
|
liTotalBytes.QuadPart = 0;
|
|
liTotalFree.QuadPart = 0;
|
|
|
|
if( NULL != pdwFreeLow )
|
|
{
|
|
*pdwFreeLow = 0;
|
|
}
|
|
|
|
if( NULL != pdwFreeHigh )
|
|
{
|
|
*pdwFreeHigh = 0;
|
|
}
|
|
|
|
hr = CeGetDiskFreeSpaceEx( pszTestPath, &liAvailFree, &liTotalBytes, &liTotalFree );
|
|
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
if( NULL != pdwFreeLow )
|
|
{
|
|
*pdwFreeLow = liTotalBytes.LowPart;
|
|
}
|
|
|
|
if( NULL != pdwFreeHigh )
|
|
{
|
|
*pdwFreeHigh = liTotalBytes.HighPart;
|
|
}
|
|
}
|
|
|
|
return( hr );
|
|
}
|
|
|
|
STDMETHODIMP CStorageGlobals::GetTotalFree ( DWORD *pdwFreeLow, DWORD *pdwFreeHigh )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
WCHAR wszTestPath[MAX_PATH];
|
|
LPCWSTR pszTestPath = wszTestPath;
|
|
|
|
memset( wszTestPath, 0, sizeof(wszTestPath) );
|
|
|
|
if( wcslen( m_szStartPath ) > 1 )
|
|
{
|
|
_snwprintf( wszTestPath, sizeof(wszTestPath)/sizeof(wszTestPath[0]) - 1, L"%s\\", m_szStartPath );
|
|
}
|
|
else
|
|
{
|
|
pszTestPath = m_szStartPath;
|
|
}
|
|
|
|
ULARGE_INTEGER liAvailFree;
|
|
ULARGE_INTEGER liTotalBytes;
|
|
ULARGE_INTEGER liTotalFree;
|
|
|
|
liAvailFree.QuadPart = 0;
|
|
liTotalBytes.QuadPart = 0;
|
|
liTotalFree.QuadPart = 0;
|
|
|
|
if( NULL != pdwFreeLow )
|
|
{
|
|
*pdwFreeLow = 0;
|
|
}
|
|
|
|
if( NULL != pdwFreeHigh )
|
|
{
|
|
*pdwFreeHigh = 0;
|
|
}
|
|
|
|
hr = CeGetDiskFreeSpaceEx( pszTestPath, &liAvailFree, &liTotalBytes, &liTotalFree );
|
|
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
if( NULL != pdwFreeLow )
|
|
{
|
|
*pdwFreeLow = liAvailFree.LowPart;
|
|
}
|
|
|
|
if( NULL != pdwFreeHigh )
|
|
{
|
|
*pdwFreeHigh = liAvailFree.HighPart;
|
|
}
|
|
}
|
|
|
|
return( hr );
|
|
}
|
|
|
|
STDMETHODIMP CStorageGlobals::GetTotalBad ( DWORD *pdwBadLow, DWORD *pdwBadHigh )
|
|
{
|
|
if( NULL != pdwBadLow )
|
|
{
|
|
*pdwBadLow = 0;
|
|
}
|
|
|
|
if( NULL != pdwBadHigh )
|
|
{
|
|
*pdwBadHigh = 0;
|
|
}
|
|
|
|
return( S_OK );
|
|
}
|
|
|
|
STDMETHODIMP CStorageGlobals::GetStatus ( DWORD *pdwStatus )
|
|
{
|
|
if( NULL == pdwStatus )
|
|
{
|
|
return( E_INVALIDARG );
|
|
}
|
|
|
|
if( _Module.g_fDeviceConnected )
|
|
{
|
|
*pdwStatus = WMDM_STATUS_READY;
|
|
}
|
|
else
|
|
{
|
|
*pdwStatus = WMDM_STATUS_STORAGE_NOTPRESENT;
|
|
}
|
|
|
|
return( S_OK );
|
|
}
|
|
|
|
STDMETHODIMP CStorageGlobals::Initialize ( UINT fuMode, IWMDMProgress *pProgress )
|
|
{
|
|
return( S_OK );
|
|
}
|
|
|
|
STDMETHODIMP CStorageGlobals::GetDevice ( IMDSPDevice * *ppDevice )
|
|
{
|
|
if( NULL == ppDevice )
|
|
{
|
|
return( E_INVALIDARG );
|
|
}
|
|
|
|
*ppDevice = m_spDevice;
|
|
if( *ppDevice )
|
|
{
|
|
(*ppDevice)->AddRef();
|
|
return( S_OK );
|
|
}
|
|
|
|
return( E_FAIL );
|
|
}
|
|
|
|
STDMETHODIMP CStorageGlobals::GetRootStorage ( IMDSPStorage * *ppRoot )
|
|
{
|
|
WCHAR wszPath[MAX_PATH];
|
|
CE_FIND_DATA findData;
|
|
CComStorage *pNewStorage = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
if( NULL == ppRoot )
|
|
{
|
|
return( E_INVALIDARG );
|
|
}
|
|
|
|
*ppRoot = NULL;
|
|
|
|
hr = CComStorage::CreateInstance( &pNewStorage );
|
|
CComPtr<IMDSPStorage> spStorage = pNewStorage;
|
|
|
|
memset( wszPath, 0, sizeof(wszPath) );
|
|
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
LPWSTR pszSlash = wcschr(&m_szStartPath[1], L'\\');
|
|
|
|
if( pszSlash )
|
|
{
|
|
wcsncpy(wszPath, m_szStartPath, (pszSlash - m_szStartPath) - 1 );
|
|
}
|
|
else
|
|
{
|
|
wcscpy(wszPath, m_szStartPath);
|
|
}
|
|
|
|
if( wcslen(wszPath) > 1 )
|
|
{
|
|
HANDLE hFind = CeFindFirstFile( wszPath, &findData );
|
|
|
|
if( INVALID_HANDLE_VALUE == hFind )
|
|
{
|
|
hr = HRESULT_FROM_WIN32( CeGetLastError() );
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
hr = CeRapiGetError();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CeFindClose( hFind );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
memset( &findData, 0, sizeof(findData) );
|
|
findData.dwFileAttributes = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_DIRECTORY;
|
|
wcscpy(findData.cFileName, L"\\");
|
|
}
|
|
}
|
|
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
if( ! ( findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) )
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
hr = pNewStorage->Init(&findData, m_szStartPath, TRUE, m_spDevice);
|
|
}
|
|
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
*ppRoot = spStorage;
|
|
spStorage.Detach();
|
|
}
|
|
|
|
return( hr );
|
|
}
|