Hello all,
I am a newbie to openobex programming and after going through quiet a few of docs and readind and understanding of some other code, i am ready with some code where i am trasmitting a file to a bluetooth device, using "OBEX Push Service".
Here I will like to receive your reviews and suggestions about this code and where and how can i improve in efiiciency. And whether i am making any mistakes.
Thanks in advance
Rupesh
My code:--
Header File:- my_bt_push.h
/*Header File for my_bt_push.c*/
#include <stdint.h>
#include <bluetooth/bluetooth.h>
#include <openobex/obex.h>
#define EOBEX_OK 0
#define EOBEX_ABORT 1
#define EOBEX_HUP 2
#define EOBEX_PARSE 3
/*
* This struct came from the affix/include/affix/obex.h file, it holds all the
* information for a client connection like what operation is currently being
* carried out and the openobex connection handle.
*/
typedef struct client_context {
int serverdone;
int clientdone;
char *get_name; /* Name of last get-request */
int rsp; /* error code */
int opcode;
char *arg; /* response storage place */
uint32_t con_id; /* connection ide */
void *private;
} client_context_t;
C Source File:- my_bt_push.c
/* This code will send file to BT device(i am hard coding target BT addr and file name). In this BT addr and port no. is hard coded. Uses BtTransportConnect, hence bluez beneath as a transport*/
#include "my_bt_push.h"
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
/*
* prototypes for local functions
*/
uint8_t *easy_readfile(const char *filename, int *file_size);
int get_filesize(const char *filename);
void request_done(obex_t * handle, obex_object_t * object, int obex_cmd, int obex_rsp);
void obex_event(obex_t * handle, obex_object_t * object, int mode, int event,int obex_cmd, int obex_rsp);
int handle_response(obex_t * handle );
int get_filesize(const char *filename)
{
struct stat stats;
stat(filename, &stats);
return (int) stats.st_size;
}
uint8_t *easy_readfile(const char *filename, int *file_size)
{
int actual;
int fd;
uint8_t *buf;
fd = open(filename, O_RDONLY, 0);
if (fd == -1) {
return NULL;
}
*file_size = get_filesize(filename);
printf("name=%s, size=%d\n", filename, *file_size);
if (!(buf = malloc(*file_size))) {
return NULL;
}
actual = read(fd, buf, *file_size);
close(fd);
*file_size = actual;
return buf;
}
void request_done(obex_t * handle, obex_object_t * object, int obex_cmd, int obex_rsp)
{
client_context_t *gt = OBEX_GetUserData(handle);
printf("Command (%02x) has now finished, rsp: %02x\n", obex_cmd, obex_rsp);
switch (obex_cmd)
{
case OBEX_CMD_DISCONNECT:
printf("Disconnect done!\n");
OBEX_TransportDisconnect(handle);
gt->clientdone = 1;
break;
case OBEX_CMD_CONNECT:
printf("Connected!\n");
/* connect_client(handle, object, obex_rsp); */
gt->clientdone = 1;
break;
case OBEX_CMD_GET:
printf("\n\n*** Warning, getclient commented out\n");
/* get_client(handle, object, obex_rsp); */
gt->clientdone = 1;
break;
case OBEX_CMD_PUT:
/* put_client(handle, object, obex_rsp); */
gt->clientdone = 1;
break;
case OBEX_CMD_SETPATH:
printf("\n\n*** Warning, setpath_cleitn commented out\n");
/* setpath_client(handle, object, obex_rsp); */
gt->clientdone = 1;
break;
default:
printf("Command (%02x) has now finished\n", obex_cmd);
break;
}
}
void obex_event(obex_t * handle, obex_object_t * object, int mode, int event,
int obex_cmd, int obex_rsp)
{
client_context_t *gt;
gt = OBEX_GetUserData(handle);
printf("obex_event: client_context_t = %p\n", gt);
switch (event) {
case OBEX_EV_PROGRESS:
printf("Made some progress...\n");
break;
case OBEX_EV_ABORT:
printf("Request aborted!\n");
gt->rsp = -EOBEX_ABORT;
break;
case OBEX_EV_REQDONE:
printf("ReqDone\n");
request_done(handle, object, obex_cmd, obex_rsp);
/* server_done(handle, object, obex_cmd, obex_rsp); */
break;
case OBEX_EV_REQHINT:
/* Accept any command. Not rellay good, but this is a test-program :
* ) */
/* OBEX_ObjectSetRsp(object, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); */
printf("SetResp\n");
break;
case OBEX_EV_REQ:
/* server_request(handle, object, event, obex_cmd); */
printf("Server request\n");
break;
case OBEX_EV_LINKERR:
OBEX_TransportDisconnect(handle);
printf("Link broken!\n");
gt->rsp = -EOBEX_HUP;
break;
case OBEX_EV_PARSEERR:
printf("Parse error!\n");
gt->rsp = -EOBEX_PARSE;
break;
default:
printf("Unknown event %02x!\n", event);
break;
}
}
int handle_response(obex_t * handle)
{
int err = 0;
client_context_t *gt = OBEX_GetUserData(handle);
gt->clientdone = 0;
while (!gt->clientdone) {
if ((err = OBEX_HandleInput(handle, 1)) < 0) {
printf("Error while doing OBEX_HandleInput()\n");
break;
}
err = (gt->rsp == EOBEX_OK) ? 0 : gt->rsp;
}
return err;
}
int main(int argc, char *argv[])
{
int err;
obex_object_t *oo;
obex_headerdata_t hv;
obex_t *handle;
uint8_t *buf;
int file_size;
char *namebuf;
int name_len;
char *name, *path;
client_context_t *gt;
bdaddr_t bdaddr;
char target_addr[18]="00:12:37:4B:DE:20";
uint8_t port=9;
str2ba(target_addr,&bdaddr);
name=(char *)malloc(5);
strcpy(name,"Rose");
path=(char *)malloc(50);
strcpy(path,"/home/rupesh/nature.jpg");
name_len = (strlen(name) + 1) << 1;
if ((namebuf = malloc(name_len)))
{
OBEX_CharToUnicode((uint8_t *) namebuf, (uint8_t *) name, name_len);
}
buf = easy_readfile(path, &file_size);
if (buf == NULL)
{
printf("Can't find file %s\n", name);
exit(1);
}
gt = malloc(sizeof(client_context_t));
memset(gt, 0, sizeof(client_context_t));
if (!(handle = OBEX_Init(OBEX_TRANS_BLUETOOTH, obex_event, 0)))
{
printf("OBEX_Init failed: %s\n");
err = -1;
exit(1);
}
OBEX_SetUserData(handle, gt);
err = BtOBEX_TransportConnect(handle, BDADDR_ANY, &bdaddr, (uint8_t)port);
perror("BtTransportConeect:");
/*{
printf("Can not Connect to BT Transport Error=%d\n",err);
perror("BT Transport Failed:" );
exit(1);
}*/
oo = OBEX_ObjectNew(handle, OBEX_CMD_CONNECT);
printf("Created new objext\n");
err = OBEX_Request(handle, oo);
printf("Started a new request\n");
err = handle_response(handle);
printf("Connection return code: %d, id: %d\n", err);
printf("Connection established\n");
gt = OBEX_GetUserData(handle);
printf("obex_push: client_context_t = %p\n", gt);
//gt->opcode = OBEX_PUSH;
printf("Sending file: %s, path: %s, size: %d\n", name, path, file_size);
oo = OBEX_ObjectNew(handle, OBEX_CMD_PUT);
hv.bs = (uint8_t *) namebuf;
OBEX_ObjectAddHeader(handle, oo, OBEX_HDR_NAME, hv, name_len, 0);
hv.bq4 = file_size;
OBEX_ObjectAddHeader(handle, oo, OBEX_HDR_LENGTH, hv, sizeof(uint32_t), 0);
hv.bs = buf;
OBEX_ObjectAddHeader(handle, oo, OBEX_HDR_BODY, hv, file_size, 0);
err = OBEX_Request(handle, oo);
err = handle_response(handle);
}
------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________ Openobex-users mailing list [email protected] http://lists.sourceforge.net/lists/listinfo/openobex-users
