Impleneted "Clear History" and "Invite Friend" 73/53473/1
authorpolu.sandeep <polu.sandeep@samsung.com>
Mon, 7 Dec 2015 07:36:41 +0000 (16:36 +0900)
committerpolu.sandeep <polu.sandeep@samsung.com>
Mon, 7 Dec 2015 07:36:41 +0000 (16:36 +0900)
Change-Id: Iaaafd8a1648db649ba133ad773a4f336e3f14464

19 files changed:
TelegramTizen/db_manager/tg_db_manager.h
TelegramTizen/inc/server_requests.h
TelegramTizen/inc/tg_db_wrapper.h
TelegramTizen/src/server_requests.c
TelegramTizen/src/telegramtizen.c
TelegramTizen/src/tg_db_wrapper.c
TelegramTizen/src/tg_messaging_view.c
TelegramTizen/src/tg_search_peer_view.c
TelegramTizen/tg_utils/tg_common.h
tg-engine-service/db_manager/tg_db_manager.h
tg-engine-service/inc/server_response.h
tg-engine-service/inc/tg_db_wrapper.h
tg-engine-service/mtprotocol/tgl-layout.h
tg-engine-service/src/server_response.c
tg-engine-service/src/tg-engine-service.c
tg-engine-service/src/tg_db_wrapper.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.h

index b32b600..7afb252 100644 (file)
@@ -10,7 +10,8 @@
 
 #include "tg_common.h"
 #include <sqlite3.h>
-
+extern sqlite3* create_database(char* database_name);
+extern Eina_Bool close_database(sqlite3* db);
 extern Eina_Bool create_table(const char* table_name, Eina_List* column_names, Eina_List* column_types);
 extern Eina_Bool insert_table(const char* table_name, Eina_List* column_names, Eina_List* column_types, Eina_List* column_values);
 extern Eina_Bool update_table(const char* table_name, Eina_List* column_names, Eina_List* column_types, Eina_List* column_values, const char* where_clause);
index a991378..61477ba 100644 (file)
@@ -18,6 +18,7 @@ void send_request_for_validation(appdata_s *ad, service_client* service_client,
 // type_of_chat 0-buddy, 1-group_chat 2-encrpted_chat
 void send_request_for_message_transport(appdata_s *ad, service_client* service_client, const int buddy_id, const int message_id, const int msg_type, const char* data, const int type_of_chat);
 void send_request_for_marked_as_read(appdata_s *ad, service_client* service_client, const int buddy_id, const int type_of_chat);
+void send_delete_all_messages_request(appdata_s *ad, service_client* service_client, const int buddy_id, const int type_of_chat);
 void send_delete_selected_group_chats_request(appdata_s *ad, service_client* service_client, Eina_List *sel_grp_chats);
 void send_delete_group_chat_request(appdata_s *ad, service_client* service_client, const int chat_id);
 void send_add_buddy_request(appdata_s *ad, service_client* service_client, const int buddy_id, const char *first_name, const char *last_name, const char *phone_number);
index 6e0c1b2..7cbc026 100644 (file)
 #define MESSAGE_INFO_TABLE_MEDIA_TYPE "media_type"
 #define MESSAGE_INFO_TABLE_MEDIA_ID "media_id"
 #define MESSAGE_INFO_TABLE_UNIQUE_ID "unique_id"
+#define MESSAGE_INFO_TABLE_MARKED_FOR_DELETE "is_marked_delete"
 
 #define CHAT_INFO_TABLE_NAME "chat_info_table"
 
@@ -267,6 +268,10 @@ Eina_List* get_all_buddy_details(char* name);
 
 void create_buddy_msg_table(const char* table_name);
 
+Eina_Bool mark_all_records_for_deletion(char *tablename);
+
+Eina_Bool delete_date_messages_from_table(char *tablename);
+
 Eina_Bool insert_unsent_message_to_db(const char *app_name, const char *command, const char *buddy_id, const char *msg_id, const char *msg_type, const char * msg_data, const char *type_of_chat);
 Eina_Bool insert_unsent_media_message_to_db(const char *app_name, const char *command, const char *buddy_id, const char *msg_id, const char *media_id, const char *msg_type, const char *file_path, const char *type_of_chat);
 #if 0
index f18ee5b..eb17f29 100644 (file)
@@ -652,6 +652,64 @@ void send_delete_group_chat_request(appdata_s *ad, service_client* service_clien
 
 }
 
+void send_delete_all_messages_request(appdata_s *ad, service_client* service_client, const int buddy_id, const int type_of_chat)
+{
+
+       bundle *msg;
+       char tmp[50];
+       int result;
+
+       if (!service_client) {
+               failed_to_communicate_server(ad);
+               return;
+       }
+
+       msg = bundle_create();
+       if (!msg) {
+               failed_to_communicate_server(ad);
+               return;
+       }
+
+       if (bundle_add_str(msg, "app_name", "Tizen Telegram") != 0)     {
+               ERR("Failed to add data by key to bundle");
+               bundle_free(msg);
+               failed_to_communicate_server(ad);
+               return;
+       }
+
+       if (bundle_add_str(msg, "command", "delete_all_messages_from_table") != 0) {
+               ERR("Failed to add data by key to bundle");
+               bundle_free(msg);
+               failed_to_communicate_server(ad);
+               return;
+       }
+
+       snprintf(tmp, sizeof(tmp) - 1, "%d", buddy_id);
+
+       if (bundle_add_str(msg, "buddy_id", tmp) != 0)  {
+               ERR("Failed to add data by key to bundle");
+               bundle_free(msg);
+               failed_to_communicate_server(ad);
+               return;
+       }
+
+       snprintf(tmp, sizeof(tmp) - 1, "%d", type_of_chat);
+       if (bundle_add_str(msg, "type_of_chat", tmp) != 0)      {
+               ERR("Failed to add data by key to bundle");
+               bundle_free(msg);
+               failed_to_communicate_server(ad);
+               return;
+       }
+
+       result = service_client_send_message(service_client, msg);
+       if(result != SVC_RES_OK) {
+               failed_to_communicate_server(ad);
+       }
+       bundle_free(msg);
+
+}
+
+
 void send_request_for_marked_as_read(appdata_s *ad, service_client* service_client, const int buddy_id, const int type_of_chat)
 {
        bundle *msg;
index fd5ea23..e46d40a 100644 (file)
@@ -3114,6 +3114,7 @@ void app_nf_back_cb(void *data, Evas_Object *obj, void *event_info)
                        }
                        elm_naviframe_item_pop(ad->nf);
                        ad->current_app_state = TG_USER_MAIN_VIEW_STATE;
+                       show_floating_button(ad);
                        break;
                case TG_SELECT_BUDDY_VIEW:
                        elm_naviframe_item_pop(ad->nf);
index 445ba85..c84dc56 100644 (file)
@@ -1638,6 +1638,7 @@ tg_message_s* get_latest_message_from_message_table(char* table_name)
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MEDIA_TYPE);
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MEDIA_ID);
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_UNIQUE_ID);
+       col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MARKED_FOR_DELETE);
 
        Eina_List* col_types = NULL;
        col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER_PRIMARY_KEY);
