//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1995 - 1995.
//
//  File: OleStor.idl  Cairo only interfaces for OLE Storage
//
//  Contents: IOverlappedStream interface definition
//
//  History:    14-Sep-1995 HenryLee    initial version
//
//--------------------------------------------------------------------------

#ifndef DO_NO_IMPORTS
import "wtypes.idl";
import "unknwn.idl";
import "objidl.idl";
#endif

typedef [wire_marshal(ULONG)] void * HEVENT; 
interface IOverlappedCompletion;

typedef struct _STGOVERLAPPED {
    DWORD   Internal;
    DWORD   InternalHigh;
    DWORD   Offset;
    DWORD   OffsetHigh;
    HEVENT  hEvent;
    IOverlappedCompletion * lpCompletion;
    DWORD   reserved;
} STGOVERLAPPED, *LPSTGOVERLAPPED;

//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1995 - 1995.
//
//  Contents: IOverlappedCompletion interface definition
//
//  History:    14-Sep-1995 HenryLee    initial version
//
//--------------------------------------------------------------------------
[
    object,
    uuid(521a28f0-e40b-11ce-b2c9-00aa00680937),
    pointer_default(unique)
]
interface IOverlappedCompletion : IUnknown
{
    HRESULT OnComplete (
        [in] HRESULT hr,
        [in] DWORD pcbTransferred,
        [in] STGOVERLAPPED *lpOverlapped);
}

//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1995 - 1995.
//
//  Contents: IOverlappedStream interface definition
//
//  History:    14-Sep-1995 HenryLee    initial version
//
//--------------------------------------------------------------------------
[
    object,
    uuid(49384070-e40a-11ce-b2c9-00aa00680937),
    pointer_default(unique)
]
interface IOverlappedStream : IStream
{

    [local]
    HRESULT ReadOverlapped (
                [in, size_is(cb)] void * pv,
                [in] ULONG cb,
                [out] ULONG * pcbRead,
                [in] STGOVERLAPPED *lpOverlapped);

    [call_as(ReadOverlapped)]
    HRESULT RemoteReadOverlapped (
                [in, size_is(cb)] byte * pv,
                [in] ULONG cb,
                [out] ULONG * pcbRead,
                [in] STGOVERLAPPED *lpOverlapped);


    [local]
    HRESULT __stdcall WriteOverlapped (
                [in, size_is(cb)] void *pv,
                [in] ULONG cb,
                [out] ULONG * pcbWritten,
                [in] STGOVERLAPPED *lpOverlapped);

    [call_as(WriteOverlapped)]
    HRESULT __stdcall RemoteWriteOverlapped (
                [in, size_is(cb)] byte *pv,
                [in] ULONG cb,
                [out] ULONG * pcbWritten,
                [in] STGOVERLAPPED *lpOverlapped);

    HRESULT GetOverlappedResult (
                [in, out] STGOVERLAPPED *lpOverlapped,
                [out] DWORD * plcbTransfer,
                [in] BOOL fWait);

}
