diff options
Diffstat (limited to 'plugins/common')
-rw-r--r-- | plugins/common/Makefile | 20 | ||||
-rw-r--r-- | plugins/common/RESTSupport.vala | 49 | ||||
-rw-r--r-- | plugins/common/SqliteSupport.vala | 76 | ||||
-rw-r--r-- | plugins/common/VersionNumber.vala | 50 |
4 files changed, 49 insertions, 146 deletions
diff --git a/plugins/common/Makefile b/plugins/common/Makefile new file mode 100644 index 0000000..90714a0 --- /dev/null +++ b/plugins/common/Makefile @@ -0,0 +1,20 @@ + +PLUGIN := libshotwell-plugin-common +PLUGIN_DIR := common + +PLUGIN_PKGS := \ + gee-0.8 \ + libxml-2.0 \ + libsoup-2.4 \ + json-glib-1.0 \ + webkit2gtk-4.0 + +SRC_FILES := Resources.vala RESTSupport.vala + +PLUGIN_EXTRAFLAGS := --vapi=shotwell-plugin-common.vapi \ + --header=shotwell-plugin-common.h + +PLUGIN_EXTRALINKFLAGS := + +include ../Makefile.plugin.mk + diff --git a/plugins/common/RESTSupport.vala b/plugins/common/RESTSupport.vala index b512fe7..d9bf2ce 100644 --- a/plugins/common/RESTSupport.vala +++ b/plugins/common/RESTSupport.vala @@ -4,10 +4,24 @@ * (version 2.1 or later). See the COPYING file in this distribution. */ -extern Soup.Message soup_form_request_new_from_multipart(string uri, Soup.Multipart multipart); - namespace Publishing.RESTSupport { +// Ported from librest +// https://git.gnome.org/browse/librest/tree/rest/sha1.c?id=e412da58080eec2e771482e7e4c509b9e71477ff#n38 + +internal const int SHA1_HMAC_LENGTH = 20; + +public string hmac_sha1(string key, string message) { + uint8 buffer[SHA1_HMAC_LENGTH]; + size_t len = SHA1_HMAC_LENGTH; + + var mac = new Hmac (ChecksumType.SHA1, key.data); + mac.update (message.data); + mac.get_digest (buffer, ref len); + + return Base64.encode (buffer[0:len]); +} + public abstract class Session { private string? endpoint_url = null; private Soup.Session soup_session = null; @@ -109,13 +123,17 @@ public class Argument { } public static Argument[] sort(Argument[] inputArray) { - FixedTreeSet<Argument> sorted_args = new FixedTreeSet<Argument>(Argument.compare); + Gee.TreeSet<Argument> sorted_args = new Gee.TreeSet<Argument>(Argument.compare); foreach (Argument arg in inputArray) sorted_args.add(arg); return sorted_args.to_array(); } + + public string to_string () { + return "%s=%s".printf (this.key, this.value); + } } public class Transaction { @@ -298,7 +316,7 @@ public class Transaction { // concatenate the REST arguments array into an HTTP formdata string string formdata_string = ""; for (int i = 0; i < arguments.length; i++) { - formdata_string += ("%s=%s".printf(arguments[i].key, arguments[i].value)); + formdata_string += arguments[i].to_string (); if (i < arguments.length - 1) formdata_string += "&"; } @@ -338,6 +356,11 @@ public class Transaction { assert(get_is_executed()); return message.response_headers; } + + public Soup.Message get_message() { + assert(get_is_executed()); + return message; + } public void add_argument(string name, string value) { arguments += new Argument(name, value); @@ -437,7 +460,7 @@ public class UploadTransaction : Transaction { image_part_header.set_content_disposition("form-data", binary_disposition_table); Soup.Message outbound_message = - soup_form_request_new_from_multipart(get_endpoint_url(), message_parts); + Soup.Form.request_new_from_multipart(get_endpoint_url(), message_parts); // TODO: there must be a better way to iterate over a map Gee.MapIterator<string, string> i = message_headers.map_iterator(); bool cont = i.next(); @@ -562,7 +585,7 @@ public string decimal_entity_encode(string source) { return encoded_str_builder.str; } -internal abstract class BatchUploader { +public abstract class BatchUploader { private int current_file = 0; private Spit.Publishing.Publishable[] publishables = null; private Session session = null; @@ -659,20 +682,6 @@ public string asciify_string(string s) { return b.str; } -/** @brief Work-around for a problem in libgee where a TreeSet can leak references when it - * goes out of scope; please see https://bugzilla.gnome.org/show_bug.cgi?id=695045 for more - * details. This class merely wraps it and adds a call to clear() to the destructor. - */ -public class FixedTreeSet<G> : Gee.TreeSet<G> { - public FixedTreeSet(owned CompareDataFunc<G>? comp_func = null) { - base((owned) comp_func); - } - - ~FixedTreeSet() { - clear(); - } -} - public abstract class GoogleSession : Session { public abstract string get_user_name(); public abstract string get_access_token(); diff --git a/plugins/common/SqliteSupport.vala b/plugins/common/SqliteSupport.vala deleted file mode 100644 index 0dcc99c..0000000 --- a/plugins/common/SqliteSupport.vala +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright 2016 Software Freedom Conservancy Inc. - * - * This software is licensed under the GNU LGPL (version 2.1 or later). - * See the COPYING file in this distribution. - */ - -public errordomain DatabaseError { - ERROR, - BACKING, - MEMORY, - ABORT, - LIMITS, - TYPESPEC -} - -public abstract class ImportableDatabaseTable { - - protected static Sqlite.Database db; - - public string table_name = null; - - protected void set_table_name(string table_name) { - this.table_name = table_name; - } - - // This method will throw an error on an SQLite return code unless it's OK, DONE, or ROW, which - // are considered normal results. - protected static void throw_error(string method, int res) throws DatabaseError { - string msg = "(%s) [%d] - %s".printf(method, res, db.errmsg()); - - switch (res) { - case Sqlite.OK: - case Sqlite.DONE: - case Sqlite.ROW: - return; - - case Sqlite.PERM: - case Sqlite.BUSY: - case Sqlite.READONLY: - case Sqlite.IOERR: - case Sqlite.CORRUPT: - case Sqlite.CANTOPEN: - case Sqlite.NOLFS: - case Sqlite.AUTH: - case Sqlite.FORMAT: - case Sqlite.NOTADB: - throw new DatabaseError.BACKING(msg); - - case Sqlite.NOMEM: - throw new DatabaseError.MEMORY(msg); - - case Sqlite.ABORT: - case Sqlite.LOCKED: - case Sqlite.INTERRUPT: - throw new DatabaseError.ABORT(msg); - - case Sqlite.FULL: - case Sqlite.EMPTY: - case Sqlite.TOOBIG: - case Sqlite.CONSTRAINT: - case Sqlite.RANGE: - throw new DatabaseError.LIMITS(msg); - - case Sqlite.SCHEMA: - case Sqlite.MISMATCH: - throw new DatabaseError.TYPESPEC(msg); - - case Sqlite.ERROR: - case Sqlite.INTERNAL: - case Sqlite.MISUSE: - default: - throw new DatabaseError.ERROR(msg); - } - } -} - diff --git a/plugins/common/VersionNumber.vala b/plugins/common/VersionNumber.vala deleted file mode 100644 index 503cd65..0000000 --- a/plugins/common/VersionNumber.vala +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright 2016 Software Freedom Conservancy Inc. - * - * This software is licensed under the GNU Lesser General Public License - * (version 2.1 or later). See the COPYING file in this distribution. - */ - -namespace Utils { - -/** - * A class that represents a version number in the form x.y.z and is able to compare - * different versions. - */ -public class VersionNumber : Object, Gee.Comparable<VersionNumber> { - private int[] version; - - public VersionNumber(int[] version) { - this.version = version; - } - - public VersionNumber.from_string(string str_version, string separator = ".") { - string[] version_items = str_version.split(separator); - this.version = new int[version_items.length]; - for (int i = 0; i < version_items.length; i++) - this.version[i] = int.parse(version_items[i]); - } - - public string to_string() { - string[] version_items = new string[this.version.length]; - for (int i = 0; i < this.version.length; i++) - version_items[i] = this.version[i].to_string(); - return string.joinv(".", version_items); - } - - public int compare_to(VersionNumber other) { - int max_len = ((this.version.length > other.version.length) ? - this.version.length : other.version.length); - int res = 0; - for(int i = 0; i < max_len; i++) { - int this_v = (i < this.version.length ? this.version[i] : 0); - int other_v = (i < other.version.length ? other.version[i] : 0); - res = this_v - other_v; - if (res != 0) - break; - } - return res; - } -} - -} - |