2 // Tizen Web Device API
3 // Copyright (c) 2012 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.
18 #include <SecurityExceptions.h>
21 #include <JSWebAPIError.h>
22 #include <ArgumentValidator.h>
23 #include <GlobalContextManager.h>
24 #include <MultiCallbackUserData.h>
25 #include <PlatformException.h>
26 #include <JSWebAPIError.h>
27 #include <FilesystemUtils.h>
28 #include "plugin_config.h"
30 #include "JSStatusNotification.h"
31 #include "JSNotificationDetailInfo.h"
33 using namespace WrtDeviceApis::Commons;
34 using namespace DeviceAPI::Common;
37 namespace Notification {
39 #define NOTIFICATION_TYPE_VALUE "STATUS"
41 JSClassDefinition JSStatusNotification::m_classInfo = {
43 kJSClassAttributeNone,
46 m_property, //StaticValues
47 NULL, //StaticFunctions
48 initialize, //Initialize
53 NULL, //DeleteProperty,
54 NULL, //GetPropertyNames,
55 NULL, //CallAsFunction,
56 NULL, //CallAsConstructor,
61 JSStaticValue JSStatusNotification::m_property[] =
63 {STATUS_NOTIFICATION_PROGRESS_TYPE, JSStatusNotification::getProperty, JSStatusNotification::setProperty, kJSPropertyAttributeNone },
64 {STATUS_NOTIFICATION_PROGRESS_VALUE, JSStatusNotification::getProperty, JSStatusNotification::setProperty, kJSPropertyAttributeNone },
68 bool JSStatusNotification::setProperty(JSContextRef context,
70 JSStringRef propertyName,
72 JSValueRef* exception)
75 StatusNotification *priv = static_cast<StatusNotification*>(JSObjectGetPrivate(object));
76 LogDebug("statusNotification :" << priv);
78 throw TypeMismatchException("StatusNotification's private object is NULL.");
83 size_t jsSize = JSStringGetMaximumUTF8CStringSize(propertyName);
86 char* buffer = new char[jsSize];
87 size_t written = JSStringGetUTF8CString(propertyName, buffer, jsSize);
88 if (written > jsSize) {
89 throw InvalidValuesException("Conversion could not be fully performed.");
95 LogInfo("property =" << property);
97 if ( property == STATUS_NOTIFICATION_PROGRESS_TYPE)
99 std::string strProgressType = JSUtil::JSValueToString(context, value);
100 LogInfo("Progress Type : " << strProgressType);
102 NotificationProgressType progType = NOTI_PROGRESS_TYPE_NONE;
103 if( strProgressType.compare(TIZEN_NOTIFICATION_PROGRESS_TYPE_PERCENTAGE) == 0)
104 progType = NOTI_PROGRESS_TYPE_PERCENTAGE;
105 else if( strProgressType.compare(TIZEN_NOTIFICATION_PROGRESS_TYPE_BYTE) == 0)
106 progType = NOTI_PROGRESS_TYPE_SIZE;
108 throw InvalidValuesException("Invalid Progress Type.");
110 priv->setProgressType(progType); //set progress Type
114 else if ( property == STATUS_NOTIFICATION_PROGRESS_VALUE)
117 unsigned long progressVal = JSUtil::JSValueToULong(context, value);
118 LogInfo("Progress Value : " << progressVal);
120 if ( priv->getProgressType() == NOTI_PROGRESS_TYPE_PERCENTAGE)
122 if ( 100 < progressVal )
123 throw InvalidValuesException("The percentage progress value must be between 0 and 100");
124 priv->setProgressValue((double)progressVal/(double)100);
128 priv->setProgressValue((double)progressVal);
135 catch ( const BasePlatformException& err)
137 LogWarning(" notification convertion is failed. " << err.getName().c_str() << ":" << err.getMessage().c_str());
144 JSValueRef JSStatusNotification::getProperty(JSContextRef context,
146 JSStringRef propertyName,
147 JSValueRef* exception)
150 StatusNotification *priv = static_cast<StatusNotification*>(JSObjectGetPrivate(object));
151 LogDebug("statusNotification :" << priv);
153 throw TypeMismatchException("StatusNotification's private object is NULL.");
157 std::string property;
158 size_t jsSize = JSStringGetMaximumUTF8CStringSize(propertyName);
161 char* buffer = new char[jsSize];
162 size_t written = JSStringGetUTF8CString(propertyName, buffer, jsSize);
163 if (written > jsSize) {
164 throw InvalidValuesException("Conversion could not be fully performed.");
170 LogInfo("property =" << property);
171 if ( property == STATUS_NOTIFICATION_PROGRESS_TYPE)
174 if ( NOTI_PROGRESS_TYPE_PERCENTAGE == priv->getProgressType())
176 type = TIZEN_NOTIFICATION_PROGRESS_TYPE_PERCENTAGE;
178 else if ( NOTI_PROGRESS_TYPE_SIZE== priv->getProgressType())
180 type = TIZEN_NOTIFICATION_PROGRESS_TYPE_BYTE;
183 return JSUtil::toJSValueRef(context, type);
186 else if ( property == STATUS_NOTIFICATION_PROGRESS_VALUE)
189 LogInfo("Progress Type=" << priv->getProgressType());
192 unsigned long progressVal = 0;
193 if ( NOTI_PROGRESS_TYPE_PERCENTAGE == priv->getProgressType())
195 progressVal = (unsigned long)( (priv->getProgressValue()*100) );
197 else if ( NOTI_PROGRESS_TYPE_SIZE== priv->getProgressType())
199 progressVal = (unsigned long)priv->getProgressValue();
202 LogInfo("Progress Value=" << progressVal);
204 if( priv->getNotiType() != NOTI_TYPE_PROGRESS && progressVal == 0)
206 return JSValueMakeNull(context);
210 return JSUtil::toJSValueRef(context, progressVal);
215 catch ( const BasePlatformException& err)
217 LogWarning(" notification convertion is failed. " << err.getName().c_str() << ":" << err.getMessage().c_str());
225 JSClassRef JSStatusNotification::m_jsClassRef = JSClassCreate(JSStatusNotification::getClassInfo());
227 const JSClassRef JSStatusNotification::getClassRef()
230 m_jsClassRef = JSClassCreate(&m_classInfo);
235 const JSClassDefinition* JSStatusNotification::getClassInfo()
240 void JSStatusNotification::initialize(JSContextRef context, JSObjectRef object)
242 LogDebug("JSStatusNotification::initialize, nothing ");
245 void JSStatusNotification::finalize(JSObjectRef object)
247 StatusNotification *priv = static_cast<StatusNotification*>(JSObjectGetPrivate(object));
249 JSObjectSetPrivate(object, NULL);
254 JSObjectRef JSStatusNotification::constructor(JSContextRef context,
255 JSObjectRef constructor,
256 size_t argumentCount,
257 const JSValueRef arguments[],
258 JSValueRef* exception)
260 ArgumentValidator validator(context, argumentCount, arguments);
263 JSObjectRef obj = JSObjectMake(context, getClassRef(), NULL);
265 JSStringRef ctorName = JSStringCreateWithUTF8CString("constructor");
266 JSObjectSetProperty(context, obj, ctorName, constructor,
267 kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete | kJSPropertyAttributeDontEnum, NULL);
268 JSStringRelease(ctorName);
271 //Status Notification Type.
272 NotificationType notiType = NOTI_TYPE_NONE;
273 std::string strStatusType = validator.toString(0, false, "");
274 LogInfo("Notification Type : " << strStatusType);
276 if( strStatusType.compare(TIZEN_STATUS_NOTIFICATION_TYPE_SIMPLE) == 0)
277 notiType = NOTI_TYPE_SIMPLE;
278 else if( strStatusType.compare(TIZEN_STATUS_NOTIFICATION_TYPE_THUMBNAIL) == 0)
279 notiType = NOTI_TYPE_THUMBNAIL;
280 else if( strStatusType.compare(TIZEN_STATUS_NOTIFICATION_TYPE_ONGOING) == 0)
281 notiType = NOTI_TYPE_ONGOING;
282 else if( strStatusType.compare(TIZEN_STATUS_NOTIFICATION_TYPE_PROGRESS) == 0)
283 notiType = NOTI_TYPE_PROGRESS;
285 throw TypeMismatchException("notification status type mismatch.");
287 StatusNotification *priv = new StatusNotification(notiType);
289 priv->setTitle(validator.toString(1, false, "")); //title
291 JSObjectRef notiInitDict = validator.toObject(2, true);
295 LogInfo("Set Notification Init Dictionary");
297 JSValueRef contentValue = JSUtil::getProperty(context, notiInitDict, NOTIFICATION_CONTENT);
298 if (!JSValueIsUndefined(context, contentValue))
300 priv->setContent(JSUtil::JSValueToString(context, contentValue));
305 JSValueRef iconValue = JSUtil::getProperty(context, notiInitDict, STATUS_NOTIFICATION_ICON_PATH);
306 if (!JSValueIsUndefined(context, iconValue))
308 DeviceAPI::Filesystem::IPathPtr path = DeviceAPI::Filesystem::Utils::fromVirtualPath(context, JSUtil::JSValueToString(context, iconValue));
309 priv->setIconPath(path->getFullPath());
314 throw InvalidValuesException("Icon file path is invaild");
317 catch ( const BasePlatformException& err)
319 LogWarning("notification's icon path convertion is failed." << err.getMessage());
325 JSValueRef soundValue = JSUtil::getProperty(context, notiInitDict, STATUS_NOTIFICATION_SOUND_PATH);
326 if (!JSValueIsUndefined(context, soundValue))
328 DeviceAPI::Filesystem::IPathPtr path = DeviceAPI::Filesystem::Utils::fromVirtualPath(context, JSUtil::JSValueToString(context, soundValue));
329 priv->setSoundPath(path->getFullPath());
334 throw InvalidValuesException("sound file path is invaild");
338 JSValueRef vibrationValue = JSUtil::getProperty(context, notiInitDict, STATUS_NOTIFICATION_VIBRATION);
339 priv->setDefaultVibration(JSUtil::JSValueToBoolean(context, vibrationValue));
342 JSValueRef appControlValue = JSUtil::getProperty(context, notiInitDict, STATUS_NOTIFICATION_APP_CONTROL);
343 if (!JSValueIsUndefined(context, appControlValue))
344 priv->setApplicationControl(DeviceAPI::Application::JSApplicationControl::getApplicationControl(context, JSUtil::JSValueToObject(context, appControlValue) ));
347 JSValueRef appIdValue = JSUtil::getProperty(context, notiInitDict, STATUS_NOTIFICATION_APP_ID);
348 if (!JSValueIsUndefined(context, appIdValue))
349 priv->setApplicationId(JSUtil::JSValueToString(context, appIdValue));
352 NotificationProgressType progressType = NOTI_PROGRESS_TYPE_PERCENTAGE;
354 JSStringRef propertyName = JSStringCreateWithUTF8CString(STATUS_NOTIFICATION_PROGRESS_TYPE);
355 bool has = JSObjectHasProperty(context, notiInitDict, propertyName);
356 JSStringRelease(propertyName);
359 JSValueRef progressTypeValue = JSUtil::getProperty(context, notiInitDict, STATUS_NOTIFICATION_PROGRESS_TYPE);
360 std::string strProgressType = JSUtil::JSValueToString(context, progressTypeValue);
361 LogInfo("==Progress Type : " << strProgressType);
362 if( strProgressType.compare(TIZEN_NOTIFICATION_PROGRESS_TYPE_PERCENTAGE) == 0)
363 progressType = NOTI_PROGRESS_TYPE_PERCENTAGE;
364 else if( strProgressType.compare(TIZEN_NOTIFICATION_PROGRESS_TYPE_BYTE) == 0)
365 progressType = NOTI_PROGRESS_TYPE_SIZE;
367 throw TypeMismatchException("Invalid Progress Type.");
369 priv->setProgressType(progressType);
372 JSValueRef progressTypeValue = JSUtil::getProperty(context, notiInitDict, STATUS_NOTIFICATION_PROGRESS_TYPE);
373 if (progressTypeValue)
377 if (!JSValueIsUndefined(context, progressTypeValue))
379 std::string strProgressType = JSUtil::JSValueToString(context, progressTypeValue);
380 LogInfo("==Progress Type : " << strProgressType);
381 if( strProgressType.compare(TIZEN_NOTIFICATION_PROGRESS_TYPE_PERCENTAGE) == 0)
382 progressType = NOTI_PROGRESS_TYPE_PERCENTAGE;
383 else if( strProgressType.compare(TIZEN_NOTIFICATION_PROGRESS_TYPE_BYTE) == 0)
384 progressType = NOTI_PROGRESS_TYPE_SIZE;
386 throw TypeMismatchException("Invalid Progress Type.");
388 priv->setProgressType(progressType);
391 JSValueRef progressValue = JSUtil::getProperty(context, notiInitDict, STATUS_NOTIFICATION_PROGRESS_VALUE);
392 if (!JSValueIsUndefined(context, progressValue))
394 if ( progressType == NOTI_PROGRESS_TYPE_PERCENTAGE)
396 if ( 100 < JSUtil::JSValueToULong(context, progressValue) )
397 throw TypeMismatchException("The percentage progress value must be between 0 and 100");
398 priv->setProgressValue((double)JSUtil::JSValueToULong(context, progressValue)/(double)100);
402 priv->setProgressValue((double)JSUtil::JSValueToULong(context, progressValue));
407 JSValueRef detailInfoValue = JSUtil::getProperty(context, notiInitDict, STATUS_NOTIFICATION_DETAIL_INFO);
409 std::vector<NotificationDetailInfo*> detailInfos;
410 if (JSIsArrayValue(context, detailInfoValue))
412 JSObjectRef arrayobj = JSUtil::JSValueToObject(context, detailInfoValue);
413 for(std::size_t i = 0; i < JSGetArrayLength(context, arrayobj); ++i)
415 JSValueRef element = JSGetArrayElement(context, arrayobj, i);
416 JSObjectRef object = JSUtil::JSValueToObject(context, element);
419 NotificationDetailInfo* item = static_cast<NotificationDetailInfo*>(JSObjectGetPrivate(object));
420 std::string main = item->getMainText();
421 std::string sub = item->getSubText();
422 LogInfo("Main : " << main << " Sub : " << sub);
424 NotificationDetailInfo *detailinfo = new NotificationDetailInfo(NULL, (int)i, main, sub);
425 detailInfos.push_back(detailinfo);
429 priv->setDetailInfos(detailInfos);
433 JSValueRef backgroundImageValue = JSUtil::getProperty(context, notiInitDict, STATUS_NOTIFICATION_BACKGROUND_IMAGE_PATH);
434 if (!JSValueIsUndefined(context, backgroundImageValue))
436 DeviceAPI::Filesystem::IPathPtr path = DeviceAPI::Filesystem::Utils::fromVirtualPath(context, JSUtil::JSValueToString(context, backgroundImageValue));
437 priv->setBackground(path->getFullPath());
442 throw TypeMismatchException("The backgound image path is invalid : ");
446 JSValueRef numberValue = JSUtil::getProperty(context, notiInitDict, STATUS_NOTIFICATION_NUMBER);
447 if (!JSValueIsUndefined(context, numberValue))
449 priv->setNumber(JSUtil::JSValueToLong(context, numberValue));
454 JSValueRef thumbnailsValue = JSUtil::getProperty(context, notiInitDict, STATUS_NOTIFICATION_THUMBNAILS);
455 if (!JSValueIsUndefined(context, thumbnailsValue))
458 std::vector<std::string> thumbnailPaths;
459 if( JSIsArrayValue(context, thumbnailsValue)){
460 JSObjectRef arrayobj = JSUtil::JSValueToObject(context, thumbnailsValue);
461 for (std::size_t i = 0; i < JSGetArrayLength(context, arrayobj); ++i) {
462 JSValueRef element = JSGetArrayElement(context, arrayobj, i);
463 DeviceAPI::Filesystem::IPathPtr thumbnailPath =
464 DeviceAPI::Filesystem::Utils::fromVirtualPath(context, JSUtil::JSValueToString(context, element));
465 LogInfo("thumbnail Path = " << thumbnailPath->getFullPath());
466 thumbnailPaths.push_back(thumbnailPath->getFullPath());
469 priv->setThumbnails(thumbnailPaths);
474 throw TypeMismatchException("thumbnail path convertion is failed.");
479 JSValueRef subIconPathValue = JSUtil::getProperty(context, notiInitDict, STATUS_NOTIFICATION_SUB_ICON_PATH);
480 if (!JSValueIsUndefined(context, subIconPathValue))
482 DeviceAPI::Filesystem::IPathPtr path = DeviceAPI::Filesystem::Utils::fromVirtualPath(context, JSUtil::JSValueToString(context, subIconPathValue));
483 priv->setSubIconPath( path->getFullPath());
488 throw TypeMismatchException("subIcon path convertion is failed.");
493 setPrivateObject(context, obj, priv);
496 catch ( const BasePlatformException& err)
498 LogWarning(" notification convertion is failed. " << err.getName().c_str() << ":" << err.getMessage().c_str());
499 JSObjectRef error = JSWebAPIError::makeJSWebAPIError(context, err);
508 StatusNotification* JSStatusNotification::getPrivateObject(JSContextRef context, JSObjectRef object)
510 LogDebug("get object :" << object);
512 StatusNotification *priv = static_cast<StatusNotification*>(JSObjectGetPrivate(object));
513 LogDebug("statusNotification :" << priv);
515 throw TypeMismatchException("StatusNotification's private object is NULL.");
519 JSValueRef type = JSUtil::getProperty(context, object, NOTIFICATION_TYPE);
520 if ((JSUtil::JSValueToString(context, type)).compare(NOTIFICATION_TYPE_VALUE) )
522 throw TypeMismatchException("StatusNotification's type is mismatched");
526 JSValueRef title = JSUtil::getProperty(context, object, NOTIFICATION_TITLE);
527 priv->setTitle( JSUtil::JSValueToString(context, title));
530 JSValueRef contents = JSUtil::getProperty(context, object, NOTIFICATION_CONTENT);
531 priv->setContent( JSUtil::JSValueToString(context, contents));
534 JSValueRef iconPath = JSUtil::getProperty(context, object, STATUS_NOTIFICATION_ICON_PATH);
535 if (!JSUtil::JSValueToString(context, iconPath).empty())
537 DeviceAPI::Filesystem::IPathPtr icon = DeviceAPI::Filesystem::Utils::fromVirtualPath(context, JSUtil::JSValueToString(context, iconPath));
538 priv->setIconPath(icon->getFullPath());
542 priv->setIconPath("");
546 JSValueRef subIconPath = JSUtil::getProperty(context, object, STATUS_NOTIFICATION_SUB_ICON_PATH);
547 if (!JSUtil::JSValueToString(context, subIconPath).empty())
549 DeviceAPI::Filesystem::IPathPtr subIcon = DeviceAPI::Filesystem::Utils::fromVirtualPath(context, JSUtil::JSValueToString(context, subIconPath));
550 priv->setSubIconPath(subIcon->getFullPath());
554 priv->setSubIconPath("");
558 JSValueRef number = JSUtil::getProperty(context, object, STATUS_NOTIFICATION_NUMBER);
559 priv->setNumber(JSUtil::JSValueToLong(context, number));
562 JSValueRef detailInfo = JSUtil::getProperty(context, object, STATUS_NOTIFICATION_DETAIL_INFO);
563 std::vector<NotificationDetailInfo*> detailInfos;
564 if (JSIsArrayValue(context, detailInfo))
566 JSObjectRef arrayobj = JSUtil::JSValueToObject(context, detailInfo);
567 for(std::size_t i = 0; i < JSGetArrayLength(context, arrayobj); ++i)
569 JSValueRef element = JSGetArrayElement(context, arrayobj, i);
570 JSObjectRef object = JSUtil::JSValueToObject(context, element);
573 NotificationDetailInfo* detailinfo = static_cast<NotificationDetailInfo*>(JSObjectGetPrivate(object));
574 detailInfos.push_back(detailinfo);
578 priv->setDetailInfos(detailInfos);
580 // backgroundImagePath
581 JSValueRef backgroundImagePath = JSUtil::getProperty(context, object, STATUS_NOTIFICATION_BACKGROUND_IMAGE_PATH);
582 if (!JSUtil::JSValueToString(context, backgroundImagePath).empty())
584 DeviceAPI::Filesystem::IPathPtr backgroundImage = DeviceAPI::Filesystem::Utils::fromVirtualPath(context, JSUtil::JSValueToString(context, backgroundImagePath));
585 priv->setBackground(backgroundImage->getFullPath());
589 priv->setBackground("");
593 JSValueRef thumbnails = JSUtil::getProperty(context, object, STATUS_NOTIFICATION_THUMBNAILS);
595 std::vector<std::string> thumbnailPaths;
596 if( JSIsArrayValue(context, thumbnails)){
597 JSObjectRef arrayobj = JSUtil::JSValueToObject(context, thumbnails);
598 for (std::size_t i = 0; i < JSGetArrayLength(context, arrayobj); ++i) {
599 JSValueRef element = JSGetArrayElement(context, arrayobj, i);
600 DeviceAPI::Filesystem::IPathPtr thumbnailPath =
601 DeviceAPI::Filesystem::Utils::fromVirtualPath(context, JSUtil::JSValueToString(context, element));
602 LogInfo("thumbnail Path = " << thumbnailPath->getFullPath());
603 thumbnailPaths.push_back(thumbnailPath->getFullPath());
606 priv->setThumbnails(thumbnailPaths);
609 JSValueRef soundPath = JSUtil::getProperty(context, object, STATUS_NOTIFICATION_SOUND_PATH);
610 if (!JSUtil::JSValueToString(context, soundPath).empty())
612 DeviceAPI::Filesystem::IPathPtr sound = DeviceAPI::Filesystem::Utils::fromVirtualPath(context, JSUtil::JSValueToString(context, soundPath));
613 priv->setSoundPath(sound->getFullPath());
617 priv->setSoundPath("");
621 JSValueRef vibration = JSUtil::getProperty(context, object, STATUS_NOTIFICATION_VIBRATION);
622 priv->setDefaultVibration(JSUtil::JSValueToBoolean(context, vibration));
625 JSValueRef appControl = JSUtil::getProperty(context, object, STATUS_NOTIFICATION_APP_CONTROL);
626 priv->setApplicationControl(DeviceAPI::Application::JSApplicationControl::getApplicationControl(context, JSUtil::JSValueToObject(context,appControl)));
629 JSValueRef appId = JSUtil::getProperty(context, object, STATUS_NOTIFICATION_APP_ID);
630 priv->setApplicationId(JSUtil::JSValueToString(context, appId));
634 JSValueRef progressType = JSUtil::getProperty(context, object, STATUS_NOTIFICATION_PROGRESS_TYPE);
635 std::string strProgressType = JSUtil::JSValueToString(context, progressType);
636 LogInfo("Progress Type : " << strProgressType);
638 NotificationProgressType progType = NOTI_PROGRESS_TYPE_NONE;
639 if( strProgressType.compare(TIZEN_NOTIFICATION_PROGRESS_TYPE_PERCENTAGE) == 0)
640 progType = NOTI_PROGRESS_TYPE_PERCENTAGE;
641 else if( strProgressType.compare(TIZEN_NOTIFICATION_PROGRESS_TYPE_BYTE) == 0)
642 progType = NOTI_PROGRESS_TYPE_SIZE;
644 throw InvalidValuesException("Invalid Progress Type.");
645 priv->setProgressType(progType);
648 JSValueRef progressValue = JSUtil::getProperty(context, object, STATUS_NOTIFICATION_PROGRESS_VALUE);
649 LogInfo(" Progress Value in Private Object = " << JSUtil::JSValueToULong(context, progressValue));
650 if ( progType == NOTI_PROGRESS_TYPE_PERCENTAGE)
652 if ( 100 < JSUtil::JSValueToULong(context, progressValue) )
653 throw InvalidValuesException("The percentage progress value must be between 0 and 100");
654 priv->setProgressValue((double)JSUtil::JSValueToULong(context, progressValue)/(double)100);
658 priv->setProgressValue((double)JSUtil::JSValueToULong(context, progressValue));
664 void JSStatusNotification::setPrivateObject(JSContextRef context, JSObjectRef object, StatusNotification *priv)
667 JSObjectSetPrivate(object, static_cast<void*>(priv));
670 throw TypeMismatchException("StatusNotification object is invaild.");
673 std::string typeVal(NOTIFICATION_TYPE_VALUE);
674 JSUtil::setProperty(context, object, NOTIFICATION_TYPE,
675 JSUtil::toJSValueRef(context, typeVal), kJSPropertyAttributeReadOnly);
680 if ( NOTI_TYPE_SIMPLE == priv->getNotiType())
681 type = TIZEN_STATUS_NOTIFICATION_TYPE_SIMPLE;
682 else if ( NOTI_TYPE_ONGOING == priv->getNotiType())
683 type = TIZEN_STATUS_NOTIFICATION_TYPE_ONGOING;
684 else if ( NOTI_TYPE_PROGRESS == priv->getNotiType())
685 type = TIZEN_STATUS_NOTIFICATION_TYPE_PROGRESS;
686 else if ( NOTI_TYPE_THUMBNAIL == priv->getNotiType())
687 type = TIZEN_STATUS_NOTIFICATION_TYPE_THUMBNAIL;
689 throw TypeMismatchException("status type mismatch.");
691 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_STATUS_TYPE,
692 JSUtil::toJSValueRef(context, type), kJSPropertyAttributeReadOnly);
694 if (priv->getID() >= 0)
696 std::stringstream stream;
697 stream << priv->getID();
700 throw TypeMismatchException("Notification's ID conversion is failed.");
702 JSUtil::setProperty(context, object, NOTIFICATION_ID,
703 JSUtil::toJSValueRef(context, stream.str()), kJSPropertyAttributeReadOnly);
707 JSUtil::setProperty(context, object, NOTIFICATION_ID,
708 JSValueMakeNull(context), kJSPropertyAttributeReadOnly);
712 if (priv->getPostedTime() > 0)
714 JSUtil::setProperty(context, object, NOTIFICATION_POSTED_TIME,
715 JSUtil::makeDateObject(context,priv->getPostedTime()), kJSPropertyAttributeReadOnly);
719 JSUtil::setProperty(context, object, NOTIFICATION_POSTED_TIME,
720 JSValueMakeNull(context), kJSPropertyAttributeReadOnly);
724 JSUtil::setProperty(context, object, NOTIFICATION_TITLE,
725 JSUtil::toJSValueRef(context, priv->getTitle()), kJSPropertyAttributeNone);
728 if (priv->getStrContent())
729 JSUtil::setProperty(context, object, NOTIFICATION_CONTENT,
730 JSUtil::toJSValueRef(context, priv->getContent()), kJSPropertyAttributeNone);
732 JSUtil::setProperty(context, object, NOTIFICATION_CONTENT, JSValueMakeNull(context), kJSPropertyAttributeNone);
735 if (!priv->getIconPath().empty())
736 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_ICON_PATH,
737 JSUtil::toJSValueRef(context, DeviceAPI::Filesystem::Utils::toVirtualPath(context, priv->getIconPath())), kJSPropertyAttributeNone);
739 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_ICON_PATH, JSValueMakeNull(context), kJSPropertyAttributeNone);
742 if ( !priv->getSubIconPath().empty())
743 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_SUB_ICON_PATH,
744 JSUtil::toJSValueRef(context, DeviceAPI::Filesystem::Utils::toVirtualPath(context, priv->getSubIconPath())), kJSPropertyAttributeNone);
746 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_SUB_ICON_PATH, JSValueMakeNull(context), kJSPropertyAttributeNone);
749 if (priv->getStrNumber()){
750 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_NUMBER,
751 JSUtil::toJSValueRef(context, priv->getNumber()), kJSPropertyAttributeNone);
754 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_NUMBER, JSValueMakeNull(context), kJSPropertyAttributeNone);
756 // backgroundImagePath
757 if ( !priv->getBackground().empty())
758 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_BACKGROUND_IMAGE_PATH,
759 JSUtil::toJSValueRef(context, DeviceAPI::Filesystem::Utils::toVirtualPath(context, priv->getBackground())), kJSPropertyAttributeNone);
761 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_BACKGROUND_IMAGE_PATH, JSValueMakeNull(context), kJSPropertyAttributeNone);
764 std::vector<std::string> thumbnails = priv->getThumbnails();
765 LogInfo("Thumbnail Size : " << thumbnails.size());
766 JSValueRef tumbnailvalueArray[thumbnails.size()];
767 for( unsigned int i = 0 ; i < thumbnails.size(); i++) {
768 if (!thumbnails[i].empty())
770 LogInfo("Thumbnail :" << thumbnails[i]);
771 tumbnailvalueArray[i] = JSUtil::toJSValueRef(context, DeviceAPI::Filesystem::Utils::toVirtualPath(context, thumbnails[i]));
775 JSValueRef exception = NULL;
776 JSObjectRef jsThumbnails = JSObjectMakeArray(context, thumbnails.size(), tumbnailvalueArray, &exception);
777 if (exception != NULL) {
778 throw DeviceAPI::Common::UnknownException("Make Object Array failed.");
781 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_THUMBNAILS,
782 jsThumbnails, kJSPropertyAttributeNone);
785 if ( !priv->getSoundPath().empty() )
786 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_SOUND_PATH,
787 JSUtil::toJSValueRef(context, DeviceAPI::Filesystem::Utils::toVirtualPath(context, priv->getSoundPath())), kJSPropertyAttributeNone);
789 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_SOUND_PATH, JSValueMakeNull(context), kJSPropertyAttributeNone);
792 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_VIBRATION,
793 JSUtil::toJSValueRef(context, priv->getDefaultVibration()), kJSPropertyAttributeNone);
796 if (!priv->getApplicationId().empty())
797 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_APP_ID,
798 JSUtil::toJSValueRef(context, priv->getApplicationId()), kJSPropertyAttributeNone);
800 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_APP_ID, JSValueMakeNull(context), kJSPropertyAttributeNone);
803 // progressType & Value
804 LogInfo("Progress Type=" << priv->getProgressType());
807 unsigned long progressVal = 0;
808 if ( NOTI_PROGRESS_TYPE_PERCENTAGE == priv->getProgressType())
810 type = TIZEN_NOTIFICATION_PROGRESS_TYPE_PERCENTAGE;
811 progressVal = (unsigned long)( (priv->getProgressValue()*100) );
813 else if ( NOTI_PROGRESS_TYPE_SIZE== priv->getProgressType())
815 type = TIZEN_NOTIFICATION_PROGRESS_TYPE_BYTE;
816 progressVal = (unsigned long)priv->getProgressValue();
819 LogInfo("Progress Type=" << type);
820 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_PROGRESS_TYPE,
821 JSUtil::toJSValueRef(context, type), kJSPropertyAttributeNone);
823 LogInfo("Progress Value =" << progressVal);
824 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_PROGRESS_VALUE,
825 JSUtil::toJSValueRef(context, progressVal), kJSPropertyAttributeNone);
828 std::vector<NotificationDetailInfo*> detailInfo = priv->getDetailInfos();
829 LogInfo("detail Info Size : " << detailInfo.size());
830 JSObjectRef valueArray[detailInfo.size()];
831 for( unsigned int i = 0 ; i < detailInfo.size(); i++) {
834 LogInfo("Main = " << detailInfo[i]->getMainText() << " Sub = " << detailInfo[i]->getSubText());
835 valueArray[i] = JSObjectMake(GlobalContextManager::getInstance()->getGlobalContext(context), JSNotificationDetailInfo::getClassRef(), static_cast<void*>(detailInfo[i]));
836 JSNotificationDetailInfo::setPrivateObject(context, valueArray[i], detailInfo[i]);
837 LogInfo("make Object : " << valueArray[i]);
842 JSObjectRef jsResult = JSObjectMakeArray(GlobalContextManager::getInstance()->getGlobalContext(context), detailInfo.size(), valueArray, &exception);
843 if (exception != NULL) {
844 throw DeviceAPI::Common::UnknownException("Make Object Array failed.");
848 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_DETAIL_INFO,
849 jsResult, kJSPropertyAttributeNone);
852 if ( !(priv->getApplicationControl())->getOperation().empty())
854 DeviceAPI::Application::JSApplicationControlPriv *appCtrlPriv = new DeviceAPI::Application::JSApplicationControlPriv(context, priv->getApplicationControl());
855 JSObjectRef jsAppCtrl = JSObjectMake(context, DeviceAPI::Application::JSApplicationControl::getClassRef(), appCtrlPriv);
856 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_APP_CONTROL, jsAppCtrl, kJSPropertyAttributeNone);
859 JSUtil::setProperty(context, object, STATUS_NOTIFICATION_APP_CONTROL, JSValueMakeNull(context), kJSPropertyAttributeNone);