summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJanusz Kozerski <j.kozerski@samsung.com>2015-06-12 11:55:32 +0200
committerJanusz Kozerski <j.kozerski@samsung.com>2015-06-26 13:16:49 +0200
commit5d8a0be19e830c951c32a605e208b7120270bc70 (patch)
treebe9215ca0859288682a03d3e5d50f5002e61f896
parenta282a131cd809c3f425a44f42e30dfb902bca76e (diff)
downloadcert-checker-5d8a0be19e830c951c32a605e208b7120270bc70.tar.gz
cert-checker-5d8a0be19e830c951c32a605e208b7120270bc70.tar.bz2
cert-checker-5d8a0be19e830c951c32a605e208b7120270bc70.zip
Replace pkgmgr signal handling with dbus API
After fix package-manager API using of its API can be restored. [Verication] 1) Build cert-checker with debug and run it on emulator 2) In 2nd console run: journalctl -f | grep cert-checker 3) Install and uninstall app in some random order: install: pkgcmd -i -t wgt -p /usr/share/widget_demo/mancala.wgt -q uninstall: pkgcmd -u -n yKrWwxz1KX -q 4) Check if journal logs are correct Change-Id: I60a77c2862dd9745e1b422fb2eb3afec13b40d14
-rw-r--r--packaging/cert-checker.spec1
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/include/cchecker/logic.h40
-rw-r--r--src/logic.cpp211
-rw-r--r--tests/CMakeLists.txt1
5 files changed, 160 insertions, 94 deletions
diff --git a/packaging/cert-checker.spec b/packaging/cert-checker.spec
index 14a2329..bccc58d 100644
--- a/packaging/cert-checker.spec
+++ b/packaging/cert-checker.spec
@@ -11,7 +11,6 @@ BuildRequires: zip
BuildRequires: pkgconfig(db-util)
BuildRequires: pkgconfig(icu-i18n)
BuildRequires: pkgconfig(glib-2.0)
-BuildRequires: pkgconfig(capi-appfw-package-manager)
BuildRequires: pkgconfig(notification)
BuildRequires: pkgconfig(dbus-1)
BuildRequires: pkgconfig(dbus-glib-1)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 33c6295..2ca361b 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -6,7 +6,6 @@ PKG_CHECK_MODULES(CERT_CHECKER_DEP
glib-2.0
gio-2.0
icu-i18n
- capi-appfw-package-manager
notification
libsystemd-journal
libtzplatform-config
diff --git a/src/include/cchecker/logic.h b/src/include/cchecker/logic.h
index d80ea51..2f4a60b 100644
--- a/src/include/cchecker/logic.h
+++ b/src/include/cchecker/logic.h
@@ -24,7 +24,6 @@
#define CCHECKER_LOGIC_H
#include <gio/gio.h>
-#include <package_manager.h>
#include <string>
#include <vector>
#include <list>
@@ -45,18 +44,25 @@ enum error_t {
DATABASE_ERROR
};
+enum pkgmgr_event_t {
+ EVENT_INSTALL,
+ EVENT_UNINSTALL
+};
+
class Logic {
public:
Logic(void);
virtual ~Logic(void);
error_t setup();
- static void pkg_manager_callback(
- const char *type,
- const char *package,
- package_manager_event_type_e eventType,
- package_manager_event_state_e eventState,
- int progress,
- package_manager_error_e error,
+ static void pkgmgr_install_callback(GDBusProxy *proxy,
+ gchar *sender_name,
+ gchar *signal_name,
+ GVariant *parameters,
+ void *logic_ptr);
+ static void pkgmgr_uninstall_callback(GDBusProxy *proxy,
+ gchar *sender_name,
+ gchar *signal_name,
+ GVariant *parameters,
void *logic_ptr);
static void connman_callback(GDBusProxy *proxy,
gchar *sender_name,
@@ -73,14 +79,24 @@ class Logic {
void pkgmanager_uninstall(const app_t &app);
void get_certs_from_signature(const std::string &signature, std::vector<std::string> &cert);
void load_database_to_buffer();
- error_t register_connman_signal_handler(void);
+ void pkgmgr_callback_internal(GVariant *parameters, pkgmgr_event_t event);
+ error_t register_dbus_signal_handler(GDBusProxy *proxy,
+ const char *name,
+ const char *object_path,
+ const char *interface_name,
+ void (*callback) (GDBusProxy *proxy,
+ gchar *sender_name,
+ gchar *signal_name,
+ GVariant *parameters,
+ void *logic_ptr)
+ );
std::list<app_t> m_buffer;
DB::SqlQuery *m_sqlquery;
bool m_is_online;
- package_manager_h m_request;
- GDBusProxy *m_proxy;
-
+ GDBusProxy *m_proxy_connman;
+ GDBusProxy *m_proxy_pkgmgr_install;
+ GDBusProxy *m_proxy_pkgmgr_uninstall;
};
} // CCHECKER
diff --git a/src/logic.cpp b/src/logic.cpp
index c43c657..10c6a93 100644
--- a/src/logic.cpp
+++ b/src/logic.cpp
@@ -28,32 +28,6 @@
using namespace std;
-namespace {
-
-const char * eventTypeStr(package_manager_event_type_e type) {
- if (type == PACKAGE_MANAGER_EVENT_TYPE_INSTALL)
- return "PACKAGE_MANAGER_EVENT_TYPE_INSTALL";
- if (type == PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL)
- return "PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL";
- if (type == PACKAGE_MANAGER_EVENT_TYPE_UPDATE)
- return "PACKAGE_MANAGER_EVENT_TYPE_UPDATE";
- return "UNKNOWN";
-}
-
-const char * eventStateStr(package_manager_event_state_e type) {
- if (type == PACKAGE_MANAGER_EVENT_STATE_STARTED)
- return "PACKAGE_MANAGER_EVENT_STATE_STARTED";
- if (type == PACKAGE_MANAGER_EVENT_STATE_PROCESSING)
- return "PACKAGE_MANAGER_EVENT_STATE_PROCESSING";
- if (type == PACKAGE_MANAGER_EVENT_STATE_COMPLETED)
- return "PACKAGE_MANAGER_EVENT_STATE_COMPLETED";
- if (type == PACKAGE_MANAGER_EVENT_STATE_FAILED)
- return "PACKAGE_MANAGER_EVENT_STATE_FAILED";
- return "UNKNOWN";
-}
-} //anonymus
-
-
namespace CCHECKER {
const char *const DB_PATH = tzplatform_mkpath(TZ_SYS_DB, ".cert-checker.db");
@@ -61,16 +35,21 @@ const char *const DB_PATH = tzplatform_mkpath(TZ_SYS_DB, ".cert-checker.db");
Logic::~Logic(void)
{
LogDebug("Cert-checker cleaning.");
- if (m_proxy)
- g_object_unref(m_proxy);
- package_manager_destroy(m_request);
+ if (m_proxy_connman)
+ g_object_unref(m_proxy_connman);
+ if (m_proxy_pkgmgr_install)
+ g_object_unref(m_proxy_pkgmgr_install);
+ if (m_proxy_pkgmgr_uninstall)
+ g_object_unref(m_proxy_pkgmgr_uninstall);
delete m_sqlquery;
}
Logic::Logic(void) :
m_sqlquery(NULL),
m_is_online(false),
- m_proxy(NULL)
+ m_proxy_connman(NULL),
+ m_proxy_pkgmgr_install(NULL),
+ m_proxy_pkgmgr_uninstall(NULL)
{}
error_t Logic::setup_db()
@@ -100,24 +79,40 @@ error_t Logic::setup()
return err;
}
- // Add package manager callback
- int ret = package_manager_create(&m_request);
- if (ret != PACKAGE_MANAGER_ERROR_NONE) {
- LogError("package_manager_create error: " << ret);
- return PACKAGE_MANAGER_ERROR;
+ // FIXME: pkgmanager API signal handling was temporarily replaced
+ // by dbus API
+
+ // Add pkgmgr install callback
+ LogDebug("register pkgmgr install event callback start");
+ if (register_dbus_signal_handler(m_proxy_pkgmgr_install,
+ "org.tizen.slp.pkgmgr_status",
+ "/org/tizen/slp/pkgmgr/install",
+ "org.tizen.slp.pkgmgr.install",
+ pkgmgr_install_callback) != NO_ERROR) {
+ LogError("Error in register_pkgmgr_install_signal_handler");
+ return REGISTER_CALLBACK_ERROR;
}
-
- LogDebug("register installedApp event callback start");
- ret = package_manager_set_event_cb(m_request, Logic::pkg_manager_callback, this);
- if (PACKAGE_MANAGER_ERROR_NONE != ret) {
- LogError("Error in package_manager_set_event_cb: " << ret);
+ LogDebug("register pkgmgr install event callback success");
+
+ // Add pkgmgr uninstall callback
+ LogDebug("register pkgmgr uninstall event callback start");
+ if (register_dbus_signal_handler(m_proxy_pkgmgr_uninstall,
+ "org.tizen.slp.pkgmgr_status",
+ "/org/tizen/slp/pkgmgr/uninstall",
+ "org.tizen.slp.pkgmgr.uninstall",
+ pkgmgr_uninstall_callback) != NO_ERROR) {
+ LogError("Error in register_pkgmgr_uninstall_signal_handler");
return REGISTER_CALLBACK_ERROR;
}
- LogDebug("register installedApp event callback success");
+ LogDebug("register pkgmgr uninstall event callback success");
// Add connman callback
LogDebug("register connman event callback start");
- if (register_connman_signal_handler() != NO_ERROR) {
+ if (register_dbus_signal_handler(m_proxy_connman,
+ "net.connman",
+ "/",
+ "net.connman.Manager",
+ connman_callback) != NO_ERROR) {
LogError("Error in register_connman_signal_handler");
return REGISTER_CALLBACK_ERROR;
}
@@ -128,67 +123,125 @@ error_t Logic::setup()
return NO_ERROR;
}
-error_t Logic::register_connman_signal_handler(void)
+error_t Logic::register_dbus_signal_handler(GDBusProxy *proxy,
+ const char *name,
+ const char *object_path,
+ const char *interface_name,
+ void (*callback) (GDBusProxy *proxy,
+ gchar *sender_name,
+ gchar *signal_name,
+ GVariant *parameters,
+ void *logic_ptr)
+ )
{
GError *error = NULL;
GDBusProxyFlags flags = G_DBUS_PROXY_FLAGS_NONE;
// Obtain a connection to the System Bus
- m_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+ proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM,
flags,
NULL, /* GDBusInterfaceInfo */
- "net.connman",
- "/",
- "net.connman.Manager",
+ name,
+ object_path,
+ interface_name,
NULL, /* GCancellable */
&error);
- if (m_proxy == NULL) {
+ if (proxy == NULL) {
if (error) {
- LogError("Error creating D-Bus proxy: " << error->message);
- g_error_free (error);
- }
- else {
- LogError("Error creating D-Bus proxy. Unknown error");
+ LogError("Error creating D-Bus proxy for /'" << interface_name <<"/': " << error->message);
+ g_error_free(error);
+ } else {
+ LogError("Error creating D-Bus proxy for /'" << interface_name <<"/'. Unknown error");
}
return DBUS_ERROR;
}
// Connect to g-signal to receive signals from proxy
- if (g_signal_connect (m_proxy, "g-signal", G_CALLBACK (Logic::connman_callback), this) < 1) {
- LogError("g_signal_connect error while connecting connman signal");
+ if (g_signal_connect(proxy, "g-signal", G_CALLBACK(callback), this) < 1) {
+ LogError("g_signal_connect error while connecting " << interface_name);
return REGISTER_CALLBACK_ERROR;
}
return NO_ERROR;
}
-void Logic::pkg_manager_callback(
- const char *type,
- const char *package,
- package_manager_event_type_e eventType,
- package_manager_event_state_e eventState,
- int progress,
- package_manager_error_e error,
- void *logic_ptr)
+// FIXME: pkgmgr callback doesn't receive signals with successful installation/uninstallation.
+// For now it will be replaced by low-level signal handling from DBUS.
+void Logic::pkgmgr_install_callback(GDBusProxy */*proxy*/,
+ gchar */*sender_name*/,
+ gchar */*signal_name*/,
+ GVariant *parameters,
+ void *logic_ptr)
{
- LogDebug("---- packageInstalledEventCallback ----\n");
- LogDebug("Type: " << type << ", package: " << package << ", Event type: " <<
- eventTypeStr(eventType) << ", Event state: " << eventStateStr(eventState) <<
- ", progress: " << progress <<", error: " << error);
- Logic *logic = static_cast<Logic*>(logic_ptr);
-
- if (eventType != PACKAGE_MANAGER_EVENT_TYPE_INSTALL||
- eventState != PACKAGE_MANAGER_EVENT_STATE_COMPLETED ||
- error != PACKAGE_MANAGER_ERROR_NONE ||
- package == NULL) {
- LogDebug("PackageInstalled Callback error or Invalid Param");
- } else {
- LogDebug("PackageInstalled Callback. Instalation of: " << package <<
- ", error: " << error << ", progress: " << progress);
- // TODO: Add event to queue here
- (void) logic;
+ LogDebug("----------------- pkgmgr_install_callback -----------------\n");
+
+ Logic *logic = static_cast<Logic*> (logic_ptr);
+ logic->pkgmgr_callback_internal(parameters, EVENT_INSTALL);
+}
+
+void Logic::pkgmgr_uninstall_callback(GDBusProxy */*proxy*/,
+ gchar */*sender_name*/,
+ gchar */*signal_name*/,
+ GVariant *parameters,
+ void *logic_ptr)
+{
+ LogDebug("----------------- pkgmgr_uninstall_callback -----------------\n");
+
+ Logic *logic = static_cast<Logic*> (logic_ptr);
+ logic->pkgmgr_callback_internal(parameters, EVENT_UNINSTALL);
+}
+
+void Logic::pkgmgr_callback_internal(GVariant *parameters,
+ pkgmgr_event_t event)
+{
+ gchar *parameters_g = g_variant_print(parameters, TRUE);
+ std::string params_str = std::string(parameters_g);
+ LogDebug("params: " << params_str);
+ g_free (parameters_g);
+
+ /* DBus message format from pkgmgr:
+ * uint32 5001
+ * string "/usr/share/widget_demo/mancala.wgt_-427832739"
+ * string "wgt"
+ * string "yKrWwxz1KX"
+ * string "end"
+ * string "ok"
+ *
+ * Check if numbers of children (vaules) fits - should be 6:
+ */
+ int num = g_variant_n_children(parameters);
+ if (num != 6) {
+ LogError("Wrong number of children in g_variant: " << num << ", but should be 6.");
+ return;
+ }
+
+ guint32 uid;
+ gchar *pkgid = NULL;
+ gchar *state = NULL;
+ gchar *status = NULL;
+
+ uid = g_variant_get_uint32(g_variant_get_child_value(parameters, 0));
+ pkgid = g_variant_dup_string(g_variant_get_child_value(parameters, 3), NULL);
+ state = g_variant_dup_string(g_variant_get_child_value(parameters, 4), NULL);
+ status = g_variant_dup_string(g_variant_get_child_value(parameters, 5), NULL);
+
+ if (std::string(state) == "end" && std::string(status) == "ok") {
+ if (event == EVENT_INSTALL) {
+ LogDebug("Install: uid : " << uid << ", pkgid: " << pkgid <<
+ ", state: " << state << ", status: " << status);
+ }
+ else if (event == EVENT_UNINSTALL) {
+ LogDebug("Uninstall: uid : " << uid << ", pkgid: " << pkgid <<
+ ", state: " << state << ", status: " << status);
+ }
}
+ else
+ LogDebug("Wrong state (" << std::string(state) << ") or status (" << std::string(status) << ")");
+
+ g_free(pkgid);
+ g_free(state);
+ g_free(status);
}
void Logic::connman_callback(GDBusProxy */*proxy*/,
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 4e2add7..95dcd64 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -6,7 +6,6 @@ PKG_CHECK_MODULES(CERT_CHECKER_TESTS_DEP
glib-2.0
gio-2.0
icu-i18n
- capi-appfw-package-manager
notification
libsystemd-journal
libtzplatform-config