gKitGL
EffectIO.h
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
 All Classes Namespaces Functions Variables Typedefs Enumerator Friends