/*++ Copyright (c) 2000 Microsoft Corporation Module Name: vs_wmxml.hxx Abstract: Declaration of Writer Metadata XML wrapper classes Brian Berkowitz [brianb] 3/13/2000 TBD: Add comments. Revision History: Name Date Comments brianb 03/13/2000 Created brianb 03/22/2000 Added CVssGatherWriterMetadata --*/ //////////////////////////////////////////////////////////////////////// // Standard foo for file name aliasing. This code block must be after // all includes of VSS header files. // #ifdef VSS_FILE_ALIAS #undef VSS_FILE_ALIAS #endif #define VSS_FILE_ALIAS "INCWXMLH" // //////////////////////////////////////////////////////////////////////// // forward declarations class CVssWMFiledesc; class CVssWMComponent; // base class used by all writer and component metadata classes. class CVssMetadataHelper { protected: CXMLDocument m_doc; // protection for document CVssSafeCriticalSection m_csDOM; CVssMetadataHelper(IXMLDOMNode *pNode, IXMLDOMDocument *pDoc) : m_doc(pNode, pDoc) { } CVssMetadataHelper() { } // initialize critical section used to protect document void InitializeHelper(CVssFunctionTracer &ft) { try { m_csDOM.Init(); } catch(...) { ft.Throw(VSSDBG_XML, E_OUTOFMEMORY, L"Cannot initialize critical section"); } } // convert string value "yes, no" to boolean bool ConvertToBoolean ( IN CVssFunctionTracer &ft, IN BSTR bstr ) throw(HRESULT); // get the value of a string valued attribute of the current element HRESULT GetStringAttributeValue ( IN CVssFunctionTracer &ft, IN LPCWSTR wszAttrName, IN bool bAttrRequired, OUT BSTR *pbstrValue ); // get the value of a boolean valued attribute of the current element HRESULT GetBooleanAttributeValue ( IN CVssFunctionTracer &ft, IN LPCWSTR wszAttrName, IN bool bRequired, OUT bool *pbValue ); // obtain the string value of an attribute bool get_stringValue ( IN LPCWSTR wszAttrName, OUT BSTR *pbstr ) throw(HRESULT); // obtain the boolean value of an attribute bool get_boolValue ( IN CVssFunctionTracer &ft, IN LPCWSTR wszAttrName, OUT bool *pb ) throw(HRESULT); void get_VSS_IDValue ( IN CVssFunctionTracer &ft, IN LPCWSTR wszAttrName, OUT VSS_ID *pid ) throw(HRESULT); static void MissingElement ( IN CVssFunctionTracer &ft, IN LPCWSTR wszElement ); static void MissingAttribute ( IN CVssFunctionTracer &ft, IN LPCWSTR wszAttribute ); public: // convert a boolean value to a string ("yes", "no") static LPCWSTR WszFromBoolean(IN bool b); // convert a string to a GUID static void ConvertToVSS_ID ( IN CVssFunctionTracer &ft, IN BSTR bstr, OUT VSS_ID *pId ) throw(HRESULT); // convert a VSS_USAGE_TYPE to a string static LPCWSTR WszFromUsageType ( IN CVssFunctionTracer &ft, IN VSS_USAGE_TYPE ut ) throw(HRESULT); // convert a string to a VSS_USAGE_TYPE static VSS_USAGE_TYPE ConvertToUsageType ( IN CVssFunctionTracer &ft, IN BSTR bstr ) throw(HRESULT); // convert a VSS_SOURCE_TYPE to a string static LPCWSTR WszFromSourceType ( IN CVssFunctionTracer &ft, IN VSS_SOURCE_TYPE st ) throw(HRESULT); // convert a string to a VSS_SOURCE_TYPE static VSS_SOURCE_TYPE ConvertToSourceType ( IN CVssFunctionTracer &ft, IN BSTR bstr ) throw(HRESULT); // convert a VSS_COMPONENT_TYPE to a string static LPCWSTR WszFromComponentType ( IN CVssFunctionTracer &ft, IN VSS_COMPONENT_TYPE ct, IN bool bValue ) throw(HRESULT); // convert a string to a VSS_COMPONENT_TYPE static VSS_COMPONENT_TYPE ConvertToComponentType ( IN CVssFunctionTracer &ft, IN BSTR bstr, IN bool bValue ) throw(HRESULT); // convert a VSS_RESTOREMETHOD_ENUM to a string static LPCWSTR WszFromRestoreMethod ( IN CVssFunctionTracer &ft, IN VSS_RESTOREMETHOD_ENUM method ) throw(HRESULT); // convert a string to a VSS_RESTOREMETHOD_ENUM static VSS_RESTOREMETHOD_ENUM ConvertToRestoreMethod ( IN CVssFunctionTracer &ft, IN BSTR bstr ) throw(HRESULT); // convert a VSS_WRITERRESTORE_ENUM to a string static LPCWSTR WszFromWriterRestore ( IN CVssFunctionTracer &ft, IN VSS_WRITERRESTORE_ENUM writerRestore ) throw(HRESULT); // convert a string to a VSS_WRITERRESTORE_ENUM static VSS_WRITERRESTORE_ENUM ConvertToWriterRestore ( IN CVssFunctionTracer &ft, IN BSTR bstr ) throw(HRESULT); // convert from a VSS_BACKUP_TYPE to a string static LPCWSTR WszFromBackupType ( IN CVssFunctionTracer &ft, IN VSS_BACKUP_TYPE bt ); // convert from string to VSS_BACKUP_TYPE static VSS_BACKUP_TYPE ConvertToBackupType ( IN CVssFunctionTracer &ft, IN BSTR bstr ); }; // examine writer metadata class CVssExamineWriterMetadata : public IVssExamineWriterMetadata, public CVssMetadataHelper { public: CVssExamineWriterMetadata() : m_cRef(0) { } // initialize document from a string bool Initialize ( IN BSTR bstrXML ) throw(HRESULT); // obtain identity of the writer STDMETHOD(GetIdentity) ( OUT VSS_ID *pidInstance, OUT VSS_ID *pidWriter, OUT BSTR *pbstrWriterName, OUT VSS_USAGE_TYPE *pUsage, OUT VSS_SOURCE_TYPE *pSource ); // obtain number of include files, exclude files, and components STDMETHOD(GetFileCounts) ( OUT UINT *pcIncludeFiles, OUT UINT *pcExcludeFiles, OUT UINT *pcComponents ); // obtain specific include files STDMETHOD(GetIncludeFile) ( IN UINT iFile, OUT IVssWMFiledesc **ppFiledesc ); // obtain specific exclude files STDMETHOD(GetExcludeFile) ( IN UINT iFile, OUT IVssWMFiledesc **ppFiledesc ); // obtain specific component STDMETHOD(GetComponent) ( IN UINT iComponent, OUT IVssWMComponent **ppComponent ); // obtain restoration method STDMETHOD(GetRestoreMethod) ( OUT VSS_RESTOREMETHOD_ENUM *pMethod, OUT BSTR *pbstrService, OUT BSTR *pbstrUserProcedure, OUT VSS_WRITERRESTORE_ENUM *pwriterRestore, OUT bool *pbRebootRequired, UINT *pcMappings ); // obtain a specific alternative location mapping STDMETHOD(GetAlternateLocationMapping) ( IN UINT iMapping, OUT IVssWMFiledesc **ppFiledesc ); // get the backup schema STDMETHOD(GetBackupSchema) ( OUT DWORD *pdwSchemaMask ); // obtain reference to actual XML document STDMETHOD(GetDocument)(IXMLDOMDocument **pDoc); // convert document to a XML string STDMETHOD(SaveAsXML)(BSTR *pbstrXML); // load document from an XML string STDMETHOD(LoadFromXML)(BSTR bstrXML); // IUnknown methods STDMETHOD(QueryInterface)(REFIID iid, void **ppvObj); STDMETHOD_ (ULONG, AddRef)(); STDMETHOD_ (ULONG, Release)(); private: // load XML document saved using SaveAsXML bool LoadDocument(BSTR bstrXML); // used to load a specific kind of subcomponent of BACKUP_FILES // COMPONENT, DATABASE, or FILE_GROUP HRESULT GetFileType ( IN CVssFunctionTracer &ft, IN UINT iFile, IN LPCWSTR wszFileType, OUT IVssWMFiledesc **ppFiledesc ); // reference count LONG m_cRef; }; // access a component class CVssWMComponent : public CVssMetadataHelper, public IVssWMComponent { friend class CVssExamineWriterMetadata; private: CVssWMComponent(IXMLDOMNode *pNode) : CVssMetadataHelper(pNode, NULL), m_cRef(0) { } // 2nd phase of construction void Initialize(CVssFunctionTracer &ft) { InitializeHelper(ft); } public: // get component information STDMETHOD(GetComponentInfo)(PVSSCOMPONENTINFO *ppInfo); // free component information STDMETHOD(FreeComponentInfo)(PVSSCOMPONENTINFO pInfo); // obtain a specific file in a file group STDMETHOD(GetFile) ( IN UINT iFile, OUT IVssWMFiledesc **ppFiledesc ); // obtain a specific physical database file for a database STDMETHOD(GetDatabaseFile) ( IN UINT iDBFile, OUT IVssWMFiledesc **ppFiledesc ); // obtain a specific physical log file for a database STDMETHOD(GetDatabaseLogFile) ( IN UINT iDbLogFile, OUT IVssWMFiledesc **ppFiledesc ); STDMETHOD(GetDependency) ( IN UINT iDependency, OUT IVssWMDependency **ppDependency ); // IUnknown methods STDMETHOD(QueryInterface)(REFIID iid, void **ppvObj); STDMETHOD_ (ULONG, AddRef)(); STDMETHOD_ (ULONG, Release)(); private: // get a specific component file(file, database, log file) HRESULT GetComponentFile ( IN CVssFunctionTracer &ft, IN LPCWSTR wszElementName, IN UINT iFile, OUT IVssWMFiledesc **ppFiledesc ); LONG m_cRef; }; // information about a file or set of files class CVssWMFiledesc : public IVssWMFiledesc, public CVssMetadataHelper { friend class CVssExamineWriterMetadata; friend class CVssWMComponent; friend class CVssComponent; private: CVssWMFiledesc(IXMLDOMNode *pNode) : CVssMetadataHelper(pNode, NULL), m_cRef(0) { } // 2nd phase of construction void Initialize(CVssFunctionTracer &ft) { InitializeHelper(ft); } public: // get path to toplevel directory STDMETHOD(GetPath)(OUT BSTR *pbstrPath); // get filespec (may include wildcards) STDMETHOD(GetFilespec)(OUT BSTR *pbstrFilespec); // is path a directory or root of a tree STDMETHOD(GetRecursive)(OUT bool *pbRecursive); // alternate location for files STDMETHOD(GetAlternateLocation)(OUT BSTR *pbstrAlternateLocation); // backup type flags STDMETHOD(GetBackupTypeMask)(OUT DWORD *pdwSchemaMask); // IUnknown methods STDMETHOD(QueryInterface)(REFIID riid, void **ppvObj); STDMETHOD_ (ULONG, AddRef)(); STDMETHOD_ (ULONG, Release)(); private: LONG m_cRef; }; class CVssCreateWriterMetadata : public CVssMetadataHelper { public: // create initial metadata document HRESULT Initialize ( IN VSS_ID idInstance, IN VSS_ID idWriter, IN LPCWSTR wszFriendlyName, IN VSS_USAGE_TYPE usage, IN VSS_SOURCE_TYPE source ); // add files to include to metadata document STDMETHOD(AddIncludeFiles) ( IN LPCWSTR wszPath, IN LPCWSTR wszFilespec, IN bool bRecursive, IN LPCWSTR wszAlternateLocation ); // add files to exclude to metadata document STDMETHOD(AddExcludeFiles) ( IN LPCWSTR wszPath, IN LPCWSTR wszFilespec, IN bool bRecursive ); // add component to metadata document STDMETHOD(AddComponent) ( IN VSS_COMPONENT_TYPE ct, IN LPCWSTR wszLogicalPath, IN LPCWSTR wszComponentName, IN LPCWSTR wszCaption, IN const BYTE *pbIcon, IN UINT cbIcon, IN bool bRestoreMetadata, IN bool bNotifyOnBackupComplete, IN bool bSelectable, IN bool bSelectableForRestore = true, IN DWORD dwComponentFlags = 0 ); // add physical database files to a database component STDMETHOD(AddDatabaseFiles) ( IN LPCWSTR wszLogicalPath, IN LPCWSTR wszDatabaseName, IN LPCWSTR wszPath, IN LPCWSTR wszFilespec, IN DWORD dwBackupTypeMask = (VSS_FSBT_ALL_BACKUP_REQUIRED | VSS_FSBT_ALL_SNAPSHOT_REQUIRED) ); // add log files to a database component STDMETHOD(AddDatabaseLogFiles) ( IN LPCWSTR wszLogicalPath, IN LPCWSTR wszDatabaseName, IN LPCWSTR wszPath, IN LPCWSTR wszFilespec, IN DWORD dwBackupTypeMask = (VSS_FSBT_ALL_BACKUP_REQUIRED | VSS_FSBT_ALL_SNAPSHOT_REQUIRED) ); // add files to a FILE_GROUP component STDMETHOD(AddFilesToFileGroup) ( IN LPCWSTR wszLogicalPath, IN LPCWSTR wszGroupName, IN LPCWSTR wszPath, IN LPCWSTR wszFilespec, IN bool bRecursive, IN LPCWSTR wszAlternateLocation, IN DWORD dwBackupTypeMask = (VSS_FSBT_ALL_BACKUP_REQUIRED | VSS_FSBT_ALL_SNAPSHOT_REQUIRED) ); // create a restore method STDMETHOD(SetRestoreMethod) ( IN VSS_RESTOREMETHOD_ENUM method, IN LPCWSTR wszService, IN LPCWSTR wszUserProcedure, IN VSS_WRITERRESTORE_ENUM writerRestore, IN bool bRebootRequired ); // add alternative location mappings to the restore method STDMETHOD(AddAlternateLocationMapping) ( IN LPCWSTR wszSourcePath, IN LPCWSTR wszSourceFilespec, IN bool bRecursive, IN LPCWSTR wszDestination ); // add a dependency to another writer's component STDMETHOD(AddComponentDependency) ( IN LPCWSTR wszForLogicalPath, IN LPCWSTR wszForComponentName, IN VSS_ID onWriterId, IN LPCWSTR wszOnLogicalPath, IN LPCWSTR wszOnComponentName ); // set teh backup schema STDMETHOD(SetBackupSchema) ( IN DWORD dwSchemaMask ); // obtain reference to actual XML document STDMETHOD(GetDocument)(IXMLDOMDocument **pDoc); // save document as an XML string STDMETHOD(SaveAsXML)(BSTR *pbstrXML); private: // obtain BACKUP_LOCATIONS element CXMLNode GetBackupLocationsNode(); // add files associated with DATABASE or FILE_GROUP component HRESULT CreateComponentFiles ( IN CVssFunctionTracer &ft, IN LPCWSTR wszElement, IN LPCWSTR wszLogicalPath, IN LPCWSTR wszComponentName, IN LPCWSTR wszElementFile, IN LPCWSTR wszPath, IN LPCWSTR wszFilespec, IN bool bRecursive, IN LPCWSTR wszAlternateLocation ); };