// Fsa.idl : IDL source for Fsa.dll     2
//

interface IFsaFilter;
interface IFsaFilterClient;
interface IFsaFilterRecall;
interface IFsaPostIt;
interface IFsaRecallNotifyServer;
interface IFsaResource;
interface IFsaResourceEnum;
interface IFsaScanItem;
interface IFsaServer;
interface IFsaTruncator;

// This file will be processed by the MIDL tool to
// produce the type library (Fsa.tlb) and marshalling code.
import "oaidl.idl";
import "wsbint.idl";
import "fsadef.idl";
import "jobdef.idl";
import "tskint.idl";
import "jobint.idl";
import "mvrint.idl";

[
    object,
    uuid(5FFF1640-D487-11d1-A9F5-00A0248903EA),
    helpstring("IFsaFilter Interface"),
    pointer_default(unique)
]
interface IFsaFilter : IUnknown
{
    HRESULT Cancel(void);
    HRESULT CancelRecall([in] IFsaFilterRecall* pRecall);
    HRESULT CompareToIdentifier([in] GUID id, [out] SHORT* pResult);
    HRESULT CompareToIFilter([in] IFsaFilter* pFilter, [out] SHORT* pResult);
    HRESULT DeleteRecall([in] IFsaFilterRecall* pRecall);
    HRESULT EnumRecalls([out] IWsbEnum** ppEnum);
    HRESULT GetIdentifier([out] GUID* pId);
    HRESULT GetLogicalName([in, out, string] OLECHAR** pName, [in] ULONG bufferSize);
    HRESULT GetMaxRecallBuffers([out] ULONG* pMaxBuffers);
    HRESULT GetMaxRecalls([out] ULONG* pMaxRecalls);
    HRESULT GetMinRecallInterval([out] ULONG* pMinIterval);
    HRESULT GetState([out] HSM_JOB_STATE* pState);
    HRESULT IsEnabled(void);
    HRESULT Pause(void);
    HRESULT Resume(void);
    HRESULT GetAdminExemption([out] BOOL *isExempt);
    HRESULT SetIsEnabled([in] BOOL isEnabled);
    HRESULT SetMaxRecalls([in] ULONG maxRecalls);
    HRESULT SetMinRecallInterval([in] ULONG minIterval);
    HRESULT SetMaxRecallBuffers([in] ULONG maxBuffers);
    HRESULT Start(void);
    HRESULT StopIoctlThread(void);
    HRESULT FindRecall([in] GUID recallId, [out] IFsaFilterRecall** pRecall);
    HRESULT SetAdminExemption([in] BOOL isExempt);
};


[
    object,
    uuid(560E5A02-DEDE-11d1-A9F5-00A0248903EA),
    helpstring("IFsaFilterClient Interface"),
    pointer_default(unique)
]
interface IFsaFilterClient : IUnknown
{
    typedef enum _FSA_FILTERCLIENT_COMPARE {
        FSA_FILTERCLIENT_COMPARE_ID = 0,
        FSA_FILTERCLIENT_COMPARE_MACHINE = 1
    } FSA_FILTERCLIENT_COMPARE;

