+
+ g_list_free(parent->sidecar_files);
+ parent->sidecar_files = NULL;
+
+ file_data_free(parent);
+ }
+}
+
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * sidecar file info struct
+ *-----------------------------------------------------------------------------
+ */
+
+static gint file_data_sort_by_ext(gconstpointer a, gconstpointer b)
+{
+ const FileData *fda = a;
+ const FileData *fdb = b;
+
+ if (fda->sidecar_priority < fdb->sidecar_priority) return -1;
+ if (fda->sidecar_priority > fdb->sidecar_priority) return 1;
+
+ return strcmp(fdb->extension, fda->extension);
+}
+
+
+static gint sidecar_file_priority(const gchar *extension)
+{
+ gint i = 1;
+ GList *work;
+
+ if (extension == NULL)
+ return 0;
+
+ work = sidecar_ext_get_list();
+
+ while (work) {
+ gchar *ext = work->data;
+
+ work = work->next;
+ if (g_ascii_strcasecmp(extension, ext) == 0) return i;
+ i++;
+ }
+ return 0;
+}
+
+static FileData *file_data_add_sidecar_file(FileData *target, FileData *sfd)
+{
+ sfd->parent = target;
+ if (!g_list_find(target->sidecar_files, sfd))
+ target->sidecar_files = g_list_insert_sorted(target->sidecar_files, sfd, file_data_sort_by_ext);
+ file_data_increment_version(sfd); /* increments both sfd and target */
+ return target;
+}
+
+
+static FileData *file_data_merge_sidecar_files(FileData *target, FileData *source)
+{
+ GList *work;
+
+ file_data_add_sidecar_file(target, source);
+
+ work = source->sidecar_files;
+ while (work)
+ {
+ FileData *sfd = work->data;
+ file_data_add_sidecar_file(target, sfd);
+ work = work->next;
+ }
+
+ g_list_free(source->sidecar_files);
+ source->sidecar_files = NULL;
+
+ return target;
+}
+
+static void file_data_check_sidecars(const GList *basename_list)
+{
+ GList *work;
+ FileData *parent_fd;
+ if (!basename_list) return;
+ /* process the group list - the first one is the parent file, others are sidecars */
+ parent_fd = basename_list->data;
+ work = basename_list->next;
+ while (work)
+ {
+ FileData *sfd = work->data;
+ work = work->next;
+
+ file_data_merge_sidecar_files(parent_fd, sfd);
+ }
+
+ /* there may be some sidecars that are already deleted - disconnect them */
+ work = parent_fd->sidecar_files;
+ while (work)
+ {
+ FileData *sfd = work->data;
+ work = work->next;
+
+ if (!g_list_find((GList *)basename_list, sfd))
+ {
+ printf("removing unknown %s: %s \n", parent_fd->path, sfd->path);
+ file_data_disconnect_sidecar_file(parent_fd, sfd);
+ file_data_send_notification(sfd, NOTIFY_REREAD);
+ file_data_send_notification(parent_fd, NOTIFY_REREAD);
+ }