-extern "C" EXPORT_API int _certinfo_compare_pkg_certinfo(const char *l_pkgid,
- const char *r_pkgid, pkgmgrinfo_cert_compare_result_type_e *result) {
- char *query = sqlite3_mprintf("SELECT package, "
- "COALESCE(author_signer_cert, -1) FROM package_cert_info WHERE "
- "package IN (%Q, %Q)", l_pkgid, r_pkgid);
- if (query == nullptr) {
- LOG(ERROR) << "Out of memory";
- return PMINFO_R_ERROR;
- }
- std::vector<std::string> queries;
- queries.emplace_back(query);
- sqlite3_free(query);
-
- std::shared_ptr<pkgmgr_common::parcel::AbstractParcelable> parcelable(
- new pkgmgr_common::parcel::QueryParcelable(0, queries,
- pkgmgr_common::database::AbstractDBHandler::DBType::DB_TYPE_FILE_CERTDB,
- pkgmgr_common::database::AbstractDBHandler::OperationType::OPERATION_TYPE_READ));
- pkgmgr_client::PkgInfoClient client(parcelable, 0,
- pkgmgr_common::ReqType::QUERY);
- if (!client.SendRequest()) {
- return PMINFO_R_ERROR;
- }
-
- auto ptr = client.GetResultParcel();
- if (ptr == nullptr) {
- LOG(ERROR) << "Fail to get return parcelable";
- return PMINFO_R_ERROR;
- }
-
- if (ptr->GetRequestResult() != PMINFO_R_OK) {
- LOG(ERROR) << "Request fail";
- return ptr->GetRequestResult();
- }
-
- if (ptr->GetType() != pkgmgr_common::parcel::ParcelableType::Result) {
- LOG(ERROR) << "Invalid parcelable type";
- return PMINFO_R_ERROR;
- }
-
- std::shared_ptr<pkgmgr_common::parcel::ResultParcelable> return_parcel(
- std::static_pointer_cast<pkgmgr_common::parcel::ResultParcelable>(
- ptr));
-
- auto certinfo_list = return_parcel->GetResult();
- if (certinfo_list.size() != 2)
- return PMINFO_R_ERROR;
-
- std::map<std::string, std::string> result_map;
- for (auto& certinfo : certinfo_list)
- result_map.insert(make_pair(certinfo.front(), certinfo.back()));
-
- if (result_map.find(std::string(l_pkgid))->second == "-1" &&
- result_map.find(std::string(r_pkgid))->second == "-1")
- *result = PMINFO_CERT_COMPARE_BOTH_NO_CERT;
- else if (result_map.find(std::string(l_pkgid))->second == "-1")
- *result = PMINFO_CERT_COMPARE_LHS_NO_CERT;
- else if (result_map.find(std::string(r_pkgid))->second == "-1")
- *result = PMINFO_CERT_COMPARE_RHS_NO_CERT;
- else if (result_map.find(std::string(l_pkgid))->second ==
- result_map.find(std::string(r_pkgid))->second)
- *result = PMINFO_CERT_COMPARE_MATCH;
- else
- *result = PMINFO_CERT_COMPARE_MISMATCH;
-
- return PMINFO_R_OK;
+extern "C" EXPORT_API int _certinfo_compare_pkg_certinfo(const char* l_pkgid,
+ const char* r_pkgid, pkgmgrinfo_cert_compare_result_type_e* result) {
+ std::shared_ptr<pcp::AbstractParcelable> parcelable(
+ new pcp::QueryParcelable(0,
+ { QUERY_INDEX_CERTINFO_COMPARE_PKG_CERTINFO, { l_pkgid, r_pkgid } },
+ pkgmgr_common::DBType::DB_TYPE_FILE_CERTDB,
+ pkgmgr_common::DBOperationType::OPERATION_TYPE_READ));
+ pkgmgr_client::PkgInfoClient client(parcelable, 0,
+ pkgmgr_common::ReqType::READ_QUERY);
+ if (!client.SendRequest())
+ return PMINFO_R_ERROR;
+
+ auto ptr = client.GetResultParcel();
+ int ret = ValidateParcelable(ptr, pcp::ParcelableType::Result);
+ if (ret != PMINFO_R_OK)
+ return ret;
+
+ std::shared_ptr<pcp::ResultParcelable> return_parcel(
+ std::static_pointer_cast<pcp::ResultParcelable>(
+ ptr));
+
+ auto& certinfo_list = return_parcel->GetResult();
+
+ std::map<std::string, std::string> result_map;
+ result_map.insert(make_pair(std::string(l_pkgid), "-1"));
+ result_map.insert(make_pair(std::string(r_pkgid), "-1"));
+
+ for (auto& certinfo : certinfo_list)
+ result_map[*certinfo.front()] = *certinfo.back();
+
+ auto l_iter = result_map.find(l_pkgid);
+ auto r_iter = result_map.find(r_pkgid);
+ if (l_iter->second == "-1" && r_iter->second == "-1")
+ *result = PMINFO_CERT_COMPARE_BOTH_NO_CERT;
+ else if (l_iter->second == "-1")
+ *result = PMINFO_CERT_COMPARE_LHS_NO_CERT;
+ else if (r_iter->second == "-1")
+ *result = PMINFO_CERT_COMPARE_RHS_NO_CERT;
+ else if (l_iter->second == r_iter->second)
+ *result = PMINFO_CERT_COMPARE_MATCH;
+ else
+ *result = PMINFO_CERT_COMPARE_MISMATCH;
+
+ return PMINFO_R_OK;