/*** Autogenerated by WIDL 6.4 from include/locationapi.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __locationapi_h__
#define __locationapi_h__

/* Forward declarations */

#ifndef __ILocationReport_FWD_DEFINED__
#define __ILocationReport_FWD_DEFINED__
typedef interface ILocationReport ILocationReport;
#ifdef __cplusplus
interface ILocationReport;
#endif /* __cplusplus */
#endif

#ifndef __ICivicAddressReport_FWD_DEFINED__
#define __ICivicAddressReport_FWD_DEFINED__
typedef interface ICivicAddressReport ICivicAddressReport;
#ifdef __cplusplus
interface ICivicAddressReport;
#endif /* __cplusplus */
#endif

#ifndef __ILatLongReport_FWD_DEFINED__
#define __ILatLongReport_FWD_DEFINED__
typedef interface ILatLongReport ILatLongReport;
#ifdef __cplusplus
interface ILatLongReport;
#endif /* __cplusplus */
#endif

#ifndef __IDefaultLocation_FWD_DEFINED__
#define __IDefaultLocation_FWD_DEFINED__
typedef interface IDefaultLocation IDefaultLocation;
#ifdef __cplusplus
interface IDefaultLocation;
#endif /* __cplusplus */
#endif

#ifndef __ILocationEvents_FWD_DEFINED__
#define __ILocationEvents_FWD_DEFINED__
typedef interface ILocationEvents ILocationEvents;
#ifdef __cplusplus
interface ILocationEvents;
#endif /* __cplusplus */
#endif

#ifndef __ILocation_FWD_DEFINED__
#define __ILocation_FWD_DEFINED__
typedef interface ILocation ILocation;
#ifdef __cplusplus
interface ILocation;
#endif /* __cplusplus */
#endif

#ifndef __Location_FWD_DEFINED__
#define __Location_FWD_DEFINED__
#ifdef __cplusplus
typedef class Location Location;
#else
typedef struct Location Location;
#endif /* defined __cplusplus */
#endif /* defined __Location_FWD_DEFINED__ */

/* Headers for imported files */

#include <oaidl.h>
#include <ocidl.h>
#include <sensorsapi.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <propkeydef.h>
typedef enum LOCATION_REPORT_STATUS {
    REPORT_NOT_SUPPORTED = 0,
    REPORT_ERROR = 1,
    REPORT_ACCESS_DENIED = 2,
    REPORT_INITIALIZING = 3,
    REPORT_RUNNING = 4
} LOCATION_REPORT_STATUS;
/*****************************************************************************
 * ILocationReport interface
 */
#ifndef __ILocationReport_INTERFACE_DEFINED__
#define __ILocationReport_INTERFACE_DEFINED__

DEFINE_GUID(IID_ILocationReport, 0xc8b7f7ee, 0x75d0, 0x4db9, 0xb6,0x2d, 0x7a,0x0f,0x36,0x9c,0xa4,0x56);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c8b7f7ee-75d0-4db9-b62d-7a0f369ca456")
ILocationReport : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSensorID(
        SENSOR_ID *pSensorID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTimestamp(
        SYSTEMTIME *pCreationTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetValue(
        REFPROPERTYKEY pKey,
        PROPVARIANT *pValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ILocationReport, 0xc8b7f7ee, 0x75d0, 0x4db9, 0xb6,0x2d, 0x7a,0x0f,0x36,0x9c,0xa4,0x56)
#endif
#else
typedef struct ILocationReportVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ILocationReport *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ILocationReport *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ILocationReport *This);

    /*** ILocationReport methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSensorID)(
        ILocationReport *This,
        SENSOR_ID *pSensorID);

    HRESULT (STDMETHODCALLTYPE *GetTimestamp)(
        ILocationReport *This,
        SYSTEMTIME *pCreationTime);

    HRESULT (STDMETHODCALLTYPE *GetValue)(
        ILocationReport *This,
        REFPROPERTYKEY pKey,
        PROPVARIANT *pValue);

    END_INTERFACE
} ILocationReportVtbl;

interface ILocationReport {
    CONST_VTBL ILocationReportVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ILocationReport_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ILocationReport_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ILocationReport_Release(This) (This)->lpVtbl->Release(This)
/*** ILocationReport methods ***/
#define ILocationReport_GetSensorID(This,pSensorID) (This)->lpVtbl->GetSensorID(This,pSensorID)
#define ILocationReport_GetTimestamp(This,pCreationTime) (This)->lpVtbl->GetTimestamp(This,pCreationTime)
#define ILocationReport_GetValue(This,pKey,pValue) (This)->lpVtbl->GetValue(This,pKey,pValue)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ILocationReport_QueryInterface(ILocationReport* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ILocationReport_AddRef(ILocationReport* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ILocationReport_Release(ILocationReport* This) {
    return This->lpVtbl->Release(This);
}
/*** ILocationReport methods ***/
static FORCEINLINE HRESULT ILocationReport_GetSensorID(ILocationReport* This,SENSOR_ID *pSensorID) {
    return This->lpVtbl->GetSensorID(This,pSensorID);
}
static FORCEINLINE HRESULT ILocationReport_GetTimestamp(ILocationReport* This,SYSTEMTIME *pCreationTime) {
    return This->lpVtbl->GetTimestamp(This,pCreationTime);
}
static FORCEINLINE HRESULT ILocationReport_GetValue(ILocationReport* This,REFPROPERTYKEY pKey,PROPVARIANT *pValue) {
    return This->lpVtbl->GetValue(This,pKey,pValue);
}
#endif
#endif

