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