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