#endif


#endif  /* __ILocationReport_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICivicAddressReport interface
 */
#ifndef __ICivicAddressReport_INTERFACE_DEFINED__
#define __ICivicAddressReport_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICivicAddressReport, 0xc0b19f70, 0x4adf, 0x445d, 0x87,0xf2, 0xca,0xd8,0xfd,0x71,0x17,0x92);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0b19f70-4adf-445d-87f2-cad8fd711792")
ICivicAddressReport : public ILocationReport
{
    virtual HRESULT STDMETHODCALLTYPE GetAddressLine1(
        BSTR *pbstrAddress1) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAddressLine2(
        BSTR *pbstrAddress2) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCity(
        BSTR *pbstrCity) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStateProvince(
        BSTR *pbstrStateProvince) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPostalCode(
        BSTR *pbstrPostalCode) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCountryRegion(
        BSTR *pbstrCountryRegion) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDetailLevel(
        DWORD *pDetailLevel) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICivicAddressReport, 0xc0b19f70, 0x4adf, 0x445d, 0x87,0xf2, 0xca,0xd8,0xfd,0x71,0x17,0x92)
#endif
#else
typedef struct ICivicAddressReportVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICivicAddressReport *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICivicAddressReport *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICivicAddressReport *This);

    /*** ILocationReport methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSensorID)(
        ICivicAddressReport *This,
        SENSOR_ID *pSensorID);

    HRESULT (STDMETHODCALLTYPE *GetTimestamp)(
        ICivicAddressReport *This,
        SYSTEMTIME *pCreationTime);

    HRESULT (STDMETHODCALLTYPE *GetValue)(
        ICivicAddressReport *This,
        REFPROPERTYKEY pKey,
        PROPVARIANT *pValue);

    /*** ICivicAddressReport methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAddressLine1)(
        ICivicAddressReport *This,
        BSTR *pbstrAddress1);

    HRESULT (STDMETHODCALLTYPE *GetAddressLine2)(
        ICivicAddressReport *This,
        BSTR *pbstrAddress2);

    HRESULT (STDMETHODCALLTYPE *GetCity)(
        ICivicAddressReport *This,
        BSTR *pbstrCity);

    HRESULT (STDMETHODCALLTYPE *GetStateProvince)(
        ICivicAddressReport *This,
        BSTR *pbstrStateProvince);

    HRESULT (STDMETHODCALLTYPE *GetPostalCode)(
        ICivicAddressReport *This,
        BSTR *pbstrPostalCode);

    HRESULT (STDMETHODCALLTYPE *GetCountryRegion)(
        ICivicAddressReport *This,
        BSTR *pbstrCountryRegion);

    HRESULT (STDMETHODCALLTYPE *GetDetailLevel)(
        ICivicAddressReport *This,
        DWORD *pDetailLevel);

    END_INTERFACE
} ICivicAddressReportVtbl;

interface ICivicAddressReport {
    CONST_VTBL ICivicAddressReportVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICivicAddressReport_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICivicAddressReport_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICivicAddressReport_Release(This) (This)->lpVtbl->Release(This)
/*** ILocationReport methods ***/
#define ICivicAddressReport_GetSensorID(This,pSensorID) (This)->lpVtbl->GetSensorID(This,pSensorID)
#define ICivicAddressReport_GetTimestamp(This,pCreationTime) (This)->lpVtbl->GetTimestamp(This,pCreationTime)
#define ICivicAddressReport_GetValue(This,pKey,pValue) (This)->lpVtbl->GetValue(This,pKey,pValue)
/*** ICivicAddressReport methods ***/
#define ICivicAddressReport_GetAddressLine1(This,pbstrAddress1) (This)->lpVtbl->GetAddressLine1(This,pbstrAddress1)
#define ICivicAddressReport_GetAddressLine2(This,pbstrAddress2) (This)->lpVtbl->GetAddressLine2(This,pbstrAddress2)
#define ICivicAddressReport_GetCity(This,pbstrCity) (This)->lpVtbl->GetCity(This,pbstrCity)
#define ICivicAddressReport_GetStateProvince(This,pbstrStateProvince) (This)->lpVtbl->GetStateProvince(This,pbstrStateProvince)
#define ICivicAddressReport_GetPostalCode(This,pbstrPostalCode) (This)->lpVtbl->GetPostalCode(This,pbstrPostalCode)
#define ICivicAddressReport_GetCountryRegion(This,pbstrCountryRegion) (This)->lpVtbl->GetCountryRegion(This,pbstrCountryRegion)
#define ICivicAddressReport_GetDetailLevel(This,pDetailLevel) (This)->lpVtbl->GetDetailLevel(This,pDetailLevel)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICivicAddressReport_QueryInterface(ICivicAddressReport* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICivicAddressReport_AddRef(ICivicAddressReport* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICivicAddressReport_Release(ICivicAddressReport* This) {
    return This->lpVtbl->Release(This);
}
/*** ILocationReport methods ***/
static FORCEINLINE HRESULT ICivicAddressReport_GetSensorID(ICivicAddressReport* This,SENSOR_ID *pSensorID) {
    return This->lpVtbl->GetSensorID(This,pSensorID);
}
static FORCEINLINE HRESULT ICivicAddressReport_GetTimestamp(ICivicAddressReport* This,SYSTEMTIME *pCreationTime) {
    return This->lpVtbl->GetTimestamp(This,pCreationTime);
}
static FORCEINLINE HRESULT ICivicAddressReport_GetValue(ICivicAddressReport* This,REFPROPERTYKEY pKey,PROPVARIANT *pValue) {
    return This->lpVtbl->GetValue(This,pKey,pValue);
}
/*** ICivicAddressReport methods ***/
static FORCEINLINE HRESULT ICivicAddressReport_GetAddressLine1(ICivicAddressReport* This,BSTR *pbstrAddress1) {
    return This->lpVtbl->GetAddressLine1(This,pbstrAddress1);
}
static FORCEINLINE HRESULT ICivicAddressReport_GetAddressLine2(ICivicAddressReport* This,BSTR *pbstrAddress2) {
    return This->lpVtbl->GetAddressLine2(This,pbstrAddress2);
}
static FORCEINLINE HRESULT ICivicAddressReport_GetCity(ICivicAddressReport* This,BSTR *pbstrCity) {
    return This->lpVtbl->GetCity(This,pbstrCity);
}
static FORCEINLINE HRESULT ICivicAddressReport_GetStateProvince(ICivicAddressReport* This,BSTR *pbstrStateProvince) {
    return This->lpVtbl->GetStateProvince(This,pbstrStateProvince);
}
static FORCEINLINE HRESULT ICivicAddressReport_GetPostalCode(ICivicAddressReport* This,BSTR *pbstrPostalCode) {
    return This->lpVtbl->GetPostalCode(This,pbstrPostalCode);
}
static FORCEINLINE HRESULT ICivicAddressReport_GetCountryRegion(ICivicAddressReport* This,BSTR *pbstrCountryRegion) {
    return This->lpVtbl->GetCountryRegion(This,pbstrCountryRegion);
}
static FORCEINLINE HRESULT ICivicAddressReport_GetDetailLevel(ICivicAddressReport* This,DWORD *pDetailLevel) {
    return This->lpVtbl->GetDetailLevel(This,pDetailLevel);
}
#endif
#endif

