generate qr codes

This commit is contained in:
dignifiedquire
2022-07-07 20:24:16 +02:00
parent 679242d5c4
commit 63872fc271
6 changed files with 180 additions and 1 deletions

View File

@@ -2204,6 +2204,67 @@ pub unsafe extern "C" fn dc_imex(
}
}
#[no_mangle]
pub unsafe extern "C" fn dc_send_backup(
context: *mut dc_context_t,
folder: *const libc::c_char,
passphrase: *const libc::c_char,
) -> *mut dc_backup_sender {
if context.is_null() {
eprintln!("ignoring careless call to dc_send_backup()");
return ptr::null_mut();
}
let passphrase = to_opt_string_lossy(passphrase);
let ctx = &*context;
if let Some(folder) = to_opt_string_lossy(folder) {
block_on(async move {
imex::send_backup(ctx, folder.as_ref(), passphrase)
.await
.map(|(sender, transfer)| {
Box::into_raw(Box::new(dc_backup_sender { sender, transfer }))
})
.log_err(ctx, "send_backup failed")
.unwrap_or_else(|_| ptr::null_mut())
})
} else {
eprintln!("dc_imex called without a valid directory");
ptr::null_mut()
}
}
pub struct dc_backup_sender {
sender: iroh_share::Sender,
transfer: iroh_share::SenderTransfer,
}
#[no_mangle]
pub unsafe extern "C" fn dc_backup_sender_qr(
ctx: *mut dc_context_t,
bs: *const dc_backup_sender,
) -> *mut libc::c_char {
if ctx.is_null() || bs.is_null() {
eprintln!("ignoring careless call to dc_backup_sender_qr");
return ptr::null_mut();
}
let ctx = &*ctx;
let bs = &*bs;
let ticket = bs.transfer.ticket();
qr_code_generator::generate_backup_qr_code(&ticket)
.map(|s| s.strdup())
.log_err(ctx, "generate_backup_qr_code failed")
.unwrap_or_else(|_| ptr::null_mut())
}
#[no_mangle]
pub unsafe extern "C" fn dc_backup_sender_unref(bs: *mut dc_backup_sender) {
if !bs.is_null() {
let _ = Box::from_raw(bs);
}
}
#[no_mangle]
pub unsafe extern "C" fn dc_imex_has_backup(
context: *mut dc_context_t,

View File

@@ -50,6 +50,7 @@ impl Lot {
Qr::FprMismatch { .. } => None,
Qr::FprWithoutAddr { fingerprint, .. } => Some(fingerprint),
Qr::Account { domain } => Some(domain),
Qr::Backup { .. } => None,
Qr::WebrtcInstance { domain, .. } => Some(domain),
Qr::Addr { draft, .. } => draft.as_deref(),
Qr::Url { url } => Some(url),
@@ -101,6 +102,7 @@ impl Lot {
Qr::FprMismatch { .. } => LotState::QrFprMismatch,
Qr::FprWithoutAddr { .. } => LotState::QrFprWithoutAddr,
Qr::Account { .. } => LotState::QrAccount,
Qr::Backup { .. } => LotState::QrBackup,
Qr::WebrtcInstance { .. } => LotState::QrWebrtcInstance,
Qr::Addr { .. } => LotState::QrAddr,
Qr::Url { .. } => LotState::QrUrl,
@@ -125,6 +127,7 @@ impl Lot {
Qr::FprMismatch { contact_id } => contact_id.unwrap_or_default().to_u32(),
Qr::FprWithoutAddr { .. } => Default::default(),
Qr::Account { .. } => Default::default(),
Qr::Backup { .. } => Default::default(),
Qr::WebrtcInstance { .. } => Default::default(),
Qr::Addr { contact_id, .. } => contact_id.to_u32(),
Qr::Url { .. } => Default::default(),
@@ -173,6 +176,9 @@ pub enum LotState {
/// text1=domain
QrAccount = 250,
/// TODO
QrBackup = 251,
/// text1=domain, text2=instance pattern
QrWebrtcInstance = 260,