1 /* (c) 2003 by Marcin Wiacek */
2 /* www.irda.org OBEX specs 1.3 */
3 
4 #include "../../gsmstate.h"
5 
6 #include <stdio.h>
7 #include <string.h>
8 #include <stdlib.h>
9 
10 #if defined(GSM_ENABLE_BLUEOBEX) || defined(GSM_ENABLE_IRDAOBEX) || defined(GSM_ENABLE_ATOBEX)
11 
12 #include "../../gsmcomon.h"
13 #include "../../misc/coding/coding.h"
14 #include "obex.h"
15 
OBEX_WriteMessage(GSM_StateMachine * s,unsigned const char * MsgBuffer,size_t MsgLength,int type)16 static GSM_Error OBEX_WriteMessage (GSM_StateMachine *s, unsigned const char *MsgBuffer,
17 				    size_t MsgLength, int type)
18 {
19 	unsigned char	*buffer=NULL;
20 	int 		length=0,sent=0;
21 
22 	buffer = (unsigned char *)malloc(MsgLength + 3);
23 
24 	OBEXAddBlock(buffer, &length, type, MsgBuffer, MsgLength);
25 
26 	GSM_DumpMessageText(s, buffer+3, MsgLength, type);
27 	GSM_DumpMessageBinary(s, buffer+3, MsgLength, type);
28 
29 	/* Send it out... */
30 	sent = s->Device.Functions->WriteDevice(s,buffer,length);
31 
32 	free(buffer);
33 	buffer=NULL;
34 
35 	if (sent!=length) {
36 		return ERR_DEVICEWRITEERROR;
37 	}
38 	return ERR_NONE;
39 }
40 
OBEX_StateMachine(GSM_StateMachine * s,unsigned char rx_char)41 static GSM_Error OBEX_StateMachine(GSM_StateMachine *s, unsigned char rx_char)
42 {
43 	GSM_Phone_Functions 	*Phone	= s->Phone.Functions;
44 	GSM_Protocol_OBEXData 	*d	= &s->Protocol.Data.OBEX;
45 
46 	switch (d->MsgRXState) {
47 	case RX_Sync:
48 		d->Msg.Type   = rx_char;
49 		d->MsgRXState = RX_GetLength1;
50 		break;
51 	case RX_GetLength1:
52 		d->Msg.Length = rx_char * 256;
53 		d->MsgRXState = RX_GetLength2;
54 		break;
55 	case RX_GetLength2:
56 		d->Msg.Length = d->Msg.Length + rx_char - 3;
57 		d->Msg.Count  = 0;
58 		if (d->Msg.Count == d->Msg.Length) {
59 			s->Phone.Data.RequestMsg	= &d->Msg;
60 			s->Phone.Data.DispatchError	= Phone->DispatchMessage(s);
61 			d->MsgRXState = RX_Sync;
62 		} else {
63 			if (d->Msg.BufferUsed < d->Msg.Length) {
64 				d->Msg.BufferUsed 	= d->Msg.Length;
65 				d->Msg.Buffer 		= (unsigned char *)realloc(d->Msg.Buffer,d->Msg.BufferUsed);
66 			}
67 			d->MsgRXState 	= RX_GetMessage;
68 		}
69 		break;
70 	case RX_GetMessage:
71 		d->Msg.Buffer[d->Msg.Count] = rx_char;
72 		d->Msg.Count++;
73 		if (d->Msg.Count == d->Msg.Length) {
74 			s->Phone.Data.RequestMsg	= &d->Msg;
75 			s->Phone.Data.DispatchError	= Phone->DispatchMessage(s);
76 			d->MsgRXState = RX_Sync;
77 		}
78 		break;
79 	}
80 
81 	return ERR_NONE;
82 }
83 
OBEX_Initialise(GSM_StateMachine * s)84 static GSM_Error OBEX_Initialise(GSM_StateMachine *s)
85 {
86 	GSM_Protocol_OBEXData *d = &s->Protocol.Data.OBEX;
87 
88 	d->Msg.BufferUsed	= 0;
89 	d->Msg.Buffer 		= NULL;
90 	d->Msg.Length		= 0;
91 
92 	d->MsgRXState 		= RX_Sync;
93 
94 	return ERR_NONE;
95 }
96 
OBEX_Terminate(GSM_StateMachine * s)97 static GSM_Error OBEX_Terminate(GSM_StateMachine *s)
98 {
99 	free(s->Protocol.Data.OBEX.Msg.Buffer);
100 	s->Protocol.Data.OBEX.Msg.Buffer=NULL;
101 	return ERR_NONE;
102 }
103 
104 GSM_Protocol_Functions OBEXProtocol = {
105 	OBEX_WriteMessage,
106 	OBEX_StateMachine,
107 	OBEX_Initialise,
108 	OBEX_Terminate
109 };
110 
OBEXAddBlock(char * Buffer,int * Pos,unsigned char ID,const char * AddData,int AddLength)111 void OBEXAddBlock(char *Buffer, int *Pos, unsigned char ID, const char *AddData, int AddLength)
112 {
113 	Buffer[(*Pos)++] = ID;
114 	Buffer[(*Pos)++] = (AddLength+3)/256;
115 	Buffer[(*Pos)++] = (AddLength+3)%256;
116 	if (AddData != NULL) {
117 		memcpy(Buffer+(*Pos),AddData,AddLength);
118 		(*Pos) += AddLength;
119 	}
120 }
121 
122 #endif
123 
124 /* How should editor hadle tabs in this file? Add editor commands here.
125  * vim: noexpandtab sw=8 ts=8 sts=8:
126  */
127