//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1996 - 2000.
//
//  File:       ciintf.idl
//
//  Contents:   Content Index Framework interfaces definition
//
//  History:    Nov-11-1996   SrikantS        Created
//
//--------------------------------------------------------------------------

#ifdef IMPORT_IDL_DEPENDENTS
import "oaidl.idl";
import "filter.idl";
#endif

#include "idlmulti.h"

const ULONG  CI_DEFAULT_PID = 0x0;
const ULONG  CI_INVALID_PID = 0xffffffff;
const ULONG  CI_VOLID_USN_NOT_ENABLED = 0x0;

typedef enum tagCI_GLOBAL_CONSTANTS
{
    CI_LOW_RESOURCE  = 1,
    CI_RESET_UPDATES = 2

} CI_GLOBAL_CONSTANTS;

//+-------------------------------------------------------------------------
//
// Interface   : ICiCDocName
//
// Description : Interface that encapsulates a document name.
//
//+-------------------------------------------------------------------------
LOCAL_INTERFACE(76615076-3C2B-11D0-8C90-0020AF1D740E)
interface ICiCDocName : IUnknown
{
    SCODE Init( [in, size_is(cbName)] BYTE const * pbName,
                [in] ULONG cbName );

    SCODE Set( [in] ICiCDocName const * pICiCDocName );

    SCODE Clear( void );

    SCODE IsValid( void ) const;

    SCODE Duplicate( [out] ICiCDocName ** ppICiCDocName ) const;

    SCODE Get( [out, size_is(*pcbName)] BYTE * pbName,
               [in,out] ULONG *pcbName ) const;

    SCODE GetNameBuffer( [out] BYTE const ** ppName,
                         [out] ULONG * pcbName );

    SCODE GetBufSizeNeeded( [out] ULONG * pcbName ) const;
}

//+-------------------------------------------------------------------------
//
// Interface   : ICiCOpenedDoc
//
// Description : Represents an opened document which can be used to retrieve
//               property sets and properties.
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(151EDFBE-3C2F-11D0-8C90-0020AF1D740E)
interface ICiCOpenedDoc : IUnknown
{
    SCODE Open( [in,size_is(cbDocName)] BYTE const * pbDocName,
                [in] ULONG cbDocName );

    SCODE Close( void );

    SCODE GetDocumentName( [out] ICiCDocName ** ppICiDocName );

    SCODE GetStatPropertyEnum( [out] IPropertyStorage ** ppIPropStorage );

    SCODE GetPropertySetEnum( [out] IPropertySetStorage ** ppIPropSetStorage );

    SCODE GetPropertyEnum( [in] REFFMTID GuidPropSet,
                           [out] IPropertyStorage ** ppIPropStorage );

    SCODE GetIFilter( [out] IFilter ** ppIFilter );

    SCODE GetSecurity( [out, size_is(*pcbData)] BYTE * pbData,
                       [in,out] ULONG * pcbData );

    SCODE IsInUseByAnotherProcess( [out] BOOL *pfInUse );
}

//+-------------------------------------------------------------------------
//
// Interface   : ICiAdminParams
//
// Description : sets/gets CI configuration parameters.
//
// History     : 19 Oct 1998  sundarA : added CI_AP_IS_ENUM_ALLOWED
//+-------------------------------------------------------------------------


LOCAL_INTERFACE(a82d48c6-3f0f-11d0-8c91-0020af1d740e)
interface ICiAdminParams : IUnknown
{
    //
    // Enumerated values for the various admin parameters that can be set.
    //
    typedef enum tagCI_ADMIN_PARAMS
    {
        CI_AP_MERGE_INTERVAL,          // Sleep time between merges
        CI_AP_MAX_UPDATES,             // Max # of updates passed by catalog
        CI_AP_MAX_WORDLISTS,           // Max # of word lists that can exist
        CI_AP_MIN_SIZE_MERGE_WORDLISTS,// Min combined size of wordlists

        CI_AP_MAX_WORDLIST_SIZE,       // Max size at which docs can be added
        CI_AP_MIN_WORDLIST_MEMORY,     // Min free mem for wordlist creation
        CI_AP_LOW_RESOURCE_SLEEP,      // Time to wait after low resource condition
        CI_AP_MAX_WORDLIST_MEMORY_LOAD,// Max mem load for wordlist creation

        CI_AP_MAX_FRESH_COUNT,         // Max fresh list entries before mmerge
        CI_AP_MAX_SHADOW_INDEX_SIZE,   // Max combined size of shadow indexes
        CI_AP_MIN_DISK_FREE_FORCE_MERGE,// Min disk free before a mmerge is forced
        CI_AP_MAX_SHADOW_FREE_FORCE_MERGE, // Max space for shadow indexes (% free space)

        CI_AP_MAX_INDEXES,             // Maximum number of indexes (persistent or wordlist)
        CI_AP_MAX_IDEAL_INDEXES,       // Maximum number of indexes in an 'ideal' system.
        CI_AP_MIN_MERGE_IDLE_TIME,     // Minumum idle time to perform annealing merge.
        CI_AP_MAX_PENDING_DOCUMENTS,   // Max pending docs for property queries

        CI_AP_MASTER_MERGE_TIME,       // Time for queue master merge
        CI_AP_MAX_QUEUE_CHUNKS,        // # of chunks in in-memory change list
        CI_AP_MASTER_MERGE_CHECKPOINT_INTERVAL, // # of bytes to process before Checkpointing
        CI_AP_FILTER_BUFFER_SIZE,      // Mem buf size used by CI filter

        CI_AP_FILTER_RETRIES,          // # of attempts to filter a document
        CI_AP_FILTER_RETRY_INTERVAL,   // # of minutes between retrying an open doc
        CI_AP_MIN_IDLE_QUERY_THREADS,  // Min number of idle query threads to maintain
        CI_AP_MAX_ACTIVE_QUERY_THREADS,// Maximum number of query threads to allow

        CI_AP_MAX_QUERY_TIMESLICE,     // Query timeslice (if waiting queries)
        CI_AP_MAX_QUERY_EXECUTION_TIME,// Maximum query execution time (if waiting queries)
        CI_AP_MAX_RESTRICTION_NODES,   // Maximum normalized restriction nodes
        CI_AP_CLUSTERINGTIME,          // Time for clustering

        CI_AP_MAX_FILESIZE_MULTIPLIER, // Largest amount of data from single file
        CI_AP_DAEMON_RESPONSE_TIMEOUT, // Timeout waiting for response
        CI_AP_FILTER_DELAY_INTERVAL,   // Number of seconds the filter thread should wait
                                       // if there are too few documents. (slm hack)
        CI_AP_FILTER_REMAINING_THRESHOLD,
                                       // Number of documents below which filter will
                                       // introduce a delay

        CI_AP_MAX_CHARACTERIZATION,    // Maximum size in CWC of the
                                       // characterization generated

        CI_AP_MAX_FRESH_DELETES,       // Maximum number of uncommitted delete entries
                                       // before a delete merge is initiated.

        CI_AP_MAX_WORDLIST_IO,         // Greater than this amount of I/O activity will
                                       // delay new wordlist creation.  Units: KB/Sec

        CI_AP_WORDLIST_RESOURCE_CHECK_INTERVAL,
                                       // I/O and low memory resource threshold check
                                       // performed at most once in this number of
                                       // seconds. Units: Seconds

        CI_AP_STARTUP_DELAY,           // Milliseconds after boot when work can begin

        CI_AP_GENERATE_CHARACTERIZATION,  // TRUE if characterization should be generated.

        CI_AP_MIN_WORDLIST_BATTERY,    // Percentage of battery power required to generate wordlists


        CI_AP_THREAD_PRIORITY_MERGE,   // Priority of merge thread
        CI_AP_THREAD_PRIORITY_FILTER,  // Priority of update/filter thread
        CI_AP_THREAD_CLASS_FILTER,     // Priority class of the filter thread.
        CI_AP_EVTLOG_FLAGS,            // Flags for event log

        CI_AP_MISC_FLAGS,              // Miscellaneous Flags
        CI_AP_GENERATE_RELEVANT_WORDS, // Set to TRUE if relevant words should be generated
        CI_AP_FFILTER_FILES_WITH_UNKNOWN_EXTENSIONS,
                                       // Flag indicating if files with unknown
                                       // extensions should be filtered.

        CI_AP_FILTER_DIRECTORIES,      // Should queries return directories?
        CI_AP_FILTER_CONTENTS,         // Flag indicating if contents should be filtered
        CI_AP_MAX_FILESIZE_FILTERED,   // Maximum size of a file with unknown filter that will
                                       // be filtered. Unit: Kilobytes
        CI_AP_MIN_CLIENT_IDLE_TIME,    // A client can afford to be idle for at least this many
                                       // seconds before possibly getting disconnected.

        CI_AP_MAX_DAEMON_VM_USE,       // Maximum amount of pagefile, in KB, used by out-of-process daemon.

        CI_AP_SECQ_FILTER_RETRIES,     // # of attempts to filter a document in secondary Queue

        CI_AP_WORDLIST_USER_IDLE,      // User idle time to generate wordlists

        CI_AP_IS_ENUM_ALLOWED,         // Admin parameter for allowing enumeration

        CI_AP_MIN_DISK_SPACE_TO_LEAVE, // Number of megabytes to leave on disk

        CI_AP_MAX_DWORD_VAL,           // THIS MUST BE THE LAST DWORD PARAM ALWAYS

        //
        // Values which don't fit in DWORD must be declared here.
        //

        CI_AP_MAX_VAL                  // THIS MUST BE THE LAST IN THE ENUMS

    } CI_ADMIN_PARAMS;

