#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);
// 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);
#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"
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
}
+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;
}
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);
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);
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);
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;
}
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;
}
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);
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, &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");
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);
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) {
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;
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;
+}
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);
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);
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);
}
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 {
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);
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);
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);
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);
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);
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);
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);
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);
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;
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) {
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:");
int media_type;
char* media_id;
int unique_id;
+ int is_marked_for_delete;
} tg_message_s;
typedef struct tgl_media {
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);
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);
#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"
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_ */
int date;
int service;
int msg_state;
+ int is_marked_for_delete;
union {
struct tgl_message_action action;
struct {
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()) {
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);
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);
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) {
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) {
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;
}
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);
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;
}
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);
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;
}
} 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);
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);
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);
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_List* col_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);
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);
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));
}
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) {
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;
+}
+
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;
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);
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);
// 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;
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);
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);