#endif


#endif  /* __ICivicAddressReport_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ILatLongReport interface
 */
#ifndef __ILatLongReport_INTERFACE_DEFINED__
#define __ILatLongReport_INTERFACE_DEFINED__

DEFINE_GUID(IID_ILatLongReport, 0x7fed806d, 0x0ef8, 0x4f07, 0x80,0xac, 0x36,0xa0,0xbe,0xae,0x31,0x34);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7fed806d-0ef8-4f07-80ac-36a0beae3134")
ILatLongReport : public ILocationReport
{
    virtual HRESULT STDMETHODCALLTYPE GetLatitude(
        DOUBLE *pLatitude) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLongitude(
        DOUBLE *pLongitude) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetErrorRadius(
        DOUBLE *pErrorRadius) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAltitude(
        DOUBLE *pAltitude) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAltitudeError(
        DOUBLE *pAltitudeError) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ILatLongReport, 0x7fed806d, 0x0ef8, 0x4f07, 0x80,0xac, 0x36,0xa0,0xbe,0xae,0x31,0x34)
#endif
#else
typedef struct ILatLongReportVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ILatLongReport *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ILatLongReport *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ILatLongReport *This);

    /*** ILocationReport methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSensorID)(
        ILatLongReport *This,
        SENSOR_ID *pSensorID);

    HRESULT (STDMETHODCALLTYPE *GetTimestamp)(
        ILatLongReport *This,
        SYSTEMTIME *pCreationTime);

    HRESULT (STDMETHODCALLTYPE *GetValue)(
        ILatLongReport *This,
        REFPROPERTYKEY pKey,
        PROPVARIANT *pValue);

    /*** ILatLongReport methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLatitude)(
        ILatLongReport *This,
        DOUBLE *pLatitude);

    HRESULT (STDMETHODCALLTYPE *GetLongitude)(
        ILatLongReport *This,
        DOUBLE *pLongitude);

    HRESULT (STDMETHODCALLTYPE *GetErrorRadius)(
        ILatLongReport *This,
        DOUBLE *pErrorRadius);

    HRESULT (STDMETHODCALLTYPE *GetAltitude)(
        ILatLongReport *This,
        DOUBLE *pAltitude);

    HRESULT (STDMETHODCALLTYPE *GetAltitudeError)(
        ILatLongReport *This,
        DOUBLE *pAltitudeError);

    END_INTERFACE
} ILatLongReportVtbl;

interface ILatLongReport {
    CONST_VTBL ILatLongReportVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ILatLongReport_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ILatLongReport_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ILatLongReport_Release(This) (This)->lpVtbl->Release(This)
/*** ILocationReport methods ***/
#define ILatLongReport_GetSensorID(This,pSensorID) (This)->lpVtbl->GetSensorID(This,pSensorID)
#define ILatLongReport_GetTimestamp(This,pCreationTime) (This)->lpVtbl->GetTimestamp(This,pCreationTime)
#define ILatLongReport_GetValue(This,pKey,pValue) (This)->lpVtbl->GetValue(This,pKey,pValue)
/*** ILatLongReport methods ***/
#define ILatLongReport_GetLatitude(This,pLatitude) (This)->lpVtbl->GetLatitude(This,pLatitude)
#define ILatLongReport_GetLongitude(This,pLongitude) (This)->lpVtbl->GetLongitude(This,pLongitude)
#define ILatLongReport_GetErrorRadius(This,pErrorRadius) (This)->lpVtbl->GetErrorRadius(This,pErrorRadius)
#define ILatLongReport_GetAltitude(This,pAltitude) (This)->lpVtbl->GetAltitude(This,pAltitude)
#define ILatLongReport_GetAltitudeError(This,pAltitudeError) (This)->lpVtbl->GetAltitudeError(This,pAltitudeError)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ILatLongReport_QueryInterface(ILatLongReport* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ILatLongReport_AddRef(ILatLongReport* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ILatLongReport_Release(ILatLongReport* This) {
    return This->lpVtbl->Release(This);
}
/*** ILocationReport methods ***/
static FORCEINLINE HRESULT ILatLongReport_GetSensorID(ILatLongReport* This,SENSOR_ID *pSensorID) {
    return This->lpVtbl->GetSensorID(This,pSensorID);
}
static FORCEINLINE HRESULT ILatLongReport_GetTimestamp(ILatLongReport* This,SYSTEMTIME *pCreationTime) {
    return This->lpVtbl->GetTimestamp(This,pCreationTime);
}
static FORCEINLINE HRESULT ILatLongReport_GetValue(ILatLongReport* This,REFPROPERTYKEY pKey,PROPVARIANT *pValue) {
    return This->lpVtbl->GetValue(This,pKey,pValue);
}
/*** ILatLongReport methods ***/
static FORCEINLINE HRESULT ILatLongReport_GetLatitude(ILatLongReport* This,DOUBLE *pLatitude) {
    return This->lpVtbl->GetLatitude(This,pLatitude);
}
static FORCEINLINE HRESULT ILatLongReport_GetLongitude(ILatLongReport* This,DOUBLE *pLongitude) {
    return This->lpVtbl->GetLongitude(This,pLongitude);
}
static FORCEINLINE HRESULT ILatLongReport_GetErrorRadius(ILatLongReport* This,DOUBLE *pErrorRadius) {
    return This->lpVtbl->GetErrorRadius(This,pErrorRadius);
}
static FORCEINLINE HRESULT ILatLongReport_GetAltitude(ILatLongReport* This,DOUBLE *pAltitude) {
    return This->lpVtbl->GetAltitude(This,pAltitude);
}
static FORCEINLINE HRESULT ILatLongReport_GetAltitudeError(ILatLongReport* This,DOUBLE *pAltitudeError) {
    return This->lpVtbl->GetAltitudeError(This,pAltitudeError);
}
#endif
#endif