@@ -1656,17 +1657,22 @@ tg_message_s* get_latest_message_from_message_table(char* table_name)
        col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
        col_types = eina_list_append(col_types, TG_DB_COLUMN_TEXT);
        col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
-
-
+       col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
 
        char service_str[50];
        sprintf(service_str, "%d", 2);
 
-       char* where_clause = (char*)malloc(strlen(MESSAGE_INFO_TABLE_SERVICE) + strlen(" <> ") + strlen(service_str) + 1);
+       char marked_del_str[50];
+       sprintf(marked_del_str, "%d", 1);
+
+       char* where_clause = (char*)malloc(strlen(MESSAGE_INFO_TABLE_SERVICE) + strlen(" <> ") + strlen(service_str) + strlen(" AND ") + strlen(MESSAGE_INFO_TABLE_MARKED_FOR_DELETE)+ strlen(" <> ")+ strlen(marked_del_str) + 1);
        strcpy(where_clause, MESSAGE_INFO_TABLE_SERVICE);
        strcat(where_clause, " <> ");
        strcat(where_clause, service_str);
-
+       strcat(where_clause, " AND ");
+       strcpy(where_clause, MESSAGE_INFO_TABLE_MARKED_FOR_DELETE);
+       strcat(where_clause, " <> ");
+       strcat(where_clause, marked_del_str);
 
        message_details = get_values_from_table_sync_order_by(table_name, col_names, col_types, MESSAGE_INFO_TABLE_DATE, EINA_FALSE, where_clause);
        free(where_clause);
@@ -1919,6 +1925,7 @@ int insert_current_date_to_table(char* tb_name)
                        date_msg.unread = 0;
                        date_msg.out = 0;
                        date_msg.media_id = "";
+                       date_msg.is_marked_for_delete = 0;
                        insert_msg_into_db(&date_msg, tb_name, date_msg.msg_id);
                        return date_msg.msg_id;
                }
@@ -1952,6 +1959,7 @@ int insert_current_date_to_table(char* tb_name)
                date_msg.unread = 0;
                date_msg.out = 0;
                date_msg.media_id = "";
+               date_msg.is_marked_for_delete = 0;
                insert_msg_into_db(&date_msg, tb_name, date_msg.msg_id);
                return date_msg.msg_id;
        }
@@ -2237,7 +2245,7 @@ void insert_msg_into_db(tg_message_s *M, char* table_name, int unique_id)
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MEDIA_TYPE);
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MEDIA_ID);
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_UNIQUE_ID);
-
+       col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MARKED_FOR_DELETE);
 
        Eina_List* col_types = NULL;
        col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER_PRIMARY_KEY);
@@ -2256,6 +2264,7 @@ void insert_msg_into_db(tg_message_s *M, char* table_name, int unique_id)
        col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
        col_types = eina_list_append(col_types, TG_DB_COLUMN_TEXT);
        col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
+       col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
 
 
        Eina_List* col_values = NULL;
@@ -2283,6 +2292,8 @@ void insert_msg_into_db(tg_message_s *M, char* table_name, int unique_id)
 
        col_values = eina_list_append(col_values, &unique_id);
 
+       col_values = eina_list_append(col_values, &(M->is_marked_for_delete));
+
        Eina_Bool ret = insert_table(table_name, col_names, col_types,col_values);
        if(!ret) {
                //("error: database creation failed");
@@ -4063,6 +4074,8 @@ void create_buddy_msg_table(const char* table_name)
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MEDIA_TYPE);
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MEDIA_ID);
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_UNIQUE_ID);
+       col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MARKED_FOR_DELETE);
+
 
        Eina_List* col_types = NULL;
        //col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER_PRIMARY_AUTO_INC_KEY);
@@ -4082,6 +4095,7 @@ void create_buddy_msg_table(const char* table_name)
        col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
        col_types = eina_list_append(col_types, TG_DB_COLUMN_TEXT);
        col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
