5f0f1049a0215afdbcf1f835e1c9d2080f604a1e
[framework/web/wrt-commons.git] / examples / event_delivery_test / event_delivery_test.cpp
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *    Licensed under the Apache License, Version 2.0 (the "License");
5  *    you may not use this file except in compliance with the License.
6  *    You may obtain a copy of the License at
7  *
8  *        http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *    Unless required by applicable law or agreed to in writing, software
11  *    distributed under the License is distributed on an "AS IS" BASIS,
12  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  *    See the License for the specific language governing permissions and
14  *    limitations under the License.
15  */
16 /*
17  * @file        event_delivery_server.h
18  * @author      Jaroslaw Osmanski j.osmanski@samsung.com
19  * @version     1.0
20  * @brief       This file is the implementation file of simple event delivery test
21  */
22 #include <dpl/application.h>
23 #include <dpl/controller.h>
24 #include <dpl/event_delivery.h>
25 #include <dpl/event_delivery_injector.h>
26 #include <dpl/generic_event.h>
27 #include <dpl/type_list.h>
28 #include <iostream>
29
30 namespace TestEvents
31 {
32 EVENT_DELIVERY_DECLARE_EVENT_MESSAGE_0(EmptyMessage)
33 EVENT_DELIVERY_DECLARE_EVENT_MESSAGE_2(HelloWorldMessage, std::string, std::string)
34 EVENT_DELIVERY_DECLARE_EVENT_MESSAGE_2(NumberMessage, int, float)
35 EVENT_DELIVERY_DECLARE_EVENT_MESSAGE_4(TestMessage, int, int, int, int)
36
37 EVENT_DELIVERY_IMPLEMENT_EVENT_MESSAGE(EmptyMessage)
38 EVENT_DELIVERY_IMPLEMENT_EVENT_MESSAGE(HelloWorldMessage)
39 EVENT_DELIVERY_IMPLEMENT_EVENT_MESSAGE(NumberMessage)
40 EVENT_DELIVERY_IMPLEMENT_EVENT_MESSAGE(TestMessage)
41 } // namespace TestEvents
42
43 DECLARE_GENERIC_EVENT_0(StartEvent)
44 DECLARE_GENERIC_EVENT_0(CloseEvent)
45 DECLARE_GENERIC_EVENT_0(DeleteEvent)
46
47 class MyListener :
48     public DPL::Application,
49     private DPL::Controller<DPL::TypeListDecl<DeleteEvent, CloseEvent>::Type>,
50     public DPL::EventListener<TestEvents::HelloWorldMessage>,
51     public DPL::EventListener<TestEvents::NumberMessage>
52 {
53 private:
54     class OneTimeListener :
55         public DPL::EventListener<TestEvents::EmptyMessage>
56     {
57     public:
58         OneTimeListener()
59         {
60             DPL::EventDeliverySystem::AddListener<TestEvents::EmptyMessage > (this);
61         }
62
63         ~OneTimeListener()
64         {
65             LogError("Deleting OneTimeListener");
66             DPL::EventDeliverySystem::RemoveListener<TestEvents::EmptyMessage > (this);
67         }
68
69     private:
70         void OnEventReceived(const TestEvents::EmptyMessage &message)
71         {
72             (void) message;
73             std::cout << "OneTimeListener empty message";
74
75         }
76     };
77
78     OneTimeListener * oneTimeListener;
79
80     virtual void OnEventReceived(const CloseEvent &event)
81     {
82         (void) event;
83         Quit();
84     }
85
86     virtual void OnEventReceived(const DeleteEvent &event)
87     {
88         (void) event;
89         delete oneTimeListener;
90         oneTimeListener = NULL;
91     }
92
93 protected:
94
95     void OnEventReceived(const TestEvents::HelloWorldMessage &message)
96     {
97         std::cout << "Got HelloWorldMessage: " << message.GetArg0() << " : " << message.GetArg1() << std::endl;
98
99         if (oneTimeListener != NULL)
100         {
101             DPL::ControllerEventHandler<DeleteEvent>::PostTimedEvent(DeleteEvent(), 1);
102         }
103     }
104
105     void OnEventReceived(const TestEvents::NumberMessage &message)
106     {
107         std::cout << "Got NumberMessage: " << message.GetArg0() << ", " << message.GetArg1() << std::endl;
108     }
109
110 public:
111
112     MyListener(int argc, char **argv)
113         : Application(argc, argv, "Listener")
114     {
115         Touch();
116
117         DPL::EventDeliverySystem::AddListener<TestEvents::HelloWorldMessage>(this);
118         DPL::EventDeliverySystem::AddListener<TestEvents::NumberMessage>(this);
119
120         DPL::ControllerEventHandler<CloseEvent>::PostTimedEvent(CloseEvent(), 8);
121         oneTimeListener = new OneTimeListener();
122     }
123
124     virtual ~MyListener()
125     {
126         DPL::EventDeliverySystem::RemoveListener<TestEvents::HelloWorldMessage > (this);
127         DPL::EventDeliverySystem::RemoveListener<TestEvents::NumberMessage > (this);
128         delete oneTimeListener;
129     }
130 };
131
132 class MyPusher :
133     public DPL::Application,
134     private DPL::Controller<DPL::TypeListDecl<StartEvent, CloseEvent>::Type>
135 {
136 private:
137     virtual void OnEventReceived(const CloseEvent &event)
138     {
139         (void) event;
140         Quit();
141     }
142
143     virtual void OnEventReceived(const StartEvent &event)
144     {
145         (void) event;
146         std::cout << "Publishing HelloWorldMessage..." << std::endl;
147         TestEvents::HelloWorldMessage hello("Hello cruel world !", "AAA BBB CCC");
148         DPL::EventDeliverySystem::Publish(hello);
149         std::cout << "HelloWorldMessage published." << std::endl;
150
151         std::cout << "Publishing NumberMessage message..." << std::endl;
152         TestEvents::NumberMessage number(13, 3.14f);
153         DPL::EventDeliverySystem::Publish(number);
154         std::cout << "NumberMessage published." << std::endl;
155
156         std::cout << "Publishing EmptyMessage..." << std::endl;
157         TestEvents::EmptyMessage empty;
158         DPL::EventDeliverySystem::Publish(empty);
159         std::cout << "EmptyMessage published." << std::endl;
160
161     }
162 public:
163     MyPusher(int argc, char **argv)
164         : Application(argc, argv, "Pusher")
165     {
166         Touch();
167
168         DPL::ControllerEventHandler<StartEvent>::PostTimedEvent(StartEvent(), 2);
169         DPL::ControllerEventHandler<StartEvent>::PostTimedEvent(StartEvent(), 6);
170         DPL::ControllerEventHandler<CloseEvent>::PostTimedEvent(CloseEvent(), 8);
171     }
172
173     virtual ~MyPusher()
174     {
175     }
176 };
177
178 int main(int argc, char* argv[])
179 {
180     switch (fork())
181     {
182         case 0:
183         {
184             MyPusher myPusher(argc, argv);
185             myPusher.Exec();
186         }
187         break;
188
189         case -1:
190             printf("fork() failed!");
191             break;
192
193         default:
194         {
195             MyListener myListener(argc, argv);
196             myListener.Exec();
197         }
198         break;
199     }
200
201     return 0;
202 }