/*******************************************************************************
*
*  (C) COPYRIGHT MICROSOFT CORP., 1999
*
*  TITLE:       WiaPriv.Idl
*
*  VERSION:     1.0
*
*  DATE:        30 Nov, 1999
*
*  DESCRIPTION:
*   Private IDL source for STI/WIA.
*
*******************************************************************************/

interface IStiLockMgr;
interface IWiaDataCallback;
interface IWiaItemInternal;

import "unknwn.idl";

/*******************************************************************************
*
* Sti Locking Interface
*
*******************************************************************************/
[
    object,
    uuid(70681EA0-E7BF-4291-9FB1-FE550482AB88),
    helpstring("Lock Manager Interface"),
    pointer_default(unique)
]

interface IStiLockMgr : IUnknown
{
    [id(1), helpstring("Request Device Lock method")]
    HRESULT RequestLock(
        [in]            BSTR                            bstrDeviceName,
        [in]            ULONG                           ulTimeout,
        [in]            BOOL                            bInServerProcess);
        
    [id(2), helpstring("Request Device Unlock method")]
    HRESULT RequestUnlock(
        [in]            BSTR                            bstrDeviceName,
        [in]            BOOL                            bInServerProcess);
};

/*******************************************************************************
* WIA_DATA_THREAD_INFO
*
*   Information for data callback thread  
*
* History:
*
*    4/9/1999 Original Version
*
*******************************************************************************/

typedef struct _WIA_DATA_THREAD_INFO {

    //
    // communications to client
    //

    LONG                            lReason;
    LONG                            lStatus;
    LONG                            lPercentComplete;
    LONG                            lOffset;
    LONG                            lLength;
    LONG                            lClientAddress;
    LONG                            lMarshalLength;
    BYTE                            *pBuffer;

    //
    //  thread sync
    //

    BOOL                            bTerminateThread;
    HANDLE                          hEventStart;
    HANDLE                          hEventComplete;
    HRESULT                         hr;
    IWiaDataCallback*               pIDataCallback;
}WIA_DATA_THREAD_INFO,*PWIA_DATA_THREAD_INFO;


/**************************************************************************\
*
* WIA_DATA_CB_BUF_INFO
*  Internal transfer information struct.
*
*   ulSize           - Size of this structure
*   pMappingHandle   - File mapped handle provided as shared memory buffer
*   pTransferBuffer  - Pointer to shared memory buffer
*   ulBufferSize     - Size of the buffer used in data transfer
*   ulClientProcessId- Process ID of client
* History:
*
*   07/20/00
*
\**************************************************************************/

typedef struct _WIA_DATA_CB_BUF_INFO {
    ULONG         ulSize;
    ULONG_PTR     pMappingHandle;
    ULONG_PTR     pTransferBuffer;
    ULONG         ulBufferSize;
    ULONG         ulClientProcessId;
} WIA_DATA_CB_BUF_INFO, *PWIA_DATA_CB_BUF_INFO;



/*******************************************************************************
*
* IWiaItemInternal Interface
*
*******************************************************************************/
[
   object,
   uuid(B884E681-66BA-4014-AFBF-DCB3BEE45FAA),
   helpstring("WIA Item Internal Interface"),
   pointer_default(unique)
]
   interface IWiaItemInternal : IUnknown
{
    [helpstring("Store info for callbacks")]
            HRESULT SetCallbackBufferInfo(
                                          [in] WIA_DATA_CB_BUF_INFO  DataCBBufInfo);

    [helpstring("Retrieve info for callbacks")]
            HRESULT GetCallbackBufferInfo(
                                          [in, out] WIA_DATA_CB_BUF_INFO  *pDataCBBufInfo);
    [helpstring("Start remote transfer")]
            HRESULT idtStartRemoteDataTransfer();

    [helpstring("Get a single band (or other message) from remote device")]
            HRESULT idtRemoteDataTransfer(
                                          [in]        ULONG nNumberOfBytesToRead,
                                          [out]       ULONG *pNumberOfBytesRead,
                                          [out, size_is(nNumberOfBytesToRead), length_is(*pNumberOfBytesRead)] BYTE *pBuffer,
                                          [out]       LONG *pOffset,
                                          [out]       LONG *pMessage,
                                          [out]       LONG *pStatus,
                                          [out]       LONG *pPercentComplete);

    [helpstring("Stop remote transfer")]
            HRESULT idtStopRemoteDataTransfer();
}   