+       col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
 
        Eina_Bool ret = create_table(table_name, col_names, col_types);
        if(!ret) {
@@ -4091,6 +4105,40 @@ void create_buddy_msg_table(const char* table_name)
        eina_list_free(col_types);
 }
 
+
+Eina_Bool mark_all_records_for_deletion(char *tablename)
+{
+       if (!tablename) {
+               return EINA_FALSE;
+       }
+       char *var_query = (char*)malloc(strlen("UPDATE ") + strlen(tablename) + strlen(" SET ") + strlen(MESSAGE_INFO_TABLE_MARKED_FOR_DELETE) + strlen(" = ") + strlen("1") + strlen(" WHERE ") + strlen(MESSAGE_INFO_TABLE_MARKED_FOR_DELETE) + strlen(" = ") + strlen("0") + strlen(";") + 1);
+       strcpy(var_query, "UPDATE ");
+       strcat(var_query, tablename);
+       strcat(var_query, " SET ");
+       strcat(var_query, MESSAGE_INFO_TABLE_MARKED_FOR_DELETE);
+       strcat(var_query, " = ");
+       strcat(var_query, "1");
+       strcat(var_query, " WHERE ");
+       strcat(var_query, MESSAGE_INFO_TABLE_MARKED_FOR_DELETE);
+       strcat(var_query, " = ");
+       strcat(var_query, "0");
+       strcat(var_query, ";");
+
+       char* err_msg = 0;
+       int ret;
+       sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
+       ret = sqlite3_exec(db,var_query, NULL, NULL, &err_msg);
+       close_database(db);
+       if( ret != SQLITE_OK ){
+               sqlite3_free(err_msg);
+               return EINA_FALSE;
+       }
+
+       free(var_query);
+       return EINA_TRUE;
+}
+
+
 void get_buddy_contact_details_from_db(int buddy_id, char **first_name, char **last_name, char **phone_number)
 {
        char* file_path = NULL;
@@ -4140,3 +4188,34 @@ void get_buddy_contact_details_from_db(int buddy_id, char **first_name, char **l
        eina_list_free(col_names);
        return;
 }
+
+Eina_Bool delete_date_messages_from_table(char *tablename)
+{
+       if (!tablename) {
+               return EINA_FALSE;
+       }
+
+       char* where_clause = NULL;
+       char service_id_str[50];
+       sprintf(service_id_str,"%d", 2);
+
+       char *var_query = (char*)malloc(strlen("DELETE FROM ") + strlen(tablename) + strlen(" WHERE ") + strlen(MESSAGE_INFO_TABLE_SERVICE) + strlen(" = ") + strlen(service_id_str) + strlen(";") + 1);
+       strcpy(var_query, "DELETE FROM ");
+       strcat(var_query, tablename);
+       strcat(var_query, " WHERE ");
+       strcat(var_query, MESSAGE_INFO_TABLE_SERVICE);
+       strcat(var_query, " = ");
+       strcat(var_query, service_id_str);
+       strcat(var_query, ";");
+       int ret;
+       char* err_msg = 0;
+       sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
+       ret = sqlite3_exec(db,var_query, NULL, NULL, &err_msg);
+       close_database(db);
+       if( ret != SQLITE_OK ){
+               sqlite3_free(err_msg);
+               return EINA_FALSE;
+       }
+       free(var_query);
+       return EINA_TRUE;
+}
index 38c2546..d2eeaed 100644 (file)
@@ -77,6 +77,7 @@ void on_messaging_menu_option_selected_cb(void *data, Evas_Object *obj, void *ev
                if (id == 0) {
                        show_toast(ad, "Add contact to ur buddies");
                } else if (id == 1) {
+#if 0
                        char* tablename = get_table_name_from_number(user_data->peer_id);
                        delete_all_records(tablename);
                        free(tablename);
@@ -112,6 +113,62 @@ void on_messaging_menu_option_selected_cb(void *data, Evas_Object *obj, void *ev
                                ad->main_item_in_cahtting_data = NULL;
                        }
                        ad->is_last_msg_changed = EINA_FALSE;
+#else
+                       // mark all the massages for deletion.
+                       char* tablename = get_table_name_from_number(user_data->peer_id);
+                       mark_all_records_for_deletion(tablename);
+                       // delete date messages
+                       delete_date_messages_from_table(tablename);
+                       free(tablename);
+                       // clear screen
+                       // clear all messages
+                       Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
+
+
+                       Evas_Object *box_layout = NULL;
+                       Evas_Object *box = NULL;
+                       Eina_List *list = NULL;
+
+                       box_layout = elm_object_content_get(scroller);
+                       if (!box_layout) {
+                               LOGE("Fail to get the box into scroller");
+                               return;
+                       }
+
+                       list = elm_box_children_get(box_layout);
+                       if (!list) {
+                               LOGE("Fail to get the list into box");
+                               return;
+                       }
+
+                       box = eina_list_nth(list, 0);
+                       if (!box) {
+                               LOGE("Fail to get the box into box layout");
+                               return;
+                       }
+
+                       eina_list_free(list);
+                       elm_box_clear(box);
+                       elm_box_recalculate(box);
+
+
+                       // send request to server
+                       send_delete_group_chat_request(ad, ad->service_client, user_data->peer_id);
+
+                       if (ad->main_item_in_cahtting_data) {
+                               tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
+                               if (old_item->last_message) {
+                                       free(old_item->last_message);
+                                       old_item->last_message = NULL;
+                               }
+                               old_item->last_message = strdup("");
+                       }
+
+                       Evas_Object *nomsg_layout = evas_object_data_del(ad->nf, "chat_list_no_msg_text");
+                       if (nomsg_layout) {
+                               elm_object_signal_emit(nomsg_layout, "show", "message");
+                       }
+#endif
                } else {
                        char* tablename = get_table_name_from_number(user_data->peer_id);
                        delete_all_records(tablename);
@@ -163,6 +220,8 @@ void on_messaging_menu_option_selected_cb(void *data, Evas_Object *obj, void *ev
 
        if (id == 0) {
                if (user_data->peer_type == TGL_PEER_USER || user_data->peer_type == TGL_PEER_CHAT) {
+
+#if 0
                        char* tablename = get_table_name_from_number(user_data->peer_id);
                        delete_all_records(tablename);
                        free(tablename);
@@ -199,6 +258,62 @@ void on_messaging_menu_option_selected_cb(void *data, Evas_Object *obj, void *ev
                        }
 
                        ad->is_last_msg_changed = EINA_FALSE;
+#else
+                       // mark all the massages for deletion.
+                       char* tablename = get_table_name_from_number(user_data->peer_id);
+                       mark_all_records_for_deletion(tablename);
+                       // delete date messages
+                       delete_date_messages_from_table(tablename);
+                       free(tablename);
+                       // clear screen
+                       // clear all messages
+                       Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
+
+
+                       Evas_Object *box_layout = NULL;
+                       Evas_Object *box = NULL;
+                       Eina_List *list = NULL;
+
+                       box_layout = elm_object_content_get(scroller);
+                       if (!box_layout) {
+                               LOGE("Fail to get the box into scroller");
+                               return;
+                       }
+
+                       list = elm_box_children_get(box_layout);
+                       if (!list) {
+                               LOGE("Fail to get the list into box");
+                               return;
+                       }
+
+                       box = eina_list_nth(list, 0);
+                       if (!box) {
+                               LOGE("Fail to get the box into box layout");
+                               return;
+                       }
+
+                       eina_list_free(list);
+                       elm_box_clear(box);
+                       elm_box_recalculate(box);
+
+
+                       // send request to server
+                       send_delete_group_chat_request(ad, ad->service_client, user_data->peer_id);
+
+                       if (ad->main_item_in_cahtting_data) {
+                               tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
+                               if (old_item->last_message) {
+                                       free(old_item->last_message);
+                                       old_item->last_message = NULL;
+                               }
+                               old_item->last_message = strdup("");
+                       }
+
+                       Evas_Object *nomsg_layout = evas_object_data_del(ad->nf, "chat_list_no_msg_text");
+                       if (nomsg_layout) {
+                               elm_object_signal_emit(nomsg_layout, "show", "message");
+                       }
+#endif
 
                } else {
 
@@ -1821,6 +1936,7 @@ static Eina_Bool on_new_text_message_send_cb(void *data)
        msg.to_id = sel_item->use_data->peer_id;
        msg.unread = 0;
        msg.msg_state = TG_MESSAGE_STATE_SENDING;
+       msg.is_marked_for_delete = 0;
        char* msg_table = get_table_name_from_number(msg.to_id);
        create_buddy_msg_table(msg_table);
        insert_msg_into_db(&msg, msg_table, unique_id);
@@ -1886,6 +2002,7 @@ static void on_text_message_send_clicked(void *data, Evas_Object *obj, const cha
        msg.to_id = sel_item->use_data->peer_id;
        msg.unread = 0;
        msg.msg_state = TG_MESSAGE_STATE_SENDING;
+       msg.is_marked_for_delete = 0;
        char* msg_table = get_table_name_from_number(msg.to_id);
        create_buddy_msg_table(msg_table);
        insert_msg_into_db(&msg, msg_table, unique_id);
@@ -2194,7 +2311,7 @@ static Eina_Bool on_new_contact_message_send_cb(void *data)
        msg.to_id = sel_item->use_data->peer_id;
        msg.unread = 0;
        msg.msg_state = TG_MESSAGE_STATE_SENDING;
-
+       msg.is_marked_for_delete = 0;
 
        char* msg_table = get_table_name_from_number(msg.to_id);
        create_buddy_msg_table(msg_table);
@@ -2266,7 +2383,7 @@ void send_contact_message_to_buddy(void *data, char *first_name, char *last_name
        msg.to_id = sel_item->use_data->peer_id;
        msg.unread = 0;
        msg.msg_state = TG_MESSAGE_STATE_SENDING;
-
+       msg.is_marked_for_delete = 0;
 
        char* msg_table = get_table_name_from_number(msg.to_id);
        create_buddy_msg_table(msg_table);
@@ -2320,6 +2437,7 @@ static Eina_Bool on_new_location_message_send_cb(void *data)
        msg.to_id = sel_item->use_data->peer_id;
        msg.unread = 0;
        msg.msg_state = TG_MESSAGE_STATE_SENDING;
+       msg.is_marked_for_delete = 0;
 
        char* msg_table = get_table_name_from_number(msg.to_id);
        create_buddy_msg_table(msg_table);
@@ -2386,6 +2504,7 @@ void send_location_message_to_buddy(void *data, char *latitude, char *longitude)
        msg.to_id = sel_item->use_data->peer_id;
        msg.unread = 0;
        msg.msg_state = TG_MESSAGE_STATE_SENDING;
+       msg.is_marked_for_delete = 0;
 
        char* msg_table = get_table_name_from_number(msg.to_id);
        create_buddy_msg_table(msg_table);
@@ -2444,6 +2563,7 @@ static Eina_Bool on_new_media_message_send_cb(void *data)
        msg.to_id = sel_item->use_data->peer_id;
        msg.unread = 0;
        msg.msg_state = TG_MESSAGE_STATE_SENDING;
+       msg.is_marked_for_delete = 0;
 
        char* msg_table = get_table_name_from_number(msg.to_id);
        create_buddy_msg_table(msg_table);
@@ -2519,6 +2639,7 @@ void send_media_message_to_buddy(void *data, const char* file_path, enum tgl_mes
        msg.to_id = sel_item->use_data->peer_id;
        msg.unread = 0;
        msg.msg_state = TG_MESSAGE_STATE_SENDING;
+       msg.is_marked_for_delete = 0;
 
        char* msg_table = get_table_name_from_number(msg.to_id);
        create_buddy_msg_table(msg_table);
@@ -2619,7 +2740,16 @@ Eina_Bool load_chat_history(Evas_Object *chat_scroller)
        Eina_List* col_names = NULL;
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MESSAGE_ID);
 
-       Eina_List* vals = get_values_from_table_sync_order_by(tablename, col_names, col_types, MESSAGE_INFO_TABLE_DATE, EINA_TRUE, NULL);
+       char unknown_str[50];
+       int unknown = 0;
+       sprintf(unknown_str, "%d", unknown);
+
+       char* where_clause = (char*)malloc(strlen(MESSAGE_INFO_TABLE_MARKED_FOR_DELETE) + strlen(" = ") + strlen(unknown_str) + 1);
+       strcpy(where_clause, MESSAGE_INFO_TABLE_MARKED_FOR_DELETE);
+       strcat(where_clause, " = ");
+       strcat(where_clause, unknown_str);
+
+       Eina_List* vals = get_values_from_table_sync_order_by(tablename, col_names, col_types, MESSAGE_INFO_TABLE_DATE, EINA_TRUE, where_clause);
        if(!vals) {
                // set no messages yet
                return EINA_FALSE;
index c8f1194..910be59 100755 (executable)
@@ -699,7 +699,8 @@ static void on_invite_friends_clicked(void *data, Evas_Object *obj, void *event_
                return;
        }
        app_control_set_operation(app_control, APP_CONTROL_OPERATION_COMPOSE);
-       app_control_set_mime(app_control,"text/html");
+       app_control_set_uri(app_control, "sms:");
+       //app_control_set_mime(app_control,"text/html");
        char *text = "Invite you to telegram! https://telegram.org/dl";
        app_control_add_extra_data(app_control, APP_CONTROL_DATA_TEXT, text);
        if (app_control_send_launch_request(app_control, NULL, NULL) == APP_CONTROL_ERROR_NONE) {
@@ -853,7 +854,7 @@ static void on_contact_item_clicked(void *data, Evas_Object *obj, void *event_in
                return;
        }
        app_control_set_operation(app_control, APP_CONTROL_OPERATION_COMPOSE);
-       app_control_set_mime(app_control,"text/html");
+       app_control_set_uri(app_control, "sms:");
 
        char phone_num[512] = {0,};
        strcpy(phone_num, "sms:");
index 57ccce3..79c0724 100644 (file)
@@ -442,6 +442,7 @@ typedef struct tg_message {
        int media_type;
        char* media_id;
        int unique_id;
+       int is_marked_for_delete;
 } tg_message_s;
 
 typedef struct tgl_media {
index 212d61c..9f9024a 100644 (file)
@@ -13,6 +13,8 @@
 
 extern int tg_db_fini(void);
 extern int tg_db_init(void);
+extern sqlite3* create_database(char* database_name);
+extern Eina_Bool close_database(sqlite3* db);
 extern Eina_Bool create_table(const char* table_name, Eina_List* column_names, Eina_List* column_types);
 extern Eina_Bool insert_table(const char* table_name, Eina_List* column_names, Eina_List* column_types, Eina_List* column_values);
 extern Eina_Bool update_table(const char* table_name, Eina_List* column_names, Eina_List* column_types, Eina_List* column_values, const char* where_clause);
index 67a8724..9a6d461 100644 (file)
@@ -17,6 +17,7 @@ extern void process_send_message_command(int buddy_id, int message_id, int msg_t
 extern void process_typing_status_to_buddy_command(int buddy_id, int type_of_chat, int typing_status);
 extern void process_forward_message_command(int to_id, int type_of_chat, int from_id, int message_id, int temp_message_id);
 extern void process_marked_as_read_command(int buddy_id, int type_of_chat);
+extern void process_delete_all_msgs_from_table_command(int buddy_id, int type_of_chat);
 extern void process_delete_group_chat_request(tg_engine_data_s* tg_data, int chat_id);
 extern void process_delete_selected_group_chats_request(tg_engine_data_s* tg_data, Eina_List *sel_grp_chats);
 extern void process_add_user_request(tg_engine_data_s* tg_data, int buddy_id, char *first_name, char *last_name, char *phone_num);
index 599350b..9f6d441 100644 (file)
 #define MESSAGE_INFO_TABLE_MEDIA_TYPE "media_type"
 #define MESSAGE_INFO_TABLE_MEDIA_ID "media_id"
 #define MESSAGE_INFO_TABLE_UNIQUE_ID "unique_id"
+#define MESSAGE_INFO_TABLE_MARKED_FOR_DELETE "is_marked_delete"
 
 
 #define CHAT_INFO_TABLE_NAME "chat_info_table"
@@ -278,4 +279,8 @@ int update_current_date_to_table(char* tb_name, int recent_msg_date);
 
 int set_date_item_to_table(char* tb_name, int recent_msg_date);
 
+Eina_List* get_all_message_ids_from_table(char *table_name);
+
+Eina_Bool delete_message_from_table(char *tablename, int msg_id);
+
 #endif /* TG_DB_WRAPPER_H_ */
index 5d664d7..8a26f90 100644 (file)
@@ -549,6 +549,7 @@ struct tgl_message {
        int date;
        int service;
        int msg_state;
+       int is_marked_for_delete;
        union {
                struct tgl_message_action action;
                struct {
index 79e42af..da07ace 100644 (file)
@@ -161,6 +161,14 @@ void process_unblock_user_request(tg_engine_data_s* tg_data, int buddy_id)
        do_unblock_buddy(buddy_id);
 }
 
+void process_delete_all_msgs_from_table_command(int buddy_id, int type_of_chat)
+{
+       if (!tgl_engine_get_TLS()) {
+               return;
+       }
+       delete_all_messages_from_chat(buddy_id, type_of_chat);
+}
+
 void process_marked_as_read_command(int buddy_id, int type_of_chat)
 {
        if (!tgl_engine_get_TLS()) {
index a20d2b5..fb55240 100644 (file)
@@ -222,6 +222,17 @@ static int _on_tg_server_msg_received_cb(void *data, bundle *const rec_msg)
 
                process_send_message_command(buddy_id, message_id, msg_type, msg_data_str, type_of_chat);
 
+       } else if (strcmp(cmd_key_val, "delete_all_messages_from_table") == 0) {
+
+       char* buddy_id_str = NULL;
+       res = bundle_get_str(rec_msg, "buddy_id", &buddy_id_str);
+       int buddy_id = atoi(buddy_id_str);
+
+       char* type_of_chat_str = NULL;
+       res = bundle_get_str(rec_msg, "type_of_chat", &type_of_chat_str);
+       int type_of_chat = atoi(type_of_chat_str);
+       process_delete_all_msgs_from_table_command(buddy_id, type_of_chat);
+
     } else if (strcmp(cmd_key_val, "marked_as_read") == 0) {
        char* buddy_id_str = NULL;
        res = bundle_get_str(rec_msg, "buddy_id", &buddy_id_str);
index 28bf77b..5a1fe7c 100644 (file)
@@ -662,6 +662,8 @@ void create_buddy_msg_table(const char* table_name)
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MEDIA_TYPE);
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MEDIA_ID);
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_UNIQUE_ID);
+       col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MARKED_FOR_DELETE);
+
 
        Eina_List* col_types = NULL;
        //col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER_PRIMARY_AUTO_INC_KEY);
@@ -681,6 +683,7 @@ void create_buddy_msg_table(const char* table_name)
        col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
        col_types = eina_list_append(col_types, TG_DB_COLUMN_TEXT);
        col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
+       col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
 
        Eina_Bool ret = create_table(table_name, col_names, col_types);
        if(!ret) {
@@ -745,6 +748,7 @@ int set_date_item_to_table(char* tb_name, int recent_msg_date)
                        date_msg.service = 2;
                        date_msg.unread = 0;
                        date_msg.out = 0;
+                       date_msg.is_marked_for_delete = 0;
                        insert_msg_into_db(&date_msg, tb_name, t);
 
                        if (last_msg->message) {
@@ -783,6 +787,7 @@ int set_date_item_to_table(char* tb_name, int recent_msg_date)
                date_msg.service = 2;
                date_msg.unread = 0;
                date_msg.out = 0;
+               date_msg.is_marked_for_delete = 0;
                insert_msg_into_db(&date_msg, tb_name, t);
                return date_msg.id;
        }
@@ -844,6 +849,7 @@ int update_current_date_to_table(char* tb_name, int recent_msg_date)
                        date_msg.service = 2;
                        date_msg.unread = 0;
                        date_msg.out = 0;
+                       date_msg.is_marked_for_delete = 0;
                        insert_msg_into_db(&date_msg, tb_name, t);
                        if (last_msg->message) {
                                free(last_msg->message);
@@ -881,6 +887,7 @@ int update_current_date_to_table(char* tb_name, int recent_msg_date)
                date_msg.service = 2;
                date_msg.unread = 0;
                date_msg.out = 0;
+               date_msg.is_marked_for_delete = 0;
                insert_msg_into_db(&date_msg, tb_name, t);
                return date_msg.id;
        }
@@ -943,6 +950,7 @@ int insert_current_date_to_table(char* tb_name)
                        date_msg.service = 2;
                        date_msg.unread = 0;
                        date_msg.out = 0;
+                       date_msg.is_marked_for_delete = 0;
                        insert_msg_into_db(&date_msg, tb_name, t);
                        if (last_msg->message) {
                                free(last_msg->message);
@@ -980,6 +988,7 @@ int insert_current_date_to_table(char* tb_name)
                date_msg.service = 2;
                date_msg.unread = 0;
                date_msg.out = 0;
+               date_msg.is_marked_for_delete = 0;
                insert_msg_into_db(&date_msg, tb_name, t);
                return date_msg.id;
        }
@@ -996,6 +1005,7 @@ Eina_Bool insert_buddy_msg_to_db(struct tgl_message *M)
        } else if (tgl_get_peer_type(M->to_id) == TGL_PEER_CHAT) {
                user_id = M->to_id.id;
        }
+       M->is_marked_for_delete = 0;
        char* tb_name = get_table_name_from_number(user_id);
        Eina_Bool ret = insert_msg_into_db(M, tb_name, t);
        free(tb_name);
@@ -1027,6 +1037,8 @@ struct tgl_message* get_latest_message_from_message_table(char* table_name)
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MEDIA_TYPE);
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MEDIA_ID);
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_UNIQUE_ID);
+       col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MARKED_FOR_DELETE);
+
 
        Eina_List* col_types = NULL;
        col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER_PRIMARY_KEY);
@@ -1045,6 +1057,7 @@ struct tgl_message* get_latest_message_from_message_table(char* table_name)
        col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
        col_types = eina_list_append(col_types, TG_DB_COLUMN_TEXT);
        col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
+       col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
 
        message_details = get_values_from_table_sync_order_by(table_name, col_names, col_types, MESSAGE_INFO_TABLE_DATE, EINA_FALSE, NULL);
 
@@ -1142,18 +1155,70 @@ struct tgl_message* get_latest_message_from_message_table(char* table_name)
                        message->media.type  = *temp_media_type;
                        free(temp_media_type);
                }
+
+               int *temp_delete_marked = (int*)eina_list_nth(ts_msg, 14);
+               if (temp_delete_marked) {
+                       message->is_marked_for_delete  = *temp_delete_marked;
+                       free(temp_delete_marked);
+               }
+
                // to do, get media id based on media type
        }
        return message;
 }
 
 
+Eina_List* get_all_message_ids_from_table(char *table_name)
+{
+       if (!table_name) {
+               return NULL;
+       }
+
+       Eina_List *msg_ids = NULL;
+       Eina_List *message_details = NULL;
+       Eina_List *col_names = NULL;
+       col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MESSAGE_ID);
+
+       Eina_List* col_types = NULL;
+       col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
+
+       char* where_clause = NULL;
+       char delete_str[50];
+       sprintf(delete_str,"%d",1);
+       where_clause = (char*)malloc(strlen(MESSAGE_INFO_TABLE_MARKED_FOR_DELETE) + strlen(" = ") + strlen(delete_str) + 1);
+       strcpy(where_clause, MESSAGE_INFO_TABLE_MARKED_FOR_DELETE);
+       strcat(where_clause, " = ");
+       strcat(where_clause, delete_str);
+
+       message_details = get_values_from_table_sync(table_name, col_names, col_types, where_clause);
+
+       free(where_clause);
+       eina_list_free(col_names);
+       eina_list_free(col_types);
+
+       if (msg_ids) {
+               for (int i = 0; i < eina_list_count(msg_ids); i++) {
+                       Eina_List* ts_msg = eina_list_nth(message_details, 0);
+                       int *temp_msg_id = (int*)eina_list_nth(ts_msg, 0);
+                       if (temp_msg_id) {
+                               int msg_id  = *temp_msg_id;
+                               msg_ids = eina_list_append(msg_ids, (void*)msg_id);
+                               free(temp_msg_id);
+                       }
+               }
+       }
+       return msg_ids;
+}
+
 struct tgl_message* get_message_from_message_tableby_message_id(char *table_name, int msg_id)
 {
-       struct tgl_message* message = NULL;
-       Eina_List* message_details = NULL;
+       if (!table_name) {
+               return NULL;
+       }
+       struct tgl_message *message = NULL;
+       Eina_List *message_details = NULL;
 
-       Eina_Listcol_names = NULL;
+       Eina_List *col_names = NULL;
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MESSAGE_ID);
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_FLAGS);
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_FWD_FROM_ID);
@@ -1876,6 +1941,7 @@ Eina_Bool insert_msg_into_db(struct tgl_message *M, char* table_name, int unique
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MEDIA_TYPE);
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MEDIA_ID);
        col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_UNIQUE_ID);
