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)
50 mProgress.IncNumberScannedFiles();
51 if (IsHandledFile(*i))
53 mProgress.IncNumberHandledFiles();
56 mProgressSignal(mProgress);
57 if (mProgress.GetStop()) break;
59 SetNumberOfChildren();
61 //=====================================================================
63 //=====================================================================
64 void TreeHandlerImageAdder::AddDirectory( const std::string& directory,
68 AddDirectoryRecursor( directory, recurse );
69 SetNumberOfChildren();
70 GimmickDebugMessage(3,mProgress<<std::endl);
73 //=====================================================================
75 void TreeHandlerImageAdder::SetNumberOfChildren()
77 std::vector<tree::Node*> children = mTreeHandler->GetTree().GetChildrenList();
78 std::vector<tree::Node*>::iterator it;
79 for(it=children.begin();it!=children.end();++it)
81 SetNumberOfChildrenRecursor(*it);
84 //=====================================================================
86 void TreeHandlerImageAdder::SetNumberOfChildrenRecursor(tree::Node* node)
88 std::stringstream out;
89 out << node->GetChildrenList().size();
90 mTreeHandler->SetAttribute(node,"D1111_0011",out.str());
91 if(node->GetLevel()<mTreeHandler->GetTree().GetNumberOfLevels()-2)
93 std::vector<tree::Node*> children = node->GetChildrenList();
94 std::vector<tree::Node*>::iterator it;
95 for(it=children.begin();it!=children.end();++it)
97 SetNumberOfChildrenRecursor(*it);
102 //=====================================================================
103 void TreeHandlerImageAdder::AddFile( const std::string& filename )
105 GimmickDebugMessage(4,"Adding '"<<filename<<"'"<<std::endl);
106 std::map< std::string, std::string> attr;
107 mTreeHandler->GetTree().GetDescriptor().BuildAttributeMap(attr);
109 mReader.ReadAttributes(filename,attr);
111 int lev = mTreeHandler->AddBranch(attr);
113 // update the progress according to lev
114 if (lev<mTreeHandler->GetTree().GetNumberOfLevels())
115 mProgress.IncNumberAddedFiles();
117 //=====================================================================
119 //=====================================================================
120 void TreeHandlerImageAdder::AddDirectoryRecursor(const std::string &dirpath,
123 GimmickDebugMessage(4,"Scanning '"<<dirpath<<"'"<<std::endl);
124 mProgress.IncNumberScannedDirs();
126 if ( !fs::exists( dirpath ) ) return;
128 fs::directory_iterator end_itr; // default construction yields past-the-end
129 for ( fs::directory_iterator itr( dirpath );
133 // If is directory & recurse : do recurse
134 if ( fs::is_directory(itr->status()) )
136 if (recursive) AddDirectoryRecursor( itr->string(), recursive);
140 mProgress.IncNumberScannedFiles();
141 if (IsHandledFile(itr->string()))
143 mProgress.IncNumberHandledFiles();
144 AddFile( itr->string() );
146 mProgressSignal(mProgress);
147 if (mProgress.GetStop()) break;
155 std::string fileName;
156 std::string dirName = dirpath;
158 wxDir dir( std2wx(dirpath) );
160 if ( !dir.IsOpened() )
162 // deal with the error here - wxDir would already log an error message
163 // explaining the exact reason of the failure
169 bool cont = dir.GetFirst(&filename, wxEmptyString,
170 wxDIR_FILES | wxDIR_HIDDEN );
173 mProgress.IncNumberScannedFiles();
175 wxFileName wxffn(dir.GetName(),filename);
176 std::string ffn = wx2std(wxffn.GetFullPath());
177 if (IsHandledFile(ffn))
179 mProgress.IncNumberHandledFiles();
182 mProgressSignal(mProgress);
183 cont = ( dir.GetNext(&filename) && (!mProgress.GetStop()) );
186 // Recurse into subdirs
189 cont = dir.GetFirst(&filename, wxEmptyString,
190 wxDIR_DIRS | wxDIR_HIDDEN );
193 wxFileName wxffn(dir.GetName(),filename);
194 std::string ffn = wx2std(wxffn.GetFullPath());
195 AddDirectoryRecursor( ffn, recursive);
196 cont = dir.GetNext(&filename);
202 //=======================================================================