source: trunk/CrypPluginBase/Miscellaneous/DataManager.cs @ 1425

Last change on this file since 1425 was 1425, checked in by malischewski, 12 years ago

Added support for customDataStore

File size: 5.1 KB
Line 
1/*
2   Copyright 2009 Matthäus Wander, University of Duisburg-Essen
3
4   Licensed under the Apache License, Version 2.0 (the "License");
5   you may not use this file except in compliance with the License.
6   You may obtain a copy of the License at
7
8       http://www.apache.org/licenses/LICENSE-2.0
9
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License.
15*/
16
17using System;
18using System.Collections.Generic;
19using System.Text;
20using System.IO;
21using System.Reflection;
22
23namespace Cryptool.PluginBase.Miscellaneous
24{
25    public class DataManager
26    {
27        private const string DataDirecory = "Data";
28
29        private const string MetaSuffix = ".metainfo";
30
31        private readonly string customDataStore;
32
33        private readonly string globalDataStore;
34
35        public DataManager()
36        {
37            this.customDataStore = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), DataDirecory);
38            this.globalDataStore = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), DataDirecory);
39        }
40
41        public DataManager(string customDataStore)
42        {
43            this.customDataStore = Path.Combine(customDataStore, DataDirecory);
44            this.globalDataStore = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), DataDirecory);
45        }
46        /// <summary>
47        /// Maps filename to metainfo.
48        /// </summary>
49        /// <param name="datatype"></param>
50        /// <returns></returns>
51        public IDictionary<string, DataFileMetaInfo> LoadDirectory(string datatype)
52        {
53            Dictionary<string, DataFileMetaInfo> filesDict = new Dictionary<string, DataFileMetaInfo>();
54
55           
56            DirectoryInfo dir;
57            if (customDataStore != null)
58            {
59                dir = new DirectoryInfo(Path.Combine(customDataStore, datatype));
60            }
61            else
62            {
63                dir = new DirectoryInfo(Path.Combine(globalDataStore, datatype));
64            }
65            if (dir.Exists)
66            {
67                // TODO: read subdirectories
68
69                LoadFiles(dir, filesDict);
70            }
71
72            return filesDict;
73        }
74
75
76
77        private void LoadFiles(DirectoryInfo dir, Dictionary<string, DataFileMetaInfo> filesDict)
78        {
79            foreach(FileInfo file in dir.GetFiles())
80            {
81                if (file.Name.EndsWith(MetaSuffix))
82                    continue;
83
84                if (filesDict.ContainsKey(file.Name.ToLower()))
85                {
86                    // TODO: throw warning about duplicate file
87                }
88                else
89                {
90                    filesDict.Add(file.Name.ToLower(), GetFileMeta(file));
91                }
92            }
93        }
94
95        private DataFileMetaInfo GetFileMeta(FileInfo dataFile)
96        {
97            DataFileMetaInfo metaInfo = new DataFileMetaInfo();
98            metaInfo.DataFile = dataFile;
99
100            FileInfo metaFile = new FileInfo(String.Concat(dataFile.FullName, MetaSuffix));
101            if (metaFile.Exists)
102            {
103                KeyValueReader keyValues = new KeyValueReader(metaFile);
104
105                metaInfo.MetaFile = metaFile;
106                metaInfo.KeyValues = keyValues;
107
108                // TODO: should ignore case
109                if (keyValues.ContainsKey("textencoding"))
110                {
111                    try
112                    {
113                        metaInfo.TextEncoding = Encoding.GetEncoding(keyValues["textencoding"]);
114                    }
115                    catch (ArgumentException e)
116                    {
117                        // Encoding error, defaulting to null
118                        metaInfo.TextEncoding = null;
119                        // TODO: throw warning about unknown encoding
120                    }
121                }
122            }
123
124            return metaInfo;
125        }
126    }
127
128    public class DataFileMetaInfo
129    {
130        public FileInfo DataFile
131        {
132            get;
133            internal set;
134        }
135
136        public FileInfo MetaFile
137        {
138            get;
139            internal set;
140        }
141
142        public Encoding TextEncoding
143        {
144            get;
145            internal set;
146        }
147
148        public string Name
149        {
150            get
151            {
152                if (KeyValues.ContainsKey("name"))
153                    return KeyValues["name"];
154                else
155                    return DataFile.Name;
156            }
157        }
158
159        public IDictionary<string, string> KeyValues
160        {
161            get;
162            internal set;
163        }
164
165        public override string ToString()
166        {
167            return Name;
168        }
169       
170    }
171}
Note: See TracBrowser for help on using the repository browser.