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

Last change on this file since 2147 was 2147, checked in by Matthäus Wander, 11 years ago

fixed #163

  • DataManager is able to find data files again
  • cause: Data directory has moved from top level Data\ to CrypPlugins\Data\
File size: 4.4 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;
22using Cryptool.PluginBase.IO;
23
24namespace Cryptool.PluginBase.Miscellaneous
25{
26    public class DataManager
27    {
28        private const string DataDirecory = "Data";
29
30        private const string MetaSuffix = ".metainfo";
31
32        private readonly string globalDataStore;
33
34        public DataManager()
35        {
36            this.globalDataStore = Path.Combine(DirectoryHelper.DirectoryCrypPlugins, DataDirecory);
37        }
38
39        /// <summary>
40        /// Maps filename to metainfo.
41        /// </summary>
42        /// <param name="datatype"></param>
43        /// <returns></returns>
44        public IDictionary<string, DataFileMetaInfo> LoadDirectory(string datatype)
45        {
46            Dictionary<string, DataFileMetaInfo> filesDict = new Dictionary<string, DataFileMetaInfo>();
47
48            // TODO: enable custom data store
49            DirectoryInfo dir = new DirectoryInfo(Path.Combine(globalDataStore, datatype));
50            if (dir.Exists)
51            {
52                // TODO: read subdirectories
53
54                LoadFiles(dir, filesDict);
55            }
56
57            return filesDict;
58        }
59
60        private void LoadFiles(DirectoryInfo dir, Dictionary<string, DataFileMetaInfo> filesDict)
61        {
62            foreach(FileInfo file in dir.GetFiles())
63            {
64                if (file.Name.EndsWith(MetaSuffix))
65                    continue;
66
67                if (filesDict.ContainsKey(file.Name.ToLower()))
68                {
69                    // TODO: throw warning about duplicate file
70                }
71                else
72                {
73                    filesDict.Add(file.Name.ToLower(), GetFileMeta(file));
74                }
75            }
76        }
77
78        private DataFileMetaInfo GetFileMeta(FileInfo dataFile)
79        {
80            DataFileMetaInfo metaInfo = new DataFileMetaInfo();
81            metaInfo.DataFile = dataFile;
82
83            FileInfo metaFile = new FileInfo(String.Concat(dataFile.FullName, MetaSuffix));
84            if (metaFile.Exists)
85            {
86                KeyValueReader keyValues = new KeyValueReader(metaFile);
87
88                metaInfo.MetaFile = metaFile;
89                metaInfo.KeyValues = keyValues;
90
91                // TODO: should ignore case
92                if (keyValues.ContainsKey("textencoding"))
93                {
94                    try
95                    {
96                        metaInfo.TextEncoding = Encoding.GetEncoding(keyValues["textencoding"]);
97                    }
98                    catch (ArgumentException e)
99                    {
100                        // Encoding error, defaulting to null
101                        metaInfo.TextEncoding = null;
102                        // TODO: throw warning about unknown encoding
103                    }
104                }
105            }
106
107            return metaInfo;
108        }
109    }
110
111    public class DataFileMetaInfo
112    {
113        public FileInfo DataFile
114        {
115            get;
116            internal set;
117        }
118
119        public FileInfo MetaFile
120        {
121            get;
122            internal set;
123        }
124
125        public Encoding TextEncoding
126        {
127            get;
128            internal set;
129        }
130
131        public string Name
132        {
133            get
134            {
135                if (KeyValues.ContainsKey("name"))
136                    return KeyValues["name"];
137                else
138                    return DataFile.Name;
139            }
140        }
141
142        public IDictionary<string, string> KeyValues
143        {
144            get;
145            internal set;
146        }
147
148        public override string ToString()
149        {
150            return Name;
151        }
152       
153    }
154}
Note: See TracBrowser for help on using the repository browser.