]> Creatis software - creaImageIO.git/blob - src2/creaImageIOTreeHandlerImageAdder.cpp
800a8b8f08ae65223edc8a4b0ebc4e02eaa87f64
[creaImageIO.git] / src2 / creaImageIOTreeHandlerImageAdder.cpp
1 #include <creaImageIOTreeHandlerImageAdder.h>
2 #include <creaImageIOSystem.h>
3 #include "boost/filesystem.hpp"
4
5 namespace fs = boost::filesystem;
6
7 //using namespace crea;
8
9 namespace creaImageIO
10 {
11   //====================================================================
12   // Ctor
13   TreeHandlerImageAdder::TreeHandlerImageAdder(TreeHandler* tree)
14     : mTreeHandler(tree)
15   {
16   }
17   // Dtor
18   TreeHandlerImageAdder::~TreeHandlerImageAdder()
19   {
20   }
21   //====================================================================
22
23   //====================================================================
24   void TreeHandlerImageAdder::ConnectProgressObserver(ProgressCallbackType callback)
25   {
26     mProgressSignal.connect(callback);
27   }
28   //====================================================================
29
30   //=====================================================================
31   bool TreeHandlerImageAdder::IsHandledFile( const std::string& filename)
32   {
33     return (mReader.CanRead(filename));
34   }
35   //=====================================================================
36
37   //=====================================================================
38   void TreeHandlerImageAdder::AddFiles( const std::vector<std::string>& filenames)
39   {
40     mProgress.Reset();
41
42     unsigned int nbf = filenames.size(); 
43     std::vector<std::string>::const_iterator i;
44     for (i=filenames.begin();i!=filenames.end();++i)
45       {
46                   
47         mProgress.IncNumberScannedFiles();
48         if (IsHandledFile(*i)) 
49           {
50             mProgress.IncNumberHandledFiles();
51             AddFile(*i);
52           }
53         mProgressSignal(mProgress);
54         if (mProgress.GetStop()) break;
55       }
56   }
57   //=====================================================================
58
59   //=====================================================================
60   void TreeHandlerImageAdder::AddDirectory( const std::string& directory,
61                                             bool recurse)
62   {
63     mProgress.Reset();
64     AddDirectoryRecursor( directory, recurse );
65     GimmickDebugMessage(3,mProgress<<std::endl);
66   }
67
68   //=====================================================================
69   void TreeHandlerImageAdder::AddFile( const std::string& filename )
70   {
71     GimmickDebugMessage(4,"Adding '"<<filename<<"'"<<std::endl);
72     std::map< std::string, std::string>  attr;
73     mTreeHandler->GetTree().GetDescriptor().BuildAttributeMap(attr);
74
75     mReader.ReadAttributes(filename,attr);
76
77     int lev = mTreeHandler->AddBranch(attr);
78
79     // update the progress according to lev
80     if (lev<mTreeHandler->GetTree().GetNumberOfLevels())
81       mProgress.IncNumberAddedFiles();
82   }
83   //=====================================================================
84
85   //=====================================================================
86   void TreeHandlerImageAdder::AddDirectoryRecursor(const std::string &dirpath, 
87                                                    bool recursive)
88   {
89     GimmickDebugMessage(4,"Scanning '"<<dirpath<<"'"<<std::endl);
90     mProgress.IncNumberScannedDirs();
91
92     if ( !fs::exists( dirpath ) ) return;
93     
94     fs::directory_iterator end_itr; // default construction yields past-the-end
95     for ( fs::directory_iterator itr( dirpath );
96           itr != end_itr;
97           ++itr )
98       {
99         // If is directory & recurse : do recurse
100         if ( fs::is_directory(itr->status()) )
101           {
102             if (recursive) AddDirectoryRecursor( itr->string(), recursive);
103           }
104         else 
105           {
106             mProgress.IncNumberScannedFiles();
107             if (IsHandledFile(itr->string()))
108               {
109                 mProgress.IncNumberHandledFiles();
110                 AddFile( itr->string() );
111               }
112             mProgressSignal(mProgress);
113             if (mProgress.GetStop()) 
114               {
115                 //itr = end_itr;
116                 break;
117               }
118           }
119       }
120   }
121   //=======================================================================
122
123
124  
125 }