1 #include <creaImageIOTreeHandlerImageAdder.h>
2 #include <creaImageIOSystem.h>
4 //#include <wx/filename.h>
6 #include "boost/filesystem.hpp"
8 namespace fs = boost::filesystem;
10 //using namespace crea;
14 //====================================================================
16 TreeHandlerImageAdder::TreeHandlerImageAdder(TreeHandler* tree)
21 TreeHandlerImageAdder::~TreeHandlerImageAdder()
24 //====================================================================
26 //====================================================================
27 void TreeHandlerImageAdder::ConnectProgressObserver(ProgressCallbackType callback)
29 mProgressSignal.connect(callback);
31 //====================================================================
33 //=====================================================================
34 bool TreeHandlerImageAdder::IsHandledFile( const std::string& filename)
36 return (mReader.CanRead(filename));
38 //=====================================================================
40 //=====================================================================
41 void TreeHandlerImageAdder::AddFiles( const std::vector<std::string>& filenames)
45 unsigned int nbf = filenames.size();
46 std::vector<std::string>::const_iterator i;
47 for (i=filenames.begin();i!=filenames.end();++i)
49 mProgress.IncNumberScannedFiles();
50 if (IsHandledFile(*i))
52 mProgress.IncNumberHandledFiles();
55 mProgressSignal(mProgress);
56 if (mProgress.GetStop()) break;
59 //=====================================================================
61 //=====================================================================
62 void TreeHandlerImageAdder::AddDirectory( const std::string& directory,
66 AddDirectoryRecursor( directory, recurse );
67 GimmickDebugMessage(3,mProgress<<std::endl);
69 //=====================================================================
74 //=====================================================================
75 void TreeHandlerImageAdder::AddFile( const std::string& filename )
77 GimmickDebugMessage(4,"Adding '"<<filename<<"'"<<std::endl);
78 std::map< std::string, std::string> attr;
79 mTreeHandler->GetTree().GetDescriptor().BuildAttributeMap(attr);
81 mReader.ReadAttributes(filename,attr);
83 int lev = mTreeHandler->AddBranch(attr);
85 // update the progress according to lev
86 if (lev<mTreeHandler->GetTree().GetNumberOfLevels())
87 mProgress.IncNumberAddedFiles();
89 //=====================================================================
91 //=====================================================================
92 void TreeHandlerImageAdder::AddDirectoryRecursor(const std::string &dirpath,
95 GimmickDebugMessage(4,"Scanning '"<<dirpath<<"'"<<std::endl);
96 mProgress.IncNumberScannedDirs();
98 if ( !fs::exists( dirpath ) ) return;
100 fs::directory_iterator end_itr; // default construction yields past-the-end
101 for ( fs::directory_iterator itr( dirpath );
105 // If is directory & recurse : do recurse
106 if ( fs::is_directory(itr->status()) )
108 if (recursive) AddDirectoryRecursor( itr->string(), recursive);
112 mProgress.IncNumberScannedFiles();
113 if (IsHandledFile(itr->string()))
115 mProgress.IncNumberHandledFiles();
116 AddFile( itr->string() );
118 mProgressSignal(mProgress);
119 if (mProgress.GetStop()) break;
126 std::string fileName;
127 std::string dirName = dirpath;
129 wxDir dir( std2wx(dirpath) );
131 if ( !dir.IsOpened() )
133 // deal with the error here - wxDir would already log an error message
134 // explaining the exact reason of the failure
140 bool cont = dir.GetFirst(&filename, wxEmptyString,
141 wxDIR_FILES | wxDIR_HIDDEN );
144 mProgress.IncNumberScannedFiles();
146 wxFileName wxffn(dir.GetName(),filename);
147 std::string ffn = wx2std(wxffn.GetFullPath());
148 if (IsHandledFile(ffn))
150 mProgress.IncNumberHandledFiles();
153 mProgressSignal(mProgress);
154 cont = ( dir.GetNext(&filename) && (!mProgress.GetStop()) );
157 // Recurse into subdirs
160 cont = dir.GetFirst(&filename, wxEmptyString,
161 wxDIR_DIRS | wxDIR_HIDDEN );
164 wxFileName wxffn(dir.GetName(),filename);
165 std::string ffn = wx2std(wxffn.GetFullPath());
166 AddDirectoryRecursor( ffn, recursive);
167 cont = dir.GetNext(&filename);
173 //=======================================================================