    //
    // Enumerated values for types of "high-level" content index
    // configuration.
    //
    typedef enum tagCI_CONFIG_TYPE
    {
        CI_CONFIG_DEFAULT = 0x0,
        CI_CONFIG_OPTIMIZE_FOR_SPEED = 0x1,
        CI_CONFIG_OPTIMIZE_FOR_SIZE  = 0x2,
        CI_CONFIG_OPTIMIZE_FOR_DEDICATED_INDEXING = 0x4,
        CI_CONFIG_OPTIMIZE_FOR_DEDICATED_QUERYING = 0x8,
        CI_CONFIG_OPTIMIZE_FOR_DEDICATED_INDEX_QUERY = 0x10,
        CI_CONFIG_OPTIMIZE_FOR_MULTIPURPOSE_SERVER = 0x20

    } CI_CONFIG_TYPE;

    SCODE SetValue( [in] CI_ADMIN_PARAMS param,
                    [in] DWORD dwValue );

    SCODE SetParamValue( [in] CI_ADMIN_PARAMS param,
                         [in] PROPVARIANT const * pVarValue );

    SCODE SetValues( ULONG nParams,
                     [in, size_is(nParams)] const PROPVARIANT     * aParamVals,
                     [in, size_is(nParams)] const CI_ADMIN_PARAMS * aParamNames );

    SCODE GetValue( [in]  CI_ADMIN_PARAMS param,
                    [out] DWORD * pdwValue );

    SCODE GetInt64Value( [in] CI_ADMIN_PARAMS param,
                         [out] __int64 * pValue );

    SCODE GetParamValue( [in] CI_ADMIN_PARAMS param,
                         [out] PROPVARIANT ** ppVarValue );

    SCODE IsSame( [in]  CI_ADMIN_PARAMS param,
                  [in]  PROPVARIANT const * pVarValue,
                  [out] BOOL * pfSame );

    SCODE SetConfigType( [in] CI_CONFIG_TYPE configType );

    SCODE GetConfigType( [out] CI_CONFIG_TYPE * pConfigType );

}

interface IWordBreaker;
interface IStemmer;
interface IStream;

//+-------------------------------------------------------------------------
//
// Interface   : ICiCLangRes
//
// Description : An interface to provide language resources like word
//               breakers, stemmers, etc.
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(914c2e6c-43fe-11d0-8c91-0020af1d740e)
interface ICiCLangRes : IUnknown
{

    SCODE GetWordBreaker(   [in] LCID locale,
                            [in] PROPID pid,
                            [out] IWordBreaker ** ppWordBreaker );

    SCODE GetStemmer(   [in] LCID locale,
                        [in] PROPID pid,
                        [out] IStemmer ** ppStemmer );

    SCODE GetNoiseWordList( [in] LCID locale,
                            [in] PROPID pid,
                            [out] IStream ** ppNoiseWordList );
}

//+-------------------------------------------------------------------------
//
// Interface   : ICiAdmin
//
// Description : An interface with methods to adminster Ci internal state.
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(AE67C7D8-85D3-11d0-8C45-00C04FC2DB8D)
interface ICiAdmin : IUnknown
{

   SCODE InvalidateLangResources ();

}

//+-------------------------------------------------------------------------
//
// Interface   : ICiFrameworkQuery
//
// Description : An interface with methods that provide access to
//               various resources like CLangList
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(AE67C7D9-85D3-11d0-8C45-00C04FC2DB8D)
interface ICiFrameworkQuery : IUnknown
{

