#ifndef __XMLIO_CField__ #define __XMLIO_CField__ /// xmlioserver headers /// #include "xmlioserver_spl.hpp" #include "group_factory.hpp" #include "functor.hpp" #include "functor_type.hpp" #include "duration.hpp" #include "date.hpp" #include "declare_group.hpp" #include "calendar_util.hpp" //#include "context.hpp" namespace xmlioserver { namespace tree { /// ////////////////////// Déclarations ////////////////////// /// class CFieldGroup; class CFieldAttributes; class CField; class CFile; class CGrid; class CContext ; ///-------------------------------------------------------------- // Declare/Define CFieldAttribute BEGIN_DECLARE_ATTRIBUTE_MAP(CField) # include "field_attribute.conf" END_DECLARE_ATTRIBUTE_MAP(CField) ///-------------------------------------------------------------- class CField : public CObjectTemplate , public CFieldAttributes { /// friend /// friend class CFile; /// typedef /// typedef CObjectTemplate SuperClass; typedef CFieldAttributes SuperClassAttribute; public : typedef CFieldAttributes RelAttributes; typedef CFieldGroup RelGroup; enum EEventId { EVENT_ID_UPDATE_DATA } ; /// Constructeurs /// CField(void); explicit CField(const StdString & id); CField(const CField & field); // Not implemented yet. CField(const CField * const field); // Not implemented yet. /// Accesseurs /// boost::shared_ptr getDirectFieldReference(void) const; const boost::shared_ptr getBaseFieldReference(void) const; const std::vector > & getAllReference(void) const; boost::shared_ptr getRelGrid(void) const ; boost::shared_ptr getRelFile(void) const ; public : StdSize getNStep(void) const; const date::CDuration & getFreqOperation(void) const; const date::CDuration & getFreqWrite(void) const; boost::shared_ptr getLastWriteDate(void) const; boost::shared_ptr getLastOperationDate(void) const; boost::shared_ptr getFieldOperation(void) const; ARRAY(double, 1) getData(void) const; const StdString & getBaseFieldId(void) const; /// Mutateur /// void setRelFile(const boost::shared_ptr _file); void incrementNStep(void); void resetNStep() ; template bool updateData(const ARRAY(double, N) data); bool updateDataServer (const date::CDate & currDate, const std::deque storedClient); public : /// Test /// bool hasDirectFieldReference(void) const; bool isActive(void) const; /// Traitements /// void solveRefInheritance(void); void solveGridReference(void); void solveOperation(void); virtual void fromBinary(StdIStream & is); /// Destructeur /// virtual ~CField(void); /// Accesseurs statiques /// static StdString GetName(void); static StdString GetDefName(void); static ENodeType GetType(void); template void setData(const ARRAY(double, N) _data) ; static bool dispatchEvent(CEventServer& event) ; void sendUpdateData(void) ; static void recvUpdateData(CEventServer& event) ; void recvUpdateData(vector& ranks, vector& buffers) ; void writeField(void) ; void outputField(ARRAY(double,3) fieldOut) ; void outputField(ARRAY(double,2) fieldOut) ; public : /// Propriétés privées /// std::vector > refObject; boost::shared_ptr baseRefObject; boost::shared_ptr grid ; boost::shared_ptr file; date::CDuration freq_operation, freq_write; date::CDuration freq_operation_srv, freq_write_srv; StdSize nstep; boost::shared_ptr last_Write, last_operation; boost::shared_ptr last_Write_srv, last_operation_srv; boost::shared_ptr foperation; map > foperation_srv; ARRAY(double, 1) data; map data_srv ; }; // class CField ///-------------------------------------------------------------- // Declare/Define CFieldGroup and CFieldDefinition DECLARE_GROUP(CField); } // namespace tree ///----------------------------------------------------------------- template <> void CGroupTemplate::solveRefInheritance(void); ///----------------------------------------------------------------- } // namespace xmlioserver #include "grid.hpp" namespace xmlioserver { namespace tree { template void CField::setData(const ARRAY(double, N) _data) { const std::vector > & refField=getAllReference(); std::vector >::const_iterator it = refField.begin(), end = refField.end(); for (; it != end; it++) (*it)->updateData(_data) ; } template bool CField::updateData(const ARRAY(double, N) _data) { shared_ptr context=CObjectFactory::GetObject(CObjectFactory::GetCurrentContextId()) ; const date::CDate & currDate = context->getCalendar()->getCurrentDate(); const date::CDate opeDate = *last_operation + freq_operation; const date::CDate writeDate = *last_Write + freq_write; info(50) << "CField::updateData " << currDate << " : send data to " << this->getBaseFieldId() << std::endl; info(50) << "Next operation " << opeDate<data->num_elements() != this->grid->storeIndex_client->num_elements()) { this->data->resize(boost::extents[this->grid->storeIndex_client ->num_elements()]); } ARRAY_CREATE(input, double, 1, [this->data->num_elements()]); this->grid->inputField(_data, input); (*this->foperation)(input); *last_operation = currDate; info(50) << "(*last_operation = currDate) : " << *last_operation << " = " << currDate << std::endl; } if (writeDate < (currDate + freq_operation)) { this->foperation->final(); *last_Write = writeDate; info(50) << "(*last_Write = currDate) : " << *last_Write << " = " << currDate << std::endl; sendUpdateData() ; return (true); } return (false); } } // namespace tree } // namespace xmlioserver #endif // __XMLIO_CField__