+       col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MARKED_FOR_DELETE);
 
        Eina_List* col_types = NULL;
        col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER_PRIMARY_KEY);
@@ -1894,6 +1960,7 @@ Eina_Bool insert_msg_into_db(struct tgl_message *M, char* table_name, int unique
        col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
        col_types = eina_list_append(col_types, TG_DB_COLUMN_TEXT);
        col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
+       col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
 
        Eina_List* col_values = NULL;
        col_values = eina_list_append(col_values, &(M->id));
@@ -1960,6 +2027,7 @@ Eina_Bool insert_msg_into_db(struct tgl_message *M, char* table_name, int unique
        }
 
        col_values = eina_list_append(col_values, &unique_id);
+       col_values = eina_list_append(col_values, &(M->is_marked_for_delete));
 
        Eina_Bool ret = insert_table(table_name, col_names, col_types,col_values);
        if(!ret) {
@@ -5299,3 +5367,35 @@ Eina_Bool is_user_present_chat_table(int peer_id)
        eina_list_free(col_types);
        return ret;
 }
+
+Eina_Bool delete_message_from_table(char *tablename, int msg_id)
+{
+       if (!tablename) {
+               return EINA_FALSE;
+       }
+
+       char* where_clause = NULL;
+       char msg_id_str[50];
+       sprintf(msg_id_str,"%d", msg_id);
+
+       char *var_query = (char*)malloc(strlen("DELETE FROM ") + strlen(tablename) + strlen(" WHERE ") + strlen(MESSAGE_INFO_TABLE_MESSAGE_ID) + strlen(" = ") + strlen(msg_id_str) + strlen(";") + 1);
+       strcpy(var_query, "DELETE FROM ");
+       strcat(var_query, tablename);
+       strcat(var_query, " WHERE ");
+       strcat(var_query, MESSAGE_INFO_TABLE_MESSAGE_ID);
+       strcat(var_query, " = ");
+       strcat(var_query, msg_id_str);
+       strcat(var_query, ";");
+       int ret;
+       char* err_msg = 0;
+       sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
+       ret = sqlite3_exec(db,var_query, NULL, NULL, &err_msg);
+       close_database(db);
+       if( ret != SQLITE_OK ){
+               sqlite3_free(err_msg);
+               return EINA_FALSE;
+       }
+       free(var_query);
+       return EINA_TRUE;
+}
+
index 3127776..9e58aa2 100644 (file)
@@ -55,6 +55,7 @@ static void on_chat_pic_loaded(struct tgl_state *TLS, void *callback_extra, int
 static void on_document_download_completed(struct tgl_state *TLS, void *callback_extra, int success, char *filename);
 static void on_buddy_pic_loaded(struct tgl_state *TLS, void *callback_extra, int success, char *filename);
 static void on_new_buddy_info_loaded(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_user *U);
+extern void delete_all_messages_from_chat(int buddy_id, int type_of_chat);
 void tgl_engine_var_init(void)
 {
        s_info.default_username = NULL;
@@ -1754,6 +1755,7 @@ void on_new_group_icon_loaded(struct tgl_state *TLS, void *callback_extra, int s
                msg.to_id.type = tg_data->id.type;
                msg.unread = 0;
                msg.media.type = -1;
+               msg.is_marked_for_delete = 0;
                int t = time(NULL);
                insert_msg_into_db(&msg, msg_table, t);
                free(msg_table);
@@ -2045,6 +2047,11 @@ void on_contacts_and_chats_loaded(struct tgl_state *TLS, void *callback_extra, i
                                free(msg_table);
                        }
                }
+
+               char* msg_table = get_table_name_from_number(UC->id.id);
+               create_buddy_msg_table(msg_table);
+               delete_all_messages_from_chat(UC->id.id, UC->id.type);
+               free(msg_table);
        }
 
        ecore_timer_add(3, on_send_unsent_messages_requested, TLS);
@@ -2940,6 +2947,55 @@ void on_mark_read_callback(struct tgl_state *TLS, void *callback_extra, int succ
        // message read sent successfully. update to UI if needed.
 }
 
+
+void on_message_deleted_from_message_list(struct tgl_state *TLS, void *callback_extra, int success)
+{
+       msg_list_container_s *msg_list_container = (msg_list_container_s*)callback_extra;
+       tg_engine_data_s *tg_data = TLS->callback_data;
+
+       if (success && msg_list_container) {
+               // delete message from message table
+               char* tb_name = get_table_name_from_number(msg_list_container->buddy_id);
+               delete_message_from_table(tb_name, msg_list_container->current_message_id);
+               free(tb_name);
+       }
+
+       if (msg_list_container && msg_list_container->message_ids) {
+               if (msg_list_container->current_index < eina_list_count(msg_list_container->message_ids)) {
+                       msg_list_container->current_index = msg_list_container->current_index + 1;
+                       msg_list_container->current_message_id = (int)eina_list_nth(msg_list_container->message_ids, msg_list_container->current_index);
+                       tgl_do_delete_msg(s_info.TLS, msg_list_container->current_message_id, &on_message_deleted_from_message_list , (void*)(msg_list_container));
+               } else {
+                       eina_list_free(msg_list_container->message_ids);
+                       free(msg_list_container);
+               }
+       }
+}
+
+void delete_all_messages_from_chat(int buddy_id, int type_of_chat)
+{
+       tgl_peer_id_t chat_id;
+       chat_id.id = buddy_id;
+       chat_id.type = type_of_chat;
+
+       char* tb_name = get_table_name_from_number(buddy_id);
+       //get all message ids from table.
+       Eina_List *msg_ids = get_all_message_ids_from_table(tb_name);
+       free(tb_name);
+
+       if (msg_ids && eina_list_count(msg_ids) > 0) {
+               msg_list_container_s *msg_list_container = (msg_list_container_s*)malloc(sizeof(msg_list_container_s));
+               msg_list_container->message_ids = msg_ids;
+               msg_list_container->buddy_id = buddy_id;
+               msg_list_container->current_index = 0;
+               msg_list_container->current_message_id = (int)eina_list_nth(msg_list_container->message_ids, msg_list_container->current_index);
+
+               tgl_do_delete_msg(s_info.TLS, msg_list_container->current_message_id, &on_message_deleted_from_message_list , (void*)(msg_list_container));
+       }
+
+}
+
+
 void send_do_mark_read_messages(int buddy_id, int type_of_chat)
 {
        tgl_peer_id_t chat_id;
index 643eaab..0d73fa4 100644 (file)
@@ -163,6 +163,7 @@ typedef struct contact_data {
 
 
 extern void send_do_mark_read_messages(int buddy_id, int type_of_chat);
+extern void delete_all_messages_from_chat(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_typing_status_to_buddy(int buddy_id, int type_of_chat, int typing_status);
 extern void forward_message_to_buddy(int to_id, int type_of_chat, int from_id, int message_id, int temp_message_id);
index 40ecc9b..2c5c998 100644 (file)
@@ -30,6 +30,13 @@ typedef struct msg_container {
        int message_id;
 } msg_container_s;
 
+typedef struct msg_list_container {
+       Eina_List *message_ids;
+       int buddy_id;
+       int current_message_id;
+       int current_index;
+} msg_list_container_s;
+
 extern char *ui_utils_get_resource(const char *res_name);
 
 extern char *get_table_name_from_number(const int id);