]> Creatis software - creaImageIO.git/blob - src2/creaImageIOGimmick.cpp
Utilisation d'un fichier de config pour la création de la BD et des AttributeDescript...
[creaImageIO.git] / src2 / creaImageIOGimmick.cpp
1 #include <creaImageIOGimmick.h>
2
3 #include <creaImageIOSystem.h>
4
5 #include <boost/filesystem.hpp>
6 #include <boost/algorithm/string.hpp>
7
8 namespace creaImageIO
9 {
10
11
12   //==============================================================
13   Gimmick::Gimmick()
14     : mImageAdder(0)
15   {    
16     RegisterGimmickMessageTypes();
17   }
18   //==============================================================
19
20
21
22   //==============================================================
23   Gimmick::~Gimmick()
24   {
25     
26   }
27   //==============================================================
28   
29
30   //==============================================================
31   void Gimmick::Initialize()
32   {
33     // Create the UserSettings dir if does not exist
34     CreateUserSettingsDirectory();
35     // Sets the current directory to the home dir
36     mCurrentDirectory =  GetHomeDirectory();
37         mSynchronizer=0;
38
39     // Create local database handler
40     mLocalDatabase = new SQLiteTreeHandler(GetLocalDatabasePath());
41     // Add it to the TreeHandlerMap
42     mTreeHandlerMap["Local database"] = mLocalDatabase;
43     // Create or open local database
44     if (! boost::filesystem::exists( GetLocalDatabasePath() ) )
45       {
46         std::string mess = "Local database '";
47         mess += GetLocalDatabasePath();
48         mess += "' does not exist : creating it";
49         GimmickMessage(1,mess<<std::endl);
50         
51         // CREATING DEFAULT DB STRUCTURE
52 //      mLocalDatabase->GetTree().GetDescriptor().CreateDefault();
53         mLocalDatabase->GetTree().GetDescriptor().createDescriptorfromFile(mCurrentDirectory + "\\.gimmick\\localdatabase_Descriptor.txt");
54         
55         if ( ! mLocalDatabase->Create(true) )
56           {
57             GimmickError("ERROR CREATING '"<<GetLocalDatabasePath()<<"'");
58           }
59         mLocalDatabase->SetAttribute(0,"Name","Local database");
60       }
61     else 
62       {
63         /// Open and test it
64         GimmickMessage(1,"Opening local database '"
65                        <<GetLocalDatabasePath()<<"' "
66                        <<std::endl);
67         if ( ! mLocalDatabase->Open(true) )
68           {
69             GimmickError("ERROR OPENING '"<<GetLocalDatabasePath()<<"'");
70           }
71         
72       }
73
74
75         // Creates files and directories database
76     mTimestampDatabase = new TimestampDatabaseHandler(GetTimestampDatabasePath());
77     // Create or open local database
78     if (! boost::filesystem::exists( GetTimestampDatabasePath() ) )
79       {
80         std::string mess = "Timestamp database '";
81         mess += GetTimestampDatabasePath();
82         mess += "' does not exist : creating it";
83         GimmickMessage(1,mess<<std::endl);
84         
85         if ( ! mTimestampDatabase->Create() )
86           {
87             GimmickError("ERROR CREATING '"<<GetTimestampDatabasePath()<<"'");
88           }
89         
90      }
91     else 
92       {
93         /// Open and test it
94         GimmickMessage(1,"Opening Timestamp database '"
95                        <<GetTimestampDatabasePath()<<"' "
96                        <<std::endl);
97         if ( ! mTimestampDatabase->Open() )
98           {
99             GimmickError("ERROR OPENING '"<<GetTimestampDatabasePath()<<"'");
100           }
101         
102       }
103
104   }
105   //================================================================
106
107
108   //==============================================================
109   void Gimmick::Finalize()
110   {
111     delete mLocalDatabase;
112         delete mTimestampDatabase;
113   }
114   //==============================================================
115
116   //================================================================
117   // file separator
118 #if defined(_WIN32)
119 #define VALID_FILE_SEPARATOR "\\"
120 #define INVALID_FILE_SEPARATOR "/"
121 #else
122 #define INVALID_FILE_SEPARATOR "\\"
123 #define VALID_FILE_SEPARATOR "/"
124 #endif
125   //================================================================
126
127   //================================================================
128   const std::string& Gimmick::GetHomeDirectory()
129   {
130     if (mHomeDirectory.size()==0) 
131       {
132 #if defined(__GNUC__)
133         mHomeDirectory = getenv("HOME");
134 #elif defined(_WIN32)
135         mHomeDirectory = getenv("USERPROFILE");
136 #endif
137       }
138     return mHomeDirectory;
139   }
140   //================================================================
141   const std::string& Gimmick::GetUserSettingsDirectory()
142   {
143     if (mUserSettingsDirectory.size()==0) 
144       {
145         mUserSettingsDirectory = GetHomeDirectory();
146         mUserSettingsDirectory += "/.gimmick/";
147         boost::algorithm::replace_all( mUserSettingsDirectory, 
148                                        INVALID_FILE_SEPARATOR , 
149                                        VALID_FILE_SEPARATOR);
150       }
151     return mUserSettingsDirectory;
152   }
153   //================================================================
154
155   //================================================================
156   const std::string& Gimmick::GetLocalDatabasePath()
157   {
158     if (mLocalDatabasePath.size()==0) 
159       {
160         mLocalDatabasePath = GetUserSettingsDirectory();
161         mLocalDatabasePath += "local_database.sqlite3";
162         boost::algorithm::replace_all( mLocalDatabasePath,
163                                        INVALID_FILE_SEPARATOR , 
164                                        VALID_FILE_SEPARATOR);
165       }
166     return mLocalDatabasePath;    
167   }
168
169   //================================================================
170
171   //================================================================
172   const std::string& Gimmick::GetTimestampDatabasePath()
173   {
174     if (mTimestampDatabasePath.size()==0) 
175       {
176         mTimestampDatabasePath = GetUserSettingsDirectory();
177         mTimestampDatabasePath += "timestamp_database.sqlite3";
178         boost::algorithm::replace_all( mTimestampDatabasePath,
179                                        INVALID_FILE_SEPARATOR , 
180                                        VALID_FILE_SEPARATOR);
181       }
182     return mTimestampDatabasePath;    
183   }
184   //========================================================================
185
186   //========================================================================
187   void Gimmick::CreateUserSettingsDirectory()
188   {
189     if (! boost::filesystem::is_directory( GetUserSettingsDirectory() ) )
190       {
191         GimmickMessage(1,"Directory '"<<GetUserSettingsDirectory()<<"' "
192                        << "does not exist : creating it"<<std::endl);
193         
194         if ( ! boost::filesystem::create_directory( GetUserSettingsDirectory() ) )
195           {
196             GimmickError("ERROR CREATING '"<<GetUserSettingsDirectory()<<"'");
197           }
198       }
199   }
200   //========================================================================
201
202
203   //========================================================================
204   /// Sets message level
205   void Gimmick::SetMessageLevel(int l)
206   {
207     SetGimmickMessageLevel(l);
208   }
209   //========================================================================
210
211   //========================================================================
212   /// Sets message level
213   void Gimmick::SetDebugMessageLevel(int l)
214   {
215     SetGimmickDebugMessageLevel(l);
216   }
217   //========================================================================
218
219   //========================================================================
220   /// Returns the tree handler with the given name
221   TreeHandler* Gimmick::GetTreeHandler(const std::string& name) const 
222   {  
223     TreeHandlerMapType::const_iterator i;
224     i = GetTreeHandlerMap().find(name);
225     if ( i == GetTreeHandlerMap().end() )
226       {
227         GimmickError("TreeHandler '"<<name<<"' does not exist");
228       }
229     return i->second;
230   }
231
232   //========================================================================
233   ///Returns the timestamp database handler
234   TimestampDatabaseHandler* Gimmick::GetTimestampDatabase() const 
235   {  
236     return mTimestampDatabase;
237   }
238
239
240   //========================================================================
241   /// Add the files to the tree handler
242   void Gimmick::AddFiles(const std::string& d, 
243                         const std::vector<std::string>& filenames)
244   {
245     GimmickMessage(2,"Adding files to '"<<d<<"'"<<std::endl);
246  
247     mImageAdder.SetTreeHandler(GetTreeHandler(d));
248         mImageAdder.SetTimestampHandler(mTimestampDatabase);
249     mImageAdder.AddFiles(filenames);
250
251   }
252   //========================================================================
253
254   //========================================================================
255   /// Add a dir to the local database
256   void Gimmick::AddDir(const std::string& d, const std::string& f, 
257                        bool recurse)
258   {
259     GimmickMessage(2,"Adding dir '"<<f<<"' to '"<<d<<"' recurse:"
260                    <<recurse<<std::endl);
261
262         TreeHandler * handler=GetTreeHandler(d);
263     mImageAdder.SetTreeHandler(handler);
264         mImageAdder.SetTimestampHandler(mTimestampDatabase);
265     mImageAdder.AddDirectory(f,recurse);
266         //Synchronize(true, handler);
267     
268   }
269
270   //========================================================================
271
272   //========================================================================
273  
274   void Gimmick::Synchronize(bool update, TreeHandler* handler)
275   {
276           GimmickMessage(4,"Synchronizing. Update:"<<update<<std::endl);
277           if(mSynchronizer==0)
278           {
279                   mSynchronizer=new Synchronizer(handler);
280           }
281           else
282           {
283                   mSynchronizer->SetTreeHandler(handler);
284           }
285           mSynchronizer->Synchronize(update);
286
287   }
288
289   //========================================================================
290   /// 
291   void Gimmick::Print(const std::string& d)
292   {
293     GetTreeHandler(d)->GetTree().Print();
294   }
295   //========================================================================
296
297
298 }