All pastes #1064995 Raw Edit

Untitled

public cpp v1 · immutable
#1064995 ·published 2008-07-07 20:56 UTC
rendered paste body
#include "BTSocket.h"#include <fcntl.h>#include <errno.h>BTSocketServer::BTSocketServer(int channel){//	uint8_t channel; /**< RFCOMM channel */	int l_channel; /**< RFCOMM channel */	uint32_t handle; /**< handle of sdp record */  	bdaddr_t bdaddr_local;	name = "[SDCP]Linux-Server";	bacpy(&bdaddr_local,BDADDR_ANY);	sdp = new mysdp();	bacpy(&sdp->bdaddr_local,&bdaddr_local);	sockaddr_rc loc_addr;	char *c_name;	c_name = (char *)malloc(name.size()+1);	strcpy(c_name,name.c_str());	sdp->sdp_clean(c_name);//	channel = sdp->sdp_free_channel();//	channel = 5;	l_channel = channel;	printf("channel set to: %d\n", l_channel);	sdp->sdp_register(c_name,channel,&handle);	sock = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);	fcntl(sock, F_SETFD, fcntl(sock, F_GETFD) | FD_CLOEXEC);	fcntl(sock, F_SETFL, fcntl(sock, F_GETFL, 0) | O_NONBLOCK);/*	int reuse = 1;	// set SO_REUSEADDR	if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,				(char *)&reuse, sizeof(reuse)) < 0) {		perror("setting SO_REUSEADDR");		close(sock);		return;	}	*/	loc_addr.rc_family = AF_BLUETOOTH;	loc_addr.rc_channel = l_channel;	bacpy(&loc_addr.rc_bdaddr, &bdaddr_local);	bind(sock, (struct sockaddr *)&loc_addr, sizeof(loc_addr)); 	int opt;	opt = 0;	opt |= RFCOMM_LM_MASTER;	setsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &opt, sizeof(opt));	listen(sock, 5);	free(c_name);  }BTSocketServer::~BTSocketServer(){	char *c_name = (char *)malloc(name.size()+1);	strcpy(c_name,name.c_str());	sdp->sdp_clean(c_name);	if(sock > 0)		close(sock);		sdp->sdp_clean_all();}int BTSocketServer::getSocket(){	return sock;}int BTSocketServer::connect(){	return 0;}BTSocketClient::BTSocketClient(string address, int channel){	sock = -1;	sock = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);	if(sock < 0) {		sock = -1;		return;	}		/*	addr.rc_family = AF_BLUETOOTH;//TODO	bacpy(&addr.rc_bdaddr, src);	addr.rc_channel = 0;	if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {		sock = -1;		return;	}*/	/* Bind to local address */	struct sockaddr_rc addr;	memset(&addr, 0, sizeof(addr));	addr.rc_family = AF_BLUETOOTH;	bacpy(&addr.rc_bdaddr, BDADDR_ANY);	if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {		perror("Can't bind socket");		close(sock);		sock = -1;		return;	}	fcntl(sock, F_SETFL, fcntl(sock, F_GETFL, 0) | O_NONBLOCK);	bacpy(&this->address, strtoba(address.c_str()));	this->channel = channel;}BTSocketClient::~BTSocketClient(){	if(sock > 0)		close(sock);}		int BTSocketClient::connect(){	int rc, errno;	struct sockaddr_rc addr;		addr.rc_family = AF_BLUETOOTH;	bacpy(&addr.rc_bdaddr, &address);	addr.rc_channel = channel;		rc = ::connect(sock, (struct sockaddr *)&addr, sizeof(addr));	if((rc == -1) && (errno == EINPROGRESS))		return 1;	else if(rc == -1) {		close(sock);		sock = -1;		return -1;	} else		return 0;}int BTSocketClient::getSocket(){	return sock;}