/*++ © 1998 Seagate Software, Inc. All rights reserved Module Name: RmsServr.h Abstract: Declaration of the CRmsServer class Author: Brian Dodd [brian] 15-Nov-1996 Revision History: --*/ #ifndef _RMSSERVR_ #define _RMSSERVR_ #include "resource.h" // resource symbols #include "RmsObjct.h" // CRmsComObject // // Registry entry // class CRmsServer : public CComDualImpl, public IHsmSystemState, public CRmsComObject, public CWsbPersistStream, public IConnectionPointContainerImpl, public IConnectionPointImpl, public CComCoClass { public: CRmsServer() {} BEGIN_COM_MAP(CRmsServer) COM_INTERFACE_ENTRY2(IDispatch, IRmsServer) COM_INTERFACE_ENTRY(IRmsServer) COM_INTERFACE_ENTRY(IHsmSystemState) COM_INTERFACE_ENTRY(IRmsComObject) COM_INTERFACE_ENTRY(ISupportErrorInfo) COM_INTERFACE_ENTRY2(IPersist, IPersistStream) COM_INTERFACE_ENTRY(IPersistStream) COM_INTERFACE_ENTRY(IWsbPersistStream) COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) END_COM_MAP() DECLARE_NOT_AGGREGATABLE(CRmsServer) DECLARE_REGISTRY_RESOURCEID(IDR_RmsServer) DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_CONNECTION_POINT_MAP(CRmsServer) CONNECTION_POINT_ENTRY(IID_IRmsSinkEveryEvent) END_CONNECTION_POINT_MAP() // CComObjectRoot public: STDMETHOD(FinalConstruct)(void); STDMETHOD(FinalRelease)(void); // IPersist public: STDMETHOD(GetClassID)( OUT CLSID *pClsid); // IPersistStream public: STDMETHOD(GetSizeMax)( OUT ULARGE_INTEGER* pSize); STDMETHOD(Load)( IN IStream* pStream); STDMETHOD(Save)( IN IStream* pStream, IN BOOL clearDirty); // IHsmSystemState public: STDMETHOD( ChangeSysState )( HSM_SYSTEM_STATE* pSysState ); // IRmsServer public: STDMETHOD( InitializeInAnotherThread )(void); STDMETHOD( Initialize )(void); STDMETHOD( SaveAll )(void); STDMETHOD( Unload )(void); STDMETHOD( GetServerName )( OUT BSTR *pName); STDMETHOD( GetCartridges )( OUT IWsbIndexedCollection **ptr); STDMETHOD( GetActiveCartridges )( OUT IWsbIndexedCollection **ptr); STDMETHOD( GetDataMovers )( OUT IWsbIndexedCollection **ptr); STDMETHOD( SetActiveCartridge )( IN IRmsCartridge *ptr); STDMETHOD( GetLibraries )( OUT IWsbIndexedCollection **ptr); STDMETHOD( GetMediaSets )( OUT IWsbIndexedCollection **ptr); STDMETHOD( GetRequests )( OUT IWsbIndexedCollection **ptr); STDMETHOD( GetClients )( OUT IWsbIndexedCollection **ptr); STDMETHOD( GetUnconfiguredDevices )( OUT IWsbIndexedCollection **ptr); STDMETHOD( ScanForDevices )(void); STDMETHOD( ScanForDrives )(void); STDMETHOD( MountScratchCartridge )( OUT GUID *pCartId, IN REFGUID fromMediaSet, IN REFGUID prevSideId, IN OUT LONGLONG *pFreeSpace, IN LONG blockingFactor, IN BSTR displayName, IN OUT IRmsDrive **ppDrive, OUT IRmsCartridge **ppCartridge, OUT IDataMover **ppDataMover, IN DWORD dwOptions = RMS_NONE); STDMETHOD( MountCartridge )( IN REFGUID cartId, IN OUT IRmsDrive **ppDrive, OUT IRmsCartridge **ppCartridge, OUT IDataMover **ppDataMover, IN DWORD dwOptions = RMS_NONE, IN DWORD threadId = 0); STDMETHOD( DismountCartridge )( IN REFGUID cartId, IN DWORD dwOptions = RMS_NONE); STDMETHOD( DuplicateCartridge )( IN REFGUID cartId, IN REFGUID firstSideId, IN OUT GUID *pCopyCartId, IN REFGUID copySetId, IN BSTR copyName, OUT LONGLONG *pFreeSpace, OUT LONGLONG *pCapacity, IN DWORD options); STDMETHOD( RecycleCartridge )( IN REFGUID cartId, IN DWORD options); STDMETHOD( FindLibraryById )( IN REFGUID libId, OUT IRmsLibrary **ptr); STDMETHOD( FindCartridgeById )( IN REFGUID cartId, OUT IRmsCartridge **ptr); STDMETHOD( CreateObject )( IN REFGUID objectId, IN REFCLSID rclsid, IN REFIID riid, IN DWORD dwCreate, OUT void **ppvObj); STDMETHOD( IsNTMSInstalled )(void); STDMETHOD( GetNTMS )( OUT IRmsNTMS **ptr); STDMETHOD( IsReady )(void); STDMETHOD( ChangeState )( IN LONG newState); STDMETHOD( GetNofAvailableDrives ) ( IN REFGUID fromMediaSet, OUT DWORD *pdwNofDrives); STDMETHOD( FindCartridgeStatusById )( IN REFGUID cartId, OUT DWORD *dwStatus); STDMETHOD( IsMultipleSidedMedia )( IN REFGUID mediaSetId); STDMETHOD( CheckSecondSide )( IN REFGUID firstSideId, OUT BOOL *pbValid, OUT GUID *pSecondSideId); // CRmsServer private: HRESULT resolveUnconfiguredDevices(void); HRESULT autoConfigureDevices(void); HRESULT processInquiryData( IN int portNumber, IN UCHAR *pPortScanData); HRESULT findDriveLetter( IN UCHAR portNo, IN UCHAR pathNo, IN UCHAR id, IN UCHAR lun, OUT OLECHAR *driveString); HRESULT getDeviceName( IN UCHAR portNo, IN UCHAR pathNo, IN UCHAR id, IN UCHAR lun, OUT OLECHAR *deviceName); HRESULT getHardDrivesToUseFromRegistry( OUT OLECHAR *pDrivesToUse, OUT DWORD *pLen); HRESULT enableAsBackupOperator(void); private: enum { // Class specific constants: // Version = 1, // Class version, this should be // incremented each time the // the class definition changes. MaxActive = 8 // Max number of active cartridges. }; CWsbStringPtr m_dbPath; // The directory where databases are stored. LONG m_LockReference;// The server lock used for blocking normal access during synchornized operations. CWsbBstrPtr m_ServerName; // The name of the computer running the server. CComPtr m_pCartridges; // The cartridges known to the server. CComPtr m_pLibraries; // The libraries managed by the server. CComPtr m_pMediaSets; // The media sets known to the server. CComPtr m_pRequests; // The requests associated with the server. CComPtr m_pClients; // The clients associated with the server. CComPtr m_pUnconfiguredDevices; // The unconfigured devices associated with the server. CComPtr m_pNTMS; // NTMS support. ULONG m_HardDrivesUsed; // the number of hard drives in use by RMS. //typedef List LISTINT; //LISTINT::iterator i; //LISTINT test; //List m_ListOfActiveCartridges; // The cartridges already mounted into a drive. //List::iterator m_IteratorForListOfActiveCartridges; // The cartridges already mounted into a drive. CComPtr m_pActiveCartridges; // The cartridges already mounted into a drive. CComPtr m_pDataMovers; // The active data movers. CComPtr m_pActiveCartridge ; // The cartridges already mounted into a drive. // Thread routines public: static DWORD WINAPI InitializationThread( IN LPVOID pv); }; ///////////////////////////////////////////////////////////////////////////// // // g_pServer // // This is made global so that anybody in the context of Rms has // quick access to it // extern IRmsServer *g_pServer; extern CRITICAL_SECTION g_CriticalSection; #endif // _RMSSERVR_