Exemple #1
0
obex_t *obex_open(int fd, obex_callback_t *callback, void *data)
{
	obex_t *handle;
	obex_context_t *context;

	context = malloc(sizeof(*context));
	if (!context)
		return NULL;

	memset(context, 0, sizeof(*context));

	context->state = OBEX_OPEN;
	context->cid = CID_INVALID;

	handle = OBEX_Init(OBEX_TRANS_FD, obex_event, 0);
	if (!handle) {
		free(context);
		return NULL;
	}

	context->user_data = data;
	context->callback = callback;
	context->tx_max = sizeof(context->buf);

	OBEX_SetUserData(handle, context);

	OBEX_SetTransportMTU(handle, sizeof(context->buf), sizeof(context->buf));

	if (FdOBEX_TransportSetup(handle, fd, fd, 0) < 0) {
		OBEX_Cleanup(handle);
		return NULL;
	}

        return handle;
}
Exemple #2
0
//
// Create an ircp client
//
ircp_client_t *ircp_cli_open(ircp_info_cb_t infocb)
{
	ircp_client_t *cli;

	DEBUG(4, "\n");
	cli = malloc(sizeof(ircp_client_t));
	if(cli == NULL)
		return NULL;

	cli->infocb = infocb;
	cli->fd = -1;

#ifdef DEBUG_TCP
	cli->obexhandle = OBEX_Init(OBEX_TRANS_INET, cli_obex_event, 0);
#else
	cli->obexhandle = OBEX_Init(OBEX_TRANS_IRDA, cli_obex_event, 0);
#endif

	if(cli->obexhandle == NULL) {
		goto out_err;
	}
	OBEX_SetUserData(cli->obexhandle, cli);
	
	/* Buffer for body */
	cli->buf = malloc(STREAM_CHUNK);
	return cli;

out_err:
	if(cli->obexhandle != NULL)
		OBEX_Cleanup(cli->obexhandle);
	free(cli);
	return NULL;
}
Exemple #3
0
//
// Close an ircp client
//
void ircp_cli_close(ircp_client_t *cli)
{
	DEBUG(4, "\n");
	ircp_return_if_fail(cli != NULL);

	OBEX_Cleanup(cli->obexhandle);
	free(cli->buf);
	free(cli);
}
Exemple #4
0
static void
OBEXServer_dealloc(OBEXServer *self)
{
    if (self->obex)
        OBEX_Cleanup(self->obex);
    Py_XDECREF(self->fileobj);
    Py_XDECREF(self->tempbuf);
    self->ob_type->tp_free((PyObject *)self);
}
Exemple #5
0
/**
	Close an obexftp client and free the resources.

	\param cli
		the obexftp_client_t to be shut done and free'd.
		It's save to pass NULL here.

	Closes the given obexftp client and frees the resources.
	It's recommended to set the client reference to NULL afterwards.
 */
void obexftp_close(obexftp_client_t *cli)
{
	DEBUG(3, "%s()\n", __func__);
	return_if_fail(cli != NULL);

	OBEX_Cleanup(cli->obexhandle);
	if (cli->buf_data) {
		DEBUG(1, "%s: Warning: purging left-over buffer.\n", __func__);
		free(cli->buf_data);
	}
	cache_purge(&cli->cache, NULL);
	free(cli->stream_chunk);
	free(cli);
}
Exemple #6
0
void obex_close(obex_t *handle)
{
	obex_context_t *context = OBEX_GetUserData(handle);
	g_return_if_fail(context != NULL);

	OBEX_SetUserData(handle, NULL);

	if (context->pending)
		OBEX_ObjectDelete(handle, context->pending);

	free(context);

	OBEX_Cleanup(handle);
}
Exemple #7
0
void obex_close(int od)
{
	obex_t *handle = obex_handles[0];
	struct obex_context *context;

	context = OBEX_GetUserData(handle);

	if (context->state == OBEX_CONNECTED)
		obex_disconnect(od);

	OBEX_SetUserData(handle, NULL);

	free(context);

	obex_handles[0] = NULL;

	OBEX_Cleanup(handle);
}
Exemple #8
0
/*
 * obex_start_server()
 *
 * runs obex server fds transport
 */
