Implemented logout feature 20/50720/1
authorpolu.sandeep <polu.sandeep@samsung.com>
Fri, 30 Oct 2015 08:37:49 +0000 (17:37 +0900)
committerpolu.sandeep <polu.sandeep@samsung.com>
Fri, 30 Oct 2015 08:37:49 +0000 (17:37 +0900)
Change-Id: Ia14647bfc882b8832b6b465a76849229a69c7b8a

12 files changed:
TelegramTizen/inc/server_requests.h
TelegramTizen/src/server_requests.c
TelegramTizen/src/telegramtizen.c
TelegramTizen/src/tg_login.c
TelegramTizen/src/tg_settings_view.c
tg-engine-service/inc/server_response.h
tg-engine-service/src/server_response.c
tg-engine-service/src/tg-engine-service.c
tg-engine-service/tg_engine/tg_engine.c
tg-engine-service/tg_engine/tg_engine.h
tg-engine-service/tg_engine_utils/tg_common.c
tg-engine-service/tg_engine_utils/tg_common.h

index 36562c5..d6926df 100644 (file)
@@ -11,6 +11,7 @@
 #include "tg_common.h"
 
 void send_request_for_restart_server(service_client* service_client);
+void send_request_for_logout(service_client* service_client);
 void send_request_for_registration(service_client* service_client, const char* phone_number, Eina_Bool through_sms);
 void send_request_for_profile_registration(service_client* service_client, const char* first_name, const char* last_name);
 void send_request_for_validation(service_client* service_client, const char* sms_code);
index 2ea2765..0808fe8 100644 (file)
@@ -44,9 +44,46 @@ void send_request_for_restart_server(service_client* service_client)
        }
 
        bundle_free(msg);
+}
+
+void send_request_for_logout(service_client* service_client)
+{
+       bundle *msg;
+       int result;
+
+       if (!service_client) {
+               // error
+               return;
+       }
 
+       msg = bundle_create();
+       if (!msg) {
+               LOGE("Failed to create a bundle");
+               return;
+       }
+
+       if (bundle_add_str(msg, "app_name", "Tizen Telegram") != 0)     {
+               ERR("Failed to add data by key to bundle");
+               bundle_free(msg);
+               return;
+       }
+
+       if (bundle_add_str(msg, "command", "logout_telegram") != 0) {
+               ERR("Failed to add data by key to bundle");
+               bundle_free(msg);
+               return;
+       }
+
+       result = service_client_send_message(service_client, msg);
+       if(result != SVC_RES_OK) {
+               // error
+               LOGE("Failed to send a service message");
+       }
+
+       bundle_free(msg);
 }
 
