-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathobex.h
229 lines (202 loc) · 6.94 KB
/
obex.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
#define OBEX_PACKET_MAX_LEN (1024)
//----------------------------------------------------Request--------------------------------------------------//
#define OBEX_OP_CONNECT (0x80)
#define OBEX_OP_DISCONNECT (0x81)
#define OBEX_OP_PUT (0x02)
#define OBEX_OP_PUT2 (0x82)
#define OBEX_OP_SETPATH (0x85)
#define OBEX_OP_GET (0x03)
#define OBEX_ROWPACKET_SIZE (7)
#define OBEX_FLAG_FINAL (0x80)
//len指整个Request的大小,包括可选头
//固定大小
typedef struct
{
unsigned char op;
unsigned char lenH;
unsigned char lenL;
unsigned char version;
unsigned char _unused;
unsigned char maxLenH;
unsigned char maxLenL;
}ObexRowPacket;
typedef struct
{
unsigned char op;
unsigned char lenH;
unsigned char lenL;
}ObexRequestPacket;
#define OBEX_HEADER_COUNT (0xc0)
#define OBEX_HEADER_CONNECTIONID (0xcb)
#define OBEX_HEADER_LENGTH (0xc3)
//固定大小
typedef struct
{
unsigned char op;
unsigned char c3;
unsigned char c2;
unsigned char c1;
unsigned char c0;
}ObexCountHeader,ObexConnectionIdHeader,ObexLengthHeader;
typedef struct
{
unsigned char flag;
unsigned char constant;
}Setpath;
#define OBEX_HEADER_NAME (0x01)
#define OBEX_HEADER_BODY (0x48)
#define OBEX_HEADER_ENDOFBODE (0x49)
#define OBEX_HEADER_TYPE (0x42)
#define OBEX_HEADER_DATA_LEN (3)
//len指整个可选头的大小,包括op和len的大小
//非固定大小
typedef struct
{
unsigned char op;
unsigned char len1;
unsigned char len0;
char buf[OBEX_PACKET_MAX_LEN];
}ObexNameHeader,ObexBodyHeader,ObexEndOfBodyHeader,ObexTypeHeader;
#define OBEX_HEADER_SINGLERESPONSEMODE (0x97)
typedef struct
{
unsigned char op;
unsigned char isEnable;
}ObexSingleResponseModeHeader;
//----------------------------------------------------Request End--------------------------------------------------//
//----------------------------------------------------Response--------------------------------------------------//
#define OBEX_OP_SUCCESS (0x20)
#define OBEX_OP_SUCCESS2 (0xa0)
#define OBEX_OP_CONTINUE (0x90)
//固定大小
typedef struct
{
unsigned char op;
unsigned char len1;
unsigned char len2;
}ObexSuccessPacket;
//----------------------------------------------------Response End--------------------------------------------------//
//----------------------------------------------------Functions--------------------------------------------------//
int ObexSetRowPacket(char*sendBuf,unsigned maxLen,unsigned*realLen,int op)
{
ObexRowPacket*rowPacket=(ObexRowPacket*)sendBuf;
rowPacket->op=op;
rowPacket->version=0x10;
rowPacket->maxLenH=(maxLen&0xff00)>>8;
rowPacket->maxLenL=maxLen&0x00ff;
(*realLen)+=sizeof(ObexRowPacket);
return 1;
}
int ObexSetCountHeader(char*sendBuf,unsigned count,unsigned*realLen)
{
ObexCountHeader*countHeader=(ObexCountHeader*)sendBuf;
countHeader->op=OBEX_HEADER_COUNT;
countHeader->c3=(count&0xff000000)>>24;
countHeader->c2=(count&0x00ff0000)>>16;
countHeader->c1=(count&0x0000ff00)>>8;
countHeader->c0=count&0x000000ff;
(*realLen)+=sizeof(ObexCountHeader);
return 1;
}
int ObexSetRowPacketLen(char*sendBuf,unsigned len)
{
ObexRowPacket*rowPacket=(ObexRowPacket*)sendBuf;
rowPacket->lenH=(len&0xff00)>>8;
rowPacket->lenL=len&0x00ff;
return 1;
}
int ObexSetRequestPacket(char*sendBuf,unsigned*realLen,int op)
{
ObexRequestPacket*requestPacket=(ObexRequestPacket*)sendBuf;
requestPacket->op=op;
(*realLen)+=sizeof(ObexRequestPacket);
return 1;
}
int ObexSetConnectionIdHeader(char*sendBuf,unsigned id,unsigned*realLen)
{
ObexConnectionIdHeader*connectionIdHeader=(ObexConnectionIdHeader*)sendBuf;
connectionIdHeader->op=OBEX_HEADER_CONNECTIONID;
connectionIdHeader->c3=(id&0xff000000)>>24;
connectionIdHeader->c2=(id&0x00ff0000)>>16;
connectionIdHeader->c1=(id&0x0000ff00)>>8;
connectionIdHeader->c0=id&0x000000ff;
(*realLen)+=sizeof(ObexConnectionIdHeader);
return 1;
}
int ObexSetNameHeader(char*sendBuf,char*name,unsigned nameLen,unsigned*realLen)
{
unsigned tarNameLen=nameLen*2+1;
char fileName[tarNameLen];
memset(fileName,0,tarNameLen);
for(int i=0;i<nameLen;i++)
{
fileName[2*i+1]=name[i];
}
ObexNameHeader*nameHeader=(ObexNameHeader*)sendBuf;
nameHeader->op=OBEX_HEADER_NAME;
memcpy(nameHeader->buf,fileName,tarNameLen);
(*realLen)+=(tarNameLen+OBEX_HEADER_DATA_LEN+1);
//4.实际name长度小于len,访问越界----------------------
#pragma region
//tarNameLen*=10;
#pragma endregion
//-----------------------------------------------------------------
nameHeader->len1=((tarNameLen+OBEX_HEADER_DATA_LEN+1)&0xff00)>>8;
nameHeader->len0=(tarNameLen+OBEX_HEADER_DATA_LEN+1)&0x00ff;
return 1;
}
int ObexSetlLengthHeader(char*sendBuf,unsigned length,unsigned*realLen)
{
ObexLengthHeader*lengthHeader=(ObexLengthHeader*)sendBuf;
lengthHeader->op=OBEX_HEADER_LENGTH;
lengthHeader->c3=(length&0xff000000)>>24;
lengthHeader->c2=(length&0x00ff0000)>>16;
lengthHeader->c1=(length&0x0000ff00)>>8;
lengthHeader->c0=length&0x000000ff;
(*realLen)+=sizeof(ObexLengthHeader);
return 1;
}
int ObexSetSingleResponseModeHeader(char*sendBuf,unsigned char isEnable,unsigned*realLen)
{
ObexSingleResponseModeHeader*singleResponseModeHeader=(ObexSingleResponseModeHeader*)sendBuf;
singleResponseModeHeader->op=OBEX_HEADER_SINGLERESPONSEMODE;
singleResponseModeHeader->isEnable=isEnable;
(*realLen)+=sizeof(ObexSingleResponseModeHeader);
return 1;
}
int ObexSetBodyHeader(char*sendBuf,char*body,unsigned bodyLen,unsigned*realLen)
{
ObexBodyHeader*bodyHeader=(ObexBodyHeader*)sendBuf;
bodyHeader->op=OBEX_HEADER_BODY;
bodyHeader->len1=((bodyLen+OBEX_HEADER_DATA_LEN)&0xff00)>>8;
bodyHeader->len0=(bodyLen+OBEX_HEADER_DATA_LEN)&0x00ff;
memcpy(bodyHeader->buf,body,bodyLen);
(*realLen)+=(bodyLen+OBEX_HEADER_DATA_LEN);
return 1;
}
int ObexSetRequestPacketLen(char*sendBuf,unsigned len)
{
ObexRequestPacket*requestPacket=(ObexRequestPacket*)sendBuf;
requestPacket->lenH=(len&0xff00)>>8;
requestPacket->lenL=len&0x00ff;
return 1;
}
int ObexSetEndOfBodeHeader(char*sendBuf,char*body,unsigned bodyLen,unsigned*realLen)
{
ObexEndOfBodyHeader*endOfBodeHeader=(ObexEndOfBodyHeader*)sendBuf;
endOfBodeHeader->op=OBEX_HEADER_ENDOFBODE;
endOfBodeHeader->len1=((bodyLen+OBEX_HEADER_DATA_LEN)&0xff00)>>8;
endOfBodeHeader->len0=(bodyLen+OBEX_HEADER_DATA_LEN)&0x00ff;
memcpy(endOfBodeHeader->buf,body,bodyLen);
(*realLen)+=(bodyLen+OBEX_HEADER_DATA_LEN);
return 1;
}
int ObexSetSetPathFlagConstant(char *sendBuf,unsigned*realLen)
{
Setpath* setpathpkg=(Setpath *)sendBuf;
setpathpkg->flag=0x02;//bit0:back to the uper dir;bit1:if dir doesnt exist then creat it
setpathpkg->constant=0x00;
*realLen=*realLen+sizeof(Setpath);
return 1;
}
//----------------------------------------------------Functions End--------------------------------------------------//