linux: Implement handling of sparkleshare:// links

This commit is contained in:
Hylke Bons 2012-02-27 02:01:41 +00:00
parent b9c1424f7c
commit 4c1794e792
9 changed files with 50 additions and 76 deletions

View file

@ -75,7 +75,31 @@ namespace SparkleShare {
public override void InstallProtocolHandler ()
{
// TODO
// sparkleshare-invite-opener.desktop launches the handler on newer
// systems (like GNOME 3) that implement the last freedesktop.org specs.
// For GNOME 2 however we need to tell gconf about the protocol manually
Console.WriteLine ();
try {
// Add the handler to gconf...
Process process = new Process ();
process.StartInfo.FileName = "gconftool-2";
process.StartInfo.Arguments =
"-s /desktop/gnome/url-handlers/sparkleshare/command 'sparkleshare open %s' --type String";
process.Start ();
process.WaitForExit ();
// ...and enable it
process.StartInfo.Arguments =
"-s /desktop/gnome/url-handlers/sparkleshare/enabled --type Boolean true";
process.Start ();
process.WaitForExit ();
} catch {
// Pity...
}
}

View file

@ -174,6 +174,17 @@ namespace SparkleShare {
if (InviteReceived != null) {
SparkleInvite invite = new SparkleInvite (args.FullPath);
// It may be that the invite we received a path to isn't
// fully downloaded yet, so we try to read it several times
int tries = 0;
while (!invite.IsValid) {
Thread.Sleep (1 * 250);
invite = new SparkleInvite (args.FullPath);
tries++;
if (tries > 20)
break;
}
if (invite.IsValid) {
InviteReceived (invite);

View file

@ -248,8 +248,7 @@ namespace SparkleShare {
new string [] {SparkleUI.AssetsPath, "icons",
"hicolor", "12x12", "status", "document-moved.png"}.Combine ());
Console.WriteLine (html);
Application.Invoke (delegate {
this.spinner.Stop ();
this.web_view.LoadString (html, null, null, "file://");

View file

@ -29,8 +29,8 @@ namespace SparkleShare {
public string Address { get; private set; }
public string RemotePath { get; private set; }
public Uri AcceptUrl { get; private set; }
public Uri AnnouncementsUrl { get; private set; }
public string AcceptUrl { get; private set; }
public string AnnouncementsUrl { get; private set; }
public bool IsValid {
@ -68,6 +68,7 @@ namespace SparkleShare {
try {
xml_document.Load (xml_file_path);
node = xml_document.SelectSingleNode ("/sparkleshare/invite/address/text()");
if (node != null) { address = node.Value; }
@ -80,6 +81,7 @@ namespace SparkleShare {
node = xml_document.SelectSingleNode ("/sparkleshare/invite/announcements_url/text()");
if (node != null) { announcements_url = node.Value; }
Initialize (address, remote_path, accept_url, announcements_url);
} catch (XmlException e) {
@ -91,7 +93,7 @@ namespace SparkleShare {
public bool Accept ()
{
if (AcceptUrl == null)
if (string.IsNullOrEmpty (AcceptUrl))
return true;
try {
@ -133,8 +135,8 @@ namespace SparkleShare {
{
Address = address;
RemotePath = remote_path;
AcceptUrl = new Uri (accept_url);
AnnouncementsUrl = new Uri (announcements_url);
AcceptUrl = accept_url;
AnnouncementsUrl = announcements_url;
}
}
}

View file

@ -330,7 +330,7 @@ namespace SparkleShare {
case PageType.Invite: {
Header = _("You've reveived an invite!");
Header = _("You've received an invite!");
Description = _("Do you want to add this project to SparkleShare?");

View file

@ -135,6 +135,8 @@ namespace SparkleShare {
Program.Controller.InviteReceived += delegate (SparkleInvite invite) {
PendingInvite = invite;
if (ChangePageEvent != null)
ChangePageEvent (PageType.Invite, null);

View file

@ -1,66 +0,0 @@
// SparkleShare, a collaboration and sharing tool.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.IO;
using System.Net;
namespace SparkleShare {
public class SparkleShare {
public static void Main (string [] args) {
new SparkleInviteOpen (args [0]);
}
}
public class SparkleInviteOpen {
public SparkleInviteOpen (string url)
{
string safe_url = url.Replace ("sparkleshare://", "https://");
string unsafe_url = url.Replace ("sparkleshare://", "http://");
string xml = "";
WebClient web_client = new WebClient ();
try {
xml = web_client.DownloadString (safe_url);
} catch {
Console.WriteLine ("Failed downloading invite: " + safe_url);
try {
xml = web_client.DownloadString (safe_url);
} catch {
Console.WriteLine ("Failed downloading invite: " + unsafe_url);
}
}
string home_path = Environment.GetFolderPath (Environment.SpecialFolder.Personal);
string target_path = Path.Combine (home_path, "SparkleShare");
if (xml.Contains ("<sparkleshare>")) {
File.WriteAllText (target_path, xml);
Console.WriteLine ("Downloaded invite: " + safe_url);
}
}
}
}

View file

@ -4,3 +4,4 @@ Name=SparkleShareInviteOpener
Exec=sparkleshare open %U
Terminal=false
MimeType=application/x-sparkleshare;x-scheme-handler/sparkleshare;
NoDisplay=true

View file

@ -62,7 +62,8 @@ case $1 in
start
;;
open|--open)
curl -o ~/SparkleShare/`date -u +%N`.xml `echo $2 | sed s/sparkleshare:/https:/`
invite=`date -u +%N`
curl -o ~/SparkleShare/$invite.xml `echo $2 | sed s/sparkleshare:/http:/`
;;
help|--help|-h)
mono "@expanded_libdir@/@PACKAGE@/SparkleShare.exe" --help