696
697
return primary == pid;
700
/* Try and get a manifest file and do a couple sanity checks on it */
702
get_manifest_file (const gchar * pkg)
704
/* Get the directory from click */
705
GError * error = NULL;
706
const gchar * click_exec = NULL;
708
if (g_getenv("UAL_CLICK_EXEC") != NULL) {
709
click_exec = g_getenv("UAL_CLICK_EXEC");
711
click_exec = "click";
714
gchar * cmdline = g_strdup_printf("%s info \"%s\"",
717
gchar * output = NULL;
718
g_spawn_command_line_sync(cmdline, &output, NULL, NULL, &error);
722
g_warning("Unable to get manifest for '%s' package: %s", pkg, error->message);
728
/* Let's look at that manifest file */
729
JsonParser * parser = json_parser_new();
730
json_parser_load_from_data(parser, output, -1, &error);
734
g_warning("Unable to load manifest for '%s': %s", pkg, error->message);
736
g_object_unref(parser);
739
JsonNode * root = json_parser_get_root(parser);
740
if (json_node_get_node_type(root) != JSON_NODE_OBJECT) {
741
g_warning("Manifest file for package '%s' does not have an object as its root node", pkg);
742
g_object_unref(parser);
746
JsonObject * rootobj = json_node_get_object(root);
747
if (!json_object_has_member(rootobj, "version")) {
748
g_warning("Manifest file for package '%s' does not have a version", pkg);
749
g_object_unref(parser);
756
/* Types of search we can do for an app name */
757
typedef enum _app_name_t app_name_t;
764
/* Figure out the app name if it's one of the keywords */
766
manifest_app_name (JsonParser ** manifest, const gchar * pkg, const gchar * original_app)
768
app_name_t app_type = APP_NAME_FIRST;
770
if (original_app == NULL) {
772
} else if (g_strcmp0(original_app, "first-listed-app") == 0) {
774
} else if (g_strcmp0(original_app, "last-listed-app") == 0) {
775
app_type = APP_NAME_LAST;
776
} else if (g_strcmp0(original_app, "only-listed-app") == 0) {
777
app_type = APP_NAME_ONLY;
782
if (*manifest == NULL) {
783
*manifest = get_manifest_file(pkg);
786
JsonNode * root_node = json_parser_get_root(*manifest);
787
JsonObject * root_obj = json_node_get_object(root_node);
788
JsonObject * hooks = json_object_get_object_member(root_obj, "hooks");
794
GList * apps = json_object_get_members(hooks);
799
const gchar * retapp = NULL;
803
if (g_list_length(apps) == 1) {
804
retapp = (const gchar *)apps->data;
808
retapp = (const gchar *)apps->data;
811
retapp = (const gchar *)(g_list_last(apps)->data);
822
/* Figure out the app version using the manifest */
824
manifest_version (JsonParser ** manifest, const gchar * pkg, const gchar * original_ver)
826
if (original_ver != NULL && g_strcmp0(original_ver, "current-user-version") != 0) {
829
if (*manifest == NULL) {
830
*manifest = get_manifest_file(pkg);
832
g_return_val_if_fail(*manifest != NULL, NULL);
834
JsonNode * node = json_parser_get_root(*manifest);
835
JsonObject * obj = json_node_get_object(node);
837
return g_strdup(json_object_get_string_member(obj, "version"));
844
upstart_app_launch_triplet_to_app_id (const gchar * pkg, const gchar * app, const gchar * ver)
846
g_return_val_if_fail(pkg != NULL, NULL);
848
const gchar * version = NULL;
849
const gchar * application = NULL;
850
JsonParser * manifest = NULL;
852
version = manifest_version(&manifest, pkg, ver);
853
g_return_val_if_fail(version != NULL, NULL);
855
application = manifest_app_name(&manifest, pkg, app);
856
g_return_val_if_fail(application != NULL, NULL);
858
gchar * retval = g_strdup_printf("%s_%s_%s", pkg, application, version);
860
/* The parser may hold allocation for some of our strings used above */
861
g_clear_object(&manifest);