1 #include <creaImageIOGimmick.h>
3 #include <creaImageIOSystem.h>
5 #include <boost/filesystem.hpp>
6 #include <boost/algorithm/string.hpp>
12 //==============================================================
16 RegisterGimmickMessageTypes();
18 //==============================================================
22 //==============================================================
27 //==============================================================
30 //==============================================================
31 void Gimmick::Initialize()
33 // Create the UserSettings dir if does not exist
34 CreateUserSettingsDirectory();
35 // Sets the current directory to the home dir
36 mCurrentDirectory = GetHomeDirectory();
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() ) )
46 std::string mess = "Local database '";
47 mess += GetLocalDatabasePath();
48 mess += "' does not exist : creating it";
49 GimmickMessage(1,mess<<std::endl);
51 // CREATING DEFAULT DB STRUCTURE
52 // mLocalDatabase->GetTree().GetDescriptor().CreateDefault();
53 mLocalDatabase->GetTree().GetDescriptor().createDescriptorfromFile(mCurrentDirectory + "\\.gimmick\\localdatabase_Descriptor.txt");
55 if ( ! mLocalDatabase->Create(true) )
57 GimmickError("ERROR CREATING '"<<GetLocalDatabasePath()<<"'");
59 mLocalDatabase->SetAttribute(0,"Name","Local database");
64 GimmickMessage(1,"Opening local database '"
65 <<GetLocalDatabasePath()<<"' "
67 if ( ! mLocalDatabase->Open(true) )
69 GimmickError("ERROR OPENING '"<<GetLocalDatabasePath()<<"'");
75 // Creates files and directories database
76 mTimestampDatabase = new TimestampDatabaseHandler(GetTimestampDatabasePath());
77 // Create or open local database
78 if (! boost::filesystem::exists( GetTimestampDatabasePath() ) )
80 std::string mess = "Timestamp database '";
81 mess += GetTimestampDatabasePath();
82 mess += "' does not exist : creating it";
83 GimmickMessage(1,mess<<std::endl);
85 if ( ! mTimestampDatabase->Create() )
87 GimmickError("ERROR CREATING '"<<GetTimestampDatabasePath()<<"'");
94 GimmickMessage(1,"Opening Timestamp database '"
95 <<GetTimestampDatabasePath()<<"' "
97 if ( ! mTimestampDatabase->Open() )
99 GimmickError("ERROR OPENING '"<<GetTimestampDatabasePath()<<"'");
105 //================================================================
108 //==============================================================
109 void Gimmick::Finalize()
111 delete mLocalDatabase;
112 delete mTimestampDatabase;
114 //==============================================================
116 //================================================================
119 #define VALID_FILE_SEPARATOR "\\"
120 #define INVALID_FILE_SEPARATOR "/"
122 #define INVALID_FILE_SEPARATOR "\\"
123 #define VALID_FILE_SEPARATOR "/"
125 //================================================================
127 //================================================================
128 const std::string& Gimmick::GetHomeDirectory()
130 if (mHomeDirectory.size()==0)
132 #if defined(__GNUC__)
133 mHomeDirectory = getenv("HOME");
134 #elif defined(_WIN32)
135 mHomeDirectory = getenv("USERPROFILE");
138 return mHomeDirectory;
140 //================================================================
141 const std::string& Gimmick::GetUserSettingsDirectory()
143 if (mUserSettingsDirectory.size()==0)
145 mUserSettingsDirectory = GetHomeDirectory();
146 mUserSettingsDirectory += "/.gimmick/";
147 boost::algorithm::replace_all( mUserSettingsDirectory,
148 INVALID_FILE_SEPARATOR ,
149 VALID_FILE_SEPARATOR);
151 return mUserSettingsDirectory;
153 //================================================================
155 //================================================================
156 const std::string& Gimmick::GetLocalDatabasePath()
158 if (mLocalDatabasePath.size()==0)
160 mLocalDatabasePath = GetUserSettingsDirectory();
161 mLocalDatabasePath += "local_database.sqlite3";
162 boost::algorithm::replace_all( mLocalDatabasePath,
163 INVALID_FILE_SEPARATOR ,
164 VALID_FILE_SEPARATOR);
166 return mLocalDatabasePath;
169 //================================================================
171 //================================================================
172 const std::string& Gimmick::GetTimestampDatabasePath()
174 if (mTimestampDatabasePath.size()==0)
176 mTimestampDatabasePath = GetUserSettingsDirectory();
177 mTimestampDatabasePath += "timestamp_database.sqlite3";
178 boost::algorithm::replace_all( mTimestampDatabasePath,
179 INVALID_FILE_SEPARATOR ,
180 VALID_FILE_SEPARATOR);
182 return mTimestampDatabasePath;
184 //========================================================================
186 //========================================================================
187 void Gimmick::CreateUserSettingsDirectory()
189 if (! boost::filesystem::is_directory( GetUserSettingsDirectory() ) )
191 GimmickMessage(1,"Directory '"<<GetUserSettingsDirectory()<<"' "
192 << "does not exist : creating it"<<std::endl);
194 if ( ! boost::filesystem::create_directory( GetUserSettingsDirectory() ) )
196 GimmickError("ERROR CREATING '"<<GetUserSettingsDirectory()<<"'");
200 //========================================================================
203 //========================================================================
204 /// Sets message level
205 void Gimmick::SetMessageLevel(int l)
207 SetGimmickMessageLevel(l);
209 //========================================================================
211 //========================================================================
212 /// Sets message level
213 void Gimmick::SetDebugMessageLevel(int l)
215 SetGimmickDebugMessageLevel(l);
217 //========================================================================
219 //========================================================================
220 /// Returns the tree handler with the given name
221 TreeHandler* Gimmick::GetTreeHandler(const std::string& name) const
223 TreeHandlerMapType::const_iterator i;
224 i = GetTreeHandlerMap().find(name);
225 if ( i == GetTreeHandlerMap().end() )
227 GimmickError("TreeHandler '"<<name<<"' does not exist");
232 //========================================================================
233 ///Returns the timestamp database handler
234 TimestampDatabaseHandler* Gimmick::GetTimestampDatabase() const
236 return mTimestampDatabase;
240 //========================================================================
241 /// Add the files to the tree handler
242 void Gimmick::AddFiles(const std::string& d,
243 const std::vector<std::string>& filenames)
245 GimmickMessage(2,"Adding files to '"<<d<<"'"<<std::endl);
247 mImageAdder.SetTreeHandler(GetTreeHandler(d));
248 mImageAdder.SetTimestampHandler(mTimestampDatabase);
249 mImageAdder.AddFiles(filenames);
252 //========================================================================
254 //========================================================================
255 /// Add a dir to the local database
256 void Gimmick::AddDir(const std::string& d, const std::string& f,
259 GimmickMessage(2,"Adding dir '"<<f<<"' to '"<<d<<"' recurse:"
260 <<recurse<<std::endl);
262 TreeHandler * handler=GetTreeHandler(d);
263 mImageAdder.SetTreeHandler(handler);
264 mImageAdder.SetTimestampHandler(mTimestampDatabase);
265 mImageAdder.AddDirectory(f,recurse);
266 //Synchronize(true, handler);
270 //========================================================================
272 //========================================================================
274 void Gimmick::Synchronize(bool update, TreeHandler* handler)
276 GimmickMessage(4,"Synchronizing. Update:"<<update<<std::endl);
279 mSynchronizer=new Synchronizer(handler);
283 mSynchronizer->SetTreeHandler(handler);
285 mSynchronizer->Synchronize(update);
289 //========================================================================
291 void Gimmick::Print(const std::string& d)
293 GetTreeHandler(d)->GetTree().Print();
295 //========================================================================