345 lines
6.6 KiB
C++
345 lines
6.6 KiB
C++
/*++
|
|
|
|
Copyright (C) Microsoft Corporation, 1996 - 2000
|
|
|
|
Module Name:
|
|
|
|
mountmed.cpp
|
|
|
|
Abstract:
|
|
|
|
This component is an object representing a mounting media, i.e. a media in the process of mounting.
|
|
|
|
Author:
|
|
|
|
Ran Kalach [rankala] 28-Sep-2000
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "stdafx.h"
|
|
#include "mountmed.h"
|
|
|
|
static USHORT iCountMount = 0; // Count of existing objects
|
|
|
|
HRESULT
|
|
CMountingMedia::FinalConstruct(
|
|
void
|
|
)
|
|
/*++
|
|
|
|
Implements:
|
|
|
|
CComObjectRoot::FinalConstruct().
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
WsbTraceIn(OLESTR("CMountingMedia::FinalConstruct"), OLESTR(""));
|
|
|
|
m_mediaId = GUID_NULL;
|
|
m_mountEvent = NULL;
|
|
m_bReadOnly = FALSE;
|
|
|
|
iCountMount++;
|
|
|
|
WsbTraceOut(OLESTR("CMountingMedia::FinalConstruct"), OLESTR("hr = <%ls>, Count is <%d>"), WsbHrAsString(hr), (int)iCountMount);
|
|
|
|
return(hr);
|
|
}
|
|
|
|
void
|
|
CMountingMedia::FinalRelease(
|
|
void
|
|
)
|
|
/*++
|
|
|
|
Implements:
|
|
|
|
CComObjectRoot::FinalRelease().
|
|
|
|
--*/
|
|
{
|
|
WsbTraceIn(OLESTR("CMountingMedia::FinalRelease"), OLESTR(""));
|
|
|
|
// Free event handle
|
|
if (m_mountEvent != NULL) {
|
|
// Set the event (just to be on the safe side - we expect the event to be signaled at this point)
|
|
SetEvent(m_mountEvent);
|
|
|
|
CloseHandle(m_mountEvent);
|
|
m_mountEvent = NULL;
|
|
}
|
|
|
|
iCountMount--;
|
|
|
|
WsbTraceOut(OLESTR("CMountingMedia::FinalRelease"), OLESTR("Count is <%d>"), (int)iCountMount);
|
|
}
|
|
|
|
HRESULT
|
|
CMountingMedia::Init(
|
|
REFGUID mediaId,
|
|
BOOL bReadOnly
|
|
)
|
|
/*++
|
|
|
|
Implements:
|
|
|
|
IMountingMedia::Init().
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
WsbTraceIn(OLESTR("CMountingMedia::Init"), OLESTR(""));
|
|
|
|
try {
|
|
m_mediaId = mediaId;
|
|
m_bReadOnly = bReadOnly;
|
|
|
|
WsbAffirmHandle(m_mountEvent= CreateEvent(NULL, TRUE, FALSE, NULL));
|
|
|
|
} WsbCatch(hr);
|
|
|
|
WsbTraceOut(OLESTR("CMountingMedia::Init"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
|
|
|
|
return(hr);
|
|
}
|
|
|
|
HRESULT
|
|
CMountingMedia::GetMediaId(
|
|
GUID *pMediaId
|
|
)
|
|
/*++
|
|
|
|
Implements:
|
|
|
|
IMountingMedia::GetMediaId().
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
WsbTraceIn(OLESTR("CMountingMedia::GetMediaId"), OLESTR(""));
|
|
|
|
try {
|
|
WsbAffirm(0 != pMediaId, E_POINTER);
|
|
|
|
*pMediaId = m_mediaId;
|
|
|
|
} WsbCatch(hr);
|
|
|
|
WsbTraceOut(OLESTR("CMountingMedia::GetMediaId"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
|
|
|
|
return(hr);
|
|
}
|
|
|
|
HRESULT
|
|
CMountingMedia::SetMediaId(
|
|
REFGUID mediaId
|
|
)
|
|
/*++
|
|
|
|
Implements:
|
|
|
|
IMountingMedia::SetMediaId().
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
WsbTraceIn(OLESTR("CMountingMedia::SetMediaId"), OLESTR(""));
|
|
|
|
m_mediaId = mediaId;
|
|
|
|
WsbTraceOut(OLESTR("CMountingMedia::SetMediaId"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
|
|
|
|
return(hr);
|
|
}
|
|
|
|
HRESULT
|
|
CMountingMedia::SetIsReadOnly(
|
|
BOOL bReadOnly
|
|
)
|
|
/*++
|
|
|
|
Implements:
|
|
|
|
IMountingMedia::SetIsReadOnly().
|
|
|
|
--*/
|
|
{
|
|
WsbTraceIn(OLESTR("CMountingMedia::SetIsReadOnly"), OLESTR("bReadOnly = %d"), bReadOnly);
|
|
|
|
m_bReadOnly = bReadOnly;
|
|
|
|
WsbTraceOut(OLESTR("CMountingMedia::SetIsReadOnly"), OLESTR(""));
|
|
|
|
return(S_OK);
|
|
}
|
|
|
|
HRESULT
|
|
CMountingMedia::IsReadOnly(
|
|
void
|
|
)
|
|
/*++
|
|
|
|
Implements:
|
|
|
|
IMountingMedia::IsReadOnly().
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
WsbTraceIn(OLESTR("CMountingMedia::IsReadOnly"), OLESTR(""));
|
|
|
|
hr = (m_bReadOnly ? S_OK : S_FALSE);
|
|
|
|
WsbTraceOut(OLESTR("CMountingMedia::IsReadOnly"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
|
|
|
|
return(hr);
|
|
}
|
|
|
|
HRESULT
|
|
CMountingMedia::WaitForMount(
|
|
DWORD dwTimeout
|
|
)
|
|
/*++
|
|
|
|
Implements:
|
|
|
|
IMountingMedia::WaitForMount().
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
WsbTraceIn(OLESTR("CMountingMedia::WaitForMount"), OLESTR(""));
|
|
|
|
// Wait for the mount event for the given timeout
|
|
switch (WaitForSingleObject(m_mountEvent, dwTimeout)) {
|
|
case WAIT_OBJECT_0:
|
|
WsbTrace(OLESTR("CMountingMedia::WaitForMount: signaled that media is mounted\n"));
|
|
break;
|
|
|
|
case WAIT_TIMEOUT:
|
|
WsbTrace(OLESTR("CMountingMedia::WaitForMount: WaitForSingleObject timed out after waiting for %lu ms\n"), dwTimeout);
|
|
hr = E_FAIL;
|
|
break;
|
|
|
|
case WAIT_FAILED:
|
|
default:
|
|
DWORD dwErr = GetLastError();
|
|
hr = HRESULT_FROM_WIN32(dwErr);
|
|
WsbTrace(OLESTR("CMountingMedia::WaitForMount: WaitForSingleObject returned error %lu\n"), dwErr);
|
|
break;
|
|
}
|
|
|
|
WsbTraceOut(OLESTR("CMountingMedia::WaitForMount"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
|
|
|
|
return(hr);
|
|
}
|
|
|
|
HRESULT
|
|
CMountingMedia::MountDone(
|
|
void
|
|
)
|
|
/*++
|
|
|
|
Implements:
|
|
|
|
IMountingMedia::MountDone().
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
WsbTraceIn(OLESTR("CMountingMedia::MountDone"), OLESTR(""));
|
|
|
|
// Mount is done: set the mount event
|
|
if (! SetEvent(m_mountEvent)) {
|
|
DWORD dwErr = GetLastError();
|
|
WsbTrace(OLESTR("CMountingMedia::MountDone: SetEvent returned error %lu\n"), dwErr);
|
|
hr = HRESULT_FROM_WIN32(dwErr);
|
|
}
|
|
|
|
WsbTraceOut(OLESTR("CMountingMedia::MountDone"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
|
|
|
|
return(hr);
|
|
}
|
|
|
|
HRESULT
|
|
CMountingMedia::IsEqual(
|
|
IUnknown* pCollectable
|
|
)
|
|
/*++
|
|
|
|
Implements:
|
|
|
|
IWsbCollectable::IsEqual().
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
WsbTraceIn(OLESTR("CMountingMedia::IsEqual"), OLESTR(""));
|
|
|
|
hr = CompareTo(pCollectable, NULL);
|
|
|
|
WsbTraceOut(OLESTR("CMountingMedia::IsEqual"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
|
|
|
|
return(hr);
|
|
}
|
|
|
|
HRESULT
|
|
CMountingMedia::CompareTo(
|
|
IUnknown* pCollectable,
|
|
SHORT* pResult
|
|
)
|
|
/*++
|
|
|
|
Implements:
|
|
|
|
IWsbCollectable::CompareTo().
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
SHORT result = 0;
|
|
CComPtr<IMountingMedia> pMountingMedia;
|
|
GUID mediaId;
|
|
|
|
WsbTraceIn(OLESTR("CMountingMedia::CompareTo"), OLESTR(""));
|
|
|
|
try {
|
|
// Did they give us a valid item to compare to?
|
|
WsbAssert(0 != pCollectable, E_POINTER);
|
|
WsbAffirmHr(pCollectable->QueryInterface(IID_IMountingMedia, (void**) &pMountingMedia));
|
|
WsbAffirmHr(pMountingMedia->GetMediaId(&mediaId));
|
|
|
|
// Compare
|
|
if (IsEqualGUID(m_mediaId, mediaId)) {
|
|
hr = S_OK;
|
|
result = 0;
|
|
} else {
|
|
// Need to provide signed result...
|
|
hr = S_FALSE;
|
|
result = WsbSign(memcmp(&m_mediaId, &mediaId, sizeof(GUID)));
|
|
}
|
|
|
|
// If they asked for the relative value back, then return it to them.
|
|
if (pResult != NULL) {
|
|
*pResult = result;
|
|
}
|
|
|
|
} WsbCatch(hr);
|
|
|
|
WsbTraceOut(OLESTR("CMountingMedia::CompareTo"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
|
|
|
|
return(hr);
|
|
}
|
|
|