diff options
author | Jörg Frings-Fürst <debian@jff.email> | 2023-06-28 21:35:52 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff.email> | 2023-06-28 21:35:52 +0200 |
commit | b86540b743f1a87a163ffb811c8fe22a01fefa38 (patch) | |
tree | b47cb3bb83c2377234226fb3987ab3320a987dd9 /plugins/shotwell-publishing-extras/RajcePublishing.vala | |
parent | ac6e0b731b9f0b2efd392e3309a5c07e2a66adad (diff) | |
parent | e905d8e16eec152d19797937f13ba3cf4b8f8aca (diff) |
Merge branch 'release/debian/0.32.1-1'debian/0.32.1-1
Diffstat (limited to 'plugins/shotwell-publishing-extras/RajcePublishing.vala')
-rw-r--r-- | plugins/shotwell-publishing-extras/RajcePublishing.vala | 1554 |
1 files changed, 0 insertions, 1554 deletions
diff --git a/plugins/shotwell-publishing-extras/RajcePublishing.vala b/plugins/shotwell-publishing-extras/RajcePublishing.vala deleted file mode 100644 index a088274..0000000 --- a/plugins/shotwell-publishing-extras/RajcePublishing.vala +++ /dev/null @@ -1,1554 +0,0 @@ -/* Copyright 2014 rajce.net - * - * This software is licensed under the GNU Lesser General Public License - * (version 2.1 or later). See the COPYING file in this distribution. - */ - -public class RajceService : Object, Spit.Pluggable, Spit.Publishing.Service -{ - private const string ICON_FILENAME = "rajce.png"; - - private static Gdk.Pixbuf[] icon_pixbuf_set = null; - - public RajceService(GLib.File resource_directory) - { - if (icon_pixbuf_set == null) - icon_pixbuf_set = - Resources.load_from_resource(Resources.RESOURCE_PATH + "/" + - ICON_FILENAME); - } - - public int get_pluggable_interface(int min_host_interface, int max_host_interface) - { - return Spit.negotiate_interfaces(min_host_interface, max_host_interface, - Spit.Publishing.CURRENT_INTERFACE); - } - - public unowned string get_id() - { - return "org.yorba.shotwell.publishing.rajce"; - } - - public unowned string get_pluggable_name() - { - return "Rajce"; - } - - public void get_info(ref Spit.PluggableInfo info) - { - info.authors = "rajce.net developers"; - info.copyright = _("Copyright © 2013 rajce.net"); - info.translators = Resources.TRANSLATORS; - info.version = _VERSION; - info.website_name = Resources.WEBSITE_NAME; - info.website_url = Resources.WEBSITE_URL; - info.is_license_wordwrapped = false; - info.license = Resources.LICENSE; - info.icons = icon_pixbuf_set; - } - - public Spit.Publishing.Publisher create_publisher(Spit.Publishing.PluginHost host) - { - return new Publishing.Rajce.RajcePublisher(this, host); - } - - public Spit.Publishing.Publisher.MediaType get_supported_media() - { - return( Spit.Publishing.Publisher.MediaType.PHOTO /*| Spit.Publishing.Publisher.MediaType.VIDEO*/ ); - } - - public void activation(bool enabled) {} -} - -namespace Publishing.Rajce -{ - -public class RajcePublisher : Spit.Publishing.Publisher, GLib.Object -{ - private Spit.Publishing.PluginHost host = null; - private Spit.Publishing.ProgressCallback progress_reporter = null; - private Spit.Publishing.Service service = null; - private bool running = false; - private Session session; -// private string username = ""; -// private string token = ""; -// private int last_photo_size = -1; -// private bool hide_album = false; -// private bool show_album = true; -// private bool remember = false; -// private bool strip_metadata = false; - private Album[] albums = null; - private PublishingParameters parameters = null; - private Spit.Publishing.Publisher.MediaType media_type = Spit.Publishing.Publisher.MediaType.NONE; - - public RajcePublisher(Spit.Publishing.Service service, Spit.Publishing.PluginHost host) - { - debug("RajcePublisher created."); - this.service = service; - this.host = host; - this.session = new Session(); - - foreach(Spit.Publishing.Publishable p in host.get_publishables()) - media_type |= p.get_media_type(); - } - - private string get_rajce_url() - { - return "http://www.rajce.idnes.cz/liveAPI/index.php"; - } - - // Publisher interface implementation - - public Spit.Publishing.Service get_service() { return service; } - public Spit.Publishing.PluginHost get_host() { return host; } - public bool is_running() { return running; } - - public void start() - { - if (is_running()) - return; - - debug("RajcePublisher: start"); - running = true; - - if (session.is_authenticated()) - { - debug("RajcePublisher: session is authenticated."); - do_fetch_albums(); - } - else - { - debug("RajcePublisher: session is not authenticated."); - string? persistent_username = get_username(); - string? persistent_token = get_token(); - bool? persistent_remember = get_remember(); - if (persistent_username != null && persistent_token != null) - do_network_login(persistent_username, persistent_token, persistent_remember ); - else - do_show_authentication_pane(); - } - } - - public void stop() - { - debug("RajcePublisher: stop"); - running = false; - } - - // persistent data - - public string? get_url() { return get_rajce_url(); } - public string? get_username() { return host.get_config_string("username", null); } - private void set_username(string username) { host.set_config_string("username", username); } - public string? get_token() { return host.get_config_string("token", null); } - private void set_token(string? token) { host.set_config_string("token", token); } -// public int get_last_photo_size() { return host.get_config_int("last-photo-size", -1); } -// private void set_last_photo_size(int last_photo_size) { host.set_config_int("last-photo-size", last_photo_size); } - public bool get_remember() { return host.get_config_bool("remember", false); } - private void set_remember(bool remember) { host.set_config_bool("remember", remember); } - public bool get_hide_album() { return host.get_config_bool("hide-album", false); } - public void set_hide_album(bool hide_album) { host.set_config_bool("hide-album", hide_album); } - public bool get_show_album() { return host.get_config_bool("show-album", true); } - public void set_show_album(bool show_album) { host.set_config_bool("show-album", show_album); } -// public bool get_strip_metadata() { return host.get_config_bool("strip-metadata", false); } -// private void set_strip_metadata(bool strip_metadata) { host.set_config_bool("strip-metadata", strip_metadata); } - - // Actions and events - - /** - * Action that shows the authentication pane. - */ - private void do_show_authentication_pane(AuthenticationPane.Mode mode = AuthenticationPane.Mode.INTRO) - { - debug("ACTION: installing authentication pane"); - - host.set_service_locked(false); - AuthenticationPane authentication_pane = new AuthenticationPane(this, mode); - authentication_pane.login.connect(on_authentication_pane_login_clicked); - host.install_dialog_pane(authentication_pane, Spit.Publishing.PluginHost.ButtonMode.CLOSE); - host.set_dialog_default_widget(authentication_pane.get_default_widget()); - } - - /** - * Event triggered when the login button in the authentication panel is clicked. - */ - private void on_authentication_pane_login_clicked( string username, string token, bool remember ) - { - debug("EVENT: on_authentication_pane_login_clicked"); - if (!running) - return; - do_network_login(username, token, remember); - } - - /** - * Action to perform a network login to a Rajce service. - */ - private void do_network_login(string username, string token, bool remember) - { - debug("ACTION: logging in"); - host.set_service_locked(true); - host.install_login_wait_pane(); - set_remember( remember ); - set_username( username ); - set_token( remember ? token : null ); - SessionLoginTransaction login_trans = new SessionLoginTransaction(session, get_url(), username, token); - login_trans.network_error.connect(on_login_network_error); - login_trans.completed.connect(on_login_network_complete); - try - { - login_trans.execute(); - } - catch (Spit.Publishing.PublishingError err) - { - debug("ERROR: do_network_login"); - do_show_error(err); - } - } - - /** - * Event triggered when the network login action is complete and successful. - */ - private void on_login_network_complete(Publishing.RESTSupport.Transaction txn) - { - debug("EVENT: on_login_network_complete"); - txn.completed.disconnect(on_login_network_complete); - txn.network_error.disconnect(on_login_network_error); - - try - { - Publishing.RESTSupport.XmlDocument doc = Publishing.RESTSupport.XmlDocument.parse_string( txn.get_response(), Transaction.validate_xml); - Xml.Node* response = doc.get_root_node(); - Xml.Node* sessionToken = doc.get_named_child( response, "sessionToken" ); - Xml.Node* maxWidth = doc.get_named_child( response, "maxWidth" ); - Xml.Node* maxHeight = doc.get_named_child( response, "maxHeight" ); - Xml.Node* quality = doc.get_named_child( response, "quality" ); - Xml.Node* nick = doc.get_named_child( response, "nick" ); - int maxW = int.parse( maxWidth->get_content() ); - int maxH = int.parse( maxHeight->get_content() ); - if( maxW > maxH ) - { - maxH = maxW; - } - session.authenticate( sessionToken->get_content(), nick->get_content(), 0, maxH, int.parse( quality->get_content() ) ); - } - catch (Spit.Publishing.PublishingError err) - { - int code_int = int.parse(err.message); - if (code_int == 999) - { - debug("ERROR: on_login_network_complete, code 999"); - do_show_authentication_pane(AuthenticationPane.Mode.FAILED_RETRY_USER); - } - else - { - debug("ERROR: on_login_network_complete"); - do_show_error(err); - } - return; - } - do_fetch_albums(); - } - - /** - * Event triggered when a network login action fails due to a network error. - */ - private void on_login_network_error( Publishing.RESTSupport.Transaction bad_txn, Spit.Publishing.PublishingError err ) - { - debug("EVENT: on_login_network_error"); - bad_txn.completed.disconnect(on_login_network_complete); - bad_txn.network_error.disconnect(on_login_network_error); - do_show_authentication_pane(AuthenticationPane.Mode.FAILED_RETRY_USER); - } - - /** - * Action that fetches all user albums from the Rajce. - */ - private void do_fetch_albums() - { - debug("ACTION: fetching albums"); - host.set_service_locked(true); - host.install_account_fetch_wait_pane(); - - GetAlbumsTransaction get_albums_trans = new GetAlbumsTransaction(session, get_url() ); - get_albums_trans.network_error.connect(on_albums_fetch_error); - get_albums_trans.completed.connect(on_albums_fetch_complete); - - try - { - get_albums_trans.execute(); - } - catch (Spit.Publishing.PublishingError err) - { - debug("ERROR: do_fetch_albums"); - do_show_error(err); - } - } - - /** - * Event triggered when the fetch albums action completes successfully. - */ - private void on_albums_fetch_complete(Publishing.RESTSupport.Transaction txn) - { - debug("EVENT: on_albums_fetch_complete"); - txn.completed.disconnect(on_albums_fetch_complete); - txn.network_error.disconnect(on_albums_fetch_error); - debug("RajcePlugin: list of albums: %s", txn.get_response()); - if (albums != null) - { - albums = null; - } - Gee.ArrayList<Album> list = new Gee.ArrayList<Album>(); - try - { - Publishing.RESTSupport.XmlDocument doc = Publishing.RESTSupport.XmlDocument.parse_string( txn.get_response(), Transaction.validate_xml); - Xml.Node* response = doc.get_root_node(); - Xml.Node* sessionToken = doc.get_named_child( response, "sessionToken" ); - Xml.Node* nodealbums = doc.get_named_child( response, "albums" ); - for( Xml.Node* album = nodealbums->children; album != null; album = album->next ) - { - int id = int.parse( album->get_prop("id") ); - string albumName = doc.get_named_child( album, "albumName" )->get_content(); - string url = doc.get_named_child( album, "url" )->get_content(); - string thumbUrl = doc.get_named_child( album, "thumbUrl" )->get_content(); - string createDate = doc.get_named_child( album, "createDate" )->get_content(); - string updateDate = doc.get_named_child( album, "updateDate" )->get_content(); - bool hidden = ( int.parse( doc.get_named_child( album, "hidden" )->get_content() ) > 0 ? true : false ); - bool secure = ( int.parse( doc.get_named_child( album, "secure" )->get_content() ) > 0 ? true : false ); - int photoCount = int.parse( doc.get_named_child( album, "photoCount" )->get_content() ); - list.insert( 0, new Album( id, albumName, url, thumbUrl, createDate, updateDate, hidden, secure, photoCount ) ); - } - list.sort( Album.compare_albums ); - albums = list.to_array(); - session.set_usertoken( sessionToken->get_content() ); - } - catch (Spit.Publishing.PublishingError err) - { - debug("ERROR: on_albums_fetch_complete"); - do_show_error(err); - return; - } - do_show_publishing_options_pane(); - } - - /** - * Event triggered when the fetch albums transaction fails due to a network error. - */ - private void on_albums_fetch_error( Publishing.RESTSupport.Transaction bad_txn, Spit.Publishing.PublishingError err ) - { - debug("EVENT: on_albums_fetch_error"); - bad_txn.completed.disconnect(on_albums_fetch_complete); - bad_txn.network_error.disconnect(on_albums_fetch_error); - on_network_error(bad_txn, err); - } - - /** - * Action that shows the publishing options pane. - */ - private void do_show_publishing_options_pane() - { - debug("ACTION: installing publishing options pane"); - host.set_service_locked(false); - PublishingOptionsPane opts_pane = new PublishingOptionsPane( this, session.get_username(), albums ); - opts_pane.logout.connect(on_publishing_options_pane_logout_clicked); - opts_pane.publish.connect(on_publishing_options_pane_publish_clicked); - host.install_dialog_pane(opts_pane, Spit.Publishing.PluginHost.ButtonMode.CLOSE); - host.set_dialog_default_widget(opts_pane.get_default_widget()); - } - - /** - * Event triggered when the user clicks logout in the publishing options pane. - */ - private void on_publishing_options_pane_logout_clicked() - { - debug("EVENT: on_publishing_options_pane_logout_clicked"); - session.deauthenticate(); - do_show_authentication_pane( AuthenticationPane.Mode.INTRO ); - } - - /** - * Event triggered when the user clicks publish in the publishing options pane. - * - * @param parameters the publishing parameters - */ - private void on_publishing_options_pane_publish_clicked( PublishingParameters parameters ) - { - debug("EVENT: on_publishing_options_pane_publish_clicked"); - this.parameters = parameters; - do_begin_upload(); - } - - /** - * Begin upload action: open existing album or create a new one - */ - private void do_begin_upload() - { - host.set_service_locked(true); - if( parameters.album_id == 0 ) - { - // new album - debug("ACTION: closing album"); - CreateAlbumTransaction create_album_trans = new CreateAlbumTransaction(session, get_url(), parameters.album_name, this.parameters.album_hidden ); - create_album_trans.network_error.connect(on_create_album_error); - create_album_trans.completed.connect(on_create_album_complete); - try - { - create_album_trans.execute(); - } - catch (Spit.Publishing.PublishingError err) - { - debug("ERROR: create album"); - do_show_error(err); - } - } - else - { - // existing album - debug("ACTION: opening album"); - OpenAlbumTransaction open_album_trans = new OpenAlbumTransaction(session, get_url(), parameters.album_id ); - open_album_trans.network_error.connect(on_open_album_error); - open_album_trans.completed.connect(on_open_album_complete); - try - { - open_album_trans.execute(); - } - catch (Spit.Publishing.PublishingError err) - { - debug("ERROR: open album"); - do_show_error(err); - } - } - } - - /** - * Event triggered when the create album completes successfully. - */ - private void on_create_album_complete( Publishing.RESTSupport.Transaction txn) - { - debug("EVENT: on_create_album_complete"); - txn.completed.disconnect(on_create_album_complete); - txn.network_error.disconnect(on_create_album_error); - debug("RajcePlugin: create album: %s", txn.get_response()); - try - { - Publishing.RESTSupport.XmlDocument doc = Publishing.RESTSupport.XmlDocument.parse_string( txn.get_response(), Transaction.validate_xml); - Xml.Node* response = doc.get_root_node(); - string sessionToken = doc.get_named_child( response, "sessionToken" )->get_content(); - string albumToken = doc.get_named_child( response, "albumToken" )->get_content(); - parameters.album_id = int.parse( doc.get_named_child( response, "albumID" )->get_content() ); - session.set_usertoken( sessionToken ); - session.set_albumtoken( albumToken ); - } - catch (Spit.Publishing.PublishingError err) - { - debug("ERROR: on_create_album_complete"); - do_show_error(err); - return; - } - do_upload_photos(); - } - - /** - * Event triggered when the create album transaction fails due to a network error. - */ - private void on_create_album_error( Publishing.RESTSupport.Transaction bad_txn, Spit.Publishing.PublishingError err ) - { - debug("EVENT: on_create_album_error"); - bad_txn.completed.disconnect(on_create_album_complete); - bad_txn.network_error.disconnect(on_create_album_error); - on_network_error(bad_txn, err); - } - - /** - * Event triggered when the open album completes successfully. - */ - private void on_open_album_complete(Publishing.RESTSupport.Transaction txn) - { - debug("EVENT: on_open_album_complete"); - txn.completed.disconnect(on_open_album_complete); - txn.network_error.disconnect(on_open_album_error); - debug("RajcePlugin: open album: %s", txn.get_response()); - try - { - Publishing.RESTSupport.XmlDocument doc = Publishing.RESTSupport.XmlDocument.parse_string( txn.get_response(), Transaction.validate_xml); - Xml.Node* response = doc.get_root_node(); - string sessionToken = doc.get_named_child( response, "sessionToken" )->get_content(); - string albumToken = doc.get_named_child( response, "albumToken" )->get_content(); - session.set_usertoken( sessionToken ); - session.set_albumtoken( albumToken ); - } - catch (Spit.Publishing.PublishingError err) - { - debug("ERROR: on_open_album_complete"); - do_show_error(err); - return; - } - do_upload_photos(); - } - - /** - * Event triggered when the open album transaction fails due to a network error. - */ - private void on_open_album_error( Publishing.RESTSupport.Transaction bad_txn, Spit.Publishing.PublishingError err ) - { - debug("EVENT: on_open_album_error"); - bad_txn.completed.disconnect(on_open_album_complete); - bad_txn.network_error.disconnect(on_open_album_error); - on_network_error(bad_txn, err); - } - - /** - * Upload photos: the key part of the plugin - */ - private void do_upload_photos() - { - debug("ACTION: uploading photos"); - progress_reporter = host.serialize_publishables( session.get_maxsize() ); - Spit.Publishing.Publishable[] publishables = host.get_publishables(); - - Uploader uploader = new Uploader( session, get_url(), publishables, parameters ); - uploader.upload_complete.connect( on_upload_photos_complete ); - uploader.upload_error.connect( on_upload_photos_error ); - uploader.upload( on_upload_photos_status_updated ); - } - - /** - * Event triggered when the batch uploader reports that at least one of the - * network transactions encapsulating uploads has completed successfully - */ - private void on_upload_photos_complete(Publishing.RESTSupport.BatchUploader uploader, int num_published) - { - debug("EVENT: on_upload_photos_complete"); - uploader.upload_complete.disconnect(on_upload_photos_complete); - uploader.upload_error.disconnect(on_upload_photos_error); - - // TODO: should a message be displayed to the user if num_published is zero? - do_end_upload(); - } - - /** - * Event triggered when the batch uploader reports that at least one of the - * network transactions encapsulating uploads has caused a network error - */ - private void on_upload_photos_error( Publishing.RESTSupport.BatchUploader uploader, Spit.Publishing.PublishingError err) - { - debug("EVENT: on_upload_photos_error"); - uploader.upload_complete.disconnect(on_upload_photos_complete); - uploader.upload_error.disconnect(on_upload_photos_error); - do_show_error(err); - } - - /** - * Event triggered when upload progresses and the status needs to be updated. - */ - private void on_upload_photos_status_updated(int file_number, double completed_fraction) - { - if( is_running() ) - { - debug("EVENT: uploader reports upload %.2f percent complete.", 100.0 * completed_fraction); - assert(progress_reporter != null); - progress_reporter(file_number, completed_fraction); - } - } - - private void do_end_upload() - { - if( get_show_album() ) - { - do_get_album_url(); - } - else - { - do_close_album(); - } - } - - /** - * End upload action: get album url - */ - private void do_get_album_url() - { - debug("ACTION: getting album URL"); - host.set_service_locked(true); - GetAlbumUrlTransaction get_album_url_trans = new GetAlbumUrlTransaction(session, get_url() ); - get_album_url_trans.network_error.connect(on_get_album_url_error); - get_album_url_trans.completed.connect(on_get_album_url_complete); - try - { - get_album_url_trans.execute(); - } - catch (Spit.Publishing.PublishingError err) - { - debug("ERROR: close album"); - do_show_error(err); - } - } - - /** - * Event triggered when the get album url completes successfully. - */ - private void on_get_album_url_complete(Publishing.RESTSupport.Transaction txn) - { - debug("EVENT: on_get_album_url_complete"); - txn.completed.disconnect(on_get_album_url_complete); - txn.network_error.disconnect(on_get_album_url_error); - debug("RajcePlugin: get album url: %s", txn.get_response()); - try - { - Publishing.RESTSupport.XmlDocument doc = Publishing.RESTSupport.XmlDocument.parse_string( txn.get_response(), Transaction.validate_xml); - Xml.Node* response = doc.get_root_node(); - string sessionToken = doc.get_named_child( response, "sessionToken" )->get_content(); - string url = doc.get_named_child( response, "url" )->get_content(); - session.set_usertoken( sessionToken ); - session.set_albumticket( url ); - } - catch (Spit.Publishing.PublishingError err) - { - debug("ERROR: on_get_album_url_complete"); - // ignore this error -// do_show_error(err); -// return; - } - do_close_album(); - } - - /** - * Event triggered when the get album url transaction fails due to a network error. - */ - private void on_get_album_url_error( Publishing.RESTSupport.Transaction bad_txn, Spit.Publishing.PublishingError err ) - { - debug("EVENT: on_get_album_url_error"); - bad_txn.completed.disconnect(on_get_album_url_complete); - bad_txn.network_error.disconnect(on_get_album_url_error); - // ignore this error -// on_network_error(bad_txn, err); - do_close_album(); - } - - - /** - * End upload action: close album - */ - private void do_close_album() - { - debug("ACTION: closing album"); - host.set_service_locked(true); - CloseAlbumTransaction close_album_trans = new CloseAlbumTransaction(session, get_url() ); - close_album_trans.network_error.connect(on_close_album_error); - close_album_trans.completed.connect(on_close_album_complete); - try - { - close_album_trans.execute(); - } - catch (Spit.Publishing.PublishingError err) - { - debug("ERROR: close album"); - do_show_error(err); - } - } - - /** - * Event triggered when the close album completes successfully. - */ - private void on_close_album_complete(Publishing.RESTSupport.Transaction txn) - { - debug("EVENT: on_close_album_complete"); - txn.completed.disconnect(on_close_album_complete); - txn.network_error.disconnect(on_close_album_error); - debug("RajcePlugin: close album: %s", txn.get_response()); - try - { - Publishing.RESTSupport.XmlDocument doc = Publishing.RESTSupport.XmlDocument.parse_string( txn.get_response(), Transaction.validate_xml); - Xml.Node* response = doc.get_root_node(); - string sessionToken = doc.get_named_child( response, "sessionToken" )->get_content(); - session.set_usertoken( sessionToken ); - session.set_albumtoken( null ); - } - catch (Spit.Publishing.PublishingError err) - { - debug("ERROR: on_close_album_complete"); - do_show_error(err); - return; - } - do_show_success_pane(); - } - - /** - * Event triggered when the close album transaction fails due to a network error. - */ - private void on_close_album_error( Publishing.RESTSupport.Transaction bad_txn, Spit.Publishing.PublishingError err ) - { - debug("EVENT: on_close_album_error"); - bad_txn.completed.disconnect(on_close_album_complete); - bad_txn.network_error.disconnect(on_close_album_error); - // ignore this error -// on_network_error(bad_txn, err); - do_show_success_pane(); - } - - - /** - * Action to display the success pane in the publishing dialog. - */ - private void do_show_success_pane() - { - debug("ACTION: installing success pane"); - if( get_show_album() && session.get_albumticket() != null ) - { - try - { - GLib.Process.spawn_command_line_async( "xdg-open " + session.get_albumticket() ); - } - catch( GLib.SpawnError e ) - { - } - } - host.set_service_locked(false); - host.install_success_pane(); - } - - /** - * Helper event to handle network errors. - */ - private void on_network_error( Publishing.RESTSupport.Transaction bad_txn, Spit.Publishing.PublishingError err ) - { - debug("EVENT: on_network_error"); - do_show_error(err); - } - - /** - * Action to display an error to the user. - */ - private void do_show_error(Spit.Publishing.PublishingError e) - { - debug("ACTION: do_show_error"); - string error_type = "UNKNOWN"; - if (e is Spit.Publishing.PublishingError.NO_ANSWER) - { - do_show_authentication_pane(AuthenticationPane.Mode.FAILED_RETRY_USER); - return; - } else if(e is Spit.Publishing.PublishingError.COMMUNICATION_FAILED) { - error_type = "COMMUNICATION_FAILED"; - } else if(e is Spit.Publishing.PublishingError.PROTOCOL_ERROR) { - error_type = "PROTOCOL_ERROR"; - } else if(e is Spit.Publishing.PublishingError.SERVICE_ERROR) { - error_type = "SERVICE_ERROR"; - } else if(e is Spit.Publishing.PublishingError.MALFORMED_RESPONSE) { - error_type = "MALFORMED_RESPONSE"; - } else if(e is Spit.Publishing.PublishingError.LOCAL_FILE_ERROR) { - error_type = "LOCAL_FILE_ERROR"; - } else if(e is Spit.Publishing.PublishingError.EXPIRED_SESSION) { - error_type = "EXPIRED_SESSION"; - } - - debug("Unhandled error: type=%s; message='%s'".printf(error_type, e.message)); - do_show_error_message(_("An error message occurred when publishing to Rajce. Please try again.")); - } - - /** - * Action to display an error message to the user. - */ - private void do_show_error_message(string message) - { - debug("ACTION: do_show_error_message"); - host.install_static_message_pane(message, Spit.Publishing.PluginHost.ButtonMode.CLOSE); - } - -} - -// Rajce Album -internal class Album -{ - public int id; - public string albumName; - public string url; - public string thumbUrl; - public string createDate; - public string updateDate; - public bool hidden; - public bool secure; - public int photoCount; - - public Album( int id, string albumName, string url, string thumbUrl, string createDate, string updateDate, bool hidden, bool secure, int photoCount ) - { - this.id = id; - this.albumName = albumName; - this.url = url; - this.thumbUrl = thumbUrl; - this.createDate = createDate; - this.updateDate = updateDate; - this.hidden = hidden; - this.secure = secure; - this.photoCount = photoCount; - } - public static int compare_albums(Album? a, Album? b) - { - if( a == null && b == null ) - { - return 0; - } - else if( a == null && b != null ) - { - return 1; - } - else if( a != null && b == null ) - { - return -1; - } - return( b.updateDate.ascii_casecmp( a.updateDate ) ); - } -} - -// Uploader -internal class Uploader : Publishing.RESTSupport.BatchUploader -{ - private PublishingParameters parameters; - private string url; - - public Uploader(Session session, string url, Spit.Publishing.Publishable[] publishables, PublishingParameters parameters) - { - base(session, publishables); - this.parameters = parameters; - this.url = url; - } - - protected override Publishing.RESTSupport.Transaction create_transaction( Spit.Publishing.Publishable publishable ) - { - return new AddPhotoTransaction((Session) get_session(), url, parameters, publishable); - } -} - -// UI elements - -/** - * The authentication pane used when asking service URL, user name and password - * from the user. - */ -internal class AuthenticationPane : Spit.Publishing.DialogPane, Object -{ - public enum Mode - { - INTRO, - FAILED_RETRY_USER - } - private static string INTRO_MESSAGE = _("Enter email and password associated with your Rajce account."); - private static string FAILED_RETRY_USER_MESSAGE = _("Invalid email and/or password. Please try again"); - - private Gtk.Box pane_widget = null; - private Gtk.Builder builder; - private Gtk.Entry username_entry; - private Gtk.Entry password_entry; - private Gtk.CheckButton remember_checkbutton; - private Gtk.Button login_button; - private bool crypt = true; - - public signal void login( string user, string token, bool remember ); - - public AuthenticationPane( RajcePublisher publisher, Mode mode = Mode.INTRO ) - { - this.pane_widget = new Gtk.Box(Gtk.Orientation.VERTICAL, 0); - try - { - builder = new Gtk.Builder(); - builder.add_from_resource (Resources.RESOURCE_PATH + - "/rajce_authentication_pane.ui"); - builder.connect_signals(null); - var content = builder.get_object ("content") as Gtk.Box; - Gtk.Label message_label = builder.get_object("message_label") as Gtk.Label; - switch (mode) - { - case Mode.INTRO: - message_label.set_text(INTRO_MESSAGE); - break; - - case Mode.FAILED_RETRY_USER: - message_label.set_markup("<b>%s</b>\n\n%s".printf(_( - "Invalid User Email or Password"), FAILED_RETRY_USER_MESSAGE)); - break; - } - username_entry = builder.get_object ("username_entry") as Gtk.Entry; - string? persistent_username = publisher.get_username(); - if (persistent_username != null) - { - username_entry.set_text(persistent_username); - } - password_entry = builder.get_object ("password_entry") as Gtk.Entry; - string? persistent_token = publisher.get_token(); - if (persistent_token != null) - { - password_entry.set_text(persistent_token); - this.crypt = false; - } - else - { - this.crypt = true; - } - remember_checkbutton = builder.get_object ("remember_checkbutton") as Gtk.CheckButton; - remember_checkbutton.set_active(publisher.get_remember()); - login_button = builder.get_object("login_button") as Gtk.Button; - - Gtk.Label label2 = builder.get_object("label2") as Gtk.Label; - Gtk.Label label3 = builder.get_object("label3") as Gtk.Label; - - label2.set_label(_("_Email address") ); - label3.set_label(_("_Password") ); - remember_checkbutton.set_label(_("_Remember") ); - login_button.set_label(_("Log in") ); - - username_entry.changed.connect(on_user_changed); - password_entry.changed.connect(on_password_changed); - login_button.clicked.connect(on_login_button_clicked); - content.parent.remove (content); - pane_widget.add (content); - publisher.get_host().set_dialog_default_widget(login_button); - } - catch (Error e) - { - warning("Could not load UI: %s", e.message); - } - } - - public Gtk.Widget get_default_widget() - { - return login_button; - } - - private void on_login_button_clicked() - { - string token = password_entry.get_text(); - if( this.crypt ) - { - token = GLib.Checksum.compute_for_string( GLib.ChecksumType.MD5, token ); - } - login(username_entry.get_text(), token, remember_checkbutton.get_active()); - } - - private void on_user_changed() - { - update_login_button_sensitivity(); - } - - private void on_password_changed() - { - this.crypt = true; - update_login_button_sensitivity(); - } - - private void update_login_button_sensitivity() - { - login_button.set_sensitive(username_entry.text_length > 0 && - password_entry.text_length > 0); - } - - public Gtk.Widget get_widget() - { - return pane_widget; - } - - public Spit.Publishing.DialogPane.GeometryOptions get_preferred_geometry() - { - return Spit.Publishing.DialogPane.GeometryOptions.NONE; - } - - public void on_pane_installed() - { - username_entry.grab_focus(); - password_entry.set_activates_default(true); - login_button.can_default = true; - update_login_button_sensitivity(); - } - public void on_pane_uninstalled() {} - -} - -internal class PublishingOptionsPane : Spit.Publishing.DialogPane, GLib.Object -{ - RajcePublisher publisher; - private Album[] albums; - private string username; - - private Gtk.Builder builder = null; - private Gtk.Box pane_widget = null; - private Gtk.Label login_identity_label = null; - private Gtk.Label publish_to_label = null; - private Gtk.RadioButton use_existing_radio = null; - private Gtk.ComboBoxText existing_albums_combo = null; - private Gtk.RadioButton create_new_radio = null; - private Gtk.Entry new_album_entry = null; - private Gtk.CheckButton hide_check = null; - private Gtk.CheckButton show_check = null; - private Gtk.Button publish_button = null; - private Gtk.Button logout_button = null; - - public signal void publish( PublishingParameters parameters ); - public signal void logout(); - - public PublishingOptionsPane( RajcePublisher publisher, string username, Album[] albums ) - { - this.username = username; - this.albums = albums; - this.publisher = publisher; - this.pane_widget = new Gtk.Box(Gtk.Orientation.VERTICAL, 0); - - try - { - this.builder = new Gtk.Builder(); - builder.add_from_resource (Resources.RESOURCE_PATH + "/rajce_publishing_options_pane.ui"); - builder.connect_signals(null); - - pane_widget = (Gtk.Box) builder.get_object("rajce_pane_widget"); - login_identity_label = (Gtk.Label) builder.get_object("login_identity_label"); - publish_to_label = (Gtk.Label) builder.get_object("publish_to_label"); - use_existing_radio = (Gtk.RadioButton) builder.get_object("use_existing_radio"); - existing_albums_combo = (Gtk.ComboBoxText) builder.get_object("existing_albums_combo"); - create_new_radio = (Gtk.RadioButton) builder.get_object("create_new_radio"); - new_album_entry = (Gtk.Entry) builder.get_object("new_album_entry"); - hide_check = (Gtk.CheckButton) builder.get_object("hide_check"); - hide_check.set_label(_("_Hide album") ); - show_check = (Gtk.CheckButton) builder.get_object("show_check"); - publish_button = (Gtk.Button) builder.get_object("publish_button"); - logout_button = (Gtk.Button) builder.get_object("logout_button"); - - hide_check.set_active( publisher.get_hide_album() ); - show_check.set_active( publisher.get_show_album() ); - login_identity_label.set_label(_("You are logged into Rajce as %s.").printf(username)); - publish_to_label.set_label(_("Photos will appear in:")); - use_existing_radio.set_label(_("An _existing album:") ); - create_new_radio.set_label(_("A _new album named:") ); - show_check.set_label(_("Open target _album in browser") ); - publish_button.set_label(_("_Publish") ); - logout_button.set_label(_("_Logout") ); - - use_existing_radio.clicked.connect(on_use_existing_radio_clicked); - create_new_radio.clicked.connect(on_create_new_radio_clicked); - new_album_entry.changed.connect(on_new_album_entry_changed); - logout_button.clicked.connect(on_logout_clicked); - publish_button.clicked.connect(on_publish_clicked); - } - catch (Error e) - { - warning("Could not load UI: %s", e.message); - } - - } - - private void on_publish_clicked() - { - bool show_album = show_check.get_active(); - publisher.set_show_album( show_album ); - if (create_new_radio.get_active()) - { - string album_name = new_album_entry.get_text(); - bool hide_album = hide_check.get_active(); - publisher.set_hide_album( hide_album ); - publish( new PublishingParameters.to_new_album( album_name, hide_album ) ); - } - else - { - int id = albums[existing_albums_combo.get_active()].id; - string album_name = albums[existing_albums_combo.get_active()].albumName; - publish( new PublishingParameters.to_existing_album( album_name, id ) ); - } - } - - private void on_use_existing_radio_clicked() - { - existing_albums_combo.set_sensitive(true); - new_album_entry.set_sensitive(false); - existing_albums_combo.grab_focus(); - update_publish_button_sensitivity(); - hide_check.set_sensitive(false); - } - - private void on_create_new_radio_clicked() - { - new_album_entry.set_sensitive(true); - existing_albums_combo.set_sensitive(false); - new_album_entry.grab_focus(); - update_publish_button_sensitivity(); - hide_check.set_sensitive(true); - } - - private void on_logout_clicked() - { - logout(); - } - private void update_publish_button_sensitivity() - { - string album_name = new_album_entry.get_text(); - publish_button.set_sensitive( album_name.strip() != "" || !create_new_radio.get_active()); - } - private void on_new_album_entry_changed() - { - update_publish_button_sensitivity(); - } - public void installed() - { - for (int i = 0; i < albums.length; i++) - { - // TODO: sort albums according to their updateDate property - existing_albums_combo.append_text( albums[i].albumName ); - } - if (albums.length == 0) - { - existing_albums_combo.set_sensitive(false); - use_existing_radio.set_sensitive(false); - } - else - { - existing_albums_combo.set_active(0); - existing_albums_combo.set_sensitive(true); - use_existing_radio.set_sensitive(true); - } - create_new_radio.set_active(true); - on_create_new_radio_clicked(); - } - - protected void notify_publish(PublishingParameters parameters) - { - publish( parameters ); - } - - protected void notify_logout() - { - logout(); - } - - public Gtk.Widget get_default_widget() - { - return logout_button; - } - public Gtk.Widget get_widget() - { - return pane_widget; - } - - public Spit.Publishing.DialogPane.GeometryOptions get_preferred_geometry() - { - return Spit.Publishing.DialogPane.GeometryOptions.NONE; - } - - public void on_pane_installed() - { - installed(); - publish.connect(notify_publish); - logout.connect(notify_logout); - } - - public void on_pane_uninstalled() - { - publish.disconnect(notify_publish); - logout.disconnect(notify_logout); - } -} - -internal class PublishingParameters -{ - public string? album_name; - public bool? album_hidden; - public int? album_id; - - private PublishingParameters() - { - } - public PublishingParameters.to_new_album( string album_name, bool album_hidden ) - { - this.album_name = album_name; - this.album_hidden = album_hidden; - this.album_id = 0; - } - public PublishingParameters.to_existing_album( string album_name, int album_id ) - { - this.album_name = album_name; - this.album_hidden = null; - this.album_id = album_id; - } -} - -// REST support classes -/** - * Session class that keeps track of the credentials - */ -internal class Session : Publishing.RESTSupport.Session { - private string? usertoken = null; - private string? albumtoken = null; - private string? albumticket = null; - private string? username = null; - private int? userid = null; - private int? maxsize = null; - private int? quality = null; - - public Session() - { - base(""); - } - - public override bool is_authenticated() - { - return (userid != null && usertoken != null && username != null); - } - - public void authenticate(string token, string name, int id, int maxsize, int quality ) - { - this.usertoken = token; - this.username = name; - this.userid = id; - this.maxsize = maxsize; - this.quality = quality; - } - - public void deauthenticate() - { - usertoken = null; - albumtoken = null; - albumticket = null; - username = null; - userid = null; - maxsize = null; - quality = null; - } - - public void set_usertoken( string? usertoken ){ this.usertoken = usertoken; } - public void set_albumtoken( string? albumtoken ){ this.albumtoken = albumtoken; } - public void set_albumticket( string? albumticket ){ this.albumticket = albumticket; } - - public string get_usertoken() { return usertoken; } - public string get_albumtoken() { return albumtoken; } - public string get_albumticket() { return albumticket; } - public string get_username() { return username; } -// public int get_userid() { return userid; } - public int get_maxsize() { return maxsize; } -// public int get_quality() { return quality; } -} - -internal class ArgItem -{ - public string? key; - public string? val; - public ArgItem[] children; - - public ArgItem( string? k, string? v ) - { - key = k; - val = v; - children = new ArgItem[0]; - } - public void AddChild( ArgItem child ) - { - children += child; - } - public void AddChildren( ArgItem[] newchildren ) - { - foreach( ArgItem child in newchildren ) - { - AddChild( child ); - } - } - ~ArgItem() - { - foreach( ArgItem child in children ) - { - child = null; - } - } -} - -/// <summary> -/// implementation of Rajce Live API -/// </summary> -internal class LiveApiRequest -{ - private ArgItem[] _params; - private string _cmd; - public LiveApiRequest( string cmd ) - { - _params = new ArgItem[0]; - _cmd = cmd; - } - /// <summary> - /// add string parameter - /// </summary> - public void AddParam( string name, string val ) - { - _params += new ArgItem( name, val ); - } - /// <summary> - /// add boolean parameter - /// </summary> - public void AddParamBool( string name, bool val ) - { - AddParam( name, val ? "1" : "0" ); - } - /// <summary> - /// add integer parameter - /// </summary> - public void AddParamInt( string name, int val ) - { - AddParam( name, val.to_string() ); - } -/* /// <summary> - /// add double parameter - /// </summary> - public void AddParamDouble( string name, double val ) - { - AddParam( name, val.to_string() ); - } -*/ /// <summary> - /// add compound parameter - /// </summary> - public void AddParamNode( string name, ArgItem[] val ) - { - ArgItem newItem = new ArgItem( name, null ); - newItem.AddChildren( val ); - _params += newItem; - } - /// <summary> - /// create XML fragment containing all parameters - /// </summary> - public string Params2XmlString( bool urlencode = true ) - { - Xml.Doc* doc = new Xml.Doc( "1.0" ); - Xml.Node* root = new Xml.Node( null, "request" ); - doc->set_root_element( root ); - root->new_text_child( null, "command", _cmd ); - Xml.Node* par = root->new_text_child( null, "parameters", "" ); - foreach( ArgItem arg in _params ) - { - WriteParam( par, arg ); - } - string xmlstr; - doc->dump_memory_enc( out xmlstr ); - delete doc; - if( urlencode ) - { - return Soup.URI.encode( xmlstr, "&;" ); - } - return xmlstr; - } - /// <summary> - /// write single or compound (recursively) parameter into XML - /// </summary> - private static void WriteParam( Xml.Node* node, ArgItem arg ) - { - if( arg.children.length == 0 ) - { - node->new_text_child( null, arg.key, arg.val ); - } - else - { - Xml.Node* subnode = node->new_text_child( null, arg.key, "" ); - foreach( ArgItem child in arg.children ) - { - WriteParam( subnode, child ); - } - } - } -} - - -/** - * Generic REST transaction class. - * - * This class implements the generic logic for all REST transactions used - * by the Rajce publishing plugin. - */ -internal class Transaction : Publishing.RESTSupport.Transaction -{ - public Transaction(Session session) - { - base(session); - } - - public static string? validate_xml(Publishing.RESTSupport.XmlDocument doc) - { - Xml.Node* root = doc.get_root_node(); - if( root == null ) - { - return "No XML returned from server"; - } - string name = root->name; - - // treat malformed root as an error condition - if( name == null || name != "response" ) - { - return "No response from Rajce in XML"; - } - Xml.Node* errcode; - Xml.Node* result; - try - { - errcode = doc.get_named_child(root, "errorCode"); - result = doc.get_named_child(root, "result"); - } - catch (Spit.Publishing.PublishingError err) - { - return null; - } - return "999 Rajce Error [%d]: %s".printf( int.parse( errcode->get_content() ), result->get_content() ); - } -} - -/** - * Transaction used to implement the network login interaction. - */ -internal class SessionLoginTransaction : Transaction -{ - public SessionLoginTransaction(Session session, string url, string username, string token) - { - debug("SessionLoginTransaction: URL: %s", url); - base.with_endpoint_url(session, url); - LiveApiRequest req = new LiveApiRequest( "login" ); - req.AddParam( "clientID", "RajceShotwellPlugin" ); - req.AddParam( "currentVersion", "1.1.1.1" ); - req.AddParam( "login", username ); - req.AddParam( "password", token ); - string xml = req.Params2XmlString(); - add_argument("data", xml); - } -} - -/** - * Transaction used to implement the get albums interaction. - */ -internal class GetAlbumsTransaction : Transaction -{ - public GetAlbumsTransaction(Session session, string url) - { - base.with_endpoint_url(session, url); - LiveApiRequest req = new LiveApiRequest( "getAlbumList" ); - req.AddParam( "token", session.get_usertoken() ); - ArgItem[] columns = new ArgItem[0]; - columns += new ArgItem( "column", "viewCount" ); - columns += new ArgItem( "column", "isFavourite" ); - columns += new ArgItem( "column", "descriptionHtml" ); - columns += new ArgItem( "column", "coverPhotoID" ); - columns += new ArgItem( "column", "localPath" ); - req.AddParamNode( "columns", columns ); - string xml = req.Params2XmlString(); - add_argument("data", xml ); - } -} - -/** - * Transaction used to implement the create album interaction. - */ -internal class CreateAlbumTransaction : Transaction -{ - public CreateAlbumTransaction( Session session, string url, string albumName, bool hidden ) - { - base.with_endpoint_url(session, url); - LiveApiRequest req = new LiveApiRequest( "createAlbum" ); - req.AddParam( "token", session.get_usertoken() ); - req.AddParam( "albumName", albumName ); - req.AddParam( "albumDescription", "" ); - req.AddParamBool( "albumVisible", !hidden ); - string xml = req.Params2XmlString(); - add_argument("data", xml); - } -} - -/** - * Transaction used to implement the open album interaction. - */ -internal class OpenAlbumTransaction : Transaction -{ - public OpenAlbumTransaction( Session session, string url, int albumID ) - { - base.with_endpoint_url(session, url); - LiveApiRequest req = new LiveApiRequest( "openAlbum" ); - req.AddParam( "token", session.get_usertoken() ); - req.AddParamInt( "albumID", albumID ); - string xml = req.Params2XmlString(); - add_argument("data", xml); - } -} - -/** - * Transaction used to implement the close album interaction. - */ -internal class GetAlbumUrlTransaction : Transaction -{ - public GetAlbumUrlTransaction( Session session, string url ) - { - base.with_endpoint_url(session, url); - LiveApiRequest req = new LiveApiRequest( "getAlbumUrl" ); - req.AddParam( "token", session.get_usertoken() ); - req.AddParam( "albumToken", session.get_albumtoken() ); - string xml = req.Params2XmlString(); - add_argument("data", xml); - } -} - -/** - * Transaction used to implement the close album interaction. - */ -internal class CloseAlbumTransaction : Transaction -{ - public CloseAlbumTransaction( Session session, string url ) - { - base.with_endpoint_url(session, url); - LiveApiRequest req = new LiveApiRequest( "closeAlbum" ); - req.AddParam( "token", session.get_usertoken() ); - req.AddParam( "albumToken", session.get_albumtoken() ); - string xml = req.Params2XmlString(); - add_argument("data", xml); - } -} - -/** - * Transaction used to implement the get categories interaction. - */ -internal class GetCategoriesTransaction : Transaction -{ - public GetCategoriesTransaction( Session session, string url ) - { - base.with_endpoint_url(session, url); - LiveApiRequest req = new LiveApiRequest( "getCategories" ); - req.AddParam( "token", session.get_usertoken() ); - string xml = req.Params2XmlString(); - add_argument("data", xml); - } -} - -/** - * Transaction used to implement the upload photo. - */ -private class AddPhotoTransaction : Publishing.RESTSupport.UploadTransaction -{ - private PublishingParameters parameters = null; - - public AddPhotoTransaction(Session session, string url, PublishingParameters parameters, Spit.Publishing.Publishable publishable) - { - base.with_endpoint_url( session, publishable, url ); - this.parameters = parameters; - - debug("RajcePlugin: Uploading photo %s to%s album %s", publishable.get_serialized_file().get_basename(), ( parameters.album_id > 0 ? "" : " new" ), parameters.album_name ); - - string basename = publishable.get_param_string( Spit.Publishing.Publishable.PARAM_STRING_BASENAME ); - string comment = publishable.get_param_string( Spit.Publishing.Publishable.PARAM_STRING_COMMENT ); - string pubname = publishable.get_publishing_name(); - - int width = session.get_maxsize(); - int height = session.get_maxsize(); - - LiveApiRequest req = new LiveApiRequest( "addPhoto" ); - req.AddParam( "token", session.get_usertoken() ); - req.AddParamInt( "width", width ); - req.AddParamInt( "height", height ); - req.AddParam( "albumToken", session.get_albumtoken() ); - req.AddParam( "photoName", pubname ); - req.AddParam( "fullFileName", basename ); - req.AddParam( "description", ( comment != null ? comment : "" ) ); - string xml = req.Params2XmlString( false ); - add_argument( "data", xml ); - - GLib.HashTable<string, string> disposition_table = new GLib.HashTable<string, string>(GLib.str_hash, GLib.str_equal); - disposition_table.insert("name", "photo"); - disposition_table.insert("filename", Soup.URI.encode( basename, null ) ); - set_binary_disposition_table( disposition_table ); - } - -} - - -} - |