blob: edd86badb5f4bfc3b93a5db5d9f72319347c53d7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include <qpid/dispatch/proton_utils.h>
#include <string.h>
#include <inttypes.h>
#include <time.h>
#include <ctype.h>
#include <stdio.h>
char *qdpn_data_as_string(pn_data_t *data)
{
#define MAX_BUFFER 50
char buffer[MAX_BUFFER + 1];
buffer[MAX_BUFFER] = '\0';
switch(pn_data_type(data)) {
case PN_BOOL:
return strdup(pn_data_get_bool(data) ? "true" : "false");
case PN_UBYTE:
snprintf(buffer, MAX_BUFFER, "%"PRId8, pn_data_get_ubyte(data));
return strdup(buffer);
case PN_BYTE:
snprintf(buffer, MAX_BUFFER, "%"PRId8, pn_data_get_byte(data));
return strdup(buffer);
case PN_USHORT:
snprintf(buffer, MAX_BUFFER, "%"PRId16, pn_data_get_ushort(data));
return strdup(buffer);
case PN_SHORT:
snprintf(buffer, MAX_BUFFER, "%"PRId16, pn_data_get_short(data));
return strdup(buffer);
case PN_UINT:
snprintf(buffer, MAX_BUFFER, "%"PRId32, pn_data_get_uint(data));
return strdup(buffer);
case PN_INT:
snprintf(buffer, MAX_BUFFER, "%"PRId32, pn_data_get_int(data));
return strdup(buffer);
case PN_CHAR: {
char c = (char) pn_data_get_char(data);
return strndup(&c, 1);
}
case PN_ULONG:
snprintf(buffer, MAX_BUFFER, "%"PRId64, pn_data_get_ulong(data));
return strdup(buffer);
case PN_LONG:
snprintf(buffer, MAX_BUFFER, "%"PRId64, pn_data_get_long(data));
return strdup(buffer);
case PN_TIMESTAMP: {
#if _POSIX_C_SOURCE || _BSD_SOURCE || _SVID_SOURCE
time_t t = (time_t) (pn_data_get_timestamp(data));
ctime_r(&t, buffer);
size_t len = strlen(buffer);
if (buffer[len - 1] == '\n')
buffer[len - 1] = '\0';
return strdup(buffer);
#else
snprintf(buffer, MAX_BUFFER, "%"PRId64, pn_data_get_timestamp(data));
return strdup(buffer);
#endif
}
case PN_FLOAT:
snprintf(buffer, MAX_BUFFER, "%lg", pn_data_get_float(data));
return strdup(buffer);
case PN_DOUBLE:
snprintf(buffer, MAX_BUFFER, "%lg", pn_data_get_double(data));
return strdup(buffer);
case PN_DECIMAL32:
snprintf(buffer, MAX_BUFFER, "%"PRId32, pn_data_get_decimal32(data));
return strdup(buffer);
case PN_DECIMAL64:
snprintf(buffer, MAX_BUFFER, "%"PRId64, pn_data_get_decimal64(data));
return strdup(buffer);
case PN_UUID: {
pn_uuid_t uuid = pn_data_get_uuid(data);
uint8_t *u = (uint8_t*) uuid.bytes;
snprintf(buffer, MAX_BUFFER,
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
u[0], u[1], u[2], u[3], u[4], u[5], u[6], u[7],
u[8], u[9], u[10], u[11], u[12], u[13], u[14], u[15]);
return strdup(buffer);
}
case PN_BINARY: {
pn_bytes_t bytes = pn_data_get_binary(data);
//
// Search the binary field for unprintable characters. If found, don't return a
// string representation.
//
for (int i = 0; i < bytes.size; i++) {
if (!isprint(bytes.start[i]))
return 0;
}
return strndup(bytes.start, bytes.size);
}
case PN_STRING:
return strdup(pn_data_get_string(data).start);
case PN_SYMBOL:
return strdup(pn_data_get_symbol(data).start);
//
// Return null for the following types:
//
case PN_DECIMAL128:
case PN_DESCRIBED:
case PN_ARRAY:
case PN_LIST:
case PN_MAP:
case PN_NULL:
default:
break;
}
return 0;
}