    HRESULT CompareBy([in] FSA_FILTERCLIENT_COMPARE by);
    HRESULT CompareToAuthenticationId([in] LONG luidHigh, [in] ULONG luidLow, [out] SHORT* pResult);
    HRESULT CompareToIClient([in] IFsaFilterClient* pClient, [out] SHORT* pResult);
    HRESULT CompareToMachineName([in, string] OLECHAR* name, [out] SHORT* pResult);
    HRESULT GetAuthenticationId([out] LONG* pLuidHigh, [out] ULONG* pluidLow);
    HRESULT GetDomainName([in, out, string] OLECHAR** pName, [in] ULONG bufferSize);
    HRESULT GetLastRecallTime([out] FILETIME* pTime);
    HRESULT GetMachineName([in, out, string] OLECHAR** pName, [in] ULONG bufferSize);
    HRESULT GetRecallCount([out] ULONG* pCount);
    HRESULT GetUserName([in, out, string] OLECHAR** pName, [in] ULONG bufferSize);
    HRESULT HasRecallDisabled(void);
    HRESULT HitRecallLimit(void);
    HRESULT SetAuthenticationId([in] LONG luidHigh, [in] ULONG luidLow);
    HRESULT SetDomainName([in, string] OLECHAR* pName);
    HRESULT SetHasRecallDisabled([in] BOOL isDisabled);
    HRESULT SetHitRecallLimit([in] BOOL hitLimit);
    HRESULT SetLastRecallTime([in] FILETIME time);
    HRESULT SetMachineName([in, string] OLECHAR* pName);
    HRESULT SetRecallCount([in] ULONG count);
    HRESULT SetUserName([in, string] OLECHAR* pName);
    HRESULT StartIdentify(void);
    HRESULT SetTokenSource([in] CHAR *source);
    HRESULT SendRecallInfo([in] IFsaFilterRecall *pRecall, [in] BOOL starting, [in] HRESULT rHr);
    HRESULT IdentifyThread(void);
    HRESULT SetIsAdmin([in] BOOLEAN isAdmin);
    HRESULT GetIsAdmin([out] BOOLEAN *isAdmin);
    HRESULT CheckRecallLimit([in] DWORD minRecallInterval, [in] DWORD maxRecalls, [in] BOOLEAN exemptAdmin);
};


[
    object,
    uuid(5E176F27-6F53-4C84-B935-9259297669B0),
    helpstring("IFsaFilterRecall Interface"),
    pointer_default(unique)
]
interface IFsaFilterRecall : IUnknown
{
    typedef enum _FSA_RECALL_COMPARE {
        FSA_RECALL_COMPARE_ID = 0,
        FSA_RECALL_COMPARE_IRECALL = 1,
        FSA_RECALL_COMPARE_CONTEXT_ID = 2
    } FSA_RECALL_COMPARE;

    HRESULT CompareToIdentifier([in] GUID id, [out] SHORT* pResult);
    HRESULT CompareToIRecall([in] IFsaFilterRecall* pRecall, [out] SHORT* pResult);
    HRESULT CompareToDriversRecallId([in] ULONGLONG id, [out] SHORT* pResult);
    HRESULT CompareToDriversContextId([in] ULONGLONG id, [out] SHORT* pResult);
    HRESULT CompareBy([in] FSA_RECALL_COMPARE by);
    HRESULT GetIdentifier([out] GUID* pId);
    HRESULT GetMode([out] ULONG* pMode);
    HRESULT GetOffset([out] LONGLONG* pOffset);
    HRESULT GetPath([in, out, string] OLECHAR** pName, [in] ULONG bufferSize);
    HRESULT GetResource([out] IFsaResource** ppResource);
    HRESULT GetRecallFlags([out] ULONG* recallFlags);
    HRESULT GetSession([out] IHsmSession** ppSession);
    HRESULT GetSize([out] LONGLONG* pSize);
    HRESULT GetState([out] HSM_JOB_STATE* pState);
    HRESULT GetUserName([in, out, string] OLECHAR** pName, [in] ULONG bufferSize);
    HRESULT HasCompleted([in] HRESULT resultHr);
    HRESULT WasCancelled(void);
    HRESULT CreateLocalStream([out] IStream **ppStream);
    HRESULT CheckRecallLimit([in] DWORD minRecallInterval, [in] DWORD maxRecalls, [in] BOOLEAN exemptAdmin);
    HRESULT AddClient([in] IFsaFilterClient *pWaitingClient);
};


[
    object,
    uuid(172F71CD-A452-4005-8E3E-7BCEAE124D53),
    helpstring("IFsaResource Interface"),
    pointer_default(unique)
]
interface IFsaResource : IUnknown
{
    typedef enum _FSA_RESOURCE_COMPARE {
        FSA_RESOURCE_COMPARE_ID = 0,
        FSA_RESOURCE_COMPARE_NAME = 1,
        FSA_RESOURCE_COMPARE_PATH = 2,
        FSA_RESOURCE_COMPARE_ALTERNATEPATH = 3,
        FSA_RESOURCE_COMPARE_SERIAL = 4,
        FSA_RESOURCE_COMPARE_USER_NAME = 5,
        FSA_RESOURCE_COMPARE_STICKY_NAME = 6
    } FSA_RESOURCE_COMPARE;

