void *user_data);
/**
+ * @brief Called when the package is installed, uninstalled or updated, and the progress of the request to the package manager changes.
+ * @since_tizen 3.0
+ *
+ * @param[in] target_uid The uid of the package event occured
+ * @param[in] type The type of the package to be installed, uninstalled or updated
+ * @param[in] package The name of the package to be installed, uninstalled or updated
+ * @param[in] event_type The type of the request to the package manager
+ * @param[in] event_state The current state of the request to the package manager
+ * @param[in] progress The progress for the request that is being processed by the package manager \n
+ * The range of progress is from @c 0 to @c 100.
+ * @param[in] error The error code when the package manager failed to process the request
+ * @param[in] user_data The user data passed from package_manager_set_event_cb()
+ *
+ * @see package_manager_set_global_event_cb()
+ * @see package_manager_unset_global_event_cb()
+ */
+typedef void (*package_manager_global_event_cb) (
+ uid_t target_uid,
+ const char *type,
+ const char *package,
+ package_manager_event_type_e event_type,
+ package_manager_event_state_e event_state,
+ int progress,
+ package_manager_error_e error,
+ void *user_data);
+
+/**
* @brief Creates a package manager handle.
* @since_tizen 2.3
* @privlevel public
int package_manager_unset_event_cb(package_manager_h manager);
/**
+ * @brief Registers a callback function to be invoked when the package is installed, uninstalled or updated.
+ * @since_tizen 3.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/packagemanager.info
+ * @param[in] manager The package manager handle
+ * @param[in] callback The callback function to be registered
+ * @param[in] user_data The user data to be passed to the callback function
+ *
+ * @return @c 0 on success,
+ * otherwise a negative error value
+ *
+ * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #PACKAGE_MANAGER_ERROR_PERMISSION_DENIED Permission denied
+ * @post package_manager_global_event_cb() will be invoked.
+ *
+ * @see package_manager_set_event_status()
+ * @see package_manager_global_event_cb()
+ * @see package_manager_unset_global_event_cb()
+ */
+int package_manager_set_global_event_cb(package_manager_h manager,
+ package_manager_global_event_cb callback,
+ void *user_data);
+
+/**
+ * @brief Unregisters the callback function.
+ * @since_tizen 3.0
+ *
+ * @param[in] manager The package manager handle
+ *
+ * @return @c 0 on success,
+ * otherwise a negative error value
+ *
+ * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ *
+ * @see package_manager_global_event_cb()
+ * @see package_manager_set_global_event_cb()
+ */
+int package_manager_unset_global_event_cb(package_manager_h manager);
+
+/**
* @brief Called to retrieve all packages.
* @since_tizen 2.3
*
pkgmgr_mode mode;
event_info *head;
package_manager_event_cb event_cb;
+ package_manager_global_event_cb global_event_cb;
void *user_data;
};
}
*/
-static int request_event_handler(int req_id, const char *pkg_type,
+static int request_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
const char *pkg_name, const char *key,
const char *val, const void *pmsg, void *data)
{
return -1;
}
-static int global_event_handler(int req_id, const char *pkg_type,
+/* App Event Listening Policy:
+ * +----------------+------------+---------------+------------------+
+ * |Listener \ Type |Global Event|My User's Event|Other user's Event|
+ * +----------------+------------+---------------+------------------+
+ * |User Process App| Grant | Grant | Deny |
+ * +----------------+------------+---------------+------------------+
+ * |Platform module | Grant | Grant | Grant |
+ * +----------------+------------+---------------+------------------+
+ * UID assignment policy:
+ * https://wiki.tizen.org/wiki/Security/User_and_group_ID_assignment_policy
+ */
+#define REGULAR_USER 5000
+static int __validate_event_signal(uid_t target_uid)
+{
+ uid_t self = getuid();
+
+ if (self == target_uid)
+ return 0;
+
+ if (self < REGULAR_USER)
+ return 0;
+
+ return -1;
+}
+
+static int global_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
const char *pkg_name, const char *key,
const char *val, const void *pmsg, void *data)
{
package_manager_h manager = data;
+ if (__validate_event_signal(target_uid))
+ return PACKAGE_MANAGER_ERROR_NONE;
+
if (strcasecmp(key, "start") == 0) {
ret = package_manager_get_event_type(val, &event_type);
if (ret != PACKAGE_MANAGER_ERROR_NONE)
__add_event(&(manager->head), req_id, event_type,
PACKAGE_MANAGER_EVENT_STATE_STARTED);
- if (manager->event_cb)
+ if (manager->event_cb && getuid() == target_uid)
manager->event_cb(pkg_type, pkg_name,
event_type,
PACKAGE_MANAGER_EVENT_STATE_STARTED,
0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data);
+ if (manager->global_event_cb)
+ manager->global_event_cb(target_uid, pkg_type, pkg_name,
+ event_type,
+ PACKAGE_MANAGER_EVENT_STATE_STARTED,
+ 0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data);
} else if (strcasecmp(key, "install_percent") == 0
|| strcasecmp(key, "progress_percent") == 0) {
__update_event(&(manager->head), req_id,
event_type,
PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
- if (manager->event_cb)
+ if (manager->event_cb && getuid() == target_uid)
manager->event_cb(pkg_type, pkg_name,
event_type,
PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
atoi(val),
PACKAGE_MANAGER_ERROR_NONE,
manager->user_data);
+ if (manager->global_event_cb)
+ manager->global_event_cb(target_uid, pkg_type, pkg_name,
+ event_type,
+ PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
+ atoi(val),
+ PACKAGE_MANAGER_ERROR_NONE,
+ manager->user_data);
}
} else if (strcasecmp(key, "error") == 0) {
PACKAGE_MANAGER_EVENT_STATE_FAILED);
}
- if (manager->event_cb)
+ if (manager->event_cb && getuid() == target_uid)
manager->event_cb(pkg_type,
pkg_name, event_type,
PACKAGE_MANAGER_EVENT_STATE_FAILED,
0,
PACKAGE_MANAGER_ERROR_NONE,
manager->user_data);
-
+ if (manager->global_event_cb)
+ manager->global_event_cb(target_uid, pkg_type,
+ pkg_name, event_type,
+ PACKAGE_MANAGER_EVENT_STATE_FAILED,
+ 0,
+ PACKAGE_MANAGER_ERROR_NONE,
+ manager->user_data);
}
} else if (strcasecmp(key, "end") == 0) {
if (__find_event
(&(manager->head), req_id, &event_type,
&event_state) == 0) {
if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
- if (manager->event_cb)
+ if (manager->event_cb && getuid() == target_uid)
manager->event_cb(pkg_type,
pkg_name, event_type,
PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
100,
PACKAGE_MANAGER_ERROR_NONE,
manager->user_data);
+ if (manager->global_event_cb)
+ manager->global_event_cb(target_uid, pkg_type,
+ pkg_name, event_type,
+ PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
+ 100,
+ PACKAGE_MANAGER_ERROR_NONE,
+ manager->user_data);
}
} else {
- if (strcasecmp(key, "ok") != 0)
- if (manager->event_cb)
+ if (strcasecmp(key, "ok") != 0) {
+ if (manager->event_cb && getuid() == target_uid)
manager->event_cb(pkg_type,
pkg_name, event_type,
PACKAGE_MANAGER_EVENT_STATE_FAILED,
0,
PACKAGE_MANAGER_ERROR_NONE,
manager->user_data);
+ if (manager->global_event_cb)
+ manager->global_event_cb(target_uid, pkg_type,
+ pkg_name, event_type,
+ PACKAGE_MANAGER_EVENT_STATE_FAILED,
+ 0,
+ PACKAGE_MANAGER_ERROR_NONE,
+ manager->user_data);
+ }
}
}
return PACKAGE_MANAGER_ERROR_NONE;
}
+API int package_manager_set_global_event_cb(package_manager_h manager,
+ package_manager_global_event_cb callback,
+ void *user_data)
+{
+ if (package_manager_validate_handle(manager)) {
+ return
+ package_manager_error
+ (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
+ NULL);
+ }
+
+ if (getuid() >= REGULAR_USER) {
+ _LOGE("Regular user is not allowed for this api");
+ return PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
+ }
+
+ manager->global_event_cb = callback;
+ manager->user_data = user_data;
+
+ pkgmgr_client_listen_status(manager->pc, global_event_handler, manager);
+
+ return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_manager_unset_global_event_cb(package_manager_h manager)
+{
+ // TODO: Please implement this function.
+ return PACKAGE_MANAGER_ERROR_NONE;
+}
+
API int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
{
pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
#include <sys/types.h>
#include <fcntl.h>
+#include <glib.h>
+
#include <package_manager.h>
return PACKAGE_MANAGER_ERROR_NONE;
}
+static void _global_event_cb(uid_t target_uid, const char *type,
+ const char *package, package_manager_event_type_e event_type,
+ package_manager_event_state_e event_state, int progress,
+ package_manager_error_e error, void *user_data)
+{
+ fprintf(stderr, "uid[%u] type[%s] pkgid[%s] event_type[%d] "
+ "event_state[%d] progress[%d] error[%d]\n",
+ target_uid, type, package, event_type, event_state,
+ progress, error);
+}
+
+static int _listen_event(void)
+{
+ int ret;
+ package_manager_h manager;
+
+ ret = package_manager_create(&manager);
+ if (ret != PACKAGE_MANAGER_ERROR_NONE)
+ return ret;
+
+ ret = package_manager_set_global_event_cb(manager, _global_event_cb,
+ NULL);
+ if (ret != PACKAGE_MANAGER_ERROR_NONE)
+ return ret;
+
+ return PACKAGE_MANAGER_ERROR_NONE;
+}
+
int main(int argc, char** argv)
{
+ GMainLoop *loop;
int ret = PACKAGE_MANAGER_ERROR_NONE;
- if (2 == argc) {
+ if (1 == argc) {
+ if (_listen_event()) {
+ fprintf(stderr, "Register event listener failed\n");
+ return EXIT_FAILURE;
+ }
+ } else if (2 == argc) {
ret = _get_packageinfo(argv[1]);
} else if (3 == argc) {
ret = _get_appinfo(argv[1]);
if (ret != PACKAGE_MANAGER_ERROR_NONE) {
fprintf(stderr, "There are some problems\n");
+ return EXIT_FAILURE;
+ }
+
+ if (1 == argc) {
+ loop = g_main_loop_new(FALSE, NULL);
+ g_main_loop_run(loop);
}
return EXIT_SUCCESS;