update change log and spec for wrt-plugins-tizen_0.4.79 submit/tizen_2.2/20131107.063313
authorethan.jeong <ethan.jeong@samsung.com>
Wed, 6 Nov 2013 03:26:08 +0000 (12:26 +0900)
committerethan.jeong <ethan.jeong@samsung.com>
Wed, 6 Nov 2013 03:26:08 +0000 (12:26 +0900)
[model] REDWOOD
[binary_type] PDA
[customer] OPEN

[Bookmark] Fix crash of Bookmark TCT
[Issue] N/A
[Problem] crash during testing Bookmark TCT
[Cause] std::multimap::find returns an iterator to multimap::end if an element with specific key doesn't exist. But it doesn't check whether return value is multimap::end or not.
[Solution] It will check whether the return value is multimap::end or not.

[Calendar] find crash with sortMode for filter param
[Issue#] P131105-01760
[Problem] find crash for unvalid object for filter object
[Cause] filter validation is not correct
[Solution] check filter validation

[Package] Removed useless headers

[Push] Removed DAO for getting AppID

[team] WebAPI
[request] N/A
[horizontal_expansion] N/A

Change-Id: I21e26b1ea93108c2f9b8d9480e2c036b61c62f53

23 files changed:
packaging/wrt-plugins-tizen.spec
src/Application/AppManagerWrapper.cpp [changed mode: 0644->0755]
src/Application/AppManagerWrapper.h [changed mode: 0644->0755]
src/Application/ApplicationManager.cpp [changed mode: 0644->0755]
src/Application/JSApplicationEventCallbackManager.cpp [changed mode: 0644->0755]
src/Application/plugin_initializer.cpp [changed mode: 0644->0755]
src/Calendar/CalendarFilter.cpp
src/Calendar/JSCalendar.cpp
src/Common/CMakeLists.txt
src/Common/JSUtil.cpp [changed mode: 0644->0755]
src/Common/MultiCallbackUserData.cpp
src/Common/WebKitProxy.cpp [new file with mode: 0755]
src/Common/WebKitProxy.h [new file with mode: 0755]
src/Contact/JSAddressBookChangeCallbackManager.cpp [changed mode: 0644->0755]
src/Contact/JSContactManagerChangeCallbackManager.cpp [changed mode: 0644->0755]
src/NetworkBearerSelection/JSNetworkBearerSelectionCallbackManager.cpp [changed mode: 0644->0755]
src/Package/PackageManager.cpp [changed mode: 0644->0755]
src/Package/PackageManager.h [changed mode: 0644->0755]
src/Package/plugin_initializer.cpp [changed mode: 0644->0755]
src/Power/PowerManager.cpp
src/Push/PushManager.cpp [changed mode: 0644->0755]
src/Push/PushManager.h [changed mode: 0644->0755]
src/Push/plugin_initializer.cpp [changed mode: 0644->0755]

index f7bf987..4a4eb02 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       wrt-plugins-tizen
 Summary:    JavaScript plugins for WebRuntime
-Version:    0.4.78
+Version:    0.4.79
 Release:    0
 Group:      Development/Libraries
 License:    Apache License, Version 2.0
old mode 100644 (file)
new mode 100755 (executable)
index 48146fa..305a425
@@ -46,17 +46,6 @@ AppManagerWrapper::~AppManagerWrapper()
        }
 }
 