    HRESULT AddPremigrated([in] IFsaScanItem* pScanItem, [in] LONGLONG offset, [in] LONGLONG size, [in] BOOL isWaitingForClose, [in] LONGLONG usn);
    HRESULT AddTruncated([in] IFsaScanItem* pScanItem, [in] LONGLONG offset, [in] LONGLONG size);
    HRESULT BeginSession([in, string] OLECHAR* name, [in] ULONG logControl, [in] ULONG runId, [in] ULONG subRunId, [out] IHsmSession** ppSession);
    HRESULT BeginValidate(void);
    HRESULT CheckForValidate([in] BOOL bForceValidate);
    HRESULT CompareBy([in] FSA_RESOURCE_COMPARE by);
    HRESULT CompareToAlternatePath([in, string] OLECHAR* path, [out] SHORT* pResult);
    HRESULT CompareToIdentifier([in] GUID id, [out] SHORT* pResult);
    HRESULT CompareToIResource([in] IFsaResource* pResource, [out] SHORT* pResult);
    HRESULT CompareToName([in, string] OLECHAR* name, [out] SHORT* pResult);
    HRESULT CompareToUserName([in, string] OLECHAR* userName, [out] SHORT* pResult);
    HRESULT CompareToPath([in, string] OLECHAR* path, [out] SHORT* pResult);
    HRESULT CompareToSerial([in] ULONG serial, [out] SHORT* pResult);
    HRESULT CompareToStickyName([in, string] OLECHAR* name, [out] SHORT* pResult);
    HRESULT CreateDefaultRules(void);
    HRESULT EndSession([in] IHsmSession* pSession);
    HRESULT EndValidate([in] HSM_JOB_STATE state);
    HRESULT EnumDefaultRules([out] IWsbEnum** ppEnum);
    HRESULT FindFirst([in, string] OLECHAR* path, [in] IHsmSession* pSession, [out] IFsaScanItem** ppScanItem);
    HRESULT FindFirstInRPIndex([in] IHsmSession* pSession, [out] IFsaScanItem** ppScanItem);
    HRESULT FindFirstInDbIndex([in] IHsmSession* pSession, [out] IFsaScanItem** ppScanItem);
    HRESULT FindNext([in] IFsaScanItem* pScanItem);
    HRESULT FindNextInRPIndex([in] IFsaScanItem* pScanItem);
    HRESULT FindNextInDbIndex([in] IFsaScanItem* pScanItem);
    HRESULT FindFileId ([in] LONGLONG fileId, [in] IHsmSession* pSession, [out] IFsaScanItem** ppScanItem);
    HRESULT FindObjectId ([in] LONGLONG objIdHi, [in] LONGLONG objIdLo, [in] IHsmSession* pSession, [out] IFsaScanItem** ppScanItem);
    HRESULT GetAlternatePath([in, out, string] OLECHAR** pPath, [in] ULONG bufferSize);
    HRESULT GetDefaultRules([out] IWsbCollection** ppCollection);
    HRESULT GetDbPath([in, out, string] OLECHAR** pPath, ULONG bufferSize);
    HRESULT GetUnmanageDbPath([in, out, string] OLECHAR** pPath, ULONG bufferSize);
    HRESULT GetFreeLevel([out] ULONG* pLevel);
    HRESULT GetFsName([in, out, string] OLECHAR** pName, ULONG bufferSize);
    HRESULT GetHsmEngine([out] IHsmFsaTskMgr** ppEngine);
    HRESULT GetHsmLevel([out] ULONG* pLevel);
    HRESULT GetIdentifier([out] GUID* pId);
    HRESULT GetLogicalName([in, out, string] OLECHAR** pName, [in] ULONG bufferSize);
    HRESULT GetManageableItemLogicalSize([out] LONGLONG* pSize);
    HRESULT GetManageableItemAccessTime([out] BOOL* isRelative, [out] FILETIME* pTime);
    HRESULT GetManagingHsm([out] GUID* pId);
    HRESULT GetName([in, out, string] OLECHAR** pName, [in] ULONG bufferSize);
    HRESULT GetOldPath([in, out, string] OLECHAR** pPath, [in] ULONG bufferSize);
    HRESULT GetPath([in, out, string] OLECHAR** pPath, [in] ULONG bufferSize);
    HRESULT GetSerial([out] ULONG *serial);
    HRESULT GetSizes([out] LONGLONG* pTotal, [out] LONGLONG* pFree, [out] LONGLONG* pPremigrated, [out] LONGLONG* pTruncated);
    HRESULT GetTruncator([out] IFsaTruncator** ppTruncator);
    HRESULT GetUncPath([in, out, string] OLECHAR** pPath, [in] ULONG bufferSize);
    HRESULT GetUserFriendlyName([in, out, string] OLECHAR** pName, [in] ULONG bufferSize);
    HRESULT GetStickyName([in, out, string] OLECHAR** pName, [in] ULONG bufferSize);
    HRESULT IsActive(void);
    HRESULT IsAvailable(void);
    HRESULT IsDeletePending(void);
    HRESULT IsManaged(void);
    HRESULT Manage([in] IFsaScanItem* pScanItem, [in] LONGLONG offset, [in] LONGLONG size, [in] GUID storagePoolId, [in] BOOL truncate);
    HRESULT ManagedBy([in] GUID hsmId, [in] ULONG hsmLevel, [in] BOOL release);
    HRESULT NeedsRepair(void);
    HRESULT ProcessResult([in] IFsaPostIt* pResult);
    HRESULT Recall([in] IFsaScanItem* pScanItem, [in] LONGLONG offset, [in] LONGLONG size, [in] BOOL deletePlaceholder);
    HRESULT RemovePremigrated([in] IFsaScanItem* pScanItem, [in] LONGLONG offset, [in] LONGLONG size);
    HRESULT RemoveTruncated([in] IFsaScanItem* pScanItem, [in] LONGLONG offset, [in] LONGLONG size);
    HRESULT SetHsmLevel([in] ULONG level);
    HRESULT SetIsActive([in] BOOL isActive);
    HRESULT SetIsAvailable([in] BOOL isActive);
    HRESULT SetIsDeletePending([in] BOOL isDeletePending);
    HRESULT SetManageableItemLogicalSize([in] LONGLONG pSize);
    HRESULT SetManageableItemAccessTime([in] BOOL isRelative, [in] FILETIME pTime);
    HRESULT SetSerial([in] ULONG serial);
    HRESULT StartJob([in, string] OLECHAR* startingPath, [in] IHsmSession* pSession);
    HRESULT StartJobSession([in] IHsmJob* pJob, [in] ULONG subRunId, [out] IHsmSession** ppSession);
    HRESULT Validate([in] IFsaScanItem* pScanItem, [in] LONGLONG offset, [in] LONGLONG size, [in] LONGLONG usn);
    HRESULT SetupValidateJob([in] SYSTEMTIME runtime);
    HRESULT GetUsnId([out] ULONGLONG *usnId);
    HRESULT ValidateForTruncate([in] IFsaScanItem* pScanItem, [in] LONGLONG offset, [in] LONGLONG size, [in] LONGLONG usn);
};


