From 7c84b3fa66562d2f6e3fcfe7abf2c7c9f538ceb1 Mon Sep 17 00:00:00 2001 From: Ruben Guerrero Samaniego Date: Thu, 31 Jan 2019 23:06:21 +0000 Subject: [PATCH] Merged PR 2844732: IAppx*Utf8 interfaces variants MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add UTF8 variant to public APIs that use LPWSTR or LPCWSTR. New Interfaces: • IAppxBlockMapFileUtf8 • IAppxBlockMapReaderUtf8 • IAppxBundleManifestPackageInfoUtf8 • IAppxBundleReaderUtf8 • IAppxFactoryUtf8 • IAppxFileUtf8 • IAppxManifestApplicationUtf8 • IAppxManifestPackageDependencyUtf8 • IAppxManifestPackageIdUtf8 • IAppxManifestPropertiesUtf8 • IAppxManifestQualifiedResourceUtf8 • IAppxManifestResourcesEnumeratorUtf8 • IAppxManifestTargetDeviceFamilyUtf8 • IAppxPackageReaderUtf8 This change also fixes a bug were all non-AppPackaging public interfaces (eg. IMsixElement) had their IID_I* set to 0 for Windows only. GUID definition is now defined on AppxPackaging.hpp removing the need of AppPackaging_i.cpp --- .../OverrideLanguageSample.cpp | 4 +- .../OverrideStreamSample.cpp | 20 +- src/inc/AppxBlockMapObject.hpp | 23 +- src/inc/AppxBundleManifest.hpp | 24 +- src/inc/AppxFactory.hpp | 25 +- src/inc/AppxFile.hpp | 13 +- src/inc/AppxManifestObject.hpp | 76 +- src/inc/AppxPackageInfo.hpp | 16 +- src/inc/AppxPackageObject.hpp | 29 +- src/inc/AppxPackaging.hpp | 880 ++++++++++-------- src/inc/ComHelper.hpp | 6 +- src/inc/Enumerators.hpp | 12 +- src/inc/IXml.hpp | 17 +- src/inc/MSIXFactory.hpp | 7 +- src/inc/MSIXWindows.hpp | 13 +- src/inc/StorageObject.hpp | 6 +- src/inc/StreamBase.hpp | 6 +- src/inc/VerifierObject.hpp | 6 +- src/msix/AppxBlockMapObject.cpp | 24 +- src/msix/AppxBundleManifest.cpp | 7 + src/msix/AppxFactory.cpp | 100 +- src/msix/AppxManifestObject.cpp | 2 +- src/msix/AppxPackageInfo.cpp | 48 +- src/msix/AppxPackageObject.cpp | 61 +- src/msix/AppxPackaging_i.cpp | 124 --- src/msix/CMakeLists.txt | 37 - .../PAL/FileSystem/Win32/DirectoryObject.cpp | 2 - src/msix/PAL/XML/AOSP/XmlObject.cpp | 36 +- src/msix/PAL/XML/Apple/XmlObject.cpp | 34 +- src/msix/PAL/XML/msxml6/XmlObject.cpp | 89 +- src/msix/PAL/XML/xerces-c/XmlObject.cpp | 33 +- test/api/ApiTests.cpp | 171 +++- 32 files changed, 1164 insertions(+), 787 deletions(-) delete mode 100644 src/msix/AppxPackaging_i.cpp diff --git a/sample/OverrideLanguageSample/OverrideLanguageSample.cpp b/sample/OverrideLanguageSample/OverrideLanguageSample.cpp index fedd0aa3e..063109ad8 100644 --- a/sample/OverrideLanguageSample/OverrideLanguageSample.cpp +++ b/sample/OverrideLanguageSample/OverrideLanguageSample.cpp @@ -114,12 +114,12 @@ class OverrideLanguages final : public IMsixApplicabilityLanguagesEnumerator OverrideLanguages(char** languages, int numLanguages) : m_languages(languages), m_numLanguages(numLanguages) {} // IUnknown - virtual ULONG STDMETHODCALLTYPE AddRef() override + virtual ULONG STDMETHODCALLTYPE AddRef() noexcept override { return ++m_ref; } - virtual ULONG STDMETHODCALLTYPE Release() override + virtual ULONG STDMETHODCALLTYPE Release() noexcept override { if (--m_ref == 0) { diff --git a/sample/OverrideStreamSample/OverrideStreamSample.cpp b/sample/OverrideStreamSample/OverrideStreamSample.cpp index e2ace5629..3cec5ea0c 100644 --- a/sample/OverrideStreamSample/OverrideStreamSample.cpp +++ b/sample/OverrideStreamSample/OverrideStreamSample.cpp @@ -187,12 +187,12 @@ class MyStream final : public IStream // IUnknown. // This is the loong way. Look at ComClass<> in src\inc\ComHelper.hpp for an example on how to avoid implementing IUnknown without pain. - virtual ULONG STDMETHODCALLTYPE AddRef() override + virtual ULONG STDMETHODCALLTYPE AddRef() noexcept override { return ++m_ref; } - virtual ULONG STDMETHODCALLTYPE Release() override + virtual ULONG STDMETHODCALLTYPE Release() noexcept override { if (--m_ref == 0) { @@ -342,12 +342,12 @@ class MyStreamFactory final : public IMsixStreamFactory MyStreamFactory(const std::wstring& path) : m_path(path), m_ref(1) {} // IUnknown - virtual ULONG STDMETHODCALLTYPE AddRef() override + virtual ULONG STDMETHODCALLTYPE AddRef() noexcept override { return ++m_ref; } - virtual ULONG STDMETHODCALLTYPE Release() override + virtual ULONG STDMETHODCALLTYPE Release() noexcept override { if (--m_ref == 0) { @@ -382,16 +382,22 @@ class MyStreamFactory final : public IMsixStreamFactory // IMsixStreamFactory virtual HRESULT STDMETHODCALLTYPE CreateStreamOnRelativePath(LPCWSTR relativePath, IStream** stream) noexcept override + { + return CreateStreamOnRelativePathUtf8(utf16_to_utf8(relativePath).c_str(), stream); + } + + virtual HRESULT STDMETHODCALLTYPE CreateStreamOnRelativePathUtf8(LPCSTR relativePath, IStream** stream) noexcept override { *stream = nullptr; ComPtr result; + auto path = utf16_to_utf8(m_path); #ifdef WIN32 - std::wstring fullFileName = m_path + std::wstring(L"\\") + relativePath; + std::string fullFileName = path + std::string("\\") + relativePath; #else - std::wstring fullFileName = m_path + std::wstring(L"/") + relativePath; + std::string fullFileName = path + std::string("/") + relativePath; std::replace(fullFileName.begin(), fullFileName.end(), '\\', '/' ); #endif - RETURN_IF_FAILED(ComPtr::MakeAndInitialize(&result, utf16_to_utf8(fullFileName), MyStream::Mode::READ)); + RETURN_IF_FAILED(ComPtr::MakeAndInitialize(&result, fullFileName, MyStream::Mode::READ)); if (result.Get() != nullptr) { *stream = result.Detach(); diff --git a/src/inc/AppxBlockMapObject.hpp b/src/inc/AppxBlockMapObject.hpp index feb730405..9813ca288 100644 --- a/src/inc/AppxBlockMapObject.hpp +++ b/src/inc/AppxBlockMapObject.hpp @@ -20,9 +20,8 @@ #include "Enumerators.hpp" // internal interface -EXTERN_C const IID IID_IAppxBlockMapInternal; -#ifndef WIN32 // {67fed21a-70ef-4175-8f12-415b213ab6d2} +#ifndef WIN32 interface IAppxBlockMapInternal : public IUnknown #else #include "Unknwn.h" @@ -31,11 +30,11 @@ class IAppxBlockMapInternal : public IUnknown #endif { public: - virtual std::vector GetFileNames() = 0; - virtual std::vector GetBlocks(const std::string& fileName) = 0; + virtual std::vector GetFileNames() = 0; + virtual std::vector GetBlocks(const std::string& fileName) = 0; virtual MSIX::ComPtr GetFile(const std::string& fileName) = 0; }; -SpecializeUuidOfImpl(IAppxBlockMapInternal); +MSIX_INTERFACE(IAppxBlockMapInternal, 0x67fed21a,0x70ef,0x4175,0x8f,0x12,0x41,0x5b,0x21,0x3a,0xb6,0xd2); namespace MSIX { @@ -66,7 +65,7 @@ namespace MSIX { Block* m_block; }; - class AppxBlockMapFile final : public MSIX::ComClass + class AppxBlockMapFile final : public MSIX::ComClass { public: AppxBlockMapFile( @@ -129,6 +128,13 @@ namespace MSIX { return static_cast(Error::NotImplemented); } + // IAppxBlockMapFileUtf8 + HRESULT STDMETHODCALLTYPE GetName(LPSTR *name) noexcept override try + { + ThrowHrIfFailed(m_factory->MarshalOutStringUtf8(m_name, name)); + return static_cast(Error::OK); + } CATCH_RETURN(); + private: std::vector> m_blockMapBlocks; std::vector* m_blocks; @@ -139,7 +145,7 @@ namespace MSIX { }; // Object backed by AppxBlockMap.xml - class AppxBlockMapObject final : public MSIX::ComClass + class AppxBlockMapObject final : public MSIX::ComClass { public: AppxBlockMapObject(IMsixFactory* factory, const ComPtr& stream); @@ -161,6 +167,9 @@ namespace MSIX { std::vector GetBlocks(const std::string& fileName) override; MSIX::ComPtr GetFile(const std::string& fileName) override; + // IAppxBlockMapReaderUtf8 + HRESULT STDMETHODCALLTYPE GetFile(LPCSTR filename, IAppxBlockMapFile **file) noexcept override; + protected: std::map> m_blockMap; std::map> m_blockMapFiles; diff --git a/src/inc/AppxBundleManifest.hpp b/src/inc/AppxBundleManifest.hpp index f9f1f4049..f54c8e1e7 100644 --- a/src/inc/AppxBundleManifest.hpp +++ b/src/inc/AppxBundleManifest.hpp @@ -12,9 +12,8 @@ #include "Applicability.hpp" #include "VerifierObject.hpp" -EXTERN_C const IID IID_IBundleInfo; -#ifndef WIN32 // {ff82ffcd-747a-4df9-8879-853ab9dd15a1} +#ifndef WIN32 interface IBundleInfo : public IUnknown #else #include "Unknwn.h" @@ -25,10 +24,10 @@ class IBundleInfo : public IUnknown public: virtual std::vector>& GetPackages() = 0; }; +MSIX_INTERFACE(IBundleInfo, 0xff82ffcd,0x747a,0x4df9,0x88,0x79,0x85,0x3a,0xb9,0xdd,0x15,0xa1); -EXTERN_C const IID IID_IAppxBundleManifestPackageInfoInternal; -#ifndef WIN32 // {32e6fcf0-729b-401d-9dbc-f927b494f9af} +#ifndef WIN32 interface IAppxBundleManifestPackageInfoInternal : public IUnknown #else #include "Unknwn.h" @@ -42,9 +41,7 @@ class IAppxBundleManifestPackageInfoInternal : public IUnknown virtual const std::uint64_t GetOffset() = 0; virtual bool HasQualifiedResources() = 0; }; - -SpecializeUuidOfImpl(IAppxBundleManifestPackageInfoInternal); -SpecializeUuidOfImpl(IBundleInfo); +MSIX_INTERFACE(IAppxBundleManifestPackageInfoInternal, 0x32e6fcf0,0x729b,0x401d,0x9d,0xbc,0xf9,0x27,0xb4,0x94,0xf9,0xaf); namespace MSIX { class AppxBundleManifestObject final : public ComClass @@ -73,7 +70,7 @@ namespace MSIX { std::vector> m_packages; }; - class AppxBundleQualifiedResource final : public MSIX::ComClass + class AppxBundleQualifiedResource final : public MSIX::ComClass { public: AppxBundleQualifiedResource(IMsixFactory* factory, const std::string& language) : m_factory(factory), m_language(language) {} @@ -95,12 +92,18 @@ namespace MSIX { return static_cast(Error::NotImplemented); } + // IAppxManifestQualifiedResourceUtf8 + HRESULT STDMETHODCALLTYPE GetLanguage(LPSTR *language) noexcept override try + { + return m_factory->MarshalOutStringUtf8(m_language, language); + } CATCH_RETURN(); + protected: IMsixFactory* m_factory; std::string m_language; }; - class AppxBundleManifestPackageInfo final : public ComClass + class AppxBundleManifestPackageInfo final : public ComClass { public: AppxBundleManifestPackageInfo( @@ -130,6 +133,9 @@ namespace MSIX { const std::uint64_t GetOffset() override { return m_offset; } bool HasQualifiedResources() override { return !m_languages.empty(); } + // IAppxBundleManifestPackageInfoUtf8 + HRESULT STDMETHODCALLTYPE GetFileName(LPSTR *fileName) noexcept override; + private: IMsixFactory* m_factory; std::string m_fileName; diff --git a/src/inc/AppxFactory.hpp b/src/inc/AppxFactory.hpp index 109b4ee9f..b8446652f 100644 --- a/src/inc/AppxFactory.hpp +++ b/src/inc/AppxFactory.hpp @@ -15,7 +15,7 @@ #include namespace MSIX { - class AppxFactory final : public ComClass + class AppxFactory final : public ComClass { public: AppxFactory(MSIX_VALIDATION_OPTION validationOptions, MSIX_APPLICABILITY_OPTIONS applicability, COTASKMEMALLOC* memalloc, COTASKMEMFREE* memfree ) : @@ -30,16 +30,11 @@ namespace MSIX { ~AppxFactory() {} // IAppxFactory - HRESULT STDMETHODCALLTYPE CreatePackageWriter(IStream* outputStream, APPX_PACKAGE_SETTINGS* , IAppxPackageWriter** packageWriter) noexcept override; - + HRESULT STDMETHODCALLTYPE CreatePackageWriter(IStream* outputStream, APPX_PACKAGE_SETTINGS* , IAppxPackageWriter** packageWriter) noexcept override; HRESULT STDMETHODCALLTYPE CreatePackageReader (IStream* inputStream, IAppxPackageReader** packageReader) noexcept override; - HRESULT STDMETHODCALLTYPE CreateManifestReader(IStream* inputStream, IAppxManifestReader** manifestReader) noexcept override ; - HRESULT STDMETHODCALLTYPE CreateBlockMapReader (IStream* inputStream, IAppxBlockMapReader** blockMapReader) noexcept override; - - HRESULT STDMETHODCALLTYPE CreateValidatedBlockMapReader ( - IStream* blockMapStream, - LPCWSTR signatureFileName, - IAppxBlockMapReader** blockMapReader) noexcept override; + HRESULT STDMETHODCALLTYPE CreateManifestReader(IStream* inputStream, IAppxManifestReader** manifestReader) noexcept override; + HRESULT STDMETHODCALLTYPE CreateBlockMapReader(IStream* inputStream, IAppxBlockMapReader** blockMapReader) noexcept override; + HRESULT STDMETHODCALLTYPE CreateValidatedBlockMapReader(IStream* blockMapStream, LPCWSTR signatureFileName, IAppxBlockMapReader** blockMapReader) noexcept override; // IAppxBundleFactory HRESULT STDMETHODCALLTYPE CreateBundleWriter(IStream *outputStream, UINT64 bundleVersion, IAppxBundleWriter **bundleWriter) noexcept override; @@ -48,10 +43,11 @@ namespace MSIX { // IMsixFactory HRESULT MarshalOutString(std::string& internal, LPWSTR *result) noexcept override; + HRESULT MarshalOutWstring(std::wstring& internal, LPWSTR* result) noexcept override; + HRESULT MarshalOutStringUtf8(std::string& internal, LPSTR* result) noexcept override; HRESULT MarshalOutBytes(std::vector& data, UINT32* size, BYTE** buffer) noexcept override; MSIX_VALIDATION_OPTION GetValidationOptions() override { return m_validationOptions; } ComPtr GetResource(const std::string& resource) override; - HRESULT MarshalOutWstring(std::wstring& internal, LPWSTR* result) noexcept override; // IXmlFactory MSIX::ComPtr CreateDomFromStream(XmlContentType footPrintType, const ComPtr& stream) override @@ -63,6 +59,9 @@ namespace MSIX { HRESULT STDMETHODCALLTYPE SpecifyExtension(MSIX_FACTORY_EXTENSION name, IUnknown* extension) noexcept override; HRESULT STDMETHODCALLTYPE GetCurrentSpecifiedExtension(MSIX_FACTORY_EXTENSION name, IUnknown** extension) noexcept override; + // IAppxFactoryUtf8 + HRESULT STDMETHODCALLTYPE CreateValidatedBlockMapReader(IStream* blockMapStream, LPCSTR signatureFileName, IAppxBlockMapReader** blockMapReader) noexcept override; + ComPtr m_xmlFactory; COTASKMEMALLOC* m_memalloc; COTASKMEMFREE* m_memfree; @@ -72,5 +71,9 @@ namespace MSIX { MSIX_APPLICABILITY_OPTIONS m_applicabilityFlags; ComPtr m_streamFactory; ComPtr m_applicabilityLanguagesEnumerator; + + private: + template + void MarshalOutStringHelper(std::size_t size, T* from, T** to); }; } \ No newline at end of file diff --git a/src/inc/AppxFile.hpp b/src/inc/AppxFile.hpp index 9c7917ae8..80a9cb7d4 100644 --- a/src/inc/AppxFile.hpp +++ b/src/inc/AppxFile.hpp @@ -20,7 +20,7 @@ #include "StreamBase.hpp" namespace MSIX { - class AppxFile : public ComClass + class AppxFile : public ComClass { public: AppxFile(IMsixFactory* factory, const std::string& name, const ComPtr& stream) : m_factory(factory), m_name(name), m_stream(stream) @@ -74,6 +74,17 @@ namespace MSIX { return static_cast(Error::OK); } CATCH_RETURN(); + // IAppxFileUtf8 + virtual HRESULT STDMETHODCALLTYPE GetContentType(LPSTR* contentType) noexcept override + { + return static_cast(Error::NotImplemented); + } + + virtual HRESULT STDMETHODCALLTYPE GetName(LPSTR* fileName) noexcept override try + { + return m_factory->MarshalOutStringUtf8(m_name, fileName); + } CATCH_RETURN(); + protected: std::string m_name; ComPtr m_stream; diff --git a/src/inc/AppxManifestObject.hpp b/src/inc/AppxManifestObject.hpp index 82308708a..7ac498208 100644 --- a/src/inc/AppxManifestObject.hpp +++ b/src/inc/AppxManifestObject.hpp @@ -18,9 +18,8 @@ #include "IXml.hpp" #include "UnicodeConversion.hpp" -EXTERN_C const IID IID_IAppxManifestObject; -#ifndef WIN32 // {eff6d561-a236-4058-9f1d-8f93633fba4b} +#ifndef WIN32 interface IAppxManifestObject : public IUnknown #else #include "Unknwn.h" @@ -31,13 +30,11 @@ class IAppxManifestObject : public IUnknown public: virtual const MSIX_PLATFORMS GetPlatform() = 0; }; - - -SpecializeUuidOfImpl(IAppxManifestObject); +MSIX_INTERFACE(IAppxManifestObject, 0xeff6d561,0xa236,0x4058,0x9f,0x1d,0x8f,0x93,0x63,0x3f,0xba,0x4b); namespace MSIX { - class AppxManifestTargetDeviceFamily final : public ComClass + class AppxManifestTargetDeviceFamily final : public ComClass { public: AppxManifestTargetDeviceFamily(IMsixFactory* factory, std::string& name, std::string& minVersion, std::string& maxVersion) : @@ -47,6 +44,7 @@ namespace MSIX { m_maxVersion = DecodeVersionNumber(maxVersion); } + // IAppxManifestTargetDeviceFamily HRESULT STDMETHODCALLTYPE GetName(LPWSTR* name) noexcept override try { return m_factory->MarshalOutString(m_name, name); @@ -66,6 +64,12 @@ namespace MSIX { return static_cast(Error::OK); } CATCH_RETURN(); + // IAppxManifestTargetDeviceFamilyUtf8 + HRESULT STDMETHODCALLTYPE GetName(LPSTR* name) noexcept override try + { + return m_factory->MarshalOutStringUtf8(m_name, name); + } CATCH_RETURN(); + protected: IMsixFactory* m_factory; std::string m_name; @@ -73,14 +77,15 @@ namespace MSIX { std::uint64_t m_maxVersion; }; - class AppxManifestApplication final : public ComClass + class AppxManifestApplication final : public ComClass { public: AppxManifestApplication(IMsixFactory* factory, std::string& aumid) : m_factory(factory), m_aumid(aumid) {} - HRESULT STDMETHODCALLTYPE GetStringValue(LPCWSTR name, LPWSTR* value) override + // IAppxManifestApplication + HRESULT STDMETHODCALLTYPE GetStringValue(LPCWSTR name, LPWSTR* value) noexcept override { return static_cast(Error::NotImplemented); } @@ -90,22 +95,51 @@ namespace MSIX { return m_factory->MarshalOutString(m_aumid, appUserModelId); } CATCH_RETURN(); + // IAppxManifestApplicationUtf8 + HRESULT STDMETHODCALLTYPE GetStringValue(LPCSTR name, LPSTR* value) noexcept override + { + return static_cast(Error::NotImplemented); + } + + HRESULT STDMETHODCALLTYPE GetAppUserModelId(LPSTR* appUserModelId) noexcept override try + { + return m_factory->MarshalOutStringUtf8(m_aumid, appUserModelId); + } CATCH_RETURN(); + protected: IMsixFactory* m_factory; std::string m_aumid; }; - class AppxManifestProperties final : public ComClass + class AppxManifestProperties final : public ComClass { public: AppxManifestProperties(IMsixFactory* factory, std::map stringValues, std::map boolValues) : m_factory(factory), m_stringValues(stringValues), m_boolValues(boolValues) {} + // IAppxManifestProperties HRESULT STDMETHODCALLTYPE GetBoolValue(LPCWSTR name, BOOL* value) noexcept override try + { + return GetBoolValue(wstring_to_utf8(name).c_str(), value); + } CATCH_RETURN(); + + HRESULT STDMETHODCALLTYPE GetStringValue(LPCWSTR name, LPWSTR* value) noexcept override try + { + ThrowErrorIf(Error::InvalidParameter, (value == nullptr || *value != nullptr), "bad pointer"); + auto result = m_stringValues.find(wstring_to_utf8(name)); + if (result != m_stringValues.end()) + { + return m_factory->MarshalOutString(result->second, value); + } + return static_cast(Error::InvalidParameter); + } CATCH_RETURN(); + + // IAppxManifestPropertiesUtf8 + HRESULT STDMETHODCALLTYPE GetBoolValue(LPCSTR name, BOOL* value) noexcept override try { ThrowErrorIf(Error::InvalidParameter, (value == nullptr), "bad pointer"); - auto result = m_boolValues.find(wstring_to_utf8(name)); + auto result = m_boolValues.find(name); if (result != m_boolValues.end()) { *value = result->second ? TRUE : FALSE; @@ -114,13 +148,13 @@ namespace MSIX { return static_cast(Error::InvalidParameter); } CATCH_RETURN(); - HRESULT STDMETHODCALLTYPE GetStringValue(LPCWSTR name, LPWSTR* value) noexcept override try + HRESULT STDMETHODCALLTYPE GetStringValue(LPCSTR name, LPSTR* value) noexcept override try { ThrowErrorIf(Error::InvalidParameter, (value == nullptr || *value != nullptr), "bad pointer"); - auto result = m_stringValues.find(wstring_to_utf8(name)); + auto result = m_stringValues.find(name); if (result != m_stringValues.end()) { - return m_factory->MarshalOutString(result->second, value); + return m_factory->MarshalOutStringUtf8(result->second, value); } return static_cast(Error::InvalidParameter); } CATCH_RETURN(); @@ -132,7 +166,7 @@ namespace MSIX { }; // TODO: add IAppxManifestPackageDependency2 if needed - class AppxManifestPackageDependency final : public ComClass + class AppxManifestPackageDependency final : public ComClass { public: AppxManifestPackageDependency(IMsixFactory* factory, std::string& minVersion, std::string& name, std::string& publisher) : @@ -141,6 +175,7 @@ namespace MSIX { m_minVersion = DecodeVersionNumber(minVersion); } + // IAppxManifestPackageDependency HRESULT STDMETHODCALLTYPE GetName(LPWSTR* name) noexcept override try { ThrowErrorIf(Error::InvalidParameter, (name == nullptr || *name != nullptr), "bad pointer"); @@ -160,6 +195,19 @@ namespace MSIX { return static_cast(Error::OK); } CATCH_RETURN(); + // IAppxManifestPackageDependencyUtf8 + HRESULT STDMETHODCALLTYPE GetName(LPSTR* name) noexcept override try + { + ThrowErrorIf(Error::InvalidParameter, (name == nullptr || *name != nullptr), "bad pointer"); + return m_factory->MarshalOutStringUtf8(m_name, name); + } CATCH_RETURN(); + + HRESULT STDMETHODCALLTYPE GetPublisher(LPSTR* publisher) noexcept override try + { + ThrowErrorIf(Error::InvalidParameter, (publisher == nullptr || *publisher != nullptr), "bad pointer"); + return m_factory->MarshalOutStringUtf8(m_publisher, publisher); + } CATCH_RETURN(); + protected: IMsixFactory* m_factory; UINT64 m_minVersion; diff --git a/src/inc/AppxPackageInfo.hpp b/src/inc/AppxPackageInfo.hpp index 7db4e8209..17077cd0d 100644 --- a/src/inc/AppxPackageInfo.hpp +++ b/src/inc/AppxPackageInfo.hpp @@ -11,9 +11,8 @@ #include #include -EXTERN_C const IID IID_IAppxManifestPackageIdInternal; -#ifndef WIN32 // {76b7d3e1-768a-45cb-9626-ba6452bed2de} +#ifndef WIN32 interface IAppxManifestPackageIdInternal : public IUnknown #else #include "Unknwn.h" @@ -30,8 +29,7 @@ class IAppxManifestPackageIdInternal : public IUnknown virtual const std::string& GetResourceId() = 0; virtual const std::string GetPackageFamilyName() = 0; }; - -SpecializeUuidOfImpl(IAppxManifestPackageIdInternal); +MSIX_INTERFACE(IAppxManifestPackageIdInternal, 0x76b7d3e1,0x768a,0x45cb,0x96,0x26,0xba,0x64,0x52,0xbe,0xd2,0xde); namespace MSIX { @@ -83,7 +81,7 @@ namespace MSIX { return result; } - class AppxManifestPackageId final : public ComClass + class AppxManifestPackageId final : public ComClass { public: AppxManifestPackageId( @@ -119,6 +117,14 @@ namespace MSIX { return m_name + "_" + m_publisherId; } + // IAppxManifestPackageIdUtf8 + HRESULT STDMETHODCALLTYPE GetName(LPSTR* name) noexcept override; + HRESULT STDMETHODCALLTYPE GetPublisher(LPSTR* publisher) noexcept override; + HRESULT STDMETHODCALLTYPE GetResourceId(LPSTR* resourceId) noexcept override; + HRESULT STDMETHODCALLTYPE ComparePublisher(LPCSTR other, BOOL *isSame) noexcept override; + HRESULT STDMETHODCALLTYPE GetPackageFullName(LPSTR* packageFullName) noexcept override; + HRESULT STDMETHODCALLTYPE GetPackageFamilyName(LPSTR* packageFamilyName) noexcept override; + private: void ValidatePackageString(std::string& packageString); std::string ComputePublisherId(const std::string& publisher); diff --git a/src/inc/AppxPackageObject.hpp b/src/inc/AppxPackageObject.hpp index 99890a913..5a2648bc0 100644 --- a/src/inc/AppxPackageObject.hpp +++ b/src/inc/AppxPackageObject.hpp @@ -25,9 +25,8 @@ #include "AppxManifestObject.hpp" // internal interface -EXTERN_C const IID IID_IPackage; -#ifndef WIN32 // {51b2c456-aaa9-46d6-8ec9-298220559189} +#ifndef WIN32 interface IPackage : public IUnknown #else #include "Unknwn.h" @@ -39,15 +38,13 @@ class IPackage : public IUnknown virtual void Unpack(MSIX_PACKUNPACK_OPTION options, const MSIX::ComPtr& to) = 0; virtual std::vector& GetFootprintFiles() = 0; }; - -SpecializeUuidOfImpl(IPackage); - +MSIX_INTERFACE(IPackage, 0x51b2c456,0xaaa9,0x46d6,0x8e,0xc9,0x29,0x82,0x20,0x55,0x91,0x89); namespace MSIX { // Storage object representing the entire AppxPackage // Note: This class has is own implmentation of QueryInterface, if a new interface is implemented // AppxPackageObject::QueryInterface must also be modified too. - class AppxPackageObject final : public ComClass + class AppxPackageObject final : public ComClass { public: AppxPackageObject(IMsixFactory* factory, MSIX_VALIDATION_OPTION validation, MSIX_APPLICABILITY_OPTIONS applicabilityOptions, const ComPtr& container); @@ -78,6 +75,12 @@ namespace MSIX { AddRef(); return S_OK; } + if (riid == UuidOfImpl::iid) + { + *ppvObject = static_cast(static_cast(this)); + AddRef(); + return S_OK; + } #ifdef BUNDLE_SUPPORT if (riid == UuidOfImpl::iid && m_isBundle) { @@ -85,6 +88,12 @@ namespace MSIX { AddRef(); return S_OK; } + if (riid == UuidOfImpl::iid && m_isBundle) + { + *ppvObject = static_cast(static_cast(this)); + AddRef(); + return S_OK; + } #endif //BUNDLE_SUPPORT if (riid == UuidOfImpl::iid) { @@ -112,7 +121,7 @@ namespace MSIX { HRESULT STDMETHODCALLTYPE GetPayloadPackages(IAppxFilesEnumerator **payloadPackages) noexcept override; HRESULT STDMETHODCALLTYPE GetPayloadPackage(LPCWSTR fileName, IAppxFile **payloadPackage) noexcept override; // Same signature as IAppxPackageReader - // HRESULT STDMETHODCALLTYPE GetBlockMap(IAppxBlockMapReader** blockMapReader) override; + // HRESULT STDMETHODCALLTYPE GetBlockMap(IAppxBlockMapReader** blockMapReader) noexcept override; // IStorageObject methods const char* GetPathSeparator() override; @@ -121,6 +130,12 @@ namespace MSIX { ComPtr OpenFile(const std::string& fileName, MSIX::FileStream::Mode mode) override; std::string GetFileName() override; + // IAppxPackageReaderUtf8 + HRESULT STDMETHODCALLTYPE GetPayloadFile(LPCSTR fileName, IAppxFile** file) noexcept override; + + // IAppxBundleReaderUtf8 + HRESULT STDMETHODCALLTYPE GetPayloadPackage(LPCSTR fileName, IAppxFile **payloadPackage) noexcept override; + protected: // Helper methods void VerifyFile(const ComPtr& stream, const std::string& fileName, const ComPtr& blockMapInternal); diff --git a/src/inc/AppxPackaging.hpp b/src/inc/AppxPackaging.hpp index c1742416c..b7fd62303 100644 --- a/src/inc/AppxPackaging.hpp +++ b/src/inc/AppxPackaging.hpp @@ -1,26 +1,87 @@ // // Copyright (C) 2017 Microsoft. All rights reserved. // See LICENSE file in the project root for full license information. -// +// /* File based on the header created by MIDL compiler version 8.01.0622 of AppxPackaging.idl */ -// Changes made to the original AppxPackaging.h file: -// - Remove pragma warning -// - Remove Windows specific headers -// - Remove C style interfaces declaration -// - Remove MIDL_INTERFACE MACRO -// - Add IUnknown, ISequentialStream and IStream interfaces -// - Add MSIX specific funcions and helpers (See bottom of file) -// - See more changes in AppxPackaging_i.cpp - #ifndef __appxpackaging_hpp__ #define __appxpackaging_hpp__ #include "MSIXWindows.hpp" +// Helper used for QueryInterface defines +template +struct False +{ + static constexpr bool value = false; +}; + +template +struct UuidOfImpl +{ + static_assert(False::value, "Type doesn't have an IID"); +}; + +#ifndef MSIX_INTERFACE +#define MSIX_INTERFACE(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ + static constexpr const IID IID_##name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}; \ + template<> \ + struct UuidOfImpl \ + { \ + static constexpr const IID& iid = IID_##name; \ + }; +#endif // MSIX_INTERFACE + #ifdef WIN32 #include + +// This interfaces already have an IID_I* for windows. We still need its UuidOfImpl specialization +#ifndef SpecializeUuidOfImpl +#define SpecializeUuidOfImpl(Type) \ + template<> \ + struct UuidOfImpl \ + { \ + static constexpr const IID& iid = IID_##Type; \ + }; \ + +SpecializeUuidOfImpl(IUnknown); +SpecializeUuidOfImpl(ISequentialStream); +SpecializeUuidOfImpl(IStream); +SpecializeUuidOfImpl(IAppxFactory); +SpecializeUuidOfImpl(IAppxPackageReader); +SpecializeUuidOfImpl(IAppxPackageWriter); +SpecializeUuidOfImpl(IAppxFile); +SpecializeUuidOfImpl(IAppxFilesEnumerator); +SpecializeUuidOfImpl(IAppxBlockMapReader); +SpecializeUuidOfImpl(IAppxBlockMapFile); +SpecializeUuidOfImpl(IAppxBlockMapFilesEnumerator); +SpecializeUuidOfImpl(IAppxBlockMapBlock); +SpecializeUuidOfImpl(IAppxBlockMapBlocksEnumerator); +SpecializeUuidOfImpl(IAppxManifestReader); +SpecializeUuidOfImpl(IAppxManifestReader2); +SpecializeUuidOfImpl(IAppxManifestReader3); +SpecializeUuidOfImpl(IAppxManifestPackageId); +SpecializeUuidOfImpl(IAppxManifestProperties); +SpecializeUuidOfImpl(IAppxManifestTargetDeviceFamiliesEnumerator); +SpecializeUuidOfImpl(IAppxManifestTargetDeviceFamily); +SpecializeUuidOfImpl(IAppxManifestPackageDependenciesEnumerator); +SpecializeUuidOfImpl(IAppxManifestPackageDependency); +SpecializeUuidOfImpl(IAppxManifestResourcesEnumerator); +SpecializeUuidOfImpl(IAppxManifestDeviceCapabilitiesEnumerator); +SpecializeUuidOfImpl(IAppxManifestCapabilitiesEnumerator); +SpecializeUuidOfImpl(IAppxManifestApplicationsEnumerator); +SpecializeUuidOfImpl(IAppxManifestApplication); +SpecializeUuidOfImpl(IAppxManifestQualifiedResourcesEnumerator); +SpecializeUuidOfImpl(IAppxManifestQualifiedResource); +SpecializeUuidOfImpl(IAppxBundleFactory); +SpecializeUuidOfImpl(IAppxBundleWriter); +SpecializeUuidOfImpl(IAppxBundleReader); +SpecializeUuidOfImpl(IAppxBundleManifestReader); +SpecializeUuidOfImpl(IAppxBundleManifestPackageInfoEnumerator); +SpecializeUuidOfImpl(IAppxBundleManifestPackageInfo); +#endif + #else // Interfaces @@ -65,53 +126,42 @@ extern "C"{ #ifndef __IUnknown_INTERFACE_DEFINED__ #define __IUnknown_INTERFACE_DEFINED__ -/* interface IUnknown */ -/* [unique][uuid][object][local] */ -EXTERN_C const IID IID_IUnknown; - // {00000000-0000-0000-C000-000000000046} + MSIX_INTERFACE(IUnknown,0x00000000,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); interface IUnknown { public: virtual HRESULT STDMETHODCALLTYPE QueryInterface( /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ void **ppvObject) = 0; - virtual ULONG STDMETHODCALLTYPE AddRef(void) = 0; - virtual ULONG STDMETHODCALLTYPE Release( void) = 0; + /* [annotation][iid_is][out] */ void **ppvObject) noexcept = 0; + virtual ULONG STDMETHODCALLTYPE AddRef(void) noexcept = 0; + virtual ULONG STDMETHODCALLTYPE Release( void) noexcept = 0; }; #endif /* __IUnknown_INTERFACE_DEFINED__ */ #ifndef __ISequentialStream_INTERFACE_DEFINED__ #define __ISequentialStream_INTERFACE_DEFINED__ -/* interface ISequentialStream */ -/* [unique][uuid][object] */ -EXTERN_C const IID IID_ISequentialStream; - // {0c733a30-2a1c-11ce-ade5-00aa0044773d} + MSIX_INTERFACE(ISequentialStream,0x0c733a30,0x2a1c,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d); interface ISequentialStream : public IUnknown { public: - virtual /* [local] */ HRESULT STDMETHODCALLTYPE Read( + virtual HRESULT STDMETHODCALLTYPE Read( /* [out] */ void *pv, /* [in] */ ULONG cb, - /* [out] */ ULONG *pcbRead) = 0; + /* [out] */ ULONG *pcbRead) noexcept = 0; virtual /* [local] */ HRESULT STDMETHODCALLTYPE Write( /* [in] */ const void *pv, /* [in]] */ ULONG cb, - /* [out_opt] */ ULONG *pcbWritten) = 0; - + /* [out_opt] */ ULONG *pcbWritten) noexcept = 0; }; #endif /* __ISequentialStream_INTERFACE_DEFINED__ */ #ifndef __IStream_INTERFACE_DEFINED__ #define __IStream_INTERFACE_DEFINED__ -/* interface IStream */ -/* [unique][uuid][object] */ -EXTERN_C const IID IID_IStream; - typedef struct tagSTATSTG { LPOLESTR pwcsName; @@ -153,10 +203,11 @@ enum tagLOCKTYPE } LOCKTYPE; // {0000000c-0000-0000-C000-000000000046} + MSIX_INTERFACE(IStream,0x0000000c,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); interface IStream : public ISequentialStream { public: - virtual /* [local] */ HRESULT STDMETHODCALLTYPE Seek( + virtual HRESULT STDMETHODCALLTYPE Seek( /* [in] */ LARGE_INTEGER dlibMove, /* [in] */ DWORD dwOrigin, /* [out] */ ULARGE_INTEGER *plibNewPosition) noexcept = 0; @@ -164,7 +215,7 @@ enum tagLOCKTYPE virtual HRESULT STDMETHODCALLTYPE SetSize( /* [in] */ ULARGE_INTEGER libNewSize) noexcept = 0; - virtual /* [local] */ HRESULT STDMETHODCALLTYPE CopyTo( + virtual HRESULT STDMETHODCALLTYPE CopyTo( /* [unique][in] */ IStream *pstm, /* [in] */ ULARGE_INTEGER cb, /* [out] */ ULARGE_INTEGER *pcbRead, @@ -173,7 +224,7 @@ enum tagLOCKTYPE virtual HRESULT STDMETHODCALLTYPE Commit( /* [in] */ DWORD grfCommitFlags) noexcept = 0; - virtual HRESULT STDMETHODCALLTYPE Revert( void) noexcept = 0; + virtual HRESULT STDMETHODCALLTYPE Revert(void) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE LockRegion( /* [in] */ ULARGE_INTEGER libOffset, @@ -191,7 +242,6 @@ enum tagLOCKTYPE virtual HRESULT STDMETHODCALLTYPE Clone( /* [out] */ IStream **ppstm) noexcept = 0; - }; #endif /* __IStream_INTERFACE_DEFINED__ */ @@ -204,7 +254,7 @@ enum tagLOCKTYPE IUri *hashMethod; } APPX_PACKAGE_SETTINGS; - typedef /* [v1_enum] */ + typedef enum APPX_COMPRESSION_OPTION { APPX_COMPRESSION_OPTION_NONE = 0, @@ -214,7 +264,7 @@ enum tagLOCKTYPE APPX_COMPRESSION_OPTION_SUPERFAST = 4 } APPX_COMPRESSION_OPTION; - typedef /* [v1_enum] */ + typedef enum APPX_FOOTPRINT_FILE_TYPE { APPX_FOOTPRINT_FILE_TYPE_MANIFEST = 0, @@ -224,7 +274,7 @@ enum tagLOCKTYPE APPX_FOOTPRINT_FILE_TYPE_CONTENTGROUPMAP = 4 } APPX_FOOTPRINT_FILE_TYPE; - typedef /* [v1_enum] */ + typedef enum APPX_BUNDLE_FOOTPRINT_FILE_TYPE { APPX_BUNDLE_FOOTPRINT_FILE_TYPE_FIRST = 0, @@ -234,7 +284,7 @@ enum tagLOCKTYPE APPX_BUNDLE_FOOTPRINT_FILE_TYPE_LAST = 2 } APPX_BUNDLE_FOOTPRINT_FILE_TYPE; - typedef /* [v1_enum] */ + typedef enum APPX_CAPABILITIES { APPX_CAPABILITY_INTERNET_CLIENT = 0x1, @@ -251,7 +301,7 @@ enum tagLOCKTYPE APPX_CAPABILITY_CONTACTS = 0x800 } APPX_CAPABILITIES; - typedef /* [v1_enum] */ + typedef enum APPX_PACKAGE_ARCHITECTURE { APPX_PACKAGE_ARCHITECTURE_X86 = 0, @@ -261,7 +311,7 @@ enum tagLOCKTYPE APPX_PACKAGE_ARCHITECTURE_ARM64 = 12 } APPX_PACKAGE_ARCHITECTURE; - typedef /* [v1_enum] */ + typedef enum APPX_PACKAGE_ARCHITECTURE2 { APPX_PACKAGE_ARCHITECTURE2_X86 = 0, @@ -273,14 +323,14 @@ enum tagLOCKTYPE APPX_PACKAGE_ARCHITECTURE2_UNKNOWN = 0xffff } APPX_PACKAGE_ARCHITECTURE2; - typedef /* [v1_enum] */ + typedef enum APPX_BUNDLE_PAYLOAD_PACKAGE_TYPE { APPX_BUNDLE_PAYLOAD_PACKAGE_TYPE_APPLICATION = 0, APPX_BUNDLE_PAYLOAD_PACKAGE_TYPE_RESOURCE = 1 } APPX_BUNDLE_PAYLOAD_PACKAGE_TYPE; - typedef /* [v1_enum] */ + typedef enum DX_FEATURE_LEVEL { DX_FEATURE_LEVEL_UNSPECIFIED = 0, @@ -289,7 +339,7 @@ enum tagLOCKTYPE DX_FEATURE_LEVEL_11 = 3 } DX_FEATURE_LEVEL; - typedef /* [v1_enum] */ + typedef enum APPX_CAPABILITY_CLASS_TYPE { APPX_CAPABILITY_CLASS_DEFAULT = 0, @@ -300,47 +350,40 @@ enum tagLOCKTYPE APPX_CAPABILITY_CLASS_CUSTOM = 0x8 } APPX_CAPABILITY_CLASS_TYPE; -/* interface IAppxFactory */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxFactory; - // {beb94909-e451-438b-b5a7-d79e767b75d8} + MSIX_INTERFACE(IAppxFactory,0xbeb94909,0xe451,0x438b,0xb5,0xa7,0xd7,0x9e,0x76,0x7b,0x75,0xd8); interface IAppxFactory : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE CreatePackageWriter( /* [in] */ IStream *outputStream, /* [in] */ APPX_PACKAGE_SETTINGS *settings, - /* [retval][out] */ IAppxPackageWriter **packageWriter) = 0; + /* [retval][out] */ IAppxPackageWriter **packageWriter) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE CreatePackageReader( /* [in] */ IStream *inputStream, - /* [retval][out] */ IAppxPackageReader **packageReader) = 0; + /* [retval][out] */ IAppxPackageReader **packageReader) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE CreateManifestReader( /* [in] */ IStream *inputStream, - /* [retval][out] */ IAppxManifestReader **manifestReader) = 0; + /* [retval][out] */ IAppxManifestReader **manifestReader) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE CreateBlockMapReader( /* [in] */ IStream *inputStream, - /* [retval][out] */ IAppxBlockMapReader **blockMapReader) = 0; + /* [retval][out] */ IAppxBlockMapReader **blockMapReader) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE CreateValidatedBlockMapReader( /* [in] */ IStream *blockMapStream, /* [in] */ LPCWSTR signatureFileName, - /* [retval][out] */ IAppxBlockMapReader **blockMapReader) = 0; - + /* [retval][out] */ IAppxBlockMapReader **blockMapReader) noexcept = 0; }; #endif /* __IAppxFactory_INTERFACE_DEFINED__ */ #ifndef __IAppxPackageReader_INTERFACE_DEFINED__ #define __IAppxPackageReader_INTERFACE_DEFINED__ -/* interface IAppxPackageReader */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxPackageReader; - - // {b5c49650-99bc-481c-9a34-3d53a4106708} + // {b5c49650-99bc-481c-9a34-} + MSIX_INTERFACE(IAppxPackageReader,0xb5c49650,0x99bc,0x481c,0x9a,0x34,0x3d,0x53,0xa4,0x10,0x67,0x08); interface IAppxPackageReader : public IUnknown { public: @@ -360,18 +403,14 @@ EXTERN_C const IID IID_IAppxPackageReader; virtual HRESULT STDMETHODCALLTYPE GetManifest( /* [retval][out] */ IAppxManifestReader **manifestReader) noexcept = 0; - }; #endif /* __IAppxPackageReader_INTERFACE_DEFINED__ */ #ifndef __IAppxPackageWriter_INTERFACE_DEFINED__ #define __IAppxPackageWriter_INTERFACE_DEFINED__ -/* interface IAppxPackageWriter */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxPackageWriter; - // {9099e33b-246f-41e4-881a-008eb613f858} + MSIX_INTERFACE(IAppxPackageWriter,0x9099e33b,0x246f,0x41e4,0x88,0x1a,0x00,0x8e,0xb6,0x13,0xf8,0x58); interface IAppxPackageWriter : public IUnknown { public: @@ -379,10 +418,10 @@ EXTERN_C const IID IID_IAppxPackageWriter; /* [string][in] */ LPCWSTR fileName, /* [string][in] */ LPCWSTR contentType, /* [in] */ APPX_COMPRESSION_OPTION compressionOption, - /* [in] */ IStream *inputStream) = 0; + /* [in] */ IStream *inputStream) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE Close( - /* [in] */ IStream *manifest) = 0; + /* [in] */ IStream *manifest) noexcept = 0; }; #endif /* __IAppxPackageWriter_INTERFACE_DEFINED__ */ @@ -390,11 +429,8 @@ EXTERN_C const IID IID_IAppxPackageWriter; #ifndef __IAppxFile_INTERFACE_DEFINED__ #define __IAppxFile_INTERFACE_DEFINED__ -/* interface IAppxFile */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxFile; - // {91df827b-94fd-468f-827b-57f41b2f6f2e} + MSIX_INTERFACE(IAppxFile,0x91df827b,0x94fd,0x468f,0x82,0x7b,0x57,0xf4,0x1b,0x2f,0x6f,0x2e); interface IAppxFile : public IUnknown { public: @@ -412,18 +448,14 @@ EXTERN_C const IID IID_IAppxFile; virtual HRESULT STDMETHODCALLTYPE GetStream( /* [retval][out] */ IStream **stream) noexcept = 0; - }; #endif /* __IAppxFile_INTERFACE_DEFINED__ */ #ifndef __IAppxFilesEnumerator_INTERFACE_DEFINED__ #define __IAppxFilesEnumerator_INTERFACE_DEFINED__ -/* interface IAppxFilesEnumerator */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxFilesEnumerator; - // {f007eeaf-9831-411c-9847-917cdc62d1fe} + MSIX_INTERFACE(IAppxFilesEnumerator,0xf007eeaf,0x9831,0x411c,0x98,0x47,0x91,0x7c,0xdc,0x62,0xd1,0xfe); interface IAppxFilesEnumerator : public IUnknown { public: @@ -442,11 +474,8 @@ EXTERN_C const IID IID_IAppxFilesEnumerator; #ifndef __IAppxBlockMapReader_INTERFACE_DEFINED__ #define __IAppxBlockMapReader_INTERFACE_DEFINED__ -/* interface IAppxBlockMapReader */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxBlockMapReader; - // {5efec991-bca3-42d1-9ec2-e92d609ec22a} + MSIX_INTERFACE(IAppxBlockMapReader,0x5efec991,0xbca3,0x42d1,0x9e,0xc2,0xe9,0x2d,0x60,0x9e,0xc2,0x2a); interface IAppxBlockMapReader : public IUnknown { public: @@ -462,18 +491,14 @@ EXTERN_C const IID IID_IAppxBlockMapReader; virtual HRESULT STDMETHODCALLTYPE GetStream( /* [retval][out] */ IStream **blockMapStream) noexcept = 0; - }; #endif /* __IAppxBlockMapReader_INTERFACE_DEFINED__ */ #ifndef __IAppxBlockMapFile_INTERFACE_DEFINED__ #define __IAppxBlockMapFile_INTERFACE_DEFINED__ -/* interface IAppxBlockMapFile */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxBlockMapFile; - // {277672ac-4f63-42c1-8abc-beae3600eb59} + MSIX_INTERFACE(IAppxBlockMapFile,0x277672ac,0x4f63,0x42c1,0x8a,0xbc,0xbe,0xae,0x36,0x00,0xeb,0x59); interface IAppxBlockMapFile : public IUnknown { public: @@ -499,11 +524,8 @@ EXTERN_C const IID IID_IAppxBlockMapFile; #ifndef __IAppxBlockMapFilesEnumerator_INTERFACE_DEFINED__ #define __IAppxBlockMapFilesEnumerator_INTERFACE_DEFINED__ -/* interface IAppxBlockMapFilesEnumerator */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxBlockMapFilesEnumerator; - // {02b856a2-4262-4070-bacb-1a8cbbc42305} + MSIX_INTERFACE(IAppxBlockMapFilesEnumerator,0x02b856a2,0x4262,0x4070,0xba,0xcb,0x1a,0x8c,0xbb,0xc4,0x23,0x05); interface IAppxBlockMapFilesEnumerator : public IUnknown { public: @@ -515,18 +537,14 @@ EXTERN_C const IID IID_IAppxBlockMapFilesEnumerator; virtual HRESULT STDMETHODCALLTYPE MoveNext( /* [retval][out] */ BOOL *hasCurrent) noexcept = 0; - }; #endif /* __IAppxBlockMapFilesEnumerator_INTERFACE_DEFINED__ */ #ifndef __IAppxBlockMapBlock_INTERFACE_DEFINED__ #define __IAppxBlockMapBlock_INTERFACE_DEFINED__ -/* interface IAppxBlockMapBlock */ -/* [unique][uuid][object] */ -EXTERN_C const IID IID_IAppxBlockMapBlock; - // {75cf3930-3244-4fe0-a8c8-e0bcb270b889} + MSIX_INTERFACE(IAppxBlockMapBlock,0x75cf3930,0x3244,0x4fe0,0xa8,0xc8,0xe0,0xbc,0xb2,0x70,0xb8,0x89); interface IAppxBlockMapBlock : public IUnknown { public: @@ -536,18 +554,14 @@ EXTERN_C const IID IID_IAppxBlockMapBlock; virtual HRESULT STDMETHODCALLTYPE GetCompressedSize( /* [retval][out] */ UINT32 *size) noexcept = 0; - }; #endif /* __IAppxBlockMapBlock_INTERFACE_DEFINED__ */ #ifndef __IAppxBlockMapBlocksEnumerator_INTERFACE_DEFINED__ #define __IAppxBlockMapBlocksEnumerator_INTERFACE_DEFINED__ -/* interface IAppxBlockMapBlocksEnumerator */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxBlockMapBlocksEnumerator; - // {6b429b5b-36ef-479e-b9eb-0c1482b49e16} + MSIX_INTERFACE(IAppxBlockMapBlocksEnumerator,0x6b429b5b,0x36ef,0x479e,0xb9,0xeb,0x0c,0x14,0x82,0xb4,0x9e,0x16); interface IAppxBlockMapBlocksEnumerator : public IUnknown { public: @@ -559,65 +573,57 @@ EXTERN_C const IID IID_IAppxBlockMapBlocksEnumerator; virtual HRESULT STDMETHODCALLTYPE MoveNext( /* [retval][out] */ BOOL *hasNext) noexcept = 0; - }; #endif /* __IAppxBlockMapBlocksEnumerator_INTERFACE_DEFINED__ */ #ifndef __IAppxManifestReader_INTERFACE_DEFINED__ #define __IAppxManifestReader_INTERFACE_DEFINED__ -/* interface IAppxManifestReader */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxManifestReader; - // {4e1bd148-55a0-4480-a3d1-15544710637c} + MSIX_INTERFACE(IAppxManifestReader,0x4e1bd148,0x55a0,0x4480,0xa3,0xd1,0x15,0x54,0x47,0x10,0x63,0x7c); interface IAppxManifestReader : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetPackageId( - /* [retval][out] */ IAppxManifestPackageId **packageId) = 0; + /* [retval][out] */ IAppxManifestPackageId **packageId) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetProperties( - /* [retval][out] */ IAppxManifestProperties **packageProperties) = 0; + /* [retval][out] */ IAppxManifestProperties **packageProperties) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetPackageDependencies( - /* [retval][out] */ IAppxManifestPackageDependenciesEnumerator **dependencies) = 0; + /* [retval][out] */ IAppxManifestPackageDependenciesEnumerator **dependencies) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetCapabilities( - /* [retval][out] */ APPX_CAPABILITIES *capabilities) = 0; + /* [retval][out] */ APPX_CAPABILITIES *capabilities) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetResources( - /* [retval][out] */ IAppxManifestResourcesEnumerator **resources) = 0; + /* [retval][out] */ IAppxManifestResourcesEnumerator **resources) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetDeviceCapabilities( - /* [retval][out] */ IAppxManifestDeviceCapabilitiesEnumerator **deviceCapabilities) = 0; + /* [retval][out] */ IAppxManifestDeviceCapabilitiesEnumerator **deviceCapabilities) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetPrerequisite( /* [string][in] */ LPCWSTR name, - /* [retval][out] */ UINT64 *value) = 0; + /* [retval][out] */ UINT64 *value) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetApplications( - /* [retval][out] */ IAppxManifestApplicationsEnumerator **applications) = 0; + /* [retval][out] */ IAppxManifestApplicationsEnumerator **applications) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetStream( - /* [retval][out] */ IStream **manifestStream) = 0; - + /* [retval][out] */ IStream **manifestStream) noexcept = 0; }; #endif /* __IAppxManifestReader_INTERFACE_DEFINED__ */ #ifndef __IAppxManifestReader2_INTERFACE_DEFINED__ #define __IAppxManifestReader2_INTERFACE_DEFINED__ -/* interface IAppxManifestReader2 */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxManifestReader2; - // {d06f67bc-b31d-4eba-a8af-638e73e77b4d} + MSIX_INTERFACE(IAppxManifestReader2,0xd06f67bc,0xb31d,0x4eba,0xa8,0xaf,0x63,0x8e,0x73,0xe7,0x7b,0x4d); interface IAppxManifestReader2 : public IAppxManifestReader { public: virtual HRESULT STDMETHODCALLTYPE GetQualifiedResources( - /* [retval][out] */ IAppxManifestQualifiedResourcesEnumerator **resources) = 0; + /* [retval][out] */ IAppxManifestQualifiedResourcesEnumerator **resources) noexcept = 0; }; #endif /* __IAppxManifestReader2_INTERFACE_DEFINED__ */ @@ -625,127 +631,108 @@ EXTERN_C const IID IID_IAppxManifestReader2; #ifndef __IAppxManifestReader3_INTERFACE_DEFINED__ #define __IAppxManifestReader3_INTERFACE_DEFINED__ -/* interface IAppxManifestReader3 */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxManifestReader3; - // {c43825ab-69b7-400a-9709-cc37f5a72d24} + MSIX_INTERFACE(IAppxManifestReader3,0xc43825ab,0x69b7,0x400a,0x97,0x09,0xcc,0x37,0xf5,0xa7,0x2d,0x24); interface IAppxManifestReader3 : public IAppxManifestReader2 { public: virtual HRESULT STDMETHODCALLTYPE GetCapabilitiesByCapabilityClass( /* [in] */ APPX_CAPABILITY_CLASS_TYPE capabilityClass, - /* [retval][out] */ IAppxManifestCapabilitiesEnumerator **capabilities) = 0; + /* [retval][out] */ IAppxManifestCapabilitiesEnumerator **capabilities) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetTargetDeviceFamilies( - /* [retval][out] */ IAppxManifestTargetDeviceFamiliesEnumerator **targetDeviceFamilies) = 0; - + /* [retval][out] */ IAppxManifestTargetDeviceFamiliesEnumerator **targetDeviceFamilies) noexcept = 0; }; #endif /* __IAppxManifestReader3_INTERFACE_DEFINED__ */ #ifndef __IAppxManifestPackageId_INTERFACE_DEFINED__ #define __IAppxManifestPackageId_INTERFACE_DEFINED__ -/* interface IAppxManifestPackageId */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxManifestPackageId; - // {283ce2d7-7153-4a91-9649-7a0f7240945f} + MSIX_INTERFACE(IAppxManifestPackageId,0x283ce2d7,0x7153,0x4a91,0x96,0x49,0x7a,0x0f,0x72,0x40,0x94,0x5f); interface IAppxManifestPackageId : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetName( - /* [retval][string][out] */ LPWSTR *name) = 0; + /* [retval][string][out] */ LPWSTR *name) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetArchitecture( - /* [retval][out] */ APPX_PACKAGE_ARCHITECTURE *architecture) = 0; + /* [retval][out] */ APPX_PACKAGE_ARCHITECTURE *architecture) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetPublisher( - /* [retval][string][out] */ LPWSTR *publisher) = 0; + /* [retval][string][out] */ LPWSTR *publisher) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetVersion( - /* [retval][out] */ UINT64 *packageVersion) = 0; + /* [retval][out] */ UINT64 *packageVersion) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetResourceId( - /* [retval][string][out] */ LPWSTR *resourceId) = 0; + /* [retval][string][out] */ LPWSTR *resourceId) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE ComparePublisher( /* [string][in] */ LPCWSTR other, - /* [retval][out] */ BOOL *isSame) = 0; + /* [retval][out] */ BOOL *isSame) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetPackageFullName( - /* [retval][string][out] */ LPWSTR *packageFullName) = 0; + /* [retval][string][out] */ LPWSTR *packageFullName) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetPackageFamilyName( - /* [retval][string][out] */ LPWSTR *packageFamilyName) = 0; - + /* [retval][string][out] */ LPWSTR *packageFamilyName) noexcept = 0; }; #endif /* __IAppxManifestPackageId_INTERFACE_DEFINED__ */ #ifndef __IAppxManifestProperties_INTERFACE_DEFINED__ #define __IAppxManifestProperties_INTERFACE_DEFINED__ -/* interface IAppxManifestProperties */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxManifestProperties; - // {03faf64d-f26f-4b2c-aaf7-8fe7789b8bca} + MSIX_INTERFACE(IAppxManifestProperties,0x03faf64d,0xf26f,0x4b2c,0xaa,0xf7,0x8f,0xe7,0x78,0x9b,0x8b,0xca); interface IAppxManifestProperties : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetBoolValue( /* [string][in] */ LPCWSTR name, - /* [retval][out] */ BOOL *value) = 0; + /* [retval][out] */ BOOL *value) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetStringValue( /* [string][in] */ LPCWSTR name, - /* [retval][string][out] */ LPWSTR *value) = 0; - + /* [retval][string][out] */ LPWSTR *value) noexcept = 0; }; #endif /* __IAppxManifestProperties_INTERFACE_DEFINED__ */ #ifndef __IAppxManifestTargetDeviceFamiliesEnumerator_INTERFACE_DEFINED__ #define __IAppxManifestTargetDeviceFamiliesEnumerator_INTERFACE_DEFINED__ -/* interface IAppxManifestTargetDeviceFamiliesEnumerator */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxManifestTargetDeviceFamiliesEnumerator; - // {36537f36-27a4-4788-88c0-733819575017} + MSIX_INTERFACE(IAppxManifestTargetDeviceFamiliesEnumerator,0x36537F36,0x27A4,0x4788,0x88,0xC0,0x73,0x38,0x19,0x57,0x50,0x17); interface IAppxManifestTargetDeviceFamiliesEnumerator : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetCurrent( - /* [retval][out] */ IAppxManifestTargetDeviceFamily **targetDeviceFamily) = 0; + /* [retval][out] */ IAppxManifestTargetDeviceFamily **targetDeviceFamily) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetHasCurrent( - /* [retval][out] */ BOOL *hasCurrent) = 0; + /* [retval][out] */ BOOL *hasCurrent) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE MoveNext( - /* [retval][out] */ BOOL *hasNext) = 0; - + /* [retval][out] */ BOOL *hasNext) noexcept = 0; }; #endif /* __IAppxManifestTargetDeviceFamiliesEnumerator_INTERFACE_DEFINED__ */ #ifndef __IAppxManifestTargetDeviceFamily_INTERFACE_DEFINED__ #define __IAppxManifestTargetDeviceFamily_INTERFACE_DEFINED__ -/* interface IAppxManifestTargetDeviceFamily */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxManifestTargetDeviceFamily; - // {9091b09b-c8d5-4f31-8687-a338259faefb} + MSIX_INTERFACE(IAppxManifestTargetDeviceFamily,0x9091B09B,0xC8D5,0x4F31,0x86,0x87,0xA3,0x38,0x25,0x9F,0xAE,0xFB); interface IAppxManifestTargetDeviceFamily : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetName( - /* [retval][string][out] */ LPWSTR *name) = 0; + /* [retval][string][out] */ LPWSTR *name) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetMinVersion( - /* [retval][out] */ UINT64 *minVersion) = 0; + /* [retval][out] */ UINT64 *minVersion) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetMaxVersionTested( - /* [retval][out] */ UINT64 *maxVersionTested) = 0; + /* [retval][out] */ UINT64 *maxVersionTested) noexcept = 0; }; #endif /* __IAppxManifestTargetDeviceFamily_INTERFACE_DEFINED__ */ @@ -753,68 +740,57 @@ EXTERN_C const IID IID_IAppxManifestTargetDeviceFamily; #ifndef __IAppxManifestPackageDependenciesEnumerator_INTERFACE_DEFINED__ #define __IAppxManifestPackageDependenciesEnumerator_INTERFACE_DEFINED__ -/* interface IAppxManifestPackageDependenciesEnumerator */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxManifestPackageDependenciesEnumerator; - // {b43bbcf9-65a6-42dd-bac0-8c6741e7f5a4} + MSIX_INTERFACE(IAppxManifestPackageDependenciesEnumerator,0xb43bbcf9,0x65a6,0x42dd,0xba,0xc0,0x8c,0x67,0x41,0xe7,0xf5,0xa4); interface IAppxManifestPackageDependenciesEnumerator : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetCurrent( - /* [retval][out] */ IAppxManifestPackageDependency **dependency) = 0; + /* [retval][out] */ IAppxManifestPackageDependency **dependency) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetHasCurrent( - /* [retval][out] */ BOOL *hasCurrent) = 0; + /* [retval][out] */ BOOL *hasCurrent) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE MoveNext( - /* [retval][out] */ BOOL *hasNext) = 0; - + /* [retval][out] */ BOOL *hasNext) noexcept = 0; }; #endif /* __IAppxManifestPackageDependenciesEnumerator_INTERFACE_DEFINED__ */ #ifndef __IAppxManifestResourcesEnumerator_INTERFACE_DEFINED__ #define __IAppxManifestResourcesEnumerator_INTERFACE_DEFINED__ -/* interface IAppxManifestResourcesEnumerator */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxManifestResourcesEnumerator; - // {de4dfbbd-881a-48bb-858c-d6f2baeae6ed} + MSIX_INTERFACE(IAppxManifestResourcesEnumerator,0xde4dfbbd,0x881a,0x48bb,0x85,0x8c,0xd6,0xf2,0xba,0xea,0xe6,0xed); interface IAppxManifestResourcesEnumerator : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetCurrent( - /* [retval][string][out] */ LPWSTR *resource) = 0; + /* [retval][string][out] */ LPWSTR *resource) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetHasCurrent( - /* [retval][out] */ BOOL *hasCurrent) = 0; + /* [retval][out] */ BOOL *hasCurrent) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE MoveNext( - /* [retval][out] */ BOOL *hasNext) = 0; - + /* [retval][out] */ BOOL *hasNext) noexcept = 0; }; #endif /* __IAppxManifestResourcesEnumerator_INTERFACE_DEFINED__ */ #ifndef __IAppxManifestDeviceCapabilitiesEnumerator_INTERFACE_DEFINED__ #define __IAppxManifestDeviceCapabilitiesEnumerator_INTERFACE_DEFINED__ -/* interface IAppxManifestDeviceCapabilitiesEnumerator */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxManifestDeviceCapabilitiesEnumerator; - // {30204541-427b-4a1c-bacf-655bf463a540} + MSIX_INTERFACE(IAppxManifestDeviceCapabilitiesEnumerator,0x30204541,0x427b,0x4a1c,0xba,0xcf,0x65,0x5b,0xf4,0x63,0xa5,0x40); interface IAppxManifestDeviceCapabilitiesEnumerator : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetCurrent( - /* [retval][string][out] */ LPWSTR *deviceCapability) = 0; + /* [retval][string][out] */ LPWSTR *deviceCapability) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetHasCurrent( - /* [retval][out] */ BOOL *hasCurrent) = 0; + /* [retval][out] */ BOOL *hasCurrent) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE MoveNext( - /* [retval][out] */ BOOL *hasNext) = 0; + /* [retval][out] */ BOOL *hasNext) noexcept = 0; }; #endif /* __IAppxManifestDeviceCapabilitiesEnumerator_INTERFACE_DEFINED__ */ @@ -822,22 +798,19 @@ EXTERN_C const IID IID_IAppxManifestDeviceCapabilitiesEnumerator; #ifndef __IAppxManifestCapabilitiesEnumerator_INTERFACE_DEFINED__ #define __IAppxManifestCapabilitiesEnumerator_INTERFACE_DEFINED__ -/* interface IAppxManifestCapabilitiesEnumerator */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxManifestCapabilitiesEnumerator; - // {11d22258-f470-42c1-b291-8361c5437e41} + MSIX_INTERFACE(IAppxManifestCapabilitiesEnumerator,0x11D22258,0xF470,0x42C1,0xB2,0x91,0x83,0x61,0xC5,0x43,0x7E,0x41); interface IAppxManifestCapabilitiesEnumerator : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetCurrent( - /* [retval][string][out] */ LPWSTR *capability) = 0; + /* [retval][string][out] */ LPWSTR *capability) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetHasCurrent( - /* [retval][out] */ BOOL *hasCurrent) = 0; + /* [retval][out] */ BOOL *hasCurrent) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE MoveNext( - /* [retval][out] */ BOOL *hasNext) = 0; + /* [retval][out] */ BOOL *hasNext) noexcept = 0; }; #endif /* __IAppxManifestCapabilitiesEnumerator_INTERFACE_DEFINED__ */ @@ -845,22 +818,19 @@ EXTERN_C const IID IID_IAppxManifestCapabilitiesEnumerator; #ifndef __IAppxManifestApplicationsEnumerator_INTERFACE_DEFINED__ #define __IAppxManifestApplicationsEnumerator_INTERFACE_DEFINED__ -/* interface IAppxManifestApplicationsEnumerator */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxManifestApplicationsEnumerator; - // {9eb8a55a-f04b-4d0d-808d-686185d4847a} + MSIX_INTERFACE(IAppxManifestApplicationsEnumerator,0x9eb8a55a,0xf04b,0x4d0d,0x80,0x8d,0x68,0x61,0x85,0xd4,0x84,0x7a); interface IAppxManifestApplicationsEnumerator : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetCurrent( - /* [retval][out] */ IAppxManifestApplication **application) = 0; + /* [retval][out] */ IAppxManifestApplication **application) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetHasCurrent( - /* [retval][out] */ BOOL *hasCurrent) = 0; + /* [retval][out] */ BOOL *hasCurrent) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE MoveNext( - /* [retval][out] */ BOOL *hasNext) = 0; + /* [retval][out] */ BOOL *hasNext) noexcept = 0; }; #endif /* __IAppxManifestApplicationsEnumerator_INTERFACE_DEFINED__ */ @@ -868,66 +838,55 @@ EXTERN_C const IID IID_IAppxManifestApplicationsEnumerator; #ifndef __IAppxManifestApplication_INTERFACE_DEFINED__ #define __IAppxManifestApplication_INTERFACE_DEFINED__ -/* interface IAppxManifestApplication */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxManifestApplication; - // {5da89bf4-3773-46be-b650-7e744863b7e8} + MSIX_INTERFACE(IAppxManifestApplication,0x5da89bf4,0x3773,0x46be,0xb6,0x50,0x7e,0x74,0x48,0x63,0xb7,0xe8); interface IAppxManifestApplication : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetStringValue( /* [string][in] */ LPCWSTR name, - /* [retval][string][out] */ LPWSTR *value) = 0; + /* [retval][string][out] */ LPWSTR *value) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetAppUserModelId( - /* [retval][string][out] */ LPWSTR *appUserModelId) = 0; - + /* [retval][string][out] */ LPWSTR *appUserModelId) noexcept = 0; }; #endif /* __IAppxManifestApplication_INTERFACE_DEFINED__ */ #ifndef __IAppxManifestQualifiedResourcesEnumerator_INTERFACE_DEFINED__ #define __IAppxManifestQualifiedResourcesEnumerator_INTERFACE_DEFINED__ -/* interface IAppxManifestQualifiedResourcesEnumerator */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxManifestQualifiedResourcesEnumerator; - // {8ef6adfe-3762-4a8f-9373-2fc5d444c8d2} + MSIX_INTERFACE(IAppxManifestQualifiedResourcesEnumerator,0x8ef6adfe,0x3762,0x4a8f,0x93,0x73,0x2f,0xc5,0xd4,0x44,0xc8,0xd2); interface IAppxManifestQualifiedResourcesEnumerator : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetCurrent( - /* [retval][out] */ IAppxManifestQualifiedResource **resource) = 0; + /* [retval][out] */ IAppxManifestQualifiedResource **resource) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetHasCurrent( - /* [retval][out] */ BOOL *hasCurrent) = 0; + /* [retval][out] */ BOOL *hasCurrent) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE MoveNext( - /* [retval][out] */ BOOL *hasNext) = 0; - + /* [retval][out] */ BOOL *hasNext) noexcept = 0; }; #endif /* __IAppxManifestQualifiedResourcesEnumerator_INTERFACE_DEFINED__ */ #ifndef __IAppxManifestQualifiedResource_INTERFACE_DEFINED__ #define __IAppxManifestQualifiedResource_INTERFACE_DEFINED__ -/* interface IAppxManifestQualifiedResource */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxManifestQualifiedResource; - // {3b53a497-3c5c-48d1-9ea3-bb7eac8cd7d4} + MSIX_INTERFACE(IAppxManifestQualifiedResource,0x3b53a497,0x3c5c,0x48d1,0x9e,0xa3,0xbb,0x7e,0xac,0x8c,0xd7,0xd4); interface IAppxManifestQualifiedResource : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetLanguage( - /* [retval][string][out] */ LPWSTR *language) = 0; + /* [retval][string][out] */ LPWSTR *language) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetScale( - /* [retval][out] */ UINT32 *scale) = 0; + /* [retval][out] */ UINT32 *scale) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetDXFeatureLevel( - /* [retval][out] */ DX_FEATURE_LEVEL *dxFeatureLevel) = 0; + /* [retval][out] */ DX_FEATURE_LEVEL *dxFeatureLevel) noexcept = 0; }; #endif /* __IAppxManifestQualifiedResource_INTERFACE_DEFINED__ */ @@ -935,26 +894,23 @@ EXTERN_C const IID IID_IAppxManifestQualifiedResource; #ifndef __IAppxBundleFactory_INTERFACE_DEFINED__ #define __IAppxBundleFactory_INTERFACE_DEFINED__ -/* interface IAppxBundleFactory */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxBundleFactory; - // {bba65864-965f-4a5f-855f-f074bdbf3a7b} + MSIX_INTERFACE(IAppxBundleFactory,0xbba65864,0x965f,0x4a5f,0x85,0x5f,0xf0,0x74,0xbd,0xbf,0x3a,0x7b); interface IAppxBundleFactory : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE CreateBundleWriter( /* [in] */ IStream *outputStream, /* [in] */ UINT64 bundleVersion, - /* [retval][out] */ IAppxBundleWriter **bundleWriter) = 0; + /* [retval][out] */ IAppxBundleWriter **bundleWriter) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE CreateBundleReader( /* [in] */ IStream *inputStream, - /* [retval][out] */ IAppxBundleReader **bundleReader) = 0; + /* [retval][out] */ IAppxBundleReader **bundleReader) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE CreateBundleManifestReader( /* [in] */ IStream *inputStream, - /* [retval][out] */ IAppxBundleManifestReader **manifestReader) = 0; + /* [retval][out] */ IAppxBundleManifestReader **manifestReader) noexcept = 0; }; #endif /* __IAppxBundleFactory_INTERFACE_DEFINED__ */ @@ -962,151 +918,129 @@ EXTERN_C const IID IID_IAppxBundleFactory; #ifndef __IAppxBundleWriter_INTERFACE_DEFINED__ #define __IAppxBundleWriter_INTERFACE_DEFINED__ -/* interface IAppxBundleWriter */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxBundleWriter; - // {ec446fe8-bfec-4c64-ab4f-49f038f0c6d2} + MSIX_INTERFACE(IAppxBundleWriter,0xec446fe8,0xbfec,0x4c64,0xab,0x4f,0x49,0xf0,0x38,0xf0,0xc6,0xd2); interface IAppxBundleWriter : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE AddPayloadPackage( /* [string][in] */ LPCWSTR fileName, - /* [in] */ IStream *packageStream) = 0; + /* [in] */ IStream *packageStream) noexcept = 0; - virtual HRESULT STDMETHODCALLTYPE Close( void) = 0; + virtual HRESULT STDMETHODCALLTYPE Close(void) noexcept = 0; }; #endif /* __IAppxBundleWriter_INTERFACE_DEFINED__ */ + #ifndef __IAppxBundleReader_INTERFACE_DEFINED__ #define __IAppxBundleReader_INTERFACE_DEFINED__ -/* interface IAppxBundleReader */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxBundleReader; - // {dd75b8c0-ba76-43b0-ae0f-68656a1dc5c8} + MSIX_INTERFACE(IAppxBundleReader,0xdd75b8c0,0xba76,0x43b0,0xae,0x0f,0x68,0x65,0x6a,0x1d,0xc5,0xc8); interface IAppxBundleReader : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetFootprintFile( /* [in] */ APPX_BUNDLE_FOOTPRINT_FILE_TYPE fileType, - /* [retval][out] */ IAppxFile **footprintFile) = 0; + /* [retval][out] */ IAppxFile **footprintFile) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetBlockMap( - /* [retval][out] */ IAppxBlockMapReader **blockMapReader) = 0; + /* [retval][out] */ IAppxBlockMapReader **blockMapReader) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetManifest( - /* [retval][out] */ IAppxBundleManifestReader **manifestReader) = 0; + /* [retval][out] */ IAppxBundleManifestReader **manifestReader) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetPayloadPackages( - /* [retval][out] */ IAppxFilesEnumerator **payloadPackages) = 0; + /* [retval][out] */ IAppxFilesEnumerator **payloadPackages) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetPayloadPackage( /* [string][in] */ LPCWSTR fileName, - /* [retval][out] */ IAppxFile **payloadPackage) = 0; - + /* [retval][out] */ IAppxFile **payloadPackage) noexcept = 0; }; #endif /* __IAppxBundleReader_INTERFACE_DEFINED__ */ #ifndef __IAppxBundleManifestReader_INTERFACE_DEFINED__ #define __IAppxBundleManifestReader_INTERFACE_DEFINED__ -/* interface IAppxBundleManifestReader */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxBundleManifestReader; - // {cf0ebbc1-cc99-4106-91eb-e67462e04fb0} + MSIX_INTERFACE(IAppxBundleManifestReader,0xcf0ebbc1,0xcc99,0x4106,0x91,0xeb,0xe6,0x74,0x62,0xe0,0x4f,0xb0); interface IAppxBundleManifestReader : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetPackageId( - /* [retval][out] */ IAppxManifestPackageId **packageId) = 0; + /* [retval][out] */ IAppxManifestPackageId **packageId) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetPackageInfoItems( - /* [retval][out] */ IAppxBundleManifestPackageInfoEnumerator **packageInfoItems) = 0; + /* [retval][out] */ IAppxBundleManifestPackageInfoEnumerator **packageInfoItems) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetStream( - /* [retval][out] */ IStream **manifestStream) = 0; - + /* [retval][out] */ IStream **manifestStream) noexcept = 0; }; #endif /* __IAppxBundleManifestReader_INTERFACE_DEFINED__ */ #ifndef __IAppxManifestPackageDependency_INTERFACE_DEFINED__ #define __IAppxManifestPackageDependency_INTERFACE_DEFINED__ -/* interface IAppxManifestPackageDependency */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxManifestPackageDependency; - // {e4946b59-733e-43f0-a724-3bde4c1285a0} + MSIX_INTERFACE(IAppxManifestPackageDependency,0xe4946b59,0x733e,0x43f0,0xa7,0x24,0x3b,0xde,0x4c,0x12,0x85,0xa0); interface IAppxManifestPackageDependency : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetName( - /* [retval][string][out] */ LPWSTR *name) = 0; + /* [retval][string][out] */ LPWSTR *name) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetPublisher( - /* [retval][string][out] */ LPWSTR *publisher) = 0; + /* [retval][string][out] */ LPWSTR *publisher) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetMinVersion( - /* [retval][out] */ UINT64 *minVersion) = 0; - + /* [retval][out] */ UINT64 *minVersion) noexcept = 0; }; #endif /* __IAppxManifestPackageDependency_INTERFACE_DEFINED__ */ #ifndef __IAppxBundleManifestPackageInfoEnumerator_INTERFACE_DEFINED__ #define __IAppxBundleManifestPackageInfoEnumerator_INTERFACE_DEFINED__ -/* interface IAppxBundleManifestPackageInfoEnumerator */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxBundleManifestPackageInfoEnumerator; - // {f9b856ee-49a6-4e19-b2b0-6a2406d63a32} + MSIX_INTERFACE(IAppxBundleManifestPackageInfoEnumerator,0xf9b856ee,0x49a6,0x4e19,0xb2,0xb0,0x6a,0x24,0x06,0xd6,0x3a,0x32); interface IAppxBundleManifestPackageInfoEnumerator : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetCurrent( - /* [retval][out] */ IAppxBundleManifestPackageInfo **packageInfo) = 0; + /* [retval][out] */ IAppxBundleManifestPackageInfo **packageInfo) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetHasCurrent( - /* [retval][out] */ BOOL *hasCurrent) = 0; + /* [retval][out] */ BOOL *hasCurrent) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE MoveNext( - /* [retval][out] */ BOOL *hasNext) = 0; - + /* [retval][out] */ BOOL *hasNext) noexcept = 0; }; #endif /* __IAppxBundleManifestPackageInfoEnumerator_INTERFACE_DEFINED__ */ #ifndef __IAppxBundleManifestPackageInfo_INTERFACE_DEFINED__ #define __IAppxBundleManifestPackageInfo_INTERFACE_DEFINED__ -/* interface IAppxBundleManifestPackageInfo */ -/* [ref][uuid][object] */ -EXTERN_C const IID IID_IAppxBundleManifestPackageInfo; - // {54cd06c1-268f-40bb-8ed2-757a9ebaec8d} + MSIX_INTERFACE(IAppxBundleManifestPackageInfo,0x54cd06c1,0x268f,0x40bb,0x8e,0xd2,0x75,0x7a,0x9e,0xba,0xec,0x8d); interface IAppxBundleManifestPackageInfo : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetPackageType( - /* [retval][out] */ APPX_BUNDLE_PAYLOAD_PACKAGE_TYPE *packageType) = 0; + /* [retval][out] */ APPX_BUNDLE_PAYLOAD_PACKAGE_TYPE *packageType) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetPackageId( - /* [retval][out] */ IAppxManifestPackageId **packageId) = 0; + /* [retval][out] */ IAppxManifestPackageId **packageId) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetFileName( - /* [retval][string][out] */ LPWSTR *fileName) = 0; + /* [retval][string][out] */ LPWSTR *fileName) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetOffset( - /* [retval][out] */ UINT64 *offset) = 0; + /* [retval][out] */ UINT64 *offset) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetSize( - /* [retval][out] */ UINT64 *size) = 0; + /* [retval][out] */ UINT64 *size) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetResources( - /* [retval][out] */ IAppxManifestQualifiedResourcesEnumerator **resources) = 0; - + /* [retval][out] */ IAppxManifestQualifiedResourcesEnumerator **resources) noexcept = 0; }; #endif /* __IAppxBundleManifestPackageInfo_INTERFACE_DEFINED__ */ @@ -1126,55 +1060,71 @@ interface IMsixApplicabilityLanguagesEnumerator; #ifndef __IMsixDocumentElement_INTERFACE_DEFINED__ #define __IMsixDocumentElement_INTERFACE_DEFINED__ -EXTERN_C DECLSPEC_SELECTANY const IID IID_IMsixDocumentElement; - - // {E8900E0E-1DFD-4728-8352-AADAEBBF0065} + // {e8900e0e-1dfd-4728-8352-aadaebbf0065} + MSIX_INTERFACE(IMsixDocumentElement,0xe8900e0e,0x1dfd,0x4728,0x83,0x52,0xaa,0xda,0xeb,0xbf,0x00,0x65); interface IMsixDocumentElement : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetDocumentElement(IMsixElement** documentElement) = 0; + virtual HRESULT STDMETHODCALLTYPE GetDocumentElement( + /* [retval][out] */ IMsixElement** documentElement) noexcept = 0; }; - #endif /* __IMsixDocumentElement_INTERFACE_DEFINED__ */ #ifndef __IMsixElement_INTERFACE_DEFINED__ #define __IMsixElement_INTERFACE_DEFINED__ -EXTERN_C DECLSPEC_SELECTANY const IID IID_IMsixElement; - - // {5B6786FF-6145-4F0E-B8C9-8E03AACB60D0} + // {5b6786ff-6145-4f0e-b8c9-8e03aacb60d0} + MSIX_INTERFACE(IMsixElement,0x5b6786ff,0x6145,0x4f0e,0xb8,0xc9,0x8e,0x03,0xaa,0xcb,0x60,0xd0); interface IMsixElement : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetAttributeValue(LPCWSTR name, LPWSTR* value) = 0; - virtual HRESULT STDMETHODCALLTYPE GetText(LPWSTR* value) = 0; - virtual HRESULT STDMETHODCALLTYPE GetElements(LPCWSTR name, IMsixElementEnumerator** elements) = 0; - }; + virtual HRESULT STDMETHODCALLTYPE GetAttributeValue( + /* [in] */ LPCWSTR name, + /* [retval][string][out] */ LPWSTR* value) noexcept = 0; + + virtual HRESULT STDMETHODCALLTYPE GetText( + /* [retval][string][out] */ LPWSTR* value) noexcept = 0; + + virtual HRESULT STDMETHODCALLTYPE GetElements( + /* [in] */ LPCWSTR name, + /* [retval][out] */ IMsixElementEnumerator** elements) noexcept = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAttributeValueUtf8( + /* [in] */ LPCSTR name, + /* [retval][string][out] */ LPSTR* value) noexcept = 0; + virtual HRESULT STDMETHODCALLTYPE GetTextUtf8( + /* [retval][string][out] */ LPSTR* value) noexcept = 0; + + virtual HRESULT STDMETHODCALLTYPE GetElementsUtf8( + /* [in] */ LPCSTR name, + /* [retval][out] */ IMsixElementEnumerator** elements) noexcept= 0; + }; #endif /* __IMsixElement_INTERFACE_DEFINED__ */ #ifndef __IMsixElementEnumerator_INTERFACE_DEFINED__ #define __IMsixElementEnumerator_INTERFACE_DEFINED__ -EXTERN_C DECLSPEC_SELECTANY const IID IID_IMsixElementEnumerator; - - // {7E7EA105-A4F9-4C12-9EFA-98EF1895418A} + // {7e7ea105-a4f9-4c12-9efa-98ef1895418a} + MSIX_INTERFACE(IMsixElementEnumerator,0x7e7ea105,0xa4f9,0x4c12,0x9e,0xfa,0x98,0xef,0x18,0x95,0x41,0x8a); interface IMsixElementEnumerator : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetCurrent(IMsixElement** element) = 0; - virtual HRESULT STDMETHODCALLTYPE GetHasCurrent(BOOL* hasCurrent) = 0; - virtual HRESULT STDMETHODCALLTYPE MoveNext(BOOL* hasNext) = 0; - }; + virtual HRESULT STDMETHODCALLTYPE GetCurrent( + /* [retval][out] */ IMsixElement** element) noexcept = 0; + virtual HRESULT STDMETHODCALLTYPE GetHasCurrent( + /* [retval][out] */ BOOL* hasCurrent) noexcept = 0; + + virtual HRESULT STDMETHODCALLTYPE MoveNext( + /* [retval][out] */ BOOL* hasNext) noexcept = 0; + }; #endif /* __IMsixElementEnumerator_INTERFACE_DEFINED__ */ #ifndef __IMsixFactoryOverrides_INTERFACE_DEFINED__ #define __IMsixFactoryOverrides_INTERFACE_DEFINED__ -EXTERN_C DECLSPEC_SELECTANY const IID IID_IMsixFactoryOverrides; - - typedef /* [v1_enum] */ + typedef enum MSIX_FACTORY_EXTENSION { MSIX_FACTORY_EXTENSION_STREAM_FACTORY = 0x1, @@ -1182,49 +1132,291 @@ EXTERN_C DECLSPEC_SELECTANY const IID IID_IMsixFactoryOverrides; } MSIX_FACTORY_EXTENSION; // {0acedbdb-57cd-4aca-8cee-33fa52394316} + MSIX_INTERFACE(IMsixFactoryOverrides,0x0acedbdb,0x57cd,0x4aca,0x8c,0xee,0x33,0xfa,0x52,0x39,0x43,0x16); interface IMsixFactoryOverrides : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE SpecifyExtension(MSIX_FACTORY_EXTENSION name, IUnknown* extension) = 0; - virtual HRESULT STDMETHODCALLTYPE GetCurrentSpecifiedExtension(MSIX_FACTORY_EXTENSION name, IUnknown** extension) = 0; - }; + virtual HRESULT STDMETHODCALLTYPE SpecifyExtension( + /* [in] */ MSIX_FACTORY_EXTENSION name, + /* [retval][out] */ IUnknown* extension) noexcept = 0; + virtual HRESULT STDMETHODCALLTYPE GetCurrentSpecifiedExtension( + /* [in] */ MSIX_FACTORY_EXTENSION name, + /* [retval][out] */ IUnknown** extension) noexcept = 0; + }; #endif /* __IMsixFactoryOverrides_INTERFACE_DEFINED__ */ #ifndef __IMsixStreamFactory_INTERFACE_DEFINED__ #define __IMsixStreamFactory_INTERFACE_DEFINED__ -EXTERN_C DECLSPEC_SELECTANY const IID IID_IMsixStreamFactory; - // {c74f4821-3b82-4ad5-98ea-3d52681aff56} + MSIX_INTERFACE(IMsixStreamFactory,0xc74f4821,0x3b82,0x4ad5,0x98,0xea,0x3d,0x52,0x68,0x1a,0xff,0x56); interface IMsixStreamFactory : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE CreateStreamOnRelativePath(LPCWSTR relativePath, IStream** stream) = 0; - }; + virtual HRESULT STDMETHODCALLTYPE CreateStreamOnRelativePath( + /* [in] */ LPCWSTR relativePath, + /* [retval][out] */ IStream** stream) noexcept = 0; + virtual HRESULT STDMETHODCALLTYPE CreateStreamOnRelativePathUtf8( + /* [in] */ LPCSTR relativePath, + /* [retval][out] */ IStream** stream) noexcept = 0; + }; #endif /* __IMsixStreamFactory_INTERFACE_DEFINED__ */ #ifndef __IMsixApplicabilityLanguagesEnumerator_INTERFACE_DEFINED__ #define __IMsixApplicabilityLanguagesEnumerator_INTERFACE_DEFINED__ -EXTERN_C DECLSPEC_SELECTANY const IID IID_IMsixApplicabilityLanguagesEnumerator; - - // {BFC4655A-BE7A-456A-BC4E-2AF9481E8432} + // {bfc4655a-be7a-456a-bc4e-2af9481e8432} + MSIX_INTERFACE(IMsixApplicabilityLanguagesEnumerator,0xbfc4655a,0xbe7a,0x456a,0xbc,0x4e,0x2a,0xf9,0x48,0x1e,0x84,0x32); interface IMsixApplicabilityLanguagesEnumerator : public IUnknown { virtual HRESULT STDMETHODCALLTYPE GetCurrent( - /* [retval][string][out] */ LPCSTR *bcp47Language) = 0; + /* [retval][string][out] */ LPCSTR *bcp47Language) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE GetHasCurrent( - /* [retval][out] */ BOOL *hasCurrent) = 0; + /* [retval][out] */ BOOL *hasCurrent) noexcept = 0; virtual HRESULT STDMETHODCALLTYPE MoveNext( - /* [retval][out] */ BOOL *hasNext) = 0; + /* [retval][out] */ BOOL *hasNext) noexcept = 0; }; - #endif /* __IMsixApplicabilityLanguagesEnumerator_INTERFACE_DEFINED__ */ +// Specific to MSIX SDK. UTF8 variant of AppxPackaging interfaces +interface IAppxBlockMapFileUtf8; +interface IAppxBlockMapReaderUtf8; +interface IAppxBundleManifestPackageInfoUtf8; +interface IAppxBundleReaderUtf8; +interface IAppxFactoryUtf8; +interface IAppxFileUtf8; +interface IAppxManifestApplicationUtf8; +interface IAppxManifestPackageDependencyUtf8; +interface IAppxManifestPackageIdUtf8; +interface IAppxManifestPropertiesUtf8; +interface IAppxManifestQualifiedResourceUtf8; +interface IAppxManifestResourcesEnumeratorUtf8; +interface IAppxManifestTargetDeviceFamilyUtf8; +interface IAppxPackageReaderUtf8; + +#ifndef __IAppxBlockMapFileUtf8_INTERFACE_DEFINED__ +#define __IAppxBlockMapFileUtf8_INTERFACE_DEFINED__ + + // {52023973-05fd-46ca-8ac5-bb0aa431fed6} + MSIX_INTERFACE(IAppxBlockMapFileUtf8,0x52023973,0x05fd,0x46ca,0x8a,0xc5,0xbb,0x0a,0xa4,0x31,0xfe,0xd6); + interface IAppxBlockMapFileUtf8 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetName( + /* [retval][string][out] */ LPSTR *name) noexcept = 0; + }; +#endif /* __IAppxBlockMapFileUtf8_INTERFACE_DEFINED__ */ + +#ifndef __IAppxBlockMapReaderUtf8_INTERFACE_DEFINED__ +#define __IAppxBlockMapReaderUtf8_INTERFACE_DEFINED__ + + // {1a02d8b4-477a-487e-9815-317cc09acc22} + MSIX_INTERFACE(IAppxBlockMapReaderUtf8,0x1a02d8b4,0x477a,0x487e,0x98,0x15,0x31,0x7c,0xc0,0x9a,0xcc,0x22); + interface IAppxBlockMapReaderUtf8 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetFile( + /* [string][in] */ LPCSTR filename, + /* [retval][out] */ IAppxBlockMapFile **file) noexcept = 0; + }; +#endif /* __IAppxBlockMapReaderUtf8_INTERFACE_DEFINED__ */ + +#ifndef __IAppxBundleManifestPackageInfoUtf8_INTERFACE_DEFINED__ +#define __IAppxBundleManifestPackageInfoUtf8_INTERFACE_DEFINED__ + + // {f1ae9284-f7ee-431c-9a85-03630ada285b} + MSIX_INTERFACE(IAppxBundleManifestPackageInfoUtf8,0xf1ae9284,0xf7ee,0x431c,0x9a,0x85,0x03,0x63,0x0a,0xda,0x28,0x5b); + interface IAppxBundleManifestPackageInfoUtf8 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetFileName( + /* [retval][string][out] */ LPSTR *fileName) noexcept = 0; + + }; +#endif /* __IAppxBundleManifestPackageInfoUtf8_INTERFACE_DEFINED__ */ + +#ifndef __IAppxBundleReaderUtf8_INTERFACE_DEFINED__ +#define __IAppxBundleReaderUtf8_INTERFACE_DEFINED__ + + // {90f4a4fc-f655-43b6-b033-35a8dfc92cbf} + MSIX_INTERFACE(IAppxBundleReaderUtf8, 0x90f4a4fc,0xf655,0x43b6,0xb0,0x33,0x35,0xa8,0xdf,0xc9,0x2c,0xbf) + interface IAppxBundleReaderUtf8 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetPayloadPackage( + /* [string][in] */ LPCSTR fileName, + /* [retval][out] */ IAppxFile **payloadPackage) noexcept = 0; + }; +#endif /* __IAppxBundleReaderUtf8_INTERFACE_DEFINED__ */ + +#ifndef __IAppxFactoryUtf8_INTERFACE_DEFINED__ +#define __IAppxFactoryUtf8_INTERFACE_DEFINED__ + + // {16c3c3f5-6d63-47af-8a68-dcc3aeb0cebb} + MSIX_INTERFACE(IAppxFactoryUtf8,0x16c3c3f5,0x6d63,0x47af,0x8a,0x68,0xdc,0xc3,0xae,0xb0,0xce,0xbb); + interface IAppxFactoryUtf8 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE CreateValidatedBlockMapReader( + /* [in] */ IStream *blockMapStream, + /* [in] */ LPCSTR signatureFileName, + /* [retval][out] */ IAppxBlockMapReader **blockMapReader) noexcept = 0; + }; +#endif /* __IAppxFactoryUtf8_INTERFACE_DEFINED__ */ + +#ifndef __IAppxFileUtf8_INTERFACE_DEFINED__ +#define __IAppxFileUtf8_INTERFACE_DEFINED__ + + // {73d14f3f-4c55-4b6d-9311-a02bb3538bb6} + MSIX_INTERFACE(IAppxFileUtf8,0x73d14f3f,0x4c55,0x4b6d,0x93,0x11,0xa0,0x2b,0xb3,0x53,0x8b,0xb6); + interface IAppxFileUtf8 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetContentType( + /* [retval][string][out] */ LPSTR *contentType) noexcept = 0; + + virtual HRESULT STDMETHODCALLTYPE GetName( + /* [retval][string][out] */ LPSTR *fileName) noexcept = 0; + }; +#endif /* __IAppxFileUtf8_INTERFACE_DEFINED__ */ + +#ifndef __IAppxManifestApplicationUtf8_INTERFACE_DEFINED__ +#define __IAppxManifestApplicationUtf8_INTERFACE_DEFINED__ + + // {3fb53200-bd86-4971-a8ad-2e18c3c02aae} + MSIX_INTERFACE(IAppxManifestApplicationUtf8,0x3fb53200,0xbd86,0x4971,0xa8,0xad,0x2e,0x18,0xc3,0xc0,0x2a,0xae); + interface IAppxManifestApplicationUtf8 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetStringValue( + /* [string][in] */ LPCSTR name, + /* [retval][string][out] */ LPSTR *value) noexcept = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAppUserModelId( + /* [retval][string][out] */ LPSTR *appUserModelId) noexcept = 0; + }; +#endif /* __IAppxManifestApplicationUtf8_INTERFACE_DEFINED__ */ + +#ifndef __IAppxManifestPackageDependencyUtf8_INTERFACE_DEFINED__ +#define __IAppxManifestPackageDependencyUtf8_INTERFACE_DEFINED__ + + // {7ff7ba87-d29e-447a-b2e6-31ddc88b94e9} + MSIX_INTERFACE(IAppxManifestPackageDependencyUtf8,0x7ff7ba87,0xd29e,0x447a,0xb2,0xe6,0x31,0xdd,0xc8,0x8b,0x94,0xe9); + interface IAppxManifestPackageDependencyUtf8 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetName( + /* [retval][string][out] */ LPSTR *name) noexcept = 0; + + virtual HRESULT STDMETHODCALLTYPE GetPublisher( + /* [retval][string][out] */ LPSTR *publisher) noexcept = 0; + }; +#endif /* __IAppxManifestPackageDependencyUtf8_INTERFACE_DEFINED__ */ + +#ifndef __IAppxManifestPackageIdUtf8_INTERFACE_DEFINED__ +#define __IAppxManifestPackageIdUtf8_INTERFACE_DEFINED__ + + // {a1f79b28-37f3-4b58-9100-7af898d11f65} + MSIX_INTERFACE(IAppxManifestPackageIdUtf8,0xa1f79b28,0x37f3,0x4b58,0x91,0x00,0x7a,0xf8,0x98,0xd1,0x1f,0x65); + interface IAppxManifestPackageIdUtf8 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetName( + /* [retval][string][out] */ LPSTR *name) noexcept = 0; + + virtual HRESULT STDMETHODCALLTYPE GetPublisher( + /* [retval][string][out] */ LPSTR *publisher) noexcept = 0; + + virtual HRESULT STDMETHODCALLTYPE GetResourceId( + /* [retval][string][out] */ LPSTR *resourceId) noexcept = 0; + + virtual HRESULT STDMETHODCALLTYPE ComparePublisher( + /* [string][in] */ LPCSTR other, + /* [retval][out] */ BOOL *isSame) noexcept = 0; + + virtual HRESULT STDMETHODCALLTYPE GetPackageFullName( + /* [retval][string][out] */ LPSTR *packageFullName) noexcept = 0; + + virtual HRESULT STDMETHODCALLTYPE GetPackageFamilyName( + /* [retval][string][out] */ LPSTR *packageFamilyName) noexcept = 0; + }; +#endif /* __IAppxManifestPackageIdUtf8_INTERFACE_DEFINED__ */ + +#ifndef __IAppxManifestPropertiesUtf8_INTERFACE_DEFINED__ +#define __IAppxManifestPropertiesUtf8_INTERFACE_DEFINED__ + + // {1c3fe108-9115-4623-be85-f0fec99ec516} + MSIX_INTERFACE(IAppxManifestPropertiesUtf8,0x1c3fe108,0x9115,0x4623,0xbe,0x85,0xf0,0xfe,0xc9,0x9e,0xc5,0x16); + interface IAppxManifestPropertiesUtf8 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetBoolValue( + /* [string][in] */ LPCSTR name, + /* [retval][out] */ BOOL *value) noexcept = 0; + + virtual HRESULT STDMETHODCALLTYPE GetStringValue( + /* [string][in] */ LPCSTR name, + /* [retval][string][out] */ LPSTR *value) noexcept = 0; + }; +#endif /* __IAppxManifestPropertiesUtf8_INTERFACE_DEFINED__ */ + +#ifndef __IAppxManifestQualifiedResourceUtf8_INTERFACE_DEFINED__ +#define __IAppxManifestQualifiedResourceUtf8_INTERFACE_DEFINED__ + + // {2fac530d-87e4-4dd5-99d3-290bb192363e} + MSIX_INTERFACE(IAppxManifestQualifiedResourceUtf8,0x2fac530d,0x87e4,0x4dd5,0x99,0xd3,0x29,0x0b,0xb1,0x92,0x36,0x3e); + interface IAppxManifestQualifiedResourceUtf8 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetLanguage( + /* [retval][string][out] */ LPSTR *language) noexcept = 0; + }; +#endif /* __IAppxManifestQualifiedResourceUtf8_INTERFACE_DEFINED__ */ + +#ifndef __IAppxManifestResourcesEnumeratorUtf8_INTERFACE_DEFINED__ +#define __IAppxManifestResourcesEnumeratorUtf8_INTERFACE_DEFINED__ + + // {194cfd4a-55db-4832-b1af-0d6805a4532a} + MSIX_INTERFACE(IAppxManifestResourcesEnumeratorUtf8,0x194cfd4a,0x55db,0x4832,0xb1,0xaf,0x0d,0x68,0x05,0xa4,0x53,0x2a); + interface IAppxManifestResourcesEnumeratorUtf8 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetCurrent( + /* [retval][string][out] */ LPSTR *resource) noexcept = 0; + }; +#endif /* __IAppxManifestResourcesEnumeratorUtf8_INTERFACE_DEFINED__ */ + +#ifndef __IAppxManifestTargetDeviceFamilyUtf8_INTERFACE_DEFINED__ +#define __IAppxManifestTargetDeviceFamilyUtf8_INTERFACE_DEFINED__ + + // {70adc4fb-33f5-4ed3-aaaf-e5ad74991669} + MSIX_INTERFACE(IAppxManifestTargetDeviceFamilyUtf8,0x70adc4fb,0x33f5,0x4ed3,0xaa,0xaf,0xe5,0xad,0x74,0x99,0x16,0x69); + interface IAppxManifestTargetDeviceFamilyUtf8 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetName( + /* [retval][string][out] */ LPSTR *name) noexcept = 0; + }; +#endif /* __IAppxManifestTargetDeviceFamilyUtf8_INTERFACE_DEFINED__ */ + +#ifndef __IAppxPackageReaderUtf8_INTERFACE_DEFINED__ +#define __IAppxPackageReaderUtf8_INTERFACE_DEFINED__ + + // {842ffe95-cf7a-4707-973a-0a2e9ffc3a85} + MSIX_INTERFACE(IAppxPackageReaderUtf8,0x842ffe95,0xcf7a,0x4707,0x97,0x3a,0x0a,0x2e,0x9f,0xfc,0x3a,0x85); + interface IAppxPackageReaderUtf8 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetPayloadFile( + /* [string][in] */ LPCSTR fileName, + /* [retval][out] */ IAppxFile **file) noexcept = 0; + }; +#endif /* __IAppxPackageReaderUtf8_INTERFACE_DEFINED__ */ + extern "C++" { typedef /* [v1_enum] */ enum MSIX_VALIDATION_OPTION @@ -1304,7 +1496,7 @@ MSIX_API HRESULT STDMETHODCALLTYPE UnpackBundleFromStream( char* utf8Destination ) noexcept; -// A call to called CoCreateAppxFactory is required before start using the factory on non-windows platforms specifying +// A call to called CoCreateAppxFactory is required before start using the factory on non-windows platforms specifying // their allocator/de-allocator pair of preference. Failure to do this will result on E_UNEXPECTED. typedef LPVOID STDMETHODCALLTYPE COTASKMEMALLOC(SIZE_T cb); typedef void STDMETHODCALLTYPE COTASKMEMFREE(LPVOID pv); @@ -1345,68 +1537,6 @@ MSIX_API HRESULT STDMETHODCALLTYPE CreateStreamOnFileUTF16( bool forRead, IStream** stream) noexcept; -} // extern "C++" - -// Helper used for QueryInterface defines -#define SpecializeUuidOfImpl(Type) \ - template<> \ - struct UuidOfImpl \ - { \ - static constexpr const IID& iid = IID_##Type; \ - }; \ - -template -struct False -{ - static constexpr bool value = false; -}; - -template -struct UuidOfImpl -{ - static_assert(False::value, "Type doesn't have an IID"); -}; - -SpecializeUuidOfImpl(IUnknown); -SpecializeUuidOfImpl(ISequentialStream); -SpecializeUuidOfImpl(IStream); -SpecializeUuidOfImpl(IAppxFactory); -SpecializeUuidOfImpl(IAppxPackageReader); -SpecializeUuidOfImpl(IAppxPackageWriter); -SpecializeUuidOfImpl(IAppxFile); -SpecializeUuidOfImpl(IAppxFilesEnumerator); -SpecializeUuidOfImpl(IAppxBlockMapReader); -SpecializeUuidOfImpl(IAppxBlockMapFile); -SpecializeUuidOfImpl(IAppxBlockMapFilesEnumerator); -SpecializeUuidOfImpl(IAppxBlockMapBlock); -SpecializeUuidOfImpl(IAppxBlockMapBlocksEnumerator); -SpecializeUuidOfImpl(IAppxManifestReader); -SpecializeUuidOfImpl(IAppxManifestReader2); -SpecializeUuidOfImpl(IAppxManifestReader3); -SpecializeUuidOfImpl(IAppxManifestPackageId); -SpecializeUuidOfImpl(IAppxManifestProperties); -SpecializeUuidOfImpl(IAppxManifestTargetDeviceFamiliesEnumerator); -SpecializeUuidOfImpl(IAppxManifestTargetDeviceFamily); -SpecializeUuidOfImpl(IAppxManifestPackageDependenciesEnumerator); -SpecializeUuidOfImpl(IAppxManifestPackageDependency); -SpecializeUuidOfImpl(IAppxManifestResourcesEnumerator); -SpecializeUuidOfImpl(IAppxManifestDeviceCapabilitiesEnumerator); -SpecializeUuidOfImpl(IAppxManifestCapabilitiesEnumerator); -SpecializeUuidOfImpl(IAppxManifestApplicationsEnumerator); -SpecializeUuidOfImpl(IAppxManifestApplication); -SpecializeUuidOfImpl(IAppxManifestQualifiedResourcesEnumerator); -SpecializeUuidOfImpl(IAppxManifestQualifiedResource); -SpecializeUuidOfImpl(IAppxBundleFactory); -SpecializeUuidOfImpl(IAppxBundleWriter); -SpecializeUuidOfImpl(IAppxBundleReader); -SpecializeUuidOfImpl(IAppxBundleManifestReader); -SpecializeUuidOfImpl(IAppxBundleManifestPackageInfoEnumerator); -SpecializeUuidOfImpl(IAppxBundleManifestPackageInfo); -SpecializeUuidOfImpl(IMsixDocumentElement); -SpecializeUuidOfImpl(IMsixElement); -SpecializeUuidOfImpl(IMsixElementEnumerator); -SpecializeUuidOfImpl(IMsixFactoryOverrides); -SpecializeUuidOfImpl(IMsixStreamFactory); -SpecializeUuidOfImpl(IMsixApplicabilityLanguagesEnumerator); +} // extern "C++" #endif //__appxpackaging_hpp__ \ No newline at end of file diff --git a/src/inc/ComHelper.hpp b/src/inc/ComHelper.hpp index 381bb1bfd..48d3549ec 100644 --- a/src/inc/ComHelper.hpp +++ b/src/inc/ComHelper.hpp @@ -180,8 +180,8 @@ namespace MSIX { public: virtual ~ComClass() { } - virtual ULONG STDMETHODCALLTYPE AddRef() override { return ++m_ref; } - virtual ULONG STDMETHODCALLTYPE Release() override + virtual ULONG STDMETHODCALLTYPE AddRef() noexcept override { return ++m_ref; } + virtual ULONG STDMETHODCALLTYPE Release() noexcept override { if (--m_ref == 0) { delete this; @@ -190,7 +190,7 @@ namespace MSIX { return m_ref; } - virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject) override + virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject) noexcept override { if (ppvObject == nullptr || *ppvObject != nullptr) { diff --git a/src/inc/Enumerators.hpp b/src/inc/Enumerators.hpp index 242404ddd..e1b75898c 100644 --- a/src/inc/Enumerators.hpp +++ b/src/inc/Enumerators.hpp @@ -52,8 +52,8 @@ namespace MSIX { // Helper class for implementing any IAppx*Enumerator that has an string as an out parameter // for their GetCurrent method. - template - class EnumeratorString final : public MSIX::ComClass, EnumeratorInterface> + template + class EnumeratorString final : public MSIX::ComClass, EnumeratorInterface, EnumeratorInterfaceUtf8> { public: EnumeratorString(IMsixFactory* factory, std::vector& values) : @@ -82,6 +82,14 @@ namespace MSIX { return static_cast(Error::OK); } CATCH_RETURN(); + // IAppx*EnumeratorUtf8 + HRESULT STDMETHODCALLTYPE GetCurrent(LPSTR* value) noexcept override try + { + ThrowErrorIf(Error::InvalidParameter, (value == nullptr || *value != nullptr), "bad pointer"); + return m_factory->MarshalOutStringUtf8(m_values.at(m_cursor), value); + return static_cast(Error::OK); + } CATCH_RETURN(); + protected: IMsixFactory* m_factory; std::vector m_values; diff --git a/src/inc/IXml.hpp b/src/inc/IXml.hpp index 323bdebd9..0f4ae57b1 100644 --- a/src/inc/IXml.hpp +++ b/src/inc/IXml.hpp @@ -136,12 +136,8 @@ static const char* xPaths[] = { }; #endif -EXTERN_C const IID IID_IXmlElement; -EXTERN_C const IID IID_IXmlDom; -EXTERN_C const IID IID_IXmlFactory; - -#ifndef WIN32 // {ac94449e-442d-4bed-8fca-83770c0f7ee9} +#ifndef WIN32 interface IXmlElement : public IUnknown #else #include "Unknwn.h" @@ -155,6 +151,7 @@ class IXmlElement : public IUnknown virtual std::vector GetBase64DecodedAttributeValue(XmlAttributeName attribute) = 0; virtual std::string GetText() = 0; }; +MSIX_INTERFACE(IXmlElement, 0xac94449e,0x442d,0x4bed,0x8f,0xca,0x83,0x77,0x0c,0x0f,0x7e,0xe9); struct XmlVisitor { @@ -166,8 +163,8 @@ struct XmlVisitor XmlVisitor(void* c, lambda f) : context(c), Callback(f) {} }; -#ifndef WIN32 // {0e7a446e-baf7-44c1-b38a-216bfa18a1a8} +#ifndef WIN32 interface IXmlDom : public IUnknown #else class IXmlDom : public IUnknown @@ -182,9 +179,10 @@ class IXmlDom : public IUnknown XmlVisitor& visitor ) = 0; }; +MSIX_INTERFACE(IXmlDom, 0x0e7a446e,0xbaf7,0x44c1,0xb3,0x8a,0x21,0x6b,0xfa,0x18,0xa1,0xa8); -#ifndef WIN32 // {f82a60ec-fbfc-4cb9-bc04-1a0fe2b4d5be} +#ifndef WIN32 interface IXmlFactory : public IUnknown #else class IXmlFactory : public IUnknown @@ -194,10 +192,7 @@ class IXmlFactory : public IUnknown public: virtual MSIX::ComPtr CreateDomFromStream(XmlContentType footPrintType, const MSIX::ComPtr& stream) = 0; }; - -SpecializeUuidOfImpl(IXmlElement); -SpecializeUuidOfImpl(IXmlDom); -SpecializeUuidOfImpl(IXmlFactory); +MSIX_INTERFACE(IXmlFactory, 0xf82a60ec,0xfbfc,0x4cb9,0xbc,0x04,0x1a,0x0f,0xe2,0xb4,0xd5,0xbe); namespace MSIX { MSIX::ComPtr CreateXmlFactory(IMsixFactory* factory); diff --git a/src/inc/MSIXFactory.hpp b/src/inc/MSIXFactory.hpp index 1342beae0..a85d0374e 100644 --- a/src/inc/MSIXFactory.hpp +++ b/src/inc/MSIXFactory.hpp @@ -9,9 +9,8 @@ #include // internal interface -EXTERN_C const IID IID_IMsixFactory; -#ifndef WIN32 // {1f850db4-32b8-4db6-8bf4-5a897eb611f1} +#ifndef WIN32 interface IMsixFactory : public IUnknown #else #include "UnKnwn.h" @@ -25,6 +24,6 @@ class IMsixFactory : public IUnknown virtual MSIX_VALIDATION_OPTION GetValidationOptions() = 0; virtual MSIX::ComPtr GetResource(const std::string& resource) = 0; virtual HRESULT MarshalOutWstring(std::wstring& internal, LPWSTR* result) = 0; + virtual HRESULT MarshalOutStringUtf8(std::string& internal, LPSTR* result) = 0; }; - -SpecializeUuidOfImpl(IMsixFactory); \ No newline at end of file +MSIX_INTERFACE(IMsixFactory, 0x1f850db4,0x32b8,0x4db6,0x8b,0xf4,0x5a,0x89,0x7e,0xb6,0x11,0xf1); diff --git a/src/inc/MSIXWindows.hpp b/src/inc/MSIXWindows.hpp index 01d6d1d09..c88dbead3 100644 --- a/src/inc/MSIXWindows.hpp +++ b/src/inc/MSIXWindows.hpp @@ -1,7 +1,7 @@ // // Copyright (C) 2017 Microsoft. All rights reserved. // See LICENSE file in the project root for full license information. -// +// // This header defines the types used by Windows that are not defined in other platforms #ifndef __appxwindows_hpp__ #define __appxwindows_hpp__ @@ -46,7 +46,7 @@ #ifndef _WINDOWS_TYPES #define _WINDOWS_TYPES - + #ifndef _HRESULT_DEFINED #define _HRESULT_DEFINED typedef signed long HRESULT; @@ -271,14 +271,9 @@ #if !defined (_SYS_GUID_OPERATORS_) #define _SYS_GUID_OPERATORS_ - // Faster (but makes code fatter) inline version...use sparingly inline int IsEqualGUID(REFGUID rguid1, REFGUID rguid2) { - return ( - ((unsigned long *)&rguid1)[0] == ((unsigned long *)&rguid2)[0] && - ((unsigned long *)&rguid1)[1] == ((unsigned long *)&rguid2)[1] && - ((unsigned long *)&rguid1)[2] == ((unsigned long *)&rguid2)[2] && - ((unsigned long *)&rguid1)[3] == ((unsigned long *)&rguid2)[3]); + return !memcmp(&rguid1, &rguid2, sizeof(GUID)); } // Same type, different name @@ -298,6 +293,6 @@ } #endif // _SYS_GUID_OPERATOR_EQ_ #endif // _SYS_GUID_OPERATORS_ - #endif // #else of #ifdef WIN32 + #endif //__appxwindows_hpp__ diff --git a/src/inc/StorageObject.hpp b/src/inc/StorageObject.hpp index c8b5d880a..7d1cea7ab 100644 --- a/src/inc/StorageObject.hpp +++ b/src/inc/StorageObject.hpp @@ -32,9 +32,8 @@ inline constexpr FileNameOptions operator |(FileNameOptions a, FileNameOptions b } // internal interface -EXTERN_C const IID IID_IStorageObject; -#ifndef WIN32 // {ec25b96e-0db1-4483-bdb1-cab1109cb741} +#ifndef WIN32 interface IStorageObject : public IUnknown #else #include "Unknwn.h" @@ -59,5 +58,4 @@ class IStorageObject : public IUnknown // Returns the file name of the storage object. virtual std::string GetFileName() = 0; }; - -SpecializeUuidOfImpl(IStorageObject); \ No newline at end of file +MSIX_INTERFACE(IStorageObject, 0xec25b96e,0x0db1,0x4483,0xbd,0xb1,0xca,0xb1,0x10,0x9c,0xb7,0x41); diff --git a/src/inc/StreamBase.hpp b/src/inc/StreamBase.hpp index 2e8527590..4995d1eb3 100644 --- a/src/inc/StreamBase.hpp +++ b/src/inc/StreamBase.hpp @@ -15,9 +15,8 @@ #include "Exceptions.hpp" #include "ComHelper.hpp" -EXTERN_C const IID IID_IStreamInternal; -#ifndef WIN32 // {44d2a7a8-a165-4a6e-a56f-c7c24de7505c} +#ifndef WIN32 interface IStreamInternal : public IUnknown #else #include "Unknwn.h" @@ -30,8 +29,7 @@ class IStreamInternal : public IUnknown virtual bool IsCompressed() = 0; virtual std::string GetName() = 0; }; - -SpecializeUuidOfImpl(IStreamInternal); +MSIX_INTERFACE(IStreamInternal, 0x44d2a7a8,0xa165,0x4a6e,0xa5,0x6f,0xc7,0xc2,0x4d,0xe7,0x50,0x5c); namespace MSIX { class StreamBase : public MSIX::ComClass diff --git a/src/inc/VerifierObject.hpp b/src/inc/VerifierObject.hpp index a71ca97e0..1e8a32882 100644 --- a/src/inc/VerifierObject.hpp +++ b/src/inc/VerifierObject.hpp @@ -11,9 +11,8 @@ #include "ComHelper.hpp" // internal interface -EXTERN_C const IID IID_IVerifierObject; -#ifndef WIN32 // {cb0a105c-3a6c-4e48-9351-377c4dccd890} +#ifndef WIN32 interface IVerifierObject : public IUnknown #else #include "Unknwn.h" @@ -28,5 +27,4 @@ class IVerifierObject : public IUnknown virtual MSIX::ComPtr GetStream() = 0; virtual MSIX::ComPtr GetValidationStream(const std::string& part, const MSIX::ComPtr& stream) = 0; }; - -SpecializeUuidOfImpl(IVerifierObject); \ No newline at end of file +MSIX_INTERFACE(IVerifierObject, 0xcb0a105c,0x3a6c,0x4e48,0x93,0x51,0x37,0x7c,0x4d,0xcc,0xd8,0x90); diff --git a/src/msix/AppxBlockMapObject.cpp b/src/msix/AppxBlockMapObject.cpp index 7074ff4cb..aed480933 100644 --- a/src/msix/AppxBlockMapObject.cpp +++ b/src/msix/AppxBlockMapObject.cpp @@ -109,6 +109,7 @@ namespace MSIX { ThrowErrorIf(Error::XmlError, (0 == context.countFilesFound), "Empty AppxBlockMap.xml"); } + // IVerifierObject ComPtr AppxBlockMapObject::GetValidationStream(const std::string& part, const ComPtr& stream) { ThrowErrorIf(Error::InvalidParameter, (part.empty() || !stream), "bad input"); @@ -119,16 +120,10 @@ namespace MSIX { return ComPtr::Make(m_factory, part, stream, item->second); } + // IAppxBlockMapReader HRESULT STDMETHODCALLTYPE AppxBlockMapObject::GetFile(LPCWSTR filename, IAppxBlockMapFile **file) noexcept try { - ThrowErrorIf(Error::InvalidParameter, ( - filename == nullptr || *filename == '\0' || file == nullptr || *file != nullptr - ), "bad pointer"); - auto blockMapFile = m_blockMapFiles.find(wstring_to_utf8(filename)); - ThrowErrorIf(Error::InvalidParameter, (blockMapFile == m_blockMapFiles.end()), "File not found!"); - MSIX::ComPtr result = blockMapFile->second; - *file = result.Detach(); - return static_cast(Error::OK); + return GetFile(wstring_to_utf8(filename).c_str(), file); } CATCH_RETURN(); HRESULT STDMETHODCALLTYPE AppxBlockMapObject::GetFiles(IAppxBlockMapFilesEnumerator **enumerator) noexcept try @@ -186,4 +181,17 @@ namespace MSIX { ThrowErrorIf(Error::FileNotFound, (index == m_blockMapFiles.end()), "File not in blockmap"); return index->second; } + + // IAppxBlockMapReaderUtf8 + HRESULT STDMETHODCALLTYPE AppxBlockMapObject::GetFile(LPCSTR filename, IAppxBlockMapFile **file) noexcept try + { + ThrowErrorIf(Error::InvalidParameter, ( + filename == nullptr || *filename == '\0' || file == nullptr || *file != nullptr + ), "bad pointer"); + auto blockMapFile = m_blockMapFiles.find(filename); + ThrowErrorIf(Error::InvalidParameter, (blockMapFile == m_blockMapFiles.end()), "File not found!"); + MSIX::ComPtr result = blockMapFile->second; + *file = result.Detach(); + return static_cast(Error::OK); + } CATCH_RETURN(); } \ No newline at end of file diff --git a/src/msix/AppxBundleManifest.cpp b/src/msix/AppxBundleManifest.cpp index 7a213fc52..3b9a0358f 100644 --- a/src/msix/AppxBundleManifest.cpp +++ b/src/msix/AppxBundleManifest.cpp @@ -197,4 +197,11 @@ namespace MSIX { Make>(languages).Detach(); return static_cast(Error::OK); } CATCH_RETURN(); + + // IAppxBundleManifestPackageInfoUtf8 + HRESULT STDMETHODCALLTYPE AppxBundleManifestPackageInfo::GetFileName(LPSTR* fileName) noexcept try + { + return m_factory->MarshalOutStringUtf8(m_fileName, fileName); + } CATCH_RETURN(); + } diff --git a/src/msix/AppxFactory.cpp b/src/msix/AppxFactory.cpp index 2f2ea0e3d..472a6805b 100644 --- a/src/msix/AppxFactory.cpp +++ b/src/msix/AppxFactory.cpp @@ -63,22 +63,7 @@ namespace MSIX { LPCWSTR signatureFileName, IAppxBlockMapReader** blockMapReader) noexcept try { - ThrowErrorIf(Error::InvalidParameter, ( - inputStream == nullptr || - signatureFileName == nullptr || - *signatureFileName == '\0' || - blockMapReader == nullptr || - *blockMapReader != nullptr - ),"bad pointer."); - - ComPtr self; - ThrowHrIfFailed(QueryInterface(UuidOfImpl::iid, reinterpret_cast(&self))); - auto stream = ComPtr::Make(wstring_to_utf8(signatureFileName), FileStream::Mode::READ); - auto signature = ComPtr::Make(self.Get(), self->GetValidationOptions(), stream); - ComPtr input(inputStream); - auto validatedStream = signature->GetValidationStream("AppxBlockMap.xml", input); - *blockMapReader = ComPtr::Make(self.Get(), validatedStream).Detach(); - return static_cast(Error::OK); + return CreateValidatedBlockMapReader(inputStream, wstring_to_utf8(signatureFileName).c_str(), blockMapReader); } CATCH_RETURN(); // IAppxBundleFactory @@ -121,13 +106,31 @@ namespace MSIX { if (!internal.empty()) { auto intermediate = utf8_to_wstring(internal); + ThrowHrIfFailed(MarshalOutWstring(intermediate, result)); + } + return static_cast(Error::OK); + } CATCH_RETURN(); + + HRESULT AppxFactory::MarshalOutWstring(std::wstring& internal, LPWSTR* result) noexcept try + { + ThrowErrorIf(Error::InvalidParameter, (result == nullptr || *result != nullptr), "bad pointer" ); + *result = nullptr; + if (!internal.empty()) + { std::size_t countBytes = sizeof(wchar_t)*(internal.size()+1); - *result = reinterpret_cast(m_memalloc(countBytes)); - ThrowErrorIfNot(Error::OutOfMemory, (*result), "Allocation failed!"); - std::memset(reinterpret_cast(*result), 0, countBytes); - std::memcpy(reinterpret_cast(*result), - reinterpret_cast(const_cast(intermediate.c_str())), - countBytes - sizeof(wchar_t)); + MarshalOutStringHelper(countBytes, const_cast(internal.c_str()), result); + } + return static_cast(Error::OK); + } CATCH_RETURN(); + + HRESULT AppxFactory::MarshalOutStringUtf8(std::string& internal, LPSTR* result) noexcept try + { + ThrowErrorIf(Error::InvalidParameter, (result == nullptr || *result != nullptr), "bad pointer" ); + *result = nullptr; + if (!internal.empty()) + { + std::size_t countBytes = internal.size() + 1; + MarshalOutStringHelper(countBytes, const_cast(internal.c_str()), result); } return static_cast(Error::OK); } CATCH_RETURN(); @@ -160,23 +163,6 @@ namespace MSIX { return file; } - HRESULT AppxFactory::MarshalOutWstring(std::wstring& internal, LPWSTR *result) noexcept try - { - ThrowErrorIf(Error::InvalidParameter, (result == nullptr || *result != nullptr), "bad pointer" ); - *result = nullptr; - if (!internal.empty()) - { - std::size_t countBytes = sizeof(wchar_t)*(internal.size()+1); - *result = reinterpret_cast(m_memalloc(countBytes)); - ThrowErrorIfNot(Error::OutOfMemory, (*result), "Allocation failed!"); - std::memset(reinterpret_cast(*result), 0, countBytes); - std::memcpy(reinterpret_cast(*result), - reinterpret_cast(const_cast(internal.c_str())), - countBytes - sizeof(wchar_t)); - } - return static_cast(Error::OK); - } CATCH_RETURN(); - // IMsixFactoryOverrides HRESULT STDMETHODCALLTYPE AppxFactory::SpecifyExtension(MSIX_FACTORY_EXTENSION name, IUnknown* extension) noexcept try { @@ -224,4 +210,40 @@ namespace MSIX { return static_cast(Error::OK); } CATCH_RETURN(); + // IAppxFactoryUtf8 + HRESULT STDMETHODCALLTYPE AppxFactory::CreateValidatedBlockMapReader ( + IStream* inputStream, + LPCSTR signatureFileName, + IAppxBlockMapReader** blockMapReader) noexcept try + { + ThrowErrorIf(Error::InvalidParameter, ( + inputStream == nullptr || + signatureFileName == nullptr || + *signatureFileName == '\0' || + blockMapReader == nullptr || + *blockMapReader != nullptr + ),"bad pointer."); + + ComPtr self; + ThrowHrIfFailed(QueryInterface(UuidOfImpl::iid, reinterpret_cast(&self))); + auto stream = ComPtr::Make(signatureFileName, FileStream::Mode::READ); + auto signature = ComPtr::Make(self.Get(), self->GetValidationOptions(), stream); + ComPtr input(inputStream); + auto validatedStream = signature->GetValidationStream("AppxBlockMap.xml", input); + *blockMapReader = ComPtr::Make(self.Get(), validatedStream).Detach(); + return static_cast(Error::OK); + } CATCH_RETURN(); + + // Helper to marshal out strings + template + void AppxFactory::MarshalOutStringHelper(std::size_t size, T* from, T** to) + { + *to = reinterpret_cast(m_memalloc(size)); + ThrowErrorIfNot(Error::OutOfMemory, (*to), "Allocation failed!"); + std::memset(reinterpret_cast(*to), 0, size); + std::memcpy(reinterpret_cast(*to), + reinterpret_cast(from), + size - sizeof(T)); + } + } // namespace MSIX diff --git a/src/msix/AppxManifestObject.cpp b/src/msix/AppxManifestObject.cpp index f849932d9..deb0d00c6 100644 --- a/src/msix/AppxManifestObject.cpp +++ b/src/msix/AppxManifestObject.cpp @@ -293,7 +293,7 @@ namespace MSIX { return true; }); m_dom->ForEachElementIn(m_dom->GetDocument(), XmlQueryName::Package_Resources_Resource, visitorResource); - *resources = ComPtr::Make>(m_factory, appxResources).Detach(); + *resources = ComPtr::Make>(m_factory, appxResources).Detach(); return static_cast(Error::OK); } CATCH_RETURN(); diff --git a/src/msix/AppxPackageInfo.cpp b/src/msix/AppxPackageInfo.cpp index a2e196b46..477cb5978 100644 --- a/src/msix/AppxPackageInfo.cpp +++ b/src/msix/AppxPackageInfo.cpp @@ -55,6 +55,7 @@ namespace MSIX { } } + // IAppxManifestPackageId HRESULT STDMETHODCALLTYPE AppxManifestPackageId::GetName(LPWSTR* name) noexcept try { return m_factory->MarshalOutString(m_name, name); @@ -108,13 +109,7 @@ namespace MSIX { HRESULT STDMETHODCALLTYPE AppxManifestPackageId::ComparePublisher(LPCWSTR other, BOOL *isSame) noexcept try { - ThrowErrorIf(Error::InvalidParameter, (isSame == nullptr), "bad pointer" ); - *isSame = FALSE; - if (0 == m_publisher.compare(wstring_to_utf8(other))) - { - *isSame = TRUE; - } - return static_cast(Error::OK); + return ComparePublisher(wstring_to_utf8(other).c_str(), isSame); } CATCH_RETURN(); HRESULT STDMETHODCALLTYPE AppxManifestPackageId::GetPackageFullName(LPWSTR* packageFullName) noexcept try @@ -172,4 +167,43 @@ namespace MSIX { ThrowErrorIfNot(Error::Unexpected, SHA256::ComputeHash(buffer.data(), static_cast(buffer.size()), hash), "Failed computing publisherId"); return Encoding::Base32Encoding(hash); } + + // IAppxManifestPackageIdUtf8 + HRESULT STDMETHODCALLTYPE AppxManifestPackageId::GetName(LPSTR* name) noexcept try + { + return m_factory->MarshalOutStringUtf8(m_name, name); + } CATCH_RETURN(); + + HRESULT STDMETHODCALLTYPE AppxManifestPackageId::GetPublisher(LPSTR* publisher) noexcept try + { + return m_factory->MarshalOutStringUtf8(m_publisher, publisher); + } CATCH_RETURN(); + + HRESULT STDMETHODCALLTYPE AppxManifestPackageId::GetResourceId(LPSTR* resourceId) noexcept try + { + return m_factory->MarshalOutStringUtf8(m_resourceId, resourceId); + } CATCH_RETURN(); + + HRESULT STDMETHODCALLTYPE AppxManifestPackageId::ComparePublisher(LPCSTR other, BOOL *isSame) noexcept try + { + ThrowErrorIf(Error::InvalidParameter, (isSame == nullptr), "bad pointer" ); + *isSame = FALSE; + if (0 == m_publisher.compare(other)) + { + *isSame = TRUE; + } + return static_cast(Error::OK); + } CATCH_RETURN(); + + HRESULT STDMETHODCALLTYPE AppxManifestPackageId::GetPackageFullName(LPSTR* packageFullName) noexcept try + { + auto fullName = GetPackageFullName(); + return m_factory->MarshalOutStringUtf8(fullName, packageFullName); + } CATCH_RETURN(); + + HRESULT STDMETHODCALLTYPE AppxManifestPackageId::GetPackageFamilyName(LPSTR* packageFamilyName) noexcept try + { + auto familyName = GetPackageFamilyName(); + return m_factory->MarshalOutStringUtf8(familyName, packageFamilyName); + } CATCH_RETURN(); } diff --git a/src/msix/AppxPackageObject.cpp b/src/msix/AppxPackageObject.cpp index 42c6d17aa..d7edf6ebd 100644 --- a/src/msix/AppxPackageObject.cpp +++ b/src/msix/AppxPackageObject.cpp @@ -264,7 +264,7 @@ namespace MSIX { if(streamFactoryUnk.Get() != nullptr) { auto streamFactory = streamFactoryUnk.As(); - ThrowHrIfFailed(streamFactory->CreateStreamOnRelativePath(utf8_to_wstring(packageName).c_str(), &packageStream)); + ThrowHrIfFailed(streamFactory->CreateStreamOnRelativePathUtf8(packageName.c_str(), &packageStream)); } else { // User didn't specify a stream factory implementation. Assume packages are in the same location @@ -531,16 +531,7 @@ namespace MSIX { HRESULT STDMETHODCALLTYPE AppxPackageObject::GetPayloadFile(LPCWSTR fileName, IAppxFile** file) noexcept try { - if (m_isBundle) { return static_cast(Error::PackageIsBundle); } - ThrowErrorIf(Error::InvalidParameter, (fileName == nullptr || file == nullptr || *file != nullptr), "bad pointer"); - auto result = GetAppxFile(Encoding::EncodeFileName(wstring_to_utf8(fileName))); - ThrowErrorIfNot(Error::FileNotFound, result, "requested file not in package") - // Clients expect the stream's pointer to be at the start of the file! - ComPtr stream; - ThrowHrIfFailed(result->GetStream(&stream)); - ThrowHrIfFailed(stream->Seek({0}, StreamBase::Reference::START, nullptr)); - *file = result.Detach(); - return static_cast(Error::OK); + return GetPayloadFile(wstring_to_utf8(fileName).c_str(), file); } CATCH_RETURN(); HRESULT STDMETHODCALLTYPE AppxPackageObject::GetPayloadFiles(IAppxFilesEnumerator** filesEnumerator) noexcept try @@ -614,31 +605,51 @@ namespace MSIX { } CATCH_RETURN(); HRESULT STDMETHODCALLTYPE AppxPackageObject::GetPayloadPackage(LPCWSTR fileName, IAppxFile **payloadPackage) noexcept try + { + return GetPayloadPackage(wstring_to_utf8(fileName).c_str(), payloadPackage); + } CATCH_RETURN(); + + HRESULT STDMETHODCALLTYPE AppxPackageObject::GetManifest(IAppxBundleManifestReader **manifestReader) noexcept try { #ifdef BUNDLE_SUPPORT if (!m_isBundle) { return static_cast(Error::NotImplemented); } - ThrowErrorIf(Error::InvalidParameter, (fileName == nullptr || payloadPackage == nullptr || *payloadPackage != nullptr), "bad pointer"); - std::string name = wstring_to_utf8(fileName); - auto result = GetAppxFile(name); - ThrowErrorIfNot(Error::FileNotFound, result, "Requested package not in bundle") - // Clients expect the stream's pointer to be at the start of the file! - ComPtr stream; - ThrowHrIfFailed(result->GetStream(&stream)); - ThrowHrIfFailed(stream->Seek({0}, StreamBase::Reference::START, nullptr)); - *payloadPackage = result.Detach(); - return static_cast(Error::OK); + ThrowErrorIf(Error::InvalidParameter,(manifestReader == nullptr || *manifestReader != nullptr), "bad pointer"); + *manifestReader = m_appxBundleManifest.As().Detach(); + return static_cast(Error::OK); #else return static_cast(MSIX::Error::NotSupported); #endif } CATCH_RETURN(); - HRESULT STDMETHODCALLTYPE AppxPackageObject::GetManifest(IAppxBundleManifestReader **manifestReader) noexcept try + // IAppxPackageReaderUtf8 + HRESULT STDMETHODCALLTYPE AppxPackageObject::GetPayloadFile(LPCSTR fileName, IAppxFile** file) noexcept try + { + if (m_isBundle) { return static_cast(Error::PackageIsBundle); } + ThrowErrorIf(Error::InvalidParameter, (fileName == nullptr || file == nullptr || *file != nullptr), "bad pointer"); + auto result = GetAppxFile(Encoding::EncodeFileName(fileName)); + ThrowErrorIfNot(Error::FileNotFound, result, "requested file not in package") + // Clients expect the stream's pointer to be at the start of the file! + ComPtr stream; + ThrowHrIfFailed(result->GetStream(&stream)); + ThrowHrIfFailed(stream->Seek({0}, StreamBase::Reference::START, nullptr)); + *file = result.Detach(); + return static_cast(Error::OK); + } CATCH_RETURN(); + + // IAppxBundleReaderUtf8 + HRESULT STDMETHODCALLTYPE AppxPackageObject::GetPayloadPackage(LPCSTR fileName, IAppxFile **payloadPackage) noexcept try { #ifdef BUNDLE_SUPPORT if (!m_isBundle) { return static_cast(Error::NotImplemented); } - ThrowErrorIf(Error::InvalidParameter,(manifestReader == nullptr || *manifestReader != nullptr), "bad pointer"); - *manifestReader = m_appxBundleManifest.As().Detach(); - return static_cast(Error::OK); + ThrowErrorIf(Error::InvalidParameter, (fileName == nullptr || payloadPackage == nullptr || *payloadPackage != nullptr), "bad pointer"); + auto result = GetAppxFile(fileName); + ThrowErrorIfNot(Error::FileNotFound, result, "Requested package not in bundle") + // Clients expect the stream's pointer to be at the start of the file! + ComPtr stream; + ThrowHrIfFailed(result->GetStream(&stream)); + ThrowHrIfFailed(stream->Seek({0}, StreamBase::Reference::START, nullptr)); + *payloadPackage = result.Detach(); + return static_cast(Error::OK); #else return static_cast(MSIX::Error::NotSupported); #endif diff --git a/src/msix/AppxPackaging_i.cpp b/src/msix/AppxPackaging_i.cpp deleted file mode 100644 index b62b55fb3..000000000 --- a/src/msix/AppxPackaging_i.cpp +++ /dev/null @@ -1,124 +0,0 @@ -// -// Copyright (C) 2017 Microsoft. All rights reserved. -// See LICENSE file in the project root for full license information. -// -/* link this file in with the server and any clients */ -/* File based on the header created by MIDL compiler version 8.01.0622 of AppxPackaging.idl */ -/* @@MIDL_FILE_HEADING( ) */ - -// Changes made to the original AppxPackaging.h file: -// - Add IUnknown, ISequentialStream and IStream GUIDs -// - Remove CLSIDs and LIBID_APPXPACKAGING -// - Add internal interfaces -extern "C"{ - -#ifndef __IID_DEFINED__ -#define __IID_DEFINED__ - -typedef struct _IID -{ - unsigned long x; - unsigned short s1; - unsigned short s2; - unsigned char c[8]; -} IID; - -#endif // __IID_DEFINED__ - -#ifndef WIN32 -#define MIDL_PUBLIC_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ - __attribute__((visibility("default"))) extern "C" const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} -#else -#define MIDL_PUBLIC_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) -#endif - -#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ - extern "C" const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} - - -MIDL_PUBLIC_GUID(IID, IID_IUnknown,0x00000000,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); -MIDL_PUBLIC_GUID(IID, IID_ISequentialStream,0x0c733a30,0x2a1c,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d); -MIDL_PUBLIC_GUID(IID, IID_IStream,0x0000000c,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); -MIDL_PUBLIC_GUID(IID, IID_IAppxFactory,0xbeb94909,0xe451,0x438b,0xb5,0xa7,0xd7,0x9e,0x76,0x7b,0x75,0xd8); -MIDL_PUBLIC_GUID(IID, IID_IAppxPackageReader,0xb5c49650,0x99bc,0x481c,0x9a,0x34,0x3d,0x53,0xa4,0x10,0x67,0x08); -MIDL_PUBLIC_GUID(IID, IID_IAppxPackageWriter,0x9099e33b,0x246f,0x41e4,0x88,0x1a,0x00,0x8e,0xb6,0x13,0xf8,0x58); -MIDL_PUBLIC_GUID(IID, IID_IAppxFile,0x91df827b,0x94fd,0x468f,0x82,0x7b,0x57,0xf4,0x1b,0x2f,0x6f,0x2e); -MIDL_PUBLIC_GUID(IID, IID_IAppxFilesEnumerator,0xf007eeaf,0x9831,0x411c,0x98,0x47,0x91,0x7c,0xdc,0x62,0xd1,0xfe); -MIDL_PUBLIC_GUID(IID, IID_IAppxBlockMapReader,0x5efec991,0xbca3,0x42d1,0x9e,0xc2,0xe9,0x2d,0x60,0x9e,0xc2,0x2a); -MIDL_PUBLIC_GUID(IID, IID_IAppxBlockMapFile,0x277672ac,0x4f63,0x42c1,0x8a,0xbc,0xbe,0xae,0x36,0x00,0xeb,0x59); -MIDL_PUBLIC_GUID(IID, IID_IAppxBlockMapFilesEnumerator,0x02b856a2,0x4262,0x4070,0xba,0xcb,0x1a,0x8c,0xbb,0xc4,0x23,0x05); -MIDL_PUBLIC_GUID(IID, IID_IAppxBlockMapBlock,0x75cf3930,0x3244,0x4fe0,0xa8,0xc8,0xe0,0xbc,0xb2,0x70,0xb8,0x89); -MIDL_PUBLIC_GUID(IID, IID_IAppxBlockMapBlocksEnumerator,0x6b429b5b,0x36ef,0x479e,0xb9,0xeb,0x0c,0x14,0x82,0xb4,0x9e,0x16); -MIDL_PUBLIC_GUID(IID, IID_IAppxManifestReader,0x4e1bd148,0x55a0,0x4480,0xa3,0xd1,0x15,0x54,0x47,0x10,0x63,0x7c); -MIDL_PUBLIC_GUID(IID, IID_IAppxManifestReader2,0xd06f67bc,0xb31d,0x4eba,0xa8,0xaf,0x63,0x8e,0x73,0xe7,0x7b,0x4d); -MIDL_PUBLIC_GUID(IID, IID_IAppxManifestReader3,0xC43825AB,0x69B7,0x400A,0x97,0x09,0xCC,0x37,0xF5,0xA7,0x2D,0x24); -MIDL_PUBLIC_GUID(IID, IID_IAppxManifestPackageId,0x283ce2d7,0x7153,0x4a91,0x96,0x49,0x7a,0x0f,0x72,0x40,0x94,0x5f); -MIDL_PUBLIC_GUID(IID, IID_IAppxManifestProperties,0x03faf64d,0xf26f,0x4b2c,0xaa,0xf7,0x8f,0xe7,0x78,0x9b,0x8b,0xca); -MIDL_PUBLIC_GUID(IID, IID_IAppxManifestTargetDeviceFamiliesEnumerator,0x36537F36,0x27A4,0x4788,0x88,0xC0,0x73,0x38,0x19,0x57,0x50,0x17); -MIDL_PUBLIC_GUID(IID, IID_IAppxManifestTargetDeviceFamily,0x9091B09B,0xC8D5,0x4F31,0x86,0x87,0xA3,0x38,0x25,0x9F,0xAE,0xFB); -MIDL_PUBLIC_GUID(IID, IID_IAppxManifestPackageDependenciesEnumerator,0xb43bbcf9,0x65a6,0x42dd,0xba,0xc0,0x8c,0x67,0x41,0xe7,0xf5,0xa4); -MIDL_PUBLIC_GUID(IID, IID_IAppxManifestPackageDependency,0xe4946b59,0x733e,0x43f0,0xa7,0x24,0x3b,0xde,0x4c,0x12,0x85,0xa0); -MIDL_PUBLIC_GUID(IID, IID_IAppxManifestResourcesEnumerator,0xde4dfbbd,0x881a,0x48bb,0x85,0x8c,0xd6,0xf2,0xba,0xea,0xe6,0xed); -MIDL_PUBLIC_GUID(IID, IID_IAppxManifestDeviceCapabilitiesEnumerator,0x30204541,0x427b,0x4a1c,0xba,0xcf,0x65,0x5b,0xf4,0x63,0xa5,0x40); -MIDL_PUBLIC_GUID(IID, IID_IAppxManifestCapabilitiesEnumerator,0x11D22258,0xF470,0x42C1,0xB2,0x91,0x83,0x61,0xC5,0x43,0x7E,0x41); -MIDL_PUBLIC_GUID(IID, IID_IAppxManifestApplicationsEnumerator,0x9eb8a55a,0xf04b,0x4d0d,0x80,0x8d,0x68,0x61,0x85,0xd4,0x84,0x7a); -MIDL_PUBLIC_GUID(IID, IID_IAppxManifestApplication,0x5da89bf4,0x3773,0x46be,0xb6,0x50,0x7e,0x74,0x48,0x63,0xb7,0xe8); -MIDL_PUBLIC_GUID(IID, IID_IAppxManifestQualifiedResourcesEnumerator,0x8ef6adfe,0x3762,0x4a8f,0x93,0x73,0x2f,0xc5,0xd4,0x44,0xc8,0xd2); -MIDL_PUBLIC_GUID(IID, IID_IAppxManifestQualifiedResource,0x3b53a497,0x3c5c,0x48d1,0x9e,0xa3,0xbb,0x7e,0xac,0x8c,0xd7,0xd4); -MIDL_PUBLIC_GUID(IID, IID_IAppxBundleFactory,0xBBA65864,0x965F,0x4A5F,0x85,0x5F,0xF0,0x74,0xBD,0xBF,0x3A,0x7B); -MIDL_PUBLIC_GUID(IID, IID_IAppxBundleWriter,0xEC446FE8,0xBFEC,0x4C64,0xAB,0x4F,0x49,0xF0,0x38,0xF0,0xC6,0xD2); -MIDL_PUBLIC_GUID(IID, IID_IAppxBundleReader,0xDD75B8C0,0xBA76,0x43B0,0xAE,0x0F,0x68,0x65,0x6A,0x1D,0xC5,0xC8); -MIDL_PUBLIC_GUID(IID, IID_IAppxBundleManifestReader,0xCF0EBBC1,0xCC99,0x4106,0x91,0xEB,0xE6,0x74,0x62,0xE0,0x4F,0xB0); -MIDL_PUBLIC_GUID(IID, IID_IAppxBundleManifestPackageInfoEnumerator,0xF9B856EE,0x49A6,0x4E19,0xB2,0xB0,0x6A,0x24,0x06,0xD6,0x3A,0x32); -MIDL_PUBLIC_GUID(IID, IID_IAppxBundleManifestPackageInfo,0x54CD06C1,0x268F,0x40BB,0x8E,0xD2,0x75,0x7A,0x9E,0xBA,0xEC,0x8D); - -// Exclusive to the MSIX SDK -MIDL_PUBLIC_GUID(IID, IID_IMsixDocumentElement,0xE8900E0E,0x1DFD,0x4728,0x83,0x52,0xAA,0xDA,0xEB,0xBF,0x00,0x65); -MIDL_PUBLIC_GUID(IID, IID_IMsixElement,0x5B6786FF,0x6145,0x4F0E,0xB8,0xC9,0x8E,0x03,0xAA,0xCB,0x60,0xD0); -MIDL_PUBLIC_GUID(IID, IID_IMsixElementEnumerator,0x7E7EA105,0xA4F9,0x4C12,0x9E,0xFA,0x98,0xEF,0x18,0x95,0x41,0x8A); -MIDL_PUBLIC_GUID(IID, IID_IMsixFactoryOverrides,0x0ACEDBDB,0x57CD,0x4ACA,0X8C,0XEE,0X33,0XFA,0X52,0X39,0X43,0X16); -MIDL_PUBLIC_GUID(IID, IID_IMsixStreamFactory,0XC74F4821,0X3B82,0X4AD5,0X98,0XEA,0X3D,0X52,0X68,0X1A,0XFF,0X56); -MIDL_PUBLIC_GUID(IID, IID_IMsixApplicabilityLanguagesEnumerator,0xbfc4655a,0xbe7a,0x456a,0xbc,0x4e,0x2a,0xf9,0x48,0x1e,0x84,0x32); - -// internal interfaces. -MIDL_DEFINE_GUID(IID, IID_IPackage, 0x51B2C456,0xAAA9,0x46D6,0x8E,0xC9,0x29,0x82,0x20,0x55,0x91,0x89); -MIDL_DEFINE_GUID(IID, IID_IStorageObject, 0xEC25B96E,0x0DB1,0x4483,0xBD,0xB1,0xCA,0xB1,0x10,0x9C,0xB7,0x41); -MIDL_DEFINE_GUID(IID, IID_IMsixFactory, 0x1f850db4,0x32b8,0x4db6,0x8b,0xf4,0x5a,0x89,0x7e,0xb6,0x11,0xf1); -MIDL_DEFINE_GUID(IID, IID_IVerifierObject, 0xcb0a105c,0x3a6c,0x4e48,0x93,0x51,0x37,0x7c,0x4d,0xcc,0xd8,0x90); -MIDL_DEFINE_GUID(IID, IID_IXmlElement, 0xac94449e,0x442d,0x4bed,0x8f,0xca,0x83,0x77,0x0c,0x0f,0x7e,0xe9); -MIDL_DEFINE_GUID(IID, IID_IXmlDom, 0x0e7a446e,0xbaf7,0x44c1,0xb3,0x8a,0x21,0x6b,0xfa,0x18,0xa1,0xa8); -MIDL_DEFINE_GUID(IID, IID_IXmlFactory, 0xf82a60ec,0xfbfc,0x4cb9,0xbc,0x04,0x1a,0x0f,0xe2,0xb4,0xd5,0xbe); -MIDL_DEFINE_GUID(IID, IID_IAppxBlockMapInternal, 0x67fed21a,0x70ef,0x4175,0x8f,0x12,0x41,0x5b,0x21,0x3a,0xb6,0xd2); -MIDL_DEFINE_GUID(IID, IID_IAppxManifestObject, 0xeff6d561,0xa236,0x4058,0x9f,0x1d,0x8f,0x93,0x63,0x3f,0xba,0x4b); -MIDL_DEFINE_GUID(IID, IID_IAppxManifestPackageIdInternal, 0x76b7d3e1,0x768a,0x45cb,0x96,0x26,0xba,0x64,0x52,0xbe,0xd2,0xde); -MIDL_DEFINE_GUID(IID, IID_IStreamInternal, 0x44d2a7a8,0xa165,0x4a6e,0xa5,0x6f,0xc7,0xc2,0x4d,0xe7,0x50,0x5c); - -// Internal bundle interfaces -#ifdef BUNDLE_SUPPORT -MIDL_DEFINE_GUID(IID, IID_IBundleInfo, 0xff82ffcd,0x747a,0x4df9,0x88,0x79,0x85,0x3a,0xb9,0xdd,0x15,0xa1); -MIDL_DEFINE_GUID(IID, IID_IAppxBundleManifestPackageInfoInternal, 0x32e6fcf0,0x729b,0x401d,0x9d,0xbc,0xf9,0x27,0xb4,0x94,0xf9,0xaf); -#endif - -// internal XML PAL interfaces -#ifdef USING_XERCES -MIDL_DEFINE_GUID(IID, IID_IXercesElement, 0x07d6ee0e,0x2165,0x4b90,0x80,0x24,0xe1,0x76,0x29,0x1e,0x77,0xdd); -#endif - -#ifdef USING_JAVAXML -// {69AB3660-398D-4CD6-A131-E73106040E3B} -MIDL_DEFINE_GUID(IID, IID_IJavaXmlElement, 0x69ab3660,0x398d,0x4cd6,0xa1,0x31,0xe7,0x31,0x6,0x4,0xe,0x3b); -#endif - -#ifdef USING_APPLE_XML -// {8FBC0096-E87D-406A-95D9-203ADEFBF9AF} -MIDL_DEFINE_GUID(IID, IID_IAppleXmlElement, 0x8fbc0096, 0xe87d, 0x406a, 0x95, 0xd9, 0x20, 0x3a, 0xde, 0xfb, 0xf9, 0xaf); -#endif - -#ifdef USING_MSXML -MIDL_DEFINE_GUID(IID, IID_IMSXMLElement, 0x2730f595,0x0c80,0x4f3e,0x88,0x91,0x75,0x3b,0x2e,0x8c,0x30,0x5d); -MIDL_DEFINE_GUID(IID, IID_IMSXMLDom, 0xb6bca5f0,0xc6c1,0x4409,0x85,0xbe,0xe4,0x76,0xaa,0xbe,0xc1,0x9a); -#endif - -#undef MIDL_DEFINE_GUID - -} diff --git a/src/msix/CMakeLists.txt b/src/msix/CMakeLists.txt index b2da4796e..e5d84d923 100644 --- a/src/msix/CMakeLists.txt +++ b/src/msix/CMakeLists.txt @@ -63,42 +63,6 @@ else() "UnpackBundleFromStream" "CoCreateAppxBundleFactory" "CoCreateAppxBundleFactoryWithHeap" - "IID_IUnknown" - "IID_IStream" - "IID_IAppxFactory" - "IID_IAppxPackageReader" - "IID_IAppxFile" - "IID_IAppxFilesEnumerator" - "IID_IAppxBlockMapReader" - "IID_IAppxBlockMapFile" - "IID_IAppxBlockMapFilesEnumerator" - "IID_IAppxBlockMapBlock" - "IID_IAppxBlockMapBlocksEnumerator" - "IID_IAppxManifestReader" - "IID_IAppxManifestReader2" - "IID_IAppxManifestReader3" - "IID_IAppxManifestPackageId" - "IID_IAppxManifestProperties" - "IID_IAppxManifestTargetDeviceFamiliesEnumerator" - "IID_IAppxManifestTargetDeviceFamily" - "IID_IAppxManifestPackageDependenciesEnumerator" - "IID_IAppxManifestPackageDependency" - "IID_IAppxManifestResourcesEnumerator" - "IID_IAppxManifestApplicationsEnumerator" - "IID_IAppxManifestApplication" - "IID_IAppxManifestQualifiedResourcesEnumerator" - "IID_IAppxManifestQualifiedResource" - "IID_IAppxBundleFactory" - "IID_IAppxBundleReader" - "IID_IAppxBundleManifestReader" - "IID_IAppxBundleManifestPackageInfoEnumerator" - "IID_IAppxBundleManifestPackageInfo" - "IID_IMsixDocumentElement" - "IID_IMsixElement" - "IID_IMsixElementEnumerator" - "IID_IMsixFactoryOverrides" - "IID_IMsixStreamFactory" - "IID_IMsixApplicabilityLanguagesEnumerator" ) if((IOS) OR (MACOS)) # on Apple platforms you can explicitly define which symbols are exported @@ -210,7 +174,6 @@ add_library(${PROJECT_NAME} SHARED AppxManifestObject.cpp AppxPackageObject.cpp AppxPackageInfo.cpp - AppxPackaging_i.cpp AppxSignature.cpp Encoding.cpp Exceptions.cpp diff --git a/src/msix/PAL/FileSystem/Win32/DirectoryObject.cpp b/src/msix/PAL/FileSystem/Win32/DirectoryObject.cpp index 810b3d2c9..56fee8309 100644 --- a/src/msix/PAL/FileSystem/Win32/DirectoryObject.cpp +++ b/src/msix/PAL/FileSystem/Win32/DirectoryObject.cpp @@ -3,7 +3,6 @@ // See LICENSE file in the project root for full license information. // // ONLY build on platforms other than Win32 -#ifdef WIN32 #include "Exceptions.hpp" #include "DirectoryObject.hpp" #include "FileStream.hpp" @@ -170,4 +169,3 @@ namespace MSIX { // Don't pollute other compilation units with any of our #defs... #undef UNICODE -#endif \ No newline at end of file diff --git a/src/msix/PAL/XML/AOSP/XmlObject.cpp b/src/msix/PAL/XML/AOSP/XmlObject.cpp index 530a7778a..8aa87ce48 100644 --- a/src/msix/PAL/XML/AOSP/XmlObject.cpp +++ b/src/msix/PAL/XML/AOSP/XmlObject.cpp @@ -17,9 +17,6 @@ #include "Enumerators.hpp" #include "JniHelper.hpp" - -EXTERN_C const IID IID_IJavaXmlElement; - // An internal interface for java XML document object model // {69AB3660-398D-4CD6-A131-E73106040E3B} interface IJavaXmlElement : public IUnknown @@ -27,8 +24,7 @@ interface IJavaXmlElement : public IUnknown public: virtual jobject GetJavaObject() = 0; }; - -SpecializeUuidOfImpl(IJavaXmlElement); +MSIX_INTERFACE(IJavaXmlElement, 0x69ab3660,0x398d,0x4cd6,0xa1,0x31,0xe7,0x31,0x6,0x4,0xe,0x3b); namespace MSIX { @@ -84,7 +80,6 @@ class JavaXmlElement final : public ComClassMarshalOutString(attributeValue, value);; - } CATCH_RETURN(); HRESULT STDMETHODCALLTYPE GetText(LPWSTR* value) noexcept override try @@ -96,10 +91,28 @@ class JavaXmlElement final : public ComClass jname(m_env->NewStringUTF(intermediate.c_str())); + HRESULT STDMETHODCALLTYPE GetAttributeValueUtf8(LPCSTR name, LPSTR* value) noexcept override try + { + ThrowErrorIf(Error::InvalidParameter, (value == nullptr), "bad pointer."); + auto attribute = std::string(name); + auto attributeValue = GetAttributeValue(attribute); + return m_factory->MarshalOutStringUtf8(attributeValue, value);; + } CATCH_RETURN(); + + HRESULT STDMETHODCALLTYPE GetTextUtf8(LPSTR* value) noexcept override try + { + ThrowErrorIf(Error::InvalidParameter, (value == nullptr), "bad pointer."); + auto text = GetText(); + return m_factory->MarshalOutStringUtf8(text, value); + } CATCH_RETURN(); + + HRESULT STDMETHODCALLTYPE GetElementsUtf8(LPCSTR name, IMsixElementEnumerator** elements) noexcept override try + { + ThrowErrorIf(Error::InvalidParameter, (elements == nullptr || *elements != nullptr), "bad pointer."); + std::unique_ptr<_jstring, JObjectDeleter> jname(m_env->NewStringUTF(name)); std::unique_ptr<_jobjectArray, JObjectDeleter> javaElements(reinterpret_cast(m_env->CallObjectMethod(m_javaXmlElementObject.get(), getElementsFunc, jname.get()))); std::vector> elementsEnum; // Note: if the number of elements are large, JNI might barf due to too many local refs alive. This should only be used for small lists. @@ -108,10 +121,7 @@ class JavaXmlElement final : public ComClass::Make(m_factory, m_env->GetObjectArrayElement(javaElements.get(), i)); elementsEnum.push_back(std::move(item)); } - *elements = ComPtr:: - Make>(elementsEnum).Detach(); - - + *elements = ComPtr::Make>(elementsEnum).Detach(); return static_cast(Error::OK); } CATCH_RETURN(); diff --git a/src/msix/PAL/XML/Apple/XmlObject.cpp b/src/msix/PAL/XML/Apple/XmlObject.cpp index 77d8939af..13685b817 100644 --- a/src/msix/PAL/XML/Apple/XmlObject.cpp +++ b/src/msix/PAL/XML/Apple/XmlObject.cpp @@ -17,8 +17,6 @@ #include "Enumerators.hpp" #include "XmlDocumentReader.hpp" -EXTERN_C const IID IID_IAppleXmlElement; - // An internal interface for apple XML document object model // {8FBC0096-E87D-406A-95D9-203ADEFBF9AF} interface IAppleXmlElement : public IUnknown @@ -26,8 +24,7 @@ interface IAppleXmlElement : public IUnknown public: virtual MSIX::XmlNode* GetXmlNode() = 0; }; - -SpecializeUuidOfImpl(IAppleXmlElement); +MSIX_INTERFACE(IAppleXmlElement, 0x8fbc0096, 0xe87d, 0x406a, 0x95, 0xd9, 0x20, 0x3a, 0xde, 0xfb, 0xf9, 0xaf); namespace MSIX { @@ -67,7 +64,6 @@ class XmlElement final : public ComClassMarshalOutString(attributeValue, value);; - } CATCH_RETURN(); HRESULT STDMETHODCALLTYPE GetText(LPWSTR* value) noexcept override try @@ -79,22 +75,36 @@ class XmlElement final : public ComClassMarshalOutStringUtf8(attributeValue, value);; + } CATCH_RETURN(); - auto elementsFound = m_xmlNode->FindElements(intermediate); + HRESULT STDMETHODCALLTYPE GetTextUtf8(LPSTR* value) noexcept override try + { + ThrowErrorIf(Error::InvalidParameter, (value == nullptr), "bad pointer."); + auto text = GetText(); + return m_factory->MarshalOutStringUtf8(text, value); + } CATCH_RETURN(); + HRESULT STDMETHODCALLTYPE GetElementsUtf8(LPCSTR name, IMsixElementEnumerator** elements) noexcept override try + { + ThrowErrorIf(Error::InvalidParameter, (elements == nullptr || *elements != nullptr), "bad pointer."); + auto attribute = std::string(name); + auto elementsFound = m_xmlNode->FindElements(attribute); std::vector> elementsEnum; for(auto element : elementsFound) { auto item = ComPtr::Make(m_factory, element); elementsEnum.push_back(std::move(item)); } - - *elements = ComPtr:: - Make>(elementsEnum).Detach(); - + *elements = ComPtr::Make>(elementsEnum).Detach(); return static_cast(Error::OK); } CATCH_RETURN(); diff --git a/src/msix/PAL/XML/msxml6/XmlObject.cpp b/src/msix/PAL/XML/msxml6/XmlObject.cpp index 98c2a6b53..1b8a28e35 100644 --- a/src/msix/PAL/XML/msxml6/XmlObject.cpp +++ b/src/msix/PAL/XML/msxml6/XmlObject.cpp @@ -22,37 +22,25 @@ #include -EXTERN_C const IID IID_IMSXMLElement; -EXTERN_C const IID IID_IMSXMLDom; - -#ifndef WIN32 -// {2730f595-0c80-4f3e-8891-753b2e8c305d} -interface IMSXMLElement : public IUnknown -#else #include "Unknwn.h" #include "Objidl.h" +// {2730f595-0c80-4f3e-8891-753b2e8c305d} class IMSXMLElement : public IUnknown -#endif // An internal interface for XML document object model { public: virtual MSIX::ComPtr SelectNodes(XmlQueryName query) = 0; }; +MSIX_INTERFACE(IMSXMLElement, 0x2730f595,0x0c80,0x4f3e,0x88,0x91,0x75,0x3b,0x2e,0x8c,0x30,0x5d); -#ifndef WIN32 // {b6bca5f0-c6c1-4409-85be-e476aabec19a} -interface IMSXMLDom : public IUnknown -#else class IMSXMLDom : public IUnknown -#endif // An internal interface for XML document object model { public: virtual MSIX::ComPtr GetDomDocument() = 0; }; - -SpecializeUuidOfImpl(IMSXMLElement); -SpecializeUuidOfImpl(IMSXMLDom); +MSIX_INTERFACE(IMSXMLDom, 0xb6bca5f0,0xc6c1,0x4409,0x85,0xbe,0xe4,0x76,0xaa,0xbe,0xc1,0x9a); namespace MSIX { @@ -201,13 +189,6 @@ class Variant class MSXMLElement final : public ComClass { - bool GetAttribute(const std::wstring& attribute, VARIANT* variant) - { - Bstr name(attribute); - ThrowHrIfFailed(m_element->getAttribute(name, variant)); - return (variant->vt == VT_BSTR); - } - public: MSXMLElement(IMsixFactory* factory, ComPtr& element) : m_factory(factory), m_element(element) {} @@ -281,7 +262,6 @@ class MSXMLElement final : public ComClass list; Bstr xPath(name); ThrowHrIfFailed(m_element->selectNodes(xPath, &list)); @@ -303,7 +283,70 @@ class MSXMLElement final : public ComClass(Error::OK); } CATCH_RETURN(); + HRESULT STDMETHODCALLTYPE GetAttributeValueUtf8(LPCSTR name, LPSTR* value) noexcept override try + { + ThrowErrorIf(Error::InvalidParameter, (value == nullptr), "bad pointer."); + *value = nullptr; + Variant attribute; + auto wname = utf8_to_wstring(name); + if (GetAttribute(wname, attribute.AddressOf())) + { + auto intermediate = wstring_to_utf8(std::wstring(static_cast(attribute.Get().bstrVal))); + ThrowHrIfFailed(m_factory->MarshalOutStringUtf8(intermediate, value)); + } + return static_cast(Error::OK); + } CATCH_RETURN(); + + HRESULT STDMETHODCALLTYPE GetTextUtf8(LPSTR* value) noexcept override try + { + ThrowErrorIf(Error::InvalidParameter, (value == nullptr), "bad pointer."); + ComPtr node; + ThrowHrIfFailed(m_element->QueryInterface(__uuidof(IXMLDOMNode), reinterpret_cast(&node))); + Bstr text; + ThrowHrIfFailed(node->get_text(text.AddressOf())); + if (text.Get() != nullptr) + { + auto intermediate = wstring_to_utf8(std::wstring(static_cast(text.Get()))); + ThrowHrIfFailed(m_factory->MarshalOutStringUtf8(intermediate, value)); + } + return static_cast(Error::OK); + } CATCH_RETURN(); + + HRESULT STDMETHODCALLTYPE GetElementsUtf8(LPCSTR name, IMsixElementEnumerator** elements) noexcept override try + { + return GetElements(utf8_to_wstring(name).c_str(), elements); + } CATCH_RETURN(); + protected: + + bool GetAttribute(const std::wstring& attribute, VARIANT* variant) + { + Bstr name(attribute); + ThrowHrIfFailed(m_element->getAttribute(name, variant)); + return (variant->vt == VT_BSTR); + } + + ComPtr GetElementsHelper(std::wstring& name) + { + ComPtr list; + Bstr xPath(name); + ThrowHrIfFailed(m_element->selectNodes(xPath, &list)); + + long count = 0; + ThrowHrIfFailed(list->get_length(&count)); + std::vector> elementsEnum; + for(long index=0; index < count; index++) + { + ComPtr node; + ThrowHrIfFailed(list->get_item(index, &node)); + ComPtr elementItem; + ThrowHrIfFailed(node->QueryInterface(__uuidof(IXMLDOMElement), reinterpret_cast(&elementItem))); + auto item = ComPtr::Make(m_factory, elementItem); + elementsEnum.push_back(std::move(item)); + } + return ComPtr::Make>(elementsEnum); + } + IMsixFactory* m_factory; ComPtr m_element; }; diff --git a/src/msix/PAL/XML/xerces-c/XmlObject.cpp b/src/msix/PAL/XML/xerces-c/XmlObject.cpp index 22cd7af9e..9973d5fdc 100644 --- a/src/msix/PAL/XML/xerces-c/XmlObject.cpp +++ b/src/msix/PAL/XML/xerces-c/XmlObject.cpp @@ -28,23 +28,20 @@ XERCES_CPP_NAMESPACE_USE -EXTERN_C const IID IID_IXercesElement; - -#ifndef WIN32 +// An internal interface for XML document object model // {07d6ee0e-2165-4b90-8024-e176291e77dd} +#ifndef WIN32 interface IXercesElement : public IUnknown #else #include "Unknwn.h" #include "Objidl.h" class IXercesElement : public IUnknown #endif -// An internal interface for XML document object model { public: virtual DOMElement* GetElement() = 0; }; - -SpecializeUuidOfImpl(IXercesElement); +MSIX_INTERFACE(IXercesElement, 0x07d6ee0e,0x2165,0x4b90,0x80,0x24,0xe1,0x76,0x29,0x1e,0x77,0xdd); namespace MSIX { @@ -270,12 +267,30 @@ class XercesElement final : public ComClassMarshalOutStringUtf8(attributeValue, value); + } CATCH_RETURN(); + + HRESULT STDMETHODCALLTYPE GetTextUtf8(LPSTR* value) noexcept override try + { + ThrowErrorIf(Error::InvalidParameter, (value == nullptr), "bad pointer."); + auto text = GetText(); + return m_factory->MarshalOutStringUtf8(text, value); + } CATCH_RETURN(); + HRESULT STDMETHODCALLTYPE GetElementsUtf8(LPCSTR name, IMsixElementEnumerator** elements) noexcept override try + { + ThrowErrorIf(Error::InvalidParameter, (elements == nullptr || *elements != nullptr), "bad pointer."); // Note: getElementsByTagName only returns the childs of a DOMElement and doesn't // support xPath. For this reason we need the XercesDomParser in this object. - auto intermediate = wstring_to_utf8(name); - XercesXMLChPtr xPath(XMLString::transcode(intermediate.c_str())); + XercesXMLChPtr xPath(XMLString::transcode(name)); XercesPtr result(m_parser->getDocument()->evaluate( xPath.Get(), m_element, diff --git a/test/api/ApiTests.cpp b/test/api/ApiTests.cpp index 332628ee1..305f1547a 100644 --- a/test/api/ApiTests.cpp +++ b/test/api/ApiTests.cpp @@ -379,13 +379,25 @@ void StartTestPackage(void*) VERIFY_SUCCEEDED(files->GetCurrent(&file)); Text fileName; VERIFY_SUCCEEDED(file->GetName(&fileName)); - VERIFY_ARE_EQUAL(fileName.ToString(), expectedPayloadFiles.at(nFiles)); + VERIFY_ARE_EQUAL(expectedPayloadFiles.at(nFiles), fileName.ToString()); + + ComPtr fileUtf8; + VERIFY_SUCCEEDED(file->QueryInterface(UuidOfImpl::iid, reinterpret_cast(&fileUtf8))); + Text fileNameUtf8; + VERIFY_SUCCEEDED(fileUtf8->GetName(&fileNameUtf8)); + VERIFY_ARE_EQUAL(expectedPayloadFiles.at(nFiles), fileNameUtf8.ToString()); // Compare that the file from GetPayloadFile is the same file ComPtr file2; VERIFY_SUCCEEDED(packageReader->GetPayloadFile(fileName.Get(), &file2)); VERIFY_ARE_SAME(file.Get(), file2.Get()); + ComPtr packageReaderUtf8; + VERIFY_SUCCEEDED(packageReader->QueryInterface(UuidOfImpl::iid, reinterpret_cast(&packageReaderUtf8))); + ComPtr file3; + VERIFY_SUCCEEDED(packageReaderUtf8->GetPayloadFile(fileNameUtf8.Get(), &file3)); + VERIFY_ARE_SAME(file2.Get(), file3.Get()); + VERIFY_SUCCEEDED(files->MoveNext(&hasCurrent)); nFiles++; } @@ -502,6 +514,12 @@ void StartTestPackageManifest(void*) VERIFY_SUCCEEDED(app->GetAppUserModelId(&aumid)); VERIFY_ARE_EQUAL(expectedAumid, aumid.ToString()); + Text aumidUtf8; + ComPtr appUtf8; + VERIFY_SUCCEEDED(app->QueryInterface(UuidOfImpl::iid, reinterpret_cast(&appUtf8))); + VERIFY_SUCCEEDED(appUtf8->GetAppUserModelId(&aumidUtf8)); + VERIFY_ARE_EQUAL(expectedAumid, aumidUtf8.ToString()); + // Note: this isn't implemented. But adding check so when we do, we update this test too. Text value; VERIFY_HR(static_cast(MSIX::Error::NotImplemented), app->GetStringValue(L"dummy", &value)); @@ -519,14 +537,19 @@ void StartTestPackageManifest(void*) ComPtr properties; VERIFY_SUCCEEDED(manifestReader->GetProperties(&properties)); + ComPtr propertiesUtf8; + VERIFY_SUCCEEDED(properties->QueryInterface(UuidOfImpl::iid, reinterpret_cast(&propertiesUtf8))); + for(int i = 0; i < numberOfTests; i++) { auto valueType = GetInput(); - auto value = utf8_to_utf16(GetInput()); + auto valueUtf8 = GetInput(); + auto value = utf8_to_utf16(valueUtf8); auto expected = GetInput(); if (valueType == "BoolValue") { - BOOL result; + BOOL result = FALSE; + BOOL resultUtf8 = FALSE; if (expected == "invalid") { VERIFY_HR(static_cast(MSIX::Error::InvalidParameter), properties->GetBoolValue(value.c_str(), &result)); @@ -534,13 +557,16 @@ void StartTestPackageManifest(void*) else { VERIFY_SUCCEEDED(properties->GetBoolValue(value.c_str(), &result)); + VERIFY_SUCCEEDED(propertiesUtf8->GetBoolValue(valueUtf8.c_str(), &resultUtf8)); if (expected == "true") { VERIFY_IS_TRUE(result); + VERIFY_IS_TRUE(resultUtf8); } else if (expected == "false") { VERIFY_IS_FALSE(result); + VERIFY_IS_FALSE(resultUtf8); } else { @@ -551,6 +577,7 @@ void StartTestPackageManifest(void*) else if (valueType == "StringValue") { Text result; + Text resultUtf8; if (expected == "invalid") { VERIFY_HR(static_cast(MSIX::Error::InvalidParameter), properties->GetStringValue(value.c_str(), &result)); @@ -559,11 +586,17 @@ void StartTestPackageManifest(void*) { VERIFY_SUCCEEDED(properties->GetStringValue(value.c_str(), &result)); VERIFY_IS_NULL(result.Get()); + + VERIFY_SUCCEEDED(propertiesUtf8->GetStringValue(valueUtf8.c_str(), &resultUtf8)); + VERIFY_IS_NULL(resultUtf8.Get()); } else { VERIFY_SUCCEEDED(properties->GetStringValue(value.c_str(), &result)); VERIFY_ARE_EQUAL(expected, result.ToString()); + + VERIFY_SUCCEEDED(propertiesUtf8->GetStringValue(valueUtf8.c_str(), &resultUtf8)); + VERIFY_ARE_EQUAL(expected, resultUtf8.ToString()); } } else @@ -589,11 +622,18 @@ void StartTestPackageManifest(void*) ComPtr dependency; VERIFY_SUCCEEDED(dependencies->GetCurrent(&dependency)); + ComPtr dependencyUtf8; + VERIFY_SUCCEEDED(dependency->QueryInterface(UuidOfImpl::iid, reinterpret_cast(&dependencyUtf8))); + auto expectedName = GetInput(); Text name; VERIFY_SUCCEEDED(dependency->GetName(&name)); VERIFY_ARE_EQUAL(expectedName, name.ToString()); + Text nameUtf8; + VERIFY_SUCCEEDED(dependencyUtf8->GetName(&nameUtf8)); + VERIFY_ARE_EQUAL(expectedName, nameUtf8.ToString()); + auto expectedMin = GetInput(); UINT64 min = 0; VERIFY_SUCCEEDED(dependency->GetMinVersion(&min)); @@ -604,6 +644,10 @@ void StartTestPackageManifest(void*) VERIFY_SUCCEEDED(dependency->GetPublisher(&publisher)); VERIFY_ARE_EQUAL(expectedPublisher, publisher.ToString()); + Text publisherUtf8; + VERIFY_SUCCEEDED(dependencyUtf8->GetPublisher(&publisherUtf8)); + VERIFY_ARE_EQUAL(expectedPublisher, publisherUtf8.ToString()); + VERIFY_SUCCEEDED(dependencies->MoveNext(&hasCurrent)); numDep++; } @@ -625,6 +669,9 @@ void StartTestPackageManifest(void*) auto expNumOfResources = GetInput(); ComPtr resources; VERIFY_SUCCEEDED(manifestReader->GetResources(&resources)); + ComPtr resourcesUtf8; + VERIFY_SUCCEEDED(resources->QueryInterface(UuidOfImpl::iid, reinterpret_cast(&resourcesUtf8))); + BOOL hasCurrent = FALSE; VERIFY_SUCCEEDED(resources->GetHasCurrent(&hasCurrent)); int numOfDependencies = 0; @@ -634,6 +681,11 @@ void StartTestPackageManifest(void*) Text resource; VERIFY_SUCCEEDED(resources->GetCurrent(&resource)); VERIFY_ARE_EQUAL(expectedResource, resource.ToString()); + + Text resourceUtf8; + VERIFY_SUCCEEDED(resourcesUtf8->GetCurrent(&resourceUtf8)); + VERIFY_ARE_EQUAL(expectedResource, resourceUtf8.ToString()); + VERIFY_SUCCEEDED(resources->MoveNext(&hasCurrent)); numOfDependencies++; } @@ -661,6 +713,12 @@ void StartTestPackageManifest(void*) VERIFY_SUCCEEDED(tdf->GetName(&name)); VERIFY_ARE_EQUAL(expectedName, name.ToString()); + ComPtr tdfUtf8; + VERIFY_SUCCEEDED(tdf->QueryInterface(UuidOfImpl::iid, reinterpret_cast(&tdfUtf8))); + Text nameUtf8; + VERIFY_SUCCEEDED(tdfUtf8->GetName(&nameUtf8)); + VERIFY_ARE_EQUAL(expectedName, nameUtf8.ToString()); + auto expectedMin = GetInput(); UINT64 min = 0; VERIFY_SUCCEEDED(tdf->GetMinVersion(&min)); @@ -686,40 +744,75 @@ void StartTestPackageManifest(void*) ComPtr manifestElement; VERIFY_SUCCEEDED(msixDocument->GetDocumentElement(&manifestElement)); - auto xpath = utf8_to_utf16(GetInput()); + auto xpathUtf8 = GetInput(); + auto xpath = utf8_to_utf16(xpathUtf8); ComPtr elementEnum; VERIFY_SUCCEEDED(manifestElement->GetElements(xpath.c_str(), &elementEnum)); + + ComPtr elementEnumFromUtf8; + VERIFY_SUCCEEDED(manifestElement->GetElementsUtf8(xpathUtf8.c_str(), &elementEnumFromUtf8)); + BOOL hasCurrent = FALSE; + BOOL hasCurrentFromUtf8 = FALSE; VERIFY_SUCCEEDED(elementEnum->GetHasCurrent(&hasCurrent)); + VERIFY_SUCCEEDED(elementEnumFromUtf8->GetHasCurrent(&hasCurrentFromUtf8)); int numOfElements = 0; - while(hasCurrent) + while(hasCurrent && hasCurrentFromUtf8) { + // NOTE: element and elementFromUtf8 are different objects, but should output the same results. ComPtr element; VERIFY_SUCCEEDED(elementEnum->GetCurrent(&element)); + ComPtr elementFromUtf8; + VERIFY_SUCCEEDED(elementEnumFromUtf8->GetCurrent(&elementFromUtf8)); + auto numOfAttributes = GetInput(); for (int i = 0; i < numOfAttributes; i++) { - auto a = GetInput(); + auto attributeUtf8 = GetInput(); Text value; - if (a == "Fake") + Text valueUtf8; + Text valueFromUtf8; + Text valueUtf8FromUtf8; + if (attributeUtf8 == "Fake") { VERIFY_SUCCEEDED(element->GetAttributeValue(L"Fake", &value)); VERIFY_IS_NULL(value.Get()); + + VERIFY_SUCCEEDED(element->GetAttributeValueUtf8("Fake", &valueUtf8)); + VERIFY_IS_NULL(valueUtf8.Get()); + + VERIFY_SUCCEEDED(elementFromUtf8->GetAttributeValue(L"Fake", &valueFromUtf8)); + VERIFY_IS_NULL(valueFromUtf8.Get()); + + VERIFY_SUCCEEDED(elementFromUtf8->GetAttributeValueUtf8("Fake", &valueUtf8FromUtf8)); + VERIFY_IS_NULL(valueUtf8FromUtf8.Get()); } else { - auto attribute = utf8_to_utf16(a); + auto attribute = utf8_to_utf16(attributeUtf8); auto expectedValue = GetInput(); + VERIFY_SUCCEEDED(element->GetAttributeValue(attribute.c_str(), &value)); VERIFY_ARE_EQUAL(expectedValue, value.ToString()); + + VERIFY_SUCCEEDED(element->GetAttributeValueUtf8(attributeUtf8.c_str(), &valueUtf8)); + VERIFY_ARE_EQUAL(expectedValue, valueUtf8.ToString()); + + VERIFY_SUCCEEDED(elementFromUtf8->GetAttributeValue(attribute.c_str(), &valueFromUtf8)); + VERIFY_ARE_EQUAL(expectedValue, valueFromUtf8.ToString()); + + VERIFY_SUCCEEDED(elementFromUtf8->GetAttributeValueUtf8(attributeUtf8.c_str(), &valueUtf8FromUtf8)); + VERIFY_ARE_EQUAL(expectedValue, valueUtf8FromUtf8.ToString()); } } VERIFY_SUCCEEDED(elementEnum->MoveNext(&hasCurrent)); + VERIFY_SUCCEEDED(elementEnumFromUtf8->MoveNext(&hasCurrentFromUtf8)); numOfElements++; } VERIFY_ARE_EQUAL(expNumOfElements, numOfElements); + VERIFY_IS_FALSE(hasCurrent || hasCurrentFromUtf8) } )}, { "Package.Manifest.PackageId", Test("Validates manifest package id", @@ -729,11 +822,17 @@ void StartTestPackageManifest(void*) VERIFY_SUCCEEDED(manifestReader->GetPackageId(&packageId)); VERIFY_NOT_NULL(packageId.Get()); + ComPtr packageIdUtf8; + VERIFY_SUCCEEDED(packageId->QueryInterface(UuidOfImpl::iid, reinterpret_cast(&packageIdUtf8))); + auto expectedName = GetInput(); Text name; VERIFY_SUCCEEDED(packageId->GetName(&name)); VERIFY_ARE_EQUAL(expectedName, name.ToString()) + Text nameUtf8; + VERIFY_SUCCEEDED(packageIdUtf8->GetName(&nameUtf8)); + VERIFY_ARE_EQUAL(expectedName, nameUtf8.ToString()) auto expectedArch = GetInput(); APPX_PACKAGE_ARCHITECTURE architecture; @@ -745,9 +844,16 @@ void StartTestPackageManifest(void*) VERIFY_SUCCEEDED(packageId->GetPublisher(&publisher)); VERIFY_ARE_EQUAL(expectedPublisher, publisher.ToString()); + Text publisherUtf8; + VERIFY_SUCCEEDED(packageIdUtf8->GetPublisher(&publisherUtf8)); + VERIFY_ARE_EQUAL(expectedPublisher, publisherUtf8.ToString()); + BOOL isSame = FALSE; VERIFY_SUCCEEDED(packageId->ComparePublisher(publisher.Get(), &isSame)); VERIFY_IS_TRUE(isSame); + isSame = FALSE; + VERIFY_SUCCEEDED(packageIdUtf8->ComparePublisher(publisherUtf8.Get(), &isSame)); + VERIFY_IS_TRUE(isSame); VERIFY_SUCCEEDED(packageId->ComparePublisher(L"OtherPublisher", &isSame)); VERIFY_IS_FALSE(isSame); @@ -766,6 +872,10 @@ void StartTestPackageManifest(void*) else { VERIFY_ARE_EQUAL(expectedResource, resourceId.ToString()); + + Text resourceIdUtf8; + VERIFY_SUCCEEDED(packageIdUtf8->GetResourceId(&resourceIdUtf8)); + VERIFY_ARE_EQUAL(expectedResource, resourceIdUtf8.ToString()); } auto expectedFull = GetInput(); @@ -773,10 +883,18 @@ void StartTestPackageManifest(void*) VERIFY_SUCCEEDED(packageId->GetPackageFullName(&packageFullName)); VERIFY_ARE_EQUAL(expectedFull, packageFullName.ToString()); + Text packageFullNameUtf8; + VERIFY_SUCCEEDED(packageIdUtf8->GetPackageFullName(&packageFullNameUtf8)); + VERIFY_ARE_EQUAL(expectedFull, packageFullNameUtf8.ToString()); + auto expectedFamily = GetInput(); Text packageFamilyName; VERIFY_SUCCEEDED(packageId->GetPackageFamilyName(&packageFamilyName)); VERIFY_ARE_EQUAL(expectedFamily, packageFamilyName.ToString()); + + Text packageFamilyNameUtf8; + VERIFY_SUCCEEDED(packageIdUtf8->GetPackageFamilyName(&packageFamilyNameUtf8)); + VERIFY_ARE_EQUAL(expectedFamily, packageFamilyNameUtf8.ToString()); } )}, }; @@ -823,10 +941,22 @@ void StartTestPackageBlockMap(void*) VERIFY_SUCCEEDED(blockMapFile->GetName(&fileName)) VERIFY_ARE_EQUAL(expectedName, fileName.ToString()); + ComPtr blockMapFileUtf8; + VERIFY_SUCCEEDED(blockMapFile->QueryInterface(UuidOfImpl::iid, reinterpret_cast(&blockMapFileUtf8))); + Text fileNameUtf8; + VERIFY_SUCCEEDED(blockMapFileUtf8->GetName(&fileNameUtf8)) + VERIFY_ARE_EQUAL(expectedName, fileNameUtf8.ToString()); + ComPtr blockMapFile2; VERIFY_SUCCEEDED(blockMapReader->GetFile(fileName.Get(), &blockMapFile2)); VERIFY_ARE_SAME(blockMapFile.Get(), blockMapFile2.Get()); + ComPtr blockMapFile3; + ComPtr blockMapReaderUtf8; + VERIFY_SUCCEEDED(blockMapReader->QueryInterface(UuidOfImpl::iid, reinterpret_cast(&blockMapReaderUtf8))); + VERIFY_SUCCEEDED(blockMapReaderUtf8->GetFile(fileNameUtf8.Get(), &blockMapFile3)); + VERIFY_ARE_SAME(blockMapFile.Get(), blockMapFile3.Get()); + auto expectedLfh = GetInput(); UINT32 lfh; VERIFY_SUCCEEDED(blockMapFile->GetLocalFileHeaderSize(&lfh)); @@ -952,6 +1082,19 @@ void StartTestBundle(void*) ComPtr package2; VERIFY_SUCCEEDED(bundleReader->GetPayloadPackage(packageName.Get(), &package2)); VERIFY_ARE_SAME(package.Get(), package2.Get()); + + Text packageNameUtf8; + ComPtr packageUtf8; + VERIFY_SUCCEEDED(package->QueryInterface(UuidOfImpl::iid, reinterpret_cast(&packageUtf8))); + VERIFY_SUCCEEDED(packageUtf8->GetName(&packageNameUtf8)); + VERIFY_ARE_EQUAL(expectedName, packageNameUtf8.ToString()); + + ComPtr package3; + ComPtr bundleReaderUtf8; + VERIFY_SUCCEEDED(bundleReader->QueryInterface(UuidOfImpl::iid, reinterpret_cast(&bundleReaderUtf8))); + VERIFY_SUCCEEDED(bundleReaderUtf8->GetPayloadPackage(packageNameUtf8.Get(), &package3)); + VERIFY_ARE_SAME(package.Get(), package3.Get()); + VERIFY_SUCCEEDED(packages->MoveNext(&hasCurrent)); numOfPackages++; } @@ -1013,6 +1156,12 @@ void StartTestBundleManifest(void*) VERIFY_SUCCEEDED(bundleManifestPackageInfo->GetFileName(&fileName)); VERIFY_ARE_EQUAL(expectedName, fileName.ToString()); + Text fileNameUtf8; + ComPtr bundleManifestPackageInfoUtf8; + VERIFY_SUCCEEDED(bundleManifestPackageInfo->QueryInterface(UuidOfImpl::iid, reinterpret_cast(&bundleManifestPackageInfoUtf8))); + VERIFY_SUCCEEDED(bundleManifestPackageInfoUtf8->GetFileName(&fileNameUtf8)); + VERIFY_ARE_EQUAL(expectedName, fileNameUtf8.ToString()); + auto expectedType = GetInput(); APPX_BUNDLE_PAYLOAD_PACKAGE_TYPE type; VERIFY_SUCCEEDED(bundleManifestPackageInfo->GetPackageType(&type)); @@ -1056,6 +1205,12 @@ void StartTestBundleManifest(void*) VERIFY_SUCCEEDED(manifestQualifiedResources->GetLanguage(&language)); VERIFY_ARE_EQUAL(expectedTag, language.ToString()); + ComPtr manifestQualifiedResourcesUtf8; + VERIFY_SUCCEEDED(manifestQualifiedResources->QueryInterface(UuidOfImpl::iid, reinterpret_cast(&manifestQualifiedResourcesUtf8))); + Text languageUtf8; + VERIFY_SUCCEEDED(manifestQualifiedResourcesUtf8->GetLanguage(&languageUtf8)); + VERIFY_ARE_EQUAL(expectedTag, languageUtf8.ToString()); + VERIFY_SUCCEEDED(manifestQualifiedResourcesEnumerator->MoveNext(&hasCurrentResource)); nLangs++; }