+/* Encode one attribute payload to buffer */
+
+SilcBuffer silc_attribute_payload_encode(SilcBuffer attrs,
+ SilcAttribute attribute,
+ SilcAttributeFlags flags,
+ void *object,
+ SilcUInt32 object_size)
+{
+ object = silc_attribute_payload_encode_int(attribute, flags, object,
+ object_size, &object_size);
+ attrs = silc_attribute_payload_encode_data(attrs, attribute, flags,
+ (const unsigned char *)object,
+ object_size);
+ silc_free(object);
+ return attrs;
+}
+
+/* Encoded the attribute data directly to buffer */
+
+SilcBuffer silc_attribute_payload_encode_data(SilcBuffer attrs,
+ SilcAttribute attribute,
+ SilcAttributeFlags flags,
+ const unsigned char *data,
+ SilcUInt32 data_len)
+{
+ SilcBuffer buffer = attrs;
+ SilcUInt32 len;
+
+ len = 4 + (SilcUInt16)data_len;
+ buffer = silc_buffer_realloc(buffer,
+ (buffer ? buffer->truelen + len : len));
+ if (!buffer)
+ return NULL;
+ silc_buffer_pull(buffer, buffer->len);
+ silc_buffer_pull_tail(buffer, len);
+ silc_buffer_format(buffer,
+ SILC_STR_UI_CHAR(attribute),
+ SILC_STR_UI_CHAR(flags),
+ SILC_STR_UI_SHORT((SilcUInt16)data_len),
+ SILC_STR_UI_XNSTRING(data, (SilcUInt16)data_len),
+ SILC_STR_END);
+ silc_buffer_push(buffer, buffer->data - buffer->head);
+
+ return buffer;
+}
+