diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | CMakeLists.txt | 159 | ||||
-rw-r--r-- | Makefile.am | 39 | ||||
-rw-r--r-- | configure.ac | 34 | ||||
-rw-r--r-- | librabbitmq/CMakeLists.txt | 96 | ||||
-rw-r--r-- | librabbitmq/amqp_framing.c | 2071 | ||||
-rw-r--r-- | librabbitmq/amqp_framing.h | 627 | ||||
-rw-r--r-- | librabbitmq/codegen.py | 4 | ||||
-rw-r--r-- | tools/CMakeLists.txt | 2 |
9 files changed, 2885 insertions, 149 deletions
@@ -33,8 +33,6 @@ examples/amqp_rpc_sendstring_client examples/amqp_sendstring examples/amqp_unbind librabbitmq.pc -librabbitmq/amqp_framing.c -librabbitmq/amqp_framing.h tests/test_parse_url tests/test_tables tools/amqp-consume diff --git a/CMakeLists.txt b/CMakeLists.txt index 250ed30..9ed5b8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,97 +95,104 @@ set(CMAKE_REQUIRED_LIBRARIES ${SOCKET_LIBRARIES}) check_function_exists(htonll HAVE_HTONLL) cmake_pop_check_state() -find_package(PythonInterp REQUIRED) -#Determine Python Version: -if(PYTHON_EXECUTABLE) - execute_process(COMMAND "${PYTHON_EXECUTABLE}" -c - "import sys; sys.stdout.write(';'.join([str(x) for x in sys.version_info[:3]]))" - OUTPUT_VARIABLE _VERSION - RESULT_VARIABLE _PYTHON_VERSION_RESULT - ERROR_QUIET) - if(NOT _PYTHON_VERSION_RESULT) - string(REPLACE ";" "." PYTHON_VERSION_STRING "${_VERSION}") - list(GET _VERSION 0 PYTHON_VERSION_MAJOR) - list(GET _VERSION 1 PYTHON_VERSION_MINOR) - list(GET _VERSION 2 PYTHON_VERSION_PATCH) - if(PYTHON_VERSION_PATCH EQUAL 0) - # it's called "Python 2.7", not "2.7.0" - string(REGEX REPLACE "\\.0$" "" PYTHON_VERSION_STRING "${PYTHON_VERSION_STRING}") - endif() - else() - # sys.version predates sys.version_info, so use that - execute_process(COMMAND "${PYTHON_EXECUTABLE}" -c "import sys; sys.stdout.write(sys.version)" +option(REGENERATE_AMQP_FRAMING "Regenerate amqp_framing.h/amqp_framing.c sources (for developer use)" OFF) +mark_as_advanced(REGENERATE_AMQP_FRAMING) + +if (REGENERATE_AMQP_FRAMING) + find_package(PythonInterp) + if (NOT PYTHONINTERP_FOUND) + message(FATAL_ERROR "REGENERATE_AMQP_FRAMING requires Python to be available") + endif () + + #Determine Python Version: + if(PYTHON_EXECUTABLE) + execute_process(COMMAND "${PYTHON_EXECUTABLE}" -c + "import sys; sys.stdout.write(';'.join([str(x) for x in sys.version_info[:3]]))" OUTPUT_VARIABLE _VERSION RESULT_VARIABLE _PYTHON_VERSION_RESULT ERROR_QUIET) if(NOT _PYTHON_VERSION_RESULT) - string(REGEX REPLACE " .*" "" PYTHON_VERSION_STRING "${_VERSION}") - string(REGEX REPLACE "^([0-9]+)\\.[0-9]+.*" "\\1" PYTHON_VERSION_MAJOR "${PYTHON_VERSION_STRING}") - string(REGEX REPLACE "^[0-9]+\\.([0-9])+.*" "\\1" PYTHON_VERSION_MINOR "${PYTHON_VERSION_STRING}") - if(PYTHON_VERSION_STRING MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+.*") - string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" PYTHON_VERSION_PATCH "${PYTHON_VERSION_STRING}") - else() - set(PYTHON_VERSION_PATCH "0") + string(REPLACE ";" "." PYTHON_VERSION_STRING "${_VERSION}") + list(GET _VERSION 0 PYTHON_VERSION_MAJOR) + list(GET _VERSION 1 PYTHON_VERSION_MINOR) + list(GET _VERSION 2 PYTHON_VERSION_PATCH) + if(PYTHON_VERSION_PATCH EQUAL 0) + # it's called "Python 2.7", not "2.7.0" + string(REGEX REPLACE "\\.0$" "" PYTHON_VERSION_STRING "${PYTHON_VERSION_STRING}") endif() else() - # sys.version was first documented for Python 1.5, so assume - # this is older. - set(PYTHON_VERSION_STRING "1.4") - set(PYTHON_VERSION_MAJOR "1") - set(PYTHON_VERSION_MAJOR "4") - set(PYTHON_VERSION_MAJOR "0") + # sys.version predates sys.version_info, so use that + execute_process(COMMAND "${PYTHON_EXECUTABLE}" -c "import sys; sys.stdout.write(sys.version)" + OUTPUT_VARIABLE _VERSION + RESULT_VARIABLE _PYTHON_VERSION_RESULT + ERROR_QUIET) + if(NOT _PYTHON_VERSION_RESULT) + string(REGEX REPLACE " .*" "" PYTHON_VERSION_STRING "${_VERSION}") + string(REGEX REPLACE "^([0-9]+)\\.[0-9]+.*" "\\1" PYTHON_VERSION_MAJOR "${PYTHON_VERSION_STRING}") + string(REGEX REPLACE "^[0-9]+\\.([0-9])+.*" "\\1" PYTHON_VERSION_MINOR "${PYTHON_VERSION_STRING}") + if(PYTHON_VERSION_STRING MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+.*") + string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" PYTHON_VERSION_PATCH "${PYTHON_VERSION_STRING}") + else() + set(PYTHON_VERSION_PATCH "0") + endif() + else() + # sys.version was first documented for Python 1.5, so assume + # this is older. + set(PYTHON_VERSION_STRING "1.4") + set(PYTHON_VERSION_MAJOR "1") + set(PYTHON_VERSION_MAJOR "4") + set(PYTHON_VERSION_MAJOR "0") + endif() endif() - endif() - unset(_PYTHON_VERSION_RESULT) - unset(_VERSION) -endif(PYTHON_EXECUTABLE) - -# If we're running v3.x look for a 2to3 utility -if (PYTHON_VERSION_MAJOR GREATER 2) - get_filename_component(PYTHON_EXE_DIR ${PYTHON_EXECUTABLE} PATH) - find_program(PYTHON_2TO3_EXECUTABLE - NAMES 2to3 - HINTS ${PYTHON_EXE_DIR} - ) - - if ("PYTHON_2TO3_EXECUTABLE-NOTFOUND" STREQUAL PYTHON_2TO3_EXECUTABLE) - message(FATAL_ERROR "Unable to find 2to3 python utility, specify python 2.7 or specify 2to3 utility") - endif () -endif () - + unset(_PYTHON_VERSION_RESULT) + unset(_VERSION) + endif(PYTHON_EXECUTABLE) + + # If we're running v3.x look for a 2to3 utility + if (PYTHON_VERSION_MAJOR GREATER 2) + get_filename_component(PYTHON_EXE_DIR ${PYTHON_EXECUTABLE} PATH) + find_program(PYTHON_2TO3_EXECUTABLE + NAMES 2to3 + HINTS ${PYTHON_EXE_DIR} + ) + + if ("PYTHON_2TO3_EXECUTABLE-NOTFOUND" STREQUAL PYTHON_2TO3_EXECUTABLE) + message(FATAL_ERROR "Unable to find 2to3 python utility, specify python 2.7 or specify 2to3 utility") + endif () + endif (PYTHON_VERSION_MAJOR GREATER 2) -#check for json or simplejson -execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import json" - RESULT_VARIABLE CHECK_PYTHON_JSON_FAILED -) -if (CHECK_PYTHON_JSON_FAILED) - execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import simplejson" - RESULT_VARIABLE CHECK_PYTHON_SIMPLEJSON_FAILED + #check for json or simplejson + execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import json" + RESULT_VARIABLE CHECK_PYTHON_JSON_FAILED ) - if (CHECK_PYTHON_SIMPLEJSON_FAILED) - message(FATAL_ERROR "could not find a python that can 'import simplejson") - endif (CHECK_PYTHON_SIMPLEJSON_FAILED) -endif (CHECK_PYTHON_JSON_FAILED) + if (CHECK_PYTHON_JSON_FAILED) + execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import simplejson" + RESULT_VARIABLE CHECK_PYTHON_SIMPLEJSON_FAILED + ) + if (CHECK_PYTHON_SIMPLEJSON_FAILED) + message(FATAL_ERROR "REGENERATE_AMQP_FRAMING requires a python with json or simplejson modules") + endif (CHECK_PYTHON_SIMPLEJSON_FAILED) + endif (CHECK_PYTHON_JSON_FAILED) -find_path(AMQP_CODEGEN_DIR - amqp_codegen.py - PATHS ${CMAKE_CURRENT_SOURCE_DIR}/codegen - ${CMAKE_CURRENT_SOURCE_DIR}/rabbitmq-codegen - ${CMAKE_CURRENT_SOURCE_DIR}/../rabbitmq-codegen - DOC "Path to directory containing amqp_codegen.py (rabbitmq-codegen)" - NO_DEFAULT_PATH - ) -if (AMQP_CODEGEN_DIR STREQUAL "AMQP_CODEGEN_DIR-NOTFOUND") - message(SEND_ERROR "Cannot find amqp_codegen.py, did you forget to:\n\ngit submodule init\ngit submodule update\n?\n\n Or set AMQP_CODEGEN_DIR to directory containing amqp_codegen.py") -else () - message(STATUS "Found amqp_codegen.py in ${AMQP_CODEGEN_DIR}") -endif() + find_path(AMQP_CODEGEN_DIR + amqp_codegen.py + PATHS ${CMAKE_CURRENT_SOURCE_DIR}/codegen + ${CMAKE_CURRENT_SOURCE_DIR}/rabbitmq-codegen + ${CMAKE_CURRENT_SOURCE_DIR}/../rabbitmq-codegen + DOC "Path to directory containing amqp_codegen.py (rabbitmq-codegen)" + NO_DEFAULT_PATH + ) -mark_as_advanced(AMQP_CODEGEN_DIR) + if (AMQP_CODEGEN_DIR STREQUAL "AMQP_CODEGEN_DIR-NOTFOUND") + message(SEND_ERROR "REGENERATE_AMQP_FRAMING requires the amqp_codegen.py script. If this is a git clone you can:\n\ngit submodule init\ngit submodule update\n\n Or set AMQP_CODEGEN_DIR to directory containing amqp_codegen.py") + else () + message(STATUS "Found amqp_codegen.py in ${AMQP_CODEGEN_DIR}") + endif() +endif (REGENERATE_AMQP_FRAMING) find_package(POPT) find_package(XmlTo) diff --git a/Makefile.am b/Makefile.am index 103e1ec..80da583 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,19 +1,25 @@ ACLOCAL_AMFLAGS = -I m4 -AM_CFLAGS = -I$(top_srcdir)/librabbitmq -I$(top_builddir)/librabbitmq +AM_CFLAGS = -I$(top_builddir)/librabbitmq/gen -I$(top_srcdir)/librabbitmq lib_LTLIBRARIES = librabbitmq/librabbitmq.la librabbitmq_librabbitmq_la_SOURCES = \ librabbitmq/amqp_api.c \ librabbitmq/amqp_connection.c \ - librabbitmq/amqp_framing.c \ librabbitmq/amqp_mem.c \ librabbitmq/amqp_private.h \ librabbitmq/amqp_socket.c \ librabbitmq/amqp_table.c \ librabbitmq/amqp_url.c +if REGENERATE_AMQP_FRAMING +librabbitmq_librabbitmq_la_SOURCES += librabbitmq/gen/amqp_framing.c +else +librabbitmq_librabbitmq_la_SOURCES += librabbitmq/amqp_framing.c +endif + + librabbitmq_librabbitmq_la_LDFLAGS = \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ $(NO_UNDEFINED) @@ -34,12 +40,9 @@ librabbitmq_librabbitmq_la_CFLAGS += -I$(top_srcdir)/librabbitmq/win32/msinttype endif include_HEADERS = \ - $(top_srcdir)/librabbitmq/amqp.h \ - $(top_builddir)/librabbitmq/amqp_framing.h + $(top_srcdir)/librabbitmq/amqp.h -BUILT_SOURCES = \ - $(top_builddir)/librabbitmq/amqp_framing.h \ - $(top_builddir)/librabbitmq/amqp_framing.c +if REGENERATE_AMQP_FRAMING if PYTHON3 codegen_py = $(top_builddir)/librabbitmq/python3/codegen3.py @@ -63,12 +66,22 @@ endif amqp_codegen_json = $(top_srcdir)/codegen/amqp-rabbitmq-0.9.1.json -librabbitmq/amqp_framing.h: $(amqp_codegen_json) $(codegen_py) $(codegenlib_py) +$(top_builddir)/librabbitmq/gen/amqp_framing.h: $(amqp_codegen_json) $(codegen_py) $(codegenlib_py) $(AM_V_GEN)PYTHONPATH=$(codegenlib_path) $(PYTHON) $(codegen_py) header $< $@ -librabbitmq/amqp_framing.c: $(amqp_codegen_json) $(codegen_py) $(codegenlib_py) +$(top_builddir)/librabbitmq/gen/amqp_framing.c: $(amqp_codegen_json) $(codegen_py) $(codegenlib_py) $(AM_V_GEN)PYTHONPATH=$(codegenlib_path) $(PYTHON) $(codegen_py) body $< $@ +BUILT_SOURCES = \ + $(top_builddir)/librabbitmq/gen/amqp_framing.h \ + $(top_builddir)/librabbitmq/gen/amqp_framing.c + +include_HEADERS += $(top_builddir)/librabbitmq/gen/amqp_framing.h + +else +include_HEADERS += $(top_srcdir)/librabbitmq/amqp_framing.h +endif #REGENERATE_AMQP_FRAMING + check_PROGRAMS = \ tests/test_tables \ tests/test_parse_url @@ -293,11 +306,15 @@ EXTRA_DIST = \ tools/doc/librabbitmq-tools.xml MOSTLYCLEANFILES = \ - $(top_builddir)/librabbitmq/amqp_framing.c \ - $(top_builddir)/librabbitmq/amqp_framing.h \ $(man_MANS) \ $(top_builddir)/tools/doc/man-date.ent +if REGENERATE_AMQP_FRAMING +MOSTLYCLEANFILES += \ + $(top_builddir)/librabbitmq/gen/amqp_framing.c \ + $(top_builddir)/librabbitmq/gen/amqp_framing.h +endif #REGENERATE_AMQP_FRAMING + pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = librabbitmq.pc diff --git a/configure.ac b/configure.ac index 4ee6a2f..8423fcc 100644 --- a/configure.ac +++ b/configure.ac @@ -97,21 +97,33 @@ AC_SEARCH_LIBS([socket], [socket], [], [-lnsl])]) AC_CHECK_FUNCS([htonll]) -AM_PATH_PYTHON([2.4]) +AC_ARG_ENABLE([regen-amqp-framing], + [AS_HELP_STRING([--enable-regen-amqp-framing], + [Regenerate amqp_framing.h/amqp_framing.c (for developer use)])]) -AX_PYTHON_MODULE([json], []) -AS_IF([test "x$HAVE_PYMOD_JSON" = "xno"], - [AX_PYTHON_MODULE([simplejson])]) -AS_IF([test "x$HAVE_PYMOD_JSON" = "xno" && test "x$HAVE_PYMOD_SIMPLEJSON" = "xno"], - [AC_MSG_ERROR([Unable to find json or simplejson python modules])]) +AM_CONDITIONAL([REGENERATE_AMQP_FRAMING], [test "x$enable_regen_amqp_framing" = "xyes"]) -AS_VERSION_COMPARE([$PYTHON_VERSION],[3.0],[eval HAVE_PYTHON3=no],[eval HAVE_PYTHON3=yes],[eval HAVE_PYTHON3=yes]) +AS_IF([test "x$enable_regen_amqp_framing" = "xyes"], + [AM_PATH_PYTHON([2.4],,AC_MSG_ERROR([--enable-regen-amqp-framing requires python])) -AS_IF([test "x$HAVE_PYTHON3" = "xyes"], - [AC_PATH_PROG(PYTHON2TO3,[2to3]) - AS_IF([test "x$PYTHON2TO3" = "x"], - AC_MSG_ERROR([Unable to find 2to3 python utility]))]) + AX_PYTHON_MODULE([json], []) + AS_IF([test "x$HAVE_PYMOD_JSON" = "xno"], + [AX_PYTHON_MODULE([simplejson])]) + AS_IF([test "x$HAVE_PYMOD_JSON" = "xno" && test "x$HAVE_PYMOD_SIMPLEJSON" = "xno"], + [AC_MSG_ERROR([Unable to find json or simplejson python modules])]) + AS_VERSION_COMPARE([$PYTHON_VERSION],[3.0], + [eval HAVE_PYTHON3=no], + [eval HAVE_PYTHON3=yes], + [eval HAVE_PYTHON3=yes]) + + AS_IF([test "x$HAVE_PYTHON3" = "xyes"], + [AC_PATH_PROG(PYTHON2TO3,[2to3]) + AS_IF([test "x$PYTHON2TO3" = "x"], + AC_MSG_ERROR([Unable to find 2to3 python utility]))]) + + ], + [HAVE_PYTHON3=no]) AM_CONDITIONAL([PYTHON3], [test "x$HAVE_PYTHON3" = "xyes"]) # Configure AMQP command-line tools diff --git a/librabbitmq/CMakeLists.txt b/librabbitmq/CMakeLists.txt index 5b14697..345d772 100644 --- a/librabbitmq/CMakeLists.txt +++ b/librabbitmq/CMakeLists.txt @@ -1,47 +1,49 @@ project(librabbitmq "C") -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -# Stuff dealing with code generation -set(AMQP_CODEGEN_PY "${CMAKE_CURRENT_BINARY_DIR}/amqp_codegen.py") -set(CODEGEN_PY "${CMAKE_CURRENT_BINARY_DIR}/codegen.py") -set(AMQP_SPEC_JSON_PATH "${AMQP_CODEGEN_DIR}/amqp-rabbitmq-0.9.1.json") - -#generate amqp_framing.h/amqp_framing.c - -if (PYTHON_VERSION_MAJOR GREATER 2) - set(CONVERT_CODEGEN ${PYTHON_2TO3_EXECUTABLE} -w ${CODEGEN_PY} > codegen_2to3.out) - set(CONVERT_AMQP_CODEGEN ${PYTHON_2TO3_EXECUTABLE} -w ${AMQP_CODEGEN_PY} > amqp_codegen_2to3.out) -else () - set(CONVERT_CODEGEN "") - set(CONVERT_AMQP_CODEGEN "") -endif () - -add_custom_command( - OUTPUT ${CODEGEN_PY} - COMMAND ${CMAKE_COMMAND} ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/codegen.py ${CODEGEN_PY} - COMMAND ${CONVERT_CODEGEN} - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/codegen.py - VERBATIM) - -add_custom_command( - OUTPUT ${AMQP_CODEGEN_PY} - COMMAND ${CMAKE_COMMAND} ARGS -E copy ${AMQP_CODEGEN_DIR}/amqp_codegen.py ${AMQP_CODEGEN_PY} - COMMAND ${CONVERT_AMQP_CODEGEN} - DEPENDS ${AMQP_CODEGEN_DIR}/amqp_codegen.py ${AMQP_CODEGEN_TARGET} - VERBATIM) - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/amqp_framing.h - COMMAND ${PYTHON_EXECUTABLE} ARGS ${CODEGEN_PY} header ${AMQP_SPEC_JSON_PATH} ${CMAKE_CURRENT_BINARY_DIR}/amqp_framing.h - DEPENDS ${AMQP_SPEC_JSON_PATH} ${CODEGEN_PY} ${AMQP_CODEGEN_PY} - VERBATIM) - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/amqp_framing.c - COMMAND ${PYTHON_EXECUTABLE} ARGS ${CODEGEN_PY} body ${AMQP_SPEC_JSON_PATH} ${CMAKE_CURRENT_BINARY_DIR}/amqp_framing.c - DEPENDS ${AMQP_SPEC_JSON_PATH} ${CODEGEN_PY} ${AMQP_CODEGEN_PY} - VERBATIM) +if (REGENERATE_AMQP_FRAMING) + set(AMQP_CODEGEN_PY "${CMAKE_CURRENT_BINARY_DIR}/amqp_codegen.py") + set(CODEGEN_PY "${CMAKE_CURRENT_BINARY_DIR}/codegen.py") + set(AMQP_SPEC_JSON_PATH "${AMQP_CODEGEN_DIR}/amqp-rabbitmq-0.9.1.json") + set(AMQP_FRAMING_H_PATH ${CMAKE_CURRENT_BINARY_DIR}/amqp_framing.h) + set(AMQP_FRAMING_C_PATH ${CMAKE_CURRENT_BINARY_DIR}/amqp_framing.c) + + if (PYTHON_VERSION_MAJOR GREATER 2) + set(CONVERT_CODEGEN ${PYTHON_2TO3_EXECUTABLE} -w ${CODEGEN_PY} > codegen_2to3.out) + set(CONVERT_AMQP_CODEGEN ${PYTHON_2TO3_EXECUTABLE} -w ${AMQP_CODEGEN_PY} > amqp_codegen_2to3.out) + else () + set(CONVERT_CODEGEN "") + set(CONVERT_AMQP_CODEGEN "") + endif () + + add_custom_command( + OUTPUT ${CODEGEN_PY} + COMMAND ${CMAKE_COMMAND} ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/codegen.py ${CODEGEN_PY} + COMMAND ${CONVERT_CODEGEN} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/codegen.py + VERBATIM) + + add_custom_command( + OUTPUT ${AMQP_CODEGEN_PY} + COMMAND ${CMAKE_COMMAND} ARGS -E copy ${AMQP_CODEGEN_DIR}/amqp_codegen.py ${AMQP_CODEGEN_PY} + COMMAND ${CONVERT_AMQP_CODEGEN} + DEPENDS ${AMQP_CODEGEN_DIR}/amqp_codegen.py ${AMQP_CODEGEN_TARGET} + VERBATIM) + + add_custom_command( + OUTPUT ${AMQP_FRAMING_H_PATH} + COMMAND ${PYTHON_EXECUTABLE} ARGS ${CODEGEN_PY} header ${AMQP_SPEC_JSON_PATH} ${AMQP_FRAMING_H_PATH} + DEPENDS ${AMQP_SPEC_JSON_PATH} ${CODEGEN_PY} ${AMQP_CODEGEN_PY} + VERBATIM) + + add_custom_command( + OUTPUT ${AMQP_FRAMING_C_PATH} + COMMAND ${PYTHON_EXECUTABLE} ARGS ${CODEGEN_PY} body ${AMQP_SPEC_JSON_PATH} ${AMQP_FRAMING_C_PATH} + DEPENDS ${AMQP_SPEC_JSON_PATH} ${CODEGEN_PY} ${AMQP_CODEGEN_PY} + VERBATIM) +else (REGENERATE_AMQP_FRAMING) + set(AMQP_FRAMING_H_PATH ${CMAKE_CURRENT_SOURCE_DIR}/amqp_framing.h) + set(AMQP_FRAMING_C_PATH ${CMAKE_CURRENT_SOURCE_DIR}/amqp_framing.c) +endif (REGENERATE_AMQP_FRAMING) if(WIN32) set(SOCKET_IMPL "win32") @@ -56,9 +58,11 @@ if(MSVC) endif(MSVC_VERSION LESS 1600) endif(MSVC) +# NOTE: order is important here: if we generate amqp_framing.h/.c it'll be in the +# binary directory, and should shadow whats in the source directory set(LIBRABBITMQ_INCLUDE_DIRS + ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} ${SOCKET_IMPL} ${MSINTTYPES_INCLUDE} ) @@ -72,8 +76,8 @@ set(LIBRABBITMQ_INCLUDE_DIRS add_definitions(-DHAVE_CONFIG_H) set(RABBITMQ_SOURCES - ${CMAKE_CURRENT_BINARY_DIR}/amqp_framing.h - ${CMAKE_CURRENT_BINARY_DIR}/amqp_framing.c + ${AMQP_FRAMING_H_PATH} + ${AMQP_FRAMING_C_PATH} amqp_api.c amqp.h amqp_connection.c amqp_mem.c amqp_private.h amqp_socket.c amqp_table.c amqp_url.c @@ -131,7 +135,7 @@ if (BUILD_STATIC_LIBS) endif () endif (BUILD_STATIC_LIBS) -install(FILES amqp.h ${CMAKE_CURRENT_BINARY_DIR}/amqp_framing.h ${STDINT_H_INSTALL_FILE} +install(FILES amqp.h ${AMQP_FRAMING_H_PATH} ${STDINT_H_INSTALL_FILE} DESTINATION include ) diff --git a/librabbitmq/amqp_framing.c b/librabbitmq/amqp_framing.c new file mode 100644 index 0000000..6a5f9ee --- /dev/null +++ b/librabbitmq/amqp_framing.c @@ -0,0 +1,2071 @@ +/* Generated code. Do not edit. Edit and re-run codegen.py instead. + * + * ***** BEGIN LICENSE BLOCK ***** + * Version: MIT + * + * Portions created by VMware are Copyright (c) 2007-2012 VMware, Inc. + * All Rights Reserved. + * + * Portions created by Tony Garnock-Jones are Copyright (c) 2009-2010 + * VMware, Inc. and Tony Garnock-Jones. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * ***** END LICENSE BLOCK ***** + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "amqp_private.h" +#include "socket.h" +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + + +char const *amqp_constant_name(int constantNumber) { + switch (constantNumber) { + case AMQP_FRAME_METHOD: return "AMQP_FRAME_METHOD"; + case AMQP_FRAME_HEADER: return "AMQP_FRAME_HEADER"; + case AMQP_FRAME_BODY: return "AMQP_FRAME_BODY"; + case AMQP_FRAME_HEARTBEAT: return "AMQP_FRAME_HEARTBEAT"; + case AMQP_FRAME_MIN_SIZE: return "AMQP_FRAME_MIN_SIZE"; + case AMQP_FRAME_END: return "AMQP_FRAME_END"; + case AMQP_REPLY_SUCCESS: return "AMQP_REPLY_SUCCESS"; + case AMQP_CONTENT_TOO_LARGE: return "AMQP_CONTENT_TOO_LARGE"; + case AMQP_NO_ROUTE: return "AMQP_NO_ROUTE"; + case AMQP_NO_CONSUMERS: return "AMQP_NO_CONSUMERS"; + case AMQP_ACCESS_REFUSED: return "AMQP_ACCESS_REFUSED"; + case AMQP_NOT_FOUND: return "AMQP_NOT_FOUND"; + case AMQP_RESOURCE_LOCKED: return "AMQP_RESOURCE_LOCKED"; + case AMQP_PRECONDITION_FAILED: return "AMQP_PRECONDITION_FAILED"; + case AMQP_CONNECTION_FORCED: return "AMQP_CONNECTION_FORCED"; + case AMQP_INVALID_PATH: return "AMQP_INVALID_PATH"; + case AMQP_FRAME_ERROR: return "AMQP_FRAME_ERROR"; + case AMQP_SYNTAX_ERROR: return "AMQP_SYNTAX_ERROR"; + case AMQP_COMMAND_INVALID: return "AMQP_COMMAND_INVALID"; + case AMQP_CHANNEL_ERROR: return "AMQP_CHANNEL_ERROR"; + case AMQP_UNEXPECTED_FRAME: return "AMQP_UNEXPECTED_FRAME"; + case AMQP_RESOURCE_ERROR: return "AMQP_RESOURCE_ERROR"; + case AMQP_NOT_ALLOWED: return "AMQP_NOT_ALLOWED"; + case AMQP_NOT_IMPLEMENTED: return "AMQP_NOT_IMPLEMENTED"; + case AMQP_INTERNAL_ERROR: return "AMQP_INTERNAL_ERROR"; + default: return "(unknown)"; + } +} + +amqp_boolean_t amqp_constant_is_hard_error(int constantNumber) { + switch (constantNumber) { + case AMQP_CONNECTION_FORCED: return 1; + case AMQP_INVALID_PATH: return 1; + case AMQP_FRAME_ERROR: return 1; + case AMQP_SYNTAX_ERROR: return 1; + case AMQP_COMMAND_INVALID: return 1; + case AMQP_CHANNEL_ERROR: return 1; + case AMQP_UNEXPECTED_FRAME: return 1; + case AMQP_RESOURCE_ERROR: return 1; + case AMQP_NOT_ALLOWED: return 1; + case AMQP_NOT_IMPLEMENTED: return 1; + case AMQP_INTERNAL_ERROR: return 1; + default: return 0; + } +} + +char const *amqp_method_name(amqp_method_number_t methodNumber) { + switch (methodNumber) { + case AMQP_CONNECTION_START_METHOD: return "AMQP_CONNECTION_START_METHOD"; + case AMQP_CONNECTION_START_OK_METHOD: return "AMQP_CONNECTION_START_OK_METHOD"; + case AMQP_CONNECTION_SECURE_METHOD: return "AMQP_CONNECTION_SECURE_METHOD"; + case AMQP_CONNECTION_SECURE_OK_METHOD: return "AMQP_CONNECTION_SECURE_OK_METHOD"; + case AMQP_CONNECTION_TUNE_METHOD: return "AMQP_CONNECTION_TUNE_METHOD"; + case AMQP_CONNECTION_TUNE_OK_METHOD: return "AMQP_CONNECTION_TUNE_OK_METHOD"; + case AMQP_CONNECTION_OPEN_METHOD: return "AMQP_CONNECTION_OPEN_METHOD"; + case AMQP_CONNECTION_OPEN_OK_METHOD: return "AMQP_CONNECTION_OPEN_OK_METHOD"; + case AMQP_CONNECTION_CLOSE_METHOD: return "AMQP_CONNECTION_CLOSE_METHOD"; + case AMQP_CONNECTION_CLOSE_OK_METHOD: return "AMQP_CONNECTION_CLOSE_OK_METHOD"; + case AMQP_CHANNEL_OPEN_METHOD: return "AMQP_CHANNEL_OPEN_METHOD"; + case AMQP_CHANNEL_OPEN_OK_METHOD: return "AMQP_CHANNEL_OPEN_OK_METHOD"; + case AMQP_CHANNEL_FLOW_METHOD: return "AMQP_CHANNEL_FLOW_METHOD"; + case AMQP_CHANNEL_FLOW_OK_METHOD: return "AMQP_CHANNEL_FLOW_OK_METHOD"; + case AMQP_CHANNEL_CLOSE_METHOD: return "AMQP_CHANNEL_CLOSE_METHOD"; + case AMQP_CHANNEL_CLOSE_OK_METHOD: return "AMQP_CHANNEL_CLOSE_OK_METHOD"; + case AMQP_ACCESS_REQUEST_METHOD: return "AMQP_ACCESS_REQUEST_METHOD"; + case AMQP_ACCESS_REQUEST_OK_METHOD: return "AMQP_ACCESS_REQUEST_OK_METHOD"; + case AMQP_EXCHANGE_DECLARE_METHOD: return "AMQP_EXCHANGE_DECLARE_METHOD"; + case AMQP_EXCHANGE_DECLARE_OK_METHOD: return "AMQP_EXCHANGE_DECLARE_OK_METHOD"; + case AMQP_EXCHANGE_DELETE_METHOD: return "AMQP_EXCHANGE_DELETE_METHOD"; + case AMQP_EXCHANGE_DELETE_OK_METHOD: return "AMQP_EXCHANGE_DELETE_OK_METHOD"; + case AMQP_EXCHANGE_BIND_METHOD: return "AMQP_EXCHANGE_BIND_METHOD"; + case AMQP_EXCHANGE_BIND_OK_METHOD: return "AMQP_EXCHANGE_BIND_OK_METHOD"; + case AMQP_EXCHANGE_UNBIND_METHOD: return "AMQP_EXCHANGE_UNBIND_METHOD"; + case AMQP_EXCHANGE_UNBIND_OK_METHOD: return "AMQP_EXCHANGE_UNBIND_OK_METHOD"; + case AMQP_QUEUE_DECLARE_METHOD: return "AMQP_QUEUE_DECLARE_METHOD"; + case AMQP_QUEUE_DECLARE_OK_METHOD: return "AMQP_QUEUE_DECLARE_OK_METHOD"; + case AMQP_QUEUE_BIND_METHOD: return "AMQP_QUEUE_BIND_METHOD"; + case AMQP_QUEUE_BIND_OK_METHOD: return "AMQP_QUEUE_BIND_OK_METHOD"; + case AMQP_QUEUE_PURGE_METHOD: return "AMQP_QUEUE_PURGE_METHOD"; + case AMQP_QUEUE_PURGE_OK_METHOD: return "AMQP_QUEUE_PURGE_OK_METHOD"; + case AMQP_QUEUE_DELETE_METHOD: return "AMQP_QUEUE_DELETE_METHOD"; + case AMQP_QUEUE_DELETE_OK_METHOD: return "AMQP_QUEUE_DELETE_OK_METHOD"; + case AMQP_QUEUE_UNBIND_METHOD: return "AMQP_QUEUE_UNBIND_METHOD"; + case AMQP_QUEUE_UNBIND_OK_METHOD: return "AMQP_QUEUE_UNBIND_OK_METHOD"; + case AMQP_BASIC_QOS_METHOD: return "AMQP_BASIC_QOS_METHOD"; + case AMQP_BASIC_QOS_OK_METHOD: return "AMQP_BASIC_QOS_OK_METHOD"; + case AMQP_BASIC_CONSUME_METHOD: return "AMQP_BASIC_CONSUME_METHOD"; + case AMQP_BASIC_CONSUME_OK_METHOD: return "AMQP_BASIC_CONSUME_OK_METHOD"; + case AMQP_BASIC_CANCEL_METHOD: return "AMQP_BASIC_CANCEL_METHOD"; + case AMQP_BASIC_CANCEL_OK_METHOD: return "AMQP_BASIC_CANCEL_OK_METHOD"; + case AMQP_BASIC_PUBLISH_METHOD: return "AMQP_BASIC_PUBLISH_METHOD"; + case AMQP_BASIC_RETURN_METHOD: return "AMQP_BASIC_RETURN_METHOD"; + case AMQP_BASIC_DELIVER_METHOD: return "AMQP_BASIC_DELIVER_METHOD"; + case AMQP_BASIC_GET_METHOD: return "AMQP_BASIC_GET_METHOD"; + case AMQP_BASIC_GET_OK_METHOD: return "AMQP_BASIC_GET_OK_METHOD"; + case AMQP_BASIC_GET_EMPTY_METHOD: return "AMQP_BASIC_GET_EMPTY_METHOD"; + case AMQP_BASIC_ACK_METHOD: return "AMQP_BASIC_ACK_METHOD"; + case AMQP_BASIC_REJECT_METHOD: return "AMQP_BASIC_REJECT_METHOD"; + case AMQP_BASIC_RECOVER_ASYNC_METHOD: return "AMQP_BASIC_RECOVER_ASYNC_METHOD"; + case AMQP_BASIC_RECOVER_METHOD: return "AMQP_BASIC_RECOVER_METHOD"; + case AMQP_BASIC_RECOVER_OK_METHOD: return "AMQP_BASIC_RECOVER_OK_METHOD"; + case AMQP_BASIC_NACK_METHOD: return "AMQP_BASIC_NACK_METHOD"; + case AMQP_TX_SELECT_METHOD: return "AMQP_TX_SELECT_METHOD"; + case AMQP_TX_SELECT_OK_METHOD: return "AMQP_TX_SELECT_OK_METHOD"; + case AMQP_TX_COMMIT_METHOD: return "AMQP_TX_COMMIT_METHOD"; + case AMQP_TX_COMMIT_OK_METHOD: return "AMQP_TX_COMMIT_OK_METHOD"; + case AMQP_TX_ROLLBACK_METHOD: return "AMQP_TX_ROLLBACK_METHOD"; + case AMQP_TX_ROLLBACK_OK_METHOD: return "AMQP_TX_ROLLBACK_OK_METHOD"; + case AMQP_CONFIRM_SELECT_METHOD: return "AMQP_CONFIRM_SELECT_METHOD"; + case AMQP_CONFIRM_SELECT_OK_METHOD: return "AMQP_CONFIRM_SELECT_OK_METHOD"; + default: return NULL; + } +} + +amqp_boolean_t amqp_method_has_content(amqp_method_number_t methodNumber) { + switch (methodNumber) { + case AMQP_BASIC_PUBLISH_METHOD: return 1; + case AMQP_BASIC_RETURN_METHOD: return 1; + case AMQP_BASIC_DELIVER_METHOD: return 1; + case AMQP_BASIC_GET_OK_METHOD: return 1; + default: return 0; + } +} + +int amqp_decode_method(amqp_method_number_t methodNumber, + amqp_pool_t *pool, + amqp_bytes_t encoded, + void **decoded) +{ + size_t offset = 0; + uint8_t bit_buffer; + + switch (methodNumber) { + case AMQP_CONNECTION_START_METHOD: { + amqp_connection_start_t *m = (amqp_connection_start_t *) amqp_pool_alloc(pool, sizeof(amqp_connection_start_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_8(encoded, &offset, &m->version_major)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_decode_8(encoded, &offset, &m->version_minor)) return -ERROR_BAD_AMQP_DATA; + { + int res = amqp_decode_table(encoded, pool, &(m->server_properties), &offset); + if (res < 0) return res; + } + { + uint32_t len; + if (!amqp_decode_32(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->mechanisms, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint32_t len; + if (!amqp_decode_32(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->locales, len)) + return -ERROR_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_CONNECTION_START_OK_METHOD: { + amqp_connection_start_ok_t *m = (amqp_connection_start_ok_t *) amqp_pool_alloc(pool, sizeof(amqp_connection_start_ok_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + { + int res = amqp_decode_table(encoded, pool, &(m->client_properties), &offset); + if (res < 0) return res; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->mechanism, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint32_t len; + if (!amqp_decode_32(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->response, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->locale, len)) + return -ERROR_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_CONNECTION_SECURE_METHOD: { + amqp_connection_secure_t *m = (amqp_connection_secure_t *) amqp_pool_alloc(pool, sizeof(amqp_connection_secure_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + { + uint32_t len; + if (!amqp_decode_32(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->challenge, len)) + return -ERROR_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_CONNECTION_SECURE_OK_METHOD: { + amqp_connection_secure_ok_t *m = (amqp_connection_secure_ok_t *) amqp_pool_alloc(pool, sizeof(amqp_connection_secure_ok_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + { + uint32_t len; + if (!amqp_decode_32(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->response, len)) + return -ERROR_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_CONNECTION_TUNE_METHOD: { + amqp_connection_tune_t *m = (amqp_connection_tune_t *) amqp_pool_alloc(pool, sizeof(amqp_connection_tune_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->channel_max)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_decode_32(encoded, &offset, &m->frame_max)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_decode_16(encoded, &offset, &m->heartbeat)) return -ERROR_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_CONNECTION_TUNE_OK_METHOD: { + amqp_connection_tune_ok_t *m = (amqp_connection_tune_ok_t *) amqp_pool_alloc(pool, sizeof(amqp_connection_tune_ok_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->channel_max)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_decode_32(encoded, &offset, &m->frame_max)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_decode_16(encoded, &offset, &m->heartbeat)) return -ERROR_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_CONNECTION_OPEN_METHOD: { + amqp_connection_open_t *m = (amqp_connection_open_t *) amqp_pool_alloc(pool, sizeof(amqp_connection_open_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->virtual_host, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->capabilities, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->insist = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_CONNECTION_OPEN_OK_METHOD: { + amqp_connection_open_ok_t *m = (amqp_connection_open_ok_t *) amqp_pool_alloc(pool, sizeof(amqp_connection_open_ok_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->known_hosts, len)) + return -ERROR_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_CONNECTION_CLOSE_METHOD: { + amqp_connection_close_t *m = (amqp_connection_close_t *) amqp_pool_alloc(pool, sizeof(amqp_connection_close_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->reply_code)) return -ERROR_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->reply_text, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_16(encoded, &offset, &m->class_id)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_decode_16(encoded, &offset, &m->method_id)) return -ERROR_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_CONNECTION_CLOSE_OK_METHOD: { + amqp_connection_close_ok_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + case AMQP_CHANNEL_OPEN_METHOD: { + amqp_channel_open_t *m = (amqp_channel_open_t *) amqp_pool_alloc(pool, sizeof(amqp_channel_open_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->out_of_band, len)) + return -ERROR_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_CHANNEL_OPEN_OK_METHOD: { + amqp_channel_open_ok_t *m = (amqp_channel_open_ok_t *) amqp_pool_alloc(pool, sizeof(amqp_channel_open_ok_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + { + uint32_t len; + if (!amqp_decode_32(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->channel_id, len)) + return -ERROR_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_CHANNEL_FLOW_METHOD: { + amqp_channel_flow_t *m = (amqp_channel_flow_t *) amqp_pool_alloc(pool, sizeof(amqp_channel_flow_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->active = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_CHANNEL_FLOW_OK_METHOD: { + amqp_channel_flow_ok_t *m = (amqp_channel_flow_ok_t *) amqp_pool_alloc(pool, sizeof(amqp_channel_flow_ok_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->active = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_CHANNEL_CLOSE_METHOD: { + amqp_channel_close_t *m = (amqp_channel_close_t *) amqp_pool_alloc(pool, sizeof(amqp_channel_close_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->reply_code)) return -ERROR_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->reply_text, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_16(encoded, &offset, &m->class_id)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_decode_16(encoded, &offset, &m->method_id)) return -ERROR_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_CHANNEL_CLOSE_OK_METHOD: { + amqp_channel_close_ok_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + case AMQP_ACCESS_REQUEST_METHOD: { + amqp_access_request_t *m = (amqp_access_request_t *) amqp_pool_alloc(pool, sizeof(amqp_access_request_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->realm, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->exclusive = (bit_buffer & (1 << 0)) ? 1 : 0; + m->passive = (bit_buffer & (1 << 1)) ? 1 : 0; + m->active = (bit_buffer & (1 << 2)) ? 1 : 0; + m->write = (bit_buffer & (1 << 3)) ? 1 : 0; + m->read = (bit_buffer & (1 << 4)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_ACCESS_REQUEST_OK_METHOD: { + amqp_access_request_ok_t *m = (amqp_access_request_ok_t *) amqp_pool_alloc(pool, sizeof(amqp_access_request_ok_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) return -ERROR_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_EXCHANGE_DECLARE_METHOD: { + amqp_exchange_declare_t *m = (amqp_exchange_declare_t *) amqp_pool_alloc(pool, sizeof(amqp_exchange_declare_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) return -ERROR_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->exchange, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->type, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->passive = (bit_buffer & (1 << 0)) ? 1 : 0; + m->durable = (bit_buffer & (1 << 1)) ? 1 : 0; + m->auto_delete = (bit_buffer & (1 << 2)) ? 1 : 0; + m->internal = (bit_buffer & (1 << 3)) ? 1 : 0; + m->nowait = (bit_buffer & (1 << 4)) ? 1 : 0; + { + int res = amqp_decode_table(encoded, pool, &(m->arguments), &offset); + if (res < 0) return res; + } + *decoded = m; + return 0; + } + case AMQP_EXCHANGE_DECLARE_OK_METHOD: { + amqp_exchange_declare_ok_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + case AMQP_EXCHANGE_DELETE_METHOD: { + amqp_exchange_delete_t *m = (amqp_exchange_delete_t *) amqp_pool_alloc(pool, sizeof(amqp_exchange_delete_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) return -ERROR_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->exchange, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->if_unused = (bit_buffer & (1 << 0)) ? 1 : 0; + m->nowait = (bit_buffer & (1 << 1)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_EXCHANGE_DELETE_OK_METHOD: { + amqp_exchange_delete_ok_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + case AMQP_EXCHANGE_BIND_METHOD: { + amqp_exchange_bind_t *m = (amqp_exchange_bind_t *) amqp_pool_alloc(pool, sizeof(amqp_exchange_bind_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) return -ERROR_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->destination, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->source, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->routing_key, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->nowait = (bit_buffer & (1 << 0)) ? 1 : 0; + { + int res = amqp_decode_table(encoded, pool, &(m->arguments), &offset); + if (res < 0) return res; + } + *decoded = m; + return 0; + } + case AMQP_EXCHANGE_BIND_OK_METHOD: { + amqp_exchange_bind_ok_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + case AMQP_EXCHANGE_UNBIND_METHOD: { + amqp_exchange_unbind_t *m = (amqp_exchange_unbind_t *) amqp_pool_alloc(pool, sizeof(amqp_exchange_unbind_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) return -ERROR_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->destination, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->source, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->routing_key, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->nowait = (bit_buffer & (1 << 0)) ? 1 : 0; + { + int res = amqp_decode_table(encoded, pool, &(m->arguments), &offset); + if (res < 0) return res; + } + *decoded = m; + return 0; + } + case AMQP_EXCHANGE_UNBIND_OK_METHOD: { + amqp_exchange_unbind_ok_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + case AMQP_QUEUE_DECLARE_METHOD: { + amqp_queue_declare_t *m = (amqp_queue_declare_t *) amqp_pool_alloc(pool, sizeof(amqp_queue_declare_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) return -ERROR_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->queue, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->passive = (bit_buffer & (1 << 0)) ? 1 : 0; + m->durable = (bit_buffer & (1 << 1)) ? 1 : 0; + m->exclusive = (bit_buffer & (1 << 2)) ? 1 : 0; + m->auto_delete = (bit_buffer & (1 << 3)) ? 1 : 0; + m->nowait = (bit_buffer & (1 << 4)) ? 1 : 0; + { + int res = amqp_decode_table(encoded, pool, &(m->arguments), &offset); + if (res < 0) return res; + } + *decoded = m; + return 0; + } + case AMQP_QUEUE_DECLARE_OK_METHOD: { + amqp_queue_declare_ok_t *m = (amqp_queue_declare_ok_t *) amqp_pool_alloc(pool, sizeof(amqp_queue_declare_ok_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->queue, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_32(encoded, &offset, &m->message_count)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_decode_32(encoded, &offset, &m->consumer_count)) return -ERROR_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_QUEUE_BIND_METHOD: { + amqp_queue_bind_t *m = (amqp_queue_bind_t *) amqp_pool_alloc(pool, sizeof(amqp_queue_bind_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) return -ERROR_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->queue, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->exchange, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->routing_key, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->nowait = (bit_buffer & (1 << 0)) ? 1 : 0; + { + int res = amqp_decode_table(encoded, pool, &(m->arguments), &offset); + if (res < 0) return res; + } + *decoded = m; + return 0; + } + case AMQP_QUEUE_BIND_OK_METHOD: { + amqp_queue_bind_ok_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + case AMQP_QUEUE_PURGE_METHOD: { + amqp_queue_purge_t *m = (amqp_queue_purge_t *) amqp_pool_alloc(pool, sizeof(amqp_queue_purge_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) return -ERROR_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->queue, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->nowait = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_QUEUE_PURGE_OK_METHOD: { + amqp_queue_purge_ok_t *m = (amqp_queue_purge_ok_t *) amqp_pool_alloc(pool, sizeof(amqp_queue_purge_ok_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_32(encoded, &offset, &m->message_count)) return -ERROR_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_QUEUE_DELETE_METHOD: { + amqp_queue_delete_t *m = (amqp_queue_delete_t *) amqp_pool_alloc(pool, sizeof(amqp_queue_delete_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) return -ERROR_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->queue, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->if_unused = (bit_buffer & (1 << 0)) ? 1 : 0; + m->if_empty = (bit_buffer & (1 << 1)) ? 1 : 0; + m->nowait = (bit_buffer & (1 << 2)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_QUEUE_DELETE_OK_METHOD: { + amqp_queue_delete_ok_t *m = (amqp_queue_delete_ok_t *) amqp_pool_alloc(pool, sizeof(amqp_queue_delete_ok_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_32(encoded, &offset, &m->message_count)) return -ERROR_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_QUEUE_UNBIND_METHOD: { + amqp_queue_unbind_t *m = (amqp_queue_unbind_t *) amqp_pool_alloc(pool, sizeof(amqp_queue_unbind_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) return -ERROR_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->queue, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->exchange, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->routing_key, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + int res = amqp_decode_table(encoded, pool, &(m->arguments), &offset); + if (res < 0) return res; + } + *decoded = m; + return 0; + } + case AMQP_QUEUE_UNBIND_OK_METHOD: { + amqp_queue_unbind_ok_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + case AMQP_BASIC_QOS_METHOD: { + amqp_basic_qos_t *m = (amqp_basic_qos_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_qos_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_32(encoded, &offset, &m->prefetch_size)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_decode_16(encoded, &offset, &m->prefetch_count)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->global = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_BASIC_QOS_OK_METHOD: { + amqp_basic_qos_ok_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + case AMQP_BASIC_CONSUME_METHOD: { + amqp_basic_consume_t *m = (amqp_basic_consume_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_consume_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) return -ERROR_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->queue, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->consumer_tag, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->no_local = (bit_buffer & (1 << 0)) ? 1 : 0; + m->no_ack = (bit_buffer & (1 << 1)) ? 1 : 0; + m->exclusive = (bit_buffer & (1 << 2)) ? 1 : 0; + m->nowait = (bit_buffer & (1 << 3)) ? 1 : 0; + { + int res = amqp_decode_table(encoded, pool, &(m->arguments), &offset); + if (res < 0) return res; + } + *decoded = m; + return 0; + } + case AMQP_BASIC_CONSUME_OK_METHOD: { + amqp_basic_consume_ok_t *m = (amqp_basic_consume_ok_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_consume_ok_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->consumer_tag, len)) + return -ERROR_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_BASIC_CANCEL_METHOD: { + amqp_basic_cancel_t *m = (amqp_basic_cancel_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_cancel_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->consumer_tag, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->nowait = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_BASIC_CANCEL_OK_METHOD: { + amqp_basic_cancel_ok_t *m = (amqp_basic_cancel_ok_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_cancel_ok_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->consumer_tag, len)) + return -ERROR_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_BASIC_PUBLISH_METHOD: { + amqp_basic_publish_t *m = (amqp_basic_publish_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_publish_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) return -ERROR_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->exchange, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->routing_key, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->mandatory = (bit_buffer & (1 << 0)) ? 1 : 0; + m->immediate = (bit_buffer & (1 << 1)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_BASIC_RETURN_METHOD: { + amqp_basic_return_t *m = (amqp_basic_return_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_return_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->reply_code)) return -ERROR_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->reply_text, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->exchange, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->routing_key, len)) + return -ERROR_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_BASIC_DELIVER_METHOD: { + amqp_basic_deliver_t *m = (amqp_basic_deliver_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_deliver_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->consumer_tag, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_64(encoded, &offset, &m->delivery_tag)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->redelivered = (bit_buffer & (1 << 0)) ? 1 : 0; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->exchange, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->routing_key, len)) + return -ERROR_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_BASIC_GET_METHOD: { + amqp_basic_get_t *m = (amqp_basic_get_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_get_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) return -ERROR_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->queue, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->no_ack = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_BASIC_GET_OK_METHOD: { + amqp_basic_get_ok_t *m = (amqp_basic_get_ok_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_get_ok_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_64(encoded, &offset, &m->delivery_tag)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->redelivered = (bit_buffer & (1 << 0)) ? 1 : 0; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->exchange, len)) + return -ERROR_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->routing_key, len)) + return -ERROR_BAD_AMQP_DATA; + } + if (!amqp_decode_32(encoded, &offset, &m->message_count)) return -ERROR_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_BASIC_GET_EMPTY_METHOD: { + amqp_basic_get_empty_t *m = (amqp_basic_get_empty_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_get_empty_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &m->cluster_id, len)) + return -ERROR_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_BASIC_ACK_METHOD: { + amqp_basic_ack_t *m = (amqp_basic_ack_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_ack_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_64(encoded, &offset, &m->delivery_tag)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->multiple = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_BASIC_REJECT_METHOD: { + amqp_basic_reject_t *m = (amqp_basic_reject_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_reject_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_64(encoded, &offset, &m->delivery_tag)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->requeue = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_BASIC_RECOVER_ASYNC_METHOD: { + amqp_basic_recover_async_t *m = (amqp_basic_recover_async_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_recover_async_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->requeue = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_BASIC_RECOVER_METHOD: { + amqp_basic_recover_t *m = (amqp_basic_recover_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_recover_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->requeue = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_BASIC_RECOVER_OK_METHOD: { + amqp_basic_recover_ok_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + case AMQP_BASIC_NACK_METHOD: { + amqp_basic_nack_t *m = (amqp_basic_nack_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_nack_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_64(encoded, &offset, &m->delivery_tag)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->multiple = (bit_buffer & (1 << 0)) ? 1 : 0; + m->requeue = (bit_buffer & (1 << 1)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_TX_SELECT_METHOD: { + amqp_tx_select_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + case AMQP_TX_SELECT_OK_METHOD: { + amqp_tx_select_ok_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + case AMQP_TX_COMMIT_METHOD: { + amqp_tx_commit_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + case AMQP_TX_COMMIT_OK_METHOD: { + amqp_tx_commit_ok_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + case AMQP_TX_ROLLBACK_METHOD: { + amqp_tx_rollback_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + case AMQP_TX_ROLLBACK_OK_METHOD: { + amqp_tx_rollback_ok_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + case AMQP_CONFIRM_SELECT_METHOD: { + amqp_confirm_select_t *m = (amqp_confirm_select_t *) amqp_pool_alloc(pool, sizeof(amqp_confirm_select_t)); + if (m == NULL) { return -ERROR_NO_MEMORY; } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return -ERROR_BAD_AMQP_DATA; + m->nowait = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_CONFIRM_SELECT_OK_METHOD: { + amqp_confirm_select_ok_t *m = NULL; /* no fields */ + *decoded = m; + return 0; + } + default: return -ERROR_UNKNOWN_METHOD; + } +} + +int amqp_decode_properties(uint16_t class_id, + amqp_pool_t *pool, + amqp_bytes_t encoded, + void **decoded) +{ + size_t offset = 0; + + amqp_flags_t flags = 0; + int flagword_index = 0; + uint16_t partial_flags; + + do { + if (!amqp_decode_16(encoded, &offset, &partial_flags)) + return -ERROR_BAD_AMQP_DATA; + flags |= (partial_flags << (flagword_index * 16)); + flagword_index++; + } while (partial_flags & 1); + + switch (class_id) { + case 10: { + amqp_connection_properties_t *p = (amqp_connection_properties_t *) amqp_pool_alloc(pool, sizeof(amqp_connection_properties_t)); + if (p == NULL) { return -ERROR_NO_MEMORY; } + p->_flags = flags; + *decoded = p; + return 0; + } + case 20: { + amqp_channel_properties_t *p = (amqp_channel_properties_t *) amqp_pool_alloc(pool, sizeof(amqp_channel_properties_t)); + if (p == NULL) { return -ERROR_NO_MEMORY; } + p->_flags = flags; + *decoded = p; + return 0; + } + case 30: { + amqp_access_properties_t *p = (amqp_access_properties_t *) amqp_pool_alloc(pool, sizeof(amqp_access_properties_t)); + if (p == NULL) { return -ERROR_NO_MEMORY; } + p->_flags = flags; + *decoded = p; + return 0; + } + case 40: { + amqp_exchange_properties_t *p = (amqp_exchange_properties_t *) amqp_pool_alloc(pool, sizeof(amqp_exchange_properties_t)); + if (p == NULL) { return -ERROR_NO_MEMORY; } + p->_flags = flags; + *decoded = p; + return 0; + } + case 50: { + amqp_queue_properties_t *p = (amqp_queue_properties_t *) amqp_pool_alloc(pool, sizeof(amqp_queue_properties_t)); + if (p == NULL) { return -ERROR_NO_MEMORY; } + p->_flags = flags; + *decoded = p; + return 0; + } + case 60: { + amqp_basic_properties_t *p = (amqp_basic_properties_t *) amqp_pool_alloc(pool, sizeof(amqp_basic_properties_t)); + if (p == NULL) { return -ERROR_NO_MEMORY; } + p->_flags = flags; + if (flags & AMQP_BASIC_CONTENT_TYPE_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &p->content_type, len)) + return -ERROR_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_CONTENT_ENCODING_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &p->content_encoding, len)) + return -ERROR_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_HEADERS_FLAG) { + { + int res = amqp_decode_table(encoded, pool, &(p->headers), &offset); + if (res < 0) return res; + } + } + if (flags & AMQP_BASIC_DELIVERY_MODE_FLAG) { + if (!amqp_decode_8(encoded, &offset, &p->delivery_mode)) return -ERROR_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_PRIORITY_FLAG) { + if (!amqp_decode_8(encoded, &offset, &p->priority)) return -ERROR_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_CORRELATION_ID_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &p->correlation_id, len)) + return -ERROR_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_REPLY_TO_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &p->reply_to, len)) + return -ERROR_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_EXPIRATION_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &p->expiration, len)) + return -ERROR_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_MESSAGE_ID_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &p->message_id, len)) + return -ERROR_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_TIMESTAMP_FLAG) { + if (!amqp_decode_64(encoded, &offset, &p->timestamp)) return -ERROR_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_TYPE_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &p->type, len)) + return -ERROR_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_USER_ID_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &p->user_id, len)) + return -ERROR_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_APP_ID_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &p->app_id, len)) + return -ERROR_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_CLUSTER_ID_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) + || !amqp_decode_bytes(encoded, &offset, &p->cluster_id, len)) + return -ERROR_BAD_AMQP_DATA; + } + } + *decoded = p; + return 0; + } + case 90: { + amqp_tx_properties_t *p = (amqp_tx_properties_t *) amqp_pool_alloc(pool, sizeof(amqp_tx_properties_t)); + if (p == NULL) { return -ERROR_NO_MEMORY; } + p->_flags = flags; + *decoded = p; + return 0; + } + case 85: { + amqp_confirm_properties_t *p = (amqp_confirm_properties_t *) amqp_pool_alloc(pool, sizeof(amqp_confirm_properties_t)); + if (p == NULL) { return -ERROR_NO_MEMORY; } + p->_flags = flags; + *decoded = p; + return 0; + } + default: return -ERROR_UNKNOWN_CLASS; + } +} + +int amqp_encode_method(amqp_method_number_t methodNumber, + void *decoded, + amqp_bytes_t encoded) +{ + size_t offset = 0; + uint8_t bit_buffer; + + switch (methodNumber) { + case AMQP_CONNECTION_START_METHOD: { + amqp_connection_start_t *m = (amqp_connection_start_t *) decoded; + if (!amqp_encode_8(encoded, &offset, m->version_major)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->version_minor)) return -ERROR_BAD_AMQP_DATA; + { + int res = amqp_encode_table(encoded, &(m->server_properties), &offset); + if (res < 0) return res; + } + if (!amqp_encode_32(encoded, &offset, m->mechanisms.len) + || !amqp_encode_bytes(encoded, &offset, m->mechanisms)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_32(encoded, &offset, m->locales.len) + || !amqp_encode_bytes(encoded, &offset, m->locales)) + return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_CONNECTION_START_OK_METHOD: { + amqp_connection_start_ok_t *m = (amqp_connection_start_ok_t *) decoded; + { + int res = amqp_encode_table(encoded, &(m->client_properties), &offset); + if (res < 0) return res; + } + if (!amqp_encode_8(encoded, &offset, m->mechanism.len) + || !amqp_encode_bytes(encoded, &offset, m->mechanism)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_32(encoded, &offset, m->response.len) + || !amqp_encode_bytes(encoded, &offset, m->response)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->locale.len) + || !amqp_encode_bytes(encoded, &offset, m->locale)) + return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_CONNECTION_SECURE_METHOD: { + amqp_connection_secure_t *m = (amqp_connection_secure_t *) decoded; + if (!amqp_encode_32(encoded, &offset, m->challenge.len) + || !amqp_encode_bytes(encoded, &offset, m->challenge)) + return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_CONNECTION_SECURE_OK_METHOD: { + amqp_connection_secure_ok_t *m = (amqp_connection_secure_ok_t *) decoded; + if (!amqp_encode_32(encoded, &offset, m->response.len) + || !amqp_encode_bytes(encoded, &offset, m->response)) + return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_CONNECTION_TUNE_METHOD: { + amqp_connection_tune_t *m = (amqp_connection_tune_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->channel_max)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_32(encoded, &offset, m->frame_max)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_16(encoded, &offset, m->heartbeat)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_CONNECTION_TUNE_OK_METHOD: { + amqp_connection_tune_ok_t *m = (amqp_connection_tune_ok_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->channel_max)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_32(encoded, &offset, m->frame_max)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_16(encoded, &offset, m->heartbeat)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_CONNECTION_OPEN_METHOD: { + amqp_connection_open_t *m = (amqp_connection_open_t *) decoded; + if (!amqp_encode_8(encoded, &offset, m->virtual_host.len) + || !amqp_encode_bytes(encoded, &offset, m->virtual_host)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->capabilities.len) + || !amqp_encode_bytes(encoded, &offset, m->capabilities)) + return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->insist) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_CONNECTION_OPEN_OK_METHOD: { + amqp_connection_open_ok_t *m = (amqp_connection_open_ok_t *) decoded; + if (!amqp_encode_8(encoded, &offset, m->known_hosts.len) + || !amqp_encode_bytes(encoded, &offset, m->known_hosts)) + return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_CONNECTION_CLOSE_METHOD: { + amqp_connection_close_t *m = (amqp_connection_close_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->reply_code)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->reply_text.len) + || !amqp_encode_bytes(encoded, &offset, m->reply_text)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_16(encoded, &offset, m->class_id)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_16(encoded, &offset, m->method_id)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_CONNECTION_CLOSE_OK_METHOD: { + return offset; + } + case AMQP_CHANNEL_OPEN_METHOD: { + amqp_channel_open_t *m = (amqp_channel_open_t *) decoded; + if (!amqp_encode_8(encoded, &offset, m->out_of_band.len) + || !amqp_encode_bytes(encoded, &offset, m->out_of_band)) + return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_CHANNEL_OPEN_OK_METHOD: { + amqp_channel_open_ok_t *m = (amqp_channel_open_ok_t *) decoded; + if (!amqp_encode_32(encoded, &offset, m->channel_id.len) + || !amqp_encode_bytes(encoded, &offset, m->channel_id)) + return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_CHANNEL_FLOW_METHOD: { + amqp_channel_flow_t *m = (amqp_channel_flow_t *) decoded; + bit_buffer = 0; + if (m->active) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_CHANNEL_FLOW_OK_METHOD: { + amqp_channel_flow_ok_t *m = (amqp_channel_flow_ok_t *) decoded; + bit_buffer = 0; + if (m->active) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_CHANNEL_CLOSE_METHOD: { + amqp_channel_close_t *m = (amqp_channel_close_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->reply_code)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->reply_text.len) + || !amqp_encode_bytes(encoded, &offset, m->reply_text)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_16(encoded, &offset, m->class_id)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_16(encoded, &offset, m->method_id)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_CHANNEL_CLOSE_OK_METHOD: { + return offset; + } + case AMQP_ACCESS_REQUEST_METHOD: { + amqp_access_request_t *m = (amqp_access_request_t *) decoded; + if (!amqp_encode_8(encoded, &offset, m->realm.len) + || !amqp_encode_bytes(encoded, &offset, m->realm)) + return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->exclusive) bit_buffer |= (1 << 0); + if (m->passive) bit_buffer |= (1 << 1); + if (m->active) bit_buffer |= (1 << 2); + if (m->write) bit_buffer |= (1 << 3); + if (m->read) bit_buffer |= (1 << 4); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_ACCESS_REQUEST_OK_METHOD: { + amqp_access_request_ok_t *m = (amqp_access_request_ok_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_EXCHANGE_DECLARE_METHOD: { + amqp_exchange_declare_t *m = (amqp_exchange_declare_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->exchange.len) + || !amqp_encode_bytes(encoded, &offset, m->exchange)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->type.len) + || !amqp_encode_bytes(encoded, &offset, m->type)) + return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->passive) bit_buffer |= (1 << 0); + if (m->durable) bit_buffer |= (1 << 1); + if (m->auto_delete) bit_buffer |= (1 << 2); + if (m->internal) bit_buffer |= (1 << 3); + if (m->nowait) bit_buffer |= (1 << 4); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + { + int res = amqp_encode_table(encoded, &(m->arguments), &offset); + if (res < 0) return res; + } + return offset; + } + case AMQP_EXCHANGE_DECLARE_OK_METHOD: { + return offset; + } + case AMQP_EXCHANGE_DELETE_METHOD: { + amqp_exchange_delete_t *m = (amqp_exchange_delete_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->exchange.len) + || !amqp_encode_bytes(encoded, &offset, m->exchange)) + return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->if_unused) bit_buffer |= (1 << 0); + if (m->nowait) bit_buffer |= (1 << 1); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_EXCHANGE_DELETE_OK_METHOD: { + return offset; + } + case AMQP_EXCHANGE_BIND_METHOD: { + amqp_exchange_bind_t *m = (amqp_exchange_bind_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->destination.len) + || !amqp_encode_bytes(encoded, &offset, m->destination)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->source.len) + || !amqp_encode_bytes(encoded, &offset, m->source)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->routing_key.len) + || !amqp_encode_bytes(encoded, &offset, m->routing_key)) + return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->nowait) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + { + int res = amqp_encode_table(encoded, &(m->arguments), &offset); + if (res < 0) return res; + } + return offset; + } + case AMQP_EXCHANGE_BIND_OK_METHOD: { + return offset; + } + case AMQP_EXCHANGE_UNBIND_METHOD: { + amqp_exchange_unbind_t *m = (amqp_exchange_unbind_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->destination.len) + || !amqp_encode_bytes(encoded, &offset, m->destination)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->source.len) + || !amqp_encode_bytes(encoded, &offset, m->source)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->routing_key.len) + || !amqp_encode_bytes(encoded, &offset, m->routing_key)) + return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->nowait) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + { + int res = amqp_encode_table(encoded, &(m->arguments), &offset); + if (res < 0) return res; + } + return offset; + } + case AMQP_EXCHANGE_UNBIND_OK_METHOD: { + return offset; + } + case AMQP_QUEUE_DECLARE_METHOD: { + amqp_queue_declare_t *m = (amqp_queue_declare_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->queue.len) + || !amqp_encode_bytes(encoded, &offset, m->queue)) + return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->passive) bit_buffer |= (1 << 0); + if (m->durable) bit_buffer |= (1 << 1); + if (m->exclusive) bit_buffer |= (1 << 2); + if (m->auto_delete) bit_buffer |= (1 << 3); + if (m->nowait) bit_buffer |= (1 << 4); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + { + int res = amqp_encode_table(encoded, &(m->arguments), &offset); + if (res < 0) return res; + } + return offset; + } + case AMQP_QUEUE_DECLARE_OK_METHOD: { + amqp_queue_declare_ok_t *m = (amqp_queue_declare_ok_t *) decoded; + if (!amqp_encode_8(encoded, &offset, m->queue.len) + || !amqp_encode_bytes(encoded, &offset, m->queue)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_32(encoded, &offset, m->message_count)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_32(encoded, &offset, m->consumer_count)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_QUEUE_BIND_METHOD: { + amqp_queue_bind_t *m = (amqp_queue_bind_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->queue.len) + || !amqp_encode_bytes(encoded, &offset, m->queue)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->exchange.len) + || !amqp_encode_bytes(encoded, &offset, m->exchange)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->routing_key.len) + || !amqp_encode_bytes(encoded, &offset, m->routing_key)) + return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->nowait) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + { + int res = amqp_encode_table(encoded, &(m->arguments), &offset); + if (res < 0) return res; + } + return offset; + } + case AMQP_QUEUE_BIND_OK_METHOD: { + return offset; + } + case AMQP_QUEUE_PURGE_METHOD: { + amqp_queue_purge_t *m = (amqp_queue_purge_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->queue.len) + || !amqp_encode_bytes(encoded, &offset, m->queue)) + return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->nowait) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_QUEUE_PURGE_OK_METHOD: { + amqp_queue_purge_ok_t *m = (amqp_queue_purge_ok_t *) decoded; + if (!amqp_encode_32(encoded, &offset, m->message_count)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_QUEUE_DELETE_METHOD: { + amqp_queue_delete_t *m = (amqp_queue_delete_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->queue.len) + || !amqp_encode_bytes(encoded, &offset, m->queue)) + return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->if_unused) bit_buffer |= (1 << 0); + if (m->if_empty) bit_buffer |= (1 << 1); + if (m->nowait) bit_buffer |= (1 << 2); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_QUEUE_DELETE_OK_METHOD: { + amqp_queue_delete_ok_t *m = (amqp_queue_delete_ok_t *) decoded; + if (!amqp_encode_32(encoded, &offset, m->message_count)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_QUEUE_UNBIND_METHOD: { + amqp_queue_unbind_t *m = (amqp_queue_unbind_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->queue.len) + || !amqp_encode_bytes(encoded, &offset, m->queue)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->exchange.len) + || !amqp_encode_bytes(encoded, &offset, m->exchange)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->routing_key.len) + || !amqp_encode_bytes(encoded, &offset, m->routing_key)) + return -ERROR_BAD_AMQP_DATA; + { + int res = amqp_encode_table(encoded, &(m->arguments), &offset); + if (res < 0) return res; + } + return offset; + } + case AMQP_QUEUE_UNBIND_OK_METHOD: { + return offset; + } + case AMQP_BASIC_QOS_METHOD: { + amqp_basic_qos_t *m = (amqp_basic_qos_t *) decoded; + if (!amqp_encode_32(encoded, &offset, m->prefetch_size)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_16(encoded, &offset, m->prefetch_count)) return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->global) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_BASIC_QOS_OK_METHOD: { + return offset; + } + case AMQP_BASIC_CONSUME_METHOD: { + amqp_basic_consume_t *m = (amqp_basic_consume_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->queue.len) + || !amqp_encode_bytes(encoded, &offset, m->queue)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->consumer_tag.len) + || !amqp_encode_bytes(encoded, &offset, m->consumer_tag)) + return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->no_local) bit_buffer |= (1 << 0); + if (m->no_ack) bit_buffer |= (1 << 1); + if (m->exclusive) bit_buffer |= (1 << 2); + if (m->nowait) bit_buffer |= (1 << 3); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + { + int res = amqp_encode_table(encoded, &(m->arguments), &offset); + if (res < 0) return res; + } + return offset; + } + case AMQP_BASIC_CONSUME_OK_METHOD: { + amqp_basic_consume_ok_t *m = (amqp_basic_consume_ok_t *) decoded; + if (!amqp_encode_8(encoded, &offset, m->consumer_tag.len) + || !amqp_encode_bytes(encoded, &offset, m->consumer_tag)) + return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_BASIC_CANCEL_METHOD: { + amqp_basic_cancel_t *m = (amqp_basic_cancel_t *) decoded; + if (!amqp_encode_8(encoded, &offset, m->consumer_tag.len) + || !amqp_encode_bytes(encoded, &offset, m->consumer_tag)) + return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->nowait) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_BASIC_CANCEL_OK_METHOD: { + amqp_basic_cancel_ok_t *m = (amqp_basic_cancel_ok_t *) decoded; + if (!amqp_encode_8(encoded, &offset, m->consumer_tag.len) + || !amqp_encode_bytes(encoded, &offset, m->consumer_tag)) + return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_BASIC_PUBLISH_METHOD: { + amqp_basic_publish_t *m = (amqp_basic_publish_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->exchange.len) + || !amqp_encode_bytes(encoded, &offset, m->exchange)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->routing_key.len) + || !amqp_encode_bytes(encoded, &offset, m->routing_key)) + return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->mandatory) bit_buffer |= (1 << 0); + if (m->immediate) bit_buffer |= (1 << 1); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_BASIC_RETURN_METHOD: { + amqp_basic_return_t *m = (amqp_basic_return_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->reply_code)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->reply_text.len) + || !amqp_encode_bytes(encoded, &offset, m->reply_text)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->exchange.len) + || !amqp_encode_bytes(encoded, &offset, m->exchange)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->routing_key.len) + || !amqp_encode_bytes(encoded, &offset, m->routing_key)) + return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_BASIC_DELIVER_METHOD: { + amqp_basic_deliver_t *m = (amqp_basic_deliver_t *) decoded; + if (!amqp_encode_8(encoded, &offset, m->consumer_tag.len) + || !amqp_encode_bytes(encoded, &offset, m->consumer_tag)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_64(encoded, &offset, m->delivery_tag)) return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->redelivered) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->exchange.len) + || !amqp_encode_bytes(encoded, &offset, m->exchange)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->routing_key.len) + || !amqp_encode_bytes(encoded, &offset, m->routing_key)) + return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_BASIC_GET_METHOD: { + amqp_basic_get_t *m = (amqp_basic_get_t *) decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->queue.len) + || !amqp_encode_bytes(encoded, &offset, m->queue)) + return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->no_ack) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_BASIC_GET_OK_METHOD: { + amqp_basic_get_ok_t *m = (amqp_basic_get_ok_t *) decoded; + if (!amqp_encode_64(encoded, &offset, m->delivery_tag)) return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->redelivered) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->exchange.len) + || !amqp_encode_bytes(encoded, &offset, m->exchange)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->routing_key.len) + || !amqp_encode_bytes(encoded, &offset, m->routing_key)) + return -ERROR_BAD_AMQP_DATA; + if (!amqp_encode_32(encoded, &offset, m->message_count)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_BASIC_GET_EMPTY_METHOD: { + amqp_basic_get_empty_t *m = (amqp_basic_get_empty_t *) decoded; + if (!amqp_encode_8(encoded, &offset, m->cluster_id.len) + || !amqp_encode_bytes(encoded, &offset, m->cluster_id)) + return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_BASIC_ACK_METHOD: { + amqp_basic_ack_t *m = (amqp_basic_ack_t *) decoded; + if (!amqp_encode_64(encoded, &offset, m->delivery_tag)) return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->multiple) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_BASIC_REJECT_METHOD: { + amqp_basic_reject_t *m = (amqp_basic_reject_t *) decoded; + if (!amqp_encode_64(encoded, &offset, m->delivery_tag)) return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->requeue) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_BASIC_RECOVER_ASYNC_METHOD: { + amqp_basic_recover_async_t *m = (amqp_basic_recover_async_t *) decoded; + bit_buffer = 0; + if (m->requeue) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_BASIC_RECOVER_METHOD: { + amqp_basic_recover_t *m = (amqp_basic_recover_t *) decoded; + bit_buffer = 0; + if (m->requeue) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_BASIC_RECOVER_OK_METHOD: { + return offset; + } + case AMQP_BASIC_NACK_METHOD: { + amqp_basic_nack_t *m = (amqp_basic_nack_t *) decoded; + if (!amqp_encode_64(encoded, &offset, m->delivery_tag)) return -ERROR_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->multiple) bit_buffer |= (1 << 0); + if (m->requeue) bit_buffer |= (1 << 1); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_TX_SELECT_METHOD: { + return offset; + } + case AMQP_TX_SELECT_OK_METHOD: { + return offset; + } + case AMQP_TX_COMMIT_METHOD: { + return offset; + } + case AMQP_TX_COMMIT_OK_METHOD: { + return offset; + } + case AMQP_TX_ROLLBACK_METHOD: { + return offset; + } + case AMQP_TX_ROLLBACK_OK_METHOD: { + return offset; + } + case AMQP_CONFIRM_SELECT_METHOD: { + amqp_confirm_select_t *m = (amqp_confirm_select_t *) decoded; + bit_buffer = 0; + if (m->nowait) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) return -ERROR_BAD_AMQP_DATA; + return offset; + } + case AMQP_CONFIRM_SELECT_OK_METHOD: { + return offset; + } + default: return -ERROR_UNKNOWN_METHOD; + } +} + +int amqp_encode_properties(uint16_t class_id, + void *decoded, + amqp_bytes_t encoded) +{ + size_t offset = 0; + + /* Cheat, and get the flags out generically, relying on the + similarity of structure between classes */ + amqp_flags_t flags = * (amqp_flags_t *) decoded; /* cheating! */ + + { + /* We take a copy of flags to avoid destroying it, as it is used + in the autogenerated code below. */ + amqp_flags_t remaining_flags = flags; + do { + amqp_flags_t remainder = remaining_flags >> 16; + uint16_t partial_flags = remaining_flags & 0xFFFE; + if (remainder != 0) { partial_flags |= 1; } + if (!amqp_encode_16(encoded, &offset, partial_flags)) + return -ERROR_BAD_AMQP_DATA; + remaining_flags = remainder; + } while (remaining_flags != 0); + } + + switch (class_id) { + case 10: { + return offset; + } + case 20: { + return offset; + } + case 30: { + return offset; + } + case 40: { + return offset; + } + case 50: { + return offset; + } + case 60: { + amqp_basic_properties_t *p = (amqp_basic_properties_t *) decoded; + if (flags & AMQP_BASIC_CONTENT_TYPE_FLAG) { + if (!amqp_encode_8(encoded, &offset, p->content_type.len) + || !amqp_encode_bytes(encoded, &offset, p->content_type)) + return -ERROR_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_CONTENT_ENCODING_FLAG) { + if (!amqp_encode_8(encoded, &offset, p->content_encoding.len) + || !amqp_encode_bytes(encoded, &offset, p->content_encoding)) + return -ERROR_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_HEADERS_FLAG) { + { + int res = amqp_encode_table(encoded, &(p->headers), &offset); + if (res < 0) return res; + } + } + if (flags & AMQP_BASIC_DELIVERY_MODE_FLAG) { + if (!amqp_encode_8(encoded, &offset, p->delivery_mode)) return -ERROR_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_PRIORITY_FLAG) { + if (!amqp_encode_8(encoded, &offset, p->priority)) return -ERROR_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_CORRELATION_ID_FLAG) { + if (!amqp_encode_8(encoded, &offset, p->correlation_id.len) + || !amqp_encode_bytes(encoded, &offset, p->correlation_id)) + return -ERROR_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_REPLY_TO_FLAG) { + if (!amqp_encode_8(encoded, &offset, p->reply_to.len) + || !amqp_encode_bytes(encoded, &offset, p->reply_to)) + return -ERROR_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_EXPIRATION_FLAG) { + if (!amqp_encode_8(encoded, &offset, p->expiration.len) + || !amqp_encode_bytes(encoded, &offset, p->expiration)) + return -ERROR_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_MESSAGE_ID_FLAG) { + if (!amqp_encode_8(encoded, &offset, p->message_id.len) + || !amqp_encode_bytes(encoded, &offset, p->message_id)) + return -ERROR_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_TIMESTAMP_FLAG) { + if (!amqp_encode_64(encoded, &offset, p->timestamp)) return -ERROR_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_TYPE_FLAG) { + if (!amqp_encode_8(encoded, &offset, p->type.len) + || !amqp_encode_bytes(encoded, &offset, p->type)) + return -ERROR_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_USER_ID_FLAG) { + if (!amqp_encode_8(encoded, &offset, p->user_id.len) + || !amqp_encode_bytes(encoded, &offset, p->user_id)) + return -ERROR_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_APP_ID_FLAG) { + if (!amqp_encode_8(encoded, &offset, p->app_id.len) + || !amqp_encode_bytes(encoded, &offset, p->app_id)) + return -ERROR_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_CLUSTER_ID_FLAG) { + if (!amqp_encode_8(encoded, &offset, p->cluster_id.len) + || !amqp_encode_bytes(encoded, &offset, p->cluster_id)) + return -ERROR_BAD_AMQP_DATA; + } + return offset; + } + case 90: { + return offset; + } + case 85: { + return offset; + } + default: return -ERROR_UNKNOWN_CLASS; + } +} + +AMQP_PUBLIC_FUNCTION amqp_channel_open_ok_t * AMQP_CALL amqp_channel_open(amqp_connection_state_t state, amqp_channel_t channel) +{ + amqp_channel_open_t req; + req.out_of_band = amqp_empty_bytes; + + return amqp_simple_rpc_decoded(state, channel, AMQP_CHANNEL_OPEN_METHOD, AMQP_CHANNEL_OPEN_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_channel_flow_ok_t * AMQP_CALL amqp_channel_flow(amqp_connection_state_t state, amqp_channel_t channel, amqp_boolean_t active) +{ + amqp_channel_flow_t req; + req.active = active; + + return amqp_simple_rpc_decoded(state, channel, AMQP_CHANNEL_FLOW_METHOD, AMQP_CHANNEL_FLOW_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_exchange_declare_ok_t * AMQP_CALL amqp_exchange_declare(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t exchange, amqp_bytes_t type, amqp_boolean_t passive, amqp_boolean_t durable, amqp_table_t arguments) +{ + amqp_exchange_declare_t req; + req.ticket = 0; + req.exchange = exchange; + req.type = type; + req.passive = passive; + req.durable = durable; + req.auto_delete = 0; + req.internal = 0; + req.nowait = 0; + req.arguments = arguments; + + return amqp_simple_rpc_decoded(state, channel, AMQP_EXCHANGE_DECLARE_METHOD, AMQP_EXCHANGE_DECLARE_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_exchange_delete_ok_t * AMQP_CALL amqp_exchange_delete(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t exchange, amqp_boolean_t if_unused) +{ + amqp_exchange_delete_t req; + req.ticket = 0; + req.exchange = exchange; + req.if_unused = if_unused; + req.nowait = 0; + + return amqp_simple_rpc_decoded(state, channel, AMQP_EXCHANGE_DELETE_METHOD, AMQP_EXCHANGE_DELETE_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_exchange_bind_ok_t * AMQP_CALL amqp_exchange_bind(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t destination, amqp_bytes_t source, amqp_bytes_t routing_key, amqp_table_t arguments) +{ + amqp_exchange_bind_t req; + req.ticket = 0; + req.destination = destination; + req.source = source; + req.routing_key = routing_key; + req.nowait = 0; + req.arguments = arguments; + + return amqp_simple_rpc_decoded(state, channel, AMQP_EXCHANGE_BIND_METHOD, AMQP_EXCHANGE_BIND_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_exchange_unbind_ok_t * AMQP_CALL amqp_exchange_unbind(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t destination, amqp_bytes_t source, amqp_bytes_t routing_key, amqp_table_t arguments) +{ + amqp_exchange_unbind_t req; + req.ticket = 0; + req.destination = destination; + req.source = source; + req.routing_key = routing_key; + req.nowait = 0; + req.arguments = arguments; + + return amqp_simple_rpc_decoded(state, channel, AMQP_EXCHANGE_UNBIND_METHOD, AMQP_EXCHANGE_UNBIND_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_queue_declare_ok_t * AMQP_CALL amqp_queue_declare(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_boolean_t passive, amqp_boolean_t durable, amqp_boolean_t exclusive, amqp_boolean_t auto_delete, amqp_table_t arguments) +{ + amqp_queue_declare_t req; + req.ticket = 0; + req.queue = queue; + req.passive = passive; + req.durable = durable; + req.exclusive = exclusive; + req.auto_delete = auto_delete; + req.nowait = 0; + req.arguments = arguments; + + return amqp_simple_rpc_decoded(state, channel, AMQP_QUEUE_DECLARE_METHOD, AMQP_QUEUE_DECLARE_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_queue_bind_ok_t * AMQP_CALL amqp_queue_bind(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_bytes_t exchange, amqp_bytes_t routing_key, amqp_table_t arguments) +{ + amqp_queue_bind_t req; + req.ticket = 0; + req.queue = queue; + req.exchange = exchange; + req.routing_key = routing_key; + req.nowait = 0; + req.arguments = arguments; + + return amqp_simple_rpc_decoded(state, channel, AMQP_QUEUE_BIND_METHOD, AMQP_QUEUE_BIND_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_queue_purge_ok_t * AMQP_CALL amqp_queue_purge(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue) +{ + amqp_queue_purge_t req; + req.ticket = 0; + req.queue = queue; + req.nowait = 0; + + return amqp_simple_rpc_decoded(state, channel, AMQP_QUEUE_PURGE_METHOD, AMQP_QUEUE_PURGE_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_queue_delete_ok_t * AMQP_CALL amqp_queue_delete(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_boolean_t if_unused, amqp_boolean_t if_empty) +{ + amqp_queue_delete_t req; + req.ticket = 0; + req.queue = queue; + req.if_unused = if_unused; + req.if_empty = if_empty; + req.nowait = 0; + + return amqp_simple_rpc_decoded(state, channel, AMQP_QUEUE_DELETE_METHOD, AMQP_QUEUE_DELETE_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_queue_unbind_ok_t * AMQP_CALL amqp_queue_unbind(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_bytes_t exchange, amqp_bytes_t routing_key, amqp_table_t arguments) +{ + amqp_queue_unbind_t req; + req.ticket = 0; + req.queue = queue; + req.exchange = exchange; + req.routing_key = routing_key; + req.arguments = arguments; + + return amqp_simple_rpc_decoded(state, channel, AMQP_QUEUE_UNBIND_METHOD, AMQP_QUEUE_UNBIND_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_basic_qos_ok_t * AMQP_CALL amqp_basic_qos(amqp_connection_state_t state, amqp_channel_t channel, uint32_t prefetch_size, uint16_t prefetch_count, amqp_boolean_t global) +{ + amqp_basic_qos_t req; + req.prefetch_size = prefetch_size; + req.prefetch_count = prefetch_count; + req.global = global; + + return amqp_simple_rpc_decoded(state, channel, AMQP_BASIC_QOS_METHOD, AMQP_BASIC_QOS_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_basic_consume_ok_t * AMQP_CALL amqp_basic_consume(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_bytes_t consumer_tag, amqp_boolean_t no_local, amqp_boolean_t no_ack, amqp_boolean_t exclusive, amqp_table_t arguments) +{ + amqp_basic_consume_t req; + req.ticket = 0; + req.queue = queue; + req.consumer_tag = consumer_tag; + req.no_local = no_local; + req.no_ack = no_ack; + req.exclusive = exclusive; + req.nowait = 0; + req.arguments = arguments; + + return amqp_simple_rpc_decoded(state, channel, AMQP_BASIC_CONSUME_METHOD, AMQP_BASIC_CONSUME_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_basic_cancel_ok_t * AMQP_CALL amqp_basic_cancel(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t consumer_tag) +{ + amqp_basic_cancel_t req; + req.consumer_tag = consumer_tag; + req.nowait = 0; + + return amqp_simple_rpc_decoded(state, channel, AMQP_BASIC_CANCEL_METHOD, AMQP_BASIC_CANCEL_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_basic_recover_ok_t * AMQP_CALL amqp_basic_recover(amqp_connection_state_t state, amqp_channel_t channel, amqp_boolean_t requeue) +{ + amqp_basic_recover_t req; + req.requeue = requeue; + + return amqp_simple_rpc_decoded(state, channel, AMQP_BASIC_RECOVER_METHOD, AMQP_BASIC_RECOVER_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_tx_select_ok_t * AMQP_CALL amqp_tx_select(amqp_connection_state_t state, amqp_channel_t channel) +{ + amqp_tx_select_t req; + + return amqp_simple_rpc_decoded(state, channel, AMQP_TX_SELECT_METHOD, AMQP_TX_SELECT_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_tx_commit_ok_t * AMQP_CALL amqp_tx_commit(amqp_connection_state_t state, amqp_channel_t channel) +{ + amqp_tx_commit_t req; + + return amqp_simple_rpc_decoded(state, channel, AMQP_TX_COMMIT_METHOD, AMQP_TX_COMMIT_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_tx_rollback_ok_t * AMQP_CALL amqp_tx_rollback(amqp_connection_state_t state, amqp_channel_t channel) +{ + amqp_tx_rollback_t req; + + return amqp_simple_rpc_decoded(state, channel, AMQP_TX_ROLLBACK_METHOD, AMQP_TX_ROLLBACK_OK_METHOD, &req); +} + + +AMQP_PUBLIC_FUNCTION amqp_confirm_select_ok_t * AMQP_CALL amqp_confirm_select(amqp_connection_state_t state, amqp_channel_t channel) +{ + amqp_confirm_select_t req; + req.nowait = 0; + + return amqp_simple_rpc_decoded(state, channel, AMQP_CONFIRM_SELECT_METHOD, AMQP_CONFIRM_SELECT_OK_METHOD, &req); +} + diff --git a/librabbitmq/amqp_framing.h b/librabbitmq/amqp_framing.h new file mode 100644 index 0000000..baf7771 --- /dev/null +++ b/librabbitmq/amqp_framing.h @@ -0,0 +1,627 @@ +/* Generated code. Do not edit. Edit and re-run codegen.py instead. + * + * ***** BEGIN LICENSE BLOCK ***** + * Version: MIT + * + * Portions created by VMware are Copyright (c) 2007-2012 VMware, Inc. + * All Rights Reserved. + * + * Portions created by Tony Garnock-Jones are Copyright (c) 2009-2010 + * VMware, Inc. and Tony Garnock-Jones. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * ***** END LICENSE BLOCK ***** + */ + +#ifndef AMQP_FRAMING_H +#define AMQP_FRAMING_H + +#include <amqp.h> + +AMQP_BEGIN_DECLS + +#define AMQP_PROTOCOL_VERSION_MAJOR 0 +#define AMQP_PROTOCOL_VERSION_MINOR 9 +#define AMQP_PROTOCOL_VERSION_REVISION 1 +#define AMQP_PROTOCOL_PORT 5672 +#define AMQP_FRAME_METHOD 1 +#define AMQP_FRAME_HEADER 2 +#define AMQP_FRAME_BODY 3 +#define AMQP_FRAME_HEARTBEAT 8 +#define AMQP_FRAME_MIN_SIZE 4096 +#define AMQP_FRAME_END 206 +#define AMQP_REPLY_SUCCESS 200 +#define AMQP_CONTENT_TOO_LARGE 311 +#define AMQP_NO_ROUTE 312 +#define AMQP_NO_CONSUMERS 313 +#define AMQP_ACCESS_REFUSED 403 +#define AMQP_NOT_FOUND 404 +#define AMQP_RESOURCE_LOCKED 405 +#define AMQP_PRECONDITION_FAILED 406 +#define AMQP_CONNECTION_FORCED 320 +#define AMQP_INVALID_PATH 402 +#define AMQP_FRAME_ERROR 501 +#define AMQP_SYNTAX_ERROR 502 +#define AMQP_COMMAND_INVALID 503 +#define AMQP_CHANNEL_ERROR 504 +#define AMQP_UNEXPECTED_FRAME 505 +#define AMQP_RESOURCE_ERROR 506 +#define AMQP_NOT_ALLOWED 530 +#define AMQP_NOT_IMPLEMENTED 540 +#define AMQP_INTERNAL_ERROR 541 + +/* Function prototypes. */ + +AMQP_PUBLIC_FUNCTION +char const * +AMQP_CALL amqp_constant_name(int constantNumber); + +AMQP_PUBLIC_FUNCTION +amqp_boolean_t +AMQP_CALL amqp_constant_is_hard_error(int constantNumber); + +AMQP_PUBLIC_FUNCTION +char const * +AMQP_CALL amqp_method_name(amqp_method_number_t methodNumber); + +AMQP_PUBLIC_FUNCTION +amqp_boolean_t +AMQP_CALL amqp_method_has_content(amqp_method_number_t methodNumber); + +AMQP_PUBLIC_FUNCTION +int +AMQP_CALL amqp_decode_method(amqp_method_number_t methodNumber, + amqp_pool_t *pool, + amqp_bytes_t encoded, + void **decoded); + +AMQP_PUBLIC_FUNCTION +int +AMQP_CALL amqp_decode_properties(uint16_t class_id, + amqp_pool_t *pool, + amqp_bytes_t encoded, + void **decoded); + +AMQP_PUBLIC_FUNCTION +int +AMQP_CALL amqp_encode_method(amqp_method_number_t methodNumber, + void *decoded, + amqp_bytes_t encoded); + +AMQP_PUBLIC_FUNCTION +int +AMQP_CALL amqp_encode_properties(uint16_t class_id, + void *decoded, + amqp_bytes_t encoded); + +/* Method field records. */ + +#define AMQP_CONNECTION_START_METHOD ((amqp_method_number_t) 0x000A000A) /* 10, 10; 655370 */ +typedef struct amqp_connection_start_t_ { + uint8_t version_major; + uint8_t version_minor; + amqp_table_t server_properties; + amqp_bytes_t mechanisms; + amqp_bytes_t locales; +} amqp_connection_start_t; + +#define AMQP_CONNECTION_START_OK_METHOD ((amqp_method_number_t) 0x000A000B) /* 10, 11; 655371 */ +typedef struct amqp_connection_start_ok_t_ { + amqp_table_t client_properties; + amqp_bytes_t mechanism; + amqp_bytes_t response; + amqp_bytes_t locale; +} amqp_connection_start_ok_t; + +#define AMQP_CONNECTION_SECURE_METHOD ((amqp_method_number_t) 0x000A0014) /* 10, 20; 655380 */ +typedef struct amqp_connection_secure_t_ { + amqp_bytes_t challenge; +} amqp_connection_secure_t; + +#define AMQP_CONNECTION_SECURE_OK_METHOD ((amqp_method_number_t) 0x000A0015) /* 10, 21; 655381 */ +typedef struct amqp_connection_secure_ok_t_ { + amqp_bytes_t response; +} amqp_connection_secure_ok_t; + +#define AMQP_CONNECTION_TUNE_METHOD ((amqp_method_number_t) 0x000A001E) /* 10, 30; 655390 */ +typedef struct amqp_connection_tune_t_ { + uint16_t channel_max; + uint32_t frame_max; + uint16_t heartbeat; +} amqp_connection_tune_t; + +#define AMQP_CONNECTION_TUNE_OK_METHOD ((amqp_method_number_t) 0x000A001F) /* 10, 31; 655391 */ +typedef struct amqp_connection_tune_ok_t_ { + uint16_t channel_max; + uint32_t frame_max; + uint16_t heartbeat; +} amqp_connection_tune_ok_t; + +#define AMQP_CONNECTION_OPEN_METHOD ((amqp_method_number_t) 0x000A0028) /* 10, 40; 655400 */ +typedef struct amqp_connection_open_t_ { + amqp_bytes_t virtual_host; + amqp_bytes_t capabilities; + amqp_boolean_t insist; +} amqp_connection_open_t; + +#define AMQP_CONNECTION_OPEN_OK_METHOD ((amqp_method_number_t) 0x000A0029) /* 10, 41; 655401 */ +typedef struct amqp_connection_open_ok_t_ { + amqp_bytes_t known_hosts; +} amqp_connection_open_ok_t; + +#define AMQP_CONNECTION_CLOSE_METHOD ((amqp_method_number_t) 0x000A0032) /* 10, 50; 655410 */ +typedef struct amqp_connection_close_t_ { + uint16_t reply_code; + amqp_bytes_t reply_text; + uint16_t class_id; + uint16_t method_id; +} amqp_connection_close_t; + +#define AMQP_CONNECTION_CLOSE_OK_METHOD ((amqp_method_number_t) 0x000A0033) /* 10, 51; 655411 */ +typedef struct amqp_connection_close_ok_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_connection_close_ok_t; + +#define AMQP_CHANNEL_OPEN_METHOD ((amqp_method_number_t) 0x0014000A) /* 20, 10; 1310730 */ +typedef struct amqp_channel_open_t_ { + amqp_bytes_t out_of_band; +} amqp_channel_open_t; + +#define AMQP_CHANNEL_OPEN_OK_METHOD ((amqp_method_number_t) 0x0014000B) /* 20, 11; 1310731 */ +typedef struct amqp_channel_open_ok_t_ { + amqp_bytes_t channel_id; +} amqp_channel_open_ok_t; + +#define AMQP_CHANNEL_FLOW_METHOD ((amqp_method_number_t) 0x00140014) /* 20, 20; 1310740 */ +typedef struct amqp_channel_flow_t_ { + amqp_boolean_t active; +} amqp_channel_flow_t; + +#define AMQP_CHANNEL_FLOW_OK_METHOD ((amqp_method_number_t) 0x00140015) /* 20, 21; 1310741 */ +typedef struct amqp_channel_flow_ok_t_ { + amqp_boolean_t active; +} amqp_channel_flow_ok_t; + +#define AMQP_CHANNEL_CLOSE_METHOD ((amqp_method_number_t) 0x00140028) /* 20, 40; 1310760 */ +typedef struct amqp_channel_close_t_ { + uint16_t reply_code; + amqp_bytes_t reply_text; + uint16_t class_id; + uint16_t method_id; +} amqp_channel_close_t; + +#define AMQP_CHANNEL_CLOSE_OK_METHOD ((amqp_method_number_t) 0x00140029) /* 20, 41; 1310761 */ +typedef struct amqp_channel_close_ok_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_channel_close_ok_t; + +#define AMQP_ACCESS_REQUEST_METHOD ((amqp_method_number_t) 0x001E000A) /* 30, 10; 1966090 */ +typedef struct amqp_access_request_t_ { + amqp_bytes_t realm; + amqp_boolean_t exclusive; + amqp_boolean_t passive; + amqp_boolean_t active; + amqp_boolean_t write; + amqp_boolean_t read; +} amqp_access_request_t; + +#define AMQP_ACCESS_REQUEST_OK_METHOD ((amqp_method_number_t) 0x001E000B) /* 30, 11; 1966091 */ +typedef struct amqp_access_request_ok_t_ { + uint16_t ticket; +} amqp_access_request_ok_t; + +#define AMQP_EXCHANGE_DECLARE_METHOD ((amqp_method_number_t) 0x0028000A) /* 40, 10; 2621450 */ +typedef struct amqp_exchange_declare_t_ { + uint16_t ticket; + amqp_bytes_t exchange; + amqp_bytes_t type; + amqp_boolean_t passive; + amqp_boolean_t durable; + amqp_boolean_t auto_delete; + amqp_boolean_t internal; + amqp_boolean_t nowait; + amqp_table_t arguments; +} amqp_exchange_declare_t; + +#define AMQP_EXCHANGE_DECLARE_OK_METHOD ((amqp_method_number_t) 0x0028000B) /* 40, 11; 2621451 */ +typedef struct amqp_exchange_declare_ok_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_exchange_declare_ok_t; + +#define AMQP_EXCHANGE_DELETE_METHOD ((amqp_method_number_t) 0x00280014) /* 40, 20; 2621460 */ +typedef struct amqp_exchange_delete_t_ { + uint16_t ticket; + amqp_bytes_t exchange; + amqp_boolean_t if_unused; + amqp_boolean_t nowait; +} amqp_exchange_delete_t; + +#define AMQP_EXCHANGE_DELETE_OK_METHOD ((amqp_method_number_t) 0x00280015) /* 40, 21; 2621461 */ +typedef struct amqp_exchange_delete_ok_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_exchange_delete_ok_t; + +#define AMQP_EXCHANGE_BIND_METHOD ((amqp_method_number_t) 0x0028001E) /* 40, 30; 2621470 */ +typedef struct amqp_exchange_bind_t_ { + uint16_t ticket; + amqp_bytes_t destination; + amqp_bytes_t source; + amqp_bytes_t routing_key; + amqp_boolean_t nowait; + amqp_table_t arguments; +} amqp_exchange_bind_t; + +#define AMQP_EXCHANGE_BIND_OK_METHOD ((amqp_method_number_t) 0x0028001F) /* 40, 31; 2621471 */ +typedef struct amqp_exchange_bind_ok_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_exchange_bind_ok_t; + +#define AMQP_EXCHANGE_UNBIND_METHOD ((amqp_method_number_t) 0x00280028) /* 40, 40; 2621480 */ +typedef struct amqp_exchange_unbind_t_ { + uint16_t ticket; + amqp_bytes_t destination; + amqp_bytes_t source; + amqp_bytes_t routing_key; + amqp_boolean_t nowait; + amqp_table_t arguments; +} amqp_exchange_unbind_t; + +#define AMQP_EXCHANGE_UNBIND_OK_METHOD ((amqp_method_number_t) 0x00280033) /* 40, 51; 2621491 */ +typedef struct amqp_exchange_unbind_ok_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_exchange_unbind_ok_t; + +#define AMQP_QUEUE_DECLARE_METHOD ((amqp_method_number_t) 0x0032000A) /* 50, 10; 3276810 */ +typedef struct amqp_queue_declare_t_ { + uint16_t ticket; + amqp_bytes_t queue; + amqp_boolean_t passive; + amqp_boolean_t durable; + amqp_boolean_t exclusive; + amqp_boolean_t auto_delete; + amqp_boolean_t nowait; + amqp_table_t arguments; +} amqp_queue_declare_t; + +#define AMQP_QUEUE_DECLARE_OK_METHOD ((amqp_method_number_t) 0x0032000B) /* 50, 11; 3276811 */ +typedef struct amqp_queue_declare_ok_t_ { + amqp_bytes_t queue; + uint32_t message_count; + uint32_t consumer_count; +} amqp_queue_declare_ok_t; + +#define AMQP_QUEUE_BIND_METHOD ((amqp_method_number_t) 0x00320014) /* 50, 20; 3276820 */ +typedef struct amqp_queue_bind_t_ { + uint16_t ticket; + amqp_bytes_t queue; + amqp_bytes_t exchange; + amqp_bytes_t routing_key; + amqp_boolean_t nowait; + amqp_table_t arguments; +} amqp_queue_bind_t; + +#define AMQP_QUEUE_BIND_OK_METHOD ((amqp_method_number_t) 0x00320015) /* 50, 21; 3276821 */ +typedef struct amqp_queue_bind_ok_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_queue_bind_ok_t; + +#define AMQP_QUEUE_PURGE_METHOD ((amqp_method_number_t) 0x0032001E) /* 50, 30; 3276830 */ +typedef struct amqp_queue_purge_t_ { + uint16_t ticket; + amqp_bytes_t queue; + amqp_boolean_t nowait; +} amqp_queue_purge_t; + +#define AMQP_QUEUE_PURGE_OK_METHOD ((amqp_method_number_t) 0x0032001F) /* 50, 31; 3276831 */ +typedef struct amqp_queue_purge_ok_t_ { + uint32_t message_count; +} amqp_queue_purge_ok_t; + +#define AMQP_QUEUE_DELETE_METHOD ((amqp_method_number_t) 0x00320028) /* 50, 40; 3276840 */ +typedef struct amqp_queue_delete_t_ { + uint16_t ticket; + amqp_bytes_t queue; + amqp_boolean_t if_unused; + amqp_boolean_t if_empty; + amqp_boolean_t nowait; +} amqp_queue_delete_t; + +#define AMQP_QUEUE_DELETE_OK_METHOD ((amqp_method_number_t) 0x00320029) /* 50, 41; 3276841 */ +typedef struct amqp_queue_delete_ok_t_ { + uint32_t message_count; +} amqp_queue_delete_ok_t; + +#define AMQP_QUEUE_UNBIND_METHOD ((amqp_method_number_t) 0x00320032) /* 50, 50; 3276850 */ +typedef struct amqp_queue_unbind_t_ { + uint16_t ticket; + amqp_bytes_t queue; + amqp_bytes_t exchange; + amqp_bytes_t routing_key; + amqp_table_t arguments; +} amqp_queue_unbind_t; + +#define AMQP_QUEUE_UNBIND_OK_METHOD ((amqp_method_number_t) 0x00320033) /* 50, 51; 3276851 */ +typedef struct amqp_queue_unbind_ok_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_queue_unbind_ok_t; + +#define AMQP_BASIC_QOS_METHOD ((amqp_method_number_t) 0x003C000A) /* 60, 10; 3932170 */ +typedef struct amqp_basic_qos_t_ { + uint32_t prefetch_size; + uint16_t prefetch_count; + amqp_boolean_t global; +} amqp_basic_qos_t; + +#define AMQP_BASIC_QOS_OK_METHOD ((amqp_method_number_t) 0x003C000B) /* 60, 11; 3932171 */ +typedef struct amqp_basic_qos_ok_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_basic_qos_ok_t; + +#define AMQP_BASIC_CONSUME_METHOD ((amqp_method_number_t) 0x003C0014) /* 60, 20; 3932180 */ +typedef struct amqp_basic_consume_t_ { + uint16_t ticket; + amqp_bytes_t queue; + amqp_bytes_t consumer_tag; + amqp_boolean_t no_local; + amqp_boolean_t no_ack; + amqp_boolean_t exclusive; + amqp_boolean_t nowait; + amqp_table_t arguments; +} amqp_basic_consume_t; + +#define AMQP_BASIC_CONSUME_OK_METHOD ((amqp_method_number_t) 0x003C0015) /* 60, 21; 3932181 */ +typedef struct amqp_basic_consume_ok_t_ { + amqp_bytes_t consumer_tag; +} amqp_basic_consume_ok_t; + +#define AMQP_BASIC_CANCEL_METHOD ((amqp_method_number_t) 0x003C001E) /* 60, 30; 3932190 */ +typedef struct amqp_basic_cancel_t_ { + amqp_bytes_t consumer_tag; + amqp_boolean_t nowait; +} amqp_basic_cancel_t; + +#define AMQP_BASIC_CANCEL_OK_METHOD ((amqp_method_number_t) 0x003C001F) /* 60, 31; 3932191 */ +typedef struct amqp_basic_cancel_ok_t_ { + amqp_bytes_t consumer_tag; +} amqp_basic_cancel_ok_t; + +#define AMQP_BASIC_PUBLISH_METHOD ((amqp_method_number_t) 0x003C0028) /* 60, 40; 3932200 */ +typedef struct amqp_basic_publish_t_ { + uint16_t ticket; + amqp_bytes_t exchange; + amqp_bytes_t routing_key; + amqp_boolean_t mandatory; + amqp_boolean_t immediate; +} amqp_basic_publish_t; + +#define AMQP_BASIC_RETURN_METHOD ((amqp_method_number_t) 0x003C0032) /* 60, 50; 3932210 */ +typedef struct amqp_basic_return_t_ { + uint16_t reply_code; + amqp_bytes_t reply_text; + amqp_bytes_t exchange; + amqp_bytes_t routing_key; +} amqp_basic_return_t; + +#define AMQP_BASIC_DELIVER_METHOD ((amqp_method_number_t) 0x003C003C) /* 60, 60; 3932220 */ +typedef struct amqp_basic_deliver_t_ { + amqp_bytes_t consumer_tag; + uint64_t delivery_tag; + amqp_boolean_t redelivered; + amqp_bytes_t exchange; + amqp_bytes_t routing_key; +} amqp_basic_deliver_t; + +#define AMQP_BASIC_GET_METHOD ((amqp_method_number_t) 0x003C0046) /* 60, 70; 3932230 */ +typedef struct amqp_basic_get_t_ { + uint16_t ticket; + amqp_bytes_t queue; + amqp_boolean_t no_ack; +} amqp_basic_get_t; + +#define AMQP_BASIC_GET_OK_METHOD ((amqp_method_number_t) 0x003C0047) /* 60, 71; 3932231 */ +typedef struct amqp_basic_get_ok_t_ { + uint64_t delivery_tag; + amqp_boolean_t redelivered; + amqp_bytes_t exchange; + amqp_bytes_t routing_key; + uint32_t message_count; +} amqp_basic_get_ok_t; + +#define AMQP_BASIC_GET_EMPTY_METHOD ((amqp_method_number_t) 0x003C0048) /* 60, 72; 3932232 */ +typedef struct amqp_basic_get_empty_t_ { + amqp_bytes_t cluster_id; +} amqp_basic_get_empty_t; + +#define AMQP_BASIC_ACK_METHOD ((amqp_method_number_t) 0x003C0050) /* 60, 80; 3932240 */ +typedef struct amqp_basic_ack_t_ { + uint64_t delivery_tag; + amqp_boolean_t multiple; +} amqp_basic_ack_t; + +#define AMQP_BASIC_REJECT_METHOD ((amqp_method_number_t) 0x003C005A) /* 60, 90; 3932250 */ +typedef struct amqp_basic_reject_t_ { + uint64_t delivery_tag; + amqp_boolean_t requeue; +} amqp_basic_reject_t; + +#define AMQP_BASIC_RECOVER_ASYNC_METHOD ((amqp_method_number_t) 0x003C0064) /* 60, 100; 3932260 */ +typedef struct amqp_basic_recover_async_t_ { + amqp_boolean_t requeue; +} amqp_basic_recover_async_t; + +#define AMQP_BASIC_RECOVER_METHOD ((amqp_method_number_t) 0x003C006E) /* 60, 110; 3932270 */ +typedef struct amqp_basic_recover_t_ { + amqp_boolean_t requeue; +} amqp_basic_recover_t; + +#define AMQP_BASIC_RECOVER_OK_METHOD ((amqp_method_number_t) 0x003C006F) /* 60, 111; 3932271 */ +typedef struct amqp_basic_recover_ok_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_basic_recover_ok_t; + +#define AMQP_BASIC_NACK_METHOD ((amqp_method_number_t) 0x003C0078) /* 60, 120; 3932280 */ +typedef struct amqp_basic_nack_t_ { + uint64_t delivery_tag; + amqp_boolean_t multiple; + amqp_boolean_t requeue; +} amqp_basic_nack_t; + +#define AMQP_TX_SELECT_METHOD ((amqp_method_number_t) 0x005A000A) /* 90, 10; 5898250 */ +typedef struct amqp_tx_select_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_tx_select_t; + +#define AMQP_TX_SELECT_OK_METHOD ((amqp_method_number_t) 0x005A000B) /* 90, 11; 5898251 */ +typedef struct amqp_tx_select_ok_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_tx_select_ok_t; + +#define AMQP_TX_COMMIT_METHOD ((amqp_method_number_t) 0x005A0014) /* 90, 20; 5898260 */ +typedef struct amqp_tx_commit_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_tx_commit_t; + +#define AMQP_TX_COMMIT_OK_METHOD ((amqp_method_number_t) 0x005A0015) /* 90, 21; 5898261 */ +typedef struct amqp_tx_commit_ok_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_tx_commit_ok_t; + +#define AMQP_TX_ROLLBACK_METHOD ((amqp_method_number_t) 0x005A001E) /* 90, 30; 5898270 */ +typedef struct amqp_tx_rollback_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_tx_rollback_t; + +#define AMQP_TX_ROLLBACK_OK_METHOD ((amqp_method_number_t) 0x005A001F) /* 90, 31; 5898271 */ +typedef struct amqp_tx_rollback_ok_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_tx_rollback_ok_t; + +#define AMQP_CONFIRM_SELECT_METHOD ((amqp_method_number_t) 0x0055000A) /* 85, 10; 5570570 */ +typedef struct amqp_confirm_select_t_ { + amqp_boolean_t nowait; +} amqp_confirm_select_t; + +#define AMQP_CONFIRM_SELECT_OK_METHOD ((amqp_method_number_t) 0x0055000B) /* 85, 11; 5570571 */ +typedef struct amqp_confirm_select_ok_t_ { + char dummy; /* Dummy field to avoid empty struct */ +} amqp_confirm_select_ok_t; + +/* Class property records. */ +#define AMQP_CONNECTION_CLASS (0x000A) /* 10 */ +typedef struct amqp_connection_properties_t_ { + amqp_flags_t _flags; + char dummy; /* Dummy field to avoid empty struct */ +} amqp_connection_properties_t; + +#define AMQP_CHANNEL_CLASS (0x0014) /* 20 */ +typedef struct amqp_channel_properties_t_ { + amqp_flags_t _flags; + char dummy; /* Dummy field to avoid empty struct */ +} amqp_channel_properties_t; + +#define AMQP_ACCESS_CLASS (0x001E) /* 30 */ +typedef struct amqp_access_properties_t_ { + amqp_flags_t _flags; + char dummy; /* Dummy field to avoid empty struct */ +} amqp_access_properties_t; + +#define AMQP_EXCHANGE_CLASS (0x0028) /* 40 */ +typedef struct amqp_exchange_properties_t_ { + amqp_flags_t _flags; + char dummy; /* Dummy field to avoid empty struct */ +} amqp_exchange_properties_t; + +#define AMQP_QUEUE_CLASS (0x0032) /* 50 */ +typedef struct amqp_queue_properties_t_ { + amqp_flags_t _flags; + char dummy; /* Dummy field to avoid empty struct */ +} amqp_queue_properties_t; + +#define AMQP_BASIC_CLASS (0x003C) /* 60 */ +#define AMQP_BASIC_CONTENT_TYPE_FLAG (1 << 15) +#define AMQP_BASIC_CONTENT_ENCODING_FLAG (1 << 14) +#define AMQP_BASIC_HEADERS_FLAG (1 << 13) +#define AMQP_BASIC_DELIVERY_MODE_FLAG (1 << 12) +#define AMQP_BASIC_PRIORITY_FLAG (1 << 11) +#define AMQP_BASIC_CORRELATION_ID_FLAG (1 << 10) +#define AMQP_BASIC_REPLY_TO_FLAG (1 << 9) +#define AMQP_BASIC_EXPIRATION_FLAG (1 << 8) +#define AMQP_BASIC_MESSAGE_ID_FLAG (1 << 7) +#define AMQP_BASIC_TIMESTAMP_FLAG (1 << 6) +#define AMQP_BASIC_TYPE_FLAG (1 << 5) +#define AMQP_BASIC_USER_ID_FLAG (1 << 4) +#define AMQP_BASIC_APP_ID_FLAG (1 << 3) +#define AMQP_BASIC_CLUSTER_ID_FLAG (1 << 2) +typedef struct amqp_basic_properties_t_ { + amqp_flags_t _flags; + amqp_bytes_t content_type; + amqp_bytes_t content_encoding; + amqp_table_t headers; + uint8_t delivery_mode; + uint8_t priority; + amqp_bytes_t correlation_id; + amqp_bytes_t reply_to; + amqp_bytes_t expiration; + amqp_bytes_t message_id; + uint64_t timestamp; + amqp_bytes_t type; + amqp_bytes_t user_id; + amqp_bytes_t app_id; + amqp_bytes_t cluster_id; +} amqp_basic_properties_t; + +#define AMQP_TX_CLASS (0x005A) /* 90 */ +typedef struct amqp_tx_properties_t_ { + amqp_flags_t _flags; + char dummy; /* Dummy field to avoid empty struct */ +} amqp_tx_properties_t; + +#define AMQP_CONFIRM_CLASS (0x0055) /* 85 */ +typedef struct amqp_confirm_properties_t_ { + amqp_flags_t _flags; + char dummy; /* Dummy field to avoid empty struct */ +} amqp_confirm_properties_t; + +/* API functions for methods */ + +AMQP_PUBLIC_FUNCTION amqp_channel_open_ok_t * AMQP_CALL amqp_channel_open(amqp_connection_state_t state, amqp_channel_t channel); +AMQP_PUBLIC_FUNCTION amqp_channel_flow_ok_t * AMQP_CALL amqp_channel_flow(amqp_connection_state_t state, amqp_channel_t channel, amqp_boolean_t active); +AMQP_PUBLIC_FUNCTION amqp_exchange_declare_ok_t * AMQP_CALL amqp_exchange_declare(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t exchange, amqp_bytes_t type, amqp_boolean_t passive, amqp_boolean_t durable, amqp_table_t arguments); +AMQP_PUBLIC_FUNCTION amqp_exchange_delete_ok_t * AMQP_CALL amqp_exchange_delete(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t exchange, amqp_boolean_t if_unused); +AMQP_PUBLIC_FUNCTION amqp_exchange_bind_ok_t * AMQP_CALL amqp_exchange_bind(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t destination, amqp_bytes_t source, amqp_bytes_t routing_key, amqp_table_t arguments); +AMQP_PUBLIC_FUNCTION amqp_exchange_unbind_ok_t * AMQP_CALL amqp_exchange_unbind(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t destination, amqp_bytes_t source, amqp_bytes_t routing_key, amqp_table_t arguments); +AMQP_PUBLIC_FUNCTION amqp_queue_declare_ok_t * AMQP_CALL amqp_queue_declare(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_boolean_t passive, amqp_boolean_t durable, amqp_boolean_t exclusive, amqp_boolean_t auto_delete, amqp_table_t arguments); +AMQP_PUBLIC_FUNCTION amqp_queue_bind_ok_t * AMQP_CALL amqp_queue_bind(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_bytes_t exchange, amqp_bytes_t routing_key, amqp_table_t arguments); +AMQP_PUBLIC_FUNCTION amqp_queue_purge_ok_t * AMQP_CALL amqp_queue_purge(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue); +AMQP_PUBLIC_FUNCTION amqp_queue_delete_ok_t * AMQP_CALL amqp_queue_delete(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_boolean_t if_unused, amqp_boolean_t if_empty); +AMQP_PUBLIC_FUNCTION amqp_queue_unbind_ok_t * AMQP_CALL amqp_queue_unbind(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_bytes_t exchange, amqp_bytes_t routing_key, amqp_table_t arguments); +AMQP_PUBLIC_FUNCTION amqp_basic_qos_ok_t * AMQP_CALL amqp_basic_qos(amqp_connection_state_t state, amqp_channel_t channel, uint32_t prefetch_size, uint16_t prefetch_count, amqp_boolean_t global); +AMQP_PUBLIC_FUNCTION amqp_basic_consume_ok_t * AMQP_CALL amqp_basic_consume(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_bytes_t consumer_tag, amqp_boolean_t no_local, amqp_boolean_t no_ack, amqp_boolean_t exclusive, amqp_table_t arguments); +AMQP_PUBLIC_FUNCTION amqp_basic_cancel_ok_t * AMQP_CALL amqp_basic_cancel(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t consumer_tag); +AMQP_PUBLIC_FUNCTION amqp_basic_recover_ok_t * AMQP_CALL amqp_basic_recover(amqp_connection_state_t state, amqp_channel_t channel, amqp_boolean_t requeue); +AMQP_PUBLIC_FUNCTION amqp_tx_select_ok_t * AMQP_CALL amqp_tx_select(amqp_connection_state_t state, amqp_channel_t channel); +AMQP_PUBLIC_FUNCTION amqp_tx_commit_ok_t * AMQP_CALL amqp_tx_commit(amqp_connection_state_t state, amqp_channel_t channel); +AMQP_PUBLIC_FUNCTION amqp_tx_rollback_ok_t * AMQP_CALL amqp_tx_rollback(amqp_connection_state_t state, amqp_channel_t channel); +AMQP_PUBLIC_FUNCTION amqp_confirm_select_ok_t * AMQP_CALL amqp_confirm_select(amqp_connection_state_t state, amqp_channel_t channel); + +AMQP_END_DECLS + +#endif /* AMQP_FRAMING_H */ diff --git a/librabbitmq/codegen.py b/librabbitmq/codegen.py index 3e6ad94..1a2928d 100644 --- a/librabbitmq/codegen.py +++ b/librabbitmq/codegen.py @@ -334,7 +334,7 @@ def genErl(spec): methods = spec.allMethods() - print """/* Autogenerated code. Do not edit. + print """/* Generated code. Do not edit. Edit and re-run codegen.py instead. * * ***** BEGIN LICENSE BLOCK ***** * Version: MIT @@ -552,7 +552,7 @@ def genHrl(spec): methods = spec.allMethods() - print """/* Autogenerated code. Do not edit. + print """/* Generated code. Do not edit. Edit and re-run codegen.py instead. * * ***** BEGIN LICENSE BLOCK ***** * Version: MIT diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index c458e03..10be4df 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -1,4 +1,4 @@ -include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${librabbitmq_SOURCE_DIR} ${librabbitmq_BINARY_DIR} ${POPT_INCLUDE_DIRS}) +include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${LIBRABBITMQ_INCLUDE_DIRS} ${POPT_INCLUDE_DIRS}) if (WIN32) set(PLATFORM_DIR win32) |