blob: 0aa949927cba9d7fb20bf98fa7c72d5cffa263dc [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.
#
from org.apache.qpid.proton import Proton
from org.apache.qpid.proton.amqp import Symbol, UnsignedByte, UnsignedInteger, \
UnsignedShort, UnsignedLong, Decimal32, Decimal64, Decimal128
from org.apache.qpid.proton.codec.Data import DataType
from cerror import *
from java.util import UUID as JUUID, Date as JDate
from java.nio import ByteBuffer
from compat import array, zeros
# from proton/codec.h
PN_NULL = 1
PN_BOOL = 2
PN_UBYTE = 3
PN_BYTE = 4
PN_USHORT = 5
PN_SHORT = 6
PN_UINT = 7
PN_INT = 8
PN_CHAR = 9
PN_ULONG = 10
PN_LONG = 11
PN_TIMESTAMP = 12
PN_FLOAT = 13
PN_DOUBLE = 14
PN_DECIMAL32 = 15
PN_DECIMAL64 = 16
PN_DECIMAL128 = 17
PN_UUID = 18
PN_BINARY = 19
PN_STRING = 20
PN_SYMBOL = 21
PN_DESCRIBED = 22
PN_ARRAY = 23
PN_LIST = 24
PN_MAP = 25
DATA_TYPES_J2P = {}
DATA_TYPES_P2J = {}
def DATA_TYPES(jtype, ptype):
DATA_TYPES_J2P[jtype] = ptype
DATA_TYPES_P2J[ptype] = jtype
DATA_TYPES(DataType.NULL, PN_NULL)
DATA_TYPES(DataType.BOOL, PN_BOOL)
DATA_TYPES(DataType.BYTE, PN_BYTE)
DATA_TYPES(DataType.UBYTE, PN_UBYTE)
DATA_TYPES(DataType.USHORT, PN_USHORT)
DATA_TYPES(DataType.UINT, PN_UINT)
DATA_TYPES(DataType.ULONG, PN_ULONG)
DATA_TYPES(DataType.SHORT, PN_SHORT)
DATA_TYPES(DataType.INT, PN_INT)
DATA_TYPES(DataType.LONG, PN_LONG)
DATA_TYPES(DataType.CHAR, PN_CHAR)
DATA_TYPES(DataType.TIMESTAMP, PN_TIMESTAMP)
DATA_TYPES(DataType.FLOAT, PN_FLOAT)
DATA_TYPES(DataType.DOUBLE, PN_DOUBLE)
DATA_TYPES(DataType.DECIMAL32, PN_DECIMAL32)
DATA_TYPES(DataType.DECIMAL64, PN_DECIMAL64)
DATA_TYPES(DataType.DECIMAL128, PN_DECIMAL128)
DATA_TYPES(DataType.BINARY, PN_BINARY)
DATA_TYPES(DataType.STRING, PN_STRING)
DATA_TYPES(DataType.SYMBOL, PN_SYMBOL)
DATA_TYPES(DataType.UUID, PN_UUID)
DATA_TYPES(DataType.LIST, PN_LIST)
DATA_TYPES(DataType.MAP, PN_MAP)
DATA_TYPES(DataType.ARRAY, PN_ARRAY)
DATA_TYPES(DataType.DESCRIBED, PN_DESCRIBED)
def pn_data(capacity):
return Proton.data(capacity)
def pn_data_put_null(data):
data.putNull()
return 0
def pn_data_put_bool(data, b):
data.putBoolean(b)
return 0
def pn_data_get_bool(data):
return data.getBoolean()
def pn_data_get_byte(data):
return data.getByte()
def pn_data_put_byte(data, u):
data.putByte(u)
return 0
def pn_data_get_ubyte(data):
return data.getUnsignedByte().longValue()
def pn_data_put_ubyte(data, u):
data.putUnsignedByte(UnsignedByte.valueOf(u))
return 0
def pn_data_get_ushort(data):
return data.getUnsignedShort().longValue()
def pn_data_put_ushort(data, u):
data.putUnsignedShort(UnsignedShort.valueOf(u))
return 0
def pn_data_get_uint(data):
return data.getUnsignedInteger().longValue()
def pn_data_put_uint(data, u):
data.putUnsignedInteger(UnsignedInteger.valueOf(u))
return 0
def pn_data_put_ulong(data, u):
data.putUnsignedLong(UnsignedLong.valueOf(u))
return 0
BITS_64 = 2**64 - 1;
def pn_data_get_ulong(data):
value = data.getUnsignedLong().longValue()
if value < 0:
return value & BITS_64;
return value
def pn_data_get_short(data):
return data.getShort()
def pn_data_put_short(data, s):
data.putShort(s)
return 0
def pn_data_put_int(data, i):
data.putInt(i)
return 0
def pn_data_get_int(data):
return data.getInt()
def pn_data_put_long(data, l):
data.putLong(l)
return 0
def pn_data_get_long(data):
return data.getLong()
def pn_data_put_char(data, c):
data.putChar(c)
return 0
def pn_data_get_char(data):
return data.getChar()
def pn_data_put_timestamp(data, t):
data.putTimestamp(JDate(t))
return 0
def pn_data_get_timestamp(data):
return data.getTimestamp().getTime()
def pn_data_put_float(data, f):
data.putFloat(f)
return 0
def pn_data_get_float(data):
return data.getFloat()
def pn_data_put_double(data, d):
data.putDouble(d)
return 0
def pn_data_get_double(data):
return data.getDouble()
def pn_data_put_decimal32(data, d):
data.putDecimal32(Decimal32(d))
return 0
def pn_data_get_decimal32(data):
return data.getDecimal32().getBits()
def pn_data_put_decimal64(data, d):
data.putDecimal64(Decimal64(d))
return 0
def pn_data_get_decimal64(data):
return data.getDecimal64().getBits()
def pn_data_put_decimal128(data, d):
data.putDecimal128(Decimal128(array(d, 'b')))
return 0
def pn_data_get_decimal128(data):
return data.getDecimal128().asBytes().tostring()
def pn_data_put_binary(data, b):
data.putBinary(array(b, 'b'))
return 0
def pn_data_get_binary(data):
return data.getBinary().getArray().tostring()
def pn_data_put_string(data, s):
data.putString(s)
return 0
def pn_data_get_string(data):
return data.getString()
def pn_data_put_symbol(data, s):
data.putSymbol(Symbol.valueOf(s))
return 0
def pn_data_get_symbol(data):
return data.getSymbol().toString()
def pn_data_put_uuid(data, u):
bb = ByteBuffer.wrap(array(u, 'b'))
first = bb.getLong()
second = bb.getLong()
data.putUUID(JUUID(first, second))
return 0
def pn_data_get_uuid(data):
u = data.getUUID()
ba = zeros(16, 'b')
bb = ByteBuffer.wrap(ba)
bb.putLong(u.getMostSignificantBits())
bb.putLong(u.getLeastSignificantBits())
return ba.tostring()
def pn_data_put_list(data):
data.putList()
return 0
def pn_data_get_list(data):
return data.getList()
def pn_data_put_map(data):
data.putMap()
return 0
def pn_data_put_array(data, described, type):
data.putArray(described, DATA_TYPES_P2J[type])
return 0
def pn_data_get_array(data):
return data.getArray()
def pn_data_is_array_described(data):
return data.isArrayDescribed()
def pn_data_get_array_type(data):
return DATA_TYPES_J2P[data.getArrayType()]
def pn_data_put_described(data):
data.putDescribed()
return 0
def pn_data_rewind(data):
data.rewind()
def pn_data_next(data):
t = data.next()
return t != None
def pn_data_enter(data):
return data.enter()
def pn_data_exit(data):
return data.exit()
def pn_data_type(data):
t = data.type()
if t is None:
return -1
else:
return DATA_TYPES_J2P[t]
def pn_data_encode(data, size):
enc = data.encode().getArray().tostring()
if len(enc) > size:
return PN_OVERFLOW, None
else:
return len(enc), enc
def pn_data_encoded_size(data):
return data.encodedSize()
def pn_data_decode(data, encoded):
return data.decode(ByteBuffer.wrap(array(encoded, 'b')))
def pn_data_narrow(data):
data.narrow()
def pn_data_widen(data):
data.widen()
def pn_data_copy(data, src):
data.copy(src)
def pn_data_format(data, n):
return 0, data.format()
def pn_data_clear(data):
data.clear()
def pn_data_free(data):
pass
def dat2obj(dat):
dat.rewind()
if dat.next():
return dat.getObject()
else:
return None
def obj2dat(obj, dat=None):
if dat is None:
dat = pn_data(0)
else:
dat.clear()
if obj:
dat.putObject(obj)
dat.rewind()
return dat
def array2dat(ary, atype, dat=None):
if dat is None:
dat = pn_data(0)
else:
dat.clear()
if ary:
pn_data_put_array(dat, False, atype)
pn_data_enter(dat)
for o in ary:
dat.putObject(o)
dat.rewind()
return dat