    SCODE GetCCI( [out] void ** ppCCI );

    SCODE ProcessError( [in] long lErrorCode );

    SCODE GetLangList( [out] void **ppLangList );

}

//+-------------------------------------------------------------------------
//
// Interface   : ICiCAdviseStatus
//
// Description : An interface notify the Content Index Client about
//               performance counter values, event log messages, etc.
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(ca05734a-1218-11d3-ae7a-00c04f72f831)
interface ICiCAdviseStatus : IUnknown
{
    typedef enum tagCI_PERF_COUNTER_NAME
    {
        // Counters used in the main process
        CI_PERF_NUM_WORDLIST,
        CI_PERF_NUM_PERSISTENT_INDEXES,
        CI_PERF_INDEX_SIZE,
        CI_PERF_FILES_TO_BE_FILTERED,
        CI_PERF_NUM_UNIQUE_KEY,
        CI_PERF_RUNNING_QUERIES,
        CI_PERF_MERGE_PROGRESS,
        CI_PERF_DOCUMENTS_FILTERED,
        CI_PERF_NUM_DOCUMENTS,
        CI_PERF_TOTAL_QUERIES,

        // Counters used in the filter daemon process
        CI_PERF_FILTER_TIME_TOTAL,
        CI_PERF_FILTER_TIME,
        CI_PERF_BIND_TIME,

        // Counters used in the main process
        CI_PERF_DEFERRED_FILTER_FILES
    } CI_PERF_COUNTER_NAME;

    typedef enum tagCI_NOTIFY_STATUS_VALUE
    {
        CI_NOTIFY_FILTERING_FAILURE,
        CI_NOTIFY_CORRUPT_INDEX,
        CI_NOTIFY_SET_DISK_FULL,
        CI_NOTIFY_CLEAR_DISK_FULL,
        CI_NOTIFY_RESCAN_NEEDED,
        CI_NOTIFY_FILTER_EMBEDDING_FAILURE,
        CI_NOTIFY_FILTER_TOO_MANY_BLOCKS

    } CI_NOTIFY_STATUS_VALUE;

    SCODE SetPerfCounterValue( [in]  CI_PERF_COUNTER_NAME counterName,
                               [in]  long value );

    SCODE GetPerfCounterValue( [in]  CI_PERF_COUNTER_NAME counterName,
                               [out] long * pValue );

    SCODE IncrementPerfCounterValue( [in] CI_PERF_COUNTER_NAME counterName );

    SCODE DecrementPerfCounterValue( [in] CI_PERF_COUNTER_NAME counterName );

    SCODE NotifyEvent(  [in]  WORD  fType,
                        [in]  DWORD eventId,
                        [in]  ULONG nParams,
                        [in,  size_is(nParams)]  const PROPVARIANT *aParams,
                        [in]  ULONG cbData,
                        [in,  size_is(cbData)]  void* data    );

    //
    // BUGBUG - We should document that it may be called with internal CI locks
    // held - don't call back into CI or get other locks. Fix this limitation
    // it is a problem.
    //
    SCODE NotifyStatus( [in] CI_NOTIFY_STATUS_VALUE status,
                        [in] ULONG nParams,
                        [in, size_is(nParams)] const PROPVARIANT *aParams );
}

//+-------------------------------------------------------------------------
//
// Interface   : ICiCFilterClient
//
// Description : An interface to control the client component responsible
//               for filtering.
//
//+-------------------------------------------------------------------------
LOCAL_INTERFACE(A1E0BCB6-3C24-11D0-8C90-0020AF1D740E)
interface ICiCFilterClient : IUnknown
{
    typedef struct tagCI_CLIENT_FILTER_CONFIG_INFO
    {
        BOOL    fSupportsOpLocks;
        BOOL    fSupportsSecurity;

    } CI_CLIENT_FILTER_CONFIG_INFO;

    SCODE Init( [in, size_is(cbData)] BYTE const * pbData,
                [in] ULONG cbData,
                [in] ICiAdminParams * pICiAdminParams );

    SCODE GetConfigInfo( [out] CI_CLIENT_FILTER_CONFIG_INFO * pConfigInfo );

    SCODE GetOpenedDoc( [out] ICiCOpenedDoc ** ppICiCOpenedDoc );
}


interface ICiManager;

typedef ULONG VOLUMEID;
typedef LONGLONG USN;
typedef ULONG  WORKID;
typedef ULONG  PROPID;
typedef ULONG  SDID;
typedef ULONG PARTITIONID;
typedef DWORD ACCESS_MASK;


//+---------------------------------------------------------------------------
//
//  Struct:     USN_FLUSH_INFO
//
//  Purpose:    A structure used to convey information about a
//              changelog flush. Each entry has the volumeId and the
//              highest USN flushed for that volumeId.
//
//----------------------------------------------------------------------------

typedef struct tagUSN_FLUSH_INFO
{
    VOLUMEID    volumeId;
    USN         usnHighest;
} USN_FLUSH_INFO;

//+---------------------------------------------------------------------------
//
//  Enum:       CI_UPDATE_TYPE
//
//  Purpose:    Types of updates
//
//----------------------------------------------------------------------------

typedef enum tagCI_UPDATE_TYPE
{
    CI_UPDATE_ADD      = 0x1,       // Document add
    CI_UPDATE_DELETE   = 0x2,       // Document delete
    CI_UPDATE_MODIFY   = 0x4        // Document modify

} CI_UPDATE_TYPE;

//+---------------------------------------------------------------------------
//
//  Enum:       CI_ACCESS_MODE
//
//  Purpose:    Type of access needed for a document.
//
//----------------------------------------------------------------------------

typedef enum tagCI_ACCESS_MODE
{

    CI_READ_ACCESS     = 0x1,
    CI_WRITE_ACCESS    = 0x2,
    CI_EXECUTE_ACCESS  = 0x4

} CI_ACCESS_MODE;


interface ICiCQuerySession;
interface IPropertyMapper;

//+-------------------------------------------------------------------------
//
// Interface   : ICiCDocStore
//
// Description : Main interface of the client in the content index.
//
//+-------------------------------------------------------------------------
LOCAL_INTERFACE(46625468-3C32-11D0-8C90-0020AF1D740E)
interface ICiCDocStore : IUnknown
{
    //
    // BUGBUG - temporary - will have to change. This is to allow
    // fetching of the data for updating the perfmon counters.
    //
    typedef struct tagCI_CLIENT_STATUS
    {
        ULONG   cDocuments;     // Total number of documents
    } CI_CLIENT_STATUS;


