]> Creatis software - creaImageIO.git/blob - src2/creaImageIOTreeHandlerImageAdder.cpp
Fixed number of children algorithm and repetition of nodes on add directory.
[creaImageIO.git] / src2 / creaImageIOTreeHandlerImageAdder.cpp
1 #include <creaImageIOTreeHandlerImageAdder.h>
2 #include <creaImageIOSystem.h>
3 //#include <wx/dir.h>
4 //#include <wx/filename.h>
5
6 #include "boost/filesystem.hpp"
7
8 namespace fs = boost::filesystem;
9
10 //using namespace crea;
11
12 namespace creaImageIO
13 {
14   //====================================================================
15   // Ctor
16   TreeHandlerImageAdder::TreeHandlerImageAdder(TreeHandler* tree)
17     : mTreeHandler(tree)
18   {
19   }
20   // Dtor
21   TreeHandlerImageAdder::~TreeHandlerImageAdder()
22   {
23   }
24   //====================================================================
25
26   //====================================================================
27   void TreeHandlerImageAdder::ConnectProgressObserver(ProgressCallbackType callback)
28   {
29     mProgressSignal.connect(callback);
30   }
31   //====================================================================
32
33   //=====================================================================
34   bool TreeHandlerImageAdder::IsHandledFile( const std::string& filename)
35   {
36     return (mReader.CanRead(filename));
37   }
38   //=====================================================================
39
40   //=====================================================================
41   void TreeHandlerImageAdder::AddFiles( const std::vector<std::string>& filenames)
42   {
43     mProgress.Reset();
44
45     unsigned int nbf = filenames.size(); 
46     std::vector<std::string>::const_iterator i;
47     for (i=filenames.begin();i!=filenames.end();++i)
48       {
49                   
50         mProgress.IncNumberScannedFiles();
51         if (IsHandledFile(*i)) 
52           {
53             mProgress.IncNumberHandledFiles();
54             AddFile(*i);
55           }
56         mProgressSignal(mProgress);
57         if (mProgress.GetStop()) break;
58       }
59           SetNumberOfChildren();
60   }
61   //=====================================================================
62
63   //=====================================================================
64   void TreeHandlerImageAdder::AddDirectory( const std::string& directory,
65                                             bool recurse)
66   {
67     mProgress.Reset();
68     AddDirectoryRecursor( directory, recurse );
69         SetNumberOfChildren();
70     GimmickDebugMessage(3,mProgress<<std::endl);
71   }
72
73   //=====================================================================
74
75   void TreeHandlerImageAdder::SetNumberOfChildren()
76   {
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)
80         {
81         SetNumberOfChildrenRecursor(*it);
82         }
83   }
84   //=====================================================================
85
86   void TreeHandlerImageAdder::SetNumberOfChildrenRecursor(tree::Node* node)
87   {
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)
92           {
93                   std::vector<tree::Node*> children = node->GetChildrenList();
94                   std::vector<tree::Node*>::iterator it;
95           for(it=children.begin();it!=children.end();++it)
96                   {
97                           SetNumberOfChildrenRecursor(*it);
98                   }
99           }
100   }
101
102   //=====================================================================
103   void TreeHandlerImageAdder::AddFile( const std::string& filename )
104   {
105     GimmickDebugMessage(4,"Adding '"<<filename<<"'"<<std::endl);
106     std::map< std::string, std::string>  attr;
107     mTreeHandler->GetTree().GetDescriptor().BuildAttributeMap(attr);
108
109     mReader.ReadAttributes(filename,attr);
110
111     int lev = mTreeHandler->AddBranch(attr);
112
113     // update the progress according to lev
114     if (lev<mTreeHandler->GetTree().GetNumberOfLevels())
115       mProgress.IncNumberAddedFiles();
116   }
117   //=====================================================================
118
119   //=====================================================================
120   void TreeHandlerImageAdder::AddDirectoryRecursor(const std::string &dirpath, 
121                                                    bool recursive)
122   {
123     GimmickDebugMessage(4,"Scanning '"<<dirpath<<"'"<<std::endl);
124     mProgress.IncNumberScannedDirs();
125
126     if ( !fs::exists( dirpath ) ) return;
127     
128     fs::directory_iterator end_itr; // default construction yields past-the-end
129     for ( fs::directory_iterator itr( dirpath );
130           itr != end_itr;
131           ++itr )
132       {
133         // If is directory & recurse : do recurse
134         if ( fs::is_directory(itr->status()) )
135           {
136             if (recursive) AddDirectoryRecursor( itr->string(), recursive);
137           }
138         else 
139           {
140             mProgress.IncNumberScannedFiles();
141                 if (IsHandledFile(itr->string()))
142               {
143                 mProgress.IncNumberHandledFiles();
144                 AddFile( itr->string() );
145               }
146             mProgressSignal(mProgress);
147             if (mProgress.GetStop()) break;
148           }
149       }
150          
151   }
152
153     /*
154
155     std::string fileName;
156     std::string dirName = dirpath;
157
158     wxDir dir( std2wx(dirpath) );
159
160     if ( !dir.IsOpened() )
161       {
162         // deal with the error here - wxDir would already log an error message
163         // explaining the exact reason of the failure
164         return;
165       }
166
167     wxString filename;
168
169     bool cont = dir.GetFirst(&filename, wxEmptyString, 
170                              wxDIR_FILES | wxDIR_HIDDEN );
171     while ( cont )
172       {
173         mProgress.IncNumberScannedFiles();
174
175         wxFileName wxffn(dir.GetName(),filename);
176         std::string ffn = wx2std(wxffn.GetFullPath());
177         if (IsHandledFile(ffn)) 
178           {
179             mProgress.IncNumberHandledFiles();
180             AddFile( ffn );
181           }
182         mProgressSignal(mProgress);
183         cont = ( dir.GetNext(&filename) && (!mProgress.GetStop()) );
184       }
185     
186     // Recurse into subdirs
187     if ( recursive )
188       {
189         cont = dir.GetFirst(&filename, wxEmptyString, 
190                             wxDIR_DIRS | wxDIR_HIDDEN );
191         while ( cont )
192           {
193             wxFileName wxffn(dir.GetName(),filename);
194             std::string ffn = wx2std(wxffn.GetFullPath());
195             AddDirectoryRecursor( ffn, recursive);
196             cont = dir.GetNext(&filename);
197           }
198       }
199   
200   */
201   
202   //=======================================================================
203
204
205  
206 }