windows-nt/Source/XPSP1/NT/shell/ext/cscui/syncmgr.cpp
2020-09-26 16:20:57 +08:00

181 lines
5.2 KiB
C++

#include "pch.h"
#pragma hdrstop
#include <mobsyncp.h>
//*************************************************************
//
// RegisterSyncMgrHandler
//
// Purpose: Register/unregister CSC Update handler with SyncMgr
//
// Parameters: bRegister - TRUE to register, FALSE to unregister
// punkSyncMgr - (optional) instance of SyncMgr to use
//
// Return: HRESULT
//
//*************************************************************
HRESULT
RegisterSyncMgrHandler(
BOOL bRegister,
LPUNKNOWN punkSyncMgr
)
{
HRESULT hr;
HRESULT hrComInit = E_FAIL;
ISyncMgrRegister *pSyncRegister = NULL;
const DWORD dwRegFlags = SYNCMGRREGISTERFLAG_CONNECT | SYNCMGRREGISTERFLAG_PENDINGDISCONNECT;
TraceEnter(TRACE_UPDATE, "CscRegisterHandler");
if (punkSyncMgr)
{
hr = punkSyncMgr->QueryInterface(IID_ISyncMgrRegister, (LPVOID*)&pSyncRegister);
}
else
{
hrComInit = CoInitialize(NULL);
hr = CoCreateInstance(CLSID_SyncMgr,
NULL,
CLSCTX_SERVER,
IID_ISyncMgrRegister,
(LPVOID*)&pSyncRegister);
}
FailGracefully(hr, "Unable to get ISyncMgrRegister interface");
if (bRegister)
hr = pSyncRegister->RegisterSyncMgrHandler(CLSID_CscUpdateHandler, NULL, dwRegFlags);
else
hr = pSyncRegister->UnregisterSyncMgrHandler(CLSID_CscUpdateHandler, dwRegFlags);
exit_gracefully:
DoRelease(pSyncRegister);
if (SUCCEEDED(hrComInit))
CoUninitialize();
TraceLeaveResult(hr);
}
//
// Set/Clear the sync-at-logon-logoff flags for our SyncMgr handler.
// When set, SyncMgr will include Offline Files in any sync activity
// at logon and/or logoff.
//
// dwFlagsRequested - Value of flags bits. 1 == set, 0 == clear.
// dwMask - Mask describing which flags bits to use.
//
// Both dwMask and dwFlagsRequested may be one of the following:
//
// 0
// SYNCMGRREGISTER_CONNECT
// SYNCMGRREGISTER_PENDINGDISCONNECT
// SYNCMGRREGISTER_CONNECT | SYNCMGRREGISTER_PENDINGDISCONNECT
//
HRESULT
RegisterForSyncAtLogonAndLogoff(
DWORD dwMask,
DWORD dwFlagsRequested
)
{
CCoInit coinit;
HRESULT hr = coinit.Result();
if (SUCCEEDED(hr))
{
ISyncMgrRegisterCSC *pSyncRegister = NULL;
hr = CoCreateInstance(CLSID_SyncMgr,
NULL,
CLSCTX_SERVER,
IID_ISyncMgrRegisterCSC,
(LPVOID*)&pSyncRegister);
if (SUCCEEDED(hr))
{
//
// Re-register the sync mgr handler with the "connect" and "disconnect"
// flags set. Other existing flags are left unmodified.
//
DWORD dwFlagsActual;
hr = pSyncRegister->GetUserRegisterFlags(&dwFlagsActual);
if (SUCCEEDED(hr))
{
const DWORD LOGON = SYNCMGRREGISTERFLAG_CONNECT;
const DWORD LOGOFF = SYNCMGRREGISTERFLAG_PENDINGDISCONNECT;
if (dwMask & LOGON)
{
if (dwFlagsRequested & LOGON)
dwFlagsActual |= LOGON;
else
dwFlagsActual &= ~LOGON;
}
if (dwMask & LOGOFF)
{
if (dwFlagsRequested & LOGOFF)
dwFlagsActual |= LOGOFF;
else
dwFlagsActual &= ~LOGOFF;
}
hr = pSyncRegister->SetUserRegisterFlags(dwMask & (LOGON | LOGOFF),
dwFlagsActual);
}
pSyncRegister->Release();
}
}
return hr;
}
//
// Determine if we're registered for sync at logon/logoff.
// Returns:
// S_OK = We're registered. Query *pbLogon and *pbLogoff to
// determine specifics if you're interested.
// S_FALSE = We're not registered.
// Other = Couldn't determine because of some error.
//
HRESULT
IsRegisteredForSyncAtLogonAndLogoff(
bool *pbLogon,
bool *pbLogoff
)
{
bool bLogon = false;
bool bLogoff = false;
CCoInit coinit;
HRESULT hr = coinit.Result();
if (SUCCEEDED(hr))
{
ISyncMgrRegisterCSC *pSyncRegister = NULL;
hr = CoCreateInstance(CLSID_SyncMgr,
NULL,
CLSCTX_SERVER,
IID_ISyncMgrRegisterCSC,
(LPVOID*)&pSyncRegister);
if (SUCCEEDED(hr))
{
DWORD dwFlags;
hr = pSyncRegister->GetUserRegisterFlags(&dwFlags);
if (SUCCEEDED(hr))
{
hr = S_FALSE;
bLogon = (0 != (SYNCMGRREGISTERFLAG_CONNECT & dwFlags));
bLogoff = (0 != (SYNCMGRREGISTERFLAG_PENDINGDISCONNECT & dwFlags));
if (bLogon || bLogoff)
hr = S_OK;
}
pSyncRegister->Release();
}
}
if (NULL != pbLogon)
*pbLogon = bLogon;
if (NULL != pbLogoff)
*pbLogoff = bLogoff;
return hr;
}