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 + -
显示快捷键?