예제 #1
0
파일: media_sinker.c 프로젝트: dulton/nampu
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;
}
예제 #2
0
파일: session.c 프로젝트: Commers/obexd
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);
}
예제 #3
0
파일: session.c 프로젝트: Commers/obexd
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);
}
예제 #4
0
 LIBSSH2_SESSION* session_ptr()
 {
     return session_ref().session_ptr();
 }
예제 #5
0
 scoped_lock aquire_lock()
 {
     return session_ref().aquire_lock();
 }
예제 #6
0
    ~sftp_channel_state() throw()
    {
        session_state::scoped_lock lock = session_ref().aquire_lock();

        ::libssh2_sftp_shutdown(m_sftp);
    }
예제 #7
0
 /**
  * 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())) {}
예제 #8
0
파일: session.c 프로젝트: Commers/obexd
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;
}