static GwyContainer* gwyfile_load(const gchar *filename) { GObject *object, *dfield; GError *err = NULL; guchar *buffer = NULL; gsize size = 0; gsize pos = 0; if (!gwy_file_get_contents(filename, &buffer, &size, &err)) { g_warning("Cannot read file %s", filename); g_clear_error(&err); return NULL; } if (size < MAGIC_SIZE || (memcmp(buffer, MAGIC, MAGIC_SIZE) && memcmp(buffer, MAGIC2, MAGIC_SIZE))) { g_warning("File %s doesn't seem to be a .gwy file", filename); if (!gwy_file_abandon_contents(buffer, size, &err)) { g_critical("%s", err->message); g_clear_error(&err); } return NULL; } if (!memcmp(buffer, MAGIC, MAGIC_SIZE)) object = gwy_serializable_deserialize(buffer + MAGIC_SIZE, size - MAGIC_SIZE, &pos); else object = gwy_container_deserialize2(buffer + MAGIC_SIZE, size - MAGIC_SIZE, &pos); if (!gwy_file_abandon_contents(buffer, size, &err)) { g_critical("%s", err->message); g_clear_error(&err); } if (!object) { g_warning("File %s deserialization failed", filename); return NULL; } if (!GWY_IS_CONTAINER(object)) { g_warning("File %s contains some strange object", filename); g_object_unref(object); return NULL; } dfield = gwy_container_get_object_by_name(GWY_CONTAINER(object), "/0/data"); if (!dfield || !GWY_IS_DATA_FIELD(dfield)) { g_warning("File %s contains no data field", filename); g_object_unref(object); return NULL; } return (GwyContainer*)object; }
static GwyContainer* gwyfile_load(const gchar *filename, G_GNUC_UNUSED GwyRunType mode, GError **error) { GObject *object; GError *err = NULL; guchar *buffer = NULL; gsize size = 0; gsize pos = 0; if (!gwy_file_get_contents(filename, &buffer, &size, &err)) { err_GET_FILE_CONTENTS(error, &err); return NULL; } if (size < MAGIC_SIZE || (memcmp(buffer, MAGIC, MAGIC_SIZE) && memcmp(buffer, MAGIC2, MAGIC_SIZE))) { err_FILE_TYPE(error, "Gwyddion"); gwy_file_abandon_contents(buffer, size, &err); return NULL; } if (!memcmp(buffer, MAGIC, MAGIC_SIZE)) { object = gwy_container_deserialize_old(buffer + MAGIC_SIZE, size - MAGIC_SIZE, &pos); gwyfile_remove_old_data(object); } else object = gwy_serializable_deserialize(buffer + MAGIC_SIZE, size - MAGIC_SIZE, &pos); gwy_file_abandon_contents(buffer, size, &err); if (!object) { g_set_error(error, GWY_MODULE_FILE_ERROR, GWY_MODULE_FILE_ERROR_DATA, _("Data deserialization failed.")); return NULL; } if (!GWY_IS_CONTAINER(object)) { g_set_error(error, GWY_MODULE_FILE_ERROR, GWY_MODULE_FILE_ERROR_DATA, _("Data deserialization succeeded, but resulted in " "an unexpected object %s."), g_type_name(G_TYPE_FROM_INSTANCE(object))); g_object_unref(object); return NULL; } gwyfile_pack_metadata(GWY_CONTAINER(object)); return GWY_CONTAINER(object); }
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 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); }
static GObject* gwy_container_deserialize_old(const guchar *buffer, gsize size, gsize *position) { GwyContainer *container; gsize mysize, pos; const guchar *buf; gwy_debug(""); g_return_val_if_fail(buffer, NULL); pos = gwy_serialize_check_string(buffer, size, *position, g_type_name(GWY_TYPE_CONTAINER)); g_return_val_if_fail(pos, NULL); *position += pos; mysize = gwy_serialize_unpack_int32(buffer, size, position); buf = buffer + *position; pos = 0; container = (GwyContainer*)gwy_container_new(); container->in_construction = TRUE; while (pos < mysize) { GType type; guchar *name; GQuark key; GObject *object; type = gwy_serialize_unpack_int32(buf, mysize, &pos); name = gwy_serialize_unpack_string(buf, mysize, &pos); gwy_debug("deserializing %s => %s", name, g_type_name(type)); key = g_quark_from_string(name); g_free(name); switch (type) { case G_TYPE_OBJECT: if ((object = gwy_serializable_deserialize(buf, mysize, &pos))) { gwy_container_set_object(container, key, object); g_object_unref(object); } break; case G_TYPE_BOOLEAN: gwy_container_set_boolean(container, key, gwy_serialize_unpack_boolean(buf, mysize, &pos)); break; case G_TYPE_UCHAR: gwy_container_set_uchar(container, key, gwy_serialize_unpack_char(buf, mysize, &pos)); break; case G_TYPE_INT: gwy_container_set_int32(container, key, gwy_serialize_unpack_int32(buf, mysize, &pos)); break; case G_TYPE_INT64: gwy_container_set_int64(container, key, gwy_serialize_unpack_int64(buf, mysize, &pos)); break; case G_TYPE_DOUBLE: gwy_container_set_double(container, key, gwy_serialize_unpack_double(buf, mysize, &pos)); break; case G_TYPE_STRING: gwy_container_set_string(container, key, gwy_serialize_unpack_string(buf, mysize, &pos)); break; default: g_warning("Cannot unpack GValue holding type #%d", (gint)type); break; } } *position += mysize; container->in_construction = FALSE; return (GObject*)container; }