mirror of
https://github.com/chatmail/core.git
synced 2026-04-23 08:26:30 +03:00
it compiles
This commit is contained in:
@@ -103,7 +103,8 @@ pub unsafe fn dc_apeerstate_recalc_fingerprint(mut peerstate: *mut dc_apeerstate
|
||||
if !peerstate.is_null() {
|
||||
if !(*peerstate).public_key.is_null() {
|
||||
old_public_fingerprint = (*peerstate).public_key_fingerprint;
|
||||
(*peerstate).public_key_fingerprint = dc_key_get_fingerprint((*peerstate).public_key);
|
||||
(*peerstate).public_key_fingerprint =
|
||||
dc_key_get_fingerprint((*peerstate).context, (*peerstate).public_key);
|
||||
if old_public_fingerprint.is_null()
|
||||
|| *old_public_fingerprint.offset(0isize) as libc::c_int == 0i32
|
||||
|| (*peerstate).public_key_fingerprint.is_null()
|
||||
@@ -120,7 +121,8 @@ pub unsafe fn dc_apeerstate_recalc_fingerprint(mut peerstate: *mut dc_apeerstate
|
||||
}
|
||||
if !(*peerstate).gossip_key.is_null() {
|
||||
old_gossip_fingerprint = (*peerstate).gossip_key_fingerprint;
|
||||
(*peerstate).gossip_key_fingerprint = dc_key_get_fingerprint((*peerstate).gossip_key);
|
||||
(*peerstate).gossip_key_fingerprint =
|
||||
dc_key_get_fingerprint((*peerstate).context, (*peerstate).gossip_key);
|
||||
if old_gossip_fingerprint.is_null()
|
||||
|| *old_gossip_fingerprint.offset(0isize) as libc::c_int == 0i32
|
||||
|| (*peerstate).gossip_key_fingerprint.is_null()
|
||||
@@ -320,7 +322,9 @@ pub unsafe fn dc_apeerstate_load_by_addr(
|
||||
if !(peerstate.is_null() || addr.is_null()) {
|
||||
dc_apeerstate_empty(peerstate);
|
||||
stmt =
|
||||
dc_sqlite3_prepare(sql,
|
||||
dc_sqlite3_prepare(
|
||||
(*peerstate).context,
|
||||
sql,
|
||||
b"SELECT addr, last_seen, last_seen_autocrypt, prefer_encrypted, public_key, gossip_timestamp, gossip_key, public_key_fingerprint, gossip_key_fingerprint, verified_key, verified_key_fingerprint FROM acpeerstates WHERE addr=? COLLATE NOCASE;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_text(stmt, 1i32, addr, -1i32, None);
|
||||
@@ -370,8 +374,10 @@ pub unsafe fn dc_apeerstate_load_by_fingerprint(
|
||||
if !(peerstate.is_null() || fingerprint.is_null()) {
|
||||
dc_apeerstate_empty(peerstate);
|
||||
stmt =
|
||||
dc_sqlite3_prepare(sql,
|
||||
b"SELECT addr, last_seen, last_seen_autocrypt, prefer_encrypted, public_key, gossip_timestamp, gossip_key, public_key_fingerprint, gossip_key_fingerprint, verified_key, verified_key_fingerprint FROM acpeerstates WHERE public_key_fingerprint=? COLLATE NOCASE OR gossip_key_fingerprint=? COLLATE NOCASE ORDER BY public_key_fingerprint=? DESC;\x00"
|
||||
dc_sqlite3_prepare(
|
||||
(*peerstate).context,
|
||||
sql,
|
||||
b"SELECT addr, last_seen, last_seen_autocrypt, prefer_encrypted, public_key, gossip_timestamp, gossip_key, public_key_fingerprint, gossip_key_fingerprint, verified_key, verified_key_fingerprint FROM acpeerstates WHERE public_key_fingerprint=? COLLATE NOCASE OR gossip_key_fingerprint=? COLLATE NOCASE ORDER BY public_key_fingerprint=? DESC;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_text(stmt, 1i32, fingerprint, -1i32, None);
|
||||
sqlite3_bind_text(stmt, 2i32, fingerprint, -1i32, None);
|
||||
@@ -397,6 +403,7 @@ pub unsafe fn dc_apeerstate_save_to_db(
|
||||
}
|
||||
if 0 != create {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*peerstate).context,
|
||||
sql,
|
||||
b"INSERT INTO acpeerstates (addr) VALUES(?);\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -407,7 +414,8 @@ pub unsafe fn dc_apeerstate_save_to_db(
|
||||
}
|
||||
if 0 != (*peerstate).to_save & 0x2i32 || 0 != create {
|
||||
stmt =
|
||||
dc_sqlite3_prepare(sql,
|
||||
dc_sqlite3_prepare(
|
||||
(*peerstate).context,sql,
|
||||
b"UPDATE acpeerstates SET last_seen=?, last_seen_autocrypt=?, prefer_encrypted=?, public_key=?, gossip_timestamp=?, gossip_key=?, public_key_fingerprint=?, gossip_key_fingerprint=?, verified_key=?, verified_key_fingerprint=? WHERE addr=?;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int64(stmt, 1i32, (*peerstate).last_seen as sqlite3_int64);
|
||||
@@ -482,7 +490,8 @@ pub unsafe fn dc_apeerstate_save_to_db(
|
||||
}
|
||||
} else if 0 != (*peerstate).to_save & 0x1i32 {
|
||||
stmt =
|
||||
dc_sqlite3_prepare(sql,
|
||||
dc_sqlite3_prepare(
|
||||
(*peerstate).context,sql,
|
||||
b"UPDATE acpeerstates SET last_seen=?, last_seen_autocrypt=?, gossip_timestamp=? WHERE addr=?;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int64(stmt, 1i32, (*peerstate).last_seen as sqlite3_int64);
|
||||
|
||||
111
src/dc_chat.rs
111
src/dc_chat.rs
@@ -123,6 +123,7 @@ pub unsafe fn dc_block_chat(
|
||||
) {
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"UPDATE chats SET blocked=? WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -138,6 +139,7 @@ pub unsafe fn dc_chat_load_from_db(mut chat: *mut dc_chat_t, mut chat_id: uint32
|
||||
dc_chat_empty(chat);
|
||||
stmt =
|
||||
dc_sqlite3_prepare(
|
||||
(*chat).context,
|
||||
&mut (*chat).context.sql.lock().unwrap(),
|
||||
b"SELECT c.id,c.type,c.name, c.grpid,c.param,c.archived, c.blocked, c.gossiped_timestamp, c.locations_send_until FROM chats c WHERE c.id=?;\x00"
|
||||
as *const u8 as *const libc::c_char
|
||||
@@ -325,10 +327,11 @@ pub unsafe fn dc_create_or_lookup_nchat_by_contact_id(
|
||||
);
|
||||
} else {
|
||||
};
|
||||
stmt = dc_sqlite3_prepare(&mut context.sql.lock().unwrap(), q);
|
||||
stmt = dc_sqlite3_prepare(context, &mut context.sql.lock().unwrap(), q);
|
||||
if !stmt.is_null() {
|
||||
if !(sqlite3_step(stmt) != 101i32) {
|
||||
chat_id = dc_sqlite3_get_rowid(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"chats\x00" as *const u8 as *const libc::c_char,
|
||||
b"grpid\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -344,7 +347,7 @@ pub unsafe fn dc_create_or_lookup_nchat_by_contact_id(
|
||||
chat_id,
|
||||
contact_id,
|
||||
);
|
||||
stmt = dc_sqlite3_prepare(&mut context.sql.lock().unwrap(), q);
|
||||
stmt = dc_sqlite3_prepare(context, &mut context.sql.lock().unwrap(), q);
|
||||
if !(sqlite3_step(stmt) != 101i32) {
|
||||
sqlite3_free(q as *mut libc::c_void);
|
||||
q = 0 as *mut libc::c_char;
|
||||
@@ -383,6 +386,7 @@ pub unsafe fn dc_lookup_real_nchat_by_contact_id(
|
||||
}
|
||||
stmt =
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"SELECT c.id, c.blocked FROM chats c INNER JOIN chats_contacts j ON c.id=j.chat_id WHERE c.type=100 AND c.id>9 AND j.contact_id=?;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
@@ -565,6 +569,7 @@ unsafe fn prepare_msg_raw(
|
||||
);
|
||||
} else {
|
||||
let mut from: *mut libc::c_char = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
@@ -587,6 +592,7 @@ unsafe fn prepare_msg_raw(
|
||||
free(from as *mut libc::c_void);
|
||||
if (*chat).type_0 == 100i32 {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"SELECT contact_id FROM chats_contacts WHERE chat_id=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -625,6 +631,7 @@ unsafe fn prepare_msg_raw(
|
||||
we do not send the message out at all */
|
||||
do_guarantee_e2ee = 0i32;
|
||||
e2ee_enabled = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"e2ee_enabled\x00" as *const u8 as *const libc::c_char,
|
||||
1i32,
|
||||
@@ -634,7 +641,7 @@ unsafe fn prepare_msg_raw(
|
||||
let mut can_encrypt: libc::c_int = 1i32;
|
||||
let mut all_mutual: libc::c_int = 1i32;
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.lock().unwrap(),
|
||||
dc_sqlite3_prepare(context, &mut context.sql.lock().unwrap(),
|
||||
b"SELECT ps.prefer_encrypted, c.addr FROM chats_contacts cc LEFT JOIN contacts c ON cc.contact_id=c.id LEFT JOIN acpeerstates ps ON c.addr=ps.addr WHERE cc.chat_id=? AND cc.contact_id>9;\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
@@ -677,6 +684,7 @@ unsafe fn prepare_msg_raw(
|
||||
do_guarantee_e2ee = 1i32
|
||||
} else if 0
|
||||
!= last_msg_in_chat_encrypted(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
(*chat).id,
|
||||
)
|
||||
@@ -744,6 +752,7 @@ unsafe fn prepare_msg_raw(
|
||||
|
||||
if 0 != dc_param_exists((*msg).param, DC_PARAM_SET_LATITUDE as libc::c_int) {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"INSERT INTO locations \
|
||||
(timestamp,from_id,chat_id, latitude,longitude,independent)\
|
||||
@@ -776,6 +785,7 @@ unsafe fn prepare_msg_raw(
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
|
||||
location_id = dc_sqlite3_get_rowid2(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"locations\x00" as *const u8 as *const libc::c_char,
|
||||
b"timestamp\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -788,7 +798,8 @@ unsafe fn prepare_msg_raw(
|
||||
// add message to the database
|
||||
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
context,&mut context.sql.lock().unwrap(),
|
||||
b"INSERT INTO msgs (rfc724_mid, chat_id, from_id, to_id, timestamp, type, state, txt, param, hidden, mime_in_reply_to, mime_references, location_id) VALUES (?,?,?,?,?, ?,?,?,?,?, ?,?,?);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
@@ -825,6 +836,7 @@ unsafe fn prepare_msg_raw(
|
||||
);
|
||||
} else {
|
||||
msg_id = dc_sqlite3_get_rowid(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"msgs\x00" as *const u8 as *const libc::c_char,
|
||||
b"rfc724_mid\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -858,7 +870,8 @@ unsafe fn get_parent_mime_headers(
|
||||
|| parent_references.is_null())
|
||||
{
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut (*chat).context.sql.lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
(*chat).context,&mut (*chat).context.sql.lock().unwrap(),
|
||||
b"SELECT rfc724_mid, mime_in_reply_to, mime_references FROM msgs WHERE timestamp=(SELECT max(timestamp) FROM msgs WHERE chat_id=? AND from_id!=?);\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int(stmt, 1i32, (*chat).id as libc::c_int);
|
||||
@@ -873,7 +886,8 @@ unsafe fn get_parent_mime_headers(
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
if 0 == success {
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut (*chat).context.sql.lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
(*chat).context,&mut (*chat).context.sql.lock().unwrap(),
|
||||
b"SELECT rfc724_mid, mime_in_reply_to, mime_references FROM msgs WHERE timestamp=(SELECT min(timestamp) FROM msgs WHERE chat_id=? AND from_id==?);\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int(stmt, 1i32, (*chat).id as libc::c_int);
|
||||
@@ -902,12 +916,14 @@ pub unsafe fn dc_chat_is_self_talk(mut chat: *const dc_chat_t) -> libc::c_int {
|
||||
* Sending messages
|
||||
******************************************************************************/
|
||||
unsafe fn last_msg_in_chat_encrypted(
|
||||
mut sql: &mut dc_sqlite3_t,
|
||||
mut chat_id: uint32_t,
|
||||
context: &dc_context_t,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
chat_id: uint32_t,
|
||||
) -> libc::c_int {
|
||||
let mut last_is_encrypted: libc::c_int = 0i32;
|
||||
let mut stmt: *mut sqlite3_stmt =
|
||||
dc_sqlite3_prepare(sql,
|
||||
dc_sqlite3_prepare(
|
||||
context,sql,
|
||||
b"SELECT param FROM msgs WHERE timestamp=(SELECT MAX(timestamp) FROM msgs WHERE chat_id=?) ORDER BY id DESC;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int);
|
||||
@@ -928,6 +944,7 @@ unsafe fn last_msg_in_chat_encrypted(
|
||||
pub unsafe fn dc_chat_update_param(mut chat: *mut dc_chat_t) -> libc::c_int {
|
||||
let mut success: libc::c_int = 0i32;
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
(*chat).context,
|
||||
&mut (*chat).context.sql.lock().unwrap(),
|
||||
b"UPDATE chats SET param=? WHERE id=?\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -952,6 +969,7 @@ pub unsafe fn dc_is_contact_in_chat(
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"SELECT contact_id FROM chats_contacts WHERE chat_id=? AND contact_id=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -970,6 +988,7 @@ pub unsafe fn dc_is_contact_in_chat(
|
||||
|
||||
pub unsafe fn dc_unarchive_chat(mut context: &dc_context_t, mut chat_id: uint32_t) {
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"UPDATE chats SET archived=0 WHERE id=?\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1116,7 +1135,8 @@ unsafe fn set_draft_raw(
|
||||
14513523936503887211 => {}
|
||||
_ => {
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
context,&mut context.sql.lock().unwrap(),
|
||||
b"INSERT INTO msgs (chat_id, from_id, timestamp, type, state, txt, param, hidden) VALUES (?,?,?, ?,?,?,?,?);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
@@ -1151,6 +1171,7 @@ unsafe fn set_draft_raw(
|
||||
unsafe fn get_draft_msg_id(mut context: &dc_context_t, mut chat_id: uint32_t) -> uint32_t {
|
||||
let mut draft_msg_id: uint32_t = 0i32 as uint32_t;
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"SELECT id FROM msgs WHERE chat_id=? AND state=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1197,23 +1218,27 @@ pub unsafe fn dc_get_chat_msgs(
|
||||
if !ret.is_null() {
|
||||
if chat_id == 1i32 as libc::c_uint {
|
||||
let mut show_emails: libc::c_int = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"show_emails\x00" as *const u8 as *const libc::c_char,
|
||||
0i32,
|
||||
);
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
context,&mut context.sql.lock().unwrap(),
|
||||
b"SELECT m.id, m.timestamp FROM msgs m LEFT JOIN chats ON m.chat_id=chats.id LEFT JOIN contacts ON m.from_id=contacts.id WHERE m.from_id!=1 AND m.from_id!=2 AND m.hidden=0 AND chats.blocked=2 AND contacts.blocked=0 AND m.msgrmsg>=? ORDER BY m.timestamp,m.id;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int(stmt, 1i32, if show_emails == 2i32 { 0i32 } else { 1i32 });
|
||||
} else if chat_id == 5i32 as libc::c_uint {
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
context,&mut context.sql.lock().unwrap(),
|
||||
b"SELECT m.id, m.timestamp FROM msgs m LEFT JOIN contacts ct ON m.from_id=ct.id WHERE m.starred=1 AND m.hidden=0 AND ct.blocked=0 ORDER BY m.timestamp,m.id;\x00"
|
||||
as *const u8 as *const libc::c_char)
|
||||
} else {
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
context,&mut context.sql.lock().unwrap(),
|
||||
b"SELECT m.id, m.timestamp FROM msgs m WHERE m.chat_id=? AND m.hidden=0 ORDER BY m.timestamp,m.id;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int);
|
||||
@@ -1249,6 +1274,7 @@ pub unsafe fn dc_get_msg_cnt(mut context: &dc_context_t, mut chat_id: uint32_t)
|
||||
let mut ret: libc::c_int = 0i32;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"SELECT COUNT(*) FROM msgs WHERE chat_id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1267,6 +1293,7 @@ pub unsafe fn dc_get_fresh_msg_cnt(
|
||||
let mut ret: libc::c_int = 0i32;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"SELECT COUNT(*) FROM msgs WHERE state=10 AND hidden=0 AND chat_id=?;\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
@@ -1283,6 +1310,7 @@ pub unsafe fn dc_marknoticed_chat(mut context: &dc_context_t, mut chat_id: uint3
|
||||
let mut update: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
|
||||
check = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"SELECT id FROM msgs WHERE chat_id=? AND state=10;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -1290,6 +1318,7 @@ pub unsafe fn dc_marknoticed_chat(mut context: &dc_context_t, mut chat_id: uint3
|
||||
sqlite3_bind_int(check, 1i32, chat_id as libc::c_int);
|
||||
if !(sqlite3_step(check) != 100i32) {
|
||||
update = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"UPDATE msgs SET state=13 WHERE chat_id=? AND state=10;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -1312,11 +1341,13 @@ pub unsafe fn dc_marknoticed_all_chats(mut context: &dc_context_t) {
|
||||
let mut update: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
|
||||
check = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"SELECT id FROM msgs WHERE state=10;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
if !(sqlite3_step(check) != 100i32) {
|
||||
update = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"UPDATE msgs SET state=13 WHERE state=10;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1341,7 +1372,8 @@ pub unsafe fn dc_get_chat_media(
|
||||
) -> *mut dc_array_t {
|
||||
let mut ret: *mut dc_array_t = dc_array_new(100i32 as size_t);
|
||||
let mut stmt: *mut sqlite3_stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
context,&mut context.sql.lock().unwrap(),
|
||||
b"SELECT id FROM msgs WHERE chat_id=? AND (type=? OR type=? OR type=?) ORDER BY timestamp, id;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int);
|
||||
@@ -1432,6 +1464,7 @@ pub unsafe fn dc_archive_chat(
|
||||
}
|
||||
if 0 != archive {
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"UPDATE msgs SET state=13 WHERE chat_id=? AND state=10;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -1441,6 +1474,7 @@ pub unsafe fn dc_archive_chat(
|
||||
sqlite3_finalize(stmt);
|
||||
}
|
||||
let mut stmt_0: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"UPDATE chats SET archived=? WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1457,25 +1491,23 @@ pub unsafe fn dc_archive_chat(
|
||||
}
|
||||
pub unsafe fn dc_delete_chat(mut context: &dc_context_t, mut chat_id: uint32_t) {
|
||||
/* Up to 2017-11-02 deleting a group also implied leaving it, see above why we have changed this. */
|
||||
let mut pending_transaction: libc::c_int = 0i32;
|
||||
let mut obj: *mut dc_chat_t = dc_chat_new(context);
|
||||
let mut q3: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
if !(chat_id <= 9i32 as libc::c_uint) {
|
||||
if !(0 == dc_chat_load_from_db(obj, chat_id)) {
|
||||
pending_transaction = 1i32;
|
||||
q3 = sqlite3_mprintf(
|
||||
b"DELETE FROM msgs_mdns WHERE msg_id IN (SELECT id FROM msgs WHERE chat_id=%i);\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
chat_id,
|
||||
);
|
||||
if !(0 == dc_sqlite3_execute(&mut context.sql.lock().unwrap(), q3)) {
|
||||
if !(0 == dc_sqlite3_execute(context, &mut context.sql.lock().unwrap(), q3)) {
|
||||
sqlite3_free(q3 as *mut libc::c_void);
|
||||
q3 = 0 as *mut libc::c_char;
|
||||
q3 = sqlite3_mprintf(
|
||||
b"DELETE FROM msgs WHERE chat_id=%i;\x00" as *const u8 as *const libc::c_char,
|
||||
chat_id,
|
||||
);
|
||||
if !(0 == dc_sqlite3_execute(&mut context.sql.lock().unwrap(), q3)) {
|
||||
if !(0 == dc_sqlite3_execute(context, &mut context.sql.lock().unwrap(), q3)) {
|
||||
sqlite3_free(q3 as *mut libc::c_void);
|
||||
q3 = 0 as *mut libc::c_char;
|
||||
q3 = sqlite3_mprintf(
|
||||
@@ -1483,7 +1515,7 @@ pub unsafe fn dc_delete_chat(mut context: &dc_context_t, mut chat_id: uint32_t)
|
||||
as *const libc::c_char,
|
||||
chat_id,
|
||||
);
|
||||
if !(0 == dc_sqlite3_execute(&mut context.sql.lock().unwrap(), q3)) {
|
||||
if !(0 == dc_sqlite3_execute(context, &mut context.sql.lock().unwrap(), q3)) {
|
||||
sqlite3_free(q3 as *mut libc::c_void);
|
||||
q3 = 0 as *mut libc::c_char;
|
||||
q3 = sqlite3_mprintf(
|
||||
@@ -1491,10 +1523,10 @@ pub unsafe fn dc_delete_chat(mut context: &dc_context_t, mut chat_id: uint32_t)
|
||||
as *const libc::c_char,
|
||||
chat_id,
|
||||
);
|
||||
if !(0 == dc_sqlite3_execute(&mut context.sql.lock().unwrap(), q3)) {
|
||||
if !(0 == dc_sqlite3_execute(context, &mut context.sql.lock().unwrap(), q3))
|
||||
{
|
||||
sqlite3_free(q3 as *mut libc::c_void);
|
||||
q3 = 0 as *mut libc::c_char;
|
||||
pending_transaction = 0i32;
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::MSGS_CHANGED,
|
||||
@@ -1524,7 +1556,8 @@ pub unsafe fn dc_get_chat_contacts(
|
||||
if !(chat_id == 1i32 as libc::c_uint) {
|
||||
/* we could also create a list for all contacts in the deaddrop by searching contacts belonging to chats with chats.blocked=2, however, currently this is not needed */
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
context,&mut context.sql.lock().unwrap(),
|
||||
b"SELECT cc.contact_id FROM chats_contacts cc LEFT JOIN contacts c ON c.id=cc.contact_id WHERE cc.chat_id=? ORDER BY c.id=1, LOWER(c.name||c.addr), c.id;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int);
|
||||
@@ -1568,6 +1601,7 @@ pub unsafe fn dc_create_group_chat(
|
||||
draft_txt = dc_stock_str_repl_string(context, 14i32, chat_name);
|
||||
grpid = dc_create_id();
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"INSERT INTO chats (type, name, grpid, param) VALUES(?, ?, ?, \'U=1\');\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -1577,6 +1611,7 @@ pub unsafe fn dc_create_group_chat(
|
||||
sqlite3_bind_text(stmt, 3i32, grpid, -1i32, None);
|
||||
if !(sqlite3_step(stmt) != 101i32) {
|
||||
chat_id = dc_sqlite3_get_rowid(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"chats\x00" as *const u8 as *const libc::c_char,
|
||||
b"grpid\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -1614,6 +1649,7 @@ pub unsafe fn dc_add_to_chat_contacts_table(
|
||||
/* add a contact to a chat; the function does not check the type or if any of the record exist or are already added to the chat! */
|
||||
let mut ret: libc::c_int = 0i32;
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"INSERT INTO chats_contacts (chat_id, contact_id) VALUES(?, ?)\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -1671,6 +1707,7 @@ pub unsafe fn dc_add_contact_to_chat_ex(
|
||||
dc_chat_update_param(chat);
|
||||
}
|
||||
self_addr = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
b"\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -1762,6 +1799,7 @@ unsafe fn real_group_exists(mut context: &dc_context_t, mut chat_id: uint32_t) -
|
||||
return 0i32;
|
||||
}
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"SELECT id FROM chats WHERE id=? AND (type=120 OR type=130);\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -1791,6 +1829,7 @@ pub unsafe fn dc_set_gossiped_timestamp(
|
||||
timestamp as libc::c_int,
|
||||
);
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"UPDATE chats SET gossiped_timestamp=? WHERE id=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -1805,6 +1844,7 @@ pub unsafe fn dc_set_gossiped_timestamp(
|
||||
timestamp as libc::c_int,
|
||||
);
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"UPDATE chats SET gossiped_timestamp=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1879,7 +1919,7 @@ pub unsafe fn dc_remove_contact_from_chat(
|
||||
chat_id,
|
||||
contact_id,
|
||||
);
|
||||
if !(0 == dc_sqlite3_execute(&mut context.sql.lock().unwrap(), q3)) {
|
||||
if !(0 == dc_sqlite3_execute(context, &mut context.sql.lock().unwrap(), q3)) {
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::CHAT_MODIFIED,
|
||||
@@ -1903,6 +1943,7 @@ pub unsafe fn dc_set_group_explicitly_left(
|
||||
) {
|
||||
if 0 == dc_is_group_explicitly_left(context, grpid) {
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"INSERT INTO leftgrps (grpid) VALUES(?);\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1916,6 +1957,7 @@ pub unsafe fn dc_is_group_explicitly_left(
|
||||
mut grpid: *const libc::c_char,
|
||||
) -> libc::c_int {
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"SELECT id FROM leftgrps WHERE grpid=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1959,7 +2001,7 @@ pub unsafe fn dc_set_chat_name(
|
||||
new_name,
|
||||
chat_id,
|
||||
);
|
||||
if !(0 == dc_sqlite3_execute(&mut context.sql.lock().unwrap(), q3)) {
|
||||
if !(0 == dc_sqlite3_execute(context, &mut context.sql.lock().unwrap(), q3)) {
|
||||
if dc_param_get_int((*chat).param, 'U' as i32, 0i32) == 0i32 {
|
||||
(*msg).type_0 = 10i32;
|
||||
(*msg).text = dc_stock_system_msg(
|
||||
@@ -2081,11 +2123,9 @@ pub unsafe fn dc_forward_msgs(
|
||||
mut msg_cnt: libc::c_int,
|
||||
mut chat_id: uint32_t,
|
||||
) {
|
||||
let mut current_block: u64;
|
||||
let mut msg: *mut dc_msg_t = dc_msg_new_untyped(context);
|
||||
let mut chat: *mut dc_chat_t = dc_chat_new(context);
|
||||
let mut contact: *mut dc_contact_t = dc_contact_new(context);
|
||||
let mut transaction_pending: libc::c_int = 0i32;
|
||||
let mut created_db_entries: *mut carray = carray_new(16i32 as libc::c_uint);
|
||||
let mut idsstr: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut q3: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
@@ -2093,7 +2133,6 @@ pub unsafe fn dc_forward_msgs(
|
||||
let mut curr_timestamp: time_t = 0i32 as time_t;
|
||||
let mut original_param: *mut dc_param_t = dc_param_new();
|
||||
if !(msg_ids.is_null() || msg_cnt <= 0i32 || chat_id <= 9i32 as libc::c_uint) {
|
||||
transaction_pending = 1i32;
|
||||
dc_unarchive_chat(context, chat_id);
|
||||
context.smtp.lock().unwrap().log_connect_errors = 1i32;
|
||||
if !(0 == dc_chat_load_from_db(chat, chat_id)) {
|
||||
@@ -2104,15 +2143,13 @@ pub unsafe fn dc_forward_msgs(
|
||||
as *const libc::c_char,
|
||||
idsstr,
|
||||
);
|
||||
stmt = dc_sqlite3_prepare(&mut context.sql.lock().unwrap(), q3);
|
||||
stmt = dc_sqlite3_prepare(context, &mut context.sql.lock().unwrap(), q3);
|
||||
loop {
|
||||
if !(sqlite3_step(stmt) == 100i32) {
|
||||
current_block = 10758786907990354186;
|
||||
break;
|
||||
}
|
||||
let mut src_msg_id: libc::c_int = sqlite3_column_int(stmt, 0i32);
|
||||
if 0 == dc_msg_load_from_db(msg, context, src_msg_id as uint32_t) {
|
||||
current_block = 2015322633586469911;
|
||||
break;
|
||||
}
|
||||
dc_param_set_packed(original_param, (*(*msg).param).packed);
|
||||
@@ -2163,10 +2200,6 @@ pub unsafe fn dc_forward_msgs(
|
||||
0 as *mut libc::c_uint,
|
||||
);
|
||||
}
|
||||
match current_block {
|
||||
2015322633586469911 => {}
|
||||
_ => transaction_pending = 0i32,
|
||||
}
|
||||
}
|
||||
}
|
||||
if !created_db_entries.is_null() {
|
||||
@@ -2220,7 +2253,8 @@ pub unsafe extern "C" fn dc_chat_get_subtitle(mut chat: *const dc_chat_t) -> *mu
|
||||
} else if (*chat).type_0 == 100i32 {
|
||||
let mut r: libc::c_int = 0;
|
||||
let mut stmt: *mut sqlite3_stmt =
|
||||
dc_sqlite3_prepare(&mut (*chat).context.sql.lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
(*chat).context,&mut (*chat).context.sql.lock().unwrap(),
|
||||
b"SELECT c.addr FROM chats_contacts cc LEFT JOIN contacts c ON c.id=cc.contact_id WHERE cc.chat_id=?;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int(stmt, 1i32, (*chat).id as libc::c_int);
|
||||
@@ -2250,6 +2284,7 @@ pub unsafe fn dc_get_chat_contact_cnt(
|
||||
) -> libc::c_int {
|
||||
let mut ret: libc::c_int = 0i32;
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"SELECT COUNT(*) FROM chats_contacts WHERE chat_id=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -2338,6 +2373,7 @@ pub unsafe fn dc_get_chat_cnt(mut context: &dc_context_t) -> size_t {
|
||||
if !(*context.sql.lock().unwrap()).cobj.is_null() {
|
||||
/* no database, no chats - this is no error (needed eg. for information) */
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"SELECT COUNT(*) FROM chats WHERE id>9 AND blocked=0;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -2365,6 +2401,7 @@ pub unsafe fn dc_get_chat_id_by_grpid(
|
||||
}
|
||||
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"SELECT id, blocked, type FROM chats WHERE grpid=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -2396,7 +2433,8 @@ pub unsafe fn dc_add_device_msg(
|
||||
);
|
||||
if !text.is_null() {
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
context,&mut context.sql.lock().unwrap(),
|
||||
b"INSERT INTO msgs (chat_id,from_id,to_id, timestamp,type,state, txt,rfc724_mid) VALUES (?,?,?, ?,?,?, ?,?);\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int);
|
||||
@@ -2413,6 +2451,7 @@ pub unsafe fn dc_add_device_msg(
|
||||
sqlite3_bind_text(stmt, 8i32, rfc724_mid, -1i32, None);
|
||||
if !(sqlite3_step(stmt) != 101i32) {
|
||||
msg_id = dc_sqlite3_get_rowid(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"msgs\x00" as *const u8 as *const libc::c_char,
|
||||
b"rfc724_mid\x00" as *const u8 as *const libc::c_char,
|
||||
|
||||
@@ -143,15 +143,20 @@ unsafe fn dc_chatlist_load_from_db(
|
||||
// shown at all permanent in the chatlist.
|
||||
if 0 != query_contact_id {
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut (*chatlist).context.sql.lock().unwrap(),
|
||||
b"SELECT c.id, m.id FROM chats c LEFT JOIN msgs m ON c.id=m.chat_id AND m.timestamp=( SELECT MAX(timestamp) FROM msgs WHERE chat_id=c.id AND (hidden=0 OR (hidden=1 AND state=19))) WHERE c.id>9 AND c.blocked=0 AND c.id IN(SELECT chat_id FROM chats_contacts WHERE contact_id=?) GROUP BY c.id ORDER BY IFNULL(m.timestamp,0) DESC, m.id DESC;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
dc_sqlite3_prepare(
|
||||
(*chatlist).context,
|
||||
&mut (*chatlist).context.sql.lock().unwrap(),
|
||||
b"SELECT c.id, m.id FROM chats c LEFT JOIN msgs m ON c.id=m.chat_id AND m.timestamp=( SELECT MAX(timestamp) FROM msgs WHERE chat_id=c.id AND (hidden=0 OR (hidden=1 AND state=19))) WHERE c.id>9 AND c.blocked=0 AND c.id IN(SELECT chat_id FROM chats_contacts WHERE contact_id=?) GROUP BY c.id ORDER BY IFNULL(m.timestamp,0) DESC, m.id DESC;\x00"
|
||||
as *const u8 as *const libc::c_char
|
||||
);
|
||||
sqlite3_bind_int(stmt, 1i32, query_contact_id as libc::c_int);
|
||||
current_block = 3437258052017859086;
|
||||
} else if 0 != listflags & 0x1i32 {
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut (*chatlist).context.sql.lock().unwrap(),
|
||||
b"SELECT c.id, m.id FROM chats c LEFT JOIN msgs m ON c.id=m.chat_id AND m.timestamp=( SELECT MAX(timestamp) FROM msgs WHERE chat_id=c.id AND (hidden=0 OR (hidden=1 AND state=19))) WHERE c.id>9 AND c.blocked=0 AND c.archived=1 GROUP BY c.id ORDER BY IFNULL(m.timestamp,0) DESC, m.id DESC;\x00"
|
||||
dc_sqlite3_prepare(
|
||||
(*chatlist).context,
|
||||
&mut (*chatlist).context.sql.lock().unwrap(),
|
||||
b"SELECT c.id, m.id FROM chats c LEFT JOIN msgs m ON c.id=m.chat_id AND m.timestamp=( SELECT MAX(timestamp) FROM msgs WHERE chat_id=c.id AND (hidden=0 OR (hidden=1 AND state=19))) WHERE c.id>9 AND c.blocked=0 AND c.archived=1 GROUP BY c.id ORDER BY IFNULL(m.timestamp,0) DESC, m.id DESC;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
current_block = 3437258052017859086;
|
||||
} else if query__.is_null() {
|
||||
@@ -165,7 +170,9 @@ unsafe fn dc_chatlist_load_from_db(
|
||||
add_archived_link_item = 1i32
|
||||
}
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut (*chatlist).context.sql.lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
(*chatlist).context,
|
||||
&mut (*chatlist).context.sql.lock().unwrap(),
|
||||
b"SELECT c.id, m.id FROM chats c LEFT JOIN msgs m ON c.id=m.chat_id AND m.timestamp=( SELECT MAX(timestamp) FROM msgs WHERE chat_id=c.id AND (hidden=0 OR (hidden=1 AND state=19))) WHERE c.id>9 AND c.blocked=0 AND c.archived=0 GROUP BY c.id ORDER BY IFNULL(m.timestamp,0) DESC, m.id DESC;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
current_block = 3437258052017859086;
|
||||
@@ -178,8 +185,10 @@ unsafe fn dc_chatlist_load_from_db(
|
||||
} else {
|
||||
strLikeCmd = dc_mprintf(b"%%%s%%\x00" as *const u8 as *const libc::c_char, query);
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut (*chatlist).context.sql.lock().unwrap(),
|
||||
b"SELECT c.id, m.id FROM chats c LEFT JOIN msgs m ON c.id=m.chat_id AND m.timestamp=( SELECT MAX(timestamp) FROM msgs WHERE chat_id=c.id AND (hidden=0 OR (hidden=1 AND state=19))) WHERE c.id>9 AND c.blocked=0 AND c.name LIKE ? GROUP BY c.id ORDER BY IFNULL(m.timestamp,0) DESC, m.id DESC;\x00"
|
||||
dc_sqlite3_prepare(
|
||||
(*chatlist).context,
|
||||
&mut (*chatlist).context.sql.lock().unwrap(),
|
||||
b"SELECT c.id, m.id FROM chats c LEFT JOIN msgs m ON c.id=m.chat_id AND m.timestamp=( SELECT MAX(timestamp) FROM msgs WHERE chat_id=c.id AND (hidden=0 OR (hidden=1 AND state=19))) WHERE c.id>9 AND c.blocked=0 AND c.name LIKE ? GROUP BY c.id ORDER BY IFNULL(m.timestamp,0) DESC, m.id DESC;\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
sqlite3_bind_text(stmt, 1i32, strLikeCmd, -1i32, None);
|
||||
@@ -223,6 +232,7 @@ unsafe fn dc_chatlist_load_from_db(
|
||||
pub unsafe fn dc_get_archived_cnt(mut context: &dc_context_t) -> libc::c_int {
|
||||
let mut ret: libc::c_int = 0i32;
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"SELECT COUNT(*) FROM chats WHERE blocked=0 AND archived=1;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -237,8 +247,10 @@ unsafe fn get_last_deaddrop_fresh_msg(mut context: &dc_context_t) -> uint32_t {
|
||||
let mut ret: uint32_t = 0i32 as uint32_t;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.lock().unwrap(),
|
||||
b"SELECT m.id FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id WHERE m.state=10 AND m.hidden=0 AND c.blocked=2 ORDER BY m.timestamp DESC, m.id DESC;\x00"
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"SELECT m.id FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id WHERE m.state=10 AND m.hidden=0 AND c.blocked=2 ORDER BY m.timestamp DESC, m.id DESC;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
/* we have an index over the state-column, this should be sufficient as there are typically only few fresh messages */
|
||||
if !(sqlite3_step(stmt) != 100i32) {
|
||||
|
||||
@@ -72,7 +72,9 @@ pub unsafe fn dc_configure(mut context: &dc_context_t) {
|
||||
dc_job_add(context, 900i32, 0i32, 0 as *const libc::c_char, 0i32);
|
||||
}
|
||||
pub unsafe fn dc_has_ongoing(mut context: &dc_context_t) -> libc::c_int {
|
||||
return if 0 != (*context).ongoing_running || (*context).shall_stop_ongoing == 0i32 {
|
||||
return if 0 != context.ongoing_running
|
||||
|| *context.shall_stop_ongoing.clone().read().unwrap() == 0
|
||||
{
|
||||
1i32
|
||||
} else {
|
||||
0i32
|
||||
@@ -81,6 +83,7 @@ pub unsafe fn dc_has_ongoing(mut context: &dc_context_t) -> libc::c_int {
|
||||
pub unsafe fn dc_is_configured(mut context: &dc_context_t) -> libc::c_int {
|
||||
return if 0
|
||||
!= dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"configured\x00" as *const u8 as *const libc::c_char,
|
||||
0i32,
|
||||
@@ -90,14 +93,14 @@ pub unsafe fn dc_is_configured(mut context: &dc_context_t) -> libc::c_int {
|
||||
0i32
|
||||
};
|
||||
}
|
||||
pub unsafe fn dc_stop_ongoing_process(mut context: &dc_context_t) {
|
||||
if 0 != (*context).ongoing_running && (*context).shall_stop_ongoing == 0i32 {
|
||||
pub unsafe fn dc_stop_ongoing_process(context: &dc_context_t) {
|
||||
if 0 != context.ongoing_running && *context.shall_stop_ongoing.clone().read().unwrap() == 0 {
|
||||
dc_log_info(
|
||||
context,
|
||||
0i32,
|
||||
b"Signaling the ongoing process to stop ASAP.\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
(*context).shall_stop_ongoing = 1i32
|
||||
*context.shall_stop_ongoing.clone().write().unwrap() = 1;
|
||||
} else {
|
||||
dc_log_info(
|
||||
context,
|
||||
@@ -133,17 +136,36 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
dc_imap_disconnect(context, &mut context.inbox.clone().lock().unwrap());
|
||||
dc_imap_disconnect(
|
||||
context,
|
||||
&mut context.sentbox_thread.imap.clone().lock().unwrap(),
|
||||
&mut context
|
||||
.sentbox_thread
|
||||
.clone()
|
||||
.lock()
|
||||
.unwrap()
|
||||
.imap
|
||||
.clone()
|
||||
.lock()
|
||||
.unwrap(),
|
||||
);
|
||||
dc_imap_disconnect(
|
||||
context,
|
||||
&mut context.mvbox_thread.imap.clone().lock().unwrap(),
|
||||
&mut context
|
||||
.mvbox_thread
|
||||
.clone()
|
||||
.lock()
|
||||
.unwrap()
|
||||
.imap
|
||||
.clone()
|
||||
.lock()
|
||||
.unwrap(),
|
||||
);
|
||||
dc_smtp_disconnect(&mut context.smtp.clone().lock().unwrap());
|
||||
context.smtp.clone().lock().unwrap().log_connect_errors = 1i32;
|
||||
context.inbox.clone().lock().unwrap().log_connect_errors = 1i32;
|
||||
context
|
||||
.sentbox_thread
|
||||
.clone()
|
||||
.lock()
|
||||
.unwrap()
|
||||
.imap
|
||||
.clone()
|
||||
.lock()
|
||||
@@ -151,6 +173,9 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
.log_connect_errors = 1i32;
|
||||
context
|
||||
.mvbox_thread
|
||||
.clone()
|
||||
.lock()
|
||||
.unwrap()
|
||||
.imap
|
||||
.clone()
|
||||
.lock()
|
||||
@@ -161,7 +186,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
0i32,
|
||||
b"Configure ...\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
if !(0 != context.shall_stop_ongoing) {
|
||||
if !(0 != *context.shall_stop_ongoing.clone().read().unwrap()) {
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::CONFIGURE_PROGRESS,
|
||||
@@ -176,6 +201,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
);
|
||||
param = dc_loginparam_new();
|
||||
dc_loginparam_read(
|
||||
context,
|
||||
param,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -192,7 +218,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
// the used oauth2 addr may differ, check this.
|
||||
// if dc_get_oauth2_addr() is not available in the oauth2 implementation,
|
||||
// just use the given one.
|
||||
if 0 != context.shall_stop_ongoing {
|
||||
if 0 != *context.shall_stop_ongoing.clone().read().unwrap() {
|
||||
current_block = 2927484062889439186;
|
||||
} else {
|
||||
(context.cb)(
|
||||
@@ -219,7 +245,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
(*param).addr,
|
||||
);
|
||||
}
|
||||
if 0 != context.shall_stop_ongoing {
|
||||
if 0 != *context.shall_stop_ongoing.clone().read().unwrap() {
|
||||
current_block = 2927484062889439186;
|
||||
} else {
|
||||
(context.cb)(
|
||||
@@ -258,7 +284,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
if (*param).mail_pw.is_null() {
|
||||
(*param).mail_pw = dc_strdup(0 as *const libc::c_char)
|
||||
}
|
||||
if !(0 != context.shall_stop_ongoing) {
|
||||
if !(0 != *context.shall_stop_ongoing.clone().read().unwrap()) {
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::CONFIGURE_PROGRESS,
|
||||
@@ -299,7 +325,12 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
param_autoconfig =
|
||||
moz_autoconfigure(context, url, param);
|
||||
free(url as *mut libc::c_void);
|
||||
if 0 != context.shall_stop_ongoing {
|
||||
if 0 != *context
|
||||
.shall_stop_ongoing
|
||||
.clone()
|
||||
.read()
|
||||
.unwrap()
|
||||
{
|
||||
current_block = 2927484062889439186;
|
||||
} else {
|
||||
(context.cb)(
|
||||
@@ -337,7 +368,12 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
param_autoconfig =
|
||||
moz_autoconfigure(context, url_0, param);
|
||||
free(url_0 as *mut libc::c_void);
|
||||
if 0 != context.shall_stop_ongoing {
|
||||
if 0 != *context
|
||||
.shall_stop_ongoing
|
||||
.clone()
|
||||
.read()
|
||||
.unwrap()
|
||||
{
|
||||
current_block = 2927484062889439186;
|
||||
} else {
|
||||
(context.cb)(
|
||||
@@ -399,7 +435,12 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
context, url_1, param,
|
||||
);
|
||||
free(url_1 as *mut libc::c_void);
|
||||
if 0 != context.shall_stop_ongoing {
|
||||
if 0 != *context
|
||||
.shall_stop_ongoing
|
||||
.clone()
|
||||
.read()
|
||||
.unwrap()
|
||||
{
|
||||
current_block =
|
||||
2927484062889439186;
|
||||
break;
|
||||
@@ -442,8 +483,11 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
free(
|
||||
url_2 as *mut libc::c_void,
|
||||
);
|
||||
if 0 != context
|
||||
if 0 != *context
|
||||
.shall_stop_ongoing
|
||||
.clone()
|
||||
.read()
|
||||
.unwrap()
|
||||
{
|
||||
current_block =
|
||||
2927484062889439186;
|
||||
@@ -500,8 +544,11 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
free(url_3
|
||||
as
|
||||
*mut libc::c_void);
|
||||
if 0 != context
|
||||
if 0 != *context
|
||||
.shall_stop_ongoing
|
||||
.clone()
|
||||
.read()
|
||||
.unwrap()
|
||||
{
|
||||
current_block
|
||||
=
|
||||
@@ -562,7 +609,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
*mut libc::c_void);
|
||||
if 0
|
||||
!=
|
||||
context.shall_stop_ongoing
|
||||
*context.shall_stop_ongoing.clone().read().unwrap()
|
||||
{
|
||||
current_block
|
||||
=
|
||||
@@ -787,7 +834,13 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
b"Account settings incomplete.\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
} else if !(0 != context.shall_stop_ongoing) {
|
||||
} else if !(0
|
||||
!= *context
|
||||
.shall_stop_ongoing
|
||||
.clone()
|
||||
.read()
|
||||
.unwrap())
|
||||
{
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::CONFIGURE_PROGRESS,
|
||||
@@ -832,7 +885,12 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
break;
|
||||
}
|
||||
// probe STARTTLS/993
|
||||
if 0 != context.shall_stop_ongoing {
|
||||
if 0 != *context
|
||||
.shall_stop_ongoing
|
||||
.clone()
|
||||
.read()
|
||||
.unwrap()
|
||||
{
|
||||
current_block = 2927484062889439186;
|
||||
break;
|
||||
}
|
||||
@@ -876,7 +934,12 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
break;
|
||||
}
|
||||
// probe STARTTLS/143
|
||||
if 0 != context.shall_stop_ongoing {
|
||||
if 0 != *context
|
||||
.shall_stop_ongoing
|
||||
.clone()
|
||||
.read()
|
||||
.unwrap()
|
||||
{
|
||||
current_block = 2927484062889439186;
|
||||
break;
|
||||
}
|
||||
@@ -922,7 +985,12 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
break;
|
||||
}
|
||||
// next probe round with only the localpart of the email-address as the loginname
|
||||
if 0 != context.shall_stop_ongoing {
|
||||
if 0 != *context
|
||||
.shall_stop_ongoing
|
||||
.clone()
|
||||
.read()
|
||||
.unwrap()
|
||||
{
|
||||
current_block = 2927484062889439186;
|
||||
break;
|
||||
}
|
||||
@@ -963,7 +1031,13 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
2927484062889439186 => {}
|
||||
_ => {
|
||||
imap_connected_here = 1i32;
|
||||
if !(0 != context.shall_stop_ongoing) {
|
||||
if !(0
|
||||
!= *context
|
||||
.shall_stop_ongoing
|
||||
.clone()
|
||||
.read()
|
||||
.unwrap())
|
||||
{
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::CONFIGURE_PROGRESS,
|
||||
@@ -979,6 +1053,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
);
|
||||
/* try to connect to SMTP - if we did not got an autoconfig, the first try was SSL-465 and we do a second try with STARTTLS-587 */
|
||||
if 0 == dc_smtp_connect(
|
||||
context,
|
||||
&mut context
|
||||
.smtp
|
||||
.clone()
|
||||
@@ -990,7 +1065,11 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
current_block =
|
||||
2927484062889439186;
|
||||
} else if 0
|
||||
!= context.shall_stop_ongoing
|
||||
!= *context
|
||||
.shall_stop_ongoing
|
||||
.clone()
|
||||
.read()
|
||||
.unwrap()
|
||||
{
|
||||
current_block =
|
||||
2927484062889439186;
|
||||
@@ -1029,6 +1108,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
);
|
||||
free(r_3 as *mut libc::c_void);
|
||||
if 0 == dc_smtp_connect(
|
||||
context,
|
||||
&mut context
|
||||
.smtp
|
||||
.clone()
|
||||
@@ -1036,8 +1116,11 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
.unwrap(),
|
||||
param,
|
||||
) {
|
||||
if 0 != context
|
||||
if 0 != *context
|
||||
.shall_stop_ongoing
|
||||
.clone()
|
||||
.read()
|
||||
.unwrap()
|
||||
{
|
||||
current_block =
|
||||
2927484062889439186;
|
||||
@@ -1087,6 +1170,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
as
|
||||
*mut libc::c_void);
|
||||
if 0 == dc_smtp_connect(
|
||||
context,
|
||||
&mut context
|
||||
.smtp
|
||||
.clone()
|
||||
@@ -1116,8 +1200,11 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
_ => {
|
||||
smtp_connected_here = 1i32;
|
||||
if !(0
|
||||
!= context
|
||||
.shall_stop_ongoing)
|
||||
!= *context
|
||||
.shall_stop_ongoing
|
||||
.clone()
|
||||
.read()
|
||||
.unwrap())
|
||||
{
|
||||
(context.cb)(context,
|
||||
Event::CONFIGURE_PROGRESS,
|
||||
@@ -1143,7 +1230,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
=
|
||||
if 0
|
||||
!=
|
||||
dc_sqlite3_get_config_int(&mut context.sql.lock().unwrap(),
|
||||
dc_sqlite3_get_config_int(context, &mut context.sql.lock().unwrap(),
|
||||
b"mvbox_watch\x00"
|
||||
as
|
||||
*const u8
|
||||
@@ -1153,7 +1240,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
||
|
||||
0
|
||||
!=
|
||||
dc_sqlite3_get_config_int(&mut context.sql.lock().unwrap(),
|
||||
dc_sqlite3_get_config_int(context, &mut context.sql.lock().unwrap(),
|
||||
b"mvbox_move\x00"
|
||||
as
|
||||
*const u8
|
||||
@@ -1175,8 +1262,11 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
flags,
|
||||
);
|
||||
if !(0
|
||||
!= context
|
||||
.shall_stop_ongoing)
|
||||
!= *context
|
||||
.shall_stop_ongoing
|
||||
.clone()
|
||||
.read()
|
||||
.unwrap())
|
||||
{
|
||||
(context.cb)(context,
|
||||
Event::CONFIGURE_PROGRESS,
|
||||
@@ -1198,22 +1288,25 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
0i32
|
||||
as
|
||||
uintptr_t);
|
||||
dc_loginparam_write(param,
|
||||
dc_loginparam_write(context, param,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"configured_\x00"
|
||||
as
|
||||
*const u8
|
||||
as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_set_config_int(&mut context.sql.lock().unwrap(),
|
||||
dc_sqlite3_set_config_int(context, &mut context.sql.lock().unwrap(),
|
||||
b"configured\x00"
|
||||
as
|
||||
*const u8
|
||||
as
|
||||
*const libc::c_char,
|
||||
1i32);
|
||||
if !(0 != context
|
||||
.shall_stop_ongoing)
|
||||
if !(0 != *context
|
||||
.shall_stop_ongoing
|
||||
.clone()
|
||||
.read()
|
||||
.unwrap())
|
||||
{
|
||||
(context.cb)(context,
|
||||
Event::CONFIGURE_PROGRESS,
|
||||
@@ -1246,7 +1339,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
*const libc::c_char);
|
||||
if !(0
|
||||
!=
|
||||
context.shall_stop_ongoing)
|
||||
*context.shall_stop_ongoing.clone().read().unwrap())
|
||||
{
|
||||
(context.cb)(context,
|
||||
Event::CONFIGURE_PROGRESS,
|
||||
@@ -1311,9 +1404,11 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut
|
||||
}
|
||||
|
||||
pub unsafe fn dc_free_ongoing(mut context: &dc_context_t) {
|
||||
context.ongoing_running = 0i32;
|
||||
context.shall_stop_ongoing = 1i32;
|
||||
// FIXME
|
||||
// context.ongoing_running = 0i32;
|
||||
*context.shall_stop_ongoing.clone().write().unwrap() = 1;
|
||||
}
|
||||
|
||||
pub unsafe fn dc_configure_folders(
|
||||
context: &dc_context_t,
|
||||
imap: &mut dc_imap_t,
|
||||
@@ -1409,6 +1504,7 @@ pub unsafe fn dc_configure_folders(
|
||||
mailimap_subscribe((*imap).etpan, mvbox_folder);
|
||||
}
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"folders_configured\x00" as *const u8 as *const libc::c_char,
|
||||
3i32,
|
||||
@@ -2067,10 +2163,12 @@ pub unsafe fn dc_alloc_ongoing(context: &dc_context_t) -> libc::c_int {
|
||||
);
|
||||
return 0i32;
|
||||
}
|
||||
context.ongoing_running = 1i32;
|
||||
context.shall_stop_ongoing = 0i32;
|
||||
// FIXME
|
||||
// context.ongoing_running = 1i32;
|
||||
*context.shall_stop_ongoing.clone().write().unwrap() = 0;
|
||||
return 1i32;
|
||||
}
|
||||
|
||||
pub unsafe fn dc_connect_to_configured_imap(
|
||||
context: &dc_context_t,
|
||||
imap: &mut dc_imap_t,
|
||||
@@ -2080,6 +2178,7 @@ pub unsafe fn dc_connect_to_configured_imap(
|
||||
if 0 != dc_imap_is_connected(imap) {
|
||||
ret_connected = 1i32
|
||||
} else if dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured\x00" as *const u8 as *const libc::c_char,
|
||||
0i32,
|
||||
@@ -2092,6 +2191,7 @@ pub unsafe fn dc_connect_to_configured_imap(
|
||||
);
|
||||
} else {
|
||||
dc_loginparam_read(
|
||||
context,
|
||||
param,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_\x00" as *const u8 as *const libc::c_char,
|
||||
|
||||
@@ -31,6 +31,7 @@ pub struct dc_contact_t<'a> {
|
||||
|
||||
pub unsafe fn dc_marknoticed_contact(context: &dc_context_t, contact_id: uint32_t) {
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE msgs SET state=13 WHERE from_id=? AND state=10;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -75,6 +76,7 @@ pub unsafe fn dc_lookup_contact_id_by_addr(
|
||||
if !(addr.is_null() || *addr.offset(0isize) as libc::c_int == 0i32) {
|
||||
addr_normalized = dc_addr_normalize(addr);
|
||||
addr_self = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
b"\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -83,7 +85,8 @@ pub unsafe fn dc_lookup_contact_id_by_addr(
|
||||
contact_id = 1i32
|
||||
} else {
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
context,&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id FROM contacts WHERE addr=?1 COLLATE NOCASE AND id>?2 AND origin>=?3 AND blocked=0;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_text(
|
||||
@@ -165,6 +168,7 @@ pub unsafe fn dc_block_contact(
|
||||
) && (*contact).blocked != new_blocking
|
||||
{
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE contacts SET blocked=? WHERE id=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -177,7 +181,8 @@ pub unsafe fn dc_block_contact(
|
||||
sqlite3_finalize(stmt);
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
context,&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE chats SET blocked=? WHERE type=? AND id IN (SELECT chat_id FROM chats_contacts WHERE contact_id=?);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
@@ -283,9 +288,9 @@ pub unsafe fn dc_contact_empty(mut contact: *mut dc_contact_t) {
|
||||
/* contacts with at least this origin value are verified and known not to be spam */
|
||||
/* contacts with at least this origin value start a new "normal" chat, defaults to off */
|
||||
pub unsafe fn dc_contact_load_from_db(
|
||||
mut contact: *mut dc_contact_t,
|
||||
mut sql: &mut dc_sqlite3_t,
|
||||
mut contact_id: uint32_t,
|
||||
contact: *mut dc_contact_t,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
contact_id: uint32_t,
|
||||
) -> libc::c_int {
|
||||
let mut current_block: u64;
|
||||
let mut success: libc::c_int = 0i32;
|
||||
@@ -296,6 +301,7 @@ pub unsafe fn dc_contact_load_from_db(
|
||||
(*contact).id = contact_id;
|
||||
(*contact).name = dc_stock_str((*contact).context, 2i32);
|
||||
(*contact).addr = dc_sqlite3_get_config(
|
||||
(*contact).context,
|
||||
sql,
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
b"\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -303,7 +309,8 @@ pub unsafe fn dc_contact_load_from_db(
|
||||
current_block = 5143058163439228106;
|
||||
} else {
|
||||
stmt =
|
||||
dc_sqlite3_prepare(sql,
|
||||
dc_sqlite3_prepare(
|
||||
(*contact).context,sql,
|
||||
b"SELECT c.name, c.addr, c.origin, c.blocked, c.authname FROM contacts c WHERE c.id=?;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int(stmt, 1i32, contact_id as libc::c_int);
|
||||
@@ -369,6 +376,7 @@ pub unsafe fn dc_add_or_lookup_contact(
|
||||
if !(addr__.is_null() || origin <= 0i32) {
|
||||
addr = dc_addr_normalize(addr__);
|
||||
addr_self = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
b"\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -389,7 +397,8 @@ pub unsafe fn dc_add_or_lookup_contact(
|
||||
);
|
||||
} else {
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
context,&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id, name, addr, origin, authname FROM contacts WHERE addr=? COLLATE NOCASE;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_text(stmt, 1i32, addr as *const libc::c_char, -1i32, None);
|
||||
@@ -426,6 +435,7 @@ pub unsafe fn dc_add_or_lookup_contact(
|
||||
|| origin > row_origin
|
||||
{
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE contacts SET name=?, addr=?, origin=?, authname=? WHERE id=?;\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
@@ -470,7 +480,8 @@ pub unsafe fn dc_add_or_lookup_contact(
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
if 0 != update_name {
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
context,&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE chats SET name=? WHERE type=? AND id IN(SELECT chat_id FROM chats_contacts WHERE contact_id=?);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
@@ -485,6 +496,7 @@ pub unsafe fn dc_add_or_lookup_contact(
|
||||
sqlite3_finalize(stmt);
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"INSERT INTO contacts (name, addr, origin) VALUES(?, ?, ?);\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -504,6 +516,7 @@ pub unsafe fn dc_add_or_lookup_contact(
|
||||
sqlite3_bind_int(stmt, 3i32, origin);
|
||||
if sqlite3_step(stmt) == 101i32 {
|
||||
row_id = dc_sqlite3_get_rowid(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"contacts\x00" as *const u8 as *const libc::c_char,
|
||||
b"addr\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -616,6 +629,7 @@ pub unsafe fn dc_get_contacts(
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
|
||||
self_addr = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
b"\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -633,7 +647,8 @@ pub unsafe fn dc_get_contacts(
|
||||
current_block = 7597307149762829253;
|
||||
} else {
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
context,&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT c.id FROM contacts c LEFT JOIN acpeerstates ps ON c.addr=ps.addr WHERE c.addr!=?1 AND c.id>?2 AND c.origin>=?3 AND c.blocked=0 AND (c.name LIKE ?4 OR c.addr LIKE ?5) AND (1=?6 OR LENGTH(ps.verified_key_fingerprint)!=0) ORDER BY LOWER(c.name||c.addr),c.id;\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
@@ -652,6 +667,7 @@ pub unsafe fn dc_get_contacts(
|
||||
},
|
||||
);
|
||||
self_name = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"displayname\x00" as *const u8 as *const libc::c_char,
|
||||
b"\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -668,7 +684,8 @@ pub unsafe fn dc_get_contacts(
|
||||
}
|
||||
} else {
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(),
|
||||
dc_sqlite3_prepare(
|
||||
context,&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id FROM contacts WHERE addr!=?1 AND id>?2 AND origin>=?3 AND blocked=0 ORDER BY LOWER(name||addr),id;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_text(stmt, 1i32, self_addr, -1i32, None);
|
||||
@@ -702,6 +719,7 @@ pub unsafe fn dc_get_blocked_cnt(context: &dc_context_t) -> libc::c_int {
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT COUNT(*) FROM contacts WHERE id>? AND blocked!=0\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -720,6 +738,7 @@ pub unsafe fn dc_get_blocked_contacts(mut context: &dc_context_t) -> *mut dc_arr
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id FROM contacts WHERE id>? AND blocked!=0 ORDER BY LOWER(name||addr),id;\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
@@ -771,11 +790,13 @@ pub unsafe fn dc_get_contact_encrinfo(
|
||||
(*contact).addr,
|
||||
);
|
||||
dc_loginparam_read(
|
||||
context,
|
||||
loginparam,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_key_load_self_public(
|
||||
context,
|
||||
self_key,
|
||||
(*loginparam).addr,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
@@ -794,6 +815,7 @@ pub unsafe fn dc_get_contact_encrinfo(
|
||||
if (*self_key).binary.is_null() {
|
||||
dc_ensure_secret_key_exists(context);
|
||||
dc_key_load_self_public(
|
||||
context,
|
||||
self_key,
|
||||
(*loginparam).addr,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
@@ -804,11 +826,11 @@ pub unsafe fn dc_get_contact_encrinfo(
|
||||
dc_strbuilder_cat(&mut ret, p);
|
||||
free(p as *mut libc::c_void);
|
||||
dc_strbuilder_cat(&mut ret, b":\x00" as *const u8 as *const libc::c_char);
|
||||
fingerprint_self = dc_key_get_formatted_fingerprint(self_key);
|
||||
fingerprint_self = dc_key_get_formatted_fingerprint(context, self_key);
|
||||
fingerprint_other_verified =
|
||||
dc_key_get_formatted_fingerprint(dc_apeerstate_peek_key(peerstate, 2i32));
|
||||
dc_key_get_formatted_fingerprint(context, dc_apeerstate_peek_key(peerstate, 2i32));
|
||||
fingerprint_other_unverified =
|
||||
dc_key_get_formatted_fingerprint(dc_apeerstate_peek_key(peerstate, 0i32));
|
||||
dc_key_get_formatted_fingerprint(context, dc_apeerstate_peek_key(peerstate, 0i32));
|
||||
if strcmp((*loginparam).addr, (*peerstate).addr) < 0i32 {
|
||||
cat_fingerprint(
|
||||
&mut ret,
|
||||
@@ -900,6 +922,7 @@ pub unsafe fn dc_delete_contact(
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !contact_id <= 9i32 as libc::c_uint {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT COUNT(*) FROM chats_contacts WHERE contact_id=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -909,6 +932,7 @@ pub unsafe fn dc_delete_contact(
|
||||
sqlite3_finalize(stmt);
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT COUNT(*) FROM msgs WHERE from_id=? OR to_id=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -919,6 +943,7 @@ pub unsafe fn dc_delete_contact(
|
||||
sqlite3_finalize(stmt);
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"DELETE FROM contacts WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1042,11 +1067,11 @@ pub unsafe fn dc_contact_is_blocked(mut contact: *const dc_contact_t) -> libc::c
|
||||
return (*contact).blocked;
|
||||
}
|
||||
pub unsafe fn dc_contact_is_verified(mut contact: *mut dc_contact_t) -> libc::c_int {
|
||||
return dc_contact_is_verified_ex(contact, 0 as *const dc_apeerstate_t);
|
||||
return dc_contact_is_verified_ex(contact, 0 as *mut dc_apeerstate_t);
|
||||
}
|
||||
pub unsafe fn dc_contact_is_verified_ex<'a>(
|
||||
contact: *mut dc_contact_t<'a>,
|
||||
peerstate: *const dc_apeerstate_t<'a>,
|
||||
mut peerstate: *mut dc_apeerstate_t<'a>,
|
||||
) -> libc::c_int {
|
||||
let mut current_block: u64;
|
||||
let mut contact_verified: libc::c_int = 0i32;
|
||||
@@ -1108,6 +1133,7 @@ pub unsafe fn dc_addr_equals_self(
|
||||
if !addr.is_null() {
|
||||
normalized_addr = dc_addr_normalize(addr);
|
||||
self_addr = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
@@ -1155,6 +1181,7 @@ pub unsafe fn dc_get_real_contact_cnt(mut context: &dc_context_t) -> size_t {
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !context.sql.clone().lock().unwrap().cobj.is_null() {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT COUNT(*) FROM contacts WHERE id>?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1203,6 +1230,7 @@ pub unsafe fn dc_real_contact_exists(
|
||||
let mut ret: libc::c_int = 0i32;
|
||||
if !(context.sql.clone().lock().unwrap().cobj.is_null() || contact_id <= 9i32 as libc::c_uint) {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id FROM contacts WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1220,6 +1248,7 @@ pub unsafe fn dc_scaleup_contact_origin(
|
||||
mut origin: libc::c_int,
|
||||
) {
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE contacts SET origin=? WHERE id=? AND origin<?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
use libc;
|
||||
use std::sync::{Arc, Condvar, Mutex, RwLock};
|
||||
use std::time::SystemTime;
|
||||
|
||||
use crate::constants::VERSION;
|
||||
use crate::dc_array::*;
|
||||
@@ -33,20 +32,38 @@ pub struct dc_context_t {
|
||||
pub inbox: Arc<Mutex<dc_imap_t>>,
|
||||
pub perform_inbox_jobs_needed: Arc<RwLock<i32>>,
|
||||
pub probe_imap_network: Arc<RwLock<i32>>,
|
||||
pub sentbox_thread: dc_jobthread_t,
|
||||
pub mvbox_thread: dc_jobthread_t,
|
||||
pub sentbox_thread: Arc<Mutex<dc_jobthread_t>>,
|
||||
pub mvbox_thread: Arc<Mutex<dc_jobthread_t>>,
|
||||
pub smtp: Arc<Mutex<dc_smtp_t>>,
|
||||
pub smtp_state: Arc<(Mutex<SmtpState>, Condvar)>,
|
||||
pub oauth2_critical: Arc<Mutex<()>>,
|
||||
pub cb: dc_callback_t,
|
||||
pub os_name: *mut libc::c_char,
|
||||
pub cmdline_sel_chat_id: u32,
|
||||
pub bob_expects: i32,
|
||||
pub bobs_status: i32,
|
||||
pub bobs_qr_scan: Arc<RwLock<*mut dc_lot_t>>,
|
||||
pub last_smeared_timestamp: Arc<RwLock<Option<SystemTime>>>,
|
||||
pub bob: Arc<RwLock<BobStatus>>,
|
||||
pub last_smeared_timestamp: Arc<RwLock<time_t>>,
|
||||
pub ongoing_running: i32,
|
||||
pub shall_stop_ongoing: i32,
|
||||
pub shall_stop_ongoing: Arc<RwLock<i32>>,
|
||||
}
|
||||
|
||||
unsafe impl std::marker::Send for dc_context_t {}
|
||||
unsafe impl std::marker::Sync for dc_context_t {}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct BobStatus {
|
||||
pub expects: i32,
|
||||
pub status: i32,
|
||||
pub qr_scan: *mut dc_lot_t,
|
||||
}
|
||||
|
||||
impl Default for BobStatus {
|
||||
fn default() -> Self {
|
||||
BobStatus {
|
||||
expects: 0,
|
||||
status: 0,
|
||||
qr_scan: std::ptr::null_mut(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default, Debug)]
|
||||
@@ -93,19 +110,17 @@ pub fn dc_context_new(
|
||||
})),
|
||||
userdata,
|
||||
cb,
|
||||
os_name: dc_strdup_keep_null(os_name),
|
||||
os_name: unsafe { dc_strdup_keep_null(os_name) },
|
||||
ongoing_running: 0,
|
||||
shall_stop_ongoing: 1,
|
||||
shall_stop_ongoing: Arc::new(RwLock::new(1)),
|
||||
sql: Arc::new(Mutex::new(dc_sqlite3_new())),
|
||||
smtp: Arc::new(Mutex::new(dc_smtp_new())),
|
||||
smtp_state: Arc::new((Mutex::new(Default::default()), Condvar::new())),
|
||||
oauth2_critical: Arc::new(Mutex::new(())),
|
||||
bob_expects: 0,
|
||||
bobs_status: 0,
|
||||
bobs_qr_scan: Arc::new(RwLock::new(std::ptr::null_mut())),
|
||||
last_smeared_timestamp: Arc::new(RwLock::new(None)),
|
||||
bob: Arc::new(RwLock::new(Default::default())),
|
||||
last_smeared_timestamp: Arc::new(RwLock::new(0 as time_t)),
|
||||
cmdline_sel_chat_id: 0,
|
||||
sentbox_thread: unsafe {
|
||||
sentbox_thread: Arc::new(Mutex::new(unsafe {
|
||||
dc_jobthread_init(
|
||||
b"SENTBOX\x00" as *const u8 as *const libc::c_char,
|
||||
b"configured_sentbox_folder\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -116,8 +131,8 @@ pub fn dc_context_new(
|
||||
Some(cb_receive_imf),
|
||||
),
|
||||
)
|
||||
},
|
||||
mvbox_thread: unsafe {
|
||||
})),
|
||||
mvbox_thread: Arc::new(Mutex::new(unsafe {
|
||||
dc_jobthread_init(
|
||||
b"MVBOX\x00" as *const u8 as *const libc::c_char,
|
||||
b"configured_mvbox_folder\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -128,7 +143,7 @@ pub fn dc_context_new(
|
||||
Some(cb_receive_imf),
|
||||
),
|
||||
)
|
||||
},
|
||||
})),
|
||||
probe_imap_network: Arc::new(RwLock::new(0)),
|
||||
perform_inbox_jobs_needed: Arc::new(RwLock::new(0)),
|
||||
}
|
||||
@@ -231,7 +246,7 @@ unsafe fn cb_get_config(
|
||||
key: *const libc::c_char,
|
||||
def: *const libc::c_char,
|
||||
) -> *mut libc::c_char {
|
||||
dc_sqlite3_get_config(&mut context.sql.clone().lock().unwrap(), key, def)
|
||||
dc_sqlite3_get_config(context, &mut context.sql.clone().lock().unwrap(), key, def)
|
||||
}
|
||||
|
||||
pub unsafe fn dc_context_unref(context: &mut dc_context_t) {
|
||||
@@ -241,17 +256,33 @@ pub unsafe fn dc_context_unref(context: &mut dc_context_t) {
|
||||
dc_imap_unref(context, &mut context.inbox.clone().lock().unwrap());
|
||||
dc_imap_unref(
|
||||
context,
|
||||
&mut context.sentbox_thread.imap.clone().lock().unwrap(),
|
||||
&mut context
|
||||
.sentbox_thread
|
||||
.clone()
|
||||
.lock()
|
||||
.unwrap()
|
||||
.imap
|
||||
.clone()
|
||||
.lock()
|
||||
.unwrap(),
|
||||
);
|
||||
dc_imap_unref(
|
||||
context,
|
||||
&mut context.mvbox_thread.imap.clone().lock().unwrap(),
|
||||
&mut context
|
||||
.mvbox_thread
|
||||
.clone()
|
||||
.lock()
|
||||
.unwrap()
|
||||
.imap
|
||||
.clone()
|
||||
.lock()
|
||||
.unwrap(),
|
||||
);
|
||||
dc_smtp_unref(&mut context.smtp.clone().lock().unwrap());
|
||||
dc_sqlite3_unref(context, &mut context.sql.clone().lock().unwrap());
|
||||
|
||||
dc_jobthread_exit(&mut context.sentbox_thread);
|
||||
dc_jobthread_exit(&mut context.mvbox_thread);
|
||||
dc_jobthread_exit(&mut context.sentbox_thread.clone().lock().unwrap());
|
||||
dc_jobthread_exit(&mut context.mvbox_thread.clone().lock().unwrap());
|
||||
|
||||
free(context.os_name as *mut libc::c_void);
|
||||
}
|
||||
@@ -260,11 +291,27 @@ pub unsafe fn dc_close(context: &mut dc_context_t) {
|
||||
dc_imap_disconnect(context, &mut context.inbox.clone().lock().unwrap());
|
||||
dc_imap_disconnect(
|
||||
context,
|
||||
&mut context.sentbox_thread.imap.clone().lock().unwrap(),
|
||||
&mut context
|
||||
.sentbox_thread
|
||||
.clone()
|
||||
.lock()
|
||||
.unwrap()
|
||||
.imap
|
||||
.clone()
|
||||
.lock()
|
||||
.unwrap(),
|
||||
);
|
||||
dc_imap_disconnect(
|
||||
context,
|
||||
&mut context.mvbox_thread.imap.clone().lock().unwrap(),
|
||||
&mut context
|
||||
.mvbox_thread
|
||||
.clone()
|
||||
.lock()
|
||||
.unwrap()
|
||||
.imap
|
||||
.clone()
|
||||
.lock()
|
||||
.unwrap(),
|
||||
);
|
||||
dc_smtp_disconnect(&mut context.smtp.clone().lock().unwrap());
|
||||
|
||||
@@ -471,6 +518,7 @@ pub unsafe fn dc_get_config(context: &dc_context_t, key: *const libc::c_char) ->
|
||||
|
||||
if strcmp(key, b"selfavatar\x00" as *const u8 as *const libc::c_char) == 0 {
|
||||
let mut rel_path: *mut libc::c_char = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
key,
|
||||
0 as *const libc::c_char,
|
||||
@@ -481,6 +529,7 @@ pub unsafe fn dc_get_config(context: &dc_context_t, key: *const libc::c_char) ->
|
||||
}
|
||||
} else {
|
||||
value = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
key,
|
||||
0 as *const libc::c_char,
|
||||
@@ -638,16 +687,19 @@ pub unsafe fn dc_get_info(context: &dc_context_t) -> *mut libc::c_char {
|
||||
l = dc_loginparam_new();
|
||||
l2 = dc_loginparam_new();
|
||||
dc_loginparam_read(
|
||||
context,
|
||||
l,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_loginparam_read(
|
||||
context,
|
||||
l2,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
displayname = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"displayname\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
@@ -657,26 +709,31 @@ pub unsafe fn dc_get_info(context: &dc_context_t) -> *mut libc::c_char {
|
||||
deaddrop_msgs = dc_get_deaddrop_msg_cnt(context) as libc::c_int;
|
||||
contacts = dc_get_real_contact_cnt(context) as libc::c_int;
|
||||
is_configured = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured\x00" as *const u8 as *const libc::c_char,
|
||||
0,
|
||||
);
|
||||
dbversion = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
0,
|
||||
);
|
||||
e2ee_enabled = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"e2ee_enabled\x00" as *const u8 as *const libc::c_char,
|
||||
1,
|
||||
);
|
||||
mdns_enabled = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"mdns_enabled\x00" as *const u8 as *const libc::c_char,
|
||||
1,
|
||||
);
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT COUNT(*) FROM keypairs;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -684,6 +741,7 @@ pub unsafe fn dc_get_info(context: &dc_context_t) -> *mut libc::c_char {
|
||||
prv_key_cnt = sqlite3_column_int(stmt, 0);
|
||||
sqlite3_finalize(stmt);
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT COUNT(*) FROM acpeerstates;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -691,47 +749,55 @@ pub unsafe fn dc_get_info(context: &dc_context_t) -> *mut libc::c_char {
|
||||
pub_key_cnt = sqlite3_column_int(stmt, 0);
|
||||
sqlite3_finalize(stmt);
|
||||
if 0 != dc_key_load_self_public(
|
||||
context,
|
||||
self_public,
|
||||
(*l2).addr,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
) {
|
||||
fingerprint_str = dc_key_get_fingerprint(self_public)
|
||||
fingerprint_str = dc_key_get_fingerprint(context, self_public)
|
||||
} else {
|
||||
fingerprint_str = dc_strdup(b"<Not yet calculated>\x00" as *const u8 as *const libc::c_char)
|
||||
}
|
||||
l_readable_str = dc_loginparam_get_readable(l);
|
||||
l2_readable_str = dc_loginparam_get_readable(l2);
|
||||
inbox_watch = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"inbox_watch\x00" as *const u8 as *const libc::c_char,
|
||||
1,
|
||||
);
|
||||
sentbox_watch = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"sentbox_watch\x00" as *const u8 as *const libc::c_char,
|
||||
1,
|
||||
);
|
||||
mvbox_watch = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"mvbox_watch\x00" as *const u8 as *const libc::c_char,
|
||||
1,
|
||||
);
|
||||
mvbox_move = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"mvbox_move\x00" as *const u8 as *const libc::c_char,
|
||||
1,
|
||||
);
|
||||
folders_configured = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"folders_configured\x00" as *const u8 as *const libc::c_char,
|
||||
0,
|
||||
);
|
||||
configured_sentbox_folder = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_sentbox_folder\x00" as *const u8 as *const libc::c_char,
|
||||
b"<unset>\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
configured_mvbox_folder = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_mvbox_folder\x00" as *const u8 as *const libc::c_char,
|
||||
b"<unset>\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -844,6 +910,7 @@ pub unsafe fn dc_get_fresh_msgs(context: &dc_context_t) -> *mut dc_array_t {
|
||||
let mut stmt = 0 as *mut sqlite3_stmt;
|
||||
if !ret.is_null() {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT m.id FROM msgs m LEFT JOIN contacts ct \
|
||||
ON m.from_id=ct.id LEFT JOIN chats c ON m.chat_id=c.id WHERE m.state=? \
|
||||
@@ -889,6 +956,7 @@ pub unsafe fn dc_search_msgs(
|
||||
strLikeBeg = dc_mprintf(b"%s%%\x00" as *const u8 as *const libc::c_char, real_query);
|
||||
if 0 != chat_id {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT m.id, m.timestamp FROM msgs m LEFT JOIN contacts ct ON m.from_id=ct.id WHERE m.chat_id=? \
|
||||
AND m.hidden=0 \
|
||||
@@ -901,6 +969,7 @@ pub unsafe fn dc_search_msgs(
|
||||
} else {
|
||||
let mut show_deaddrop = 0;
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT m.id, m.timestamp FROM msgs m LEFT JOIN contacts ct ON m.from_id=ct.id \
|
||||
LEFT JOIN chats c ON m.chat_id=c.id WHERE m.chat_id>9 AND m.hidden=0 \
|
||||
@@ -958,6 +1027,7 @@ pub unsafe fn dc_is_sentbox(
|
||||
folder_name: *const libc::c_char,
|
||||
) -> libc::c_int {
|
||||
let mut sentbox_name = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_sentbox_folder\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
@@ -976,6 +1046,7 @@ pub unsafe fn dc_is_sentbox(
|
||||
|
||||
pub unsafe fn dc_is_mvbox(context: &dc_context_t, folder_name: *const libc::c_char) -> libc::c_int {
|
||||
let mut mvbox_name = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_mvbox_folder\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
|
||||
@@ -74,6 +74,7 @@ pub unsafe fn dc_e2ee_encrypt(
|
||||
/* libEtPan's pgp_encrypt_mime() takes the parent as the new root. We just expect the root as being given to this function. */
|
||||
(*autocryptheader).prefer_encrypt = 0i32;
|
||||
if 0 != dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"e2ee_enabled\x00" as *const u8 as *const libc::c_char,
|
||||
1i32,
|
||||
@@ -81,6 +82,7 @@ pub unsafe fn dc_e2ee_encrypt(
|
||||
(*autocryptheader).prefer_encrypt = 1i32
|
||||
}
|
||||
(*autocryptheader).addr = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
@@ -137,6 +139,7 @@ pub unsafe fn dc_e2ee_encrypt(
|
||||
if 0 != do_encrypt {
|
||||
dc_keyring_add(keyring, (*autocryptheader).public_key);
|
||||
if 0 == dc_key_load_self_private(
|
||||
context,
|
||||
sign_key,
|
||||
(*autocryptheader).addr,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
@@ -516,6 +519,7 @@ unsafe fn load_or_generate_self_public_key(
|
||||
let mut key_creation_here: libc::c_int = 0i32;
|
||||
if !public_key.is_null() {
|
||||
if 0 == dc_key_load_self_public(
|
||||
context,
|
||||
public_key,
|
||||
self_addr,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
@@ -574,6 +578,7 @@ unsafe fn load_or_generate_self_public_key(
|
||||
current_block = 10496152961502316708;
|
||||
} else if 0
|
||||
== dc_key_save_self_keypair(
|
||||
context,
|
||||
public_key,
|
||||
private_key,
|
||||
self_addr,
|
||||
@@ -699,6 +704,7 @@ pub unsafe fn dc_e2ee_decrypt(
|
||||
}
|
||||
/* load private key for decryption */
|
||||
self_addr = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
@@ -706,6 +712,7 @@ pub unsafe fn dc_e2ee_decrypt(
|
||||
if !self_addr.is_null() {
|
||||
if !(0
|
||||
== dc_keyring_load_self_private_for_decrypting(
|
||||
context,
|
||||
private_keyring,
|
||||
self_addr,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
@@ -1218,6 +1225,7 @@ pub unsafe fn dc_ensure_secret_key_exists(mut context: &dc_context_t) -> libc::c
|
||||
let mut self_addr: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
if !public_key.is_null() {
|
||||
self_addr = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
|
||||
@@ -1250,7 +1250,6 @@ unsafe fn fake_idle(context: &dc_context_t, imap: &mut dc_imap_t) {
|
||||
}) as time_t;
|
||||
// FIXME
|
||||
// pthread_mutex_lock(&mut imap.watch_condmutex);
|
||||
let mut r: libc::c_int = 0;
|
||||
let mut wakeup_at: timespec = timespec {
|
||||
tv_sec: 0,
|
||||
tv_nsec: 0,
|
||||
@@ -1746,7 +1745,7 @@ pub unsafe fn dc_imap_delete_msg(
|
||||
imap: &mut dc_imap_t,
|
||||
rfc724_mid: *const libc::c_char,
|
||||
folder: *const libc::c_char,
|
||||
server_uid: uint32_t,
|
||||
mut server_uid: uint32_t,
|
||||
) -> libc::c_int {
|
||||
let mut success: libc::c_int = 0;
|
||||
let mut r: libc::c_int = 0;
|
||||
|
||||
@@ -93,6 +93,7 @@ pub unsafe fn dc_imex_has_backup(
|
||||
let mut sql = dc_sqlite3_new();
|
||||
if 0 != dc_sqlite3_open(context, &mut sql, curr_pathNfilename, 0x1i32) {
|
||||
let mut curr_backup_time: time_t = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut sql,
|
||||
b"backup_time\x00" as *const u8 as *const libc::c_char,
|
||||
0i32,
|
||||
@@ -130,6 +131,7 @@ pub unsafe fn dc_check_password(
|
||||
let mut success: libc::c_int = 0i32;
|
||||
|
||||
dc_loginparam_read(
|
||||
context,
|
||||
loginparam,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -163,11 +165,11 @@ pub unsafe fn dc_initiate_key_transfer(mut context: &dc_context_t) -> *mut libc:
|
||||
setup_code = dc_create_setup_code(context);
|
||||
if !setup_code.is_null() {
|
||||
/* this may require a keypair to be created. this may take a second ... */
|
||||
if !(0 != context.shall_stop_ongoing) {
|
||||
if !(0 != *context.shall_stop_ongoing.clone().read().unwrap()) {
|
||||
setup_file_content = dc_render_setup_file(context, setup_code);
|
||||
if !setup_file_content.is_null() {
|
||||
/* encrypting may also take a while ... */
|
||||
if !(0 != context.shall_stop_ongoing) {
|
||||
if !(0 != *context.shall_stop_ongoing.clone().read().unwrap()) {
|
||||
setup_file_name = dc_get_fine_pathNfilename(
|
||||
context,
|
||||
b"$BLOBDIR\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -194,7 +196,7 @@ pub unsafe fn dc_initiate_key_transfer(mut context: &dc_context_t) -> *mut libc:
|
||||
);
|
||||
dc_param_set_int((*msg).param, 'S' as i32, 6i32);
|
||||
dc_param_set_int((*msg).param, 'u' as i32, 2i32);
|
||||
if !(0 != context.shall_stop_ongoing) {
|
||||
if !(0 != *context.shall_stop_ongoing.clone().read().unwrap()) {
|
||||
msg_id = dc_send_msg(context, chat_id, msg);
|
||||
if !(msg_id == 0i32 as libc::c_uint) {
|
||||
dc_msg_unref(msg);
|
||||
@@ -206,7 +208,8 @@ pub unsafe fn dc_initiate_key_transfer(mut context: &dc_context_t) -> *mut libc:
|
||||
as *const libc::c_char,
|
||||
);
|
||||
loop {
|
||||
if 0 != context.shall_stop_ongoing {
|
||||
if 0 != *context.shall_stop_ongoing.clone().read().unwrap()
|
||||
{
|
||||
current_block = 6116957410927263949;
|
||||
break;
|
||||
}
|
||||
@@ -265,16 +268,19 @@ pub unsafe extern "C" fn dc_render_setup_file(
|
||||
/* create the payload */
|
||||
if !(0 == dc_ensure_secret_key_exists(context)) {
|
||||
self_addr = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
);
|
||||
dc_key_load_self_private(
|
||||
context,
|
||||
curr_private_key,
|
||||
self_addr,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
);
|
||||
let mut e2ee_enabled: libc::c_int = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"e2ee_enabled\x00" as *const u8 as *const libc::c_char,
|
||||
1i32,
|
||||
@@ -492,6 +498,7 @@ unsafe fn set_self_key(
|
||||
);
|
||||
} else {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"DELETE FROM keypairs WHERE public_key=? OR private_key=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -509,16 +516,19 @@ unsafe fn set_self_key(
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
if 0 != set_default {
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE keypairs SET is_default=0;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
}
|
||||
self_addr = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
);
|
||||
if 0 == dc_key_save_self_keypair(
|
||||
context,
|
||||
public_key,
|
||||
private_key,
|
||||
self_addr,
|
||||
@@ -538,6 +548,7 @@ unsafe fn set_self_key(
|
||||
) == 0i32
|
||||
{
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"e2ee_enabled\x00" as *const u8 as *const libc::c_char,
|
||||
0i32,
|
||||
@@ -548,6 +559,7 @@ unsafe fn set_self_key(
|
||||
) == 0i32
|
||||
{
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"e2ee_enabled\x00" as *const u8 as *const libc::c_char,
|
||||
1i32,
|
||||
@@ -974,6 +986,7 @@ unsafe fn import_backup(
|
||||
))
|
||||
{
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT COUNT(*) FROM backup_blobs;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -982,6 +995,7 @@ unsafe fn import_backup(
|
||||
sqlite3_finalize(stmt);
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT file_name, file_content FROM backup_blobs ORDER BY id;\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
@@ -991,7 +1005,7 @@ unsafe fn import_backup(
|
||||
current_block = 10891380440665537214;
|
||||
break;
|
||||
}
|
||||
if 0 != context.shall_stop_ongoing {
|
||||
if 0 != *context.shall_stop_ongoing.clone().read().unwrap() {
|
||||
current_block = 8648553629232744886;
|
||||
break;
|
||||
}
|
||||
@@ -1050,6 +1064,7 @@ unsafe fn import_backup(
|
||||
sqlite3_finalize(stmt);
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"DROP TABLE backup_blobs;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1147,7 +1162,7 @@ unsafe fn export_backup(mut context: &dc_context_t, mut dir: *const libc::c_char
|
||||
b"backup_blobs\x00" as *const u8 as *const libc::c_char,
|
||||
) {
|
||||
if 0 ==
|
||||
dc_sqlite3_execute(&mut sql,
|
||||
dc_sqlite3_execute(context, &mut sql,
|
||||
b"CREATE TABLE backup_blobs (id INTEGER PRIMARY KEY, file_name, file_content);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char) {
|
||||
@@ -1196,17 +1211,20 @@ unsafe fn export_backup(mut context: &dc_context_t, mut dir: *const libc::c_char
|
||||
current_block = 11487273724841241105;
|
||||
} else {
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut sql,
|
||||
b"INSERT INTO backup_blobs (file_name, file_content) VALUES (?, ?);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut sql,
|
||||
b"INSERT INTO backup_blobs (file_name, file_content) VALUES (?, ?);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
loop {
|
||||
dir_entry = readdir(dir_handle);
|
||||
if dir_entry.is_null() {
|
||||
current_block = 2631791190359682872;
|
||||
break;
|
||||
}
|
||||
if 0 != context.shall_stop_ongoing {
|
||||
if 0 != *context.shall_stop_ongoing.clone().read().unwrap()
|
||||
{
|
||||
delete_dest_file = 1i32;
|
||||
current_block = 11487273724841241105;
|
||||
break;
|
||||
@@ -1315,6 +1333,7 @@ unsafe fn export_backup(mut context: &dc_context_t, mut dir: *const libc::c_char
|
||||
11487273724841241105 => {}
|
||||
_ => {
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
&mut sql,
|
||||
b"backup_time\x00" as *const u8 as *const libc::c_char,
|
||||
now as int32_t,
|
||||
@@ -1504,6 +1523,7 @@ unsafe fn export_self_keys(
|
||||
let mut public_key: *mut dc_key_t = dc_key_new();
|
||||
let mut private_key: *mut dc_key_t = dc_key_new();
|
||||
let stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id, public_key, private_key, is_default FROM keypairs;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
|
||||
180
src/dc_job.rs
180
src/dc_job.rs
@@ -65,7 +65,7 @@ pub unsafe fn dc_perform_imap_jobs(context: &dc_context_t) {
|
||||
);
|
||||
}
|
||||
unsafe fn dc_job_perform(
|
||||
mut context: &dc_context_t,
|
||||
context: &dc_context_t,
|
||||
mut thread: libc::c_int,
|
||||
mut probe_network: libc::c_int,
|
||||
) {
|
||||
@@ -90,15 +90,19 @@ unsafe fn dc_job_perform(
|
||||
|
||||
if probe_network == 0i32 {
|
||||
select_stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id, action, foreign_id, param, added_timestamp, desired_timestamp, tries FROM jobs WHERE thread=? AND desired_timestamp<=? ORDER BY action DESC, added_timestamp;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id, action, foreign_id, param, added_timestamp, desired_timestamp, tries FROM jobs WHERE thread=? AND desired_timestamp<=? ORDER BY action DESC, added_timestamp;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int64(select_stmt, 1i32, thread as sqlite3_int64);
|
||||
sqlite3_bind_int64(select_stmt, 2i32, time(0 as *mut time_t) as sqlite3_int64);
|
||||
} else {
|
||||
select_stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id, action, foreign_id, param, added_timestamp, desired_timestamp, tries FROM jobs WHERE thread=? AND tries>0 ORDER BY desired_timestamp, action DESC;\x00"
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id, action, foreign_id, param, added_timestamp, desired_timestamp, tries FROM jobs WHERE thread=? AND tries>0 ORDER BY desired_timestamp, action DESC;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int64(select_stmt, 1i32, thread as sqlite3_int64);
|
||||
}
|
||||
@@ -129,8 +133,16 @@ unsafe fn dc_job_perform(
|
||||
dc_job_kill_action(context, job.action);
|
||||
sqlite3_finalize(select_stmt);
|
||||
select_stmt = 0 as *mut sqlite3_stmt;
|
||||
dc_jobthread_suspend(&mut context.sentbox_thread, 1i32);
|
||||
dc_jobthread_suspend(&mut context.mvbox_thread, 1i32);
|
||||
dc_jobthread_suspend(
|
||||
context,
|
||||
&mut context.sentbox_thread.clone().lock().unwrap(),
|
||||
1,
|
||||
);
|
||||
dc_jobthread_suspend(
|
||||
context,
|
||||
&mut context.mvbox_thread.clone().lock().unwrap(),
|
||||
1,
|
||||
);
|
||||
dc_suspend_smtp_thread(context, 1i32);
|
||||
}
|
||||
let mut tries: libc::c_int = 0i32;
|
||||
@@ -178,8 +190,16 @@ unsafe fn dc_job_perform(
|
||||
tries += 1
|
||||
}
|
||||
if 900i32 == job.action || 910i32 == job.action {
|
||||
dc_jobthread_suspend(&mut context.sentbox_thread, 0i32);
|
||||
dc_jobthread_suspend(&mut context.mvbox_thread, 0i32);
|
||||
dc_jobthread_suspend(
|
||||
context,
|
||||
&mut context.sentbox_thread.clone().lock().unwrap(),
|
||||
0,
|
||||
);
|
||||
dc_jobthread_suspend(
|
||||
context,
|
||||
&mut context.mvbox_thread.clone().lock().unwrap(),
|
||||
0,
|
||||
);
|
||||
dc_suspend_smtp_thread(context, 0i32);
|
||||
break;
|
||||
} else if job.try_again == 2i32 {
|
||||
@@ -248,6 +268,7 @@ unsafe fn dc_job_perform(
|
||||
}
|
||||
unsafe fn dc_job_delete(mut context: &dc_context_t, mut job: *const dc_job_t) {
|
||||
let mut delete_stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"DELETE FROM jobs WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -272,6 +293,7 @@ unsafe fn get_backoff_time_offset(mut c_tries: libc::c_int) -> time_t {
|
||||
}
|
||||
unsafe fn dc_job_update(mut context: &dc_context_t, mut job: *const dc_job_t) {
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE jobs SET desired_timestamp=?, tries=?, param=? WHERE id=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -306,12 +328,16 @@ unsafe extern "C" fn dc_job_do_DC_JOB_SEND(mut context: &dc_context_t, mut job:
|
||||
if 0 == dc_smtp_is_connected(&context.smtp.clone().lock().unwrap()) {
|
||||
let mut loginparam: *mut dc_loginparam_t = dc_loginparam_new();
|
||||
dc_loginparam_read(
|
||||
context,
|
||||
loginparam,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
let mut connected: libc::c_int =
|
||||
dc_smtp_connect(&mut context.smtp.clone().lock().unwrap(), loginparam);
|
||||
let mut connected: libc::c_int = dc_smtp_connect(
|
||||
context,
|
||||
&mut context.smtp.clone().lock().unwrap(),
|
||||
loginparam,
|
||||
);
|
||||
dc_loginparam_unref(loginparam);
|
||||
if 0 == connected {
|
||||
dc_job_try_again_later(job, 3i32, 0 as *const libc::c_char);
|
||||
@@ -371,6 +397,7 @@ unsafe extern "C" fn dc_job_do_DC_JOB_SEND(mut context: &dc_context_t, mut job:
|
||||
_ => {
|
||||
/* send message */
|
||||
if 0 == dc_smtp_send_msg(
|
||||
context,
|
||||
&mut context.smtp.clone().lock().unwrap(),
|
||||
recipients_list,
|
||||
buf as *const libc::c_char,
|
||||
@@ -401,6 +428,7 @@ unsafe extern "C" fn dc_job_do_DC_JOB_SEND(mut context: &dc_context_t, mut job:
|
||||
if 0 != (*job).foreign_id {
|
||||
dc_update_msg_state(context, (*job).foreign_id, 26i32);
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT chat_id FROM msgs WHERE id=?\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -468,6 +496,7 @@ unsafe fn dc_job_do_DC_JOB_MOVE_MSG(mut context: &dc_context_t, mut job: *mut dc
|
||||
2473556513754201174 => {
|
||||
if !(0 == dc_msg_load_from_db(msg, context, (*job).foreign_id)) {
|
||||
if dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"folders_configured\x00" as *const u8 as *const libc::c_char,
|
||||
0i32,
|
||||
@@ -480,6 +509,7 @@ unsafe fn dc_job_do_DC_JOB_MOVE_MSG(mut context: &dc_context_t, mut job: *mut dc
|
||||
);
|
||||
}
|
||||
dest_folder = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_mvbox_folder\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
@@ -584,6 +614,7 @@ unsafe fn dc_job_do_DC_JOB_MARKSEEN_MDN_ON_IMAP(
|
||||
}
|
||||
if 0 != dc_param_get_int((*job).param, 'M' as i32, 0i32) {
|
||||
if dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"folders_configured\x00" as *const u8 as *const libc::c_char,
|
||||
0i32,
|
||||
@@ -596,6 +627,7 @@ unsafe fn dc_job_do_DC_JOB_MARKSEEN_MDN_ON_IMAP(
|
||||
);
|
||||
}
|
||||
dest_folder = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_mvbox_folder\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
@@ -658,6 +690,7 @@ unsafe fn dc_job_do_DC_JOB_MARKSEEN_MSG_ON_IMAP(
|
||||
_ => {
|
||||
if 0 != dc_param_get_int((*msg).param, 'r' as i32, 0i32)
|
||||
&& 0 != dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"mdns_enabled\x00" as *const u8 as *const libc::c_char,
|
||||
1i32,
|
||||
@@ -715,6 +748,7 @@ unsafe fn dc_job_do_DC_JOB_MARKSEEN_MSG_ON_IMAP(
|
||||
_ => {
|
||||
if 0 != dc_param_get_int((*msg).param, 'r' as i32, 0i32)
|
||||
&& 0 != dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"mdns_enabled\x00" as *const u8 as *const libc::c_char,
|
||||
1i32,
|
||||
@@ -894,8 +928,10 @@ pub unsafe fn dc_job_add(
|
||||
return;
|
||||
}
|
||||
stmt =
|
||||
dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(),
|
||||
b"INSERT INTO jobs (added_timestamp, thread, action, foreign_id, param, desired_timestamp) VALUES (?,?,?,?,?,?);\x00"
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"INSERT INTO jobs (added_timestamp, thread, action, foreign_id, param, desired_timestamp) VALUES (?,?,?,?,?,?);\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int64(stmt, 1i32, timestamp as sqlite3_int64);
|
||||
sqlite3_bind_int(stmt, 2i32, thread);
|
||||
@@ -933,7 +969,7 @@ pub unsafe fn dc_interrupt_smtp_idle(mut context: &dc_context_t) {
|
||||
);
|
||||
|
||||
let &(ref lock, ref cvar) = &*context.smtp_state.clone();
|
||||
let state = lock.lock().unwrap();
|
||||
let mut state = lock.lock().unwrap();
|
||||
|
||||
state.perform_jobs_needed = 1;
|
||||
state.idle = true;
|
||||
@@ -1015,6 +1051,7 @@ unsafe fn dc_job_do_DC_JOB_DELETE_MSG_ON_IMAP(mut context: &dc_context_t, mut jo
|
||||
/* delete all pending jobs with the given action */
|
||||
pub unsafe fn dc_job_kill_action(mut context: &dc_context_t, mut action: libc::c_int) {
|
||||
let mut stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"DELETE FROM jobs WHERE action=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1029,6 +1066,7 @@ pub unsafe fn dc_perform_imap_fetch(mut context: &dc_context_t) {
|
||||
return;
|
||||
}
|
||||
if dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"inbox_watch\x00" as *const u8 as *const libc::c_char,
|
||||
1i32,
|
||||
@@ -1046,14 +1084,14 @@ pub unsafe fn dc_perform_imap_fetch(mut context: &dc_context_t) {
|
||||
0i32,
|
||||
b"INBOX-fetch started...\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_imap_fetch(&mut context.inbox.clone().lock().unwrap());
|
||||
dc_imap_fetch(context, &mut context.inbox.clone().lock().unwrap());
|
||||
if 0 != context.inbox.clone().lock().unwrap().should_reconnect {
|
||||
dc_log_info(
|
||||
context,
|
||||
0i32,
|
||||
b"INBOX-fetch aborted, starting over...\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_imap_fetch(&mut context.inbox.clone().lock().unwrap());
|
||||
dc_imap_fetch(context, &mut context.inbox.clone().lock().unwrap());
|
||||
}
|
||||
dc_log_info(
|
||||
context,
|
||||
@@ -1062,74 +1100,99 @@ pub unsafe fn dc_perform_imap_fetch(mut context: &dc_context_t) {
|
||||
clock().wrapping_sub(start) as libc::c_double * 1000.0f64 / 1000000i32 as libc::c_double,
|
||||
);
|
||||
}
|
||||
pub unsafe fn dc_perform_imap_idle(mut context: &dc_context_t) {
|
||||
pub unsafe fn dc_perform_imap_idle(context: &dc_context_t) {
|
||||
connect_to_inbox(context);
|
||||
let l = context.inboxidle_condmutex.lock().unwrap();
|
||||
if 0 != context.perform_inbox_jobs_needed {
|
||||
|
||||
if 0 != *context.perform_inbox_jobs_needed.clone().read().unwrap() {
|
||||
dc_log_info(
|
||||
context,
|
||||
0i32,
|
||||
b"INBOX-IDLE will not be started because of waiting jobs.\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
drop(l);
|
||||
return;
|
||||
}
|
||||
drop(l);
|
||||
dc_log_info(
|
||||
context,
|
||||
0i32,
|
||||
b"INBOX-IDLE started...\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_imap_idle(&mut context.inbox.clone().lock().unwrap());
|
||||
dc_imap_idle(context, &mut context.inbox.clone().lock().unwrap());
|
||||
dc_log_info(
|
||||
context,
|
||||
0i32,
|
||||
b"INBOX-IDLE ended.\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
}
|
||||
pub unsafe fn dc_perform_mvbox_fetch(mut context: &dc_context_t) {
|
||||
|
||||
pub unsafe fn dc_perform_mvbox_fetch(context: &dc_context_t) {
|
||||
let mut use_network: libc::c_int = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"mvbox_watch\x00" as *const u8 as *const libc::c_char,
|
||||
1i32,
|
||||
);
|
||||
dc_jobthread_fetch(&mut context.mvbox_thread, use_network);
|
||||
dc_jobthread_fetch(
|
||||
context,
|
||||
&mut context.mvbox_thread.clone().lock().unwrap(),
|
||||
use_network,
|
||||
);
|
||||
}
|
||||
pub unsafe fn dc_perform_mvbox_idle(mut context: &dc_context_t) {
|
||||
|
||||
pub unsafe fn dc_perform_mvbox_idle(context: &dc_context_t) {
|
||||
let mut use_network: libc::c_int = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"mvbox_watch\x00" as *const u8 as *const libc::c_char,
|
||||
1i32,
|
||||
);
|
||||
dc_jobthread_idle(&mut context.mvbox_thread, use_network);
|
||||
dc_jobthread_idle(
|
||||
context,
|
||||
&mut context.mvbox_thread.clone().lock().unwrap(),
|
||||
use_network,
|
||||
);
|
||||
}
|
||||
pub unsafe fn dc_interrupt_mvbox_idle(mut context: &dc_context_t) {
|
||||
dc_jobthread_interrupt_idle(&mut context.mvbox_thread);
|
||||
|
||||
pub unsafe fn dc_interrupt_mvbox_idle(context: &dc_context_t) {
|
||||
dc_jobthread_interrupt_idle(context, &mut context.mvbox_thread.clone().lock().unwrap());
|
||||
}
|
||||
pub unsafe fn dc_perform_sentbox_fetch(mut context: &dc_context_t) {
|
||||
|
||||
pub unsafe fn dc_perform_sentbox_fetch(context: &dc_context_t) {
|
||||
let mut use_network: libc::c_int = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"sentbox_watch\x00" as *const u8 as *const libc::c_char,
|
||||
1i32,
|
||||
);
|
||||
dc_jobthread_fetch(&mut context.sentbox_thread, use_network);
|
||||
dc_jobthread_fetch(
|
||||
context,
|
||||
&mut context.sentbox_thread.clone().lock().unwrap(),
|
||||
use_network,
|
||||
);
|
||||
}
|
||||
pub unsafe fn dc_perform_sentbox_idle(mut context: &dc_context_t) {
|
||||
|
||||
pub unsafe fn dc_perform_sentbox_idle(context: &dc_context_t) {
|
||||
let mut use_network: libc::c_int = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"sentbox_watch\x00" as *const u8 as *const libc::c_char,
|
||||
1i32,
|
||||
);
|
||||
dc_jobthread_idle(&mut context.sentbox_thread, use_network);
|
||||
dc_jobthread_idle(
|
||||
context,
|
||||
&mut context.sentbox_thread.clone().lock().unwrap(),
|
||||
use_network,
|
||||
);
|
||||
}
|
||||
pub unsafe fn dc_interrupt_sentbox_idle(mut context: &dc_context_t) {
|
||||
dc_jobthread_interrupt_idle(&mut context.sentbox_thread);
|
||||
|
||||
pub unsafe fn dc_interrupt_sentbox_idle(context: &dc_context_t) {
|
||||
dc_jobthread_interrupt_idle(context, &mut context.sentbox_thread.clone().lock().unwrap());
|
||||
}
|
||||
pub unsafe fn dc_perform_smtp_jobs(mut context: &dc_context_t) {
|
||||
|
||||
pub unsafe fn dc_perform_smtp_jobs(context: &dc_context_t) {
|
||||
let probe_smtp_network = {
|
||||
let &(ref lock, _) = &*context.smtp_state.clone();
|
||||
let state = lock.lock().unwrap();
|
||||
let mut state = lock.lock().unwrap();
|
||||
|
||||
let probe_smtp_network = state.probe_network;
|
||||
state.probe_network = 0;
|
||||
@@ -1162,7 +1225,7 @@ pub unsafe fn dc_perform_smtp_jobs(mut context: &dc_context_t) {
|
||||
|
||||
{
|
||||
let &(ref lock, _) = &*context.smtp_state.clone();
|
||||
let state = lock.lock().unwrap();
|
||||
let mut state = lock.lock().unwrap();
|
||||
|
||||
state.doing_jobs = 0;
|
||||
}
|
||||
@@ -1186,16 +1249,15 @@ pub unsafe fn dc_perform_smtp_idle(mut context: &dc_context_t) {
|
||||
as *const libc::c_char,
|
||||
);
|
||||
} else {
|
||||
let mut r = false;
|
||||
// FIXME: correct time based on
|
||||
// get_next_wakeup_time(context, 5000) + 1;
|
||||
let dur = Duration::from_milis(5000).unwrap();
|
||||
let dur = Duration::from_millis(5000);
|
||||
|
||||
loop {
|
||||
let res = cvar.wait_timeout(state, dur);
|
||||
let res = cvar.wait_timeout(state, dur).unwrap();
|
||||
state = res.0;
|
||||
|
||||
if state.idle == true || res.1 {
|
||||
if state.idle == true || res.1.timed_out() {
|
||||
// We received the notification and the value has been updated, we can leave.
|
||||
break;
|
||||
}
|
||||
@@ -1211,10 +1273,11 @@ pub unsafe fn dc_perform_smtp_idle(mut context: &dc_context_t) {
|
||||
);
|
||||
}
|
||||
|
||||
unsafe fn get_next_wakeup_time(mut context: &dc_context_t, mut thread: libc::c_int) -> time_t {
|
||||
unsafe fn get_next_wakeup_time(context: &dc_context_t, thread: libc::c_int) -> time_t {
|
||||
let mut wakeup_time: time_t = 0i32 as time_t;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT MIN(desired_timestamp) FROM jobs WHERE thread=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -1224,30 +1287,35 @@ unsafe fn get_next_wakeup_time(mut context: &dc_context_t, mut thread: libc::c_i
|
||||
wakeup_time = sqlite3_column_int(stmt, 0i32) as time_t
|
||||
}
|
||||
if wakeup_time == 0i32 as libc::c_long {
|
||||
wakeup_time = time(0 as &time_t) + (10i32 * 60i32) as libc::c_long
|
||||
wakeup_time = time(0 as *mut time_t) + (10i32 * 60i32) as libc::c_long
|
||||
}
|
||||
sqlite3_finalize(stmt);
|
||||
return wakeup_time;
|
||||
}
|
||||
|
||||
pub unsafe fn dc_maybe_network(mut context: &dc_context_t) {
|
||||
pthread_mutex_lock(&mut context.smtpidle_condmutex);
|
||||
context.probe_smtp_network = 1i32;
|
||||
pthread_mutex_unlock(&mut context.smtpidle_condmutex);
|
||||
let l = context.inboxidle_condmutex.lock().unwrap();
|
||||
context.probe_imap_network = 1i32;
|
||||
drop(l);
|
||||
{
|
||||
let &(ref lock, _) = &*context.smtp_state.clone();
|
||||
let mut state = lock.lock().unwrap();
|
||||
state.probe_network = 1;
|
||||
|
||||
*context.probe_imap_network.clone().write().unwrap() = 1;
|
||||
}
|
||||
|
||||
dc_interrupt_smtp_idle(context);
|
||||
dc_interrupt_imap_idle(context);
|
||||
dc_interrupt_mvbox_idle(context);
|
||||
dc_interrupt_sentbox_idle(context);
|
||||
}
|
||||
|
||||
pub unsafe fn dc_job_action_exists(
|
||||
mut context: &dc_context_t,
|
||||
mut action: libc::c_int,
|
||||
) -> libc::c_int {
|
||||
let mut job_exists: libc::c_int = 0i32;
|
||||
let mut stmt: &sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
let mut stmt = 0 as *mut sqlite3_stmt;
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id FROM jobs WHERE action=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1257,10 +1325,10 @@ pub unsafe fn dc_job_action_exists(
|
||||
return job_exists;
|
||||
}
|
||||
/* special case for DC_JOB_SEND_MSG_TO_SMTP */
|
||||
pub unsafe fn dc_job_send_msg(mut context: &dc_context_t, mut msg_id: uint32_t) -> libc::c_int {
|
||||
pub unsafe fn dc_job_send_msg(context: &dc_context_t, msg_id: uint32_t) -> libc::c_int {
|
||||
let mut success: libc::c_int = 0i32;
|
||||
let mut mimefactory: dc_mimefactory_t = dc_mimefactory_t {
|
||||
from_addr: 0 as &libc::c_char,
|
||||
let mut mimefactory = dc_mimefactory_t {
|
||||
from_addr: 0 as *mut libc::c_char,
|
||||
from_displayname: 0 as *mut libc::c_char,
|
||||
selfstatus: 0 as *mut libc::c_char,
|
||||
recipients_names: 0 as *mut clist,
|
||||
@@ -1279,7 +1347,7 @@ pub unsafe fn dc_job_send_msg(mut context: &dc_context_t, mut msg_id: uint32_t)
|
||||
out_gossiped: 0,
|
||||
out_last_added_location_id: 0,
|
||||
error: 0 as *mut libc::c_char,
|
||||
context: std::ptr::null_mut(),
|
||||
context,
|
||||
};
|
||||
dc_mimefactory_init(&mut mimefactory, context);
|
||||
/* load message data */
|
||||
@@ -1299,7 +1367,7 @@ pub unsafe fn dc_job_send_msg(mut context: &dc_context_t, mut msg_id: uint32_t)
|
||||
|| (*mimefactory.msg).type_0 == 50i32
|
||||
|| (*mimefactory.msg).type_0 == 60i32
|
||||
{
|
||||
let mut pathNfilename: &libc::c_char = dc_param_get(
|
||||
let mut pathNfilename = dc_param_get(
|
||||
(*mimefactory.msg).param,
|
||||
'f' as i32,
|
||||
0 as *const libc::c_char,
|
||||
|
||||
@@ -14,15 +14,10 @@ use crate::x::*;
|
||||
|
||||
#[repr(C)]
|
||||
pub struct dc_jobthread_t {
|
||||
// TODO: remove
|
||||
pub context: *mut dc_context_t,
|
||||
pub name: *mut libc::c_char,
|
||||
pub folder_config_name: *mut libc::c_char,
|
||||
pub imap: Arc<Mutex<dc_imap_t>>,
|
||||
pub idle: (Mutex<bool>, Condvar),
|
||||
pub jobs_needed: libc::c_int,
|
||||
pub suspended: libc::c_int,
|
||||
pub using_handle: libc::c_int,
|
||||
pub state: Arc<(Mutex<JobState>, Condvar)>,
|
||||
}
|
||||
|
||||
pub unsafe fn dc_jobthread_init(
|
||||
@@ -31,219 +26,243 @@ pub unsafe fn dc_jobthread_init(
|
||||
imap: dc_imap_t,
|
||||
) -> dc_jobthread_t {
|
||||
dc_jobthread_t {
|
||||
context: std::ptr::null_mut(),
|
||||
name: dc_strdup(name),
|
||||
folder_config_name: dc_strdup(folder_config_name),
|
||||
imap: Arc::new(Mutex::New(imap)),
|
||||
idle: (Mutex::new(false), Condvar::new()),
|
||||
jobs_needed: 0i32,
|
||||
suspended: 0i32,
|
||||
using_handle: 0i32,
|
||||
imap: Arc::new(Mutex::new(imap)),
|
||||
state: Arc::new((Mutex::new(Default::default()), Condvar::new())),
|
||||
}
|
||||
}
|
||||
|
||||
pub unsafe fn dc_jobthread_exit(mut jobthread: *mut dc_jobthread_t) {
|
||||
if jobthread.is_null() {
|
||||
return;
|
||||
}
|
||||
|
||||
free((*jobthread).name as *mut libc::c_void);
|
||||
(*jobthread).name = 0 as *mut libc::c_char;
|
||||
free((*jobthread).folder_config_name as *mut libc::c_void);
|
||||
(*jobthread).folder_config_name = 0 as *mut libc::c_char;
|
||||
#[derive(Debug, Default)]
|
||||
pub struct JobState {
|
||||
idle: bool,
|
||||
jobs_needed: i32,
|
||||
suspended: i32,
|
||||
using_handle: i32,
|
||||
}
|
||||
|
||||
pub unsafe fn dc_jobthread_suspend(mut jobthread: *mut dc_jobthread_t, mut suspend: libc::c_int) {
|
||||
if jobthread.is_null() {
|
||||
return;
|
||||
}
|
||||
pub unsafe fn dc_jobthread_exit(jobthread: &mut dc_jobthread_t) {
|
||||
free(jobthread.name as *mut libc::c_void);
|
||||
jobthread.name = 0 as *mut libc::c_char;
|
||||
free(jobthread.folder_config_name as *mut libc::c_void);
|
||||
jobthread.folder_config_name = 0 as *mut libc::c_char;
|
||||
}
|
||||
|
||||
pub unsafe fn dc_jobthread_suspend(
|
||||
context: &dc_context_t,
|
||||
jobthread: &mut dc_jobthread_t,
|
||||
suspend: libc::c_int,
|
||||
) {
|
||||
if 0 != suspend {
|
||||
dc_log_info(
|
||||
(*jobthread).context,
|
||||
context,
|
||||
0i32,
|
||||
b"Suspending %s-thread.\x00" as *const u8 as *const libc::c_char,
|
||||
(*jobthread).name,
|
||||
jobthread.name,
|
||||
);
|
||||
pthread_mutex_lock(&mut (*jobthread).mutex);
|
||||
(*jobthread).suspended = 1i32;
|
||||
pthread_mutex_unlock(&mut (*jobthread).mutex);
|
||||
dc_jobthread_interrupt_idle(jobthread);
|
||||
|
||||
{
|
||||
jobthread.state.clone().0.lock().unwrap().suspended = 1;
|
||||
}
|
||||
dc_jobthread_interrupt_idle(context, jobthread);
|
||||
loop {
|
||||
pthread_mutex_lock(&mut (*jobthread).mutex);
|
||||
if (*jobthread).using_handle == 0i32 {
|
||||
pthread_mutex_unlock(&mut (*jobthread).mutex);
|
||||
let using_handle = jobthread.state.clone().0.lock().unwrap().using_handle;
|
||||
if using_handle == 0 {
|
||||
return;
|
||||
}
|
||||
pthread_mutex_unlock(&mut (*jobthread).mutex);
|
||||
usleep((300i32 * 1000i32) as useconds_t);
|
||||
}
|
||||
} else {
|
||||
dc_log_info(
|
||||
(*jobthread).context,
|
||||
context,
|
||||
0i32,
|
||||
b"Unsuspending %s-thread.\x00" as *const u8 as *const libc::c_char,
|
||||
(*jobthread).name,
|
||||
jobthread.name,
|
||||
);
|
||||
pthread_mutex_lock(&mut (*jobthread).mutex);
|
||||
(*jobthread).suspended = 0i32;
|
||||
(*jobthread).idle_condflag = 1i32;
|
||||
pthread_cond_signal(&mut (*jobthread).idle_cond);
|
||||
pthread_mutex_unlock(&mut (*jobthread).mutex);
|
||||
};
|
||||
}
|
||||
pub unsafe extern "C" fn dc_jobthread_interrupt_idle(mut jobthread: *mut dc_jobthread_t) {
|
||||
if jobthread.is_null() {
|
||||
return;
|
||||
|
||||
let &(ref lock, ref cvar) = &*jobthread.state.clone();
|
||||
let mut state = lock.lock().unwrap();
|
||||
|
||||
state.suspended = 0;
|
||||
state.idle = true;
|
||||
cvar.notify_one();
|
||||
}
|
||||
pthread_mutex_lock(&mut (*jobthread).mutex);
|
||||
(*jobthread).jobs_needed = 1i32;
|
||||
pthread_mutex_unlock(&mut (*jobthread).mutex);
|
||||
}
|
||||
|
||||
pub unsafe extern "C" fn dc_jobthread_interrupt_idle(
|
||||
context: &dc_context_t,
|
||||
jobthread: &mut dc_jobthread_t,
|
||||
) {
|
||||
{
|
||||
jobthread.state.clone().0.lock().unwrap().jobs_needed = 1;
|
||||
}
|
||||
|
||||
dc_log_info(
|
||||
(*jobthread).context,
|
||||
0i32,
|
||||
context,
|
||||
0,
|
||||
b"Interrupting %s-IDLE...\x00" as *const u8 as *const libc::c_char,
|
||||
(*jobthread).name,
|
||||
jobthread.name,
|
||||
);
|
||||
if !(*jobthread).imap.is_null() {
|
||||
dc_imap_interrupt_idle((*jobthread).imap);
|
||||
}
|
||||
pthread_mutex_lock(&mut (*jobthread).mutex);
|
||||
(*jobthread).idle_condflag = 1i32;
|
||||
pthread_cond_signal(&mut (*jobthread).idle_cond);
|
||||
pthread_mutex_unlock(&mut (*jobthread).mutex);
|
||||
|
||||
dc_imap_interrupt_idle(&mut jobthread.imap.clone().lock().unwrap());
|
||||
|
||||
let &(ref lock, ref cvar) = &*jobthread.state.clone();
|
||||
let mut state = lock.lock().unwrap();
|
||||
|
||||
state.idle = true;
|
||||
cvar.notify_one();
|
||||
}
|
||||
pub unsafe fn dc_jobthread_fetch(mut jobthread: *mut dc_jobthread_t, mut use_network: libc::c_int) {
|
||||
let mut start: libc::clock_t = 0;
|
||||
if jobthread.is_null() {
|
||||
return;
|
||||
|
||||
pub unsafe fn dc_jobthread_fetch(
|
||||
context: &dc_context_t,
|
||||
jobthread: &mut dc_jobthread_t,
|
||||
use_network: libc::c_int,
|
||||
) {
|
||||
let mut start = 0;
|
||||
|
||||
{
|
||||
let &(ref lock, _) = &*jobthread.state.clone();
|
||||
let mut state = lock.lock().unwrap();
|
||||
|
||||
if 0 != state.suspended {
|
||||
return;
|
||||
}
|
||||
|
||||
state.using_handle = 1;
|
||||
}
|
||||
pthread_mutex_lock(&mut (*jobthread).mutex);
|
||||
if 0 != (*jobthread).suspended {
|
||||
pthread_mutex_unlock(&mut (*jobthread).mutex);
|
||||
return;
|
||||
}
|
||||
(*jobthread).using_handle = 1i32;
|
||||
pthread_mutex_unlock(&mut (*jobthread).mutex);
|
||||
if !(0 == use_network || (*jobthread).imap.is_null()) {
|
||||
|
||||
if !0 == use_network {
|
||||
start = clock();
|
||||
if !(0 == connect_to_imap(jobthread)) {
|
||||
if !(0 == connect_to_imap(context, jobthread)) {
|
||||
dc_log_info(
|
||||
(*jobthread).context,
|
||||
0i32,
|
||||
context,
|
||||
0,
|
||||
b"%s-fetch started...\x00" as *const u8 as *const libc::c_char,
|
||||
(*jobthread).name,
|
||||
jobthread.name,
|
||||
);
|
||||
dc_imap_fetch((*jobthread).imap);
|
||||
if 0 != (*(*jobthread).imap).should_reconnect {
|
||||
dc_imap_fetch(context, &mut jobthread.imap.clone().lock().unwrap());
|
||||
|
||||
if 0 != jobthread.imap.clone().lock().unwrap().should_reconnect {
|
||||
dc_log_info(
|
||||
(*jobthread).context,
|
||||
context,
|
||||
0i32,
|
||||
b"%s-fetch aborted, starting over...\x00" as *const u8 as *const libc::c_char,
|
||||
(*jobthread).name,
|
||||
jobthread.name,
|
||||
);
|
||||
dc_imap_fetch((*jobthread).imap);
|
||||
dc_imap_fetch(context, &mut jobthread.imap.clone().lock().unwrap());
|
||||
}
|
||||
dc_log_info(
|
||||
(*jobthread).context,
|
||||
0i32,
|
||||
context,
|
||||
0,
|
||||
b"%s-fetch done in %.0f ms.\x00" as *const u8 as *const libc::c_char,
|
||||
(*jobthread).name,
|
||||
jobthread.name,
|
||||
clock().wrapping_sub(start) as libc::c_double * 1000.0f64
|
||||
/ 1000000i32 as libc::c_double,
|
||||
);
|
||||
}
|
||||
}
|
||||
pthread_mutex_lock(&mut (*jobthread).mutex);
|
||||
(*jobthread).using_handle = 0i32;
|
||||
pthread_mutex_unlock(&mut (*jobthread).mutex);
|
||||
|
||||
jobthread.state.clone().0.lock().unwrap().using_handle = 0;
|
||||
}
|
||||
|
||||
/* ******************************************************************************
|
||||
* the typical fetch, idle, interrupt-idle
|
||||
******************************************************************************/
|
||||
unsafe fn connect_to_imap(mut jobthread: *mut dc_jobthread_t) -> libc::c_int {
|
||||
|
||||
unsafe fn connect_to_imap(context: &dc_context_t, jobthread: &mut dc_jobthread_t) -> libc::c_int {
|
||||
let mut ret_connected: libc::c_int = 0i32;
|
||||
let mut mvbox_name: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
if 0 != dc_imap_is_connected((*jobthread).imap) {
|
||||
ret_connected = 1i32
|
||||
|
||||
if 0 != dc_imap_is_connected(&mut jobthread.imap.clone().lock().unwrap()) {
|
||||
ret_connected = 1
|
||||
} else {
|
||||
ret_connected = dc_connect_to_configured_imap((*jobthread).context, (*jobthread).imap);
|
||||
ret_connected =
|
||||
dc_connect_to_configured_imap(context, &mut jobthread.imap.clone().lock().unwrap());
|
||||
if !(0 == ret_connected) {
|
||||
if dc_sqlite3_get_config_int(
|
||||
(*(*jobthread).context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"folders_configured\x00" as *const u8 as *const libc::c_char,
|
||||
0i32,
|
||||
) < 3i32
|
||||
0,
|
||||
) < 3
|
||||
{
|
||||
dc_configure_folders((*jobthread).context, (*jobthread).imap, 0x1i32);
|
||||
dc_configure_folders(context, &mut jobthread.imap.clone().lock().unwrap(), 0x1);
|
||||
}
|
||||
mvbox_name = dc_sqlite3_get_config(
|
||||
(*(*jobthread).context).sql,
|
||||
(*jobthread).folder_config_name,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
jobthread.folder_config_name,
|
||||
0 as *const libc::c_char,
|
||||
);
|
||||
if mvbox_name.is_null() {
|
||||
dc_imap_disconnect((*jobthread).imap);
|
||||
ret_connected = 0i32
|
||||
dc_imap_disconnect(context, &mut jobthread.imap.clone().lock().unwrap());
|
||||
ret_connected = 0;
|
||||
} else {
|
||||
dc_imap_set_watch_folder((*jobthread).imap, mvbox_name);
|
||||
dc_imap_set_watch_folder(&mut jobthread.imap.clone().lock().unwrap(), mvbox_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
free(mvbox_name as *mut libc::c_void);
|
||||
return ret_connected;
|
||||
|
||||
ret_connected
|
||||
}
|
||||
pub unsafe fn dc_jobthread_idle(mut jobthread: *mut dc_jobthread_t, mut use_network: libc::c_int) {
|
||||
if jobthread.is_null() {
|
||||
return;
|
||||
}
|
||||
pthread_mutex_lock(&mut (*jobthread).mutex);
|
||||
if 0 != (*jobthread).jobs_needed {
|
||||
dc_log_info(
|
||||
(*jobthread).context,
|
||||
0i32,
|
||||
b"%s-IDLE will not be started as it was interrupted while not ideling.\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
(*jobthread).name,
|
||||
);
|
||||
(*jobthread).jobs_needed = 0i32;
|
||||
pthread_mutex_unlock(&mut (*jobthread).mutex);
|
||||
return;
|
||||
}
|
||||
if 0 != (*jobthread).suspended {
|
||||
while (*jobthread).idle_condflag == 0i32 {
|
||||
pthread_cond_wait(&mut (*jobthread).idle_cond, &mut (*jobthread).mutex);
|
||||
|
||||
pub unsafe fn dc_jobthread_idle(
|
||||
context: &dc_context_t,
|
||||
jobthread: &mut dc_jobthread_t,
|
||||
use_network: libc::c_int,
|
||||
) {
|
||||
{
|
||||
let &(ref lock, ref cvar) = &*jobthread.state.clone();
|
||||
let mut state = lock.lock().unwrap();
|
||||
|
||||
if 0 != state.jobs_needed {
|
||||
dc_log_info(
|
||||
context,
|
||||
0,
|
||||
b"%s-IDLE will not be started as it was interrupted while not ideling.\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
jobthread.name,
|
||||
);
|
||||
state.jobs_needed = 0;
|
||||
return;
|
||||
}
|
||||
(*jobthread).idle_condflag = 0i32;
|
||||
pthread_mutex_unlock(&mut (*jobthread).mutex);
|
||||
return;
|
||||
}
|
||||
(*jobthread).using_handle = 1i32;
|
||||
pthread_mutex_unlock(&mut (*jobthread).mutex);
|
||||
if 0 == use_network || (*jobthread).imap.is_null() {
|
||||
pthread_mutex_lock(&mut (*jobthread).mutex);
|
||||
(*jobthread).using_handle = 0i32;
|
||||
while (*jobthread).idle_condflag == 0i32 {
|
||||
pthread_cond_wait(&mut (*jobthread).idle_cond, &mut (*jobthread).mutex);
|
||||
|
||||
if 0 != state.suspended {
|
||||
while !state.idle {
|
||||
state = cvar.wait(state).unwrap();
|
||||
}
|
||||
state.idle = false;
|
||||
return;
|
||||
}
|
||||
|
||||
state.using_handle = 1;
|
||||
|
||||
if 0 == use_network {
|
||||
state.using_handle = 0;
|
||||
|
||||
while !state.idle {
|
||||
state = cvar.wait(state).unwrap();
|
||||
}
|
||||
state.idle = false;
|
||||
return;
|
||||
}
|
||||
(*jobthread).idle_condflag = 0i32;
|
||||
pthread_mutex_unlock(&mut (*jobthread).mutex);
|
||||
return;
|
||||
}
|
||||
connect_to_imap(jobthread);
|
||||
|
||||
connect_to_imap(context, jobthread);
|
||||
dc_log_info(
|
||||
(*jobthread).context,
|
||||
context,
|
||||
0i32,
|
||||
b"%s-IDLE started...\x00" as *const u8 as *const libc::c_char,
|
||||
(*jobthread).name,
|
||||
jobthread.name,
|
||||
);
|
||||
dc_imap_idle((*jobthread).imap);
|
||||
dc_imap_idle(context, &mut jobthread.imap.clone().lock().unwrap());
|
||||
dc_log_info(
|
||||
(*jobthread).context,
|
||||
context,
|
||||
0i32,
|
||||
b"%s-IDLE ended.\x00" as *const u8 as *const libc::c_char,
|
||||
(*jobthread).name,
|
||||
jobthread.name,
|
||||
);
|
||||
pthread_mutex_lock(&mut (*jobthread).mutex);
|
||||
(*jobthread).using_handle = 0i32;
|
||||
pthread_mutex_unlock(&mut (*jobthread).mutex);
|
||||
|
||||
jobthread.state.clone().0.lock().unwrap().using_handle = 0;
|
||||
}
|
||||
|
||||
@@ -252,24 +252,26 @@ pub unsafe fn dc_key_equals(mut key: *const dc_key_t, mut o: *const dc_key_t) ->
|
||||
}
|
||||
}
|
||||
pub unsafe fn dc_key_save_self_keypair(
|
||||
mut public_key: *const dc_key_t,
|
||||
mut private_key: *const dc_key_t,
|
||||
mut addr: *const libc::c_char,
|
||||
mut is_default: libc::c_int,
|
||||
mut sql: &mut dc_sqlite3_t,
|
||||
context: &dc_context_t,
|
||||
public_key: *const dc_key_t,
|
||||
private_key: *const dc_key_t,
|
||||
addr: *const libc::c_char,
|
||||
is_default: libc::c_int,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
) -> libc::c_int {
|
||||
let mut success: libc::c_int = 0i32;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(public_key.is_null()
|
||||
|| private_key.is_null()
|
||||
|| addr.is_null()
|
||||
|| sql.is_null()
|
||||
|| (*public_key).binary.is_null()
|
||||
|| (*private_key).binary.is_null())
|
||||
{
|
||||
stmt =
|
||||
dc_sqlite3_prepare(sql,
|
||||
b"INSERT INTO keypairs (addr, is_default, public_key, private_key, created) VALUES (?,?,?,?,?);\x00"
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
sql,
|
||||
b"INSERT INTO keypairs (addr, is_default, public_key, private_key, created) VALUES (?,?,?,?,?);\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_text(stmt, 1i32, addr, -1i32, None);
|
||||
sqlite3_bind_int(stmt, 2i32, is_default);
|
||||
@@ -290,15 +292,17 @@ pub unsafe fn dc_key_save_self_keypair(
|
||||
return success;
|
||||
}
|
||||
pub unsafe fn dc_key_load_self_public(
|
||||
mut key: *mut dc_key_t,
|
||||
mut self_addr: *const libc::c_char,
|
||||
mut sql: &mut dc_sqlite3_t,
|
||||
context: &dc_context_t,
|
||||
key: *mut dc_key_t,
|
||||
self_addr: *const libc::c_char,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
) -> libc::c_int {
|
||||
let mut success: libc::c_int = 0i32;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(key.is_null() || self_addr.is_null() || sql.is_null()) {
|
||||
if !(key.is_null() || self_addr.is_null()) {
|
||||
dc_key_empty(key);
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
sql,
|
||||
b"SELECT public_key FROM keypairs WHERE addr=? AND is_default=1;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -313,15 +317,17 @@ pub unsafe fn dc_key_load_self_public(
|
||||
return success;
|
||||
}
|
||||
pub unsafe fn dc_key_load_self_private(
|
||||
mut key: *mut dc_key_t,
|
||||
mut self_addr: *const libc::c_char,
|
||||
mut sql: &mut dc_sqlite3_t,
|
||||
context: &dc_context_t,
|
||||
key: *mut dc_key_t,
|
||||
self_addr: *const libc::c_char,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
) -> libc::c_int {
|
||||
let mut success: libc::c_int = 0i32;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(key.is_null() || self_addr.is_null() || sql.is_null()) {
|
||||
if !(key.is_null() || self_addr.is_null()) {
|
||||
dc_key_empty(key);
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
sql,
|
||||
b"SELECT private_key FROM keypairs WHERE addr=? AND is_default=1;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -469,7 +475,7 @@ pub unsafe fn dc_key_render_asc_to_file(
|
||||
) -> libc::c_int {
|
||||
let mut success: libc::c_int = 0i32;
|
||||
let mut file_content: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
if !(key.is_null() || file.is_null() || context.is_null()) {
|
||||
if !(key.is_null() || file.is_null()) {
|
||||
file_content = dc_key_render_asc(key, 0 as *const libc::c_char);
|
||||
if !file_content.is_null() {
|
||||
if 0 == dc_write_file(
|
||||
@@ -546,12 +552,17 @@ pub unsafe fn dc_normalize_fingerprint(mut in_0: *const libc::c_char) -> *mut li
|
||||
}
|
||||
return out.buf;
|
||||
}
|
||||
pub unsafe fn dc_key_get_fingerprint(mut key: *const dc_key_t) -> *mut libc::c_char {
|
||||
pub unsafe fn dc_key_get_fingerprint(
|
||||
context: &dc_context_t,
|
||||
key: *const dc_key_t,
|
||||
) -> *mut libc::c_char {
|
||||
let mut fingerprint_buf: *mut uint8_t = 0 as *mut uint8_t;
|
||||
let mut fingerprint_bytes: size_t = 0i32 as size_t;
|
||||
let mut fingerprint_hex: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
if !key.is_null() {
|
||||
if !(0 == dc_pgp_calc_fingerprint(key, &mut fingerprint_buf, &mut fingerprint_bytes)) {
|
||||
if !(0
|
||||
== dc_pgp_calc_fingerprint(context, key, &mut fingerprint_buf, &mut fingerprint_bytes))
|
||||
{
|
||||
fingerprint_hex = dc_binary_to_uc_hex(fingerprint_buf, fingerprint_bytes)
|
||||
}
|
||||
}
|
||||
@@ -562,8 +573,11 @@ pub unsafe fn dc_key_get_fingerprint(mut key: *const dc_key_t) -> *mut libc::c_c
|
||||
dc_strdup(0 as *const libc::c_char)
|
||||
};
|
||||
}
|
||||
pub unsafe fn dc_key_get_formatted_fingerprint(mut key: *const dc_key_t) -> *mut libc::c_char {
|
||||
let mut rawhex: *mut libc::c_char = dc_key_get_fingerprint(key);
|
||||
pub unsafe fn dc_key_get_formatted_fingerprint(
|
||||
context: &dc_context_t,
|
||||
key: *const dc_key_t,
|
||||
) -> *mut libc::c_char {
|
||||
let mut rawhex: *mut libc::c_char = dc_key_get_fingerprint(context, key);
|
||||
let mut formatted: *mut libc::c_char = dc_format_fingerprint(rawhex);
|
||||
free(rawhex as *mut libc::c_void);
|
||||
return formatted;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
use libc;
|
||||
|
||||
use crate::dc_context::dc_context_t;
|
||||
use crate::dc_key::*;
|
||||
use crate::dc_sqlite3::*;
|
||||
use crate::types::*;
|
||||
@@ -54,14 +55,16 @@ pub unsafe fn dc_keyring_add(mut keyring: *mut dc_keyring_t, mut to_add: *mut dc
|
||||
(*keyring).count += 1;
|
||||
}
|
||||
pub unsafe fn dc_keyring_load_self_private_for_decrypting(
|
||||
mut keyring: *mut dc_keyring_t,
|
||||
mut self_addr: *const libc::c_char,
|
||||
mut sql: &mut dc_sqlite3_t,
|
||||
context: &dc_context_t,
|
||||
keyring: *mut dc_keyring_t,
|
||||
self_addr: *const libc::c_char,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
) -> libc::c_int {
|
||||
if keyring.is_null() || self_addr.is_null() || sql.is_null() {
|
||||
if keyring.is_null() || self_addr.is_null() {
|
||||
return 0i32;
|
||||
}
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
sql,
|
||||
b"SELECT private_key FROM keypairs ORDER BY addr=? DESC, is_default DESC;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
|
||||
@@ -51,16 +51,14 @@ pub unsafe fn dc_send_locations_to_chat(
|
||||
let mut msg: *mut dc_msg_t = 0 as *mut dc_msg_t;
|
||||
let mut stock_str: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut is_sending_locations_before: libc::c_int = 0i32;
|
||||
if !(context.is_null()
|
||||
|| (*context).magic != 0x11a11807i32 as libc::c_uint
|
||||
|| seconds < 0i32
|
||||
|| chat_id <= 9i32 as libc::c_uint)
|
||||
{
|
||||
if !(seconds < 0i32 || chat_id <= 9i32 as libc::c_uint) {
|
||||
is_sending_locations_before = dc_is_sending_locations_to_chat(context, chat_id);
|
||||
stmt =
|
||||
dc_sqlite3_prepare((*context).sql,
|
||||
b"UPDATE chats SET locations_send_begin=?, locations_send_until=? WHERE id=?\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE chats SET locations_send_begin=?, locations_send_until=? WHERE id=?\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int64(
|
||||
stmt,
|
||||
1i32,
|
||||
@@ -102,7 +100,7 @@ pub unsafe fn dc_send_locations_to_chat(
|
||||
);
|
||||
dc_add_device_msg(context, chat_id, stock_str);
|
||||
}
|
||||
((*context).cb)(
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::CHAT_MODIFIED,
|
||||
chat_id as uintptr_t,
|
||||
@@ -137,27 +135,28 @@ pub unsafe extern "C" fn dc_is_sending_locations_to_chat(
|
||||
) -> libc::c_int {
|
||||
let mut is_sending_locations: libc::c_int = 0i32;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
b"SELECT id FROM chats WHERE (? OR id=?) AND locations_send_until>?;\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(
|
||||
stmt,
|
||||
1i32,
|
||||
if chat_id == 0i32 as libc::c_uint {
|
||||
1i32
|
||||
} else {
|
||||
0i32
|
||||
},
|
||||
);
|
||||
sqlite3_bind_int(stmt, 2i32, chat_id as libc::c_int);
|
||||
sqlite3_bind_int64(stmt, 3i32, time(0 as *mut time_t) as sqlite3_int64);
|
||||
if !(sqlite3_step(stmt) != 100i32) {
|
||||
is_sending_locations = 1i32
|
||||
}
|
||||
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id FROM chats WHERE (? OR id=?) AND locations_send_until>?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(
|
||||
stmt,
|
||||
1i32,
|
||||
if chat_id == 0i32 as libc::c_uint {
|
||||
1i32
|
||||
} else {
|
||||
0i32
|
||||
},
|
||||
);
|
||||
sqlite3_bind_int(stmt, 2i32, chat_id as libc::c_int);
|
||||
sqlite3_bind_int64(stmt, 3i32, time(0 as *mut time_t) as sqlite3_int64);
|
||||
if !(sqlite3_step(stmt) != 100i32) {
|
||||
is_sending_locations = 1i32
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
return is_sending_locations;
|
||||
}
|
||||
@@ -170,14 +169,12 @@ pub unsafe fn dc_set_location(
|
||||
let mut stmt_chats: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
let mut stmt_insert: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
let mut continue_streaming: libc::c_int = 0i32;
|
||||
if context.is_null()
|
||||
|| (*context).magic != 0x11a11807i32 as libc::c_uint
|
||||
|| latitude == 0.0f64 && longitude == 0.0f64
|
||||
{
|
||||
if latitude == 0.0f64 && longitude == 0.0f64 {
|
||||
continue_streaming = 1i32
|
||||
} else {
|
||||
stmt_chats = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id FROM chats WHERE locations_send_until>?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
@@ -185,9 +182,11 @@ pub unsafe fn dc_set_location(
|
||||
while sqlite3_step(stmt_chats) == 100i32 {
|
||||
let mut chat_id: uint32_t = sqlite3_column_int(stmt_chats, 0i32) as uint32_t;
|
||||
stmt_insert =
|
||||
dc_sqlite3_prepare((*context).sql,
|
||||
b"INSERT INTO locations (latitude, longitude, accuracy, timestamp, chat_id, from_id) VALUES (?,?,?,?,?,?);\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"INSERT INTO locations (latitude, longitude, accuracy, timestamp, chat_id, from_id) VALUES (?,?,?,?,?,?);\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_double(stmt_insert, 1i32, latitude);
|
||||
sqlite3_bind_double(stmt_insert, 2i32, longitude);
|
||||
sqlite3_bind_double(stmt_insert, 3i32, accuracy);
|
||||
@@ -198,7 +197,7 @@ pub unsafe fn dc_set_location(
|
||||
continue_streaming = 1i32
|
||||
}
|
||||
if 0 != continue_streaming {
|
||||
((*context).cb)(
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::LOCATION_CHANGED,
|
||||
1i32 as uintptr_t,
|
||||
@@ -218,70 +217,71 @@ pub unsafe fn dc_get_locations(
|
||||
mut timestamp_from: time_t,
|
||||
mut timestamp_to: time_t,
|
||||
) -> *mut dc_array_t {
|
||||
let mut ret: *mut dc_array_t = dc_array_new_typed(context, 1i32, 500i32 as size_t);
|
||||
let mut ret: *mut dc_array_t = dc_array_new_typed(1i32, 500i32 as size_t);
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) {
|
||||
if timestamp_to == 0i32 as libc::c_long {
|
||||
timestamp_to = time(0 as *mut time_t) + 10i32 as libc::c_long
|
||||
}
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
b"SELECT l.id, l.latitude, l.longitude, l.accuracy, l.timestamp, l.independent \
|
||||
|
||||
if timestamp_to == 0i32 as libc::c_long {
|
||||
timestamp_to = time(0 as *mut time_t) + 10i32 as libc::c_long
|
||||
}
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT l.id, l.latitude, l.longitude, l.accuracy, l.timestamp, l.independent \
|
||||
m.id, l.from_id, l.chat_id, m.txt \
|
||||
FROM locations l LEFT JOIN msgs m ON l.id=m.location_id WHERE (? OR l.chat_id=?) \
|
||||
AND (? OR l.from_id=?) \
|
||||
AND (l.independent=1 OR (l.timestamp>=? AND l.timestamp<=?)) \
|
||||
ORDER BY l.timestamp DESC, l.id DESC, m.id DESC;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(
|
||||
stmt,
|
||||
1i32,
|
||||
if chat_id == 0i32 as libc::c_uint {
|
||||
1i32
|
||||
} else {
|
||||
0i32
|
||||
},
|
||||
);
|
||||
sqlite3_bind_int(stmt, 2i32, chat_id as libc::c_int);
|
||||
sqlite3_bind_int(
|
||||
stmt,
|
||||
3i32,
|
||||
if contact_id == 0i32 as libc::c_uint {
|
||||
1i32
|
||||
} else {
|
||||
0i32
|
||||
},
|
||||
);
|
||||
sqlite3_bind_int(stmt, 4i32, contact_id as libc::c_int);
|
||||
sqlite3_bind_int(stmt, 5i32, timestamp_from as libc::c_int);
|
||||
sqlite3_bind_int(stmt, 6i32, timestamp_to as libc::c_int);
|
||||
while sqlite3_step(stmt) == 100i32 {
|
||||
let mut loc: *mut _dc_location =
|
||||
calloc(1, ::std::mem::size_of::<_dc_location>()) as *mut _dc_location;
|
||||
if loc.is_null() {
|
||||
break;
|
||||
}
|
||||
(*loc).location_id = sqlite3_column_double(stmt, 0i32) as uint32_t;
|
||||
(*loc).latitude = sqlite3_column_double(stmt, 1i32);
|
||||
(*loc).longitude = sqlite3_column_double(stmt, 2i32);
|
||||
(*loc).accuracy = sqlite3_column_double(stmt, 3i32);
|
||||
(*loc).timestamp = sqlite3_column_int64(stmt, 4i32) as time_t;
|
||||
(*loc).independent = sqlite3_column_int(stmt, 5i32) as uint32_t;
|
||||
(*loc).msg_id = sqlite3_column_int(stmt, 6i32) as uint32_t;
|
||||
(*loc).contact_id = sqlite3_column_int(stmt, 7i32) as uint32_t;
|
||||
(*loc).chat_id = sqlite3_column_int(stmt, 8i32) as uint32_t;
|
||||
|
||||
if 0 != (*loc).msg_id {
|
||||
let mut txt: *const libc::c_char =
|
||||
sqlite3_column_text(stmt, 9i32) as *const libc::c_char;
|
||||
if 0 != is_marker(txt) {
|
||||
(*loc).marker = strdup(txt)
|
||||
}
|
||||
}
|
||||
dc_array_add_ptr(ret, loc as *mut libc::c_void);
|
||||
as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(
|
||||
stmt,
|
||||
1i32,
|
||||
if chat_id == 0i32 as libc::c_uint {
|
||||
1i32
|
||||
} else {
|
||||
0i32
|
||||
},
|
||||
);
|
||||
sqlite3_bind_int(stmt, 2i32, chat_id as libc::c_int);
|
||||
sqlite3_bind_int(
|
||||
stmt,
|
||||
3i32,
|
||||
if contact_id == 0i32 as libc::c_uint {
|
||||
1i32
|
||||
} else {
|
||||
0i32
|
||||
},
|
||||
);
|
||||
sqlite3_bind_int(stmt, 4i32, contact_id as libc::c_int);
|
||||
sqlite3_bind_int(stmt, 5i32, timestamp_from as libc::c_int);
|
||||
sqlite3_bind_int(stmt, 6i32, timestamp_to as libc::c_int);
|
||||
while sqlite3_step(stmt) == 100i32 {
|
||||
let mut loc: *mut _dc_location =
|
||||
calloc(1, ::std::mem::size_of::<_dc_location>()) as *mut _dc_location;
|
||||
if loc.is_null() {
|
||||
break;
|
||||
}
|
||||
(*loc).location_id = sqlite3_column_double(stmt, 0i32) as uint32_t;
|
||||
(*loc).latitude = sqlite3_column_double(stmt, 1i32);
|
||||
(*loc).longitude = sqlite3_column_double(stmt, 2i32);
|
||||
(*loc).accuracy = sqlite3_column_double(stmt, 3i32);
|
||||
(*loc).timestamp = sqlite3_column_int64(stmt, 4i32) as time_t;
|
||||
(*loc).independent = sqlite3_column_int(stmt, 5i32) as uint32_t;
|
||||
(*loc).msg_id = sqlite3_column_int(stmt, 6i32) as uint32_t;
|
||||
(*loc).contact_id = sqlite3_column_int(stmt, 7i32) as uint32_t;
|
||||
(*loc).chat_id = sqlite3_column_int(stmt, 8i32) as uint32_t;
|
||||
|
||||
if 0 != (*loc).msg_id {
|
||||
let mut txt: *const libc::c_char =
|
||||
sqlite3_column_text(stmt, 9i32) as *const libc::c_char;
|
||||
if 0 != is_marker(txt) {
|
||||
(*loc).marker = strdup(txt)
|
||||
}
|
||||
}
|
||||
dc_array_add_ptr(ret, loc as *mut libc::c_void);
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
return ret;
|
||||
}
|
||||
@@ -296,19 +296,20 @@ unsafe fn is_marker(mut txt: *const libc::c_char) -> libc::c_int {
|
||||
}
|
||||
pub unsafe fn dc_delete_all_locations(mut context: &dc_context_t) {
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
b"DELETE FROM locations;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_step(stmt);
|
||||
((*context).cb)(
|
||||
context,
|
||||
Event::LOCATION_CHANGED,
|
||||
0i32 as uintptr_t,
|
||||
0i32 as uintptr_t,
|
||||
);
|
||||
}
|
||||
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"DELETE FROM locations;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_step(stmt);
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::LOCATION_CHANGED,
|
||||
0i32 as uintptr_t,
|
||||
0i32 as uintptr_t,
|
||||
);
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
}
|
||||
pub unsafe fn dc_get_location_kml(
|
||||
@@ -331,30 +332,34 @@ pub unsafe fn dc_get_location_kml(
|
||||
eos: 0 as *mut libc::c_char,
|
||||
};
|
||||
dc_strbuilder_init(&mut ret, 1000i32);
|
||||
if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) {
|
||||
self_addr = dc_sqlite3_get_config(
|
||||
(*context).sql,
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
b"\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
stmt =
|
||||
dc_sqlite3_prepare((*context).sql,
|
||||
b"SELECT locations_send_begin, locations_send_until, locations_last_sent FROM chats WHERE id=?;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int);
|
||||
if !(sqlite3_step(stmt) != 100i32) {
|
||||
locations_send_begin = sqlite3_column_int64(stmt, 0i32) as time_t;
|
||||
locations_send_until = sqlite3_column_int64(stmt, 1i32) as time_t;
|
||||
locations_last_sent = sqlite3_column_int64(stmt, 2i32) as time_t;
|
||||
sqlite3_finalize(stmt);
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(locations_send_begin == 0i32 as libc::c_long || now > locations_send_until) {
|
||||
dc_strbuilder_catf(&mut ret as *mut dc_strbuilder_t,
|
||||
|
||||
self_addr = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
b"\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
stmt =
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT locations_send_begin, locations_send_until, locations_last_sent FROM chats WHERE id=?;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int);
|
||||
if !(sqlite3_step(stmt) != 100i32) {
|
||||
locations_send_begin = sqlite3_column_int64(stmt, 0i32) as time_t;
|
||||
locations_send_until = sqlite3_column_int64(stmt, 1i32) as time_t;
|
||||
locations_last_sent = sqlite3_column_int64(stmt, 2i32) as time_t;
|
||||
sqlite3_finalize(stmt);
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(locations_send_begin == 0i32 as libc::c_long || now > locations_send_until) {
|
||||
dc_strbuilder_catf(&mut ret as *mut dc_strbuilder_t,
|
||||
b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n<Document addr=\"%s\">\n\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
self_addr);
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id, latitude, longitude, accuracy, timestamp\
|
||||
FROM locations WHERE from_id=? \
|
||||
AND timestamp>=? \
|
||||
@@ -365,44 +370,41 @@ pub unsafe fn dc_get_location_kml(
|
||||
as *const libc::c_char,
|
||||
);
|
||||
|
||||
sqlite3_bind_int(stmt, 1i32, 1i32);
|
||||
sqlite3_bind_int64(stmt, 2i32, locations_send_begin as sqlite3_int64);
|
||||
sqlite3_bind_int64(stmt, 3i32, locations_last_sent as sqlite3_int64);
|
||||
sqlite3_bind_int(stmt, 4i32, 1i32);
|
||||
while sqlite3_step(stmt) == 100i32 {
|
||||
let mut location_id: uint32_t = sqlite3_column_int(stmt, 0i32) as uint32_t;
|
||||
let mut latitude: *mut libc::c_char =
|
||||
dc_ftoa(sqlite3_column_double(stmt, 1i32));
|
||||
let mut longitude: *mut libc::c_char =
|
||||
dc_ftoa(sqlite3_column_double(stmt, 2i32));
|
||||
let mut accuracy: *mut libc::c_char =
|
||||
dc_ftoa(sqlite3_column_double(stmt, 3i32));
|
||||
let mut timestamp: *mut libc::c_char =
|
||||
get_kml_timestamp(sqlite3_column_int64(stmt, 4i32) as time_t);
|
||||
dc_strbuilder_catf(&mut ret as *mut dc_strbuilder_t,
|
||||
sqlite3_bind_int(stmt, 1i32, 1i32);
|
||||
sqlite3_bind_int64(stmt, 2i32, locations_send_begin as sqlite3_int64);
|
||||
sqlite3_bind_int64(stmt, 3i32, locations_last_sent as sqlite3_int64);
|
||||
sqlite3_bind_int(stmt, 4i32, 1i32);
|
||||
while sqlite3_step(stmt) == 100i32 {
|
||||
let mut location_id: uint32_t = sqlite3_column_int(stmt, 0i32) as uint32_t;
|
||||
let mut latitude: *mut libc::c_char = dc_ftoa(sqlite3_column_double(stmt, 1i32));
|
||||
let mut longitude: *mut libc::c_char = dc_ftoa(sqlite3_column_double(stmt, 2i32));
|
||||
let mut accuracy: *mut libc::c_char = dc_ftoa(sqlite3_column_double(stmt, 3i32));
|
||||
let mut timestamp: *mut libc::c_char =
|
||||
get_kml_timestamp(sqlite3_column_int64(stmt, 4i32) as time_t);
|
||||
dc_strbuilder_catf(&mut ret as *mut dc_strbuilder_t,
|
||||
b"<Placemark><Timestamp><when>%s</when></Timestamp><Point><coordinates accuracy=\"%s\">%s,%s</coordinates></Point></Placemark>\n\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char, timestamp,
|
||||
accuracy, longitude, latitude);
|
||||
location_count += 1;
|
||||
if !last_added_location_id.is_null() {
|
||||
*last_added_location_id = location_id
|
||||
}
|
||||
free(latitude as *mut libc::c_void);
|
||||
free(longitude as *mut libc::c_void);
|
||||
free(accuracy as *mut libc::c_void);
|
||||
free(timestamp as *mut libc::c_void);
|
||||
}
|
||||
if !(location_count == 0i32) {
|
||||
dc_strbuilder_cat(
|
||||
&mut ret,
|
||||
b"</Document>\n</kml>\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
success = 1i32
|
||||
location_count += 1;
|
||||
if !last_added_location_id.is_null() {
|
||||
*last_added_location_id = location_id
|
||||
}
|
||||
free(latitude as *mut libc::c_void);
|
||||
free(longitude as *mut libc::c_void);
|
||||
free(accuracy as *mut libc::c_void);
|
||||
free(timestamp as *mut libc::c_void);
|
||||
}
|
||||
if !(location_count == 0i32) {
|
||||
dc_strbuilder_cat(
|
||||
&mut ret,
|
||||
b"</Document>\n</kml>\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
success = 1i32
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
free(self_addr as *mut libc::c_void);
|
||||
if 0 == success {
|
||||
@@ -449,15 +451,10 @@ unsafe fn get_kml_timestamp(mut utc: time_t) -> *mut libc::c_char {
|
||||
}
|
||||
|
||||
pub unsafe fn dc_get_message_kml(
|
||||
context: &dc_context_t,
|
||||
timestamp: time_t,
|
||||
latitude: libc::c_double,
|
||||
longitude: libc::c_double,
|
||||
) -> *mut libc::c_char {
|
||||
if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) {
|
||||
return std::ptr::null_mut();
|
||||
}
|
||||
|
||||
let timestamp_str = get_kml_timestamp(timestamp);
|
||||
let latitude_str = dc_ftoa(latitude);
|
||||
let longitude_str = dc_ftoa(longitude);
|
||||
@@ -485,13 +482,14 @@ pub unsafe fn dc_get_message_kml(
|
||||
}
|
||||
|
||||
pub unsafe fn dc_set_kml_sent_timestamp(
|
||||
mut context: &dc_context_t,
|
||||
mut chat_id: uint32_t,
|
||||
mut timestamp: time_t,
|
||||
context: &dc_context_t,
|
||||
chat_id: uint32_t,
|
||||
timestamp: time_t,
|
||||
) {
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE chats SET locations_last_sent=? WHERE id=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
@@ -507,7 +505,8 @@ pub unsafe fn dc_set_msg_location_id(
|
||||
) {
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE msgs SET location_id=? WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int64(stmt, 1i32, location_id as sqlite3_int64);
|
||||
@@ -526,18 +525,16 @@ pub unsafe fn dc_save_locations(
|
||||
let mut stmt_insert: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
let mut newest_timestamp: time_t = 0i32 as time_t;
|
||||
let mut newest_location_id: uint32_t = 0i32 as uint32_t;
|
||||
if !(context.is_null()
|
||||
|| (*context).magic != 0x11a11807i32 as libc::c_uint
|
||||
|| chat_id <= 9i32 as libc::c_uint
|
||||
|| locations.is_null())
|
||||
{
|
||||
if !(chat_id <= 9i32 as libc::c_uint || locations.is_null()) {
|
||||
stmt_test = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id FROM locations WHERE timestamp=? AND from_id=?\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
stmt_insert = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"INSERT INTO locations\
|
||||
(timestamp, from_id, chat_id, latitude, longitude, accuracy, independent) \
|
||||
VALUES (?,?,?,?,?,?,?);\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -563,7 +560,8 @@ pub unsafe fn dc_save_locations(
|
||||
if (*location).timestamp > newest_timestamp {
|
||||
newest_timestamp = (*location).timestamp;
|
||||
newest_location_id = dc_sqlite3_get_rowid2(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"locations\x00" as *const u8 as *const libc::c_char,
|
||||
b"timestamp\x00" as *const u8 as *const libc::c_char,
|
||||
(*location).timestamp as uint64_t,
|
||||
@@ -591,33 +589,34 @@ pub unsafe fn dc_kml_parse(
|
||||
text_cb: None,
|
||||
userdata: 0 as *mut libc::c_void,
|
||||
};
|
||||
if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) {
|
||||
if content_bytes > (1 * 1024 * 1024) {
|
||||
dc_log_warning(
|
||||
context,
|
||||
0,
|
||||
b"A kml-files with %i bytes is larger than reasonably expected.\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
content_bytes,
|
||||
|
||||
if content_bytes > (1 * 1024 * 1024) {
|
||||
dc_log_warning(
|
||||
context,
|
||||
0,
|
||||
b"A kml-files with %i bytes is larger than reasonably expected.\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
content_bytes,
|
||||
);
|
||||
} else {
|
||||
content_nullterminated = dc_null_terminate(content, content_bytes as libc::c_int);
|
||||
if !content_nullterminated.is_null() {
|
||||
(*kml).locations = dc_array_new_typed(1, 100 as size_t);
|
||||
dc_saxparser_init(&mut saxparser, kml as *mut libc::c_void);
|
||||
dc_saxparser_set_tag_handler(
|
||||
&mut saxparser,
|
||||
Some(kml_starttag_cb),
|
||||
Some(kml_endtag_cb),
|
||||
);
|
||||
} else {
|
||||
content_nullterminated = dc_null_terminate(content, content_bytes as libc::c_int);
|
||||
if !content_nullterminated.is_null() {
|
||||
(*kml).locations = dc_array_new_typed(context, 1, 100 as size_t);
|
||||
dc_saxparser_init(&mut saxparser, kml as *mut libc::c_void);
|
||||
dc_saxparser_set_tag_handler(
|
||||
&mut saxparser,
|
||||
Some(kml_starttag_cb),
|
||||
Some(kml_endtag_cb),
|
||||
);
|
||||
dc_saxparser_set_text_handler(&mut saxparser, Some(kml_text_cb));
|
||||
dc_saxparser_parse(&mut saxparser, content_nullterminated);
|
||||
}
|
||||
dc_saxparser_set_text_handler(&mut saxparser, Some(kml_text_cb));
|
||||
dc_saxparser_parse(&mut saxparser, content_nullterminated);
|
||||
}
|
||||
}
|
||||
|
||||
free(content_nullterminated as *mut libc::c_void);
|
||||
return kml;
|
||||
}
|
||||
|
||||
unsafe fn kml_text_cb(userdata: *mut libc::c_void, text: *const libc::c_char, _len: libc::c_int) {
|
||||
let mut kml: *mut dc_kml_t = userdata as *mut dc_kml_t;
|
||||
if 0 != (*kml).tag & (0x4 | 0x10) {
|
||||
@@ -774,7 +773,8 @@ pub unsafe fn dc_job_do_DC_JOB_MAYBE_SEND_LOCATIONS(context: &dc_context_t, _job
|
||||
as *const libc::c_char,
|
||||
);
|
||||
stmt_chats = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id, locations_send_begin, locations_last_sent\
|
||||
FROM chats\
|
||||
WHERE locations_send_until>?;\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -791,7 +791,8 @@ pub unsafe fn dc_job_do_DC_JOB_MAYBE_SEND_LOCATIONS(context: &dc_context_t, _job
|
||||
}
|
||||
if stmt_locations.is_null() {
|
||||
stmt_locations = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id \
|
||||
FROM locations \
|
||||
WHERE from_id=? \
|
||||
@@ -842,10 +843,11 @@ pub unsafe fn dc_job_do_DC_JOB_MAYBE_SEND_LOC_ENDED(
|
||||
let mut chat_id: uint32_t = (*job).foreign_id;
|
||||
let mut locations_send_begin: time_t = 0i32 as time_t;
|
||||
let mut locations_send_until: time_t = 0i32 as time_t;
|
||||
let mut stmt: &sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
let mut stmt = 0 as *mut sqlite3_stmt;
|
||||
let mut stock_str: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT locations_send_begin, locations_send_until FROM chats WHERE id=?\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -866,10 +868,12 @@ pub unsafe fn dc_job_do_DC_JOB_MAYBE_SEND_LOC_ENDED(
|
||||
{
|
||||
// not streaming, device-message already sent
|
||||
stmt =
|
||||
dc_sqlite3_prepare((*context).sql,
|
||||
b"UPDATE chats SET locations_send_begin=0, locations_send_until=0 WHERE id=?\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE chats SET locations_send_begin=0, locations_send_until=0 WHERE id=?\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int);
|
||||
sqlite3_step(stmt);
|
||||
stock_str = dc_stock_system_msg(
|
||||
@@ -880,7 +884,7 @@ pub unsafe fn dc_job_do_DC_JOB_MAYBE_SEND_LOC_ENDED(
|
||||
0i32 as uint32_t,
|
||||
);
|
||||
dc_add_device_msg(context, chat_id, stock_str);
|
||||
((*context).cb)(
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::CHAT_MODIFIED,
|
||||
chat_id as uintptr_t,
|
||||
|
||||
@@ -30,9 +30,6 @@ unsafe fn log_vprintf(
|
||||
mut va_0: ::std::ffi::VaList,
|
||||
) {
|
||||
let mut msg: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
if context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint {
|
||||
return;
|
||||
}
|
||||
if !msg_format.is_null() {
|
||||
let mut tempbuf: [libc::c_char; 1025] = [0; 1025];
|
||||
vsnprintf(
|
||||
@@ -58,10 +55,7 @@ pub unsafe extern "C" fn dc_log_event_seq(
|
||||
mut msg: *const libc::c_char,
|
||||
mut va_0: ...
|
||||
) {
|
||||
if context.is_null()
|
||||
|| sequence_start.is_null()
|
||||
|| (*context).magic != 0x11a11807i32 as libc::c_uint
|
||||
{
|
||||
if sequence_start.is_null() {
|
||||
return;
|
||||
}
|
||||
log_vprintf(context, event_code, *sequence_start, msg, va_0);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
use libc;
|
||||
|
||||
use crate::dc_context::dc_context_t;
|
||||
use crate::dc_sqlite3::*;
|
||||
use crate::dc_strbuilder::*;
|
||||
use crate::dc_tools::*;
|
||||
@@ -60,9 +61,10 @@ pub unsafe fn dc_loginparam_empty(mut loginparam: *mut dc_loginparam_t) {
|
||||
(*loginparam).server_flags = 0i32;
|
||||
}
|
||||
pub unsafe fn dc_loginparam_read(
|
||||
mut loginparam: *mut dc_loginparam_t,
|
||||
mut sql: &mut dc_sqlite3_t,
|
||||
mut prefix: *const libc::c_char,
|
||||
context: &dc_context_t,
|
||||
loginparam: *mut dc_loginparam_t,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
prefix: *const libc::c_char,
|
||||
) {
|
||||
let mut key: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
dc_loginparam_empty(loginparam);
|
||||
@@ -72,76 +74,77 @@ pub unsafe fn dc_loginparam_read(
|
||||
prefix,
|
||||
b"addr\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
(*loginparam).addr = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char);
|
||||
(*loginparam).addr = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"mail_server\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
(*loginparam).mail_server = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char);
|
||||
(*loginparam).mail_server = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"mail_port\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
(*loginparam).mail_port = dc_sqlite3_get_config_int(sql, key, 0i32);
|
||||
(*loginparam).mail_port = dc_sqlite3_get_config_int(context, sql, key, 0i32);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"mail_user\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
(*loginparam).mail_user = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char);
|
||||
(*loginparam).mail_user = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"mail_pw\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
(*loginparam).mail_pw = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char);
|
||||
(*loginparam).mail_pw = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"send_server\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
(*loginparam).send_server = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char);
|
||||
(*loginparam).send_server = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"send_port\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
(*loginparam).send_port = dc_sqlite3_get_config_int(sql, key, 0i32);
|
||||
(*loginparam).send_port = dc_sqlite3_get_config_int(context, sql, key, 0i32);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"send_user\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
(*loginparam).send_user = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char);
|
||||
(*loginparam).send_user = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"send_pw\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
(*loginparam).send_pw = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char);
|
||||
(*loginparam).send_pw = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"server_flags\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
(*loginparam).server_flags = dc_sqlite3_get_config_int(sql, key, 0i32);
|
||||
(*loginparam).server_flags = dc_sqlite3_get_config_int(context, sql, key, 0i32);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
}
|
||||
pub unsafe fn dc_loginparam_write(
|
||||
mut loginparam: *const dc_loginparam_t,
|
||||
mut sql: &mut dc_sqlite3_t,
|
||||
mut prefix: *const libc::c_char,
|
||||
context: &dc_context_t,
|
||||
loginparam: *const dc_loginparam_t,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
prefix: *const libc::c_char,
|
||||
) {
|
||||
let mut key: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
@@ -150,70 +153,70 @@ pub unsafe fn dc_loginparam_write(
|
||||
prefix,
|
||||
b"addr\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_set_config(sql, key, (*loginparam).addr);
|
||||
dc_sqlite3_set_config(context, sql, key, (*loginparam).addr);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"mail_server\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_set_config(sql, key, (*loginparam).mail_server);
|
||||
dc_sqlite3_set_config(context, sql, key, (*loginparam).mail_server);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"mail_port\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_set_config_int(sql, key, (*loginparam).mail_port);
|
||||
dc_sqlite3_set_config_int(context, sql, key, (*loginparam).mail_port);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"mail_user\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_set_config(sql, key, (*loginparam).mail_user);
|
||||
dc_sqlite3_set_config(context, sql, key, (*loginparam).mail_user);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"mail_pw\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_set_config(sql, key, (*loginparam).mail_pw);
|
||||
dc_sqlite3_set_config(context, sql, key, (*loginparam).mail_pw);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"send_server\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_set_config(sql, key, (*loginparam).send_server);
|
||||
dc_sqlite3_set_config(context, sql, key, (*loginparam).send_server);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"send_port\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_set_config_int(sql, key, (*loginparam).send_port);
|
||||
dc_sqlite3_set_config_int(context, sql, key, (*loginparam).send_port);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"send_user\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_set_config(sql, key, (*loginparam).send_user);
|
||||
dc_sqlite3_set_config(context, sql, key, (*loginparam).send_user);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"send_pw\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_set_config(sql, key, (*loginparam).send_pw);
|
||||
dc_sqlite3_set_config(context, sql, key, (*loginparam).send_pw);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
key = sqlite3_mprintf(
|
||||
b"%s%s\x00" as *const u8 as *const libc::c_char,
|
||||
prefix,
|
||||
b"server_flags\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_set_config_int(sql, key, (*loginparam).server_flags);
|
||||
dc_sqlite3_set_config_int(context, sql, key, (*loginparam).server_flags);
|
||||
sqlite3_free(key as *mut libc::c_void);
|
||||
}
|
||||
pub unsafe fn dc_loginparam_get_readable(
|
||||
|
||||
@@ -51,7 +51,7 @@ pub unsafe fn dc_mimefactory_init<'a>(
|
||||
factory: *mut dc_mimefactory_t<'a>,
|
||||
context: &'a dc_context_t,
|
||||
) {
|
||||
if factory.is_null() || context.is_null() {
|
||||
if factory.is_null() {
|
||||
return;
|
||||
}
|
||||
memset(
|
||||
@@ -105,16 +105,11 @@ pub unsafe fn dc_mimefactory_load_msg(
|
||||
mut factory: *mut dc_mimefactory_t,
|
||||
mut msg_id: uint32_t,
|
||||
) -> libc::c_int {
|
||||
let mut context: *mut dc_context_t = 0 as *mut dc_context_t;
|
||||
let mut success: libc::c_int = 0i32;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(factory.is_null()
|
||||
|| msg_id <= 9i32 as libc::c_uint
|
||||
|| (*factory).context.is_null()
|
||||
|| !(*factory).msg.is_null())
|
||||
{
|
||||
if !(factory.is_null() || msg_id <= 9i32 as libc::c_uint || !(*factory).msg.is_null()) {
|
||||
/*call empty() before */
|
||||
context = (*factory).context;
|
||||
let context = (*factory).context;
|
||||
(*factory).recipients_names = clist_new();
|
||||
(*factory).recipients_addr = clist_new();
|
||||
(*factory).msg = dc_msg_new_untyped(context);
|
||||
@@ -128,7 +123,7 @@ pub unsafe fn dc_mimefactory_load_msg(
|
||||
clist_insert_after(
|
||||
(*factory).recipients_names,
|
||||
(*(*factory).recipients_names).last,
|
||||
dc_strdup_keep_null((*factory).from_displayname) as &libc::c_void,
|
||||
dc_strdup_keep_null((*factory).from_displayname) as *mut libc::c_void,
|
||||
);
|
||||
clist_insert_after(
|
||||
(*factory).recipients_addr,
|
||||
@@ -137,10 +132,12 @@ pub unsafe fn dc_mimefactory_load_msg(
|
||||
);
|
||||
} else {
|
||||
stmt =
|
||||
dc_sqlite3_prepare((*context).sql,
|
||||
b"SELECT c.authname, c.addr FROM chats_contacts cc LEFT JOIN contacts c ON cc.contact_id=c.id WHERE cc.chat_id=? AND cc.contact_id>9;\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT c.authname, c.addr FROM chats_contacts cc LEFT JOIN contacts c ON cc.contact_id=c.id WHERE cc.chat_id=? AND cc.contact_id>9;\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
sqlite3_bind_int(stmt, 1i32, (*(*factory).msg).chat_id as libc::c_int);
|
||||
while sqlite3_step(stmt) == 100i32 {
|
||||
let mut authname: *const libc::c_char =
|
||||
@@ -176,7 +173,8 @@ pub unsafe fn dc_mimefactory_load_msg(
|
||||
0 as *const libc::c_char,
|
||||
);
|
||||
let mut self_addr: *mut libc::c_char = dc_sqlite3_get_config(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
b"\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -202,7 +200,8 @@ pub unsafe fn dc_mimefactory_load_msg(
|
||||
if command != 6i32
|
||||
&& command != 7i32
|
||||
&& 0 != dc_sqlite3_get_config_int(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"mdns_enabled\x00" as *const u8 as *const libc::c_char,
|
||||
1i32,
|
||||
)
|
||||
@@ -211,7 +210,8 @@ pub unsafe fn dc_mimefactory_load_msg(
|
||||
}
|
||||
}
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT mime_in_reply_to, mime_references FROM msgs WHERE id=?\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
@@ -238,17 +238,20 @@ pub unsafe fn dc_mimefactory_load_msg(
|
||||
}
|
||||
unsafe fn load_from(mut factory: *mut dc_mimefactory_t) {
|
||||
(*factory).from_addr = dc_sqlite3_get_config(
|
||||
(*(*factory).context).sql,
|
||||
(*factory).context,
|
||||
&mut (*factory).context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
);
|
||||
(*factory).from_displayname = dc_sqlite3_get_config(
|
||||
(*(*factory).context).sql,
|
||||
(*factory).context,
|
||||
&mut (*factory).context.sql.clone().lock().unwrap(),
|
||||
b"displayname\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
);
|
||||
(*factory).selfstatus = dc_sqlite3_get_config(
|
||||
(*(*factory).context).sql,
|
||||
(*factory).context,
|
||||
&mut (*factory).context.sql.clone().lock().unwrap(),
|
||||
b"selfstatus\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
);
|
||||
@@ -268,7 +271,8 @@ pub unsafe fn dc_mimefactory_load_mdn(
|
||||
(*factory).msg = dc_msg_new_untyped((*factory).context);
|
||||
if !(0
|
||||
== dc_sqlite3_get_config_int(
|
||||
(*(*factory).context).sql,
|
||||
(*factory).context,
|
||||
&mut (*factory).context.sql.clone().lock().unwrap(),
|
||||
b"mdns_enabled\x00" as *const u8 as *const libc::c_char,
|
||||
1i32,
|
||||
))
|
||||
@@ -278,7 +282,7 @@ pub unsafe fn dc_mimefactory_load_mdn(
|
||||
if !(0 == dc_msg_load_from_db((*factory).msg, (*factory).context, msg_id)
|
||||
|| 0 == dc_contact_load_from_db(
|
||||
contact,
|
||||
(*(*factory).context).sql,
|
||||
&mut (*factory).context.sql.clone().lock().unwrap(),
|
||||
(*(*factory).msg).from_id,
|
||||
))
|
||||
{
|
||||
@@ -858,12 +862,8 @@ pub unsafe fn dc_mimefactory_render(mut factory: *mut dc_mimefactory_t) -> libc:
|
||||
DC_PARAM_SET_LONGITUDE as libc::c_int,
|
||||
0.0,
|
||||
);
|
||||
let kml_file = dc_get_message_kml(
|
||||
(*msg).context,
|
||||
(*msg).timestamp_sort,
|
||||
latitude,
|
||||
longitude,
|
||||
);
|
||||
let kml_file =
|
||||
dc_get_message_kml((*msg).timestamp_sort, latitude, longitude);
|
||||
if !kml_file.is_null() {
|
||||
let content_type = mailmime_content_new_with_str(
|
||||
b"application/vnd.google-earth.kml+xml\x00" as *const u8
|
||||
@@ -1057,11 +1057,7 @@ unsafe fn get_subject(
|
||||
mut msg: *const dc_msg_t,
|
||||
mut afwd_email: libc::c_int,
|
||||
) -> *mut libc::c_char {
|
||||
let mut context: *mut dc_context_t = if !chat.is_null() {
|
||||
(*chat).context
|
||||
} else {
|
||||
std::ptr::null_mut()
|
||||
};
|
||||
let context = (*chat).context;
|
||||
let mut ret: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut raw_subject: *mut libc::c_char =
|
||||
dc_msg_get_summarytext_by_raw((*msg).type_0, (*msg).text, (*msg).param, 32i32, context);
|
||||
|
||||
@@ -35,7 +35,7 @@ pub struct dc_mimepart_t {
|
||||
*/
|
||||
#[derive(Copy, Clone)]
|
||||
#[repr(C)]
|
||||
pub struct dc_mimeparser_t {
|
||||
pub struct dc_mimeparser_t<'a> {
|
||||
pub parts: *mut carray,
|
||||
pub mimeroot: *mut mailmime,
|
||||
pub header: dc_hash_t,
|
||||
@@ -47,7 +47,7 @@ pub struct dc_mimeparser_t {
|
||||
pub e2ee_helper: *mut dc_e2ee_helper_t,
|
||||
pub blobdir: *const libc::c_char,
|
||||
pub is_forwarded: libc::c_int,
|
||||
pub context: *mut dc_context_t,
|
||||
pub context: &'a dc_context_t,
|
||||
pub reports: *mut carray,
|
||||
pub is_system_message: libc::c_int,
|
||||
pub location_kml: *mut dc_kml_t,
|
||||
@@ -61,8 +61,8 @@ pub unsafe fn dc_no_compound_msgs() {
|
||||
// deprecated: flag to switch generation of compound messages on and off.
|
||||
static mut s_generate_compound_msgs: libc::c_int = 1i32;
|
||||
pub unsafe fn dc_mimeparser_new(
|
||||
mut blobdir: *const libc::c_char,
|
||||
mut context: &dc_context_t,
|
||||
blobdir: *const libc::c_char,
|
||||
context: &dc_context_t,
|
||||
) -> *mut dc_mimeparser_t {
|
||||
let mut mimeparser: *mut dc_mimeparser_t = 0 as *mut dc_mimeparser_t;
|
||||
mimeparser = calloc(1, ::std::mem::size_of::<dc_mimeparser_t>()) as *mut dc_mimeparser_t;
|
||||
|
||||
@@ -15,7 +15,8 @@ pub unsafe fn dc_do_heuristics_moves(
|
||||
let mut msg: *mut dc_msg_t = 0 as *mut dc_msg_t;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(dc_sqlite3_get_config_int(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"mvbox_move\x00" as *const u8 as *const libc::c_char,
|
||||
1i32,
|
||||
) == 0i32)
|
||||
|
||||
587
src/dc_msg.rs
587
src/dc_msg.rs
@@ -67,225 +67,224 @@ pub unsafe fn dc_get_msg_info(
|
||||
eos: 0 as *mut libc::c_char,
|
||||
};
|
||||
dc_strbuilder_init(&mut ret, 0i32);
|
||||
if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) {
|
||||
dc_msg_load_from_db(msg, context, msg_id);
|
||||
dc_contact_load_from_db(contact_from, (*context).sql, (*msg).from_id);
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
b"SELECT txt_raw FROM msgs WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
|
||||
dc_msg_load_from_db(msg, context, msg_id);
|
||||
dc_contact_load_from_db(
|
||||
contact_from,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
(*msg).from_id,
|
||||
);
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT txt_raw FROM msgs WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(stmt, 1i32, msg_id as libc::c_int);
|
||||
if sqlite3_step(stmt) != 100i32 {
|
||||
p = dc_mprintf(
|
||||
b"Cannot load message #%i.\x00" as *const u8 as *const libc::c_char,
|
||||
msg_id as libc::c_int,
|
||||
);
|
||||
sqlite3_bind_int(stmt, 1i32, msg_id as libc::c_int);
|
||||
if sqlite3_step(stmt) != 100i32 {
|
||||
p = dc_mprintf(
|
||||
b"Cannot load message #%i.\x00" as *const u8 as *const libc::c_char,
|
||||
msg_id as libc::c_int,
|
||||
dc_strbuilder_cat(&mut ret, p);
|
||||
free(p as *mut libc::c_void);
|
||||
} else {
|
||||
rawtxt = dc_strdup(sqlite3_column_text(stmt, 0i32) as *mut libc::c_char);
|
||||
sqlite3_finalize(stmt);
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
dc_trim(rawtxt);
|
||||
dc_truncate_str(rawtxt, 100000i32);
|
||||
dc_strbuilder_cat(&mut ret, b"Sent: \x00" as *const u8 as *const libc::c_char);
|
||||
p = dc_timestamp_to_str(dc_msg_get_timestamp(msg));
|
||||
dc_strbuilder_cat(&mut ret, p);
|
||||
free(p as *mut libc::c_void);
|
||||
p = dc_contact_get_name_n_addr(contact_from);
|
||||
dc_strbuilder_catf(
|
||||
&mut ret as *mut dc_strbuilder_t,
|
||||
b" by %s\x00" as *const u8 as *const libc::c_char,
|
||||
p,
|
||||
);
|
||||
free(p as *mut libc::c_void);
|
||||
dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char);
|
||||
if (*msg).from_id != 1i32 as libc::c_uint {
|
||||
dc_strbuilder_cat(
|
||||
&mut ret,
|
||||
b"Received: \x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
p = dc_timestamp_to_str(if 0 != (*msg).timestamp_rcvd {
|
||||
(*msg).timestamp_rcvd
|
||||
} else {
|
||||
(*msg).timestamp_sort
|
||||
});
|
||||
dc_strbuilder_cat(&mut ret, p);
|
||||
free(p as *mut libc::c_void);
|
||||
} else {
|
||||
rawtxt = dc_strdup(sqlite3_column_text(stmt, 0i32) as *mut libc::c_char);
|
||||
dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char);
|
||||
}
|
||||
if !((*msg).from_id == 2i32 as libc::c_uint || (*msg).to_id == 2i32 as libc::c_uint) {
|
||||
// device-internal message, no further details needed
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT contact_id, timestamp_sent FROM msgs_mdns WHERE msg_id=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(stmt, 1i32, msg_id as libc::c_int);
|
||||
while sqlite3_step(stmt) == 100i32 {
|
||||
dc_strbuilder_cat(&mut ret, b"Read: \x00" as *const u8 as *const libc::c_char);
|
||||
p = dc_timestamp_to_str(sqlite3_column_int64(stmt, 1i32) as time_t);
|
||||
dc_strbuilder_cat(&mut ret, p);
|
||||
free(p as *mut libc::c_void);
|
||||
dc_strbuilder_cat(&mut ret, b" by \x00" as *const u8 as *const libc::c_char);
|
||||
let mut contact: *mut dc_contact_t = dc_contact_new(context);
|
||||
dc_contact_load_from_db(
|
||||
contact,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
sqlite3_column_int64(stmt, 0i32) as uint32_t,
|
||||
);
|
||||
p = dc_contact_get_name_n_addr(contact);
|
||||
dc_strbuilder_cat(&mut ret, p);
|
||||
free(p as *mut libc::c_void);
|
||||
dc_contact_unref(contact);
|
||||
dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char);
|
||||
}
|
||||
sqlite3_finalize(stmt);
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
dc_trim(rawtxt);
|
||||
dc_truncate_str(rawtxt, 100000i32);
|
||||
dc_strbuilder_cat(&mut ret, b"Sent: \x00" as *const u8 as *const libc::c_char);
|
||||
p = dc_timestamp_to_str(dc_msg_get_timestamp(msg));
|
||||
dc_strbuilder_cat(&mut ret, p);
|
||||
free(p as *mut libc::c_void);
|
||||
p = dc_contact_get_name_n_addr(contact_from);
|
||||
p = 0 as *mut libc::c_char;
|
||||
match (*msg).state {
|
||||
10 => p = dc_strdup(b"Fresh\x00" as *const u8 as *const libc::c_char),
|
||||
13 => p = dc_strdup(b"Noticed\x00" as *const u8 as *const libc::c_char),
|
||||
16 => p = dc_strdup(b"Seen\x00" as *const u8 as *const libc::c_char),
|
||||
26 => p = dc_strdup(b"Delivered\x00" as *const u8 as *const libc::c_char),
|
||||
24 => p = dc_strdup(b"Failed\x00" as *const u8 as *const libc::c_char),
|
||||
28 => p = dc_strdup(b"Read\x00" as *const u8 as *const libc::c_char),
|
||||
20 => p = dc_strdup(b"Pending\x00" as *const u8 as *const libc::c_char),
|
||||
18 => p = dc_strdup(b"Preparing\x00" as *const u8 as *const libc::c_char),
|
||||
_ => p = dc_mprintf(b"%i\x00" as *const u8 as *const libc::c_char, (*msg).state),
|
||||
}
|
||||
dc_strbuilder_catf(
|
||||
&mut ret as *mut dc_strbuilder_t,
|
||||
b" by %s\x00" as *const u8 as *const libc::c_char,
|
||||
b"State: %s\x00" as *const u8 as *const libc::c_char,
|
||||
p,
|
||||
);
|
||||
free(p as *mut libc::c_void);
|
||||
dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char);
|
||||
if (*msg).from_id != 1i32 as libc::c_uint {
|
||||
if 0 != dc_msg_has_location(msg) {
|
||||
dc_strbuilder_cat(
|
||||
&mut ret,
|
||||
b"Received: \x00" as *const u8 as *const libc::c_char,
|
||||
b", Location sent\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
p = dc_timestamp_to_str(if 0 != (*msg).timestamp_rcvd {
|
||||
(*msg).timestamp_rcvd
|
||||
} else {
|
||||
(*msg).timestamp_sort
|
||||
});
|
||||
dc_strbuilder_cat(&mut ret, p);
|
||||
free(p as *mut libc::c_void);
|
||||
dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char);
|
||||
}
|
||||
if !((*msg).from_id == 2i32 as libc::c_uint || (*msg).to_id == 2i32 as libc::c_uint) {
|
||||
// device-internal message, no further details needed
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
b"SELECT contact_id, timestamp_sent FROM msgs_mdns WHERE msg_id=?;\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(stmt, 1i32, msg_id as libc::c_int);
|
||||
while sqlite3_step(stmt) == 100i32 {
|
||||
dc_strbuilder_cat(&mut ret, b"Read: \x00" as *const u8 as *const libc::c_char);
|
||||
p = dc_timestamp_to_str(sqlite3_column_int64(stmt, 1i32) as time_t);
|
||||
dc_strbuilder_cat(&mut ret, p);
|
||||
free(p as *mut libc::c_void);
|
||||
dc_strbuilder_cat(&mut ret, b" by \x00" as *const u8 as *const libc::c_char);
|
||||
let mut contact: *mut dc_contact_t = dc_contact_new(context);
|
||||
dc_contact_load_from_db(
|
||||
contact,
|
||||
(*context).sql,
|
||||
sqlite3_column_int64(stmt, 0i32) as uint32_t,
|
||||
);
|
||||
p = dc_contact_get_name_n_addr(contact);
|
||||
dc_strbuilder_cat(&mut ret, p);
|
||||
free(p as *mut libc::c_void);
|
||||
dc_contact_unref(contact);
|
||||
dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char);
|
||||
p = 0 as *mut libc::c_char;
|
||||
e2ee_errors = 0;
|
||||
e2ee_errors = dc_param_get_int((*msg).param, 'e' as i32, 0i32);
|
||||
if 0 != e2ee_errors {
|
||||
if 0 != e2ee_errors & 0x2i32 {
|
||||
p = dc_strdup(
|
||||
b"Encrypted, no valid signature\x00" as *const u8 as *const libc::c_char,
|
||||
)
|
||||
}
|
||||
sqlite3_finalize(stmt);
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
} else if 0 != dc_param_get_int((*msg).param, 'c' as i32, 0i32) {
|
||||
p = dc_strdup(b"Encrypted\x00" as *const u8 as *const libc::c_char)
|
||||
}
|
||||
if !p.is_null() {
|
||||
dc_strbuilder_catf(
|
||||
&mut ret as *mut dc_strbuilder_t,
|
||||
b", %s\x00" as *const u8 as *const libc::c_char,
|
||||
p,
|
||||
);
|
||||
free(p as *mut libc::c_void);
|
||||
}
|
||||
dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char);
|
||||
p = dc_param_get((*msg).param, 'L' as i32, 0 as *const libc::c_char);
|
||||
if !p.is_null() {
|
||||
dc_strbuilder_catf(
|
||||
&mut ret as *mut dc_strbuilder_t,
|
||||
b"Error: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
p,
|
||||
);
|
||||
free(p as *mut libc::c_void);
|
||||
}
|
||||
p = dc_msg_get_file(msg);
|
||||
if !p.is_null() && 0 != *p.offset(0isize) as libc::c_int {
|
||||
dc_strbuilder_catf(
|
||||
&mut ret as *mut dc_strbuilder_t,
|
||||
b"\nFile: %s, %i bytes\n\x00" as *const u8 as *const libc::c_char,
|
||||
p,
|
||||
dc_get_filebytes(context, p) as libc::c_int,
|
||||
);
|
||||
}
|
||||
free(p as *mut libc::c_void);
|
||||
if (*msg).type_0 != 10i32 {
|
||||
p = 0 as *mut libc::c_char;
|
||||
match (*msg).state {
|
||||
10 => p = dc_strdup(b"Fresh\x00" as *const u8 as *const libc::c_char),
|
||||
13 => p = dc_strdup(b"Noticed\x00" as *const u8 as *const libc::c_char),
|
||||
16 => p = dc_strdup(b"Seen\x00" as *const u8 as *const libc::c_char),
|
||||
26 => p = dc_strdup(b"Delivered\x00" as *const u8 as *const libc::c_char),
|
||||
24 => p = dc_strdup(b"Failed\x00" as *const u8 as *const libc::c_char),
|
||||
28 => p = dc_strdup(b"Read\x00" as *const u8 as *const libc::c_char),
|
||||
20 => p = dc_strdup(b"Pending\x00" as *const u8 as *const libc::c_char),
|
||||
18 => p = dc_strdup(b"Preparing\x00" as *const u8 as *const libc::c_char),
|
||||
match (*msg).type_0 {
|
||||
40 => p = dc_strdup(b"Audio\x00" as *const u8 as *const libc::c_char),
|
||||
60 => p = dc_strdup(b"File\x00" as *const u8 as *const libc::c_char),
|
||||
21 => p = dc_strdup(b"GIF\x00" as *const u8 as *const libc::c_char),
|
||||
20 => p = dc_strdup(b"Image\x00" as *const u8 as *const libc::c_char),
|
||||
50 => p = dc_strdup(b"Video\x00" as *const u8 as *const libc::c_char),
|
||||
41 => p = dc_strdup(b"Voice\x00" as *const u8 as *const libc::c_char),
|
||||
_ => {
|
||||
p = dc_mprintf(b"%i\x00" as *const u8 as *const libc::c_char, (*msg).state)
|
||||
p = dc_mprintf(b"%i\x00" as *const u8 as *const libc::c_char, (*msg).type_0)
|
||||
}
|
||||
}
|
||||
dc_strbuilder_catf(
|
||||
&mut ret as *mut dc_strbuilder_t,
|
||||
b"State: %s\x00" as *const u8 as *const libc::c_char,
|
||||
b"Type: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
p,
|
||||
);
|
||||
free(p as *mut libc::c_void);
|
||||
if 0 != dc_msg_has_location(msg) {
|
||||
dc_strbuilder_cat(
|
||||
&mut ret,
|
||||
b", Location sent\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
}
|
||||
p = 0 as *mut libc::c_char;
|
||||
e2ee_errors = 0;
|
||||
e2ee_errors = dc_param_get_int((*msg).param, 'e' as i32, 0i32);
|
||||
if 0 != e2ee_errors {
|
||||
if 0 != e2ee_errors & 0x2i32 {
|
||||
p = dc_strdup(
|
||||
b"Encrypted, no valid signature\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
)
|
||||
}
|
||||
} else if 0 != dc_param_get_int((*msg).param, 'c' as i32, 0i32) {
|
||||
p = dc_strdup(b"Encrypted\x00" as *const u8 as *const libc::c_char)
|
||||
}
|
||||
if !p.is_null() {
|
||||
dc_strbuilder_catf(
|
||||
&mut ret as *mut dc_strbuilder_t,
|
||||
b", %s\x00" as *const u8 as *const libc::c_char,
|
||||
p,
|
||||
);
|
||||
free(p as *mut libc::c_void);
|
||||
}
|
||||
dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char);
|
||||
p = dc_param_get((*msg).param, 'L' as i32, 0 as *const libc::c_char);
|
||||
if !p.is_null() {
|
||||
dc_strbuilder_catf(
|
||||
&mut ret as *mut dc_strbuilder_t,
|
||||
b"Error: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
p,
|
||||
);
|
||||
free(p as *mut libc::c_void);
|
||||
}
|
||||
p = dc_msg_get_file(msg);
|
||||
if !p.is_null() && 0 != *p.offset(0isize) as libc::c_int {
|
||||
dc_strbuilder_catf(
|
||||
&mut ret as *mut dc_strbuilder_t,
|
||||
b"\nFile: %s, %i bytes\n\x00" as *const u8 as *const libc::c_char,
|
||||
p,
|
||||
dc_get_filebytes(context, p) as libc::c_int,
|
||||
);
|
||||
}
|
||||
p = dc_msg_get_filemime(msg);
|
||||
dc_strbuilder_catf(
|
||||
&mut ret as *mut dc_strbuilder_t,
|
||||
b"Mimetype: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
p,
|
||||
);
|
||||
free(p as *mut libc::c_void);
|
||||
if (*msg).type_0 != 10i32 {
|
||||
p = 0 as *mut libc::c_char;
|
||||
match (*msg).type_0 {
|
||||
40 => p = dc_strdup(b"Audio\x00" as *const u8 as *const libc::c_char),
|
||||
60 => p = dc_strdup(b"File\x00" as *const u8 as *const libc::c_char),
|
||||
21 => p = dc_strdup(b"GIF\x00" as *const u8 as *const libc::c_char),
|
||||
20 => p = dc_strdup(b"Image\x00" as *const u8 as *const libc::c_char),
|
||||
50 => p = dc_strdup(b"Video\x00" as *const u8 as *const libc::c_char),
|
||||
41 => p = dc_strdup(b"Voice\x00" as *const u8 as *const libc::c_char),
|
||||
_ => {
|
||||
p = dc_mprintf(
|
||||
b"%i\x00" as *const u8 as *const libc::c_char,
|
||||
(*msg).type_0,
|
||||
)
|
||||
}
|
||||
}
|
||||
dc_strbuilder_catf(
|
||||
&mut ret as *mut dc_strbuilder_t,
|
||||
b"Type: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
p,
|
||||
);
|
||||
free(p as *mut libc::c_void);
|
||||
p = dc_msg_get_filemime(msg);
|
||||
dc_strbuilder_catf(
|
||||
&mut ret as *mut dc_strbuilder_t,
|
||||
b"Mimetype: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
p,
|
||||
);
|
||||
free(p as *mut libc::c_void);
|
||||
}
|
||||
w = dc_param_get_int((*msg).param, 'w' as i32, 0i32);
|
||||
h = dc_param_get_int((*msg).param, 'h' as i32, 0i32);
|
||||
if w != 0i32 || h != 0i32 {
|
||||
p = dc_mprintf(
|
||||
b"Dimension: %i x %i\n\x00" as *const u8 as *const libc::c_char,
|
||||
w,
|
||||
h,
|
||||
);
|
||||
dc_strbuilder_cat(&mut ret, p);
|
||||
free(p as *mut libc::c_void);
|
||||
}
|
||||
duration = dc_param_get_int((*msg).param, 'd' as i32, 0i32);
|
||||
if duration != 0i32 {
|
||||
p = dc_mprintf(
|
||||
b"Duration: %i ms\n\x00" as *const u8 as *const libc::c_char,
|
||||
duration,
|
||||
);
|
||||
dc_strbuilder_cat(&mut ret, p);
|
||||
free(p as *mut libc::c_void);
|
||||
}
|
||||
if !rawtxt.is_null() && 0 != *rawtxt.offset(0isize) as libc::c_int {
|
||||
dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char);
|
||||
dc_strbuilder_cat(&mut ret, rawtxt);
|
||||
dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char);
|
||||
}
|
||||
if !(*msg).rfc724_mid.is_null()
|
||||
&& 0 != *(*msg).rfc724_mid.offset(0isize) as libc::c_int
|
||||
{
|
||||
dc_strbuilder_catf(
|
||||
&mut ret as *mut dc_strbuilder_t,
|
||||
b"\nMessage-ID: %s\x00" as *const u8 as *const libc::c_char,
|
||||
(*msg).rfc724_mid,
|
||||
);
|
||||
}
|
||||
if !(*msg).server_folder.is_null()
|
||||
&& 0 != *(*msg).server_folder.offset(0isize) as libc::c_int
|
||||
{
|
||||
dc_strbuilder_catf(
|
||||
&mut ret as *mut dc_strbuilder_t,
|
||||
b"\nLast seen as: %s/%i\x00" as *const u8 as *const libc::c_char,
|
||||
(*msg).server_folder,
|
||||
(*msg).server_uid as libc::c_int,
|
||||
);
|
||||
}
|
||||
}
|
||||
w = dc_param_get_int((*msg).param, 'w' as i32, 0i32);
|
||||
h = dc_param_get_int((*msg).param, 'h' as i32, 0i32);
|
||||
if w != 0i32 || h != 0i32 {
|
||||
p = dc_mprintf(
|
||||
b"Dimension: %i x %i\n\x00" as *const u8 as *const libc::c_char,
|
||||
w,
|
||||
h,
|
||||
);
|
||||
dc_strbuilder_cat(&mut ret, p);
|
||||
free(p as *mut libc::c_void);
|
||||
}
|
||||
duration = dc_param_get_int((*msg).param, 'd' as i32, 0i32);
|
||||
if duration != 0i32 {
|
||||
p = dc_mprintf(
|
||||
b"Duration: %i ms\n\x00" as *const u8 as *const libc::c_char,
|
||||
duration,
|
||||
);
|
||||
dc_strbuilder_cat(&mut ret, p);
|
||||
free(p as *mut libc::c_void);
|
||||
}
|
||||
if !rawtxt.is_null() && 0 != *rawtxt.offset(0isize) as libc::c_int {
|
||||
dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char);
|
||||
dc_strbuilder_cat(&mut ret, rawtxt);
|
||||
dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char);
|
||||
}
|
||||
if !(*msg).rfc724_mid.is_null() && 0 != *(*msg).rfc724_mid.offset(0isize) as libc::c_int
|
||||
{
|
||||
dc_strbuilder_catf(
|
||||
&mut ret as *mut dc_strbuilder_t,
|
||||
b"\nMessage-ID: %s\x00" as *const u8 as *const libc::c_char,
|
||||
(*msg).rfc724_mid,
|
||||
);
|
||||
}
|
||||
if !(*msg).server_folder.is_null()
|
||||
&& 0 != *(*msg).server_folder.offset(0isize) as libc::c_int
|
||||
{
|
||||
dc_strbuilder_catf(
|
||||
&mut ret as *mut dc_strbuilder_t,
|
||||
b"\nLast seen as: %s/%i\x00" as *const u8 as *const libc::c_char,
|
||||
(*msg).server_folder,
|
||||
(*msg).server_uid as libc::c_int,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
dc_msg_unref(msg);
|
||||
dc_contact_unref(contact_from);
|
||||
@@ -503,21 +502,19 @@ pub unsafe fn dc_msg_get_timestamp(mut msg: *const dc_msg_t) -> time_t {
|
||||
(*msg).timestamp_sort
|
||||
};
|
||||
}
|
||||
pub unsafe fn dc_msg_load_from_db(
|
||||
mut msg: *mut dc_msg_t,
|
||||
mut context: &dc_context_t,
|
||||
mut id: uint32_t,
|
||||
pub unsafe fn dc_msg_load_from_db<'a>(
|
||||
msg: *mut dc_msg_t<'a>,
|
||||
context: &'a dc_context_t,
|
||||
id: uint32_t,
|
||||
) -> libc::c_int {
|
||||
let mut success: libc::c_int = 0i32;
|
||||
let mut stmt: &sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(msg.is_null()
|
||||
|| (*msg).magic != 0x11561156i32 as libc::c_uint
|
||||
|| context.is_null()
|
||||
|| (*context).sql.is_null())
|
||||
{
|
||||
let mut stmt = 0 as *mut sqlite3_stmt;
|
||||
if !msg.is_null() {
|
||||
stmt =
|
||||
dc_sqlite3_prepare((*context).sql,
|
||||
b"SELECT m.id,rfc724_mid,m.mime_in_reply_to,m.server_folder,m.server_uid,m.move_state,m.chat_id, m.from_id,m.to_id,m.timestamp,m.timestamp_sent,m.timestamp_rcvd, m.type,m.state,m.msgrmsg,m.txt, m.param,m.starred,m.hidden,m.location_id, c.blocked FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id WHERE m.id=?;\x00"
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT m.id,rfc724_mid,m.mime_in_reply_to,m.server_folder,m.server_uid,m.move_state,m.chat_id, m.from_id,m.to_id,m.timestamp,m.timestamp_sent,m.timestamp_rcvd, m.type,m.state,m.msgrmsg,m.txt, m.param,m.starred,m.hidden,m.location_id, c.blocked FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id WHERE m.id=?;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_int(stmt, 1i32, id as libc::c_int);
|
||||
if !(sqlite3_step(stmt) != 100i32) {
|
||||
@@ -612,18 +609,19 @@ pub unsafe fn dc_get_mime_headers(
|
||||
mut context: &dc_context_t,
|
||||
mut msg_id: uint32_t,
|
||||
) -> *mut libc::c_char {
|
||||
let mut eml: &libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut eml = 0 as *mut libc::c_char;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
b"SELECT mime_headers FROM msgs WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(stmt, 1i32, msg_id as libc::c_int);
|
||||
if sqlite3_step(stmt) == 100i32 {
|
||||
eml = dc_strdup_keep_null(sqlite3_column_text(stmt, 0i32) as *const libc::c_char)
|
||||
}
|
||||
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT mime_headers FROM msgs WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(stmt, 1i32, msg_id as libc::c_int);
|
||||
if sqlite3_step(stmt) == 100i32 {
|
||||
eml = dc_strdup_keep_null(sqlite3_column_text(stmt, 0i32) as *const libc::c_char)
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
return eml;
|
||||
}
|
||||
@@ -632,11 +630,7 @@ pub unsafe fn dc_delete_msgs(
|
||||
mut msg_ids: *const uint32_t,
|
||||
mut msg_cnt: libc::c_int,
|
||||
) {
|
||||
if context.is_null()
|
||||
|| (*context).magic != 0x11a11807i32 as libc::c_uint
|
||||
|| msg_ids.is_null()
|
||||
|| msg_cnt <= 0i32
|
||||
{
|
||||
if msg_ids.is_null() || msg_cnt <= 0i32 {
|
||||
return;
|
||||
}
|
||||
let mut i: libc::c_int = 0i32;
|
||||
@@ -668,8 +662,9 @@ pub unsafe fn dc_update_msg_chat_id(
|
||||
mut msg_id: uint32_t,
|
||||
mut chat_id: uint32_t,
|
||||
) {
|
||||
let mut stmt: &sqlite3_stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
let stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE msgs SET chat_id=? WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int);
|
||||
@@ -682,20 +677,14 @@ pub unsafe fn dc_markseen_msgs(
|
||||
mut msg_ids: *const uint32_t,
|
||||
mut msg_cnt: libc::c_int,
|
||||
) {
|
||||
let mut transaction_pending: libc::c_int = 0i32;
|
||||
let mut i: libc::c_int = 0i32;
|
||||
let mut send_event: libc::c_int = 0i32;
|
||||
let mut curr_state: libc::c_int = 0i32;
|
||||
let mut curr_blocked: libc::c_int = 0i32;
|
||||
let mut stmt: &sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(context.is_null()
|
||||
|| (*context).magic != 0x11a11807i32 as libc::c_uint
|
||||
|| msg_ids.is_null()
|
||||
|| msg_cnt <= 0i32)
|
||||
{
|
||||
transaction_pending = 1i32;
|
||||
let mut stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(msg_ids.is_null() || msg_cnt <= 0i32) {
|
||||
stmt =
|
||||
dc_sqlite3_prepare((*context).sql,
|
||||
dc_sqlite3_prepare(context, &mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT m.state, c.blocked FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id WHERE m.id=? AND m.chat_id>9\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
i = 0i32;
|
||||
@@ -730,7 +719,7 @@ pub unsafe fn dc_markseen_msgs(
|
||||
}
|
||||
i += 1
|
||||
}
|
||||
transaction_pending = 0i32;
|
||||
|
||||
if 0 != send_event {
|
||||
((*context).cb)(
|
||||
context,
|
||||
@@ -747,7 +736,8 @@ pub unsafe fn dc_update_msg_state(
|
||||
mut msg_id: uint32_t,
|
||||
mut state: libc::c_int,
|
||||
) {
|
||||
let mut stmt: &sqlite3_stmt = dc_sqlite3_prepare(
|
||||
let mut stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.lock().unwrap(),
|
||||
b"UPDATE msgs SET state=? WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -762,16 +752,12 @@ pub unsafe fn dc_star_msgs(
|
||||
mut msg_cnt: libc::c_int,
|
||||
mut star: libc::c_int,
|
||||
) {
|
||||
if context.is_null()
|
||||
|| (*context).magic != 0x11a11807i32 as libc::c_uint
|
||||
|| msg_ids.is_null()
|
||||
|| msg_cnt <= 0i32
|
||||
|| star != 0i32 && star != 1i32
|
||||
{
|
||||
if msg_ids.is_null() || msg_cnt <= 0i32 || star != 0i32 && star != 1i32 {
|
||||
return;
|
||||
}
|
||||
let mut stmt: &sqlite3_stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
let mut stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE msgs SET starred=? WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
let mut i: libc::c_int = 0i32;
|
||||
@@ -794,7 +780,7 @@ pub unsafe fn dc_get_msg<'a>(context: &'a dc_context_t, msg_id: uint32_t) -> *mu
|
||||
obj
|
||||
} else {
|
||||
dc_msg_unref(obj);
|
||||
0 as &dc_msg_t
|
||||
0 as *mut dc_msg_t
|
||||
}
|
||||
}
|
||||
|
||||
@@ -900,7 +886,7 @@ pub unsafe fn dc_msg_get_duration(mut msg: *const dc_msg_t) -> libc::c_int {
|
||||
return dc_param_get_int((*msg).param, 'd' as i32, 0i32);
|
||||
}
|
||||
pub unsafe fn dc_msg_get_showpadlock(mut msg: *const dc_msg_t) -> libc::c_int {
|
||||
if msg.is_null() || (*msg).magic != 0x11561156i32 as libc::c_uint || (*msg).context.is_null() {
|
||||
if msg.is_null() || (*msg).magic != 0x11561156i32 as libc::c_uint {
|
||||
return 0i32;
|
||||
}
|
||||
if dc_param_get_int((*msg).param, 'c' as i32, 0i32) != 0i32 {
|
||||
@@ -908,9 +894,9 @@ pub unsafe fn dc_msg_get_showpadlock(mut msg: *const dc_msg_t) -> libc::c_int {
|
||||
}
|
||||
return 0i32;
|
||||
}
|
||||
pub unsafe fn dc_msg_get_summary(
|
||||
mut msg: *const dc_msg_t,
|
||||
mut chat: *const dc_chat_t,
|
||||
pub unsafe fn dc_msg_get_summary<'a>(
|
||||
msg: *const dc_msg_t<'a>,
|
||||
mut chat: *const dc_chat_t<'a>,
|
||||
) -> *mut dc_lot_t {
|
||||
let mut current_block: u64;
|
||||
let mut ret: *mut dc_lot_t = dc_lot_new();
|
||||
@@ -968,7 +954,7 @@ pub unsafe fn dc_msg_get_summarytext_by_raw(
|
||||
mut context: &dc_context_t,
|
||||
) -> *mut libc::c_char {
|
||||
/* get a summary text, result must be free()'d, never returns NULL. */
|
||||
let mut ret: &libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut ret = 0 as *mut libc::c_char;
|
||||
let mut prefix: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut pathNfilename: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut label: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
@@ -1075,7 +1061,7 @@ pub unsafe fn dc_msg_is_info(mut msg: *const dc_msg_t) -> libc::c_int {
|
||||
return 0i32;
|
||||
}
|
||||
pub unsafe fn dc_msg_is_increation(mut msg: *const dc_msg_t) -> libc::c_int {
|
||||
if msg.is_null() || (*msg).magic != 0x11561156i32 as libc::c_uint || (*msg).context.is_null() {
|
||||
if msg.is_null() || (*msg).magic != 0x11561156i32 as libc::c_uint {
|
||||
return 0i32;
|
||||
}
|
||||
return (((*msg).type_0 == 20i32
|
||||
@@ -1198,15 +1184,12 @@ pub unsafe fn dc_msg_latefiling_mediasize(
|
||||
};
|
||||
}
|
||||
pub unsafe fn dc_msg_save_param_to_disk(mut msg: *mut dc_msg_t) {
|
||||
if msg.is_null()
|
||||
|| (*msg).magic != 0x11561156i32 as libc::c_uint
|
||||
|| (*msg).context.is_null()
|
||||
|| (*(*msg).context).sql.is_null()
|
||||
{
|
||||
if msg.is_null() || (*msg).magic != 0x11561156i32 as libc::c_uint {
|
||||
return;
|
||||
}
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
(*(*msg).context).sql,
|
||||
(*msg).context,
|
||||
&mut (*msg).context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE msgs SET param=? WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_text(stmt, 1i32, (*(*msg).param).packed, -1i32, None);
|
||||
@@ -1218,7 +1201,7 @@ pub unsafe fn dc_msg_new_load<'a>(
|
||||
context: &'a dc_context_t,
|
||||
msg_id: uint32_t,
|
||||
) -> *mut dc_msg_t<'a> {
|
||||
let mut msg: &dc_msg_t = dc_msg_new_untyped(context);
|
||||
let mut msg = dc_msg_new_untyped(context);
|
||||
dc_msg_load_from_db(msg, context, msg_id);
|
||||
msg
|
||||
}
|
||||
@@ -1228,15 +1211,17 @@ pub unsafe fn dc_delete_msg_from_db(context: &dc_context_t, mut msg_id: uint32_t
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(0 == dc_msg_load_from_db(msg, context, msg_id)) {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"DELETE FROM msgs WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(stmt, 1i32, (*msg).id as libc::c_int);
|
||||
sqlite3_step(stmt);
|
||||
sqlite3_finalize(stmt);
|
||||
stmt = 0 as &sqlite3_stmt;
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"DELETE FROM msgs_mdns WHERE msg_id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(stmt, 1i32, (*msg).id as libc::c_int);
|
||||
@@ -1255,12 +1240,10 @@ The value is also used for CC:-summaries */
|
||||
pub unsafe fn dc_msg_exists(mut context: &dc_context_t, mut msg_id: uint32_t) -> libc::c_int {
|
||||
let mut msg_exists: libc::c_int = 0i32;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(context.is_null()
|
||||
|| (*context).magic != 0x11a11807i32 as libc::c_uint
|
||||
|| msg_id <= 9i32 as libc::c_uint)
|
||||
{
|
||||
if !msg_id <= 9i32 as libc::c_uint {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT chat_id FROM msgs WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(stmt, 1i32, msg_id as libc::c_int);
|
||||
@@ -1281,8 +1264,9 @@ pub unsafe fn dc_update_msg_move_state(
|
||||
) {
|
||||
// we update the move_state for all messages belonging to a given Message-ID
|
||||
// so that the state stay intact when parts are deleted
|
||||
let mut stmt: &sqlite3_stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
let mut stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE msgs SET move_state=? WHERE rfc724_mid=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(stmt, 1i32, state as libc::c_int);
|
||||
@@ -1295,7 +1279,7 @@ pub unsafe fn dc_set_msg_failed(
|
||||
mut msg_id: uint32_t,
|
||||
mut error: *const libc::c_char,
|
||||
) {
|
||||
let mut msg: &dc_msg_t = dc_msg_new_untyped(context);
|
||||
let mut msg = dc_msg_new_untyped(context);
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(0 == dc_msg_load_from_db(msg, context, msg_id)) {
|
||||
if 18i32 == (*msg).state || 20i32 == (*msg).state || 26i32 == (*msg).state {
|
||||
@@ -1311,7 +1295,8 @@ pub unsafe fn dc_set_msg_failed(
|
||||
);
|
||||
}
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE msgs SET state=?, param=? WHERE id=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(stmt, 1i32, (*msg).state);
|
||||
@@ -1334,7 +1319,7 @@ pub unsafe fn dc_mdn_from_ext(
|
||||
mut from_id: uint32_t,
|
||||
mut rfc724_mid: *const libc::c_char,
|
||||
mut timestamp_sent: time_t,
|
||||
mut ret_chat_id: &uint32_t,
|
||||
mut ret_chat_id: *mut uint32_t,
|
||||
mut ret_msg_id: *mut uint32_t,
|
||||
) -> libc::c_int {
|
||||
let mut chat_type: libc::c_int = 0;
|
||||
@@ -1344,9 +1329,7 @@ pub unsafe fn dc_mdn_from_ext(
|
||||
let mut soll_cnt: libc::c_int = 0;
|
||||
let mut read_by_all: libc::c_int = 0i32;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(context.is_null()
|
||||
|| (*context).magic != 0x11a11807i32 as libc::c_uint
|
||||
|| from_id <= 9i32 as libc::c_uint
|
||||
if !(from_id <= 9i32 as libc::c_uint
|
||||
|| rfc724_mid.is_null()
|
||||
|| ret_chat_id.is_null()
|
||||
|| ret_msg_id.is_null()
|
||||
@@ -1354,9 +1337,12 @@ pub unsafe fn dc_mdn_from_ext(
|
||||
|| *ret_msg_id != 0i32 as libc::c_uint)
|
||||
{
|
||||
stmt =
|
||||
dc_sqlite3_prepare((*context).sql,
|
||||
b"SELECT m.id, c.id, c.type, m.state FROM msgs m LEFT JOIN chats c ON m.chat_id=c.id WHERE rfc724_mid=? AND from_id=1 ORDER BY m.id;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT m.id, c.id, c.type, m.state FROM msgs m LEFT JOIN chats c ON m.chat_id=c.id WHERE rfc724_mid=? AND from_id=1 ORDER BY m.id;\x00"
|
||||
as *const u8 as *const libc::c_char
|
||||
);
|
||||
sqlite3_bind_text(stmt, 1i32, rfc724_mid, -1i32, None);
|
||||
if !(sqlite3_step(stmt) != 100i32) {
|
||||
*ret_msg_id = sqlite3_column_int(stmt, 0i32) as uint32_t;
|
||||
@@ -1368,7 +1354,8 @@ pub unsafe fn dc_mdn_from_ext(
|
||||
if !(msg_state != 18i32 && msg_state != 20i32 && msg_state != 26i32) {
|
||||
/* eg. already marked as MDNS_RCVD. however, it is importent, that the message ID is set above as this will allow the caller eg. to move the message away */
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT contact_id FROM msgs_mdns WHERE msg_id=? AND contact_id=?;\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1383,10 +1370,12 @@ pub unsafe fn dc_mdn_from_ext(
|
||||
stmt = 0 as *mut sqlite3_stmt;
|
||||
if 0 == mdn_already_in_table {
|
||||
stmt =
|
||||
dc_sqlite3_prepare((*context).sql,
|
||||
b"INSERT INTO msgs_mdns (msg_id, contact_id, timestamp_sent) VALUES (?, ?, ?);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"INSERT INTO msgs_mdns (msg_id, contact_id, timestamp_sent) VALUES (?, ?, ?);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
sqlite3_bind_int(stmt, 1i32, *ret_msg_id as libc::c_int);
|
||||
sqlite3_bind_int(stmt, 2i32, from_id as libc::c_int);
|
||||
sqlite3_bind_int64(stmt, 3i32, timestamp_sent as sqlite3_int64);
|
||||
@@ -1401,7 +1390,8 @@ pub unsafe fn dc_mdn_from_ext(
|
||||
} else {
|
||||
/* send event about new state */
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT COUNT(*) FROM msgs_mdns WHERE msg_id=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
@@ -1442,14 +1432,17 @@ pub unsafe fn dc_mdn_from_ext(
|
||||
pub unsafe fn dc_get_real_msg_cnt(mut context: &dc_context_t) -> size_t {
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
let mut ret: size_t = 0i32 as size_t;
|
||||
if !(*(*context).sql).cobj.is_null() {
|
||||
if !(*&mut context.sql.clone().lock().unwrap()).cobj.is_null() {
|
||||
stmt =
|
||||
dc_sqlite3_prepare((*context).sql,
|
||||
b"SELECT COUNT(*) FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id WHERE m.id>9 AND m.chat_id>9 AND c.blocked=0;\x00"
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT COUNT(*) FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id WHERE m.id>9 AND m.chat_id>9 AND c.blocked=0;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
if sqlite3_step(stmt) != 100i32 {
|
||||
dc_sqlite3_log_error(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"dc_get_real_msg_cnt() failed.\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
} else {
|
||||
@@ -1462,12 +1455,9 @@ pub unsafe fn dc_get_real_msg_cnt(mut context: &dc_context_t) -> size_t {
|
||||
pub unsafe fn dc_get_deaddrop_msg_cnt(mut context: &dc_context_t) -> size_t {
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
let mut ret: size_t = 0i32 as size_t;
|
||||
if !(context.is_null()
|
||||
|| (*context).magic != 0x11a11807i32 as libc::c_uint
|
||||
|| (*(*context).sql).cobj.is_null())
|
||||
{
|
||||
if !context.sql.clone().lock().unwrap().cobj.is_null() {
|
||||
stmt =
|
||||
dc_sqlite3_prepare((*context).sql,
|
||||
dc_sqlite3_prepare(context, &mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT COUNT(*) FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id WHERE c.blocked=2;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
if !(sqlite3_step(stmt) != 100i32) {
|
||||
@@ -1483,13 +1473,11 @@ pub unsafe fn dc_rfc724_mid_cnt(
|
||||
) -> libc::c_int {
|
||||
/* check the number of messages with the same rfc724_mid */
|
||||
let mut ret: libc::c_int = 0i32;
|
||||
let mut stmt: &sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(context.is_null()
|
||||
|| (*context).magic != 0x11a11807i32 as libc::c_uint
|
||||
|| (*(*context).sql).cobj.is_null())
|
||||
{
|
||||
let mut stmt = 0 as *mut sqlite3_stmt;
|
||||
if !context.sql.clone().lock().unwrap().cobj.is_null() {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT COUNT(*) FROM msgs WHERE rfc724_mid=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
@@ -1505,16 +1493,14 @@ pub unsafe fn dc_rfc724_mid_exists(
|
||||
mut context: &dc_context_t,
|
||||
mut rfc724_mid: *const libc::c_char,
|
||||
mut ret_server_folder: *mut *mut libc::c_char,
|
||||
mut ret_server_uid: &uint32_t,
|
||||
mut ret_server_uid: *mut uint32_t,
|
||||
) -> uint32_t {
|
||||
let mut ret: uint32_t = 0i32 as uint32_t;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(context.is_null()
|
||||
|| rfc724_mid.is_null()
|
||||
|| *rfc724_mid.offset(0isize) as libc::c_int == 0i32)
|
||||
{
|
||||
if !(rfc724_mid.is_null() || *rfc724_mid.offset(0isize) as libc::c_int == 0i32) {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT server_folder, server_uid, id FROM msgs WHERE rfc724_mid=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
@@ -1545,8 +1531,9 @@ pub unsafe fn dc_update_server_uid(
|
||||
mut server_folder: *const libc::c_char,
|
||||
mut server_uid: uint32_t,
|
||||
) {
|
||||
let mut stmt: &sqlite3_stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
let mut stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE msgs SET server_folder=?, server_uid=? WHERE rfc724_mid=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
|
||||
@@ -28,15 +28,12 @@ pub unsafe fn dc_get_oauth2_url(
|
||||
) -> *mut libc::c_char {
|
||||
let mut oauth2: *mut oauth2_t = 0 as *mut oauth2_t;
|
||||
let mut oauth2_url: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
if !(context.is_null()
|
||||
|| (*context).magic != 0x11a11807i32 as libc::c_uint
|
||||
|| redirect_uri.is_null()
|
||||
|| *redirect_uri.offset(0isize) as libc::c_int == 0i32)
|
||||
{
|
||||
if !(redirect_uri.is_null() || *redirect_uri.offset(0isize) as libc::c_int == 0i32) {
|
||||
oauth2 = get_info(addr);
|
||||
if !oauth2.is_null() {
|
||||
dc_sqlite3_set_config(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"oauth2_pending_redirect_uri\x00" as *const u8 as *const libc::c_char,
|
||||
redirect_uri,
|
||||
);
|
||||
@@ -154,12 +151,7 @@ pub unsafe fn dc_get_oauth2_access_token(
|
||||
size: 0,
|
||||
}; 128];
|
||||
let mut tok_cnt: libc::c_int = 0i32;
|
||||
let mut locked: libc::c_int = 0i32;
|
||||
if context.is_null()
|
||||
|| (*context).magic != 0x11a11807i32 as libc::c_uint
|
||||
|| code.is_null()
|
||||
|| *code.offset(0isize) as libc::c_int == 0i32
|
||||
{
|
||||
if code.is_null() || *code.offset(0isize) as libc::c_int == 0i32 {
|
||||
dc_log_warning(
|
||||
context,
|
||||
0i32,
|
||||
@@ -174,12 +166,14 @@ pub unsafe fn dc_get_oauth2_access_token(
|
||||
b"Internal OAuth2 error: 2\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
} else {
|
||||
pthread_mutex_lock(&mut (*context).oauth2_critical);
|
||||
locked = 1i32;
|
||||
let lock = context.oauth2_critical.clone();
|
||||
|
||||
let l = lock.lock().unwrap();
|
||||
// read generated token
|
||||
if 0 == flags & 0x1i32 && 0 == is_expired(context) {
|
||||
access_token = dc_sqlite3_get_config(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"oauth2_access_token\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
);
|
||||
@@ -196,12 +190,14 @@ pub unsafe fn dc_get_oauth2_access_token(
|
||||
16914036240511706173 => {}
|
||||
_ => {
|
||||
refresh_token = dc_sqlite3_get_config(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"oauth2_refresh_token\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
);
|
||||
refresh_token_for = dc_sqlite3_get_config(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"oauth2_refresh_token_for\x00" as *const u8 as *const libc::c_char,
|
||||
b"unset\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -213,7 +209,8 @@ pub unsafe fn dc_get_oauth2_access_token(
|
||||
as *const libc::c_char,
|
||||
);
|
||||
redirect_uri = dc_sqlite3_get_config(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"oauth2_pending_redirect_uri\x00" as *const u8 as *const libc::c_char,
|
||||
b"unset\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -227,7 +224,8 @@ pub unsafe fn dc_get_oauth2_access_token(
|
||||
as *const libc::c_char,
|
||||
);
|
||||
redirect_uri = dc_sqlite3_get_config(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"oauth2_redirect_uri\x00" as *const u8 as *const libc::c_char,
|
||||
b"unset\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -253,7 +251,7 @@ pub unsafe fn dc_get_oauth2_access_token(
|
||||
b"$REFRESH_TOKEN\x00" as *const u8 as *const libc::c_char,
|
||||
refresh_token,
|
||||
);
|
||||
json = ((*context).cb)(
|
||||
json = (context.cb)(
|
||||
context,
|
||||
Event::HTTP_POST,
|
||||
token_url as uintptr_t,
|
||||
@@ -381,12 +379,14 @@ pub unsafe fn dc_get_oauth2_access_token(
|
||||
&& 0 != *refresh_token.offset(0isize) as libc::c_int
|
||||
{
|
||||
dc_sqlite3_set_config(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"oauth2_refresh_token\x00" as *const u8 as *const libc::c_char,
|
||||
refresh_token,
|
||||
);
|
||||
dc_sqlite3_set_config(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"oauth2_refresh_token_for\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
code,
|
||||
@@ -405,12 +405,14 @@ pub unsafe fn dc_get_oauth2_access_token(
|
||||
);
|
||||
} else {
|
||||
dc_sqlite3_set_config(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"oauth2_access_token\x00" as *const u8 as *const libc::c_char,
|
||||
access_token,
|
||||
);
|
||||
dc_sqlite3_set_config_int64(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"oauth2_timestamp_expires\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
(if 0 != expires_in {
|
||||
@@ -421,7 +423,8 @@ pub unsafe fn dc_get_oauth2_access_token(
|
||||
);
|
||||
if 0 != update_redirect_uri_on_success {
|
||||
dc_sqlite3_set_config(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"oauth2_redirect_uri\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
redirect_uri,
|
||||
@@ -432,11 +435,9 @@ pub unsafe fn dc_get_oauth2_access_token(
|
||||
}
|
||||
}
|
||||
}
|
||||
drop(l);
|
||||
}
|
||||
}
|
||||
if 0 != locked {
|
||||
pthread_mutex_unlock(&mut (*context).oauth2_critical);
|
||||
}
|
||||
free(refresh_token as *mut libc::c_void);
|
||||
free(refresh_token_for as *mut libc::c_void);
|
||||
free(redirect_uri as *mut libc::c_void);
|
||||
@@ -481,7 +482,8 @@ unsafe extern "C" fn jsoneq(
|
||||
}
|
||||
unsafe fn is_expired(mut context: &dc_context_t) -> libc::c_int {
|
||||
let mut expire_timestamp: time_t = dc_sqlite3_get_config_int64(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"oauth2_timestamp_expires\x00" as *const u8 as *const libc::c_char,
|
||||
0i32 as int64_t,
|
||||
) as time_t;
|
||||
@@ -501,13 +503,10 @@ pub unsafe fn dc_get_oauth2_addr(
|
||||
let mut access_token: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut addr_out: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut oauth2: *mut oauth2_t = 0 as *mut oauth2_t;
|
||||
if !(context.is_null()
|
||||
|| (*context).magic != 0x11a11807i32 as libc::c_uint
|
||||
|| {
|
||||
oauth2 = get_info(addr);
|
||||
oauth2.is_null()
|
||||
}
|
||||
|| (*oauth2).get_userinfo.is_null())
|
||||
if !({
|
||||
oauth2 = get_info(addr);
|
||||
oauth2.is_null()
|
||||
} || (*oauth2).get_userinfo.is_null())
|
||||
{
|
||||
access_token = dc_get_oauth2_access_token(context, addr, code, 0i32);
|
||||
addr_out = get_oauth2_addr(context, oauth2, access_token);
|
||||
@@ -542,9 +541,7 @@ unsafe fn get_oauth2_addr(
|
||||
size: 0,
|
||||
}; 128];
|
||||
let mut tok_cnt: libc::c_int = 0i32;
|
||||
if !(context.is_null()
|
||||
|| (*context).magic != 0x11a11807i32 as libc::c_uint
|
||||
|| access_token.is_null()
|
||||
if !(access_token.is_null()
|
||||
|| *access_token.offset(0isize) as libc::c_int == 0i32
|
||||
|| oauth2.is_null())
|
||||
{
|
||||
@@ -554,7 +551,7 @@ unsafe fn get_oauth2_addr(
|
||||
b"$ACCESS_TOKEN\x00" as *const u8 as *const libc::c_char,
|
||||
access_token,
|
||||
);
|
||||
json = ((*context).cb)(
|
||||
json = (context.cb)(
|
||||
context,
|
||||
Event::HTTP_GET,
|
||||
userinfo_url as uintptr_t,
|
||||
|
||||
@@ -119,9 +119,9 @@ unsafe extern "C" fn find_param(
|
||||
}
|
||||
/* the value may be an empty string, "def" is returned only if the value unset. The result must be free()'d in any case. */
|
||||
pub unsafe fn dc_param_get(
|
||||
mut param: *const dc_param_t,
|
||||
mut key: libc::c_int,
|
||||
mut def: *const libc::c_char,
|
||||
param: *const dc_param_t,
|
||||
key: libc::c_int,
|
||||
def: *const libc::c_char,
|
||||
) -> *mut libc::c_char {
|
||||
let mut p1: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut p2: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
|
||||
@@ -197,14 +197,12 @@ pub unsafe fn dc_pgp_handle_rpgp_error(mut context: &dc_context_t) -> libc::c_in
|
||||
len = rpgp::rpgp_last_error_length();
|
||||
if !(len == 0i32) {
|
||||
msg = rpgp::rpgp_last_error_message();
|
||||
if !context.is_null() {
|
||||
dc_log_info(
|
||||
context,
|
||||
0i32,
|
||||
b"[rpgp][error] %s\x00" as *const u8 as *const libc::c_char,
|
||||
msg,
|
||||
);
|
||||
}
|
||||
dc_log_info(
|
||||
context,
|
||||
0i32,
|
||||
b"[rpgp][error] %s\x00" as *const u8 as *const libc::c_char,
|
||||
msg,
|
||||
);
|
||||
success = 1i32
|
||||
}
|
||||
if !msg.is_null() {
|
||||
@@ -218,11 +216,7 @@ pub unsafe fn dc_pgp_is_valid_key(
|
||||
) -> libc::c_int {
|
||||
let mut key_is_valid: libc::c_int = 0i32;
|
||||
let mut key: *mut rpgp::public_or_secret_key = 0 as *mut rpgp::public_or_secret_key;
|
||||
if !(context.is_null()
|
||||
|| raw_key.is_null()
|
||||
|| (*raw_key).binary.is_null()
|
||||
|| (*raw_key).bytes <= 0i32)
|
||||
{
|
||||
if !(raw_key.is_null() || (*raw_key).binary.is_null() || (*raw_key).bytes <= 0i32) {
|
||||
key = rpgp::rpgp_key_from_bytes(
|
||||
(*raw_key).binary as *const uint8_t,
|
||||
(*raw_key).bytes as usize,
|
||||
@@ -242,9 +236,10 @@ pub unsafe fn dc_pgp_is_valid_key(
|
||||
return key_is_valid;
|
||||
}
|
||||
pub unsafe fn dc_pgp_calc_fingerprint(
|
||||
mut raw_key: *const dc_key_t,
|
||||
mut ret_fingerprint: *mut *mut uint8_t,
|
||||
mut ret_fingerprint_bytes: *mut size_t,
|
||||
context: &dc_context_t,
|
||||
raw_key: *const dc_key_t,
|
||||
ret_fingerprint: *mut *mut uint8_t,
|
||||
ret_fingerprint_bytes: *mut size_t,
|
||||
) -> libc::c_int {
|
||||
let mut success: libc::c_int = 0i32;
|
||||
let mut key: *mut rpgp::public_or_secret_key = 0 as *mut rpgp::public_or_secret_key;
|
||||
@@ -261,9 +256,9 @@ pub unsafe fn dc_pgp_calc_fingerprint(
|
||||
(*raw_key).binary as *const uint8_t,
|
||||
(*raw_key).bytes as usize,
|
||||
);
|
||||
if !(0 != dc_pgp_handle_rpgp_error(0 as &dc_context_t)) {
|
||||
if !(0 != dc_pgp_handle_rpgp_error(context)) {
|
||||
fingerprint = rpgp::rpgp_key_fingerprint(key);
|
||||
if !(0 != dc_pgp_handle_rpgp_error(0 as &dc_context_t)) {
|
||||
if !(0 != dc_pgp_handle_rpgp_error(context)) {
|
||||
*ret_fingerprint_bytes = rpgp::rpgp_cvec_len(fingerprint) as size_t;
|
||||
*ret_fingerprint = malloc(*ret_fingerprint_bytes) as *mut uint8_t;
|
||||
memcpy(
|
||||
@@ -292,7 +287,7 @@ pub unsafe fn dc_pgp_split_key(
|
||||
let mut key: *mut rpgp::signed_secret_key = 0 as *mut rpgp::signed_secret_key;
|
||||
let mut pub_key: *mut rpgp::signed_public_key = 0 as *mut rpgp::signed_public_key;
|
||||
let mut buf: *mut rpgp::cvec = 0 as *mut rpgp::cvec;
|
||||
if !(context.is_null() || private_in.is_null() || ret_public_key.is_null()) {
|
||||
if !(private_in.is_null() || ret_public_key.is_null()) {
|
||||
if (*private_in).type_0 != 1i32 {
|
||||
dc_log_warning(
|
||||
context,
|
||||
@@ -349,8 +344,7 @@ pub unsafe fn dc_pgp_pk_encrypt(
|
||||
let mut public_keys: *mut *mut rpgp::signed_public_key = 0 as *mut *mut rpgp::signed_public_key;
|
||||
let mut private_key: *mut rpgp::signed_secret_key = 0 as *mut rpgp::signed_secret_key;
|
||||
let mut encrypted: *mut rpgp::Message = 0 as *mut rpgp::Message;
|
||||
if !(context.is_null()
|
||||
|| plain_text == 0 as *mut libc::c_void
|
||||
if !(plain_text == 0 as *mut libc::c_void
|
||||
|| plain_bytes == 0
|
||||
|| ret_ctext.is_null()
|
||||
|| ret_ctext_bytes.is_null()
|
||||
@@ -522,8 +516,7 @@ pub unsafe fn dc_pgp_pk_decrypt(
|
||||
let mut private_keys: *mut *mut rpgp::signed_secret_key =
|
||||
0 as *mut *mut rpgp::signed_secret_key;
|
||||
let mut public_keys: *mut *mut rpgp::signed_public_key = 0 as *mut *mut rpgp::signed_public_key;
|
||||
if !(context.is_null()
|
||||
|| ctext == 0 as *mut libc::c_void
|
||||
if !(ctext == 0 as *mut libc::c_void
|
||||
|| ctext_bytes == 0
|
||||
|| ret_plain.is_null()
|
||||
|| ret_plain_bytes.is_null()
|
||||
@@ -673,8 +666,7 @@ pub unsafe fn dc_pgp_symm_encrypt(
|
||||
) -> libc::c_int {
|
||||
let mut success: libc::c_int = 0i32;
|
||||
let mut decrypted: *mut rpgp::Message = 0 as *mut rpgp::Message;
|
||||
if !(context.is_null()
|
||||
|| passphrase.is_null()
|
||||
if !(passphrase.is_null()
|
||||
|| plain == 0 as *mut libc::c_void
|
||||
|| plain_bytes == 0
|
||||
|| ret_ctext_armored.is_null())
|
||||
|
||||
@@ -43,7 +43,7 @@ pub unsafe fn dc_check_qr(
|
||||
let mut grpid: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut grpname: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
(*qr_parsed).state = 0i32;
|
||||
if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint || qr.is_null()) {
|
||||
if !qr.is_null() {
|
||||
dc_log_info(
|
||||
context,
|
||||
0i32,
|
||||
@@ -247,7 +247,7 @@ pub unsafe fn dc_check_qr(
|
||||
if addr.is_null() || invitenumber.is_null() || auth.is_null() {
|
||||
if 0 != dc_apeerstate_load_by_fingerprint(
|
||||
peerstate,
|
||||
(*context).sql,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
fingerprint,
|
||||
) {
|
||||
(*qr_parsed).state = 210i32;
|
||||
|
||||
@@ -57,7 +57,6 @@ pub unsafe fn dc_receive_imf(
|
||||
let mut sent_timestamp: time_t = -1i32 as time_t;
|
||||
let mut rcvd_timestamp: time_t = -1i32 as time_t;
|
||||
let mut mime_parser: *mut dc_mimeparser_t = dc_mimeparser_new((*context).blobdir, context);
|
||||
let mut transaction_pending: libc::c_int = 0i32;
|
||||
let mut field: *const mailimf_field = 0 as *const mailimf_field;
|
||||
let mut mime_in_reply_to: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut mime_references: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
@@ -76,7 +75,7 @@ pub unsafe fn dc_receive_imf(
|
||||
},
|
||||
server_uid,
|
||||
);
|
||||
to_ids = dc_array_new(context, 16i32 as size_t);
|
||||
to_ids = dc_array_new(16i32 as size_t);
|
||||
if to_ids.is_null()
|
||||
|| created_db_entries.is_null()
|
||||
|| rr_event_to_send.is_null()
|
||||
@@ -107,7 +106,6 @@ pub unsafe fn dc_receive_imf(
|
||||
sent_timestamp = dc_timestamp_from_date((*orig_date).dt_date_time)
|
||||
}
|
||||
}
|
||||
transaction_pending = 1i32;
|
||||
field = dc_mimeparser_lookup_field(
|
||||
mime_parser,
|
||||
b"From\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -116,7 +114,7 @@ pub unsafe fn dc_receive_imf(
|
||||
let mut fld_from: *mut mailimf_from = (*field).fld_data.fld_from;
|
||||
if !fld_from.is_null() {
|
||||
let mut check_self: libc::c_int = 0;
|
||||
let mut from_list: *mut dc_array_t = dc_array_new(context, 16i32 as size_t);
|
||||
let mut from_list: *mut dc_array_t = dc_array_new(16i32 as size_t);
|
||||
dc_add_or_lookup_contacts_by_mailbox_list(
|
||||
context,
|
||||
(*fld_from).frm_mb_list,
|
||||
@@ -225,7 +223,6 @@ pub unsafe fn dc_receive_imf(
|
||||
if strcmp(old_server_folder, server_folder) != 0i32
|
||||
|| old_server_uid != server_uid
|
||||
{
|
||||
transaction_pending = 0i32;
|
||||
dc_update_server_uid(
|
||||
context,
|
||||
rfc724_mid,
|
||||
@@ -253,7 +250,8 @@ pub unsafe fn dc_receive_imf(
|
||||
let mut allow_creation: libc::c_int = 1i32;
|
||||
if msgrmsg == 0i32 {
|
||||
let mut show_emails: libc::c_int = dc_sqlite3_get_config_int(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"show_emails\x00" as *const u8 as *const libc::c_char,
|
||||
0i32,
|
||||
);
|
||||
@@ -465,7 +463,8 @@ pub unsafe fn dc_receive_imf(
|
||||
// if the mime-headers should be saved, find out its size
|
||||
// (the mime-header ends with an empty line)
|
||||
let mut save_mime_headers: libc::c_int = dc_sqlite3_get_config_int(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"save_mime_headers\x00" as *const u8 as *const libc::c_char,
|
||||
0i32,
|
||||
);
|
||||
@@ -529,8 +528,10 @@ pub unsafe fn dc_receive_imf(
|
||||
}
|
||||
icnt = carray_count((*mime_parser).parts) as size_t;
|
||||
stmt =
|
||||
dc_sqlite3_prepare((*context).sql,
|
||||
b"INSERT INTO msgs (rfc724_mid, server_folder, server_uid, chat_id, from_id, to_id, timestamp, timestamp_sent, timestamp_rcvd, type, state, msgrmsg, txt, txt_raw, param, bytes, hidden, mime_headers, mime_in_reply_to, mime_references) VALUES (?,?,?,?,?,?, ?,?,?,?,?,?, ?,?,?,?,?,?, ?,?);\x00"
|
||||
dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"INSERT INTO msgs (rfc724_mid, server_folder, server_uid, chat_id, from_id, to_id, timestamp, timestamp_sent, timestamp_rcvd, type, state, msgrmsg, txt, txt_raw, param, bytes, hidden, mime_headers, mime_in_reply_to, mime_references) VALUES (?,?,?,?,?,?, ?,?,?,?,?,?, ?,?,?,?,?,?, ?,?);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
i = 0i32 as size_t;
|
||||
@@ -646,7 +647,8 @@ pub unsafe fn dc_receive_imf(
|
||||
free(txt_raw as *mut libc::c_void);
|
||||
txt_raw = 0 as *mut libc::c_char;
|
||||
insert_msg_id = dc_sqlite3_get_rowid(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"msgs\x00" as *const u8 as *const libc::c_char,
|
||||
b"rfc724_mid\x00" as *const u8 as *const libc::c_char,
|
||||
rfc724_mid,
|
||||
@@ -706,7 +708,8 @@ pub unsafe fn dc_receive_imf(
|
||||
_ => {
|
||||
if carray_count((*mime_parser).reports) > 0i32 as libc::c_uint {
|
||||
let mut mdns_enabled: libc::c_int = dc_sqlite3_get_config_int(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"mdns_enabled\x00" as *const u8 as *const libc::c_char,
|
||||
1i32,
|
||||
);
|
||||
@@ -897,7 +900,8 @@ pub unsafe fn dc_receive_imf(
|
||||
dc_param_set_int(param, 'z' as i32, server_uid as int32_t);
|
||||
if 0 != (*mime_parser).is_send_by_messenger
|
||||
&& 0 != dc_sqlite3_get_config_int(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"mvbox_move\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
1i32,
|
||||
@@ -984,7 +988,6 @@ pub unsafe fn dc_receive_imf(
|
||||
0i32,
|
||||
);
|
||||
}
|
||||
transaction_pending = 0i32
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1051,7 +1054,8 @@ unsafe fn calc_timestamps(
|
||||
*sort_timestamp = message_timestamp;
|
||||
if 0 != is_fresh_msg {
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT MAX(timestamp) FROM msgs WHERE chat_id=? and from_id!=? AND timestamp>=?\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1313,7 +1317,8 @@ unsafe fn create_or_lookup_group(
|
||||
/* check if the group does not exist but should be created */
|
||||
group_explicitly_left = dc_is_group_explicitly_left(context, grpid);
|
||||
self_addr = dc_sqlite3_get_config(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
b"\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1391,7 +1396,8 @@ unsafe fn create_or_lookup_group(
|
||||
&& strlen(grpname) < 200
|
||||
{
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"UPDATE chats SET name=? WHERE id=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
@@ -1460,7 +1466,8 @@ unsafe fn create_or_lookup_group(
|
||||
0 as *mut libc::c_char
|
||||
};
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"DELETE FROM chats_contacts WHERE chat_id=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
@@ -1593,7 +1600,7 @@ unsafe fn create_or_lookup_adhoc_group(
|
||||
sqlite3_mprintf(b"SELECT c.id, c.blocked FROM chats c LEFT JOIN msgs m ON m.chat_id=c.id WHERE c.id IN(%s) ORDER BY m.timestamp DESC, m.id DESC LIMIT 1;\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
chat_ids_str);
|
||||
stmt = dc_sqlite3_prepare((*context).sql, q3);
|
||||
stmt = dc_sqlite3_prepare(context, &mut context.sql.clone().lock().unwrap(), q3);
|
||||
if sqlite3_step(stmt) == 100i32 {
|
||||
chat_id = sqlite3_column_int(stmt, 0i32) as uint32_t;
|
||||
chat_id_blocked = sqlite3_column_int(stmt, 1i32);
|
||||
@@ -1674,7 +1681,8 @@ unsafe fn create_group_record(
|
||||
let mut chat_id: uint32_t = 0i32 as uint32_t;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"INSERT INTO chats (type, name, grpid, blocked) VALUES(?, ?, ?, ?);\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
@@ -1688,7 +1696,8 @@ unsafe fn create_group_record(
|
||||
sqlite3_bind_int(stmt, 4i32, create_blocked);
|
||||
if !(sqlite3_step(stmt) != 101i32) {
|
||||
chat_id = dc_sqlite3_get_rowid(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"chats\x00" as *const u8 as *const libc::c_char,
|
||||
b"grpid\x00" as *const u8 as *const libc::c_char,
|
||||
grpid,
|
||||
@@ -1707,7 +1716,7 @@ unsafe fn create_adhoc_grp_id(
|
||||
- sha-256 this string (without possibly terminating null-characters)
|
||||
- encode the first 64 bits of the sha-256 output as lowercase hex (results in 16 characters from the set [0-9a-f])
|
||||
*/
|
||||
let mut member_addrs: *mut dc_array_t = dc_array_new(context, 23i32 as size_t);
|
||||
let mut member_addrs: *mut dc_array_t = dc_array_new(23i32 as size_t);
|
||||
let mut member_ids_str: *mut libc::c_char =
|
||||
dc_array_get_string(member_ids, b",\x00" as *const u8 as *const libc::c_char);
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
@@ -1728,9 +1737,10 @@ unsafe fn create_adhoc_grp_id(
|
||||
as *const libc::c_char,
|
||||
member_ids_str,
|
||||
);
|
||||
stmt = dc_sqlite3_prepare((*context).sql, q3);
|
||||
stmt = dc_sqlite3_prepare(context, &mut context.sql.clone().lock().unwrap(), q3);
|
||||
addr = dc_sqlite3_get_config(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
b"no-self\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1788,62 +1798,62 @@ unsafe fn search_chat_ids_by_contact_ids(
|
||||
) -> *mut dc_array_t {
|
||||
/* searches chat_id's by the given contact IDs, may return zero, one or more chat_id's */
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
let mut contact_ids: *mut dc_array_t = dc_array_new(context, 23i32 as size_t);
|
||||
let mut contact_ids: *mut dc_array_t = dc_array_new(23i32 as size_t);
|
||||
let mut contact_ids_str: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut q3: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut chat_ids: *mut dc_array_t = dc_array_new(context, 23i32 as size_t);
|
||||
if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) {
|
||||
/* copy array, remove duplicates and SELF, sort by ID */
|
||||
let mut i: libc::c_int = 0;
|
||||
let mut iCnt: libc::c_int = dc_array_get_cnt(unsorted_contact_ids) as libc::c_int;
|
||||
if !(iCnt <= 0i32) {
|
||||
i = 0i32;
|
||||
while i < iCnt {
|
||||
let mut curr_id: uint32_t = dc_array_get_id(unsorted_contact_ids, i as size_t);
|
||||
if curr_id != 1i32 as libc::c_uint
|
||||
&& 0 == dc_array_search_id(contact_ids, curr_id, 0 as *mut size_t)
|
||||
{
|
||||
dc_array_add_id(contact_ids, curr_id);
|
||||
}
|
||||
i += 1
|
||||
let mut chat_ids: *mut dc_array_t = dc_array_new(23i32 as size_t);
|
||||
|
||||
/* copy array, remove duplicates and SELF, sort by ID */
|
||||
let mut i: libc::c_int = 0;
|
||||
let mut iCnt: libc::c_int = dc_array_get_cnt(unsorted_contact_ids) as libc::c_int;
|
||||
if !(iCnt <= 0i32) {
|
||||
i = 0i32;
|
||||
while i < iCnt {
|
||||
let mut curr_id: uint32_t = dc_array_get_id(unsorted_contact_ids, i as size_t);
|
||||
if curr_id != 1i32 as libc::c_uint
|
||||
&& 0 == dc_array_search_id(contact_ids, curr_id, 0 as *mut size_t)
|
||||
{
|
||||
dc_array_add_id(contact_ids, curr_id);
|
||||
}
|
||||
if !(dc_array_get_cnt(contact_ids) == 0) {
|
||||
dc_array_sort_ids(contact_ids);
|
||||
contact_ids_str =
|
||||
dc_array_get_string(contact_ids, b",\x00" as *const u8 as *const libc::c_char);
|
||||
q3 =
|
||||
i += 1
|
||||
}
|
||||
if !(dc_array_get_cnt(contact_ids) == 0) {
|
||||
dc_array_sort_ids(contact_ids);
|
||||
contact_ids_str =
|
||||
dc_array_get_string(contact_ids, b",\x00" as *const u8 as *const libc::c_char);
|
||||
q3 =
|
||||
sqlite3_mprintf(b"SELECT DISTINCT cc.chat_id, cc.contact_id FROM chats_contacts cc LEFT JOIN chats c ON c.id=cc.chat_id WHERE cc.chat_id IN(SELECT chat_id FROM chats_contacts WHERE contact_id IN(%s)) AND c.type=120 AND cc.contact_id!=1 ORDER BY cc.chat_id, cc.contact_id;\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
contact_ids_str);
|
||||
stmt = dc_sqlite3_prepare((*context).sql, q3);
|
||||
let mut last_chat_id = 0;
|
||||
let mut matches = 0;
|
||||
let mut mismatches = 0;
|
||||
while sqlite3_step(stmt) == 100 {
|
||||
let mut chat_id: uint32_t = sqlite3_column_int(stmt, 0i32) as uint32_t;
|
||||
let mut contact_id: uint32_t = sqlite3_column_int(stmt, 1i32) as uint32_t;
|
||||
if chat_id != last_chat_id {
|
||||
if matches == dc_array_get_cnt(contact_ids)
|
||||
&& mismatches == 0i32 as libc::c_uint
|
||||
{
|
||||
dc_array_add_id(chat_ids, last_chat_id);
|
||||
}
|
||||
last_chat_id = chat_id;
|
||||
matches = 0;
|
||||
mismatches = 0;
|
||||
}
|
||||
if contact_id == dc_array_get_id(contact_ids, matches as size_t) {
|
||||
matches = matches.wrapping_add(1)
|
||||
} else {
|
||||
mismatches = mismatches.wrapping_add(1)
|
||||
stmt = dc_sqlite3_prepare(context, &mut context.sql.clone().lock().unwrap(), q3);
|
||||
let mut last_chat_id = 0;
|
||||
let mut matches = 0;
|
||||
let mut mismatches = 0;
|
||||
while sqlite3_step(stmt) == 100 {
|
||||
let mut chat_id: uint32_t = sqlite3_column_int(stmt, 0i32) as uint32_t;
|
||||
let mut contact_id: uint32_t = sqlite3_column_int(stmt, 1i32) as uint32_t;
|
||||
if chat_id != last_chat_id {
|
||||
if matches == dc_array_get_cnt(contact_ids)
|
||||
&& mismatches == 0i32 as libc::c_uint
|
||||
{
|
||||
dc_array_add_id(chat_ids, last_chat_id);
|
||||
}
|
||||
last_chat_id = chat_id;
|
||||
matches = 0;
|
||||
mismatches = 0;
|
||||
}
|
||||
if matches == dc_array_get_cnt(contact_ids) && mismatches == 0 {
|
||||
dc_array_add_id(chat_ids, last_chat_id);
|
||||
if contact_id == dc_array_get_id(contact_ids, matches as size_t) {
|
||||
matches = matches.wrapping_add(1)
|
||||
} else {
|
||||
mismatches = mismatches.wrapping_add(1)
|
||||
}
|
||||
}
|
||||
if matches == dc_array_get_cnt(contact_ids) && mismatches == 0 {
|
||||
dc_array_add_id(chat_ids, last_chat_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
free(contact_ids_str as *mut libc::c_void);
|
||||
dc_array_unref(contact_ids);
|
||||
@@ -1864,7 +1874,7 @@ unsafe fn check_verified_properties(
|
||||
let mut to_ids_str: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut q3: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if 0 == dc_contact_load_from_db(contact, (*context).sql, from_id) {
|
||||
if 0 == dc_contact_load_from_db(contact, &mut context.sql.clone().lock().unwrap(), from_id) {
|
||||
*failure_reason = dc_mprintf(
|
||||
b"%s. See \"Info\" for details.\x00" as *const u8 as *const libc::c_char,
|
||||
b"Internal Error; cannot load contact.\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -1882,8 +1892,11 @@ unsafe fn check_verified_properties(
|
||||
// this check is skipped for SELF as there is no proper SELF-peerstate
|
||||
// and results in group-splits otherwise.
|
||||
if from_id != 1i32 as libc::c_uint {
|
||||
if 0 == dc_apeerstate_load_by_addr(peerstate, (*context).sql, (*contact).addr)
|
||||
|| dc_contact_is_verified_ex(contact, peerstate) != 2i32
|
||||
if 0 == dc_apeerstate_load_by_addr(
|
||||
peerstate,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
(*contact).addr,
|
||||
) || dc_contact_is_verified_ex(contact, peerstate) != 2i32
|
||||
{
|
||||
*failure_reason = dc_mprintf(
|
||||
b"%s. See \"Info\" for details.\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -1920,7 +1933,7 @@ unsafe fn check_verified_properties(
|
||||
sqlite3_mprintf(b"SELECT c.addr, LENGTH(ps.verified_key_fingerprint) FROM contacts c LEFT JOIN acpeerstates ps ON c.addr=ps.addr WHERE c.id IN(%s) \x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
to_ids_str);
|
||||
stmt = dc_sqlite3_prepare((*context).sql, q3);
|
||||
stmt = dc_sqlite3_prepare(context, &mut context.sql.clone().lock().unwrap(), q3);
|
||||
loop {
|
||||
if !(sqlite3_step(stmt) == 100i32) {
|
||||
current_block = 2604890879466389055;
|
||||
@@ -1935,7 +1948,11 @@ unsafe fn check_verified_properties(
|
||||
strlen(to_addr) as libc::c_int,
|
||||
)
|
||||
.is_null()
|
||||
&& 0 != dc_apeerstate_load_by_addr(peerstate, (*context).sql, to_addr)
|
||||
&& 0 != dc_apeerstate_load_by_addr(
|
||||
peerstate,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
to_addr,
|
||||
)
|
||||
{
|
||||
if 0 == is_verified
|
||||
|| strcmp(
|
||||
@@ -1960,7 +1977,11 @@ unsafe fn check_verified_properties(
|
||||
(*peerstate).gossip_key_fingerprint,
|
||||
2i32,
|
||||
);
|
||||
dc_apeerstate_save_to_db(peerstate, (*context).sql, 0i32);
|
||||
dc_apeerstate_save_to_db(
|
||||
peerstate,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
0i32,
|
||||
);
|
||||
is_verified = 1i32
|
||||
}
|
||||
}
|
||||
@@ -2095,7 +2116,7 @@ unsafe fn is_known_rfc724_mid(
|
||||
let mut is_known: libc::c_int = 0i32;
|
||||
if !rfc724_mid.is_null() {
|
||||
let mut stmt: *mut sqlite3_stmt =
|
||||
dc_sqlite3_prepare((*context).sql,
|
||||
dc_sqlite3_prepare(context, &mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT m.id FROM msgs m LEFT JOIN chats c ON m.chat_id=c.id WHERE m.rfc724_mid=? AND m.chat_id>9 AND c.blocked=0;\x00"
|
||||
as *const u8 as *const libc::c_char);
|
||||
sqlite3_bind_text(stmt, 1i32, rfc724_mid, -1i32, None);
|
||||
@@ -2184,7 +2205,8 @@ unsafe fn is_msgrmsg_rfc724_mid(
|
||||
let mut is_msgrmsg: libc::c_int = 0i32;
|
||||
if !rfc724_mid.is_null() {
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id FROM msgs WHERE rfc724_mid=? AND msgrmsg!=0 AND chat_id>9;\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -2203,8 +2225,7 @@ unsafe fn dc_add_or_lookup_contacts_by_address_list(
|
||||
mut ids: *mut dc_array_t,
|
||||
mut check_self: *mut libc::c_int,
|
||||
) {
|
||||
if context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint || adr_list.is_null()
|
||||
{
|
||||
if adr_list.is_null() {
|
||||
return;
|
||||
}
|
||||
let mut cur: *mut clistiter = (*(*adr_list).ad_list).first;
|
||||
@@ -2254,7 +2275,7 @@ unsafe fn dc_add_or_lookup_contacts_by_mailbox_list(
|
||||
mut ids: *mut dc_array_t,
|
||||
mut check_self: *mut libc::c_int,
|
||||
) {
|
||||
if context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint || mb_list.is_null() {
|
||||
if mb_list.is_null() {
|
||||
return;
|
||||
}
|
||||
let mut cur: *mut clistiter = (*(*mb_list).mb_list).first;
|
||||
@@ -2297,13 +2318,13 @@ unsafe fn add_or_lookup_contact_by_addr(
|
||||
if check_self.is_null() {
|
||||
check_self = &mut dummy
|
||||
}
|
||||
if context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint || addr_spec.is_null()
|
||||
{
|
||||
if addr_spec.is_null() {
|
||||
return;
|
||||
}
|
||||
*check_self = 0i32;
|
||||
let mut self_addr: *mut libc::c_char = dc_sqlite3_get_config(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
b"\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
|
||||
@@ -44,91 +44,92 @@ pub unsafe fn dc_get_securejoin_qr(
|
||||
let mut chat: *mut dc_chat_t = 0 as *mut dc_chat_t;
|
||||
let mut group_name: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut group_name_urlencoded: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) {
|
||||
dc_ensure_secret_key_exists(context);
|
||||
invitenumber = dc_token_lookup(context, DC_TOKEN_INVITENUMBER, group_chat_id);
|
||||
if invitenumber.is_null() {
|
||||
invitenumber = dc_create_id();
|
||||
dc_token_save(context, DC_TOKEN_INVITENUMBER, group_chat_id, invitenumber);
|
||||
}
|
||||
auth = dc_token_lookup(context, DC_TOKEN_AUTH, group_chat_id);
|
||||
if auth.is_null() {
|
||||
auth = dc_create_id();
|
||||
dc_token_save(context, DC_TOKEN_AUTH, group_chat_id, auth);
|
||||
}
|
||||
self_addr = dc_sqlite3_get_config(
|
||||
(*context).sql,
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
|
||||
dc_ensure_secret_key_exists(context);
|
||||
invitenumber = dc_token_lookup(context, DC_TOKEN_INVITENUMBER, group_chat_id);
|
||||
if invitenumber.is_null() {
|
||||
invitenumber = dc_create_id();
|
||||
dc_token_save(context, DC_TOKEN_INVITENUMBER, group_chat_id, invitenumber);
|
||||
}
|
||||
auth = dc_token_lookup(context, DC_TOKEN_AUTH, group_chat_id);
|
||||
if auth.is_null() {
|
||||
auth = dc_create_id();
|
||||
dc_token_save(context, DC_TOKEN_AUTH, group_chat_id, auth);
|
||||
}
|
||||
self_addr = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
);
|
||||
if self_addr.is_null() {
|
||||
dc_log_error(
|
||||
context,
|
||||
0i32,
|
||||
b"Not configured, cannot generate QR code.\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
if self_addr.is_null() {
|
||||
dc_log_error(
|
||||
context,
|
||||
0i32,
|
||||
b"Not configured, cannot generate QR code.\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
} else {
|
||||
self_name = dc_sqlite3_get_config(
|
||||
(*context).sql,
|
||||
b"displayname\x00" as *const u8 as *const libc::c_char,
|
||||
b"\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
fingerprint = get_self_fingerprint(context);
|
||||
if !fingerprint.is_null() {
|
||||
self_addr_urlencoded = dc_urlencode(self_addr);
|
||||
self_name_urlencoded = dc_urlencode(self_name);
|
||||
if 0 != group_chat_id {
|
||||
chat = dc_get_chat(context, group_chat_id);
|
||||
if chat.is_null() {
|
||||
dc_log_error(
|
||||
context,
|
||||
0i32,
|
||||
b"Cannot get QR-code for chat-id %i\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
group_chat_id,
|
||||
);
|
||||
current_block = 9531737720721467826;
|
||||
} else {
|
||||
group_name = dc_chat_get_name(chat);
|
||||
group_name_urlencoded = dc_urlencode(group_name);
|
||||
qr = dc_mprintf(
|
||||
b"OPENPGP4FPR:%s#a=%s&g=%s&x=%s&i=%s&s=%s\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
fingerprint,
|
||||
self_addr_urlencoded,
|
||||
group_name_urlencoded,
|
||||
(*chat).grpid,
|
||||
invitenumber,
|
||||
auth,
|
||||
);
|
||||
current_block = 1118134448028020070;
|
||||
}
|
||||
} else {
|
||||
self_name = dc_sqlite3_get_config(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"displayname\x00" as *const u8 as *const libc::c_char,
|
||||
b"\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
fingerprint = get_self_fingerprint(context);
|
||||
if !fingerprint.is_null() {
|
||||
self_addr_urlencoded = dc_urlencode(self_addr);
|
||||
self_name_urlencoded = dc_urlencode(self_name);
|
||||
if 0 != group_chat_id {
|
||||
chat = dc_get_chat(context, group_chat_id);
|
||||
if chat.is_null() {
|
||||
dc_log_error(
|
||||
context,
|
||||
0i32,
|
||||
b"Cannot get QR-code for chat-id %i\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
group_chat_id,
|
||||
);
|
||||
current_block = 9531737720721467826;
|
||||
} else {
|
||||
group_name = dc_chat_get_name(chat);
|
||||
group_name_urlencoded = dc_urlencode(group_name);
|
||||
qr = dc_mprintf(
|
||||
b"OPENPGP4FPR:%s#a=%s&n=%s&i=%s&s=%s\x00" as *const u8
|
||||
b"OPENPGP4FPR:%s#a=%s&g=%s&x=%s&i=%s&s=%s\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
fingerprint,
|
||||
self_addr_urlencoded,
|
||||
self_name_urlencoded,
|
||||
group_name_urlencoded,
|
||||
(*chat).grpid,
|
||||
invitenumber,
|
||||
auth,
|
||||
);
|
||||
current_block = 1118134448028020070;
|
||||
}
|
||||
match current_block {
|
||||
9531737720721467826 => {}
|
||||
_ => {
|
||||
dc_log_info(
|
||||
context,
|
||||
0i32,
|
||||
b"Generated QR code: %s\x00" as *const u8 as *const libc::c_char,
|
||||
qr,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
qr = dc_mprintf(
|
||||
b"OPENPGP4FPR:%s#a=%s&n=%s&i=%s&s=%s\x00" as *const u8 as *const libc::c_char,
|
||||
fingerprint,
|
||||
self_addr_urlencoded,
|
||||
self_name_urlencoded,
|
||||
invitenumber,
|
||||
auth,
|
||||
);
|
||||
current_block = 1118134448028020070;
|
||||
}
|
||||
match current_block {
|
||||
9531737720721467826 => {}
|
||||
_ => {
|
||||
dc_log_info(
|
||||
context,
|
||||
0i32,
|
||||
b"Generated QR code: %s\x00" as *const u8 as *const libc::c_char,
|
||||
qr,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free(self_addr_urlencoded as *mut libc::c_void);
|
||||
free(self_addr as *mut libc::c_void);
|
||||
free(self_name as *mut libc::c_void);
|
||||
@@ -145,17 +146,26 @@ pub unsafe fn dc_get_securejoin_qr(
|
||||
dc_strdup(0 as *const libc::c_char)
|
||||
};
|
||||
}
|
||||
|
||||
unsafe fn get_self_fingerprint(mut context: &dc_context_t) -> *mut libc::c_char {
|
||||
let mut self_addr: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut self_key: *mut dc_key_t = dc_key_new();
|
||||
let mut fingerprint: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
self_addr = dc_sqlite3_get_config(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"configured_addr\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
);
|
||||
if !(self_addr.is_null() || 0 == dc_key_load_self_public(self_key, self_addr, (*context).sql)) {
|
||||
fingerprint = dc_key_get_fingerprint(self_key);
|
||||
if !(self_addr.is_null()
|
||||
|| 0 == dc_key_load_self_public(
|
||||
context,
|
||||
self_key,
|
||||
self_addr,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
))
|
||||
{
|
||||
fingerprint = dc_key_get_fingerprint(context, self_key);
|
||||
fingerprint.is_null();
|
||||
}
|
||||
free(self_addr as *mut libc::c_void);
|
||||
@@ -175,7 +185,6 @@ pub unsafe fn dc_join_securejoin(
|
||||
let mut contact_chat_id: uint32_t = 0i32 as uint32_t;
|
||||
let mut join_vg: libc::c_int = 0i32;
|
||||
let mut qr_scan: *mut dc_lot_t = 0 as *mut dc_lot_t;
|
||||
let mut qr_locked: libc::c_int = 0i32;
|
||||
dc_log_info(
|
||||
context,
|
||||
0i32,
|
||||
@@ -199,16 +208,12 @@ pub unsafe fn dc_join_securejoin(
|
||||
0i32,
|
||||
b"Unknown contact.\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
} else if !(0 != (*context).shall_stop_ongoing) {
|
||||
} else if !(0 != *context.shall_stop_ongoing.clone().read().unwrap()) {
|
||||
join_vg = ((*qr_scan).state == 202i32) as libc::c_int;
|
||||
(*context).bobs_status = 0i32;
|
||||
pthread_mutex_lock(&mut (*context).bobs_qr_critical);
|
||||
qr_locked = 1i32;
|
||||
(*context).bobs_qr_scan = qr_scan;
|
||||
if 0 != qr_locked {
|
||||
pthread_mutex_unlock(&mut (*context).bobs_qr_critical);
|
||||
qr_locked = 0i32
|
||||
}
|
||||
let bob_a = context.bob.clone();
|
||||
let mut bob = bob_a.write().unwrap();
|
||||
bob.status = 0;
|
||||
bob.qr_scan = qr_scan;
|
||||
if 0 != fingerprint_equals_sender(context, (*qr_scan).fingerprint, contact_chat_id)
|
||||
{
|
||||
dc_log_info(
|
||||
@@ -216,8 +221,8 @@ pub unsafe fn dc_join_securejoin(
|
||||
0i32,
|
||||
b"Taking protocol shortcut.\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
(*context).bob_expects = 6i32;
|
||||
((*context).cb)(
|
||||
bob.expects = 6;
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::SECUREJOIN_JOINER_PROGRESS,
|
||||
chat_id_2_contact_id(context, contact_chat_id) as uintptr_t,
|
||||
@@ -242,7 +247,7 @@ pub unsafe fn dc_join_securejoin(
|
||||
);
|
||||
free(own_fingerprint as *mut libc::c_void);
|
||||
} else {
|
||||
(*context).bob_expects = 2i32;
|
||||
bob.expects = 2;
|
||||
send_handshake_msg(
|
||||
context,
|
||||
contact_chat_id,
|
||||
@@ -257,14 +262,17 @@ pub unsafe fn dc_join_securejoin(
|
||||
);
|
||||
}
|
||||
// Bob -> Alice
|
||||
while !(0 != (*context).shall_stop_ongoing) {
|
||||
while !(0 != *context.shall_stop_ongoing.clone().read().unwrap()) {
|
||||
usleep((300i32 * 1000i32) as useconds_t);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
(*context).bob_expects = 0i32;
|
||||
if (*context).bobs_status == 1i32 {
|
||||
let bob_a = context.bob.clone();
|
||||
let mut bob = bob_a.write().unwrap();
|
||||
|
||||
bob.expects = 0;
|
||||
if bob.status == 1 {
|
||||
if 0 != join_vg {
|
||||
ret_chat_id = dc_get_chat_id_by_grpid(
|
||||
context,
|
||||
@@ -276,19 +284,15 @@ pub unsafe fn dc_join_securejoin(
|
||||
ret_chat_id = contact_chat_id as libc::c_int
|
||||
}
|
||||
}
|
||||
pthread_mutex_lock(&mut (*context).bobs_qr_critical);
|
||||
qr_locked = 1i32;
|
||||
(*context).bobs_qr_scan = 0 as *mut dc_lot_t;
|
||||
if 0 != qr_locked {
|
||||
pthread_mutex_unlock(&mut (*context).bobs_qr_critical);
|
||||
qr_locked = 0i32
|
||||
}
|
||||
bob.qr_scan = std::ptr::null_mut();
|
||||
|
||||
dc_lot_unref(qr_scan);
|
||||
if 0 != ongoing_allocated {
|
||||
dc_free_ongoing(context);
|
||||
}
|
||||
return ret_chat_id as uint32_t;
|
||||
ret_chat_id as uint32_t
|
||||
}
|
||||
|
||||
unsafe fn send_handshake_msg(
|
||||
mut context: &dc_context_t,
|
||||
mut contact_chat_id: uint32_t,
|
||||
@@ -351,10 +355,14 @@ unsafe fn fingerprint_equals_sender(
|
||||
if !(0
|
||||
== dc_contact_load_from_db(
|
||||
contact,
|
||||
(*context).sql,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
dc_array_get_id(contacts, 0i32 as size_t),
|
||||
)
|
||||
|| 0 == dc_apeerstate_load_by_addr(peerstate, (*context).sql, (*contact).addr))
|
||||
|| 0 == dc_apeerstate_load_by_addr(
|
||||
peerstate,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
(*contact).addr,
|
||||
))
|
||||
{
|
||||
fingerprint_normalized = dc_normalize_fingerprint(fingerprint);
|
||||
if strcasecmp(fingerprint_normalized, (*peerstate).public_key_fingerprint) == 0i32 {
|
||||
@@ -369,12 +377,11 @@ unsafe fn fingerprint_equals_sender(
|
||||
}
|
||||
/* library private: secure-join */
|
||||
pub unsafe fn dc_handle_securejoin_handshake(
|
||||
mut context: &dc_context_t,
|
||||
mut mimeparser: *mut dc_mimeparser_t,
|
||||
mut contact_id: uint32_t,
|
||||
context: &dc_context_t,
|
||||
mimeparser: *mut dc_mimeparser_t,
|
||||
contact_id: uint32_t,
|
||||
) -> libc::c_int {
|
||||
let mut current_block: u64;
|
||||
let mut qr_locked: libc::c_int = 0i32;
|
||||
let mut step: *const libc::c_char = 0 as *const libc::c_char;
|
||||
let mut join_vg: libc::c_int = 0i32;
|
||||
let mut scanned_fingerprint_of_alice: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
@@ -385,7 +392,7 @@ pub unsafe fn dc_handle_securejoin_handshake(
|
||||
let mut grpid: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut ret: libc::c_int = 0i32;
|
||||
let mut contact: *mut dc_contact_t = 0 as *mut dc_contact_t;
|
||||
if !(context.is_null() || mimeparser.is_null() || contact_id <= 9i32 as libc::c_uint) {
|
||||
if !(mimeparser.is_null() || contact_id <= 9i32 as libc::c_uint) {
|
||||
step = lookup_field(
|
||||
mimeparser,
|
||||
b"Secure-Join\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -449,7 +456,7 @@ pub unsafe fn dc_handle_securejoin_handshake(
|
||||
0i32,
|
||||
b"Secure-join requested.\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
((*context).cb)(
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::SECUREJOIN_INVITER_PROGRESS,
|
||||
contact_id as uintptr_t,
|
||||
@@ -478,11 +485,10 @@ pub unsafe fn dc_handle_securejoin_handshake(
|
||||
b"vc-auth-required\x00" as *const u8 as *const libc::c_char,
|
||||
) == 0i32
|
||||
{
|
||||
pthread_mutex_lock(&mut (*context).bobs_qr_critical);
|
||||
qr_locked = 1i32;
|
||||
if (*context).bobs_qr_scan.is_null()
|
||||
|| (*context).bob_expects != 2i32
|
||||
|| 0 != join_vg && (*(*context).bobs_qr_scan).state != 202i32
|
||||
let bob_a = context.bob.clone();
|
||||
let bob = bob_a.read().unwrap();
|
||||
let scan = bob.qr_scan;
|
||||
if scan.is_null() || bob.expects != 2i32 || 0 != join_vg && (*scan).state != 202i32
|
||||
{
|
||||
dc_log_warning(
|
||||
context,
|
||||
@@ -493,15 +499,10 @@ pub unsafe fn dc_handle_securejoin_handshake(
|
||||
// no error, just aborted somehow or a mail from another handshake
|
||||
current_block = 4378276786830486580;
|
||||
} else {
|
||||
scanned_fingerprint_of_alice =
|
||||
dc_strdup((*(*context).bobs_qr_scan).fingerprint);
|
||||
auth = dc_strdup((*(*context).bobs_qr_scan).auth);
|
||||
scanned_fingerprint_of_alice = dc_strdup((*scan).fingerprint);
|
||||
auth = dc_strdup((*scan).auth);
|
||||
if 0 != join_vg {
|
||||
grpid = dc_strdup((*(*context).bobs_qr_scan).text2)
|
||||
}
|
||||
if 0 != qr_locked {
|
||||
pthread_mutex_unlock(&mut (*context).bobs_qr_critical);
|
||||
qr_locked = 0i32
|
||||
grpid = dc_strdup((*scan).text2)
|
||||
}
|
||||
if 0 == encrypted_and_signed(mimeparser, scanned_fingerprint_of_alice) {
|
||||
could_not_establish_secure_connection(
|
||||
@@ -537,13 +538,14 @@ pub unsafe fn dc_handle_securejoin_handshake(
|
||||
b"Fingerprint verified.\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
own_fingerprint = get_self_fingerprint(context);
|
||||
((*context).cb)(
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::SECUREJOIN_JOINER_PROGRESS,
|
||||
contact_id as uintptr_t,
|
||||
400i32 as uintptr_t,
|
||||
);
|
||||
(*context).bob_expects = 6i32;
|
||||
context.bob.clone().write().unwrap().expects = 6;
|
||||
|
||||
send_handshake_msg(
|
||||
context,
|
||||
contact_chat_id,
|
||||
@@ -643,13 +645,13 @@ pub unsafe fn dc_handle_securejoin_handshake(
|
||||
b"Auth verified.\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
secure_connection_established(context, contact_chat_id);
|
||||
((*context).cb)(
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::CONTACTS_CHANGED,
|
||||
contact_id as uintptr_t,
|
||||
0i32 as uintptr_t,
|
||||
);
|
||||
((*context).cb)(
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::SECUREJOIN_INVITER_PROGRESS,
|
||||
contact_id as uintptr_t,
|
||||
@@ -692,7 +694,7 @@ pub unsafe fn dc_handle_securejoin_handshake(
|
||||
0 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
);
|
||||
((*context).cb)(
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::SECUREJOIN_INVITER_PROGRESS,
|
||||
contact_id as uintptr_t,
|
||||
@@ -714,7 +716,7 @@ pub unsafe fn dc_handle_securejoin_handshake(
|
||||
if 0 != join_vg {
|
||||
ret = 0x1i32
|
||||
}
|
||||
if (*context).bob_expects != 6i32 {
|
||||
if context.bob.clone().read().unwrap().expects != 6 {
|
||||
dc_log_info(
|
||||
context,
|
||||
0i32,
|
||||
@@ -723,11 +725,8 @@ pub unsafe fn dc_handle_securejoin_handshake(
|
||||
);
|
||||
current_block = 4378276786830486580;
|
||||
} else {
|
||||
pthread_mutex_lock(&mut (*context).bobs_qr_critical);
|
||||
qr_locked = 1i32;
|
||||
if (*context).bobs_qr_scan.is_null()
|
||||
|| 0 != join_vg && (*(*context).bobs_qr_scan).state != 202i32
|
||||
{
|
||||
let scan = context.bob.clone().read().unwrap().qr_scan;
|
||||
if scan.is_null() || 0 != join_vg && (*scan).state != 202i32 {
|
||||
dc_log_warning(
|
||||
context,
|
||||
0i32,
|
||||
@@ -736,14 +735,9 @@ pub unsafe fn dc_handle_securejoin_handshake(
|
||||
);
|
||||
current_block = 4378276786830486580;
|
||||
} else {
|
||||
scanned_fingerprint_of_alice =
|
||||
dc_strdup((*(*context).bobs_qr_scan).fingerprint);
|
||||
scanned_fingerprint_of_alice = dc_strdup((*scan).fingerprint);
|
||||
if 0 != join_vg {
|
||||
grpid = dc_strdup((*(*context).bobs_qr_scan).text2)
|
||||
}
|
||||
if 0 != qr_locked {
|
||||
pthread_mutex_unlock(&mut (*context).bobs_qr_critical);
|
||||
qr_locked = 0i32
|
||||
grpid = dc_strdup((*scan).text2)
|
||||
}
|
||||
let mut vg_expect_encrypted: libc::c_int = 1i32;
|
||||
if 0 != join_vg {
|
||||
@@ -788,7 +782,7 @@ pub unsafe fn dc_handle_securejoin_handshake(
|
||||
current_block = 4378276786830486580;
|
||||
} else {
|
||||
dc_scaleup_contact_origin(context, contact_id, 0x2000000i32);
|
||||
((*context).cb)(
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::CONTACTS_CHANGED,
|
||||
0i32 as uintptr_t,
|
||||
@@ -818,7 +812,7 @@ pub unsafe fn dc_handle_securejoin_handshake(
|
||||
4378276786830486580 => {}
|
||||
_ => {
|
||||
secure_connection_established(context, contact_chat_id);
|
||||
(*context).bob_expects = 0i32;
|
||||
context.bob.clone().write().unwrap().expects = 0;
|
||||
if 0 != join_vg {
|
||||
send_handshake_msg(
|
||||
context,
|
||||
@@ -858,13 +852,13 @@ pub unsafe fn dc_handle_securejoin_handshake(
|
||||
);
|
||||
current_block = 4378276786830486580;
|
||||
} else {
|
||||
((*context).cb)(
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::SECUREJOIN_INVITER_PROGRESS,
|
||||
contact_id as uintptr_t,
|
||||
800i32 as uintptr_t,
|
||||
);
|
||||
((*context).cb)(
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::SECUREJOIN_INVITER_PROGRESS,
|
||||
contact_id as uintptr_t,
|
||||
@@ -885,10 +879,6 @@ pub unsafe fn dc_handle_securejoin_handshake(
|
||||
}
|
||||
}
|
||||
}
|
||||
if 0 != qr_locked {
|
||||
pthread_mutex_unlock(&mut (*context).bobs_qr_critical);
|
||||
qr_locked = 0i32
|
||||
}
|
||||
dc_contact_unref(contact);
|
||||
free(scanned_fingerprint_of_alice as *mut libc::c_void);
|
||||
free(auth as *mut libc::c_void);
|
||||
@@ -896,8 +886,8 @@ pub unsafe fn dc_handle_securejoin_handshake(
|
||||
free(grpid as *mut libc::c_void);
|
||||
return ret;
|
||||
}
|
||||
unsafe fn end_bobs_joining(mut context: &dc_context_t, mut status: libc::c_int) {
|
||||
(*context).bobs_status = status;
|
||||
unsafe fn end_bobs_joining(context: &dc_context_t, status: libc::c_int) {
|
||||
context.bob.clone().write().unwrap().status = status;
|
||||
dc_stop_ongoing_process(context);
|
||||
}
|
||||
unsafe fn secure_connection_established(mut context: &dc_context_t, mut contact_chat_id: uint32_t) {
|
||||
@@ -913,7 +903,7 @@ unsafe fn secure_connection_established(mut context: &dc_context_t, mut contact_
|
||||
},
|
||||
);
|
||||
dc_add_device_msg(context, contact_chat_id, msg);
|
||||
((*context).cb)(
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::CHAT_MODIFIED,
|
||||
contact_chat_id as uintptr_t,
|
||||
@@ -941,12 +931,12 @@ unsafe fn lookup_field(
|
||||
return value;
|
||||
}
|
||||
unsafe fn could_not_establish_secure_connection(
|
||||
mut context: *mut dc_context_t,
|
||||
mut contact_chat_id: uint32_t,
|
||||
mut details: *const libc::c_char,
|
||||
context: &dc_context_t,
|
||||
contact_chat_id: uint32_t,
|
||||
details: *const libc::c_char,
|
||||
) {
|
||||
let mut contact_id: uint32_t = chat_id_2_contact_id(context, contact_chat_id);
|
||||
let mut contact: &dc_contact_t = dc_get_contact(context, contact_id);
|
||||
let mut contact = dc_get_contact(context, contact_id);
|
||||
let mut msg: *mut libc::c_char = dc_stock_str_repl_string(
|
||||
context,
|
||||
36i32,
|
||||
@@ -968,16 +958,22 @@ unsafe fn could_not_establish_secure_connection(
|
||||
dc_contact_unref(contact);
|
||||
}
|
||||
unsafe fn mark_peer_as_verified(
|
||||
mut context: *mut dc_context_t,
|
||||
mut fingerprint: *const libc::c_char,
|
||||
context: &dc_context_t,
|
||||
fingerprint: *const libc::c_char,
|
||||
) -> libc::c_int {
|
||||
let mut success: libc::c_int = 0i32;
|
||||
let mut peerstate: &dc_apeerstate_t = dc_apeerstate_new(context);
|
||||
if !(0 == dc_apeerstate_load_by_fingerprint(peerstate, (*context).sql, fingerprint)) {
|
||||
let mut peerstate = dc_apeerstate_new(context);
|
||||
if !(0
|
||||
== dc_apeerstate_load_by_fingerprint(
|
||||
peerstate,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
fingerprint,
|
||||
))
|
||||
{
|
||||
if !(0 == dc_apeerstate_set_verified(peerstate, 1i32, fingerprint, 2i32)) {
|
||||
(*peerstate).prefer_encrypt = 1i32;
|
||||
(*peerstate).to_save |= 0x2i32;
|
||||
dc_apeerstate_save_to_db(peerstate, (*context).sql, 0i32);
|
||||
dc_apeerstate_save_to_db(peerstate, &mut context.sql.clone().lock().unwrap(), 0i32);
|
||||
success = 1i32
|
||||
}
|
||||
}
|
||||
@@ -1037,10 +1033,10 @@ pub unsafe fn dc_handle_degrade_event(
|
||||
mut context: &dc_context_t,
|
||||
mut peerstate: *mut dc_apeerstate_t,
|
||||
) {
|
||||
let mut stmt: &sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
let mut stmt = 0 as *mut sqlite3_stmt;
|
||||
let mut contact_id: uint32_t = 0i32 as uint32_t;
|
||||
let mut contact_chat_id: uint32_t = 0i32 as uint32_t;
|
||||
if !(context.is_null() || peerstate.is_null()) {
|
||||
if !peerstate.is_null() {
|
||||
// - we do not issue an warning for DC_DE_ENCRYPTION_PAUSED as this is quite normal
|
||||
// - currently, we do not issue an extra warning for DC_DE_VERIFICATION_LOST - this always comes
|
||||
// together with DC_DE_FINGERPRINT_CHANGED which is logged, the idea is not to bother
|
||||
@@ -1048,7 +1044,8 @@ pub unsafe fn dc_handle_degrade_event(
|
||||
// (and he will know this and can fix this)
|
||||
if 0 != (*peerstate).degrade_event & 0x2i32 {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id FROM contacts WHERE addr=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_text(stmt, 1i32, (*peerstate).addr, -1i32, None);
|
||||
@@ -1067,7 +1064,7 @@ pub unsafe fn dc_handle_degrade_event(
|
||||
dc_stock_str_repl_string(context, 37i32, (*peerstate).addr);
|
||||
dc_add_device_msg(context, contact_chat_id, msg);
|
||||
free(msg as *mut libc::c_void);
|
||||
((*context).cb)(
|
||||
(context.cb)(
|
||||
context,
|
||||
Event::CHAT_MODIFIED,
|
||||
contact_chat_id as uintptr_t,
|
||||
|
||||
@@ -16,8 +16,6 @@ pub struct dc_smtp_t {
|
||||
pub from: *mut libc::c_char,
|
||||
pub esmtp: libc::c_int,
|
||||
pub log_connect_errors: libc::c_int,
|
||||
// TODO: Remvoe
|
||||
pub context: *mut dc_context_t,
|
||||
pub error: *mut libc::c_char,
|
||||
pub error_etpan: libc::c_int,
|
||||
}
|
||||
@@ -28,7 +26,6 @@ pub fn dc_smtp_new() -> dc_smtp_t {
|
||||
from: std::ptr::null_mut(),
|
||||
esmtp: 0,
|
||||
log_connect_errors: 1,
|
||||
context: std::ptr::null_mut(),
|
||||
error: std::ptr::null_mut(),
|
||||
error_etpan: 0,
|
||||
}
|
||||
@@ -38,7 +35,6 @@ pub unsafe fn dc_smtp_unref(smtp: &mut dc_smtp_t) {
|
||||
dc_smtp_disconnect(smtp);
|
||||
free(smtp.from as *mut libc::c_void);
|
||||
free(smtp.error as *mut libc::c_void);
|
||||
free(smtp as *mut libc::c_void);
|
||||
}
|
||||
|
||||
pub unsafe fn dc_smtp_disconnect(smtp: &mut dc_smtp_t) {
|
||||
@@ -56,7 +52,11 @@ pub unsafe fn dc_smtp_is_connected(smtp: &dc_smtp_t) -> libc::c_int {
|
||||
}
|
||||
}
|
||||
|
||||
pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) -> libc::c_int {
|
||||
pub unsafe fn dc_smtp_connect(
|
||||
context: &dc_context_t,
|
||||
smtp: &mut dc_smtp_t,
|
||||
lp: *const dc_loginparam_t,
|
||||
) -> libc::c_int {
|
||||
let mut current_block: u64;
|
||||
let mut success: libc::c_int = 0;
|
||||
let mut r: libc::c_int = 0;
|
||||
@@ -67,14 +67,14 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
|
||||
if !smtp.etpan.is_null() {
|
||||
dc_log_warning(
|
||||
smtp.context,
|
||||
context,
|
||||
0,
|
||||
b"SMTP already connected.\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
success = 1;
|
||||
} else if (*lp).addr.is_null() || (*lp).send_server.is_null() || (*lp).send_port == 0 {
|
||||
dc_log_event_seq(
|
||||
smtp.context,
|
||||
context,
|
||||
Event::ERROR_NETWORK,
|
||||
&mut smtp.log_connect_errors as *mut libc::c_int,
|
||||
b"SMTP bad parameters.\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -85,7 +85,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
smtp.etpan = mailsmtp_new(0 as size_t, None);
|
||||
if smtp.etpan.is_null() {
|
||||
dc_log_error(
|
||||
smtp.context,
|
||||
context,
|
||||
0,
|
||||
b"SMTP-object creation failed.\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -94,7 +94,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
mailsmtp_set_progress_callback(
|
||||
smtp.etpan,
|
||||
Some(body_progress),
|
||||
smtp as *mut libc::c_void,
|
||||
smtp as *mut _ as *mut libc::c_void,
|
||||
);
|
||||
/* connect to SMTP server */
|
||||
if 0 != (*lp).server_flags & (0x10000 | 0x40000) {
|
||||
@@ -105,7 +105,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
);
|
||||
if r != MAILSMTP_NO_ERROR as libc::c_int {
|
||||
dc_log_event_seq(
|
||||
smtp.context,
|
||||
context,
|
||||
Event::ERROR_NETWORK,
|
||||
&mut smtp.log_connect_errors as *mut libc::c_int,
|
||||
b"SMTP-Socket connection to %s:%i failed (%s)\x00" as *const u8
|
||||
@@ -126,7 +126,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
);
|
||||
if r != MAILSMTP_NO_ERROR as libc::c_int {
|
||||
dc_log_event_seq(
|
||||
smtp.context,
|
||||
context,
|
||||
Event::ERROR_NETWORK,
|
||||
&mut smtp.log_connect_errors as *mut libc::c_int,
|
||||
b"SMTP-SSL connection to %s:%i failed (%s)\x00" as *const u8
|
||||
@@ -155,7 +155,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
}
|
||||
if r != MAILSMTP_NO_ERROR as libc::c_int {
|
||||
dc_log_event_seq(
|
||||
smtp.context,
|
||||
context,
|
||||
Event::ERROR_NETWORK,
|
||||
&mut smtp.log_connect_errors as *mut libc::c_int,
|
||||
b"SMTP-helo failed (%s)\x00" as *const u8 as *const libc::c_char,
|
||||
@@ -166,7 +166,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
r = mailsmtp_socket_starttls(smtp.etpan);
|
||||
if r != MAILSMTP_NO_ERROR as libc::c_int {
|
||||
dc_log_event_seq(
|
||||
smtp.context,
|
||||
context,
|
||||
Event::ERROR_NETWORK,
|
||||
&mut smtp.log_connect_errors as *mut libc::c_int,
|
||||
b"SMTP-STARTTLS failed (%s)\x00" as *const u8
|
||||
@@ -188,7 +188,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
}
|
||||
if r != MAILSMTP_NO_ERROR as libc::c_int {
|
||||
dc_log_event_seq(
|
||||
smtp.context,
|
||||
context,
|
||||
Event::ERROR_NETWORK,
|
||||
&mut smtp.log_connect_errors as *mut libc::c_int,
|
||||
b"SMTP-helo failed (%s)\x00" as *const u8
|
||||
@@ -198,7 +198,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
current_block = 12512295087047028901;
|
||||
} else {
|
||||
dc_log_info(
|
||||
smtp.context,
|
||||
context,
|
||||
0,
|
||||
b"SMTP-server %s:%i STARTTLS-connected.\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -211,7 +211,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
} else {
|
||||
if 0 != (*lp).server_flags & 0x40000 {
|
||||
dc_log_info(
|
||||
smtp.context,
|
||||
context,
|
||||
0,
|
||||
b"SMTP-server %s:%i connected.\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -220,7 +220,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
);
|
||||
} else {
|
||||
dc_log_info(
|
||||
smtp.context,
|
||||
context,
|
||||
0,
|
||||
b"SMTP-server %s:%i SSL-connected.\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -236,14 +236,14 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
if !(*lp).send_user.is_null() {
|
||||
if 0 != (*lp).server_flags & 0x2 {
|
||||
dc_log_info(
|
||||
smtp.context,
|
||||
context,
|
||||
0,
|
||||
b"SMTP-OAuth2 connect...\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
let mut access_token: *mut libc::c_char =
|
||||
dc_get_oauth2_access_token(
|
||||
smtp.context,
|
||||
context,
|
||||
(*lp).addr,
|
||||
(*lp).send_pw,
|
||||
0,
|
||||
@@ -256,7 +256,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
if r != MAILSMTP_NO_ERROR as libc::c_int {
|
||||
free(access_token as *mut libc::c_void);
|
||||
access_token = dc_get_oauth2_access_token(
|
||||
smtp.context,
|
||||
context,
|
||||
(*lp).addr,
|
||||
(*lp).send_pw,
|
||||
0x1,
|
||||
@@ -284,7 +284,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
& MAILSMTP_AUTH_PLAIN as libc::c_int
|
||||
{
|
||||
dc_log_info(
|
||||
smtp.context,
|
||||
context,
|
||||
0,
|
||||
b"Trying SMTP-Login workaround \"%s\"...\x00"
|
||||
as *const u8
|
||||
@@ -299,7 +299,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
);
|
||||
if err < 0 {
|
||||
dc_log_error(
|
||||
smtp.context,
|
||||
context,
|
||||
0,
|
||||
b"SMTP-Login: Cannot get hostname.\x00"
|
||||
as *const u8
|
||||
@@ -333,7 +333,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
_ => {
|
||||
if r != MAILSMTP_NO_ERROR as libc::c_int {
|
||||
dc_log_event_seq(
|
||||
smtp.context,
|
||||
context,
|
||||
Event::ERROR_NETWORK,
|
||||
&mut smtp.log_connect_errors
|
||||
as *mut libc::c_int,
|
||||
@@ -346,7 +346,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t)
|
||||
current_block = 12512295087047028901;
|
||||
} else {
|
||||
dc_log_event(
|
||||
smtp.context,
|
||||
context,
|
||||
Event::SMTP_CONNECTED,
|
||||
0,
|
||||
b"SMTP-login as %s ok.\x00" as *const u8
|
||||
@@ -388,6 +388,7 @@ unsafe extern "C" fn body_progress(
|
||||
}
|
||||
|
||||
pub unsafe fn dc_smtp_send_msg(
|
||||
context: &dc_context_t,
|
||||
smtp: &mut dc_smtp_t,
|
||||
recipients: *const clist,
|
||||
data_not_terminated: *const libc::c_char,
|
||||
@@ -418,6 +419,7 @@ pub unsafe fn dc_smtp_send_msg(
|
||||
};
|
||||
if r != MAILSMTP_NO_ERROR as libc::c_int {
|
||||
log_error(
|
||||
context,
|
||||
smtp,
|
||||
b"SMTP failed to start message\x00" as *const u8 as *const libc::c_char,
|
||||
r,
|
||||
@@ -444,6 +446,7 @@ pub unsafe fn dc_smtp_send_msg(
|
||||
};
|
||||
if r != MAILSMTP_NO_ERROR as libc::c_int {
|
||||
log_error(
|
||||
context,
|
||||
smtp,
|
||||
b"SMTP failed to add recipient\x00" as *const u8 as *const libc::c_char,
|
||||
r,
|
||||
@@ -465,6 +468,7 @@ pub unsafe fn dc_smtp_send_msg(
|
||||
r = mailsmtp_data(smtp.etpan);
|
||||
if r != MAILSMTP_NO_ERROR as libc::c_int {
|
||||
log_error(
|
||||
context,
|
||||
smtp,
|
||||
b"SMTP failed to set data\x00" as *const u8 as *const libc::c_char,
|
||||
r,
|
||||
@@ -473,6 +477,7 @@ pub unsafe fn dc_smtp_send_msg(
|
||||
r = mailsmtp_data_message(smtp.etpan, data_not_terminated, data_bytes);
|
||||
if r != MAILSMTP_NO_ERROR as libc::c_int {
|
||||
log_error(
|
||||
context,
|
||||
smtp,
|
||||
b"SMTP failed to send message\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -480,7 +485,7 @@ pub unsafe fn dc_smtp_send_msg(
|
||||
);
|
||||
} else {
|
||||
dc_log_event(
|
||||
smtp.context,
|
||||
context,
|
||||
Event::SMTP_MESSAGE_SENT,
|
||||
0,
|
||||
b"Message was sent to SMTP server\x00" as *const u8
|
||||
@@ -497,7 +502,12 @@ pub unsafe fn dc_smtp_send_msg(
|
||||
success
|
||||
}
|
||||
|
||||
unsafe fn log_error(smtp: &mut dc_smtp_t, what_failed: *const libc::c_char, r: libc::c_int) {
|
||||
unsafe fn log_error(
|
||||
context: &dc_context_t,
|
||||
smtp: &mut dc_smtp_t,
|
||||
what_failed: *const libc::c_char,
|
||||
r: libc::c_int,
|
||||
) {
|
||||
let mut error_msg: *mut libc::c_char = dc_mprintf(
|
||||
b"%s: %s: %s\x00" as *const u8 as *const libc::c_char,
|
||||
what_failed,
|
||||
@@ -505,7 +515,7 @@ unsafe fn log_error(smtp: &mut dc_smtp_t, what_failed: *const libc::c_char, r: l
|
||||
(*smtp.etpan).response,
|
||||
);
|
||||
dc_log_warning(
|
||||
smtp.context,
|
||||
context,
|
||||
0,
|
||||
b"%s\x00" as *const u8 as *const libc::c_char,
|
||||
error_msg,
|
||||
|
||||
@@ -73,13 +73,12 @@ pub unsafe fn dc_sqlite3_open(
|
||||
dbfile,
|
||||
&mut sql.cobj,
|
||||
SQLITE_OPEN_FULLMUTEX
|
||||
| (if flags & DC_OPEN_READONLY {
|
||||
| (if 0 != (flags & DC_OPEN_READONLY as i32) {
|
||||
SQLITE_OPEN_READONLY
|
||||
} else {
|
||||
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE
|
||||
}),
|
||||
std::ptr::null(),
|
||||
0 as *const libc::c_char,
|
||||
) != 0
|
||||
{
|
||||
dc_sqlite3_log_error(
|
||||
@@ -90,15 +89,17 @@ pub unsafe fn dc_sqlite3_open(
|
||||
);
|
||||
} else {
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"PRAGMA secure_delete=on;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
sqlite3_busy_timeout(sql.cobj, 10 * 1000);
|
||||
if 0 == flags & DC_OPEN_READONLY {
|
||||
if 0 == flags & DC_OPEN_READONLY as i32 {
|
||||
let mut exists_before_update = 0;
|
||||
let mut dbversion_before_update = 0;
|
||||
/* Init tables to dbversion=0 */
|
||||
if 0 == dc_sqlite3_table_exists(
|
||||
context,
|
||||
sql,
|
||||
b"config\x00" as *const u8 as *const libc::c_char,
|
||||
) {
|
||||
@@ -110,17 +111,20 @@ pub unsafe fn dc_sqlite3_open(
|
||||
dbfile,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE TABLE config (id INTEGER PRIMARY KEY, keyname TEXT, value TEXT);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX config_index1 ON config (keyname);\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE TABLE contacts (\
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT, \
|
||||
@@ -133,16 +137,19 @@ pub unsafe fn dc_sqlite3_open(
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX contacts_index1 ON contacts (name COLLATE NOCASE);\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX contacts_index2 ON contacts (addr COLLATE NOCASE);\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"INSERT INTO contacts (id,name,origin) VALUES \
|
||||
(1,\'self\',262144), (2,\'device\',262144), (3,\'rsvd\',262144), \
|
||||
@@ -151,6 +158,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE TABLE chats (\
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT, \
|
||||
@@ -164,21 +172,25 @@ pub unsafe fn dc_sqlite3_open(
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX chats_index1 ON chats (grpid);\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE TABLE chats_contacts (chat_id INTEGER, contact_id INTEGER);\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX chats_contacts_index1 ON chats_contacts (chat_id);\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"INSERT INTO chats (id,type,name) VALUES \
|
||||
(1,120,\'deaddrop\'), (2,120,\'rsvd\'), (3,120,\'trash\'), \
|
||||
@@ -187,6 +199,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
as *const u8 as *const libc::c_char
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE TABLE msgs (\
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT, \
|
||||
@@ -207,26 +220,31 @@ pub unsafe fn dc_sqlite3_open(
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX msgs_index1 ON msgs (rfc724_mid);\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX msgs_index2 ON msgs (chat_id);\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX msgs_index3 ON msgs (timestamp);\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX msgs_index4 ON msgs (state);\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"INSERT INTO msgs (id,msgrmsg,txt) VALUES \
|
||||
(1,0,\'marker1\'), (2,0,\'rsvd\'), (3,0,\'rsvd\'), \
|
||||
@@ -235,6 +253,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
as *const u8 as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE TABLE jobs (\
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT, \
|
||||
@@ -246,36 +265,44 @@ pub unsafe fn dc_sqlite3_open(
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX jobs_index1 ON jobs (desired_timestamp);\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
if 0 == dc_sqlite3_table_exists(
|
||||
context,
|
||||
sql,
|
||||
b"config\x00" as *const u8 as *const libc::c_char,
|
||||
) || 0
|
||||
== dc_sqlite3_table_exists(
|
||||
context,
|
||||
sql,
|
||||
b"contacts\x00" as *const u8 as *const libc::c_char,
|
||||
)
|
||||
|| 0 == dc_sqlite3_table_exists(
|
||||
context,
|
||||
sql,
|
||||
b"chats\x00" as *const u8 as *const libc::c_char,
|
||||
)
|
||||
|| 0 == dc_sqlite3_table_exists(
|
||||
context,
|
||||
sql,
|
||||
b"chats_contacts\x00" as *const u8 as *const libc::c_char,
|
||||
)
|
||||
|| 0 == dc_sqlite3_table_exists(
|
||||
context,
|
||||
sql,
|
||||
b"msgs\x00" as *const u8 as *const libc::c_char,
|
||||
)
|
||||
|| 0 == dc_sqlite3_table_exists(
|
||||
context,
|
||||
sql,
|
||||
b"jobs\x00" as *const u8 as *const libc::c_char,
|
||||
)
|
||||
{
|
||||
dc_sqlite3_log_error(
|
||||
context,
|
||||
sql,
|
||||
b"Cannot create tables in new database \"%s\".\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -285,6 +312,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
current_block = 13628706266672894061;
|
||||
} else {
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
0,
|
||||
@@ -294,6 +322,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
} else {
|
||||
exists_before_update = 1;
|
||||
dbversion_before_update = dc_sqlite3_get_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
0,
|
||||
@@ -312,11 +341,12 @@ pub unsafe fn dc_sqlite3_open(
|
||||
let mut update_file_paths: libc::c_int = 0;
|
||||
if dbversion < 1 {
|
||||
dc_sqlite3_execute(
|
||||
sql,
|
||||
context, sql,
|
||||
b"CREATE TABLE leftgrps ( id INTEGER PRIMARY KEY, grpid TEXT DEFAULT \'\');\x00"
|
||||
as *const u8 as *const libc::c_char
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX leftgrps_index1 ON leftgrps (grpid);\x00"
|
||||
as *const u8
|
||||
@@ -324,6 +354,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
);
|
||||
dbversion = 1;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
1,
|
||||
@@ -331,6 +362,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 2 {
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"ALTER TABLE contacts ADD COLUMN authname TEXT DEFAULT \'\';\x00"
|
||||
as *const u8
|
||||
@@ -338,6 +370,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
);
|
||||
dbversion = 2;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
2,
|
||||
@@ -345,6 +378,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 7 {
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE TABLE keypairs (\
|
||||
id INTEGER PRIMARY KEY, \
|
||||
@@ -358,6 +392,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
);
|
||||
dbversion = 7;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
7,
|
||||
@@ -365,6 +400,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 10 {
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE TABLE acpeerstates (\
|
||||
id INTEGER PRIMARY KEY, \
|
||||
@@ -377,6 +413,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX acpeerstates_index1 ON acpeerstates (addr);\x00"
|
||||
as *const u8
|
||||
@@ -384,6 +421,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
);
|
||||
dbversion = 10;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
10,
|
||||
@@ -391,11 +429,12 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 12 {
|
||||
dc_sqlite3_execute(
|
||||
sql,
|
||||
context, sql,
|
||||
b"CREATE TABLE msgs_mdns ( msg_id INTEGER, contact_id INTEGER);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX msgs_mdns_index1 ON msgs_mdns (msg_id);\x00"
|
||||
as *const u8
|
||||
@@ -403,6 +442,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
);
|
||||
dbversion = 12;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
12,
|
||||
@@ -410,29 +450,34 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 17 {
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"ALTER TABLE chats ADD COLUMN archived INTEGER DEFAULT 0;\x00"
|
||||
as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX chats_index2 ON chats (archived);\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"ALTER TABLE msgs ADD COLUMN starred INTEGER DEFAULT 0;\x00"
|
||||
as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX msgs_index5 ON msgs (starred);\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dbversion = 17;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
17,
|
||||
@@ -440,17 +485,19 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 18 {
|
||||
dc_sqlite3_execute(
|
||||
sql,
|
||||
context, sql,
|
||||
b"ALTER TABLE acpeerstates ADD COLUMN gossip_timestamp INTEGER DEFAULT 0;\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"ALTER TABLE acpeerstates ADD COLUMN gossip_key;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dbversion = 18;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
18,
|
||||
@@ -458,23 +505,26 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 27 {
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"DELETE FROM msgs WHERE chat_id=1 OR chat_id=2;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
sql,
|
||||
context, sql,
|
||||
b"CREATE INDEX chats_contacts_index2 ON chats_contacts (contact_id);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"ALTER TABLE msgs ADD COLUMN timestamp_sent INTEGER DEFAULT 0;\x00"
|
||||
as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"ALTER TABLE msgs ADD COLUMN timestamp_rcvd INTEGER DEFAULT 0;\x00"
|
||||
as *const u8
|
||||
@@ -482,6 +532,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
);
|
||||
dbversion = 27;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
27,
|
||||
@@ -489,40 +540,42 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 34 {
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"ALTER TABLE msgs ADD COLUMN hidden INTEGER DEFAULT 0;\x00"
|
||||
as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
sql,
|
||||
context, sql,
|
||||
b"ALTER TABLE msgs_mdns ADD COLUMN timestamp_sent INTEGER DEFAULT 0;\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
sql,
|
||||
context, sql,
|
||||
b"ALTER TABLE acpeerstates ADD COLUMN public_key_fingerprint TEXT DEFAULT \'\';\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_execute(
|
||||
sql,
|
||||
context, sql,
|
||||
b"ALTER TABLE acpeerstates ADD COLUMN gossip_key_fingerprint TEXT DEFAULT \'\';\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_execute(
|
||||
sql,
|
||||
context, sql,
|
||||
b"CREATE INDEX acpeerstates_index3 ON acpeerstates (public_key_fingerprint);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_execute(
|
||||
sql,
|
||||
context, sql,
|
||||
b"CREATE INDEX acpeerstates_index4 ON acpeerstates (gossip_key_fingerprint);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
recalc_fingerprints = 1;
|
||||
dbversion = 34;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
34,
|
||||
@@ -530,40 +583,42 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 39 {
|
||||
dc_sqlite3_execute(
|
||||
sql,
|
||||
context, sql,
|
||||
b"CREATE TABLE tokens ( id INTEGER PRIMARY KEY, namespc INTEGER DEFAULT 0, foreign_id INTEGER DEFAULT 0, token TEXT DEFAULT \'\', timestamp INTEGER DEFAULT 0);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"ALTER TABLE acpeerstates ADD COLUMN verified_key;\x00"
|
||||
as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
sql,
|
||||
context, sql,
|
||||
b"ALTER TABLE acpeerstates ADD COLUMN verified_key_fingerprint TEXT DEFAULT \'\';\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_execute(
|
||||
sql,
|
||||
context, sql,
|
||||
b"CREATE INDEX acpeerstates_index5 ON acpeerstates (verified_key_fingerprint);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
if dbversion_before_update == 34 {
|
||||
dc_sqlite3_execute(
|
||||
sql,
|
||||
context, sql,
|
||||
b"UPDATE acpeerstates SET verified_key=gossip_key, verified_key_fingerprint=gossip_key_fingerprint WHERE gossip_key_verified=2;\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_execute(
|
||||
sql,
|
||||
context, sql,
|
||||
b"UPDATE acpeerstates SET verified_key=public_key, verified_key_fingerprint=public_key_fingerprint WHERE public_key_verified=2;\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
}
|
||||
dbversion = 39;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
39,
|
||||
@@ -571,6 +626,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 40 {
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"ALTER TABLE jobs ADD COLUMN thread INTEGER DEFAULT 0;\x00"
|
||||
as *const u8
|
||||
@@ -578,6 +634,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
);
|
||||
dbversion = 40;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
40,
|
||||
@@ -587,6 +644,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
update_file_paths = 1;
|
||||
dbversion = 41;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
41,
|
||||
@@ -594,12 +652,14 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 42 {
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"UPDATE msgs SET txt=\'\' WHERE type!=10\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dbversion = 42;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
42,
|
||||
@@ -607,12 +667,14 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 44 {
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"ALTER TABLE msgs ADD COLUMN mime_headers TEXT;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dbversion = 44;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
44,
|
||||
@@ -620,12 +682,14 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 46 {
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"ALTER TABLE msgs ADD COLUMN mime_in_reply_to TEXT;\x00"
|
||||
as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"ALTER TABLE msgs ADD COLUMN mime_references TEXT;\x00"
|
||||
as *const u8
|
||||
@@ -633,6 +697,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
);
|
||||
dbversion = 46;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
46,
|
||||
@@ -640,6 +705,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 47 {
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"ALTER TABLE jobs ADD COLUMN tries INTEGER DEFAULT 0;\x00"
|
||||
as *const u8
|
||||
@@ -647,6 +713,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
);
|
||||
dbversion = 47;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
47,
|
||||
@@ -654,6 +721,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 48 {
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"ALTER TABLE msgs ADD COLUMN move_state INTEGER DEFAULT 1;\x00"
|
||||
as *const u8
|
||||
@@ -721,6 +789,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
};
|
||||
dbversion = 48;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
48,
|
||||
@@ -728,12 +797,13 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 49 {
|
||||
dc_sqlite3_execute(
|
||||
sql,
|
||||
context, sql,
|
||||
b"ALTER TABLE chats ADD COLUMN gossiped_timestamp INTEGER DEFAULT 0;\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dbversion = 49;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
49,
|
||||
@@ -742,6 +812,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
if dbversion < 50 {
|
||||
if 0 != exists_before_update {
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"show_emails\x00" as *const u8 as *const libc::c_char,
|
||||
2,
|
||||
@@ -749,41 +820,45 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
dbversion = 50;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
50,
|
||||
);
|
||||
}
|
||||
if dbversion < 53 {
|
||||
dc_sqlite3_execute(sql,
|
||||
dc_sqlite3_execute(context, sql,
|
||||
b"CREATE TABLE locations ( id INTEGER PRIMARY KEY AUTOINCREMENT, latitude REAL DEFAULT 0.0, longitude REAL DEFAULT 0.0, accuracy REAL DEFAULT 0.0, timestamp INTEGER DEFAULT 0, chat_id INTEGER DEFAULT 0, from_id INTEGER DEFAULT 0);\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX locations_index1 ON locations (from_id);\x00"
|
||||
as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX locations_index2 ON locations (timestamp);\x00"
|
||||
as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(sql,
|
||||
dc_sqlite3_execute(context, sql,
|
||||
b"ALTER TABLE chats ADD COLUMN locations_send_begin INTEGER DEFAULT 0;\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_execute(sql,
|
||||
dc_sqlite3_execute(context, sql,
|
||||
b"ALTER TABLE chats ADD COLUMN locations_send_until INTEGER DEFAULT 0;\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_execute(sql,
|
||||
dc_sqlite3_execute(context, sql,
|
||||
b"ALTER TABLE chats ADD COLUMN locations_last_sent INTEGER DEFAULT 0;\x00"
|
||||
as *const u8 as
|
||||
*const libc::c_char);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX chats_index3 ON chats (locations_send_until);\x00"
|
||||
as *const u8
|
||||
@@ -791,6 +866,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
);
|
||||
dbversion = 53;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
53,
|
||||
@@ -798,18 +874,21 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 54 {
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"ALTER TABLE msgs ADD COLUMN location_id INTEGER DEFAULT 0;\x00"
|
||||
as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dc_sqlite3_execute(
|
||||
context,
|
||||
sql,
|
||||
b"CREATE INDEX msgs_index6 ON msgs (location_id);\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
dbversion = 54;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
54,
|
||||
@@ -817,12 +896,13 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if dbversion < 55 {
|
||||
dc_sqlite3_execute(
|
||||
sql,
|
||||
context, sql,
|
||||
b"ALTER TABLE locations ADD COLUMN independent INTEGER DEFAULT 0;\x00" as *const u8 as *const libc::c_char
|
||||
);
|
||||
|
||||
dbversion = 55;
|
||||
dc_sqlite3_set_config_int(
|
||||
context,
|
||||
sql,
|
||||
b"dbversion\x00" as *const u8 as *const libc::c_char,
|
||||
55,
|
||||
@@ -831,13 +911,14 @@ pub unsafe fn dc_sqlite3_open(
|
||||
|
||||
if 0 != recalc_fingerprints {
|
||||
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
sql,
|
||||
b"SELECT addr FROM acpeerstates;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
while sqlite3_step(stmt) == 100 {
|
||||
let mut peerstate: *mut dc_apeerstate_t =
|
||||
dc_apeerstate_new(sql.context);
|
||||
dc_apeerstate_new(context);
|
||||
if 0 != dc_apeerstate_load_by_addr(
|
||||
peerstate,
|
||||
sql,
|
||||
@@ -852,9 +933,10 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
if 0 != update_file_paths {
|
||||
let mut repl_from: *mut libc::c_char = dc_sqlite3_get_config(
|
||||
context,
|
||||
sql,
|
||||
b"backup_for\x00" as *const u8 as *const libc::c_char,
|
||||
(*sql.context).blobdir,
|
||||
context.blobdir,
|
||||
);
|
||||
dc_ensure_no_slash(repl_from);
|
||||
if 0 != !('f' as i32 == 'f' as i32) as libc::c_int as libc::c_long {
|
||||
@@ -874,7 +956,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
as *const u8 as
|
||||
*const libc::c_char,
|
||||
repl_from);
|
||||
dc_sqlite3_execute(sql, q3);
|
||||
dc_sqlite3_execute(context, sql, q3);
|
||||
sqlite3_free(q3 as *mut libc::c_void);
|
||||
if 0 != !('i' as i32 == 'i' as i32) as libc::c_int as libc::c_long {
|
||||
__assert_rtn(
|
||||
@@ -894,10 +976,11 @@ pub unsafe fn dc_sqlite3_open(
|
||||
as *const u8 as
|
||||
*const libc::c_char,
|
||||
repl_from);
|
||||
dc_sqlite3_execute(sql, q3);
|
||||
dc_sqlite3_execute(context, sql, q3);
|
||||
sqlite3_free(q3 as *mut libc::c_void);
|
||||
free(repl_from as *mut libc::c_void);
|
||||
dc_sqlite3_set_config(
|
||||
context,
|
||||
sql,
|
||||
b"backup_for\x00" as *const u8 as *const libc::c_char,
|
||||
0 as *const libc::c_char,
|
||||
@@ -913,7 +996,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
13628706266672894061 => {}
|
||||
_ => {
|
||||
dc_log_info(
|
||||
sql.context,
|
||||
context,
|
||||
0,
|
||||
b"Opened \"%s\".\x00" as *const u8 as *const libc::c_char,
|
||||
dbfile,
|
||||
@@ -924,7 +1007,7 @@ pub unsafe fn dc_sqlite3_open(
|
||||
}
|
||||
}
|
||||
|
||||
dc_sqlite3_close(sql);
|
||||
dc_sqlite3_close(context, sql);
|
||||
0
|
||||
}
|
||||
|
||||
@@ -955,6 +1038,7 @@ pub unsafe fn dc_sqlite3_set_config(
|
||||
}
|
||||
if !value.is_null() {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
sql,
|
||||
b"SELECT value FROM config WHERE keyname=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -963,6 +1047,7 @@ pub unsafe fn dc_sqlite3_set_config(
|
||||
sqlite3_finalize(stmt);
|
||||
if state == 101 {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
sql,
|
||||
b"INSERT INTO config (keyname, value) VALUES (?, ?);\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -973,6 +1058,7 @@ pub unsafe fn dc_sqlite3_set_config(
|
||||
sqlite3_finalize(stmt);
|
||||
} else if state == 100 {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
sql,
|
||||
b"UPDATE config SET value=? WHERE keyname=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
@@ -992,6 +1078,7 @@ pub unsafe fn dc_sqlite3_set_config(
|
||||
}
|
||||
} else {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
sql,
|
||||
b"DELETE FROM config WHERE keyname=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1015,6 +1102,7 @@ pub unsafe fn dc_sqlite3_set_config(
|
||||
/* tools, these functions are compatible to the corresponding sqlite3_* functions */
|
||||
/* the result mus be freed using sqlite3_finalize() */
|
||||
pub unsafe fn dc_sqlite3_prepare(
|
||||
context: &dc_context_t,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
querystr: *const libc::c_char,
|
||||
) -> *mut sqlite3_stmt {
|
||||
@@ -1031,6 +1119,7 @@ pub unsafe fn dc_sqlite3_prepare(
|
||||
) != 0
|
||||
{
|
||||
dc_sqlite3_log_error(
|
||||
context,
|
||||
sql,
|
||||
b"Query failed: %s\x00" as *const u8 as *const libc::c_char,
|
||||
querystr,
|
||||
@@ -1080,6 +1169,7 @@ pub unsafe fn dc_sqlite3_is_open(sql: &dc_sqlite3_t) -> libc::c_int {
|
||||
|
||||
/* the returned string must be free()'d, returns NULL on errors */
|
||||
pub unsafe fn dc_sqlite3_get_config(
|
||||
context: &dc_context_t,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
key: *const libc::c_char,
|
||||
def: *const libc::c_char,
|
||||
@@ -1089,6 +1179,7 @@ pub unsafe fn dc_sqlite3_get_config(
|
||||
return dc_strdup_keep_null(def);
|
||||
}
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
sql,
|
||||
b"SELECT value FROM config WHERE keyname=?;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -1106,16 +1197,18 @@ pub unsafe fn dc_sqlite3_get_config(
|
||||
}
|
||||
|
||||
pub unsafe fn dc_sqlite3_execute(
|
||||
context: &dc_context_t,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
querystr: *const libc::c_char,
|
||||
) -> libc::c_int {
|
||||
let mut success = 0;
|
||||
let mut sqlState = 0;
|
||||
let stmt = dc_sqlite3_prepare(sql, querystr);
|
||||
let stmt = dc_sqlite3_prepare(context, sql, querystr);
|
||||
if !stmt.is_null() {
|
||||
sqlState = sqlite3_step(stmt);
|
||||
if sqlState != 101 && sqlState != 100 {
|
||||
dc_sqlite3_log_error(
|
||||
context,
|
||||
sql,
|
||||
b"Cannot execute \"%s\".\x00" as *const u8 as *const libc::c_char,
|
||||
querystr,
|
||||
@@ -1129,6 +1222,7 @@ pub unsafe fn dc_sqlite3_execute(
|
||||
}
|
||||
|
||||
pub unsafe fn dc_sqlite3_set_config_int(
|
||||
context: &dc_context_t,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
key: *const libc::c_char,
|
||||
value: int32_t,
|
||||
@@ -1140,18 +1234,19 @@ pub unsafe fn dc_sqlite3_set_config_int(
|
||||
if value_str.is_null() {
|
||||
return 0;
|
||||
}
|
||||
let ret = dc_sqlite3_set_config(sql, key, value_str);
|
||||
let ret = dc_sqlite3_set_config(context, sql, key, value_str);
|
||||
free(value_str as *mut libc::c_void);
|
||||
|
||||
ret
|
||||
}
|
||||
|
||||
pub unsafe fn dc_sqlite3_get_config_int(
|
||||
context: &dc_context_t,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
key: *const libc::c_char,
|
||||
def: int32_t,
|
||||
) -> int32_t {
|
||||
let mut str = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char);
|
||||
let mut str = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char);
|
||||
if str.is_null() {
|
||||
return def;
|
||||
}
|
||||
@@ -1181,7 +1276,7 @@ pub unsafe fn dc_sqlite3_table_exists(
|
||||
b"dc_sqlite3_table_exists_(): Out of memory.\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
} else {
|
||||
stmt = dc_sqlite3_prepare(sql, querystr);
|
||||
stmt = dc_sqlite3_prepare(context, sql, querystr);
|
||||
if !stmt.is_null() {
|
||||
sqlState = sqlite3_step(stmt);
|
||||
if sqlState == 100 {
|
||||
@@ -1200,6 +1295,7 @@ pub unsafe fn dc_sqlite3_table_exists(
|
||||
}
|
||||
|
||||
pub unsafe fn dc_sqlite3_set_config_int64(
|
||||
context: &dc_context_t,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
key: *const libc::c_char,
|
||||
value: int64_t,
|
||||
@@ -1211,17 +1307,18 @@ pub unsafe fn dc_sqlite3_set_config_int64(
|
||||
if value_str.is_null() {
|
||||
return 0;
|
||||
}
|
||||
let ret = dc_sqlite3_set_config(sql, key, value_str);
|
||||
let ret = dc_sqlite3_set_config(context, sql, key, value_str);
|
||||
free(value_str as *mut libc::c_void);
|
||||
ret
|
||||
}
|
||||
|
||||
pub unsafe fn dc_sqlite3_get_config_int64(
|
||||
context: &dc_context_t,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
key: *const libc::c_char,
|
||||
def: int64_t,
|
||||
) -> int64_t {
|
||||
let mut str = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char);
|
||||
let mut str = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char);
|
||||
if str.is_null() {
|
||||
return def;
|
||||
}
|
||||
@@ -1243,7 +1340,7 @@ pub unsafe fn dc_sqlite3_try_execute(
|
||||
// same as dc_sqlite3_execute() but does not pass error to ui
|
||||
let mut success = 0;
|
||||
let mut sql_state = 0;
|
||||
let stmt = dc_sqlite3_prepare(sql, querystr);
|
||||
let stmt = dc_sqlite3_prepare(context, sql, querystr);
|
||||
if !stmt.is_null() {
|
||||
sql_state = sqlite3_step(stmt);
|
||||
if sql_state != 101 && sql_state != 100 {
|
||||
@@ -1263,6 +1360,7 @@ pub unsafe fn dc_sqlite3_try_execute(
|
||||
}
|
||||
|
||||
pub unsafe fn dc_sqlite3_get_rowid(
|
||||
context: &dc_context_t,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
table: *const libc::c_char,
|
||||
field: *const libc::c_char,
|
||||
@@ -1278,7 +1376,7 @@ pub unsafe fn dc_sqlite3_get_rowid(
|
||||
field,
|
||||
value,
|
||||
);
|
||||
let mut stmt = dc_sqlite3_prepare(sql, q3);
|
||||
let mut stmt = dc_sqlite3_prepare(context, sql, q3);
|
||||
if 100 == sqlite3_step(stmt) {
|
||||
id = sqlite3_column_int(stmt, 0) as uint32_t
|
||||
}
|
||||
@@ -1288,6 +1386,7 @@ pub unsafe fn dc_sqlite3_get_rowid(
|
||||
}
|
||||
|
||||
pub unsafe fn dc_sqlite3_get_rowid2(
|
||||
context: &dc_context_t,
|
||||
sql: &mut dc_sqlite3_t,
|
||||
table: *const libc::c_char,
|
||||
field: *const libc::c_char,
|
||||
@@ -1307,7 +1406,7 @@ pub unsafe fn dc_sqlite3_get_rowid2(
|
||||
field2,
|
||||
value2,
|
||||
);
|
||||
let mut stmt = dc_sqlite3_prepare(sql, q3);
|
||||
let mut stmt = dc_sqlite3_prepare(context, sql, q3);
|
||||
if 100 == sqlite3_step(stmt) {
|
||||
id = sqlite3_column_int(stmt, 0) as uint32_t
|
||||
}
|
||||
@@ -1362,7 +1461,8 @@ pub unsafe fn dc_housekeeping(context: &dc_context_t) {
|
||||
'i' as i32,
|
||||
);
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT value FROM config;\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
while sqlite3_step(stmt) == 100 {
|
||||
@@ -1378,13 +1478,13 @@ pub unsafe fn dc_housekeeping(context: &dc_context_t) {
|
||||
files_in_use.count as libc::c_int,
|
||||
);
|
||||
/* go through directory and delete unused files */
|
||||
dir_handle = opendir((*context).blobdir);
|
||||
dir_handle = opendir(context.blobdir);
|
||||
if dir_handle.is_null() {
|
||||
dc_log_warning(
|
||||
context,
|
||||
0,
|
||||
b"Housekeeping: Cannot open %s.\x00" as *const u8 as *const libc::c_char,
|
||||
(*context).blobdir,
|
||||
context.blobdir,
|
||||
);
|
||||
} else {
|
||||
/* avoid deletion of files that are just created to build a message object */
|
||||
@@ -1429,7 +1529,7 @@ pub unsafe fn dc_housekeeping(context: &dc_context_t) {
|
||||
free(path as *mut libc::c_void);
|
||||
path = dc_mprintf(
|
||||
b"%s/%s\x00" as *const u8 as *const libc::c_char,
|
||||
(*context).blobdir,
|
||||
context.blobdir,
|
||||
name,
|
||||
);
|
||||
|
||||
@@ -1526,7 +1626,7 @@ unsafe fn maybe_add_from_param(
|
||||
param_id: libc::c_int,
|
||||
) {
|
||||
let mut param = dc_param_new();
|
||||
let mut stmt = dc_sqlite3_prepare((*context).sql, query);
|
||||
let mut stmt = dc_sqlite3_prepare(context, &mut context.sql.clone().lock().unwrap(), query);
|
||||
while sqlite3_step(stmt) == 100 {
|
||||
dc_param_set_packed(param, sqlite3_column_text(stmt, 0) as *const libc::c_char);
|
||||
let mut file = dc_param_get(param, param_id, 0 as *const libc::c_char);
|
||||
|
||||
@@ -19,14 +19,14 @@ unsafe fn get_string(
|
||||
mut qty: libc::c_int,
|
||||
) -> *mut libc::c_char {
|
||||
let mut ret: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
if !context.is_null() {
|
||||
ret = ((*context).cb)(
|
||||
context,
|
||||
Event::GET_STRING,
|
||||
id as uintptr_t,
|
||||
qty as uintptr_t,
|
||||
) as *mut libc::c_char;
|
||||
}
|
||||
|
||||
ret = ((*context).cb)(
|
||||
context,
|
||||
Event::GET_STRING,
|
||||
id as uintptr_t,
|
||||
qty as uintptr_t,
|
||||
) as *mut libc::c_char;
|
||||
|
||||
if ret.is_null() {
|
||||
ret = default_string(id)
|
||||
}
|
||||
|
||||
@@ -18,11 +18,11 @@ pub unsafe fn dc_token_save(
|
||||
mut token: *const libc::c_char,
|
||||
) {
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint || token.is_null())
|
||||
{
|
||||
if !token.is_null() {
|
||||
// foreign_id may be 0
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"INSERT INTO tokens (namespc, foreign_id, token, timestamp) VALUES (?, ?, ?, ?);\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
);
|
||||
@@ -41,20 +41,21 @@ pub unsafe fn dc_token_lookup(
|
||||
) -> *mut libc::c_char {
|
||||
let mut token: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
b"SELECT token FROM tokens WHERE namespc=? AND foreign_id=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(stmt, 1i32, namespc as libc::c_int);
|
||||
sqlite3_bind_int(stmt, 2i32, foreign_id as libc::c_int);
|
||||
sqlite3_step(stmt);
|
||||
token = dc_strdup_keep_null(sqlite3_column_text(stmt, 0i32) as *mut libc::c_char)
|
||||
}
|
||||
stmt = dc_sqlite3_prepare(
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT token FROM tokens WHERE namespc=? AND foreign_id=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
sqlite3_bind_int(stmt, 1i32, namespc as libc::c_int);
|
||||
sqlite3_bind_int(stmt, 2i32, foreign_id as libc::c_int);
|
||||
sqlite3_step(stmt);
|
||||
token = dc_strdup_keep_null(sqlite3_column_text(stmt, 0i32) as *mut libc::c_char);
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
return token;
|
||||
token
|
||||
}
|
||||
|
||||
pub unsafe fn dc_token_exists(
|
||||
mut context: &dc_context_t,
|
||||
mut namespc: dc_tokennamespc_t,
|
||||
@@ -62,10 +63,10 @@ pub unsafe fn dc_token_exists(
|
||||
) -> libc::c_int {
|
||||
let mut exists: libc::c_int = 0i32;
|
||||
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
|
||||
if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint || token.is_null())
|
||||
{
|
||||
if !token.is_null() {
|
||||
stmt = dc_sqlite3_prepare(
|
||||
(*context).sql,
|
||||
context,
|
||||
&mut context.sql.clone().lock().unwrap(),
|
||||
b"SELECT id FROM tokens WHERE namespc=? AND token=?;\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
);
|
||||
|
||||
@@ -890,27 +890,28 @@ pub unsafe fn dc_gm2local_offset() -> libc::c_long {
|
||||
pub unsafe fn dc_smeared_time(mut context: &dc_context_t) -> time_t {
|
||||
/* function returns a corrected time(NULL) */
|
||||
let mut now: time_t = time(0 as *mut time_t);
|
||||
pthread_mutex_lock(&mut (*context).smear_critical);
|
||||
if (*context).last_smeared_timestamp >= now {
|
||||
now = (*context).last_smeared_timestamp + 1i32 as libc::c_long
|
||||
let mut ts = *context.last_smeared_timestamp.clone().read().unwrap();
|
||||
if ts >= now {
|
||||
now = ts + 1;
|
||||
}
|
||||
pthread_mutex_unlock(&mut (*context).smear_critical);
|
||||
return now;
|
||||
now
|
||||
}
|
||||
|
||||
pub unsafe fn dc_create_smeared_timestamp(mut context: &dc_context_t) -> time_t {
|
||||
let mut now: time_t = time(0 as *mut time_t);
|
||||
let mut ret: time_t = now;
|
||||
pthread_mutex_lock(&mut (*context).smear_critical);
|
||||
if ret <= (*context).last_smeared_timestamp {
|
||||
ret = (*context).last_smeared_timestamp + 1i32 as libc::c_long;
|
||||
if ret - now > 5i32 as libc::c_long {
|
||||
ret = now + 5i32 as libc::c_long
|
||||
|
||||
let mut ts = *context.last_smeared_timestamp.clone().write().unwrap();
|
||||
if ret <= ts {
|
||||
ret = ts + 1;
|
||||
if ret - now > 5 {
|
||||
ret = now + 5
|
||||
}
|
||||
}
|
||||
(*context).last_smeared_timestamp = ret;
|
||||
pthread_mutex_unlock(&mut (*context).smear_critical);
|
||||
return ret;
|
||||
ts = ret;
|
||||
ret
|
||||
}
|
||||
|
||||
pub unsafe fn dc_create_smeared_timestamps(
|
||||
mut context: &dc_context_t,
|
||||
mut count: libc::c_int,
|
||||
@@ -919,16 +920,13 @@ pub unsafe fn dc_create_smeared_timestamps(
|
||||
let mut now: time_t = time(0 as *mut time_t);
|
||||
let mut start: time_t =
|
||||
now + (if count < 5i32 { count } else { 5i32 }) as libc::c_long - count as libc::c_long;
|
||||
pthread_mutex_lock(&mut (*context).smear_critical);
|
||||
start = if (*context).last_smeared_timestamp + 1i32 as libc::c_long > start {
|
||||
(*context).last_smeared_timestamp + 1i32 as libc::c_long
|
||||
} else {
|
||||
start
|
||||
};
|
||||
(*context).last_smeared_timestamp = start + (count - 1i32) as libc::c_long;
|
||||
pthread_mutex_unlock(&mut (*context).smear_critical);
|
||||
return start;
|
||||
|
||||
let mut ts = *context.last_smeared_timestamp.clone().write().unwrap();
|
||||
start = if ts + 1 > start { ts + 1 } else { start };
|
||||
ts = start + ((count - 1) as time_t);
|
||||
start
|
||||
}
|
||||
|
||||
/* Message-ID tools */
|
||||
pub unsafe fn dc_create_id() -> *mut libc::c_char {
|
||||
/* generate an id. the generated ID should be as short and as unique as possible:
|
||||
@@ -1268,7 +1266,7 @@ pub unsafe fn dc_get_abs_path(
|
||||
let mut current_block: u64;
|
||||
let mut success: libc::c_int = 0i32;
|
||||
let mut pathNfilename_abs: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
if !(context.is_null() || pathNfilename.is_null()) {
|
||||
if !pathNfilename.is_null() {
|
||||
pathNfilename_abs = dc_strdup(pathNfilename);
|
||||
if strncmp(
|
||||
pathNfilename_abs,
|
||||
@@ -1276,13 +1274,13 @@ pub unsafe fn dc_get_abs_path(
|
||||
8,
|
||||
) == 0i32
|
||||
{
|
||||
if (*context).blobdir.is_null() {
|
||||
if context.blobdir.is_null() {
|
||||
current_block = 3805228753452640762;
|
||||
} else {
|
||||
dc_str_replace(
|
||||
&mut pathNfilename_abs,
|
||||
b"$BLOBDIR\x00" as *const u8 as *const libc::c_char,
|
||||
(*context).blobdir,
|
||||
context.blobdir,
|
||||
);
|
||||
current_block = 6937071982253665452;
|
||||
}
|
||||
@@ -1638,7 +1636,7 @@ pub unsafe fn dc_is_blobdir_path(
|
||||
mut context: &dc_context_t,
|
||||
mut path: *const libc::c_char,
|
||||
) -> libc::c_int {
|
||||
if strncmp(path, (*context).blobdir, strlen((*context).blobdir)) == 0i32
|
||||
if strncmp(path, context.blobdir, strlen(context.blobdir)) == 0i32
|
||||
|| strncmp(path, b"$BLOBDIR\x00" as *const u8 as *const libc::c_char, 8) == 0i32
|
||||
{
|
||||
return 1i32;
|
||||
@@ -1646,13 +1644,13 @@ pub unsafe fn dc_is_blobdir_path(
|
||||
return 0i32;
|
||||
}
|
||||
pub unsafe fn dc_make_rel_path(mut context: &dc_context_t, mut path: *mut *mut libc::c_char) {
|
||||
if context.is_null() || path.is_null() || (*path).is_null() {
|
||||
if path.is_null() || (*path).is_null() {
|
||||
return;
|
||||
}
|
||||
if strncmp(*path, (*context).blobdir, strlen((*context).blobdir)) == 0i32 {
|
||||
if strncmp(*path, context.blobdir, strlen(context.blobdir)) == 0i32 {
|
||||
dc_str_replace(
|
||||
path,
|
||||
(*context).blobdir,
|
||||
context.blobdir,
|
||||
b"$BLOBDIR\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
};
|
||||
@@ -1664,7 +1662,7 @@ pub unsafe fn dc_make_rel_and_copy(
|
||||
let mut success: libc::c_int = 0i32;
|
||||
let mut filename: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
let mut blobdir_path: *mut libc::c_char = 0 as *mut libc::c_char;
|
||||
if !(context.is_null() || path.is_null() || (*path).is_null()) {
|
||||
if !(path.is_null() || (*path).is_null()) {
|
||||
if 0 != dc_is_blobdir_path(context, *path) {
|
||||
dc_make_rel_path(context, path);
|
||||
success = 1i32
|
||||
|
||||
Reference in New Issue
Block a user