pub type DavWriteFunc = Option<extern "C" fn(data: *const c_void, size: libc::size_t, count: libc::size_t, stream: *mut c_void) -> libc::size_t>;
pub type DavSeekFunc = Option<extern "C" fn(stream: *mut c_void, offset: c_long, whence: c_int) -> c_int>;
+
+pub type DavDestructorFunc = Option<extern "C" fn(data: *mut c_void)>;
+
+pub type DavAuthCallback = Option<extern "C" fn(session: *mut DavSession, userdata: *mut c_void) -> c_int>;
+
#[repr(C)]
#[allow(dead_code)]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
*/
#![allow(dead_code)]
-use std::ffi::{c_char, c_int, CStr, CString};
+use std::ffi::{c_char, c_int, c_void, CStr, CString};
use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign};
use crate::dav::context::DavContext;
use crate::dav::ffi;
+use crate::dav::ffi::{DavAuthCallback, DavDestructorFunc};
pub struct Session {
pub ptr: *mut ffi::DavSession
}
}
+struct AuthCallbackWrapper {
+ callback: Box<dyn FnMut(&Session) -> bool>,
+}
+
impl Session {
pub fn set_auth(&self, user: &str, password: &str) {
let user_cstr = CString::new(user).unwrap();
dav_session_enable_encryption(self.ptr, flags.bits() as i32);
}
}
+
+ pub fn auth_callback<F>(&self, f: F)
+ where F: FnMut(&Session) -> bool + 'static {
+ let wrapper = Box::new( AuthCallbackWrapper { callback: Box::new(f) });
+ let raw = Box::into_raw(wrapper);
+ unsafe {
+ dav_session_reg_destructor(self.ptr, raw as *mut c_void, Some(auth_callback_destructor));
+ dav_session_set_authcallback(self.ptr, Some(auth_callback), raw as *mut c_void);
+ }
+ }
+}
+
+extern "C" fn auth_callback(sn: *mut ffi::DavSession, userdata: *mut c_void) -> c_int {
+ let wrapper: &mut AuthCallbackWrapper = unsafe { &mut *(userdata as *mut AuthCallbackWrapper) };
+ (wrapper.callback)(&Session { ptr: sn }) as c_int
+}
+
+extern "C" fn auth_callback_destructor(data: *mut c_void) {
+ let callback: Box<dyn FnMut(&Session) -> bool> = unsafe { Box::from_raw(data as *mut Box<dyn FnMut(&Session) -> bool>) };
+ drop(callback);
}
fn dav_session_unref(sn: *mut ffi::DavSession);
fn dav_session_clone(sn: *mut ffi::DavSession) -> *mut ffi::DavSession;
fn dav_session_set_auth(sn: *mut ffi::DavSession, user: *const c_char, password: *const c_char);
+ fn dav_session_set_authcallback(sn: *mut ffi::DavSession, func: DavAuthCallback, userdata: *mut c_void);
fn dav_session_get_error(sn: *const ffi::DavSession) -> ffi::DavError;
fn dav_session_get_errorstr(sn: *const ffi::DavSession) -> *const c_char;
fn dav_session_enable_encryption(sn: *mut ffi::DavSession, flags: c_int);
+
+ fn dav_session_reg_destructor(sn: *mut ffi::DavSession, data: *mut c_void, destructor: DavDestructorFunc);
}
\ No newline at end of file
void* dav_session_realloc(DavSession *sn, void *ptr, size_t size);
void dav_session_free(DavSession *sn, void *ptr);
char* dav_session_strdup(DavSession *sn, const char *str);
+void dav_session_reg_destructor(DavSession *sn, void *data, cx_destructor_func destr);
void dav_set_effective_href(DavSession *sn, DavResource *resource);
DavResource* dav_get(DavSession *sn, char *path, const char *properties);