⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 obex_test_client.c

📁 这是Linux环境下的openobex
💻 C
字号:
/********************************************************************* *                 * Filename:      obex_test_client.c * Version:       0.8 * Description:   Client OBEX Commands * Status:        Experimental. * Author:        Pontus Fuchs <pontus.fuchs@tactel.se> * Created at:    Sun Aug 13 03:00:28 PM CEST 2000 * CVS ID:        $Id: obex_test_client.c,v 1.16 2006/01/03 18:36:15 holtmann Exp $ * *     Copyright (c) 2000, Pontus Fuchs, All Rights Reserved. * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU Library General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <libgen.h>#include <string.h>#include <openobex/obex.h>#include "obex_io.h"#include "obex_test_client.h"#include "obex_test.h"#define TRUE  1#define FALSE 0#define OBEX_STREAM_CHUNK       4096uint8_t buffer[OBEX_STREAM_CHUNK];int fileDesc;//// Wait for an obex command to finish.//void syncwait(obex_t *handle){	struct context *gt;	int ret;		gt = OBEX_GetUserData(handle);	while(!gt->clientdone) {		//printf("syncwait()\n");		ret = OBEX_HandleInput(handle, 10);		if(ret < 0) {			printf("Error while doing OBEX_HandleInput()\n");			break;		}		if(ret == 0) {			/* If running cable. We get no link-errors, so cancel on timeout */			printf("Timeout waiting for data. Aborting\n");			OBEX_CancelRequest(handle, FALSE);			break;		}	}	gt->clientdone = FALSE;}//////void client_done(obex_t *handle, obex_object_t *object, int obex_cmd, int obex_rsp){	struct context *gt;	gt = OBEX_GetUserData(handle);	switch(obex_cmd)	{	case OBEX_CMD_CONNECT:		connect_client_done(handle, object, obex_rsp);		break;	case OBEX_CMD_DISCONNECT:		disconnect_client_done(handle, object, obex_rsp);		break;	case OBEX_CMD_PUT:		put_client_done(handle, object, obex_rsp);		break;	case OBEX_CMD_GET:		get_client_done(handle, object, obex_rsp, gt->get_name);		break;	case OBEX_CMD_SETPATH:		setpath_client_done(handle, object, obex_rsp);		break;	}	gt->clientdone = TRUE;}//////void connect_client(obex_t *handle){	obex_object_t *object;	obex_headerdata_t hd;	if(! (object = OBEX_ObjectNew(handle, OBEX_CMD_CONNECT)))	{		printf("Error\n");		return;	}	hd.bs = (uint8_t *) "Linux";	if(OBEX_ObjectAddHeader(handle, object, OBEX_HDR_WHO, hd, 6,				OBEX_FL_FIT_ONE_PACKET) < 0)	{		printf("Error adding header\n");		OBEX_ObjectDelete(handle, object);		return;	}	OBEX_Request(handle, object);	syncwait(handle);}//////void connect_client_done(obex_t *handle, obex_object_t *object, int obex_rsp){	uint8_t *nonhdrdata;	if(obex_rsp == OBEX_RSP_SUCCESS) {		printf("Connect OK!\n");		if(OBEX_ObjectGetNonHdrData(object, &nonhdrdata) == 4) {			printf("Version: 0x%02x. Flags: 0x%02x\n", nonhdrdata[0], nonhdrdata[1]);		}	}		else {		printf("Connect failed 0x%02x!\n", obex_rsp);	}}//////void disconnect_client(obex_t *handle){	obex_object_t *object;	if(! (object = OBEX_ObjectNew(handle, OBEX_CMD_DISCONNECT)))	{		printf("Error\n");		return;	}	OBEX_Request(handle, object);	syncwait(handle);}//////void disconnect_client_done(obex_t *handle, obex_object_t *object, int obex_rsp){	printf("Disconnect done!\n");	OBEX_TransportDisconnect(handle);}int fillstream(obex_t *handle, obex_object_t *object){	int                    actual;	obex_headerdata_t       hv;	printf("Filling stream!\n");	actual = read(fileDesc, buffer, OBEX_STREAM_CHUNK);	if(actual > 0) {		/* Read was ok! */		hv.bs = buffer;		OBEX_ObjectAddHeader(handle, object, OBEX_HDR_BODY,				hv, actual, OBEX_FL_STREAM_DATA);	}	else if(actual == 0) {		/* EOF */		hv.bs = buffer;		close(fileDesc); fileDesc = -1;		OBEX_ObjectAddHeader(handle, object, OBEX_HDR_BODY,				hv, 0, OBEX_FL_STREAM_DATAEND);	}	else {		/* Error */		hv.bs = NULL;		close(fileDesc); fileDesc = -1;		OBEX_ObjectAddHeader(handle, object, OBEX_HDR_BODY,				hv, 0, OBEX_FL_STREAM_DATA);	}	return actual;}	void push_client(obex_t *handle){	obex_object_t *object;	char fname[200];	unsigned int uname_size;	char *bfname;	uint8_t *uname;	obex_headerdata_t hd;		uint8_t *buf;	int file_size;	printf("PUSH filename> ");	scanf("%s", fname);	bfname = strdup(basename(fname));	buf = easy_readfile(fname, &file_size);	if(buf == NULL)		return;	fileDesc = open(fname, O_RDONLY, 0);	if (fileDesc < 0) {		free(buf);		free(bfname);		return;	}	printf("Going to send %s(%s), %d bytes\n",fname,bfname, file_size);	/* Build object */	object = OBEX_ObjectNew(handle, OBEX_CMD_PUT);		uname_size = (strlen(bfname)+1)<<1;	uname = malloc(uname_size);	OBEX_CharToUnicode(uname, (uint8_t *) bfname, uname_size);	hd.bs = uname;	OBEX_ObjectAddHeader(handle, object, OBEX_HDR_NAME, hd, uname_size, 0);	hd.bq4 = file_size;	OBEX_ObjectAddHeader(handle, object, OBEX_HDR_LENGTH, hd, sizeof(uint32_t), 0);	hd.bs = NULL;	OBEX_ObjectAddHeader(handle, object, OBEX_HDR_BODY, hd, 0, OBEX_FL_STREAM_START);	free(buf);	free(uname);	free(bfname); 	OBEX_Request(handle, object);	syncwait(handle);}//////void put_client(obex_t *handle){	obex_object_t *object;	char lname[200];	char rname[200];	unsigned int rname_size;	obex_headerdata_t hd;		uint8_t *buf;	int file_size;	printf("PUT file (local, remote)> ");	scanf("%s %s", lname, rname);	buf = easy_readfile(lname, &file_size);	if(buf == NULL)		return;	printf("Going to send %d bytes\n", file_size);	/* Build object */	object = OBEX_ObjectNew(handle, OBEX_CMD_PUT);		rname_size = OBEX_CharToUnicode((uint8_t *) rname, (uint8_t *) rname, sizeof(rname));	hd.bq4 = file_size;	OBEX_ObjectAddHeader(handle, object, OBEX_HDR_LENGTH, hd, 4, 0);	hd.bs = (uint8_t *) rname;	OBEX_ObjectAddHeader(handle, object, OBEX_HDR_NAME, hd, rname_size, 0);	hd.bs = buf;	OBEX_ObjectAddHeader(handle, object, OBEX_HDR_BODY, hd, file_size, 0);	free(buf); 	OBEX_Request(handle, object);	syncwait(handle);}//////void put_client_done(obex_t *handle, obex_object_t *object, int obex_rsp){	if(obex_rsp == OBEX_RSP_SUCCESS) {		printf("PUT successful!\n");	}		else {		printf("PUT failed 0x%02x!\n", obex_rsp);	}}//////void get_client(obex_t *handle, struct context *gt){	obex_object_t *object;	uint8_t rname[200];	char req_name[200];	int rname_size;	obex_headerdata_t hd;	printf("GET File> ");	scanf("%s", req_name);	if(! (object = OBEX_ObjectNew(handle, OBEX_CMD_GET)))	{		printf("Error\n");		return;	}	rname_size = OBEX_CharToUnicode(rname, (uint8_t *) req_name, sizeof(rname));	hd.bs = rname;	OBEX_ObjectAddHeader(handle, object, OBEX_HDR_NAME, hd,				rname_size, OBEX_FL_FIT_ONE_PACKET);	/* Remember the name of the file we are getting so we can save	   it when we get the response */	gt->get_name = req_name;	OBEX_Request(handle, object);	syncwait(handle);}//////void get_client_done(obex_t *handle, obex_object_t *object, int obex_rsp, char *name){	obex_headerdata_t hv;	uint8_t hi;	uint32_t hlen;	const uint8_t *body = NULL;	int body_len = 0;	if(obex_rsp != OBEX_RSP_SUCCESS) {		printf("GET failed 0x%02x!\n", obex_rsp);		return;	}	while (OBEX_ObjectGetNextHeader(handle, object, &hi, &hv, &hlen))	{		if(hi == OBEX_HDR_BODY)	{		printf("%s() Found body\n", __FUNCTION__);			body = hv.bs;			body_len = hlen;			break;		}		else	{			printf("%s() Skipped header %02x\n", __FUNCTION__, hi);		}	}	if(!body) {		printf("No body found in answer!\n");		return;	}		printf("GET successful!\n");	safe_save_file(name, body, body_len);}	//////void setpath_client(obex_t *handle){	uint8_t setpath_data[2] = { 0, 0 };	obex_object_t *object;	char path[200];	int path_size;	obex_headerdata_t hd;	printf("SETPATH> ");	scanf("%s", path);	if(! (object = OBEX_ObjectNew(handle, OBEX_CMD_SETPATH)))	{		printf("Error\n");		return;	}	path_size = OBEX_CharToUnicode((uint8_t *) path, (uint8_t *) path, sizeof(path));	hd.bs = (uint8_t *) path;	OBEX_ObjectAddHeader(handle, object, OBEX_HDR_NAME, hd,				path_size, OBEX_FL_FIT_ONE_PACKET);	OBEX_ObjectSetNonHdrData(object, setpath_data, 2);	OBEX_Request(handle, object);	syncwait(handle);}//////void setpath_client_done(obex_t *handle, obex_object_t *object, int obex_rsp){	if(obex_rsp == OBEX_RSP_SUCCESS) {		printf("SETPATH successful!\n");	}		else {		printf("SETPATH failed 0x%02x!\n", obex_rsp);	}}

⌨️ 快捷键说明

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