/** * asb_task_set_package: * @task: A #AsbTask * @pkg: A #AsbPackage * * Sets the package used for the task. * * Since: 0.1.0 **/ void asb_task_set_package (AsbTask *task, AsbPackage *pkg) { AsbTaskPrivate *priv = GET_PRIVATE (task); priv->tmpdir = g_build_filename (asb_context_get_temp_dir (priv->ctx), asb_package_get_nevr (pkg), NULL); priv->filename = g_strdup (asb_package_get_filename (pkg)); priv->pkg = g_object_ref (pkg); }
/** * asb_plugin_loader_merge: * @plugin_loader: A #AsbPluginLoader * @apps: (element-type AsbApp): a list of applications that need merging * * Merge the list of applications using the plugins. * * Since: 0.2.5 **/ void asb_plugin_loader_merge (AsbPluginLoader *plugin_loader, GList *apps) { AsbApp *app; AsbApp *found; AsbPluginLoaderPrivate *priv = GET_PRIVATE (plugin_loader); AsbPluginMergeFunc plugin_func = NULL; AsbPlugin *plugin; GList *l; const gchar *key; const gchar *tmp; gboolean ret; guint i; g_autoptr(GHashTable) hash = NULL; /* run each plugin */ for (i = 0; i < priv->plugins->len; i++) { plugin = g_ptr_array_index (priv->plugins, i); ret = g_module_symbol (plugin->module, "asb_plugin_merge", (gpointer *) &plugin_func); if (!ret) continue; plugin_func (plugin, apps); } /* FIXME: move to font plugin */ for (l = apps; l != NULL; l = l->next) { if (!ASB_IS_APP (l->data)) continue; app = ASB_APP (l->data); as_app_remove_metadata (AS_APP (app), "FontFamily"); as_app_remove_metadata (AS_APP (app), "FontFullName"); as_app_remove_metadata (AS_APP (app), "FontIconText"); as_app_remove_metadata (AS_APP (app), "FontParent"); as_app_remove_metadata (AS_APP (app), "FontSampleText"); as_app_remove_metadata (AS_APP (app), "FontSubFamily"); as_app_remove_metadata (AS_APP (app), "FontClassifier"); } /* deduplicate */ hash = g_hash_table_new (g_str_hash, g_str_equal); for (l = apps; l != NULL; l = l->next) { if (!ASB_IS_APP (l->data)) continue; app = ASB_APP (l->data); if (as_app_get_vetos(AS_APP(app))->len > 0) continue; key = as_app_get_id (AS_APP (app)); found = g_hash_table_lookup (hash, key); if (found == NULL) { g_hash_table_insert (hash, (gpointer) key, (gpointer) app); continue; } if (as_app_get_kind (AS_APP (app)) == AS_APP_KIND_FIRMWARE) { as_app_subsume_full (AS_APP (found), AS_APP (app), AS_APP_SUBSUME_FLAG_MERGE); } tmp = asb_package_get_nevr (asb_app_get_package (found)); as_app_add_veto (AS_APP (app), "duplicate of %s", tmp); asb_package_log (asb_app_get_package (app), ASB_PACKAGE_LOG_LEVEL_WARNING, "duplicate %s not included as added from %s", key, tmp); } }
/** * asb_context_process: * @ctx: A #AsbContext * @error: A #GError or %NULL * * Processes all the packages that have been added to the context. * * Returns: %TRUE for success, %FALSE otherwise * * Since: 0.1.0 **/ gboolean asb_context_process (AsbContext *ctx, GError **error) { AsbContextPrivate *priv = GET_PRIVATE (ctx); AsbPackage *pkg; AsbTask *task; GThreadPool *pool; gboolean ret; guint i; g_autoptr(GPtrArray) tasks = NULL; /* only process the newest packages */ asb_context_disable_multiarch_pkgs (ctx); asb_context_disable_older_pkgs (ctx); /* create thread pool */ pool = g_thread_pool_new (asb_task_process_func, ctx, priv->max_threads, TRUE, error); if (pool == NULL) return FALSE; /* add each package */ g_print ("Processing packages...\n"); tasks = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); for (i = 0; i < priv->packages->len; i++) { pkg = g_ptr_array_index (priv->packages, i); if (!asb_package_get_enabled (pkg)) { asb_package_log (pkg, ASB_PACKAGE_LOG_LEVEL_DEBUG, "%s is not enabled", asb_package_get_nevr (pkg)); asb_context_add_app_ignore (ctx, pkg); asb_package_log_flush (pkg, NULL); continue; } /* set locations of external resources */ asb_package_set_config (pkg, "LogDir", priv->log_dir); asb_package_set_config (pkg, "TempDir", priv->temp_dir); asb_package_set_config (pkg, "IconsDir", priv->icons_dir); asb_package_set_config (pkg, "OutputDir", priv->output_dir); /* create task */ task = asb_task_new (ctx); asb_task_set_package (task, pkg); g_ptr_array_add (tasks, task); /* run the task */ if (priv->max_threads == 1) { if (!asb_task_process (task, error)) return FALSE; } else { if (!g_thread_pool_push (pool, task, error)) return FALSE; } } /* wait for them to finish */ g_thread_pool_free (pool, FALSE, TRUE); /* merge */ g_print ("Merging applications...\n"); asb_plugin_loader_merge (priv->plugin_loader, priv->apps); /* print any warnings */ if ((priv->flags & ASB_CONTEXT_FLAG_IGNORE_MISSING_INFO) == 0) { if (!asb_context_detect_missing_data (ctx, error)) return FALSE; } if ((priv->flags & ASB_CONTEXT_FLAG_IGNORE_MISSING_PARENTS) == 0) { if (!asb_context_detect_missing_parents (ctx, error)) return FALSE; } if (!asb_context_detect_pkgname_dups (ctx, error)) return FALSE; if (!asb_context_convert_icons (ctx, error)) return FALSE; if (!asb_context_save_resources (ctx, error)) return FALSE; /* write the application XML to the log file */ asb_context_write_app_xml (ctx); /* write XML file */ ret = asb_context_write_xml (ctx, error); if (!ret) return FALSE; /* write XML file */ ret = asb_context_write_xml_fail (ctx, error); if (!ret) return FALSE; /* write XML file */ ret = asb_context_write_xml_ignore (ctx, error); if (!ret) return FALSE; /* write icons archive */ ret = asb_context_write_icons (ctx, priv->temp_dir, error); if (!ret) return FALSE; /* write screenshots archive */ ret = asb_context_write_screenshots (ctx, priv->temp_dir, error); if (!ret) return FALSE; /* ensure all packages are flushed */ for (i = 0; i < priv->packages->len; i++) { pkg = g_ptr_array_index (priv->packages, i); if (!asb_package_log_flush (pkg, error)) return FALSE; } return TRUE; }