#endif


#endif  /* __ILatLongReport_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDefaultLocation interface
 */
#ifndef __IDefaultLocation_INTERFACE_DEFINED__
#define __IDefaultLocation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDefaultLocation, 0xa65af77e, 0x969a, 0x4a2e, 0x8a,0xca, 0x33,0xbb,0x7c,0xbb,0x12,0x35);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a65af77e-969a-4a2e-8aca-33bb7cbb1235")
IDefaultLocation : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetReport(
        REFIID reportType,
        ILocationReport *pLocationReport) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetReport(
        REFIID reportType,
        ILocationReport **ppLocationReport) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDefaultLocation, 0xa65af77e, 0x969a, 0x4a2e, 0x8a,0xca, 0x33,0xbb,0x7c,0xbb,0x12,0x35)
#endif
#else
typedef struct IDefaultLocationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDefaultLocation *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDefaultLocation *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDefaultLocation *This);

    /*** IDefaultLocation methods ***/
    HRESULT (STDMETHODCALLTYPE *SetReport)(
        IDefaultLocation *This,
        REFIID reportType,
        ILocationReport *pLocationReport);

    HRESULT (STDMETHODCALLTYPE *GetReport)(
        IDefaultLocation *This,
        REFIID reportType,
        ILocationReport **ppLocationReport);

    END_INTERFACE
} IDefaultLocationVtbl;

