/*** Autogenerated by WIDL 8.5 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__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* 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 __WIDL_INLINE HRESULT ILocationReport_QueryInterface(ILocationReport* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ILocationReport_AddRef(ILocationReport* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ILocationReport_Release(ILocationReport* This) {
    return This->lpVtbl->Release(This);
}
/*** ILocationReport methods ***/
static __WIDL_INLINE HRESULT ILocationReport_GetSensorID(ILocationReport* This,SENSOR_ID *pSensorID) {
    return This->lpVtbl->GetSensorID(This,pSensorID);
}
static __WIDL_INLINE HRESULT ILocationReport_GetTimestamp(ILocationReport* This,SYSTEMTIME *pCreationTime) {
    return This->lpVtbl->GetTimestamp(This,pCreationTime);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICivicAddressReport_QueryInterface(ICivicAddressReport* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICivicAddressReport_AddRef(ICivicAddressReport* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICivicAddressReport_Release(ICivicAddressReport* This) {
    return This->lpVtbl->Release(This);
}
/*** ILocationReport methods ***/
static __WIDL_INLINE HRESULT ICivicAddressReport_GetSensorID(ICivicAddressReport* This,SENSOR_ID *pSensorID) {
    return This->lpVtbl->GetSensorID(This,pSensorID);
}
static __WIDL_INLINE HRESULT ICivicAddressReport_GetTimestamp(ICivicAddressReport* This,SYSTEMTIME *pCreationTime) {
    return This->lpVtbl->GetTimestamp(This,pCreationTime);
}
static __WIDL_INLINE HRESULT ICivicAddressReport_GetValue(ICivicAddressReport* This,REFPROPERTYKEY pKey,PROPVARIANT *pValue) {
    return This->lpVtbl->GetValue(This,pKey,pValue);
}
/*** ICivicAddressReport methods ***/
static __WIDL_INLINE HRESULT ICivicAddressReport_GetAddressLine1(ICivicAddressReport* This,BSTR *pbstrAddress1) {
    return This->lpVtbl->GetAddressLine1(This,pbstrAddress1);
}
static __WIDL_INLINE HRESULT ICivicAddressReport_GetAddressLine2(ICivicAddressReport* This,BSTR *pbstrAddress2) {
    return This->lpVtbl->GetAddressLine2(This,pbstrAddress2);
}
static __WIDL_INLINE HRESULT ICivicAddressReport_GetCity(ICivicAddressReport* This,BSTR *pbstrCity) {
    return This->lpVtbl->GetCity(This,pbstrCity);
}
static __WIDL_INLINE HRESULT ICivicAddressReport_GetStateProvince(ICivicAddressReport* This,BSTR *pbstrStateProvince) {
    return This->lpVtbl->GetStateProvince(This,pbstrStateProvince);
}
static __WIDL_INLINE HRESULT ICivicAddressReport_GetPostalCode(ICivicAddressReport* This,BSTR *pbstrPostalCode) {
    return This->lpVtbl->GetPostalCode(This,pbstrPostalCode);
}
static __WIDL_INLINE HRESULT ICivicAddressReport_GetCountryRegion(ICivicAddressReport* This,BSTR *pbstrCountryRegion) {
    return This->lpVtbl->GetCountryRegion(This,pbstrCountryRegion);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ILatLongReport_QueryInterface(ILatLongReport* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ILatLongReport_AddRef(ILatLongReport* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ILatLongReport_Release(ILatLongReport* This) {
    return This->lpVtbl->Release(This);
}
/*** ILocationReport methods ***/
static __WIDL_INLINE HRESULT ILatLongReport_GetSensorID(ILatLongReport* This,SENSOR_ID *pSensorID) {
    return This->lpVtbl->GetSensorID(This,pSensorID);
}
static __WIDL_INLINE HRESULT ILatLongReport_GetTimestamp(ILatLongReport* This,SYSTEMTIME *pCreationTime) {
    return This->lpVtbl->GetTimestamp(This,pCreationTime);
}
static __WIDL_INLINE HRESULT ILatLongReport_GetValue(ILatLongReport* This,REFPROPERTYKEY pKey,PROPVARIANT *pValue) {
    return This->lpVtbl->GetValue(This,pKey,pValue);
}
/*** ILatLongReport methods ***/
static __WIDL_INLINE HRESULT ILatLongReport_GetLatitude(ILatLongReport* This,DOUBLE *pLatitude) {
    return This->lpVtbl->GetLatitude(This,pLatitude);
}
static __WIDL_INLINE HRESULT ILatLongReport_GetLongitude(ILatLongReport* This,DOUBLE *pLongitude) {
    return This->lpVtbl->GetLongitude(This,pLongitude);
}
static __WIDL_INLINE HRESULT ILatLongReport_GetErrorRadius(ILatLongReport* This,DOUBLE *pErrorRadius) {
    return This->lpVtbl->GetErrorRadius(This,pErrorRadius);
}
static __WIDL_INLINE HRESULT ILatLongReport_GetAltitude(ILatLongReport* This,DOUBLE *pAltitude) {
    return This->lpVtbl->GetAltitude(This,pAltitude);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDefaultLocation_QueryInterface(IDefaultLocation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDefaultLocation_AddRef(IDefaultLocation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDefaultLocation_Release(IDefaultLocation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDefaultLocation methods ***/
static __WIDL_INLINE HRESULT IDefaultLocation_SetReport(IDefaultLocation* This,REFIID reportType,ILocationReport *pLocationReport) {
    return This->lpVtbl->SetReport(This,reportType,pLocationReport);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ILocationEvents_QueryInterface(ILocationEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ILocationEvents_AddRef(ILocationEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ILocationEvents_Release(ILocationEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** ILocationEvents methods ***/
static __WIDL_INLINE HRESULT ILocationEvents_OnLocationChanged(ILocationEvents* This,REFIID reportType,ILocationReport *pLocationReport) {
    return This->lpVtbl->OnLocationChanged(This,reportType,pLocationReport);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ILocation_QueryInterface(ILocation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ILocation_AddRef(ILocation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ILocation_Release(ILocation* This) {
    return This->lpVtbl->Release(This);
}
/*** ILocation methods ***/
static __WIDL_INLINE HRESULT ILocation_RegisterForReport(ILocation* This,ILocationEvents *pEvents,REFIID reportType,DWORD dwRequestedReportInterval) {
    return This->lpVtbl->RegisterForReport(This,pEvents,reportType,dwRequestedReportInterval);
}
static __WIDL_INLINE HRESULT ILocation_UnregisterForReport(ILocation* This,REFIID reportType) {
    return This->lpVtbl->UnregisterForReport(This,reportType);
}
static __WIDL_INLINE HRESULT ILocation_GetReport(ILocation* This,REFIID reportType,ILocationReport **ppLocationReport) {
    return This->lpVtbl->GetReport(This,reportType,ppLocationReport);
}
static __WIDL_INLINE HRESULT ILocation_GetReportStatus(ILocation* This,REFIID reportType,LOCATION_REPORT_STATUS *pStatus) {
    return This->lpVtbl->GetReportStatus(This,reportType,pStatus);
}
static __WIDL_INLINE HRESULT ILocation_GetReportInterval(ILocation* This,REFIID reportType,DWORD *pMilliseconds) {
    return This->lpVtbl->GetReportInterval(This,reportType,pMilliseconds);
}
static __WIDL_INLINE HRESULT ILocation_SetReportInterval(ILocation* This,REFIID reportType,DWORD millisecondsRequested) {
    return This->lpVtbl->SetReportInterval(This,reportType,millisecondsRequested);
}
static __WIDL_INLINE HRESULT ILocation_GetDesiredAccuracy(ILocation* This,REFIID reportType,LOCATION_DESIRED_ACCURACY *pDesiredAccuracy) {
    return This->lpVtbl->GetDesiredAccuracy(This,reportType,pDesiredAccuracy);
}
static __WIDL_INLINE HRESULT ILocation_SetDesiredAccuracy(ILocation* This,REFIID reportType,LOCATION_DESIRED_ACCURACY desiredAccuracy) {
    return This->lpVtbl->SetDesiredAccuracy(This,reportType,desiredAccuracy);
}
static __WIDL_INLINE 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__ */