[
    object,
    uuid(087e7ed0-727a-11d2-9cd3-00a0c9118102),
    helpstring("IFsaScanItem Interface"),
    pointer_default(unique)
]
interface IFsaScanItem : IUnknown
{
    HRESULT CheckIfSparse([in] LONGLONG offset, [in] LONGLONG size);  
    HRESULT CompareToIScanItem([in] IFsaScanItem* pScanItem, [out]SHORT* pResult);
    HRESULT CompareToPathAndName([in, string] OLECHAR* path, [in, string] OLECHAR* name, [out] SHORT* pResult);
    HRESULT Copy([in, string] OLECHAR* dest, [in] BOOL retainHierarcy, [in] BOOL expandPlaceholders, [in] BOOL overwriteExisting);  
    HRESULT CreateLocalStream([out] IStream **ppStream);
    HRESULT CreatePlaceholder([in] LONGLONG offset, [in] LONGLONG size, [in] FSA_PLACEHOLDER pPlaceholder, [in] BOOL checkUsn, [in] LONGLONG usn, [out] LONGLONG *pUsn);  
    HRESULT Delete(void);  
    HRESULT DeletePlaceholder([in] LONGLONG offset, [in] LONGLONG size);  
    HRESULT FindFirstPlaceholder([out] LONGLONG* pOffset, [out] LONGLONG* pSize, [out] FSA_PLACEHOLDER* pPlaceholder);  
    HRESULT FindNextPlaceholder([in, out] LONGLONG* pOffset, [in, out] LONGLONG* pSize, [in, out] FSA_PLACEHOLDER* pPlaceholder);  
    HRESULT GetAccessTime([out] FILETIME* pTime);  
    HRESULT GetFileId([out] LONGLONG* pFileId);
    HRESULT GetFileUsn([out] LONGLONG* pFileUsn);
    HRESULT GetFullPathAndName([in, string] OLECHAR* prependix, [in, string] OLECHAR* appendix, [in, out, string] OLECHAR** pPath, [in] ULONG bufferSize);
    HRESULT GetGroup([in, out, string] OLECHAR** pOwner, [in] ULONG bufferSize);  
    HRESULT GetLogicalSize([out] LONGLONG* pSize);  
    HRESULT GetModifyTime([out] FILETIME* pTime);  
    HRESULT GetName([in, out, string] OLECHAR** pName, [in] ULONG bufferSize);
    HRESULT GetOwner([in, out, string] OLECHAR** pOwner, [in] ULONG bufferSize);  
    HRESULT GetPathForFind([in, string] OLECHAR* searchName, [in, out, string] OLECHAR** pPath, [in] ULONG bufferSize);
    HRESULT GetPath([in, out, string] OLECHAR** pPath, [in] ULONG bufferSize);
    HRESULT GetPathAndName([in, string] OLECHAR* appendix, [in, out, string] OLECHAR** pPath, [in] ULONG bufferSize);
    HRESULT GetPhysicalSize([out] LONGLONG* pSize);
    HRESULT GetPlaceholder([in] LONGLONG offset, [in] LONGLONG size, [out] FSA_PLACEHOLDER* pPlaceholder);  
    HRESULT GetSession([out] IHsmSession** ppSession);  
    HRESULT GetUncPathAndName([in, string] OLECHAR* prependix, [in, string] OLECHAR* appendix, [in, out, string] OLECHAR** pPath, [in] ULONG bufferSize);
    HRESULT GetVersionId([out] LONGLONG* pId);
    HRESULT HasExtendedAttributes(void);  
    HRESULT IsALink(void);  
    HRESULT IsAParent(void); 
    HRESULT IsARelativeParent(void); 
    HRESULT IsCompressed(void); 
    HRESULT IsDeleteOK([in] IFsaPostIt *pPostIt);
    HRESULT IsEncrypted(void); 
    HRESULT IsGroupMemberOf([in, string] OLECHAR* group);
    HRESULT IsHidden(void); 
    HRESULT IsManageable([in] LONGLONG offset, [in] LONGLONG size);  
    HRESULT IsManaged([in] LONGLONG offset, [in] LONGLONG size);  
    HRESULT IsMbit(void);  
    HRESULT IsMigrateOK([in] IFsaPostIt *pPostIt);
    HRESULT IsOffline(void);  
    HRESULT IsOwnerMemberOf([in, string] OLECHAR* group);
    HRESULT IsPremigrated([in] LONGLONG offset, [in] LONGLONG size);  
    HRESULT IsReadOnly(void); 
    HRESULT IsRecallOK([in] IFsaPostIt *pPostIt);
    HRESULT IsSparse(void); 
    HRESULT IsSystem(void); 
    HRESULT IsTotallySparse(void); 
    HRESULT IsTruncated([in] LONGLONG offset, [in] LONGLONG size);  
    HRESULT Manage([in] LONGLONG offset, [in] LONGLONG size, [in] GUID storagePoolId, [in] BOOL truncate);  
    HRESULT Move([in, string] OLECHAR* dest, [in] BOOL retainHierarcy, [in] BOOL expandPlaceholders, [in] BOOL overwriteExisting);  
    HRESULT Recall([in] LONGLONG offset, [in] LONGLONG size, [in] BOOL deletePlaceholder);  
    HRESULT Recycle(void);  
    HRESULT Truncate([in] LONGLONG offset, [in] LONGLONG size);  
    HRESULT Unmanage([in] LONGLONG offset, [in] LONGLONG size);  
    HRESULT Validate([in] LONGLONG offset, [in] LONGLONG size);  
    HRESULT PrepareForManage ([in] LONGLONG offset, [in] LONGLONG size);  
    HRESULT Verify([in] LONGLONG offset, [in] LONGLONG size);
    HRESULT TruncateValidated([in] LONGLONG offset, [in] LONGLONG size);

};


