Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono-addins.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'Mono.Addins/Mono.Addins.Database/AddinHostIndex.cs')
-rw-r--r--Mono.Addins/Mono.Addins.Database/AddinHostIndex.cs68
1 files changed, 59 insertions, 9 deletions
diff --git a/Mono.Addins/Mono.Addins.Database/AddinHostIndex.cs b/Mono.Addins/Mono.Addins.Database/AddinHostIndex.cs
index 7919497..571deda 100644
--- a/Mono.Addins/Mono.Addins.Database/AddinHostIndex.cs
+++ b/Mono.Addins/Mono.Addins.Database/AddinHostIndex.cs
@@ -31,26 +31,46 @@ using System;
using System.Collections;
using Mono.Addins.Serialization;
using System.IO;
+using System.Collections.Generic;
namespace Mono.Addins.Database
{
class AddinHostIndex: IBinaryXmlElement
{
static BinaryXmlTypeMap typeMap = new BinaryXmlTypeMap (typeof(AddinHostIndex));
-
- Hashtable index = new Hashtable ();
-
+
+ Dictionary<string, string> index;
+
+ public AddinHostIndex ()
+ {
+ index = new Dictionary<string, string> ();
+ }
+
+ public AddinHostIndex (ImmutableAddinHostIndex immutableIndex)
+ {
+ this.index = immutableIndex.ToDictionary();
+ }
+
+ public ImmutableAddinHostIndex ToImmutableAddinHostIndex ()
+ {
+ return new ImmutableAddinHostIndex (new Dictionary<string, string> (index));
+ }
+
public void RegisterAssembly (string assemblyLocation, string addinId, string addinLocation, string domain)
{
assemblyLocation = NormalizeFileName (assemblyLocation);
index [Path.GetFullPath (assemblyLocation)] = addinId + " " + addinLocation + " " + domain;
}
-
+
public bool GetAddinForAssembly (string assemblyLocation, out string addinId, out string addinLocation, out string domain)
{
+ return LookupAddinForAssembly (index, assemblyLocation, out addinId, out addinLocation, out domain);
+ }
+
+ internal static bool LookupAddinForAssembly (Dictionary<string, string> index, string assemblyLocation, out string addinId, out string addinLocation, out string domain)
+ {
assemblyLocation = NormalizeFileName (assemblyLocation);
- string s = index [Path.GetFullPath (assemblyLocation)] as string;
- if (s == null) {
+ if (!index.TryGetValue(Path.GetFullPath (assemblyLocation), out var s)) {
addinId = null;
addinLocation = null;
domain = null;
@@ -70,7 +90,7 @@ namespace Mono.Addins.Database
{
string loc = addinId + " " + Path.GetFullPath (addinLocation) + " ";
ArrayList todelete = new ArrayList ();
- foreach (DictionaryEntry e in index) {
+ foreach (var e in index) {
if (((string)e.Value).StartsWith (loc))
todelete.Add (e.Key);
}
@@ -82,7 +102,13 @@ namespace Mono.Addins.Database
{
return (AddinHostIndex) fileDatabase.ReadObject (file, typeMap);
}
-
+
+ public static ImmutableAddinHostIndex ReadAsImmutable (FileDatabase fileDatabase, string file)
+ {
+ var hostIndex = (AddinHostIndex)fileDatabase.ReadObject (file, typeMap);
+ return new ImmutableAddinHostIndex (hostIndex.index);
+ }
+
public void Write (FileDatabase fileDatabase, string file)
{
fileDatabase.WriteObject (file, this, typeMap);
@@ -98,7 +124,7 @@ namespace Mono.Addins.Database
reader.ReadValue ("index", index);
}
- string NormalizeFileName (string name)
+ internal static string NormalizeFileName (string name)
{
if (Util.IsWindows)
return name.ToLower ();
@@ -106,4 +132,28 @@ namespace Mono.Addins.Database
return name;
}
}
+
+ class ImmutableAddinHostIndex
+ {
+ Dictionary<string, string> index;
+
+ public ImmutableAddinHostIndex () : this (new Dictionary<string, string> ())
+ {
+ }
+
+ public ImmutableAddinHostIndex (Dictionary<string, string> index)
+ {
+ this.index = index;
+ }
+
+ public bool GetAddinForAssembly (string assemblyLocation, out string addinId, out string addinLocation, out string domain)
+ {
+ return AddinHostIndex.LookupAddinForAssembly (index, assemblyLocation, out addinId, out addinLocation, out domain);
+ }
+
+ public Dictionary<string, string> ToDictionary ()
+ {
+ return new Dictionary<string, string> (index);
+ }
+ }
}