diff --git a/src/qtd3dservice/xaphandler.cpp b/src/qtd3dservice/xaphandler.cpp index 1820eb76fe974a4656ed069473b91ff002ceba0e..37d512a5079cabda2d06d7d58a40f73f3397c4b7 100644 --- a/src/qtd3dservice/xaphandler.cpp +++ b/src/qtd3dservice/xaphandler.cpp @@ -50,9 +50,9 @@ #include <wrl.h> using namespace Microsoft::WRL; -#include <ccapi.h> +#include <ccapi_11.h> #include <corecon.h> -Q_GLOBAL_STATIC(CoreConServer, coreConServer) +Q_GLOBAL_STATIC_WITH_ARGS(CoreConServer, coreConServer, (11)) #define bstr(s) _bstr_t((const wchar_t *)s.utf16()) @@ -136,8 +136,8 @@ extern int xapAppNames(int deviceIndex, QSet<QString> &apps) HRESULT hr; _bstr_t connectionName; ComPtr<ICcConnection> connection; - hr = coreConServer->handle()->GetConnection( - device->handle(), 5000, NULL, connectionName.GetAddress(), &connection); + hr = static_cast<ICcServer *>(coreConServer->handle())->GetConnection( + static_cast<ICcDevice *>(device->handle()), 5000, NULL, connectionName.GetAddress(), &connection); if (FAILED(hr)) { qCWarning(lcD3DService) << "Unable to initialize connection:" << coreConServer->formatError(hr); @@ -227,8 +227,8 @@ extern int handleXapDevice(int deviceIndex, const QString &app, const QString &l HRESULT hr; _bstr_t connectionName; ComPtr<ICcConnection> connection; - hr = coreConServer->handle()->GetConnection( - device->handle(), 5000, NULL, connectionName.GetAddress(), &connection); + hr = static_cast<ICcServer *>(coreConServer->handle())->GetConnection( + static_cast<ICcDevice *>(device->handle()), 5000, NULL, connectionName.GetAddress(), &connection); if (FAILED(hr)) { qCWarning(lcD3DService) << "Unable to initialize connection:" << coreConServer->formatError(hr); diff --git a/src/shared/corecon/ccapi.h b/src/shared/corecon/ccapi.h index e4d35c889289470aa271ccaf1f980ffbabe98eed..48da15914db009efe84967dfb4ab9b354c1f4953 100644 --- a/src/shared/corecon/ccapi.h +++ b/src/shared/corecon/ccapi.h @@ -38,8 +38,8 @@ ** ****************************************************************************/ -#ifndef CCAPI_H -#define CCAPI_H +#ifndef CCAPI_VERSIONED_H +#define CCAPI_VERSIONED_H /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Core Connectivity API (Experimental) @@ -62,34 +62,77 @@ #include <windows.h> +#ifndef CORECON_VER +static_assert(false, "You must define the CoreCon version with CORECON_VER."); +#endif + +#if CORECON_VER==11 + +static const CLSID CLSID_ConMan_11 = { 0x349AB2E8, 0x71B6, 0x4069, 0xAD, 0x9C, 0x11, 0x70, 0x84, 0x9D, 0xA6, 0x4C }; + // Undefined -struct ICcFormFactorContainer; -struct ICcOSImage; -struct ICcOSImageContainer; -struct ICcPackageContainer; -struct ICcProjectContainer; -struct ICcServiceCategoryContainer; -struct ICcServiceCB; -struct ICcServiceInfo; -struct ICcTransportStream; -struct ICcTypeToArchitectureMap; +struct ICcFormFactorContainer_11; +struct ICcOSImage_11; +struct ICcOSImageContainer_11; +struct ICcPackageContainer_11; +struct ICcProjectContainer_11; +struct ICcServiceCategoryContainer_11; +struct ICcServiceCB_11; +struct ICcServiceInfo_11; +struct ICcTransportStream_11; +struct ICcTypeToArchitectureMap_11; // Defined -struct ICcConnection; -struct ICcCollection; -struct ICcConnection3; -struct ICcDatastore; -struct ICcDevice; -struct ICcDeviceContainer; -struct ICcObject; -struct ICcObjectContainer; -struct ICcPlatform; -struct ICcPlatformContainer; -struct ICcProperty; -struct ICcPropertyContainer; -struct ICcServer; - -static const CLSID CLSID_ConMan = { 0x349AB2E8, 0x71B6, 0x4069, 0xAD, 0x9C, 0x11, 0x70, 0x84, 0x9D, 0xA6, 0x4C }; +struct ICcConnection_11; +struct ICcCollection_11; +struct ICcConnection3_11; +struct ICcDatastore_11; +struct ICcDevice_11; +struct ICcDeviceContainer_11; +struct ICcObject_11; +struct ICcObjectContainer_11; +struct ICcPlatform_11; +struct ICcPlatformContainer_11; +struct ICcProperty_11; +struct ICcPropertyContainer_11; +struct ICcServer_11; + +#elif CORECON_VER==12 + +static const CLSID CLSID_ConMan_12 = { 0x2D0A16C9, 0x53D9, 0x42C1, 0xBC, 0xC2, 0x8D, 0x2A, 0x13, 0x5E, 0x21, 0x63 }; + +// Undefined +struct ICcFormFactorContainer_12; +struct ICcOSImage_12; +struct ICcOSImageContainer_12; +struct ICcPackageContainer_12; +struct ICcProjectContainer_12; +struct ICcServiceCategoryContainer_12; +struct ICcServiceCB_12; +struct ICcServiceInfo_12; +struct ICcTransportStream_12; +struct ICcTypeToArchitectureMap_12; + +// Defined +struct ICcConnection_12; +struct ICcCollection_12; +struct ICcConnection3_12; +struct ICcDatastore_12; +struct ICcDevice_12; +struct ICcDeviceContainer_12; +struct ICcObject_12; +struct ICcObjectContainer_12; +struct ICcPlatform_12; +struct ICcPlatformContainer_12; +struct ICcProperty_12; +struct ICcPropertyContainer_12; +struct ICcServer_12; + +#endif + + +#ifndef CCAPI_H +#define CCAPI_H typedef struct tagFileInfo{ LONG m_FileAttribues; @@ -133,14 +176,28 @@ typedef struct tagPlatformInfo{ DWORD m_InstructionSet; } SystemInfo; -struct __declspec(uuid("{7A4AA9D3-0F9E-4CD4-8D52-62B6C0653752}")) ICcCollection : public IDispatch +#endif // CCAPI_H + +#if CORECON_VER==11 +struct __declspec(uuid("{7A4AA9D3-0F9E-4CD4-8D52-62B6C0653752}")) ICcCollection_11 : public IDispatch +#elif CORECON_VER==12 +struct __declspec(uuid("{9A83560F-377D-419F-B572-AEC3C1A44671}")) ICcCollection_12 : public IDispatch +#endif { virtual HRESULT __stdcall get_Count(long *count) = 0; - virtual HRESULT __stdcall get_Item(long index, ICcObject **object) = 0; +#if CORECON_VER==11 + virtual HRESULT __stdcall get_Item(long index, ICcObject_11 **object) = 0; +#elif CORECON_VER==12 + virtual HRESULT __stdcall get_Item(long index, ICcObject_12 **object) = 0; +#endif virtual HRESULT __stdcall get_NewEnum(IUnknown **val) = 0; }; -struct __declspec(uuid("{CEF4C928-326F-49A9-B7E7-8FE7588B74B5}")) ICcConnection : public IDispatch +#if CORECON_VER==11 +struct __declspec(uuid("{CEF4C928-326F-49A9-B7E7-8FE7588B74B5}")) ICcConnection_11 : public IDispatch +#elif CORECON_VER==12 +struct __declspec(uuid("{906D8E75-8AE6-46B5-B4B6-43B83D9A0948}")) ICcConnection_12 : public IDispatch +#endif { virtual HRESULT __stdcall DeviceId(BSTR *deviceId) = 0; virtual HRESULT __stdcall GetSystemInfo(SystemInfo *systemInfo) = 0; @@ -165,12 +222,20 @@ struct __declspec(uuid("{CEF4C928-326F-49A9-B7E7-8FE7588B74B5}")) ICcConnection virtual HRESULT __stdcall ConnectDevice() = 0; virtual HRESULT __stdcall DisconnectDevice() = 0; virtual HRESULT __stdcall SearchFileSystem(BSTR criteria, BSTR startingDirectory, SAFEARRAY/*<BSTR>*/ *results) = 0; - virtual HRESULT __stdcall CreateStream(BSTR streamId, DWORD timeout, ICcServiceCB *callback, DWORD *cookieId, ICcTransportStream **stream) = 0; +#if CORECON_VER==11 + virtual HRESULT __stdcall CreateStream(BSTR streamId, DWORD timeout, ICcServiceCB_11 *callback, DWORD *cookieId, ICcTransportStream_11 **stream) = 0; +#elif CORECON_VER==12 + virtual HRESULT __stdcall CreateStream(BSTR streamId, DWORD timeout, ICcServiceCB_12 *callback, DWORD *cookieId, ICcTransportStream_12 **stream) = 0; +#endif virtual HRESULT __stdcall EnumerateProcesses(SAFEARRAY/*<BSTR>*/ **processes, SAFEARRAY/*<DWORD>*/ **processIds) = 0; virtual HRESULT __stdcall CloseProcessHandle(DWORD processHandle) = 0; }; -struct __declspec(uuid("{F4B43EA3-3106-4D3D-94E3-084D4136C40C}")) ICcConnection3 : public IUnknown +#if CORECON_VER==11 +struct __declspec(uuid("{F4B43EA3-3106-4D3D-94E3-084D4136C40C}")) ICcConnection3_11 : public IUnknown +#elif CORECON_VER==12 +struct __declspec(uuid("{B158FE65-7DCC-4809-9054-A7B52FD43DE3}")) ICcConnection3_12 : public IUnknown +#endif { virtual HRESULT __stdcall GetInstalledApplicationCount(int *count) = 0; // E_NOTIMPL virtual HRESULT __stdcall GetInstalledApplicationIDs(SAFEARRAY/*<BSTR>*/ **productIds, SAFEARRAY/*<BSTR>*/ **instanceIds) = 0; @@ -191,89 +256,171 @@ struct __declspec(uuid("{F4B43EA3-3106-4D3D-94E3-084D4136C40C}")) ICcConnection3 virtual HRESULT __stdcall ActivateDevice() = 0; }; -struct __declspec(uuid("{5F25394E-D9B6-4F8E-A0DF-325610A35BFA}")) ICcConnection4 : public IUnknown +#if CORECON_VER==11 +struct __declspec(uuid("{5F25394E-D9B6-4F8E-A0DF-325610A35BFA}")) ICcConnection4_11 : public IUnknown +#elif CORECON_VER==12 +struct __declspec(uuid("{68CBC76F-ADF6-4586-B495-E34771B8EAC2}")) ICcConnection4_12 : public IUnknown +#endif { virtual HRESULT __stdcall GetDirectoryListing(BSTR deviceDirPath, SAFEARRAY/*<BSTR>*/ **listing) = 0; virtual HRESULT __stdcall GetApplicationType(BSTR productId, DWORD *type) = 0; virtual HRESULT __stdcall GetEndPoints(int localPort, BSTR localIp, BSTR remoteIp, int remotePort) = 0; }; -struct __declspec(uuid("{EDB0A0CA-F0F8-4EBF-9D31-43E182569A5A}")) ICcDatastore : public IDispatch +#if CORECON_VER==11 +struct __declspec(uuid("{EDB0A0CA-F0F8-4EBF-9D31-43E182569A5A}")) ICcDatastore_11 : public IDispatch +#elif CORECON_VER==12 +struct __declspec(uuid("{2E6AF7C6-CBAB-4E6E-B78A-90A04A2CE523}")) ICcDatastore_12 : public IDispatch +#endif { virtual HRESULT __stdcall Save() = 0; virtual HRESULT __stdcall RegisterRefreshEvent(BSTR eventName) = 0; virtual HRESULT __stdcall UnregisterRefreshEvent() = 0; - virtual HRESULT __stdcall get_DeviceContainer(ICcDeviceContainer **dc) = 0; - virtual HRESULT __stdcall get_OSImageContainer(ICcOSImageContainer **oc) = 0; - virtual HRESULT __stdcall get_PackageContainer(ICcPackageContainer **pc) = 0; - virtual HRESULT __stdcall get_PlatformContainer(ICcPlatformContainer **pc) = 0; - virtual HRESULT __stdcall get_PropertyContainer(ICcPropertyContainer **pc) = 0; - virtual HRESULT __stdcall get_ServiceCategoryContainer(ICcServiceCategoryContainer **scc) = 0; +#if CORECON_VER==11 + virtual HRESULT __stdcall get_DeviceContainer(ICcDeviceContainer_11 **dc) = 0; + virtual HRESULT __stdcall get_OSImageContainer(ICcOSImageContainer_11 **oc) = 0; + virtual HRESULT __stdcall get_PackageContainer(ICcPackageContainer_11 **pc) = 0; + virtual HRESULT __stdcall get_PlatformContainer(ICcPlatformContainer_11 **pc) = 0; + virtual HRESULT __stdcall get_PropertyContainer(ICcPropertyContainer_11 **pc) = 0; + virtual HRESULT __stdcall get_ServiceCategoryContainer(ICcServiceCategoryContainer_11 **scc) = 0; +#elif CORECON_VER==12 + virtual HRESULT __stdcall get_DeviceContainer(ICcDeviceContainer_12 **dc) = 0; + virtual HRESULT __stdcall get_OSImageContainer(ICcOSImageContainer_12 **oc) = 0; + virtual HRESULT __stdcall get_PackageContainer(ICcPackageContainer_12 **pc) = 0; + virtual HRESULT __stdcall get_PlatformContainer(ICcPlatformContainer_12 **pc) = 0; + virtual HRESULT __stdcall get_PropertyContainer(ICcPropertyContainer_12 **pc) = 0; + virtual HRESULT __stdcall get_ServiceCategoryContainer(ICcServiceCategoryContainer_12 **scc) = 0; +#endif virtual HRESULT __stdcall get_Version(BSTR *version) = 0; }; -struct __declspec(uuid("{971BF639-8C53-4057-B635-375D7BCDFF3E}")) ICcDevice : public IDispatch +#if CORECON_VER==11 +struct __declspec(uuid("{971BF639-8C53-4057-B635-375D7BCDFF3E}")) ICcDevice_11 : public IDispatch +#elif CORECON_VER==12 +struct __declspec(uuid("{22773666-28CC-4AD6-9F07-E06BE40EEDB3}")) ICcDevice_12 : public IDispatch +#endif { virtual HRESULT __stdcall ClearOSImage() = 0; virtual HRESULT __stdcall ClearServiceMap(BSTR serviceCatetoryId) = 0; - virtual HRESULT __stdcall GetOSImage(ICcOSImage **image) = 0; - virtual HRESULT __stdcall GetServiceMap(BSTR serviceCategoryId, ICcServiceInfo **serviceInfo) = 0; +#if CORECON_VER==11 + virtual HRESULT __stdcall GetOSImage(ICcOSImage_11 **image) = 0; + virtual HRESULT __stdcall GetServiceMap(BSTR serviceCategoryId, ICcServiceInfo_11 **serviceInfo) = 0; +#elif CORECON_VER==12 + virtual HRESULT __stdcall GetOSImage(ICcOSImage_12 **image) = 0; + virtual HRESULT __stdcall GetServiceMap(BSTR serviceCategoryId, ICcServiceInfo_12 **serviceInfo) = 0; +#endif virtual HRESULT __stdcall SetOSImage(BSTR osImage) = 0; virtual HRESULT __stdcall SetServiceMap(BSTR serviceCategoryId, BSTR serviceInfoId) = 0; }; -struct __declspec(uuid("{88152DD3-5ECB-47A2-8F15-610C4C390122}")) ICcDeviceContainer : public IDispatch +#if CORECON_VER==11 +struct __declspec(uuid("{88152DD3-5ECB-47A2-8F15-610C4C390122}")) ICcDeviceContainer_11 : public IDispatch +#elif CORECON_VER==12 +struct __declspec(uuid("{D747386E-3EAB-4E04-8DD5-7037D192A06D}")) ICcDeviceContainer_12 : public IDispatch +#endif { }; -struct __declspec(uuid("{B669EC21-E8FC-42E4-AEC5-8F0EF3673AB8}")) ICcObject : public IDispatch +#if CORECON_VER==11 +struct __declspec(uuid("{B669EC21-E8FC-42E4-AEC5-8F0EF3673AB8}")) ICcObject_11 : public IDispatch +#elif CORECON_VER==12 +struct __declspec(uuid("{F84BC223-B877-43A2-BE9C-68CFB0020732}")) ICcObject_12 : public IDispatch +#endif { virtual HRESULT __stdcall get_Name(BSTR *name) = 0; virtual HRESULT __stdcall put_Name(BSTR name) = 0; virtual HRESULT __stdcall get_ID(BSTR *id) = 0; virtual HRESULT __stdcall get_IsProtected(VARIANT_BOOL *isProtected) = 0; - virtual HRESULT __stdcall get_PropertyContainer(ICcPropertyContainer **pc) = 0; +#if CORECON_VER==11 + virtual HRESULT __stdcall get_PropertyContainer(ICcPropertyContainer_11 **pc) = 0; +#elif CORECON_VER==12 + virtual HRESULT __stdcall get_PropertyContainer(ICcPropertyContainer_12 **pc) = 0; +#endif }; -struct __declspec(uuid("{1C0048A9-A73F-41B3-BD75-467D615CB9E5}")) ICcObjectContainer : public IDispatch +#if CORECON_VER==11 +struct __declspec(uuid("{1C0048A9-A73F-41B3-BD75-467D615CB9E5}")) ICcObjectContainer_11 : public IDispatch +#elif CORECON_VER==12 +struct __declspec(uuid("{ADEFAC99-D191-46A1-B42F-58B22755C293}")) ICcObjectContainer_12 : public IDispatch +#endif { - virtual HRESULT __stdcall FindObject(BSTR nameOrId, ICcObject **object) = 0; - virtual HRESULT __stdcall EnumerateObjects(ICcCollection **collection) = 0; - virtual HRESULT __stdcall AddObject(BSTR name, BSTR id, ICcObject **object) = 0; +#if CORECON_VER==11 + virtual HRESULT __stdcall FindObject(BSTR nameOrId, ICcObject_11 **object) = 0; + virtual HRESULT __stdcall EnumerateObjects(ICcCollection_11 **collection) = 0; + virtual HRESULT __stdcall AddObject(BSTR name, BSTR id, ICcObject_11 **object) = 0; +#elif CORECON_VER==12 + virtual HRESULT __stdcall FindObject(BSTR nameOrId, ICcObject_12 **object) = 0; + virtual HRESULT __stdcall EnumerateObjects(ICcCollection_12 **collection) = 0; + virtual HRESULT __stdcall AddObject(BSTR name, BSTR id, ICcObject_12 **object) = 0; +#endif virtual HRESULT __stdcall DeleteObject(BSTR nameOrId) = 0; }; -struct __declspec(uuid("{2E12E75A-1625-44B6-B527-7A1E7ED61577}")) ICcPlatform : public IDispatch +#if CORECON_VER==11 +struct __declspec(uuid("{2E12E75A-1625-44B6-B527-7A1E7ED61577}")) ICcPlatform_11 : public IDispatch +#elif CORECON_VER==12 +struct __declspec(uuid("{9124335F-7D55-443D-A86C-4DBC245A1051}")) ICcPlatform_12 : public IDispatch +#endif { - virtual HRESULT __stdcall get_ProjectContainer(ICcProjectContainer **container) = 0; - virtual HRESULT __stdcall get_DeviceContainer(ICcDeviceContainer **container) = 0; - virtual HRESULT __stdcall get_FormFactorContainer(ICcFormFactorContainer **container) = 0; - virtual HRESULT __stdcall get_TypeToArchitectureMap(ICcTypeToArchitectureMap **map) = 0; +#if CORECON_VER==11 + virtual HRESULT __stdcall get_ProjectContainer(ICcProjectContainer_11 **container) = 0; + virtual HRESULT __stdcall get_DeviceContainer(ICcDeviceContainer_11 **container) = 0; + virtual HRESULT __stdcall get_FormFactorContainer(ICcFormFactorContainer_11 **container) = 0; + virtual HRESULT __stdcall get_TypeToArchitectureMap(ICcTypeToArchitectureMap_11 **map) = 0; +#elif CORECON_VER==12 + virtual HRESULT __stdcall get_ProjectContainer(ICcProjectContainer_12 **container) = 0; + virtual HRESULT __stdcall get_DeviceContainer(ICcDeviceContainer_12 **container) = 0; + virtual HRESULT __stdcall get_FormFactorContainer(ICcFormFactorContainer_12 **container) = 0; + virtual HRESULT __stdcall get_TypeToArchitectureMap(ICcTypeToArchitectureMap_12 **map) = 0; +#endif }; -struct __declspec(uuid("{C434B7DA-ABAA-428A-944A-3AF1A7419A92}")) ICcPlatformContainer : public IDispatch +#if CORECON_VER==11 +struct __declspec(uuid("{C434B7DA-ABAA-428A-944A-3AF1A7419A92}")) ICcPlatformContainer_11 : public IDispatch +#elif CORECON_VER==12 +struct __declspec(uuid("{2D405E9C-BBA4-406B-9E9F-A4E41CAC520C}")) ICcPlatformContainer_12 : public IDispatch +#endif { }; -struct __declspec(uuid("{A918FF41-F287-488D-BE16-99DBF54E331D}")) ICcProperty : public IDispatch +#if CORECON_VER==11 +struct __declspec(uuid("{A918FF41-F287-488D-BE16-99DBF54E331D}")) ICcProperty_11 : public IDispatch +#elif CORECON_VER==12 +struct __declspec(uuid("{750F503B-6686-4715-81EB-9E23EA0FC424}")) ICcProperty_12 : public IDispatch +#endif { virtual HRESULT __stdcall get_Value(BSTR *val) = 0; virtual HRESULT __stdcall set_Value(BSTR val) = 0; virtual HRESULT __stdcall AddPropertyContainer() = 0; }; -struct __declspec(uuid("{9636B4A4-633C-4542-A809-9E96ABF01FA5}")) ICcPropertyContainer : public IDispatch +#if CORECON_VER==11 +struct __declspec(uuid("{9636B4A4-633C-4542-A809-9E96ABF01FA5}")) ICcPropertyContainer_11 : public IDispatch +#elif CORECON_VER==12 +struct __declspec(uuid("{E92A5704-87B2-4059-81A2-C5C54424CF38}")) ICcPropertyContainer_12 : public IDispatch +#endif { }; -struct __declspec(uuid("{F19FF2DB-0A4E-4148-ABE3-47EE7E31194F}")) ICcServer : public IDispatch +#if CORECON_VER==11 +struct __declspec(uuid("{F19FF2DB-0A4E-4148-ABE3-47EE7E31194F}")) ICcServer_11 : public IDispatch +#elif CORECON_VER==12 +struct __declspec(uuid("{D0D076C5-5C71-4947-A056-94E8E760DFFE}")) ICcServer_12 : public IDispatch +#endif { virtual HRESULT __stdcall get_Locale(DWORD *locale) = 0; virtual HRESULT __stdcall put_Locale(DWORD *locale) = 0; - virtual HRESULT __stdcall GetDatastore(DWORD locale, ICcDatastore **datastore) = 0; - virtual HRESULT __stdcall GetConnection(ICcDevice *device, DWORD timeout, ICcServiceCB *callback, BSTR *connectionId, ICcConnection **connection) = 0; +#if CORECON_VER==11 + virtual HRESULT __stdcall GetDatastore(DWORD locale, ICcDatastore_11 **datastore) = 0; + virtual HRESULT __stdcall GetConnection(ICcDevice_11 *device, DWORD timeout, ICcServiceCB_11 *callback, BSTR *connectionId, ICcConnection_11 **connection) = 0; virtual HRESULT __stdcall EnumerateConnections(DWORD sizeActual, DWORD *sizeReturned, BSTR *connections, VARIANT_BOOL *moreEntries) = 0; - virtual HRESULT __stdcall GetConnectionFromId(BSTR connectionId, ICcConnection **connection) = 0; + virtual HRESULT __stdcall GetConnectionFromId(BSTR connectionId, ICcConnection_11 **connection) = 0; +#elif CORECON_VER==12 + virtual HRESULT __stdcall GetDatastore(DWORD locale, ICcDatastore_12 **datastore) = 0; + virtual HRESULT __stdcall GetConnection(ICcDevice_12 *device, DWORD timeout, ICcServiceCB_12 *callback, BSTR *connectionId, ICcConnection_12 **connection) = 0; + virtual HRESULT __stdcall EnumerateConnections(DWORD sizeActual, DWORD *sizeReturned, BSTR *connections, VARIANT_BOOL *moreEntries) = 0; + virtual HRESULT __stdcall GetConnectionFromId(BSTR connectionId, ICcConnection_12 **connection) = 0; +#endif }; #endif diff --git a/src/shared/corecon/ccapi_11.h b/src/shared/corecon/ccapi_11.h new file mode 100644 index 0000000000000000000000000000000000000000..c9c2cadf8a9063659d01f6f64923782159d2bd84 --- /dev/null +++ b/src/shared/corecon/ccapi_11.h @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CCAPI_11_H +#define CCAPI_11_H + +#define CORECON_VER 11 +#include "ccapi.h" + +#define CLSID_ConMan CLSID_ConMan_11; +typedef ICcCollection_11 ICcCollection; +typedef ICcConnection_11 ICcConnection; +typedef ICcConnection3_11 ICcConnection3; +typedef ICcConnection4_11 ICcConnection4; +typedef ICcDatastore_11 ICcDatastore; +typedef ICcDevice_11 ICcDevice; +typedef ICcDeviceContainer_11 ICcDeviceContainer; +typedef ICcObject_11 ICcObject; +typedef ICcObjectContainer_11 ICcObjectContainer; +typedef ICcPlatform_11 ICcPlatform; +typedef ICcPlatformContainer_11 ICcPlatformContainer; +typedef ICcProperty_11 ICcProperty; +typedef ICcPropertyContainer_11 ICcPropertyContainer; +typedef ICcServer_11 ICcServer; + +#endif // CCAPI_11_H diff --git a/src/shared/corecon/ccapi_12.h b/src/shared/corecon/ccapi_12.h new file mode 100644 index 0000000000000000000000000000000000000000..d0917bf6ff6853f4377827639f5c8473e5784178 --- /dev/null +++ b/src/shared/corecon/ccapi_12.h @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CCAPI_12_H +#define CCAPI_12_H + +#define CORECON_VER 12 +#include "ccapi.h" + +#define CLSID_ConMan CLSID_ConMan_12; +typedef ICcCollection_12 ICcCollection; +typedef ICcConnection_12 ICcConnection; +typedef ICcConnection3_12 ICcConnection3; +typedef ICcConnection4_12 ICcConnection4; +typedef ICcDatastore_12 ICcDatastore; +typedef ICcDevice_12 ICcDevice; +typedef ICcDeviceContainer_12 ICcDeviceContainer; +typedef ICcObject_12 ICcObject; +typedef ICcObjectContainer_12 ICcObjectContainer; +typedef ICcPlatform_12 ICcPlatform; +typedef ICcPlatformContainer_12 ICcPlatformContainer; +typedef ICcProperty_12 ICcProperty; +typedef ICcPropertyContainer_12 ICcPropertyContainer; +typedef ICcServer_12 ICcServer; + +#endif // CCAPI_12_H diff --git a/src/shared/corecon/corecon.cpp b/src/shared/corecon/corecon.cpp index 683e219b5a07fa370e6596f8fd270f9eb435ae0e..7220ac393755ea4afff173c764bf3dd677556e90 100644 --- a/src/shared/corecon/corecon.cpp +++ b/src/shared/corecon/corecon.cpp @@ -38,9 +38,27 @@ ** ****************************************************************************/ -#include "ccapi.h" #include "corecon.h" +// Force all versions of CoreCon in scope +#ifdef CCAPI_VERSIONED_H +#undef CCAPI_VERSIONED_H +#endif +#ifdef CORECON_VER +#undef CORECON_VER +#endif +#define CORECON_VER 11 +#include "ccapi.h" + +#ifdef CCAPI_VERSIONED_H +#undef CCAPI_VERSIONED_H +#endif +#ifdef CORECON_VER +#undef CORECON_VER +#endif +#define CORECON_VER 12 +#include "ccapi.h" + #include <QtCore/QString> #include <QtCore/QMutex> #include <QtCore/QMutexLocker> @@ -55,10 +73,10 @@ Q_LOGGING_CATEGORY(lcCoreCon, "qt.corecon") #define wchar(str) reinterpret_cast<LPCWSTR>(str.utf16()) -template <typename T> -static inline HRESULT collectionFor(const ComPtr<T> &container, ComPtr<ICcCollection> &collection) +template <typename ObjectContainerType, typename ContainerType, typename CollectionType> +static inline HRESULT collectionFor(const ComPtr<ContainerType> &container, ComPtr<CollectionType> &collection) { - ComPtr<ICcObjectContainer> objectContainer; + ComPtr<ObjectContainerType> objectContainer; HRESULT hr = container.As(&objectContainer); if (FAILED(hr)) return hr; @@ -72,12 +90,28 @@ public: QString name; QString id; bool isEmulator; - ComPtr<ICcDevice> handle; + int version; + +protected: + CoreConDevicePrivate(int version) : version(version) { } +}; + +template <typename DeviceType> +class CoreConDevicePrivateVersioned : public CoreConDevicePrivate +{ +public: + CoreConDevicePrivateVersioned(int version) : CoreConDevicePrivate(version) { } + ComPtr<DeviceType> handle; }; -CoreConDevice::CoreConDevice() - : d_ptr(new CoreConDevicePrivate) +CoreConDevice::CoreConDevice(int version) { + if (version == 11) + d_ptr.reset(new CoreConDevicePrivateVersioned<ICcDevice_11>(version)); + else if (version == 12) + d_ptr.reset(new CoreConDevicePrivateVersioned<ICcDevice_12>(version)); + else + qCCritical(lcCoreCon) << "Invalid CoreCon version specified:" << version; } CoreConDevice::~CoreConDevice() @@ -102,10 +136,14 @@ bool CoreConDevice::isEmulator() const return d->isEmulator; } -ICcDevice *CoreConDevice::handle() const +Qt::HANDLE CoreConDevice::handle() const { Q_D(const CoreConDevice); - return d->handle.Get(); + if (d->version == 11) + return static_cast<const CoreConDevicePrivateVersioned<ICcDevice_11> *>(d)->handle.Get(); + if (d->version == 12) + return static_cast<const CoreConDevicePrivateVersioned<ICcDevice_12> *>(d)->handle.Get(); + return 0; } class ComInitializer @@ -128,14 +166,8 @@ protected: class CoreConServerPrivate : private ComInitializer { public: - CoreConServerPrivate(CoreConServer *server) : langModule(0) + CoreConServerPrivate(int version) : version(version), langModule(0) { - HRESULT hr = CoCreateInstance(CLSID_ConMan, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&handle)); - if (FAILED(hr)) - qCWarning(lcCoreCon) << "Failed to initialize connection server." << server->formatError(hr); - - // The language module is available as long as the above succeeded - langModule = GetModuleHandle(L"conmanui"); } ~CoreConServerPrivate() { @@ -143,208 +175,268 @@ public: devices.clear(); } - ComPtr<ICcServer> handle; + virtual bool initialize() = 0; + + int version; QList<CoreConDevice *> devices; HMODULE langModule; -}; - -CoreConServer::CoreConServer() - : d_ptr(new CoreConServerPrivate(this)) -{ - initialize(); -} - -CoreConServer::~CoreConServer() -{ -} - -ICcServer *CoreConServer::handle() const -{ - Q_D(const CoreConServer); - return d->handle.Get(); -} -QList<CoreConDevice *> CoreConServer::devices() const -{ - Q_D(const CoreConServer); - return d->devices; -} - -bool CoreConServer::initialize() -{ - Q_D(CoreConServer); - if (!d || !d->handle) - return false; - - if (!d->devices.isEmpty()) - return true; - - ComPtr<ICcDatastore> dataStore; - HRESULT hr = d->handle->GetDatastore(GetUserDefaultLCID(), &dataStore); - if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to obtain the data store. HRESULT: 0x%x", hr); - return false; + template <typename T> + static CoreConDevicePrivateVersioned<T> *deviceHandle(CoreConDevice *device) + { + return static_cast<CoreConDevicePrivateVersioned<T> *>(device->d_ptr.data()); } +}; - ComPtr<ICcPlatformContainer> platformContainer; - hr = dataStore->get_PlatformContainer(&platformContainer); - if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to obtain the platform container. HRESULT: 0x%x", hr); - return false; - } +template <typename ServerType, typename DataStoreType, typename PlatformType, + typename PlatformContainerType, typename CollectionType, typename DeviceType, typename DeviceContainerType, + typename ObjectType, typename ObjectContainerType, typename PropertyType, typename PropertyContainerType> +class CoreConServerPrivateVersioned : public CoreConServerPrivate +{ +public: + CoreConServerPrivateVersioned(CoreConServer *server, int version) + : CoreConServerPrivate(version) + { + HRESULT hr = E_FAIL; + if (version == 11) + hr = CoCreateInstance(CLSID_ConMan_11, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&handle)); + else if (version == 12) + hr = CoCreateInstance(CLSID_ConMan_12, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&handle)); + else + qCCritical(lcCoreCon) << "Invalid CoreCon version specified:" << version; - ComPtr<ICcCollection> platformCollection; - hr = collectionFor(platformContainer, platformCollection); - if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to obtain the platform collection. HRESULT: 0x%x", hr); - return false; - } + if (FAILED(hr)) + qCWarning(lcCoreCon) << "Failed to initialize connection server." << server->formatError(hr); - long platformCount; - hr = platformCollection->get_Count(&platformCount); - if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to obtain the platform object count. HRESULT: 0x%x", hr); - return false; + // The language module is available as long as the above succeeded + langModule = GetModuleHandle(L"conmanui"); } - for (long platformIndex = 0; platformIndex < platformCount; ++platformIndex) { - ComPtr<ICcObject> platformObject; - hr = platformCollection->get_Item(platformIndex, &platformObject); - if (FAILED(hr)) { - qCDebug(lcCoreCon, "\1: %d", platformIndex); - continue; - } - ComPtr<ICcPlatform> platform; - hr = platformObject.As(&platform); + bool initialize() + { + ComPtr<DataStoreType> dataStore; + HRESULT hr = handle->GetDatastore(GetUserDefaultLCID(), &dataStore); if (FAILED(hr)) { - qCDebug(lcCoreCon, "\1: %d", platformIndex); - continue; + qCDebug(lcCoreCon, "Failed to obtain the data store. HRESULT: 0x%x", hr); + return false; } - ComPtr<ICcDeviceContainer> deviceContainer; - hr = platform->get_DeviceContainer(&deviceContainer); + ComPtr<PlatformContainerType> platformContainer; + hr = dataStore->get_PlatformContainer(&platformContainer); if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to obtain the device container.. 0x%x", hr); - continue; + qCDebug(lcCoreCon, "Failed to obtain the platform container. HRESULT: 0x%x", hr); + return false; } - ComPtr<ICcCollection> deviceCollection; - hr = collectionFor(deviceContainer, deviceCollection); + ComPtr<CollectionType> platformCollection; + hr = collectionFor<ObjectContainerType>(platformContainer, platformCollection); if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to obtain the device object collection.. 0x%x", hr); - continue; + qCDebug(lcCoreCon, "Failed to obtain the platform collection. HRESULT: 0x%x", hr); + return false; } - long deviceCount; - hr = deviceCollection->get_Count(&deviceCount); + long platformCount; + hr = platformCollection->get_Count(&platformCount); if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to obtain the device object count.. 0x%x", hr); - continue; + qCDebug(lcCoreCon, "Failed to obtain the platform object count. HRESULT: 0x%x", hr); + return false; } - for (long deviceIndex = 0; deviceIndex < deviceCount; ++deviceIndex) { - QScopedPointer<CoreConDevice> device(new CoreConDevice); - - ComPtr<ICcObject> deviceObject; - hr = deviceCollection->get_Item(deviceIndex, &deviceObject); + for (long platformIndex = 0; platformIndex < platformCount; ++platformIndex) { + ComPtr<ObjectType> platformObject; + hr = platformCollection->get_Item(platformIndex, &platformObject); if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to obtain the device object at index: %d", deviceIndex); + qCDebug(lcCoreCon, "\1: %d", platformIndex); continue; } - hr = deviceObject.As(&device->d_ptr->handle); + ComPtr<PlatformType> platform; + hr = platformObject.As(&platform); if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to confirm a device from the object at index: %d", deviceIndex); + qCDebug(lcCoreCon, "\1: %d", platformIndex); continue; } - _bstr_t deviceId; - hr = deviceObject->get_ID(deviceId.GetAddress()); + ComPtr<DeviceContainerType> deviceContainer; + hr = platform->get_DeviceContainer(&deviceContainer); if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to obtain device id at index: %d", deviceIndex); + qCDebug(lcCoreCon, "Failed to obtain the device container.. 0x%x", hr); continue; } - device->d_ptr->id = QString::fromWCharArray(deviceId); - _bstr_t deviceName; - hr = deviceObject->get_Name(deviceName.GetAddress()); - if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to obtain device name at index: %d", deviceIndex); - continue; - } - device->d_ptr->name = QString::fromWCharArray(deviceName); - ComPtr<ICcPropertyContainer> propertyContainer; - hr = deviceObject->get_PropertyContainer(&propertyContainer); + ComPtr<CollectionType> deviceCollection; + hr = collectionFor<ObjectContainerType>(deviceContainer, deviceCollection); if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to obtain a property container at index: %d", deviceIndex); + qCDebug(lcCoreCon, "Failed to obtain the device object collection.. 0x%x", hr); continue; } - ComPtr<ICcCollection> propertyCollection; - hr = collectionFor(propertyContainer, propertyCollection); + long deviceCount; + hr = deviceCollection->get_Count(&deviceCount); if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to obtain property collection of device at index: %d", deviceIndex); + qCDebug(lcCoreCon, "Failed to obtain the device object count.. 0x%x", hr); continue; } + for (long deviceIndex = 0; deviceIndex < deviceCount; ++deviceIndex) { + QScopedPointer<CoreConDevice> device(new CoreConDevice(version)); - bool isPseudoDevice = false; - long propertyCount; - hr = propertyCollection->get_Count(&propertyCount); - if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to obtain property count of device at index: %d", deviceIndex); - continue; - } + ComPtr<ObjectType> deviceObject; + hr = deviceCollection->get_Item(deviceIndex, &deviceObject); + if (FAILED(hr)) { + qCDebug(lcCoreCon, "Failed to obtain the device object at index: %d", deviceIndex); + continue; + } + + hr = deviceObject.As(&deviceHandle<DeviceType>(device.data())->handle); + if (FAILED(hr)) { + qCDebug(lcCoreCon, "Failed to confirm a device from the object at index: %d", deviceIndex); + continue; + } + + _bstr_t deviceId; + hr = deviceObject->get_ID(deviceId.GetAddress()); + if (FAILED(hr)) { + qCDebug(lcCoreCon, "Failed to obtain device id at index: %d", deviceIndex); + continue; + } + deviceHandle<DeviceType>(device.data())->id = QString::fromWCharArray(deviceId); + _bstr_t deviceName; + hr = deviceObject->get_Name(deviceName.GetAddress()); + if (FAILED(hr)) { + qCDebug(lcCoreCon, "Failed to obtain device name at index: %d", deviceIndex); + continue; + } + deviceHandle<DeviceType>(device.data())->name = QString::fromWCharArray(deviceName); - for (long propertyIndex = 0; propertyIndex < propertyCount; ++propertyIndex) { - ComPtr<ICcObject> propertyObject; - hr = propertyCollection->get_Item(propertyIndex, &propertyObject); + ComPtr<PropertyContainerType> propertyContainer; + hr = deviceObject->get_PropertyContainer(&propertyContainer); if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to obtain property at index: %d", propertyIndex); + qCDebug(lcCoreCon, "Failed to obtain a property container at index: %d", deviceIndex); continue; } - _bstr_t id; - hr = propertyObject->get_ID(id.GetAddress()); + ComPtr<CollectionType> propertyCollection; + hr = collectionFor<ObjectContainerType>(propertyContainer, propertyCollection); if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to obtain property id at index: %d", propertyIndex); + qCDebug(lcCoreCon, "Failed to obtain property collection of device at index: %d", deviceIndex); continue; } - ComPtr<ICcProperty> property; - hr = propertyObject.As(&property); + bool isPseudoDevice = false; + long propertyCount; + hr = propertyCollection->get_Count(&propertyCount); if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to cast the property object at index: %d", propertyIndex); + qCDebug(lcCoreCon, "Failed to obtain property count of device at index: %d", deviceIndex); continue; } - if (id == _bstr_t(L"IsPseudoDevice")) { - _bstr_t value; - hr = property->get_Value(value.GetAddress()); + for (long propertyIndex = 0; propertyIndex < propertyCount; ++propertyIndex) { + ComPtr<ObjectType> propertyObject; + hr = propertyCollection->get_Item(propertyIndex, &propertyObject); if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to cast the property value at index: %d", propertyIndex); + qCDebug(lcCoreCon, "Failed to obtain property at index: %d", propertyIndex); continue; } - if (value == _bstr_t(L"true")) { - isPseudoDevice = true; - break; // No need to look at this device further + + _bstr_t id; + hr = propertyObject->get_ID(id.GetAddress()); + if (FAILED(hr)) { + qCDebug(lcCoreCon, "Failed to obtain property id at index: %d", propertyIndex); + continue; } - } - if (id == _bstr_t(L"Emulator")) { - _bstr_t value; - hr = property->get_Value(value.GetAddress()); + ComPtr<PropertyType> property; + hr = propertyObject.As(&property); if (FAILED(hr)) { - qCDebug(lcCoreCon, "Failed to cast the property value at index: %d", propertyIndex); + qCDebug(lcCoreCon, "Failed to cast the property object at index: %d", propertyIndex); continue; } - device->d_ptr->isEmulator = value == _bstr_t(L"true"); + + if (id == _bstr_t(L"IsPseudoDevice")) { + _bstr_t value; + hr = property->get_Value(value.GetAddress()); + if (FAILED(hr)) { + qCDebug(lcCoreCon, "Failed to cast the property value at index: %d", propertyIndex); + continue; + } + if (value == _bstr_t(L"true")) { + isPseudoDevice = true; + break; // No need to look at this device further + } + } + + if (id == _bstr_t(L"Emulator")) { + _bstr_t value; + hr = property->get_Value(value.GetAddress()); + if (FAILED(hr)) { + qCDebug(lcCoreCon, "Failed to cast the property value at index: %d", propertyIndex); + continue; + } + deviceHandle<DeviceType>(device.data())->isEmulator = value == _bstr_t(L"true"); + } } - } - if (!isPseudoDevice) - d->devices.append(device.take()); + if (!isPseudoDevice) + devices.append(device.take()); + } } + return true; } - return true; + + ComPtr<ServerType> handle; +}; + +typedef CoreConServerPrivateVersioned<ICcServer_11, ICcDatastore_11, ICcPlatform_11, + ICcPlatformContainer_11, ICcCollection_11, ICcDevice_11, ICcDeviceContainer_11, + ICcObject_11, ICcObjectContainer_11, + ICcProperty_11, ICcPropertyContainer_11> CoreConServerPrivate_11; + +typedef CoreConServerPrivateVersioned<ICcServer_12, ICcDatastore_12, ICcPlatform_12, + ICcPlatformContainer_12, ICcCollection_12, ICcDevice_12, ICcDeviceContainer_12, + ICcObject_12, ICcObjectContainer_12, + ICcProperty_12, ICcPropertyContainer_12> CoreConServerPrivate_12; + +CoreConServer::CoreConServer(int version) +{ + if (version == 11) + d_ptr.reset(new CoreConServerPrivate_11(this, version)); + else if (version == 12) + d_ptr.reset(new CoreConServerPrivate_12(this, version)); + else + qCCritical(lcCoreCon) << "Invalid CoreCon version specified:" << version; + + initialize(); +} + +CoreConServer::~CoreConServer() +{ +} + +Qt::HANDLE CoreConServer::handle() const +{ + Q_D(const CoreConServer); + if (d->version == 11) + return static_cast<const CoreConServerPrivate_11 *>(d)->handle.Get(); + if (d->version == 12) + return static_cast<const CoreConServerPrivate_12 *>(d)->handle.Get(); + return 0; +} + +QList<CoreConDevice *> CoreConServer::devices() const +{ + Q_D(const CoreConServer); + return d->devices; +} + +bool CoreConServer::initialize() +{ + Q_D(CoreConServer); + if (!d || !handle()) + return false; + + if (!d->devices.isEmpty()) + return true; + + return d->initialize(); } QString CoreConServer::formatError(HRESULT hr) const diff --git a/src/shared/corecon/corecon.h b/src/shared/corecon/corecon.h index a769977be9d6f2cf92638be5be3887546ec2a278..690b5c56ac6f5f8c9527070b93f0ff678be462f5 100644 --- a/src/shared/corecon/corecon.h +++ b/src/shared/corecon/corecon.h @@ -46,35 +46,32 @@ #include <QtCore/QScopedPointer> #include <QtCore/QLoggingCategory> -struct ICcDevice; -struct ICcServer; - QT_USE_NAMESPACE class CoreConDevicePrivate; class CoreConDevice { public: - explicit CoreConDevice(); + explicit CoreConDevice(int version); ~CoreConDevice(); QString name() const; QString id() const; bool isEmulator() const; - ICcDevice *handle() const; + Qt::HANDLE handle() const; private: QScopedPointer<CoreConDevicePrivate> d_ptr; Q_DECLARE_PRIVATE(CoreConDevice) -friend class CoreConServer; +friend class CoreConServerPrivate; }; class CoreConServerPrivate; class CoreConServer { public: - CoreConServer(); + explicit CoreConServer(int version); ~CoreConServer(); bool initialize(); - ICcServer *handle() const; + Qt::HANDLE handle() const; QList<CoreConDevice *> devices() const; QString formatError(HRESULT hr) const; private: diff --git a/src/shared/corecon/corecon.pri b/src/shared/corecon/corecon.pri index 58ba4e1d54f49793a79de3114a1b8ac6176849c9..4d4abfd45781c7e0d05066f782f821ddb5c6e6bc 100644 --- a/src/shared/corecon/corecon.pri +++ b/src/shared/corecon/corecon.pri @@ -1,5 +1,5 @@ win32-msvc2012|win32-msvc2013 { INCLUDEPATH += $$PWD - HEADERS += $$PWD/ccapi.h $$PWD/corecon.h + HEADERS += $$PWD/ccapi.h $$PWD/ccapi_11.h $$PWD/ccapi_12.h $$PWD/corecon.h SOURCES += $$PWD/corecon.cpp } diff --git a/src/winrtrunner/xapengine.cpp b/src/winrtrunner/xapengine.cpp index 9ea018faac24314bc34bdf2787e9a21550e1c7e2..19651cd2604141e769e4b1c989caeca2a15a70b3 100644 --- a/src/winrtrunner/xapengine.cpp +++ b/src/winrtrunner/xapengine.cpp @@ -59,9 +59,9 @@ using namespace Microsoft::WRL; QT_USE_NAMESPACE -#include <ccapi.h> +#include <ccapi_11.h> #include <corecon.h> -Q_GLOBAL_STATIC(CoreConServer, coreConServer) +Q_GLOBAL_STATIC_WITH_ARGS(CoreConServer, coreConServer, (11)) #define wchar(str) reinterpret_cast<LPCWSTR>(str.utf16()) @@ -250,8 +250,8 @@ bool XapEngine::connect() HRESULT hr; if (!d->connection) { _bstr_t connectionName; - hr = coreConServer->handle()->GetConnection( - d->device->handle(), 5000, NULL, connectionName.GetAddress(), &d->connection); + hr = static_cast<ICcServer *>(coreConServer->handle())->GetConnection( + static_cast<ICcDevice *>(d->device->handle()), 5000, NULL, connectionName.GetAddress(), &d->connection); if (FAILED(hr)) { qCWarning(lcWinRtRunner) << "Unable to connect to device." << coreConServer->formatError(hr); return false;