    typedef enum tagCI_DISABLE_UPDATE_REASON
    {
        CI_LOST_UPDATE,
        CI_CORRUPT_INDEX,
        CI_DISK_FULL

    } CI_DISABLE_UPDATE_REASON;

    SCODE FlushPropertyStore();

    SCODE GetClientStatus( [out] CI_CLIENT_STATUS * pStatus );

    SCODE GetContentIndex( [out] ICiManager ** ppICiManager );

    SCODE EnableUpdates( void );

    SCODE DisableUpdates( [in] BOOL fIncremental,
                          [in] CI_DISABLE_UPDATE_REASON dwReason );

    SCODE ProcessCiDaemonTermination( [in] DWORD dwStatus );

    SCODE CheckPointChangesFlushed( [in] FILETIME ftFlushed,
                                    [in] ULONG    cEntries,
                                    [in, size_is(cEntries)]
                                         USN_FLUSH_INFO const * const * pUsnEntries );

    SCODE GetQuerySession( [out] ICiCQuerySession ** ppICiCQuerySession );

    SCODE MarkDocUnReachable( [in] WORKID wid );

    SCODE GetPropertyMapper( [out] IPropertyMapper ** ppIPropertyMapper );

    SCODE StoreSecurity( [in] WORKID wid,
                         [in] BYTE const * pbSecurity,
                         [in] ULONG cbSecurity );
}


//+-------------------------------------------------------------------------
//
// Interface   : ICiCDocStoreEx
//
// Description : Extension to ICiCDocStore.
//
//+-------------------------------------------------------------------------
LOCAL_INTERFACE(f98282a7-fa72-11d1-9798-00c04fc2f410)
interface ICiCDocStoreEx : ICiCDocStore
{
    SCODE IsNoQuery( [out] BOOL * fNoQuery );
}

//+-------------------------------------------------------------------------
//
// Interface   : ICiCDocNameToWorkidTranslator
//
// Description : Interface to do document name to workid translation and
//               vice-versa.
//
//+-------------------------------------------------------------------------
LOCAL_INTERFACE(25FC3F54-3CB4-11D0-8C90-0020AF1D740E)
interface ICiCDocNameToWorkidTranslator : IUnknown
{
    SCODE QueryDocName( [out] ICiCDocName ** ppICiCDocName );

    SCODE WorkIdToDocName( [in]  WORKID workId,
                           [out] ICiCDocName * pICiCDocName );

    SCODE DocNameToWorkId( [in]  ICiCDocName const * pICiCDocName,
                           [out] WORKID *pWorkId );
}

//+-------------------------------------------------------------------------
//
// Interface   : ICiCDocNameToWorkidTranslatorEx
//
// Description : Interface to do document name to workid translation and
//               vice-versa.  The Ex version includes an additional API
//               to 'try harder and be more accurate' when resolving
//               names.
//
//+-------------------------------------------------------------------------
LOCAL_INTERFACE(7BBA76E6-A0E3-11D2-BC5D-00C04FA354BA)
interface ICiCDocNameToWorkidTranslatorEx : ICiCDocNameToWorkidTranslator
{
    SCODE WorkIdToAccurateDocName( [in]  WORKID workId,
                                   [out] ICiCDocName * pICiCDocName );
}

//+-------------------------------------------------------------------------
//
// Interface   : ICiCPropertyStorage
//
// Description : Client interface to store properties.
//
//+-------------------------------------------------------------------------
LOCAL_INTERFACE(4C46225A-3CB5-11D0-8C90-0020AF1D740E)
interface ICiCPropertyStorage : IUnknown
{

    SCODE IsPropertyCached( [in] FULLPROPSPEC const * pPropSpec,
                            [out] BOOL * pfValue );

    SCODE StoreProperty( [in] WORKID workId,
                         [in] FULLPROPSPEC const * pPropSpec,
                         [in] PROPVARIANT const * pPropVariant );


    //
    // The following Fetch* methods are not used in the current version of
    // CI framework. They are meant for a future version of CI framework.
    //
    SCODE FetchValueByPid( [in]  WORKID workId,
                           [in]  PROPID pid,
                           [out] PROPVARIANT * pbData,
                           [in,out] ULONG * pcb );

    SCODE FetchValueByPropSpec( [in]  WORKID workId,
                                [in]  FULLPROPSPEC const * pPropSpec,
                                [out] PROPVARIANT * pbData,
                                [in,out] ULONG * pcb );


    SCODE FetchVariantByPid( [in] WORKID workId,
                             [in] PROPID pid,
                             [out] PROPVARIANT ** ppVariant );

    SCODE FetchVariantByByPropSpec( [in] WORKID workId,
                                    [in] FULLPROPSPEC const * pPropSpec,
                                    [out] PROPVARIANT ** ppVariant );

    SCODE ClearNonStoragePropertiesForWid( [in] WORKID wid );
}

//+-------------------------------------------------------------------------
//
// Interface   : ICiCPropRetriever
//
// Description : Interface to suport query time retrieval  of properties,
//               security checking, scope checking, etc.
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(77d9b2da-4401-11d0-8c91-0020af1d740e)
interface ICiCPropRetriever : IUnknown
{

    SCODE BeginPropertyRetrieval( [in] WORKID wid );

    SCODE RetrieveValueByPid( [in]  PROPID pid,
                              [out] PROPVARIANT * pbData,
                              [in,out] ULONG * pcb );

    SCODE RetrieveValueByPropSpec( [in]  FULLPROPSPEC const * pPropSpec,
                                   [out] PROPVARIANT * pbData,
                                   [in,out] ULONG * pcb );

    SCODE FetchSDID( [out] SDID * pSDID );

    SCODE CheckSecurity( [in]  ACCESS_MASK  am,
                         [out] BOOL * pfGranted );

    SCODE IsInScope( [out] BOOL * pfInScope );

    SCODE EndPropertyRetrieval();

}


//+-------------------------------------------------------------------------
//
// Interface   : ICiCDeferredPropRetriever
//
// Description : Interface to suport retrieval  of deferred properties
//
// Notes       : It's the responsibility of the caller to free the variant
//                 by calling VariantClear on pVar
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(c273af70-6d72-11d0-8d64-00a0c908dbf1)
interface ICiCDeferredPropRetriever : IUnknown
{
    SCODE RetrieveDeferredValueByPid( [in]  WORKID wid,
                                      [in]  PROPID pid,
                                      [out] PROPVARIANT * pVar );

    SCODE RetrieveDeferredValueByPropSpec( [in]  WORKID wid,
                                           [in]  FULLPROPSPEC const * pPropSpec,
                                           [out] PROPVARIANT * pVar );
}




