ircp_client.c

来自「sparc硬件平台上的红外协议」· C语言 代码 · 共 320 行

C
320
字号
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/stat.h>#include "obex.h"#include "ircp.h"#include "ircp_client.h"#include "ircp_io.h"#include "obex_main.h"#define TRUE  1#define FALSE 0//// Add more data to stream.//static int cli_fillstream(ircp_client_t *cli, obex_object_t *object){	int actual;	obex_headerdata_t hdd;		DEBUG(4, "\n");		actual = srv_dfile_read(cli->fd, cli->buf, STREAM_CHUNK);		DEBUG(4, "Read %d bytes\n", actual);		if(actual > 0) {		/* Read was ok! */		hdd.bs = cli->buf;		OBEX_ObjectAddHeader(cli->obexhandle, object, OBEX_HDR_BODY,			hdd, actual, OBEX_FL_STREAM_DATA);	}	else if(actual == 0) {		/* EOF */		hdd.bs = cli->buf;		if (cli->fd != -1)			srv_dfile_close(cli->fd);		cli->fd = -1;		OBEX_ObjectAddHeader(cli->obexhandle, object, OBEX_HDR_BODY,			hdd, 0, OBEX_FL_STREAM_DATAEND);	}	else {		/* Error */		hdd.bs = NULL;		if (cli->fd != -1)			srv_dfile_close(cli->fd);		cli->fd = -1;		OBEX_ObjectAddHeader(cli->obexhandle, object, OBEX_HDR_BODY,			hdd, 0, OBEX_FL_STREAM_DATA);	}		return actual;}//// Incoming event from OpenOBEX.//static void cli_obex_event(obex_t *handle, obex_object_t *object, int mode, int event, int obex_cmd, int obex_rsp){	ircp_client_t *cli;		cli = OBEX_GetUserData(handle);		switch (event)	{	case OBEX_EV_PROGRESS:		break;	case OBEX_EV_REQDONE:		cli->finished = TRUE;		if(obex_rsp == OBEX_RSP_SUCCESS)			cli->success = TRUE;		else			cli->success = FALSE;		cli->obex_rsp = obex_rsp;		break;			case OBEX_EV_LINKERR:		cli->finished = 1;		cli->success = FALSE;		break;			case OBEX_EV_STREAMEMPTY:		cli_fillstream(cli, object);		break;			default:		DEBUG(1, "Unknown event %d\n", event);		break;	}}//// Do an OBEX request sync.//static int cli_sync_request(ircp_client_t *cli, obex_object_t *object){	int ret;	DEBUG(4, "\n");	cli->finished = FALSE;		OBEX_Request(cli->obexhandle, object);		while(cli->finished == FALSE) {		ret = OBEX_HandleInput(cli->obexhandle, 20);				DEBUG(4, "ret = %d\n", ret);				if (ret <= 0)			return -1;	}		DEBUG(4, "Done success=%d\n", cli->success);		if(cli->success)		return 1;	else		return -1;}//// Create an ircp client//ircp_client_t *ircp_cli_open(ircp_info_cb_t infocb){	ircp_client_t *cli;		DEBUG(1, "\n");	cli = malloc(sizeof(ircp_client_t));	if(cli == NULL)	{		DEBUG(4,"can not alloc memory\n");		return NULL;	}	memset(cli,0,sizeof(ircp_client_t));	cli->infocb = infocb;	cli->fd = -1;		cli->obexhandle = OBEX_Init(OBEX_TRANS_IRDA, cli_obex_event, 0);		if(cli->obexhandle == NULL) {		goto out_err;	}	OBEX_SetUserData(cli->obexhandle, cli);		/* Buffer for body */	cli->buf = malloc(STREAM_CHUNK);	//add by xugangan	if(cli->buf==NULL)	{		DEBUG(4,"can not alloc memory\n");		goto	out_err;	}	memset(cli->buf,0,STREAM_CHUNK);	return cli;	out_err:	if(cli->obexhandle != NULL)		OBEX_Cleanup(cli->obexhandle);	free(cli);	return NULL;}//// 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);}//// Do connect as client//int irobex_connet(obex_t *self, const char *service){	irobex_prepare_connect(self, service);	irda_create();	}int ircp_cli_connect(ircp_client_t *cli){	obex_object_t *object;	int ret;			DEBUG(7, "\n");	ircp_return_val_if_fail(cli != NULL, -1);		cli->infocb(IRCP_EV_CONNECTING, "");		object = OBEX_ObjectNew(cli->obexhandle, OBEX_CMD_CONNECT);	ret = cli_sync_request(cli, object);		if(ret < 0)		cli->infocb(IRCP_EV_ERR, "");	else		cli->infocb(IRCP_EV_OK, "");		return ret;}//// Do disconnect as client//int ircp_cli_disconnect(ircp_client_t *cli){	obex_object_t *object;	int ret;		DEBUG(4, "\n");	ircp_return_val_if_fail(cli != NULL, -1);		cli->infocb(IRCP_EV_DISCONNECTING, "");		object = OBEX_ObjectNew(cli->obexhandle, OBEX_CMD_DISCONNECT);	ret = cli_sync_request(cli, object);		if(ret < 0)		cli->infocb(IRCP_EV_ERR, "");	else		cli->infocb(IRCP_EV_OK, "");		OBEX_TransportDisconnect(cli->obexhandle);	return ret;}//// Do an OBEX PUT.//static int ircp_put_file(ircp_client_t *cli, char *localname, char *remotename){	obex_object_t *object;	int ret;		cli->infocb(IRCP_EV_SENDING, localname);		DEBUG(4, "Sending %s -> %s\n", localname, remotename);	ircp_return_val_if_fail(cli != NULL, -1);		object = build_object_from_file(cli->obexhandle, localname, remotename);			cli->fd = srv_dfile_open(localname);	if(cli->fd <= 0)	{		ret = -1;	}	else		ret = cli_sync_request(cli, object);	if (cli->fd != -1)		srv_dfile_close(cli->fd);		if(ret < 0)		cli->infocb(IRCP_EV_ERR, localname);	else		cli->infocb(IRCP_EV_OK, localname);		return ret;}//// Callback from dirtraverse.//static int ircp_visit(int action, char *name, char *path, void *userdata){	char *remotename;	int ret = -1;		DEBUG(4, "\n");	switch(action) {	case VISIT_FILE:		// Strip /'s before sending file		remotename = strrchr(name, '/');		if(remotename == NULL)			remotename = name;		else			remotename++;		ret = ircp_put_file(userdata, name, remotename);		break;			default:		break;	}	DEBUG(4, "returning %d\n", ret);	return ret;}//// Put file or directory//int ircp_put(ircp_client_t *cli,char *filename){	struct stat statbuf;	int ret;		ret = ircp_visit(VISIT_FILE, filename, "", cli);	return ret;	}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?