[
    object,
    uuid(C49D553D-CA2B-4482-A404-CD4B6B44EAE4),
    helpstring("IFsaServer Interface"),
    pointer_default(unique)
]
interface IFsaServer : IHsmSystemState
{
    HRESULT EnumResources([out] IWsbEnum** ppEnum);
    HRESULT FindResourceByAlternatePath([in, string] OLECHAR* path, [out] IFsaResource** ppResource);
    HRESULT FindResourceById([in] GUID id, [out] IFsaResource** ppResource);
    HRESULT FindResourceByName([in, string] OLECHAR* name, [out] IFsaResource** ppResource);
    HRESULT FindResourceByPath([in, string] OLECHAR* path, [out] IFsaResource** ppResource);
    HRESULT FindResourceBySerial([in] ULONG serial, [out] IFsaResource** ppResource);
    HRESULT FindResourceByStickyName([in, string] OLECHAR* name, [out] IFsaResource** ppResource);
    HRESULT GetAutosave([out] ULONG* pMilliseconds);
    HRESULT GetDbPath([in, out, string] OLECHAR** pPath, ULONG bufferSize);
    HRESULT GetDbPathAndName([in, out, string] OLECHAR** pPath, ULONG bufferSize);
    HRESULT GetIDbSys([out] IWsbDbSys** ppDbSys);
    HRESULT GetUnmanageIDbSys([out] IWsbDbSys** ppDbSys);
    HRESULT GetFilter([out] IFsaFilter** ppFilter);
    HRESULT GetIDbPath([in, out, string] OLECHAR** pPath, ULONG bufferSize);
    HRESULT GetUnmanageIDbPath([in, out, string] OLECHAR** pPath, ULONG bufferSize);
    HRESULT GetIdentifier([out] GUID* pId);
    HRESULT GetLogicalName([in, out, string] OLECHAR** pName, [in] ULONG bufferSize);
    HRESULT GetName([in, out, string] OLECHAR** pName, [in] ULONG bufferSize);
    HRESULT Init(void);
    HRESULT ScanForResources(void);
    HRESULT SetAutosave([in] ULONG milliseconds);

};