//+-------------------------------------------------------------------------
//
// Interface   : ICiCScopeEnumerator
//
// Description : Interface to enumerate.
//
//+-------------------------------------------------------------------------
LOCAL_INTERFACE(CF8505EA-3CCA-11D0-8C90-0020AF1D740E)
interface ICiCScopeEnumerator : IUnknown
{
    SCODE Begin( void );

    SCODE CurrentDocument( [out] WORKID * pWorkId );

    SCODE NextDocument( [out] WORKID * pWorkId );

    SCODE RatioFinished( [out] ULONG * pulDenominator,
                         [out] ULONG * pulNumerator );

    SCODE End( void );
}


//+-------------------------------------------------------------------------
//
// Interface   : ICiQueryPropertyMapper
//
// Description : Converts propspec to pid and vice-versa. It differs from
//               IPropertyMapper because it can convert properties that are
//               of interest to a given query only
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(D2333EB0-756B-11D0-8D66-00A0C908DBF1)
interface ICiQueryPropertyMapper : IUnknown
{
    SCODE PropertyToPropid( [in] FULLPROPSPEC const * pFullPropSpec,
                            [out] PROPID * pPropId );

    SCODE PropidToProperty( [in] PROPID pid,
                            [out] FULLPROPSPEC const ** ppPropSpec );
}



//+-------------------------------------------------------------------------
//
// Interface   : ICiCQuerySession
//
// Description : A resource manager for a query on the client side.
//
//+-------------------------------------------------------------------------

interface IDBProperties;

LOCAL_INTERFACE(AE461FD6-4E1D-11D0-8C94-0020AF1D740E)
interface ICiCQuerySession : IUnknown
{
    typedef enum tagCI_ENUM_OPTIONS
    {
        CI_ENUM_MUST,
        CI_ENUM_NEVER,
        CI_ENUM_SMALL,
        CI_ENUM_BIG,
        CI_ENUM_MUST_NEVER_DEFER

    } CI_ENUM_OPTIONS;

    SCODE Init( [in] ULONG nProps,
                [in, size_is(nProps)] FULLPROPSPEC const * const * apPropSpec,
                [in] IDBProperties *pDBProperties,
                [in] ICiQueryPropertyMapper *pQueryPropertyMapper );

    SCODE GetEnumOption( [out] CI_ENUM_OPTIONS * pEnumOption );

    SCODE CreatePropRetriever( [out] ICiCPropRetriever ** ppICiCPropRetriever );

    SCODE CreateDeferredPropRetriever( [out] ICiCDeferredPropRetriever ** ppICiCDefPropRetriever );

    SCODE CreateEnumerator( [out] ICiCScopeEnumerator ** ppICiCEnumerator );
}

interface ICiManager;

//+-------------------------------------------------------------------------
//
// Interface   : ICiControl
//
// Description : An interface that controls the construction, destruction,
//               lookup of multiple content index instances.
//
//+-------------------------------------------------------------------------
LOCAL_INTERFACE(63DEB7F4-3CCB-11D0-8C90-0020AF1D740E)
interface ICiControl : IUnknown
{
    SCODE CreateContentIndex( [in]  ICiCDocStore * pICiDocStore,
                              [out] ICiManager ** ppICiManager );

}

cpp_quote("#define CI_CONFIG_ENABLE_INDEXING          0x1")
cpp_quote("#define CI_CONFIG_ENABLE_QUERYING          0x2")
cpp_quote("#define CI_CONFIG_ENABLE_INDEXING          0x1")
cpp_quote("#define CI_CONFIG_ENABLE_QUERYING          0x2")
cpp_quote("#define CI_CONFIG_READONLY                 0x4")
cpp_quote("#define CI_CONFIG_INPROCESS_FILTERING      0x8")
cpp_quote("#define CI_CONFIG_ENABLE_BULK_SECURITY     0x10")
cpp_quote("#define CI_CONFIG_ENABLE_INDEX_MIGRATION   0x20")
cpp_quote("#define CI_CONFIG_PROVIDE_PROPERTY_MAPPER  0x40")
cpp_quote("#define CI_CONFIG_EMPTY_DATA               0x80")
cpp_quote("#define CI_CONFIG_PUSH_FILTERING           0x100")
cpp_quote("#define CI_CONFIG_LOAD_FROM_FILES          0x200")

typedef ULONG CI_STARTUP_FLAGS;

//+-------------------------------------------------------------------------
//
// Interface   : ICiStartup
//
// Description : Interface to specify the startup information to Content Index.
//
//+-------------------------------------------------------------------------
LOCAL_INTERFACE(68232cb8-3ccc-11d0-8c90-0020af1d740e)
interface ICiStartup : IUnknown
{

    typedef struct tagCI_STARTUP_INFO
    {

        CI_STARTUP_FLAGS     startupFlags;
        CLSID                clsidDaemonClientMgr;

        BOOL                 fFull;
        BOOL                 fCallerOwnsFiles;
        IEnumString *        pFileList;

    } CI_STARTUP_INFO;

    SCODE StartupContentIndex(
                [string,in] WCHAR const * pwszCiDirectory,
                [in] CI_STARTUP_INFO * pStartupInfo,
                [in] IProgressNotify * pIProgressNotify,
                [in] BOOL * pfAbort );

    SCODE StartupNullContentIndex(
                [in] CI_STARTUP_INFO * pStartupInfo,
                [in] IProgressNotify * pIProgressNotify,
                [in] BOOL * pfAbort );
}


//+-------------------------------------------------------------------------
//
// Interface   : ICiEnumWorkids
//
// Description : An interface provides the ability to enumerate workids.
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(77900150-A09C-11D0-A80D-00A0C906241A)
interface ICiEnumWorkids : IUnknown
{
    SCODE Count( [out] ULONG * pcWorkIds );

    SCODE Reset();

    SCODE Next( [in]  ULONG celt,
                [out,size_is(celt)] WORKID * rgelt,
                [out] ULONG *pceltFetched );

    SCODE Skip( [in] ULONG celt );
}

//+-------------------------------------------------------------------------
//
// Interface   : ICiPersistIncrFile
//
// Description : An interface that allows saving and loading of ci
//               persistent data.
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(31B311E2-4498-11D0-8C91-0020AF1D740E)
interface ICiPersistIncrFile : IUnknown
{
    SCODE Load( [in] BOOL fFull,
                [in] BOOL fCallerOwnsFiles,
                [in] IEnumString * pIFileList,
                [in] IProgressNotify * pIProgressNotify,
                [in] BOOL * pfAbort );

