]> Creatis software - creaImageIO.git/blob - src2/creaImageIOTreeHandlerImageAdder.cpp
ef31c09f651f327a5276e9301c21c9e364063782
[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   }
60   //=====================================================================
61
62   //=====================================================================
63   void TreeHandlerImageAdder::AddDirectory( const std::string& directory,
64                                             bool recurse)
65   {
66     mProgress.Reset();
67     AddDirectoryRecursor( directory, recurse );
68     GimmickDebugMessage(3,mProgress<<std::endl);
69   }
70
71   //=====================================================================
72   void TreeHandlerImageAdder::AddFile( const std::string& filename )
73   {
74     GimmickDebugMessage(4,"Adding '"<<filename<<"'"<<std::endl);
75     std::map< std::string, std::string>  attr;
76     mTreeHandler->GetTree().GetDescriptor().BuildAttributeMap(attr);
77
78     mReader.ReadAttributes(filename,attr);
79
80     int lev = mTreeHandler->AddBranch(attr);
81
82     // update the progress according to lev
83     if (lev<mTreeHandler->GetTree().GetNumberOfLevels())
84       mProgress.IncNumberAddedFiles();
85   }
86   //=====================================================================
87
88   //=====================================================================
89   void TreeHandlerImageAdder::AddDirectoryRecursor(const std::string &dirpath, 
90                                                    bool recursive)
91   {
92     GimmickDebugMessage(4,"Scanning '"<<dirpath<<"'"<<std::endl);
93     mProgress.IncNumberScannedDirs();
94
95     if ( !fs::exists( dirpath ) ) return;
96     
97     fs::directory_iterator end_itr; // default construction yields past-the-end
98     for ( fs::directory_iterator itr( dirpath );
99           itr != end_itr;
100           ++itr )
101       {
102         // If is directory & recurse : do recurse
103         if ( fs::is_directory(itr->status()) )
104           {
105             if (recursive) AddDirectoryRecursor( itr->string(), recursive);
106           }
107         else 
108           {
109             mProgress.IncNumberScannedFiles();
110                 if (IsHandledFile(itr->string()))
111               {
112                 mProgress.IncNumberHandledFiles();
113                 AddFile( itr->string() );
114               }
115             mProgressSignal(mProgress);
116             if (mProgress.GetStop()) break;
117           }
118       }
119          
120   }
121
122     /*
123
124     std::string fileName;
125     std::string dirName = dirpath;
126
127     wxDir dir( std2wx(dirpath) );
128
129     if ( !dir.IsOpened() )
130       {
131         // deal with the error here - wxDir would already log an error message
132         // explaining the exact reason of the failure
133         return;
134       }
135
136     wxString filename;
137
138     bool cont = dir.GetFirst(&filename, wxEmptyString, 
139                              wxDIR_FILES | wxDIR_HIDDEN );
140     while ( cont )
141       {
142         mProgress.IncNumberScannedFiles();
143
144         wxFileName wxffn(dir.GetName(),filename);
145         std::string ffn = wx2std(wxffn.GetFullPath());
146         if (IsHandledFile(ffn)) 
147           {
148             mProgress.IncNumberHandledFiles();
149             AddFile( ffn );
150           }
151         mProgressSignal(mProgress);
152         cont = ( dir.GetNext(&filename) && (!mProgress.GetStop()) );
153       }
154     
155     // Recurse into subdirs
156     if ( recursive )
157       {
158         cont = dir.GetFirst(&filename, wxEmptyString, 
159                             wxDIR_DIRS | wxDIR_HIDDEN );
160         while ( cont )
161           {
162             wxFileName wxffn(dir.GetName(),filename);
163             std::string ffn = wx2std(wxffn.GetFullPath());
164             AddDirectoryRecursor( ffn, recursive);
165             cont = dir.GetNext(&filename);
166           }
167       }
168   
169   */
170   
171   //=======================================================================
172
173
174  
175 }