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