3 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
5 * Licensed under the Flora License, Version 1.1 (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://floralicense.org/license/
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 #include <internal/widget_view_manager/widget_view_manager_impl.h>
22 #include <internal/widget_view/widget_view_impl.h>
25 #include <dali/public-api/object/type-registry.h>
26 #include <dali/public-api/object/type-registry-helper.h>
27 #include <dali/integration-api/debug.h>
28 #include <system_info.h>
29 #include <cynara-client.h>
33 #include <widget_errno.h>
34 #include <widget_instance.h>
35 #include <screen_connector_toolkit.h>
50 #define SMACK_LABEL_LENGTH 255
52 #if defined(DEBUG_ENABLED)
53 Integration::Log::Filter* gWidgetViewManagerLogging = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_WIDGET_VIEW_MANAGER" );
58 return Dali::BaseHandle();
61 DALI_TYPE_REGISTRATION_BEGIN( Dali::WidgetView::WidgetViewManager, Dali::BaseHandle, Create );
63 static bool IsWidgetFeatureEnabled()
65 static bool feature = false;
66 static bool retrieved = false;
69 if( retrieved == true )
72 ret = system_info_get_platform_bool( "http://tizen.org/feature/shell.appwidget", &feature );
73 if( ret != SYSTEM_INFO_ERROR_NONE )
83 static bool CheckPrivilege( const char* privilege )
88 char subjectLabel[SMACK_LABEL_LENGTH + 1] = "";
89 char uid[10] = { 0, };
90 const char* clientSession = "";
92 ret = cynara_initialize( &cynara, NULL );
93 if( ret != CYNARA_API_SUCCESS )
98 fd = open( "/proc/self/attr/current", O_RDONLY );
101 cynara_finish( cynara );
105 ret = read( fd, subjectLabel, SMACK_LABEL_LENGTH );
109 cynara_finish( cynara );
115 snprintf( uid, 10, "%d", getuid() );
117 ret = cynara_check( cynara, subjectLabel, clientSession, uid, privilege );
118 if( ret != CYNARA_API_ACCESS_ALLOWED )
120 cynara_finish( cynara );
124 cynara_finish( cynara );
129 } // unnamed namespace
131 WidgetViewManagerPtr WidgetViewManager::New( Application application, const std::string& name )
133 WidgetViewManagerPtr impl = new WidgetViewManager();
135 // Second-phase init of the implementation
136 if( impl->Initialize( application, name ) != WIDGET_ERROR_NONE )
138 DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::New: Fail to create WidgetViewManager.\n" );
145 WidgetViewManager::WidgetViewManager()
149 WidgetViewManager::~WidgetViewManager()
151 screen_connector_toolkit_fini(SCREEN_CONNECTOR_SCREEEN_TYPE_WIDGET);
152 widget_instance_unlisten_event( WidgetViewManager::WidgetEventCallback );
153 widget_instance_fini();
156 int WidgetViewManager::Initialize( Application application, const std::string& name )
158 if( !IsWidgetFeatureEnabled() )
160 DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::Initialize: Widget feature is not enabled.\n" );
161 return WIDGET_ERROR_NOT_SUPPORTED;
164 if( !CheckPrivilege( "http://tizen.org/privilege/widget.viewer" ) )
166 DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::Initialize: Privilege error.\n" );
167 return WIDGET_ERROR_PERMISSION_DENIED;
170 if( !bindtextdomain( PKGNAME, WIDGET_VIEWER_DALI_LOCALE ) )
172 DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::Initialize: bindtextdomain error.\n" );
175 // Binds tizen remote surface manager & connects callback
176 if( screen_connector_toolkit_init(SCREEN_CONNECTOR_SCREEEN_TYPE_WIDGET) < 0 )
178 return WIDGET_ERROR_FAULT;
181 // init widget service
182 widget_instance_init( name.c_str() );
183 widget_instance_listen_event( WidgetViewManager::WidgetEventCallback, this );
185 DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::Initialize: success.\n" );
187 return WIDGET_ERROR_NONE;
190 Dali::WidgetView::WidgetView WidgetViewManager::AddWidget( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
192 // Add a new widget view
193 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::New( widgetId, contentInfo, width, height, updatePeriod );
195 std::string instanceId;
196 Property::Value value = widgetView.GetProperty( Dali::WidgetView::WidgetView::Property::INSTANCE_ID );
197 value.Get( instanceId );
199 if( !instanceId.empty() )
201 Dali::WidgetView::GetImplementation( widgetView ).WidgetTerminatedSignal().Connect( this, &WidgetViewManager::OnTerminatedWidget );
204 mWidgetViewContainer.insert( std::pair<std::string, Dali::WidgetView::WidgetView>( instanceId, widgetView ) );
207 DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::AddWidget: success [%s]\n", widgetId.c_str() );
212 void WidgetViewManager::OnTerminatedWidget( Dali::WidgetView::WidgetView widgetView )
214 std::string instanceId;
215 Dali::Property::Value value = widgetView.GetProperty( Dali::WidgetView::WidgetView::Property::INSTANCE_ID );
217 if( value.Get( instanceId ) && !instanceId.empty() && mWidgetViewContainer.size() > 0 )
219 WidgetViewIter iter = mWidgetViewContainer.find( instanceId );
220 if( iter != mWidgetViewContainer.end() )
222 mWidgetViewContainer.erase( iter );
226 DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::OnTerminatedWidget: Widget is deleted!\n" );
229 int WidgetViewManager::WidgetEventCallback( const char* widgetId, const char* instanceId, int event, void* data )
231 WidgetViewManager* widgetViewManager = static_cast< WidgetViewManager* >( data );
233 if( widgetViewManager->mWidgetViewContainer.size() > 0)
235 WidgetViewIter iter = widgetViewManager->mWidgetViewContainer.find( std::string( instanceId ) );
236 if( iter != widgetViewManager->mWidgetViewContainer.end() )
238 Dali::WidgetView::WidgetView widgetView = iter->second;
240 Dali::WidgetView::GetImplementation( widgetView ).SendWidgetEvent( event );
246 DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::WidgetEventCallback: WidgetView is not found! [%s, %s]\n", widgetId, instanceId );
251 } // namespace Internal
253 } // namespace WidgetView