Merge branch 'tizen' of ssh://review.tizen.org:29418/apps/native/telegram-tizen into... 40/48140/1
authorSung-jae Park <nicesj.park@samsung.com>
Tue, 15 Sep 2015 03:05:14 +0000 (12:05 +0900)
committerSung-jae Park <nicesj.park@samsung.com>
Tue, 15 Sep 2015 03:05:14 +0000 (12:05 +0900)
Conflicts:
TelegramTizen/db_manager/tg_db_manager.c
TelegramTizen/src/telegramtizen.c
tg-engine-service/db_manager/tg_db_manager.c
tg-engine-service/src/server_response.c
tg-engine-service/src/tg_db_wrapper.c
tg-engine-service/tg_engine/tg_engine.c

Change-Id: I9d7a7bd87ac6c99c8c8198af377d1e24b0462941

1  2 
TelegramTizen/db_manager/tg_db_manager.c
TelegramTizen/inc/tg_db_wrapper.h
TelegramTizen/src/telegramtizen.c
TelegramTizen/src/tg_start_messaging_view.c
TelegramTizen/tg_utils/tg_common.h
tg-engine-service/db_manager/tg_db_manager.c
tg-engine-service/inc/server_response.h
tg-engine-service/mtprotocol/tgl-layout.h
tg-engine-service/src/server_response.c
tg-engine-service/tg_engine/tg_engine.c
tg-engine-service/tg_engine_utils/tg_common.h

@@@ -495,8 -526,17 +526,22 @@@ Eina_List* get_values_from_table_sync(c
        int ret;
        const char *type;
        int col;
-       if (!s_info.db || !table_name || !column_names) {
 +
 -
+       sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
+       char* where_clause = NULL;
++      if (!db) {
++              return NULL;
++      }
++
+       if (wc) {
+               where_clause = (char*)malloc(strlen("WHERE ") + strlen(wc) + 1);
+               strcpy(where_clause, "WHERE ");
+               strcat(where_clause, wc);
+       }
+       if (!table_name || !column_names) {
++              close_database(db);
                return NULL;
        }
  
  
        query = malloc(query_len);
        if (!query) {
++              close_database(db);
                return NULL;
        }
  
@@@ -643,12 -689,12 +696,14 @@@ Eina_List *tg_db_get_user_info(tgl_peer
                                "username, online, last_seen " \
                                "FROM user_info_table WHERE user_id = ?", -1, &stmt, NULL);
        if (ret != SQLITE_OK) {
++              close_database(db);
                return NULL;
        }
  
        ret = sqlite3_bind_int(stmt, 1, user_id->id);
        if (ret != SQLITE_OK) {
                sqlite3_finalize(stmt);
++              close_database(db);
                return NULL;
        }
  
  
                result = eina_list_append(result, info);
        }
 -      close_database(db);
        sqlite3_finalize(stmt);
++      close_database(db);
        return result;
  }
  
