#include <FGrp_Screen.h>
#include <FIo_DatabaseImpl.h>
#include <FIo_NormalFile.h>
+#include <FSys_SettingInfoImpl.h>
#include <FSys_SystemResource.h>
#include <FSys_VibratorImpl.h>
#include <FUi_Control.h>
#include <FUi_CoordinateSystemUtils.h>
#include <FUi_EcoreEvasMgr.h>
#include <FUi_EcoreEvas.h>
+#include <FUi_ResourceManager.h>
#include <FUi_ResourceSizeInfo.h>
#include <FUi_Window.h>
#include <FUiAnim_EflNode.h>
static const int PORTRAIT_KEYPAD_HEIGHT = 444;
static const int LANDSCAPE_KEYPAD_HEIGHT = 316;
-static const int DEFAULT_LIST_ITEM_COUNT = 4;
-
-
-Eina_Bool
-AddHttpHeaderData(const Eina_Hash* pHash, const void* pKey, void* pValue, void* pUserData)
-{
- result r = E_SUCCESS;
-
- String key(reinterpret_cast< const char* >(pKey));
- String value(reinterpret_cast< char* >(pValue));
-
- SysLog(NID_WEB_CTRL, "The current value of key is %ls, value is %ls", key.GetPointer(), value.GetPointer());
-
- r = reinterpret_cast< HttpHeader* >(pUserData)->AddField(key, value);
- SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
-
- return EINA_TRUE;
-}
+static const int DEFAULT_LIST_ITEM_COUNT = 5;
Eina_Bool
std::unique_ptr<String> pAttrValue(new (std::nothrow) String(reinterpret_cast< char* >(pValue)));
SysTryReturn(NID_WEB_CTRL, pAttrKey.get() && pAttrValue.get(), EINA_FALSE, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
- SysLog(NID_WEB_CTRL, "The current value of key is %ls, value is %ls", pAttrKey->GetPointer(), pAttrValue->GetPointer());
+ SysSecureLog(NID_WEB_CTRL, "The current value of key is %ls, value is %ls", pAttrKey->GetPointer(), pAttrValue->GetPointer());
r = reinterpret_cast< HashMap* >(pUserData)->Add(*pAttrKey, *pAttrValue);
SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
CATCH:
ewk_view_javascript_prompt_reply(pView, null);
- return EINA_FALSE;
+ return EINA_TRUE;
+}
+
+
+Eina_Bool
+_WebImpl::OnBeforeUnloadConfirmRequested(Evas_Object* pView, const char* pMessage, void* pUserData)
+{
+ _WebImpl* pWebImpl = reinterpret_cast< _WebImpl* >(pUserData);
+ SysAssertf(pWebImpl, "Failed to request");
+ result r = E_SUCCESS;
+
+ String msg(pMessage);
+
+ r = pWebImpl->ShowUserConfirmPopupAsync(USER_BEFORE_UNLOAD_CONFIRM, pView, msg);
+ SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+ return EINA_TRUE;
+
+CATCH:
+ ewk_view_javascript_confirm_reply(pView, EINA_FALSE);
+ return EINA_TRUE;
}
_WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
SysAssertf(pImpl , "Failed to request");
+ _SystemResource* pSysResource = _SystemResource::GetInstance();
+ SysAssertf(pSysResource != null, "Failed to get _SystemResource instance");
+
const char* pHostName = ewk_security_origin_host_get(pSecOrigin);
String msg;
- result r = msg.Format(256, L"Allow %s to use offline application cache?", pHostName);
+ result r = msg.Format(256, pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_TPLATFORM_BODY_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE").GetPointer(), _StringConverter::CopyToCharArrayN(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_THIS_WEBPAGE")), pHostName);
SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
r = pImpl->ShowUserConfirmPopup(USER_CONFIRM_APP_CACHE, pView, msg);
_WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
SysAssertf(pImpl , "Failed to request");
+ _SystemResource* pSysResource = _SystemResource::GetInstance();
+ SysAssertf(pSysResource != null, "Failed to get _SystemResource instance");
+
const char* pHostName = ewk_security_origin_host_get(pSecOrigin);
String msg;
- result r = msg.Format(512, L"%s Used %lld of storage. Allow %s to use upto 2GB of indexed db?", pHostName, currentQuota, pHostName);
+ result r = msg.Format(512, pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_TPLATFORM_BODY_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE").GetPointer(), _StringConverter::CopyToCharArrayN(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_THIS_WEBPAGE")), pHostName);
SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
r = pImpl->ShowUserConfirmPopup(USER_CONFIRM_INDEXED_DB_QUOTA_EXCEDED, pView, msg);
_WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
SysAssertf(pImpl , "Failed to request");
+ _SystemResource* pSysResource = _SystemResource::GetInstance();
+ SysAssertf(pSysResource != null, "Failed to get _SystemResource instance");
+
const char* pHostName = ewk_security_origin_host_get(pSecOrigin);
String msg;
- result r = msg.Format(512, L"Allow %s to open %s use upto %lld of web database?", pHostName, database_name, expectedQuota);
+ result r = msg.Format(512, pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_TPLATFORM_BODY_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE").GetPointer(), _StringConverter::CopyToCharArrayN(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_THIS_WEBPAGE")), pHostName);
SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
r = pImpl->ShowUserConfirmPopup(USER_CONFIRM_DB_QUOTA_EXCEDED, pView, msg);
_WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
SysAssertf(pImpl , "Failed to request");
+ _SystemResource* pSysResource = _SystemResource::GetInstance();
+ SysAssertf(pSysResource != null, "Failed to get _SystemResource instance");
+
const char* pHostName = ewk_security_origin_host_get(pSecOrigin);
String msg;
- result r = msg.Format(512, L"%s Used %lld of storgae. Allow %s to use upto 2GB of file system?", pHostName, currentQuota, pHostName);
+ result r = msg.Format(512, pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_TPLATFORM_BODY_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE").GetPointer(), _StringConverter::CopyToCharArrayN(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_THIS_WEBPAGE")), pHostName);
SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
r = pImpl->ShowUserConfirmPopup(USER_CONFIRM_LOCAL_FS_QUOTA_EXCEDED, pView, msg);
String uriScheme(uri.GetScheme());
SysSecureLog(NID_WEB_CTRL, "The current value of scheme is %ls", uriScheme.GetPointer());
- if ((uriScheme != L"http") && (uriScheme != L"https") && (uriScheme != L"file"))
+ if ((uriScheme != L"http") && (uriScheme != L"https") && (uriScheme != L"file") && (uriScheme != L""))
{
- ewk_policy_decision_ignore(pPolicy);
-
- if (uriScheme == L"")
- {
- return;
- }
-
result r = E_SUCCESS;
if (uriScheme == L"tel")
String operationId(L"http://tizen.org/appcontrol/operation/view");
r = _AppControlImpl::FindAndStart(operationId, &url, null, null, null, null);
}
- SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
- return;
+ if (r == E_SUCCESS)
+ {
+ ewk_policy_decision_ignore(pPolicy);
+
+ return;
+ }
}
ewk_policy_decision_use(pPolicy);
if (code >= REDIRECTION_HEADER_GROUP && code < REDIRECTION_HEADER_GROUP + 100)
{
pImpl->SetRedirectRequested(true);
- mime = L"";
}
ILoadingListener* pLoadingListener = pImpl->GetLoadingListener();
if (pLoadingListener)
{
- const Eina_Hash* pHeader = ewk_policy_decision_response_headers_get(pPolicy);
HttpHeader httpHeader;
- eina_hash_foreach(pHeader, AddHttpHeaderData, &httpHeader);
- SysTryCatch(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
+ Eina_Iterator* iterator = eina_hash_iterator_tuple_new(ewk_policy_decision_response_headers_get(pPolicy));
+ if (iterator)
+ {
+ Eina_Hash_Tuple *tuple = null;
+
+ EINA_ITERATOR_FOREACH(iterator, tuple)
+ {
+ String key(reinterpret_cast< const char* >(tuple->key));
+ String value(reinterpret_cast< char* >(tuple->data));
+
+ SysSecureLog(NID_WEB_CTRL, "The current value of key is %ls, value is %ls", key.GetPointer(), value.GetPointer());
+
+ r = httpHeader.AddField(key, value);
+ SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, eina_iterator_free(iterator), r, "[%s] Propagating.", GetErrorMessage(r));
+ }
+
+ eina_iterator_free(iterator);
+ }
pImpl->SetPolicyDecision(pLoadingListener->OnWebDataReceived(mime, httpHeader));
}
String redirectUrl(pImpl->GetRedirectUri(url, currentUrl, mime));
if (redirectUrl != L"")
{
- pImpl->LoadUrl(redirectUrl);
ewk_policy_decision_ignore(pPolicy);
+ pImpl->LoadUrl(redirectUrl);
+
return;
}
r = _AppControlImpl::FindAndStart(operationId, &url, &mime, null, null, null);
SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS || r == E_OBJ_NOT_FOUND, r, "[%s] Propagating.", GetErrorMessage(r));
+ if (r == E_OBJ_NOT_FOUND)
+ {
+ String operationId(L"http://tizen.org/appcontrol/operation/download");
+
+ r = _AppControlImpl::FindAndStart(operationId, &url, null, null, null, null);
+ SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
+ }
return;
}
SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
pEventArg.release();
}
+}
+
+void
+OnLoadingCommitted(void* pUserData, Evas_Object* pView, void* pEventInfo)
+{
+ evas_object_focus_set(pView, EINA_FALSE);
}
{
pFormImpl->DeflateClientRectHeight(pXformer->TransformVertical(rect.height));
- if (pFormImpl->HasFooter())
- {
- pFormImpl->GetCore().SetKeypadShowState(true);
- pFormImpl->Draw();
- }
+ pFormImpl->Invalidate(false);
}
if (pImpl->GetWebKeypadEventListener())
pImpl->GetWebKeypadEventListener()->OnWebKeypadWillOpen(*dynamic_cast< Web* >(&pImpl->GetPublic()));
}
}
+
pImpl->SetPreviousKeypadBounds(rect);
}
else
pImpl->SetKeypadVisibleState(true);
+ _FormImpl* pFormImpl = pImpl->GetParentFormImpl(dynamic_cast< _ControlImpl* >(pImpl));
+ if (pFormImpl)
+ {
+ _ICoordinateSystemTransformer* pXformer = _CoordinateSystem::GetInstance()->GetInverseTransformer();
+ SysAssertf(pXformer, "Failed to get CoordinateTransformer");
+
+ pFormImpl->DeflateClientRectHeight(pXformer->TransformVertical(pImpl->GetPreviousKeypadBounds().height));
+
+ if (pFormImpl->HasFooter())
+ {
+ pFormImpl->GetCore().SetKeypadShowState(true);
+ pFormImpl->Draw();
+ }
+ }
+
if (pImpl->GetWebKeypadEventListener())
{
pImpl->GetWebKeypadEventListener()->OnWebKeypadOpened(*static_cast< Web* >(&pImpl->GetPublic()));
{
pFormImpl->DeflateClientRectHeight(0);
+ pFormImpl->Invalidate(false);
+
if (pFormImpl->HasFooter())
{
pFormImpl->GetCore().SetKeypadShowState(false);
if (pImpl->IsWinFocusLost() == true)
{
- if (pImpl->IsKeypadOpened() == true)
- {
- evas_object_focus_set(pWebCore->GetWebNativeNode(), EINA_TRUE);
- }
-
Ewk_Settings* pSettings = ewk_view_settings_get(pWebCore->GetWebNativeNode());
SysAssertf(pSettings, "Failed to get settings instance.");
evas_object_focus_set(pWebCore->GetWebNativeNode(), EINA_TRUE);
}
+ else if (pImpl->IsKeypadOpened() == true)
+ {
+ evas_object_focus_set(pWebCore->GetWebNativeNode(), EINA_TRUE);
+ }
}
}
{
pImpl->SetKeypadOpened(false);
}
+ else if (pImpl->IsWinFocusLost() == true && pImpl->IsFocused() == false)
+ {
+ _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));
+ SysAssertf(pWebCore, "Failed to get Web core object");
+
+ evas_object_focus_set(pWebCore->GetWebNativeNode(), EINA_FALSE);
+ }
}
_WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
SysAssertf(pImpl, "Failed to request");
- if (pImpl->IsWinFocusLost() == true)
- {
- _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));
- SysAssertf(pWebCore, "Failed to get Web core object");
+ _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));
+ SysAssertf(pWebCore, "Failed to get Web core object");
+ Eina_Rectangle leftHandle;
+ Eina_Rectangle rightHandle;
+
+ EINA_RECTANGLE_SET(&leftHandle, 0, 0, 0, 0);
+ EINA_RECTANGLE_SET(&rightHandle, 0, 0, 0, 0);
+
+ if (pImpl->IsWinFocusLost() == true && ewk_view_text_selection_range_get(pWebCore->GetWebNativeNode(), &leftHandle, &rightHandle))
+ {
Ewk_Settings* pSettings = ewk_view_settings_get(pWebCore->GetWebNativeNode());
SysAssertf(pSettings, "Failed to get settings instance.");
, __pNotificationConfirmPopup(null)
, __pScriptAlertConfirmPopup(null)
, __pScriptConfirmPopup(null)
+ , __pBeforeUnloadConfirmPopup(null)
, __pAppCacheConfirmPopup(null)
, __pDbQuotaConfirmPopup(null)
, __pLocalFsQuotaConfirmPopup(null)
pWebManager->RemoveActiveWeb(this);
CATCH:
+ _SettingInfoImpl::RemoveSettingEventListener(*this);
RemoveEventListenerCallback();
-
ClearCertificateDb();
}
{
std::unique_ptr<char[]> pUrl(_StringConverter::CopyToCharArrayN(url));
SysTryReturn(NID_WEB_CTRL, pUrl.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
-
+
Eina_Hash* pHttpHeader = ConvertToSlpHeaderN(header);
ewk_view_url_request_set(__pWebCore->GetWebNativeNode(), pUrl.get(), EWK_HTTP_METHOD_GET, pHttpHeader, null);
std::unique_ptr<_SelectBox> pSelectBox(new (std::nothrow) _SelectBox());
SysTryReturnResult(NID_WEB_CTRL, pSelectBox.get(), E_OUT_OF_MEMORY, "Memory allocation failed.");
- r = pSelectBox->Construct(isMultiSelect, title, DEFAULT_LIST_ITEM_COUNT, pWebView);
+ if (isMultiSelect)
+ {
+ r = pSelectBox->Construct(this, isMultiSelect, title, DEFAULT_LIST_ITEM_COUNT - 1, pWebView);
+ }
+ else
+ {
+ r = pSelectBox->Construct(this, isMultiSelect, title, DEFAULT_LIST_ITEM_COUNT, pWebView);
+ }
SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
r = pSelectBox->UpdateList(pItems, selectedIndex, false, false);
evas_object_smart_callback_add(pWebNativeNode, "load,stop", OnLoadingCanceled, this);
evas_object_smart_callback_add(pWebNativeNode, "load,error", OnLoadingErrorOccurred, this);
evas_object_smart_callback_add(pWebNativeNode, "title,changed", OnPageTitleReceived, this);
+ evas_object_smart_callback_add(pWebNativeNode, "load,committed", OnLoadingCommitted, this);
evas_object_smart_callback_add(pWebNativeNode, "requestToNative,json", OnHandleJavaScriptRequest, this);
ewk_view_javascript_alert_callback_set(pWebNativeNode, OnScriptAlertRequested, const_cast< _WebImpl* >(this));
ewk_view_javascript_prompt_callback_set(pWebNativeNode, OnScriptPromptRequested, const_cast< _WebImpl* >(this));
ewk_view_javascript_confirm_callback_set(pWebNativeNode, OnScriptConfirmRequested, const_cast< _WebImpl* >(this));
+ ewk_view_before_unload_confirm_panel_callback_set(pWebNativeNode, OnBeforeUnloadConfirmRequested, const_cast< _WebImpl* >(this));
evas_object_smart_callback_add(pWebNativeNode, "policy,response,decide", OnWebDataReceived, this);
evas_object_smart_callback_del(pWebNativeNode, "load,stop", OnLoadingCanceled);
evas_object_smart_callback_del(pWebNativeNode, "load,error", OnLoadingErrorOccurred);
evas_object_smart_callback_del(pWebNativeNode, "title,changed", OnPageTitleReceived);
+ evas_object_smart_callback_del(pWebNativeNode, "load,committed", OnLoadingCommitted);
evas_object_smart_callback_del(pWebNativeNode, "requestToNative,json", OnHandleJavaScriptRequest);
ewk_view_javascript_alert_callback_set(pWebNativeNode, null, null);
ewk_view_javascript_prompt_callback_set(pWebNativeNode, null, null);
ewk_view_javascript_confirm_callback_set(pWebNativeNode, null, null);
+ ewk_view_before_unload_confirm_panel_callback_set(pWebNativeNode, null, null);
evas_object_smart_callback_del(pWebNativeNode, "policy,response,decide", OnWebDataReceived);
break;
}
+ case USER_BEFORE_UNLOAD_CONFIRM:
+ {
+ __pBeforeUnloadConfirmPopup.reset();
+
+ __pBeforeUnloadConfirmPopup = std::move(pUserConfirmPopup);
+
+ r = __pBeforeUnloadConfirmPopup->ShowPopup();
+ SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pBeforeUnloadConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r));
+
+ break;
+ }
default:
break;
}
r = InitializeSetting();
SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+ _SettingInfoImpl::AddSettingEventListener(*this);
+
_WebManager* pWebManager = _WebManager::GetInstance();
pWebManager->AddWeb(reinterpret_cast< int >(this));
}
void
+_WebImpl::OnSettingChanged(String& key)
+{
+ Evas_Object* pWebview = __pWebCore->GetWebNativeNode();
+ if (!pWebview)
+ {
+ return;
+ }
+
+ if (key == L"http://tizen.org/setting/font.type")
+ {
+ ewk_view_use_settings_font(pWebview);
+ }
+}
+
+
+void
_WebImpl::OnChangeLayout(_ControlRotation rotation)
{
+ Evas_Object* pWebview = __pWebCore->GetWebNativeNode();
+ if (!pWebview)
+ {
+ return;
+ }
+
int degree = 0;
switch (rotation)
default:
SysAssert(false);
}
- ewk_view_orientation_send(__pWebCore->GetWebNativeNode(), degree);
+ ewk_view_orientation_send(pWebview, degree);
}
pWebNotification = static_cast< _WebNotification* >(pEnum->GetCurrent());
pWebNotification->OnChangeLayout();
}
+
+ if (IsKeypadVisible())
+ {
+ _ICoordinateSystemTransformer* pXformer = _CoordinateSystem::GetInstance()->GetInverseTransformer();
+ SysAssertf(pXformer, "Failed to get CoordinateTransformer");
+
+ _FormImpl* pFormImpl = GetParentFormImpl(dynamic_cast< _ControlImpl* >(this));
+ pFormImpl->DeflateClientRectHeight(pXformer->TransformVertical(GetPreviousKeypadBounds().height));
+ }
}
void
_WebImpl::OnAncestorVisibleStateChanged(const _Control& control)
{
+ Evas_Object* pWebview = __pWebCore->GetWebNativeNode();
+ if (!pWebview)
+ {
+ return;
+ }
+
_WebManager* pWebManager = _WebManager::GetInstance();
if (IsVisible() == true)
{
pWebManager->SetActiveWeb(this);
- ewk_view_page_visibility_state_set(__pWebCore->GetWebNativeNode(), EWK_PAGE_VISIBILITY_STATE_VISIBLE, false);
+ ewk_view_page_visibility_state_set(pWebview, EWK_PAGE_VISIBILITY_STATE_VISIBLE, false);
}
else
{
pWebManager->RemoveActiveWeb(this);
- ewk_view_page_visibility_state_set(__pWebCore->GetWebNativeNode(), EWK_PAGE_VISIBILITY_STATE_HIDDEN, false);
+ ewk_view_page_visibility_state_set(pWebview, EWK_PAGE_VISIBILITY_STATE_HIDDEN, false);
}
}
case ID_USER_SCRIPT_CONFIRM_CLOSE:
__pScriptConfirmPopup.reset();
break;
+
+ case ID_USER_BEFORE_UNLOAD_CONFIRM_CLOSE:
+ __pBeforeUnloadConfirmPopup.reset();
+ break;
+
+ case ID_USER_SCRIPT_SELECTBOX_CLOSE:
+ __pSelectBox.reset();
+ break;
default:
break;
}