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