Source Code (Use browser search to find items of interest.)

Class Index

kdelibs'Buffer (./kdelibs/arts/mcop/buffer.h:34)

class Buffer {
	std::vector<unsigned char> contents;
	long rpos;
	bool _readError;
	unsigned char fromHexNibble(char c);

public:
	Buffer();
	bool readError();
	void writeBool(bool b);
	void writeByte(mcopbyte b);
	void writeByteSeq(const std::vector<mcopbyte>& seq);
	void writeLong(long l);
	void writeLongSeq(const std::vector<long>& seq);
	void writeFloat(float f);
	void writeFloatSeq(const std::vector<float>& seq);
	void writeString(const std::string& s);
	void writeStringSeq(const std::vector<std::string>& seq);
	inline long size() {
		return contents.size();
	}

	inline long remaining() {
		return size()-rpos;
	}

	void *read(long l);
	void *peek(long l);
	void skip(long l);

	void write(void *data, long l);

	bool readBool();
	mcopbyte readByte();
	void readByteSeq(std::vector<mcopbyte>& result);
	long readLong();
	void readLongSeq(std::vector<long>& result);
	float readFloat();
	void readFloatSeq(std::vector<float>& result);
	void readString(std::string& result);
	void readStringSeq(std::vector<std::string>& result);

	void patchLength();

	std::string toString(const std::string& name);
	bool fromString(const std::string& data, const std::string& name);
};

kdelibs'Buffer::Buffer() (./kdelibs/arts/mcop/buffer.cc:29)

Buffer::Buffer() {
	rpos = 0;
	_readError = false;
}


kdelibs'Buffer::readError() (./kdelibs/arts/mcop/buffer.cc:34)

bool Buffer::readError() {
	return _readError;
}


kdelibs'Buffer::writeBool() (./kdelibs/arts/mcop/buffer.cc:38)

void Buffer::writeBool(bool b) {
	contents.push_back(b?1:0);
}


kdelibs'Buffer::writeByte() (./kdelibs/arts/mcop/buffer.cc:42)

void Buffer::writeByte(mcopbyte b) {
	contents.push_back(b);
}


kdelibs'Buffer::writeLong() (./kdelibs/arts/mcop/buffer.cc:46)

void Buffer::writeLong(long l) {
	contents.push_back(l & 0xff);
	contents.push_back((l >> 8) & 0xff);
	contents.push_back((l >> 16) & 0xff);
	contents.push_back((l >> 24) & 0xff);
}


kdelibs'Buffer::writeByteSeq() (./kdelibs/arts/mcop/buffer.cc:53)

void Buffer::writeByteSeq(const vector<mcopbyte>& seq) {
	writeLong(seq.size());

	vector<mcopbyte>::const_iterator i;
	for(i = seq.begin(); i != seq.end(); i++) writeByte(*i);
}


kdelibs'Buffer::writeLongSeq() (./kdelibs/arts/mcop/buffer.cc:60)

void Buffer::writeLongSeq(const vector<long>& seq) {
	writeLong(seq.size());

	vector<long>::const_iterator i;
	for(i = seq.begin(); i != seq.end(); i++) writeLong(*i);
}


kdelibs'Buffer::writeFloat() (./kdelibs/arts/mcop/buffer.cc:67)

void Buffer::writeFloat(float f) {
	// FIXME: on some machines this may fail badly (there is explicit
	// float marshalling and demarshalling code in mico/orb/util.cc)

	long *f_as_long = (long *)&f;
	writeLong(*f_as_long);
}


kdelibs'Buffer::writeFloatSeq() (./kdelibs/arts/mcop/buffer.cc:75)

void Buffer::writeFloatSeq(const std::vector<float>& seq) {
	writeLong(seq.size());

	vector<float>::const_iterator i;
	for(i = seq.begin(); i != seq.end(); i++) writeFloat(*i);
}


kdelibs'Buffer::writeString() (./kdelibs/arts/mcop/buffer.cc:82)

void Buffer::writeString(const string& s) {
	long len = s.size()+1;

	writeLong(len);
	contents.insert(contents.end(),reinterpret_cast<const unsigned char*>(s.c_str()),
		        reinterpret_cast<const unsigned char*>(s.c_str()+len));
}


kdelibs'Buffer::writeStringSeq() (./kdelibs/arts/mcop/buffer.cc:90)

void Buffer::writeStringSeq(const vector<string>& seq) {
	writeLong(seq.size());

	vector<string>::const_iterator i;
	for(i = seq.begin(); i != seq.end(); i++) writeString(*i);
}


kdelibs'Buffer::write() (./kdelibs/arts/mcop/buffer.cc:97)

void Buffer::write(void *data, long len) {
	unsigned char *c = (unsigned char *)data;

	contents.insert(contents.end(),c,c+len);
}



kdelibs'Buffer::read() (./kdelibs/arts/mcop/buffer.cc:104)

void *Buffer::read(long l) {
	void *result = 0;

	if(remaining() >= l) {
		result = &contents[rpos];
		rpos += l;
	} else {
		_readError = true;
	}
	return result;
}


kdelibs'Buffer::peek() (./kdelibs/arts/mcop/buffer.cc:116)

void *Buffer::peek(long l) {
	assert(remaining() >= l);
	return &contents[rpos];
}


