381 lines
8.9 KiB
C
381 lines
8.9 KiB
C
|
// FrcOwn.h : Declaration of the CForceOwnership
|
||
|
|
||
|
#ifndef __FRCOWN_H_
|
||
|
#define __FRCOWN_H_
|
||
|
|
||
|
#include "resource.h" // main symbols
|
||
|
#include <trkwks.hxx>
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CForceOwnership
|
||
|
class ATL_NO_VTABLE CTrkForceOwnership :
|
||
|
public CComObjectRootEx<CComSingleThreadModel>,
|
||
|
public CComCoClass<CTrkForceOwnership, &CLSID_TrkForceOwnership>,
|
||
|
public IDispatchImpl<ITrkForceOwnership, &IID_ITrkForceOwnership, &LIBID_ITRKADMNLib>
|
||
|
{
|
||
|
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<TRK_VOLUME_TRACKING_INFORMATION>
|
||
|
{
|
||
|
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<TRK_FILE_TRACKING_INFORMATION>
|
||
|
{
|
||
|
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<TCHAR>
|
||
|
{
|
||
|
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_
|