diff --git a/SparkleLib/Git/SparkleFetcherGit.cs b/SparkleLib/Git/SparkleFetcherGit.cs
index 6633a1cf..f6523862 100755
--- a/SparkleLib/Git/SparkleFetcherGit.cs
+++ b/SparkleLib/Git/SparkleFetcherGit.cs
@@ -145,8 +145,8 @@ namespace SparkleLib.Git {
if (percentage >= 100)
break;
+ Thread.Sleep (500);
base.OnProgressChanged (percentage);
- Thread.Sleep (750);
}
base.OnProgressChanged (100);
diff --git a/SparkleShare/SparkleControllerBase.cs b/SparkleShare/SparkleControllerBase.cs
index a233961f..214af432 100644
--- a/SparkleShare/SparkleControllerBase.cs
+++ b/SparkleShare/SparkleControllerBase.cs
@@ -54,7 +54,7 @@ namespace SparkleShare {
public event FolderFetchedEventHandler FolderFetched;
- public delegate void FolderFetchedEventHandler (string [] warnings);
+ public delegate void FolderFetchedEventHandler (string remote_url, string [] warnings);
public event FolderFetchErrorHandler FolderFetchError;
public delegate void FolderFetchErrorHandler (string remote_url);
@@ -134,6 +134,7 @@ namespace SparkleShare {
public virtual void Initialize ()
{
+ SparklePlugin.PluginsPath = PluginsPath;
InstallProtocolHandler ();
// Create the SparkleShare folder and add it to the bookmarks
@@ -1057,32 +1058,31 @@ namespace SparkleShare {
try {
Directory.Move (tmp_folder, target_folder_path);
- SparkleConfig.DefaultConfig.AddFolder (target_folder_name, this.fetcher.RemoteUrl, backend);
+ SparkleConfig.DefaultConfig.AddFolder (target_folder_name, this.fetcher.RemoteUrl, backend);
+
if (!string.IsNullOrEmpty (announcements_url)) {
SparkleConfig.DefaultConfig.SetFolderOptionalAttribute (target_folder_name,
"announcements_url", announcements_url);
}
-
AddRepository (target_folder_path);
if (FolderFetched != null)
- FolderFetched (warnings);
+ FolderFetched (this.fetcher.RemoteUrl, warnings);
if (FolderListChanged != null)
- FolderListChanged ();
-
- this.fetcher.Dispose ();
-
- if (Directory.Exists (tmp_path))
- Directory.Delete (tmp_path, true);
+ FolderListChanged ();
} catch (Exception e) {
SparkleHelpers.DebugInfo ("Controller", "Error moving folder: " + e.Message);
}
+ this.fetcher.Dispose ();
this.fetcher = null;
+
+ if (Directory.Exists (tmp_path))
+ Directory.Delete (tmp_path, true);
};
this.fetcher.Failed += delegate {
diff --git a/SparkleShare/SparklePlugin.cs b/SparkleShare/SparklePlugin.cs
index b3d2db81..dc32ed60 100644
--- a/SparkleShare/SparklePlugin.cs
+++ b/SparkleShare/SparklePlugin.cs
@@ -16,12 +16,20 @@
using System;
+using System.IO;
using System.Xml;
namespace SparkleShare {
public class SparklePlugin {
+ public static string PluginsPath = "";
+
+ public static string LocalPluginsPath =
+ new string [] { Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData),
+ "sparkleshare", "plugins" }.Combine ();
+
+
public string Name {
get {
return GetValue ("info", "name");
@@ -36,10 +44,18 @@ namespace SparkleShare {
public string ImagePath {
get {
- return System.IO.Path.Combine (
+ string image_file_name = GetValue ("info", "icon");
+
+ string image_path = System.IO.Path.Combine (
this.plugin_directory,
- GetValue ("info", "icon")
+ image_file_name
);
+
+ if (File.Exists (image_path))
+ return image_path;
+ else
+ return System.IO.Path.Combine (
+ PluginsPath, image_file_name);
}
}
@@ -49,12 +65,6 @@ namespace SparkleShare {
}
}
- public string AnnouncementsUrl {
- get {
- return GetValue ("info", "announcements_url");
- }
- }
-
public string Address {
get {
return GetValue ("address", "value");
@@ -79,6 +89,12 @@ namespace SparkleShare {
}
}
+ public string AnnouncementsUrl {
+ get {
+ return GetValue ("info", "announcements_url");
+ }
+ }
+
private XmlDocument xml = new XmlDocument ();
private string plugin_directory;
@@ -90,15 +106,54 @@ namespace SparkleShare {
}
+ public static SparklePlugin Create (string name, string description, string address_value,
+ string address_example, string path_value, string path_example)
+ {
+ string plugin_path = System.IO.Path.Combine (LocalPluginsPath, name + ".xml");
+
+ if (File.Exists (plugin_path))
+ return null;
+
+ string plugin_xml = "" +
+ "" +
+ " " +
+ " " +
+ " " + name + "" +
+ " " + description + "" +
+ " own-server.png" +
+ " " +
+ " " +
+ " " + address_value + "" +
+ " " + address_example + "" +
+ " " +
+ " " +
+ " " + path_value + "" +
+ " " + path_example + "" +
+ " " +
+ " " +
+ "";
+
+ plugin_xml = plugin_xml.Replace ("", "");
+ plugin_xml = plugin_xml.Replace ("", "");
+
+ if (!Directory.Exists (LocalPluginsPath))
+ Directory.CreateDirectory (LocalPluginsPath);
+
+ File.WriteAllText (plugin_path, plugin_xml);
+
+ return new SparklePlugin (plugin_path);
+ }
+
+
private string GetValue (string a, string b)
{
XmlNode node = this.xml.SelectSingleNode (
"/sparkleshare/plugin/" + a + "/" + b + "/text()");
- if (node != null)
+ if (node != null && !string.IsNullOrEmpty (node.Value))
return node.Value;
else
return null;
}
}
-}
+}
\ No newline at end of file
diff --git a/SparkleShare/SparkleSetupController.cs b/SparkleShare/SparkleSetupController.cs
index f66d62b2..a90f7831 100755
--- a/SparkleShare/SparkleSetupController.cs
+++ b/SparkleShare/SparkleSetupController.cs
@@ -114,16 +114,18 @@ namespace SparkleShare {
PreviousUrl = "";
SyncingFolder = "";
- string local_plugins_path = SparkleHelpers.CombineMore (
- Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData),
- "sparkleshare", "plugins");
+ string local_plugins_path = SparklePlugin.LocalPluginsPath;
+ // Import all of the plugins
if (Directory.Exists (local_plugins_path))
+ // Local plugins go first...
foreach (string xml_file_path in Directory.GetFiles (local_plugins_path, "*.xml"))
Plugins.Add (new SparklePlugin (xml_file_path));
+ // ...system plugins after that...
if (Directory.Exists (Program.Controller.PluginsPath)) {
foreach (string xml_file_path in Directory.GetFiles (Program.Controller.PluginsPath, "*.xml")) {
+ // ...and "Own server" at the very top
if (xml_file_path.EndsWith ("own-server.xml"))
Plugins.Insert (0, new SparklePlugin (xml_file_path));
else
@@ -154,7 +156,6 @@ namespace SparkleShare {
}
if (page_type == PageType.Add) {
-
if (!Program.Controller.FirstRun && TutorialPageNumber == 0) {
if (ChangePageEvent != null)
ChangePageEvent (page_type, null);
@@ -324,10 +325,32 @@ namespace SparkleShare {
// The following private methods are
// delegates used by the previous method
- private void AddPageFetchedDelegate (string [] warnings)
+ private void AddPageFetchedDelegate (string remote_url, string [] warnings)
{
SyncingFolder = "";
+ // Create a local plugin for succesfully added projects, so
+ // so the user can easily use the same host again
+ if (SelectedPluginIndex == 0) {
+ SparklePlugin new_plugin;
+ Uri uri = new Uri (remote_url);
+
+ try {
+ string address = remote_url.Replace (uri.AbsolutePath, "");
+
+ new_plugin = SparklePlugin.Create (
+ uri.Host, address, address, "", "", "");
+
+ if (new_plugin != null) {
+ Plugins.Insert (1, new_plugin);
+ SparkleHelpers.DebugInfo ("Controller", "Added plugin for " + uri.Host);
+ }
+
+ } catch {
+ SparkleHelpers.DebugInfo ("Controller", "Failed adding plugin for " + uri.Host);
+ }
+ }
+
if (ChangePageEvent != null)
ChangePageEvent (PageType.Finished, warnings);
@@ -383,7 +406,7 @@ namespace SparkleShare {
// The following private methods are
// delegates used by the previous method
- private void InvitePageFetchedDelegate (string [] warnings)
+ private void InvitePageFetchedDelegate (string remote_url, string [] warnings)
{
SyncingFolder = "";
PendingInvite = null;