X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilccore%2Fsilcnotify.c;h=44552d564d1b2352030cb96b5f1dd4c819826eb3;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=d8f80ca25d28024cd7efd44a343724fd2bfeed56;hpb=0bf38ae7a8125a1586d617f5f835329d1f924721;p=silc.git diff --git a/lib/silccore/silcnotify.c b/lib/silccore/silcnotify.c index d8f80ca2..44552d56 100644 --- a/lib/silccore/silcnotify.c +++ b/lib/silccore/silcnotify.c @@ -36,17 +36,20 @@ struct SilcNotifyPayloadStruct { /* Parse notify payload buffer and return data into payload structure */ -SilcNotifyPayload silc_notify_payload_parse(SilcBuffer buffer) +SilcNotifyPayload silc_notify_payload_parse(const unsigned char *payload, + SilcUInt32 payload_len) { + SilcBufferStruct buffer; SilcNotifyPayload new; - unsigned short len; + SilcUInt16 len; int ret; SILC_LOG_DEBUG(("Parsing Notify payload")); + silc_buffer_set(&buffer, (unsigned char *)payload, payload_len); new = silc_calloc(1, sizeof(*new)); - ret = silc_buffer_unformat(buffer, + ret = silc_buffer_unformat(&buffer, SILC_STR_UI_SHORT(&new->type), SILC_STR_UI_SHORT(&len), SILC_STR_UI_CHAR(&new->argc), @@ -54,13 +57,14 @@ SilcNotifyPayload silc_notify_payload_parse(SilcBuffer buffer) if (ret == -1) goto err; - if (len > buffer->len) + if (len > buffer.len) goto err; if (new->argc) { - silc_buffer_pull(buffer, 5); - new->args = silc_argument_payload_parse(buffer, new->argc); - silc_buffer_push(buffer, 5); + silc_buffer_pull(&buffer, 5); + new->args = silc_argument_payload_parse(buffer.data, buffer.len, + new->argc); + silc_buffer_push(&buffer, 5); } return new; @@ -72,33 +76,32 @@ SilcNotifyPayload silc_notify_payload_parse(SilcBuffer buffer) /* Encode notify payload with variable argument list. If `argc' is > 0 argument payloads will be associated to the notify payload. Variable - arguments must be {usigned char *, unsigned int (len)}. */ + arguments must be {usigned char *, SilcUInt32 (len)}. */ -SilcBuffer silc_notify_payload_encode(SilcNotifyType type, unsigned int argc, +SilcBuffer silc_notify_payload_encode(SilcNotifyType type, SilcUInt32 argc, va_list ap) { SilcBuffer buffer; SilcBuffer args = NULL; unsigned char **argv; - unsigned int *argv_lens = NULL, *argv_types = NULL; + SilcUInt32 *argv_lens = NULL, *argv_types = NULL; unsigned char *x; - unsigned int x_len; - int i, k, len = 0; + SilcUInt32 x_len; + int i, k = 0, len = 0; if (argc) { argv = silc_calloc(argc, sizeof(unsigned char *)); - argv_lens = silc_calloc(argc, sizeof(unsigned int)); - argv_types = silc_calloc(argc, sizeof(unsigned int)); + argv_lens = silc_calloc(argc, sizeof(SilcUInt32)); + argv_types = silc_calloc(argc, sizeof(SilcUInt32)); for (i = 0, k = 0; i < argc; i++) { x = va_arg(ap, unsigned char *); - x_len = va_arg(ap, unsigned int); + x_len = va_arg(ap, SilcUInt32); if (!x || !x_len) continue; - argv[k] = silc_calloc(x_len + 1, sizeof(unsigned char)); - memcpy(argv[k], x, x_len); + argv[k] = silc_memdup(x, x_len); argv_lens[k] = x_len; argv_types[k] = i + 1; k++; @@ -135,7 +138,36 @@ SilcBuffer silc_notify_payload_encode(SilcNotifyType type, unsigned int argc, return buffer; } -/* Free's notify payload */ +/* Same as above but takes argument from the `args' Argument Payload. */ + +SilcBuffer silc_notify_payload_encode_args(SilcNotifyType type, + SilcUInt32 argc, + SilcBuffer args) +{ + SilcBuffer buffer; + int len; + + len = 5 + (args ? args->len : 0); + buffer = silc_buffer_alloc(len); + silc_buffer_pull_tail(buffer, SILC_BUFFER_END(buffer)); + silc_buffer_format(buffer, + SILC_STR_UI_SHORT(type), + SILC_STR_UI_SHORT(len), + SILC_STR_UI_CHAR(argc), + SILC_STR_END); + + if (args) { + silc_buffer_pull(buffer, 5); + silc_buffer_format(buffer, + SILC_STR_UI_XNSTRING(args->data, args->len), + SILC_STR_END); + silc_buffer_push(buffer, 5); + } + + return buffer; +} + +/* Frees notify payload */ void silc_notify_payload_free(SilcNotifyPayload payload) { @@ -154,7 +186,7 @@ SilcNotifyType silc_notify_get_type(SilcNotifyPayload payload) /* Return argument nums */ -unsigned int silc_notify_get_arg_num(SilcNotifyPayload payload) +SilcUInt32 silc_notify_get_arg_num(SilcNotifyPayload payload) { return payload->argc; }