2
// AddinScanFolderInfo.cs
7
// Copyright (C) 2007 Novell, Inc (http://www.novell.com)
9
// Permission is hereby granted, free of charge, to any person obtaining
10
// a copy of this software and associated documentation files (the
11
// "Software"), to deal in the Software without restriction, including
12
// without limitation the rights to use, copy, modify, merge, publish,
13
// distribute, sublicense, and/or sell copies of the Software, and to
14
// permit persons to whom the Software is furnished to do so, subject to
15
// the following conditions:
17
// The above copyright notice and this permission notice shall be
18
// included in all copies or substantial portions of the Software.
20
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32
using System.Collections;
33
using System.Collections.Specialized;
34
using Mono.Addins.Serialization;
36
namespace Mono.Addins.Database
38
class AddinScanFolderInfo: IBinaryXmlElement
40
Hashtable files = new Hashtable ();
44
bool sharedFolder = true;
46
static BinaryXmlTypeMap typeMap = new BinaryXmlTypeMap (
47
typeof(AddinScanFolderInfo),
51
internal AddinScanFolderInfo ()
55
public AddinScanFolderInfo (string folder)
60
public string FileName {
61
get { return fileName; }
64
public static AddinScanFolderInfo Read (FileDatabase filedb, string file)
66
AddinScanFolderInfo finfo = (AddinScanFolderInfo) filedb.ReadSharedObject (file, typeMap);
68
finfo.fileName = file;
72
public static AddinScanFolderInfo Read (FileDatabase filedb, string basePath, string folderPath)
75
AddinScanFolderInfo finfo = (AddinScanFolderInfo) filedb.ReadSharedObject (basePath, GetDomain (folderPath), ".data", Path.GetFullPath (folderPath), typeMap, out fileName);
77
finfo.fileName = fileName;
81
static string GetDomain (string path)
83
path = Path.GetFullPath (path);
84
string s = path.Replace (Path.DirectorySeparatorChar, '_');
85
s = s.Replace (Path.AltDirectorySeparatorChar, '_');
86
s = s.Replace (Path.VolumeSeparatorChar, '_');
91
public void Write (FileDatabase filedb, string basePath)
93
filedb.WriteSharedObject (basePath, GetDomain (folder), ".data", Path.GetFullPath (folder), fileName, typeMap, this);
96
public string GetExistingLocalDomain ()
98
foreach (AddinFileInfo info in files.Values) {
99
if (info.Domain != null && info.Domain != AddinDatabase.GlobalDomain)
102
return AddinDatabase.GlobalDomain;
105
public string Folder {
106
get { return folder; }
109
public string Domain {
112
return AddinDatabase.GlobalDomain;
122
public string RootsDomain {
131
public string GetDomain (bool isRoot)
139
public bool SharedFolder {
144
sharedFolder = value;
148
public DateTime GetLastScanTime (string file)
150
AddinFileInfo info = (AddinFileInfo) files [file];
152
return DateTime.MinValue;
154
return info.LastScan;
157
public AddinFileInfo GetAddinFileInfo (string file)
159
return (AddinFileInfo) files [file];
162
public AddinFileInfo SetLastScanTime (string file, string addinId, bool isRoot, DateTime time, bool scanError)
164
AddinFileInfo info = (AddinFileInfo) files [file];
166
info = new AddinFileInfo ();
170
info.LastScan = time;
171
info.AddinId = addinId;
172
info.IsRoot = isRoot;
173
info.ScanError = scanError;
175
info.Domain = GetDomain (isRoot);
181
public ArrayList GetMissingAddins (AddinFileSystemExtension fs)
183
ArrayList missing = new ArrayList ();
185
if (!fs.DirectoryExists (folder)) {
187
foreach (AddinFileInfo info in files.Values) {
194
ArrayList toDelete = new ArrayList ();
195
foreach (AddinFileInfo info in files.Values) {
196
if (!fs.FileExists (info.File)) {
199
toDelete.Add (info.File);
201
else if (info.IsAddin && info.Domain != GetDomain (info.IsRoot)) {
205
foreach (string file in toDelete)
211
void IBinaryXmlElement.Write (BinaryXmlWriter writer)
213
if (files.Count == 0) {
217
writer.WriteValue ("folder", folder);
218
writer.WriteValue ("files", files);
219
writer.WriteValue ("domain", domain);
220
writer.WriteValue ("sharedFolder", sharedFolder);
223
void IBinaryXmlElement.Read (BinaryXmlReader reader)
225
folder = reader.ReadStringValue ("folder");
226
reader.ReadValue ("files", files);
227
domain = reader.ReadStringValue ("domain");
228
sharedFolder = reader.ReadBooleanValue ("sharedFolder");
233
class AddinFileInfo: IBinaryXmlElement
236
public DateTime LastScan;
237
public string AddinId;
239
public bool ScanError;
240
public string Domain;
241
public StringCollection IgnorePaths;
243
public bool IsAddin {
244
get { return AddinId != null && AddinId.Length != 0; }
247
public void AddPathToIgnore (string path)
249
if (IgnorePaths == null)
250
IgnorePaths = new StringCollection ();
251
IgnorePaths.Add (path);
254
void IBinaryXmlElement.Write (BinaryXmlWriter writer)
256
writer.WriteValue ("File", File);
257
writer.WriteValue ("LastScan", LastScan);
258
writer.WriteValue ("AddinId", AddinId);
259
writer.WriteValue ("IsRoot", IsRoot);
260
writer.WriteValue ("ScanError", ScanError);
261
writer.WriteValue ("Domain", Domain);
262
if (IgnorePaths != null && IgnorePaths.Count > 0)
263
writer.WriteValue ("IgnorePaths", IgnorePaths);
266
void IBinaryXmlElement.Read (BinaryXmlReader reader)
268
File = reader.ReadStringValue ("File");
269
LastScan = reader.ReadDateTimeValue ("LastScan");
270
AddinId = reader.ReadStringValue ("AddinId");
271
IsRoot = reader.ReadBooleanValue ("IsRoot");
272
ScanError = reader.ReadBooleanValue ("ScanError");
273
Domain = reader.ReadStringValue ("Domain");
274
IgnorePaths = (StringCollection) reader.ReadValue ("IgnorePaths", new StringCollection ());