/*
 * Copyright (C) 2005 Mike McCormack
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

import "oaidl.idl";

typedef struct SENS_QOCINFO
{
    DWORD dwSize;
    DWORD dwFlags;
    DWORD dwOutSpeed;
    DWORD dwInSpeed;
} SENS_QOCINFO, *LPSENS_QOCINFO;

[
  object,
  pointer_default(unique)
]
interface ISensNetwork : IDispatch
{
    HRESULT ConnectionMade(
        [in] BSTR bstrConnection,
        [in] ULONG ulType,
        [in] LPSENS_QOCINFO lpQOCInfo );
    HRESULT ConnectionMadeNoQOCInfo(
        [in] BSTR bstrConnection,
        [in] ULONG ulType );
    HRESULT ConnectionLost(
        [in] BSTR bstrConnection,
        [in] ULONG ulType );
    HRESULT DestinationReachable(
        [in] BSTR bstrDestination,
        [in] BSTR bstrConnection,
        [in] ULONG ulType,
        [in] LPSENS_QOCINFO lpQOCInfo );
    HRESULT DestinationReachableNoQOCInfo(
        [in] BSTR bstrDestination,
        [in] BSTR bstrConnection,
        [in] ULONG ulType );
}

[
  object,
  pointer_default(unique)
]
interface ISensOnNow : IDispatch
{
    HRESULT OnAcPower( void );
    HRESULT OnBatteryPower(
        [in] DWORD dwBatteryLifePercent );
    HRESULT BatteryLow(
        [in] DWORD dwBatteryLifePercent );
}

[
  object,
  pointer_default(unique)
]
interface ISensLogon : IDispatch
{
    HRESULT Logon(
        [in] BSTR bstrUserName );
    HRESULT Logoff(
        [in] BSTR bstrUserName );
    HRESULT StartShell(
        [in] BSTR bstrUserName );
    HRESULT DisplayLock(
        [in] BSTR bstrUserName );
    HRESULT DisplayUnlock(
        [in] BSTR bstrUserName );
    HRESULT StartScreenSaver(
        [in] BSTR bstrUserName );
    HRESULT StopScreenSaver(
        [in] BSTR bstrUserName );
}

[
  object,
  pointer_default(unique)
]
interface ISensLogon2 : IDispatch
{
    HRESULT Logon(
        [in] BSTR bstrUserName,
        [in] DWORD dwSessionId );
    HRESULT Logoff(
        [in] BSTR bstrUserName,
        [in] DWORD dwSessionId );
    HRESULT SessionDisconnect(
        [in] BSTR bstrUserName,
        [in] DWORD dwSessionId );
    HRESULT SessionReconnect(
        [in] BSTR bstrUserName,
        [in] DWORD dwSessionId );
    HRESULT PostShell(
        [in] BSTR bstrUserName,
        [in] DWORD dwSessionId );
}
