2 * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.Collections.Generic;
19 using System.Runtime.InteropServices;
21 namespace Tizen.Applications
24 /// This class provides the methods and properties to get information about the package archive.
26 /// <since_tizen> 6 </since_tizen>
27 public class PackageArchive
29 private const string LogTag = "Tizen.Applications";
31 private string _path = string.Empty;
32 private string _id = string.Empty;
33 private string _type = string.Empty;
34 private string _version = string.Empty;
35 private string _apiVersion = string.Empty;
36 private string _description = string.Empty;
37 private string _label = string.Empty;
38 private string _author = string.Empty;
39 private IntPtr _icon = IntPtr.Zero;
40 private int _iconSize = 0;
41 private List<PackageDependencyInformation> _dependency_to;
43 private PackageArchive(string archivePath)
51 /// <since_tizen> 6 </since_tizen>
52 public string Id { get { return _id; } }
55 /// Type of the package.
57 /// <since_tizen> 6 </since_tizen>
58 public string Type { get { return _type; } }
61 /// Version of the package.
63 /// <since_tizen> 6 </since_tizen>
64 public string Version { get { return _version; } }
67 /// Api version of the package.
69 /// <since_tizen> 6 </since_tizen>
70 public string ApiVersion { get { return _apiVersion; } }
73 /// Description of the package.
75 /// <since_tizen> 6 </since_tizen>
76 public string Description { get { return _description; } }
79 /// Label of the package.
81 /// <since_tizen> 6 </since_tizen>
82 public string Label { get { return _label; } }
85 /// Author of the package.
87 /// <since_tizen> 6 </since_tizen>
88 public string Author { get { return _author; } }
91 /// Icon of the package.
93 /// <since_tizen> 6 </since_tizen>
98 byte[] byteArray = new byte[_iconSize];
99 Marshal.Copy(_icon, byteArray, 0, _iconSize);
105 /// Packages that this package is required.
107 /// <since_tizen> 6 </since_tizen>
108 public List<PackageDependencyInformation> DependencyTo { get { return _dependency_to; } }
110 // This method assumes that given arguments are already validated and have valid values.
111 internal static PackageArchive CreatePackageArchive(IntPtr handle, string archivePath)
113 PackageArchive packageArchive = new PackageArchive(archivePath);
115 var err = Interop.PackageManager.ErrorCode.None;
116 err = Interop.PackageArchive.PackageArchiveInfoGetPackage(handle, out packageArchive._id);
117 if (err != Interop.PackageManager.ErrorCode.None)
119 Log.Warn(LogTag, "Failed to get package id from " + archivePath);
121 err = Interop.PackageArchive.PackageArchiveInfoGetType(handle, out packageArchive._type);
122 if (err != Interop.PackageManager.ErrorCode.None)
124 Log.Warn(LogTag, "Failed to get package type from " + archivePath);
126 err = Interop.PackageArchive.PackageArchiveInfoGetVersion(handle, out packageArchive._version);
127 if (err != Interop.PackageManager.ErrorCode.None)
129 Log.Warn(LogTag, "Failed to get package version from " + archivePath);
131 err = Interop.PackageArchive.PackageArchiveInfoGetApiVersion(handle, out packageArchive._apiVersion);
132 if (err != Interop.PackageManager.ErrorCode.None)
134 Log.Warn(LogTag, "Failed to get package api version from " + archivePath);
136 err = Interop.PackageArchive.PackageArchiveInfoGetDescription(handle, out packageArchive._description);
137 if (err != Interop.PackageManager.ErrorCode.None)
139 Log.Warn(LogTag, "Failed to get package description from " + archivePath);
141 err = Interop.PackageArchive.PackageArchiveInfoGetLabel(handle, out packageArchive._label);
142 if (err != Interop.PackageManager.ErrorCode.None)
144 Log.Warn(LogTag, "Failed to get package label from " + archivePath);
146 err = Interop.PackageArchive.PackageArchiveInfoGetAuthor(handle, out packageArchive._author);
147 if (err != Interop.PackageManager.ErrorCode.None)
149 Log.Warn(LogTag, "Failed to get package author from " + archivePath);
151 err = Interop.PackageArchive.PackageArchiveInfoGetIcon(handle, out packageArchive._icon, out packageArchive._iconSize);
152 if (err != Interop.PackageManager.ErrorCode.None)
154 Log.Warn(LogTag, "Failed to get package author from " + archivePath);
156 packageArchive._dependency_to = GetPackageArchiveDependencyInformation(handle);
158 return packageArchive;
161 internal static PackageArchive GetPackageArchive(string archivePath)
163 IntPtr packageArchiveInfoHandle;
164 Interop.PackageManager.ErrorCode err = Interop.PackageArchive.PackageArchiveInfoCreate(archivePath, out packageArchiveInfoHandle);
165 if (err != Interop.PackageManager.ErrorCode.None)
167 throw PackageManagerErrorFactory.GetException(err, string.Format("Failed to create native handle for package archive info of {0}", archivePath));
170 PackageArchive packageArchive = CreatePackageArchive(packageArchiveInfoHandle, archivePath);
172 err = Interop.PackageArchive.PackageArchiveInfoDestroy(packageArchiveInfoHandle);
173 if (err != Interop.PackageManager.ErrorCode.None)
175 Log.Warn(LogTag, string.Format("Failed to destroy native handle for package archive info of {0}. err = {1}", archivePath, err));
177 return packageArchive;
180 private static List<PackageDependencyInformation> GetPackageArchiveDependencyInformation(IntPtr handle)
182 List<PackageDependencyInformation> dependencies = new List<PackageDependencyInformation>();
183 Interop.Package.PackageInfoDependencyInfoCallback dependencyInfoCb = (from, to, type, requiredVersion, userData) =>
185 dependencies.Add(PackageDependencyInformation.GetPackageDependencyInformation(from, to, type, requiredVersion));
189 Interop.PackageManager.ErrorCode err = Interop.PackageArchive.PackageArchiveInfoForeachDirectDependency(handle, dependencyInfoCb, IntPtr.Zero);
190 if (err != Interop.PackageManager.ErrorCode.None)
192 Log.Warn(LogTag, string.Format("Failed to get dependency info. err = {0}", err));