static gboolean run_io_scheduler_job (GIOSchedulerJob *io_scheduler_job, GCancellable *cancellable, gpointer user_data) { StorageThreadedJob *job = STORAGE_THREADED_JOB (user_data); /* TODO: probably want to create a GMainContext dedicated to the thread */ g_assert (!job->job_result); g_assert_no_error (job->job_error); if (!g_cancellable_set_error_if_cancelled (cancellable, &job->job_error)) { job->job_result = job->job_func (cancellable, job->user_data, &job->job_error); } g_io_scheduler_job_send_to_mainloop (io_scheduler_job, job_complete, job, NULL); return FALSE; /* job is complete (or cancelled) */ }
static VALUE rg_send_to_mainloop(VALUE self) { VALUE block; block = rb_block_proc(); SAVE_BLOCK(block); return CBOOL2RVAL(g_io_scheduler_job_send_to_mainloop(_SELF(self), ioscheduler_source_callback, (gpointer)block, ioscheduler_source_callback_free)); }
static gboolean list_sub_dirs(GIOSchedulerJob *job, GCancellable *cancellable, gpointer user_data) { ListSubDirNames* data = (ListSubDirNames*)user_data; GError *err = NULL; /* g_debug("new dir listing job!"); */ GFileEnumerator* enu = g_file_enumerate_children(data->dir, G_FILE_ATTRIBUTE_STANDARD_NAME"," G_FILE_ATTRIBUTE_STANDARD_TYPE, G_FILE_QUERY_INFO_NONE, cancellable, &err); if(enu) { while(!g_cancellable_is_cancelled(cancellable)) { GFileInfo* inf = g_file_enumerator_next_file(enu, cancellable, &err); if(inf) { GFileType type = g_file_info_get_file_type(inf); if(type == G_FILE_TYPE_DIRECTORY) { const char* name = g_file_info_get_name(inf); data->subdirs = g_list_prepend(data->subdirs, g_strdup(name)); } g_object_unref(inf); } else { if(err) /* error happens */ { g_error_free(err); err = NULL; } else /* EOF */ break; } } g_object_unref(enu); } if(!g_cancellable_is_cancelled(cancellable)) { /* finished! */ g_io_scheduler_job_send_to_mainloop(job, on_dir_list_finished, data, NULL); } return FALSE; }
static gboolean subdir_check_job (GIOSchedulerJob *job, GCancellable *cancellable, gpointer user_data) { FmDirTreeModel *dir_tree_model = FM_DIR_TREE_MODEL (user_data); // Lock ---------------------------------------------------------------------------------------- g_mutex_lock (dir_tree_model->subdir_checks_mutex); GList *item_list = (GList*) g_queue_pop_head (&dir_tree_model->subdir_checks); FmDirTreeItem *dir_tree_item = (FmDirTreeItem*) item_list->data; dir_tree_model->current_subdir_check = item_list; // If the directory is a Drive, get it's target directory... //gboolean is_drive = fm_file_info_is_drive (dir_tree_item->file_info); GFile *gfile; gboolean is_mountable = fm_file_info_is_mountable (dir_tree_item->file_info); if (is_mountable) { gfile = g_file_new_for_path (fm_file_info_get_target (dir_tree_item->file_info)); } else { gfile = fm_path_to_gfile (fm_file_info_get_path (dir_tree_item->file_info)); } g_mutex_unlock (dir_tree_model->subdir_checks_mutex); // Unlock -------------------------------------------------------------------------------------- //~ GError *gerror = NULL; //~ gfile_info = g_file_query_info (gfile, gfile_info_query_attribs, 0, fm_job_get_cancellable (fmjob), &gerror); /** * Parse input directory... * */ char *directory = fm_file_info_get_name (dir_tree_item->file_info); JOB_DEBUG ("\n----------------------------------------------------------------------------------------------\n"); JOB_DEBUG ("JOB_DEBUG: subdir_check_job: check \"%s\"\n", directory); JOB_DEBUG ("----------------------------------------------------------------------------------------------\n"); if (is_mountable) { JOB_DEBUG ("JOB_DEBUG: subdir_check_job: %s is mountable type !!!\n\n", directory); } GFileEnumerator *enumerator = g_file_enumerate_children (gfile, G_FILE_ATTRIBUTE_STANDARD_NAME"," G_FILE_ATTRIBUTE_STANDARD_TYPE"," G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN, 0, cancellable, NULL); gboolean has_subdir = FALSE; if (enumerator) { while (!g_cancellable_is_cancelled (cancellable)) { GFileInfo *gfile_info = g_file_enumerator_next_file (enumerator, cancellable, NULL); if (G_LIKELY (gfile_info)) { GFileType g_file_type = g_file_info_get_file_type (gfile_info); gboolean is_hidden = g_file_info_get_is_hidden (gfile_info); //~ TREEVIEW_DEBUG ("TREEVIEW_DEBUG: subdir_check_job: GFileInfo for %s = %d\n", //~ g_file_info_get_name (gfile_info), g_file_type); g_object_unref (gfile_info); if (g_file_type == G_FILE_TYPE_DIRECTORY || g_file_type == G_FILE_TYPE_MOUNTABLE) { if (dir_tree_model->show_hidden || !is_hidden) { JOB_DEBUG ("JOB_DEBUG: subdir_check_job: A directory found in \"%s\" !!!\n\n", directory); has_subdir = TRUE; break; } } } else { break; } } GError *error = NULL; g_file_enumerator_close (enumerator, cancellable, &error); g_object_unref (enumerator); } else { JOB_DEBUG ("JOB_DEBUG: subdir_check_job: Error: can't read \"%s\"...\n", directory); } // NO_DEBUG ("check result - %s has_dir: %d\n", g_file_get_parse_name (gfile), has_subdir); g_object_unref (gfile); if (!has_subdir) { JOB_DEBUG ("JOB_DEBUG: subdir_check_job: No directory found in \"%s\"\n\t\t\t > Remove place holder\n\n", directory); return g_io_scheduler_job_send_to_mainloop (job, (GSourceFunc) subdir_check_remove_place_holder, dir_tree_model, NULL); } return subdir_check_finish (dir_tree_model); }