2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
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
9 // http://www.apache.org/licenses/LICENSE-2.0/
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.
19 * @file FUiCtrl_OverlayRegionImpl.cpp
20 * @brief This is the implementation file for _OverlayRegionImpl class.
25 #include <unique_ptr.h>
26 #include <Ecore_Evas.h>
27 #include <Elementary.h>
28 #include <FSysSystemInfo.h>
30 #include <FBaseInteger.h>
31 #include <FBaseSysLog.h>
33 #include <FGrp_BufferInfoImpl.h>
34 #include <FSys_EnvironmentImpl.h>
35 #include <FIo_RegistryImpl.h>
37 #include "FUi_CoordinateSystemUtils.h"
38 #include "FUiCtrl_FormImpl.h"
39 #include "FUiCtrl_OverlayAgent.h"
40 #include "FUiCtrl_OverlayRegionImpl.h"
42 using namespace Tizen::Base;
43 using namespace Tizen::Base::Collection;
44 using namespace Tizen::Graphics;
45 using namespace Tizen::Io;
46 using namespace Tizen::Media;
47 using namespace Tizen::System;
48 using namespace Tizen::Ui;
49 using namespace Tizen::Ui::Controls;
51 namespace Tizen { namespace Ui { namespace Controls
53 const int _ROTATION_COUNT = 4;
54 int _OverlayRegionImpl::__primaryCameraRotation = -1;
55 int _OverlayRegionImpl::__secondaryCameraRotation = -1;
56 bool _OverlayRegionImpl::__overlayRegionPixelFomatList[]= {false,};
59 _ConvertCamToOverlayRegionRotation(OverlayRegionType overlayRegionType, int cameraRotation, int formOrientation)
61 OverlayRegionRotate rotation = OVERLAYREGION_ROTATE_NONE;
62 int tempCameraRotation = 0;
63 int tempFormRotation = 0;
65 switch (cameraRotation)
67 case 1://CAMERA_ROTATION_NONE:
68 tempCameraRotation = 0;
70 case 2://CAMERA_ROTATION_90:
71 tempCameraRotation = 1;
73 case 3://CAMERA_ROTATION_180:
74 tempCameraRotation = 2;
76 case 4://CAMERA_ROTATION_270:
77 tempCameraRotation = 3;
80 SysLogException(NID_UI_CTRL, E_INVALID_ARG, "[E_INVALID_ARG] The current rotation of camera[%d] is invalid", cameraRotation);
84 switch (static_cast<OrientationStatus>(formOrientation))
86 case ORIENTATION_STATUS_PORTRAIT:
89 case ORIENTATION_STATUS_LANDSCAPE:
92 case ORIENTATION_STATUS_PORTRAIT_REVERSE:
95 case ORIENTATION_STATUS_LANDSCAPE_REVERSE:
99 SysLogException(NID_UI_CTRL, E_INVALID_ARG, "[E_INVALID_ARG] The current rotation of form[%d] is invalid", formOrientation);
103 switch (overlayRegionType)
105 case OVERLAY_REGION_TYPE_NORMAL:
106 rotation = OVERLAYREGION_ROTATE_0;
108 case OVERLAY_REGION_TYPE_PRIMARY_CAMERA:
109 rotation = static_cast<OverlayRegionRotate>((_ROTATION_COUNT - (tempFormRotation - tempCameraRotation)) % _ROTATION_COUNT);
111 case OVERLAY_REGION_TYPE_SECONDARY_CAMERA:
112 rotation = static_cast<OverlayRegionRotate>((tempFormRotation + tempCameraRotation) % _ROTATION_COUNT);
117 SysSecureLog(NID_UI_CTRL, "The current OverlayRegion's type is [%d], rotation is [%d]", overlayRegionType, rotation);
122 _OverlayRegionImpl::_OverlayRegionImpl(void)
123 : __pParentForm(null)
124 , __pOverlayRegion(null)
125 , __overlayRegionType(OVERLAY_REGION_TYPE_MIN)
126 , __pOverlayAgent(null)
127 , __destRect(0.0f, 0.0f, 0.0f, 0.0f)
128 , __overlayRegionIndex(-1)
130 , __cameraRotation(1)
134 _OverlayRegionImpl::~_OverlayRegionImpl(void)
138 if (__overlayRegionIndex != -1)
140 __pParentForm->__pOverlayerRegionImplArray[__overlayRegionIndex] = null;
143 __pParentForm->__overlayRegionCount--;
145 SysSecureLog(NID_UI_CTRL, "The [%d]th OverlayRegion in form[%x] is deleted.", __overlayRegionIndex, __pParentForm);
149 delete __pOverlayAgent;
153 Tizen::Graphics::FloatRectangle
154 _OverlayRegionImpl::GetBounds(void) const
160 _OverlayRegionImpl::GetBounds(float& x, float& y, float& width, float& height) const
164 width = __destRect.width;
165 height = __destRect.height;
169 _OverlayRegionImpl::SetInputBuffer(const Tizen::Base::ByteBuffer& srcBuffer, const Tizen::Graphics::Dimension& srcDim, OverlayRegionBufferPixelFormat srcFormat)
171 SysTryReturnResult(NID_UI_CTRL, __pOverlayAgent != null, E_INVALID_STATE, "The current value of OverlayAgent is null.");
172 SysTryReturnResult(NID_UI_CTRL, __showState, E_SYSTEM, "The current Overlay Region is on back ground. Not yet draw.");
174 SysTryReturnResult(NID_UI_CTRL, srcDim.width > 0 && srcDim.height > 0, E_INVALID_ARG, " The current value of source dimension[%d, %d] is invalid", srcDim.width, srcDim.height);
175 SysTryReturnResult(NID_UI_CTRL, srcDim.width % OverlayRegion::GetWidthUnit() == 0 && srcDim.height % OverlayRegion::GetHeightUnit()== 0, E_INVALID_ARG,
176 "The current value of source dimension[%d, %d] is invalid. It should be multiple of OverlayRegion::GetWidthUnit() & GetHeightUnit()", srcDim.width, srcDim.height);
178 if (!__overlayRegionPixelFomatList[0])
180 result r = _OverlayRegionImpl::SetPixelFormatList();
181 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
184 _OverlayAgentBufferPixelFormat format = _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_ARGB8888;
188 case OVERLAY_REGION_BUFFER_PIXEL_FORMAT_ARGB8888:
189 format = _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_ARGB8888;
191 case OVERLAY_REGION_BUFFER_PIXEL_FORMAT_RGB565:
192 format = _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_RGB565;
194 case OVERLAY_REGION_BUFFER_PIXEL_FORMAT_YCbCr420_PLANAR:
195 format = _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_YCbCr420_PLANAR;
197 case OVERLAY_REGION_BUFFER_PIXEL_FORMAT_NV12:
198 format = _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_NV12;
200 case OVERLAY_REGION_BUFFER_PIXEL_FORMAT_UYVY:
201 format = _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_UYVY;
204 SysLogException(NID_UI_CTRL, E_UNSUPPORTED_FORMAT, "[E_UNSUPPORTED_FORMAT] The input value of srcFormat[%d] is unsupported.", srcFormat);
205 return E_UNSUPPORTED_FORMAT;
208 if (!__overlayRegionPixelFomatList[srcFormat])
210 SysLogException(NID_UI_CTRL, E_UNSUPPORTED_FORMAT, "[E_UNSUPPORTED_FORMAT] The input value of srcFormat[%d] is unsupported.", srcFormat);
211 return E_UNSUPPORTED_FORMAT;
214 int size = srcBuffer.GetCapacity();
215 SysTryReturnResult(NID_UI_CTRL, size > 0, E_INVALID_ARG, "The current size of source[%d] is invalid.", size);
217 result r = __pOverlayAgent->SetInputBuffer(srcBuffer, srcDim, format);
218 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
220 r = __pOverlayAgent->Draw();
221 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
227 _OverlayRegionImpl::GetBackgroundBufferInfo(Tizen::Graphics::BufferInfo& info) const
229 SysTryReturnResult(NID_UI_CTRL, __pOverlayAgent != null, E_INVALID_STATE, "The current value of OverlayAgent is null.");
231 result r = __pOverlayAgent->GetBufferInfo(info);
232 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
234 _BufferInfoImpl* pBufferInfoImpl = _BufferInfoImpl::GetInstance(info);
235 SysTryReturnResult(NID_UI_CTRL, pBufferInfoImpl != null , E_SYSTEM, "The current value of BufferInfo is null.");
237 _FormImpl* pFormImpl = static_cast<_FormImpl*>(__pParentForm->GetUserData());
238 SysTryReturnResult(NID_UI_CTRL, pFormImpl != null, E_SYSTEM, "The current value of parent form is null.");
240 OrientationStatus formOrientationStatus = pFormImpl->GetOrientationStatus();
241 switch (formOrientationStatus)
243 case ORIENTATION_STATUS_NONE:
245 case ORIENTATION_STATUS_PORTRAIT:
246 pBufferInfoImpl->SetOrientation(_BufferInfoImpl::ORIENTATION_PORTRAIT);
248 case ORIENTATION_STATUS_LANDSCAPE :
249 pBufferInfoImpl->SetOrientation(_BufferInfoImpl::ORIENTATION_LANDSCAPE);
251 case ORIENTATION_STATUS_PORTRAIT_REVERSE:
252 pBufferInfoImpl->SetOrientation(_BufferInfoImpl::ORIENTATION_PORTRAIT_REVERSE);
254 case ORIENTATION_STATUS_LANDSCAPE_REVERSE:
255 pBufferInfoImpl->SetOrientation(_BufferInfoImpl::ORIENTATION_LANDSCAPE_REVERSE);
259 switch (__cameraRotation)
261 case 1: //CAMERA_ROTATION_NONE
262 pBufferInfoImpl->SetRotation(_BufferInfoImpl::ROTATION_0);
264 case 2: //CAMERA_ROTATION_90:
265 pBufferInfoImpl->SetRotation(_BufferInfoImpl::ROTATION_90);
267 case 3: //CAMERA_ROTATION_180:
268 pBufferInfoImpl->SetRotation(_BufferInfoImpl::ROTATION_180);
270 case 4: //CAMERA_ROTATION_270:
271 pBufferInfoImpl->SetRotation(_BufferInfoImpl::ROTATION_270);
279 _OverlayRegionImpl::Construct(_Form* pParentForm, OverlayRegionType overlayRegionType, const FloatRectangle& userDestRect, const FloatRectangle& overlayLogRect, const Rectangle& finalPhyRect)
281 SysTryReturnResult(NID_UI_CTRL, pParentForm != null, E_SYSTEM, "The current value of Parent Form is null.");
283 _FormImpl* pFormImpl = static_cast<_FormImpl*>(pParentForm->GetUserData());
284 SysTryReturnResult(NID_UI_CTRL, pFormImpl != null, E_SYSTEM, "The Impl of Parent Form is null.");
286 _OverlayAgentStyle overlayAgentType = _OVERLAY_AGENT_STYLE_REGION_SW;
288 String preferredEngineConfig(elm_config_preferred_engine_get());
289 if(preferredEngineConfig.Equals("opengl_x11", true))
291 overlayAgentType = _OVERLAY_AGENT_STYLE_REGION_GL;
292 SysLog(NID_UI_CTRL, "The current value of HwAcceleration is On");
294 else if(preferredEngineConfig.Equals("software_x11", true))
296 overlayAgentType = _OVERLAY_AGENT_STYLE_REGION_SW;
297 SysLog(NID_UI_CTRL, "The current value of HwAcceleration is Off");
301 String engineConfig(elm_config_engine_get());
302 if(engineConfig.Equals("opengl_x11", true))
304 overlayAgentType = _OVERLAY_AGENT_STYLE_REGION_GL;
305 SysLog(NID_UI_CTRL,"The current value of HwAcceleration is On (System Default)");
309 SysLog(NID_UI_CTRL,"The current value of HwAcceleration is Off (System Default)");
314 std::unique_ptr<_OverlayAgent> pOverlayAgent(_OverlayAgent::CreateInstanceN(overlayAgentType, *pParentForm, overlayLogRect, finalPhyRect));
315 SysTryReturnResult(NID_UI_CTRL, pOverlayAgent != null, E_SYSTEM, "The current value of OverlayAgent is null.");
317 result r = GetLastResult();
318 SysTryReturnResult(NID_UI_CTRL,r == E_SUCCESS, r, "Propagating.");
320 //Set Rotation of OverlayRegion
321 if (__primaryCameraRotation == -1 || __secondaryCameraRotation == -1)
323 _OverlayRegionMediaCapability capability;
324 r = capability.Construct();
325 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
327 __primaryCameraRotation = capability.cameraPrimaryRotation;
328 __secondaryCameraRotation = capability.cameraSecondaryRotation;
331 switch (overlayRegionType)
333 case OVERLAY_REGION_TYPE_NORMAL:
334 __cameraRotation = 1; //CAMERA_ROTATION_NONE
336 case OVERLAY_REGION_TYPE_PRIMARY_CAMERA:
337 __cameraRotation = __primaryCameraRotation;
339 case OVERLAY_REGION_TYPE_SECONDARY_CAMERA:
340 __cameraRotation = __secondaryCameraRotation;
343 SysLogException(NID_UI_CTRL, E_UNSUPPORTED_FORMAT, "[E_UNSUPPORTED_FORMAT] The current type of OverlayRegion[%d] is unsupported", overlayRegionType);
344 return E_UNSUPPORTED_FORMAT;
347 OverlayRegionRotate rotation = _ConvertCamToOverlayRegionRotation(overlayRegionType, __cameraRotation, pFormImpl->GetOrientationStatus());
348 SysTryReturnResult(NID_UI_CTRL, rotation != OVERLAYREGION_ROTATE_NONE, E_SYSTEM, "The current camera rotation is invalid.");
352 case OVERLAYREGION_ROTATE_0:
353 r = pOverlayAgent->SetRotation(_OVERLAY_AGENT_ROTATION_NONE);
355 case OVERLAYREGION_ROTATE_90:
356 r = pOverlayAgent->SetRotation(_OVERLAY_AGENT_ROTATION_90);
358 case OVERLAYREGION_ROTATE_180:
359 r = pOverlayAgent->SetRotation(_OVERLAY_AGENT_ROTATION_180);
361 case OVERLAYREGION_ROTATE_270:
362 r = pOverlayAgent->SetRotation(_OVERLAY_AGENT_ROTATION_270);
368 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
370 __pParentForm = pParentForm;
371 __overlayRegionType = overlayRegionType;
372 __destRect = userDestRect;
373 __pOverlayAgent = pOverlayAgent.release();
375 if(overlayAgentType == _OVERLAY_AGENT_STYLE_REGION_GL)
377 r = __pOverlayAgent->CreatePixmap(finalPhyRect);
378 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
380 else if (overlayAgentType == _OVERLAY_AGENT_STYLE_REGION_SW)
382 int size = (finalPhyRect.width * 2) * (finalPhyRect.height * 2);
383 std::unique_ptr<byte[]> pBuffer(new (std::nothrow) byte[size]);
384 SysTryReturnResult(NID_UI_CTRL, pBuffer != null, E_OUT_OF_MEMORY, "Failed to create a buffer for OverlayRegion.");
386 unsigned long* pPos = (unsigned long*)pBuffer.get();
387 for(int i = 0; i < finalPhyRect.height; i++)
389 for(int j = 0; j < finalPhyRect.width; j++)
397 r = buffer.Construct(size);
398 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
400 buffer.SetArray(pBuffer.get(), 0, size);
401 r = SetInputBuffer(buffer, Dimension(finalPhyRect.width, finalPhyRect.height), OVERLAY_REGION_BUFFER_PIXEL_FORMAT_ARGB8888);
402 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
406 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] The current type of OverlayAgen[%d] is invalid.", overlayRegionType);
414 _OverlayRegionImpl::CreateOverlayRegionN(void)
416 OverlayRegion* pOverlayRegion = new (std::nothrow) OverlayRegion();
417 SysTryReturn(NID_UI_CTRL, pOverlayRegion != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The current value of OverlayRegion is null.");
419 __pOverlayRegion = pOverlayRegion;
420 __pOverlayRegion->__pOverlayRegionImpl = this;
422 return pOverlayRegion;
426 _OverlayRegionImpl::SetFormArrayIndex(int index)
428 __overlayRegionIndex = index;
432 _OverlayRegionImpl::GetOverlayRegion(void) const
434 return __pOverlayRegion;
438 _OverlayRegionImpl::GoForeground(void)
441 SysTryReturnVoidResult(NID_UI_CTRL, __pOverlayAgent != null, E_SYSTEM, "[E_SYSTEM] The current value of OverlayAgent is null.");
444 SysSecureLog(NID_UI_CTRL, "The current pixmap[%d] of OverlayRegion is on foreground.", __pOverlayAgent->GetPixmap());
448 _OverlayRegionImpl::GoBackground(void)
451 SysTryReturnVoidResult(NID_UI_CTRL, __pOverlayAgent != null, E_SYSTEM, "[E_SYSTEM] The current value of OverlayAgent is null.");
454 __pOverlayAgent->UngrabXvPort();
455 SysSecureLog(NID_UI_CTRL, "The current pixmap[%d] of OverlayRegion is on background.", __pOverlayAgent->GetPixmap());
459 _OverlayRegionImpl::IsValidBounds(const Rectangle& physicalBounds)
461 int minWidth = _OverlayAgent::GetDstRectMinWidth();
462 int minHeight = _OverlayAgent::GetDstRectMinHeight();
463 SysTryReturnResult(NID_UI_CTRL, physicalBounds.width >= minWidth && physicalBounds.height >= minHeight, E_INVALID_ARG,
464 "The current size of OverlayRegoin[%d, %d] is under minimum size[%d, %d].", physicalBounds.width, physicalBounds.height, minWidth, minHeight);
470 _OverlayRegionImpl::SetPixelFormatList(void)
472 if (__overlayRegionPixelFomatList[0])
477 std::unique_ptr< IListT<bool> > pFormatList(_OverlayAgent::GetPixelFormatListN());
478 SysTryReturn(NID_UI_CTRL, pFormatList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to create a list instance");
481 for (int formatIndex = 0; formatIndex < pFormatList->GetCount(); formatIndex++)
484 pFormatList->GetAt(formatIndex, value);
488 __overlayRegionPixelFomatList[formatIndex + 1] = true;
493 SysAssertf(set, "The list of supported pixel formats is an invalid.");
495 __overlayRegionPixelFomatList[0] = set;
500 IListT<OverlayRegionBufferPixelFormat>*
501 _OverlayRegionImpl::GetSupportedBufferPixelFormatListN(void)
503 result r = E_SUCCESS;
505 if (!_OverlayRegionImpl::__overlayRegionPixelFomatList[0])
507 r = _OverlayRegionImpl::SetPixelFormatList();
508 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
511 std::unique_ptr< ArrayListT<OverlayRegionBufferPixelFormat> > pFormatList( new (std::nothrow) ArrayListT<OverlayRegionBufferPixelFormat>());
512 SysTryReturn(NID_UI_CTRL, pFormatList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] failed to create a list instance");
514 r = pFormatList->Construct();
515 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
517 for (int index = _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_ARGB8888; index <= _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_UYVY; index++)
519 if (_OverlayRegionImpl::__overlayRegionPixelFomatList[index])
521 r = pFormatList->Add(static_cast<OverlayRegionBufferPixelFormat>(index));
524 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
526 return pFormatList.release();
530 _OverlayRegionImpl::GetInstance(OverlayRegion& overlayRegion)
532 return (&overlayRegion != null) ? overlayRegion.__pOverlayRegionImpl : null;
535 const _OverlayRegionImpl*
536 _OverlayRegionImpl::GetInstance(const OverlayRegion& overlayRegion)
538 return (&overlayRegion != null) ? overlayRegion.__pOverlayRegionImpl : null;
541 } } } // Tizen::Ui::Controls
547 const char* _MEDIA_CAPABILITY_FILE_PATH = "/usr/etc/media-capability.xml";
548 const char* _CAM_PRIMARY_DIRECTION = "Camera.Primary.Direction";
549 const char* _CAM_PRIMARY_ROTATION = "Camera.Primary.Rotation";
550 const char* _CAM_SECONDARY_DIRECTION = "Camera.Secondary.Direction";
551 const char* _CAM_SECONDARY_ROTATION = "Camera.Secondary.Rotation";
553 _OverlayRegionMediaCapability::_OverlayRegionMediaCapability(void)
554 : cameraPrimaryDirection(0)
555 , cameraPrimaryRotation(0)
556 , cameraSecondaryDirection(0)
557 , cameraSecondaryRotation(0)
561 _OverlayRegionMediaCapability::~_OverlayRegionMediaCapability(void)
566 _OverlayRegionMediaCapability::Construct(void)
568 String fileName = _MEDIA_CAPABILITY_FILE_PATH;
570 FileAttributes attributes;
571 result r = File::GetAttributes(fileName, attributes);
572 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, "Propagating.");
574 long long length = attributes.GetFileSize();
575 SysTryReturnResult(NID_UI_CTRL, length > 0, E_SYSTEM, "The size of file(%s) is zero.", fileName.GetPointer());
577 std::unique_ptr<char[]> pXmlBuffer(new (std::nothrow) char[length]);
578 SysTryReturnResult(NID_UI_CTRL, pXmlBuffer != null, E_OUT_OF_MEMORY, "The Buffer of Xml is null");
581 r = fileObj.Construct(fileName, L"r");
582 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, "Propagating.");
584 //Read the capability xml file content as parse the capability
585 int readLen = fileObj.Read(pXmlBuffer.get(), length);
586 SysTryReturnResult(NID_UI_CTRL, readLen == length, E_SYSTEM, "Failed to read xml file. (length is %d and readLen is %d)", length, readLen);
588 //Parse the capability file buffer all the parse key value pair shall be added in __pMap object
589 r = ParseCapability(pXmlBuffer.get(), readLen);
590 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, "Propagating.");
596 _OverlayRegionMediaCapability::ParseSection(xmlNodePtr pRoot, const String& section)
598 xmlNode* pNode = null;
600 for (pNode = pRoot->children; pNode; pNode = pNode->next)
602 String name((char*)pNode->name);
607 if (pNode->type == XML_ELEMENT_NODE && pNode->children)
609 if (key.Equals(String(_CAM_PRIMARY_DIRECTION)))
611 String direction((char*)pNode->children->content);
612 if (direction.Equals(String("Back")))
614 cameraPrimaryDirection = 2; //CAMERA_DIRECTION_BACK;
618 cameraPrimaryDirection = 1; //CAMERA_DIRECTION_FRONT;
621 else if (key.Equals(String(_CAM_PRIMARY_ROTATION)))
623 String rot((char*)pNode->children->content);
625 Integer::Decode(rot, ret);
626 cameraPrimaryRotation = (ret / 90) + 1;
628 else if (key.Equals(String(_CAM_SECONDARY_DIRECTION)))
630 String direction((char*)pNode->children->content);
631 if (direction.Equals(String("Back")))
633 cameraSecondaryDirection = 2; //CAMERA_DIRECTION_BACK;
637 cameraSecondaryDirection = 1; //CAMERA_DIRECTION_FRONT;
640 else if (key.Equals(String(_CAM_SECONDARY_ROTATION)))
642 String rot((char*)pNode->children->content);
644 Integer::Decode(rot, ret);
645 cameraSecondaryRotation = (ret / 90) + 1;
649 ParseSection(pNode, key);
654 _OverlayRegionMediaCapability::ParseCapability(const char* xmlBuffer, int length)
656 std::unique_ptr<xmlDoc, xmlParserDeleter> pDoc(xmlParseMemory(xmlBuffer, length));
657 SysTryReturnResult(NID_UI_CTRL, pDoc != null, E_SYSTEM, "xmlParseMemory failed %s %d", xmlBuffer, length);
659 xmlNode* pRoot = xmlDocGetRootElement(pDoc.get());
660 SysTryReturnResult(NID_UI_CTRL, pRoot != null, E_SYSTEM, "[E_SYSTEM] xmlDocGetRootElement failed");
662 String name = (const char*) (pRoot->name);
663 SysSecureTryReturnResult(NID_UI_CTRL, name.Equals("MediaCapability", true), E_SYSTEM, "[E_SYSTEM] Invalid Root Name %ls", name.GetPointer());
665 xmlNode* pNode = null;
666 for (pNode = pRoot->children; pNode; pNode = pNode->next)
668 if (pNode->type == XML_ELEMENT_NODE)
670 String nodeName((char*)pNode->name);
671 ParseSection(pNode, nodeName);