[
    object,
    uuid(9CABC042-8AA4-11d0-81E6-00A0C91180F2),
    helpstring("IFsaTruncator Interface"),
    pointer_default(unique)
]
interface IFsaTruncator : IHsmSystemState
{
    typedef enum _FSA_PREMIGRATED_SORT_ORDER {
        FSA_SORT_PL_BY_ACCESS_TIME   = 0,
        FSA_SORT_PL_BY_SIZE          = 1,
        FSA_SORT_PL_BY_PATH_NAME     = 2,
        FSA_SORT_PL_BY_SIZE_AND_TIME = 3,
    } FSA_PREMIGRATED_SORT_ORDER;

    HRESULT GetSession([out] IHsmSession** ppSession);
    HRESULT GetKeepRecallTime([out] FILETIME* pTime);
    HRESULT GetMaxFilesPerRun([out] LONGLONG* pMaxFiles);
    HRESULT GetPremigratedSortOrder([out] FSA_PREMIGRATED_SORT_ORDER* pSortOrder);
    HRESULT GetRunInterval([out] ULONG* pMilliseconds);
    HRESULT SetMaxFilesPerRun([in] LONGLONG maxFiles);
    HRESULT SetPremigratedSortOrder([in] FSA_PREMIGRATED_SORT_ORDER SortOrder);
    HRESULT SetRunInterval([in] ULONG milliseconds);
    HRESULT SetKeepRecallTime([in] FILETIME time);
    HRESULT Start([in] IFsaResource* pResource);  
    HRESULT KickStart(void);  
};


