Connection.cpp (2590B)
1 #include <blt/namer.h> 2 #include <blt/syscall.h> 3 #include <blt/conio.h> 4 #include <string.h> 5 #include <stdlib.h> 6 #include <stdio.h> 7 #include "Connection.h" 8 9 const int kSendBufferSize = 0x1000; 10 const int kMaxCommandSize = 270; 11 const int kReceiveBufferSize = 1024; 12 13 Connection::Connection(int sendPort, int receivePort) 14 : fSendPort(sendPort), 15 fReceivePort(receivePort), 16 fSendBufferSize(0), 17 fReceiveBufferSize(0), 18 fReceiveBufferPos(0) 19 { 20 fSendBuffer = (char*) malloc(kSendBufferSize); 21 fReceiveBuffer = (char*) malloc(kReceiveBufferSize); 22 } 23 24 Connection::~Connection() 25 { 26 free(fSendBuffer); 27 free(fReceiveBuffer); 28 port_destroy(fReceivePort); 29 } 30 31 void Connection::Write(const void *data, int size) 32 { 33 int sizeWritten = 0; 34 while (sizeWritten < size) { 35 int sizeToWrite = size - sizeWritten; 36 if (fSendBufferSize + sizeToWrite > kSendBufferSize) 37 sizeToWrite = kSendBufferSize - fSendBufferSize; 38 39 if (sizeToWrite == 0) { 40 Flush(); 41 continue; 42 } 43 44 memcpy((void*) (fSendBuffer + fSendBufferSize), (const void*) ((const char*) data 45 + sizeWritten), sizeToWrite); 46 fSendBufferSize += sizeToWrite; 47 sizeWritten += sizeToWrite; 48 } 49 } 50 51 void Connection::Read(void *data, int size) 52 { 53 int sizeRead = 0; 54 while (sizeRead < size) { 55 int sizeToRead = size - sizeRead; 56 57 if (fReceiveBufferSize - fReceiveBufferPos < sizeToRead) 58 sizeToRead = fReceiveBufferSize - fReceiveBufferPos; 59 60 if (sizeToRead == 0) { 61 Receive(); 62 continue; 63 } 64 65 memcpy((void*) ((char*) data + sizeRead), 66 (void*) (fReceiveBuffer + fReceiveBufferPos), sizeToRead); 67 fReceiveBufferPos += sizeToRead; 68 sizeRead += sizeToRead; 69 } 70 } 71 72 void Connection::EndCommand() 73 { 74 if (fSendBufferSize > kSendBufferSize - kMaxCommandSize) 75 Flush(); 76 } 77 78 void Connection::Flush() 79 { 80 msg_hdr_t header; 81 header.src = fReceivePort; 82 header.dst = fSendPort; 83 header.data = fSendBuffer; 84 header.size = fSendBufferSize; 85 86 old_port_send(&header); 87 88 fSendBufferSize = 0; 89 } 90 91 void Connection::Receive() 92 { 93 msg_hdr_t header; 94 header.src = 0; 95 header.dst = fReceivePort; 96 header.data = fReceiveBuffer; 97 header.size = kReceiveBufferSize; 98 99 fReceiveBufferSize = old_port_recv(&header); 100 fReceiveBufferPos = 0; 101 } 102 103 int Connection::ReadInt32() 104 { 105 int outval; 106 Read(&outval, 4); 107 return outval; 108 } 109 110 short Connection::ReadInt16() 111 { 112 short outval; 113 Read(&outval, 2); 114 return outval; 115 } 116 117 char Connection::ReadInt8() 118 { 119 char outval; 120 Read(&outval, 1); 121 return outval; 122 } 123 124 void Connection::WriteInt32(int i) 125 { 126 Write(&i, 4); 127 } 128 129 void Connection::WriteInt16(short s) 130 { 131 Write(&s, 2); 132 } 133 134 void Connection::WriteInt8(char c) 135 { 136 Write(&c, 1); 137 } 138