static int import_images(lua_State *L) { char *full_name = g_realpath(luaL_checkstring(L, -1)); int result; if(!full_name || !g_file_test(full_name, G_FILE_TEST_EXISTS)) { g_free(full_name); return luaL_error(L, "no such file or directory"); } else if(g_file_test(full_name, G_FILE_TEST_IS_DIR)) { result = dt_film_import(full_name); if(result == 0) { g_free(full_name); return luaL_error(L, "error while importing"); } luaA_push(L, dt_lua_film_t, &result); } else { dt_film_t new_film; dt_film_init(&new_film); char *dirname = g_path_get_dirname(full_name); char *expanded_path = dt_util_fix_path(dirname); g_free(dirname); char *final_path = g_realpath(expanded_path); g_free(expanded_path); if(!final_path) { g_free(full_name); return luaL_error(L, "Error while importing : %s\n", strerror(errno)); } result = dt_film_new(&new_film, final_path); free(final_path); if(result == 0) { if(dt_film_is_empty(new_film.id)) dt_film_remove(new_film.id); dt_film_cleanup(&new_film); g_free(full_name); return luaL_error(L, "error while importing"); } result = dt_image_import(new_film.id, full_name, TRUE); if(dt_film_is_empty(new_film.id)) dt_film_remove(new_film.id); dt_film_cleanup(&new_film); if(result == 0) { g_free(full_name); return luaL_error(L, "error while importing"); } luaA_push(L, dt_lua_image_t, &result); } g_free(full_name); return 1; }
void leave(dt_view_t *self) { dt_capture_t *cv = (dt_capture_t *)self->data; if( dt_film_is_empty(cv->film->id) != 0) dt_film_remove(cv->film->id ); /* disconnect from filmstrip image activate */ dt_control_signal_disconnect(darktable.signals, G_CALLBACK(_view_capture_filmstrip_activate_callback), (gpointer)self); }
static int film_delete(lua_State *L) { dt_lua_film_t film_id; luaA_to(L,dt_lua_film_t,&film_id,1); gboolean force = lua_toboolean(L,2); if(force || dt_film_is_empty(film_id)) { dt_film_remove(film_id); } else { return luaL_error(L,"Can't delete film, film is not empty"); } return 0; }
void dt_film_cleanup(dt_film_t *film) { dt_pthread_mutex_destroy(&film->images_mutex); if(film->dir) { g_dir_close(film->dir); film->dir = NULL; } // if the film is empty => remove it again. if(dt_film_is_empty(film->id)) { dt_film_remove(film->id); } }
static int32_t dt_film_import1_run(dt_job_t *job) { dt_film_import1_t *params = dt_control_job_get_params(job); dt_film_import1(job, params->film); dt_pthread_mutex_lock(¶ms->film->images_mutex); params->film->ref--; dt_pthread_mutex_unlock(¶ms->film->images_mutex); if(params->film->ref <= 0) { if(dt_film_is_empty(params->film->id)) { dt_film_remove(params->film->id); } } return 0; }
static void _import_session_cleanup_filmroll(dt_import_session_t *self) { if (self->film == NULL) return; /* if current filmroll for session is empty, remove it */ /* TODO: check if dt_film_remove actual removes directories */ if (dt_film_is_empty(self->film->id)) dt_film_remove(self->film->id); dt_film_cleanup(self->film); g_free(self->film); self->film = NULL; }
static int32_t dt_film_import1_run(dt_job_t *job) { dt_film_import1_t *params = dt_control_job_get_params(job); dt_film_import1(job, params->film); dt_pthread_mutex_lock(¶ms->film->images_mutex); params->film->ref--; dt_pthread_mutex_unlock(¶ms->film->images_mutex); if(params->film->ref <= 0) { if(dt_film_is_empty(params->film->id)) { dt_film_remove(params->film->id); } } // notify the user via the window manager if(darktable.gui) gtk_window_set_urgency_hint(GTK_WINDOW(dt_ui_main_window(darktable.gui->ui)), TRUE); return 0; }
void dt_film_import1(dt_job_t *job, dt_film_t *film) { gboolean recursive = dt_conf_get_bool("ui_last/import_recursive"); /* first of all gather all images to import */ GList *images = NULL; images = _film_recursive_get_files(film->dirname, recursive, &images); if(g_list_length(images) == 0) { dt_control_log(_("no supported images were found to be imported")); return; } #ifdef USE_LUA /* pre-sort image list for easier handling in Lua code */ images = g_list_sort(images, (GCompareFunc)_film_filename_cmp); dt_lua_lock(); lua_State *L = darktable.lua_state.state; { GList *elt = images; lua_newtable(L); while(elt) { lua_pushstring(L, elt->data); luaL_ref(L, -2); elt = g_list_next(elt); } } lua_pushvalue(L, -1); dt_lua_event_trigger(L, "pre-import", 1); { g_list_free_full(images, g_free); // recreate list of images images = NULL; lua_pushnil(L); /* first key */ while(lua_next(L, -2) != 0) { /* uses 'key' (at index -2) and 'value' (at index -1) */ void *filename = strdup(luaL_checkstring(L, -1)); lua_pop(L, 1); images = g_list_prepend(images, filename); } } lua_pop(L, 1); // remove the table again from the stack dt_lua_unlock(); #endif if(g_list_length(images) == 0) { // no error message, lua probably emptied the list on purpose return; } /* we got ourself a list of images, lets sort and start import */ images = g_list_sort(images, (GCompareFunc)_film_filename_cmp); /* let's start import of images */ gchar message[512] = { 0 }; double fraction = 0; guint total = g_list_length(images); g_snprintf(message, sizeof(message) - 1, ngettext("importing %d image", "importing %d images", total), total); dt_control_job_set_progress_message(job, message); /* loop thru the images and import to current film roll */ dt_film_t *cfr = film; GList *image = g_list_first(images); do { gchar *cdn = g_path_get_dirname((const gchar *)image->data); /* check if we need to initialize a new filmroll */ if(!cfr || g_strcmp0(cfr->dirname, cdn) != 0) { // FIXME: maybe refactor into function and call it? if(cfr && cfr->dir) { /* check if we can find a gpx data file to be auto applied to images in the jsut imported filmroll */ g_dir_rewind(cfr->dir); const gchar *dfn = NULL; while((dfn = g_dir_read_name(cfr->dir)) != NULL) { /* check if we have a gpx to be auto applied to filmroll */ size_t len = strlen(dfn); if(strcmp(dfn + len - 4, ".gpx") == 0 || strcmp(dfn + len - 4, ".GPX") == 0) { gchar *gpx_file = g_build_path(G_DIR_SEPARATOR_S, cfr->dirname, dfn, NULL); gchar *tz = dt_conf_get_string("plugins/lighttable/geotagging/tz"); dt_control_gpx_apply(gpx_file, cfr->id, tz); g_free(gpx_file); g_free(tz); } } } /* cleanup previously imported filmroll*/ if(cfr && cfr != film) { if(dt_film_is_empty(cfr->id)) { dt_film_remove(cfr->id); } dt_film_cleanup(cfr); free(cfr); cfr = NULL; } /* initialize and create a new film to import to */ cfr = malloc(sizeof(dt_film_t)); dt_film_init(cfr); dt_film_new(cfr, cdn); } g_free(cdn); /* import image */ dt_image_import(cfr->id, (const gchar *)image->data, FALSE); fraction += 1.0 / total; dt_control_job_set_progress(job, fraction); } while((image = g_list_next(image)) != NULL); g_list_free_full(images, g_free); // only redraw at the end, to not spam the cpu with exposure events dt_control_queue_redraw_center(); dt_control_signal_raise(darktable.signals, DT_SIGNAL_TAG_CHANGED); dt_control_signal_raise(darktable.signals, DT_SIGNAL_FILMROLLS_IMPORTED, film->id); // FIXME: maybe refactor into function and call it? if(cfr && cfr->dir) { /* check if we can find a gpx data file to be auto applied to images in the just imported filmroll */ g_dir_rewind(cfr->dir); const gchar *dfn = NULL; while((dfn = g_dir_read_name(cfr->dir)) != NULL) { /* check if we have a gpx to be auto applied to filmroll */ size_t len = strlen(dfn); if(strcmp(dfn + len - 4, ".gpx") == 0 || strcmp(dfn + len - 4, ".GPX") == 0) { gchar *gpx_file = g_build_path(G_DIR_SEPARATOR_S, cfr->dirname, dfn, NULL); gchar *tz = dt_conf_get_string("plugins/lighttable/geotagging/tz"); dt_control_gpx_apply(gpx_file, cfr->id, tz); g_free(gpx_file); g_free(tz); } } } /* cleanup previously imported filmroll*/ if(cfr && cfr != film) { dt_film_cleanup(cfr); free(cfr); } }
int dt_film_import(const char *dirname) { int rc; sqlite3_stmt *stmt; GError *error = NULL; /* initialize a film object*/ dt_film_t *film = (dt_film_t *)malloc(sizeof(dt_film_t)); dt_film_init(film); film->id = -1; /* lookup if film exists and reuse id */ DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT id FROM main.film_rolls WHERE folder = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, dirname, -1, SQLITE_STATIC); if(sqlite3_step(stmt) == SQLITE_ROW) film->id = sqlite3_column_int(stmt, 0); sqlite3_finalize(stmt); /* if we didn't find an id, lets instantiate a new filmroll */ if(film->id <= 0) { char datetime[20]; dt_gettime(datetime, sizeof(datetime)); /* insert a new film roll into database */ DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "INSERT INTO main.film_rolls (id, datetime_accessed, folder) VALUES " "(NULL, ?1, ?2)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, datetime, -1, SQLITE_STATIC); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, dirname, -1, SQLITE_STATIC); rc = sqlite3_step(stmt); if(rc != SQLITE_DONE) fprintf(stderr, "[film_import] failed to insert film roll! %s\n", sqlite3_errmsg(dt_database_get(darktable.db))); sqlite3_finalize(stmt); /* requery for filmroll and fetch new id */ DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT id FROM main.film_rolls WHERE folder=?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, dirname, -1, SQLITE_STATIC); if(sqlite3_step(stmt) == SQLITE_ROW) film->id = sqlite3_column_int(stmt, 0); sqlite3_finalize(stmt); } /* bail out if we got troubles */ if(film->id <= 0) { // if the film is empty => remove it again. if(dt_film_is_empty(film->id)) { dt_film_remove(film->id); } dt_film_cleanup(film); free(film); return 0; } // when called without job system running the import will be done synchronously and destroy the film object int filmid = film->id; /* at last put import film job on queue */ film->last_loaded = 0; g_strlcpy(film->dirname, dirname, sizeof(film->dirname)); char *last = &film->dirname[strlen(film->dirname) - 1]; if(*last == '/' && last != film->dirname) *last = '\0'; // remove the closing /, unless it's also the start film->dir = g_dir_open(film->dirname, 0, &error); if(error) { fprintf(stderr, "[film_import] failed to open directory %s: %s\n", film->dirname, error->message); g_error_free(error); dt_film_cleanup(film); free(film); return 0; } dt_control_add_job(darktable.control, DT_JOB_QUEUE_USER_BG, dt_film_import1_create(film)); return filmid; }
void _capture_view_set_jobcode(const dt_view_t *view, const char *name) { g_assert( view != NULL ); dt_capture_t *cv=(dt_capture_t *)view->data; /* take care of previous capture filmroll */ if( cv->film ) { if( dt_film_is_empty(cv->film->id) ) dt_film_remove(cv->film->id ); else dt_film_cleanup( cv->film ); } /* lets initialize a new filmroll for the capture... */ cv->film = (dt_film_t*)malloc(sizeof(dt_film_t)); if(!cv->film) return; dt_film_init(cv->film); int current_filmroll = dt_conf_get_int("plugins/capture/current_filmroll"); if(current_filmroll >= 0) { /* open existing filmroll and import captured images into this roll */ cv->film->id = current_filmroll; if (dt_film_open2 (cv->film) !=0) { /* failed to open the current filmroll, let's reset and create a new one */ dt_conf_set_int ("plugins/capture/current_filmroll",-1); } else cv->path = g_strdup(cv->film->dirname); } if (dt_conf_get_int ("plugins/capture/current_filmroll") == -1) { if(cv->jobcode) g_free(cv->jobcode); cv->jobcode = g_strdup(name); // Setup variables jobcode... cv->vp->jobcode = cv->jobcode; /* reset session sequence number */ dt_variables_reset_sequence (cv->vp); // Construct the directory for filmroll... gchar* path = g_build_path(G_DIR_SEPARATOR_S,cv->basedirectory,cv->subdirectory, (char *)NULL); cv->path = dt_util_fix_path(path); g_free(path); dt_variables_expand( cv->vp, cv->path, FALSE ); sprintf(cv->film->dirname,"%s",dt_variables_get_result(cv->vp)); // Create recursive directories, abort if no access if( g_mkdir_with_parents(cv->film->dirname,0755) == -1 ) { dt_control_log(_("failed to create session path %s."), cv->film->dirname); if(cv->film) { free( cv->film ); cv->film = NULL; } return; } if(dt_film_new(cv->film,cv->film->dirname) > 0) { // Switch to new filmroll dt_film_open(cv->film->id); /* store current filmroll */ dt_conf_set_int("plugins/capture/current_filmroll",cv->film->id); } dt_control_log(_("new session initiated '%s'"),cv->jobcode,cv->film->id); } }
void dt_film_import1(dt_film_t *film) { gboolean recursive = dt_conf_get_bool("ui_last/import_recursive"); /* first of all gather all images to import */ GList *images = NULL; images = _film_recursive_get_files(film->dirname, recursive, &images); if(g_list_length(images) == 0) { dt_control_log(_("no supported images were found to be imported")); return; } /* we got ourself a list of images, lets sort and start import */ images = g_list_sort(images,(GCompareFunc)_film_filename_cmp); /* let's start import of images */ gchar message[512] = {0}; double fraction = 0; uint32_t total = g_list_length(images); g_snprintf(message, sizeof(message) - 1, ngettext("importing %d image","importing %d images", total), total); const guint *jid = dt_control_backgroundjobs_create(darktable.control, 0, message); /* loop thru the images and import to current film roll */ dt_film_t *cfr = film; GList *image = g_list_first(images); do { gchar *cdn = g_path_get_dirname((const gchar *)image->data); /* check if we need to initialize a new filmroll */ if(!cfr || g_strcmp0(cfr->dirname, cdn) != 0) { #if GLIB_CHECK_VERSION (2, 26, 0) if(cfr && cfr->dir) { /* check if we can find a gpx data file to be auto applied to images in the jsut imported filmroll */ g_dir_rewind(cfr->dir); const gchar *dfn = NULL; while ((dfn = g_dir_read_name(cfr->dir)) != NULL) { /* check if we have a gpx to be auto applied to filmroll */ if(strcmp(dfn+strlen(dfn)-4,".gpx") == 0 || strcmp(dfn+strlen(dfn)-4,".GPX") == 0) { gchar *gpx_file = g_build_path (G_DIR_SEPARATOR_S, cfr->dirname, dfn, NULL); dt_control_gpx_apply(gpx_file, cfr->id, dt_conf_get_string("plugins/lighttable/geotagging/tz")); g_free(gpx_file); } } } #endif /* cleanup previously imported filmroll*/ if(cfr && cfr!=film) { if(dt_film_is_empty(cfr->id)) { dt_film_remove(cfr->id); } dt_film_cleanup(cfr); g_free(cfr); cfr = NULL; } /* initialize and create a new film to import to */ cfr = g_malloc(sizeof(dt_film_t)); dt_film_init(cfr); dt_film_new(cfr, cdn); } /* import image */ dt_image_import(cfr->id, (const gchar *)image->data, FALSE); fraction+=1.0/total; dt_control_backgroundjobs_progress(darktable.control, jid, fraction); } while( (image = g_list_next(image)) != NULL); // only redraw at the end, to not spam the cpu with exposure events dt_control_queue_redraw_center(); dt_control_signal_raise(darktable.signals,DT_SIGNAL_TAG_CHANGED); dt_control_backgroundjobs_destroy(darktable.control, jid); dt_control_signal_raise(darktable.signals , DT_SIGNAL_FILMROLLS_IMPORTED,film->id); #if GLIB_CHECK_VERSION (2, 26, 0) if(cfr && cfr->dir) { /* check if we can find a gpx data file to be auto applied to images in the just imported filmroll */ g_dir_rewind(cfr->dir); const gchar *dfn = NULL; while ((dfn = g_dir_read_name(cfr->dir)) != NULL) { /* check if we have a gpx to be auto applied to filmroll */ if(strcmp(dfn+strlen(dfn)-4,".gpx") == 0 || strcmp(dfn+strlen(dfn)-4,".GPX") == 0) { gchar *gpx_file = g_build_path (G_DIR_SEPARATOR_S, cfr->dirname, dfn, NULL); dt_control_gpx_apply(gpx_file, cfr->id, dt_conf_get_string("plugins/lighttable/geotagging/tz")); g_free(gpx_file); } } } #endif }
int dt_film_import(const char *dirname) { int rc; sqlite3_stmt *stmt; /* initialize a film object*/ dt_film_t *film = (dt_film_t *)malloc(sizeof(dt_film_t)); dt_film_init(film); film->id = -1; /* lookup if film exists and reuse id */ DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select id from film_rolls where folder = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, dirname, strlen(dirname), SQLITE_STATIC); if(sqlite3_step(stmt) == SQLITE_ROW) film->id = sqlite3_column_int(stmt, 0); sqlite3_finalize(stmt); /* if we didn't find a id, lets instansiate a new filmroll */ if(film->id <= 0) { char datetime[20]; dt_gettime(datetime); /* insert a new film roll into database */ DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "insert into film_rolls (id, datetime_accessed, folder) values " "(null, ?1, ?2)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, datetime, strlen(datetime), SQLITE_STATIC); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, dirname, strlen(dirname), SQLITE_STATIC); rc = sqlite3_step(stmt); if(rc != SQLITE_DONE) fprintf(stderr, "[film_import] failed to insert film roll! %s\n", sqlite3_errmsg(dt_database_get(darktable.db))); sqlite3_finalize(stmt); /* requery for filmroll and fetch new id */ DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select id from film_rolls where folder=?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, dirname, strlen(dirname), SQLITE_STATIC); if(sqlite3_step(stmt) == SQLITE_ROW) film->id = sqlite3_column_int(stmt, 0); sqlite3_finalize(stmt); } /* bail out if we got troubles */ if(film->id <= 0) { // if the film is empty => remove it again. if(dt_film_is_empty(film->id)) { dt_film_remove(film->id); } dt_film_cleanup(film); free(film); return 0; } /* at last put import film job on queue */ dt_job_t j; film->last_loaded = 0; g_strlcpy(film->dirname, dirname, sizeof(film->dirname)); film->dir = g_dir_open(film->dirname, 0, NULL); dt_film_import1_init(&j, film); dt_control_add_job(darktable.control, &j); return film->id; }