static int linphone_chat_room_get_messages_count(LinphoneChatRoom *cr, bool_t unread_only){ LinphoneCore *lc=linphone_chat_room_get_core(cr); int numrows=0; char *peer; char *buf; sqlite3_stmt *selectStatement; int returnValue; if (lc->db==NULL) return 0; // optimization: do not read database if the count is already available in memory if(unread_only && cr->unread_count >= 0) return cr->unread_count; peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr)); buf=sqlite3_mprintf("SELECT count(*) FROM history WHERE remoteContact = %Q %s;",peer,unread_only?"AND read = 0":""); returnValue = sqlite3_prepare_v2(lc->db,buf,-1,&selectStatement,NULL); if (returnValue == SQLITE_OK){ if(sqlite3_step(selectStatement) == SQLITE_ROW){ numrows= sqlite3_column_int(selectStatement, 0); } } sqlite3_finalize(selectStatement); sqlite3_free(buf); ms_free(peer); /* no need to test the sign of cr->unread_count here * because it has been tested above */ if(unread_only) cr->unread_count = numrows; return numrows; }
void linphone_chat_room_update_url(LinphoneChatRoom *cr, LinphoneChatMessage *msg) { LinphoneCore *lc=linphone_chat_room_get_core(cr); char *buf; if (lc->db==NULL) return ; buf=sqlite3_mprintf("UPDATE history SET url=%Q WHERE id=%i;",msg->external_body_url,msg->storage_id); linphone_sql_request(lc->db,buf); sqlite3_free(buf); }
MSList *linphone_chat_room_get_history_range(LinphoneChatRoom *cr, int startm, int endm){ LinphoneCore *lc=linphone_chat_room_get_core(cr); MSList *ret; char *buf,*buf2; char *peer; uint64_t begin,end; int buf_max_size = 512; if (lc->db==NULL) return NULL; peer = linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr)); cr->messages_hist = NULL; /*since we want to append query parameters depending on arguments given, we use malloc instead of sqlite3_mprintf*/ buf=ms_malloc(buf_max_size); buf=sqlite3_snprintf(buf_max_size-1,buf,"SELECT * FROM history WHERE remoteContact = %Q ORDER BY id DESC",peer); if (startm<0) startm=0; if ((endm>0&&endm>=startm) || (startm == 0 && endm == 0) ){ buf2=ms_strdup_printf("%s LIMIT %i ",buf,endm+1-startm); ms_free(buf); buf = buf2; }else if(startm>0){ ms_message("%s(): end is lower than start (%d < %d). Assuming no end limit.",__FUNCTION__,endm,startm); buf2=ms_strdup_printf("%s LIMIT -1",buf); ms_free(buf); buf = buf2; } if (startm>0){ buf2=ms_strdup_printf("%s OFFSET %i ",buf,startm); ms_free(buf); buf = buf2; } begin=ortp_get_cur_time_ms(); linphone_sql_request_message(lc->db,buf,cr); end=ortp_get_cur_time_ms(); if (endm+1-startm > 1) { //display message only if at least 2 messages are loaded ms_message("%s(): completed in %i ms",__FUNCTION__, (int)(end-begin)); } ms_free(buf); ret=cr->messages_hist; cr->messages_hist=NULL; ms_free(peer); return ret; }
/** * function invoked to report file transfer progress. * */ void file_transfer_progress_indication(LinphoneChatMessage *message, const LinphoneContent* content, size_t offset, size_t total) { LinphoneChatRoom *cr = linphone_chat_message_get_chat_room(message); LinphoneCore *lc = linphone_chat_room_get_core(cr); const LinphoneAddress* from_address = linphone_chat_message_get_from(message); const LinphoneAddress* to_address = linphone_chat_message_get_to(message); char *address = linphone_chat_message_is_outgoing(message)?linphone_address_as_string(to_address):linphone_address_as_string(from_address); stats* counters = get_stats(lc); int progress = (int)((offset * 100)/total); ms_message(" File transfer [%d%%] %s of type [%s/%s] %s [%s] \n", progress ,(linphone_chat_message_is_outgoing(message)?"sent":"received") , linphone_content_get_type(content) , linphone_content_get_subtype(content) ,(linphone_chat_message_is_outgoing(message)?"to":"from") , address); counters->progress_of_LinphoneFileTransfer = progress; free(address); }
static int linphone_chat_message_store_content(LinphoneChatMessage *msg) { LinphoneCore *lc = linphone_chat_room_get_core(msg->chat_room); int id = -1; if (lc->db) { LinphoneContent *content = msg->file_transfer_information; char *buf = sqlite3_mprintf("INSERT INTO content VALUES(NULL,%Q,%Q,%Q,%Q,%i,%Q);", linphone_content_get_type(content), linphone_content_get_subtype(content), linphone_content_get_name(content), linphone_content_get_encoding(content), linphone_content_get_size(content), NULL ); linphone_sql_request(lc->db, buf); sqlite3_free(buf); id = (unsigned int) sqlite3_last_insert_rowid (lc->db); } return id; }
void linphone_chat_room_mark_as_read(LinphoneChatRoom *cr){ LinphoneCore *lc=linphone_chat_room_get_core(cr); int read=1; char *peer; char *buf; if (lc->db==NULL) return ; // optimization: do not modify the database if no message is marked as unread if(linphone_chat_room_get_unread_messages_count(cr) == 0) return; peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr)); buf=sqlite3_mprintf("UPDATE history SET read=%i WHERE remoteContact = %Q;", read,peer); linphone_sql_request(lc->db,buf); sqlite3_free(buf); ms_free(peer); cr->unread_count = 0; }
void liblinphone_tester_chat_message_msg_state_changed(LinphoneChatMessage *msg, LinphoneChatMessageState state) { LinphoneChatRoom *cr = linphone_chat_message_get_chat_room(msg); LinphoneCore *lc = linphone_chat_room_get_core(cr); stats* counters = get_stats(lc); ms_message("Message [%s] [%s]",linphone_chat_message_get_text(msg), linphone_chat_message_state_to_string(state)); switch (state) { case LinphoneChatMessageStateDelivered: counters->number_of_LinphoneMessageDelivered++; break; case LinphoneChatMessageStateNotDelivered: counters->number_of_LinphoneMessageNotDelivered++; break; case LinphoneChatMessageStateInProgress: counters->number_of_LinphoneMessageInProgress++; break; case LinphoneChatMessageStateFileTransferError: counters->number_of_LinphoneMessageNotDelivered++; break; default: ms_error("Unexpected state [%s] for message [%p]",linphone_chat_message_state_to_string(state), msg); } }
unsigned int linphone_chat_message_store(LinphoneChatMessage *msg){ LinphoneCore *lc=linphone_chat_room_get_core(msg->chat_room); int id = 0; if (lc->db){ int content_id = -1; char *peer; char *local_contact; char *buf; if (msg->file_transfer_information) { content_id = linphone_chat_message_store_content(msg); } peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(msg->chat_room)); local_contact=linphone_address_as_string_uri_only(linphone_chat_message_get_local_address(msg)); buf = sqlite3_mprintf("INSERT INTO history VALUES(NULL,%Q,%Q,%i,%Q,%Q,%i,%i,%Q,%lld,%Q,%i);", local_contact, peer, msg->dir, msg->message, "-1", /* use UTC field now */ msg->is_read, msg->state, msg->external_body_url, (int64_t)msg->time, msg->appdata, content_id ); linphone_sql_request(lc->db,buf); sqlite3_free(buf); ms_free(local_contact); ms_free(peer); id = (unsigned int) sqlite3_last_insert_rowid (lc->db); } return id; }
/** * function invoked when a file transfer is received. * */ void file_transfer_received(LinphoneChatMessage *message, const LinphoneContent* content, const LinphoneBuffer *buffer){ FILE* file=NULL; char receive_file[256]; LinphoneChatRoom *cr = linphone_chat_message_get_chat_room(message); LinphoneCore *lc = linphone_chat_room_get_core(cr); snprintf(receive_file,sizeof(receive_file), "%s/receive_file.dump", liblinphone_tester_writable_dir_prefix); if (!linphone_chat_message_get_user_data(message)) { /*first chunk, creating file*/ file = fopen(receive_file,"wb"); linphone_chat_message_set_user_data(message,(void*)file); /*store fd for next chunks*/ } file = (FILE*)linphone_chat_message_get_user_data(message); if (linphone_buffer_is_empty(buffer)) { /* tranfer complete */ stats* counters = get_stats(lc); counters->number_of_LinphoneMessageExtBodyReceived++; fclose(file); } else { /* store content on a file*/ if (fwrite(linphone_buffer_get_content(buffer),linphone_buffer_get_size(buffer),1,file)==-1){ ms_error("file_transfer_received(): write() failed: %s",strerror(errno)); } } }