예제 #1
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 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;
}
예제 #2
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;
}
예제 #3
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);
}