af42ad668c7c8f684e9c6b9aa3e728cf84d2ea2f
[platform/core/uifw/dali-adaptor.git] / dali / internal / system / windows / trigger-event.cpp
1 /*\r
2  * Copyright (c) 2018 Samsung Electronics Co., Ltd.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  * http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  *\r
16  */\r
17 \r
18 // CLASS HEADER\r
19 #include <dali/internal/system/windows/trigger-event.h>\r
20 \r
21 // EXTERNAL INCLUDES\r
22 #include <unistd.h>\r
23 \r
24 #include <dali/integration-api/debug.h>\r
25 \r
26 // INTERNAL INCLUDES\r
27 #include <dali/internal/system/common/file-descriptor-monitor.h>\r
28 #include <dali/internal/window-system/windows/platform-implement-win.h>\r
29 \r
30 namespace Dali\r
31 {\r
32 \r
33 namespace Internal\r
34 {\r
35 \r
36 namespace Adaptor\r
37 {\r
38 \r
39 TriggerEvent::TriggerEvent( CallbackBase* callback, TriggerEventInterface::Options options )\r
40 : mCallback( callback ),\r
41   mThreadID( -1 ),\r
42   mOptions( options )\r
43 {\r
44   // Create accompanying file descriptor.\r
45   mThreadID = WindowsPlatformImplementation::GetCurrentThreadId();\r
46 \r
47   if ( mThreadID < 0)\r
48   {\r
49     DALI_LOG_ERROR("Unable to create TriggerEvent File descriptor\n");\r
50   }\r
51 \r
52   mSelfCallback = MakeCallback( this, &TriggerEvent::Triggered );\r
53 }\r
54 \r
55 TriggerEvent::~TriggerEvent()\r
56 {\r
57   delete mCallback;\r
58   delete mSelfCallback;\r
59 \r
60   if ( mThreadID >= 0)\r
61   {\r
62     mThreadID = 0;\r
63   }\r
64 }\r
65 \r
66 void TriggerEvent::Trigger()\r
67 {\r
68   if ( mThreadID >= 0)\r
69   {\r
70     // Increment event counter by 1.\r
71     // Writing to the file descriptor triggers the Dispatch() method in the other thread\r
72     // (if in multi-threaded environment).\r
73     WindowsPlatformImplementation::PostWinThreadMessage( WIN_CALLBACK_EVENT, reinterpret_cast<uint64_t>( mSelfCallback ), 0, mThreadID );\r
74   }\r
75   else\r
76   {\r
77     DALI_LOG_WARNING("Attempting to write to an invalid file descriptor\n");\r
78   }\r
79 }\r
80 \r
81 void TriggerEvent::Triggered()\r
82 {\r
83   // Call the connected callback\r
84   CallbackBase::Execute( *mCallback );\r
85 \r
86   //check if we should delete ourselves after the trigger\r
87   if( mOptions == TriggerEventInterface::DELETE_AFTER_TRIGGER )\r
88   {\r
89     delete this;\r
90   }\r
91 }\r
92 \r
93 } // namespace Adaptor\r
94 \r
95 } // namespace Internal\r
96 \r
97 } // namespace Dali\r