summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/analysis/loading.c117
-rw-r--r--src/analysis/loading.h8
-rw-r--r--src/analysis/project.c12
3 files changed, 133 insertions, 4 deletions
diff --git a/src/analysis/loading.c b/src/analysis/loading.c
index 3a53657..0afc60f 100644
--- a/src/analysis/loading.c
+++ b/src/analysis/loading.c
@@ -113,6 +113,9 @@ typedef struct _exploring_group
GBinContent **contents; /* Contenus reconnus dispos. */
size_t count; /* Taille de cette liste */
+ GLoadedContent **loaded; /* Contenus reconnus à intégrer*/
+ size_t noted; /* Taille de cette liste */
+
} exploring_group;
/* Exploration de contenus binaires (instance) */
@@ -729,6 +732,9 @@ wgroup_id_t g_content_explorer_create_group(GContentExplorer *explorer, GBinCont
group->contents = NULL;
group->count = 0;
+ group->loaded = NULL;
+ group->noted = 0;
+
/* Alimentation du contenu initial */
work = g_exploring_work_new(content);
@@ -779,6 +785,15 @@ void g_content_explorer_delete_group(GContentExplorer *explorer, wgroup_id_t wid
for (i = 0; i < group->count; i++)
g_object_unref(G_OBJECT(group->contents[i]));
+ if (group->contents != NULL)
+ free(group->contents);
+
+ for (i = 0; i < group->noted; i++)
+ g_object_unref(G_OBJECT(group->loaded[i]));
+
+ if (group->loaded != NULL)
+ free(group->loaded);
+
/* Réorganisation de la liste */
index = group - explorer->groups;
@@ -850,6 +865,39 @@ void g_content_explorer_populate_group(GContentExplorer *explorer, wgroup_id_t w
/******************************************************************************
* *
* Paramètres : explorer = gestionnaire d'explorations à consulter. *
+* wid = identifiant du groupe recherché. *
+* loaded = contenu chargé et pouvant être représenté. *
+* *
+* Description : Note un contenu chargé pour future intégration guidée. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_content_explorer_note_detected(GContentExplorer *explorer, wgroup_id_t wid, GLoadedContent *loaded)
+{
+ exploring_group *group; /* Groupe d'opération concerné */
+
+ g_mutex_lock(&explorer->mutex);
+
+ group = g_content_explorer_find_group(explorer, wid);
+ assert(group != NULL);
+
+ group->loaded = (GLoadedContent **)realloc(group->loaded, ++group->noted * sizeof(GLoadedContent *));
+
+ group->loaded[group->noted - 1] = loaded;
+ g_object_ref(G_OBJECT(loaded));
+
+ g_mutex_unlock(&explorer->mutex);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : explorer = gestionnaire d'explorations à consulter. *
* wid = identifiant du groupe à parcourir. *
* count = nombre de contenus binaires retournés. [OUT] *
* *
@@ -889,7 +937,54 @@ GBinContent **g_content_explorer_get_all(GContentExplorer *explorer, wgroup_id_t
{
result[1 + i] = group->contents[i];
- g_object_ref(G_OBJECT(result[i + 1]));
+ g_object_ref(G_OBJECT(result[1 + i]));
+
+ }
+
+ g_mutex_unlock(&explorer->mutex);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : explorer = gestionnaire d'explorations à consulter. *
+* wid = identifiant du groupe à parcourir. *
+* noted = nombre de contenus chargés retournés. [OUT] *
+* *
+* Description : Fournit la liste de tous les contenus préalablement détectés.*
+* *
+* Retour : Liste de contenus chargés enregistrés. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GLoadedContent **g_content_explorer_get_detected(GContentExplorer *explorer, wgroup_id_t wid, size_t *noted)
+{
+ GLoadedContent **result; /* Trouvailles à retourner */
+ exploring_group *group; /* Groupe d'opération concerné */
+ size_t i; /* Boucle de parcours */
+
+ g_mutex_lock(&explorer->mutex);
+
+ group = g_content_explorer_find_group(explorer, wid);
+ assert(group != NULL);
+
+ /* Allocation de la liste finale */
+
+ *noted = group->noted;
+ result = (GLoadedContent **)malloc(*noted * sizeof(GLoadedContent *));
+
+ /* On parcourt les éventuels contenus encapsulés découverts */
+
+ for (i = 0; i < group->noted; i++)
+ {
+ result[i] = group->loaded[i];
+
+ g_object_ref(G_OBJECT(result[i]));
}
@@ -1305,6 +1400,8 @@ static void g_content_resolver_ack(GContentResolver *resolver, GResolvingWork *w
* wid = identifiant du groupe de tâches réservé. *
* contents = contenus à analyser. *
* count = nombre de ces contenus. *
+* detected = contenus préalablement détectés. *
+* noted = nombre de contenus chargés. *
* *
* Description : Initie une nouvelle vague de résolution de contenus. *
* *
@@ -1314,7 +1411,7 @@ static void g_content_resolver_ack(GContentResolver *resolver, GResolvingWork *w
* *
******************************************************************************/
-void g_content_resolver_create_group(GContentResolver *resolver, wgroup_id_t wid, GBinContent **contents, size_t count)
+void g_content_resolver_create_group(GContentResolver *resolver, wgroup_id_t wid, GBinContent **contents, size_t count, GLoadedContent **detected, size_t noted)
{
resolving_group *group; /* Groupe ciblé par l'opération*/
GWorkQueue *queue; /* Gestionnaire de différés */
@@ -1336,6 +1433,21 @@ void g_content_resolver_create_group(GContentResolver *resolver, wgroup_id_t wid
group->loaded = NULL;
group->count = 0;
+ /* Insertion des résultats préalables */
+
+ if (noted > 0)
+ {
+ group->count = noted;
+ group->loaded = (GLoadedContent **)realloc(group->loaded, group->count * sizeof(GLoadedContent *));
+
+ for (i = 0; i < noted; i++)
+ {
+ group->loaded[i] = detected[i];
+ g_object_ref(G_OBJECT(detected[i]));
+ }
+
+ }
+
/* Alimentation du contenu initial */
queue = get_work_queue();
@@ -1423,6 +1535,7 @@ void g_content_resolver_add_detected(GContentResolver *resolver, wgroup_id_t wid
g_mutex_lock(&resolver->mutex);
group = g_content_resolver_find_group(resolver, wid);
+ assert(group != NULL);
group->loaded = (GLoadedContent **)realloc(group->loaded, ++group->count * sizeof(GLoadedContent *));
diff --git a/src/analysis/loading.h b/src/analysis/loading.h
index c7ede58..e2f7801 100644
--- a/src/analysis/loading.h
+++ b/src/analysis/loading.h
@@ -67,9 +67,15 @@ void g_content_explorer_delete_group(GContentExplorer *, wgroup_id_t);
/* Ajoute un nouveau contenu découvert au crédit d'un groupe. */
void g_content_explorer_populate_group(GContentExplorer *, wgroup_id_t, GBinContent *);
+/* Note un contenu chargé pour future intégration guidée. */
+void g_content_explorer_note_detected(GContentExplorer *, wgroup_id_t, GLoadedContent *);
+
/* Fournit la liste de tous les contenus disponibles. */
GBinContent **g_content_explorer_get_all(GContentExplorer *, wgroup_id_t, size_t *);
+/* Fournit la liste de tous les contenus préalablement détectés. */
+GLoadedContent **g_content_explorer_get_detected(GContentExplorer *, wgroup_id_t, size_t *);
+
/* ------------------- RESOLUTION DE CONTENUS BINAIRES EN CHARGES ------------------- */
@@ -97,7 +103,7 @@ GType g_content_resolver_get_type(void);
GContentResolver *g_content_resolver_new(void);
/* Initie une nouvelle vague de résolution de contenus. */
-void g_content_resolver_create_group(GContentResolver *, wgroup_id_t, GBinContent **, size_t);
+void g_content_resolver_create_group(GContentResolver *, wgroup_id_t, GBinContent **, size_t, GLoadedContent **, size_t);
/* Termine une vague de résolution de contenu. */
void g_content_resolver_delete_group(GContentResolver *, wgroup_id_t);
diff --git a/src/analysis/project.c b/src/analysis/project.c
index 66faa16..4a15ea0 100644
--- a/src/analysis/project.c
+++ b/src/analysis/project.c
@@ -1172,6 +1172,8 @@ static void on_new_content_explored(GContentExplorer *explorer, wgroup_id_t wid,
{
GBinContent **available; /* Contenus binaires présents */
size_t count; /* Quantité de ces contenus */
+ GLoadedContent **detected; /* Contenus chargés présents */
+ size_t noted; /* Quantité de ces contenus */
GContentResolver *resolver; /* Resolveur de contenus */
size_t i; /* Boucle de parcours */
@@ -1180,9 +1182,11 @@ static void on_new_content_explored(GContentExplorer *explorer, wgroup_id_t wid,
available = g_content_explorer_get_all(explorer, wid, &count);
assert(count > 0);
+ detected = g_content_explorer_get_detected(explorer, wid, &noted);
+
resolver = get_current_content_resolver();
- g_content_resolver_create_group(resolver, wid, available, count);
+ g_content_resolver_create_group(resolver, wid, available, count, detected, noted);
g_object_unref(G_OBJECT(resolver));
@@ -1191,6 +1195,12 @@ static void on_new_content_explored(GContentExplorer *explorer, wgroup_id_t wid,
free(available);
+ for (i = 0; i < noted; i++)
+ g_object_unref(G_OBJECT(detected[i]));
+
+ if (detected != NULL)
+ free(detected);
+
}
}