// Store (key,value) pairs from a GHashTable in the kwallet. // Every 'slot' has to take care of it's own data. gboolean dt_pwstorage_kwallet_set(const gchar* slot, GHashTable* table) { _context = (backend_kwallet_context_t*)(darktable.pwstorage->backend_context); GArray* byte_array = g_array_new(FALSE, FALSE, sizeof(gchar)); GHashTableIter iter; g_hash_table_iter_init (&iter, table); gpointer key, value; guint size = g_hash_table_size(table); size = GINT_TO_BE(size); g_array_append_vals(byte_array, &size, sizeof(guint)/sizeof(gchar)); while (g_hash_table_iter_next (&iter, &key, &value)) { dt_print(DT_DEBUG_PWSTORAGE,"[pwstorage_kwallet_set] storing (%s, %s)\n",(gchar*)key, (gchar*)value); gsize length; gchar* new_key = char2qstring(key, &length); if(new_key == NULL) return FALSE; g_array_append_vals(byte_array, new_key, length); g_free(new_key); new_key = NULL; gchar* new_value = char2qstring(value, &length); if(new_value == NULL) return FALSE; g_array_append_vals(byte_array, new_value, length); g_free(new_value); new_value = NULL; } int wallet_handle = get_wallet_handle(); int ret = 0; GError* error = NULL; dbus_g_proxy_call(_context->proxy, "writeMap", &error, G_TYPE_INT, wallet_handle, // handle G_TYPE_STRING, kwallet_folder, // folder G_TYPE_STRING, slot, // key DBUS_TYPE_G_UCHAR_ARRAY, byte_array, // value G_TYPE_STRING, app_id, // appid G_TYPE_INVALID, G_TYPE_INT, &ret, G_TYPE_INVALID); g_array_free(byte_array, TRUE); if (CheckError(error)) return FALSE; if (ret != 0) dt_print(DT_DEBUG_PWSTORAGE,"[pwstorage_kwallet_set] Warning: bad return code %d from kwallet\n", ret); return ret == 0; }
// Store (key,value) pairs from a GHashTable in the kwallet. // Every 'slot' has to take care of it's own data. gboolean dt_pwstorage_kwallet_set(const backend_kwallet_context_t *context, const gchar* slot, GHashTable* table) { printf("slot %s\n", slot); GArray* byte_array = g_array_new(FALSE, FALSE, sizeof(gchar)); GHashTableIter iter; g_hash_table_iter_init (&iter, table); gpointer key, value; guint size = g_hash_table_size(table); size = GINT_TO_BE(size); g_array_append_vals(byte_array, &size, sizeof(guint)/sizeof(gchar)); while (g_hash_table_iter_next (&iter, &key, &value)) { dt_print(DT_DEBUG_PWSTORAGE,"[pwstorage_kwallet_set] storing (%s, %s)\n",(gchar*)key, (gchar*)value); gsize length; gchar* new_key = char2qstring(key, &length); if(new_key == NULL) { g_free(g_array_free(byte_array, FALSE)); return FALSE; } g_array_append_vals(byte_array, new_key, length); g_free(new_key); gchar* new_value = char2qstring(value, &length); if(new_value == NULL) { g_free(g_array_free(byte_array, FALSE)); return FALSE; } g_array_append_vals(byte_array, new_value, length); g_free(new_value); } int wallet_handle = get_wallet_handle(context); GError* error = NULL; /* signature: * * in i handle, * in s folder, * in s key, * in ay value, * in s appid, * * out i arg_0 */ GVariant *ret = g_dbus_proxy_call_sync(context->proxy, "writeMap", g_variant_new("(iss@ays)", wallet_handle, kwallet_folder, slot, g_variant_new_from_data(G_VARIANT_TYPE_BYTESTRING, byte_array->data, byte_array->len, TRUE, g_free, byte_array->data), app_id), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); g_array_free(byte_array, FALSE); if(check_error(error)) { g_variant_unref(ret); return FALSE; } GVariant *child = g_variant_get_child_value(ret, 0); int return_code = g_variant_get_int32(child); g_variant_unref(child); g_variant_unref(ret); if (return_code != 0) dt_print(DT_DEBUG_PWSTORAGE,"[pwstorage_kwallet_set] Warning: bad return code %d from kwallet\n", return_code); return return_code == 0; }
/*! \brief feed_import_data_to_ecu() Forwards the data in the VEX file to the ECU. NOTE this may have problems with firmware using multiple tables in a page, as the VEX format 1.0 does NOT handle that condition. \param vex (Vex_Import *) pointer to the Vex_Impot datastructure. */ G_MODULE_EXPORT void feed_import_data_to_ecu(Vex_Import *vex) { gint i = 0; gchar *tmpbuf = NULL; guint8 **ecu_data = NULL; guint8 **ecu_data_backup = NULL; void *data = NULL; gchar * msgbuf = NULL; guchar *ptr = NULL; guint16 *ptr16 = NULL; guint32 *ptr32 = NULL; gint total = 0; gint canID = 0; gint page = -1; gint base = 0; DataSize size = 0; gint mult = 0; gint table = -1; Firmware_Details *firmware = NULL; firmware = DATA_GET(global_data,"firmware"); ecu_data = firmware->ecu_data; ecu_data_backup = firmware->ecu_data_backup; /* Since we assume the page is where the table is this can cause * major problems with some firmwares that use two tables inside * of one page.... */ page = vex->page; table = vex->table; if ((table < 0) || (table >= firmware->total_tables)) { dbg_func_f(CRITICAL,g_strdup_printf(__FILE__": feed_import_data_to_ecu()\n\ttable passed (%i) is out of range(%i)\n",table,firmware->total_tables)); return; } /* If dimensions do NOT match, ABORT!!! */ if (firmware->table_params[table]->x_bincount != vex->total_x_bins) { msgbuf = g_strdup_printf(_("VEX Import: number of RPM bins inside VEXfile and FIRMWARE DO NOT MATCH (%i!=%i), aborting!!!\n"),firmware->table_params[table]->x_bincount,vex->total_x_bins); update_logbar_f("tools_view","warning",msgbuf,FALSE,FALSE,FALSE); dbg_func_f(CRITICAL,g_strdup(msgbuf)); g_free(msgbuf); return; } if (firmware->table_params[table]->y_bincount != vex->total_y_bins) { msgbuf = g_strdup_printf(_("VEX Import: number of LOAD bins inside VEXfile and FIRMWARE DO NOT MATCH (%i!=%i), aborting!!!\n"),firmware->table_params[table]->y_bincount,vex->total_y_bins); update_logbar_f("tools_view","warning",msgbuf,FALSE,FALSE,FALSE); dbg_func_f(CRITICAL,g_strdup(msgbuf)); g_free(msgbuf); return; } /* Backup the ALL pages of data first... */ for (i=0;i<firmware->total_pages;i++) { if (!firmware->page_params[i]->dl_by_default) continue; memset((void *)ecu_data_backup[i], 0, firmware->page_params[i]->length); memcpy(ecu_data_backup[i], ecu_data[i],firmware->page_params[i]->length); } canID = firmware->canID; page = firmware->table_params[table]->x_page; base = firmware->table_params[table]->x_base; size = firmware->table_params[table]->x_size; mult = get_multiplier_f(size); if (firmware->chunk_support) { total = vex->total_x_bins; data = g_malloc0(mult*total);; if (mult == 1) { ptr = (guchar *)data; for (i=0;i<total;i++) ptr[i]=vex->x_bins[i]; } if (mult == 2) { ptr16 = (guint16 *)data; for (i=0;i<total;i++) { if (firmware->bigendian) ptr16[i]=GINT16_TO_BE(vex->x_bins[i]); else ptr16[i]=GINT16_TO_LE(vex->x_bins[i]); } } if (mult == 4) { ptr32 = (guint32 *)data; for (i=0;i<total;i++) { if (firmware->bigendian) ptr32[i]=GINT_TO_BE(vex->x_bins[i]); else ptr32[i]=GINT_TO_LE(vex->x_bins[i]); } } ms_chunk_write(canID,page,base,(total*mult),data); } else { for (i=0;i<vex->total_x_bins;i++) { if (vex->x_bins[i] != ms_get_ecu_data_last(canID,page,base+(i*mult),size)) ms_send_to_ecu(canID,page,base+i,size, vex->x_bins[i], TRUE); } } canID = firmware->canID; page = firmware->table_params[table]->y_page; base = firmware->table_params[table]->y_base; size = firmware->table_params[table]->y_size; mult = get_multiplier_f(size); if (firmware->chunk_support) { total = vex->total_y_bins; data = g_malloc0(mult*total); if (mult == 1) { ptr = (guchar *)data; for (i=0;i<total;i++) ptr[i]=vex->y_bins[i]; } if (mult == 2) { ptr16 = (guint16 *)data; for (i=0;i<total;i++) { if (firmware->bigendian) ptr16[i]=GINT16_TO_BE(vex->y_bins[i]); else ptr16[i]=GINT16_TO_LE(vex->y_bins[i]); } } if (mult == 4) { ptr32 = (guint32 *)data; for (i=0;i<total;i++) { if (firmware->bigendian) ptr32[i]=GINT_TO_BE(vex->y_bins[i]); else ptr32[i]=GINT_TO_LE(vex->y_bins[i]); } } ms_chunk_write(canID,page,base,(total*mult),data); } else { for (i=0;i<vex->total_y_bins;i++) { if (vex->y_bins[i] != ms_get_ecu_data_last(canID,page,base+i,size)) ms_send_to_ecu(canID,page,base+(i*mult),size,vex->y_bins[i], TRUE); } } canID = firmware->canID; page = firmware->table_params[table]->z_page; base = firmware->table_params[table]->z_base; size = firmware->table_params[table]->z_size; mult = get_multiplier_f(size); if (firmware->chunk_support) { total = (vex->total_y_bins)*(vex->total_x_bins); data = g_malloc0(mult*total); if (mult == 1) { ptr = (guchar *)data; for (i=0;i<total;i++) ptr[i]=vex->tbl_bins[i]; } if (mult == 2) { ptr16 = (guint16 *)data; for (i=0;i<total;i++) { if (firmware->bigendian) ptr16[i]=GINT16_TO_BE(vex->tbl_bins[i]); else ptr16[i]=GINT16_TO_LE(vex->tbl_bins[i]); } } if (mult == 4) { ptr32 = (guint32 *)data; for (i=0;i<total;i++) { if (firmware->bigendian) ptr32[i]=GINT_TO_BE(vex->tbl_bins[i]); else ptr32[i]=GINT_TO_LE(vex->tbl_bins[i]); } } ms_chunk_write(canID,page,base,(total*mult),data); } else { for (i=0;i<((vex->total_y_bins)*(vex->total_x_bins));i++) { if (vex->tbl_bins[i] != ms_get_ecu_data_last(canID,page,base+i,size)) ms_send_to_ecu(canID,page,base+(i*mult),size,vex->tbl_bins[i], TRUE); } } io_cmd_f(firmware->burn_all_command,NULL); tmpbuf = g_strdup_printf(_("VEX Import: VEtable on page %i updated with data from the VEX file\n"),vex->page); update_logbar_f("tools_view",NULL,tmpbuf,FALSE,FALSE,FALSE); g_free(tmpbuf); }