interface IDefaultLocation {
    CONST_VTBL IDefaultLocationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDefaultLocation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDefaultLocation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDefaultLocation_Release(This) (This)->lpVtbl->Release(This)
/*** IDefaultLocation methods ***/
#define IDefaultLocation_SetReport(This,reportType,pLocationReport) (This)->lpVtbl->SetReport(This,reportType,pLocationReport)
#define IDefaultLocation_GetReport(This,reportType,ppLocationReport) (This)->lpVtbl->GetReport(This,reportType,ppLocationReport)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDefaultLocation_QueryInterface(IDefaultLocation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDefaultLocation_AddRef(IDefaultLocation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDefaultLocation_Release(IDefaultLocation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDefaultLocation methods ***/
static FORCEINLINE HRESULT IDefaultLocation_SetReport(IDefaultLocation* This,REFIID reportType,ILocationReport *pLocationReport) {
    return This->lpVtbl->SetReport(This,reportType,pLocationReport);
}
static FORCEINLINE HRESULT IDefaultLocation_GetReport(IDefaultLocation* This,REFIID reportType,ILocationReport **ppLocationReport) {
    return This->lpVtbl->GetReport(This,reportType,ppLocationReport);
}
#endif
#endif

#endif


#endif  /* __IDefaultLocation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ILocationEvents interface
 */
#ifndef __ILocationEvents_INTERFACE_DEFINED__
#define __ILocationEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_ILocationEvents, 0xcae02bbf, 0x798b, 0x4508, 0xa2,0x07, 0x35,0xa7,0x90,0x6d,0xc7,0x3d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cae02bbf-798b-4508-a207-35a7906dc73d")
ILocationEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnLocationChanged(
        REFIID reportType,
        ILocationReport *pLocationReport) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnStatusChanged(
        REFIID reportType,
        LOCATION_REPORT_STATUS newStatus) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ILocationEvents, 0xcae02bbf, 0x798b, 0x4508, 0xa2,0x07, 0x35,0xa7,0x90,0x6d,0xc7,0x3d)
