tizen 2.3 release
[framework/web/wearable/wrt-security.git] / commons / modules / core / include / dpl / generic_event.h
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        generic_event.h
18  * @author      Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
19  * @version     1.0
20  * @brief       This file is the implementation file of MVC generic event
21  */
22 #ifndef DPL_GENERIC_EVENT_H
23 #define DPL_GENERIC_EVENT_H
24
25 namespace DPL {
26 class EventSender
27 {
28   public:
29     explicit EventSender(void *sender) :
30         m_sender(sender)
31     {}
32
33     void* GetSender() const
34     {
35         return m_sender;
36     }
37
38   private:
39     void *m_sender;
40 };
41
42 class GenericEvent
43 {
44   protected:
45     void *m_sender;
46
47   public:
48     explicit GenericEvent(const EventSender &sender) :
49         m_sender(sender.GetSender())
50     {}
51
52     virtual ~GenericEvent()
53     {}
54
55     void *GetSender() const
56     {
57         return m_sender;
58     }
59 };
60
61 class GenericEvent0 :
62     public GenericEvent
63 {
64   public:
65     explicit GenericEvent0(const EventSender &sender) :
66         GenericEvent(sender)
67     {}
68
69     virtual ~GenericEvent0()
70     {}
71 };
72
73 template<typename Arg0Type>
74 class GenericEvent1 :
75     public GenericEvent0
76 {
77   public:
78     typedef Arg0Type Arg0;
79
80   protected:
81     Arg0 m_arg0;
82
83   public:
84     explicit GenericEvent1(const EventSender &sender) :
85         GenericEvent0(sender)
86     {}
87
88     GenericEvent1(Arg0 arg0, const EventSender &sender) :
89         GenericEvent0(sender),
90         m_arg0(arg0)
91     {}
92
93     virtual ~GenericEvent1()
94     {}
95
96     Arg0 GetArg0() const
97     {
98         return m_arg0;
99     }
100 };
101
102 template<typename Arg0Type, typename Arg1Type>
103 class GenericEvent2 :
104     public GenericEvent1<Arg0Type>
105 {
106   public:
107     typedef Arg0Type Arg0;
108     typedef Arg1Type Arg1;
109
110   protected:
111     Arg1 m_arg1;
112
113   public:
114     explicit GenericEvent2(const EventSender &sender) :
115         GenericEvent1<Arg0Type>(sender)
116     {}
117
118     GenericEvent2(Arg0 arg0, Arg1 arg1, const EventSender &sender) :
119         GenericEvent1<Arg0Type>(arg0, sender),
120         m_arg1(arg1)
121     {}
122
123     virtual ~GenericEvent2()
124     {}
125
126     Arg1 GetArg1() const
127     {
128         return m_arg1;
129     }
130 };
131
132 template<typename Arg0Type, typename Arg1Type, typename Arg2Type>
133 class GenericEvent3 :
134     public GenericEvent2<Arg0Type, Arg1Type>
135 {
136   public:
137     typedef Arg0Type Arg0;
138     typedef Arg1Type Arg1;
139     typedef Arg2Type Arg2;
140
141   protected:
142     Arg2 m_arg2;
143
144   public:
145     explicit GenericEvent3(const EventSender &sender) :
146         GenericEvent2<Arg0Type, Arg1Type>(sender)
147     {}
148
149     GenericEvent3(Arg0 arg0, Arg1 arg1, Arg2 arg2, const EventSender &sender) :
150         GenericEvent2<Arg0Type, Arg1Type>(arg0, arg1, sender),
151         m_arg2(arg2)
152     {}
153
154     virtual ~GenericEvent3()
155     {}
156
157     Arg2 GetArg2() const
158     {
159         return m_arg2;
160     }
161 };
162
163 template<typename Arg0Type, typename Arg1Type, typename Arg2Type,
164          typename Arg3Type>
165 class GenericEvent4 :
166     public GenericEvent3<Arg0Type, Arg1Type, Arg2Type>
167 {
168   public:
169     typedef Arg0Type Arg0;
170     typedef Arg1Type Arg1;
171     typedef Arg2Type Arg2;
172     typedef Arg3Type Arg3;
173
174   protected:
175     Arg3 m_arg3;
176
177   public:
178     explicit GenericEvent4(const EventSender &sender) :
179         GenericEvent3<Arg0Type, Arg1Type, Arg2Type>(sender)
180     {}
181
182     GenericEvent4(Arg0 arg0,
183                   Arg1 arg1,
184                   Arg2 arg2,
185                   Arg3 arg3,
186                   const EventSender &sender) :
187         GenericEvent3<Arg0Type, Arg1Type, Arg2Type>(arg0, arg1, arg2, sender),
188         m_arg3(arg3)
189     {}
190
191     virtual ~GenericEvent4()
192     {}
193
194     Arg3 GetArg3() const
195     {
196         return m_arg3;
197     }
198 };
199
200 template<typename Arg0Type, typename Arg1Type, typename Arg2Type,
201          typename Arg3Type, typename Arg4Type>
202 class GenericEvent5 :
203     public GenericEvent4<Arg0Type, Arg1Type, Arg2Type, Arg3Type>
204 {
205   public:
206     typedef Arg0Type Arg0;
207     typedef Arg1Type Arg1;
208     typedef Arg2Type Arg2;
209     typedef Arg3Type Arg3;
210     typedef Arg4Type Arg4;
211
212   protected:
213     Arg4 m_arg4;
214
215   public:
216     explicit GenericEvent5(const EventSender &sender) :
217         GenericEvent4<Arg0Type, Arg1Type, Arg2Type, Arg3Type>(sender)
218     {}
219
220     GenericEvent5(Arg0 arg0,
221                   Arg1 arg1,
222                   Arg2 arg2,
223                   Arg3 arg3,
224                   Arg4 arg4,
225                   const EventSender &sender) :
226         GenericEvent4<Arg0Type, Arg1Type, Arg2Type, Arg3Type>(arg0, arg1, arg2,
227                                                               arg3, sender),
228         m_arg4(arg4)
229     {}
230
231     virtual ~GenericEvent5()
232     {}
233
234     Arg4 GetArg4() const
235     {
236         return m_arg4;
237     }
238 };
239
240 template<typename Arg0Type, typename Arg1Type, typename Arg2Type,
241          typename Arg3Type, typename Arg4Type, typename Arg5Type>
242 class GenericEvent6 :
243     public GenericEvent5<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type>
244 {
245   public:
246     typedef Arg0Type Arg0;
247     typedef Arg1Type Arg1;
248     typedef Arg2Type Arg2;
249     typedef Arg3Type Arg3;
250     typedef Arg4Type Arg4;
251     typedef Arg5Type Arg5;
252
253   protected:
254     Arg5 m_arg5;
255
256   public:
257     explicit GenericEvent6(const EventSender &sender) :
258         GenericEvent5<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type>(sender)
259     {}
260
261     GenericEvent6(Arg0 arg0,
262                   Arg1 arg1,
263                   Arg2 arg2,
264                   Arg3 arg3,
265                   Arg4 arg4,
266                   Arg5 arg5,
267                   const EventSender &sender) :
268         GenericEvent5<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type>(arg0,
269                                                                         arg1,
270                                                                         arg2,
271                                                                         arg3,
272                                                                         arg4,
273                                                                         sender),
274         m_arg5(arg5)
275     {}
276
277     virtual ~GenericEvent6()
278     {}
279
280     Arg5 GetArg5() const
281     {
282         return m_arg5;
283     }
284 };
285
286 template<typename Arg0Type, typename Arg1Type, typename Arg2Type,
287          typename Arg3Type, typename Arg4Type, typename Arg5Type,
288          typename Arg6Type>
289 class GenericEvent7 :
290     public GenericEvent6<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type,
291                          Arg5Type>
292 {
293   public:
294     typedef Arg0Type Arg0;
295     typedef Arg1Type Arg1;
296     typedef Arg2Type Arg2;
297     typedef Arg3Type Arg3;
298     typedef Arg4Type Arg4;
299     typedef Arg5Type Arg5;
300     typedef Arg6Type Arg6;
301
302   protected:
303     Arg6 m_arg6;
304
305   public:
306     explicit GenericEvent7(const EventSender &sender) :
307         GenericEvent6<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type,
308                       Arg5Type>(sender)
309     {}
310
311     GenericEvent7(Arg0 arg0,
312                   Arg1 arg1,
313                   Arg2 arg2,
314                   Arg3 arg3,
315                   Arg4 arg4,
316                   Arg5 arg5,
317                   Arg6 arg6,
318                   const EventSender &sender) :
319         GenericEvent6<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type,
320                       Arg5Type>(arg0, arg1, arg2, arg3, arg4, arg5, sender),
321         m_arg6(arg6)
322     {}
323
324     virtual ~GenericEvent7()
325     {}
326
327     Arg6 GetArg6() const
328     {
329         return m_arg6;
330     }
331 };
332
333 template<typename Arg0Type, typename Arg1Type, typename Arg2Type,
334          typename Arg3Type, typename Arg4Type, typename Arg5Type,
335          typename Arg6Type,
336          typename Arg7Type>
337 class GenericEvent8 :
338     public GenericEvent7<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type,
339                          Arg5Type, Arg6Type>
340 {
341   public:
342     typedef Arg0Type Arg0;
343     typedef Arg1Type Arg1;
344     typedef Arg2Type Arg2;
345     typedef Arg3Type Arg3;
346     typedef Arg4Type Arg4;
347     typedef Arg5Type Arg5;
348     typedef Arg6Type Arg6;
349     typedef Arg7Type Arg7;
350
351   protected:
352     Arg7 m_arg7;
353
354   public:
355     explicit GenericEvent8(const EventSender &sender) :
356         GenericEvent7<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type,
357                       Arg5Type, Arg6Type>(sender)
358     {}
359
360     GenericEvent8(Arg0 arg0,
361                   Arg1 arg1,
362                   Arg2 arg2,
363                   Arg3 arg3,
364                   Arg4 arg4,
365                   Arg5 arg5,
366                   Arg6 arg6,
367                   Arg7 arg7,
368                   const EventSender &sender) :
369         GenericEvent7<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type,
370                       Arg5Type, Arg6Type>(arg0, arg1, arg2, arg3, arg4, arg5,
371                                           arg6, sender),
372         m_arg7(arg7)
373     {}
374
375     virtual ~GenericEvent8()
376     {}
377
378     Arg7 GetArg7() const
379     {
380         return m_arg7;
381     }
382 };
383 } // namespace DPL
384
385 #define DECLARE_GENERIC_EVENT_0(ClassName)                                  \
386     class ClassName :                                                                   \
387         public DPL::GenericEvent0                                         \
388     {                                                                       \
389       public:                                                                 \
390         explicit ClassName(const DPL::EventSender & sender = \
391                                DPL::EventSender(NULL)) :                                                                       \
392             DPL::GenericEvent0(sender)                                    \
393         {                                                                   \
394         }                                                                   \
395     };
396
397 #define DECLARE_GENERIC_EVENT_1(ClassName, Arg0Type)                          \
398     class ClassName :                                                                     \
399         public DPL::GenericEvent1<Arg0Type>                                 \
400     {                                                                         \
401       public:                                                                   \
402         explicit ClassName(const DPL::EventSender & sender = \
403                                DPL::EventSender(NULL)) :                                                                       \
404             DPL::GenericEvent1<Arg0Type>(sender)                            \
405         {                                                                     \
406         }                                                                     \
407                                                                               \
408         explicit ClassName(Arg0Type arg0,                                     \
409                            const DPL::EventSender & sender = \
410                                DPL::EventSender(NULL)) :                                                                 \
411             DPL::GenericEvent1<Arg0Type>(arg0, sender)                      \
412         {                                                                     \
413         }                                                                     \
414     };
415
416 #define DECLARE_GENERIC_EVENT_2(ClassName, Arg0Type, Arg1Type)                \
417     class ClassName :                                                                     \
418         public DPL::GenericEvent2<Arg0Type, Arg1Type>                       \
419     {                                                                         \
420       public:                                                                   \
421         explicit ClassName(const DPL::EventSender & sender = \
422                                DPL::EventSender(NULL)) :                                                                       \
423             DPL::GenericEvent2<Arg0Type, Arg1Type>(sender)                  \
424         {                                                                     \
425         }                                                                     \
426                                                                               \
427         ClassName(Arg0Type arg0, Arg1Type arg1,                               \
428                   const DPL::EventSender & sender = DPL::EventSender(NULL)) :                                                                 \
429             DPL::GenericEvent2<Arg0Type, Arg1Type>(arg0, arg1, sender)      \
430         {                                                                     \
431         }                                                                     \
432     };
433
434 #define DECLARE_GENERIC_EVENT_3(ClassName, Arg0Type, Arg1Type, Arg2Type)                      \
435     class ClassName :                                                                                     \
436         public DPL::GenericEvent3<Arg0Type, Arg1Type, Arg2Type>                             \
437     {                                                                                         \
438       public:                                                                                   \
439         explicit ClassName(const DPL::EventSender & sender = \
440                                DPL::EventSender(NULL)) :                                                                                 \
441             DPL::GenericEvent3<Arg0Type, Arg1Type, Arg2Type>(sender)                        \
442         {                                                                                     \
443         }                                                                                     \
444                                                                                               \
445         ClassName(Arg0Type arg0, Arg1Type arg1, Arg2Type arg2,                                \
446                   const DPL::EventSender & sender = DPL::EventSender(NULL)) :                                                                                 \
447             DPL::GenericEvent3<Arg0Type, Arg1Type, Arg2Type>(arg0, \
448                                                              arg1, \
449                                                              arg2, \
450                                                              sender)      \
451         {                                                                                     \
452         }                                                                                     \
453     };
454
455 #define DECLARE_GENERIC_EVENT_4(ClassName, \
456                                 Arg0Type, \
457                                 Arg1Type, \
458                                 Arg2Type, \
459                                 Arg3Type)                            \
460     class ClassName :                                                                                                     \
461         public DPL::GenericEvent4<Arg0Type, Arg1Type, Arg2Type, Arg3Type>                                   \
462     {                                                                                                         \
463       public:                                                                                                   \
464         explicit ClassName(const DPL::EventSender & sender = \
465                                DPL::EventSender(NULL)) :                                                                                                 \
466             DPL::GenericEvent4<Arg0Type, Arg1Type, Arg2Type, Arg3Type>(sender)                              \
467         {                                                                                                     \
468         }                                                                                                     \
469                                                                                                               \
470         ClassName(Arg0Type arg0, Arg1Type arg1, Arg2Type arg2, Arg3Type arg3,                                 \
471                   const DPL::EventSender & sender = DPL::EventSender(NULL)) :                                                                                                 \
472             DPL::GenericEvent4<Arg0Type, Arg1Type, Arg2Type, Arg3Type>(arg0, \
473                                                                        arg1, \
474                                                                        arg2, \
475                                                                        arg3, \
476                                                                        sender)      \
477         {                                                                                                     \
478         }                                                                                                     \
479     };
480
481 #define DECLARE_GENERIC_EVENT_5(ClassName, \
482                                 Arg0Type, \
483                                 Arg1Type, \
484                                 Arg2Type, \
485                                 Arg3Type, \
486                                 Arg4Type)                                  \
487     class ClassName :                                                                                                                     \
488         public DPL::GenericEvent5<Arg0Type, Arg1Type, Arg2Type, Arg3Type, \
489                                   Arg4Type>                                         \
490     {                                                                                                                         \
491       public:                                                                                                                   \
492         explicit ClassName(const DPL::EventSender & sender = \
493                                DPL::EventSender(NULL)) :                                                                                                                 \
494             DPL::GenericEvent5<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type>( \
495                 sender)                                    \
496         {                                                                                                                     \
497         }                                                                                                                     \
498                                                                                                                               \
499         ClassName(Arg0Type arg0, \
500                   Arg1Type arg1, \
501                   Arg2Type arg2, \
502                   Arg3Type arg3, \
503                   Arg4Type arg4,                                  \
504                   const DPL::EventSender & sender = DPL::EventSender(NULL)) :                                                                                                                 \
505             DPL::GenericEvent5<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type>( \
506                 arg0, \
507                 arg1, \
508                 arg2, \
509                 arg3, \
510                 arg4, \
511                 sender)      \
512         {                                                                                                                     \
513         }                                                                                                                     \
514     };
515
516 #define DECLARE_GENERIC_EVENT_6(ClassName, \
517                                 Arg0Type, \
518                                 Arg1Type, \
519                                 Arg2Type, \
520                                 Arg3Type, \
521                                 Arg4Type, \
522                                 Arg5Type)                                        \
523     class ClassName :                                                                                                                                     \
524         public DPL::GenericEvent6<Arg0Type, Arg1Type, Arg2Type, Arg3Type, \
525                                   Arg4Type, Arg5Type>                                               \
526     {                                                                                                                                         \
527       public:                                                                                                                                   \
528         explicit ClassName(const DPL::EventSender & sender = \
529                                DPL::EventSender(NULL)) :                                                                                                                                 \
530             DPL::GenericEvent6<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, \
531                                Arg5Type>(sender)                                          \
532         {                                                                                                                                     \
533         }                                                                                                                                     \
534                                                                                                                                               \
535         ClassName(Arg0Type arg0, \
536                   Arg1Type arg1, \
537                   Arg2Type arg2, \
538                   Arg3Type arg3, \
539                   Arg4Type arg4, \
540                   Arg5Type arg5,                                   \
541                   const DPL::EventSender & sender = DPL::EventSender(NULL)) :                                                                                                                                 \
542             DPL::GenericEvent6<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, \
543                                Arg5Type>(arg0, \
544                                          arg1, \
545                                          arg2, \
546                                          arg3, \
547                                          arg4, \
548                                          arg5, \
549                                          sender)      \
550         {                                                                                                                                     \
551         }                                                                                                                                     \
552     };
553
554 #define DECLARE_GENERIC_EVENT_7(ClassName, \
555                                 Arg0Type, \
556                                 Arg1Type, \
557                                 Arg2Type, \
558                                 Arg3Type, \
559                                 Arg4Type, \
560                                 Arg5Type, \
561                                 Arg6Type)                                              \
562     class ClassName :                                                                                                                                                     \
563         public DPL::GenericEvent7<Arg0Type, Arg1Type, Arg2Type, Arg3Type, \
564                                   Arg4Type, Arg5Type, Arg6Type>                                                     \
565     {                                                                                                                                                         \
566       public:                                                                                                                                                   \
567         explicit ClassName(const DPL::EventSender & sender = \
568                                DPL::EventSender(NULL)) :                                                                                                                                                 \
569             DPL::GenericEvent7<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, \
570                                Arg5Type, Arg6Type>(sender)                                                \
571         {                                                                                                                                                     \
572         }                                                                                                                                                     \
573                                                                                                                                                               \
574         ClassName(Arg0Type arg0, \
575                   Arg1Type arg1, \
576                   Arg2Type arg2, \
577                   Arg3Type arg3, \
578                   Arg4Type arg4, \
579                   Arg5Type arg5, \
580                   Arg6Type arg6,                                    \
581                   const DPL::EventSender & sender = DPL::EventSender(NULL)) :                                                                                                                                                 \
582             DPL::GenericEvent7<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, \
583                                Arg5Type, Arg6Type>(arg0, \
584                                                    arg1, \
585                                                    arg2, \
586                                                    arg3, \
587                                                    arg4, \
588                                                    arg5, \
589                                                    arg6, \
590                                                    sender)      \
591         {                                                                                                                                                     \
592         }                                                                                                                                                     \
593     };
594
595 #define DECLARE_GENERIC_EVENT_8(ClassName, \
596                                 Arg0Type, \
597                                 Arg1Type, \
598                                 Arg2Type, \
599                                 Arg3Type, \
600                                 Arg4Type, \
601                                 Arg5Type, \
602                                 Arg6Type, \
603                                 Arg7Type)                                                    \
604     class ClassName :                                                                                                                                                                     \
605         public DPL::GenericEvent8<Arg0Type, Arg1Type, Arg2Type, Arg3Type, \
606                                   Arg4Type, Arg5Type, Arg6Type, Arg7Type>                                                           \
607     {                                                                                                                                                                         \
608       public:                                                                                                                                                                   \
609         explicit ClassName(const DPL::EventSender & sender = \
610                                DPL::EventSender(NULL)) :                                                                                                                                                                 \
611             DPL::GenericEvent8<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, \
612                                Arg5Type, Arg6Type, Arg7Type>(sender)                                                      \
613         {                                                                                                                                                                     \
614         }                                                                                                                                                                     \
615                                                                                                                                                                               \
616         ClassName(Arg0Type arg0, \
617                   Arg1Type arg1, \
618                   Arg2Type arg2, \
619                   Arg3Type arg3, \
620                   Arg4Type arg4, \
621                   Arg5Type arg5, \
622                   Arg6Type arg6, \
623                   Arg7Type arg7,                                     \
624                   const DPL::EventSender & sender = DPL::EventSender(NULL)) :                                                                                                                                                                 \
625             DPL::GenericEvent8<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, \
626                                Arg5Type, Arg6Type, Arg7Type>(arg0, \
627                                                              arg1, \
628                                                              arg2, \
629                                                              arg3, \
630                                                              arg4, \
631                                                              arg5, \
632                                                              arg6, \
633                                                              arg7, \
634                                                              sender)      \
635         {                                                                                                                                                                     \
636         }                                                                                                                                                                     \
637     };
638
639 #endif // DPL_GENERIC_EVENT_H