source: XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/client_from_server_source_filter.cpp @ 1930

Last change on this file since 1930 was 1930, checked in by ymipsl, 4 years ago

Big update on on going work related to data distribution and transfer between clients and servers.
Revisite of the source and store filter using "connectors".

YM

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 1.8 KB
Line 
1#include "client_from_server_source_filter.hpp"
2#include "grid.hpp"
3#include "field.hpp"
4#include "file.hpp"
5#include "exception.hpp"
6#include "calendar_util.hpp"
7#include "context.hpp"
8#include <limits>
9
10namespace xios
11{
12  CClientFromServerSourceFilter::CClientFromServerSourceFilter(CGarbageCollector& gc, CField* field)
13    : COutputPin(gc, true)
14  {
15    CContext* context = CContext::getCurrent();
16    grid_= field->getGrid();
17    freqOp_ = field->fileIn_->output_freq ;
18    lastDateReceived_ = context->getCalendar()->getInitDate();
19    offset_ = field->freq_offset ;
20  }
21
22  void CClientFromServerSourceFilter::streamData(CEventServer& event)
23  {
24    const bool wasEOF = isEOF_;
25    int record ;
26    for (auto& subEvent : event.subEvents) (*subEvent.buffer) >> record  ;
27    isEOF_ = (record == int(-1));
28
29   
30    if (wasDataAlreadyReceived_) lastDateReceived_ = lastDateReceived_ + freqOp_ ;
31    else wasDataAlreadyReceived_ = true;
32   
33    CDataPacketPtr packet(new CDataPacket);
34    packet->date = lastDateReceived_ + offset_;
35    packet->timestamp = packet->date ;
36
37    if (isEOF_) 
38    {
39      if (!wasEOF) dateEOF_ = lastDateReceived_;
40      packet->status = CDataPacket::END_OF_STREAM;
41    }
42    else 
43    {
44      grid_->getServerFromClientConnector()->transfer(event, packet->data) ;
45      packet->status = CDataPacket::NO_ERROR;
46    }
47    onOutputReady(packet);
48
49  }
50 
51  bool CClientFromServerSourceFilter::isDataLate(void)
52  {
53    bool isDataLate ;
54    CDate currentDate = CContext::getCurrent()->getCalendar()->getCurrentDate() ;
55
56    const CDate nextDataDue = wasDataAlreadyReceived_ ? (lastDateReceived_ + freqOp_) : CContext::getCurrent()->getCalendar()->getInitDate();
57    isDataLate = (nextDataDue <= currentDate);
58   
59    return isDataLate ; 
60   
61  }
62} // namespace xios
Note: See TracBrowser for help on using the repository browser.