X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilccore%2Fsilcattrs.c;h=27f25f7373ebea728ba10e1c984ce7d5e9bca532;hb=40f8443d8d3a6577336ee66d18e04d9ac4d956bb;hp=7af8f6a052ed5068ee121ee5c3577e6d34b1edd5;hpb=413da0f8686910f5e627393157566ae729ca99c4;p=silc.git diff --git a/lib/silccore/silcattrs.c b/lib/silccore/silcattrs.c index 7af8f6a0..27f25f73 100644 --- a/lib/silccore/silcattrs.c +++ b/lib/silccore/silcattrs.c @@ -1,10 +1,10 @@ /* - silcattrs.c + silcattrs.c Author: Pekka Riikonen - Copyright (C) 2002 Pekka Riikonen + Copyright (C) 2002 - 2005 Pekka Riikonen 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 @@ -19,7 +19,7 @@ /* Implementation of Attribute Payload routines */ /* $Id$ */ -#include "silcincludes.h" +#include "silc.h" #include "silcattrs.h" /****************************************************************************** @@ -86,14 +86,14 @@ silc_attribute_payload_encode_int(SilcAttribute attribute, SILC_STR_UI_INT(service->idle), SILC_STR_END); object = tmpbuf->data; - object_size = tmpbuf->len; + object_size = silc_buffer_len(tmpbuf); } break; case SILC_ATTRIBUTE_STATUS_MOOD: case SILC_ATTRIBUTE_PREFERRED_CONTACT: { - SilcUInt32 mask = (SilcUInt32)object; + SilcUInt32 mask = SILC_PTR_TO_32(object); if (object_size != sizeof(SilcUInt32)) return NULL; SILC_PUT32_MSB(mask, tmp); @@ -119,12 +119,14 @@ silc_attribute_payload_encode_int(SilcAttribute attribute, case SILC_ATTRIBUTE_STATUS_MESSAGE: case SILC_ATTRIBUTE_EXTENSION: + case SILC_ATTRIBUTE_USER_ICON: { - SilcAttributeObjMime *mime = object; + SilcMime mime = object; if (object_size != sizeof(*mime)) return NULL; - object = (void *)mime->mime; - object_size = mime->mime_len; + str = silc_mime_encode(mime, &object_size); + if (!str) + return NULL; } break; @@ -155,7 +157,7 @@ silc_attribute_payload_encode_int(SilcAttribute attribute, SILC_STR_UI16_STRING(len4 ? geo->accuracy : ""), SILC_STR_END); object = tmpbuf->data; - object_size = tmpbuf->len; + object_size = silc_buffer_len(tmpbuf); } break; @@ -187,7 +189,7 @@ silc_attribute_payload_encode_int(SilcAttribute attribute, SILC_STR_UI16_STRING(len4 ? dev->language : ""), SILC_STR_END); object = tmpbuf->data; - object_size = tmpbuf->len; + object_size = silc_buffer_len(tmpbuf); } break; @@ -207,7 +209,7 @@ silc_attribute_payload_encode_int(SilcAttribute attribute, SILC_STR_UI_XNSTRING(pk->data, pk->data_len), SILC_STR_END); object = tmpbuf->data; - object_size = tmpbuf->len; + object_size = silc_buffer_len(tmpbuf); } break; @@ -286,32 +288,32 @@ SilcDList silc_attribute_payload_parse(const unsigned char *payload, silc_buffer_set(&buffer, (unsigned char *)payload, payload_len); list = silc_dlist_init(); - while (buffer.len) { + while (silc_buffer_len(&buffer)) { newp = silc_calloc(1, sizeof(*newp)); if (!newp) goto err; ret = silc_buffer_unformat(&buffer, SILC_STR_UI_CHAR(&newp->attribute), SILC_STR_UI_CHAR(&newp->flags), - SILC_STR_UI16_NSTRING_ALLOC(&newp->data, + SILC_STR_UI16_NSTRING_ALLOC(&newp->data, &newp->data_len), SILC_STR_END); if (ret == -1) goto err; - if (newp->data_len > buffer.len - 4) { + if (newp->data_len > silc_buffer_len(&buffer) - 4) { SILC_LOG_ERROR(("Incorrect attribute payload in list")); goto err; } len = 4 + newp->data_len; - if (buffer.len < len) + if (silc_buffer_len(&buffer) < len) break; silc_buffer_pull(&buffer, len); silc_dlist_add(list, newp); } - + return list; err: @@ -349,12 +351,12 @@ SilcBuffer silc_attribute_payload_encode_data(SilcBuffer attrs, len = 4 + (SilcUInt16)data_len; buffer = silc_buffer_realloc(buffer, - (buffer ? buffer->truelen + len : len)); + (buffer ? silc_buffer_truelen(buffer) + len : len)); if (!buffer) return NULL; - silc_buffer_pull(buffer, buffer->len); + silc_buffer_pull(buffer, silc_buffer_len(buffer)); silc_buffer_pull_tail(buffer, len); - silc_buffer_format(buffer, + silc_buffer_format(buffer, SILC_STR_UI_CHAR(attribute), SILC_STR_UI_CHAR(flags), SILC_STR_UI_SHORT((SilcUInt16)data_len), @@ -415,7 +417,7 @@ const unsigned char *silc_attribute_get_data(SilcAttributePayload payload, /* Construct digital signature verification data */ unsigned char *silc_attribute_get_verify_data(SilcDList attrs, - bool server_verification, + SilcBool server_verification, SilcUInt32 *data_len) { SilcAttributePayload attr; @@ -444,7 +446,7 @@ unsigned char *silc_attribute_get_verify_data(SilcDList attrs, if (!data) return NULL; silc_buffer_set(&buffer, data + len, 4 + attr->data_len); - silc_buffer_format(&buffer, + silc_buffer_format(&buffer, SILC_STR_UI_CHAR(attr->attribute), SILC_STR_UI_CHAR(attr->flags), SILC_STR_UI_SHORT(attr->data_len), @@ -463,11 +465,11 @@ unsigned char *silc_attribute_get_verify_data(SilcDList attrs, /* Return parsed attribute object */ -bool silc_attribute_get_object(SilcAttributePayload payload, +SilcBool silc_attribute_get_object(SilcAttributePayload payload, void *object, SilcUInt32 object_size) { SilcUInt16 len; - bool ret = FALSE; + SilcBool ret = FALSE; if (!object || payload->flags & SILC_ATTRIBUTE_FLAG_INVALID) return FALSE; @@ -549,12 +551,13 @@ bool silc_attribute_get_object(SilcAttributePayload payload, case SILC_ATTRIBUTE_STATUS_MESSAGE: case SILC_ATTRIBUTE_EXTENSION: + case SILC_ATTRIBUTE_USER_ICON: { - SilcAttributeObjMime *mime = object; + SilcMime mime = object; if (object_size != sizeof(*mime)) break; - mime->mime = (const unsigned char *)payload->data; - mime->mime_len = payload->data_len; + if (!silc_mime_decode(mime, payload->data, payload->data_len)) + break; ret = TRUE; } break; @@ -619,7 +622,7 @@ bool silc_attribute_get_object(SilcAttributePayload payload, silc_buffer_unformat(&buffer, SILC_STR_UI16_NSTRING_ALLOC(&pk->type, &len), SILC_STR_END); - if (res == -1 || len > buffer.len - 2) + if (res == -1 || len > silc_buffer_len(&buffer) - 2) break; pk->data = silc_memdup(payload->data + 2 + len, payload->data_len - 2 - len);