From: Minkyu Kang Date: Thu, 16 Apr 2015 08:01:37 +0000 (+0900) Subject: fix exception handling X-Git-Tag: submit/tizen/20150419.212422 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2aa0f4577d46a251f49541df14d345705c934e80;p=profile%2Ftv%2Fapps%2Fnative%2Fvideoplayer.git fix exception handling this patch contain following changes. set pointers to NULL before use return false when failed initializing controls add more ASSERT macros Change-Id: Id110981687047056085adc75ddbe48e90fa4cfbc Signed-off-by: Minkyu Kang --- diff --git a/include/mediadata.h b/include/mediadata.h index ddfdbd3..493adcd 100644 --- a/include/mediadata.h +++ b/include/mediadata.h @@ -27,8 +27,8 @@ private: static bool sm_GetMediaInfo(media_info_h media_h, void *dt); public: - CMediaData(void); - virtual ~CMediaData(void); + CMediaData(void) : m(0) {} + virtual ~CMediaData(void) {} bool Create(const char *path); void Destroy(void); diff --git a/include/view_player.h b/include/view_player.h index 1a3b2f3..7e790f5 100644 --- a/include/view_player.h +++ b/include/view_player.h @@ -38,7 +38,7 @@ private: SPlayerView *m; private: - void m_ControlInit(SPlayerParam *param); + bool m_ControlInit(SPlayerParam *param); bool m_UiInit(void); bool m_AddControls(void); void m_UpdateInfoBar(void); diff --git a/src/control.cpp b/src/control.cpp index 583ca56..649c547 100644 --- a/src/control.cpp +++ b/src/control.cpp @@ -27,8 +27,6 @@ #define MAX_CONTROL_BTNS 6 -struct SControlData; - struct _event_cb { void (*func)(void *data, const char *ev); void *data; @@ -45,13 +43,11 @@ struct SControlData { void CVideoController::sm_CbEvent(void *dt, Evas_Object *obj, const char *emission, const char *source) { - struct SControlData *data; + ASSERT(dt); - if (!dt) - return; + struct SControlData *data; data = (SControlData *)dt; - data->cb.func(data->cb.data, source); } @@ -79,8 +75,6 @@ void CVideoController::m_SetFocusDirection(Evas_Object **btn, int count) Evas_Object *CVideoController::m_AddButton(const char *style) { - ASSERT(m); - Evas_Object *btn; btn = elm_button_add(m->base); @@ -95,8 +89,6 @@ Evas_Object *CVideoController::m_AddButton(const char *style) int CVideoController::m_AddControls(const char **btns, int count) { - ASSERT(m); - int i; char buf[32]; @@ -136,7 +128,7 @@ bool CVideoController::Create(Evas_Object *base, const char **btns, int count) m = new SControlData; if (!m) { - _ERR("failed to add slider"); + _ERR("allocation failed"); return false; } @@ -213,8 +205,7 @@ void CVideoController::Show(void) void CVideoController::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) { - if (!obj) - return; + ASSERT(obj); if (!elm_object_focus_get(obj)) elm_object_focus_set(obj, EINA_TRUE); @@ -222,5 +213,7 @@ void CVideoController::OnMouseMove(int id, Evas *e, Evas_Object *obj, void CVideoController::OnMouseClicked(int id, Evas_Object *obj) { + ASSERT(obj); + elm_object_signal_emit(obj, SIG_BTN_ANI_START, ""); } diff --git a/src/mediadata.cpp b/src/mediadata.cpp index 94dcbfa..89e2294 100644 --- a/src/mediadata.cpp +++ b/src/mediadata.cpp @@ -30,19 +30,10 @@ struct SMediaData { CVideoData *video; }; -CMediaData::CMediaData(void) -{ - m = NULL; - media_content_connect(); -} - -CMediaData::~CMediaData(void) -{ - media_content_disconnect(); -} - bool CMediaData::sm_GetMediaInfo(media_info_h media_h, void *dt) { + ASSERT(dt); + SMediaData *md; md = (SMediaData *)dt; @@ -52,7 +43,8 @@ bool CMediaData::sm_GetMediaInfo(media_info_h media_h, void *dt) media_info_get_modified_time(media_h, &md->time); md->video = new CVideoData; - md->video->Update(media_h); + if (md->video) + md->video->Update(media_h); return true; } @@ -84,13 +76,21 @@ bool CMediaData::Create(const char *path) m = new SMediaData; if (!m) { _ERR("allocation failed"); + media_filter_destroy(filter); return false; } + m->name = NULL; + m->path = NULL; + m->video = NULL; + + media_content_connect(); + r = media_info_foreach_media_from_db(filter, sm_GetMediaInfo, m); if (r != MEDIA_CONTENT_ERROR_NONE) { _ERR("MEDIA CONTENT ERROR: %d", r); media_filter_destroy(filter); + media_content_disconnect(); delete m; m = NULL; @@ -107,11 +107,12 @@ void CMediaData::Destroy(void) { ASSERT(m); + media_content_disconnect(); + free(m->name); free(m->path); delete m->video; - m->video = NULL; delete m; m = NULL; diff --git a/src/playermgr.cpp b/src/playermgr.cpp index b18aab2..b2d4ecf 100644 --- a/src/playermgr.cpp +++ b/src/playermgr.cpp @@ -117,6 +117,8 @@ bool CPlayer::Create(Evas_Object *win, const char *path, const char *playlist) } m->win = win; + m->player = NULL; + m->ffrew_timer = NULL; m->display_mode = E_FULL_SCREEN; m->audio_effect = 0; m->rew_speed = 0; @@ -126,6 +128,8 @@ bool CPlayer::Create(Evas_Object *win, const char *path, const char *playlist) if (!m->media_list) { _ERR("play list is null"); delete m; + m = NULL; + return false; } @@ -135,6 +139,8 @@ bool CPlayer::Create(Evas_Object *win, const char *path, const char *playlist) if (player_create(&m->player) != PLAYER_ERROR_NONE) { _ERR("PLAYER CREATION ERROR"); delete m; + m = NULL; + return false; } @@ -163,13 +169,13 @@ void CPlayer::Destroy(void) bool CPlayer::m_Play(const char *path) { - ASSERT(m); ASSERT(m->player); int r; - if (player_set_uri(m->player, path) != PLAYER_ERROR_NONE) { - _ERR("PLAYER SET URI ERROR"); + r = player_set_uri(m->player, path); + if (r != PLAYER_ERROR_NONE) { + _ERR("PLAYER SET URI ERROR: %d", r); return false; } @@ -222,10 +228,6 @@ bool CPlayer::Play(void) return r; path = GetPath(); - if (!path) { - _ERR("video path is NULL"); - return false; - } r = m_Play(path); @@ -263,26 +265,23 @@ bool CPlayer::Next(bool repeat) const char *CPlayer::GetPath(void) { ASSERT(m); + ASSERT(m->media_list); const char *path; - if (!m->media_list) { - _ERR("invalid parameter"); - return NULL; - } - path = (const char *)eina_list_nth(m->media_list, m->current); + ASSERT(path); return path; } bool CPlayer::Pause(void) { - player_state_e state; - ASSERT(m); ASSERT(m->player); + player_state_e state; + GetState(&state); if (state == PLAYER_STATE_PAUSED) return true; @@ -297,11 +296,11 @@ bool CPlayer::Pause(void) bool CPlayer::Resume(void) { - player_state_e state; - ASSERT(m); ASSERT(m->player); + player_state_e state; + GetState(&state); if (state == PLAYER_STATE_PLAYING) return true; @@ -426,13 +425,12 @@ int CPlayer::GetCurrent(void) Eina_Bool CPlayer::sm_CbFFRew(void *dt) { + ASSERT(dt); + CPlayer *p; SPlayerData *m; int pos; - if (!dt) - return ECORE_CALLBACK_CANCEL; - p = (CPlayer *)dt; m = p->m; diff --git a/src/slider.cpp b/src/slider.cpp index 8a873b1..dc9eefc 100644 --- a/src/slider.cpp +++ b/src/slider.cpp @@ -53,10 +53,9 @@ static void _get_timestr(char *str, int size, unsigned int ms) Eina_Bool CVideoSlider::sm_CbSeekSet(void *dt) { - SSliderData *data; + ASSERT(dt); - if (!dt) - return ECORE_CALLBACK_CANCEL; + SSliderData *data; data = (SSliderData *)dt; @@ -69,15 +68,14 @@ Eina_Bool CVideoSlider::sm_CbSeekSet(void *dt) void CVideoSlider::sm_CbSeekComplete(void *dt) { + ASSERT(dt); + SSliderData *data; char str[32]; int pos; bool r; update_action action; - if (!dt) - return; - data = (SSliderData *)dt; if (data->pos != -1) { @@ -106,14 +104,13 @@ void CVideoSlider::sm_CbSeekComplete(void *dt) Eina_Bool CVideoSlider::sm_CbTimer(void *dt) { + ASSERT(dt); + SSliderData *data; int pos; bool r; char str[32]; - if (!dt) - return ECORE_CALLBACK_CANCEL; - data = (SSliderData *)dt; if (!data->player) @@ -181,14 +178,16 @@ bool CVideoSlider::Create(Evas_Object *base, CPlayer *player) m = new SSliderData; if (!m) { - _ERR("failed to add slider"); + _ERR("allocation fail"); return false; } slider = elm_slider_add(base); if (!slider) { _ERR("failed to add slider"); - return true; + delete m; + m = NULL; + return false; } elm_slider_indicator_show_set(slider, EINA_FALSE); @@ -235,6 +234,8 @@ void CVideoSlider::m_SeekStart(Evas_Object *obj) void CVideoSlider::m_SeekEnd(Evas_Object *obj) { + ASSERT(m); + int v; v = elm_slider_value_get(obj); @@ -250,6 +251,8 @@ void CVideoSlider::m_SeekEnd(Evas_Object *obj) void CVideoSlider::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { + ASSERT(obj); + if (strcmp(ev->keyname, KEY_RIGHT) && strcmp(ev->keyname, KEY_LEFT)) return; @@ -260,6 +263,8 @@ void CVideoSlider::OnKeyDown(int id, Evas *e, Evas_Object *obj, void CVideoSlider::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) { + ASSERT(obj); + if (strcmp(ev->keyname, KEY_RIGHT) && strcmp(ev->keyname, KEY_LEFT)) return; @@ -270,20 +275,23 @@ void CVideoSlider::OnKeyUp(int id, Evas *e, Evas_Object *obj, void CVideoSlider::OnMouseDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Down *ev) { + ASSERT(obj); + m_SeekStart(obj); } void CVideoSlider::OnMouseUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Up *ev) { + ASSERT(obj); + m_SeekEnd(obj); } void CVideoSlider::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) { - if (!obj) - return; + ASSERT(obj); if (!elm_object_focus_get(obj)) elm_object_focus_set(obj, EINA_TRUE); @@ -291,11 +299,15 @@ void CVideoSlider::OnMouseMove(int id, Evas *e, Evas_Object *obj, void CVideoSlider::OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item) { + ASSERT(m); + elm_object_signal_emit(m->base, SIG_SLIDER_FOCUS, ""); } void CVideoSlider::OnUnfocused(int id, Evas_Object *obj, Elm_Object_Item *item) { + ASSERT(m); + elm_object_signal_emit(m->base, SIG_SLIDER_UNFOCUS, ""); } diff --git a/src/view_player.cpp b/src/view_player.cpp index 1537620..4bb5317 100644 --- a/src/view_player.cpp +++ b/src/view_player.cpp @@ -119,13 +119,11 @@ void CPlayerView::m_UpdateInfoBar(void) /* Source */ /* FIXME: when usb path is decided, this logic should be changed */ path = m->mediadata->GetPath(); - if (path) { - if (!strncmp(path, SOURCE_TV_PATH, SOURCE_PATH_LEN)) - source = SOURCE_TV; - else - source = SOURCE_USB; - elm_object_part_text_set(m->base, PART_SOURCETEXT, _(source)); - } + if (!strncmp(path, SOURCE_TV_PATH, SOURCE_PATH_LEN)) + source = SOURCE_TV; + else + source = SOURCE_USB; + elm_object_part_text_set(m->base, PART_SOURCETEXT, _(source)); /* Playlist Count */ snprintf(buf, sizeof(buf), "%d/%d", @@ -148,8 +146,6 @@ bool CPlayerView::m_PlayerInit(void) bool r; r = m->player->Play(); - if (r < 0) - return false; path = m->player->GetPath(); @@ -167,7 +163,7 @@ bool CPlayerView::m_PlayerInit(void) timeout_handler_reset(m->timeout_handle); } - return true; + return r; } void CPlayerView::sm_EvtRewindBtn(void *dt) @@ -477,21 +473,29 @@ bool CPlayerView::m_AddControls(void) m->control->AddHandler(sm_EvtControlBtn, m); - if (!m->slider->Create(m->base, m->player)) + if (!m->slider->Create(m->base, m->player)) { + m->control->Destroy(); return false; + } - if (!m->volume->Create(m->win)) + if (!m->volume->Create(m->win)) { + m->control->Destroy(); + m->slider->Destroy(); return false; + } m->timeout_handle = timeout_handler_init(TIMEOUT_VIDEOPLAYER, sm_CbTimeoutEvent, m, sm_CbEcoreEvent, m); + if (!m->timeout_handle) { + m->control->Destroy(); + m->slider->Destroy(); + m->volume->Destroy(); + return false; + } eext_object_event_callback_add(m->base, EEXT_CALLBACK_BACK, sm_EvtBack, m); - if (!m->timeout_handle) - return false; - return true; } @@ -512,36 +516,42 @@ Eina_Bool CPlayerView::sm_CbDrawAnimation(void *dt) return ECORE_CALLBACK_CANCEL; } -void CPlayerView::m_ControlInit(SPlayerParam *param) +bool CPlayerView::m_ControlInit(SPlayerParam *param) { - bool r; - m->mediadata = new CMediaData; - if (!m->mediadata) + if (!m->mediadata) { _ERR("mediadata init failed"); + return false; + } if (param->id) m->id = strdup(param->id); m->player = new CPlayer; - if (!m->player) + if (!m->player) { _ERR("player init failed"); - - r = m->player->Create(m->win, param->filepath, param->playlist); - if (!r) - _ERR("player creation failed"); + return false; + } m->control = new CVideoController; - if (!m->control) + if (!m->control) { _ERR("control init failed"); + return false; + } m->volume = new CVolume; - if (!m->volume) + if (!m->volume) { _ERR("volume init failed"); + return false; + } m->slider = new CVideoSlider; - if (!m->slider) + if (!m->slider) { _ERR("slider init failed"); + return false; + } + + return true; } bool CPlayerView::m_UiInit(void) @@ -584,6 +594,7 @@ bool CPlayerView::Create(void *data) ASSERT(data); Evas_Object *win; + SPlayerParam *param; bool r; win = CViewMgr::GetInstance()->Window(); @@ -596,18 +607,38 @@ bool CPlayerView::Create(void *data) } m->win = win; + m->player = NULL; + m->volume = NULL; + m->control = NULL; + m->slider = NULL; + m->mediadata = NULL; + m->timeout_handle = NULL; + m->drawanim_timer = NULL; + + param = (SPlayerParam *)data; - m_ControlInit((SPlayerParam *)data); + r = m_ControlInit(param); + if (!r) { + _ERR("failed to init Controls"); + goto err; + } r = m_UiInit(); if (!r) { _ERR("failed to init UI"); - goto err; + goto err_control; + } + + r = m->player->Create(m->win, param->filepath, param->playlist); + if (!r) { + _ERR("player creation failed"); + goto err_control; } - if (!m_PlayerInit()) { + r = m_PlayerInit(); + if (!r) { _ERR("failed to play video"); - goto err; + goto err_player; } m->player->SetCompletedCb(sm_CbPlayComplete, m); @@ -625,6 +656,12 @@ bool CPlayerView::Create(void *data) return true; +err_player: + m->player->Destroy(); +err_control: + m->control->Destroy(); + m->slider->Destroy(); + m->volume->Destroy(); err: m_Fini(); return false; @@ -633,32 +670,17 @@ err: void CPlayerView::m_Fini(void) { ecore_timer_del(m->drawanim_timer); - m->drawanim_timer = NULL; delete m->mediadata; - m->mediadata = NULL; - - m->player->Destroy(); - delete m->player; - m->player = NULL; timeout_handler_fini(m->timeout_handle); - m->timeout_handle = NULL; free(m->id); - m->id = NULL; - m->volume->Destroy(); + delete m->player; delete m->volume; - m->volume = NULL; - - m->control->Destroy(); delete m->control; - m->control = NULL; - - m->slider->Destroy(); delete m->slider; - m->slider = NULL; delete m; m = NULL; @@ -670,6 +692,11 @@ void CPlayerView::Destroy(void) CBaseView::Destroy(); + m->player->Destroy(); + m->volume->Destroy(); + m->control->Destroy(); + m->slider->Destroy(); + m_Fini(); } diff --git a/src/volume.cpp b/src/volume.cpp index 0ced574..6bb62e4 100644 --- a/src/volume.cpp +++ b/src/volume.cpp @@ -46,6 +46,7 @@ void CVolume::m_SetMute(bool mute) return; m->volume = vol; + sound_manager_set_volume(SOUND_TYPE_MEDIA, 0); } else { sound_manager_set_volume(SOUND_TYPE_MEDIA, m->volume); } @@ -90,9 +91,6 @@ void CVolume::m_UpdateVolume(void) char buf[8]; int r; - if (!m->bar) - return; - r = sound_manager_get_volume(SOUND_TYPE_MEDIA, &vol); if (r != SOUND_MANAGER_ERROR_NONE) { _ERR("get volume error"); @@ -115,10 +113,9 @@ void CVolume::m_UpdateVolume(void) Eina_Bool CVolume::sm_CbTimer(void *dt) { - SVolumeData *data; + ASSERT(dt); - if (!dt) - return ECORE_CALLBACK_CANCEL; + SVolumeData *data; data = (SVolumeData *)dt; @@ -160,17 +157,9 @@ bool CVolume::Create(Evas_Object *base) Evas_Object *ly; Evas_Object *bar; - m = new SVolumeData; - if (!m) { - _ERR("allocation fail"); - return false; - } - ly = elm_layout_add(base); - if (!ly) { - delete m; + if (!ly) return false; - } elm_layout_file_set(ly, EDJEFILE, GRP_VOLUME); elm_win_resize_object_add(base, ly); @@ -179,7 +168,6 @@ bool CVolume::Create(Evas_Object *base) bar = elm_progressbar_add(ly); if (!bar) { _ERR("failed to create progressbar"); - delete m; evas_object_del(ly); return false; } @@ -191,8 +179,16 @@ bool CVolume::Create(Evas_Object *base) elm_object_part_content_set(ly, PART_VOLUME_BAR, bar); evas_object_show(bar); + m = new SVolumeData; + if (!m) { + _ERR("allocation fail"); + evas_object_del(ly); + return false; + } + m->ly = ly; m->bar = bar; + m->timer = NULL; sound_manager_set_session_type(SOUND_SESSION_TYPE_EXCLUSIVE); @@ -204,6 +200,7 @@ void CVolume::Destroy(void) ASSERT(m); ecore_timer_del(m->timer); + delete m; m = NULL; }