Fix null dereference in widget viewer dali
[platform/core/uifw/widget-viewer-dali.git] / internal / widget_view / widget_view_impl.cpp
1 /*
2  * Samsung API
3  * Copyright (c) 2016 Samsung Electronics Co., Ltd.
4  *
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
8  *
9  * http://floralicense.org/license/
10  *
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.
16  */
17
18 // CLASS HEADER
19 #include <internal/widget_view/widget_view_impl.h>
20
21 // INTERNAL INCLUDES
22
23 // EXTERNAL INCLUDES
24 #include <dali/public-api/common/stage.h>
25 #include <dali/public-api/events/touch-data.h>
26 #include <dali/public-api/events/wheel-event.h>
27 #include <dali/public-api/images/native-image.h>
28 #include <dali/public-api/object/type-registry.h>
29 #include <dali/public-api/object/type-registry-helper.h>
30 #include <dali-toolkit/public-api/visuals/visual-properties.h>
31 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
32 #include <dali/integration-api/debug.h>
33 #include <string.h>
34 #include <Ecore_Input.h>
35 #include <widget_service.h>
36 #include <widget_instance.h>
37 #include <tzplatform_config.h>
38 #include <wayland-extension/tizen-extension-client-protocol.h>
39 #include <aul_rsm_viewer.h>
40
41 namespace Dali
42 {
43
44 namespace WidgetView
45 {
46
47 namespace Internal
48 {
49
50 namespace
51 {
52
53 #define WIDGET_VIEW_RESOURCE_DEFAULT_IMG "/widget_viewer_dali/images/unknown.png"
54
55 #if defined(DEBUG_ENABLED)
56 Integration::Log::Filter* gWidgetViewLogging  = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_WIDGET_VIEW" );
57 #endif
58
59 BaseHandle Create()
60 {
61   return Dali::BaseHandle();
62 }
63
64 // Setup properties, signals and actions using the type-registry.
65 DALI_TYPE_REGISTRATION_BEGIN( Dali::WidgetView::WidgetView, Toolkit::Control, Create );
66 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetId", BOOLEAN, WIDGET_ID )
67 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "instanceId", BOOLEAN, INSTANCE_ID )
68 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "contentInfo", BOOLEAN, CONTENT_INFO )
69 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "title", BOOLEAN, TITLE )
70 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "updatePeriod", BOOLEAN, UPDATE_PERIOD )
71 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "preview", MAP, PREVIEW )
72 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "loadingText", MAP, LOADING_TEXT )
73 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetStateFaulted", BOOLEAN, WIDGET_STATE_FAULTED )
74 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "permanentDelete", BOOLEAN, PERMANENT_DELETE )
75
76 // Signals
77 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetAdded", SIGNAL_WIDGET_ADDED )
78 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetDeleted", SIGNAL_WIDGET_DELETED )
79 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetCreationAborted", SIGNAL_WIDGET_CREATION_ABORTED )
80 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetContentUpdated", SIGNAL_WIDGET_CONTENT_UPDATED )
81 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetUpdatePeriodChanged", SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED )
82 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetFaulted", SIGNAL_WIDGET_FAULTED )
83
84 // Actions
85 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "pauseWidget", ACTION_WIDGETVIEW_PAUSE_WIDGET );
86 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "resumeWidget", ACTION_WIDGETVIEW_RESUME_WIDGET );
87 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "cancelTouchEvent", ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT );
88 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "activateFaultedWidget", ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET );
89
90 DALI_TYPE_REGISTRATION_END()
91
92 static Eina_Bool OnKeyDown( void* data, int type, void* eventInfo )
93 {
94   Ecore_Event_Key *event = static_cast< Ecore_Event_Key* >( eventInfo );
95   tizen_remote_surface* surface = static_cast< tizen_remote_surface* >( data );
96
97   tizen_remote_surface_transfer_key_event( surface,
98                                            TIZEN_REMOTE_SURFACE_EVENT_TYPE_KEY_DOWN,
99                                            event->keycode,
100                                            ecore_device_class_get(event->dev),
101                                            ecore_device_subclass_get(event->dev),
102                                            ecore_device_identifier_get(event->dev),
103                                            event->timestamp
104                                          );
105
106   return EINA_TRUE;
107 }
108
109 static Eina_Bool OnKeyUp(void* data, int type, void* eventInfo)
110 {
111   Ecore_Event_Key *event = static_cast< Ecore_Event_Key* >( eventInfo );
112   tizen_remote_surface* surface = static_cast< tizen_remote_surface* >( data );
113
114   tizen_remote_surface_transfer_key_event( surface,
115                                            TIZEN_REMOTE_SURFACE_EVENT_TYPE_KEY_UP,
116                                            event->keycode,
117                                            ecore_device_class_get(event->dev),
118                                            ecore_device_subclass_get(event->dev),
119                                            ecore_device_identifier_get(event->dev),
120                                            event->timestamp
121                                          );
122   return EINA_TRUE;
123 }
124
125 static void OnSurfaceUpdate( struct tizen_remote_surface* surface, wl_buffer* buffer, uint32_t time, void* data )
126 {
127   Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
128
129   if( widgetView )
130   {
131     if( !widgetView->IsWidgetImageView() )
132     {
133       tizen_remote_surface_transfer_visibility( surface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE);
134
135       widgetView->CreateWidgetImageView();
136       widgetView->ConnectSignal( surface );
137       ecore_event_handler_add( ECORE_EVENT_KEY_DOWN, OnKeyDown, surface );
138       ecore_event_handler_add( ECORE_EVENT_KEY_UP, OnKeyUp, surface );
139     }
140
141     //get tbm surface from buffer
142     tbm_surface_h tbmSurface = static_cast< tbm_surface_h >( wl_buffer_get_user_data( buffer ) );
143     widgetView->UpdateImageSource( tbmSurface );
144   }
145 }
146
147 static void OnSurfaceMissing( struct tizen_remote_surface* surface, void* data )
148 {
149   //ToDo: WidgetDeletedSignal
150 }
151
152
153 static struct aul_rsm_handler_s remoteSurfaceHandler = {
154   OnSurfaceUpdate,
155   OnSurfaceMissing,
156 };
157
158 } // unnamed namespace
159
160 Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
161 {
162   // Create the implementation, temporarily owned on stack
163   IntrusivePtr< WidgetView > internalWidgetView = new WidgetView( widgetId, contentInfo, width, height, updatePeriod );
164
165   // Pass ownership to CustomActor
166   Dali::WidgetView::WidgetView widgetView( *internalWidgetView );
167
168   // Second-phase init of the implementation
169   // This can only be done after the CustomActor connection has been made...
170   internalWidgetView->Initialize();
171
172   return widgetView;
173 }
174
175 WidgetView::WidgetView()
176 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
177   mWidgetId(),
178   mInstanceId(),
179   mContentInfo(),
180   mTitle(),
181   mBundle( NULL ),
182   mWidth( 0 ),
183   mHeight( 0 ),
184   mPid( 0 ),
185   mUpdatePeriod( 0.0 ),
186   mPreviewVisible( true ),
187   mStateTextVisible( true ),
188   mPermanentDelete( true )
189 {
190 }
191
192 WidgetView::WidgetView( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
193 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
194   mWidgetId( widgetId ),
195   mInstanceId(),
196   mContentInfo( contentInfo ),
197   mTitle(),
198   mBundle( NULL ),
199   mWidth( width ),
200   mHeight( height ),
201   mPid( 0 ),
202   mUpdatePeriod( updatePeriod ),
203   mPreviewVisible( true ),
204   mStateTextVisible( true ),
205   mPermanentDelete( true )
206 {
207 }
208
209 WidgetView::~WidgetView()
210 {
211   if( !mWidgetId.empty() && !mInstanceId.empty() )
212   {
213     widget_instance_terminate( mInstanceId.c_str() );
214
215     if( mPermanentDelete )
216     {
217       widget_instance_destroy( mInstanceId.c_str() );
218     }
219   }
220
221   if( mBundle )
222   {
223     bundle_free( mBundle );
224   }
225 }
226
227 bool WidgetView::PauseWidget()
228 {
229   int ret = widget_instance_pause( mInstanceId.c_str() );
230   if( ret < 0 )
231   {
232     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Fail to pause widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
233     return false;
234   }
235
236   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Widget is paused (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
237
238   return true;
239 }
240
241 bool WidgetView::ResumeWidget()
242 {
243   int ret = widget_instance_resume( mInstanceId.c_str() );
244   if( ret < 0 )
245   {
246     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Fail to resume widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
247     return false;
248   }
249
250   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Widget is resumed (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
251
252   return true;
253 }
254
255 const std::string& WidgetView::GetWidgetId() const
256 {
257   return mWidgetId;
258 }
259
260 const std::string& WidgetView::GetInstanceId() const
261 {
262   return mInstanceId;
263 }
264
265 const std::string& WidgetView::GetContentInfo()
266 {
267   widget_instance_h instance;
268   char* contentInfo = NULL;
269
270   mContentInfo.clear();
271
272   if( mWidgetId.empty() || mInstanceId.empty() )
273   {
274     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Widget id (%s) or instance id (%s) is invalid.\n", mWidgetId.c_str(), mInstanceId.c_str() );
275     return mContentInfo;
276   }
277
278   instance = widget_instance_get_instance( mWidgetId.c_str(), mInstanceId.c_str() );
279   if( !instance )
280   {
281     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: widget_instance_get_instance is failed. [%s]\n", mInstanceId.c_str() );
282     return mContentInfo;
283   }
284
285   if( widget_instance_get_content( instance, &contentInfo ) < 0 )
286   {
287     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Failed to get content of widget. [%s]\n", mInstanceId.c_str() );
288     return mContentInfo;
289   }
290
291   mContentInfo = reinterpret_cast< char* >( contentInfo );
292
293   return mContentInfo;
294 }
295
296 const std::string& WidgetView::GetTitle()
297 {
298   //ToDo: We should add some codes by considering widget_viewer_evas
299   if( mTitle.empty() )
300   {
301     mTitle = widget_service_get_name( mWidgetId.c_str(), NULL );
302   }
303
304   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetTitle: title = %s\n", mTitle.c_str() );
305
306   return mTitle;
307 }
308
309 float WidgetView::GetUpdatePeriod() const
310 {
311   return mUpdatePeriod;
312 }
313
314 bool WidgetView::CancelTouchEvent()
315 {
316   if( mRemoteSurface )
317   {
318     tizen_remote_surface_transfer_touch_cancel( mRemoteSurface );
319     return true;
320   }
321
322   return false;
323 }
324
325 void WidgetView::ShowPreview( bool show )
326 {
327   if( mPreviewImage && show != mPreviewVisible )
328   {
329     mPreviewVisible = show;
330     mPreviewImage.SetVisible( show );
331   }
332 }
333
334 bool WidgetView::IsPreviewVisible()
335 {
336   return mPreviewVisible;
337 }
338
339 void WidgetView::ShowStateText( bool show )
340 {
341   if( mStateText && mStateTextVisible != show )
342   {
343     mStateTextVisible = show;
344     mStateText.SetVisible( show );
345   }
346 }
347
348 bool WidgetView::IsStateTextVisible()
349 {
350   return mStateTextVisible;
351 }
352
353 void WidgetView::ActivateFaultedWidget()
354 {
355   if( mPid < 0 )
356   {
357     // Esable preview and text
358     if( mPreviewVisible )
359     {
360       mPreviewImage.SetVisible( true );
361     }
362
363     if( mStateTextVisible )
364     {
365       mStateText.SetVisible( true );
366     }
367
368     // launch widget again
369     mPid = widget_instance_launch( mInstanceId.c_str(), (char *)mContentInfo.c_str(), mWidth, mHeight );
370     if( mPid < 0)
371     {
372       DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
373
374       // Emit signal
375       Dali::WidgetView::WidgetView handle( GetOwner() );
376       mWidgetCreationAbortedSignal.Emit( handle );
377
378       return;
379     }
380
381     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
382   }
383 }
384
385 bool WidgetView::IsWidgetFaulted()
386 {
387   return mPid < 0 ? true : false;
388 }
389
390 void WidgetView::SetPermanentDelete( bool permanentDelete )
391 {
392   mPermanentDelete = permanentDelete;
393 }
394
395 bool WidgetView::IsPermanentDelete()
396 {
397   return mPermanentDelete;
398 }
399
400 void WidgetView::CreateWidgetImageView()
401 {
402   Any source;
403   mImageSource = Dali::NativeImageSource::New( source );
404   Dali::NativeImage image = Dali::NativeImage::New( *mImageSource );
405
406   mWidgetImageView = Dali::Toolkit::ImageView::New( image );
407
408   mWidgetImageView.SetParentOrigin( ParentOrigin::CENTER );
409   mWidgetImageView.SetAnchorPoint( AnchorPoint::CENTER );
410   mWidgetImageView.SetSize( mWidth, mHeight );
411
412   Self().Add( mWidgetImageView );
413
414   // Disable preview and text
415   if( mPreviewVisible )
416   {
417     mPreviewImage.SetVisible( false );
418   }
419
420   if( mStateTextVisible )
421   {
422     mStateText.SetVisible( false );
423   }
424
425   // Emit signal
426   Dali::WidgetView::WidgetView handle( GetOwner() );
427   mWidgetAddedSignal.Emit( handle );
428
429   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::AddObjectView: ObjectView is added.\n" );
430 }
431
432 void WidgetView::RemoveObjectView()
433 {
434   // Enable preview and text
435   if( mPreviewVisible )
436   {
437     mPreviewImage.SetVisible( true );
438   }
439
440   if( mStateTextVisible )
441   {
442     mStateText.SetVisible( true );
443   }
444
445   // Emit signal
446   Dali::WidgetView::WidgetView handle( GetOwner() );
447   mWidgetDeletedSignal.Emit( handle );
448
449   mWidgetImageView.Reset();
450
451   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveObjectView: ObjectView is removed.\n" );
452 }
453
454 void WidgetView::SendWidgetEvent( int event )
455 {
456   Dali::WidgetView::WidgetView handle( GetOwner() );
457
458   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::SendWidgetEvent: event = %d widget = %s\n", event,  mWidgetId.c_str() );
459
460   // Emit signal
461   switch( event )
462   {
463     case WIDGET_INSTANCE_EVENT_UPDATE:
464     {
465       mWidgetContentUpdatedSignal.Emit( handle );
466       break;
467     }
468     case WIDGET_INSTANCE_EVENT_PERIOD_CHANGED:
469     {
470       mWidgetUpdatePeriodChangedSignal.Emit( handle );
471       break;
472     }
473     case WIDGET_INSTANCE_EVENT_FAULT:
474     {
475       mWidgetFaultedSignal.Emit( handle );
476       break;
477     }
478     default:
479     {
480       break;
481     }
482   }
483 }
484
485 bool WidgetView::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
486 {
487   Dali::BaseHandle handle( object );
488
489   bool connected( true );
490   Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
491
492   if( strcmp( signalName.c_str(), SIGNAL_WIDGET_ADDED ) == 0 )
493   {
494     widgetView.WidgetAddedSignal().Connect( tracker, functor );
495   }
496   else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_DELETED ) == 0 )
497   {
498     widgetView.WidgetDeletedSignal().Connect( tracker, functor );
499   }
500   else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CREATION_ABORTED ) == 0 )
501   {
502     widgetView.WidgetCreationAbortedSignal().Connect( tracker, functor );
503   }
504   else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CONTENT_UPDATED ) == 0 )
505   {
506     widgetView.WidgetContentUpdatedSignal().Connect( tracker, functor );
507   }
508   else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED ) == 0 )
509   {
510     widgetView.WidgetUpdatePeriodChangedSignal().Connect( tracker, functor );
511   }
512   else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_FAULTED ) == 0 )
513   {
514     widgetView.WidgetFaultedSignal().Connect( tracker, functor );
515   }
516   else
517   {
518     // signalName does not match any signal
519     connected = false;
520   }
521
522   return connected;
523 }
524
525 bool WidgetView::DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes )
526 {
527   bool ret = true;
528
529   Dali::BaseHandle handle( object );
530   Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
531
532   if( !widgetView )
533   {
534     return false;
535   }
536
537   WidgetView& impl = GetImplementation( widgetView );
538
539   if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_PAUSE_WIDGET ) == 0 )
540   {
541     impl.PauseWidget();
542   }
543   else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_RESUME_WIDGET ) == 0 )
544   {
545     impl.ResumeWidget();
546   }
547   else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT ) == 0 )
548   {
549     impl.CancelTouchEvent();
550   }
551   else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET ) == 0 )
552   {
553     impl.ActivateFaultedWidget();
554   }
555   else
556   {
557     ret = false;
558   }
559
560   return ret;
561 }
562
563 void WidgetView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
564 {
565   Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
566
567   if( widgetView )
568   {
569     WidgetView& impl = GetImplementation( widgetView );
570
571     switch( index )
572     {
573       case Dali::WidgetView::WidgetView::Property::PREVIEW:
574       {
575         bool previewEnabled;
576         if( value.Get( previewEnabled ) )
577         {
578           impl.ShowPreview( previewEnabled );
579         }
580         break;
581       }
582       case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
583       {
584         bool textEnabled;
585         if( value.Get( textEnabled ) )
586         {
587           impl.ShowStateText( textEnabled );
588         }
589         break;
590       }
591       case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
592       {
593         bool del;
594         if( value.Get( del ) )
595         {
596           impl.SetPermanentDelete( del );
597         }
598         break;
599       }
600     }
601   }
602 }
603
604 Property::Value WidgetView::GetProperty( BaseObject* object, Property::Index index )
605 {
606   Property::Value value;
607   Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
608
609   if( widgetView )
610   {
611     WidgetView& impl = GetImplementation( widgetView );
612
613     switch( index )
614     {
615       case Dali::WidgetView::WidgetView::Property::WIDGET_ID:
616       {
617         value = impl.GetWidgetId();
618         break;
619       }
620       case Dali::WidgetView::WidgetView::Property::INSTANCE_ID:
621       {
622         value = impl.GetInstanceId();
623         break;
624       }
625       case Dali::WidgetView::WidgetView::Property::CONTENT_INFO:
626       {
627         value = impl.GetContentInfo();
628         break;
629       }
630       case Dali::WidgetView::WidgetView::Property::TITLE:
631       {
632         value = impl.GetTitle();
633         break;
634       }
635       case Dali::WidgetView::WidgetView::Property::UPDATE_PERIOD:
636       {
637         value = impl.GetUpdatePeriod();
638         break;
639       }
640       case Dali::WidgetView::WidgetView::Property::PREVIEW:
641       {
642         value = impl.IsPreviewVisible();
643         break;
644       }
645       case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
646       {
647         value = impl.IsStateTextVisible();
648         break;
649       }
650       case Dali::WidgetView::WidgetView::Property::WIDGET_STATE_FAULTED:
651       {
652         value = impl.IsWidgetFaulted();
653         break;
654       }
655       case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
656       {
657         value = impl.IsPermanentDelete();
658         break;
659       }
660     }
661   }
662
663   return value;
664 }
665
666 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetAddedSignal()
667 {
668   return mWidgetAddedSignal;
669 }
670
671 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetDeletedSignal()
672 {
673   return mWidgetDeletedSignal;
674 }
675
676 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetCreationAbortedSignal()
677 {
678   return mWidgetCreationAbortedSignal;
679 }
680
681 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetContentUpdatedSignal()
682 {
683   return mWidgetContentUpdatedSignal;
684 }
685
686 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetUpdatePeriodChangedSignal()
687 {
688   return mWidgetUpdatePeriodChangedSignal;
689 }
690
691 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetFaultedSignal()
692 {
693   return mWidgetFaultedSignal;
694 }
695
696 void WidgetView::OnInitialize()
697 {
698   char* instanceId = NULL;
699   char* previewPath = NULL;
700   std::string previewImage;
701   widget_size_type_e sizeType;
702
703   int ret = widget_instance_create( mWidgetId.c_str(), &instanceId );
704   if( ret < 0 || !instanceId )
705   {
706     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is failed [%s].\n", mWidgetId.c_str() );
707     return;
708   }
709
710   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is called. [widget id = %s, instance id = %s]\n",
711                  mWidgetId.c_str(), instanceId );
712
713   mInstanceId = instanceId;
714
715   // Preview image
716   widget_service_get_size_type( mWidth, mHeight, &sizeType );
717
718   previewPath = widget_service_get_preview_image_path( mWidgetId.c_str(), sizeType );
719   if( previewPath )
720   {
721     previewImage = previewPath;
722     free( previewPath );
723   }
724   else
725   {
726     previewImage = tzplatform_getenv( TZ_SYS_SHARE );
727     previewImage.append( WIDGET_VIEW_RESOURCE_DEFAULT_IMG );
728   }
729
730   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: preview image path = %s\n", previewImage.c_str() );
731
732   mPreviewImage = Toolkit::ImageView::New( previewImage );
733
734   mPreviewImage.SetParentOrigin( ParentOrigin::CENTER );
735   mPreviewImage.SetAnchorPoint( AnchorPoint::CENTER );
736
737   if( !previewPath )
738   {
739     mPreviewImage.SetSize( mWidth, mHeight );
740   }
741
742   Self().SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
743   Self().Add( mPreviewImage );
744
745   // State text
746   // TODO: use po files
747   mStateText = Toolkit::TextLabel::New( "Loading..." );
748
749   mStateText.SetParentOrigin( ParentOrigin::CENTER );
750   mStateText.SetAnchorPoint( AnchorPoint::CENTER );
751   mStateText.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
752   mStateText.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
753
754   mPreviewImage.Add( mStateText );
755
756   // launch widget
757   mPid = widget_instance_launch( instanceId, (char *)mContentInfo.c_str(), mWidth, mHeight );
758   if( mPid < 0)
759   {
760     DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
761
762     // Emit signal
763     Dali::WidgetView::WidgetView handle( GetOwner() );
764     mWidgetCreationAbortedSignal.Emit( handle );
765
766     return;
767   }
768
769   aul_rsm_viewer_set_surface_handler( mInstanceId.c_str(), &remoteSurfaceHandler, this );
770
771   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
772
773 }
774
775 void WidgetView::OnStageConnection( int depth )
776 {
777   Control::OnStageConnection( depth );
778 }
779
780 void WidgetView::OnStageDisconnection()
781 {
782   Control::OnStageDisconnection();
783 }
784
785 void WidgetView::OnSizeSet( const Vector3& targetSize )
786 {
787   if( mWidgetImageView )
788   {
789     mWidgetImageView.SetSize( targetSize );
790   }
791 }
792
793 bool WidgetView::IsWidgetImageView()
794 {
795   return ( mWidgetImageView )? true: false;
796 }
797
798 void WidgetView::UpdateImageSource( tbm_surface_h source )
799 {
800   mImageSource->SetSource( source );
801   Dali::Stage::GetCurrent().KeepRendering( 0.0f );
802 }
803
804 void WidgetView::ConnectSignal( tizen_remote_surface* surface )
805 {
806   if( mWidgetImageView )
807   {
808     mRemoteSurface = surface;
809     mWidgetImageView.TouchSignal().Connect( this, &WidgetView::OnTouch );
810     mWidgetImageView.WheelEventSignal().Connect( this, &WidgetView::OnWheelEvent );
811   }
812
813 }
814
815 bool WidgetView::OnTouch( Dali::Actor actor, const Dali::TouchData& event )
816 {
817   tizen_remote_surface_event_type type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_NONE;
818
819   switch( event.GetState( 0 ) )
820   {
821     case Dali::PointState::UP:
822     {
823       type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP;
824       break;
825     }
826     case Dali::PointState::DOWN:
827     {
828       type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN;
829       break;
830     }
831     case Dali::PointState::MOTION:
832     {
833       type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE;
834       break;
835     }
836     default:
837     {
838       return false;
839     }
840   }
841
842   tizen_remote_surface_transfer_mouse_event( mRemoteSurface,
843                                              type,
844                                              event.GetDeviceId( 0 ),
845                                              1,
846                                              event.GetLocalPosition( 0 ).x,
847                                              event.GetLocalPosition( 0 ).y,
848                                              event.GetEllipseRadius( 0 ).x,
849                                              event.GetEllipseRadius( 0 ).y,
850                                              event.GetPressure( 0 ),
851                                              event.GetAngle( 0 ).degree,
852                                              TIZEN_INPUT_DEVICE_CLAS_MOUSE,
853                                              TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
854                                              "",
855                                              event.GetTime()
856                                            );
857   return true;
858 }
859
860 bool WidgetView::OnWheelEvent( Dali::Actor actor, const Dali::WheelEvent& event )
861 {
862   tizen_remote_surface_transfer_mouse_wheel( mRemoteSurface,
863                                              event.direction,
864                                              event.z,
865                                              TIZEN_INPUT_DEVICE_CLAS_MOUSE,
866                                              TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
867                                              "",
868                                              event.timeStamp
869                                            );
870   return true;
871 }
872
873 Vector3 WidgetView::GetNaturalSize()
874 {
875   Vector3 size;
876   size.x = mWidth;
877   size.y = mHeight;
878
879   if( size.x > 0 && size.y > 0 )
880   {
881     size.z = std::min( size.x, size.y );
882     return size;
883   }
884   else
885   {
886     return Control::GetNaturalSize();
887   }
888 }
889
890 float WidgetView::GetHeightForWidth( float width )
891 {
892   if( mWidth > 0 && mHeight > 0 )
893   {
894     return GetHeightForWidthBase( width );
895   }
896   else
897   {
898     return Control::GetHeightForWidthBase( width );
899   }
900 }
901
902 float WidgetView::GetWidthForHeight( float height )
903 {
904   if( mWidth > 0 && mHeight > 0 )
905   {
906     return GetWidthForHeightBase( height );
907   }
908   else
909   {
910     return Control::GetWidthForHeightBase( height );
911   }
912 }
913
914 } // namespace Internal
915
916 } // namespace WidgetView
917
918 } // namespace Dali