    SCODE Save( [string, in] WCHAR const * pwszSaveDirectory,
                [in]  BOOL fFull,
                [in]  IProgressNotify * pIProgressNotify,
                [in]  BOOL * pfAbort,
                [out] ICiEnumWorkids ** ppWorkidList,
                [out] IEnumString ** ppFileList,
                [out] BOOL * pfFull,
                [out] BOOL * pfCallerOwnsFiles
              );

    SCODE SaveCompleted();

}

typedef ULONG CIF_STATE_FLAGS;

cpp_quote("#define CIF_STATE_SHADOW_MERGE          0x001")
cpp_quote("#define CIF_STATE_MASTER_MERGE          0x002")
cpp_quote("#define CIF_STATE_CONTENT_SCAN_REQUIRED 0x004")
cpp_quote("#define CIF_STATE_ANNEALING_MERGE       0x008")
cpp_quote("#define CIF_STATE_INDEX_MIGRATION_MERGE 0x010")
cpp_quote("#define CIF_STATE_LOW_MEMORY            0x020")
cpp_quote("#define CIF_STATE_HIGH_IO               0x040")
cpp_quote("#define CIF_STATE_MASTER_MERGE_PAUSED   0x080")
cpp_quote("#define CIF_STATE_BATTERY_POWER         0x100")
cpp_quote("#define CIF_STATE_USER_ACTIVE           0x200")


typedef enum tagCI_MERGE_TYPE
{
    CI_ANY_MERGE       = 0,
    CI_MASTER_MERGE    = 1,
    CI_SHADOW_MERGE    = 2,
    CI_ANNEALING_MERGE = 3
} CI_MERGE_TYPE;

//+-------------------------------------------------------------------------
//
// Interface   : ICiManager
//
// Description : Main interface for Content Index.
//               Supports QueryInterface to ICiAdminParams
//
//+-------------------------------------------------------------------------
LOCAL_INTERFACE(CF0FCF56-3CCE-11D0-8C90-0020AF1D740E)
interface ICiManager : IUnknown
{
    typedef struct tagCI_DOCUMENT_UPDATE_INFO
    {

        WORKID         workId;
        VOLUMEID       volumeId;
        USN            usn;
        PARTITIONID    partId;
        CI_UPDATE_TYPE change;

    } CI_DOCUMENT_UPDATE_INFO;


    typedef struct tagCIF_STATE
    {
        DWORD cbStruct;                 // size of the struct passed
        DWORD cWordList;                // # of wordlists
        DWORD cPersistentIndex;         // # of persistent indexes
        DWORD cQueries;                 // # of running queries
        DWORD cDocuments;               // # of documents to filter
        DWORD cFreshTest;               // # of entires in the fresh test
        DWORD dwMergeProgress;          // % done in current merge
        CIF_STATE_FLAGS eState;         // bit array of state information
        DWORD cFilteredDocuments;       // # of documents filtered thus far
        DWORD dwIndexSize;              // Total size (in MB) of index
        DWORD cUniqueKeys;              // # of unique keys in index
        DWORD cSecQDocuments;           // # of documents in secondary Q
    } CIF_STATE;

    SCODE GetStatus( [out] CIF_STATE * pCiState );

    SCODE Empty(void);

    SCODE Shutdown(void);

    SCODE UpdateDocument( [in] CI_DOCUMENT_UPDATE_INFO const * pInfo );

    SCODE UpdateDocuments( [in] ULONG cDocs,
                           [in, size_is(cDocs)] CI_DOCUMENT_UPDATE_INFO const * aInfo );

    SCODE StartFiltering( [in] ULONG cbData,
                          [in, size_is(cbData)] BYTE const * pbData );

    SCODE FlushUpdates(void);

    SCODE GetAdminParams( [out] ICiAdminParams ** ppICiAdminParams );

    SCODE QueryRcovStorage( [out] IUnknown ** ppIUnknown );

    SCODE ForceMerge( CI_MERGE_TYPE mt );

    SCODE AbortMerge(void);

    SCODE IsQuiesced( BOOL * pfState );

    SCODE GetPropertyMapper( [out] IPropertyMapper ** ppIPropertyMapper );

    SCODE IsNullCatalog( BOOL * pfNull );

}

//+-------------------------------------------------------------------------
//
// Interface   : IPropertyMapper
//
// Description : Maps a FULLPROPSPEC to a 32 bit PROPID and vice-versa.
//               This can be provided either by Content Index or the client.
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(B324B226-41A0-11D0-8C91-0020AF1D740E)
interface IPropertyMapper : IUnknown
{

    SCODE PropertyToPropid( [in] FULLPROPSPEC const * pFullPropSpec,
                            [in] BOOL fCreate,
                            [out] PROPID * pPropId );

    SCODE PropidToProperty( [in] PROPID pid,
                            [out] FULLPROPSPEC ** ppPropSpec );

}



//+-------------------------------------------------------------------------
//
// Interface   : ICiCDocStoreLocator
//
// Description : A client provided interface to locate a docstore given
//               the client supplied parameters set on the data source
//               object.
//
// Notes       : ICiCDocStoreLocator is used only by the File System
//               Client of framework until the transport interface to
//               enable remoting of CI is speced, ie, running CI in a
//               client and a server process.
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(97EE7C06-5908-11D0-8C9B-0020AF1D740E)
interface ICiCDocStoreLocator : IUnknown
{

    SCODE LookUpDocStore( [in]  IDBProperties *  pIDBProperties,
                          [out] ICiCDocStore  ** ppICiCDocStore,
                          [in]  BOOL             fMustAlreadyBeOpen );

    SCODE Shutdown();

    SCODE GetDocStoreState( [in] WCHAR const * pwcDocStore,
                            [out] ICiCDocStore  ** ppICiCDocStore,
                            [out] DWORD * pdwState );

    SCODE IsMarkedReadOnly( [in] WCHAR const * wcsCat, [out] BOOL * pfReadOnly );

    SCODE IsVolumeOrDirRO( [in] WCHAR const * wcsCat, [out] BOOL * pfReadOnly );

    SCODE OpenAllDocStores( );

    SCODE StopCatalogsOnVol( [in] WCHAR wcVol, [in] void * pRequestQ );

    SCODE StartCatalogsOnVol( [in] WCHAR wcVol, [in] void * pRequestQ );

    SCODE AddStoppedCat( [in] DWORD dwOldState, [in] WCHAR const * wcsCatName );
}


//+-------------------------------------------------------------------------
//
// Interface   : ICiISearchCreator
//
// Description : An interface for creating the CSearch object provided by
//               the CI framework.
//
//+-------------------------------------------------------------------------

