int32_t media_sinker_set_owner(media_sinker *sinker, session *s) { if (sinker->state == STAT_KILLED || sinker->host) return -EINVAL; sinker->host = session_ref(s); //@{unref on fin} return 0; }
void session_shutdown(struct session_data *session) { struct transfer_data *transfer; DBG("%p", session); transfer = session->pending ? session->pending->data : NULL; session_ref(session); /* Unregister any pending transfer */ g_slist_foreach(session->pending, (GFunc) transfer_unregister, NULL); session_unref(session); }
static void session_terminate_transfer(struct session_data *session, struct transfer_data *transfer, GError *gerr) { struct session_callback *callback = session->callback; if (callback) { callback->func(session, gerr, callback->data); return; } session_ref(session); transfer_unregister(transfer); if (session->pending) session_request(session, session_prepare_put, session->pending->data); session_unref(session); }
LIBSSH2_SESSION* session_ptr() { return session_ref().session_ptr(); }
scoped_lock aquire_lock() { return session_ref().aquire_lock(); }
~sftp_channel_state() throw() { session_state::scoped_lock lock = session_ref().aquire_lock(); ::libssh2_sftp_shutdown(m_sftp); }
/** * Creates SFTP channel that closes itself in a thread-safe manner * when it goes out of scope. */ sftp_channel_state(session_state& session) : m_session(session), m_sftp(do_sftp_init(session_ref())) {}
struct session_data *session_create(const char *source, const char *destination, const char *target, uint8_t channel, session_callback_t function, void *user_data) { struct session_data *session; struct callback_data *callback; int err; if (destination == NULL) return NULL; session = g_try_malloc0(sizeof(*session)); if (session == NULL) return NULL; session->refcount = 1; session->channel = channel; session->conn = dbus_bus_get(DBUS_BUS_SESSION, NULL); if (session->conn == NULL) { session_free(session); return NULL; } if (source == NULL) bacpy(&session->src, BDADDR_ANY); else str2ba(source, &session->src); str2ba(destination, &session->dst); if (!g_ascii_strncasecmp(target, "OPP", 3)) { sdp_uuid16_create(&session->uuid, OBEX_OBJPUSH_SVCLASS_ID); } else if (!g_ascii_strncasecmp(target, "FTP", 3)) { sdp_uuid16_create(&session->uuid, OBEX_FILETRANS_SVCLASS_ID); session->target = OBEX_FTP_UUID; session->target_len = OBEX_FTP_UUID_LEN; } else if (!g_ascii_strncasecmp(target, "PBAP", 4)) { sdp_uuid16_create(&session->uuid, PBAP_PSE_SVCLASS_ID); session->target = OBEX_PBAP_UUID; session->target_len = OBEX_PBAP_UUID_LEN; } else if (!g_ascii_strncasecmp(target, "SYNC", 4)) { sdp_uuid16_create(&session->uuid, IRMC_SYNC_SVCLASS_ID); session->target = OBEX_SYNC_UUID; session->target_len = OBEX_SYNC_UUID_LEN; } else if (!g_ascii_strncasecmp(target, "PCSUITE", 7)) { sdp_uuid128_create(&session->uuid, pcsuite_uuid); } else { return NULL; } callback = g_try_malloc0(sizeof(*callback)); if (callback == NULL) { session_free(session); return NULL; } callback->session = session_ref(session); callback->func = function; callback->data = user_data; if (session->channel > 0) { session->io = rfcomm_connect(&session->src, &session->dst, session->channel, rfcomm_callback, callback); err = (session->io == NULL) ? -EINVAL : 0; } else { callback->sdp = service_connect(&session->src, &session->dst, service_callback, callback); err = (callback->sdp == NULL) ? -ENOMEM : 0; } if (err < 0) { session_free(session); g_free(callback); return NULL; } return session; }