From 48540940b6c28bb4378abfeb500ec45a625b37b6 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Tue, 15 May 2012 10:38:20 +0000 Subject: initial commit git-svn-id: http://svn.miranda-ng.org/main/trunk@2 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/AimOscar/tlv.cpp | 103 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 protocols/AimOscar/tlv.cpp (limited to 'protocols/AimOscar/tlv.cpp') diff --git a/protocols/AimOscar/tlv.cpp b/protocols/AimOscar/tlv.cpp new file mode 100644 index 0000000000..f458a28eb0 --- /dev/null +++ b/protocols/AimOscar/tlv.cpp @@ -0,0 +1,103 @@ +/* +Plugin of Miranda IM for communicating with users of the AIM protocol. +Copyright (c) 2008-2009 Boris Krasnovskiy +Copyright (C) 2005-2006 Aaron Myles Landwehr + +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, see . +*/ +#include "aim.h" +#include "tlv.h" + +TLV::TLV(char* buf) +{ + type_=_htons((*(unsigned short*)&buf[0])); + length_=_htons((*(unsigned short*)&buf[2])); + if (length_ > 0) + { + value_=(char*)mir_alloc(length_+1); + memcpy(value_,&buf[4],length_); + } + else + value_= NULL; +} + +TLV::TLV(unsigned short type, unsigned short length, const char* value) +{ + type_ = type; + length_ = length; + if(length_ > 0) + { + value_ = (char*)mir_alloc(length_+1); + memcpy(value_, value, length_); + } + else + value_= NULL; +} + +TLV::~TLV() +{ + mir_free(value_); +} + +unsigned short TLV::ushort(int pos) +{ + return _htons(*(unsigned short*)&value_[pos]); +} + +unsigned long TLV::ulong(int pos) +{ + return _htonl(*(unsigned long*)&value_[pos]); +} + +unsigned __int64 TLV::u64(int pos) +{ + return _htonl64(*(unsigned __int64*)&value_[pos]); +} + +unsigned char TLV::ubyte(int pos) +{ + return value_[pos]; +} + +char* TLV::part(int pos, int length)//returns part of the tlv value +{ + if ((pos + length) > length_) return NULL; + + char* value = (char*)mir_alloc(length + 2); + memcpy(value, &value_[pos], length); + value[length] = '\0'; + value[length+1] = '\0'; + + return value; +} + +char* TLV::dupw(void) +{ + wchar_t *str = (wchar_t*)part(0, length_); + wcs_htons(str); + + char* stru = mir_utf8encodeW(str); + mir_free(str); + + return stru; +} + + +unsigned short TLV::whole(char* buf)//returns the whole tlv +{ + *(unsigned short*)buf = _htons(type_); + *(unsigned short*)&buf[2] = _htons(length_); + memcpy(&buf[4], value_, length_); + return length_ + TLV_HEADER_SIZE; +} -- cgit v1.2.3