#endif
#else
typedef struct ILocationEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ILocationEvents *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ILocationEvents *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ILocationEvents *This);

    /*** ILocationEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *OnLocationChanged)(
        ILocationEvents *This,
        REFIID reportType,
        ILocationReport *pLocationReport);

    HRESULT (STDMETHODCALLTYPE *OnStatusChanged)(
        ILocationEvents *This,
        REFIID reportType,
        LOCATION_REPORT_STATUS newStatus);

    END_INTERFACE
} ILocationEventsVtbl;

interface ILocationEvents {
    CONST_VTBL ILocationEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ILocationEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ILocationEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ILocationEvents_Release(This) (This)->lpVtbl->Release(This)
/*** ILocationEvents methods ***/
#define ILocationEvents_OnLocationChanged(This,reportType,pLocationReport) (This)->lpVtbl->OnLocationChanged(This,reportType,pLocationReport)
#define ILocationEvents_OnStatusChanged(This,reportType,newStatus) (This)->lpVtbl->OnStatusChanged(This,reportType,newStatus)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ILocationEvents_QueryInterface(ILocationEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ILocationEvents_AddRef(ILocationEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ILocationEvents_Release(ILocationEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** ILocationEvents methods ***/
static FORCEINLINE HRESULT ILocationEvents_OnLocationChanged(ILocationEvents* This,REFIID reportType,ILocationReport *pLocationReport) {
    return This->lpVtbl->OnLocationChanged(This,reportType,pLocationReport);
}
static FORCEINLINE HRESULT ILocationEvents_OnStatusChanged(ILocationEvents* This,REFIID reportType,LOCATION_REPORT_STATUS newStatus) {
    return This->lpVtbl->OnStatusChanged(This,reportType,newStatus);
}
#endif
#endif

#endif


#endif  /* __ILocationEvents_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ILocation interface
 */
#ifndef __ILocation_INTERFACE_DEFINED__
#define __ILocation_INTERFACE_DEFINED__

