1#include "XDROutPacket.h"
2
3#include <malloc.h>
4#include <string.h>
5
6#include <ByteOrder.h>
7#include <KernelExport.h>
8
9#include <kernel.h>
10
11
12extern const uint8 *
13XDROutPacketBuffer(struct XDROutPacket *packet)
14{
15	return packet->fBuffer;
16}
17
18extern size_t
19XDROutPacketLength(struct XDROutPacket *packet)
20{
21	return packet->fLength;
22}
23
24extern void
25XDROutPacketInit(struct XDROutPacket *packet)
26{
27	packet->fBuffer=NULL;
28	packet->fSize=packet->fLength=0;
29}
30
31extern void
32XDROutPacketDestroy(struct XDROutPacket *packet)
33{
34	free (packet->fBuffer);
35}
36
37extern void
38XDROutPacketGrow(struct XDROutPacket *packet, size_t size)
39{
40	if (packet->fLength+size>packet->fSize)
41	{
42		while (packet->fLength+size>packet->fSize)
43			packet->fSize+=XDROUTPACKET_BUFFER_INCREMENT;
44
45		packet->fBuffer=(uint8 *)realloc(packet->fBuffer,packet->fSize);
46	}
47}
48
49extern void
50XDROutPacketAddInt32(struct XDROutPacket *packet, int32 val)
51{
52	XDROutPacketGrow (packet,4);
53	*(int32 *)(&packet->fBuffer[packet->fLength])=B_HOST_TO_BENDIAN_INT32(val);
54	packet->fLength+=4;
55}
56
57
58status_t
59XDROutPacketAddDynamic(struct XDROutPacket *packet, const void *data, size_t size)
60{
61	XDROutPacketAddInt32(packet, size);
62	return XDROutPacketAddFixed(packet, data, size);
63}
64
65
66status_t
67XDROutPacketAddFixed(struct XDROutPacket *packet, const void *data, size_t size)
68{
69	size_t roundedSize = (size + 3) & ~3;
70	XDROutPacketGrow(packet, roundedSize);
71	if (!IS_USER_ADDRESS(data))
72		memcpy(&packet->fBuffer[packet->fLength], data, size);
73	else if (user_memcpy(&packet->fBuffer[packet->fLength], data, size) != B_OK)
74		return B_BAD_ADDRESS;
75	memset(&packet->fBuffer[packet->fLength + size], 0, roundedSize - size);
76	packet->fLength += roundedSize;
77	return B_OK;
78}
79
80
81status_t
82XDROutPacketAddString(struct XDROutPacket *packet, const char *string)
83{
84	return XDROutPacketAddDynamic(packet, string, strlen(string));
85}
86
87
88extern void
89XDROutPacketAppend(struct XDROutPacket *me, const struct XDROutPacket *packet)
90{
91	XDROutPacketGrow (me,packet->fLength);
92	memcpy (&me->fBuffer[me->fLength],packet->fBuffer,packet->fLength);
93	me->fLength+=packet->fLength;
94}
95
96extern void
97XDROutPacketClear(struct XDROutPacket *packet)
98{
99	packet->fLength=0;
100}
101
102