int obexsrv_run(obexsrv_t *srv, int rfd, int wfd)
{
	int	err = 0, to;

	srv->handle = OBEX_Init(OBEX_TRANS_FD, obexsrv_event, 0);
	if (!srv->handle) {
		BTERROR( "OBEX_Init failed:%s", strerror(errno));
		return -1;
	}

	/* init some members */
	srv->sfd = -1;
	srv->name = NULL;
	srv->flags = 0;
	srv->buf = NULL;

	// set private pointer
	OBEX_SetUserData(srv->handle, srv);

	FdOBEX_TransportSetup(srv->handle, rfd, wfd, 0);
	
	for (;;) {
		/* request processing loop */
		DBPRT("Processing request...\n");
		srv->serverdone = FALSE;
		to = 1000;	/* unlimmited - waiting for request */
		while (!srv->serverdone) {
			if ((err = OBEX_HandleInput(srv->handle, to)) < 0) {
				BTERROR("Error while doing OBEX_HandleInput()");
				break;
			}
			to = 5;	/* processing request */
		}
		if (srv->state == SRVSTATE_CLOSED)
			break;
		if (err < 0)
			break;
	}
	OBEX_Cleanup(srv->handle);
	srv->handle = NULL;
	return 0;
}
int main (int argc, char *argv[])
{
    char cmd[10];
    int num, end = 0;
    int cobex = FALSE, tcpobex = FALSE, btobex = FALSE, r320 = FALSE, usbobex = FALSE;
    obex_t *handle;
#ifdef HAVE_BLUETOOTH
    bdaddr_t bdaddr;
    uint8_t channel = 0;
#endif

#ifdef HAVE_USB
    obex_interface_t *obex_intf;
#endif

    struct context global_context = {0,};

#ifndef _WIN32

    char *port;
    obex_ctrans_t custfunc;

    if( (argc == 2 || argc ==3) && (strcmp(argv[1], "-s") == 0 ) )
        cobex = TRUE;
    if( (argc == 2 || argc ==3) && (strcmp(argv[1], "-r") == 0 ) ) {
        cobex = TRUE;
        r320 = TRUE;
    }
#endif

    if( (argc == 2) && (strcmp(argv[1], "-i") == 0 ) )
        tcpobex = TRUE;
    if( (argc >= 2) && (strcmp(argv[1], "-b") == 0 ) )
        btobex = TRUE;
    if( (argc >= 2) && (strcmp(argv[1], "-u") == 0 ) )
        usbobex = TRUE;

    if(cobex)	{
#ifndef _WIN32
        if(argc == 3)
            port = argv[2];
        else
            port = "/dev/ttyS0";

        if(r320)
            printf("OBEX to R320 on %s!\n", port);
        else
            printf("OBEX on %s!\n", port);

        custfunc.customdata = cobex_open(port, r320);

        if(custfunc.customdata == NULL) {
            printf("cobex_open() failed\n");
            return -1;
        }

        if(! (handle = OBEX_Init(OBEX_TRANS_CUSTOM, obex_event, 0)))	{
            perror( "OBEX_Init failed");
            return -1;
        }

        custfunc.connect = cobex_connect;
        custfunc.disconnect = cobex_disconnect;
        custfunc.write = cobex_write;
        custfunc.handleinput = cobex_handle_input;
        custfunc.listen = cobex_connect;	// Listen and connect is 100% same on cable

        if(OBEX_RegisterCTransport(handle, &custfunc) < 0)	{
            printf("Custom transport callback-registration failed\n");
        }
#else
        printf("Not implemented in Win32 yet.\n");
#endif	// _WIN32
    }

    else if(tcpobex) {
        printf("Using TCP transport\n");
        if(! (handle = OBEX_Init(OBEX_TRANS_INET, obex_event, 0)))	{
            perror( "OBEX_Init failed");
            exit(0);
        }
    }
    else if(btobex) {
#ifndef _WIN32
        switch (argc) {
#ifdef HAVE_BLUETOOTH
        case 4:
            str2ba(argv[2], &bdaddr);
            channel = atoi(argv[3]);
            break;
        case 3:
            str2ba(argv[2], &bdaddr);
            if (bacmp(&bdaddr, BDADDR_ANY) == 0)
                channel = atoi(argv[2]);
            else
                channel = BT_CHANNEL;
            break;
        case 2:
            bacpy(&bdaddr, BDADDR_ANY);
            channel = BT_CHANNEL;
            break;
#endif
        default:
            printf("Wrong number of arguments\n");
            exit(0);
        }

        printf("Using Bluetooth RFCOMM transport\n");
        if(! (handle = OBEX_Init(OBEX_TRANS_BLUETOOTH, obex_event, 0)))      {
            perror( "OBEX_Init failed");
            exit(0);
        }
#else
        printf("Not implemented in Win32 yet.\n");
#endif	// _WIN32
    }
    else if(usbobex) {
#ifdef HAVE_USB
        int i, interfaces_number, intf_num;
        switch (argc) {
        case 2:
            printf("Using USB transport, querying available interfaces\n");
            if(! (handle = OBEX_Init(OBEX_TRANS_USB, obex_event, 0)))      {
                perror( "OBEX_Init failed");
                exit(0);
            }
            interfaces_number = OBEX_FindInterfaces(handle, &obex_intf);
            for (i=0; i < interfaces_number; i++)
                printf("Interface %d: %s %s %s\n", i,
                       obex_intf[i].usb.manufacturer,
                       obex_intf[i].usb.product,
                       obex_intf[i].usb.control_interface);
            printf("Use '%s -u interface_number' to run interactive OBEX test client\n", argv[0]);
            OBEX_Cleanup(handle);
            exit(0);
            break;
        case 3:
            intf_num = atoi(argv[2]);
            printf("Using USB transport \n");
            if(! (handle = OBEX_Init(OBEX_TRANS_USB, obex_event, 0)))      {
                perror( "OBEX_Init failed");
                exit(0);
            }

            interfaces_number = OBEX_FindInterfaces(handle, &obex_intf);
            if (intf_num >= interfaces_number) {
                printf( "Invalid interface number\n");
                exit(0);
            }
            obex_intf += intf_num;

            break;
        default:
            printf("Wrong number of arguments\n");
            exit(0);
        }
#else
        printf("Not compiled with USB support\n");
        exit(0);
#endif
    }
    else	{
        printf("Using IrDA transport\n");
        if(! (handle = OBEX_Init(OBEX_TRANS_IRDA, obex_event, 0)))	{
            perror( "OBEX_Init failed");
            exit(0);
        }
    }

    OBEX_SetUserData(handle, &global_context);

    printf( "OBEX Interactive test client/server.\n");

    while (!end) {
        printf("> ");
        num = scanf("%s", cmd);
        switch (cmd[0] | 0x20)	{
        case 'q':
            end=1;
            break;
        case 'g':
            get_client(handle, &global_context);
            break;
        case 't':
            setpath_client(handle);
            break;
        case 'p':
            put_client(handle);
            break;
        case 'x':
            push_client(handle);
            break;
        case 'c':
            /* First connect transport */
            if(tcpobex) {
                if(TcpOBEX_TransportConnect(handle, NULL, 0) < 0) {
                    printf("Transport connect error! (TCP)\n");
                    break;
                }
            }
            if(cobex) {
                if(OBEX_TransportConnect(handle, (void*) 1, 0) < 0) {
                    printf("Transport connect error! (Serial)\n");
                    break;
                }
            }
            if(btobex) {
#ifdef HAVE_BLUETOOTH
                if (bacmp(&bdaddr, BDADDR_ANY) == 0) {
                    printf("Device address error! (Bluetooth)\n");
                    break;
                }
                if(BtOBEX_TransportConnect(handle, BDADDR_ANY, &bdaddr, channel) <0) {
                    printf("Transport connect error! (Bluetooth)\n");
                    break;
                }
#else
                printf("Transport not found! (Bluetooth)\n");
#endif
            }
            if (usbobex) {
#ifdef HAVE_USB
                if (OBEX_InterfaceConnect(handle, obex_intf) < 0) {
                    printf("Transport connect error! (USB)\n");
                    break;
                }
#else
                printf("Transport not found! (USB)\n");
#endif
            }
            if (!tcpobex && !cobex && !btobex && !usbobex) {
                if(IrOBEX_TransportConnect(handle, IR_SERVICE) < 0) {
                    printf("Transport connect error! (IrDA)\n");
                    break;
                }
            }
            // Now send OBEX-connect.
            connect_client(handle);
            break;
        case 'd':
            disconnect_client(handle);
            break;
        case 's':
            /* First register server */
            if(tcpobex) {
                if(TcpOBEX_ServerRegister(handle, NULL, 0) < 0) {
                    printf("Server register error! (TCP)\n");
                    break;
                }
            }
            if(cobex) {
                if(OBEX_ServerRegister(handle, (void*) 1, 0) < 0) {
                    printf("Server register error! (Serial)\n");
                    break;
                }
            }
            if(btobex) {
#ifdef HAVE_BLUETOOTH
                if(BtOBEX_ServerRegister(handle, BDADDR_ANY, channel) < 0) {
                    printf("Server register error! (Bluetooth)\n");
                    break;
                }
#else
                printf("Transport not found! (Bluetooth)\n");
#endif
            }
            if (usbobex) {
                printf("Transport not found! (USB)\n");
            }
            if (!tcpobex && !cobex && !btobex && !usbobex) {
                if(IrOBEX_ServerRegister(handle, IR_SERVICE) < 0)	{
                    printf("Server register error! (IrDA)\n");
                    break;
                }
            }
            /* No process server events */
            server_do(handle);
            break;
        default:
            printf("Unknown command %s\n", cmd);
        }
    }
#ifndef _WIN32
    if(cobex)
        cobex_close(custfunc.customdata);
#endif

    return 0;
}
Exemple #10
0
obex_t *smartpen_connect(short vendor, short product)
{
	obex_t *handle;
	obex_object_t *obj;
	int rc, num, i;
	struct obex_state *state;
	obex_interface_t *obex_intf;
	obex_headerdata_t hd;
	int size, count;
	char *buf;

again:
	handle = OBEX_Init(OBEX_TRANS_USB, obex_event, 0);
	if (!handle)
		goto out;

        num = OBEX_EnumerateInterfaces(handle);
	for (i=0; i<num; i++) {
                obex_intf = OBEX_GetInterfaceByIndex(handle, i);
		if (!strcmp(obex_intf->usb.manufacturer, "Livescribe"))
			break;
	}

        if (i == num) {
		printf("No such device\n");
		handle = NULL;
		goto out;
        }

	state = malloc(sizeof(struct obex_state));
	if (!state) {
		handle = NULL;
		goto out;
	}
	memset(state, 0, sizeof(struct obex_state));

	if (!swizzle_usb(vendor, product)) {
		handle = NULL;
		goto out;
	}

        rc = OBEX_InterfaceConnect(handle, obex_intf);
        if (rc < 0) {
		printf("Connect failed %d\n", rc);
		handle = NULL;
		goto out;
	}

        OBEX_SetUserData(handle, state);
        OBEX_SetTransportMTU(handle, 0x400, 0x400);

        obj = OBEX_ObjectNew(handle, OBEX_CMD_CONNECT);
        hd.bs = (unsigned char *)"LivescribeService";
        size = strlen((char*)hd.bs)+1;
        OBEX_ObjectAddHeader(handle, obj, OBEX_HDR_TARGET, hd, size, 0);

        rc = OBEX_Request(handle, obj);

	count = state->req_done;
        while (rc == 0 && state->req_done <= count) {
            OBEX_HandleInput(handle, 100);
        }

	if (rc < 0 || !state->got_connid) {
		printf("Retry connection...\n");
		OBEX_Cleanup(handle);
		goto again;
	}

	buf = get_named_object(handle, "ppdata?key=pp0000", &rc);
	if (!buf) {
		printf("Retry connection...\n");
		OBEX_Cleanup(handle);
		pen_reset(vendor, product);
		goto again;
	}

out:
	return handle;
}