summaryrefslogtreecommitdiff
path: root/protocols/Xfire/src/variablevalue.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Xfire/src/variablevalue.cpp')
-rw-r--r--protocols/Xfire/src/variablevalue.cpp204
1 files changed, 204 insertions, 0 deletions
diff --git a/protocols/Xfire/src/variablevalue.cpp b/protocols/Xfire/src/variablevalue.cpp
new file mode 100644
index 0000000000..584f64412c
--- /dev/null
+++ b/protocols/Xfire/src/variablevalue.cpp
@@ -0,0 +1,204 @@
+/*
+ * xfirelib - C++ Library for the xfire protocol.
+ * Copyright (C) 2006 by
+ * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net
+ * Herbert Poul <herbert.poul@gmail.com> / http://goim.us
+ * http://xfirelib.sphene.net
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "stdafx.h"
+
+#include <string>
+#include "variablevalue.h"
+#include "xdebug.h"
+
+#include "math.h" // for pow(..)
+
+namespace xfirelib {
+
+using namespace std;
+
+ VariableValue::VariableValue() {
+ value = 0;
+ }
+ VariableValue::~VariableValue() {
+ if(value)
+ delete[] value;
+ }
+
+ void VariableValue::setName(std::string name){
+ this->name = name;
+ }
+
+ void VariableValue::setValueLength(int valueLength){
+ this->valueLength = valueLength;
+ }
+
+ void VariableValue::setValue( char * value) {
+ if(this->value) delete[] value;
+ this->value = value;
+ }
+ void VariableValue::setValue( std::string value ) {
+ const char *val = value.c_str();
+ setValue( val, value.length() );
+ }
+ void VariableValue::setValue( const char *value, int valueLength ) {
+ this->value = new char[valueLength];
+ memcpy( this->value, value, valueLength );
+ this->valueLength = valueLength;
+ }
+ void VariableValue::setValueFromLong( long value, int bytes ) {
+ this->valueLength = bytes;
+ this->value = new char[bytes];
+ for(int i = 0 ; i < bytes ; i++) {
+ this->value[i] = value % 256;
+ value = value / 256;
+ }
+ }
+
+ std::string VariableValue::getName(){
+ return name;
+ }
+
+ int VariableValue::getValueLength(){
+ return valueLength;
+ }
+
+ char* VariableValue::getValue(){
+ return value;
+ }
+
+ long VariableValue::getValueAsLong() {
+ long intVal = 0;
+ for(int i = 0 ; i < valueLength ; i++) {
+ intVal += ((unsigned char)value[i]) * myPow(256,i);
+ }
+ return intVal;
+ }
+
+ long VariableValue::myPow(int x, int y) {
+ long r = 1;
+ for(int i = 0 ; i < y ; i++) r *= x;
+ return r;
+ }
+
+ int VariableValue::readName(char *packet, int index) {
+ int read = 0;
+ int nameLength = packet[index];
+ read++;
+ char* namestr=new char[nameLength+1];
+ namestr[nameLength]=0;
+ memcpy(namestr,packet+index+read,nameLength);
+ name = string(namestr);
+ read+=nameLength;
+ return read;
+ }
+
+ int VariableValue::readValue(char *packet, int index, int length,int ignoreZeroAfterLength) {
+ int read = 0;
+ valueLength = length;
+ if(valueLength < 0) {
+ valueLength = (unsigned char)packet[index+read];read++;
+ if(ignoreZeroAfterLength) read++;
+ }
+
+ if(value) delete[] value;
+ value = new char[valueLength];
+ memcpy(value,packet+index+read,valueLength);
+ read+=valueLength;
+
+ return read;
+ }
+
+/*TODO: this cant work, attLength is always 0, needs to be fixed*/
+/* int VariableValue::readFixValue(char *packet, int index, int packetLength, int valueLength) {
+ VariableValue *value = this;
+ int nameLength = packet[index];
+
+ int i = 1;
+ int attLengthLength = 0;
+ int attLength = 0;
+ string name;
+
+ for(; i <= nameLength;i++){
+ name += packet[index+i];
+ }
+ value->setName(name);
+ index += i;
+ index++; //ignore next value
+
+ value->setValueLength(valueLength);
+
+ char *att = new char[attLength];
+ index += i+1;
+ for(i = 0; i < attLength;i++){
+ att[i] = packet[index+i];
+ }
+ index += i;
+ value->setValue(att);
+ return index;
+ }*/
+
+
+ int VariableValue::readVariableValue(char *packet, int index, int packetLength){
+ VariableValue *value = this;
+ int nameLength = packet[index];
+
+ int i = 1;
+ int attLengthLength = 0;
+ int attLength = 0;
+ string name;
+
+ for(; i <= nameLength;i++){
+ name += packet[index+i];
+ }
+ value->setName(name);
+
+ index += i;
+ attLengthLength = packet[index];
+ index++;
+
+ for(i = 0; i < attLengthLength;i++){
+ attLength += (unsigned char)packet[index+i];/*todo: make it work if length is longer than 1 byte*/
+ }
+ value->setValueLength(attLength);
+
+ char *att = new char[attLength];
+ index += i+1;
+ for(i = 0; i < attLength;i++){
+ att[i] = packet[index+i];
+ }
+ value->setValue(att);
+ index += i;
+ return index;
+ }
+
+
+
+
+ int VariableValue::writeName(char *buf, int index) {
+ int len = name.length();
+ buf[index] = len;
+ memcpy(buf+index+1,name.c_str(),len);
+ return len+1;
+ }
+ int VariableValue::writeValue(char *buf, int index) {
+ memcpy(buf+index,value,valueLength);
+ return valueLength;
+ }
+
+};