Initial copy from dali-adaptor repository
[platform/core/uifw/dali-adaptor-legacy.git] / dali / internal / adaptor / windows / framework-win.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/adaptor/common/framework.h>\r
20 \r
21 // EXTERNAL INCLUDES\r
22 #include <dali/integration-api/debug.h>\r
23 #include <windows.h>\r
24 \r
25 // INTERNAL INCLUDES\r
26 #include <dali/internal/window-system/windows/platform-implement-win.h>\r
27 #include <dali/internal/system/common/callback-manager.h>\r
28 \r
29 namespace Dali\r
30 {\r
31 \r
32 namespace Internal\r
33 {\r
34 \r
35 namespace Adaptor\r
36 {\r
37 \r
38 namespace\r
39 {\r
40 \r
41 /// Application Status Enum\r
42 enum\r
43 {\r
44   APP_CREATE,\r
45   APP_TERMINATE,\r
46   APP_PAUSE,\r
47   APP_RESUME,\r
48   APP_RESET,\r
49   APP_LANGUAGE_CHANGE,\r
50 };\r
51 \r
52 } // Unnamed namespace\r
53 /**\r
54  * Impl to hide WindowsSystem data members\r
55  */\r
56 struct Framework::Impl\r
57 {\r
58   // Constructor\r
59 \r
60   Impl(void* data)\r
61   : mAbortCallBack( NULL ),\r
62     mCallbackManager( CallbackManager::New() ),\r
63     mLanguage( "NOT_SUPPORTED" ),\r
64     mRegion( "NOT_SUPPORTED" )\r
65   {\r
66   }\r
67 \r
68   ~Impl()\r
69   {\r
70     delete mAbortCallBack;\r
71 \r
72     // we're quiting the main loop so\r
73     // mCallbackManager->RemoveAllCallBacks() does not need to be called\r
74     // to delete our abort handler\r
75     delete mCallbackManager;\r
76   }\r
77 \r
78   std::string GetLanguage() const\r
79   {\r
80     return mLanguage;\r
81   }\r
82 \r
83   std::string GetRegion() const\r
84   {\r
85     return mRegion;\r
86   }\r
87 \r
88   // Static methods\r
89 \r
90   /**\r
91    * Called by AppCore on application creation.\r
92    */\r
93   static bool AppCreate(void *data)\r
94   {\r
95     return static_cast<Framework*>(data)->AppStatusHandler(APP_CREATE, NULL);\r
96   }\r
97 \r
98   /**\r
99    * Called by AppCore when the application should terminate.\r
100    */\r
101   static void AppTerminate(void *data)\r
102   {\r
103     static_cast<Framework*>(data)->AppStatusHandler(APP_TERMINATE, NULL);\r
104   }\r
105 \r
106   /**\r
107    * Called by AppCore when the application is paused.\r
108    */\r
109   static void AppPause(void *data)\r
110   {\r
111     static_cast<Framework*>(data)->AppStatusHandler(APP_PAUSE, NULL);\r
112   }\r
113 \r
114   /**\r
115    * Called by AppCore when the application is resumed.\r
116    */\r
117   static void AppResume(void *data)\r
118   {\r
119     static_cast<Framework*>(data)->AppStatusHandler(APP_RESUME, NULL);\r
120   }\r
121 \r
122   /**\r
123    * Called by AppCore when the language changes on the device.\r
124    */\r
125   static void AppLanguageChange(void* data)\r
126   {\r
127     static_cast<Framework*>(data)->AppStatusHandler(APP_LANGUAGE_CHANGE, NULL);\r
128   }\r
129 \r
130   void Run()\r
131   {\r
132     MSG nMsg = { 0 };\r
133 \r
134     while (GetMessage(&nMsg, 0, NULL, NULL))\r
135     {\r
136       if (WIN_CALLBACK_EVENT == nMsg.message)\r
137       {\r
138         Dali::CallbackBase *callback = (Dali::CallbackBase*)nMsg.wParam;\r
139         Dali::CallbackBase::Execute(*callback);\r
140       }\r
141 \r
142       TranslateMessage(&nMsg);\r
143       DispatchMessage(&nMsg);\r
144 \r
145       mCallbackManager->ClearIdleCallbacks();\r
146 \r
147       if (WM_CLOSE == nMsg.message)\r
148       {\r
149         break;\r
150       }\r
151     }\r
152   }\r
153 \r
154   void Quit()\r
155   {\r
156   }\r
157 \r
158   void SetCallbackBase( CallbackBase *base )\r
159   {\r
160     mAbortCallBack = base;\r
161   }\r
162 \r
163   bool ExcuteCallback()\r
164   {\r
165     if( NULL != mAbortCallBack )\r
166     {\r
167       CallbackBase::Execute( *mAbortCallBack );\r
168       return true;\r
169     }\r
170     else\r
171     {\r
172       return false;\r
173     }\r
174   }\r
175 \r
176 private:\r
177   // Undefined\r
178   Impl( const Impl& impl ) = delete;\r
179 \r
180   // Undefined\r
181   Impl& operator=( const Impl& impl ) = delete;\r
182 \r
183 private:\r
184   // Data\r
185   CallbackBase* mAbortCallBack;\r
186   CallbackManager *mCallbackManager;\r
187   std::string mLanguage;\r
188   std::string mRegion;\r
189 };\r
190 \r
191 Framework::Framework( Framework::Observer& observer, int *argc, char ***argv, Type type )\r
192 : mObserver(observer),\r
193   mInitialised(false),\r
194   mPaused(false),\r
195   mRunning(false),\r
196   mArgc(argc),\r
197   mArgv(argv),\r
198   mBundleName(""),\r
199   mBundleId(""),\r
200   mAbortHandler( MakeCallback( this, &Framework::AbortCallback ) ),\r
201   mImpl(NULL)\r
202 {\r
203     InitThreads();\r
204     mImpl = new Impl(this);\r
205 }\r
206 \r
207 Framework::~Framework()\r
208 {\r
209   if (mRunning)\r
210   {\r
211     Quit();\r
212   }\r
213 \r
214   delete mImpl;\r
215 }\r
216 \r
217 void Framework::Run()\r
218 {\r
219     mRunning = true;\r
220 \r
221     Impl::AppCreate(this);\r
222     mImpl->Run();\r
223     mRunning = false;\r
224 }\r
225 \r
226 void Framework::Quit()\r
227 {\r
228   Impl::AppTerminate(this);\r
229 }\r
230 \r
231 bool Framework::IsMainLoopRunning()\r
232 {\r
233   return mRunning;\r
234 }\r
235 \r
236 void Framework::AddAbortCallback( CallbackBase* callback )\r
237 {\r
238   mImpl->SetCallbackBase( callback );\r
239 }\r
240 \r
241 std::string Framework::GetBundleName() const\r
242 {\r
243   return mBundleName;\r
244 }\r
245 \r
246 void Framework::SetBundleName(const std::string& name)\r
247 {\r
248   mBundleName = name;\r
249 }\r
250 \r
251 std::string Framework::GetBundleId() const\r
252 {\r
253   return mBundleId;\r
254 }\r
255 \r
256 std::string Framework::GetResourcePath()\r
257 {\r
258   // "DALI_APPLICATION_PACKAGE" is used by Windows specifically to get the already configured Application package path.\r
259   const char* winEnvironmentVariable = "DALI_APPLICATION_PACKAGE";\r
260   char* value = getenv( winEnvironmentVariable );\r
261 \r
262   std::string resourcePath;\r
263   if ( value != NULL )\r
264   {\r
265     resourcePath = value;\r
266   }\r
267 \r
268   if( resourcePath.back() != '/' )\r
269   {\r
270     resourcePath+="/";\r
271   }\r
272 \r
273   return resourcePath;\r
274 }\r
275 \r
276 std::string Framework::GetDataPath()\r
277 {\r
278   std::string result = app_get_data_path();\r
279   return result;\r
280 }\r
281 \r
282 void Framework::SetBundleId(const std::string& id)\r
283 {\r
284   mBundleId = id;\r
285 }\r
286 \r
287 void Framework::AbortCallback( )\r
288 {\r
289   // if an abort call back has been installed run it.\r
290   if( false == mImpl->ExcuteCallback() )\r
291   {\r
292     Quit();\r
293   }\r
294 }\r
295 \r
296 bool Framework::AppStatusHandler(int type, void *bundleData)\r
297 {\r
298   switch (type)\r
299   {\r
300     case APP_CREATE:\r
301     {\r
302       mInitialised = true;\r
303 \r
304       mObserver.OnInit();\r
305       break;\r
306     }\r
307     case APP_RESET:\r
308     {\r
309       mObserver.OnReset();\r
310       break;\r
311     }\r
312     case APP_RESUME:\r
313     {\r
314       mObserver.OnResume();\r
315       break;\r
316     }\r
317     case APP_TERMINATE:\r
318     {\r
319       mObserver.OnTerminate();\r
320       break;\r
321     }\r
322     case APP_PAUSE:\r
323     {\r
324       mObserver.OnPause();\r
325       break;\r
326     }\r
327     case APP_LANGUAGE_CHANGE:\r
328     {\r
329       mObserver.OnLanguageChanged();\r
330       break;\r
331     }\r
332     default:\r
333     {\r
334       break;\r
335     }\r
336   }\r
337 \r
338   return true;\r
339 }\r
340 \r
341 void Framework::InitThreads()\r
342 {\r
343 }\r
344 \r
345 std::string Framework::GetLanguage() const\r
346 {\r
347   return mImpl->GetLanguage();\r
348 }\r
349 \r
350 std::string Framework::GetRegion() const\r
351 {\r
352   return mImpl->GetRegion();\r
353 }\r
354 \r
355 } // namespace Adaptor\r
356 \r
357 } // namespace Internal\r
358 \r
359 } // namespace Dali\r