
// Copyright (c) Microsoft Corporation. All rights reserved.

//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (c) Microsoft Corporation. All rights reserved.
//
//  File:       trksvr.idl
//
//  Contents:   RPC interface to Tracking (Workstation) Service.
//
//  Classes:
//
//  Functions:
//
//  History:
//
//--------------------------------------------------------------------------

import "trk.idl";

//
//  Tracking (Server) Service data structures.
//

typedef signed long SequenceNumber;

typedef struct
{
        TCHAR                       tszFilePath[ 257 ]; // BUGBUG:  Path size
        CDomainRelativeObjId        droidBirth;
        CDomainRelativeObjId        droidLast;
        HRESULT         hr;
} old_TRK_FILE_TRACKING_INFORMATION;

typedef struct
{
        CDomainRelativeObjId        droidBirth;
        CDomainRelativeObjId        droidLast;
        CMachineId                  mcidLast;
        HRESULT						hr;
} TRK_FILE_TRACKING_INFORMATION;


typedef struct
{
    ULONG cSearch;
    [size_is(cSearch)]
        old_TRK_FILE_TRACKING_INFORMATION *pSearches;
} old_TRKSVR_CALL_SEARCH;

typedef struct
{
    ULONG cSearch;
    [size_is(cSearch)]
        TRK_FILE_TRACKING_INFORMATION *pSearches;
} TRKSVR_CALL_SEARCH;

typedef struct
{
    ULONG cNotifications;
    ULONG cProcessed;
    SequenceNumber seq;
    BOOL fForceSeqNumber;
    CVolumeId *pvolid;

    [size_is(cNotifications)]
        CObjId *rgobjidCurrent;

    [size_is(cNotifications)]
        CDomainRelativeObjId *rgdroidBirth;

    [size_is(cNotifications)]
        CDomainRelativeObjId *rgdroidNew;

} TRKSVR_CALL_MOVE_NOTIFICATION;


typedef struct
{
    ULONG cSources;
    [size_is(cSources)]
        CDomainRelativeObjId *adroidBirth;

    ULONG cVolumes;
    [size_is(cVolumes)]
        CVolumeId *avolid;

} TRKSVR_CALL_REFRESH;

typedef struct _DROID_LIST_ELEMENT
{
    struct _DROID_LIST_ELEMENT * pNext;
    CDomainRelativeObjId         droid;

} DROID_LIST_ELEMENT;

typedef struct
{
    ULONG cdroidBirth;
    [size_is(cdroidBirth)]
        CDomainRelativeObjId * adroidBirth;

    ULONG cVolumes;
    [size_is(cVolumes)] CVolumeId *pVolumes;

} TRKSVR_CALL_DELETE;

typedef [v1_enum] enum
{
    CREATE_VOLUME,  // S_OK or exception(disk full, out of memory)

    QUERY_VOLUME,   // VOLUME_NOT_OWNED: volume found, but not owned by this client
                    // VOLUME_NOT_FOUND: volume not found
                    // VOLUME_OK: volume found, and owned by this client
                    // exceptions: out of memory, disk failure etc

    CLAIM_VOLUME,   // VOLUME_NOT_FOUND, volume not found
                    // VOLUME_ACCESS_DENIED, volume found, secrets do not match
                    // VOLUME_OK, volume found, secrets match
                    // exceptions: out of memory, disk full, etc

    FIND_VOLUME,    // VOLUME_NOT_FOUND, VOLUME_OK

    TEST_VOLUME,    // S_OK

    DELETE_VOLUME

} TRKSVR_SYNC_TYPE;


typedef struct
{
    HRESULT hr;

    TRKSVR_SYNC_TYPE SyncType;      //  CREATE  QUERY   CLAIM  FIND  TEST DELETE
                                    //  ------  -----   -----  ----  ---- ------
    CVolumeId       volume;         //    In      In      In   In     In    In

    CVolumeSecret   secret;         //    In      -       In   -      (In)  -
    CVolumeSecret   secretOld;      //    -       -       In   -      -     -

    SequenceNumber  seq;            //    In      Out     Out  -      In    -
    FILETIME        ftLastRefresh;  //    Out     Out     Out  -      -     -
    CMachineId      machine;        //    -       -       -    Out    (In)  -

} TRKSVR_SYNC_VOLUME;

typedef struct
{
    ULONG       cVolumes;
    [size_is(cVolumes)] TRKSVR_SYNC_VOLUME * pVolumes;

#ifdef VOL_REPL
    FILETIME    ftFirstChange;
    ULONG       cChanges;
    [size_is( , cChanges)] VolumeMapEntry ** ppVolumeChanges;
#endif
} TRKSVR_CALL_SYNC_VOLUMES;