@@@ -768,6 -814,6 +823,7 @@@ Eina_List *tg_db_get_chat_info(const ch
        ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
        if (ret != SQLITE_OK) {
                LOGE("Failed to bind a text");
++              close_database(db);
                return NULL;
        }
  
@@@ -859,32 -905,32 +915,37 @@@ tg_peer_info_s *tg_db_get_peer_info(con
        sqlite3_stmt *stmt;
        const char *tmp;
        int ret;
-       ret = sqlite3_prepare_v2(s_info.db, "SELECT peer_type, flags, last_msg_id, last_msg_date, print_name, struct_version, no_of_unread_msgs, last_seen_time, photo_path, photo_id FROM ? WHERE peer_id = ?", -1, &stmt, NULL);
+       sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
+       ret = sqlite3_prepare_v2(db, "SELECT peer_type, flags, last_msg_id, last_msg_date, print_name, struct_version, no_of_unread_msgs, last_seen_time, photo_path, photo_id FROM ? WHERE peer_id = ?", -1, &stmt, NULL);
        if (ret != SQLITE_OK) {
++              close_database(db);
                return NULL;
        }
  
        ret = sqlite3_bind_text(stmt, 1, table, -1, SQLITE_TRANSIENT);
        if (ret != SQLITE_OK) {
                sqlite3_finalize(stmt);
++              close_database(db);
                return NULL;
        }
  
        ret = sqlite3_bind_int(stmt, 2, peer_id);
        if (ret != SQLITE_OK) {
                sqlite3_finalize(stmt);
++              close_database(db);
                return NULL;
        }
  
        if (sqlite3_step(stmt) != SQLITE_ROW) {
                sqlite3_finalize(stmt);
++              close_database(db);
                return NULL;
        }
  
        info = calloc(1, sizeof(*info));
        if (!info) {
                sqlite3_finalize(stmt);
++              close_database(db);
                return NULL;
        }
  
@@@ -925,15 -972,15 +987,17 @@@ Eina_List *tg_db_get_messages(const cha
        sqlite3_stmt *stmt;
        const char *tmp;
        int ret;
-       ret = sqlite3_prepare_v2(s_info.db, "SELECT msg_id, flags, fwd_from_id, fwd_date, from_id, to_id, out, unread, date, service, message, msg_state, message_len, media_type, media_id, unique_id FROM ?", -1, &stmt, NULL);
+       sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
+       ret = sqlite3_prepare_v2(db, "SELECT msg_id, flags, fwd_from_id, fwd_date, from_id, to_id, out, unread, date, service, message, msg_state, message_len, media_type, media_id, unique_id FROM ?", -1, &stmt, NULL);
        if (ret != SQLITE_OK) {
++              close_database(db);
                return NULL;
        }
  
        ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
        if (ret != SQLITE_OK) {
                sqlite3_finalize(stmt);
++              close_database(db);
                return NULL;
        }
  
Simple merge
  #include "tg_user_main_view.h"
  #include "tg_messaging_view.h"
  #include "tg_start_messaging_view.h"
 +#include "tg_common.h"
  
--static void
++      static void
  popup_block_clicked_cb(void *data, Evas_Object *obj, void *event_info)
  {
        evas_object_del(obj);
  }
  
--static void
++      static void
  popup_timeout_cb(void *data, Evas_Object *obj, void *event_info)
  {
        evas_object_del(obj);
@@@ -321,141 -328,127 +330,140 @@@ void load_main_list_data(appdata_s *ad
                if (item) {
                        tg_peer_info_s* peer_info = item->use_data;
                        if(peer_info) {
 -                              //if (peer_info->last_msg_id > 0) {
 -
 -                                      // get message from message table.
 -
 -                                      char* tablename = get_table_name_from_number(peer_info->peer_id);
 -                                      //tg_message_s* msg = get_message_from_message_table(peer_info->last_msg_id, tablename);
 -                                      tg_message_s* msg = get_latest_message_from_message_table(tablename);
 +                              tg_main_list_item_s *list_item;
 +                              // get message from message table.
 +                              const char *tablename;
 +                              //tg_message_s* msg = get_message_from_message_table(peer_info->last_msg_id, tablename);
 +                              tg_message_s *msg;
 +
 +                              tablename = tg_common_to_string("tg_%d_msg", peer_info->peer_id);
 +                              if (!tablename) {
 +                                      ERR("Unable to convert a string for peer_id");
 +                                      return;
 +                              }
  
 -                                      if (msg) {
 +                              msg = get_latest_message_from_message_table(tablename);
 +                              if (!msg) {
 +                                      ERR("Unable to get messages");
 +                                      return;
 +                              }
  
-                               switch (msg->media_type) {
-                               case tgl_message_media_photo:
-                                       item->last_message = strdup("Image");
-                                       break;
-                               case tgl_message_media_document:
-                                       item->last_message = strdup("Document");
-                                       break;
-                               case tgl_message_media_geo:
-                                       item->last_message = strdup("Geo location");
-                                       break;
-                               case tgl_message_media_contact:
-                                       item->last_message = strdup("Contact");
-                                       break;
-                               case tgl_message_media_photo_encr:
-                                       item->last_message = strdup("Image encrypted");
-                                       break;
-                               case tgl_message_media_document_encr:
-                                       item->last_message = strdup("Document encrypted");
-                                       break;
-                               case tgl_message_media_none:
-                                       if (msg->message && strlen(msg->message) > 0) {
-                                               item->last_message = strdup(msg->message);
-                                               if (item->last_message) {
 -                                              if (msg->service) {
++                              if (msg) {
++                                      if (msg->service) {
++                                              if (msg->message && strlen(msg->message) > 0) {
++                                                      item->last_message = strdup(msg->message);
++                                              } else {
++                                                      item->last_message = strdup(" ");
++                                              }
++                                      } else {
++                                              switch (msg->media_type) {
++                                              case tgl_message_media_none:
+                                                       if (msg->message && strlen(msg->message) > 0) {
+                                                               item->last_message = strdup(msg->message);
+                                                       } else {
+                                                               item->last_message = strdup(" ");
+                                                       }
 -                                              } else {
 -
 -                                                      int media_type = msg->media_type;
 -                                                      if(media_type == tgl_message_media_none) {
 -                                                              if (msg->message && strlen(msg->message) > 0) {
 -                                                                      item->last_message = strdup(msg->message);
 -                                                              } else {
 -                                                                      item->last_message = strdup(" ");
 -                                                              }
 -                                                      } else if(media_type == tgl_message_media_photo) {
 -                                                              item->last_message = strdup("Image");
 -                                                      } else if(media_type == tgl_message_media_document) {
 -                                                              item->last_message = strdup("Document");
 -                                                      } else if(media_type == tgl_message_media_geo) {
 -                                                              item->last_message = strdup("Geo location");
 -                                                      } else if(media_type == tgl_message_media_contact) {
 -                                                              item->last_message = strdup("Contact");
 -                                                      } else if(media_type == tgl_message_media_unsupported) {
 -                                                              item->last_message = strdup(" ");
 -                                                      } else if(media_type == tgl_message_media_photo_encr) {
 -                                                              item->last_message = strdup("Image encrypted");
 -                                                      } else if(media_type == tgl_message_media_document_encr) {
 -                                                              item->last_message = strdup("Document encrypted");
 -                                                      } else  {
 -                                                              item->last_message = strdup(" ");
 -                                                      }
 -                                              }
 -
 -                                              tg_main_list_item_s* main_list_item = (tg_main_list_item_s*)malloc(sizeof(tg_main_list_item_s));
 -                                              main_list_item->peer_id = peer_info->peer_id;
 -                                              main_list_item->peer_type = peer_info->peer_type;
 -                                              main_list_item->peer_print_name = strdup(peer_info->print_name);
 -                                              main_list_item->last_seen_time = msg->date;
 -                                              main_list_item->profile_pic = NULL;
 -                                              main_list_item->last_msg_id = msg->msg_id;
 -                                              main_list_item->last_message = strdup(item->last_message);
 -                                              main_list_item->last_msg_type = msg->media_type;
 -                                              main_list_item->is_out_msg = msg->out;
 -                                              main_list_item->last_msg_status = msg->msg_state;
 -                                              main_list_item->last_msg_service = msg->service;
 -                                              main_list_item->number_of_unread_msgs = get_unread_message_count(tablename);
 -                                              if (peer_info->photo_path) {
 -                                                      main_list_item->profile_pic_path = strdup(peer_info->photo_path);
 -                                              } else {
 -                                                      main_list_item->profile_pic_path = NULL;
++                                                      break;
++                                              case tgl_message_media_photo:
++                                                      item->last_message = strdup("Image");
++                                                      break;
++                                              case tgl_message_media_document:
++                                                      item->last_message = strdup("Document");
++                                                      break;
++                                              case tgl_message_media_geo:
++                                                      item->last_message = strdup("Geo location");
++                                                      break;
++                                              case tgl_message_media_contact:
++                                                      item->last_message = strdup("Contact");
++                                                      break;
++                                              case tgl_message_media_unsupported:
++                                                      item->last_message = strdup(" ");
++                                                      break;
++                                              case tgl_message_media_photo_encr:
++                                                      item->last_message = strdup("Image encrypted");
++                                                      break;
++                                              case tgl_message_media_document_encr:
++                                                      item->last_message = strdup("Document encrypted");
++                                                      break;
++                                              default:
++                                                      item->last_message = strdup(" ");
 +                                                      break;
                                                }
-                                               ERR("strdup: %d", errno);
 -                                              main_list_item->user_name_lbl = NULL;
 -                                              main_list_item->status_lbl = NULL;
 -                                              main_list_item->date_lbl = NULL;
 -                                              main_list_item->msg_status_lbl = NULL;
 -                                              ad->main_list = eina_list_append(ad->main_list, main_list_item);
 +                                      }
-                                       /* Fall through to default in this case */
-                               case tgl_message_media_unsupported:
-                               default:
-                                       item->last_message = strdup(" ");
-                                       break;
 +                              }
++                              ERR("strdup: %d", errno);
++                      }
++              }
  
-                               list_item = (tg_main_list_item_s *)malloc(sizeof(*item));
-                               if (!list_item) {
-                                       ERR("Unable to allocate heap for an item");
-                                       break;
-                               }
-                               list_item->peer_id = peer_info->peer_id;
-                               list_item->peer_type = peer_info->peer_type;
-                               list_item->peer_print_name = strdup(peer_info->print_name);
-                               if (!list_item->peer_print_name) {
-                                       free(list_item);
-                                       ERR("Unable to allocate heap for print_name");
-                                       break;
-                               }
-                               list_item->last_seen_time = msg->date;
-                               list_item->profile_pic = NULL;
-                               list_item->last_msg_id = msg->msg_id;
-                               list_item->last_message = strdup(item->last_message);
-                               if (!list_item->last_message) {
-                                       free(list_item->peer_print_name);
-                                       free(list_item);
-                                       ERR("Unable to allocate heap for peer_print_name");
-                                       break;
-                               }
-                               list_item->last_msg_type = msg->media_type;
-                               list_item->is_out_msg = msg->out;
-                               list_item->last_msg_status = msg->msg_state;
-                               list_item->number_of_unread_msgs = get_unread_message_count(tablename);
-                               if (peer_info->photo_path) {
-                                       list_item->profile_pic_path = strdup(peer_info->photo_path);
-                               } else {
-                                       list_item->profile_pic_path = NULL;
-                               }
-                               list_item->user_name_lbl = NULL;
-                               list_item->status_lbl = NULL;
-                               list_item->date_lbl = NULL;
-                               list_item->msg_status_lbl = NULL;
-                               ad->main_list = eina_list_append(ad->main_list, list_item);
-                               // delete message object
-                               if(msg->message) {
-                                       free(msg->message);
-                                       msg->message = NULL;
-                               }
 -                                              // delete message object
 -                                              if(msg->message) {
 -                                                      free(msg->message);
 -                                                      msg->message = NULL;
 -                                              }
++              tg_main_list_item_s* main_list_item = (tg_main_list_item_s*)malloc(sizeof(tg_main_list_item_s));
++              main_list_item->peer_id = peer_info->peer_id;
++              main_list_item->peer_type = peer_info->peer_type;
++              main_list_item->peer_print_name = strdup(peer_info->print_name);
++              main_list_item->last_seen_time = msg->date;
++              main_list_item->profile_pic = NULL;
++              main_list_item->last_msg_id = msg->msg_id;
++              main_list_item->last_message = strdup(item->last_message);
++              main_list_item->last_msg_type = msg->media_type;
++              main_list_item->is_out_msg = msg->out;
++              main_list_item->last_msg_status = msg->msg_state;
++              main_list_item->last_msg_service = msg->service;
++              main_list_item->number_of_unread_msgs = get_unread_message_count(tablename);
++              if (peer_info->photo_path) {
++                      main_list_item->profile_pic_path = strdup(peer_info->photo_path);
++              } else {
++                      main_list_item->profile_pic_path = NULL;
++              }
++              main_list_item->user_name_lbl = NULL;
++              main_list_item->status_lbl = NULL;
++              main_list_item->date_lbl = NULL;
++              main_list_item->msg_status_lbl = NULL;
++              ad->main_list = eina_list_append(ad->main_list, main_list_item);
  
-                               if(msg->media_id) {
-                                       free(msg->media_id);
-                                       msg->media_id = NULL;
-                               }
 -                                              if(msg->media_id) {
 -                                                      free(msg->media_id);
 -                                                      msg->media_id = NULL;
 -                                              }
++              // delete message object
++              if(msg->message) {
++                      free(msg->message);
++                      msg->message = NULL;
++              }
  
-                               free(msg);
-                               msg = NULL;
 -                                              free(msg);
 -                                              msg = NULL;
++              // delete message object
++              if(msg->message) {
++                      free(msg->message);
++                      msg->message = NULL;
++              }
 -                                      } else {
 -                                              item->last_message = strdup(" ");
 -                                              if (peer_info->peer_type == TGL_PEER_CHAT) {
 -                                                      tg_main_list_item_s* main_list_item = (tg_main_list_item_s*)malloc(sizeof(tg_main_list_item_s));
 -                                                      main_list_item->peer_id = peer_info->peer_id;
 -                                                      main_list_item->peer_type = peer_info->peer_type;
 -                                                      main_list_item->peer_print_name = strdup(peer_info->print_name);
 -                                                      main_list_item->last_seen_time = peer_info->last_seen_time;
 -                                                      main_list_item->profile_pic = NULL;
 -                                                      main_list_item->last_message = strdup(item->last_message);
 -                                                      main_list_item->last_msg_type = -1;
 -                                                      main_list_item->last_msg_service = 0;
 -                                                      main_list_item->is_out_msg = -1;
 -                                                      main_list_item->last_msg_id = -1;
 -                                                      main_list_item->last_msg_status = -1;
 -                                                      main_list_item->number_of_unread_msgs = 0;
 -                                                      if (peer_info->photo_path) {
 -                                                              main_list_item->profile_pic_path = strdup(peer_info->photo_path);
 -                                                      } else {
 -                                                              main_list_item->profile_pic_path = NULL;
 -                                                      }
 -                                                      main_list_item->user_name_lbl = NULL;
 -                                                      main_list_item->status_lbl = NULL;
 -                                                      main_list_item->date_lbl = NULL;
 -                                                      main_list_item->msg_status_lbl = NULL;
 -                                                      ad->main_list = eina_list_append(ad->main_list, main_list_item);
 -                                              }
 -                                      }
++              if(msg->media_id) {
++                      free(msg->media_id);
++                      msg->media_id = NULL;
++              }
  
 -                                      if (tablename) {
 -                                              free(tablename);
 -                                              tablename = NULL;
 -                                      }
 -                              //}
++      } else {
++              item->last_message = strdup(" ");
++              if (peer_info->peer_type == TGL_PEER_CHAT) {
++                      tg_main_list_item_s* main_list_item = (tg_main_list_item_s*)malloc(sizeof(tg_main_list_item_s));
++                      main_list_item->peer_id = peer_info->peer_id;
++                      main_list_item->peer_type = peer_info->peer_type;
++                      main_list_item->peer_print_name = strdup(peer_info->print_name);
++                      main_list_item->last_seen_time = peer_info->last_seen_time;
++                      main_list_item->profile_pic = NULL;
++                      main_list_item->last_message = strdup(item->last_message);
++                      main_list_item->last_msg_type = -1;
++                      main_list_item->last_msg_service = 0;
++                      main_list_item->is_out_msg = -1;
++                      main_list_item->last_msg_id = -1;
++                      main_list_item->last_msg_status = -1;
++                      main_list_item->number_of_unread_msgs = 0;
++                      if (peer_info->photo_path) {
++                              main_list_item->profile_pic_path = strdup(peer_info->photo_path);
 +                      } else {
-                               item->last_message = strdup(" ");
-                               if (peer_info->peer_type == TGL_PEER_CHAT) {
-                                       tg_main_list_item_s* item = (tg_main_list_item_s*)malloc(sizeof(tg_main_list_item_s));
-                                       item->peer_id = peer_info->peer_id;
-                                       item->peer_type = peer_info->peer_type;
-                                       item->peer_print_name = strdup(peer_info->print_name);
-                                       item->last_seen_time = peer_info->last_seen_time;
-                                       item->profile_pic = NULL;
-                                       item->last_message = strdup(item->last_message);
-                                       item->last_msg_type = -1;
-                                       item->is_out_msg = -1;
-                                       item->last_msg_id = -1;
-                                       item->last_msg_status = -1;
-                                       item->number_of_unread_msgs = 0;
-                                       if (peer_info->photo_path) {
-                                               item->profile_pic_path = strdup(peer_info->photo_path);
-                                       } else {
-                                               item->profile_pic_path = NULL;
-                                       }
-                                       item->user_name_lbl = NULL;
-                                       item->status_lbl = NULL;
-                                       item->date_lbl = NULL;
-                                       item->msg_status_lbl = NULL;
-                                       ad->main_list = eina_list_append(ad->main_list, item);
-                               }
++                              main_list_item->profile_pic_path = NULL;
                        }
++                      main_list_item->user_name_lbl = NULL;
++                      main_list_item->status_lbl = NULL;
++                      main_list_item->date_lbl = NULL;
++                      main_list_item->msg_status_lbl = NULL;
++                      ad->main_list = eina_list_append(ad->main_list, main_list_item);
                }
        }
--
--
  }
  
  void load_group_chat_data(appdata_s *ad)
@@@ -817,7 -810,7 +825,7 @@@ static int _on_service_client_msg_recei
                result = bundle_get_str(rec_msg, "is_success", &is_success_val);
  
                if (strncmp("true", is_success_val, strlen("true")) == 0) {
--              //show_toast(app, is_success_val);
++                      //show_toast(app, is_success_val);
                        // Launch login view
                        elm_naviframe_item_pop(app->nf);
                        launch_login_cb(data);
                                for (int i = 0 ; i < size ; i++) {
                                        user_data_with_pic_s *item = eina_list_nth(app->buddy_list, i);
                                        if (item->use_data->user_id.id == user_id) {
--                                      if (item->use_data->photo_path) {
--                                              free(item->use_data->photo_path);
--                                              item->use_data->photo_path = NULL;
--                                      }
++                                              if (item->use_data->photo_path) {
++                                                      free(item->use_data->photo_path);
++                                                      item->use_data->photo_path = NULL;
++                                              }
                                                item->use_data->photo_path = strdup(pic_file_path);
                                                if (item->contact_icon) {
                                                        elm_image_file_set(item->contact_icon, pic_file_path, NULL);
                                for (int i = 0 ; i < size ; i++) {
                                        peer_with_pic_s *item = eina_list_nth(app->peer_list, i);
                                        if (item->use_data->peer_id == user_id) {
--                                      if (item->use_data->photo_path) {
--                                              free(item->use_data->photo_path);
--                                              item->use_data->photo_path = NULL;
--                                      }
++                                              if (item->use_data->photo_path) {
++                                                      free(item->use_data->photo_path);
++                                                      item->use_data->photo_path = NULL;
++                                              }
                                                item->use_data->photo_path = strdup(pic_file_path);
                                                if (item->contact_icon) {
                                                        elm_image_file_set(item->contact_icon, pic_file_path, NULL);
                                }
                        }
  
--              if(app->main_list) {
--                      int size = eina_list_count(app->main_list);
--                      for (int i = 0 ; i < size ; i++) {
--                              tg_main_list_item_s *item = eina_list_nth(app->main_list, i);
--                              if (item->peer_id == user_id) {
--                                      if (item->profile_pic_path) {
--                                              free(item->profile_pic_path);
--                                              item->profile_pic_path = NULL;
--                                      }
--                                      item->profile_pic_path = strdup(pic_file_path);
--                                      if (item->profile_pic) {
--                                              elm_image_file_set(item->profile_pic, pic_file_path, NULL);
--                                      }
--                                      break;
--                              }
--                      }
--              }
++                      if(app->main_list) {
++                              int size = eina_list_count(app->main_list);
++                              for (int i = 0 ; i < size ; i++) {
++                                      tg_main_list_item_s *item = eina_list_nth(app->main_list, i);
++                                      if (item->peer_id == user_id) {
++                                              if (item->profile_pic_path) {
++                                                      free(item->profile_pic_path);
++                                                      item->profile_pic_path = NULL;
++                                              }
++                                              item->profile_pic_path = strdup(pic_file_path);
++                                              if (item->profile_pic) {
++                                                      elm_image_file_set(item->profile_pic, pic_file_path, NULL);
++                                              }
++                                              break;
++                                      }
++                              }
++                      }
  
                }
        } else if (strcmp(rec_key_val, "message_received") == 0) {
                                                        } else {
                                                                sel_item->last_message = strdup(" ");
                                                        }
-                                               } else if(media_type == tgl_message_media_photo) {
-                                                       sel_item->last_message = strdup("Image");
-                                               } else if(media_type == tgl_message_media_document) {
-                                                       sel_item->last_message = strdup("Document");
-                                               } else if(media_type == tgl_message_media_geo) {
-                                                       sel_item->last_message = strdup("Geo location");
-                                               } else if(media_type == tgl_message_media_contact) {
-                                                       sel_item->last_message = strdup("Contact");
-                                               } else if(media_type == tgl_message_media_unsupported) {
-                                                       sel_item->last_message = strdup(" ");
-                                               } else if(media_type == tgl_message_media_photo_encr) {
-                                                       sel_item->last_message = strdup("Image encrypted");
-                                               } else if(media_type == tgl_message_media_document_encr) {
-                                                       sel_item->last_message = strdup("Document encrypted");
-                                               } else  {
-                                                       sel_item->last_message = strdup(" ");
+                                               } else {
 -
 -                                                      int media_type = msg->media_type;
 -                                                      if(media_type == tgl_message_media_none) {
 -                                                              if (msg->message && strlen(msg->message) > 0) {
 -                                                                      sel_item->last_message = strdup(msg->message);
 -                                                              } else {
 -                                                                      sel_item->last_message = strdup(" ");
 -                                                              }
 -                                                      } else if(media_type == tgl_message_media_photo) {
++                                                      switch (msg->media_type) {
++                                                      case tgl_message_media_photo:
+                                                               sel_item->last_message = strdup("Image");
 -                                                      } else if(media_type == tgl_message_media_document) {
++                                                              break;
++                                                      case tgl_message_media_document:
+                                                               sel_item->last_message = strdup("Document");
 -                                                      } else if(media_type == tgl_message_media_geo) {
++                                                              break;
++                                                      case tgl_message_media_geo:
+                                                               sel_item->last_message = strdup("Geo location");
 -                                                      } else if(media_type == tgl_message_media_contact) {
++                                                              break;
++                                                      case tgl_message_media_contact:
+                                                               sel_item->last_message = strdup("Contact");
 -                                                      } else if(media_type == tgl_message_media_unsupported) {
 -                                                              sel_item->last_message = strdup(" ");
 -                                                      } else if(media_type == tgl_message_media_photo_encr) {
++                                                              break;
++                                                      case tgl_message_media_photo_encr:
+                                                               sel_item->last_message = strdup("Image encrypted");
 -                                                      } else if(media_type == tgl_message_media_document_encr) {
++                                                              break;
++                                                      case tgl_message_media_document_encr:
+                                                               sel_item->last_message = strdup("Document encrypted");
 -                                                      } else  {
++                                                              break;
++                                                      case tgl_message_media_none:
++                                                              if (msg->message && strlen(msg->message) > 0) {
++                                                                      sel_item->last_message = strdup(msg->message);
++                                                                      break;
++                                                              }
++                                                      case tgl_message_media_unsupported:
++                                                      default:
+                                                               sel_item->last_message = strdup(" ");
 -                                                      }
++                                                              break;
                                                }
                                                sel_item->last_msg_id = msg->msg_id;
                                                sel_item->last_msg_type = msg->media_type;
                                                }
  
                                                if (sel_item->status_lbl) {
--                                              char* org_msg = NULL;
--                                              if (sel_item->last_message) {
--                                                      org_msg = sel_item->last_message;
--                                              } else {
--                                                      org_msg = "";
--                                              }
--
--                                              int len_org_str = strlen(org_msg);
--
--                                              char res[25] = {'\0'};
--                                              char status_buf[126] = {'\0'};
--                                              if(len_org_str > 25) {
--                                                      strncpy(res, org_msg, 24);
-                                                       //snprintf(status_buf, 512, "<font=Tizen:style=Italic color=#A4A4A4 align=left><font_size=30>%s</font_size></font>", res);
-                                                       sprintf(status_buf,"<font=Tizen:style=Italic color=#A4A4A4 align=left><font_size=30>%s</font_size></font>", res);
 -                                                      if(msg->service) {
 -                                                              sprintf(status_buf,"<font=Tizen:style=Italic color=#158CB0 align=left><font_size=30>%s</font_size></font>", res);
 -                                                      } else {
 -                                                              sprintf(status_buf,"<font=Tizen:style=Italic color=#A4A4A4 align=left><font_size=30>%s</font_size></font>", res);
 -                                                      }
--                                              } else {
-                                                       //snprintf(status_buf, 512, "<font=Tizen:style=Italic color=#A4A4A4 align=left><font_size=30>%s</font_size></font>", org_msg);
-                                                       snprintf(status_buf, "<font=Tizen:style=Italic color=#A4A4A4 align=left><font_size=30>%s</font_size></font>", org_msg);
 -                                                      if(msg->service) {
 -                                                              sprintf(status_buf, "<font=Tizen:style=Italic color=#158CB0 align=left><font_size=30>%s</font_size></font>", org_msg);
 -                                                      } else {
 -                                                              sprintf(status_buf, "<font=Tizen:style=Italic color=#A4A4A4 align=left><font_size=30>%s</font_size></font>", org_msg);
 -                                                      }
--                                              }
++                                                      char* org_msg = NULL;
++                                                      if (sel_item->last_message) {
++                                                              org_msg = sel_item->last_message;
++                                                      } else {
++                                                              org_msg = "";
++                                                      }
++
++                                                      int len_org_str = strlen(org_msg);
++
++                                                      char res[25] = {'\0'};
++                                                      char status_buf[126] = {'\0'};
++                                                      if(len_org_str > 25) {
++                                                              strncpy(res, org_msg, 24);
++                                                              if(msg->service) {
++                                                                      sprintf(status_buf,"<font=Tizen:style=Italic color=#158CB0 align=left><font_size=30>%s</font_size></font>", res);
++                                                              } else {
++                                                                      sprintf(status_buf,"<font=Tizen:style=Italic color=#A4A4A4 align=left><font_size=30>%s</font_size></font>", res);
++                                                              }
++                                                      } else {
++                                                              if(msg->service) {
++                                                                      sprintf(status_buf, "<font=Tizen:style=Italic color=#158CB0 align=left><font_size=30>%s</font_size></font>", org_msg);
++                                                              } else {
++                                                                      sprintf(status_buf, "<font=Tizen:style=Italic color=#A4A4A4 align=left><font_size=30>%s</font_size></font>", org_msg);
++                                                              }
++                                                      }
                                                        elm_object_text_set(sel_item->status_lbl, status_buf);
                                                }
  
                        }
                }
  
--
--
--
                if (type_of_chat == TGL_PEER_USER) {
-                       if (app->current_app_state ==  TG_CHAT_MESSAGING_VIEW_STATE && app->buddy_in_cahtting_data
-                                       && app->buddy_in_cahtting_data->use_data->user_id.id == from_id) {
+                       if (app->current_app_state ==  TG_CHAT_MESSAGING_VIEW_STATE && app->peer_in_cahtting_data
+                                       && app->peer_in_cahtting_data->use_data->peer_id == from_id) {
                                on_text_message_received_from_buddy(app, message_id, type_of_chat);
                        }
  
  
                char* chat_id_str = NULL;
                result = bundle_get_str(rec_msg, "chat_id", &chat_id_str);
--              
++
  
  #if 0
--        int chat_id = atoi(chat_id_str);
++              int chat_id = atoi(chat_id_str);
                // get group chat details from database.(chat info)
                // tg_chat_info_s* chat_info = get_chat_info(chat_id);
  
  
                char* update_msg = NULL;
                result = bundle_get_str(rec_msg, "update_message", &update_msg);
--      //show_toast(app, update_msg);
++              //show_toast(app, update_msg);
        } else if (strcmp(rec_key_val, "buddy_status_updated") == 0) {
                char* buddy_id_str = NULL;
                result = bundle_get_str(rec_msg, "buddy_id", &buddy_id_str);
                char* type_status_message = NULL;
  
                switch (type_status) {
--                      case tgl_typing_none:
--                              type_status_message = (char*)malloc(strlen("doing nothing") + 1);
--                              strcpy(type_status_message, "doing nothing");
--                              break;
--                      case tgl_typing_typing:
--                              type_status_message = (char*)malloc(strlen("typing...") + 1);
--                              strcpy(type_status_message, "typing...");
--                              break;
--                      case tgl_typing_cancel:
--                              type_status_message = (char*)malloc(strlen("deleting typed message") + 1);
--                              strcpy(type_status_message, "deleting typed message");
--                              break;
--                      case tgl_typing_record_video:
--                              type_status_message = (char*)malloc(strlen("recording video") + 1);
--                              strcpy(type_status_message, "recording video");
--                              break;
--                      case tgl_typing_upload_video:
--                              type_status_message = (char*)malloc(strlen("uploading video") + 1);
--                              strcpy(type_status_message, "uploading video");
--                              break;
--                      case tgl_typing_record_audio:
--                              type_status_message = (char*)malloc(strlen("recording audio") + 1);
--                              strcpy(type_status_message, "recording audio");
--                              break;
--                      case tgl_typing_upload_audio:
--                              type_status_message = (char*)malloc(strlen("uploading audio") + 1);
--                              strcpy(type_status_message, "uploading audio");
--                              break;
--                      case tgl_typing_upload_photo:
--                              type_status_message = (char*)malloc(strlen("uploading photo") + 1);
--                              strcpy(type_status_message, "uploading photo");
--                              break;
--                      case tgl_typing_upload_document:
--                              type_status_message = (char*)malloc(strlen("uploading document") + 1);
--                              strcpy(type_status_message, "uploading document");
--                              break;
--                      case tgl_typing_geo:
--                              type_status_message = (char*)malloc(strlen("choosing location") + 1);
--                              strcpy(type_status_message, "choosing location");
--                              break;
--                      case tgl_typing_choose_contact:
--                              type_status_message = (char*)malloc(strlen("choosing contact") + 1);
--                              strcpy(type_status_message, "choosing contact");
--                              break;
++              case tgl_typing_none:
++                      type_status_message = (char*)malloc(strlen("doing nothing") + 1);
++                      strcpy(type_status_message, "doing nothing");
++                      break;
++              case tgl_typing_typing:
++                      type_status_message = (char*)malloc(strlen("typing...") + 1);
++                      strcpy(type_status_message, "typing...");
++                      break;
++              case tgl_typing_cancel:
++                      type_status_message = (char*)malloc(strlen("deleting typed message") + 1);
++                      strcpy(type_status_message, "deleting typed message");
++                      break;
++              case tgl_typing_record_video:
++                      type_status_message = (char*)malloc(strlen("recording video") + 1);
++                      strcpy(type_status_message, "recording video");
++                      break;
++              case tgl_typing_upload_video:
++                      type_status_message = (char*)malloc(strlen("uploading video") + 1);
++                      strcpy(type_status_message, "uploading video");
++                      break;
++              case tgl_typing_record_audio:
++                      type_status_message = (char*)malloc(strlen("recording audio") + 1);
++                      strcpy(type_status_message, "recording audio");
++                      break;
++              case tgl_typing_upload_audio:
++                      type_status_message = (char*)malloc(strlen("uploading audio") + 1);
++                      strcpy(type_status_message, "uploading audio");
++                      break;
++              case tgl_typing_upload_photo:
++                      type_status_message = (char*)malloc(strlen("uploading photo") + 1);
++                      strcpy(type_status_message, "uploading photo");
++                      break;
++              case tgl_typing_upload_document:
++                      type_status_message = (char*)malloc(strlen("uploading document") + 1);
++                      strcpy(type_status_message, "uploading document");
++                      break;
++              case tgl_typing_geo:
++                      type_status_message = (char*)malloc(strlen("choosing location") + 1);
++                      strcpy(type_status_message, "choosing location");
++                      break;
++              case tgl_typing_choose_contact:
++                      type_status_message = (char*)malloc(strlen("choosing contact") + 1);
++                      strcpy(type_status_message, "choosing contact");
++                      break;
                }
  
                // update UI. may be contacts view or conversation view.
                        type_status_message = NULL;
                }
  
 -                                              char* org_msg = NULL;
 -                                              if (sel_item->last_message) {
 -                                                      org_msg = sel_item->last_message;
 -                                              } else {
 -                                                      org_msg = "";
 -                                              }
 -
 -                                              int len_org_str = strlen(org_msg);
 -
 -                                              char res[25] = {'\0'};
 -                                              char status_buf[126] = {'\0'};
 -                                              if(len_org_str > 25) {
 -                                                      strncpy(res, org_msg, 24);
 -                                                      sprintf(status_buf,"<font=Tizen:style=Italic color=#A4A4A4 align=left><font_size=30>%s</font_size></font>", res);
 -                                              } else {
 -                                                      snprintf(status_buf, "<font=Tizen:style=Italic color=#A4A4A4 align=left><font_size=30>%s</font_size></font>", org_msg);
 -                                              }
+       } else if (strcmp(rec_key_val, "user_status_updated") == 0) {
+               char* buddy_id_str = NULL;
+               result = bundle_get_str(rec_msg, "buddy_id", &buddy_id_str);
+               int buddy_id = atoi(buddy_id_str);
+               char* buddy_name = NULL;
+               result = bundle_get_str(rec_msg, "buddy_name", &buddy_name);
+               if (app->current_app_state ==  TG_USER_MAIN_VIEW_STATE) {
+                       if (app->main_list) {
+                               int main_list_size = eina_list_count(app->main_list);
+                               for (int i = 0; i < main_list_size; i++) {
+                                       tg_main_list_item_s* sel_item = eina_list_nth(app->main_list, i);
+                                       if (sel_item->peer_id == buddy_id ) {
+                                               // update last message
+                                               if (sel_item->profile_pic) {
+                                               }
+                                               if (sel_item->user_name_lbl) {
+                                               }
+                                               if (sel_item->status_lbl) {
++                                                      char* org_msg = NULL;
++                                                      if (sel_item->last_message) {
++                                                              org_msg = sel_item->last_message;
++                                                      } else {
++                                                              org_msg = "";
++                                                      }
++
++                                                      int len_org_str = strlen(org_msg);
++
++                                                      char res[25] = {'\0'};
++                                                      char status_buf[126] = {'\0'};
++                                                      if(len_org_str > 25) {
++                                                              strncpy(res, org_msg, 24);
++                                                              sprintf(status_buf,"<font=Tizen:style=Italic color=#A4A4A4 align=left><font_size=30>%s</font_size></font>", res);
++                                                      } else {
++                                                              snprintf(status_buf, "<font=Tizen:style=Italic color=#A4A4A4 align=left><font_size=30>%s</font_size></font>", org_msg);
++                                                      }
+                                                       elm_object_text_set(sel_item->status_lbl, status_buf);
+                                               }
+                                               if (sel_item->date_lbl) {
+                                               }
+                                               if (sel_item->msg_status_lbl) {
+                                               }
+                                               break;
+                                       }
+                               }
+                       }
+               }
+               if (app->current_app_state ==  TG_CHAT_MESSAGING_VIEW_STATE && app->buddy_in_cahtting_data && app->buddy_in_cahtting_data->use_data->user_id.id == buddy_id) {
+                       on_user_presence_state_changed(app, buddy_id);
+               }
        } else {
  
        }
@@@ -1570,102 -1654,102 +1669,102 @@@ void app_nf_back_cb(void *data, Evas_Ob
  {
        appdata_s *ad = data;
        switch(ad->current_app_state) {
--              case TG_INIT_SCREEN_STATE:
--                      elm_win_lower(ad->win);
--                      elm_exit();
--                      break;
--              case TG_USER_MAIN_VIEW_STATE:
--                      elm_win_lower(ad->win);
--                      elm_exit();
--                      break;
--              case TG_CHAT_MESSAGING_VIEW_STATE:
--            // to be handled 
--                      if (ad->is_last_msg_changed) {
--                              // update main view.
--                              // refresh main view
++      case TG_INIT_SCREEN_STATE:
++              elm_win_lower(ad->win);
++              elm_exit();
++              break;
++      case TG_USER_MAIN_VIEW_STATE:
++              elm_win_lower(ad->win);
++              elm_exit();
++              break;
++      case TG_CHAT_MESSAGING_VIEW_STATE:
++              // to be handled 
++              if (ad->is_last_msg_changed) {
++                      // update main view.
++                      // refresh main view
  
--                      } else {
++              } else {
  
--                      }
--                      refresh_main_view_list(ad);
--                      elm_naviframe_item_pop(ad->nf);
--                      ad->current_app_state = TG_USER_MAIN_VIEW_STATE;
--                      break;
--              case TG_START_MESSAGING_VIEW_STATE:
--                      elm_naviframe_item_pop(ad->nf);
--                      ad->current_app_state = TG_USER_MAIN_VIEW_STATE;
--                      break;
--              case TG_REGISTRATION_STATE:
--                      elm_win_lower(ad->win);
--                      elm_exit();
--                      break;
--              case TG_LOGIN_STATE:
++              }
++              refresh_main_view_list(ad);
++              elm_naviframe_item_pop(ad->nf);
++              ad->current_app_state = TG_USER_MAIN_VIEW_STATE;
++              break;
++      case TG_START_MESSAGING_VIEW_STATE:
++              elm_naviframe_item_pop(ad->nf);
++              ad->current_app_state = TG_USER_MAIN_VIEW_STATE;
++              break;
++      case TG_REGISTRATION_STATE:
++              elm_win_lower(ad->win);
++              elm_exit();
++              break;
++      case TG_LOGIN_STATE:
  
--                      if (ad->timer_value > 0) {
--                              Ecore_Timer* timer = evas_object_data_get(ad->nf, "code_timer");
--                              if (timer)
--                                      ecore_timer_del(timer);
--                      }
++              if (ad->timer_value > 0) {
++                      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;
--                      break;
--              case TG_PROFILE_REGISTRATION_STATE:
--                      /*                      ad->current_app_state = TG_REGISTRATION_STATE;
--                                              elm_naviframe_item_pop(ad->nf);*/
--                      elm_win_lower(ad->win);
--                      elm_exit();
--                      break;
--              case TG_BUDDY_LIST_STATE:
--                      evas_object_data_set(ad->nf, "buddy_list", NULL);
--                      elm_win_lower(ad->win);
--                      elm_exit();
--                      break;
--              case TG_BUDDY_CHAT_CONV_STATE:
--                      ad->buddy_in_cahtting_data = NULL;
--                      if (ad->loaded_msg_list) {
--                              eina_list_free(ad->loaded_msg_list);
--                              ad->loaded_msg_list = NULL;
--                      }
--                      elm_naviframe_item_pop(ad->nf);
--                      ad->current_app_state = TG_BUDDY_LIST_STATE;
--                      //evas_object_show(ad->panel);
--                      //refresh_buddy_list(ad);
--                      break;
--              case TG_BUDDY_LIST_SELECTION_STATE:
--                      if (ad->buddy_list) {
--                              for (int i = 0 ; i < eina_list_count(ad->buddy_list) ; i++) {
--                                      user_data_with_pic_s *item = eina_list_nth(ad->buddy_list, i);
--                                      user_data_s* user = item->use_data;
--                                      user->is_selected = EINA_FALSE;
--                              }
++              elm_naviframe_item_pop(ad->nf);
++              ad->current_app_state = TG_REGISTRATION_STATE;
++              break;
++      case TG_PROFILE_REGISTRATION_STATE:
++              /*                      ad->current_app_state = TG_REGISTRATION_STATE;
++                                      elm_naviframe_item_pop(ad->nf);*/
++              elm_win_lower(ad->win);
++              elm_exit();
++              break;
++      case TG_BUDDY_LIST_STATE:
++              evas_object_data_set(ad->nf, "buddy_list", NULL);
++              elm_win_lower(ad->win);
++              elm_exit();
++              break;
++      case TG_BUDDY_CHAT_CONV_STATE:
++              ad->buddy_in_cahtting_data = NULL;
++              if (ad->loaded_msg_list) {
++                      eina_list_free(ad->loaded_msg_list);
++                      ad->loaded_msg_list = NULL;
++              }
++              elm_naviframe_item_pop(ad->nf);
++              ad->current_app_state = TG_BUDDY_LIST_STATE;
++              //evas_object_show(ad->panel);
++              //refresh_buddy_list(ad);
++              break;
++      case TG_BUDDY_LIST_SELECTION_STATE:
++              if (ad->buddy_list) {
++                      for (int i = 0 ; i < eina_list_count(ad->buddy_list) ; i++) {
++                              user_data_with_pic_s *item = eina_list_nth(ad->buddy_list, i);
++                              user_data_s* user = item->use_data;
++                              user->is_selected = EINA_FALSE;
                        }
--                      elm_naviframe_item_pop(ad->nf);
--                      ad->current_app_state = TG_BUDDY_LIST_STATE;
--                      evas_object_show(ad->panel);
-                       elm_panel_hidden_set(ad->panel, EINA_FALSE);
 -                      //elm_panel_hidden_set(ad->panel, EINA_FALSE);
--                      //refresh_buddy_list(ad);
--                      break;
--              case TG_GROUP_CHAT_NAME_ENTRY_STATE:
--                      if (ad->buddy_list) {
--                              for (int i = 0 ; i < eina_list_count(ad->buddy_list) ; i++) {
--                                      user_data_with_pic_s *item = eina_list_nth(ad->buddy_list, i);
--                                      user_data_s* user = item->use_data;
--                                      user->is_selected = EINA_FALSE;
--                              }
++              }
++              elm_naviframe_item_pop(ad->nf);
++              ad->current_app_state = TG_BUDDY_LIST_STATE;
++              evas_object_show(ad->panel);
++              //elm_panel_hidden_set(ad->panel, EINA_FALSE);
++              //refresh_buddy_list(ad);
++              break;
++      case TG_GROUP_CHAT_NAME_ENTRY_STATE:
++              if (ad->buddy_list) {
++                      for (int i = 0 ; i < eina_list_count(ad->buddy_list) ; i++) {
++                              user_data_with_pic_s *item = eina_list_nth(ad->buddy_list, i);
++                              user_data_s* user = item->use_data;
++                              user->is_selected = EINA_FALSE;
                        }
--                      elm_naviframe_item_pop(ad->nf);
--                      ad->current_app_state = TG_BUDDY_LIST_STATE;
--                      evas_object_show(ad->panel);
-                       elm_panel_hidden_set(ad->panel, EINA_FALSE);
 -                      //elm_panel_hidden_set(ad->panel, EINA_FALSE);
--                      //refresh_buddy_list(ad);
--                      break;
--              default:
--                      break;
++              }
++              elm_naviframe_item_pop(ad->nf);
++              ad->current_app_state = TG_BUDDY_LIST_STATE;
++              evas_object_show(ad->panel);
++              //elm_panel_hidden_set(ad->panel, EINA_FALSE);
++              //refresh_buddy_list(ad);
++              break;
++      default:
++              break;
        }
  }
  
--void
++      void
  layout_back_cb(void *data, Evas_Object *obj, void *event_info)
  {
        appdata_s *ad = data;
@@@ -1765,7 -1849,7 +1864,7 @@@ static void create_base_gui(appdata_s *
        //eina_list_free(user_info);
  }
  
--static bool
++      static bool
  app_create(void *data)
  {
        /*
        return true;
  }
  
--static void
++      static void
  app_control(app_control_h app_control, void *data)
  {
        /* Handle the launch request. */
  }
  
--static void
++      static void
  app_pause(void *data)
  {
        /* Take necessary actions when application becomes invisible. */
  }
  
--static void
++      static void
  app_resume(void *data)
  {
        /* Take necessary actions when application becomes visible. */
  }
  
--static void
++      static void
  app_terminate(void *data)
  {
        /* Release all resources. */
        tg_db_fini();
  }
  
--static void
++      static void
  ui_app_lang_changed(app_event_info_h event_info, void *user_data)
  {
        /*APP_EVENT_LANGUAGE_CHANGED*/
        return;
  }
  
--static void
++      static void
  ui_app_orient_changed(app_event_info_h event_info, void *user_data)
  {
        /*APP_EVENT_DEVICE_ORIENTATION_CHANGED*/
        return;
  }
  
--static void
++      static void
  ui_app_region_changed(app_event_info_h event_info, void *user_data)
  {
        /*APP_EVENT_REGION_FORMAT_CHANGED*/
  }
  
--static void
++      static void
  ui_app_low_battery(app_event_info_h event_info, void *user_data)
  {
        /*APP_EVENT_LOW_BATTERY*/
  }
  
--static void
++      static void
  ui_app_low_memory(app_event_info_h event_info, void *user_data)
  {
        /*APP_EVENT_LOW_MEMORY*/
  }
  
--int
++      int
  main(int argc, char *argv[])
  {
        appdata_s ad = {0,};
Simple merge
@@@ -53,1450 -73,407 +77,1449 @@@ int tg_db_fini(void
        return EINA_TRUE;
  }
  
 -Eina_Bool create_table(const char* table_name, Eina_List* column_names, Eina_List* column_types)
 +static inline int create_table_query_to_db(const char *ddl, const char *table_name)
  {
 -      if(!table_name || ! column_names || !column_types) {
 -              return EINA_FALSE;
 +      sqlite3_stmt *stmt;
 +      int ret;
 +
 +      ret = sqlite3_prepare_v2(s_info.db, ddl, -1, &stmt, NULL);
 +      if (ret != SQLITE_OK) {
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_step(stmt);
 +      if (ret != SQLITE_DONE) {
 +              sqlite3_finalize(stmt);
 +              return -EIO;
        }
  
 -      sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
 -
 -      int ret = 0 ;
 -      char* err_msg = 0;
 -      int col_count = eina_list_count(column_names);
 -
 -      int str_len = strlen("CREATE TABLE IF NOT EXISTS ") + strlen(table_name) + strlen("(") + 1;
 -      char* var_query = (char*)malloc(str_len);
 -      strcpy(var_query,"CREATE TABLE IF NOT EXISTS ");
 -      strcat(var_query, table_name);
 -      strcat(var_query, "(");
 -
 -      for(int col = 0; col < col_count ; col++) {
 -              char* col_name = eina_list_nth(column_names, col);
 -              var_query = realloc(var_query, strlen(var_query)+strlen(col_name) + 1);
 -              strcat(var_query, col_name);
 -              var_query = realloc(var_query, strlen(var_query)+strlen(" ") + 1);
 -              strcat(var_query, " ");
 -              char* col_type = eina_list_nth(column_types, col);
 -              var_query = realloc(var_query, strlen(var_query)+strlen(col_type) + 1);
 -              strcat(var_query, col_type);
 -              if(col < col_count - 1){
 -                      var_query = realloc(var_query, strlen(var_query) + 2);
 -                      strcat(var_query, ",");
 -              } else {
 -                      var_query = realloc(var_query, strlen(var_query) + 3);
 -                      strcat(var_query, ");");
 +      sqlite3_finalize(stmt);
 +      return 0;
 +}
 +
 +int tg_db_create_table_user_info(const char *table_name)
 +{
 +      const char *ddl;
 +
 +      ddl = "CREATE TABLE ? (" \
 +                      "user_id INTEGER PRIMARY KEY NOT NULL," \
 +                      "print_name TEXT," \
 +                      "structure_version INTEGER," \
 +                      "photo_path TEXT," \
 +                      "photo_id INTEGER," \
 +                      "first_name TEXT," \
 +                      "last_name TEXT," \
 +                      "phone TEXT," \
 +                      "access_hash INTEGER," \
 +                      "real_first_name TEXT," \
 +                      "real_last_name TEXT," \
 +                      "username TEXT," \
 +                      "online INTEGER," \
 +                      "last_seen INTEGER)";
 +
 +      return create_table_query_to_db(ddl, table_name);
 +}
 +
 +int tg_db_create_table_media_info(const char *table_name)
 +{
 +      const char *ddl;
 +      ddl = "CREATE TABLE ? (" \
 +                      "media_id TEXT," \
 +                      "media_type INTEGER," \
 +                      "access_hash TEXT," \
 +                      "user_id INTEGER," \
 +                      "date INTEGER," \
 +                      "caption TEXT," \
 +                      "longitude TEXT," \
 +                      "latitude TEXT," \
 +                      "sizes_num INTEGER," \
 +                      "photo_type1 TEXT," \
 +                      "photo_loc_dc1 INTEGER," \
 +                      "photo_loc_vol1 TEXT," \
 +                      "photo_loc_id1 INTEGER," \
 +                      "photo_loc_secret1 TEXT," \
 +                      "photo_width1 INTEGER," \
 +                      "photo_height1 INTEGER," \
 +                      "photo_size1 INTEGER," \
 +                      "photo_data1 TEXT," \
 +                      "photo_type2 TEXT," \
 +                      "photo_loc_dc2 INTEGER," \
 +                      "photo_loc_vol2 TEXT," \
 +                      "photo_loc_id2 INTEGER," \
 +                      "photo_loc_secret2 TEXT," \
 +                      "photo_width2 INTEGER," \
 +                      "photo_height2 INTEGER," \
 +                      "photo_size2 INTEGER," \
 +                      "photo_data2 TEXT," \
 +                      "photo_type3 TEXT," \
 +                      "photo_loc_dc3 INTEGER," \
 +                      "photo_loc_vol3 TEXT," \
 +                      "photo_loc_id3 INTEGER," \
 +                      "photo_loc_secret3 TEXT," \
 +                      "photo_width3 INTEGER," \
 +                      "photo_height3 INTEGER," \
 +                      "photo_size3 INTEGER," \
 +                      "photo_data3 TEXT," \
 +                      "photo_type4 TEXT," \
 +                      "photo_loc_dc4 INTEGER," \
 +                      "photo_loc_vol4 TEXT," \
 +                      "photo_loc_id4 INTEGER," \
 +                      "photo_loc_secret4 TEXT," \
 +                      "photo_width4 INTEGER," \
 +                      "photo_height4 INTEGER," \
 +                      "photo_size4 INTEGER," \
 +                      "photo_data4 TEXT," \
 +                      "phone TEXT," \
 +                      "first_name TEXT," \
 +                      "last_name TEXT," \
 +                      "file_path TEXT)";
 +      return create_table_query_to_db(ddl, table_name);
 +}
 +
 +int tg_db_update_media_info_filepath(const char *table_name, long long media_id, const char *filepath)
 +{
 +      const char *dml;
 +      const char *id_str;
 +      int ret;
 +      sqlite3_stmt *stmt;
 +
 +      dml = "UPDATE ? SET file_path = ? WHERE media_id = ?";
 +
 +      ret = sqlite3_prepare_v2(s_info.db, dml, -1, &stmt, NULL);
 +      ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_text(stmt, 2, filepath, -1, SQLITE_TRANSIENT);
 +      id_str = tg_common_to_string("%lld", media_id);
 +      ret = sqlite3_bind_text(stmt, 3, id_str, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_step(stmt);
 +      sqlite3_finalize(stmt);
 +      return 0;
 +}
 +
 +int tg_db_update_media_info_by_id(const char *table_name, struct tgl_message *msg, long long id)
 +{
 +      const char *dml;
 +      const char *tmp;
 +      int ret;
 +      sqlite3_stmt *stmt;
 +      int i;
 +
 +      dml = "UPDATE ? SET media_id = ?, "
 +                      "media_type = ?, "
 +                      "access_hash = ?, "
 +                      "user_id = ?, "
 +                      "date = ?, "
 +                      "caption = ?, "
 +                      "longitude = ?, "
 +                      "latitude = ?, "
 +                      "sizes_num = ?, "
 +                      "photo_type1 = ?," \
 +                      "photo_loc_dc1 = ?," \
 +                      "photo_loc_vol1 = ?," \
 +                      "photo_loc_id1 = ?," \
 +                      "photo_loc_secret1 = ?," \
 +                      "photo_width1 = ?," \
 +                      "photo_height1 = ?," \
 +                      "photo_size1 = ?," \
 +                      "photo_data1 = ?," \
 +                      "photo_type2 = ?," \
 +                      "photo_loc_dc2 = ?," \
 +                      "photo_loc_vol2 = ?," \
 +                      "photo_loc_id2 = ?," \
 +                      "photo_loc_secret2 = ?," \
 +                      "photo_width2 = ?," \
 +                      "photo_height2 = ?," \
 +                      "photo_size2 = ?," \
 +                      "photo_data2 = ?," \
 +                      "photo_type3 = ?," \
 +                      "photo_loc_dc3 = ?," \
 +                      "photo_loc_vol3 = ?," \
 +                      "photo_loc_id3 = ?," \
 +                      "photo_loc_secret3 = ?," \
 +                      "photo_width3 = ?," \
 +                      "photo_height3 = ?," \
 +                      "photo_size3 = ?," \
 +                      "photo_data3 = ?," \
 +                      "photo_type4 = ?," \
 +                      "photo_loc_dc4 = ?," \
 +                      "photo_loc_vol4 = ?," \
 +                      "photo_loc_id4 = ?," \
 +                      "photo_loc_secret4 = ?," \
 +                      "photo_width4 = ?," \
 +                      "photo_height4 = ?," \
 +                      "photo_size4 = ?," \
 +                      "photo_data4 = ?," \
 +                      "phone = ?," \
 +                      "first_name = ?," \
 +                      "last_name = ? WHERE media_id = ?";
 +                      /* Except filename */
 +      ret = sqlite3_prepare_v2(s_info.db, dml, -1, &stmt, NULL);
 +      ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
 +      switch (msg->media.type) {
 +      case tgl_message_media_photo:
 +              tmp = tg_common_to_string("%lld", msg->media.photo.id);
 +              ret = sqlite3_bind_text(stmt, 2, tmp, -1, SQLITE_TRANSIENT);
 +              ret = sqlite3_bind_int(stmt, 3, msg->media.type);
 +              ret = sqlite3_bind_int64(stmt, 4, msg->media.photo.access_hash);
 +              ret = sqlite3_bind_int(stmt, 5, msg->media.photo.user_id);
 +              ret = sqlite3_bind_int(stmt, 6, msg->media.photo.date);
 +              ret = sqlite3_bind_text(stmt, 7, msg->media.photo.caption, -1, SQLITE_TRANSIENT);
 +
 +              tmp = tg_common_to_string("%lf", msg->media.photo.geo.longitude);
 +              ret = sqlite3_bind_text(stmt, 8, tmp, -1, SQLITE_TRANSIENT);
 +
 +              tmp = tg_common_to_string("%lf", msg->media.photo.geo.latitude);
 +              ret = sqlite3_bind_text(stmt, 9, tmp, -1, SQLITE_TRANSIENT);
 +
 +              ret = sqlite3_bind_int(stmt, 10, msg->media.photo.sizes_num);
 +              for (i = 0; i < 4; i++) {
 +                      if (i < msg->media.photo.sizes_num) {
 +                              ret = sqlite3_bind_text(stmt, 11 + (i * 9), msg->media.photo.sizes[i].type, -1, SQLITE_TRANSIENT);
 +                              ret = sqlite3_bind_int(stmt, 12 + (i * 9), msg->media.photo.sizes[i].loc.dc);
 +                              tmp = tg_common_to_string("%lld", msg->media.photo.sizes[i].loc.volume);
 +                              ret = sqlite3_bind_text(stmt, 13 + (i * 9), tmp, -1, SQLITE_TRANSIENT);
 +                              ret = sqlite3_bind_int(stmt, 14 + (i * 9), msg->media.photo.sizes[i].loc.local_id);
 +                              tmp = tg_common_to_string("%lld", msg->media.photo.sizes[i].loc.secret);
 +                              ret = sqlite3_bind_text(stmt, 15 + (i * 9), tmp, -1, SQLITE_TRANSIENT);
 +                              ret = sqlite3_bind_int(stmt, 16 + (i * 9), msg->media.photo.sizes[i].w);
 +                              ret = sqlite3_bind_int(stmt, 17 + (i * 9), msg->media.photo.sizes[i].h);
 +                              ret = sqlite3_bind_int(stmt, 18 + (i * 9), msg->media.photo.sizes[i].size);
 +                              ret = sqlite3_bind_text(stmt, 19 + (i * 9), msg->media.photo.sizes[i].data, -1, SQLITE_TRANSIENT);
 +                      } else {
 +                              ret = sqlite3_bind_text(stmt, 11 + (i * 9), " ", -1, SQLITE_TRANSIENT);
 +                              ret = sqlite3_bind_int(stmt, 12 + (i * 9), 0);
 +                              tmp = tg_common_to_string("%lld", 0);
 +                              ret = sqlite3_bind_text(stmt, 13 + (i * 9), tmp, -1, SQLITE_TRANSIENT);
 +                              ret = sqlite3_bind_int(stmt, 14 + (i * 9), 0);
 +                              tmp = tg_common_to_string("%lld", 0);
 +                              ret = sqlite3_bind_text(stmt, 15 + (i * 9), tmp, -1, SQLITE_TRANSIENT);
 +                              ret = sqlite3_bind_int(stmt, 16 + (i * 9), 0);
 +                              ret = sqlite3_bind_int(stmt, 17 + (i * 9), 0);
 +                              ret = sqlite3_bind_int(stmt, 18 + (i * 9), 0);
 +                              ret = sqlite3_bind_text(stmt, 19 + (i * 9), " ", -1, SQLITE_TRANSIENT);
 +                      }
                }
 +              break;
 +      case tgl_message_media_document:
 +              tmp = tg_common_to_string("%lld", msg->media.document.id);
 +              ret = sqlite3_bind_text(stmt, 2, tmp, -1, SQLITE_TRANSIENT);
 +              ret = sqlite3_bind_int(stmt, 3, msg->media.type);
 +              ret = sqlite3_bind_int64(stmt, 4, msg->media.document.access_hash);
 +              ret = sqlite3_bind_int(stmt, 5, msg->media.document.user_id);
 +              ret = sqlite3_bind_int(stmt, 6, msg->media.document.date);
 +              ret = sqlite3_bind_text(stmt, 7, msg->media.document.caption, -1, SQLITE_TRANSIENT);
 +              tmp = tg_common_to_string("%lf", 0.0f);
 +              ret = sqlite3_bind_text(stmt, 8, tmp, -1, SQLITE_TRANSIENT);
 +              tmp = tg_common_to_string("%lf", 0.0f);
 +              ret = sqlite3_bind_text(stmt, 9, tmp, -1, SQLITE_TRANSIENT);
 +              ret = sqlite3_bind_int(stmt, 10, msg->media.document.size);
 +              for (i = 0; i < 4; i++) {
 +                      ret = sqlite3_bind_text(stmt, 11 + (i * 9), " ", -1, SQLITE_TRANSIENT);
 +                      ret = sqlite3_bind_int(stmt, 12 + (i * 9), 0);
 +                      tmp = tg_common_to_string("%lld", 0);
 +                      ret = sqlite3_bind_text(stmt, 13 + (i * 9), tmp, -1, SQLITE_TRANSIENT);
 +                      ret = sqlite3_bind_int(stmt, 14 + (i * 9), 0);
 +                      tmp = tg_common_to_string("%lld", 0);
 +                      ret = sqlite3_bind_text(stmt, 15 + (i * 9), tmp, -1, SQLITE_TRANSIENT);
 +                      ret = sqlite3_bind_int(stmt, 16 + (i * 9), 0);
 +                      ret = sqlite3_bind_int(stmt, 17 + (i * 9), 0);
 +                      ret = sqlite3_bind_int(stmt, 18 + (i * 9), 0);
 +                      ret = sqlite3_bind_text(stmt, 19 + (i * 9), " ", -1, SQLITE_TRANSIENT);
 +              }
 +              break;
 +      default:
 +              tmp = tg_common_to_string("%lld", 0);
 +              ret = sqlite3_bind_text(stmt, 2, tmp, -1, SQLITE_TRANSIENT);
 +              ret = sqlite3_bind_int(stmt, 3, msg->media.type);
 +              ret = sqlite3_bind_int64(stmt, 4, 0);
 +              ret = sqlite3_bind_int(stmt, 5, 0);
 +              ret = sqlite3_bind_int(stmt, 6, 0);
 +              ret = sqlite3_bind_text(stmt, 7, " ", -1, SQLITE_TRANSIENT);
 +              tmp = tg_common_to_string("%lf", 0.0f);
 +              ret = sqlite3_bind_text(stmt, 8, tmp, -1, SQLITE_TRANSIENT);
 +              tmp = tg_common_to_string("%lf", 0.0f);
 +              ret = sqlite3_bind_text(stmt, 9, tmp, -1, SQLITE_TRANSIENT);
 +              ret = sqlite3_bind_int(stmt, 10, 0);
 +              for (i = 0; i < 4; i++) {
 +                      ret = sqlite3_bind_text(stmt, 11 + (i * 9), " ", -1, SQLITE_TRANSIENT);
 +                      ret = sqlite3_bind_int(stmt, 12 + (i * 9), 0);
 +                      tmp = tg_common_to_string("%lld", 0);
 +                      ret = sqlite3_bind_text(stmt, 13 + (i * 9), tmp, -1, SQLITE_TRANSIENT);
 +                      ret = sqlite3_bind_int(stmt, 14 + (i * 9), 0);
 +                      tmp = tg_common_to_string("%lld", 0);
 +                      ret = sqlite3_bind_text(stmt, 15 + (i * 9), tmp, -1, SQLITE_TRANSIENT);
 +                      ret = sqlite3_bind_int(stmt, 16 + (i * 9), 0);
 +                      ret = sqlite3_bind_int(stmt, 17 + (i * 9), 0);
 +                      ret = sqlite3_bind_int(stmt, 18 + (i * 9), 0);
 +                      ret = sqlite3_bind_text(stmt, 19 + (i * 9), " ", -1, SQLITE_TRANSIENT);
 +              }
 +              break;
        }
  
 -      ret = sqlite3_exec(db,var_query, NULL,NULL, &err_msg);
 -      close_database(db);
 -      if( ret != SQLITE_OK ){
 -              sqlite3_free(err_msg);
 -              return EINA_FALSE;
 +      ret = sqlite3_bind_text(stmt, 46, msg->media.phone, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_text(stmt, 47, msg->media.first_name, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_text(stmt, 48, msg->media.last_name, -1, SQLITE_TRANSIENT);
 +      tmp = tg_common_to_string("%lld", id);
 +      ret = sqlite3_bind_text(stmt, 49, tmp, -1, SQLITE_TRANSIENT);
 +
 +      ret = sqlite3_step(stmt);
 +      sqlite3_finalize(stmt);
 +      if (ret != SQLITE_DONE) {
 +              return -EIO;
        }
 -      return EINA_TRUE;
 +
 +      return 0;
  }
  
 -Eina_Bool insert_table(const char* table_name, Eina_List* column_names, Eina_List* column_types, Eina_List* column_values)
 +void *tg_db_get_media_info(const char *table_name, long long id, int *media_type)
  {
 -      if( !table_name || ! column_names || !column_types || !column_values) {
 -              return EINA_FALSE;
 +      void *info = NULL;
 +      const char *dml;
 +      sqlite3_stmt *stmt;
 +      const char *tmp;
 +      int ret;
 +      int i;
 +
 +      if (!media_type || !table_name) {
 +              return NULL;
        }
  
 -      sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
 -      int ret = 0 ;
 -      char* err_msg = 0;
 -      int col_count = eina_list_count(column_names);
 +      dml = "SELECT * FROM ? WHERE media_id = ?";
 +
 +      ret = sqlite3_prepare_v2(s_info.db, dml, -1, &stmt, NULL);
 +      ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
 +      tmp = tg_common_to_string("%lld", id);
 +      ret = sqlite3_bind_text(stmt, 2, tmp, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_step(stmt);
 +      if (ret != SQLITE_ROW) {
 +              sqlite3_finalize(stmt);
 +              return NULL;
 +      }
  
 -      int str_len = strlen("INSERT INTO ") + strlen(table_name) + strlen("(") + 1;
 -      char* var_query = (char*)malloc(str_len);
 -      strcpy(var_query,"INSERT INTO ");
 -      strcat(var_query, table_name);
 -      strcat(var_query, "(");
 +      *media_type = sqlite3_column_int(stmt, 1);
 +      if (*media_type == tgl_message_media_photo) {
 +              struct tgl_photo *photo;
 +              const char *tmp;
  
 -      for(int col = 0; col < col_count ; col++) {
 +              photo = calloc(1, sizeof(*photo));
 +              if (!photo) {
 +                      sqlite3_finalize(stmt);
 +                      return NULL;
 +              }
  
 -              char* col_name = eina_list_nth(column_names, col);
 -              var_query = realloc(var_query, strlen(var_query)+strlen(col_name) + 1);
 -              strcat(var_query, col_name);
 +              tmp = (const char *)sqlite3_column_text(stmt, 0);
 +              if (tmp && tmp[0] != '\0') {
 +                      if (sscanf(tmp, "%lld", &photo->id) != 1) {
  
 -              if(col < col_count - 1){
 -                      var_query = realloc(var_query, strlen(var_query) + 2);
 -                      strcat(var_query, ",");
 -              } else {
 -                      var_query = realloc(var_query, strlen(var_query) + strlen(") VALUES (") + 1);
 -                      strcat(var_query, ") VALUES (");
 +                      }
                }
 +
 +              photo->access_hash = sqlite3_column_int(stmt, 2);
 +              photo->user_id = sqlite3_column_int(stmt, 3);
 +              photo->date = sqlite3_column_int(stmt, 4);
 +              tmp = (const char *)sqlite3_column_text(stmt, 5);
 +              if (tmp && tmp[0] != '\0') {
 +                      photo->caption = strdup(tmp);
 +              }
 +
 +              tmp = (const char *)sqlite3_column_text(stmt, 6);
 +              if (tmp && tmp[0] != '\0') {
 +                      if (sscanf(tmp, "%lf", &photo->geo.longitude) != 1) {
 +
 +                      }
 +              }
 +
 +              tmp = (const char *)sqlite3_column_text(stmt, 7);
 +              if (tmp && tmp[0] != '\0') {
 +                      if (sscanf(tmp, "%lf", &photo->geo.latitude) != 1) {
 +
 +                      }
 +              }
 +
 +              photo->sizes_num = sqlite3_column_int(stmt, 8);
 +              photo->sizes = calloc(4, sizeof(*photo->sizes));
 +              for (i = 0; i < photo->sizes_num; i++) {
 +                      if (i < photo->sizes_num) {
 +                              tmp = (const char *)sqlite3_column_text(stmt, 9 + (i * 9));
 +                              if (tmp && tmp[0] != '\0') {
 +                                      photo->sizes[i].type = strdup(tmp);
 +                              }
 +                              photo->sizes[i].loc.dc = sqlite3_column_int(stmt, 10 + (i * 9));
 +                              tmp = (const char *)sqlite3_column_text(stmt, 11 + (i * 9));
 +                              if (tmp && tmp[0] != '\0') {
 +                                      if (sscanf(tmp, "%lld", &photo->sizes[i].loc.volume) != 1) {
 +
 +                                      }
 +                              }
 +                              photo->sizes[i].loc.local_id = sqlite3_column_int(stmt, 12);
 +                              tmp = (const char *)sqlite3_column_text(stmt, 13 + (i * 9));
 +                              if (tmp && tmp[0] != '\0') {
 +                                      if (sscanf(tmp, "%lld", &photo->sizes[i].loc.secret) != 1) {
 +
 +                                      }
 +                              }
 +                              photo->sizes[i].w = sqlite3_column_int(stmt, 14 + (i * 9));
 +                              photo->sizes[i].h = sqlite3_column_int(stmt, 15 + (i * 9));
 +                              photo->sizes[i].size = sqlite3_column_int(stmt, 16 + (i * 9));
 +
 +                              tmp = (const char *)sqlite3_column_text(stmt, 17 + (i * 9));
 +                              if (tmp && tmp[0] != '\0') {
 +                                      photo->sizes[i].data = strdup(tmp);
 +                              }
 +                      }
 +              }
 +
 +              // 45: phone
 +              // 46: first_name
 +              // 47: last_name
 +              // 48: file_path
 +              info = photo;
 +      } else if (*media_type == tgl_message_media_document) {
 +              struct tgl_document *document;
 +
 +              document = calloc(1, sizeof(*document));
 +              if (!document) {
 +                      sqlite3_finalize(stmt);
 +                      return NULL;
 +              }
 +
 +              tmp = (const char *)sqlite3_column_text(stmt, 0);
 +              if (tmp && tmp[0] != '\0') {
 +                      if (sscanf(tmp, "%lld", &document->id) != 1) {
 +
 +                      }
 +              }
 +
 +              tmp = (const char *)sqlite3_column_text(stmt, 2);
 +              if (tmp && tmp[0] != '\0') {
 +                      if (sscanf(tmp, "%lld", &document->access_hash) != 1) {
 +
 +                      }
 +              }
 +
 +              document->user_id = sqlite3_column_int(stmt, 3);
 +              document->date = sqlite3_column_int(stmt, 4);
 +
 +              tmp = (const char *)sqlite3_column_text(stmt, 5);
 +              if (tmp && tmp[0] != '\0') {
 +                      document->caption = strdup(tmp);
 +              }
 +
 +              // 6: "longitude TEXT,"
 +              // 7: "latitude TEXT,"
 +              // 9 ~ 44: Photo informations
 +
 +              document->size = sqlite3_column_int(stmt, 8);
 +
 +              // 45 "phone TEXT,"
 +              // 46 "first_name TEXT,"
 +              // 47 "last_name TEXT,"
 +              // 48 "file_path TEXT)"
 +
 +              info = document;
 +      } else {
 +              /**
 +               * @todo
 +               * Handles me
 +               */
        }
  
 -      int col_val_count = eina_list_count(column_values);
 +      sqlite3_finalize(stmt);
 +      return info;
 +}
  
 -      for(int col = 0; col < col_val_count ; col++) {
 +int tg_db_insert_media_info(const char *table_name, struct tgl_message *msg, const char *filename)
 +{
 +      const char *dml;
 +      const char *tmp;
 +      int ret;
 +      sqlite3_stmt *stmt;
 +      int i;
 +
 +      dml = "INSERT INTO ? VALUES (" \
 +                      "?, ?, ?, ?, ?, " \
 +                      "?, ?, ?, ?, ?, " \
 +                      "?, ?, ?, ?, ?, " \
 +                      "?, ?, ?, ?, ?, " \
 +                      "?, ?, ?, ?, ?, " \
 +                      "?, ?, ?, ?, ?, " \
 +                      "?, ?, ?, ?, ?, " \
 +                      "?, ?, ?, ?, ?, " \
 +                      "?, ?, ?, ?, ?, " \
 +                      "?, ?, ?, ?)";
 +      ret = sqlite3_prepare_v2(s_info.db, dml, -1, &stmt, NULL);
 +
 +      ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
 +
 +      switch (msg->media.type) {
 +      case tgl_message_media_photo:
 +              tmp = tg_common_to_string("%lld", msg->media.photo.id);
 +              ret = sqlite3_bind_text(stmt, 2, tmp, -1, SQLITE_TRANSIENT);
 +              ret = sqlite3_bind_int(stmt, 3, msg->media.type);
 +              ret = sqlite3_bind_int64(stmt, 4, msg->media.photo.access_hash);
 +              ret = sqlite3_bind_int(stmt, 5, msg->media.photo.user_id);
 +              ret = sqlite3_bind_int(stmt, 6, msg->media.photo.date);
 +              ret = sqlite3_bind_text(stmt, 7, msg->media.photo.caption, -1, SQLITE_TRANSIENT);
 +
 +              tmp = tg_common_to_string("%lf", msg->media.photo.geo.longitude);
 +              ret = sqlite3_bind_text(stmt, 8, tmp, -1, SQLITE_TRANSIENT);
 +
 +              tmp = tg_common_to_string("%lf", msg->media.photo.geo.latitude);
 +              ret = sqlite3_bind_text(stmt, 9, tmp, -1, SQLITE_TRANSIENT);
 +
 +              ret = sqlite3_bind_int(stmt, 10, msg->media.photo.sizes_num);
 +              for (i = 0; i < 4; i++) {
 +                      if (i < msg->media.photo.sizes_num) {
 +                              ret = sqlite3_bind_text(stmt, 11 + (i * 9), msg->media.photo.sizes[i].type, -1, SQLITE_TRANSIENT);
 +                              ret = sqlite3_bind_int(stmt, 12 + (i * 9), msg->media.photo.sizes[i].loc.dc);
 +                              tmp = tg_common_to_string("%lld", msg->media.photo.sizes[i].loc.volume);
 +                              ret = sqlite3_bind_text(stmt, 13 + (i * 9), tmp, -1, SQLITE_TRANSIENT);
 +                              ret = sqlite3_bind_int(stmt, 14 + (i * 9), msg->media.photo.sizes[i].loc.local_id);
 +                              tmp = tg_common_to_string("%lld", msg->media.photo.sizes[i].loc.secret);
 +                              ret = sqlite3_bind_text(stmt, 15 + (i * 9), tmp, -1, SQLITE_TRANSIENT);
 +                              ret = sqlite3_bind_int(stmt, 16 + (i * 9), msg->media.photo.sizes[i].w);
 +                              ret = sqlite3_bind_int(stmt, 17 + (i * 9), msg->media.photo.sizes[i].h);
 +                              ret = sqlite3_bind_int(stmt, 18 + (i * 9), msg->media.photo.sizes[i].size);
 +                              ret = sqlite3_bind_text(stmt, 19 + (i * 9), msg->media.photo.sizes[i].data, -1, SQLITE_TRANSIENT);
 +                      } else {
 +                              ret = sqlite3_bind_text(stmt, 11 + (i * 9), " ", -1, SQLITE_TRANSIENT);
 +                              ret = sqlite3_bind_int(stmt, 12 + (i * 9), 0);
 +                              tmp = tg_common_to_string("%lld", 0);
 +                              ret = sqlite3_bind_text(stmt, 13 + (i * 9), tmp, -1, SQLITE_TRANSIENT);
 +                              ret = sqlite3_bind_int(stmt, 14 + (i * 9), 0);
 +                              tmp = tg_common_to_string("%lld", 0);
 +                              ret = sqlite3_bind_text(stmt, 15 + (i * 9), tmp, -1, SQLITE_TRANSIENT);
 +                              ret = sqlite3_bind_int(stmt, 16 + (i * 9), 0);
 +                              ret = sqlite3_bind_int(stmt, 17 + (i * 9), 0);
 +                              ret = sqlite3_bind_int(stmt, 18 + (i * 9), 0);
 +                              ret = sqlite3_bind_text(stmt, 19 + (i * 9), " ", -1, SQLITE_TRANSIENT);
 +                      }
 +              }
 +              break;
 +      case tgl_message_media_document:
 +              tmp = tg_common_to_string("%lld", msg->media.document.id);
 +              ret = sqlite3_bind_text(stmt, 2, tmp, -1, SQLITE_TRANSIENT);
 +              ret = sqlite3_bind_int(stmt, 3, msg->media.type);
 +              ret = sqlite3_bind_int64(stmt, 4, msg->media.document.access_hash);
 +              ret = sqlite3_bind_int(stmt, 5, msg->media.document.user_id);
 +              ret = sqlite3_bind_int(stmt, 6, msg->media.document.date);
 +              ret = sqlite3_bind_text(stmt, 7, msg->media.document.caption, -1, SQLITE_TRANSIENT);
 +              tmp = tg_common_to_string("%lf", 0.0f);
 +              ret = sqlite3_bind_text(stmt, 8, tmp, -1, SQLITE_TRANSIENT);
 +              tmp = tg_common_to_string("%lf", 0.0f);
 +              ret = sqlite3_bind_text(stmt, 9, tmp, -1, SQLITE_TRANSIENT);
 +              ret = sqlite3_bind_int(stmt, 10, msg->media.document.size);
 +              for (i = 0; i < 4; i++) {
 +                      ret = sqlite3_bind_text(stmt, 11 + (i * 9), " ", -1, SQLITE_TRANSIENT);
 +                      ret = sqlite3_bind_int(stmt, 12 + (i * 9), 0);
 +                      tmp = tg_common_to_string("%lld", 0);
 +                      ret = sqlite3_bind_text(stmt, 13 + (i * 9), tmp, -1, SQLITE_TRANSIENT);
 +                      ret = sqlite3_bind_int(stmt, 14 + (i * 9), 0);
 +                      tmp = tg_common_to_string("%lld", 0);
 +                      ret = sqlite3_bind_text(stmt, 15 + (i * 9), tmp, -1, SQLITE_TRANSIENT);
 +                      ret = sqlite3_bind_int(stmt, 16 + (i * 9), 0);
 +                      ret = sqlite3_bind_int(stmt, 17 + (i * 9), 0);
 +                      ret = sqlite3_bind_int(stmt, 18 + (i * 9), 0);
 +                      ret = sqlite3_bind_text(stmt, 19 + (i * 9), " ", -1, SQLITE_TRANSIENT);
 +              }
 +              break;
 +      default:
 +              tmp = tg_common_to_string("%lld", 0);
 +              ret = sqlite3_bind_text(stmt, 2, tmp, -1, SQLITE_TRANSIENT);
 +              ret = sqlite3_bind_int(stmt, 3, msg->media.type);
 +              ret = sqlite3_bind_int64(stmt, 4, 0);
 +              ret = sqlite3_bind_int(stmt, 5, 0);
 +              ret = sqlite3_bind_int(stmt, 6, 0);
 +              ret = sqlite3_bind_text(stmt, 7, " ", -1, SQLITE_TRANSIENT);
 +              tmp = tg_common_to_string("%lf", 0.0f);
 +              ret = sqlite3_bind_text(stmt, 8, tmp, -1, SQLITE_TRANSIENT);
 +              tmp = tg_common_to_string("%lf", 0.0f);
 +              ret = sqlite3_bind_text(stmt, 9, tmp, -1, SQLITE_TRANSIENT);
 +              ret = sqlite3_bind_int(stmt, 10, 0);
 +              for (i = 0; i < 4; i++) {
 +                      ret = sqlite3_bind_text(stmt, 11 + (i * 9), " ", -1, SQLITE_TRANSIENT);
 +                      ret = sqlite3_bind_int(stmt, 12 + (i * 9), 0);
 +                      tmp = tg_common_to_string("%lld", 0);
 +                      ret = sqlite3_bind_text(stmt, 13 + (i * 9), tmp, -1, SQLITE_TRANSIENT);
 +                      ret = sqlite3_bind_int(stmt, 14 + (i * 9), 0);
 +                      tmp = tg_common_to_string("%lld", 0);
 +                      ret = sqlite3_bind_text(stmt, 15 + (i * 9), tmp, -1, SQLITE_TRANSIENT);
 +                      ret = sqlite3_bind_int(stmt, 16 + (i * 9), 0);
 +                      ret = sqlite3_bind_int(stmt, 17 + (i * 9), 0);
 +                      ret = sqlite3_bind_int(stmt, 18 + (i * 9), 0);
 +                      ret = sqlite3_bind_text(stmt, 19 + (i * 9), " ", -1, SQLITE_TRANSIENT);
 +              }
 +              break;
 +      }
  
 -              char* col_type = eina_list_nth(column_types, col);
 -              char* col_value = NULL;
 -              if(!strcmp(col_type, "INTEGER") || !strcmp(col_type, "INTEGER PRIMARY KEY NOT NULL")) {
 -                      int* tmp_value = eina_list_nth(column_values, col);
 +      ret = sqlite3_bind_text(stmt, 46, msg->media.phone, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_text(stmt, 47, msg->media.first_name, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_text(stmt, 48, msg->media.last_name, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_text(stmt, 49, filename, -1, SQLITE_TRANSIENT);
  
 -#if 0
 -                      long long val = *tmp_value;
 -                      col_value = (char*)malloc(50);
 -                      //sprintf(col_value, "%lld", *tmp_value);
 -                      sprintf(col_value, "%lld", val);
 -#endif
 +      ret = sqlite3_step(stmt);
 +      sqlite3_finalize(stmt);
  
 -                      int act_val = (*tmp_value);
 -                      col_value = (char*)malloc(50);
 -                      sprintf(col_value, "%d", act_val);
 +      if (ret != SQLITE_DONE) {
 +              return -EIO;
 +      }
 +
 +      return 0;
 +}
  
 -                      var_query = realloc(var_query, strlen(var_query)+strlen(col_value) + 1);
 -                      strcat(var_query, col_value);
 +int tg_db_create_table_chat_info(const char *table_name)
 +{
 +      const char *ddl;
 +      ddl = "CREATE TABLE ? (" \
 +                      "chat_id INTEGER PRIMARY KEY NOT NULL," \
 +                      "flags INTEGER," \
 +                      "print_title TEXT," \
 +                      "struct_version INTEGER," \
 +                      "photo_id TEXT," \
 +                      "photo_path TEXT," \
 +                      "title TEXT," \
 +                      "users_num INTEGER," \
 +                      "user_list_size INTEGER," \
 +                      "user_list_version INTEGER," \
 +                      "inviter_id INTEGER," \
 +                      "chat_users TEXT," \
 +                      "date INTEGER," \
 +                      "version INTEGER," \
 +                      "admin_id INTEGER)";
 +      return create_table_query_to_db(ddl, table_name);
 +}
  
 -              } else if(!strcmp(col_type, "TEXT") || !strcmp(col_type, "TEXT PRIMARY KEY NOT NULL")) {
 -                      char* tmp_value = eina_list_nth(column_values, col);
 -                      col_value = (char*)malloc(strlen(tmp_value) + 1);
 -                      strcpy(col_value,tmp_value);
 +int tg_db_count_chat_info(const char *table_name, struct tgl_chat *chat)
 +{
 +      const char *dml;
 +      sqlite3_stmt *stmt;
 +      int ret;
  
 -                      var_query = realloc(var_query, strlen(var_query)+strlen("'") + 1);
 -                      strcat(var_query, "'");
 +      dml = "SELECT COUNT(*) FROM ? WHERE chat_id = ?";
  
 -                      var_query = realloc(var_query, strlen(var_query)+strlen(col_value) + 1);
 -                      strcat(var_query, col_value);
 +      ret = sqlite3_prepare_v2(s_info.db, dml, -1, &stmt, NULL);
 +      ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_int(stmt, 2, chat->id.id);
 +      ret = sqlite3_step(stmt);
 +      ret = sqlite3_column_int(stmt, 0);
 +      sqlite3_finalize(stmt);
 +      return ret;
 +}
  
 -                      var_query = realloc(var_query, strlen(var_query)+strlen("'") + 1);
 -                      strcat(var_query, "'");
 +int tg_db_update_chat_info(const char *table_name, struct tgl_chat *chat, char *photo)
 +{
 +      const char *dml;
 +      int ret;
 +      sqlite3_stmt *stmt;
 +      const char *tmp;
 +      char *str;
 +      int i;
 +      int str_len;
 +      int str_size;
 +
 +      dml = "UPDATE ? SET " \
 +                      "chat_id = ?, " \
 +                      "flags = ?, " \
 +                      "print_title = ?, " \
 +                      "struct_version = ?, " \
 +                      "photo_id = ?, " \
 +                      "photo_path = ?, " \
 +                      "title = ?, " \
 +                      "users_num = ?, " \
 +                      "user_list_size = ?, " \
 +                      "user_list_version = ?, " \
 +                      "inviter_id = ?, " \
 +                      "chat_users = ?, " \
 +                      "date = ?, " \
 +                      "version = ?, " \
 +                      "admin_id = ? " \
 +                      "WHERE chat_id = ?";
 +
 +      ret = sqlite3_prepare_v2(s_info.db, dml, -1, &stmt, NULL);
 +      ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_int(stmt, 2, chat->id.id);
 +      ret = sqlite3_bind_int(stmt, 3, chat->flags);
 +      ret = sqlite3_bind_text(stmt, 4, chat->print_title, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_int(stmt, 5, chat->structure_version);
 +      tmp = tg_common_to_string("%lld", chat->photo.id);
 +      ret = sqlite3_bind_text(stmt, 6, tmp, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_text(stmt, 7, photo, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_text(stmt, 8, chat->title, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_int(stmt, 9, chat->users_num);
 +      ret = sqlite3_bind_int(stmt, 10, chat->user_list_size);
 +      ret = sqlite3_bind_int(stmt, 11, chat->user_list_version);
 +      ret = sqlite3_bind_int(stmt, 12, chat->user_list[0].inviter_id);
 +
 +      str_size = 64;
 +      str_len = 0;
 +      str = malloc(str_size);
 +      for (i = 0; i < chat->user_list_size; i++) {
 +              str_len += snprintf(str + str_len, str_size - str_len - 1, "%d, ", chat->user_list[i].user_id);
 +              if (str_size - str_len < 32) {
 +                      char *ptr;
 +                      str_size <<= 1; /* doulbing current size */
 +                      ptr = realloc(str, str_size);
 +                      if (!ptr) {
 +                              break;
 +                      }
 +                      str = ptr;
                }
 +      }
 +      /* Cut off the last colon */
 +      str[str_len - 2] = '\0';
 +      ret = sqlite3_bind_text(stmt, 13, str, str_len - 2, SQLITE_TRANSIENT);
 +      free(str);
 +      ret = sqlite3_bind_int(stmt, 14, chat->date);
 +      ret = sqlite3_bind_int(stmt, 15, chat->version);
 +      ret = sqlite3_bind_int(stmt, 16, chat->admin_id);
 +      ret = sqlite3_bind_int(stmt, 17, chat->id.id);
 +
 +      ret = sqlite3_step(stmt);
 +      sqlite3_finalize(stmt);
 +      return 0;
 +}
  
 -              if(col < col_count - 1){
 -                      var_query = realloc(var_query, strlen(var_query) + 3);
 -                      strcat(var_query, ", ");
 -              } else {
 -                      var_query = realloc(var_query, strlen(var_query) + 3);
 -                      strcat(var_query, ");");
 +int tg_db_insert_chat_info(const char *table_name, struct tgl_chat *chat, char *photo_path)
 +{
 +      const char *dml;
 +      int ret;
 +      sqlite3_stmt *stmt;
 +      const char *tmp;
 +      char *str;
 +      int i;
 +      int str_len;
 +      int str_size;
 +
 +      dml = "INSERT INTO ? VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
 +      ret = sqlite3_prepare_v2(s_info.db, dml, -1, &stmt, NULL);
 +      ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_int(stmt, 2, chat->id.id);
 +      ret = sqlite3_bind_text(stmt, 3, chat->print_title, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_int(stmt, 4, chat->structure_version);
 +      tmp = tg_common_to_string("%lld", chat->photo.id);
 +      ret = sqlite3_bind_text(stmt, 5, tmp, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_text(stmt, 6, photo_path, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_text(stmt, 7, chat->title, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_int(stmt, 8, chat->users_num);
 +      ret = sqlite3_bind_int(stmt, 9, chat->user_list_size);
 +      ret = sqlite3_bind_int(stmt, 10, chat->user_list_version);
 +      ret = sqlite3_bind_int(stmt, 11, chat->user_list[0].inviter_id);
 +
 +      str_size = 64;
 +      str_len = 0;
 +      str = malloc(str_size);
 +      for (i = 0; i < chat->user_list_size; i++) {
 +              str_len += snprintf(str + str_len, str_size - str_len - 1, "%d, ", chat->user_list[i].user_id);
 +              if (str_size - str_len < 32) {
 +                      char *ptr;
 +                      str_size <<= 1; /* doulbing current size */
 +                      ptr = realloc(str, str_size);
 +                      if (!ptr) {
 +                              break;
 +                      }
 +                      str = ptr;
                }
 -              free(col_value);
        }
 +      /* Cut off the last colon */
 +      str[str_len - 2] = '\0';
 +      ret = sqlite3_bind_text(stmt, 12, str, str_len - 2, SQLITE_TRANSIENT);
 +      free(str);
 +      ret = sqlite3_bind_int(stmt, 13, chat->date);
 +      ret = sqlite3_bind_int(stmt, 14, chat->version);
 +      ret = sqlite3_bind_int(stmt, 15, chat->admin_id);
 +
 +      ret = sqlite3_step(stmt);
 +
 +      sqlite3_finalize(stmt);
 +      return 0;
 +}
  
 -      ret = sqlite3_exec(db,var_query, NULL, NULL, &err_msg);
 -      close_database(db);
 -      if( ret != SQLITE_OK ){
 -              sqlite3_free(err_msg);
 -              return EINA_FALSE;
 +int tg_db_create_table_message(const char *table_name)
 +{
 +      const char *ddl;
 +
 +      ddl = "CREATE TABLE ? (" \
 +                      "msg_id INTEGER," \
 +                      "flags INTEGER," \
 +                      "fwd_from_id INTEGER," \
 +                      "fwd_date INTEGER," \
 +                      "from_id INTEGER," \
 +                      "to_id INTEGER," \
 +                      "out INTEGER," \
 +                      "unread INTEGER," \
 +                      "date INTEGER," \
 +                      "service INTEGER," \
 +                      "message TEXT," \
 +                      "message_state INTEGER," \
 +                      "message_len INTEGER," \
 +                      "media_type INTEGER," \
 +                      "media_id TEXT," \
 +                      "unique_id INTEGER)";
 +
 +      return create_table_query_to_db(ddl, table_name);
 +}
 +
 +struct tgl_message *tg_db_get_message(const char *table_name, long long id)
 +{
 +      struct tgl_message *msg;
 +      int ret;
 +      sqlite3_stmt *stmt;
 +      const char *dml;
 +      const char *tmp;
 +
 +      dml = "SELECT * FROM ? WHERE msg_id = ?";
 +
 +      ret = sqlite3_prepare_v2(s_info.db, dml, -1, &stmt, NULL);
 +      if (ret != SQLITE_OK) {
 +              return NULL;
        }
 -      return EINA_TRUE;
  
 +      ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return NULL;
 +      }
 +
 +      ret = sqlite3_bind_int64(stmt, 2, id);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return NULL;
 +      }
 +
 +      ret = sqlite3_step(stmt);
 +      if (ret != SQLITE_ROW) {
 +              sqlite3_finalize(stmt);
 +              return NULL;
 +      }
 +
 +      msg = calloc(1, sizeof(*msg));
 +      if (!msg) {
 +              sqlite3_finalize(stmt);
 +              return NULL;
 +      }
 +
 +      msg->id = id;
 +      msg->flags = sqlite3_column_int(stmt, 1);
 +      msg->fwd_from_id.id = sqlite3_column_int(stmt, 2);
 +      msg->fwd_date = sqlite3_column_int(stmt, 3);
 +      msg->from_id.id = sqlite3_column_int(stmt, 4);
 +      msg->to_id.id = sqlite3_column_int(stmt, 5);
 +      msg->out = sqlite3_column_int(stmt, 6);
 +      msg->unread = sqlite3_column_int(stmt, 7);
 +      msg->date = sqlite3_column_int(stmt, 8);
 +      msg->service = sqlite3_column_int(stmt, 9);
 +      tmp = (const char *)sqlite3_column_text(stmt, 10);
 +      if (tmp && tmp[0] != '\0') {
 +              msg->message = strdup(tmp);
 +              if (!msg->message) {
 +                      /*
 +                       * @todo
 +                       */
 +              }
 +      }
 +      msg->msg_state = sqlite3_column_int(stmt, 11);
 +      msg->message_len = sqlite3_column_int(stmt, 12);
 +      msg->media.type = sqlite3_column_int(stmt, 13);
 +      if (msg->media.type == tgl_message_media_photo) {
 +              msg->media.photo.id = sqlite3_column_int64(stmt, 14);
 +      } else if (msg->media.type == tgl_message_media_document) {
 +              msg->media.document.id = sqlite3_column_int64(stmt, 14);
 +      } else {
 +              // 14
 +      }
 +      //msg->id = sqlite3_column_int64(stmt, 15);
 +      sqlite3_finalize(stmt);
 +      return msg;
  }
  
 +int tg_db_update_message(const char *table_name, struct tgl_message *M, long long unique_id)
 +{
 +      int ret;
 +      sqlite3_stmt *stmt;
 +      const char *dml;
 +      dml = "UPDATE ? SET " \
 +              "msg_id = ?, " \
 +              "flags = ?, " \
 +              "fwd_from_id = ?, " \
 +              "fwd_date = ?, " \
 +              "from_id = ?, " \
 +              "to_id = ?, " \
 +              "out = ?, " \
 +              "unread = ?, " \
 +              "date = ?, " \
 +              "service = ?, " \
 +              "message = ?, " \
 +              "message_state = ?, " \
 +              "message_len = ?, " \
 +              "media_type = ?, " \
 +              "media_id = ?, " \
 +              "WHERE ? = ?";
 +
 +      ret = sqlite3_prepare_v2(s_info.db, dml, -1, &stmt, NULL);
 +      ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_int64(stmt, 2, M->id);
 +      ret = sqlite3_bind_int(stmt, 3, M->flags);
 +      ret = sqlite3_bind_int(stmt, 4, M->fwd_from_id.id);
 +      ret = sqlite3_bind_int(stmt, 5, M->fwd_date);
 +      ret = sqlite3_bind_int(stmt, 6, M->from_id.id);
 +      ret = sqlite3_bind_int(stmt, 7, M->to_id.id);
 +      ret = sqlite3_bind_int(stmt, 8, M->out);
 +      ret = sqlite3_bind_int(stmt, 9, M->unread);
 +      ret = sqlite3_bind_int(stmt, 10, M->date);
 +      ret = sqlite3_bind_int(stmt, 11, M->service);
 +      ret = sqlite3_bind_text(stmt, 12, M->message, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_int(stmt, 13, M->msg_state);
 +      ret = sqlite3_bind_int(stmt, 14, M->message_len);
 +      ret = sqlite3_bind_int(stmt, 15, M->media.type);
 +      if (M->media.type == tgl_message_media_photo) {
 +              ret = sqlite3_bind_int64(stmt, 16, M->media.photo.id);
 +      } else if (M->media.type == tgl_message_media_document) {
 +              ret = sqlite3_bind_int64(stmt, 16, M->media.document.id);
 +      } else {
 +              ret = sqlite3_bind_int64(stmt, 17, 0);
 +      }
 +      if (unique_id > 0) {
 +              ret = sqlite3_bind_text(stmt, 18, "unique_id", -1, SQLITE_TRANSIENT);
 +              ret = sqlite3_bind_int64(stmt, 19, unique_id);
 +      } else {
 +              ret = sqlite3_bind_text(stmt, 18, "msg_id", -1, SQLITE_TRANSIENT);
 +              ret = sqlite3_bind_int64(stmt, 19, M->id);
 +      }
 +      ret = sqlite3_step(stmt);
 +      sqlite3_finalize(stmt);
 +      return 0;
 +}
  
 -Eina_Bool update_table(const char* table_name, Eina_List* column_names, Eina_List* column_types, Eina_List* column_values, const char* where_clause)
 +int tg_db_insert_message(const char *table_name, struct tgl_message *M, long long unique_id)
  {
 -      if( !table_name || ! column_names || !column_types || !column_values) {
 -              return EINA_FALSE;
 +      int ret;
 +      sqlite3_stmt *stmt;
 +      const char *dml;
 +
 +      dml = "INSERT INTO ? VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
 +      ret = sqlite3_prepare_v2(s_info.db, dml, -1, &stmt, NULL);
 +      ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_int(stmt, 2, M->id);
 +      ret = sqlite3_bind_int(stmt, 3, M->flags);
 +      ret = sqlite3_bind_int(stmt, 4, M->fwd_from_id.id);
 +      ret = sqlite3_bind_int(stmt, 5, M->fwd_date);
 +      ret = sqlite3_bind_int(stmt, 6, M->from_id.id);
 +      ret = sqlite3_bind_int(stmt, 7, M->to_id.id);
 +      ret = sqlite3_bind_int(stmt, 8, M->out);
 +      ret = sqlite3_bind_int(stmt, 9, M->unread);
 +      ret = sqlite3_bind_int(stmt, 10, M->date);
 +      ret = sqlite3_bind_int(stmt, 11, M->service);
 +      ret = sqlite3_bind_text(stmt, 12, M->message, -1, SQLITE_TRANSIENT);
 +      ret = sqlite3_bind_int(stmt, 13, M->msg_state);
 +      ret = sqlite3_bind_int(stmt, 14, M->message_len);
 +      ret = sqlite3_bind_int(stmt, 15, M->media.type);
 +      if (M->media.type == tgl_message_media_photo) {
 +              ret = sqlite3_bind_int64(stmt, 16, M->media.photo.id);
 +      } else if (M->media.type == tgl_message_media_document) {
 +              ret = sqlite3_bind_int64(stmt, 16, M->media.document.id);
 +      } else {
 +              ret = sqlite3_bind_int64(stmt, 16, 0);
        }
 +      ret = sqlite3_bind_int64(stmt, 17, unique_id);
  
 -      sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
 +      ret = sqlite3_step(stmt);
 +      sqlite3_finalize(stmt);
 +      return ret == SQLITE_DONE ? 0 : -EIO;
 +}
  
 -      int ret = 0 ;
 -      char* err_msg = 0;
 -      int col_count = eina_list_count(column_names);
 +int tg_db_create_table_peer_info(const char *table_name)
 +{
 +      const char *ddl;
 +      ddl = "CREATE TABLE ? (" \
 +                      "user_id INTEGER PRIMARY KEY NOT NULL," \
 +                      "peer_type INTEGER," \
 +                      "flags INTEGER," \
 +                      "message_id TEXT," \
 +                      "message_date INTEGER," \
 +                      "print_name TEXT," \
 +                      "struct_version INTEGER," \
 +                      "unread_message_count INTEGER," \
 +                      "last_seen INTEGER," \
 +                      "photo_path TEXT," \
 +                      "photo_id INTEGER)";
 +      return create_table_query_to_db(ddl, table_name);
 +}
  
 -      int str_len = strlen("UPDATE ") + strlen(table_name) + strlen(" SET ") + 1;
 -      char* var_query = (char*)malloc(str_len);
 -      strcpy(var_query,"UPDATE ");
 -      strcat(var_query, table_name);
 -      strcat(var_query, " SET ");
 +int tg_db_update_peer_info(const char *tablename, tgl_peer_t *UC, int last_msg_id, int unread_count)
 +{
 +      const char *dml;
 +      sqlite3_stmt *stmt;
 +      const char *str;
 +      int ret;
  
 +      dml = "UPDATE ? SET " \
 +                      "peer_type = ?," \
 +                      "flags = ?," \
 +                      "message_id = ?," \
 +                      "message_data = ?," \
 +                      "print_name = ?," \
 +                      "struct_version = ?," \
 +                      "unread_message_count = ?," \
 +                      "last_seen = ?," \
 +                      "photo_path = ?," \
 +                      "photo_id = ? WHERE user_id = ?";
 +
 +      ret = sqlite3_prepare_v2(s_info.db, dml, -1, &stmt, NULL);
 +      if (ret != SQLITE_OK) {
 +              return -EFAULT;
 +      }
  
 -      int col_val_count = eina_list_count(column_values);
 +      ret = sqlite3_bind_text(stmt, 1, tablename, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -      for(int col = 0; col < col_val_count ; col++) {
 -              char* col_name = eina_list_nth(column_names, col);
 -              char* col_type = eina_list_nth(column_types, col);
 +      ret = sqlite3_bind_int(stmt, 2, UC->id.type);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -              char* col_value = NULL;
 -              if(!strcmp(col_type, "INTEGER") || !strcmp(col_type, "INTEGER PRIMARY KEY NOT NULL")) {
 -                      int* tmp_value = eina_list_nth(column_values, col);
 +      ret = sqlite3_bind_int(stmt, 3, UC->flags);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -                      int act_val = (*tmp_value);
 -                      col_value = (char*)malloc(50);
 -                      sprintf(col_value, "%d", act_val);
 +      str = tg_common_to_string("%d", last_msg_id);
 +      ret = sqlite3_bind_text(stmt, 4, str, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -                      var_query = realloc(var_query, strlen(var_query) + strlen(col_name) + strlen(" = ") + strlen(col_value) + 1);
 -                      strcat(var_query, col_name);
 -                      strcat(var_query, " = ");
 -                      strcat(var_query, col_value);
 +      ret = sqlite3_bind_int(stmt, 5, UC->last ? UC->last->date : 0);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -              } else if(!strcmp(col_type, "TEXT") || !strcmp(col_type, "TEXT PRIMARY KEY NOT NULL")) {
 +      ret = sqlite3_bind_text(stmt, 6, UC->print_name, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -                      char* tmp_value = eina_list_nth(column_values, col);
 -                      col_value = (char*)malloc(strlen(tmp_value) + 1);
 -                      strcpy(col_value,tmp_value);
 +      ret = sqlite3_bind_int(stmt, 7, UC->structure_version);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -                      var_query = realloc(var_query, strlen(var_query)+ strlen(col_name) + strlen(" = ")+strlen("'") + 1);
 -                      strcat(var_query, col_name);
 -                      strcat(var_query, " = ");
 -                      strcat(var_query, "'");
 +      ret = sqlite3_bind_int(stmt, 8, unread_count);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -                      var_query = realloc(var_query, strlen(var_query)+strlen(col_value) + 1);
 -                      strcat(var_query, col_value);
 +      if (UC->id.type == TGL_PEER_USER ) {
 +              ret = sqlite3_bind_int(stmt, 9, UC->user.status.when);
 +      } else if (UC->id.type == TGL_PEER_CHAT ) {
 +              ret = sqlite3_bind_int(stmt, 9, UC->chat.date);
 +      } else {
 +              ret = sqlite3_bind_int(stmt, 9, 0);
 +      }
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -                      var_query = realloc(var_query, strlen(var_query)+strlen("'") + 1);
 -                      strcat(var_query, "'");
 -              }
 +      ret = sqlite3_bind_text(stmt, 10, "", -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -              if(col < col_count - 1){
 -                      var_query = realloc(var_query, strlen(var_query) + 3);
 -                      strcat(var_query, ", ");
 -              } else {
 -                      var_query = realloc(var_query, strlen(var_query) + 2);
 -                      strcat(var_query, " ");
 -              }
 -              free(col_value);
 +      ret = sqlite3_bind_int(stmt, 11, UC->photo.id);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
        }
  
 -      var_query = realloc(var_query, strlen(var_query) + strlen(" WHERE ") + strlen(where_clause) + 2);
 -      strcat(var_query, " WHERE ");
 -      strcat(var_query, where_clause);
 -      strcat(var_query, ";");
 +      ret = sqlite3_bind_int(stmt, 12, UC->id.id);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -      ret = sqlite3_exec(db,var_query, NULL,NULL, &err_msg);
 -      close_database(db);
 -      if( ret != SQLITE_OK ){
 -              sqlite3_free(err_msg);
 -              return EINA_FALSE;
 +      ret = sqlite3_step(stmt);
 +      if (ret != SQLITE_DONE) {
 +              sqlite3_finalize(stmt);
 +              return -EIO;
        }
 -      return EINA_TRUE;
  
 +      sqlite3_finalize(stmt);
 +      return 0;
  }
  
 -Eina_Bool get_values_from_table(const char* table_name, Eina_List* column_names, int (*callback)(void*,int,char**,char**), const char* where_clause, void* data_to_callback)
 +int tg_db_insert_peer_info(const char *tablename, tgl_peer_t *UC, int last_msg_id, int unread_count)
  {
 -      if (!table_name) {
 -              return EINA_FALSE;
 +      const char *dml;
 +      sqlite3_stmt *stmt;
 +      const char *str;
 +      int ret;
 +
 +      dml = "INSERT INTO ? ("
 +                      "user_id,peer_type,flags,message_id,message_date," \
 +                      "print_name,struct_version,unread_message_count,last_seen," \
 +                      "photo_path,photo_id) VALUES (?,?,?,?,?,?,?,?,?,?,?)";
 +
 +      ret = sqlite3_prepare_v2(s_info.db, dml, -1, &stmt, NULL);
 +      if (ret != SQLITE_OK) {
 +              return -EFAULT;
        }
  
 -      sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
 -      /*****No rows identification*****/
 +      ret = sqlite3_bind_text(stmt, 1, tablename, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -      char* row_cnt_qry = (char*)malloc(strlen("SELECT COUNT(*) FROM ") + strlen(table_name) + strlen(";") +1);
 -      strcpy(row_cnt_qry, "SELECT COUNT(*) FROM ");
 -      strcat(row_cnt_qry, table_name);
 -      strcat(row_cnt_qry, ";");
 +      ret = sqlite3_bind_int(stmt, 2, UC->id.id);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -      int no_of_rows = 0;
 -      //ret = sqlite3_exec(s_info.db,var_query, callback,(void*)s_info.db, &err_msg);
 +      ret = sqlite3_bind_int(stmt, 3, UC->id.type);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -      sqlite3_stmt *stmt;
 -      if (sqlite3_prepare_v2(db, row_cnt_qry, -1, &stmt, NULL) == SQLITE_OK) {
 -              if (sqlite3_step(stmt) == SQLITE_ERROR) {
 -                      no_of_rows = 0;
 -              } else {
 -                      no_of_rows = sqlite3_column_int(stmt, 0);
 -              }
 +      ret = sqlite3_bind_int(stmt, 4, UC->flags);
 +      if (ret != SQLITE_OK) {
                sqlite3_finalize(stmt);
 +              return -EFAULT;
        }
  
 -      free(row_cnt_qry);
 -      if(no_of_rows <= 0) {
 -              close_database(db);
 -              return EINA_FALSE;
 +      str = tg_common_to_string("%d", last_msg_id);
 +      ret = sqlite3_bind_text(stmt, 5, str, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_int(stmt, 6, UC->last ? UC->last->date : 0);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
        }
 -      close_database(db);
 -      /********************************/
  
 -      int ret = 0 ;
 -      char* err_msg = 0;
 -      //int col_count = eina_list_count(column_names);
 +      ret = sqlite3_bind_text(stmt, 7, UC->print_name, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -      db = create_database(DEFAULT_TG_DATABASE_PATH);
 +      ret = sqlite3_bind_int(stmt, 8, UC->structure_version);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -      int str_len = strlen("SELECT ") + 1;
 -      char* var_query = (char*)malloc(str_len);
 -      strcpy(var_query,"SELECT ");
 -      if(!column_names) {
 -              var_query = realloc(var_query, strlen(var_query) + 3);
 -              strcat(var_query, "* ");
 +      ret = sqlite3_bind_int(stmt, 9, unread_count);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      if (UC->id.type == TGL_PEER_USER ) {
 +              ret = sqlite3_bind_int(stmt, 10, UC->user.status.when);
 +      } else if (UC->id.type == TGL_PEER_CHAT ) {
 +              ret = sqlite3_bind_int(stmt, 10, UC->chat.date);
        } else {
 +              ret = sqlite3_bind_int(stmt, 10, 0);
 +      }
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -              int col_count = eina_list_count(column_names);
 -              char* col_name = NULL;
 -              for(int col = 0; col < col_count ; col++) {
 -                      col_name = eina_list_nth(column_names, col);
 -                      var_query = realloc(var_query, strlen(var_query)+strlen(col_name) + 1);
 -                      strcat(var_query, col_name);
 -                      col_name = NULL;
 -                      var_query = realloc(var_query, strlen(var_query)+strlen(" ") + 1);
 -
 -                      if(col < col_count - 1){
 -                              var_query = realloc(var_query, strlen(var_query) + 3);
 -                              strcat(var_query, ", ");
 -                      } else {
 -                              var_query = realloc(var_query, strlen(var_query) + 2);
 -                              strcat(var_query, " ");
 -                      }
 -              }
 +      ret = sqlite3_bind_text(stmt, 11, "", -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 +      ret = sqlite3_bind_int(stmt, 12, UC->photo.id);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
        }
  
 -      var_query = realloc(var_query, strlen(var_query) + strlen("FROM ") + 2);
 -      strcat(var_query, "FROM ");
 -      var_query = realloc(var_query, strlen(var_query) + strlen(table_name) + 1);
 -      strcat(var_query, table_name);
 +      ret = sqlite3_step(stmt);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -      if (where_clause) {
 -              var_query = realloc(var_query, strlen(var_query)+strlen(" WHERE ") + 1);
 -              strcat(var_query, " WHERE ");
 -              var_query = realloc(var_query, strlen(var_query)+strlen(where_clause) + 1);
 -              strcat(var_query, where_clause);
 +      sqlite3_finalize(stmt);
 +      return 0;
 +}
 +
 +int tg_db_update_user_info(const char *tablename, struct tgl_user *U)
 +{
 +      const char *dml;
 +      sqlite3_stmt *stmt;
 +      int ret;
 +
 +      dml = "UPDATE ? SET print_name = ?, structure_version = ?, first_name = ?, last_name = ?, phone = ?, access_hash = ?, real_first_name = ?, real_last_name = ?, username = ?, online = ?, last_seen = ? WHERE user_id = ?";
 +      ret = sqlite3_prepare_v2(s_info.db, dml, -1, &stmt, NULL);
 +      if (ret != SQLITE_OK) {
 +              return -EFAULT;
        }
  
 -      var_query = realloc(var_query, strlen(var_query) + 2);
 -      strcat(var_query, ";");
 +      ret = sqlite3_bind_text(stmt, 1, tablename, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 +      ret = sqlite3_bind_text(stmt, 2, U->print_name, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -      ret = sqlite3_exec(db,var_query, callback,(void*)data_to_callback, &err_msg);
 -      close_database(db);
 -      if( ret != SQLITE_OK ){
 -              sqlite3_free(err_msg);
 -              return EINA_FALSE;
 +      ret = sqlite3_bind_int(stmt, 3, U->structure_version);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
        }
  
 -      free(var_query);
 -      return EINA_TRUE;
 +      ret = sqlite3_bind_text(stmt, 4, U->first_name, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_text(stmt, 5, U->last_name, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_text(stmt, 6, U->phone, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_int(stmt, 7, U->access_hash);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_text(stmt, 8, U->real_first_name, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_text(stmt, 9, U->real_last_name, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_text(stmt, 10, U->username, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_int(stmt, 11, U->status.online);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_int(stmt, 12, U->last->date);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_int(stmt, 13, U->id.id);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      if (sqlite3_step(stmt) != SQLITE_DONE) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      sqlite3_finalize(stmt);
 +      return 0;
  }
  
 -Eina_List *get_values_from_table_sync(const char* table_name, Eina_List* column_names, Eina_List* column_types, const char* where_clause)
 +int tg_db_update_user_photo(const char *tablename, int uid, const char *photo, int photo_id)
  {
 -      Eina_List* query_vals = NULL;
 +      const char *dml;
 +      int ret;
 +      sqlite3_stmt *stmt;
 +      int idx;
  
 -      if (!table_name) {
 -              return (Eina_List *)NULL;
 +      if (photo_id < 0) {
 +              dml = "UPDATE ? SET photo = ?, photo_id = ? WHERE user_id = ?";
 +      } else {
 +              dml = "UPDATE ? SET photo = ? WHERE user_id = ?";
        }
  
 -      sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
 -      /*****No rows identification*****/
 +      idx = 1;
  
 -      char* row_cnt_qry = (char *)malloc(strlen("SELECT COUNT(*) FROM ") + strlen(table_name) + strlen(";") +1);
 -      strcpy(row_cnt_qry, "SELECT COUNT(*) FROM ");
 -      strcat(row_cnt_qry, table_name);
 -      strcat(row_cnt_qry, ";");
 +      ret = sqlite3_prepare_v2(s_info.db, dml, -1, &stmt, NULL);
 +      if (ret != SQLITE_OK) {
 +              return -EFAULT;
 +      }
  
 -      int no_of_rows = 0;
 -      //ret = sqlite3_exec(s_info.db,var_query, callback,(void*)s_info.db, &err_msg);
 +      ret = sqlite3_bind_text(stmt, idx++, tablename, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_text(stmt, idx++, photo, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      if (photo_id >= 0) {
 +              ret = sqlite3_bind_int(stmt, idx++, photo_id);
 +      }
  
 +      ret = sqlite3_bind_int(stmt, idx++, uid);
 +      ret = sqlite3_step(stmt);
 +      sqlite3_finalize(stmt);
 +      if (ret != SQLITE_DONE) {
 +              return -EIO;
 +      }
 +
 +      return 0;
 +}
 +
 +int tg_db_insert_user_info(const char *tablename, struct tgl_user *U)
 +{
 +      const char *dml;
        sqlite3_stmt *stmt;
 -      if (sqlite3_prepare_v2(db, row_cnt_qry, -1, &stmt, NULL) == SQLITE_OK) {
 -              if (sqlite3_step(stmt) == SQLITE_ERROR) {
 -                      no_of_rows = 0;
 -              } else {
 -                      no_of_rows = sqlite3_column_int(stmt, 0);
 -              }
 +      int ret;
 +
 +      dml = "INSERT (user_id, print_name, structure_version, first_name, last_name, phone, access_hash, real_first_name, real_last_name, username, online, last_seen) INTO ? VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
 +
 +      ret = sqlite3_prepare_v2(s_info.db, dml, -1, &stmt, NULL);
 +      if (ret != SQLITE_OK) {
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_int(stmt, 1, U->id.id);
 +      if (ret != SQLITE_OK) {
                sqlite3_finalize(stmt);
 +              return -EFAULT;
        }
 -      close_database(db);
 -      free(row_cnt_qry);
 -      if(no_of_rows <= 0) {
 -              return (Eina_List *)NULL;
 +
 +      ret = sqlite3_bind_text(stmt, 2, U->print_name, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
        }
  
 -      /********************************/
 -      db = create_database(DEFAULT_TG_DATABASE_PATH);
 -      int ret = 0 ;
 -      char* err_msg = 0;
 -      //int col_count = eina_list_count(column_names);
 +      ret = sqlite3_bind_int(stmt, 3, U->structure_version);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -      int str_len = strlen("SELECT ") + 1;
 -      char* var_query = (char*)malloc(str_len);
 -      strcpy(var_query,"SELECT ");
 -      if(!column_names) {
 -              var_query = realloc(var_query, strlen(var_query) + 3);
 -              strcat(var_query, "* ");
 -      } else {
 +      ret = sqlite3_bind_text(stmt, 4, U->first_name, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -              int col_count = eina_list_count(column_names);
 -              char* col_name = NULL;
 -              for(int col = 0; col < col_count ; col++) {
 -                      col_name = eina_list_nth(column_names, col);
 -                      var_query = realloc(var_query, strlen(var_query)+strlen(col_name) + 1);
 -                      strcat(var_query, col_name);
 -                      col_name = NULL;
 -                      var_query = realloc(var_query, strlen(var_query)+strlen(" ") + 1);
 -
 -                      if(col < col_count - 1){
 -                              var_query = realloc(var_query, strlen(var_query) + 3);
 -                              strcat(var_query, ", ");
 -                      } else {
 -                              var_query = realloc(var_query, strlen(var_query) + 2);
 -                              strcat(var_query, " ");
 -                      }
 -              }
 +      ret = sqlite3_bind_text(stmt, 5, U->last_name, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_text(stmt, 6, U->phone, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_int(stmt, 7, U->access_hash);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_text(stmt, 8, U->real_first_name, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_text(stmt, 9, U->real_last_name, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
 +
 +      ret = sqlite3_bind_text(stmt, 10, U->username, -1, SQLITE_TRANSIENT);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 +      ret = sqlite3_bind_int(stmt, 11, U->status.online);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
        }
  
 -      var_query = realloc(var_query, strlen(var_query) + strlen("FROM ") + 2);
 -      strcat(var_query, "FROM ");
 -      var_query = realloc(var_query, strlen(var_query) + strlen(table_name) + 1);
 -      strcat(var_query, table_name);
 +      ret = sqlite3_bind_int(stmt, 12, U->last ? U->last->date : 0);
 +      if (ret != SQLITE_OK) {
 +              sqlite3_finalize(stmt);
 +              return -EFAULT;
 +      }
  
 -      if (where_clause) {
 -              var_query = realloc(var_query, strlen(var_query)+strlen(" WHERE ") + 1);
 -              strcat(var_query, " WHERE ");
 -              var_query = realloc(var_query, strlen(var_query)+strlen(where_clause) + 1);
 -              strcat(var_query, where_clause);
 +      ret = sqlite3_step(stmt);
 +      if (ret != SQLITE_DONE) {
 +              sqlite3_finalize(stmt);
 +              return 0;
        }
  
 -      var_query = realloc(var_query, strlen(var_query) + 2);
 -      strcat(var_query, ";");
 +      sqlite3_finalize(stmt);
 +      return 0;
 +}
  
 +struct tgl_user *tg_db_get_user_info(const char *table_name, int uid)
 +{
 +      const char *dml;
 +      sqlite3_stmt *stmt;
 +      int ret;
 +      struct tgl_user *user_info;
 +      const char *tmp;
  
 -      ret = sqlite3_prepare_v2(db, var_query, -1, &stmt, 0);
 -      close_database(db);
 -      if( ret != SQLITE_OK ){
 -              sqlite3_free(err_msg);
 +      dml = "SELECT * FROM ?";
 +      ret = sqlite3_prepare_v2(s_info.db, dml, -1, &stmt, NULL);
 +      if (ret != SQLITE_OK) {
                return NULL;
        }
  
@@@ -560,19 -508,12 +560,19 @@@ void send_message_sent_to_buddy_respons
        if(result != SVC_RES_OK) {
                // error: cient not ready
        }
 -      bundle_free(msg);
  }
  
- void send_media_download_completed_response(tg_engine_data_s *tg_data, int buddy_id, long long media_id, const char* filename)
+ void send_media_download_completed_response(tg_engine_data_s *tg_data, int buddy_id, int to_id, long long media_id, const char* filename)
  {
 -      bundle *msg = bundle_create();
 +      bundle *msg;
 +      int result;
 +      const char *str;
 +
 +      msg = bundle_create();
 +      if (!msg) {
 +              return;
 +      }
 +
        if (bundle_add_str(msg, "app_name", "Tizen Telegram") != 0)     {
                ERR("Failed to add data by key to bundle");
                bundle_free(msg);
        if (bundle_add_str(msg, "command", "media_download_completed") != 0) {
                ERR("Failed to add data by key to bundle");
                bundle_free(msg);
 +              return;
        }
  
 -      char usr_id_str[50];
 -      sprintf(usr_id_str,"%d",buddy_id);
 -
 -      if (bundle_add_str(msg, "buddy_id", usr_id_str) != 0) {
 +      str = tg_common_to_string("%d", buddy_id);
 +      if (bundle_add_str(msg, "buddy_id", str) != 0) {
                ERR("Failed to add data by key to bundle");
                bundle_free(msg);
 +              return;
        }
  
 -      char to_id_str[50];
 -      sprintf(to_id_str,"%d",to_id);
 -
 -      if (bundle_add_str(msg, "to_peer_id", to_id_str) != 0) {
++      str = tg_common_to_string("%d", to_id);
++      if (bundle_add_str(msg, "to_peer_id", to_id_str) != BUNDLE_ERROR_NONE) {
+               ERR("Failed to add data by key to bundle");
+               bundle_free(msg);
++              return;
+       }
 -      char media_id_str[50];
 -      sprintf(media_id_str,"%lld",media_id);
 -
 -      if (bundle_add_str(msg, "media_id", media_id_str) != 0) {
 +      str = tg_common_to_string("%lld", media_id);
 +      if (bundle_add_str(msg, "media_id", str) != 0) {
                ERR("Failed to add data by key to bundle");
                bundle_free(msg);
 +              return;
        }
  
 -      if (filename) {
 -              if (bundle_add_str(msg, "file_name", filename) != 0) {
 -                      ERR("Failed to add data by key to bundle");
 -                      bundle_free(msg);
 -              }
 -      } else  {
 -              if (bundle_add_str(msg, "file_name", "failed_to_load") != 0) {
 -                      ERR("Failed to add data by key to bundle");
 -                      bundle_free(msg);
 -              }
 +      if (bundle_add_str(msg, "file_name", filename ? filename : "failed_to_load") != BUNDLE_ERROR_NONE) {
 +              bundle_free(msg);
 +              return;
        }
  
 -      int result = SVC_RES_FAIL;
        result = tg_server_send_message(tg_data->tg_server, msg);
 -
 +      bundle_free(msg);
        if(result != SVC_RES_OK) {
                // error: cient not ready
        }
@@@ -690,19 -634,60 +697,68 @@@ void send_buddy_status_updated_response
        if(result != SVC_RES_OK) {
                // error: cient not ready
        }
 -      bundle_free(msg);
  }
  
- void send_buddy_type_notification_response(tg_engine_data_s *tg_data, int buddy_id, char *buddy_name, int type_status)
+ void send_buddy_status_notification_response(tg_engine_data_s *tg_data, int buddy_id, char* budy_name, int online)
+ {
 -      bundle *msg = bundle_create();
++      bundle *msg;
++      const char *tmp;
++      int result = SVC_RES_FAIL;
++
++      msg = bundle_create();
++      if (!msg) {
++              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", "user_status_updated") != 0) {
+               ERR("Failed to add data by key to bundle");
+               bundle_free(msg);
++              return;
+       }
 -      char usr_id_str[50];
 -      sprintf(usr_id_str,"%d",buddy_id);
 -
 -      if (bundle_add_str(msg, "buddy_id", usr_id_str) != 0) {
++      tmp = tg_common_to_string("%d", buddy_id);
++      if (bundle_add_str(msg, "buddy_id", tmp) != 0) {
+               ERR("Failed to add data by key to bundle");
+               bundle_free(msg);
++              return;
+       }
+       if (bundle_add_str(msg, "buddy_name", budy_name) != 0) {
+               ERR("Failed to add data by key to bundle");
+               bundle_free(msg);
++              return;
+       }
 -      if (online) {
 -              if (bundle_add_str(msg, "user_status", "online") != 0) {
 -                      ERR("Failed to add data by key to bundle");
 -                      bundle_free(msg);
 -              }
 -      } else {
 -              if (bundle_add_str(msg, "user_status", "offline") != 0) {
 -                      ERR("Failed to add data by key to bundle");
 -                      bundle_free(msg);
 -              }
 -
++      if (bundle_add_str(msg, "user_status", online ? "online" : "offline") != BUNDLE_ERROR_NONE) {
++              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);
 -
++      bundle_free(msg);
+       if(result != SVC_RES_OK) {
+               // error: cient not ready
+       }
 -      bundle_free(msg);
+ }
+ void send_buddy_type_notification_response(tg_engine_data_s *tg_data, int buddy_id, char* budy_name, int type_status)
  {
 -      bundle *msg = bundle_create();
 +      bundle *msg;
 +      int result;
 +      const char *str;
 +
 +      msg = bundle_create();
 +      if (!msg) {
 +              return;
 +      }
 +
        if (bundle_add_str(msg, "app_name", "Tizen Telegram") != 0)     {
                ERR("Failed to add data by key to bundle");
                bundle_free(msg);
        if(result != SVC_RES_OK) {
                // error: cient not ready
        }
 -      bundle_free(msg);
  }
--
--
@@@ -1156,34 -1387,512 +1386,32 @@@ void add_contacts_to_user(tg_engine_dat
  
  void media_download_request(tg_engine_data_s *tg_data, int buddy_id, long long media_id)
  {
--#if 1
        // get media details by mediaid
 -      Eina_List* img_details = get_image_details_from_db(media_id);
 +      int media_type;
 +      void *media;
  
 -      if(!img_details) {
 +      media = tg_db_get_media_info(MEDIA_INFO_TABLE_NAME, media_id, &media_type);
 +      if (!media) {
-               send_media_download_completed_response(tg_data, buddy_id, media_id, NULL);
+               send_media_download_completed_response(tg_data, -1, buddy_id, media_id, NULL);
                return;
 -      } else {
 -
 -              char *media_id_str = 0;
 -              int media_type = 0;
 -              char *access_hash_str = 0;
 -              int user_id = 0;
 -              int date = 0;
 -              char *caption = 0;
 -              char *longitude = 0;
 -              char *latitude = 0;
 -              int sizes = 0;
 -              char *phone_no = 0;
 -              char *first_name = 0;
 -              char *last_name = 0;
 -              char *file_path = 0;
 -
 -              char *photo_type1 = 0;
 -              int photo_loc_dc1 = 0;
 -              char *photo_loc_vol_str1 = 0;
 -              int photo_loc_id1 = 0;
 -              char *photo_loc_sec_str1 = 0;
 -              int photo_width1 = 0;
 -              int photo_height1 = 0;
 -              int photo_size1 = 0;
 -              char *photo_data1 = 0;
 -
 -              char *photo_type2 = 0;
 -              int photo_loc_dc2 = 0;
 -              char *photo_loc_vol_str2 = 0;
 -              int photo_loc_id2 = 0;
 -              char *photo_loc_sec_str2 = 0;
 -              int photo_width2 = 0;
 -              int photo_height2 = 0;
 -              int photo_size2 = 0;
 -              char *photo_data2 = 0;
 -
 -              char *photo_type3 = 0;
 -              int photo_loc_dc3 = 0;
 -              char *photo_loc_vol_str3 = 0;
 -              int photo_loc_id3 = 0;
 -              char *photo_loc_sec_str3 = 0;
 -              int photo_width3 = 0;
 -              int photo_height3 = 0;
 -              int photo_size3 = 0;
 -              char *photo_data3 = 0;
 -
 -              char *photo_type4 = 0;
 -              int photo_loc_dc4 = 0;
 -              char *photo_loc_vol_str4 = 0;
 -              int photo_loc_id4 = 0;
 -              char *photo_loc_sec_str4 = 0;
 -              int photo_width4 = 0;
 -              int photo_height4 = 0;
 -              int photo_size4 = 0;
 -              char *photo_data4 = 0;
 -
 -
 -              int row_count = eina_list_count(img_details);
 -
 -              for (int i = 0 ; i < row_count ; i++) {
 -                      Eina_List* row_vals = eina_list_nth(img_details, i);
 -
 -                      char *temp_media_id = (char *)eina_list_nth(row_vals, 0);
 -
 -                      if(temp_media_id) {
 -                              media_id_str = strdup(temp_media_id);
 -                              free(temp_media_id);
 -                      }
 -
 -                      int* temp_media_type = (int*)eina_list_nth(row_vals, 1);
 -
 -                      if(temp_media_type) {
 -                              media_type = *temp_media_type;
 -                              free(temp_media_type);
 -                      }
 -
 -                      char *temp_access_hash = (char *)eina_list_nth(row_vals, 2);
 -
 -                      if(temp_access_hash) {
 -                              access_hash_str = strdup(temp_access_hash);
 -                              free(temp_access_hash);
 -                      }
 -
 -                      int* temp_user_id = (int*)eina_list_nth(row_vals, 3);
 -
 -                      if(temp_user_id) {
 -                              user_id = *temp_user_id;
 -                              free(temp_user_id);
 -                      }
 -
 -                      int* temp_date = (int*)eina_list_nth(row_vals, 4);
 -
 -                      if(temp_date) {
 -                              date = *temp_date;
 -                              free(temp_date);
 -                      }
 -
 -                      char *temp_caption = (char *)eina_list_nth(row_vals, 5);
 -
 -                      if(temp_caption) {
 -                              caption = strdup(temp_caption);
 -                              free(temp_caption);
 -                      }
 -
 -                      char *temp_longitude = (char *)eina_list_nth(row_vals, 6);
 -
 -                      if(temp_longitude) {
 -                              longitude = strdup(temp_longitude);
 -                              free(temp_longitude);
 -                      }
 -
 -                      char *temp_latitude = (char *)eina_list_nth(row_vals, 7);
 -
 -                      if(temp_latitude) {
 -                              latitude = strdup(temp_latitude);
 -                              free(temp_latitude);
 -                      }
 -
 -                      int* temp_sizes = (int*)eina_list_nth(row_vals, 8);
 -
 -                      if(temp_sizes) {
 -                              sizes = *temp_sizes;
 -                              free(temp_sizes);
 -                      }
 -
 -                      /***************************************************************/
 -
 -                      char *temp_photo_type1 = (char *)eina_list_nth(row_vals, 9);
 -                      if (temp_photo_type1 && strlen(temp_photo_type1) > 0) {
 -                              photo_type1 =strdup(temp_photo_type1);
 -                              free(temp_photo_type1);
 -                      }
 -
 -
 -                      int* temp_photo_loc_dc1 = (int*)eina_list_nth(row_vals, 10);
 -                      if (temp_photo_loc_dc1) {
 -                              photo_loc_dc1 = *temp_photo_loc_dc1;
 -                              free(temp_photo_loc_dc1);
 -                      }
 -
 -
 -                      char *temp_photo_loc_vol1 = (char *)eina_list_nth(row_vals, 11);
 -                      if(temp_photo_loc_vol1 && strlen(temp_photo_loc_vol1) > 0) {
 -                              photo_loc_vol_str1 = strdup(temp_photo_loc_vol1);
 -                              free(temp_photo_loc_vol1);
 -                      }
 -
 -
 -                      int* temp_photo_loc_id1 = (int*)eina_list_nth(row_vals, 12);
 -                      if (temp_photo_loc_id1) {
 -                              photo_loc_id1 = *temp_photo_loc_id1;
 -                              free(temp_photo_loc_id1);
 -                      }
 -
 -                      char *temp_photo_loc_sec1 = (char *)eina_list_nth(row_vals, 13);
 -                      if(temp_photo_loc_sec1 && strlen(temp_photo_loc_sec1) > 0) {
 -                              photo_loc_sec_str1 = strdup(temp_photo_loc_sec1);
 -                              free(temp_photo_loc_sec1);
 -                      }
 -
 -
 -                      int* temp_photo_width1 = (int*)eina_list_nth(row_vals, 14);
 -                      if(temp_photo_width1) {
 -                              photo_width1 = *temp_photo_width1;
 -                              free(temp_photo_width1);
 -                      }
 -
 -
 -                      int* temp_photo_height1 = (int*)eina_list_nth(row_vals, 15);
 -                      if(temp_photo_height1) {
 -                              photo_height1 = *temp_photo_height1;
 -                              free(temp_photo_height1);
 -                      }
 -
 -                      int* temp_photo_size1 = (int*)eina_list_nth(row_vals, 16);
 -                      if(temp_photo_size1) {
 -                              photo_size1 = *temp_photo_size1;
 -                              free(temp_photo_size1);
 -                      }
 -
 -
 -                      char *temp_photo_data1 = (char *)eina_list_nth(row_vals, 17);
 -                      if(temp_photo_data1 && strlen(temp_photo_data1) > 0) {
 -                              photo_data1 = strdup(temp_photo_data1);
 -                              free(temp_photo_data1);
 -                      }
 -
 -
 -                      char *temp_photo_type2 = (char *)eina_list_nth(row_vals, 18);
 -                      if (temp_photo_type2 && strlen(temp_photo_type2) > 0) {
 -                              photo_type2 =strdup(temp_photo_type2);
 -                              free(temp_photo_type2);
 -                      }
 -
 -
 -                      int* temp_photo_loc_dc2 = (int*)eina_list_nth(row_vals, 19);
 -                      if (temp_photo_loc_dc2) {
 -                              photo_loc_dc2 = *temp_photo_loc_dc2;
 -                              free(temp_photo_loc_dc2);
 -                      }
 -
 -
 -                      char *temp_photo_loc_vol2 = (char *)eina_list_nth(row_vals, 20);
 -                      if(temp_photo_loc_vol2 && strlen(temp_photo_loc_vol2) > 0) {
 -                              photo_loc_vol_str2 = strdup(temp_photo_loc_vol2);
 -                              free(temp_photo_loc_vol2);
 -                      }
 -
 -
 -                      int* temp_photo_loc_id2 = (int*)eina_list_nth(row_vals, 21);
 -                      if (temp_photo_loc_id2) {
 -                              photo_loc_id2 = *temp_photo_loc_id2;
 -                              free(temp_photo_loc_id2);
 -                      }
 -
 -                      char *temp_photo_loc_sec2 = (char *)eina_list_nth(row_vals, 22);
 -                      if(temp_photo_loc_sec2 && strlen(temp_photo_loc_sec2) > 0) {
 -                              photo_loc_sec_str2 = strdup(temp_photo_loc_sec2);
 -                              free(temp_photo_loc_sec2);
 -                      }
 -
 -
 -                      int* temp_photo_width2 = (int*)eina_list_nth(row_vals, 23);
 -                      if(temp_photo_width2) {
 -                              photo_width2 = *temp_photo_width2;
 -                              free(temp_photo_width2);
 -                      }
 -
 -
 -                      int* temp_photo_height2 = (int*)eina_list_nth(row_vals, 24);
 -                      if(temp_photo_height2) {
 -                              photo_height2 = *temp_photo_height2;
 -                              free(temp_photo_height2);
 -                      }
 -
 -                      int* temp_photo_size2 = (int*)eina_list_nth(row_vals, 25);
 -                      if(temp_photo_size2) {
 -                              photo_size2 = *temp_photo_size2;
 -                              free(temp_photo_size2);
 -                      }
 -
 -
 -                      char *temp_photo_data2 = (char *)eina_list_nth(row_vals, 26);
 -                      if(temp_photo_data2 && strlen(temp_photo_data2) > 0) {
 -                              photo_data2 = strdup(temp_photo_data2);
 -                              free(temp_photo_data2);
 -                      }
 -
 -                      char *temp_photo_type3 = (char *)eina_list_nth(row_vals, 27);
 -                      if (temp_photo_type3 && strlen(temp_photo_type3) > 0) {
 -                              photo_type3 =strdup(temp_photo_type3);
 -                              free(temp_photo_type3);
 -                      }
 -
 -
 -                      int* temp_photo_loc_dc3 = (int*)eina_list_nth(row_vals, 28);
 -                      if (temp_photo_loc_dc3) {
 -                              photo_loc_dc3 = *temp_photo_loc_dc3;
 -                              free(temp_photo_loc_dc3);
 -                      }
 -
 -
 -                      char *temp_photo_loc_vol3 = (char *)eina_list_nth(row_vals, 29);
 -                      if(temp_photo_loc_vol3 && strlen(temp_photo_loc_vol3) > 0) {
 -                              photo_loc_vol_str3 = strdup(temp_photo_loc_vol3);
 -                              free(temp_photo_loc_vol3);
 -                      }
 -
 -
 -                      int* temp_photo_loc_id3 = (int*)eina_list_nth(row_vals, 30);
 -                      if (temp_photo_loc_id3) {
 -                              photo_loc_id3 = *temp_photo_loc_id3;
 -                              free(temp_photo_loc_id3);
 -                      }
 -
 -                      char *temp_photo_loc_sec3 = (char *)eina_list_nth(row_vals, 31);
 -                      if(temp_photo_loc_sec3 && strlen(temp_photo_loc_sec3) > 0) {
 -                              photo_loc_sec_str3 = strdup(temp_photo_loc_sec3);
 -                              free(temp_photo_loc_sec3);
 -                      }
 -
 -
 -                      int* temp_photo_width3 = (int*)eina_list_nth(row_vals, 32);
 -                      if(temp_photo_width3) {
 -                              photo_width3 = *temp_photo_width3;
 -                              free(temp_photo_width3);
 -                      }
 -
 -
 -                      int* temp_photo_height3 = (int*)eina_list_nth(row_vals, 33);
 -                      if(temp_photo_height3) {
 -                              photo_height3 = *temp_photo_height3;
 -                              free(temp_photo_height3);
 -                      }
 -
 -                      int* temp_photo_size3 = (int*)eina_list_nth(row_vals, 34);
 -                      if(temp_photo_size3) {
 -                              photo_size3 = *temp_photo_size3;
 -                              free(temp_photo_size3);
 -                      }
 -
 -
 -                      char *temp_photo_data3 = (char *)eina_list_nth(row_vals, 35);
 -                      if(temp_photo_data3 && strlen(temp_photo_data3) > 0) {
 -                              photo_data3 = strdup(temp_photo_data3);
 -                              free(temp_photo_data3);
 -                      }
 -
 -                      char *temp_photo_type4 = (char *)eina_list_nth(row_vals, 36);
 -                      if (temp_photo_type4 && strlen(temp_photo_type4) > 0) {
 -                              photo_type4 =strdup(temp_photo_type4);
 -                              free(temp_photo_type4);
 -                      }
 -
 -
 -                      int* temp_photo_loc_dc4 = (int*)eina_list_nth(row_vals, 37);
 -                      if (temp_photo_loc_dc4) {
 -                              photo_loc_dc4 = *temp_photo_loc_dc4;
 -                              free(temp_photo_loc_dc4);
 -                      }
 -
 -
 -                      char *temp_photo_loc_vol4 = (char *)eina_list_nth(row_vals, 38);
 -                      if(temp_photo_loc_vol4 && strlen(temp_photo_loc_vol4) > 0) {
 -                              photo_loc_vol_str4 = strdup(temp_photo_loc_vol4);
 -                              free(temp_photo_loc_vol4);
 -                      }
 -
 -
 -                      int* temp_photo_loc_id4 = (int*)eina_list_nth(row_vals, 39);
 -                      if (temp_photo_loc_id4) {
 -                              photo_loc_id4 = *temp_photo_loc_id4;
 -                              free(temp_photo_loc_id4);
 -                      }
 -
 -                      char *temp_photo_loc_sec4 = (char *)eina_list_nth(row_vals, 40);
 -                      if(temp_photo_loc_sec4 && strlen(temp_photo_loc_sec4) > 0) {
 -                              photo_loc_sec_str4 = strdup(temp_photo_loc_sec4);
 -                              free(temp_photo_loc_sec4);
 -                      }
 -
 -
 -                      int* temp_photo_width4 = (int*)eina_list_nth(row_vals, 41);
 -                      if(temp_photo_width4) {
 -                              photo_width4 = *temp_photo_width4;
 -                              free(temp_photo_width4);
 -                      }
 -
 -
 -                      int* temp_photo_height4 = (int*)eina_list_nth(row_vals, 42);
 -                      if(temp_photo_height4) {
 -                              photo_height4 = *temp_photo_height4;
 -                              free(temp_photo_height4);
 -                      }
 -
 -                      int* temp_photo_size4 = (int*)eina_list_nth(row_vals, 43);
 -                      if(temp_photo_size4) {
 -                              photo_size4 = *temp_photo_size4;
 -                              free(temp_photo_size4);
 -                      }
 -
 -
 -                      char *temp_photo_data4 = (char *)eina_list_nth(row_vals, 44);
 -                      if(temp_photo_data4 && strlen(temp_photo_data4) > 0) {
 -                              photo_data4 = strdup(temp_photo_data4);
 -                              free(temp_photo_data4);
 -                      }
 -
 -
 -                      /**************************************************************/
 -
 -                      char *temp_phone_no = (char *)eina_list_nth(row_vals, 45);
 -
 -                      if(temp_phone_no && strlen(temp_phone_no) > 0) {
 -                              phone_no = strdup(temp_phone_no);
 -                              free(temp_phone_no);
 -                      }
 -
 -                      char *temp_first_name = (char *)eina_list_nth(row_vals, 46);
 -
 -                      if(temp_first_name && strlen(temp_first_name) > 0) {
 -                              first_name = strdup(temp_first_name);
 -                              free(temp_first_name);
 -                      }
 -
 -                      char *temp_last_name = (char *)eina_list_nth(row_vals, 47);
 -
 -                      if(temp_last_name && strlen(temp_last_name) > 0) {
 -                              last_name = strdup(temp_last_name);
 -                              free(temp_last_name);
 -                      }
 -
 -                      char *temp_file_path = (char *)eina_list_nth(row_vals, 48);
 -
 -                      if(temp_file_path && strlen(temp_file_path) > 0) {
 -                              file_path = strdup(temp_file_path);
 -                              free(temp_file_path);
 -                      }
 -                      break;
 -                      eina_list_free(row_vals);
 -              }
 -
 -              if (media_type == tgl_message_media_none) {
 -
 -              } else if (media_type == tgl_message_media_photo) {
 -
 -                      long long media_id = atoll(media_id_str);
 -                      long long access_hash = atoll(access_hash_str);
 -
 -                      struct tgl_photo* photo_prop = (struct tgl_photo*)malloc(sizeof(struct tgl_photo));
 -                      photo_prop->id = media_id;
 -                      photo_prop->access_hash = access_hash;
 -                      photo_prop->user_id = user_id;
 -                      photo_prop->date = date;
 -                      photo_prop->caption = caption;
 -                      photo_prop->geo.latitude = atof(latitude);
 -                      photo_prop->geo.longitude = atof(longitude);
 -                      photo_prop->sizes_num = sizes;
 -
 -                      photo_prop->sizes = talloc(sizeof(struct tgl_photo_size) * photo_prop->sizes_num);
 -                      int i;
 -                      for (i = 0; i < photo_prop->sizes_num; i++) {
 -
 -                              if (i == 0) {
 -                                      photo_prop->sizes[i].w = photo_width1;
 -                                      photo_prop->sizes[i].h = photo_height1;
 -                                      photo_prop->sizes[i].size = photo_size1;
 -                                      if(photo_data1) {
 -                                              photo_prop->sizes[i].data = strdup(photo_data1);
 -                                      }
 -                                      if(photo_type1) {
 -                                              photo_prop->sizes[i].type = strdup(photo_type1);
 -                                      }
 -                                      photo_prop->sizes[i].loc.dc = photo_loc_dc1;
 -                                      photo_prop->sizes[i].loc.local_id = photo_loc_id1;
 -                                      photo_prop->sizes[i].loc.secret = atoll(photo_loc_sec_str1);
 -                                      photo_prop->sizes[i].loc.volume = atoll(photo_loc_vol_str1);
 -                              } else if (i == 1) {
 -
 -                                      photo_prop->sizes[i].w = photo_width2;
 -                                      photo_prop->sizes[i].h = photo_height2;
 -                                      photo_prop->sizes[i].size = photo_size2;
 -                                      if(photo_data2) {
 -                                              photo_prop->sizes[i].data = strdup(photo_data2);
 -                                      }
 -                                      if(photo_type2) {
 -                                              photo_prop->sizes[i].type = strdup(photo_type2);
 -                                      }
 -                                      photo_prop->sizes[i].loc.dc = photo_loc_dc2;
 -                                      photo_prop->sizes[i].loc.local_id = photo_loc_id2;
 -                                      photo_prop->sizes[i].loc.secret = atoll(photo_loc_sec_str2);
 -                                      photo_prop->sizes[i].loc.volume = atoll(photo_loc_vol_str2);
 -
 -                              } else if (i == 2) {
 -
 -                                      photo_prop->sizes[i].w = photo_width3;
 -                                      photo_prop->sizes[i].h = photo_height3;
 -                                      photo_prop->sizes[i].size = photo_size3;
 -                                      if(photo_data3) {
 -                                              photo_prop->sizes[i].data = strdup(photo_data3);
 -                                      }
 -                                      if(photo_type3) {
 -                                              photo_prop->sizes[i].type = strdup(photo_type3);
 -                                      }
 -                                      photo_prop->sizes[i].loc.dc = photo_loc_dc3;
 -                                      photo_prop->sizes[i].loc.local_id = photo_loc_id3;
 -                                      photo_prop->sizes[i].loc.secret = atoll(photo_loc_sec_str3);
 -                                      photo_prop->sizes[i].loc.volume = atoll(photo_loc_vol_str3);
 -
 -                              } else if (i == 3) {
 -
 -                                      photo_prop->sizes[i].w = photo_width4;
 -                                      photo_prop->sizes[i].h = photo_height4;
 -                                      photo_prop->sizes[i].size = photo_size4;
 -                                      if(photo_data4) {
 -                                              photo_prop->sizes[i].data = strdup(photo_data4);
 -                                      }
 -                                      if(photo_type4) {
 -                                              photo_prop->sizes[i].type = strdup(photo_type4);
 -                                      }
 -                                      photo_prop->sizes[i].loc.dc = photo_loc_dc4;
 -                                      photo_prop->sizes[i].loc.local_id = photo_loc_id4;
 -                                      photo_prop->sizes[i].loc.secret = atoll(photo_loc_sec_str4);
 -                                      photo_prop->sizes[i].loc.volume = atoll(photo_loc_vol_str4);
 -
 -
 -                              } else {
 -
 -                              }
 -
 -                      }
 -                      photo_prop->to_peer_id = buddy_id;
 -                      tgl_do_load_photo(s_info.TLS, photo_prop ,&on_image_download_completed, photo_prop);
 +      }
  
 -              } else {
 +      if (media_type == tgl_message_media_photo) {
 +              struct tgl_photo *photo = media;
 +              tgl_do_load_photo(s_info.TLS, photo, &on_image_download_completed, photo);
 +              /**
 +               * @note
 +               * After this, what happens to "photo"?
 +               * Is it released automatically?
 +               */
 +      } else if (media_type == tgl_message_media_document) {
 +              /**
 +               * @todo
 +               * implements me
 +               */
 +      } else {
  
 -              }
        }
--#endif
  }
  
  void on_mark_read_callback(struct tgl_state *TLS, void *callback_extra, int success)