static osync_bool empty(Command *cmd, OSyncError **error) { int i; GList *c; //const char *objtype = cmd->arg; /* Perform slowync - if objtype is set for this objtype, otherwise slowsync for ALL */ if (!get_changes(cmd, SYNCTYPE_FORCE_SLOWSYNC, error)) goto error; for (i=0, c = changesList; c; c = c->next, i++) { OSyncChange *change = c->data; osync_change_set_changetype(change, OSYNC_CHANGE_TYPE_DELETED); if (!commit(cmd, change, error)) goto error; } return TRUE; error: return FALSE; }
static gboolean send_package_action (const gchar *macaroon, gchar **discharges, const gchar *name, const gchar *action, GsSnapdProgressCallback callback, gpointer user_data, GCancellable *cancellable, GError **error) { g_autofree gchar *content = NULL, *path = NULL; guint status_code; g_autofree gchar *reason_phrase = NULL; g_autofree gchar *response_type = NULL; g_autofree gchar *response = NULL; g_autofree gchar *status = NULL; g_autoptr(JsonParser) parser = NULL; JsonObject *root, *result; const gchar *type; content = g_strdup_printf ("{\"action\": \"%s\"}", action); path = g_strdup_printf ("/v2/snaps/%s", name); if (!send_request ("POST", path, content, macaroon, discharges, &status_code, &reason_phrase, &response_type, &response, NULL, cancellable, error)) return FALSE; if (status_code == SOUP_STATUS_UNAUTHORIZED) { g_set_error_literal (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_REQUIRED, "Requires authentication with @snapd"); return FALSE; } if (status_code != SOUP_STATUS_ACCEPTED) { g_set_error (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, "snapd returned status code %u: %s", status_code, reason_phrase); return FALSE; } parser = parse_result (response, response_type, error); if (parser == NULL) return FALSE; root = json_node_get_object (json_parser_get_root (parser)); type = json_object_get_string_member (root, "type"); if (g_strcmp0 (type, "async") == 0) { const gchar *change_id; change_id = json_object_get_string_member (root, "change"); while (TRUE) { /* Wait for a little bit before polling */ g_usleep (100 * 1000); result = get_changes (macaroon, discharges, change_id, cancellable, error); if (result == NULL) return FALSE; status = g_strdup (json_object_get_string_member (result, "status")); if (g_strcmp0 (status, "Done") == 0) break; callback (result, user_data); } } if (g_strcmp0 (status, "Done") != 0) { g_set_error (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NOT_SUPPORTED, "snapd operation finished with status %s", status); return FALSE; } return TRUE; }
/* * Sync Flow */ static osync_bool run_command(Command *cmd, void **plugin_data, OSyncError **error) { assert(cmd); if (cmd->cmd != CMD_INITIALIZE && *plugin_data == NULL) { fprintf(stderr, "WARNING: Got Plugin initialized? plugin_data is NULL.\n"); goto error; } switch (cmd->cmd) { case CMD_EMPTY: if (!empty(cmd, error)) goto error; break; case CMD_INITIALIZE: if (!(*plugin_data = plugin_initialize(error))) goto error; break; case CMD_FINALIZE: finalize_plugin(plugin_data); break; case CMD_CONNECT: if (!connect_plugin(cmd, error)) goto error; break; case CMD_DISCONNECT: if (!disconnect(cmd, error)) goto error; break; case CMD_SLOWSYNC: if (!get_changes(cmd, SYNCTYPE_FORCE_SLOWSYNC, error)) goto error; break; case CMD_FASTSYNC: if (!get_changes(cmd, SYNCTYPE_FORCE_FASTSYNC, error)) goto error; break; case CMD_SYNC: if (!get_changes(cmd, SYNCTYPE_NORMAL, error)) goto error; break; case CMD_COMMIT: fprintf(stderr, "COMMIT not yet implemented\n"); break; case CMD_COMMITTEDALL: if (!committedall(cmd, error)) goto error; break; case CMD_READ: fprintf(stderr, "READ not yet implemented\n"); break; case CMD_WRITE: fprintf(stderr, "WRITE not yet implemented\n"); break; case CMD_SYNCDONE: if (!syncdone(cmd, error)) goto error; break; case CMD_DISCOVER: fprintf(stderr, "DISCOVER not yet implemented\n"); break; } printf("%s: %u - sink: %p\n", __func__, cmd->cmd, cmd->sink); switch (cmd->cmd) { case CMD_INITIALIZE: case CMD_FINALIZE: case CMD_DISCOVER: break; case CMD_EMPTY: case CMD_CONNECT: case CMD_DISCONNECT: case CMD_SLOWSYNC: case CMD_FASTSYNC: case CMD_SYNC: case CMD_COMMIT: case CMD_COMMITTEDALL: case CMD_READ: case CMD_WRITE: case CMD_SYNCDONE: printf("waiting .....\n"); if (!cmd->done) g_cond_wait(cmd->cond, cmd->mutex); printf("DONE\n"); break; } return TRUE; error: return FALSE; }