[
    object,
    uuid(B5A1ED6A-CED4-4D16-9A76-8CD4473A2CE9),
    helpstring("IFsaPostIt Interface"),
    pointer_default(unique)
]
interface IFsaPostIt : IUnknown
{
    HRESULT GetFileVersionId([out] LONGLONG  *pFileVersionId);
    HRESULT GetFilterRecall([out] IFsaFilterRecall** ppRecall);         
    HRESULT GetMode([out] ULONG *pMode);
    HRESULT GetPath([in, out, string] OLECHAR** pPath, [in] ULONG bufferSize);
    HRESULT GetPlaceholder([out] FSA_PLACEHOLDER *pPlaceholder);        
    HRESULT GetRequestAction([out] FSA_REQUEST_ACTION *pRequestAction); 
    HRESULT GetRequestOffset([out] LONGLONG  *pRequestOffset);
    HRESULT GetRequestSize([out] LONGLONG *pRequestSize);
    HRESULT GetResult([out] HRESULT *pHr);
    HRESULT GetResultAction([out] FSA_RESULT_ACTION *pResultAction);
    HRESULT GetSession([out] IHsmSession **ppSession);          
    HRESULT GetStoragePoolId([out] GUID  *pStoragePoolId);  
    HRESULT GetUSN([out] LONGLONG  *pUsn);  
    HRESULT GetThreadId([out] DWORD  *pThreadId);  

    HRESULT SetFileVersionId([in] LONGLONG  fileVersionId);
    HRESULT SetFilterRecall([in] IFsaFilterRecall* pRecall);            
    HRESULT SetMode([in] ULONG mode);
    HRESULT SetPath([in, string] OLECHAR * path);               
    HRESULT SetPlaceholder([in] FSA_PLACEHOLDER *pPlaceholder);     
    HRESULT SetRequestAction([in] FSA_REQUEST_ACTION requestAction);    
    HRESULT SetRequestOffset([in] LONGLONG  requestOffset);
    HRESULT SetRequestSize([in] LONGLONG requestSize);
    HRESULT SetResult([in] HRESULT hr);
    HRESULT SetResultAction([in] FSA_RESULT_ACTION pResultAction);
    HRESULT SetSession([in] IHsmSession *pSession);         
    HRESULT SetStoragePoolId([in] GUID  storagePoolId); 
    HRESULT SetUSN([in] LONGLONG  usn); 
    HRESULT SetThreadId([in] DWORD threadId); 
};

[
    object,
    uuid(D68BD5B1-D6AA-11d0-9EDA-00A02488FCDE),
    helpstring("IFsaRecallNotifyClient Interface"),
    pointer_default(unique)
]
interface IFsaRecallNotifyClient : IUnknown
{
    HRESULT IdentifyWithServer ( [in, string] OLECHAR * szServerName );
    HRESULT OnRecallStarted    ( [in] IFsaRecallNotifyServer * pRecall );
    HRESULT OnRecallFinished   ( [in] IFsaRecallNotifyServer * pRecall, [in] HRESULT hr );
};

[
    object,
    uuid(D68BD5B2-D6AA-11d0-9EDA-00A02488FCDE),
    helpstring("IFsaRecallNotifyServer Interface"),
    pointer_default(unique)
]
interface IFsaRecallNotifyServer : IUnknown
{
    HRESULT Init([in] IFsaFilterRecall* pRecall);
    
    HRESULT Cancel(void);
    
    HRESULT GetIdentifier([out] GUID* pId);
    HRESULT GetMode([out] ULONG* pMode);
    HRESULT GetOffset([out] LONGLONG* pOffset);
    HRESULT GetPath([in, out, string] OLECHAR** pName, [in] ULONG bufferSize);
    HRESULT GetRecallFlags([out] ULONG* recallFlags);
    HRESULT GetSize([out] LONGLONG* pSize);
    HRESULT GetState([out] HSM_JOB_STATE* pState);
    HRESULT GetUserName([in, out, string] OLECHAR** pName, [in] ULONG bufferSize);
    HRESULT WasCancelled(void);
    
};
