modify license, permission and remove ^M char
[platform/framework/native/uifw.git] / src / ui / FUi_UiBuilderControl.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0/
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an ”AS IS” BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18 /**
19 * @file         FUi_UiBuilderControl.cpp
20 * @brief                This is the implementation file for _UiBuilderControl class.
21 */
22
23 #include <dlfcn.h>
24 #include <stdlib.h>
25 #include <FUiIOrientationEventListener.h>
26 #include<FAppAppResource.h>
27 #include <FBaseSysLog.h>
28 #include <FBase_StringConverter.h>
29 #include "FUi_UiBuilder.h"
30 #include "FUi_UiBuilderControl.h"
31
32 using namespace Tizen::App;
33 using namespace Tizen::Base;
34 using namespace Tizen::Base::Collection;
35 using namespace Tizen::Ui;
36
37 namespace Tizen { namespace Ui
38 {
39 _UiBuilderControl::_UiBuilderControl(void)
40         : __itemCount(0)
41         , __pHandle(null)
42         , __type(L"")
43         , __id(L"")
44         , __parentId(L"")
45         , __pUiBuilderControlElementList(null)
46         , __pUiBuilderControlItemList(null)
47 {
48 }
49 _UiBuilderControl::~_UiBuilderControl(void)
50 {
51         if (__pUiBuilderControlElementList)
52         {
53                 _UiBuilderControlElement* pUiBuilderControlElement = null;
54                 int controlCount = __pUiBuilderControlElementList->GetCount();
55                 for (int i = 0; i < controlCount; i++)
56                 {
57                         __pUiBuilderControlElementList->GetAt(i, pUiBuilderControlElement);
58                         delete pUiBuilderControlElement;
59                 }
60                 __pUiBuilderControlElementList->RemoveAll();
61                 delete __pUiBuilderControlElementList;
62                 __pUiBuilderControlElementList = null;
63         }
64
65         if (__pUiBuilderControlItemList)
66         {
67                 _UiBuilderControlItem* pUiBuilderControlItem = null;
68                 int controlCount = __pUiBuilderControlItemList->GetCount();
69                 for (int i = 0; i < controlCount; i++)
70                 {
71                         __pUiBuilderControlItemList->GetAt(i, pUiBuilderControlItem);
72                         delete pUiBuilderControlItem;
73                 }
74                 __pUiBuilderControlItemList->RemoveAll();
75                 delete __pUiBuilderControlItemList;
76                 __pUiBuilderControlItemList = null;
77         }
78 }
79
80 void
81 _UiBuilderControl::Construct(const Tizen::Base::String& type)
82 {
83         if (__pUiBuilderControlElementList == null)
84         {
85                 __pUiBuilderControlElementList = new (std::nothrow) ArrayListT<_UiBuilderControlElement*>;
86         }
87         if (__pUiBuilderControlItemList == null)
88         {
89                 __pUiBuilderControlItemList = new (std::nothrow) ArrayListT<_UiBuilderControlItem*>;
90         }
91
92         if (type.Equals(L"Map", false))
93         {
94                 return;
95         }
96
97         if (type.Equals(L"Web", false))
98         {
99                 __pHandle = dlopen("libosp-web.so", RTLD_LAZY | RTLD_GLOBAL);
100                 if (__pHandle == null)
101                 {
102                         SysLog(NID_UI, "Failed to libosp-web.so");
103                 }
104         }
105         SetType(type);
106 }
107
108 void
109 _UiBuilderControl::SetId(const Tizen::Base::String& id)
110 {
111         __id = id;
112 }
113
114 void
115 _UiBuilderControl::SetType(const Tizen::Base::String& type)
116 {
117         __type = type;
118 }
119
120 void
121 _UiBuilderControl::SetParentWin(const Tizen::Base::String& parent)
122 {
123         __parentId = parent;
124 }
125
126 void
127 _UiBuilderControl::SetElement(int index, const Tizen::Base::String& elementName, const Tizen::Base::String& elementValue)
128 {
129         _UiBuilderControlElement* pUiBuilderControlElement = null;
130         pUiBuilderControlElement = new (std::nothrow) _UiBuilderControlElement;
131         if (pUiBuilderControlElement != null)
132         {
133                 pUiBuilderControlElement->SetName(elementName);
134                 pUiBuilderControlElement->SetValue(elementValue);
135                 __pUiBuilderControlElementList->Add(pUiBuilderControlElement);
136         }
137         else
138         {
139                 SysLogException(NID_UI, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to create _UiBuilderControlElement.");
140         }
141 }
142
143 void
144 _UiBuilderControl::SetItemName(const Tizen::Base::String& name)
145 {
146         _UiBuilderControlItem* pUiBuilderControlItem = null;
147         __pUiBuilderControlItemList->GetAt(__itemCount, pUiBuilderControlItem);
148         SysTryReturnVoidResult(NID_UI, pUiBuilderControlItem != null, GetLastResult(),  "Failed to get _UiBuilderControlItem");
149
150         pUiBuilderControlItem->SetItemName(name);
151         __itemCount++;
152 }
153
154 void
155 _UiBuilderControl::SetItemElement(int index, const Tizen::Base::String& name, const Tizen::Base::String& value)
156 {
157
158         _UiBuilderControlItem* pUiBuilderControlItem = null;
159         if (index == 0)
160         {
161                 pUiBuilderControlItem = new (std::nothrow) _UiBuilderControlItem;
162                 pUiBuilderControlItem->SetItemElement(index, name, value);
163                 __pUiBuilderControlItemList->Add(pUiBuilderControlItem);
164         }
165         else
166         {
167                 __pUiBuilderControlItemList->GetAt(__itemCount, pUiBuilderControlItem);
168                 SysTryReturnVoidResult(NID_UI, pUiBuilderControlItem != null, GetLastResult(),  "Failed to get _UiBuilderControlItem");
169                 pUiBuilderControlItem->SetItemElement(index, name, value);
170         }
171 }
172
173 bool
174 _UiBuilderControl::GetItemElement(int index, const Tizen::Base::String& elementName, Tizen::Base::String& elementOutValue)
175 {
176         bool findElement = false;
177
178         _UiBuilderControlItem* pUiBuilderControlItem = null;
179         __pUiBuilderControlItemList->GetAt(index, pUiBuilderControlItem);
180         if (pUiBuilderControlItem == null)
181         {
182                 SysLogException(NID_UI, GetLastResult(), "Failed to get _UiBuilderControlItem");
183                 return null;
184         }
185
186
187         Tizen::Base::Collection::ArrayListT<_UiBuilderControlElement*>* pItemPropertyList = pUiBuilderControlItem->GetItemProperty();
188
189         IEnumeratorT<_UiBuilderControlElement*>* pEnum =  pItemPropertyList->GetEnumeratorN();
190         SysTryReturn(NID_UI, pEnum != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to get IEnumerator.");
191         _UiBuilderControlElement* pUiBuilderControlElement = null;
192
193         while (pEnum->MoveNext() == E_SUCCESS)
194         {
195                 pEnum->GetCurrent(pUiBuilderControlElement);
196                 if (pUiBuilderControlElement->GetName().Equals(elementName, false) && pUiBuilderControlElement->GetValue().IsEmpty() == false)
197                 {
198                                 elementOutValue = pUiBuilderControlElement->GetValue();
199                                 findElement = true;
200                                 break;
201                 }
202         }
203         delete pEnum;
204
205         if (!findElement)
206         {
207                 return false;
208         }
209         else
210         {
211                 // < & > check
212                 if (IsSpecialChar(elementOutValue))
213                 {
214                         ConvertSpecialChar(elementOutValue);
215                 }
216         }
217         if (elementOutValue[0] == ':' && elementOutValue[1] == ':')
218         {
219                 result r = E_SUCCESS;
220                 AppResource* pAppResource = AppResource::GetInstance();
221                 if (pAppResource == null)
222                 {
223                         return false;
224                 }
225                 String subStr;
226                 String getStringValue;
227                 elementOutValue.SubString(2, elementOutValue.GetLength() - 2, subStr);
228                 elementOutValue = subStr;
229                 r = pAppResource->GetString(elementOutValue, getStringValue);
230                 elementOutValue = getStringValue;
231         }
232
233         return true;
234 }
235
236 bool
237 _UiBuilderControl::GetElement(const Tizen::Base::String& elementName, Tizen::Base::String& elementOutValue)
238 {
239         bool findElement = false;
240         IEnumeratorT<_UiBuilderControlElement*>* pEnum = __pUiBuilderControlElementList->GetEnumeratorN();
241         SysTryReturn(NID_UI, pEnum != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to get IEnumerator.");
242         _UiBuilderControlElement* pUiBuilderControlElement = null;
243
244         while (pEnum->MoveNext() == E_SUCCESS)
245         {
246                 pEnum->GetCurrent(pUiBuilderControlElement);
247                 if (pUiBuilderControlElement->GetName().Equals(elementName, false) && pUiBuilderControlElement->GetValue().IsEmpty() == false)
248                 {
249                                 elementOutValue = pUiBuilderControlElement->GetValue();
250                                 findElement = true;
251                                 break;
252                 }
253         }
254         delete pEnum;
255
256         if (findElement == false)
257         {
258                 return false;
259         }
260         else
261         {
262                 // < & > check
263                 if (IsSpecialChar(elementOutValue))
264                 {
265                         ConvertSpecialChar(elementOutValue);
266                 }
267         }
268
269         if (elementOutValue[0] == ':' && elementOutValue[1] == ':')
270         {
271                 result r = E_SUCCESS;
272                 AppResource* pAppResource = AppResource::GetInstance();
273                 if (pAppResource == null)
274                 {
275                         return false;
276                 }
277                 String subStr;
278                 String getStringValue;
279                 elementOutValue.SubString(2, elementOutValue.GetLength() - 2, subStr);
280                 elementOutValue = subStr;
281
282                 r = pAppResource->GetString(elementOutValue, getStringValue);
283                 elementOutValue = getStringValue;
284         }
285
286         return true;
287
288 }
289
290 int
291 _UiBuilderControl::GetItemCount(void) const
292 {
293         return __itemCount;
294 }
295
296 String
297 _UiBuilderControl::GetId(void) const
298 {
299         return __id;
300 }
301
302 String
303 _UiBuilderControl::GetType(void) const
304 {
305         return __type;
306 }
307
308 String
309 _UiBuilderControl::GetParentWin(void) const
310 {
311         return __parentId;
312 }
313
314 String
315 _UiBuilderControl::GetItemName(int index) const
316 {
317         _UiBuilderControlItem* pUiBuilderControlItem = null;
318         __pUiBuilderControlItemList->GetAt(index, pUiBuilderControlItem);
319         SysTryReturn(NID_UI, pUiBuilderControlItem != null, L"", GetLastResult(), "Failed to get _UiBuilderControlItem");
320
321         return pUiBuilderControlItem->GetItemName();
322 }
323
324 _UiBuilderControlLayout*
325 _UiBuilderControl::GetAttribute(int mode) const
326 {
327         return const_cast<_UiBuilderControlLayout*>(&__layout[mode]);
328 }
329
330 bool
331 _UiBuilderControl::IsSpecialChar(const Tizen::Base::String& string) const
332 {
333         if (string.IsEmpty())
334         {
335                 return false;
336         }
337         if (string.Contains(L"&lt;") ||string.Contains(L"&amp;")
338                 || string.Contains(L"&gt;") || string.Contains(L"&apos;")
339                 || string.Contains(L"&quot") || string.Contains(L"\\"))
340         {
341                 return true;
342         }
343         else
344         {
345                 return false;
346         }
347 }
348
349 void
350 _UiBuilderControl::ConvertSpecialChar(Tizen::Base::String& string) const
351 {
352         int len = string.GetLength();
353         wchar_t* stringPointer = const_cast<wchar_t*>(string.GetPointer());
354         int i = 0;
355         int j = 0;
356
357         while (i < len)
358         {
359                 if (stringPointer[i] == '\\')
360                 {
361                         if (stringPointer[i + 1] == 'n')
362                         {
363                                 stringPointer[j] = '\n';
364                                 i += 2;
365                                 j ++;
366                         }
367                         else if (stringPointer[i + 1] == 't')
368                         {
369                                 stringPointer[j] = '\t';
370                                 i += 2;
371                                 j ++;
372                         }
373                         else
374                         {
375                                 stringPointer[j] = '\\';
376                                 j++;
377                                 i++;
378                         }
379                 }
380                 else if ((stringPointer[i] == '&') && (stringPointer[i + 1] == 'l') && (stringPointer[i + 2] == 't') && (stringPointer[i + 3] == ';'))
381                 {
382                         stringPointer[j] = '<';
383                         i += 4;
384                         j++;
385                 }
386                 else if ((stringPointer[i] == '&') && (stringPointer[i + 1] == 'g') && (stringPointer[i + 2] == 't') && (stringPointer[i + 3] == ';'))
387                 {
388                         stringPointer[j] = '>';
389                         i += 4;
390                         j++;
391                 }
392                 else if ((stringPointer[i] == '&') && (stringPointer[i + 1] == 'a') && (stringPointer[i + 2] == 'm') && (stringPointer[i + 3] == 'p') && (stringPointer[i + 4] == ';'))
393                 {
394                         stringPointer[j] = '&';
395                         i += 5;
396                         j++;
397                 }
398                 else if ((stringPointer[i] == '&') && (stringPointer[i + 1] == 'a') && (stringPointer[i + 2] == 'p') && (stringPointer[i + 3] == 'o') && (stringPointer[i + 4] == 's') &&
399                                  (stringPointer[i + 5] == ';'))
400                 {
401                         stringPointer[j] = 39; // '
402                         i += 6;
403                         j++;
404                 }
405                 else if ((stringPointer[i] == '&') && (stringPointer[i + 1] == 'q') && (stringPointer[i + 2] == 'u') && (stringPointer[i + 3] == 'o') && (stringPointer[i + 4] == 't') &&
406                                  (stringPointer[i + 5] == ';'))
407                 {
408                         stringPointer[j] = 34; // "
409                         i += 6;
410                         j++;
411                 }
412                 else
413                 {
414                         stringPointer[j] = stringPointer[i];
415                         i++;
416                         j++;
417                 }
418         }
419
420         stringPointer[j] = '\0';
421         string.SetLength(j);
422
423 }
424
425 } }  // Tizen::Ui