typedef struct 
{
    // Request statistics

    ULONG   cSyncVolumeRequests,   cSyncVolumeErrors,     cSyncVolumeThreads;
    ULONG       cCreateVolumeRequests, cCreateVolumeErrors;
    ULONG       cClaimVolumeRequests,  cClaimVolumeErrors;
    ULONG       cQueryVolumeRequests,  cQueryVolumeErrors;
    ULONG       cFindVolumeRequests,   cFindVolumeErrors;
    ULONG       cTestVolumeRequests,   cTestVolumeErrors;

    ULONG   cSearchRequests,       cSearchErrors,         cSearchThreads;
    ULONG   cMoveNotifyRequests,   cMoveNotifyErrors,     cMoveNotifyThreads;
    ULONG   cRefreshRequests,      cRefreshErrors,        cRefreshThreads;
    ULONG   cDeleteNotifyRequests, cDeleteNotifyErrors,   cDeleteNotifyThreads;

    //ULONG   cMessageTypeErrors;
    ULONG   ulGCIterationPeriod;

    FILETIME    ftLastSuccessfulRequest;
    HRESULT     hrLastError;

    // Quota statistics

    ULONG           dwMoveLimit;
    LONG            lRefreshCounter;
    ULONG           dwCachedVolumeTableCount;
    ULONG           dwCachedMoveTableCount;
    FILETIME        ftCacheLastUpdated;
    BOOL            fIsDesignatedDc;

    // Other

    FILETIME        ftNextGC;
    FILETIME        ftServiceStart;
    ULONG           cMaxRpcThreads, cAvailableRpcThreads, cLowestAvailableRpcThreads;
    ULONG           cNumThreadPoolThreads, cMostThreadPoolThreads;
    //ULONG           Reserved;
    SHORT           cEntriesToGC;
    SHORT           cEntriesGCed;
    //ULONG           SvcCtrlState;
    SHORT           cMaxDsWriteEvents;
    SHORT           cCurrentFailedWrites;

    struct 
    {
        DWORD       dwMajor;
        DWORD       dwMinor;
        DWORD       dwBuildNumber;
    }               Version;

} TRKSVR_STATISTICS;

typedef struct
{
	DWORD	dwParameter;
	DWORD	dwNewValue;
} TRKWKS_CONFIG;

typedef [v1_enum] enum
{
	old_SEARCH,
	MOVE_NOTIFICATION,
	REFRESH,
	SYNC_VOLUMES,
	DELETE_NOTIFY,
	STATISTICS,
	SEARCH,

	// The following are hooks only used within the trkwks service
	// by LnkCallSvrMessage
	WKS_CONFIG,
        WKS_VOLUME_REFRESH

} TRKSVR_MESSAGE_TYPE;


typedef struct
{
    TRKSVR_MESSAGE_TYPE MessageType;

    [switch_is(MessageType)] union
    {
        [case (old_SEARCH)]
            old_TRKSVR_CALL_SEARCH          old_Search;
        [case (MOVE_NOTIFICATION)]
            TRKSVR_CALL_MOVE_NOTIFICATION   MoveNotification;
        [case (REFRESH)]
            TRKSVR_CALL_REFRESH             Refresh;
        [case (SYNC_VOLUMES)]
            TRKSVR_CALL_SYNC_VOLUMES        SyncVolumes;
        [case (DELETE_NOTIFY)]
            TRKSVR_CALL_DELETE              Delete;
        [case (SEARCH)]
            TRKSVR_CALL_SEARCH              Search;
    };

    // Must be NULL unless security is disabled.
    [string] TCHAR *ptszMachineID;

} TRKSVR_MESSAGE_UNION_OLD;


typedef [v1_enum] enum
{
   PRI_0=0,     // highest
   PRI_1=1,
   PRI_2=2,
   PRI_3=3,
   PRI_4=4,
   PRI_5=5,
   PRI_6=6,
   PRI_7=7,
   PRI_8=8,
   PRI_9=9      // lowest
} TRKSVR_MESSAGE_PRIORITY;

typedef struct
{
    TRKSVR_MESSAGE_TYPE MessageType;

    TRKSVR_MESSAGE_PRIORITY Priority;

    [switch_is(MessageType)] union
    {
        [case (old_SEARCH)]
            old_TRKSVR_CALL_SEARCH          old_Search;
        [case (MOVE_NOTIFICATION)]
            TRKSVR_CALL_MOVE_NOTIFICATION   MoveNotification;
        [case (REFRESH)]
            TRKSVR_CALL_REFRESH             Refresh;
        [case (SYNC_VOLUMES)]
            TRKSVR_CALL_SYNC_VOLUMES        SyncVolumes;
        [case (DELETE_NOTIFY)]
            TRKSVR_CALL_DELETE              Delete;
        [case (STATISTICS)]
            TRKSVR_STATISTICS               Statistics;
        [case (SEARCH)]
            TRKSVR_CALL_SEARCH              Search;
        [case (WKS_CONFIG)]
            TRKWKS_CONFIG                   WksConfig;
        [case (WKS_VOLUME_REFRESH)]
            DWORD                           WksRefresh;
    };

    // Must be NULL unless security is disabled.
    [string] TCHAR *ptszMachineID;

} TRKSVR_MESSAGE_UNION;

//  --------------------
//  Interface Attributes
//  --------------------

[
    uuid(4da1c422-943d-11d1-acae-00c04fc2aa3f),
    version(1.0),
    pointer_default(unique)
]

interface trksvr
{

//
//  Tracking (Server) Service API-s.
//

    HRESULT         LnkSvrMessage([in] handle_t IDL_handle, [in, out] TRKSVR_MESSAGE_UNION * pMsg );

    [callback]  HRESULT LnkSvrMessageCallback( [in, out] TRKSVR_MESSAGE_UNION * pMsg );
}

