/** * gwy_resource_build_filename: * @resource: A resource. * * Builds file name a resource should be saved to. * * If the resource has not been newly created, renamed, or system it was * probably loaded from file of the same name. * * Returns: Resource file name as a newly allocated string that must be freed * by caller. **/ gchar* gwy_resource_build_filename(GwyResource *resource) { GwyResourceClass *klass; g_return_val_if_fail(GWY_IS_RESOURCE(resource), NULL); if (resource->is_const) g_warning("Filename of a constant resource `%s' should not be needed", resource->name->str); klass = GWY_RESOURCE_GET_CLASS(resource); return g_build_filename(gwy_get_user_dir(), klass->name, resource->name->str, NULL); }
/** * gwy_resource_class_mkdir: * @klass: A resource class. * * Creates directory for user resources if it does not exist. * * Returns: %TRUE if the directory exists or has been successfully created. * %FALSE if it doesn't exist and cannot be created, consult errno * for reason. **/ gboolean gwy_resource_class_mkdir(GwyResourceClass *klass) { gchar *path; gint ok; g_return_val_if_fail(GWY_IS_RESOURCE_CLASS(klass), FALSE); path = g_build_filename(gwy_get_user_dir(), klass->name, NULL); if (g_file_test(path, G_FILE_TEST_IS_DIR)) { g_free(path); return TRUE; } ok = !g_mkdir(path, 0700); g_free(path); return ok; }
/** * gwy_resource_class_load: * @klass: A resource class. * * Loads resources of a resources class from disk. * * Resources are loaded from system directory (and marked constant) and from * user directory (marked modifiable). **/ void gwy_resource_class_load(GwyResourceClass *klass) { gchar *path, *datadir; g_return_if_fail(GWY_IS_RESOURCE_CLASS(klass)); g_return_if_fail(klass->inventory); gwy_inventory_forget_order(klass->inventory); datadir = gwy_find_self_dir("data"); path = g_build_filename(datadir, klass->name, NULL); g_free(datadir); gwy_resource_class_load_dir(path, klass, TRUE); g_free(path); path = g_build_filename(gwy_get_user_dir(), klass->name, NULL); gwy_resource_class_load_dir(path, klass, FALSE); g_free(path); gwy_inventory_restore_order(klass->inventory); }
static void load_modules(void) { const gchar *const module_types[] = { "file", "layer", "process", "graph", "tools", NULL }; GPtrArray *module_dirs; const gchar *upath; gchar *mpath; guint i; module_dirs = g_ptr_array_new(); /* System modules */ mpath = gwy_find_self_dir("modules"); for (i = 0; module_types[i]; i++) { g_ptr_array_add(module_dirs, g_build_filename(mpath, module_types[i], NULL)); } g_free(mpath); /* User modules */ upath = gwy_get_user_dir(); for (i = 0; module_types[i]; i++) { g_ptr_array_add(module_dirs, g_build_filename(upath, module_types[i], NULL)); } /* Register all found there, in given order. */ g_ptr_array_add(module_dirs, NULL); gwy_module_register_modules((const gchar**)module_dirs->pdata); for (i = 0; module_dirs->pdata[i]; i++) g_free(module_dirs->pdata[i]); g_ptr_array_free(module_dirs, TRUE); }
static void gfilter_load_args(GwyContainer *container, GFilterArgs *args) { GwyInventory *inventory; gchar *filename, *buffer; gsize size; guint i; inventory = gwy_grain_values(); *args = gfilter_defaults; gwy_container_gis_boolean_by_name(container, update_key, &args->update); gwy_container_gis_int32_by_name(container, expanded_key, &args->expanded); gwy_container_gis_enum_by_name(container, logical_key, &args->logical); for (i = 0; i < NQUANTITIES; i++) { RangeRecord *rr = args->ranges + i; gchar buf[sizeof(quantity_key) + 10]; g_snprintf(buf, sizeof(buf), "%s%u", quantity_key, i+1); gwy_container_gis_string_by_name(container, buf, (const guchar**)&rr->quantity); } args->ranges_history = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, range_record_free); filename = g_build_filename(gwy_get_user_dir(), "grain_filter", "ranges", NULL); if (g_file_get_contents(filename, &buffer, &size, NULL)) { gchar *p = buffer, *line; for (line = gwy_str_next_line(&p); line; line = gwy_str_next_line(&p)) { g_strstrip(line); if (*line) { GwyGrainValue *gvalue; RangeRecord *rr; gchar *s = line, *end; gdouble lower, upper; lower = g_ascii_strtod(s, &end); s = end; upper = g_ascii_strtod(s, &end); if (end == s) { g_warning("Invalid grain_filter range record: %s.", line); continue; } s = end; g_strstrip(s); if (!(gvalue = gwy_inventory_get_item(inventory, s))) { g_warning("Invalid grain_filter range record: %s.", line); continue; } rr = g_slice_new(RangeRecord); rr->lower = lower; rr->upper = upper; rr->quantity = gwy_resource_get_name(GWY_RESOURCE(gvalue)); g_hash_table_insert(args->ranges_history, (gpointer)rr->quantity, rr); } } g_free(buffer); } g_free(filename); gfilter_sanitize_args(args); }
static void cnew(G_GNUC_UNUSED GwyContainer *data, GwyRunType run) { GwyDataField *dfield; CNewArgs args; gboolean ok; gint oldid, i, j, k, n; GwyCalibration *calibration; GwyCalData *caldata = NULL, *old; gchar *filename; gchar *contents; gsize len = 0; GError *err = NULL; gsize pos = 0; GString *str; gdouble *x, *y, *z, *xunc, *yunc, *zunc, *xerr, *yerr, *zerr; FILE *fh; g_return_if_fail(run & CNEW_RUN_MODES); gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield, GWY_APP_DATA_FIELD_ID, &oldid, 0); g_return_if_fail(dfield); cnew_load_args(gwy_app_settings_get(), &args); if (run == GWY_RUN_INTERACTIVE) { ok = cnew_dialog(&args, dfield); cnew_save_args(gwy_app_settings_get(), &args); if (!ok) return; } /*create the caldata*/ caldata = gwy_caldata_new(8); x = gwy_caldata_get_x(caldata); y = gwy_caldata_get_y(caldata); z = gwy_caldata_get_z(caldata); xerr = gwy_caldata_get_xerr(caldata); yerr = gwy_caldata_get_yerr(caldata); zerr = gwy_caldata_get_zerr(caldata); xunc = gwy_caldata_get_xunc(caldata); yunc = gwy_caldata_get_yunc(caldata); zunc = gwy_caldata_get_zunc(caldata); gwy_caldata_set_si_unit_x(caldata, gwy_data_field_get_si_unit_xy(dfield)); gwy_caldata_set_si_unit_y(caldata, gwy_data_field_get_si_unit_xy(dfield)); gwy_caldata_set_si_unit_z(caldata, gwy_data_field_get_si_unit_z(dfield)); n = 0; for (i=0; i<2; i++) { for (j=0; j<2; j++) { for (k=0; k<2; k++) { if (i) x[n] = args.xrange_from; else x[n] = args.xrange_to; if (j) y[n] = args.yrange_from; else y[n] = args.yrange_to; if (k) z[n] = args.zrange_from; else z[n] = args.zrange_to; if (i) xerr[n] = (args.xrange_to-args.xrange_from)*(args.xmult-1); else xerr[n] = 0; if (j) yerr[n] = (args.yrange_to-args.yrange_from)*(args.ymult-1); else yerr[n] = 0; if (k) zerr[n] = (args.zrange_to-args.zrange_from)*(args.zmult-1); else zerr[n] = 0; xunc[n] = args.xunc; yunc[n] = args.yunc; zunc[n] = args.zunc; n++; } } } if (args.duplicate == DUPLICATE_APPEND && (calibration = gwy_inventory_get_item(gwy_calibrations(), args.name))) { filename = g_build_filename(gwy_get_user_dir(), "caldata", calibration->filename, NULL); if (!g_file_get_contents(filename, &contents, &len, &err) || !len) { g_warning("Error loading file: %s", err->message); g_clear_error(&err); return; } else { if (len) old = GWY_CALDATA(gwy_serializable_deserialize(contents, len, &pos)); g_free(contents); } gwy_caldata_append(old, caldata); g_object_unref(caldata); caldata = old; } gwy_caldata_set_range(caldata, args.xrange_from, args.xrange_to, args.yrange_from, args.yrange_to, args.zrange_from, args.zrange_to); //printf("Saving %g %g %g %g\n", args.xrange_from, args.xrange_to, args.yrange_from, args.yrange_to); /*now create and save the resource*/ if ((calibration = GWY_CALIBRATION(gwy_inventory_get_item(gwy_calibrations(), args.name)))==NULL) { calibration = gwy_calibration_new(args.name, g_strconcat(args.name, ".dat", NULL)); gwy_inventory_insert_item(gwy_calibrations(), calibration); g_object_unref(calibration); } calibration->caldata = caldata; filename = gwy_resource_build_filename(GWY_RESOURCE(calibration)); if (!g_file_test(filename, G_FILE_TEST_EXISTS)) { g_mkdir(g_build_filename(gwy_get_user_dir(), "calibrations", NULL), 0700); } fh = gwy_fopen(filename, "wb"); if (!fh) { g_warning(_("Cannot save preset: %s"), filename); g_free(filename); return; } g_free(filename); str = gwy_resource_dump(GWY_RESOURCE(calibration)); fwrite(str->str, 1, str->len, fh); fclose(fh); g_string_free(str, TRUE); gwy_resource_data_saved(GWY_RESOURCE(calibration)); gwy_resource_data_changed(GWY_RESOURCE(calibration)); /*now save the calibration data*/ //gwy_caldata_debug(caldata, "Saving: "); gwy_caldata_save_data(caldata, calibration->filename); }
static void pygwy_register_plugins(void) { GDir *pygwy_plugin_dir; const gchar *pygwy_filename; gchar *menu_path; gchar pygwy_plugin_dir_name[] = "pygwy"; // FIXME: maybe place somewhere else gchar *pygwy_plugname; PygwyPluginInfo *info; gchar *dir; GError *err = NULL; dir = g_build_filename(gwy_get_user_dir(), pygwy_plugin_dir_name, NULL); gwy_debug("Plugin path: %s", dir); pygwy_plugin_dir = g_dir_open(dir, 0, &err); if (pygwy_plugin_dir == NULL && err) { if (err->code == G_FILE_ERROR_NOENT) { // directory not found/does not exist if (g_mkdir(dir, 0700)) { g_warning("Cannot create pygwy plugin directory %s", dir); } else { gwy_debug("Pygwy directory created: %s", dir); } } else { g_warning("Cannot open pygwy directory: %s, reason: %s", dir, err->message); } g_free(dir); /* Whenever the directory has been created or not, there is no reason to continue by reading scripts as long as no script */ return; } while ( (pygwy_filename = g_dir_read_name(pygwy_plugin_dir)) ) { if (g_str_has_suffix(pygwy_filename, ".py") || g_str_has_suffix(pygwy_filename, ".PY") || g_str_has_suffix(pygwy_filename, ".Py") ) { // for menu item name use filename without extension pygwy_plugname = g_strndup(pygwy_filename, strlen(pygwy_filename)-3); } else { gwy_debug("wrong extension for file: %s", pygwy_filename); continue; } info = g_new(PygwyPluginInfo, 1); info->name = pygwy_plugname; info->filename = g_build_filename(dir, pygwy_filename, NULL); menu_path = g_strconcat(_("/_Plug-Ins/"), pygwy_plugname, NULL); gwy_debug("appending: %s, %s", info->name, info->filename); if (gwy_process_func_register(info->name, pygwy_plugin_run, menu_path, NULL, GWY_RUN_IMMEDIATE, GWY_MENU_FLAG_DATA, // TODO: determine correct flag N_("Function written in Python")) ) { // not very descriptive s_pygwy_plugins = g_list_append(s_pygwy_plugins, info); } else { g_free(info->name); g_free(info->filename); g_free(info); g_warning("Cannot register plugin '%s'", pygwy_filename); } } g_dir_close(pygwy_plugin_dir); g_free(dir); }
static void cload(GwyContainer *data, GwyRunType run) { GwyDataField *dfield; CLoadArgs args; gboolean ok; gint oldid, i, n; GwyCalibration *calibration; GwyCalData *caldata = NULL; gchar *filename; gchar *contents; gsize len; GError *err = NULL; gsize pos = 0; GString *str; GByteArray *barray; FILE *fh; g_return_if_fail(run & CNEW_RUN_MODES); gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield, GWY_APP_DATA_FIELD_ID, &oldid, 0); g_return_if_fail(dfield); //cload_load_args(gwy_app_settings_get(), &args); if (run == GWY_RUN_INTERACTIVE) { ok = cload_dialog(&args, dfield); //cload_save_args(gwy_app_settings_get(), &args); if (!ok) return; } /*if append requested, copy newly created calibration into old one*/ if (args.duplicate == DUPLICATE_APPEND && (calibration = gwy_inventory_get_item(gwy_calibrations(), args.name))) { filename = g_build_filename(gwy_get_user_dir(), "caldata", calibration->filename, NULL); if (!g_file_get_contents(filename, &contents, &len, &err)) { g_warning("Error loading file: %s\n", err->message); g_clear_error(&err); return; } else { if (len) caldata = GWY_CALDATA(gwy_serializable_deserialize(contents, len, &pos)); g_free(contents); } n = caldata->ndata + args.caldata->ndata; //add to args->caldata args.caldata->x = g_realloc(args.caldata->x, n*sizeof(gdouble)); args.caldata->y = g_realloc(args.caldata->y, n*sizeof(gdouble)); args.caldata->z = g_realloc(args.caldata->z, n*sizeof(gdouble)); args.caldata->xerr = g_realloc(args.caldata->xerr, n*sizeof(gdouble)); args.caldata->yerr = g_realloc(args.caldata->yerr, n*sizeof(gdouble)); args.caldata->zerr = g_realloc(args.caldata->zerr, n*sizeof(gdouble)); args.caldata->xunc = g_realloc(args.caldata->xunc, n*sizeof(gdouble)); args.caldata->yunc = g_realloc(args.caldata->yunc, n*sizeof(gdouble)); args.caldata->zunc = g_realloc(args.caldata->zunc, n*sizeof(gdouble)); for (i=args.caldata->ndata; i<n; i++) { args.caldata->x[i] = caldata->x[i-caldata->ndata]; args.caldata->y[i] = caldata->y[i-caldata->ndata]; args.caldata->z[i] = caldata->z[i-caldata->ndata]; args.caldata->xerr[i] = caldata->xerr[i-caldata->ndata]; args.caldata->yerr[i] = caldata->yerr[i-caldata->ndata]; args.caldata->zerr[i] = caldata->zerr[i-caldata->ndata]; args.caldata->xunc[i] = caldata->xunc[i-caldata->ndata]; args.caldata->yunc[i] = caldata->yunc[i-caldata->ndata]; args.caldata->zunc[i] = caldata->zunc[i-caldata->ndata]; } args.caldata->ndata = n; } /*now create and save the resource*/ if ((calibration = GWY_CALIBRATION(gwy_inventory_get_item(gwy_calibrations(), args.name)))==NULL) { calibration = gwy_calibration_new(args.name, 8, g_strconcat(args.name, ".dat", NULL)); gwy_inventory_insert_item(gwy_calibrations(), calibration); g_object_unref(calibration); } filename = gwy_resource_build_filename(GWY_RESOURCE(calibration)); fh = g_fopen(filename, "w"); if (!fh) { g_warning("Cannot save preset: %s", filename); g_free(filename); return; } g_free(filename); str = gwy_resource_dump(GWY_RESOURCE(calibration)); fwrite(str->str, 1, str->len, fh); fclose(fh); g_string_free(str, TRUE); gwy_resource_data_saved(GWY_RESOURCE(calibration)); //debugcal(args.caldata); /*now save the calibration data*/ if (!g_file_test(g_build_filename(gwy_get_user_dir(), "caldata", NULL), G_FILE_TEST_EXISTS)) { g_mkdir(g_build_filename(gwy_get_user_dir(), "caldata", NULL), 0700); } fh = g_fopen(g_build_filename(gwy_get_user_dir(), "caldata", calibration->filename, NULL), "w"); if (!fh) { g_warning("Cannot save caldata\n"); return; } barray = gwy_serializable_serialize(G_OBJECT(args.caldata), NULL); //g_file_set_contents(fh, barray->data, sizeof(guint8)*barray->len, NULL); fwrite(barray->data, sizeof(guint8), barray->len, fh); fclose(fh); }