2 * Copyright (c) 2021 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.
17 #include "pkginfo_parcelable.hh"
21 #include "appinfo_parcelable.hh"
23 #include "pkgmgrinfo_private.h"
25 namespace pkgmgr_common {
28 void PkgInfoParcelable::WriteIcon(tizen_base::Parcel* parcel,
30 WriteInt(parcel, g_list_length(icon));
32 for (GList* tmp = icon; tmp; tmp = tmp->next) {
33 icon_x* ptr = reinterpret_cast<icon_x*>(tmp->data);
34 WriteString(parcel, ptr->text);
35 WriteString(parcel, ptr->lang);
36 WriteString(parcel, ptr->section);
37 WriteString(parcel, ptr->size);
38 WriteString(parcel, ptr->resolution);
39 WriteString(parcel, ptr->dpi);
43 void PkgInfoParcelable::WriteLabel(tizen_base::Parcel* parcel,
45 WriteInt(parcel, g_list_length(label));
47 for (GList* tmp = label; tmp; tmp = tmp->next) {
48 label_x* ptr = reinterpret_cast<label_x*>(tmp->data);
49 WriteString(parcel, ptr->lang);
50 WriteString(parcel, ptr->name);
51 WriteString(parcel, ptr->text);
55 void PkgInfoParcelable::WriteAuthor(tizen_base::Parcel* parcel,
56 GList* author) const {
57 WriteInt(parcel, g_list_length(author));
59 for (GList* tmp = author; tmp; tmp = tmp->next) {
60 author_x* ptr = reinterpret_cast<author_x*>(tmp->data);
61 WriteString(parcel, ptr->email);
62 WriteString(parcel, ptr->href);
63 WriteString(parcel, ptr->text);
64 WriteString(parcel, ptr->lang);
68 void PkgInfoParcelable::WriteDescription(tizen_base::Parcel* parcel,
69 GList* description) const {
70 WriteInt(parcel, g_list_length(description));
72 for (GList* tmp = description; tmp; tmp = tmp->next) {
73 description_x* ptr = reinterpret_cast<description_x*>(tmp->data);
74 WriteString(parcel, ptr->name);
75 WriteString(parcel, ptr->text);
76 WriteString(parcel, ptr->lang);
80 void PkgInfoParcelable::WriteLicense(tizen_base::Parcel* parcel,
81 GList* license) const {
85 void PkgInfoParcelable::WritePrivileges(tizen_base::Parcel* parcel,
86 GList* privileges) const {
87 WriteInt(parcel, g_list_length(privileges));
89 for (GList* tmp = privileges; tmp; tmp = tmp->next) {
90 privilege_x* ptr = reinterpret_cast<privilege_x*>(tmp->data);
91 WriteString(parcel, ptr->type);
92 WriteString(parcel, ptr->value);
96 void PkgInfoParcelable::WriteAppdefinedPrivileges(tizen_base::Parcel* parcel,
97 GList* appdefined_privileges) const {
98 WriteInt(parcel, g_list_length(appdefined_privileges));
100 for (GList* tmp = appdefined_privileges; tmp; tmp = tmp->next) {
101 appdefined_privilege_x* ptr =
102 reinterpret_cast<appdefined_privilege_x*>(tmp->data);
103 WriteString(parcel, ptr->type);
104 WriteString(parcel, ptr->value);
105 WriteString(parcel, ptr->license);
109 void PkgInfoParcelable::WriteProvidesAppdefinedPrivileges(
110 tizen_base::Parcel* parcel, GList* provides_appdefined_privileges) const {
111 WriteInt(parcel, g_list_length(provides_appdefined_privileges));
113 for (GList* tmp = provides_appdefined_privileges; tmp; tmp = tmp->next) {
114 appdefined_privilege_x* ptr =
115 reinterpret_cast<appdefined_privilege_x*>(tmp->data);
116 WriteString(parcel, ptr->type);
117 WriteString(parcel, ptr->value);
118 WriteString(parcel, ptr->license);
122 void PkgInfoParcelable::WriteApplication(tizen_base::Parcel* parcel,
123 GList* application) const {
124 std::vector<std::shared_ptr<application_x>> app_vt;
126 for (GList* tmp = application; tmp; tmp = tmp->next) {
127 application_x* ptr = reinterpret_cast<application_x*>(tmp->data);
128 app_vt.emplace_back(ptr, [] (application_x*) -> void {});
131 AppInfoParcelable apps(0, std::move(app_vt), false);
133 parcel->WriteParcelable(apps);
136 void PkgInfoParcelable::WriteCompatibility(tizen_base::Parcel* parcel,
137 GList* compatibility) const {
141 void PkgInfoParcelable::WriteDeviceprofile(tizen_base::Parcel* parcel,
142 GList* deviceprofile) const {
143 WriteInt(parcel, g_list_length(deviceprofile));
145 for (GList* tmp = deviceprofile; tmp; tmp = tmp->next)
146 WriteString(parcel, reinterpret_cast<char*>(tmp->data));
149 void PkgInfoParcelable::WriteDependencies(tizen_base::Parcel* parcel,
150 GList* dependencies) const {
151 WriteInt(parcel, g_list_length(dependencies));
153 for (GList* tmp = dependencies; tmp; tmp = tmp->next) {
154 dependency_x* ptr = reinterpret_cast<dependency_x*>(tmp->data);
155 WriteString(parcel, ptr->depends_on);
156 WriteString(parcel, ptr->type);
157 WriteString(parcel, ptr->required_version);
161 void PkgInfoParcelable::WritePlugin(tizen_base::Parcel* parcel,
162 GList* plugin) const {
163 WriteInt(parcel, g_list_length(plugin));
165 for (GList* tmp = plugin; tmp; tmp = tmp->next) {
166 plugin_x* ptr = reinterpret_cast<plugin_x*>(tmp->data);
167 WriteString(parcel, ptr->pkgid);
168 WriteString(parcel, ptr->appid);
169 WriteString(parcel, ptr->plugin_type);
170 WriteString(parcel, ptr->plugin_name);
174 void PkgInfoParcelable::WriteResAllowedPackages(tizen_base::Parcel* parcel,
175 GList* res_allowed_packages) const {
176 WriteInt(parcel, g_list_length(res_allowed_packages));
178 for (GList* tmp = res_allowed_packages; tmp; tmp = tmp->next) {
179 res_allowed_package_x* ptr =
180 reinterpret_cast<res_allowed_package_x*>(tmp->data);
181 WriteString(parcel, ptr->allowed_package);
183 WriteInt(parcel, g_list_length(ptr->required_privileges));
184 for (GList* priv = ptr->required_privileges; priv; priv = priv->next)
185 WriteString(parcel, reinterpret_cast<char*>(priv->data));
189 void PkgInfoParcelable::WriteMetadata(tizen_base::Parcel* parcel,
190 GList* metadata) const {
191 WriteInt(parcel, g_list_length(metadata));
193 for (GList* tmp = metadata; tmp; tmp = tmp->next) {
194 metadata_x* ptr = reinterpret_cast<metadata_x*>(tmp->data);
195 WriteString(parcel, ptr->key);
196 WriteString(parcel, ptr->value);
200 void PkgInfoParcelable::WritePackage(tizen_base::Parcel* parcel,
201 package_x* package) const {
202 WriteString(parcel, package->for_all_users);
203 WriteString(parcel, package->package);
204 WriteString(parcel, package->version);
205 WriteString(parcel, package->installlocation);
206 WriteString(parcel, package->ns);
207 WriteString(parcel, package->removable);
208 WriteString(parcel, package->preload);
209 WriteString(parcel, package->readonly);
210 WriteString(parcel, package->update);
211 WriteString(parcel, package->appsetting);
212 WriteString(parcel, package->system);
213 WriteString(parcel, package->type);
214 WriteString(parcel, package->package_size);
215 WriteString(parcel, package->installed_time);
216 WriteString(parcel, package->installed_storage);
217 WriteString(parcel, package->storeclient_id);
218 WriteString(parcel, package->mainapp_id);
219 WriteString(parcel, package->package_url);
220 WriteString(parcel, package->root_path);
221 WriteString(parcel, package->csc_path);
222 WriteString(parcel, package->nodisplay_setting);
223 WriteString(parcel, package->support_mode);
224 WriteString(parcel, package->support_disable);
225 WriteString(parcel, package->api_version);
226 WriteString(parcel, package->tep_name);
227 WriteString(parcel, package->zip_mount_file);
228 WriteString(parcel, package->backend_installer);
229 WriteString(parcel, package->external_path);
230 WriteString(parcel, package->use_system_certs);
231 WriteString(parcel, package->locale);
232 WriteString(parcel, package->res_type);
233 WriteString(parcel, package->res_version);
234 WriteString(parcel, package->lib);
235 WriteString(parcel, package->is_disabled);
236 WriteString(parcel, package->light_user_switch_mode);
237 WriteIcon(parcel, package->icon);
238 WriteLabel(parcel, package->label);
239 WriteAuthor(parcel, package->author);
240 WriteDescription(parcel, package->description);
241 WritePrivileges(parcel, package->privileges);
242 WriteAppdefinedPrivileges(parcel, package->appdefined_privileges);
243 WriteProvidesAppdefinedPrivileges(parcel,
244 package->provides_appdefined_privileges);
245 WriteApplication(parcel, package->application);
246 WriteDeviceprofile(parcel, package->deviceprofile);
247 WriteDependencies(parcel, package->dependencies);
248 WritePlugin(parcel, package->plugin);
249 WriteResAllowedPackages(parcel, package->res_allowed_packages);
250 WriteMetadata(parcel, package->metadata);
253 void PkgInfoParcelable::ReadIcon(tizen_base::Parcel* parcel, GList** list) {
255 ReadInt(parcel, &size);
257 for (int i = 0; i < size; ++i) {
258 icon_x* icon = reinterpret_cast<icon_x*>(calloc(1, sizeof(icon_x)));
259 ReadString(parcel, &icon->text);
260 ReadString(parcel, &icon->lang);
261 ReadString(parcel, &icon->section);
262 ReadString(parcel, &icon->size);
263 ReadString(parcel, &icon->resolution);
264 ReadString(parcel, &icon->dpi);
266 *list = g_list_append(*list, icon);
270 void PkgInfoParcelable::ReadLabel(tizen_base::Parcel* parcel, GList** list) {
272 ReadInt(parcel, &size);
274 for (int i = 0; i < size; ++i) {
275 label_x* label = reinterpret_cast<label_x*>(calloc(1, sizeof(label_x)));
276 ReadString(parcel, &label->lang);
277 ReadString(parcel, &label->name);
278 ReadString(parcel, &label->text);
280 *list = g_list_append(*list, label);
284 void PkgInfoParcelable::ReadAuthor(tizen_base::Parcel* parcel, GList** list) {
286 ReadInt(parcel, &size);
288 for (int i = 0; i < size; ++i) {
289 author_x* author = reinterpret_cast<author_x*>(
290 calloc(1, sizeof(author_x)));
291 ReadString(parcel, &author->email);
292 ReadString(parcel, &author->href);
293 ReadString(parcel, &author->text);
294 ReadString(parcel, &author->lang);
296 *list = g_list_append(*list, author);
300 void PkgInfoParcelable::ReadDescription(
301 tizen_base::Parcel* parcel, GList** list) {
303 ReadInt(parcel, &size);
305 for (int i = 0; i < size; ++i) {
306 description_x* description =
307 reinterpret_cast<description_x*>(calloc(1, sizeof(description_x)));
308 ReadString(parcel, &description->name);
309 ReadString(parcel, &description->text);
310 ReadString(parcel, &description->lang);
312 *list = g_list_append(*list, description);
316 void PkgInfoParcelable::ReadLicense(tizen_base::Parcel* parcel, GList** list) {
320 void PkgInfoParcelable::ReadPrivileges(
321 tizen_base::Parcel* parcel, GList** list) {
323 ReadInt(parcel, &size);
325 for (int i = 0; i < size; ++i) {
326 privilege_x* privilege =
327 reinterpret_cast<privilege_x*>(calloc(1, sizeof(privilege_x)));
328 ReadString(parcel, &privilege->type);
329 ReadString(parcel, &privilege->value);
331 *list = g_list_append(*list, privilege);
335 void PkgInfoParcelable::ReadAppdefinedPrivileges(
336 tizen_base::Parcel* parcel, GList** list) {
338 ReadInt(parcel, &size);
340 for (int i = 0; i < size; ++i) {
341 appdefined_privilege_x* appdefined_privilege =
342 reinterpret_cast<appdefined_privilege_x*>(
343 calloc(1, sizeof(appdefined_privilege_x)));
344 ReadString(parcel, &appdefined_privilege->type);
345 ReadString(parcel, &appdefined_privilege->value);
346 ReadString(parcel, &appdefined_privilege->license);
348 *list = g_list_append(*list, appdefined_privilege);
352 void PkgInfoParcelable::ReadProvidesAppdefinedPrivileges(
353 tizen_base::Parcel* parcel, GList** list) {
355 ReadInt(parcel, &size);
357 for (int i = 0; i < size; ++i) {
358 appdefined_privilege_x* appdefined_privilege =
359 reinterpret_cast<appdefined_privilege_x*>(
360 calloc(1, sizeof(appdefined_privilege_x)));
361 ReadString(parcel, &appdefined_privilege->type);
362 ReadString(parcel, &appdefined_privilege->value);
363 ReadString(parcel, &appdefined_privilege->license);
365 *list = g_list_append(*list, appdefined_privilege);
369 void PkgInfoParcelable::ReadApplication(
370 tizen_base::Parcel* parcel, GList** list) {
371 AppInfoParcelable apps;
372 parcel->ReadParcelable(&apps);
374 std::vector<std::shared_ptr<application_x>> vt = apps.ExtractAppInfo();
376 for (auto& application : vt)
377 *list = g_list_append(*list, application.get());
380 void PkgInfoParcelable::ReadCompatibility(
381 tizen_base::Parcel* parcel, GList** list) {
385 void PkgInfoParcelable::ReadDeviceprofile(
386 tizen_base::Parcel* parcel, GList** list) {
388 ReadInt(parcel, &size);
390 for (int i = 0; i < size; ++i) {
391 char* device_profile = nullptr;
392 ReadString(parcel, &device_profile);
393 *list = g_list_append(*list, device_profile);
397 void PkgInfoParcelable::ReadDependencies(
398 tizen_base::Parcel* parcel, GList** list) {
400 ReadInt(parcel, &size);
402 for (int i = 0; i < size; ++i) {
403 dependency_x* dependendy =
404 reinterpret_cast<dependency_x*>(calloc(1, sizeof(dependency_x)));
405 ReadString(parcel, &dependendy->depends_on);
406 ReadString(parcel, &dependendy->type);
407 ReadString(parcel, &dependendy->required_version);
409 *list = g_list_append(*list, dependendy);
413 void PkgInfoParcelable::ReadPlugin(tizen_base::Parcel* parcel, GList** list) {
415 ReadInt(parcel, &size);
417 for (int i = 0; i < size; ++i) {
418 plugin_x* plugin = reinterpret_cast<plugin_x*>(
419 calloc(1, sizeof(plugin_x)));
420 ReadString(parcel, &plugin->pkgid);
421 ReadString(parcel, &plugin->appid);
422 ReadString(parcel, &plugin->plugin_type);
423 ReadString(parcel, &plugin->plugin_name);
425 *list = g_list_append(*list, plugin);
429 void PkgInfoParcelable::ReadResAllowedPackages(tizen_base::Parcel* parcel,
432 ReadInt(parcel, &size);
434 for (int i = 0; i < size; ++i) {
435 res_allowed_package_x* res_allowed_package =
436 reinterpret_cast<res_allowed_package_x*>(
437 calloc(1, sizeof(res_allowed_package_x)));
438 ReadString(parcel, &res_allowed_package->allowed_package);
441 GList* priv_list = nullptr;
442 ReadInt(parcel, &priv_len);
443 for (int i = 0; i < priv_len; ++i) {
444 char* priv = nullptr;
445 ReadString(parcel, &priv);
446 priv_list = g_list_prepend(priv_list, priv);
448 res_allowed_package->required_privileges = priv_list;
450 *list = g_list_prepend(*list, res_allowed_package);
454 void PkgInfoParcelable::ReadMetadata(tizen_base::Parcel* parcel, GList** list) {
456 ReadInt(parcel, &size);
458 for (int i = 0; i < size; ++i) {
459 metadata_x* metadata =
460 reinterpret_cast<metadata_x*>(calloc(1, sizeof(metadata_x)));
461 ReadString(parcel, &metadata->key);
462 ReadString(parcel, &metadata->value);
464 *list = g_list_append(*list, metadata);
468 package_x* PkgInfoParcelable::ReadPackage(tizen_base::Parcel* parcel) {
470 reinterpret_cast<package_x*>(calloc(1, sizeof(package_x)));
472 ReadString(parcel, &package->for_all_users);
473 ReadString(parcel, &package->package);
474 ReadString(parcel, &package->version);
475 ReadString(parcel, &package->installlocation);
476 ReadString(parcel, &package->ns);
477 ReadString(parcel, &package->removable);
478 ReadString(parcel, &package->preload);
479 ReadString(parcel, &package->readonly);
480 ReadString(parcel, &package->update);
481 ReadString(parcel, &package->appsetting);
482 ReadString(parcel, &package->system);
483 ReadString(parcel, &package->type);
484 ReadString(parcel, &package->package_size);
485 ReadString(parcel, &package->installed_time);
486 ReadString(parcel, &package->installed_storage);
487 ReadString(parcel, &package->storeclient_id);
488 ReadString(parcel, &package->mainapp_id);
489 ReadString(parcel, &package->package_url);
490 ReadString(parcel, &package->root_path);
491 ReadString(parcel, &package->csc_path);
492 ReadString(parcel, &package->nodisplay_setting);
493 ReadString(parcel, &package->support_mode);
494 ReadString(parcel, &package->support_disable);
495 ReadString(parcel, &package->api_version);
496 ReadString(parcel, &package->tep_name);
497 ReadString(parcel, &package->zip_mount_file);
498 ReadString(parcel, &package->backend_installer);
499 ReadString(parcel, &package->external_path);
500 ReadString(parcel, &package->use_system_certs);
501 ReadString(parcel, &package->locale);
502 ReadString(parcel, &package->res_type);
503 ReadString(parcel, &package->res_version);
504 ReadString(parcel, &package->lib);
505 ReadString(parcel, &package->is_disabled);
506 ReadString(parcel, &package->light_user_switch_mode);
507 ReadIcon(parcel, &package->icon);
508 ReadLabel(parcel, &package->label);
509 ReadAuthor(parcel, &package->author);
510 ReadDescription(parcel, &package->description);
511 ReadPrivileges(parcel, &package->privileges);
512 ReadAppdefinedPrivileges(parcel, &package->appdefined_privileges);
513 ReadProvidesAppdefinedPrivileges(parcel,
514 &package->provides_appdefined_privileges);
515 ReadApplication(parcel, &package->application);
516 ReadDeviceprofile(parcel, &package->deviceprofile);
517 ReadDependencies(parcel, &package->dependencies);
518 ReadPlugin(parcel, &package->plugin);
519 ReadResAllowedPackages(parcel, &package->res_allowed_packages);
520 ReadMetadata(parcel, &package->metadata);
525 PkgInfoParcelable::PkgInfoParcelable()
526 : AbstractParcelable(0, ParcelableType::PkgInfo),
527 write_type_(PkgWriteType::None), auto_release_(true) {}
529 PkgInfoParcelable::PkgInfoParcelable(
530 uid_t uid, std::vector<std::shared_ptr<package_x>>&& pkg_list,
531 PkgWriteType write_type, bool auto_release)
532 : AbstractParcelable(uid, ParcelableType::PkgInfo),
533 pkg_list_(std::move(pkg_list)), write_type_(write_type),
534 auto_release_(auto_release) {}
536 PkgInfoParcelable::PkgInfoParcelable(
537 int ret, std::vector<std::shared_ptr<package_x>>&& pkg_list,
539 : AbstractParcelable(0, ParcelableType::PkgInfo, ret),
540 pkg_list_(std::move(pkg_list)), write_type_(PkgWriteType::None),
541 auto_release_(auto_release) {}
543 PkgInfoParcelable::~PkgInfoParcelable() {
546 const std::vector<std::shared_ptr<package_x>>& PkgInfoParcelable::GetPkgInfo() {
550 std::vector<std::shared_ptr<package_x>> PkgInfoParcelable::ExtractPkgInfo() {
551 return std::move(pkg_list_);
554 PkgWriteType PkgInfoParcelable::GetWriteType() {
558 void PkgInfoParcelable::WriteToParcel(tizen_base::Parcel* parcel) const {
559 AbstractParcelable::WriteToParcel(parcel);
560 WriteInt(parcel, static_cast<int>(write_type_));
562 WriteInt(parcel, pkg_list_.size());
564 for (auto& pkg : pkg_list_)
565 WritePackage(parcel, pkg.get());
568 void PkgInfoParcelable::ReadFromParcel(tizen_base::Parcel* parcel) {
572 AbstractParcelable::ReadFromParcel(parcel);
574 ReadInt(parcel, &write_type);
575 write_type_ = static_cast<PkgWriteType>(write_type);
577 ReadInt(parcel, &len);
579 for (int i = 0; i < len ; ++i)
580 pkg_list_.emplace_back(ReadPackage(parcel), [] (package_x*) -> void {});
583 } // namespace parcel
584 } // namespace pkgmgr_common