[Tizen.Applications.PackageManager] Add API for package archive info (#739)
[platform/core/csapi/tizenfx.git] / src / Tizen.Applications.PackageManager / Tizen.Applications / PackageArchive.cs
1 /*
2  * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 using System;
18 using System.Runtime.InteropServices;
19
20 namespace Tizen.Applications
21 {
22     /// <summary>
23     /// This class provides the methods and properties to get information about the package archive.
24     /// </summary>
25     /// <since_tizen> 6 </since_tizen>
26     public class PackageArchive
27     {
28         private const string LogTag = "Tizen.Applications";
29
30         private string _path = string.Empty;
31         private string _id = string.Empty;
32         private string _type = string.Empty;
33         private string _version = string.Empty;
34         private string _apiVersion = string.Empty;
35         private string _description = string.Empty;
36         private string _label = string.Empty;
37         private string _author = string.Empty;
38         private IntPtr _icon = IntPtr.Zero;
39         private int _iconSize = 0;
40
41         private PackageArchive(string archivePath)
42         {
43             _path = archivePath;
44         }
45
46         /// <summary>
47         /// The package ID.
48         /// </summary>
49         /// <since_tizen> 6 </since_tizen>
50         public string Id { get { return _id; } }
51
52         /// <summary>
53         /// Type of the package.
54         /// </summary>
55         /// <since_tizen> 6 </since_tizen>
56         public string Type { get { return _type; } }
57
58         /// <summary>
59         /// Version of the package.
60         /// </summary>
61         /// <since_tizen> 6 </since_tizen>
62         public string Version { get { return _version; } }
63
64         /// <summary>
65         /// Api version of the package.
66         /// </summary>
67         /// <since_tizen> 6 </since_tizen>
68         public string ApiVersion { get { return _apiVersion; } }
69
70         /// <summary>
71         /// Description of the package.
72         /// </summary>
73         /// <since_tizen> 6 </since_tizen>
74         public string Description { get { return _description; } }
75
76         /// <summary>
77         /// Label of the package.
78         /// </summary>
79         /// <since_tizen> 6 </since_tizen>
80         public string Label { get { return _label; } }
81
82         /// <summary>
83         /// Author of the package.
84         /// </summary>
85         /// <since_tizen> 6 </since_tizen>
86         public string Author { get { return _author; } }
87
88         /// <summary>
89         /// Icon of the package.
90         /// </summary>
91         /// <since_tizen> 6 </since_tizen>
92         public byte[] Icon
93         {
94             get
95             {
96                 byte[] byteArray = new byte[_iconSize];
97                 Marshal.Copy(_icon, byteArray, 0, _iconSize);
98                 return byteArray;
99             }
100         }
101
102         // This method assumes that given arguments are already validated and have valid values.
103         internal static PackageArchive CreatePackageArchive(IntPtr handle, string archivePath)
104         {
105             PackageArchive packageArchive = new PackageArchive(archivePath);
106
107             var err = Interop.PackageManager.ErrorCode.None;
108             err = Interop.PackageArchive.PackageArchiveInfoGetPackage(handle, out packageArchive._id);
109             if (err != Interop.PackageManager.ErrorCode.None)
110             {
111                 Log.Warn(LogTag, "Failed to get package id from " + archivePath);
112             }
113             err = Interop.PackageArchive.PackageArchiveInfoGetType(handle, out packageArchive._type);
114             if (err != Interop.PackageManager.ErrorCode.None)
115             {
116                 Log.Warn(LogTag, "Failed to get package type from " + archivePath);
117             }
118             err = Interop.PackageArchive.PackageArchiveInfoGetVersion(handle, out packageArchive._version);
119             if (err != Interop.PackageManager.ErrorCode.None)
120             {
121                 Log.Warn(LogTag, "Failed to get package version from " + archivePath);
122             }
123             err = Interop.PackageArchive.PackageArchiveInfoGetApiVersion(handle, out packageArchive._apiVersion);
124             if (err != Interop.PackageManager.ErrorCode.None)
125             {
126                 Log.Warn(LogTag, "Failed to get package api version from " + archivePath);
127             }
128             err = Interop.PackageArchive.PackageArchiveInfoGetDescription(handle, out packageArchive._description);
129             if (err != Interop.PackageManager.ErrorCode.None)
130             {
131                 Log.Warn(LogTag, "Failed to get package description from " + archivePath);
132             }
133             err = Interop.PackageArchive.PackageArchiveInfoGetLabel(handle, out packageArchive._label);
134             if (err != Interop.PackageManager.ErrorCode.None)
135             {
136                 Log.Warn(LogTag, "Failed to get package label from " + archivePath);
137             }
138             err = Interop.PackageArchive.PackageArchiveInfoGetAuthor(handle, out packageArchive._author);
139             if (err != Interop.PackageManager.ErrorCode.None)
140             {
141                 Log.Warn(LogTag, "Failed to get package author from " + archivePath);
142             }
143             err = Interop.PackageArchive.PackageArchiveInfoGetIcon(handle, out packageArchive._icon, out packageArchive._iconSize);
144             if (err != Interop.PackageManager.ErrorCode.None)
145             {
146                 Log.Warn(LogTag, "Failed to get package author from " + archivePath);
147             }
148
149             return packageArchive;
150         }
151
152         internal static PackageArchive GetPackageArchive(string archivePath)
153         {
154             IntPtr packageArchiveInfoHandle;
155             Interop.PackageManager.ErrorCode err = Interop.PackageArchive.PackageArchiveInfoCreate(archivePath, out packageArchiveInfoHandle);
156             if (err != Interop.PackageManager.ErrorCode.None)
157             {
158                 throw PackageManagerErrorFactory.GetException(err, string.Format("Failed to create native handle for package archive info of {0}", archivePath));
159             }
160
161             PackageArchive packageArchive = CreatePackageArchive(packageArchiveInfoHandle, archivePath);
162
163             err = Interop.PackageArchive.PackageArchiveInfoDestroy(packageArchiveInfoHandle);
164             if (err != Interop.PackageManager.ErrorCode.None)
165             {
166                 Log.Warn(LogTag, string.Format("Failed to destroy native handle for package archive info of {0}. err = {1}", archivePath, err));
167             }
168             return packageArchive;
169         }
170     }
171 }