#pragma once #include "pkgcode.h" #include "priread.h" #include // 用于处理信息 struct PackageInfomation { struct Identity { std::wstring name = L""; std::wstring publisher = L""; VERSION version; std::vector architectures; } identities; struct Resources { std::vector languages; } resources; struct Prerequisites { VERSION osMinVersion; } prerequisites; struct Property { std::wstring name = L""; std::wstring description = L""; std::wstring publisher = L""; } properties; std::vector applications; std::vector capabilities; std::vector dependencies; bool isMsResourceLabel (LPCSTR lpstr) { if (!lpstr) return false; const std::string mslabel ("ms-resource:"); std::string sub = StringTrim (std::string (lpstr)).substr (0, mslabel.length ()); return LabelEqual (sub, mslabel); } bool isMsResourceLabel (LPCWSTR lpstr) { if (!lpstr) return false; const std::wstring mslabel (L"ms-resource:"); std::wstring sub = StringTrim (std::wstring (lpstr)).substr (0, mslabel.length ()); return LabelEqual (sub, mslabel); } bool isMsResourceLabel (std::string objStr) { return isMsResourceLabel (objStr.c_str ()); } bool isMsResourceLabel (std::wstring objStr) { return isMsResourceLabel (objStr.c_str ()); } PackageInfomation (PackageReader &reader) { this->create (reader); } PackageInfomation () {} bool create (PackageReader &reader) { PriReader pri; this->identities.name = reader.getIdentityName (); this->identities.publisher = reader.getIdentityPublisher (); this->identities.version = reader.getIdentityVersion (); reader.getIdentityProcessorArchitecture (this->identities.architectures); reader.getResourceLanguages (this->resources.languages); std::sort (this->resources.languages.begin (), this->resources.languages.end ()); this->properties.name = reader.getPropertyName (); this->properties.publisher = reader.getPropertyPublisher (); this->properties.description = reader.getPropertyDescription (); if (isMsResourceLabel (this->properties.name) || isMsResourceLabel (this->properties.publisher) || isMsResourceLabel (this->properties.description)) { if (pri.create (reader.getPriFileStream ())) { std::wstring temp = this->properties.name; if (isMsResourceLabel (temp)) { std::wstring getres = pri.findStringValue (temp); if (!getres.empty () && getres.length () > 0) temp = std::wstring (L"") + getres; } this->properties.name = temp; temp = this->properties.publisher; if (isMsResourceLabel (temp)) { std::wstring getres = pri.findStringValue (temp); if (!getres.empty () && getres.length () > 0) temp = std::wstring (L"") + getres; } this->properties.description = temp; temp = this->properties.description; if (isMsResourceLabel (temp)) { std::wstring getres = pri.findStringValue (temp); if (!getres.empty () && getres.length () > 0) temp = std::wstring (L"") + getres; } this->properties.publisher = temp; } } this->prerequisites.osMinVersion = reader.getPrerequisiteOSMinVersion (); reader.getApplications (this->applications); reader.getCapabilities (capabilities); reader.getDependencies (dependencies); return reader.isAvailable (); } void destroy () { this->identities.name = L""; this->identities.publisher = L""; this->identities.version = VERSION (0); this->identities.architectures.clear (); this->properties.name = L""; this->properties.description = L""; this->properties.publisher = L""; this->resources.languages.clear (); this->prerequisites.osMinVersion = VERSION (0); this->applications.clear (); this->capabilities.clear (); this->dependencies.clear (); } // 失败返回长度为 0 或空的文本。 std::wstring getIdentityName () { return this->identities.name; } // 失败返回长度为 0 或空的文本。 std::wstring getIdentityPublisher () { return this->identities.publisher; } // 失败返回都为 0 的版本号 VERSION getIdentityVersion () { return this->identities.version; } size_t getIdentityProcessorArchitecture (std::vector &arrOut) { for (auto it : this->identities.architectures) { arrOut.push_back (it); } return arrOut.size (); } size_t getResourceLanguages (std::vector &vec) { for (auto it : this->resources.languages) { vec.push_back (it); } return vec.size (); } std::wstring getPropertyName () { return this->properties.name; } std::wstring getPropertyDescription () { return this->properties.description; } std::wstring getPropertyPublisher () { return this->properties.publisher; } // 失败返回都为 0 的版本号 VERSION getPrerequisiteOSMinVersion () { return this->prerequisites.osMinVersion; } // 判断当前包是否为应用包而不是资源包或依赖项。如果为捆绑包的话判断是否子包中存在应用包。 bool isPackageApplication () { return this->applications.size () > 0; } size_t getApplications (std::vector &output) { for (auto it : this->applications) { output.push_back (it); } return output.size (); } size_t getApplicationUserModelIDs (std::vector &output) { for (auto it : this->applications) { output.push_back (it.getAppUserModelID ()); } return output.size (); } size_t getApplicationIDs (std::vector &output) { for (size_t cnt = 0; cnt < this->applications.size (); cnt ++) { output.push_back (this->applications [cnt] [std::wstring (L"Id")]); } return output.size (); } size_t getApplicationVisualElementsBackgroundColor (std::vector &output) { for (size_t cnt = 0; cnt < this->applications.size (); cnt ++) { output.push_back (this->applications [cnt] [std::wstring (L"BackgroundColor")]); } return output.size (); } size_t getCapabilities (std::vector &output) { for (auto it : this->capabilities) { output.push_back (it); } return output.size (); } size_t getDependencies (std::vector &output) { for (auto it : this->dependencies) { output.push_back (it); } return output.size (); } };