Author: rhs
Date: Wed Oct 3 19:39:19 2012
New Revision: 1393720
URL: http://svn.apache.org/viewvc?rev=1393720&view=rev
Log:
added codec support for char
Modified:
qpid/proton/trunk/proton-c/bindings/python/proton.py
qpid/proton/trunk/proton-c/include/proton/codec.h
qpid/proton/trunk/proton-c/include/proton/types.h
qpid/proton/trunk/proton-c/src/codec/codec.c
qpid/proton/trunk/tests/proton_tests/codec.py
Modified: qpid/proton/trunk/proton-c/bindings/python/proton.py
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/bindings/python/proton.py?rev=1393720&r1=1393719&r2=1393720&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/bindings/python/proton.py (original)
+++ qpid/proton/trunk/proton-c/bindings/python/proton.py Wed Oct 3 19:39:19
2012
@@ -661,6 +661,7 @@ class Data:
SHORT = PN_SHORT; "A short value."
UINT = PN_UINT; "An unsigned int value."
INT = PN_INT; "A signed int value."
+ CHAR = PN_CHAR; "A character value."
ULONG = PN_ULONG; "An unsigned long value."
LONG = PN_LONG; "A signed long value."
TIMESTAMP = PN_TIMESTAMP; "A timestamp value."
@@ -895,6 +896,14 @@ class Data:
"""
self._check(pn_data_put_int(self._data, i))
+ def put_char(self, c):
+ """
+ Puts a char value.
+
+ @param c: a single character
+ """
+ self._check(pn_data_put_char(self._data, ord(c)))
+
def put_ulong(self, ul):
"""
Puts an unsigned long value.
@@ -1108,6 +1117,15 @@ class Data:
self._check(err)
return value
+ def get_char(self):
+ """
+ If the current node is a char, returns its value, raises an
+ exception otherwise.
+ """
+ err, value = pn_data_get_char(self._data)
+ self._check(err)
+ return unichr(value)
+
def get_ulong(self):
"""
If the current node is an unsigned long, returns its value, raises
Modified: qpid/proton/trunk/proton-c/include/proton/codec.h
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/include/proton/codec.h?rev=1393720&r1=1393719&r2=1393720&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/include/proton/codec.h (original)
+++ qpid/proton/trunk/proton-c/include/proton/codec.h Wed Oct 3 19:39:19 2012
@@ -41,6 +41,7 @@ typedef enum {
PN_SHORT,
PN_UINT,
PN_INT,
+ PN_CHAR,
PN_ULONG,
PN_LONG,
PN_TIMESTAMP,
@@ -66,6 +67,7 @@ typedef struct {
int16_t as_short;
uint32_t as_uint;
int32_t as_int;
+ pn_char_t as_char;
uint64_t as_ulong;
int64_t as_long;
pn_timestamp_t as_timestamp;
@@ -117,6 +119,7 @@ int pn_data_put_ushort(pn_data_t *data,
int pn_data_put_short(pn_data_t *data, int16_t s);
int pn_data_put_uint(pn_data_t *data, uint32_t ui);
int pn_data_put_int(pn_data_t *data, int32_t i);
+int pn_data_put_char(pn_data_t *data, pn_char_t c);
int pn_data_put_ulong(pn_data_t *data, uint64_t ul);
int pn_data_put_long(pn_data_t *data, int64_t l);
int pn_data_put_timestamp(pn_data_t *data, pn_timestamp_t t);
@@ -138,6 +141,7 @@ int pn_data_get_ushort(pn_data_t *data,
int pn_data_get_short(pn_data_t *data, int16_t *s);
int pn_data_get_uint(pn_data_t *data, uint32_t *ui);
int pn_data_get_int(pn_data_t *data, int32_t *i);
+int pn_data_get_char(pn_data_t *data, pn_char_t *c);
int pn_data_get_ulong(pn_data_t *data, uint64_t *ul);
int pn_data_get_long(pn_data_t *data, int64_t *l);
int pn_data_get_timestamp(pn_data_t *data, pn_timestamp_t *l);
Modified: qpid/proton/trunk/proton-c/include/proton/types.h
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/include/proton/types.h?rev=1393720&r1=1393719&r2=1393720&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/include/proton/types.h (original)
+++ qpid/proton/trunk/proton-c/include/proton/types.h Wed Oct 3 19:39:19 2012
@@ -32,6 +32,7 @@ extern "C" {
typedef int32_t pn_sequence_t;
typedef uint32_t pn_millis_t;
typedef uint64_t pn_timestamp_t;
+typedef uint32_t pn_char_t;
typedef struct {
size_t size;
Modified: qpid/proton/trunk/proton-c/src/codec/codec.c
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/codec/codec.c?rev=1393720&r1=1393719&r2=1393720&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/codec/codec.c (original)
+++ qpid/proton/trunk/proton-c/src/codec/codec.c Wed Oct 3 19:39:19 2012
@@ -77,6 +77,7 @@ const char *pn_type_str(pn_type_t type)
case PN_SHORT: return "PN_SHORT";
case PN_UINT: return "PN_UINT";
case PN_INT: return "PN_INT";
+ case PN_CHAR: return "PN_CHAR";
case PN_ULONG: return "PN_ULONG";
case PN_LONG: return "PN_LONG";
case PN_TIMESTAMP: return "PN_TIMESTAMP";
@@ -154,6 +155,8 @@ int pn_format_atom(pn_bytes_t *bytes, pn
return pn_bytes_format(bytes, "%" PRIu32, atom.u.as_uint);
case PN_INT:
return pn_bytes_format(bytes, "%" PRIi32, atom.u.as_int);
+ case PN_CHAR:
+ return pn_bytes_format(bytes, "%lc", atom.u.as_char);
case PN_ULONG:
return pn_bytes_format(bytes, "%" PRIu64, atom.u.as_ulong);
case PN_LONG:
@@ -404,6 +407,7 @@ uint8_t pn_type2code(pn_type_t type)
case PN_SHORT: return PNE_SHORT;
case PN_UINT: return PNE_UINT;
case PN_INT: return PNE_INT;
+ case PN_CHAR: return PNE_UTF32;
case PN_FLOAT: return PNE_FLOAT;
case PN_LONG: return PNE_LONG;
case PN_TIMESTAMP: return PNE_MS64;
@@ -532,6 +536,7 @@ int pn_encode_value(pn_bytes_t *bytes, p
case PN_SHORT: return pn_bytes_writef16(bytes, atom->u.as_short);
case PN_UINT: return pn_bytes_writef32(bytes, atom->u.as_uint);
case PN_INT: return pn_bytes_writef32(bytes, atom->u.as_int);
+ case PN_CHAR: return pn_bytes_writef32(bytes, atom->u.as_char);
case PN_ULONG: return pn_bytes_writef64(bytes, atom->u.as_ulong);
case PN_LONG: return pn_bytes_writef64(bytes, atom->u.as_long);
case PN_TIMESTAMP: return pn_bytes_writef64(bytes, atom->u.as_timestamp);
@@ -643,6 +648,8 @@ pn_type_t pn_code2type(uint8_t code)
return PN_UINT;
case PNE_INT:
return PN_INT;
+ case PNE_UTF32:
+ return PN_CHAR;
case PNE_FLOAT:
return PN_FLOAT;
case PNE_LONG:
@@ -752,6 +759,11 @@ int pn_decode_value(pn_bytes_t *bytes, p
atom.type=PN_INT, atom.u.as_int=ntohl(*((uint32_t *) (bytes->start)));
pn_bytes_ltrim(bytes, 4);
break;
+ case PNE_UTF32:
+ if (bytes->size < 4) return PN_UNDERFLOW;
+ atom.type=PN_CHAR, atom.u.as_char=ntohl(*((uint32_t *) (bytes->start)));
+ pn_bytes_ltrim(bytes, 4);
+ break;
case PNE_FLOAT:
if (bytes->size < 4) return PN_UNDERFLOW;
// XXX: this assumes the platform uses IEEE floats
@@ -1006,6 +1018,11 @@ int pn_vfill_one(pn_atoms_t *atoms, cons
atom->u.as_int = va_arg(*ap, int32_t);
(*nvals)++;
return 0;
+ case 'c':
+ atom->type = PN_CHAR;
+ atom->u.as_char = va_arg(*ap, pn_char_t);
+ (*nvals)++;
+ return 0;
case 'L':
atom->type = PN_ULONG;
atom->u.as_ulong = va_arg(*ap, uint64_t);
@@ -1389,6 +1406,19 @@ int pn_scan_one(pn_atoms_t *atoms, const
}
if (atoms) pn_atoms_ltrim(atoms, 1);
return 0;
+ case 'c':
+ {
+ uint32_t *value = va_arg(*ap, pn_char_t *);
+ if (atom && atom->type == PN_CHAR) {
+ *value = atom->u.as_char;
+ *scanned = true;
+ } else {
+ *value = 0;
+ *scanned = false;
+ }
+ }
+ if (atoms) pn_atoms_ltrim(atoms, 1);
+ return 0;
case 'L':
{
uint64_t *value = va_arg(*ap, uint64_t *);
@@ -2157,6 +2187,20 @@ int pn_data_vscan(pn_data_t *data, const
}
if (resume_count && level == count_level) resume_count--;
break;
+ case 'c':
+ {
+ pn_char_t *value = va_arg(ap, pn_char_t *);
+ found = pn_scan_next(data, &type, suspend);
+ if (found && type == PN_CHAR) {
+ pn_data_get_char(data, value);
+ scanned = true;
+ } else {
+ *value = 0;
+ scanned = false;
+ }
+ }
+ if (resume_count && level == count_level) resume_count--;
+ break;
case 'L':
{
uint64_t *value = va_arg(ap, uint64_t *);
@@ -2687,6 +2731,10 @@ int pn_data_parse_atoms(pn_data_t *data,
pn_data_put_int(data, atom.u.as_int);
count++;
break;
+ case PN_CHAR:
+ pn_data_put_char(data, atom.u.as_char);
+ count++;
+ break;
case PN_ULONG:
pn_data_put_ulong(data, atom.u.as_ulong);
count++;
@@ -2919,6 +2967,14 @@ int pn_data_put_int(pn_data_t *data, int
return 0;
}
+int pn_data_put_char(pn_data_t *data, pn_char_t c)
+{
+ pn_node_t *node = pn_data_add(data);
+ node->atom.type = PN_CHAR;
+ node->atom.u.as_char = c;
+ return 0;
+}
+
int pn_data_put_ulong(pn_data_t *data, uint64_t ul)
{
pn_node_t *node = pn_data_add(data);
@@ -3131,6 +3187,18 @@ int pn_data_get_int(pn_data_t *data, int
}
}
+int pn_data_get_char(pn_data_t *data, pn_char_t *c)
+{
+ pn_node_t *node = pn_data_current(data);
+ if (node->atom.type == PN_CHAR) {
+ *c = node->atom.u.as_char;
+ return 0;
+ } else {
+ *c = 0;
+ return PN_ERR;
+ }
+}
+
int pn_data_get_ulong(pn_data_t *data, uint64_t *ul)
{
pn_node_t *node = pn_data_current(data);
Modified: qpid/proton/trunk/tests/proton_tests/codec.py
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/tests/proton_tests/codec.py?rev=1393720&r1=1393719&r2=1393720&view=diff
==============================================================================
--- qpid/proton/trunk/tests/proton_tests/codec.py (original)
+++ qpid/proton/trunk/tests/proton_tests/codec.py Wed Oct 3 19:39:19 2012
@@ -174,3 +174,6 @@ class DataTest(Test):
def testTimestamp(self):
self._test("timestamp", 0, 12345, 1000000)
+
+ def testChar(self):
+ self._test("char", 'a', 'b', 'c', u'\u1234')
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]