23 #include "mrmailbox_internal.h" 24 #include "mrapeerstate.h" 28 #include "mrmimefactory.h" 31 int mrchat_update_param__(
mrchat_t* ths)
34 sqlite3_stmt* stmt = mrsqlite3_prepare_v2_(ths->
m_mailbox->m_sql,
"UPDATE chats SET param=? WHERE id=?");
35 sqlite3_bind_text(stmt, 1, ths->
m_param->m_packed, -1, SQLITE_STATIC);
36 sqlite3_bind_int (stmt, 2, ths->m_id);
37 success = sqlite3_step(stmt)==SQLITE_DONE? 1 : 0;
38 sqlite3_finalize(stmt);
43 static int mrchat_set_from_stmt__(
mrchat_t* ths, sqlite3_stmt* row)
46 const char* draft_text;
48 if( ths == NULL || row == NULL ) {
54 #define MR_CHAT_FIELDS " c.id,c.type,c.name, c.draft_timestamp,c.draft_txt,c.grpid,c.param,c.archived " 55 ths->m_id = sqlite3_column_int (row, row_offset++);
56 ths->m_type = sqlite3_column_int (row, row_offset++);
57 ths->
m_name = safe_strdup((
char*)sqlite3_column_text (row, row_offset++));
59 draft_text = (
const char*)sqlite3_column_text (row, row_offset++);
60 ths->m_grpid = safe_strdup((
char*)sqlite3_column_text (row, row_offset++));
61 mrparam_set_packed(ths->
m_param, (
char*)sqlite3_column_text (row, row_offset++));
62 ths->
m_archived = sqlite3_column_int (row, row_offset++);
74 if( ths->m_id == MR_CHAT_ID_DEADDROP ) {
76 ths->
m_name = mrstock_str(MR_STR_DEADDROP);
78 else if( ths->m_id == MR_CHAT_ID_ARCHIVED_LINK ) {
80 char* tempname = mrstock_str(MR_STR_ARCHIVEDCHATS);
81 ths->
m_name = mr_mprintf(
"%s (%i)", tempname, mrmailbox_get_archived_count__(ths->
m_mailbox));
84 else if( ths->m_id == MR_CHAT_ID_STARRED ) {
86 ths->
m_name = mrstock_str(MR_STR_STARREDMSGS);
100 int mrchat_load_from_db__(
mrchat_t* ths, uint32_t
id)
110 stmt = mrsqlite3_predefine__(ths->
m_mailbox->m_sql, SELECT_itndd_FROM_chats_WHERE_i,
111 "SELECT " MR_CHAT_FIELDS
" FROM chats c WHERE c.id=?;");
112 sqlite3_bind_int(stmt, 1,
id);
114 if( sqlite3_step(stmt) != SQLITE_ROW ) {
118 if( !mrchat_set_from_stmt__(ths, stmt) ) {
139 if( mailbox == NULL || (ths=calloc(1,
sizeof(
mrchat_t)))==NULL ) {
144 ths->m_type = MR_CHAT_TYPE_UNDEFINED;
195 ths->m_type = MR_CHAT_TYPE_UNDEFINED;
201 mrparam_set_packed(ths->
m_param, NULL);
222 return safe_strdup(
"Err");
225 if( chat->m_type == MR_CHAT_TYPE_NORMAL )
230 stmt = mrsqlite3_predefine__(chat->
m_mailbox->m_sql, SELECT_a_FROM_chats_contacts_WHERE_i,
231 "SELECT c.addr FROM chats_contacts cc " 232 " LEFT JOIN contacts c ON c.id=cc.contact_id " 233 " WHERE cc.chat_id=?;");
234 sqlite3_bind_int(stmt, 1, chat->m_id);
236 r = sqlite3_step(stmt);
237 if( r == SQLITE_ROW ) {
238 ret = safe_strdup((
const char*)sqlite3_column_text(stmt, 0));
241 mrsqlite3_unlock(chat->
m_mailbox->m_sql);
243 else if( chat->m_type == MR_CHAT_TYPE_GROUP )
246 if( chat->m_id == MR_CHAT_ID_DEADDROP )
250 stmt = mrsqlite3_predefine__(chat->
m_mailbox->m_sql, SELECT_COUNT_DISTINCT_f_FROM_msgs_WHERE_c,
251 "SELECT COUNT(DISTINCT from_id) FROM msgs WHERE chat_id=?;");
252 sqlite3_bind_int(stmt, 1, chat->m_id);
253 if( sqlite3_step(stmt) == SQLITE_ROW ) {
254 cnt = sqlite3_column_int(stmt, 0);
255 ret = mrstock_str_repl_pl(MR_STR_CONTACT, cnt);
258 mrsqlite3_unlock(chat->
m_mailbox->m_sql);
264 cnt = mrmailbox_get_chat_contact_count__(chat->
m_mailbox, chat->m_id);
265 ret = mrstock_str_repl_pl(MR_STR_MEMBER, cnt );
267 mrsqlite3_unlock(chat->
m_mailbox->m_sql);
271 return ret? ret : safe_strdup(
"Err");
An object representing a single mailbox.
void mrchat_unref(mrchat_t *chat)
Free a chat object.
void mrparam_unref(mrparam_t *param)
Free an parameter list object created eg.
char * m_draft_text
NULL if unset.
mrmailbox_t * m_mailbox
!= NULL
mrparam_t * m_param
!= NULL
mrparam_t * mrparam_new()
Create new parameter list object.
int m_archived
1=chat archived, this state should always be shown the UI, eg.
char * m_name
NULL if unset.
void mrchat_empty(mrchat_t *ths)
Empty a chat object.
time_t m_draft_timestamp
0 if there is no draft
An object representing a single chat in memory.
char * mrchat_get_subtitle(mrchat_t *chat)
Get a subtitle for a chat.