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]

Reply via email to