Samchon Framework for CPP  1.0.0
SlaveSystem.hpp
1 #pragma once
2 #include <samchon/API.hpp>
3 
4 #include <samchon/protocol/IListener.hpp>
5 
6 #include <samchon/protocol/Communicator.hpp>
7 #include <samchon/templates/slave/PInvoke.hpp>
8 
9 namespace samchon
10 {
11 namespace templates
12 {
13 namespace slave
14 {
15  class SlaveSystem
16  : public virtual protocol::IListener
17  {
18  protected:
19  std::shared_ptr<protocol::Communicator> communicator_;
20 
21  public:
22  /* ---------------------------------------------------------
23  CONSTRUCTORS
24  --------------------------------------------------------- */
25  SlaveSystem()
26  {
27  };
28  virtual ~SlaveSystem() = default;
29 
30  /* ---------------------------------------------------------
31  INVOKE MESSAGE CHAIN
32  --------------------------------------------------------- */
33  void sendData(std::shared_ptr<protocol::Invoke> invoke) override
34  {
35  communicator_->sendData(invoke);
36  };
37 
38  protected:
39  virtual void _Reply_data(std::shared_ptr<protocol::Invoke> invoke) override
40  {
41  if (invoke->has("_History_uid"))
42  {
43  std::thread([this, invoke]()
44  {
45  // INIT HISTORY - WITH START TIME
46  std::shared_ptr<InvokeHistory> history(new InvokeHistory(invoke));
47  invoke->erase("_History_uid");
48  invoke->erase("_Process_name");
49  invoke->erase("_Process_weight");
50 
51  // MAIN PROCESS - REPLY_DATA
52  std::shared_ptr<PInvoke> pInvoke(new PInvoke(invoke, history, this));
53  replyData(pInvoke);
54 
55  // NOTIFY - WITH END TIME
56  if (pInvoke->isHold() == false)
57  pInvoke->complete();
58  }).detach();
59  }
60  else
61  replyData(invoke);
62  };
63  };
64 };
65 };
66 };
virtual void replyData(std::shared_ptr< Invoke >)=0
virtual void sendData(std::shared_ptr< Invoke >)=0