/*++

Copyright (c) 1997  Microsoft Corporation

Module Name:

    stistub.c

Abstract:

    Routines which use RPC to pass arguments to/from server while enclosed in SEH frame

Environment:

    User Mode -Win32

Author:

    Vlad Sadovsky   (vlads) 26-Jan-1997

Revision History:

    26-Jan-1997     VladS       created

--*/

/*
#include "wia.h"
#include <stilog.h>
#include <stiregi.h>

#include <sti.h>
#include <stierr.h>
#include <stiusd.h>
#include "stipriv.h"
#include "debug.h"
*/
#include "sticomm.h"

#include <stiapi.h>
#include <apiutil.h>

#include <stirpc.h>

DWORD
WINAPI
RpcStiApiGetVersion(
    IN  LPCWSTR  pszServer,
    IN  DWORD   dwReserved,
    OUT LPDWORD lpdwVersion
    )
{

    DWORD   status;

    RpcTryExcept {

        status = R_StiApiGetVersion(NULL,
                                       dwReserved,
                                       lpdwVersion);
    }
    RpcExcept (1) {
        status = RpcExceptionCode();
    }
    RpcEndExcept

    return status;
}



DWORD
WINAPI
RpcStiApiOpenDevice(
    IN  LPCWSTR  pszServer,
    IN  LPCWSTR  pdeviceName,
    IN  DWORD   dwMode,
    IN  DWORD   dwAccessRequired,
    IN  DWORD   dwProcessId,
    OUT HANDLE *pHandle
    )
{

    DWORD   status;

    RpcTryExcept {

        status = R_StiApiOpenDevice(NULL,
                                    pdeviceName,
                                    dwMode,
                                    dwAccessRequired,
                                    dwProcessId,
                                    pHandle
                                    );
    }
    RpcExcept (1) {
        status = RpcExceptionCode();
    }
    RpcEndExcept

    return status;
}



DWORD
WINAPI
RpcStiApiCloseDevice(
    IN  LPCWSTR  pszServer,
    IN  HANDLE  hDevice
    )
{

    DWORD   status;

    RpcTryExcept {

        status = R_StiApiCloseDevice(NULL,hDevice  );

    }
    RpcExcept (1) {
        status = RpcExceptionCode();
    }
    RpcEndExcept

    return status;
}


DWORD
WINAPI
RpcStiApiSubscribe(
    IN STI_DEVICE_HANDLE hDevice,
    IN LPSTISUBSCRIBE    lpSubScribe
    )
{

    DWORD   status;

    LOCAL_SUBSCRIBE_CONTAINER   sLocalContainer;

    ZeroMemory(&sLocalContainer,sizeof(LOCAL_SUBSCRIBE_CONTAINER));

    RpcTryExcept {

        sLocalContainer.dwSize = sizeof(LOCAL_SUBSCRIBE_CONTAINER);
        sLocalContainer.dwFlags = lpSubScribe->dwFlags;

        if (lpSubScribe->dwFlags & STI_SUBSCRIBE_FLAG_WINDOW) {
            sLocalContainer.upLocalWindowHandle = (UINT_PTR)lpSubScribe->hWndNotify;
            sLocalContainer.uiNotificationMessage = lpSubScribe->uiNotificationMessage;
        }
        else {
            sLocalContainer.upLocalEventHandle = (UINT_PTR)lpSubScribe->hEvent;
        }

        status = R_StiApiSubscribe(hDevice,&sLocalContainer);

    }
    RpcExcept (1) {
        status = RpcExceptionCode();
    }
    RpcEndExcept

    return status;
}



DWORD
WINAPI
RpcStiApiGetLastNotificationData(
    IN  STI_DEVICE_HANDLE   hDevice,
    OUT LPSTINOTIFY         lpNotify
    )
{
    DWORD   status;
    DWORD   cbNeeded;

    RpcTryExcept {

        status = R_StiApiGetLastNotificationData(hDevice,
                                                 (LPBYTE)lpNotify,
                                                 lpNotify->dwSize,
                                                 &cbNeeded
                                                 );

    }
    RpcExcept (1) {
        status = RpcExceptionCode();
    }
    RpcEndExcept

    return status;
}

DWORD
WINAPI
RpcStiApiUnSubscribe(
    IN STI_DEVICE_HANDLE hDevice
    )
{

    DWORD   status;

    RpcTryExcept {

        status = R_StiApiUnSubscribe(hDevice);

    }
    RpcExcept (1) {
        status = RpcExceptionCode();
    }
    RpcEndExcept

    return status;
}

DWORD
WINAPI
RpcStiApiEnableHwNotifications(
    IN  LPCWSTR  pszServer,
    IN  LPCWSTR  pdeviceName,
    IN  BOOL     bNewState
    )
{

    DWORD   status;

    RpcTryExcept {

        status = R_StiApiEnableHwNotifications(NULL,
                                    pdeviceName,
                                    bNewState
                                    );
    }
    RpcExcept (1) {
        status = RpcExceptionCode();
    }
    RpcEndExcept

    return status;
}


DWORD
WINAPI
RpcStiApiGetHwNotificationState(
    IN  LPCWSTR  pszServer,
    IN  LPCWSTR  pdeviceName,
    OUT LPDWORD  pState
    )
{

    DWORD   status;

    RpcTryExcept {

        status = R_StiApiGetHwNotificationState(NULL,
                                    pdeviceName,
                                    pState
                                    );
    }
    RpcExcept (1) {
        status = RpcExceptionCode();
    }
    RpcEndExcept

    return status;
}

DWORD
WINAPI
RpcStiApiLaunchApplication(
    IN  LPCWSTR  pszServer,
    IN  LPCWSTR  pdeviceName,
    IN  LPCWSTR  pAppName,
    IN  LPSTINOTIFY  pStiNotify
    )
{
    DWORD   status;

    RpcTryExcept {

        status = R_StiApiLaunchApplication(NULL,
                                    pdeviceName,
                                    pAppName,
                                    pStiNotify
                                    );
    }
    RpcExcept (1) {
        status = RpcExceptionCode();
    }
    RpcEndExcept

    return status;

}

DWORD
WINAPI
RpcStiApiLockDevice(
    IN  LPCWSTR pdeviceName,
    IN  DWORD   dwWait,
    IN  BOOL    bInServerProcess
    )
{
    DWORD   status;

    RpcTryExcept {

        status = R_StiApiLockDevice(NULL,
                                    pdeviceName,
                                    dwWait,
                                    FALSE,
                                    GetCurrentThreadId());
    }
    RpcExcept (1) {
        status = RpcExceptionCode();
    }
    RpcEndExcept

    return status;
}

DWORD
WINAPI
RpcStiApiUnlockDevice(
    IN  LPCWSTR  pdeviceName,
    IN  BOOL    bInServerProcess
    )
{

    DWORD   status;

    RpcTryExcept {

        status = R_StiApiUnlockDevice(NULL,
                                      pdeviceName,
                                      FALSE,
                                      GetCurrentThreadId());
    }
    RpcExcept (1) {
        status = RpcExceptionCode();
    }
    RpcEndExcept

    return status;
}