kdelibs'Buffer::skip() (./kdelibs/arts/mcop/buffer.cc:121)

void Buffer::skip(long l) {
	if(remaining() >= l) {
		rpos += l;
	} else {
		_readError = true;
	}
}


kdelibs'Buffer::readBool() (./kdelibs/arts/mcop/buffer.cc:129)

bool Buffer::readBool()
{
	long result = false;
	if(remaining() >= 1) {
		if(contents[rpos] == 1)
			result = true;
		else
		{
			assert(contents[rpos] == 0);
		}
		rpos += 1;
	} else {
		_readError = true;
	}
	return result;
}


kdelibs'Buffer::readByte() (./kdelibs/arts/mcop/buffer.cc:146)

mcopbyte Buffer::readByte()
{
	if(remaining() >= 0)
	{
		return contents[rpos++];
	}
	else
	{
		_readError = true;
		return 0;
	}
}


kdelibs'Buffer::readByteSeq() (./kdelibs/arts/mcop/buffer.cc:159)

void Buffer::readByteSeq(vector<mcopbyte>& result)
{
	// might be optimizable a bit
	long i,seqlen = readLong();

	result.clear();
	for(i=0;i<seqlen;i++) result.push_back(readByte());
}


kdelibs'Buffer::readLong() (./kdelibs/arts/mcop/buffer.cc:168)

long Buffer::readLong()
{
	long result = 0;
	if(remaining() >= 4) {
		result = contents[rpos]
		       + (contents[rpos+1] << 8)
			   + (contents[rpos+2] << 16)
			   + (contents[rpos+3] << 24);
		rpos += 4;
	} else {
		_readError = true;
	}
	return result;
}


kdelibs'Buffer::readLongSeq() (./kdelibs/arts/mcop/buffer.cc:183)

void Buffer::readLongSeq(vector<long>& result)
{
	// might be optimizable a bit
	long i,seqlen = readLong();

	result.clear();
	for(i=0;i<seqlen;i++) result.push_back(readLong());
}


kdelibs'Buffer::readFloat() (./kdelibs/arts/mcop/buffer.cc:192)

float Buffer::readFloat()
{
	// FIXME: see writeFloat()
	long f_as_long = readLong();

	if(!_readError) return *(float *)&f_as_long;
	return 0.0;
}


kdelibs'Buffer::readFloatSeq() (./kdelibs/arts/mcop/buffer.cc:201)

void Buffer::readFloatSeq(vector<float>& result)
{
	// might be optimizable a bit
	long i,seqlen = readLong();

	result.clear();
	for(i=0;i<seqlen;i++) result.push_back(readFloat());
}


kdelibs'Buffer::readString() (./kdelibs/arts/mcop/buffer.cc:210)

void Buffer::readString(string& result)
{
	long len = readLong();
	char *data = (char *)read(len);

	if(data && len) result.assign(data,len-1);
}


kdelibs'Buffer::readStringSeq() (./kdelibs/arts/mcop/buffer.cc:218)

void Buffer::readStringSeq(vector<string>& result)
{
	// might be optimizable a bit

	long i,seqlen = readLong();

	result.clear();
	//result.reserve(seqlen);

	for(i=0;i<seqlen;i++) {
		string s;

		readString(s);
		result.push_back(s);
	}
}



kdelibs'Buffer::patchLength() (./kdelibs/arts/mcop/buffer.cc:236)

void Buffer::patchLength()
{
	long len = size();
	assert(len > 8);

	contents[4] = len & 0xff;
	contents[5] = (len >> 8) & 0xff;
	contents[6] = (len >> 16) & 0xff;
	contents[7] = (len >> 24) & 0xff;
}


kdelibs'Buffer::toString() (./kdelibs/arts/mcop/buffer.cc:247)

string Buffer::toString(const string& name)
{
	string result;
	char hex[17] = "0123456789abcdef";

	vector<unsigned char>::iterator ci;
	for(ci = contents.begin(); ci != contents.end(); ci++)
	{
		result += hex[(*ci >> 4) & 0xf];
		result += hex[*ci & 0xf];
	}

	if(name == "") return result;
	return name + ":" + result;
}


kdelibs'Buffer::fromHexNibble() (./kdelibs/arts/mcop/buffer.cc:263)

unsigned char Buffer::fromHexNibble(char c)
{
	int uc = (unsigned char)c;

	if(uc >= '0' && uc <= '9') return uc - (unsigned char)'0';
	if(uc >= 'a' && uc <= 'f') return uc + 10 - (unsigned char)'a';
	if(uc >= 'A' && uc <= 'F') return uc + 10 - (unsigned char)'A';

	return 16;	// error
}


kdelibs'Buffer::fromString() (./kdelibs/arts/mcop/buffer.cc:281)

bool Buffer::fromString(const string& data, const string& name)
{
	string start = name+":";
	if(name == "") start = "";

	if(stringncmp(data,start,start.size()) != 0) return false;
	contents.clear();

	string::const_iterator di = data.begin() + start.size();
	
	while(di != data.end())
	{
		unsigned char h = fromHexNibble(*di++);	// high nibble
		if(di == data.end()) return false;

		unsigned char l = fromHexNibble(*di++);	// low nibble

		if(h >= 16 || l >= 16) return false;	// no proper hex digit
		contents.push_back((h << 4) + l);
	}
	return true;
}