interface ISearchQueryHits;
typedef struct tagDBCOMMANDTREE DBCOMMANDTREE;

LOCAL_INTERFACE(7DC07FA0-902E-11D0-A80C-00A0C906241A)
interface ICiISearchCreator : IUnknown
{
    SCODE CreateISearch(  [in]  DBCOMMANDTREE * pRst,
                          [in]  ICiCLangRes * pILangRes,
                          [in]  ICiCOpenedDoc * pOpenedDoc,
                          [out] ISearchQueryHits ** ppISearch );
}

//
// Class ids of objects provided by the CI framework that can be created
// using COM ( eg. CoCreateInstance)
//

//+-------------------------------------------------------------------------
//
// ClassId     : CLSID_NLCiControl
//
// Description : ClassId of the CiControl object in ocifrmwrk.dll.
//
//+-------------------------------------------------------------------------
// 47C67B50-70B5-11D0-A808-00A0C906241A
cpp_quote("#define CLSID_NLCiControl { 0x47c67b50,0x70b5,0x11d0,{0xa8, 0x08, 0x00, 0xa0, 0xc9, 0x06, 0x24, 0x1a}}" )

//+-------------------------------------------------------------------------
//
// ClassId     : CLSID_CiControl
//
// Description : ClassId of the CiControl object in cifrmwrk.dll.
//
//+-------------------------------------------------------------------------

// 1E9685E6-DB6D-11d0-BB63-00C04FC2F410
cpp_quote("#define CLSID_CiControl { 0x1e9685e6, 0xdb6d, 0x11d0, {0xbb, 0x63, 0x0, 0xc0, 0x4f, 0xc2, 0xf4, 0x10 }}" )


//+-------------------------------------------------------------------------
//
// ClassId     : CLSID_ISearchCreator
//
// Description : ClassId of the ISearchCreator object. This object can be
// used to create an object implementing ISearchQueryHits interface.
//
//+-------------------------------------------------------------------------
// 1F247DC0-902E-11D0-A80C-00A0C906241A
cpp_quote("#define CLSID_ISearchCreator  {0x1F247DC0, 0x902E, 0x11D0, {0xA8,0x0C,0x00,0xA0,0xC9,0x06,0x24,0x1A} }")


//+-------------------------------------------------------------------------
//
// ClassId     : CLSID_TextIFilter
//
// Description : ClassId of the text filter implemented by CI framework.
//
//+-------------------------------------------------------------------------
// C1243CA0-BF96-11CD-B579-08002B30BFEB
cpp_quote("#define CLSID_TextIFilter  {0xC1243CA0, 0xBF96, 0x11CD, {0xB5,0x79,0x08,0x00,0x2B,0x30,0xBF,0xEB } }")

//+-------------------------------------------------------------------------
//
// ClassId     : GUID_Characterization
//
// Description : Use GUID_Characterization,"Description" as the FULLPROPSPEC
//               for using a property as characterization.
//
//+-------------------------------------------------------------------------
// D1B5D3F0-C0B3-11CF-9A92-00A0C908DBF1
cpp_quote("#define GUID_Characterization  {0xD1B5D3F0, 0xC0B3, 0x11CF, {0x9A,0x92,0x00,0xA0,0xC9,0x08,0xDB,0xF1 } }")


interface ICiCIndexNotificationStatus;
interface ICiIndexNotificationEntry;

//+-------------------------------------------------------------------------
//
// Interface   : ICiIndexNotification
//
// Description : An interface provided by the push filtering framework that
//               accepts document change notifications.
//
//+-------------------------------------------------------------------------
LOCAL_INTERFACE(4F2CD6E0-8E74-11D0-8D69-00A0C908DBF1)
interface ICiIndexNotification : IUnknown
{
    SCODE AddNotification( [in]  WORKID wid,
                           [in]  ICiCIndexNotificationStatus *pIndexNotifStatus,
                           [out] ICiIndexNotificationEntry **ppIndexNotifEntry );

    SCODE ModifyNotification( [in]  WORKID wid,
                              [in]  ICiCIndexNotificationStatus *pIndexNotifStatus,
                              [out] ICiIndexNotificationEntry **ppIndexNotifEntry );

    SCODE DeleteNotification( [in]  WORKID wid,
                              [in]  ICiCIndexNotificationStatus *pIndexNotifStatus );
}


//+-------------------------------------------------------------------------
//
// Interface   : ICiIndexNotificationEntry
//
// Description : An interface provided by the push filtering framework that
//               accepts the text and properties in of a modified document.
//
//+-------------------------------------------------------------------------
LOCAL_INTERFACE(210769D0-8E75-11D0-8D69-00A0C908DBF1)
interface ICiIndexNotificationEntry : IUnknown
{
    SCODE AddText( [in] STAT_CHUNK const * pStatChunk,
                   [in] WCHAR const * pwszText );

    SCODE AddProperty( [in] STAT_CHUNK const * pStatChunk,
                       [in] PROPVARIANT const * pPropVariant );

    SCODE AddCompleted( [in] ULONG fAbort );
}


//+-------------------------------------------------------------------------
//
// Interface   : ICiCIndexNotificationStatus
//
// Description : A client provided interface used by the push filtering
//               framework to notify completion status to client. Commit
//               means that the document notification has been persisted in
//               the CI indexes. An abort means that the client should retry
//               the notification. Note: the client should be careful about
//               requeuing deletes. Finally, the simple filtering framework
//               does not handle failures of Commit or Abort, say by retrying
//               at a later time. Commit and Abort are expected to succeed.
//
//+-------------------------------------------------------------------------
LOCAL_INTERFACE(5FFF3840-8E76-11D0-8D69-00A0C908DBF1)
interface ICiCIndexNotificationStatus : IUnknown
{
    SCODE Commit();

    SCODE Abort();
}

//+-------------------------------------------------------------------------
//
// Interface   : ISimpleCommandCreator
//
// Description : A CI provided interface that exposes ICommand for CI.
//
//+-------------------------------------------------------------------------
interface ICommand;

LOCAL_INTERFACE(5e341ab7-02d0-11d1-900c-00a0c9063796)
interface ISimpleCommandCreator : IUnknown
{
    SCODE CreateICommand( IUnknown ** ppIUnknown, IUnknown * pOuterUnk );

    SCODE VerifyCatalog( WCHAR const * pwszMachine, WCHAR const * pwszCatalogName );

    SCODE GetDefaultCatalog( WCHAR * pwszCatalogName, ULONG cwcIn, ULONG * pcwcOut );
}

//+-------------------------------------------------------------------------
//
// ClassId     : CLSID_CISimpleCommandCreator
//
// Description : ClassId of the simple command creator implemented by CI.
//
//+-------------------------------------------------------------------------