+
 void send_request_for_registration(service_client* service_client, const char* phone_number, Eina_Bool through_sms)
 {
        bundle *msg;
index 49bef6c..80864c7 100644 (file)
@@ -17,6 +17,8 @@
 #include "tg_settings_view.h"
 #include "device_contacts_manager.h"
 
+static void free_app_data(appdata_s *app_data, Eina_Bool destroy_server);
+static int init_service(appdata_s *app);
 static void popup_block_clicked_cb(void *data, Evas_Object *obj, void *event_info)
 {
        evas_object_del(obj);
@@ -2613,6 +2615,46 @@ static int _on_service_client_msg_received_cb(void *data, bundle *const rec_msg)
        } else if (strcmp(rec_key_val, "server_connection_failed") == 0) {
                show_toast(app,"Server connection failed. please check network connection");
                hide_loading_popup(app);
+       } else if (strcmp(rec_key_val, "logout_completed") == 0) {
+               elm_naviframe_item_pop(app->nf);
+               elm_naviframe_item_pop(app->nf);
+               free_app_data(app, EINA_TRUE);
+
+               hide_loading_popup(app);
+
+               app->phone_number = NULL;
+               app->buddy_list = NULL;
+               app->unknown_buddy_list = NULL;
+               app->main_list = NULL;
+               app->peer_list = NULL;
+               app->search_peer_list = NULL;
+               app->is_first_time_registration = EINA_FALSE;
+               app->panel = NULL;
+               app->loaded_msg_list = NULL;
+               app->loading_popup = NULL;
+               app->current_user_data = NULL;
+               app->is_tg_initilized = EINA_FALSE;
+               app->chat_background = NULL;
+               app->msg_popup = NULL;
+               app->s_notififcation = NULL;
+               app->panel = NULL;
+               app->is_server_ready = EINA_FALSE;
+               app->contact_list = NULL;
+
+               char *chat_bg = NULL;
+               preference_get_string(TG_CHAT_BG_PREFERENCE, &chat_bg);
+               if (chat_bg) {
+                       app->chat_background = strdup(chat_bg);
+               }
+
+               if (!app->chat_background) {
+                       app->chat_background = strdup(ui_utils_get_resource(TG_CHAT_DEFAULT_BG));
+                       preference_set_string(TG_CHAT_BG_PREFERENCE, app->chat_background);
+               }
+
+               init_service(app);
+               app->current_app_state = TG_REGISTRATION_STATE;
+               launch_init_screen(app);
        }
 
        if (strcmp(rec_key_val, "contacts_and_chats_load_done") == 0) {
@@ -3361,11 +3403,12 @@ app_resume(void *data)
        }
 }
 
-static void
-app_terminate(void *data)
+
+void free_app_data(appdata_s *app_data, Eina_Bool destroy_server)
 {
-       /* Release all resources. */
-       appdata_s *app_data = data;
+       if (!app_data) {
+               return;
+       }
 
        int unread_msg_cnt = get_number_of_unread_messages();
        int err = badge_set_count(TELEGRAM_APP_ID, unread_msg_cnt);
@@ -3392,11 +3435,6 @@ app_terminate(void *data)
                app_data->sms_code = NULL;
        }
 
-       if(app_data->service_client) {
-               service_client_destroy(app_data->service_client);
-               app_data->service_client = NULL;
-       }
-
        if (app_data->current_user_data) {
                free_user_data(app_data->current_user_data);
        }
@@ -3600,7 +3638,7 @@ app_terminate(void *data)
                app_data->loaded_msg_list = NULL;
        }
 
-       if (app_data->service_client) {
+       if (app_data->service_client && destroy_server) {
                service_client_destroy(app_data->service_client);
                app_data->service_client = NULL;
        }
@@ -3609,6 +3647,12 @@ app_terminate(void *data)
 }
 
 static void
