gKitGL
|
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