DEFINE_GUID(IID_ILocation, 0xab2ece69, 0x56d9, 0x4f28, 0xb5,0x25, 0xde,0x1b,0x0e,0xe4,0x42,0x37);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ab2ece69-56d9-4f28-b525-de1b0ee44237")
ILocation : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RegisterForReport(
        ILocationEvents *pEvents,
        REFIID reportType,
        DWORD dwRequestedReportInterval) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnregisterForReport(
        REFIID reportType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetReport(
        REFIID reportType,
        ILocationReport **ppLocationReport) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetReportStatus(
        REFIID reportType,
        LOCATION_REPORT_STATUS *pStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetReportInterval(
        REFIID reportType,
        DWORD *pMilliseconds) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetReportInterval(
        REFIID reportType,
        DWORD millisecondsRequested) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDesiredAccuracy(
        REFIID reportType,
        LOCATION_DESIRED_ACCURACY *pDesiredAccuracy) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDesiredAccuracy(
        REFIID reportType,
        LOCATION_DESIRED_ACCURACY desiredAccuracy) = 0;

    virtual HRESULT STDMETHODCALLTYPE RequestPermissions(
        HWND hParent,
        IID pReportTypes[],
        ULONG count,
        WINBOOL fModal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ILocation, 0xab2ece69, 0x56d9, 0x4f28, 0xb5,0x25, 0xde,0x1b,0x0e,0xe4,0x42,0x37)
#endif
#else
typedef struct ILocationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ILocation *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ILocation *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ILocation *This);

    /*** ILocation methods ***/
    HRESULT (STDMETHODCALLTYPE *RegisterForReport)(
        ILocation *This,
        ILocationEvents *pEvents,
        REFIID reportType,
        DWORD dwRequestedReportInterval);

    HRESULT (STDMETHODCALLTYPE *UnregisterForReport)(
        ILocation *This,
        REFIID reportType);

    HRESULT (STDMETHODCALLTYPE *GetReport)(
        ILocation *This,
        REFIID reportType,
        ILocationReport **ppLocationReport);

    HRESULT (STDMETHODCALLTYPE *GetReportStatus)(
        ILocation *This,
        REFIID reportType,
        LOCATION_REPORT_STATUS *pStatus);

    HRESULT (STDMETHODCALLTYPE *GetReportInterval)(
        ILocation *This,
        REFIID reportType,
        DWORD *pMilliseconds);

    HRESULT (STDMETHODCALLTYPE *SetReportInterval)(
        ILocation *This,
        REFIID reportType,
        DWORD millisecondsRequested);

    HRESULT (STDMETHODCALLTYPE *GetDesiredAccuracy)(
        ILocation *This,
        REFIID reportType,
        LOCATION_DESIRED_ACCURACY *pDesiredAccuracy);

    HRESULT (STDMETHODCALLTYPE *SetDesiredAccuracy)(
        ILocation *This,
        REFIID reportType,
        LOCATION_DESIRED_ACCURACY desiredAccuracy);

    HRESULT (STDMETHODCALLTYPE *RequestPermissions)(
        ILocation *This,
        HWND hParent,
        IID pReportTypes[],
        ULONG count,
        WINBOOL fModal);

    END_INTERFACE
} ILocationVtbl;

