BOOL VSSClientGeneric::CloseBackup() { BOOL bRet = FALSE; if (!m_pVssObject) errno = ENOSYS; else { IVssBackupComponents* pVss = (IVssBackupComponents*) m_pVssObject; CComPtr<IVssAsync> pAsync; SetVSSPathConvert(NULL, NULL); m_bBackupIsInitialized = false; if (SUCCEEDED(pVss->BackupComplete(&pAsync.p))) { // Waits for the async operation to finish and checks the result WaitAndCheckForAsyncOperation(pAsync.p); bRet = TRUE; } else { errno = b_errno_win32; pVss->AbortBackup(); } /* get latest info about writer status */ CheckWriterStatus(); if (m_uidCurrentSnapshotSet != GUID_NULL) { VSS_ID idNonDeletedSnapshotID = GUID_NULL; LONG lSnapshots; pVss->DeleteSnapshots( m_uidCurrentSnapshotSet, VSS_OBJECT_SNAPSHOT_SET, FALSE, &lSnapshots, &idNonDeletedSnapshotID); m_uidCurrentSnapshotSet = GUID_NULL; } pVss->Release(); m_pVssObject = NULL; } // Call CoUninitialize if the CoInitialize was performed sucesfully if (m_bCoInitializeCalled) { CoUninitialize(); m_bCoInitializeCalled = false; } return bRet; }
bool VSSClientGeneric::CloseBackup() { bool bRet = false; HRESULT hr; BSTR xml; IVssBackupComponents* pVssObj = (IVssBackupComponents*)m_pVssObject; if (!m_pVssObject) { Jmsg(m_jcr, M_FATAL, 0, "VssOject is NULL.\n"); errno = ENOSYS; return bRet; } CComPtr<IVssAsync> pAsync; SetVSSPathConvert(NULL, NULL); m_bBackupIsInitialized = false; hr = pVssObj->BackupComplete(&pAsync.p); if (SUCCEEDED(hr)) { // Waits for the async operation to finish and checks the result WaitAndCheckForAsyncOperation(pAsync.p); bRet = true; } else { JmsgVssApiStatus(m_jcr, M_ERROR, hr, "BackupComplete"); errno = b_errno_win32; pVssObj->AbortBackup(); } /* get latest info about writer status */ CheckWriterStatus(); hr = pVssObj->SaveAsXML(&xml); if (SUCCEEDED(hr)) { m_metadata = xml; } else { m_metadata = NULL; } /* FIXME?: The docs http://msdn.microsoft.com/en-us/library/aa384582%28v=VS.85%29.aspx say this isn't required... */ if (m_uidCurrentSnapshotSet != GUID_NULL) { VSS_ID idNonDeletedSnapshotID = GUID_NULL; LONG lSnapshots; pVssObj->DeleteSnapshots( m_uidCurrentSnapshotSet, VSS_OBJECT_SNAPSHOT_SET, false, &lSnapshots, &idNonDeletedSnapshotID); m_uidCurrentSnapshotSet = GUID_NULL; } if (m_bWriterStatusCurrent) { m_bWriterStatusCurrent = false; pVssObj->FreeWriterStatus(); } pVssObj->Release(); m_pVssObject = NULL; // Call CoUninitialize if the CoInitialize was performed sucesfully if (m_bCoInitializeCalled) { CoUninitialize(); m_bCoInitializeCalled = false; } return bRet; }