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