openblt

a hobby OS from the late 90s
git clone http://frotz.net/git/openblt.git
Log | Files | Refs | LICENSE

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