+app_terminate(void *data)
+{
+       free_app_data(data, EINA_TRUE);
+}
+
+static void
 ui_app_lang_changed(app_event_info_h event_info, void *user_data)
 {
        /*APP_EVENT_LANGUAGE_CHANGED*/
index ae59f4f..29d4cc6 100644 (file)
@@ -30,11 +30,10 @@ static void on_naviframe_cancel_clicked(void *data, Evas_Object *obj, void *even
                return;
 
        send_request_for_restart_server(ad->service_client);
-       if (ad->timer_value > 0) {
-               Ecore_Timer* timer = evas_object_data_get(ad->nf, "code_timer");
-               if (timer)
-                       ecore_timer_del(timer);
-       }
+
+       Ecore_Timer* timer = evas_object_data_get(ad->nf, "code_timer");
+       if (timer)
+               ecore_timer_del(timer);
 
        elm_naviframe_item_pop(ad->nf);
        ad->current_app_state = TG_REGISTRATION_STATE;
@@ -55,6 +54,11 @@ static void on_code_entry_done_clicked(void *data, Evas_Object *obj, void *event
                        free(val);
                        return;
                }
+               Ecore_Timer *timer = evas_object_data_get(ad->nf, "code_timer");
+               if (timer) {
+                       ecore_timer_del(timer);
+               }
+
                send_request_for_validation(ad->service_client, val);
                show_loading_popup(ad);
        }
@@ -91,7 +95,7 @@ static Eina_Bool on_code_timer_cb(void* data)
                ecore_timer_del(timer);
 
                char temp_txt[512] = {0,};
-                       snprintf(temp_txt, sizeof(temp_txt), i18n_get_text("IDS_TGRAM_BODY_TELEGRAM_WILL_CALL_IN_P1SD_CP2SD"), 0, 0);
+               snprintf(temp_txt, sizeof(temp_txt), i18n_get_text("IDS_TGRAM_BODY_TELEGRAM_WILL_CALL_IN_P1SD_CP2SD"), 0, 0);
 
                // send request to get phone call
                send_request_for_registration(ad->service_client, ad->phone_number, EINA_FALSE);
index 664f5c4..3e88717 100644 (file)
@@ -767,7 +767,8 @@ static void _logout_btn_clicked_cb(void *data, Evas_Object *obj, void *event_inf
        if (popup) {
                evas_object_del(popup);
        }
-       /* FIXME : Please input the logout API here */
+       send_request_for_logout(ad->service_client);
+       show_loading_popup(ad);
 }
 
 static void _create_logout_popup(appdata_s *ad)
index 0d10f40..a6c84df 100644 (file)
@@ -12,6 +12,7 @@
 
 extern void process_registration_command(tg_engine_data_s *tg_data, char *phone_no, Eina_Bool trough_sms);
 extern void process_validation_command(tg_engine_data_s *tg_data, char *code);
+extern void process_logout_command(tg_engine_data_s *tg_data);
 extern void process_send_message_command(int buddy_id, int message_id, int msg_type, char* msg_data, int type_of_chat);
 extern void process_marked_as_read_command(int buddy_id, int type_of_chat);
 extern void process_delete_group_chat_request(tg_engine_data_s* tg_data, int chat_id);
@@ -68,6 +69,7 @@ extern void send_buddy_unblocked_response(tg_engine_data_s *tg_data, int buddy_i
 extern void send_group_chat_new_buddy_response(tg_engine_data_s *tg_data, int peer_id, Eina_Bool is_success);
 extern void send_group_chat_delete_buddy_response(tg_engine_data_s *tg_data, int peer_id, Eina_Bool is_success);
 extern void send_response_for_server_connection_status(tg_engine_data_s *tg_data, Eina_Bool connection_status);
+extern void send_response_for_logout(tg_engine_data_s *tg_data);
 
 extern void send_self_profile_name_updated_response(tg_engine_data_s *tg_data, char *first_name, char *last_name, Eina_Bool is_success);
 extern void send_response_to_group_chat_updated_response(tg_engine_data_s *tg_data, int chat_id);
index 010759a..d6fefff 100644 (file)
@@ -57,6 +57,14 @@ void process_validation_command(tg_engine_data_s *tg_data, char* code)
        tg_data->get_string(tgl_engine_get_TLS(), code, tg_data->callback_arg);
 }
 
+void process_logout_command(tg_engine_data_s *tg_data)
+{
+       if (!tg_data) {
+               return;
+       }
+       logout_telegram(tg_data);
+}
+
 void process_send_message_command(int buddy_id, int message_id, int msg_type, char* msg_data, int type_of_chat)
 {
        if (!msg_data || !tgl_engine_get_TLS()) {
@@ -1562,6 +1570,39 @@ void send_buddy_type_notification_response(tg_engine_data_s *tg_data, int buddy_
        bundle_free(msg);
 }
 
+
+void send_response_for_logout(tg_engine_data_s *tg_data)
+{
+       bundle *msg;
+
+       msg = bundle_create();
+       if (!msg) {
+               ERR("Failed to create a bundle");
+               return;
+       }
+
+       if (bundle_add_str(msg, "app_name", "Tizen Telegram") != 0)     {
+               ERR("Failed to add data by key to bundle");
+               bundle_free(msg);
+               return;
+       }
+
+       if (bundle_add_str(msg, "command", "logout_completed") != 0) {
+               ERR("Failed to add data by key to bundle");
+               bundle_free(msg);
+               return;
+       }
+
+       int result = SVC_RES_FAIL;
+       result = tg_server_send_message(tg_data->tg_server, msg);
+
+       if(result != SVC_RES_OK) {
+               // error: cient not ready
+       }
+       bundle_free(msg);
+}
+
+
 void send_response_for_server_connection_status(tg_engine_data_s *tg_data, Eina_Bool connection_status)
 {
        bundle *msg;
index dbc474e..9e7bef3 100644 (file)
@@ -40,6 +40,86 @@ static int _on_tg_server_msg_received_cb(void *data, bundle *const rec_msg)
 
                process_registration_command(tg_data, ph_no_key_val, th_sms);
 
+       } else if (strcmp(cmd_key_val, "logout_telegram") == 0) {
+
+               //process_logout_command(tg_data);
+
+               // delete all data.
+
+
+               tg_data->is_login_activated = EINA_FALSE;
+               tg_data->is_network_connected = EINA_FALSE;
+               if (tg_data->phone_number) {
+                       free(tg_data->phone_number);
+                       tg_data->phone_number = NULL;
+               }
+
+               if (tg_data->sms_code) {
+                       free(tg_data->sms_code);
+                       tg_data->sms_code = NULL;
+               }
+
+               if (tg_data->first_name) {
+                       free(tg_data->first_name);
+                       tg_data->first_name = NULL;
+               }
+
+               if (tg_data->last_name) {
+                       free(tg_data->last_name);
+                       tg_data->last_name = NULL;
+               }
+
+               if (tg_data->contact_list_to_add) {
+                       free_contact_data(tg_data->contact_list_to_add);
+                       tg_data->contact_list_to_add = NULL;
+               }
+
+               if (tg_data->chat_list) {
+                       eina_list_free(tg_data->chat_list);
+                       tg_data->chat_list = NULL;
+               }
+
+               if (tg_data->buddy_list) {
+                       eina_list_free(tg_data->buddy_list);
+                       tg_data->buddy_list = NULL;
+               }
+
+               tgl_engine_var_free();
+
+               tg_db_fini();
+
+#if 0
+               char *cmd = (char*)malloc(strlen("rm -r ") + strlen(DEFAULT_TELEGRAM_PATH) + 1);
+               strcpy(cmd, "rm -r ");
+               strcat(cmd, DEFAULT_TELEGRAM_PATH);
+               int ret = system(cmd);
+               free(cmd);
+#else
+               int ret = recursive_dir_delete(DEFAULT_TELEGRAM_PATH);
+#endif
+               send_response_for_logout(tg_data);
+               tgl_engine_var_init();
+               tg_db_init();
+               tg_data->tg_state = TG_ENGINE_STATE_NONE;
+               tg_data->first_name = NULL;
+               tg_data->last_name = NULL;
+               tg_data->phone_number = NULL;
+               tg_data->sms_code = NULL;
+               tg_data->contact_list_to_add = NULL;
+               tg_data->new_group_icon = NULL;
+               tg_data->mhash = NULL;
+               tg_data->lazy_init_idler = NULL;
+               tg_data->code_response_timer = NULL;
+
+               init_tl_engine(data);
+               tgl_login(tgl_engine_get_TLS());
+
+               tg_data->lazy_init_idler = NULL;
+               tg_data->code_response_timer = NULL;
+
+               //send event to application
+
+
        } else if (strcmp(cmd_key_val, "restart_server") == 0) {
                on_restart_service_requested(tg_data);
        } else if (strcmp(cmd_key_val, "code_validation") == 0) {
index 534c83d..e29c79e 100644 (file)
@@ -2874,6 +2874,11 @@ void do_add_buddy(int buddy_id, char *first_name, char *last_name, char *phone_n
 }
 
 
+void logout_telegram(tg_engine_data_s *tg_data)
+{
+
+}
+
 void do_delete_buddy(int buddy_id)
 {
        tgl_peer_id_t peer_id;
index 5fcaf2a..edeb4e7 100644 (file)
@@ -165,7 +165,7 @@ typedef struct contact_data {
 extern void send_do_mark_read_messages(int buddy_id, int type_of_chat);
 extern void send_message_to_buddy(int buddy_id, int message_id, int msg_type, char* msg_data, int type_of_chat);
 extern void send_media_to_buddy(int buddy_id, int message_id, int media_id, int msg_type, char* file_path, int type_of_chat);
-
+extern void logout_telegram(tg_engine_data_s *tg_data);
 extern void media_download_request(tg_engine_data_s *tg_data, int buddy_id, long long media_id);
 extern void add_contacts_to_user(tg_engine_data_s *tg_data, int size, Eina_List* contact_list);
 extern void create_new_group(tg_engine_data_s *tg_data, Eina_List* buddy_ids, const char* group_name, const char* group_icon);
index 4ccc552..9eaada7 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include "tg_common.h"
+#include <fts.h>
 
 void tg_notification_create(tg_engine_data_s* tg_data, char * icon_path, const char *title, char *content, char *sound_path, char *app_id)
 {
@@ -114,3 +115,69 @@ char *ui_utils_get_resource(const char *res_name)
 
        return res_path;
 }
+
+int recursive_dir_delete(const char *dir)
+{
+    int ret = 0;
+    FTS *ftsp = NULL;
+    FTSENT *curr;
+
+    // Cast needed (in C) because fts_open() takes a "char * const *", instead
+    // of a "const char * const *", which is only allowed in C++. fts_open()
+    // does not modify the argument.
+    char *files[] = { (char *) dir, NULL };
+
+    // FTS_NOCHDIR  - Avoid changing cwd, which could cause unexpected behavior
+    //                in multithreaded programs
+    // FTS_PHYSICAL - Don't follow symlinks. Prevents deletion of files outside
+    //                of the specified directory
+    // FTS_XDEV     - Don't cross filesystem boundaries
+    ftsp = fts_open(files, FTS_NOCHDIR | FTS_PHYSICAL | FTS_XDEV, NULL);
+    if (!ftsp) {
+        fprintf(stderr, "%s: fts_open failed: %s\n", dir, strerror(errno));
+        ret = -1;
+        goto finish;
+    }
+
+    while ((curr = fts_read(ftsp))) {
+        switch (curr->fts_info) {
+        case FTS_NS:
+        case FTS_DNR:
+        case FTS_ERR:
+            fprintf(stderr, "%s: fts_read error: %s\n",
+                    curr->fts_accpath, strerror(curr->fts_errno));
+            break;
+
+        case FTS_DC:
+        case FTS_DOT:
+        case FTS_NSOK:
+            // Not reached unless FTS_LOGICAL, FTS_SEEDOT, or FTS_NOSTAT were
+            // passed to fts_open()
+            break;
+
+        case FTS_D:
+            // Do nothing. Need depth-first search, so directories are deleted
+            // in FTS_DP
+            break;
+
+        case FTS_DP:
+        case FTS_F:
+        case FTS_SL:
+        case FTS_SLNONE:
+        case FTS_DEFAULT:
+            if (remove(curr->fts_accpath) < 0) {
+                fprintf(stderr, "%s: Failed to remove: %s\n",
+                        curr->fts_path, strerror(errno));
+                ret = -1;
+            }
+            break;
+        }
+    }
+
+finish:
+    if (ftsp) {
+        fts_close(ftsp);
+    }
+
+    return ret;
+}
index cdcea6f..6829724 100644 (file)
@@ -33,4 +33,6 @@ extern char *replace(const char *s, char ch, const char *repl);
 
 extern void tg_notification_create(tg_engine_data_s* tg_data, char * icon_path, const char *title, char *content, char *sound_path, char *app_id);
 
+extern int recursive_dir_delete(const char *dir);
+
 #endif /* TG_COMMON_H_ */