gKitGL
TextFileIO.h
00001 
00002 #ifndef _IOTEXTFILE_H
00003 #define _IOTEXTFILE_H
00004 
00005 #include "IOManager.h"
00006 #include "IOFileManager.h"
00007 #include "TextFile.h"
00008 
00009 
00010 namespace gk {
00011 
00012 //! manager pour importer des ficheirs textes, sources, shaders, etc.
00013 class TextFileIO : public IOManager<TextFile>
00014 {
00015     // non copyable
00016     TextFileIO( const TextFileIO& );
00017     TextFileIO& operator=( const TextFileIO& );
00018     
00019     // private default constructor, singleton
00020     TextFileIO( )
00021         :
00022         IOManager<TextFile>()
00023     {}
00024     
00025     ~TextFileIO( ) {}
00026     
00027 public:
00028     //! importe l'objet 'name' du fichier 'filename'.
00029     static
00030     TextFile *read( const std::string& filename, const std::string& name= "" ) 
00031     {
00032         // importer le fichier, si necessaire
00033         if(filename.empty() == true)
00034             return NULL;
00035         
00036         IOFileInfo handle= IOFileManager::manager().file(filename);
00037         if(handle.isValid() == false)
00038             return NULL;
00039         TextFile *file= manager().find(handle, name);
00040         if(file != NULL)
00041             return file;
00042         
00043         // importer le fichier
00044     #ifdef VERBOSE      //_DEBUG
00045         printf("loading '%s'...\n", filename.c_str());
00046     #endif
00047         file= new TextFile(filename);
00048         if(file->read(filename) < 0)
00049         {
00050         #ifdef VERBOSE      //_DEBUG
00051             printf("loading '%s'... failed.\n", filename.c_str());
00052         #endif
00053             delete file;
00054             return NULL;
00055         }
00056         
00057         // reference l'objet avec le manager
00058         return manager().insert(file, handle, name);
00059     }
00060 
00061     //! renvoie -1 en cas d'erreur, 1 lorsque le fichier a ete recharge, et 0 sinon (le fichier n'a pas change).
00062     static
00063     int reload( TextFile *object )
00064     {
00065         if(object == NULL)
00066             return -1;
00067         
00068         IOName *ioname= manager().find(object);
00069         if(ioname == NULL || ioname->handle().isValid() == false)
00070         {
00071             // le fichier n'est pas reference ... pas lu en passant par le manager.
00072             printf("reloading textfile %p... failed.\n", object);
00073             return 0;
00074         }
00075         
00076         // verifie la date et la taille du fichier
00077         if(ioname->handle().modified() <= 0)
00078             // le fichier n'est pas modifie
00079             return 0;
00080         
00081         // recharger le fichier
00082         object->clear();
00083         if(object->read(ioname->filename()) < 0)
00084         {
00085         #ifdef VERBOSE      //_DEBUG
00086             printf("reloading '%s'... failed.\n", ioname->filename().c_str());
00087         #endif
00088             return -1;
00089         }
00090         
00091         // mettre a jour les infos sur le fichier
00092         ioname->handle().update();
00093     #ifdef VERBOSE      //_DEBUG
00094         printf("reloading '%s'... done.\n", ioname->filename().c_str());
00095     #endif
00096         return 1;
00097     }
00098     
00099     static
00100     TextFile *reload( const std::string& filename, const std::string& name= "" ) 
00101     {
00102         if(filename.empty() == true)
00103             return NULL;
00104         TextFile *object= manager().find(filename, name);
00105         int code= reload(object);
00106         if(code < 0)
00107             return NULL;
00108         return object;
00109     }
00110     
00111     static
00112     TextFileIO& manager( )  //!< singleton
00113     {
00114         static TextFileIO manager;
00115         return manager;
00116     }
00117 };
00118 
00119 } // namespace
00120 
00121 #endif
 All Classes Namespaces Functions Variables Typedefs Enumerator Friends