interface ILocation {
    CONST_VTBL ILocationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ILocation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ILocation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ILocation_Release(This) (This)->lpVtbl->Release(This)
/*** ILocation methods ***/
#define ILocation_RegisterForReport(This,pEvents,reportType,dwRequestedReportInterval) (This)->lpVtbl->RegisterForReport(This,pEvents,reportType,dwRequestedReportInterval)
#define ILocation_UnregisterForReport(This,reportType) (This)->lpVtbl->UnregisterForReport(This,reportType)
#define ILocation_GetReport(This,reportType,ppLocationReport) (This)->lpVtbl->GetReport(This,reportType,ppLocationReport)
#define ILocation_GetReportStatus(This,reportType,pStatus) (This)->lpVtbl->GetReportStatus(This,reportType,pStatus)
#define ILocation_GetReportInterval(This,reportType,pMilliseconds) (This)->lpVtbl->GetReportInterval(This,reportType,pMilliseconds)
#define ILocation_SetReportInterval(This,reportType,millisecondsRequested) (This)->lpVtbl->SetReportInterval(This,reportType,millisecondsRequested)
#define ILocation_GetDesiredAccuracy(This,reportType,pDesiredAccuracy) (This)->lpVtbl->GetDesiredAccuracy(This,reportType,pDesiredAccuracy)
#define ILocation_SetDesiredAccuracy(This,reportType,desiredAccuracy) (This)->lpVtbl->SetDesiredAccuracy(This,reportType,desiredAccuracy)
#define ILocation_RequestPermissions(This,hParent,pReportTypes,count,fModal) (This)->lpVtbl->RequestPermissions(This,hParent,pReportTypes,count,fModal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ILocation_QueryInterface(ILocation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ILocation_AddRef(ILocation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ILocation_Release(ILocation* This) {
    return This->lpVtbl->Release(This);
}
/*** ILocation methods ***/
static FORCEINLINE HRESULT ILocation_RegisterForReport(ILocation* This,ILocationEvents *pEvents,REFIID reportType,DWORD dwRequestedReportInterval) {
    return This->lpVtbl->RegisterForReport(This,pEvents,reportType,dwRequestedReportInterval);
}
static FORCEINLINE HRESULT ILocation_UnregisterForReport(ILocation* This,REFIID reportType) {
    return This->lpVtbl->UnregisterForReport(This,reportType);
}
static FORCEINLINE HRESULT ILocation_GetReport(ILocation* This,REFIID reportType,ILocationReport **ppLocationReport) {
    return This->lpVtbl->GetReport(This,reportType,ppLocationReport);
}
static FORCEINLINE HRESULT ILocation_GetReportStatus(ILocation* This,REFIID reportType,LOCATION_REPORT_STATUS *pStatus) {
    return This->lpVtbl->GetReportStatus(This,reportType,pStatus);
}
static FORCEINLINE HRESULT ILocation_GetReportInterval(ILocation* This,REFIID reportType,DWORD *pMilliseconds) {
    return This->lpVtbl->GetReportInterval(This,reportType,pMilliseconds);
}
static FORCEINLINE HRESULT ILocation_SetReportInterval(ILocation* This,REFIID reportType,DWORD millisecondsRequested) {
    return This->lpVtbl->SetReportInterval(This,reportType,millisecondsRequested);
}
static FORCEINLINE HRESULT ILocation_GetDesiredAccuracy(ILocation* This,REFIID reportType,LOCATION_DESIRED_ACCURACY *pDesiredAccuracy) {
    return This->lpVtbl->GetDesiredAccuracy(This,reportType,pDesiredAccuracy);
}
static FORCEINLINE HRESULT ILocation_SetDesiredAccuracy(ILocation* This,REFIID reportType,LOCATION_DESIRED_ACCURACY desiredAccuracy) {
    return This->lpVtbl->SetDesiredAccuracy(This,reportType,desiredAccuracy);
}
static FORCEINLINE HRESULT ILocation_RequestPermissions(ILocation* This,HWND hParent,IID pReportTypes[],ULONG count,WINBOOL fModal) {
    return This->lpVtbl->RequestPermissions(This,hParent,pReportTypes,count,fModal);
}
#endif
#endif

#endif


#endif  /* __ILocation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * Location coclass
 */

DEFINE_GUID(CLSID_Location, 0xe5b8e079, 0xee6d, 0x4e33, 0xa4,0x38, 0xc8,0x7f,0x2e,0x95,0x92,0x54);

#ifdef __cplusplus
class DECLSPEC_UUID("e5b8e079-ee6d-4e33-a438-c87f2e959254") Location;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(Location, 0xe5b8e079, 0xee6d, 0x4e33, 0xa4,0x38, 0xc8,0x7f,0x2e,0x95,0x92,0x54)
#endif
#endif

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
ULONG           __RPC_USER LPSAFEARRAY_UserSize     (ULONG *, ULONG, LPSAFEARRAY *);
unsigned char * __RPC_USER LPSAFEARRAY_UserMarshal  (ULONG *, unsigned char *, LPSAFEARRAY *);
unsigned char * __RPC_USER LPSAFEARRAY_UserUnmarshal(ULONG *, unsigned char *, LPSAFEARRAY *);
void            __RPC_USER LPSAFEARRAY_UserFree     (ULONG *, LPSAFEARRAY *);
ULONG           __RPC_USER HWND_UserSize     (ULONG *, ULONG, HWND *);
unsigned char * __RPC_USER HWND_UserMarshal  (ULONG *, unsigned char *, HWND *);
unsigned char * __RPC_USER HWND_UserUnmarshal(ULONG *, unsigned char *, HWND *);
void            __RPC_USER HWND_UserFree     (ULONG *, HWND *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __locationapi_h__ */
