256 lines
6 KiB
C
256 lines
6 KiB
C
|
/*********************************************************************
|
||
|
*
|
||
|
* Filename: obex_common.c
|
||
|
* Version: 0.4
|
||
|
* Description: Utility-functions to act as a PUT server and client
|
||
|
* Status: Experimental.
|
||
|
* Author: Pontus Fuchs <pontus.fuchs@tactel.se>
|
||
|
* Created at: Sat Nov 20 10:54:14 1999
|
||
|
* Modified at: Sun Aug 13 01:54:05 PM CEST 2000
|
||
|
* Modified by: Pontus Fuchs <pontus.fuchs@tactel.se>
|
||
|
* Modified at: Sun Oct 06 10:00:00 2001
|
||
|
* Modified by: Ben Moore <ben@netjunki.org>
|
||
|
*
|
||
|
* Copyright (c) 1999, 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 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
|
||
|
*
|
||
|
********************************************************************/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
#include <openobex/obex.h>
|
||
|
#include "obex_put_common.h"
|
||
|
#include "obex_io.h"
|
||
|
#include "wmcapshare.h"
|
||
|
|
||
|
extern obex_t *handle;
|
||
|
extern volatile int finished;
|
||
|
extern volatile int state;
|
||
|
extern gchar *savedir; /*= "/home/bento/Work/Capture/";*/
|
||
|
|
||
|
|
||
|
volatile int last_rsp = OBEX_RSP_BAD_REQUEST;
|
||
|
|
||
|
/*
|
||
|
* Function put_done()
|
||
|
*
|
||
|
* Parse what we got from a PUT
|
||
|
*
|
||
|
*/
|
||
|
void put_done(obex_object_t *object)
|
||
|
{
|
||
|
obex_headerdata_t hv;
|
||
|
guint8 hi;
|
||
|
gint hlen;
|
||
|
|
||
|
const guint8 *body = NULL;
|
||
|
gint body_len = 0;
|
||
|
gchar *name = NULL;
|
||
|
gchar *namebuf = NULL;
|
||
|
|
||
|
while(OBEX_ObjectGetNextHeader(handle, object, &hi, &hv, &hlen)) {
|
||
|
switch(hi) {
|
||
|
case OBEX_HDR_BODY:
|
||
|
body = hv.bs;
|
||
|
body_len = hlen;
|
||
|
break;
|
||
|
case OBEX_HDR_NAME:
|
||
|
if( (namebuf = g_malloc(hlen / 2))) {
|
||
|
OBEX_UnicodeToChar(namebuf, hv.bs, hlen);
|
||
|
name = namebuf;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case OBEX_HDR_LENGTH:
|
||
|
g_print("HEADER_LENGTH = %d\n", hv.bq4);
|
||
|
break;
|
||
|
|
||
|
case HEADER_CREATOR_ID:
|
||
|
g_print("CREATORID = %#x\n", hv.bq4);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
g_print(G_GNUC_FUNCTION "() Skipped header %02x\n", hi);
|
||
|
}
|
||
|
}
|
||
|
if(!body) {
|
||
|
g_print("Got a PUT without a body\n");
|
||
|
return;
|
||
|
}
|
||
|
if(!name) {
|
||
|
g_print("Got a PUT without a name. Setting name to %s\n", name);
|
||
|
name = "OBEX_PUT_Unknown_object";
|
||
|
|
||
|
}
|
||
|
safe_save_file(name, body, body_len, savedir);
|
||
|
g_free(namebuf);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Function server_indication()
|
||
|
*
|
||
|
* Called when a request is about to come or has come.
|
||
|
*
|
||
|
*/
|
||
|
void server_request(obex_object_t *object, gint event, gint cmd)
|
||
|
{
|
||
|
switch(cmd) {
|
||
|
case OBEX_CMD_SETPATH:
|
||
|
g_print("Received SETPATH command\n");
|
||
|
OBEX_ObjectSetRsp(object, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
|
||
|
break;
|
||
|
case OBEX_CMD_PUT:
|
||
|
OBEX_ObjectSetRsp(object, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
|
||
|
put_done(object);
|
||
|
break;
|
||
|
case OBEX_CMD_CONNECT:
|
||
|
OBEX_ObjectSetRsp(object, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS);
|
||
|
break;
|
||
|
case OBEX_CMD_DISCONNECT:
|
||
|
OBEX_ObjectSetRsp(object, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS);
|
||
|
break;
|
||
|
default:
|
||
|
g_print(G_GNUC_FUNCTION "() Denied %02x request\n", cmd);
|
||
|
OBEX_ObjectSetRsp(object, OBEX_RSP_NOT_IMPLEMENTED, OBEX_RSP_NOT_IMPLEMENTED);
|
||
|
break;
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Function client_done_indication()
|
||
|
*
|
||
|
* Called when a server-operation has finished
|
||
|
*
|
||
|
*/
|
||
|
void server_done(obex_object_t *object, gint obex_cmd)
|
||
|
{
|
||
|
/* Quit if DISCONNECT has finished */
|
||
|
if(obex_cmd == OBEX_CMD_DISCONNECT)
|
||
|
finished = 1;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Function client_done()
|
||
|
*
|
||
|
* Called when a client-operation has finished
|
||
|
*
|
||
|
*/
|
||
|
void client_done(obex_object_t *object, gint obex_cmd, gint obex_rsp)
|
||
|
{
|
||
|
last_rsp = obex_rsp;
|
||
|
finished = TRUE;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Function obex_event ()
|
||
|
*
|
||
|
* Called by the obex-layer when some event occurs.
|
||
|
*
|
||
|
*/
|
||
|
void obex_event(obex_t *handle, obex_object_t *object, gint mode, gint event, gint obex_cmd, gint obex_rsp)
|
||
|
{
|
||
|
switch (event) {
|
||
|
case OBEX_EV_PROGRESS:
|
||
|
g_print(".");
|
||
|
updateDisplay();
|
||
|
break;
|
||
|
case OBEX_EV_REQDONE:
|
||
|
g_print("\n");
|
||
|
/* Comes when a command has finished. */
|
||
|
if(mode == OBEX_CLIENT)
|
||
|
client_done(object, obex_cmd, obex_rsp);
|
||
|
else
|
||
|
server_done(object, obex_cmd);
|
||
|
break;
|
||
|
case OBEX_EV_REQHINT:
|
||
|
/* Comes BEFORE the lib parses anything. */
|
||
|
switch(obex_cmd) {
|
||
|
case OBEX_CMD_PUT:
|
||
|
g_print("put\n");
|
||
|
state=CAP_RECIEVE;
|
||
|
updateDisplay();
|
||
|
OBEX_ObjectSetRsp(object, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
|
||
|
break;
|
||
|
case OBEX_CMD_CONNECT:
|
||
|
g_print("connect\n");
|
||
|
state=CAP_CONNECT;
|
||
|
updateDisplay();
|
||
|
OBEX_ObjectSetRsp(object, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
|
||
|
break;
|
||
|
case OBEX_CMD_DISCONNECT:
|
||
|
g_print("disconnect\n");
|
||
|
state=CAP_WAIT;
|
||
|
updateDisplay();
|
||
|
OBEX_ObjectSetRsp(object, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
|
||
|
break;
|
||
|
default:
|
||
|
OBEX_ObjectSetRsp(object, OBEX_RSP_NOT_IMPLEMENTED, OBEX_RSP_NOT_IMPLEMENTED);
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case OBEX_EV_REQ:
|
||
|
/* Comes when a server-request has been received. */
|
||
|
g_print("server request\n");
|
||
|
server_request(object, event, obex_cmd);
|
||
|
break;
|
||
|
case OBEX_EV_LINKERR:
|
||
|
g_print("Link broken (this does not have to be an error)!\n");
|
||
|
finished = 1;
|
||
|
break;
|
||
|
default:
|
||
|
g_print("Unknown event!\n");
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Function wait_for_rsp()
|
||
|
*
|
||
|
* Wait for a request to finish!
|
||
|
*
|
||
|
*/
|
||
|
int wait_for_rsp()
|
||
|
{
|
||
|
int ret;
|
||
|
|
||
|
while(!finished) {
|
||
|
ret = OBEX_HandleInput(handle, 1);
|
||
|
if (ret < 0)
|
||
|
return ret;
|
||
|
}
|
||
|
return last_rsp;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Function do_sync_request()
|
||
|
*
|
||
|
* Execute an OBEX-request synchronously.
|
||
|
*
|
||
|
*/
|
||
|
int do_sync_request(obex_t *handle, obex_object_t *object, gint async)
|
||
|
{
|
||
|
gint ret;
|
||
|
OBEX_Request(handle, object);
|
||
|
ret = wait_for_rsp();
|
||
|
finished = FALSE;
|
||
|
return ret;
|
||
|
}
|