// C7B6C04A-CBB5-11d0-BB4C-00C04FC2F410
cpp_quote("#define CLSID_CISimpleCommandCreator {0xc7b6c04a, 0xcbb5, 0x11d0, {0xbb, 0x4c, 0x0, 0xc0, 0x4f, 0xc2, 0xf4, 0x10 } }")


//
// All of the following interfaces (from here till eof) are not used in the current version
// of CI framework. They are meant for a future version of CI framework.
//

//+-------------------------------------------------------------------------
//
// Interface   : ICiCScope
//
// Description : An interface encapsulating a scope.
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(1021C882-3CC0-11D0-8C90-0020AF1D740E)
interface ICiCScope : IUnknown
{

    SCODE Init( [in] ULONG cbData,
                [in, size_is(cbData)] BYTE const * pbData );

    SCODE Clear(void);

    SCODE IsValid(void) const;

    SCODE QueryScope( [out] ICiCScope ** ppICiCScope ) const;

    SCODE GetScope( [out,size_is(*pcbData) ] BYTE * pbScope,
                    [in,out] ULONG * pcbData );
}


//+-------------------------------------------------------------------------
//
// Interface   : ICiCScopeChecker
//
// Description : Interface to test if a document is in a given set of scopes.
//
//+-------------------------------------------------------------------------
LOCAL_INTERFACE(7D820C9C-3CBC-11D0-8C90-0020AF1D740E)
interface ICiCScopeChecker : IUnknown
{

    SCODE IsWorkidInScope( [in]  ICiCScope const * pIScope,
                           [in]  WORKID workId,
                           [out] BOOL * pfInScope );

    SCODE IsDocNameInScope( [in] ICiCScope const * pIScope,
                            [in] ICiCDocName const * pICiCDocName,
                            [out] BOOL * pfInScope );

}

//+-------------------------------------------------------------------------
//
// Interface   : ICiCUserSecurity
//
// Description : An interface to encapsulate a user's security identity.
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(5D01D9CE-3CC2-11D0-8C90-0020AF1D740E)
interface ICiCUserSecurity : IUnknown
{
    SCODE Init( [in] ULONG cbData,
                [in, size_is(cbData)] BYTE const * pbData );

    SCODE Clear(void);

    SCODE IsValid( [out] BOOL * pfValid ) const ;

    SCODE GetSecurityInfo( [out, size_is(*pcbData)] BYTE * pbData,
                           [in,out] ULONG * pcbData );
}


//+-------------------------------------------------------------------------
//
// Interface   : ICiCSecurityChecker
//
// Description : An interface capable of checking if a given document allows
//               the desired access to a user. Capable of doing bulk security
//               checking also.
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(CA130CF4-3CC2-11D0-8C90-0020AF1D740E)
interface ICiCSecurityChecker : IUnknown
{
    SCODE AccessCheck( [in] ICiCUserSecurity const * pICiCUserSecurity,
                       [in] SDID sdid,
                       [in] CI_ACCESS_MODE am,
                       [out] BOOL * pfGranted );

    SCODE BulkAccessCheck( [in] ICiCUserSecurity const * pICiCUserSecurity,
                           [in] ULONG nIds,
                           [in, size_is(nIds)] SDID const * aSDID,
                           [in, size_is(nIds)] CI_ACCESS_MODE const * pam,
                           [out, size_is(nIds)] BOOL * afGranted );
}


//+-------------------------------------------------------------------------
//
// Interface   : ICiDocChangeNotifySink
//
// Description : Interface capable of accepting document change notifications.
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(8BFA1386-3CE5-11D0-8C90-0020AF1D740E)
interface ICiDocChangeNotifySink : IUnknown
{
    SCODE ProcessWorkidChange( [in] WORKID wid,
                               [in] CI_UPDATE_TYPE change );

    SCODE ProcessDocNameChange( [in] ICiCDocName * pICiCDocName,
                                [in] CI_UPDATE_TYPE change );
}


//+-------------------------------------------------------------------------
//
// Interface   : ICiCQueryNotification
//
// Description : Interface to support document change notifications during
//               query processing.
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(0A9E9F6C-3CE2-11D0-8C90-0020AF1D740E)
interface ICiCQueryNotification : IUnknown
{

    SCODE RegisterScope( [in] ICiDocChangeNotifySink * pINotifySink,
                         [in] ICiCScope const * pICiCScope,
                         [out] HANDLE * phNotify );

    SCODE CloseNotifications( [in] HANDLE hNotify );
}


//+-------------------------------------------------------------------------
//
// Interface   : ICiCEventLogItem
//
// Description : A client provided interface to log events.
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(44CC886A-4314-11D0-8C91-0020AF1D740E)
interface ICiCEventLogItem : IUnknown
{
    SCODE Init( [in,string] WCHAR const * pwszEventSource,
                [in] DWORD dwMsgId );

    SCODE AddDWordParam( [in] DWORD dwParam );

    SCODE AddAsciiString( [in, string] char const * pszParam );

    SCODE AddUnicodeString( [in, string] WCHAR const * pwszParam );

    SCODE AddVariantParam( [in] PROPVARIANT const * pVarnt );

    SCODE AddData( [in] ULONG cbData,
                   [in, size_is(cbData)] BYTE const * pbData );

    SCODE WriteEvent( void );
}

//+-------------------------------------------------------------------------
//
// Interface   : ICiCFilterStatus
//
// Description : Per-object filtering status
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(BC5F3D60-8BBC-11D1-8F73-00A0C91917F5)
interface ICiCFilterStatus : IUnknown
{
    SCODE PreFilter( [in, size_is(cbName)] BYTE const * pbName,
                     [in] ULONG cbName );

    SCODE PostFilter( [in, size_is(cbName)] BYTE const * pbName,
                      [in] ULONG cbName,
                      [in] SCODE scFilterStatus );
}

//+-------------------------------------------------------------------------
//
// Interface   : ICiCResourceMonitor
//
// Description : Allows client to monitor resources (i/o, memory, etc.)
//
//+-------------------------------------------------------------------------

LOCAL_INTERFACE(F700FF8E-20EE-11D2-80F7-00C04FA354BA)
interface ICiCResourceMonitor : IUnknown
{
    SCODE IsMemoryLow();

    SCODE IsBatteryLow();

    SCODE IsIoHigh( [in] BOOL * pfAbort );

    SCODE IsUserActive( BOOL fCheckLongTermActivity );

    SCODE SampleUserActivity();

    SCODE IsOnBatteryPower();
}
