// FrcOwn.h : Declaration of the CForceOwnership #ifndef __FRCOWN_H_ #define __FRCOWN_H_ #include "resource.h" // main symbols #include ///////////////////////////////////////////////////////////////////////////// // CForceOwnership class ATL_NO_VTABLE CTrkForceOwnership : public CComObjectRootEx, public CComCoClass, public IDispatchImpl { public: CTrkForceOwnership() : _idt(_dbc, &_refreshSequenceStorage), _voltab(_dbc, &_refreshSequenceStorage), _refreshSequenceStorage( &_voltab ) { __try { _dbc.Initialize(NULL); _voltab.Initialize(NULL,0,0); _idt.Initialize(); } __except( BreakOnDebuggableException() ) { } } DECLARE_REGISTRY_RESOURCEID(IDR_FRCOWN) BEGIN_COM_MAP(CTrkForceOwnership) COM_INTERFACE_ENTRY(ITrkForceOwnership) COM_INTERFACE_ENTRY(IDispatch) END_COM_MAP() // ITrkForceOwnership public: STDMETHOD(FileStatus)(BSTR bstrUncPath, long lScope, VARIANT *pvarrgbstrFileName, VARIANT* pvarrgbstrFileId, VARIANT* pvarrglongStatus); STDMETHOD(VolumeStatus)(BSTR bstrUncPath, long lScope, VARIANT *pvarlongVolIndex, VARIANT *pvarbstrVolId, VARIANT *pvarlongStatus); STDMETHOD(Files)(BSTR bstrUncPath, long lScope); STDMETHOD(Volumes)(BSTR bstrUncPath, long lScope ); private: CDbConnection _dbc; CVolumeTable _voltab; CIntraDomainTable _idt; CRefreshSequenceStorage _refreshSequenceStorage; }; // // This class is used on the client side of an RPC pipe parameter that passes // volume tracking information. The client provides a derived class which // overrides the push/pull methods as appropriate. // class PVolInfoPipeCallback : public TPRpcPipeCallback { public: virtual void Pull( TRK_VOLUME_TRACKING_INFORMATION *pVolInfo, unsigned long cbBuffer, unsigned long * pcElems ) = 0; virtual void Push( TRK_VOLUME_TRACKING_INFORMATION *pVolInfo, unsigned long cElems ) = 0; virtual void Alloc( unsigned long cbRequested, TRK_VOLUME_TRACKING_INFORMATION **ppVolInfo, unsigned long * pcbActual ) { if( cbRequested > sizeof(_rgVolInfo) ) *pcbActual = sizeof(_rgVolInfo); else *pcbActual = cbRequested; *ppVolInfo = _rgVolInfo; return; } private: TRK_VOLUME_TRACKING_INFORMATION _rgVolInfo[ 26 ]; }; // // This class is used on the client side of an RPC pipe parameter that passes // file tracking information. The client provides a derived class which // overrides the push/pull methods as appropriate. // class PFileInfoPipeCallback : public TPRpcPipeCallback { public: virtual void Pull( TRK_FILE_TRACKING_INFORMATION *pVolInfo, unsigned long cbBuffer, unsigned long * pcElems ) = 0; virtual void Push( TRK_FILE_TRACKING_INFORMATION *pFileInfo, unsigned long cElems ) = 0; virtual void Alloc( unsigned long cbRequested, TRK_FILE_TRACKING_INFORMATION **ppFileInfo, unsigned long * pcbActual ) { if( cbRequested > sizeof(_rgFileInfo) ) *pcbActual = sizeof(_rgFileInfo); else *pcbActual = cbRequested; *ppFileInfo = _rgFileInfo; return; } protected: TRK_FILE_TRACKING_INFORMATION _rgFileInfo[ 32 ]; }; // // This class is used on the client side of an RPC pipe parameter that passes // a path from the client to the server. // class CPCPath : public TPRpcPipeCallback { public: CPCPath( TCHAR *ptszPath ) { _iPath = 0; _tcscpy( _tszPath, ptszPath ); _cchPath = _tcslen(_tszPath) + 1; } public: void Pull( TCHAR *ptszPath, unsigned long cbBuffer, unsigned long * pcElems ) { if( 0 > _iPath ) { *pcElems = 0; return; } else { if( sizeof(TCHAR) * (_cchPath - _iPath) > cbBuffer ) *pcElems = cbBuffer / sizeof(TCHAR); else *pcElems = _cchPath - _iPath; memcpy( ptszPath, &_tszPath[ _iPath ], *pcElems * sizeof(TCHAR) ); if( _iPath + *pcElems >= _cchPath ) _iPath = -1; else _iPath += *pcElems; return; } } void Push( TCHAR *ptszPath, unsigned long cElems ) { TrkAssert( !TEXT("CGetPathPipeCallback::push shouldn't be called") ); return; } void Alloc( unsigned long cbRequested, TCHAR **pptszPath, unsigned long * pcbActual ) { if( cbRequested > sizeof(_tszBuffer) ) *pcbActual = sizeof(_tszBuffer); else *pcbActual = cbRequested; *pptszPath = _tszBuffer; return; } private: TCHAR _tszPath[ MAX_PATH + 1 ]; // BUGBUG P2: Path TCHAR _tszBuffer[ MAX_PATH + 1 ]; LONG _iPath; ULONG _cchPath; }; class CPCVolumeStatus : public PVolInfoPipeCallback { public: CPCVolumeStatus( CVolumeTable *pvoltab ) : _fInitialized(FALSE), _pvoltab(pvoltab) {}; public: void Initialize( CMachineId *pmcid, VARIANT *pvarlongVolIndex, VARIANT *pvarbstrVolId, VARIANT *pvarlongStatus ); void UnInitialize(); void Pull( TRK_VOLUME_TRACKING_INFORMATION *pVolInfo, unsigned long cbBuffer, unsigned long * pcElems ) { TrkAssert( !TEXT("CPCVolumeStatus should not be pulled") ); *pcElems = 0; return; } void Push( TRK_VOLUME_TRACKING_INFORMATION *pVolInfo, unsigned long cElems ); public: HRESULT GetHResult() { return( _hr ); } void Compact(); private: HRESULT _hr; BOOL _fInitialized; CMachineId *_pmcid; CVolumeTable *_pvoltab; VARIANT *_pvarlongVolIndex; VARIANT *_pvarbstrVolId; VARIANT *_pvarlongStatus; SAFEARRAYBOUND _sabound; LONG _iArrays; }; class CPCVolumes : public PVolInfoPipeCallback { public: CPCVolumes( CMachineId *pmcid, CVolumeTable *pvoltab, CRefreshSequenceStorage *pRefreshSequenceStorage ) : _pmcid(pmcid), _pvoltab(pvoltab), _pRefreshSequenceStorage(pRefreshSequenceStorage) { _cVolIds = 0; _hr = S_OK; }; public: void Pull( TRK_VOLUME_TRACKING_INFORMATION *pVolInfo, unsigned long cbBuffer, unsigned long * pcElems ) { TrkAssert( !TEXT("CPCVolumes should not be pulled") ); *pcElems = 0; return; } void Push( TRK_VOLUME_TRACKING_INFORMATION *pVolInfo, unsigned long cElems ); public: HRESULT GetHResult() { return( _hr ); } ULONG Count() { return( _cVolIds ); } CVolumeId * GetVolIds() { return( _rgvolid ); } private: HRESULT _hr; CMachineId *_pmcid; CVolumeTable *_pvoltab; CRefreshSequenceStorage *_pRefreshSequenceStorage; ULONG _cVolIds; CVolumeId _rgvolid[ NUM_VOLUMES ]; // BUGBUG: Fixed # volumes }; class CPCFileStatus : public PFileInfoPipeCallback { public: CPCFileStatus( CIntraDomainTable *pidt ) : _fInitialized(FALSE), _pidt(pidt) {}; public: void Initialize( CMachineId *pmcid, VARIANT *pvarrgbstrFileName, VARIANT *pvarrgbstrFileId, VARIANT *pvarrglongStatus ); void UnInitialize() { // Nothing to do, the Variants are cleaned by the caller return; } void Pull( TRK_FILE_TRACKING_INFORMATION *pFileInfo, unsigned long cbBuffer, unsigned long * pcElems ) { TrkAssert( !TEXT("CPCFileStatus should not be pulled") ); *pcElems = 0; return; } void Push( TRK_FILE_TRACKING_INFORMATION *pFileInfo, unsigned long cElems ); public: HRESULT GetHResult() { return( _hr ); } void Compact(); private: HRESULT _hr; BOOL _fInitialized; CMachineId *_pmcid; CIntraDomainTable *_pidt; VARIANT *_pvarrgbstrFileName; VARIANT *_pvarrgbstrFileId; VARIANT *_pvarrglongStatus; SAFEARRAYBOUND _sabound; long _iArrays; }; class CPCFiles : public PFileInfoPipeCallback { public: CPCFiles( CIntraDomainTable *pidt ) { _pidt = pidt; } public: void Pull( TRK_FILE_TRACKING_INFORMATION *pVolInfo, unsigned long cbBuffer, unsigned long * pcElems ) { TrkAssert( !TEXT("CPCFiles should not be pulled") ); *pcElems = 0; return; } void Push( TRK_FILE_TRACKING_INFORMATION *pFileInfo, unsigned long cElems ); private: CIntraDomainTable *_pidt; }; #endif //__FRCOWN_H_