static gboolean on_update(Flash *flash, GDBusMethodInvocation *invocation, gchar* write_file, gpointer user_data) { int rc = 0; SharedResource *lock = object_get_shared_resource((Object*)user_data); gboolean locked = shared_resource_get_lock(lock); flash_set_status(flash,"Flashing"); flash_complete_update(flash,invocation); if(locked) { const gchar* name = shared_resource_get_name(lock); printf("BIOS Flash is locked: %s\n",name); } else { printf("Flashing BIOS from: %s\n",write_file); flash_set_status(flash, "Flashing"); shared_resource_set_lock(lock,true); shared_resource_set_name(lock,dbus_object_path); flash_set_filename(flash,write_file); const gchar* obj_path = g_dbus_object_get_object_path((GDBusObject*)user_data); rc = update(flash,obj_path); if(!rc) { shared_resource_set_lock(lock,false); shared_resource_set_name(lock,""); } } return TRUE; }
static gboolean on_error(Flash *flash, GDBusMethodInvocation *invocation, gchar* error_msg, gpointer user_data) { SharedResource *lock = object_get_shared_resource((Object*)user_data); shared_resource_get_lock(lock); flash_set_status(flash, error_msg); flash_complete_error(flash,invocation); printf("ERROR: %s. Clearing locks\n",error_msg); shared_resource_set_lock(lock,false); shared_resource_set_name(lock,""); return TRUE; }
static void on_flash_done (GDBusConnection* connection, const gchar* sender_name, const gchar* object_path, const gchar* interface_name, const gchar* signal_name, GVariant* parameters, gpointer user_data) { Flash *flash = object_get_flash((Object*)user_data); SharedResource *lock = object_get_shared_resource((Object*)user_data); printf("Flash succeeded; unlocking flash\n"); shared_resource_set_lock(lock,false); shared_resource_set_name(lock,""); flash_set_status(flash,"Flash Done"); }
static void on_flash_progress(GDBusConnection* connection, const gchar* sender_name, const gchar* object_path, const gchar* interface_name, const gchar* signal_name, GVariant* parameters, gpointer user_data) { Flash *flash = object_get_flash((Object*)user_data); object_get_shared_resource((Object*)user_data); GVariantIter *iter = g_variant_iter_new(parameters); g_variant_iter_next_value(iter); GVariant* v_progress = g_variant_iter_next_value(iter); uint8_t progress = g_variant_get_byte(v_progress); gchar *s; s = g_strdup_printf("Flashing: %d%%",progress); flash_set_status(flash,s); g_free(s); }
static gboolean on_done(Flash *flash, GDBusMethodInvocation *invocation, gpointer user_data) { int rc = 0; SharedResource *lock = object_get_shared_resource((Object*)user_data); shared_resource_get_lock(lock); flash_set_status(flash, "Flash Done"); flash_complete_done(flash,invocation); printf("Flash Done. Clearing locks\n"); shared_resource_set_lock(lock,false); shared_resource_set_name(lock,""); const gchar* filename = flash_get_filename(flash); rc = unlink(filename); if(rc != 0 ) { printf("ERROR: Unable to delete file %s (%d)\n",filename,rc); } return TRUE; }
static gboolean on_update_via_tftp(Flash *flash, GDBusMethodInvocation *invocation, gchar* url, gchar* write_file, gpointer user_data) { SharedResource *lock = object_get_shared_resource((Object*)user_data); gboolean locked = shared_resource_get_lock(lock); flash_complete_update_via_tftp(flash,invocation); if(locked) { const gchar* name = shared_resource_get_name(lock); printf("BIOS Flash is locked: %s\n",name); } else { printf("Flashing BIOS from TFTP: %s,%s\n",url,write_file); flash_set_filename(flash,write_file); flash_emit_download(flash,url,write_file); flash_set_status(flash,"Downloading"); } return TRUE; }