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