-void AppManagerWrapper::setCurrentAppId(std::string appId)
-{
-       m_curr_app_id = appId;
-}
-
-std::string AppManagerWrapper::getCurrentAppId() const
-{
-       return m_curr_app_id;
-}
-
-
 void AppManagerWrapper::registerAppListChangedCallbacks(IAppManagerAppListChangedCallbacks *callbacks)
 {
        if(callbacks == NULL)
old mode 100644 (file)
new mode 100755 (executable)
index cb0ea83..8cd8fb9
@@ -69,10 +69,6 @@ public:
 
        bool initializeAppInfo(ApplicationInformationPtr &appInfo);
 
-       // get the current application id from WRT
-       void setCurrentAppId(std::string appId);
-       std::string getCurrentAppId() const;
-
 private:
 
        static bool app_callback(package_info_app_component_type_e comp_type, const char *app_id, void *user_data);
old mode 100644 (file)
new mode 100755 (executable)
index 9e69946..45ac7cc
@@ -242,7 +242,18 @@ namespace {
 
        static std::string get_current_app_id()
        {
-               std::string appId = AppManagerWrapperSingleton::Instance().getCurrentAppId();
+               char *app_id = NULL;
+               int pid = getpid();
+               int ret = app_manager_get_app_id(pid, &app_id);
+               if (ret != APP_MANAGER_ERROR_NONE) {
+                       LoggerE("Fail to get appid");
+                       return "";
+               }
+
+               std::string appId = app_id;
+
+               free(app_id);
+
                return appId;
        }
        
old mode 100644 (file)
new mode 100755 (executable)
index 1c47280..f6ba7e5
@@ -16,6 +16,7 @@
 //
 
 #include "JSApplicationEventCallbackManager.h"
+#include <WebKitProxy.h>
 #include <Logger.h>
 
 namespace DeviceAPI {
@@ -225,14 +226,20 @@ void JSApplicationEventCallbackManager::makeCallback(JSContextRef context, JSObj
 
     if (JSObjectIsFunction(context, callback))
     {
+        JSValueRef exception = NULL;
+
         if (argc == 0)
         {
-                JSObjectCallAsFunction(context, callback, object, 0, NULL, NULL);
+            JSObjectCallAsFunction(context, callback, object, 0, NULL, &exception);
         }
         else
         {
-                JSObjectCallAsFunction(context, callback, object, argc, argv, NULL);
+            JSObjectCallAsFunction(context, callback, object, argc, argv, &exception);
         }
+
+        if (exception)
+            DeviceAPI::Common::WebKitProxy::reportException(context, exception);
+
         return;
     }
 }
old mode 100644 (file)
new mode 100755 (executable)
index ec3177c..8b18846
@@ -15,7 +15,6 @@
 // limitations under the License.
 //
 
-#include <dpl/wrt-dao-ro/widget_dao_read_only.h>
 #include <dpl/string.h>
 
 #include <Commons/plugin_initializer_def.h>
@@ -73,10 +72,6 @@ class_definition_options_t ApplicationConstructorOptions =
 void on_widget_start_callback(int widgetId) {
        LoggerD("[Tizen1_0\\Application] on_widget_start_callback ("<<widgetId<<")");
     Try {
-               WrtDB::WidgetDAOReadOnly dao(widgetId);
-               std::string tzAppId = DPL::ToUTF8String(dao.getTzAppId());
-               AppManagerWrapperSingleton::Instance().setCurrentAppId(tzAppId);
-
                TIME_TRACER_INIT();
         WrtAccessSingleton::Instance().initialize(widgetId);
     } Catch(WrtDeviceApis::Commons::Exception) {
index e0be866..2a182c2 100755 (executable)
@@ -681,18 +681,30 @@ void CalendarFilter::visitAttributeRange(std::string& attrName, DeviceAPI::Tizen
 
 void CalendarFilter::setType(CalendarEvent::CalendarType type)
 {
+    int ret;
     if(CalendarEvent::TASK_TYPE==type) {
         m_type = CalendarEvent::TASK_TYPE;
-        calendar_query_create(_calendar_todo._uri, &m_query);
+        ret = calendar_query_create(_calendar_todo._uri, &m_query);
+        if( CALENDAR_ERROR_NONE!=ret ) {
+            ThrowMsg(PlatformException, "Creating a query failed: "<<ret);
+        }
         if(CALENDAR_ERROR_NONE!=calendar_filter_create(_calendar_todo._uri, &m_filter)) LoggerW("Filter creation failed.");
     } else {
         m_type = CalendarEvent::EVENT_TYPE;
-        calendar_query_create(_calendar_event._uri, &m_query);
+        ret = calendar_query_create(_calendar_event._uri, &m_query);
+        if( CALENDAR_ERROR_NONE!=ret ) {
+            ThrowMsg(PlatformException, "Creating a query failed: "<<ret);
+        }
         if(CALENDAR_ERROR_NONE!=calendar_filter_create(_calendar_event._uri, &m_filter)) LoggerW("Filter creation failed.");
-
-        calendar_query_create(_calendar_instance_normal_calendar_book._uri, &m_normalInstanceQuery);
+        ret = calendar_query_create(_calendar_instance_normal_calendar_book._uri, &m_normalInstanceQuery);
+        if( CALENDAR_ERROR_NONE!=ret ) {
+            ThrowMsg(PlatformException, "Creating a query failed: "<<ret);
+        }
         if(CALENDAR_ERROR_NONE!=calendar_filter_create(_calendar_instance_normal_calendar_book._uri, &m_normalInstanceFilter)) LoggerW("Filter creation failed.");
-        calendar_query_create(_calendar_instance_allday_calendar_book._uri, &m_alldayInstanceQuery);
+        ret = calendar_query_create(_calendar_instance_allday_calendar_book._uri, &m_alldayInstanceQuery);
+        if( CALENDAR_ERROR_NONE!=ret ) {
+            ThrowMsg(PlatformException, "Creating a query failed: "<<ret);
+        }
         if(CALENDAR_ERROR_NONE!=calendar_filter_create(_calendar_instance_allday_calendar_book._uri, &m_alldayInstanceFilter)) LoggerW("Filter creation failed.");
     }
 }
index 1673584..da314bf 100755 (executable)
@@ -33,6 +33,7 @@
 #include <Logger.h>
 #include <Export.h>
 #include <GlobalContextManager.h>
+#include <FilterConverter.h>
 
 #include "JSCalendarManager.h"
 #include "CalendarConverter.h"
@@ -727,8 +728,7 @@ JSValueRef JSCalendar::find(JSContextRef context,
             onError = converter.toFunctionOrNull(arguments[1]);
         }
         JSCallbackManagerPtr cbm = JSCallbackManager::createObject(globalContext, onSuccess, onError);
-
-               cbm->setObject(thisObject);
+        cbm->setObject(thisObject);
 
         LoggerD("Proceed the find event to the platform.");
 
@@ -739,8 +739,16 @@ JSValueRef JSCalendar::find(JSContextRef context,
         dplEvent->copyAceCheckAccessFunction(privateObject);
 
         if (argumentCount>=3) {
-            if (JSValueIsObject(context, arguments[2])) {
-                dplEvent->setGenericFilter(filterConverter->toFilter(arguments[2]));
+         if (JSValueIsObject(context, arguments[2])) {
+                DeviceAPI::Tizen::FilterPtr filter = filterConverter->toFilter(arguments[2]);
+                if(filter)
+                {
+                    dplEvent->setGenericFilter(filter);
+                }
+                else
+                {
+                    ThrowMsg(ConversionException, "Wrong third parameter type.");
+                }
             } else if (JSValueIsNull(context, arguments[2])) {
                                LoggerD("Use default filter.");
             } else {
index 910087d..d59663e 100755 (executable)
@@ -14,6 +14,7 @@ SET(SRCS
   JSArray.cpp
   SecurityAccessor.cpp
   JSTizenSecurityObject.cpp
+  WebKitProxy.cpp
 )
 
 ADD_LIBRARY(${COMMON_TARGET_NAME} SHARED ${SRCS})
old mode 100644 (file)
new mode 100755 (executable)
index a038ce6..3d0424c
@@ -17,6 +17,7 @@
 
 #include "JSUtil.h"
 #include "PlatformException.h"
+#include <WKBundle.h>
 #include <cmath>
 #include <limits>
 
index 89ae146..76e3695 100755 (executable)
@@ -18,6 +18,7 @@
 #include "MultiCallbackUserData.h"
 #include "GlobalContextManager.h"
 #include "PlatformException.h"
+#include "WebKitProxy.h"
 #include "JSUtil.h"
 #include "Logger.h"
 
@@ -104,6 +105,9 @@ void MultiCallbackUserData::invokeCallback(const std::string &key, int count, JS
             JSValueRef exception = NULL;
             JSObjectCallAsFunction(mContext, callbackObject, NULL, count, obj, &exception);
 
+            if(exception)
+                WebKitProxy::reportException(mContext, exception);
+
             // check Exception in function call
             if( exception != NULL ){
                 throw UnknownException(mContext, exception);
@@ -123,7 +127,10 @@ void MultiCallbackUserData::invokeCallback(const std::string &key, int count, JS
     }
 
     if( itr->second ){
-        JSObjectCallAsFunction(mContext, itr->second , NULL, count, obj, NULL);
+        JSValueRef exception = NULL;
+        JSObjectCallAsFunction(mContext, itr->second , NULL, count, obj, &exception);
+        if(exception)
+            WebKitProxy::reportException(mContext, exception);
     }else{
         LOGE("The callback[%s] is NULL", key.c_str());
     }
diff --git a/src/Common/WebKitProxy.cpp b/src/Common/WebKitProxy.cpp
new file mode 100755 (executable)
index 0000000..fea717f
--- /dev/null
@@ -0,0 +1,38 @@
+//
+// Tizen Web Device API
+// Copyright (c) 2013 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "WebKitProxy.h"
+#include <WKBundle.h>
+#include "Logger.h"
+
+using namespace std;
+
+namespace DeviceAPI {
+namespace Common {
+
+void WebKitProxy::reportException(JSContextRef context, JSValueRef exception)
+{
+       LoggerW("Throwing exception to WebKit.");
+
+       if (exception)
+       {
+               WKBundleReportException(context, exception);
+       }
+}
+
+} // Common
+} // DeviceAPI
diff --git a/src/Common/WebKitProxy.h b/src/Common/WebKitProxy.h
new file mode 100755 (executable)
index 0000000..3fe5b4b
--- /dev/null
@@ -0,0 +1,35 @@
+//
+// Tizen Web Device API
+// Copyright (c) 2013 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#ifndef _WEBKIT_PROXY_H_
+#define _WEBKIT_PROXY_H_
+
+#include <JavaScriptCore/JavaScript.h>
+
+namespace DeviceAPI {
+namespace Common {
+
+class WebKitProxy
+{
+public:
+       static void reportException(JSContextRef ctx, JSValueRef exception);
+};
+
+} // Common
+} // DeviceAPI
+
+#endif //_WEBKIT_PROXY_H_
old mode 100644 (file)
new mode 100755 (executable)
index 9dbe2bc..f3686e4
@@ -22,6 +22,7 @@
  */
 
 #include "JSAddressBookChangeCallbackManager.h"
+#include <WebKitProxy.h>
 #include <Logger.h>
 
 namespace DeviceAPI {
@@ -235,16 +236,22 @@ void JSAddressBookChangeCallbackManager::makeCallback(JSContextRef context, JSOb
 
     if (JSObjectIsFunction(context, callback))
     {
+        JSValueRef exception = NULL;
+
         if (argc == 0)
         {
-                //LoggerD("Calling object directly, no arguments");
-                JSObjectCallAsFunction(context, callback, object, 0, NULL, NULL);
+            //LoggerD("Calling object directly, no arguments");
+            JSObjectCallAsFunction(context, callback, object, 0, NULL, &exception);
         }
         else
         {
-                //LoggerD("Calling object directly, one argument");
-                JSObjectCallAsFunction(context, callback, object, argc, argv, NULL);
+            //LoggerD("Calling object directly, one argument");
+            JSObjectCallAsFunction(context, callback, object, argc, argv, &exception);
         }
+
+        if (exception)
+            DeviceAPI::Common::WebKitProxy::reportException(context, exception);
+
         return;
     }
 }
old mode 100644 (file)
new mode 100755 (executable)
index b62bbdd..03cffe8
@@ -22,6 +22,7 @@
  */
 
 #include "JSContactManagerChangeCallbackManager.h"
+#include <WebKitProxy.h>
 #include <Logger.h>
 
 namespace DeviceAPI {
@@ -235,16 +236,22 @@ void JSContactManagerChangeCallbackManager::makeCallback(JSContextRef context, J
 
     if (JSObjectIsFunction(context, callback))
     {
-        if (argc == 0)
+        JSValueRef exception = NULL;
+
+       if (argc == 0)
         {
-                //LoggerD("Calling object directly, no arguments");
-                JSObjectCallAsFunction(context, callback, object, 0, NULL, NULL);
+            //LoggerD("Calling object directly, no arguments");
+            JSObjectCallAsFunction(context, callback, object, 0, NULL, &exception);
         }
         else
         {
-                //LoggerD("Calling object directly, one argument");
-                JSObjectCallAsFunction(context, callback, object, argc, argv, NULL);
+            //LoggerD("Calling object directly, one argument");
+            JSObjectCallAsFunction(context, callback, object, argc, argv, &exception);
         }
+
+        if (exception)
+               DeviceAPI::Common::WebKitProxy::reportException(context, exception);
+
         return;
     }
 }
old mode 100644 (file)
new mode 100755 (executable)
index 1759b33..2a7625f
@@ -16,6 +16,7 @@
 //
 
 #include "JSNetworkBearerSelectionCallbackManager.h"
+#include <WebKitProxy.h>
 #include <Logger.h>
 
 namespace DeviceAPI {
@@ -271,16 +272,22 @@ void JSNetworkBearerSelectionCallbackManager::makeCallback(JSContextRef context,
 
     if (JSObjectIsFunction(context, callback))
     {
+        JSValueRef exception = NULL;
+
         if (argc == 0)
         {
-                //LoggerD("Calling object directly, no arguments");
-                JSObjectCallAsFunction(context, callback, object, 0, NULL, NULL);
+            //LoggerD("Calling object directly, no arguments");
+            JSObjectCallAsFunction(context, callback, object, 0, NULL, &exception);
         }
         else
         {
-                //LoggerD("Calling object directly, one argument");
-                JSObjectCallAsFunction(context, callback, object, argc, argv, NULL);
+            //LoggerD("Calling object directly, one argument");
+            JSObjectCallAsFunction(context, callback, object, argc, argv, &exception);
         }
+
+        if (exception)
+            DeviceAPI::Common::WebKitProxy::reportException(context, exception);
+
         return;
     }
 }
old mode 100644 (file)
new mode 100755 (executable)
index a90141a..de48a63
@@ -196,9 +196,16 @@ static int get_current_pkg_id(char** pkg_id)
 {
        app_info_h handle;
 
-       string appId = PackageManager::getInstance()->getCurrentAppId();
+       char *app_id = NULL;
+       int pid = getpid();
+       int ret = app_manager_get_app_id(pid, &app_id);
+       if (ret != APP_MANAGER_ERROR_NONE) {
+               LoggerE("Fail to get appid");
+               return ret;
+       }
 
-       int ret = app_manager_get_app_info(appId.c_str(), &handle);
+       ret = app_manager_get_app_info(app_id, &handle);
+       free(app_id);
        if (ret != APP_MANAGER_ERROR_NONE) {
                LoggerE("Fail to get appinfo");
                return ret;
@@ -785,16 +792,6 @@ PackageManager* PackageManager::getInstance()
     return &instance;
 }
 
-void PackageManager::setCurrentAppId(string appId)
-{
-       m_curr_app_id = appId;
-}
-
-string PackageManager::getCurrentAppId() const
-{
-       return m_curr_app_id;
-}
-
 PackageManager::PackageManager()
 {
 }
old mode 100644 (file)
new mode 100755 (executable)
index b78e1bb..3da7e3c
@@ -117,10 +117,6 @@ public:
        void setPackageInfoEventListener(PackageInfoEventCallback * eventCB);
        void unsetPackageInfoEventListener();
 
-       // get the current application id from WRT
-       void setCurrentAppId(string appId);
-       string getCurrentAppId() const;
-       
        static PackageManager* getInstance();
 
 private:
old mode 100644 (file)
new mode 100755 (executable)
index e8993c2..6621585
@@ -15,7 +15,6 @@
 // limitations under the License.
 //
 
-#include <dpl/wrt-dao-ro/widget_dao_read_only.h>
 #include <dpl/string.h>
 
 #include <Commons/plugin_initializer_def.h>
@@ -37,10 +36,6 @@ void on_widget_start_callback(int widgetId) {
        LoggerD("[Tizen2_1\\Package] on_widget_start_callback ("<<widgetId<<")");
        TIME_TRACER_INIT();
     Try {
-        WrtDB::WidgetDAOReadOnly dao(widgetId);
-        std::string tzAppId = DPL::ToUTF8String(dao.getTzAppId());
-        PackageManager::getInstance()->setCurrentAppId(tzAppId);
-
         WrtAccessSingleton::Instance().initialize(widgetId);
     } Catch(WrtDeviceApis::Commons::Exception) {
         LoggerE("WrtAccess initialization failed");
index 9c33b43..1b63e60 100755 (executable)
@@ -274,6 +274,11 @@ void PowerManager::setPlatformBrightness(int brightness){
         LOGI("Current state is not normal state the value is saved in cache: %d", brightness);
         mShouldBeReadFromCache = true;
         return;
+    } else if( mCurrentState.mState == PowerState::SCREENBRIGHT ){
+        mCurrentBrightness = brightness;
+        LOGI("Current state is not normal state the value is saved in cache: %d", brightness);
+        mShouldBeReadFromCache = true;
+        return;
     }else
         mShouldBeReadFromCache = false;
 
old mode 100644 (file)
new mode 100755 (executable)
index b8ff000..7a200e6
@@ -307,6 +307,8 @@ PushManager::PushManager():
 {
     LOGD("Connecting to the push service...");
 
+       setAppId();
+
     int ret = push_connect(m_pkgId.c_str(), push_connection_state_cb, push_notify_cb, this, &m_connectionHandle);
     if (PUSH_ERROR_NONE!=ret) {
         LOGE("Error while connecting to the push service: %d", ret);
@@ -327,11 +329,21 @@ PushManager *PushManager::getInstance() {
     return &instance;
 }
 
-void PushManager::setAppId(std::string appId) {
+void PushManager::setAppId() {
     app_info_h handle;
     char *_pkg_id = NULL;
+    char *app_id = NULL;
+    int pid = getpid();
+    int ret = app_manager_get_app_id(pid, &app_id);
+    if (ret != APP_MANAGER_ERROR_NONE) {
+        LOGE("Fail to get appid");
+        return;
+    }
+
+    m_appId = app_id;
+    free(app_id);
 
-    int ret = app_manager_get_app_info(appId.c_str(), &handle);
+    ret = app_manager_get_app_info(m_appId.c_str(), &handle);
     if (ret != APP_MANAGER_ERROR_NONE) {
         LOGE("WrtAccess initialization failed");
         return;
@@ -348,7 +360,6 @@ void PushManager::setAppId(std::string appId) {
         return;
     }
 
-    m_appId = appId;
     if (_pkg_id) {
         m_pkgId = _pkg_id;
         free(_pkg_id);
old mode 100644 (file)
new mode 100755 (executable)
index a3663ee..9dcfbab
@@ -42,7 +42,7 @@ public:
     std::string getRegistrationId();
 
     static PushManager* getInstance();
-    static void setAppId(std::string appId);
+    void setAppId();
 
 private:
     PushManager();
old mode 100644 (file)
new mode 100755 (executable)
index 8f365fc..075cd09
@@ -15,7 +15,6 @@
 // limitations under the License.
 //
 
-#include <dpl/wrt-dao-ro/widget_dao_read_only.h>
 #include <dpl/string.h>
 
 #include <Commons/plugin_initializer_def.h>
@@ -41,8 +40,6 @@ void on_widget_start_callback(int widgetId)
     LOGD("[Tizen\\Push] on_widget_start_callback (%d)", widgetId);
        TIME_TRACER_INIT();
     try {
-        WrtDB::WidgetDAOReadOnly dao(widgetId);
-        PushManager::setAppId(DPL::ToUTF8String(dao.getTzAppId()));
         WrtAccessSingleton::Instance().initialize(widgetId);
     } catch (...) {
         LOGE("WrtAccess initialization failed");