From 73b1d57b1398a469201f11b2a973d47f801c01f6 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 11 May 2020 12:29:06 -0700 Subject: [PATCH] rip out rabbitMQ --- controller/EmbeddedNetworkController.cpp | 7 +- controller/EmbeddedNetworkController.hpp | 6 +- controller/PostgreSQL.cpp | 100 +- controller/PostgreSQL.hpp | 8 +- controller/RabbitMQ.cpp | 120 - controller/RabbitMQ.hpp | 69 - ext/librabbitmq/centos_x64/include/amqp.h | 2538 ----------------- .../centos_x64/include/amqp_framing.h | 1144 -------- .../centos_x64/include/amqp_tcp_socket.h | 68 - ext/librabbitmq/centos_x64/lib/librabbitmq.a | Bin 139468 -> 0 bytes ext/librabbitmq/macos/include/amqp.h | 2538 ----------------- ext/librabbitmq/macos/include/amqp_framing.h | 1144 -------- .../macos/include/amqp_tcp_socket.h | 68 - ext/librabbitmq/macos/lib/librabbitmq.a | Bin 95704 -> 0 bytes make-linux.mk | 4 +- make-mac.mk | 4 +- objects.mk | 1 - service/OneService.cpp | 17 +- 18 files changed, 23 insertions(+), 7813 deletions(-) delete mode 100644 controller/RabbitMQ.cpp delete mode 100644 controller/RabbitMQ.hpp delete mode 100644 ext/librabbitmq/centos_x64/include/amqp.h delete mode 100644 ext/librabbitmq/centos_x64/include/amqp_framing.h delete mode 100644 ext/librabbitmq/centos_x64/include/amqp_tcp_socket.h delete mode 100644 ext/librabbitmq/centos_x64/lib/librabbitmq.a delete mode 100644 ext/librabbitmq/macos/include/amqp.h delete mode 100644 ext/librabbitmq/macos/include/amqp_framing.h delete mode 100644 ext/librabbitmq/macos/include/amqp_tcp_socket.h delete mode 100644 ext/librabbitmq/macos/lib/librabbitmq.a diff --git a/controller/EmbeddedNetworkController.cpp b/controller/EmbeddedNetworkController.cpp index e0e2a3eae..ef2ce2cfb 100644 --- a/controller/EmbeddedNetworkController.cpp +++ b/controller/EmbeddedNetworkController.cpp @@ -456,15 +456,14 @@ static bool _parseRule(json &r,ZT_VirtualNetworkRule &rule) } // anonymous namespace -EmbeddedNetworkController::EmbeddedNetworkController(Node *node,const char *ztPath,const char *dbPath, int listenPort, MQConfig *mqc) : +EmbeddedNetworkController::EmbeddedNetworkController(Node *node,const char *ztPath,const char *dbPath, int listenPort) : _startTime(OSUtils::now()), _listenPort(listenPort), _node(node), _ztPath(ztPath), _path(dbPath), _sender((NetworkController::Sender *)0), - _db(this), - _mqc(mqc) + _db(this) { } @@ -485,7 +484,7 @@ void EmbeddedNetworkController::init(const Identity &signingId,Sender *sender) #ifdef ZT_CONTROLLER_USE_LIBPQ if ((_path.length() > 9)&&(_path.substr(0,9) == "postgres:")) { - _db.addDB(std::shared_ptr(new PostgreSQL(_signingId,_path.substr(9).c_str(), _listenPort, _mqc))); + _db.addDB(std::shared_ptr(new PostgreSQL(_signingId,_path.substr(9).c_str(), _listenPort))); } else { #endif _db.addDB(std::shared_ptr(new FileDB(_path.c_str()))); diff --git a/controller/EmbeddedNetworkController.hpp b/controller/EmbeddedNetworkController.hpp index 1db4cf420..d09e08ac6 100644 --- a/controller/EmbeddedNetworkController.hpp +++ b/controller/EmbeddedNetworkController.hpp @@ -44,8 +44,6 @@ namespace ZeroTier { class Node; -struct MQConfig; - class EmbeddedNetworkController : public NetworkController,public DB::ChangeListener { public: @@ -53,7 +51,7 @@ public: * @param node Parent node * @param dbPath Database path (file path or database credentials) */ - EmbeddedNetworkController(Node *node,const char *ztPath,const char *dbPath, int listenPort, MQConfig *mqc = NULL); + EmbeddedNetworkController(Node *node,const char *ztPath,const char *dbPath, int listenPort); virtual ~EmbeddedNetworkController(); virtual void init(const Identity &signingId,Sender *sender); @@ -150,8 +148,6 @@ private: std::unordered_map< _MemberStatusKey,_MemberStatus,_MemberStatusHash > _memberStatus; std::mutex _memberStatus_l; - - MQConfig *_mqc; }; } // namespace ZeroTier diff --git a/controller/PostgreSQL.cpp b/controller/PostgreSQL.cpp index e81ac0a69..72acdca9e 100644 --- a/controller/PostgreSQL.cpp +++ b/controller/PostgreSQL.cpp @@ -17,13 +17,12 @@ #include "../node/Constants.hpp" #include "EmbeddedNetworkController.hpp" -#include "RabbitMQ.hpp" #include "../version.h" +#include "hiredis.h" #include #include -#include -#include + using json = nlohmann::json; @@ -69,7 +68,7 @@ std::string join(const std::vector &elements, const char * const se using namespace ZeroTier; -PostgreSQL::PostgreSQL(const Identity &myId, const char *path, int listenPort, MQConfig *mqc) +PostgreSQL::PostgreSQL(const Identity &myId, const char *path, int listenPort) : DB() , _myId(myId) , _myAddress(myId.address()) @@ -78,7 +77,6 @@ PostgreSQL::PostgreSQL(const Identity &myId, const char *path, int listenPort, M , _run(1) , _waitNoticePrinted(false) , _listenPort(listenPort) - , _mqc(mqc) { char myAddress[64]; _myAddressStr = myId.address().toString(myAddress); @@ -593,7 +591,7 @@ void PostgreSQL::heartbeat() std::string build = std::to_string(ZEROTIER_ONE_VERSION_BUILD); std::string now = std::to_string(OSUtils::now()); std::string host_port = std::to_string(_listenPort); - std::string use_rabbitmq = (_mqc != NULL) ? "true" : "false"; + std::string use_rabbitmq = (false) ? "true" : "false"; const char *values[10] = { controllerId, hostname, @@ -645,10 +643,10 @@ void PostgreSQL::membersDbWatcher() initializeMembers(conn); - if (this->_mqc != NULL) { - PQfinish(conn); - conn = NULL; - _membersWatcher_RabbitMQ(); + if (false) { + // PQfinish(conn); + // conn = NULL; + // _membersWatcher_RabbitMQ(); } else { _membersWatcher_Postgres(conn); PQfinish(conn); @@ -703,43 +701,6 @@ void PostgreSQL::_membersWatcher_Postgres(PGconn *conn) { } } -void PostgreSQL::_membersWatcher_RabbitMQ() { - char buf[11] = {0}; - std::string qname = "member_"+ std::string(_myAddress.toString(buf)); - RabbitMQ rmq(_mqc, qname.c_str()); - try { - rmq.init(); - } catch (std::runtime_error &e) { - fprintf(stderr, "RABBITMQ ERROR: %s\n", e.what()); - exit(11); - } - while (_run == 1) { - try { - std::string msg = rmq.consume(); - // fprintf(stderr, "Got Member Update: %s\n", msg.c_str()); - if (msg.empty()) { - continue; - } - json tmp(json::parse(msg)); - json &ov = tmp["old_val"]; - json &nv = tmp["new_val"]; - json oldConfig, newConfig; - if (ov.is_object()) oldConfig = ov; - if (nv.is_object()) newConfig = nv; - if (oldConfig.is_object() || newConfig.is_object()) { - _memberChanged(oldConfig,newConfig,(this->_ready>=2)); - } - } catch (std::runtime_error &e) { - fprintf(stderr, "RABBITMQ ERROR member change: %s\n", e.what()); - break; - } catch(std::exception &e ) { - fprintf(stderr, "RABBITMQ ERROR member change: %s\n", e.what()); - } catch(...) { - fprintf(stderr, "RABBITMQ ERROR member change: unknown error\n"); - } - } -} - void PostgreSQL::_membersWatcher_Reids() { char buff[11] = {0}; @@ -756,10 +717,10 @@ void PostgreSQL::networksDbWatcher() initializeNetworks(conn); - if (this->_mqc != NULL) { - PQfinish(conn); - conn = NULL; - _networksWatcher_RabbitMQ(); + if (false) { + // PQfinish(conn); + // conn = NULL; + // _networksWatcher_RabbitMQ(); } else { _networksWatcher_Postgres(conn); PQfinish(conn); @@ -812,43 +773,6 @@ void PostgreSQL::_networksWatcher_Postgres(PGconn *conn) { } } -void PostgreSQL::_networksWatcher_RabbitMQ() { - char buf[11] = {0}; - std::string qname = "network_"+ std::string(_myAddress.toString(buf)); - RabbitMQ rmq(_mqc, qname.c_str()); - try { - rmq.init(); - } catch (std::runtime_error &e) { - fprintf(stderr, "RABBITMQ ERROR: %s\n", e.what()); - exit(11); - } - while (_run == 1) { - try { - std::string msg = rmq.consume(); - if (msg.empty()) { - continue; - } - // fprintf(stderr, "Got network update: %s\n", msg.c_str()); - json tmp(json::parse(msg)); - json &ov = tmp["old_val"]; - json &nv = tmp["new_val"]; - json oldConfig, newConfig; - if (ov.is_object()) oldConfig = ov; - if (nv.is_object()) newConfig = nv; - if (oldConfig.is_object()||newConfig.is_object()) { - _networkChanged(oldConfig,newConfig,(this->_ready >= 2)); - } - } catch (std::runtime_error &e) { - fprintf(stderr, "RABBITMQ ERROR: %s\n", e.what()); - break; - } catch (std::exception &e) { - fprintf(stderr, "RABBITMQ ERROR network watcher: %s\n", e.what()); - } catch(...) { - fprintf(stderr, "RABBITMQ ERROR network watcher: unknown error\n"); - } - } -} - void PostgreSQL::_networksWatcher_Redis() { } diff --git a/controller/PostgreSQL.hpp b/controller/PostgreSQL.hpp index d0a32edfc..dcad35e7d 100644 --- a/controller/PostgreSQL.hpp +++ b/controller/PostgreSQL.hpp @@ -26,8 +26,6 @@ typedef struct pg_conn PGconn; namespace ZeroTier { -struct MQConfig; - /** * A controller database driver that talks to PostgreSQL * @@ -37,7 +35,7 @@ struct MQConfig; class PostgreSQL : public DB { public: - PostgreSQL(const Identity &myId, const char *path, int listenPort, MQConfig *mqc = NULL); + PostgreSQL(const Identity &myId, const char *path, int listenPort); virtual ~PostgreSQL(); virtual bool waitForReady(); @@ -59,10 +57,8 @@ private: void heartbeat(); void membersDbWatcher(); void _membersWatcher_Postgres(PGconn *conn); - void _membersWatcher_RabbitMQ(); void networksDbWatcher(); void _networksWatcher_Postgres(PGconn *conn); - void _networksWatcher_RabbitMQ(); void _membersWatcher_Reids(); void _networksWatcher_Redis(); @@ -98,8 +94,6 @@ private: mutable volatile bool _waitNoticePrinted; int _listenPort; - - MQConfig *_mqc; }; } // namespace ZeroTier diff --git a/controller/RabbitMQ.cpp b/controller/RabbitMQ.cpp deleted file mode 100644 index 29a331ad2..000000000 --- a/controller/RabbitMQ.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c)2019 ZeroTier, Inc. - * - * Use of this software is governed by the Business Source License included - * in the LICENSE.TXT file in the project's root directory. - * - * Change Date: 2023-01-01 - * - * On the date above, in accordance with the Business Source License, use - * of this software will be governed by version 2.0 of the Apache License. - */ -/****/ - -#include "RabbitMQ.hpp" - -#ifdef ZT_CONTROLLER_USE_LIBPQ - -#include -#include -#include -#include - -namespace ZeroTier -{ - -RabbitMQ::RabbitMQ(MQConfig *cfg, const char *queueName) - : _mqc(cfg) - , _qName(queueName) - , _socket(NULL) - , _status(0) -{ -} - -RabbitMQ::~RabbitMQ() -{ - amqp_channel_close(_conn, _channel, AMQP_REPLY_SUCCESS); - amqp_connection_close(_conn, AMQP_REPLY_SUCCESS); - amqp_destroy_connection(_conn); -} - -void RabbitMQ::init() -{ - struct timeval tval; - memset(&tval, 0, sizeof(struct timeval)); - tval.tv_sec = 5; - - fprintf(stderr, "Initializing RabbitMQ %s\n", _qName); - _conn = amqp_new_connection(); - _socket = amqp_tcp_socket_new(_conn); - if (!_socket) { - throw std::runtime_error("Can't create socket for RabbitMQ"); - } - - _status = amqp_socket_open_noblock(_socket, _mqc->host.c_str(), _mqc->port, &tval); - if (_status) { - throw std::runtime_error("Can't connect to RabbitMQ"); - } - - amqp_rpc_reply_t r = amqp_login(_conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN, - _mqc->username.c_str(), _mqc->password.c_str()); - if (r.reply_type != AMQP_RESPONSE_NORMAL) { - throw std::runtime_error("RabbitMQ Login Error"); - } - - static int chan = 0; - { - Mutex::Lock l(_chan_m); - _channel = ++chan; - } - amqp_channel_open(_conn, _channel); - r = amqp_get_rpc_reply(_conn); - if(r.reply_type != AMQP_RESPONSE_NORMAL) { - throw std::runtime_error("Error opening communication channel"); - } - - _q = amqp_queue_declare(_conn, _channel, amqp_cstring_bytes(_qName), 0, 0, 0, 0, amqp_empty_table); - r = amqp_get_rpc_reply(_conn); - if (r.reply_type != AMQP_RESPONSE_NORMAL) { - throw std::runtime_error("Error declaring queue " + std::string(_qName)); - } - - amqp_basic_consume(_conn, _channel, amqp_cstring_bytes(_qName), amqp_empty_bytes, 0, 1, 0, amqp_empty_table); - r = amqp_get_rpc_reply(_conn); - if (r.reply_type != AMQP_RESPONSE_NORMAL) { - throw std::runtime_error("Error consuming queue " + std::string(_qName)); - } - fprintf(stderr, "RabbitMQ Init OK %s\n", _qName); -} - -std::string RabbitMQ::consume() -{ - amqp_rpc_reply_t res; - amqp_envelope_t envelope; - amqp_maybe_release_buffers(_conn); - - struct timeval timeout; - timeout.tv_sec = 1; - timeout.tv_usec = 0; - - res = amqp_consume_message(_conn, &envelope, &timeout, 0); - if (res.reply_type != AMQP_RESPONSE_NORMAL) { - if (res.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION && res.library_error == AMQP_STATUS_TIMEOUT) { - // timeout waiting for message. Return empty string - return ""; - } else { - throw std::runtime_error("Error getting message"); - } - } - - std::string msg( - (const char*)envelope.message.body.bytes, - envelope.message.body.len - ); - amqp_destroy_envelope(&envelope); - return msg; -} - -} - -#endif // ZT_CONTROLLER_USE_LIBPQ diff --git a/controller/RabbitMQ.hpp b/controller/RabbitMQ.hpp deleted file mode 100644 index 4c286288e..000000000 --- a/controller/RabbitMQ.hpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c)2019 ZeroTier, Inc. - * - * Use of this software is governed by the Business Source License included - * in the LICENSE.TXT file in the project's root directory. - * - * Change Date: 2023-01-01 - * - * On the date above, in accordance with the Business Source License, use - * of this software will be governed by version 2.0 of the Apache License. - */ -/****/ - -#ifndef ZT_CONTROLLER_RABBITMQ_HPP -#define ZT_CONTROLLER_RABBITMQ_HPP - -#include "DB.hpp" -#include - -namespace ZeroTier -{ -struct MQConfig { - std::string host; - int port; - std::string username; - std::string password; -}; -} - -#ifdef ZT_CONTROLLER_USE_LIBPQ - -#include "../node/Mutex.hpp" - -#include -#include - - -namespace ZeroTier -{ - -class RabbitMQ { -public: - RabbitMQ(MQConfig *cfg, const char *queueName); - ~RabbitMQ(); - - void init(); - - std::string consume(); - -private: - MQConfig *_mqc; - const char *_qName; - - amqp_socket_t *_socket; - amqp_connection_state_t _conn; - amqp_queue_declare_ok_t *_q; - int _status; - - int _channel; - - Mutex _chan_m; -}; - -} - -#endif // ZT_CONTROLLER_USE_LIBPQ - -#endif // ZT_CONTROLLER_RABBITMQ_HPP - diff --git a/ext/librabbitmq/centos_x64/include/amqp.h b/ext/librabbitmq/centos_x64/include/amqp.h deleted file mode 100644 index 2983b1665..000000000 --- a/ext/librabbitmq/centos_x64/include/amqp.h +++ /dev/null @@ -1,2538 +0,0 @@ -/** \file */ -/* - * ***** BEGIN LICENSE BLOCK ***** - * Version: MIT - * - * Portions created by Alan Antonuk are Copyright (c) 2012-2014 - * Alan Antonuk. All Rights Reserved. - * - * 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_H -#define AMQP_H - -/** \cond HIDE_FROM_DOXYGEN */ - -#ifdef __cplusplus -#define AMQP_BEGIN_DECLS extern "C" { -#define AMQP_END_DECLS } -#else -#define AMQP_BEGIN_DECLS -#define AMQP_END_DECLS -#endif - -/* - * \internal - * Important API decorators: - * AMQP_PUBLIC_FUNCTION - a public API function - * AMQP_PUBLIC_VARIABLE - a public API external variable - * AMQP_CALL - calling convension (used on Win32) - */ - -#if defined(_WIN32) && defined(_MSC_VER) -#if defined(AMQP_BUILD) && !defined(AMQP_STATIC) -#define AMQP_PUBLIC_FUNCTION __declspec(dllexport) -#define AMQP_PUBLIC_VARIABLE __declspec(dllexport) extern -#else -#define AMQP_PUBLIC_FUNCTION -#if !defined(AMQP_STATIC) -#define AMQP_PUBLIC_VARIABLE __declspec(dllimport) extern -#else -#define AMQP_PUBLIC_VARIABLE extern -#endif -#endif -#define AMQP_CALL __cdecl - -#elif defined(_WIN32) && defined(__BORLANDC__) -#if defined(AMQP_BUILD) && !defined(AMQP_STATIC) -#define AMQP_PUBLIC_FUNCTION __declspec(dllexport) -#define AMQP_PUBLIC_VARIABLE __declspec(dllexport) extern -#else -#define AMQP_PUBLIC_FUNCTION -#if !defined(AMQP_STATIC) -#define AMQP_PUBLIC_VARIABLE __declspec(dllimport) extern -#else -#define AMQP_PUBLIC_VARIABLE extern -#endif -#endif -#define AMQP_CALL __cdecl - -#elif defined(_WIN32) && defined(__MINGW32__) -#if defined(AMQP_BUILD) && !defined(AMQP_STATIC) -#define AMQP_PUBLIC_FUNCTION __declspec(dllexport) -#define AMQP_PUBLIC_VARIABLE __declspec(dllexport) extern -#else -#define AMQP_PUBLIC_FUNCTION -#if !defined(AMQP_STATIC) -#define AMQP_PUBLIC_VARIABLE __declspec(dllimport) extern -#else -#define AMQP_PUBLIC_VARIABLE extern -#endif -#endif -#define AMQP_CALL __cdecl - -#elif defined(_WIN32) && defined(__CYGWIN__) -#if defined(AMQP_BUILD) && !defined(AMQP_STATIC) -#define AMQP_PUBLIC_FUNCTION __declspec(dllexport) -#define AMQP_PUBLIC_VARIABLE __declspec(dllexport) -#else -#define AMQP_PUBLIC_FUNCTION -#if !defined(AMQP_STATIC) -#define AMQP_PUBLIC_VARIABLE __declspec(dllimport) extern -#else -#define AMQP_PUBLIC_VARIABLE extern -#endif -#endif -#define AMQP_CALL __cdecl - -#elif defined(__GNUC__) && __GNUC__ >= 4 -#define AMQP_PUBLIC_FUNCTION __attribute__((visibility("default"))) -#define AMQP_PUBLIC_VARIABLE __attribute__((visibility("default"))) extern -#define AMQP_CALL -#else -#define AMQP_PUBLIC_FUNCTION -#define AMQP_PUBLIC_VARIABLE extern -#define AMQP_CALL -#endif - -#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) -#define AMQP_DEPRECATED(function) function __attribute__((__deprecated__)) -#elif defined(_MSC_VER) -#define AMQP_DEPRECATED(function) __declspec(deprecated) function -#else -#define AMQP_DEPRECATED(function) -#endif - -/* Define ssize_t on Win32/64 platforms - See: http://lists.cs.uiuc.edu/pipermail/llvmdev/2010-April/030649.html for - details - */ -#if !defined(_W64) -#if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -#define _W64 __w64 -#else -#define _W64 -#endif -#endif - -#ifdef _MSC_VER -#ifdef _WIN64 -typedef __int64 ssize_t; -#else -typedef _W64 int ssize_t; -#endif -#endif - -#if defined(_WIN32) && defined(__MINGW32__) -#include -#endif - -/** \endcond */ - -#include -#include - -struct timeval; - -AMQP_BEGIN_DECLS - -/** - * \def AMQP_VERSION_MAJOR - * - * Major library version number compile-time constant - * - * The major version is incremented when backwards incompatible API changes - * are made. - * - * \sa AMQP_VERSION, AMQP_VERSION_STRING - * - * \since v0.4.0 - */ - -/** - * \def AMQP_VERSION_MINOR - * - * Minor library version number compile-time constant - * - * The minor version is incremented when new APIs are added. Existing APIs - * are left alone. - * - * \sa AMQP_VERSION, AMQP_VERSION_STRING - * - * \since v0.4.0 - */ - -/** - * \def AMQP_VERSION_PATCH - * - * Patch library version number compile-time constant - * - * The patch version is incremented when library code changes, but the API - * is not changed. - * - * \sa AMQP_VERSION, AMQP_VERSION_STRING - * - * \since v0.4.0 - */ - -/** - * \def AMQP_VERSION_IS_RELEASE - * - * Version constant set to 1 for tagged release, 0 otherwise - * - * NOTE: versions that are not tagged releases are not guaranteed to be API/ABI - * compatible with older releases, and may change commit-to-commit. - * - * \sa AMQP_VERSION, AMQP_VERSION_STRING - * - * \since v0.4.0 - */ -/* - * Developer note: when changing these, be sure to update SOVERSION constants - * in CMakeLists.txt and configure.ac - */ - -#define AMQP_VERSION_MAJOR 0 -#define AMQP_VERSION_MINOR 10 -#define AMQP_VERSION_PATCH 0 -#define AMQP_VERSION_IS_RELEASE 0 - -/** - * \def AMQP_VERSION_CODE - * - * Helper macro to geneate a packed version code suitable for - * comparison with AMQP_VERSION. - * - * \sa amqp_version_number() AMQP_VERSION_MAJOR, AMQP_VERSION_MINOR, - * AMQP_VERSION_PATCH, AMQP_VERSION_IS_RELEASE, AMQP_VERSION - * - * \since v0.6.1 - */ -#define AMQP_VERSION_CODE(major, minor, patch, release) \ - ((major << 24) | (minor << 16) | (patch << 8) | (release)) - -/** - * \def AMQP_VERSION - * - * Packed version number - * - * AMQP_VERSION is a 4-byte unsigned integer with the most significant byte - * set to AMQP_VERSION_MAJOR, the second most significant byte set to - * AMQP_VERSION_MINOR, third most significant byte set to AMQP_VERSION_PATCH, - * and the lowest byte set to AMQP_VERSION_IS_RELEASE. - * - * For example version 2.3.4 which is released version would be encoded as - * 0x02030401 - * - * \sa amqp_version_number() AMQP_VERSION_MAJOR, AMQP_VERSION_MINOR, - * AMQP_VERSION_PATCH, AMQP_VERSION_IS_RELEASE, AMQP_VERSION_CODE - * - * \since v0.4.0 - */ -#define AMQP_VERSION \ - AMQP_VERSION_CODE(AMQP_VERSION_MAJOR, AMQP_VERSION_MINOR, \ - AMQP_VERSION_PATCH, AMQP_VERSION_IS_RELEASE) - -/** \cond HIDE_FROM_DOXYGEN */ -#define AMQ_STRINGIFY(s) AMQ_STRINGIFY_HELPER(s) -#define AMQ_STRINGIFY_HELPER(s) #s - -#define AMQ_VERSION_STRING \ - AMQ_STRINGIFY(AMQP_VERSION_MAJOR) \ - "." AMQ_STRINGIFY(AMQP_VERSION_MINOR) "." AMQ_STRINGIFY(AMQP_VERSION_PATCH) -/** \endcond */ - -/** - * \def AMQP_VERSION_STRING - * - * Version string compile-time constant - * - * Non-released versions of the library will have "-pre" appended to the - * version string - * - * \sa amqp_version() - * - * \since v0.4.0 - */ -#if AMQP_VERSION_IS_RELEASE -#define AMQP_VERSION_STRING AMQ_VERSION_STRING -#else -#define AMQP_VERSION_STRING AMQ_VERSION_STRING "-pre" -#endif - -/** - * Returns the rabbitmq-c version as a packed integer. - * - * See \ref AMQP_VERSION - * - * \return packed 32-bit integer representing version of library at runtime - * - * \sa AMQP_VERSION, amqp_version() - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -uint32_t AMQP_CALL amqp_version_number(void); - -/** - * Returns the rabbitmq-c version as a string. - * - * See \ref AMQP_VERSION_STRING - * - * \return a statically allocated string describing the version of rabbitmq-c. - * - * \sa amqp_version_number(), AMQP_VERSION_STRING, AMQP_VERSION - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -char const *AMQP_CALL amqp_version(void); - -/** - * \def AMQP_DEFAULT_FRAME_SIZE - * - * Default frame size (128Kb) - * - * \sa amqp_login(), amqp_login_with_properties() - * - * \since v0.4.0 - */ -#define AMQP_DEFAULT_FRAME_SIZE 131072 - -/** - * \def AMQP_DEFAULT_MAX_CHANNELS - * - * Default maximum number of channels (2047, RabbitMQ default limit of 2048, - * minus 1 for channel 0). RabbitMQ set a default limit of 2048 channels per - * connection in v3.7.5 to prevent broken clients from leaking too many - * channels. - * - * \sa amqp_login(), amqp_login_with_properties() - * - * \since v0.4.0 - */ -#define AMQP_DEFAULT_MAX_CHANNELS 2047 - -/** - * \def AMQP_DEFAULT_HEARTBEAT - * - * Default heartbeat interval (0, heartbeat disabled) - * - * \sa amqp_login(), amqp_login_with_properties() - * - * \since v0.4.0 - */ -#define AMQP_DEFAULT_HEARTBEAT 0 - -/** - * \def AMQP_DEFAULT_VHOST - * - * Default RabbitMQ vhost: "/" - * - * \sa amqp_login(), amqp_login_with_properties() - * - * \since v0.9.0 - */ -#define AMQP_DEFAULT_VHOST "/" - -/** - * boolean type 0 = false, true otherwise - * - * \since v0.1 - */ -typedef int amqp_boolean_t; - -/** - * Method number - * - * \since v0.1 - */ -typedef uint32_t amqp_method_number_t; - -/** - * Bitmask for flags - * - * \since v0.1 - */ -typedef uint32_t amqp_flags_t; - -/** - * Channel type - * - * \since v0.1 - */ -typedef uint16_t amqp_channel_t; - -/** - * Buffer descriptor - * - * \since v0.1 - */ -typedef struct amqp_bytes_t_ { - size_t len; /**< length of the buffer in bytes */ - void *bytes; /**< pointer to the beginning of the buffer */ -} amqp_bytes_t; - -/** - * Decimal data type - * - * \since v0.1 - */ -typedef struct amqp_decimal_t_ { - uint8_t decimals; /**< the location of the decimal point */ - uint32_t value; /**< the value before the decimal point is applied */ -} amqp_decimal_t; - -/** - * AMQP field table - * - * An AMQP field table is a set of key-value pairs. - * A key is a UTF-8 encoded string up to 128 bytes long, and are not null - * terminated. - * A value can be one of several different datatypes. \sa - * amqp_field_value_kind_t - * - * \sa amqp_table_entry_t - * - * \since v0.1 - */ -typedef struct amqp_table_t_ { - int num_entries; /**< length of entries array */ - struct amqp_table_entry_t_ *entries; /**< an array of table entries */ -} amqp_table_t; - -/** - * An AMQP Field Array - * - * A repeated set of field values, all must be of the same type - * - * \since v0.1 - */ -typedef struct amqp_array_t_ { - int num_entries; /**< Number of entries in the table */ - struct amqp_field_value_t_ *entries; /**< linked list of field values */ -} amqp_array_t; - -/* - 0-9 0-9-1 Qpid/Rabbit Type Remarks ---------------------------------------------------------------------------- - t t Boolean - b b Signed 8-bit - B Unsigned 8-bit - U s Signed 16-bit (A1) - u Unsigned 16-bit - I I I Signed 32-bit - i Unsigned 32-bit - L l Signed 64-bit (B) - l Unsigned 64-bit - f f 32-bit float - d d 64-bit float - D D D Decimal - s Short string (A2) - S S S Long string - A Nested Array - T T T Timestamp (u64) - F F F Nested Table - V V V Void - x Byte array - -Remarks: - - A1, A2: Notice how the types **CONFLICT** here. In Qpid and Rabbit, - 's' means a signed 16-bit integer; in 0-9-1, it means a - short string. - - B: Notice how the signednesses **CONFLICT** here. In Qpid and Rabbit, - 'l' means a signed 64-bit integer; in 0-9-1, it means an unsigned - 64-bit integer. - -I'm going with the Qpid/Rabbit types, where there's a conflict, and -the 0-9-1 types otherwise. 0-8 is a subset of 0-9, which is a subset -of the other two, so this will work for both 0-8 and 0-9-1 branches of -the code. -*/ - -/** - * A field table value - * - * \since v0.1 - */ -typedef struct amqp_field_value_t_ { - uint8_t kind; /**< the type of the entry /sa amqp_field_value_kind_t */ - union { - amqp_boolean_t boolean; /**< boolean type AMQP_FIELD_KIND_BOOLEAN */ - int8_t i8; /**< int8_t type AMQP_FIELD_KIND_I8 */ - uint8_t u8; /**< uint8_t type AMQP_FIELD_KIND_U8 */ - int16_t i16; /**< int16_t type AMQP_FIELD_KIND_I16 */ - uint16_t u16; /**< uint16_t type AMQP_FIELD_KIND_U16 */ - int32_t i32; /**< int32_t type AMQP_FIELD_KIND_I32 */ - uint32_t u32; /**< uint32_t type AMQP_FIELD_KIND_U32 */ - int64_t i64; /**< int64_t type AMQP_FIELD_KIND_I64 */ - uint64_t u64; /**< uint64_t type AMQP_FIELD_KIND_U64, - AMQP_FIELD_KIND_TIMESTAMP */ - float f32; /**< float type AMQP_FIELD_KIND_F32 */ - double f64; /**< double type AMQP_FIELD_KIND_F64 */ - amqp_decimal_t decimal; /**< amqp_decimal_t AMQP_FIELD_KIND_DECIMAL */ - amqp_bytes_t bytes; /**< amqp_bytes_t type AMQP_FIELD_KIND_UTF8, - AMQP_FIELD_KIND_BYTES */ - amqp_table_t table; /**< amqp_table_t type AMQP_FIELD_KIND_TABLE */ - amqp_array_t array; /**< amqp_array_t type AMQP_FIELD_KIND_ARRAY */ - } value; /**< a union of the value */ -} amqp_field_value_t; - -/** - * An entry in a field-table - * - * \sa amqp_table_encode(), amqp_table_decode(), amqp_table_clone() - * - * \since v0.1 - */ -typedef struct amqp_table_entry_t_ { - amqp_bytes_t key; /**< the table entry key. Its a null-terminated UTF-8 - * string, with a maximum size of 128 bytes */ - amqp_field_value_t value; /**< the table entry values */ -} amqp_table_entry_t; - -/** - * Field value types - * - * \since v0.1 - */ -typedef enum { - AMQP_FIELD_KIND_BOOLEAN = - 't', /**< boolean type. 0 = false, 1 = true @see amqp_boolean_t */ - AMQP_FIELD_KIND_I8 = 'b', /**< 8-bit signed integer, datatype: int8_t */ - AMQP_FIELD_KIND_U8 = 'B', /**< 8-bit unsigned integer, datatype: uint8_t */ - AMQP_FIELD_KIND_I16 = 's', /**< 16-bit signed integer, datatype: int16_t */ - AMQP_FIELD_KIND_U16 = 'u', /**< 16-bit unsigned integer, datatype: uint16_t */ - AMQP_FIELD_KIND_I32 = 'I', /**< 32-bit signed integer, datatype: int32_t */ - AMQP_FIELD_KIND_U32 = 'i', /**< 32-bit unsigned integer, datatype: uint32_t */ - AMQP_FIELD_KIND_I64 = 'l', /**< 64-bit signed integer, datatype: int64_t */ - AMQP_FIELD_KIND_U64 = 'L', /**< 64-bit unsigned integer, datatype: uint64_t */ - AMQP_FIELD_KIND_F32 = - 'f', /**< single-precision floating point value, datatype: float */ - AMQP_FIELD_KIND_F64 = - 'd', /**< double-precision floating point value, datatype: double */ - AMQP_FIELD_KIND_DECIMAL = - 'D', /**< amqp-decimal value, datatype: amqp_decimal_t */ - AMQP_FIELD_KIND_UTF8 = 'S', /**< UTF-8 null-terminated character string, - datatype: amqp_bytes_t */ - AMQP_FIELD_KIND_ARRAY = 'A', /**< field array (repeated values of another - datatype. datatype: amqp_array_t */ - AMQP_FIELD_KIND_TIMESTAMP = 'T', /**< 64-bit timestamp. datatype uint64_t */ - AMQP_FIELD_KIND_TABLE = 'F', /**< field table. encapsulates a table inside a - table entry. datatype: amqp_table_t */ - AMQP_FIELD_KIND_VOID = 'V', /**< empty entry */ - AMQP_FIELD_KIND_BYTES = - 'x' /**< unformatted byte string, datatype: amqp_bytes_t */ -} amqp_field_value_kind_t; - -/** - * A list of allocation blocks - * - * \since v0.1 - */ -typedef struct amqp_pool_blocklist_t_ { - int num_blocks; /**< Number of blocks in the block list */ - void **blocklist; /**< Array of memory blocks */ -} amqp_pool_blocklist_t; - -/** - * A memory pool - * - * \since v0.1 - */ -typedef struct amqp_pool_t_ { - size_t pagesize; /**< the size of the page in bytes. Allocations less than or - * equal to this size are allocated in the pages block list. - * Allocations greater than this are allocated in their own - * own block in the large_blocks block list */ - - amqp_pool_blocklist_t pages; /**< blocks that are the size of pagesize */ - amqp_pool_blocklist_t - large_blocks; /**< allocations larger than the pagesize */ - - int next_page; /**< an index to the next unused page block */ - char *alloc_block; /**< pointer to the current allocation block */ - size_t alloc_used; /**< number of bytes in the current allocation block that - has been used */ -} amqp_pool_t; - -/** - * An amqp method - * - * \since v0.1 - */ -typedef struct amqp_method_t_ { - amqp_method_number_t id; /**< the method id number */ - void *decoded; /**< pointer to the decoded method, - * cast to the appropriate type to use */ -} amqp_method_t; - -/** - * An AMQP frame - * - * \since v0.1 - */ -typedef struct amqp_frame_t_ { - uint8_t frame_type; /**< frame type. The types: - * - AMQP_FRAME_METHOD - use the method union member - * - AMQP_FRAME_HEADER - use the properties union member - * - AMQP_FRAME_BODY - use the body_fragment union member - */ - amqp_channel_t channel; /**< the channel the frame was received on */ - union { - amqp_method_t - method; /**< a method, use if frame_type == AMQP_FRAME_METHOD */ - struct { - uint16_t class_id; /**< the class for the properties */ - uint64_t body_size; /**< size of the body in bytes */ - void *decoded; /**< the decoded properties */ - amqp_bytes_t raw; /**< amqp-encoded properties structure */ - } properties; /**< message header, a.k.a., properties, - use if frame_type == AMQP_FRAME_HEADER */ - amqp_bytes_t body_fragment; /**< a body fragment, use if frame_type == - AMQP_FRAME_BODY */ - struct { - uint8_t transport_high; /**< @internal first byte of handshake */ - uint8_t transport_low; /**< @internal second byte of handshake */ - uint8_t protocol_version_major; /**< @internal third byte of handshake */ - uint8_t protocol_version_minor; /**< @internal fourth byte of handshake */ - } protocol_header; /**< Used only when doing the initial handshake with the - broker, don't use otherwise */ - } payload; /**< the payload of the frame */ -} amqp_frame_t; - -/** - * Response type - * - * \since v0.1 - */ -typedef enum amqp_response_type_enum_ { - AMQP_RESPONSE_NONE = 0, /**< the library got an EOF from the socket */ - AMQP_RESPONSE_NORMAL, /**< response normal, the RPC completed successfully */ - AMQP_RESPONSE_LIBRARY_EXCEPTION, /**< library error, an error occurred in the - library, examine the library_error */ - AMQP_RESPONSE_SERVER_EXCEPTION /**< server exception, the broker returned an - error, check replay */ -} amqp_response_type_enum; - -/** - * Reply from a RPC method on the broker - * - * \since v0.1 - */ -typedef struct amqp_rpc_reply_t_ { - amqp_response_type_enum reply_type; /**< the reply type: - * - AMQP_RESPONSE_NORMAL - the RPC - * completed successfully - * - AMQP_RESPONSE_SERVER_EXCEPTION - the - * broker returned - * an exception, check the reply field - * - AMQP_RESPONSE_LIBRARY_EXCEPTION - the - * library - * encountered an error, check the - * library_error field - */ - amqp_method_t reply; /**< in case of AMQP_RESPONSE_SERVER_EXCEPTION this - * field will be set to the method returned from the - * broker */ - int library_error; /**< in case of AMQP_RESPONSE_LIBRARY_EXCEPTION this - * field will be set to an error code. An error - * string can be retrieved using amqp_error_string */ -} amqp_rpc_reply_t; - -/** - * SASL method type - * - * \since v0.1 - */ -typedef enum amqp_sasl_method_enum_ { - AMQP_SASL_METHOD_UNDEFINED = -1, /**< Invalid SASL method */ - AMQP_SASL_METHOD_PLAIN = - 0, /**< the PLAIN SASL method for authentication to the broker */ - AMQP_SASL_METHOD_EXTERNAL = - 1 /**< the EXTERNAL SASL method for authentication to the broker */ -} amqp_sasl_method_enum; - -/** - * connection state object - * - * \since v0.1 - */ -typedef struct amqp_connection_state_t_ *amqp_connection_state_t; - -/** - * Socket object - * - * \since v0.4.0 - */ -typedef struct amqp_socket_t_ amqp_socket_t; - -/** - * Status codes - * - * \since v0.4.0 - */ -/* NOTE: When updating this enum, update the strings in librabbitmq/amqp_api.c - */ -typedef enum amqp_status_enum_ { - AMQP_STATUS_OK = 0x0, /**< Operation successful */ - AMQP_STATUS_NO_MEMORY = -0x0001, /**< Memory allocation - failed */ - AMQP_STATUS_BAD_AMQP_DATA = -0x0002, /**< Incorrect or corrupt - data was received from - the broker. This is a - protocol error. */ - AMQP_STATUS_UNKNOWN_CLASS = -0x0003, /**< An unknown AMQP class - was received. This is - a protocol error. */ - AMQP_STATUS_UNKNOWN_METHOD = -0x0004, /**< An unknown AMQP method - was received. This is - a protocol error. */ - AMQP_STATUS_HOSTNAME_RESOLUTION_FAILED = -0x0005, /**< Unable to resolve the - * hostname */ - AMQP_STATUS_INCOMPATIBLE_AMQP_VERSION = -0x0006, /**< The broker advertised - an incompaible AMQP - version */ - AMQP_STATUS_CONNECTION_CLOSED = -0x0007, /**< The connection to the - broker has been closed - */ - AMQP_STATUS_BAD_URL = -0x0008, /**< malformed AMQP URL */ - AMQP_STATUS_SOCKET_ERROR = -0x0009, /**< A socket error - occurred */ - AMQP_STATUS_INVALID_PARAMETER = -0x000A, /**< An invalid parameter - was passed into the - function */ - AMQP_STATUS_TABLE_TOO_BIG = -0x000B, /**< The amqp_table_t object - cannot be serialized - because the output - buffer is too small */ - AMQP_STATUS_WRONG_METHOD = -0x000C, /**< The wrong method was - received */ - AMQP_STATUS_TIMEOUT = -0x000D, /**< Operation timed out */ - AMQP_STATUS_TIMER_FAILURE = -0x000E, /**< The underlying system - timer facility failed */ - AMQP_STATUS_HEARTBEAT_TIMEOUT = -0x000F, /**< Timed out waiting for - heartbeat */ - AMQP_STATUS_UNEXPECTED_STATE = -0x0010, /**< Unexpected protocol - state */ - AMQP_STATUS_SOCKET_CLOSED = -0x0011, /**< Underlying socket is - closed */ - AMQP_STATUS_SOCKET_INUSE = -0x0012, /**< Underlying socket is - already open */ - AMQP_STATUS_BROKER_UNSUPPORTED_SASL_METHOD = -0x0013, /**< Broker does not - support the requested - SASL mechanism */ - AMQP_STATUS_UNSUPPORTED = -0x0014, /**< Parameter is unsupported - in this version */ - _AMQP_STATUS_NEXT_VALUE = -0x0015, /**< Internal value */ - - AMQP_STATUS_TCP_ERROR = -0x0100, /**< A generic TCP error - occurred */ - AMQP_STATUS_TCP_SOCKETLIB_INIT_ERROR = -0x0101, /**< An error occurred trying - to initialize the - socket library*/ - _AMQP_STATUS_TCP_NEXT_VALUE = -0x0102, /**< Internal value */ - - AMQP_STATUS_SSL_ERROR = -0x0200, /**< A generic SSL error - occurred. */ - AMQP_STATUS_SSL_HOSTNAME_VERIFY_FAILED = -0x0201, /**< SSL validation of - hostname against - peer certificate - failed */ - AMQP_STATUS_SSL_PEER_VERIFY_FAILED = -0x0202, /**< SSL validation of peer - certificate failed. */ - AMQP_STATUS_SSL_CONNECTION_FAILED = -0x0203, /**< SSL handshake failed. */ - _AMQP_STATUS_SSL_NEXT_VALUE = -0x0204 /**< Internal value */ -} amqp_status_enum; - -/** - * AMQP delivery modes. - * Use these values for the #amqp_basic_properties_t::delivery_mode field. - * - * \since v0.5 - */ -typedef enum { - AMQP_DELIVERY_NONPERSISTENT = 1, /**< Non-persistent message */ - AMQP_DELIVERY_PERSISTENT = 2 /**< Persistent message */ -} amqp_delivery_mode_enum; - -AMQP_END_DECLS - -#include - -AMQP_BEGIN_DECLS - -/** - * Empty bytes structure - * - * \since v0.2 - */ -AMQP_PUBLIC_VARIABLE const amqp_bytes_t amqp_empty_bytes; - -/** - * Empty table structure - * - * \since v0.2 - */ -AMQP_PUBLIC_VARIABLE const amqp_table_t amqp_empty_table; - -/** - * Empty table array structure - * - * \since v0.2 - */ -AMQP_PUBLIC_VARIABLE const amqp_array_t amqp_empty_array; - -/* Compatibility macros for the above, to avoid the need to update - code written against earlier versions of librabbitmq. */ - -/** - * \def AMQP_EMPTY_BYTES - * - * Deprecated, use \ref amqp_empty_bytes instead - * - * \deprecated use \ref amqp_empty_bytes instead - * - * \since v0.1 - */ -#define AMQP_EMPTY_BYTES amqp_empty_bytes - -/** - * \def AMQP_EMPTY_TABLE - * - * Deprecated, use \ref amqp_empty_table instead - * - * \deprecated use \ref amqp_empty_table instead - * - * \since v0.1 - */ -#define AMQP_EMPTY_TABLE amqp_empty_table - -/** - * \def AMQP_EMPTY_ARRAY - * - * Deprecated, use \ref amqp_empty_array instead - * - * \deprecated use \ref amqp_empty_array instead - * - * \since v0.1 - */ -#define AMQP_EMPTY_ARRAY amqp_empty_array - -/** - * Initializes an amqp_pool_t memory allocation pool for use - * - * Readies an allocation pool for use. An amqp_pool_t - * must be initialized before use - * - * \param [in] pool the amqp_pool_t structure to initialize. - * Calling this function on a pool a pool that has - * already been initialized will result in undefined - * behavior - * \param [in] pagesize the unit size that the pool will allocate - * memory chunks in. Anything allocated against the pool - * with a requested size will be carved out of a block - * this size. Allocations larger than this will be - * allocated individually - * - * \sa recycle_amqp_pool(), empty_amqp_pool(), amqp_pool_alloc(), - * amqp_pool_alloc_bytes(), amqp_pool_t - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL init_amqp_pool(amqp_pool_t *pool, size_t pagesize); - -/** - * Recycles an amqp_pool_t memory allocation pool - * - * Recycles the space allocate by the pool - * - * This invalidates all allocations made against the pool before this call is - * made, any use of any allocations made before recycle_amqp_pool() is called - * will result in undefined behavior. - * - * Note: this may or may not release memory, to force memory to be released - * call empty_amqp_pool(). - * - * \param [in] pool the amqp_pool_t to recycle - * - * \sa recycle_amqp_pool(), empty_amqp_pool(), amqp_pool_alloc(), - * amqp_pool_alloc_bytes() - * - * \since v0.1 - * - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL recycle_amqp_pool(amqp_pool_t *pool); - -/** - * Empties an amqp memory pool - * - * Releases all memory associated with an allocation pool - * - * \param [in] pool the amqp_pool_t to empty - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL empty_amqp_pool(amqp_pool_t *pool); - -/** - * Allocates a block of memory from an amqp_pool_t memory pool - * - * Memory will be aligned on a 8-byte boundary. If a 0-length allocation is - * requested, a NULL pointer will be returned. - * - * \param [in] pool the allocation pool to allocate the memory from - * \param [in] amount the size of the allocation in bytes. - * \return a pointer to the memory block, or NULL if the allocation cannot - * be satisfied. - * - * \sa init_amqp_pool(), recycle_amqp_pool(), empty_amqp_pool(), - * amqp_pool_alloc_bytes() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -void *AMQP_CALL amqp_pool_alloc(amqp_pool_t *pool, size_t amount); - -/** - * Allocates a block of memory from an amqp_pool_t to an amqp_bytes_t - * - * Memory will be aligned on a 8-byte boundary. If a 0-length allocation is - * requested, output.bytes = NULL. - * - * \param [in] pool the allocation pool to allocate the memory from - * \param [in] amount the size of the allocation in bytes - * \param [in] output the location to store the pointer. On success - * output.bytes will be set to the beginning of the buffer - * output.len will be set to amount - * On error output.bytes will be set to NULL and output.len - * set to 0 - * - * \sa init_amqp_pool(), recycle_amqp_pool(), empty_amqp_pool(), - * amqp_pool_alloc() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL amqp_pool_alloc_bytes(amqp_pool_t *pool, size_t amount, - amqp_bytes_t *output); - -/** - * Wraps a c string in an amqp_bytes_t - * - * Takes a string, calculates its length and creates an - * amqp_bytes_t that points to it. The string is not duplicated. - * - * For a given input cstr, The amqp_bytes_t output.bytes is the - * same as cstr, output.len is the length of the string not including - * the \0 terminator - * - * This function uses strlen() internally so cstr must be properly - * terminated - * - * \param [in] cstr the c string to wrap - * \return an amqp_bytes_t that describes the string - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_bytes_t AMQP_CALL amqp_cstring_bytes(char const *cstr); - -/** - * Duplicates an amqp_bytes_t buffer. - * - * The buffer is cloned and the contents copied. - * - * The memory associated with the output is allocated - * with amqp_bytes_malloc() and should be freed with - * amqp_bytes_free() - * - * \param [in] src - * \return a clone of the src - * - * \sa amqp_bytes_free(), amqp_bytes_malloc() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_bytes_t AMQP_CALL amqp_bytes_malloc_dup(amqp_bytes_t src); - -/** - * Allocates a amqp_bytes_t buffer - * - * Creates an amqp_bytes_t buffer of the specified amount, the buffer should be - * freed using amqp_bytes_free() - * - * \param [in] amount the size of the buffer in bytes - * \returns an amqp_bytes_t with amount bytes allocated. - * output.bytes will be set to NULL on error - * - * \sa amqp_bytes_free(), amqp_bytes_malloc_dup() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_bytes_t AMQP_CALL amqp_bytes_malloc(size_t amount); - -/** - * Frees an amqp_bytes_t buffer - * - * Frees a buffer allocated with amqp_bytes_malloc() or amqp_bytes_malloc_dup() - * - * Calling amqp_bytes_free on buffers not allocated with one - * of those two functions will result in undefined behavior - * - * \param [in] bytes the buffer to free - * - * \sa amqp_bytes_malloc(), amqp_bytes_malloc_dup() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL amqp_bytes_free(amqp_bytes_t bytes); - -/** - * Allocate and initialize a new amqp_connection_state_t object - * - * amqp_connection_state_t objects created with this function - * should be freed with amqp_destroy_connection() - * - * \returns an opaque pointer on success, NULL or 0 on failure. - * - * \sa amqp_destroy_connection() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_connection_state_t AMQP_CALL amqp_new_connection(void); - -/** - * Get the underlying socket descriptor for the connection - * - * \warning Use the socket returned from this function carefully, incorrect use - * of the socket outside of the library will lead to undefined behavior. - * Additionally rabbitmq-c may use the socket differently version-to-version, - * what may work in one version, may break in the next version. Be sure to - * throughly test any applications that use the socket returned by this - * function especially when using a newer version of rabbitmq-c - * - * \param [in] state the connection object - * \returns the socket descriptor if one has been set, -1 otherwise - * - * \sa amqp_tcp_socket_new(), amqp_ssl_socket_new(), amqp_socket_open() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_get_sockfd(amqp_connection_state_t state); - -/** - * Deprecated, use amqp_tcp_socket_new() or amqp_ssl_socket_new() - * - * \deprecated Use amqp_tcp_socket_new() or amqp_ssl_socket_new() - * - * Sets the socket descriptor associated with the connection. The socket - * should be connected to a broker, and should not be read to or written from - * before calling this function. A socket descriptor can be created and opened - * using amqp_open_socket() - * - * \param [in] state the connection object - * \param [in] sockfd the socket - * - * \sa amqp_open_socket(), amqp_tcp_socket_new(), amqp_ssl_socket_new() - * - * \since v0.1 - */ -AMQP_DEPRECATED(AMQP_PUBLIC_FUNCTION void AMQP_CALL - amqp_set_sockfd(amqp_connection_state_t state, int sockfd)); - -/** - * Tune client side parameters - * - * \warning This function may call abort() if the connection is in a certain - * state. As such it should probably not be called code outside the library. - * connection parameters should be specified when calling amqp_login() or - * amqp_login_with_properties() - * - * This function changes channel_max, frame_max, and heartbeat parameters, on - * the client side only. It does not try to renegotiate these parameters with - * the broker. Using this function will lead to unexpected results. - * - * \param [in] state the connection object - * \param [in] channel_max the maximum number of channels. - * The largest this can be is 65535 - * \param [in] frame_max the maximum size of an frame. - * The smallest this can be is 4096 - * The largest this can be is 2147483647 - * Unless you know what you're doing the recommended - * size is 131072 or 128KB - * \param [in] heartbeat the number of seconds between heartbeats - * - * \return AMQP_STATUS_OK on success, an amqp_status_enum value otherwise. - * Possible error codes include: - * - AMQP_STATUS_NO_MEMORY memory allocation failed. - * - AMQP_STATUS_TIMER_FAILURE the underlying system timer indicated it - * failed. - * - * \sa amqp_login(), amqp_login_with_properties() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_tune_connection(amqp_connection_state_t state, - int channel_max, int frame_max, - int heartbeat); - -/** - * Get the maximum number of channels the connection can handle - * - * The maximum number of channels is set when connection negotiation takes - * place in amqp_login() or amqp_login_with_properties(). - * - * \param [in] state the connection object - * \return the maximum number of channels. 0 if there is no limit - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_get_channel_max(amqp_connection_state_t state); - -/** - * Get the maximum size of an frame the connection can handle - * - * The maximum size of an frame is set when connection negotiation takes - * place in amqp_login() or amqp_login_with_properties(). - * - * \param [in] state the connection object - * \return the maximum size of an frame. - * - * \since v0.6 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_get_frame_max(amqp_connection_state_t state); - -/** - * Get the number of seconds between heartbeats of the connection - * - * The number of seconds between heartbeats is set when connection - * negotiation takes place in amqp_login() or amqp_login_with_properties(). - * - * \param [in] state the connection object - * \return the number of seconds between heartbeats. - * - * \since v0.6 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_get_heartbeat(amqp_connection_state_t state); - -/** - * Destroys an amqp_connection_state_t object - * - * Destroys a amqp_connection_state_t object that was created with - * amqp_new_connection(). If the connection with the broker is open, it will be - * implicitly closed with a reply code of 200 (success). Any memory that - * would be freed with amqp_maybe_release_buffers() or - * amqp_maybe_release_buffers_on_channel() will be freed, and use of that - * memory will caused undefined behavior. - * - * \param [in] state the connection object - * \return AMQP_STATUS_OK on success. amqp_status_enum value failure - * - * \sa amqp_new_connection() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_destroy_connection(amqp_connection_state_t state); - -/** - * Process incoming data - * - * \warning This is a low-level function intended for those who want to - * have greater control over input and output over the socket from the - * broker. Correctly using this function requires in-depth knowledge of AMQP - * and rabbitmq-c. - * - * For a given buffer of data received from the broker, decode the first - * frame in the buffer. If more than one frame is contained in the input buffer - * the return value will be less than the received_data size, the caller should - * adjust received_data buffer descriptor to point to the beginning of the - * buffer + the return value. - * - * \param [in] state the connection object - * \param [in] received_data a buffer of data received from the broker. The - * function will return the number of bytes of the buffer it used. The - * function copies these bytes to an internal buffer: this part of the buffer - * may be reused after this function successfully completes. - * \param [in,out] decoded_frame caller should pass in a pointer to an - * amqp_frame_t struct. If there is enough data in received_data for a - * complete frame, decoded_frame->frame_type will be set to something OTHER - * than 0. decoded_frame may contain members pointing to memory owned by - * the state object. This memory can be recycled with - * amqp_maybe_release_buffers() or amqp_maybe_release_buffers_on_channel(). - * \return number of bytes consumed from received_data or 0 if a 0-length - * buffer was passed. A negative return value indicates failure. Possible - * errors: - * - AMQP_STATUS_NO_MEMORY failure in allocating memory. The library is likely - * in an indeterminate state making recovery unlikely. Client should note the - * error and terminate the application - * - AMQP_STATUS_BAD_AMQP_DATA bad AMQP data was received. The connection - * should be shutdown immediately - * - AMQP_STATUS_UNKNOWN_METHOD: an unknown method was received from the - * broker. This is likely a protocol error and the connection should be - * shutdown immediately - * - AMQP_STATUS_UNKNOWN_CLASS: a properties frame with an unknown class - * was received from the broker. This is likely a protocol error and the - * connection should be shutdown immediately - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_handle_input(amqp_connection_state_t state, - amqp_bytes_t received_data, - amqp_frame_t *decoded_frame); - -/** - * Check to see if connection memory can be released - * - * \deprecated This function is deprecated in favor of - * amqp_maybe_release_buffers() or amqp_maybe_release_buffers_on_channel() - * - * Checks the state of an amqp_connection_state_t object to see if - * amqp_release_buffers() can be called successfully. - * - * \param [in] state the connection object - * \returns TRUE if the buffers can be released FALSE otherwise - * - * \sa amqp_release_buffers() amqp_maybe_release_buffers() - * amqp_maybe_release_buffers_on_channel() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_boolean_t AMQP_CALL amqp_release_buffers_ok(amqp_connection_state_t state); - -/** - * Release amqp_connection_state_t owned memory - * - * \deprecated This function is deprecated in favor of - * amqp_maybe_release_buffers() or amqp_maybe_release_buffers_on_channel() - * - * \warning caller should ensure amqp_release_buffers_ok() returns true before - * calling this function. Failure to do so may result in abort() being called. - * - * Release memory owned by the amqp_connection_state_t for reuse by the - * library. Use of any memory returned by the library before this function is - * called will result in undefined behavior. - * - * \note internally rabbitmq-c tries to reuse memory when possible. As a result - * its possible calling this function may not have a noticeable effect on - * memory usage. - * - * \param [in] state the connection object - * - * \sa amqp_release_buffers_ok() amqp_maybe_release_buffers() - * amqp_maybe_release_buffers_on_channel() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL amqp_release_buffers(amqp_connection_state_t state); - -/** - * Release amqp_connection_state_t owned memory - * - * Release memory owned by the amqp_connection_state_t object related to any - * channel, allowing reuse by the library. Use of any memory returned by the - * library before this function is called with result in undefined behavior. - * - * \note internally rabbitmq-c tries to reuse memory when possible. As a result - * its possible calling this function may not have a noticeable effect on - * memory usage. - * - * \param [in] state the connection object - * - * \sa amqp_maybe_release_buffers_on_channel() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL amqp_maybe_release_buffers(amqp_connection_state_t state); - -/** - * Release amqp_connection_state_t owned memory related to a channel - * - * Release memory owned by the amqp_connection_state_t object related to the - * specified channel, allowing reuse by the library. Use of any memory returned - * the library for a specific channel will result in undefined behavior. - * - * \note internally rabbitmq-c tries to reuse memory when possible. As a result - * its possible calling this function may not have a noticeable effect on - * memory usage. - * - * \param [in] state the connection object - * \param [in] channel the channel specifier for which memory should be - * released. Note that the library does not care about the state of the - * channel when calling this function - * - * \sa amqp_maybe_release_buffers() - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL amqp_maybe_release_buffers_on_channel( - amqp_connection_state_t state, amqp_channel_t channel); - -/** - * Send a frame to the broker - * - * \param [in] state the connection object - * \param [in] frame the frame to send to the broker - * \return AMQP_STATUS_OK on success, an amqp_status_enum value on error. - * Possible error codes: - * - AMQP_STATUS_BAD_AMQP_DATA the serialized form of the method or - * properties was too large to fit in a single AMQP frame, or the - * method contains an invalid value. The frame was not sent. - * - AMQP_STATUS_TABLE_TOO_BIG the serialized form of an amqp_table_t is - * too large to fit in a single AMQP frame. Frame was not sent. - * - AMQP_STATUS_UNKNOWN_METHOD an invalid method type was passed in - * - AMQP_STATUS_UNKNOWN_CLASS an invalid properties type was passed in - * - AMQP_STATUS_TIMER_FAILURE system timer indicated failure. The frame - * was sent - * - AMQP_STATUS_SOCKET_ERROR - * - AMQP_STATUS_SSL_ERROR - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_send_frame(amqp_connection_state_t state, - amqp_frame_t const *frame); - -/** - * Compare two table entries - * - * Works just like strcmp(), comparing two the table keys, datatype, then values - * - * \param [in] entry1 the entry on the left - * \param [in] entry2 the entry on the right - * \return 0 if entries are equal, 0 < if left is greater, 0 > if right is - * greater - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_table_entry_cmp(void const *entry1, void const *entry2); - -/** - * Open a socket to a remote host - * - * \deprecated This function is deprecated in favor of amqp_socket_open() - * - * Looks up the hostname, then attempts to open a socket to the host using - * the specified portnumber. It also sets various options on the socket to - * improve performance and correctness. - * - * \param [in] hostname this can be a hostname or IP address. - * Both IPv4 and IPv6 are acceptable - * \param [in] portnumber the port to connect on. RabbitMQ brokers - * listen on port 5672, and 5671 for SSL - * \return a positive value indicates success and is the sockfd. A negative - * value (see amqp_status_enum)is returned on failure. Possible error codes: - * - AMQP_STATUS_TCP_SOCKETLIB_INIT_ERROR Initialization of underlying socket - * library failed. - * - AMQP_STATUS_HOSTNAME_RESOLUTION_FAILED hostname lookup failed. - * - AMQP_STATUS_SOCKET_ERROR a socket error occurred. errno or - * WSAGetLastError() may return more useful information. - * - * \note IPv6 support was added in v0.3 - * - * \sa amqp_socket_open() amqp_set_sockfd() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_open_socket(char const *hostname, int portnumber); - -/** - * Send initial AMQP header to the broker - * - * \warning this is a low level function intended for those who want to - * interact with the broker at a very low level. Use of this function without - * understanding what it does will result in AMQP protocol errors. - * - * This function sends the AMQP protocol header to the broker. - * - * \param [in] state the connection object - * \return AMQP_STATUS_OK on success, a negative value on failure. Possible - * error codes: - * - AMQP_STATUS_CONNECTION_CLOSED the connection to the broker was closed. - * - AMQP_STATUS_SOCKET_ERROR a socket error occurred. It is likely the - * underlying socket has been closed. errno or WSAGetLastError() may provide - * further information. - * - AMQP_STATUS_SSL_ERROR a SSL error occurred. The connection to the broker - * was closed. - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_send_header(amqp_connection_state_t state); - -/** - * Checks to see if there are any incoming frames ready to be read - * - * Checks to see if there are any amqp_frame_t objects buffered by the - * amqp_connection_state_t object. Having one or more frames buffered means - * that amqp_simple_wait_frame() or amqp_simple_wait_frame_noblock() will - * return a frame without potentially blocking on a read() call. - * - * \param [in] state the connection object - * \return TRUE if there are frames enqueued, FALSE otherwise - * - * \sa amqp_simple_wait_frame() amqp_simple_wait_frame_noblock() - * amqp_data_in_buffer() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_boolean_t AMQP_CALL amqp_frames_enqueued(amqp_connection_state_t state); - -/** - * Read a single amqp_frame_t - * - * Waits for the next amqp_frame_t frame to be read from the broker. - * This function has the potential to block for a long time in the case of - * waiting for a basic.deliver method frame from the broker. - * - * The library may buffer frames. When an amqp_connection_state_t object - * has frames buffered calling amqp_simple_wait_frame() will return an - * amqp_frame_t without entering a blocking read(). You can test to see if - * an amqp_connection_state_t object has frames buffered by calling the - * amqp_frames_enqueued() function. - * - * The library has a socket read buffer. When there is data in an - * amqp_connection_state_t read buffer, amqp_simple_wait_frame() may return an - * amqp_frame_t without entering a blocking read(). You can test to see if an - * amqp_connection_state_t object has data in its read buffer by calling the - * amqp_data_in_buffer() function. - * - * \param [in] state the connection object - * \param [out] decoded_frame the frame - * \return AMQP_STATUS_OK on success, an amqp_status_enum value - * is returned otherwise. Possible errors include: - * - AMQP_STATUS_NO_MEMORY failure in allocating memory. The library is likely - * in an indeterminate state making recovery unlikely. Client should note the - * error and terminate the application - * - AMQP_STATUS_BAD_AMQP_DATA bad AMQP data was received. The connection - * should be shutdown immediately - * - AMQP_STATUS_UNKNOWN_METHOD: an unknown method was received from the - * broker. This is likely a protocol error and the connection should be - * shutdown immediately - * - AMQP_STATUS_UNKNOWN_CLASS: a properties frame with an unknown class - * was received from the broker. This is likely a protocol error and the - * connection should be shutdown immediately - * - AMQP_STATUS_HEARTBEAT_TIMEOUT timed out while waiting for heartbeat - * from the broker. The connection has been closed. - * - AMQP_STATUS_TIMER_FAILURE system timer indicated failure. - * - AMQP_STATUS_SOCKET_ERROR a socket error occurred. The connection has - * been closed - * - AMQP_STATUS_SSL_ERROR a SSL socket error occurred. The connection has - * been closed. - * - * \sa amqp_simple_wait_frame_noblock() amqp_frames_enqueued() - * amqp_data_in_buffer() - * - * \note as of v0.4.0 this function will no longer return heartbeat frames - * when enabled by specifying a non-zero heartbeat value in amqp_login(). - * Heartbeating is handled internally by the library. - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_simple_wait_frame(amqp_connection_state_t state, - amqp_frame_t *decoded_frame); - -/** - * Read a single amqp_frame_t with a timeout. - * - * Waits for the next amqp_frame_t frame to be read from the broker, up to - * a timespan specified by tv. The function will return AMQP_STATUS_TIMEOUT - * if the timeout is reached. The tv value is not modified by the function. - * - * If a 0 timeval is specified, the function behaves as if its non-blocking: it - * will test to see if a frame can be read from the broker, and return - * immediately. - * - * If NULL is passed in for tv, the function will behave like - * amqp_simple_wait_frame() and block until a frame is received from the broker - * - * The library may buffer frames. When an amqp_connection_state_t object - * has frames buffered calling amqp_simple_wait_frame_noblock() will return an - * amqp_frame_t without entering a blocking read(). You can test to see if an - * amqp_connection_state_t object has frames buffered by calling the - * amqp_frames_enqueued() function. - * - * The library has a socket read buffer. When there is data in an - * amqp_connection_state_t read buffer, amqp_simple_wait_frame_noblock() may - * return - * an amqp_frame_t without entering a blocking read(). You can test to see if an - * amqp_connection_state_t object has data in its read buffer by calling the - * amqp_data_in_buffer() function. - * - * \note This function does not return heartbeat frames. When enabled, - * heartbeating is handed internally internally by the library. - * - * \param [in,out] state the connection object - * \param [out] decoded_frame the frame - * \param [in] tv the maximum time to wait for a frame to be read. Setting - * tv->tv_sec = 0 and tv->tv_usec = 0 will do a non-blocking read. Specifying - * NULL for tv will make the function block until a frame is read. - * \return AMQP_STATUS_OK on success. An amqp_status_enum value is returned - * otherwise. Possible errors include: - * - AMQP_STATUS_TIMEOUT the timeout was reached while waiting for a frame - * from the broker. - * - AMQP_STATUS_INVALID_PARAMETER the tv parameter contains an invalid value. - * - AMQP_STATUS_NO_MEMORY failure in allocating memory. The library is likely - * in an indeterminate state making recovery unlikely. Client should note the - * error and terminate the application - * - AMQP_STATUS_BAD_AMQP_DATA bad AMQP data was received. The connection - * should be shutdown immediately - * - AMQP_STATUS_UNKNOWN_METHOD: an unknown method was received from the - * broker. This is likely a protocol error and the connection should be - * shutdown immediately - * - AMQP_STATUS_UNKNOWN_CLASS: a properties frame with an unknown class - * was received from the broker. This is likely a protocol error and the - * connection should be shutdown immediately - * - AMQP_STATUS_HEARTBEAT_TIMEOUT timed out while waiting for heartbeat - * from the broker. The connection has been closed. - * - AMQP_STATUS_TIMER_FAILURE system timer indicated failure. - * - AMQP_STATUS_SOCKET_ERROR a socket error occurred. The connection has - * been closed - * - AMQP_STATUS_SSL_ERROR a SSL socket error occurred. The connection has - * been closed. - * - * \sa amqp_simple_wait_frame() amqp_frames_enqueued() amqp_data_in_buffer() - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_simple_wait_frame_noblock(amqp_connection_state_t state, - amqp_frame_t *decoded_frame, - struct timeval *tv); - -/** - * Waits for a specific method from the broker - * - * \warning You probably don't want to use this function. If this function - * doesn't receive exactly the frame requested it closes the whole connection. - * - * Waits for a single method on a channel from the broker. - * If a frame is received that does not match expected_channel - * or expected_method the program will abort - * - * \param [in] state the connection object - * \param [in] expected_channel the channel that the method should be delivered - * on - * \param [in] expected_method the method to wait for - * \param [out] output the method - * \returns AMQP_STATUS_OK on success. An amqp_status_enum value is returned - * otherwise. Possible errors include: - * - AMQP_STATUS_WRONG_METHOD a frame containing the wrong method, wrong frame - * type or wrong channel was received. The connection is closed. - * - AMQP_STATUS_NO_MEMORY failure in allocating memory. The library is likely - * in an indeterminate state making recovery unlikely. Client should note the - * error and terminate the application - * - AMQP_STATUS_BAD_AMQP_DATA bad AMQP data was received. The connection - * should be shutdown immediately - * - AMQP_STATUS_UNKNOWN_METHOD: an unknown method was received from the - * broker. This is likely a protocol error and the connection should be - * shutdown immediately - * - AMQP_STATUS_UNKNOWN_CLASS: a properties frame with an unknown class - * was received from the broker. This is likely a protocol error and the - * connection should be shutdown immediately - * - AMQP_STATUS_HEARTBEAT_TIMEOUT timed out while waiting for heartbeat - * from the broker. The connection has been closed. - * - AMQP_STATUS_TIMER_FAILURE system timer indicated failure. - * - AMQP_STATUS_SOCKET_ERROR a socket error occurred. The connection has - * been closed - * - AMQP_STATUS_SSL_ERROR a SSL socket error occurred. The connection has - * been closed. - * - * \since v0.1 - */ - -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_simple_wait_method(amqp_connection_state_t state, - amqp_channel_t expected_channel, - amqp_method_number_t expected_method, - amqp_method_t *output); - -/** - * Sends a method to the broker - * - * This is a thin wrapper around amqp_send_frame(), providing a way to send - * a method to the broker on a specified channel. - * - * \param [in] state the connection object - * \param [in] channel the channel object - * \param [in] id the method number - * \param [in] decoded the method object - * \returns AMQP_STATUS_OK on success, an amqp_status_enum value otherwise. - * Possible errors include: - * - AMQP_STATUS_BAD_AMQP_DATA the serialized form of the method or - * properties was too large to fit in a single AMQP frame, or the - * method contains an invalid value. The frame was not sent. - * - AMQP_STATUS_TABLE_TOO_BIG the serialized form of an amqp_table_t is - * too large to fit in a single AMQP frame. Frame was not sent. - * - AMQP_STATUS_UNKNOWN_METHOD an invalid method type was passed in - * - AMQP_STATUS_UNKNOWN_CLASS an invalid properties type was passed in - * - AMQP_STATUS_TIMER_FAILURE system timer indicated failure. The frame - * was sent - * - AMQP_STATUS_SOCKET_ERROR - * - AMQP_STATUS_SSL_ERROR - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_send_method(amqp_connection_state_t state, - amqp_channel_t channel, amqp_method_number_t id, - void *decoded); - -/** - * Sends a method to the broker and waits for a method response - * - * \param [in] state the connection object - * \param [in] channel the channel object - * \param [in] request_id the method number of the request - * \param [in] expected_reply_ids a 0 terminated array of expected response - * method numbers - * \param [in] decoded_request_method the method to be sent to the broker - * \return a amqp_rpc_reply_t: - * - r.reply_type == AMQP_RESPONSE_NORMAL. RPC completed successfully - * - r.reply_type == AMQP_RESPONSE_SERVER_EXCEPTION. The broker returned an - * exception: - * - If r.reply.id == AMQP_CHANNEL_CLOSE_METHOD a channel exception - * occurred, cast r.reply.decoded to amqp_channel_close_t* to see details - * of the exception. The client should amqp_send_method() a - * amqp_channel_close_ok_t. The channel must be re-opened before it - * can be used again. Any resources associated with the channel - * (auto-delete exchanges, auto-delete queues, consumers) are invalid - * and must be recreated before attempting to use them again. - * - If r.reply.id == AMQP_CONNECTION_CLOSE_METHOD a connection exception - * occurred, cast r.reply.decoded to amqp_connection_close_t* to see - * details of the exception. The client amqp_send_method() a - * amqp_connection_close_ok_t and disconnect from the broker. - * - r.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION. An exception occurred - * within the library. Examine r.library_error and compare it against - * amqp_status_enum values to determine the error. - * - * \sa amqp_simple_rpc_decoded() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_simple_rpc( - amqp_connection_state_t state, amqp_channel_t channel, - amqp_method_number_t request_id, amqp_method_number_t *expected_reply_ids, - void *decoded_request_method); - -/** - * Sends a method to the broker and waits for a method response - * - * \param [in] state the connection object - * \param [in] channel the channel object - * \param [in] request_id the method number of the request - * \param [in] reply_id the method number expected in response - * \param [in] decoded_request_method the request method - * \return a pointer to the method returned from the broker, or NULL on error. - * On error amqp_get_rpc_reply() will return an amqp_rpc_reply_t with - * details on the error that occurred. - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -void *AMQP_CALL amqp_simple_rpc_decoded(amqp_connection_state_t state, - amqp_channel_t channel, - amqp_method_number_t request_id, - amqp_method_number_t reply_id, - void *decoded_request_method); - -/** - * Get the last global amqp_rpc_reply - * - * The API methods corresponding to most synchronous AMQP methods - * return a pointer to the decoded method result. Upon error, they - * return NULL, and we need some way of discovering what, if anything, - * went wrong. amqp_get_rpc_reply() returns the most recent - * amqp_rpc_reply_t instance corresponding to such an API operation - * for the given connection. - * - * Only use it for operations that do not themselves return - * amqp_rpc_reply_t; operations that do return amqp_rpc_reply_t - * generally do NOT update this per-connection-global amqp_rpc_reply_t - * instance. - * - * \param [in] state the connection object - * \return the most recent amqp_rpc_reply_t: - * - r.reply_type == AMQP_RESPONSE_NORMAL. RPC completed successfully - * - r.reply_type == AMQP_RESPONSE_SERVER_EXCEPTION. The broker returned an - * exception: - * - If r.reply.id == AMQP_CHANNEL_CLOSE_METHOD a channel exception - * occurred, cast r.reply.decoded to amqp_channel_close_t* to see details - * of the exception. The client should amqp_send_method() a - * amqp_channel_close_ok_t. The channel must be re-opened before it - * can be used again. Any resources associated with the channel - * (auto-delete exchanges, auto-delete queues, consumers) are invalid - * and must be recreated before attempting to use them again. - * - If r.reply.id == AMQP_CONNECTION_CLOSE_METHOD a connection exception - * occurred, cast r.reply.decoded to amqp_connection_close_t* to see - * details of the exception. The client amqp_send_method() a - * amqp_connection_close_ok_t and disconnect from the broker. - * - r.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION. An exception occurred - * within the library. Examine r.library_error and compare it against - * amqp_status_enum values to determine the error. - * - * \sa amqp_simple_rpc_decoded() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_get_rpc_reply(amqp_connection_state_t state); - -/** - * Login to the broker - * - * After using amqp_open_socket and amqp_set_sockfd, call - * amqp_login to complete connecting to the broker - * - * \param [in] state the connection object - * \param [in] vhost the virtual host to connect to on the broker. The default - * on most brokers is "/" - * \param [in] channel_max the limit for number of channels for the connection. - * 0 means no limit, and is a good default - * (AMQP_DEFAULT_MAX_CHANNELS) - * Note that the maximum number of channels the protocol supports - * is 65535 (2^16, with the 0-channel reserved). The server can - * set a lower channel_max and then the client will use the lowest - * of the two - * \param [in] frame_max the maximum size of an AMQP frame on the wire to - * request of the broker for this connection. 4096 is the minimum - * size, 2^31-1 is the maximum, a good default is 131072 (128KB), - * or AMQP_DEFAULT_FRAME_SIZE - * \param [in] heartbeat the number of seconds between heartbeat frames to - * request of the broker. A value of 0 disables heartbeats. - * Note rabbitmq-c only has partial support for heartbeats, as of - * v0.4.0 they are only serviced during amqp_basic_publish() and - * amqp_simple_wait_frame()/amqp_simple_wait_frame_noblock() - * \param [in] sasl_method the SASL method to authenticate with the broker. - * followed by the authentication information. The following SASL - * methods are implemented: - * - AMQP_SASL_METHOD_PLAIN, the AMQP_SASL_METHOD_PLAIN argument - * should be followed by two arguments in this order: - * const char* username, and const char* password. - * - AMQP_SASL_METHOD_EXTERNAL, the AMQP_SASL_METHOD_EXTERNAL - * argument should be followed one argument: - * const char* identity. - * \return amqp_rpc_reply_t indicating success or failure. - * - r.reply_type == AMQP_RESPONSE_NORMAL. Login completed successfully - * - r.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION. In most cases errors - * from the broker when logging in will be represented by the broker closing - * the socket. In this case r.library_error will be set to - * AMQP_STATUS_CONNECTION_CLOSED. This error can represent a number of - * error conditions including: invalid vhost, authentication failure. - * - r.reply_type == AMQP_RESPONSE_SERVER_EXCEPTION. The broker returned an - * exception: - * - If r.reply.id == AMQP_CHANNEL_CLOSE_METHOD a channel exception - * occurred, cast r.reply.decoded to amqp_channel_close_t* to see details - * of the exception. The client should amqp_send_method() a - * amqp_channel_close_ok_t. The channel must be re-opened before it - * can be used again. Any resources associated with the channel - * (auto-delete exchanges, auto-delete queues, consumers) are invalid - * and must be recreated before attempting to use them again. - * - If r.reply.id == AMQP_CONNECTION_CLOSE_METHOD a connection exception - * occurred, cast r.reply.decoded to amqp_connection_close_t* to see - * details of the exception. The client amqp_send_method() a - * amqp_connection_close_ok_t and disconnect from the broker. - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_login(amqp_connection_state_t state, - char const *vhost, int channel_max, - int frame_max, int heartbeat, - amqp_sasl_method_enum sasl_method, ...); - -/** - * Login to the broker passing a properties table - * - * This function is similar to amqp_login() and differs in that it provides a - * way to pass client properties to the broker. This is commonly used to - * negotiate newer protocol features as they are supported by the broker. - * - * \param [in] state the connection object - * \param [in] vhost the virtual host to connect to on the broker. The default - * on most brokers is "/" - * \param [in] channel_max the limit for the number of channels for the - * connection. - * 0 means no limit, and is a good default - * (AMQP_DEFAULT_MAX_CHANNELS) - * Note that the maximum number of channels the protocol supports - * is 65535 (2^16, with the 0-channel reserved). The server can - * set a lower channel_max and then the client will use the lowest - * of the two - * \param [in] frame_max the maximum size of an AMQP frame ont he wire to - * request of the broker for this connection. 4096 is the minimum - * size, 2^31-1 is the maximum, a good default is 131072 (128KB), - * or AMQP_DEFAULT_FRAME_SIZE - * \param [in] heartbeat the number of seconds between heartbeat frame to - * request of the broker. A value of 0 disables heartbeats. - * Note rabbitmq-c only has partial support for hearts, as of - * v0.4.0 heartbeats are only serviced during amqp_basic_publish(), - * and amqp_simple_wait_frame()/amqp_simple_wait_frame_noblock() - * \param [in] properties a table of properties to send the broker. - * \param [in] sasl_method the SASL method to authenticate with the broker - * followed by the authentication information. The following SASL - * methods are implemented: - * - AMQP_SASL_METHOD_PLAIN, the AMQP_SASL_METHOD_PLAIN argument - * should be followed by two arguments in this order: - * const char* username, and const char* password. - * - AMQP_SASL_METHOD_EXTERNAL, the AMQP_SASL_METHOD_EXTERNAL - * argument should be followed one argument: - * const char* identity. - * \return amqp_rpc_reply_t indicating success or failure. - * - r.reply_type == AMQP_RESPONSE_NORMAL. Login completed successfully - * - r.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION. In most cases errors - * from the broker when logging in will be represented by the broker closing - * the socket. In this case r.library_error will be set to - * AMQP_STATUS_CONNECTION_CLOSED. This error can represent a number of - * error conditions including: invalid vhost, authentication failure. - * - r.reply_type == AMQP_RESPONSE_SERVER_EXCEPTION. The broker returned an - * exception: - * - If r.reply.id == AMQP_CHANNEL_CLOSE_METHOD a channel exception - * occurred, cast r.reply.decoded to amqp_channel_close_t* to see details - * of the exception. The client should amqp_send_method() a - * amqp_channel_close_ok_t. The channel must be re-opened before it - * can be used again. Any resources associated with the channel - * (auto-delete exchanges, auto-delete queues, consumers) are invalid - * and must be recreated before attempting to use them again. - * - If r.reply.id == AMQP_CONNECTION_CLOSE_METHOD a connection exception - * occurred, cast r.reply.decoded to amqp_connection_close_t* to see - * details of the exception. The client amqp_send_method() a - * amqp_connection_close_ok_t and disconnect from the broker. - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_login_with_properties( - amqp_connection_state_t state, char const *vhost, int channel_max, - int frame_max, int heartbeat, const amqp_table_t *properties, - amqp_sasl_method_enum sasl_method, ...); - -struct amqp_basic_properties_t_; - -/** - * Publish a message to the broker - * - * Publish a message on an exchange with a routing key. - * - * Note that at the AMQ protocol level basic.publish is an async method: - * this means error conditions that occur on the broker (such as publishing to - * a non-existent exchange) will not be reflected in the return value of this - * function. - * - * \param [in] state the connection object - * \param [in] channel the channel identifier - * \param [in] exchange the exchange on the broker to publish to - * \param [in] routing_key the routing key to use when publishing the message - * \param [in] mandatory indicate to the broker that the message MUST be routed - * to a queue. If the broker cannot do this it should respond with - * a basic.return method. - * \param [in] immediate indicate to the broker that the message MUST be - * delivered to a consumer immediately. If the broker cannot do this - * it should respond with a basic.return method. - * \param [in] properties the properties associated with the message - * \param [in] body the message body - * \return AMQP_STATUS_OK on success, amqp_status_enum value on failure. Note - * that basic.publish is an async method, the return value from this - * function only indicates that the message data was successfully - * transmitted to the broker. It does not indicate failures that occur - * on the broker, such as publishing to a non-existent exchange. - * Possible error values: - * - AMQP_STATUS_TIMER_FAILURE: system timer facility returned an error - * the message was not sent. - * - AMQP_STATUS_HEARTBEAT_TIMEOUT: connection timed out waiting for a - * heartbeat from the broker. The message was not sent. - * - AMQP_STATUS_NO_MEMORY: memory allocation failed. The message was - * not sent. - * - AMQP_STATUS_TABLE_TOO_BIG: a table in the properties was too large - * to fit in a single frame. Message was not sent. - * - AMQP_STATUS_CONNECTION_CLOSED: the connection was closed. - * - AMQP_STATUS_SSL_ERROR: a SSL error occurred. - * - AMQP_STATUS_TCP_ERROR: a TCP error occurred. errno or - * WSAGetLastError() may provide more information - * - * Note: this function does heartbeat processing as of v0.4.0 - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_basic_publish( - amqp_connection_state_t state, amqp_channel_t channel, - amqp_bytes_t exchange, amqp_bytes_t routing_key, amqp_boolean_t mandatory, - amqp_boolean_t immediate, struct amqp_basic_properties_t_ const *properties, - amqp_bytes_t body); - -/** - * Closes an channel - * - * \param [in] state the connection object - * \param [in] channel the channel identifier - * \param [in] code the reason for closing the channel, AMQP_REPLY_SUCCESS is a - * good default - * \return amqp_rpc_reply_t indicating success or failure - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_channel_close(amqp_connection_state_t state, - amqp_channel_t channel, int code); - -/** - * Closes the entire connection - * - * Implicitly closes all channels and informs the broker the connection - * is being closed, after receiving acknowledgment from the broker it closes - * the socket. - * - * \param [in] state the connection object - * \param [in] code the reason code for closing the connection. - * AMQP_REPLY_SUCCESS is a good default. - * \return amqp_rpc_reply_t indicating the result - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_connection_close(amqp_connection_state_t state, - int code); - -/** - * Acknowledges a message - * - * Does a basic.ack on a received message - * - * \param [in] state the connection object - * \param [in] channel the channel identifier - * \param [in] delivery_tag the delivery tag of the message to be ack'd - * \param [in] multiple if true, ack all messages up to this delivery tag, if - * false ack only this delivery tag - * \return 0 on success, 0 > on failing to send the ack to the broker. - * this will not indicate failure if something goes wrong on the - * broker - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_basic_ack(amqp_connection_state_t state, - amqp_channel_t channel, uint64_t delivery_tag, - amqp_boolean_t multiple); - -/** - * Do a basic.get - * - * Synchonously polls the broker for a message in a queue, and - * retrieves the message if a message is in the queue. - * - * \param [in] state the connection object - * \param [in] channel the channel identifier to use - * \param [in] queue the queue name to retrieve from - * \param [in] no_ack if true the message is automatically ack'ed - * if false amqp_basic_ack should be called once the message - * retrieved has been processed - * \return amqp_rpc_reply indicating success or failure - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_basic_get(amqp_connection_state_t state, - amqp_channel_t channel, - amqp_bytes_t queue, - amqp_boolean_t no_ack); - -/** - * Do a basic.reject - * - * Actively reject a message that has been delivered - * - * \param [in] state the connection object - * \param [in] channel the channel identifier - * \param [in] delivery_tag the delivery tag of the message to reject - * \param [in] requeue indicate to the broker whether it should requeue the - * message or just discard it. - * \return 0 on success, 0 > on failing to send the reject method to the broker. - * This will not indicate failure if something goes wrong on the - * broker. - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_basic_reject(amqp_connection_state_t state, - amqp_channel_t channel, uint64_t delivery_tag, - amqp_boolean_t requeue); - -/** - * Do a basic.nack - * - * Actively reject a message, this has the same effect as amqp_basic_reject() - * however, amqp_basic_nack() can negatively acknowledge multiple messages with - * one call much like amqp_basic_ack() can acknowledge mutliple messages with - * one call. - * - * \param [in] state the connection object - * \param [in] channel the channel identifier - * \param [in] delivery_tag the delivery tag of the message to reject - * \param [in] multiple if set to 1 negatively acknowledge all unacknowledged - * messages on this channel. - * \param [in] requeue indicate to the broker whether it should requeue the - * message or dead-letter it. - * \return AMQP_STATUS_OK on success, an amqp_status_enum value otherwise. - * - * \since v0.5.0 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_basic_nack(amqp_connection_state_t state, - amqp_channel_t channel, uint64_t delivery_tag, - amqp_boolean_t multiple, amqp_boolean_t requeue); -/** - * Check to see if there is data left in the receive buffer - * - * Can be used to see if there is data still in the buffer, if so - * calling amqp_simple_wait_frame will not immediately enter a - * blocking read. - * - * \param [in] state the connection object - * \return true if there is data in the recieve buffer, false otherwise - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_boolean_t AMQP_CALL amqp_data_in_buffer(amqp_connection_state_t state); - -/** - * Get the error string for the given error code. - * - * \deprecated This function has been deprecated in favor of - * \ref amqp_error_string2() which returns statically allocated - * string which do not need to be freed by the caller. - * - * The returned string resides on the heap; the caller is responsible - * for freeing it. - * - * \param [in] err return error code - * \return the error string - * - * \since v0.1 - */ -AMQP_DEPRECATED( - AMQP_PUBLIC_FUNCTION char *AMQP_CALL amqp_error_string(int err)); - -/** - * Get the error string for the given error code. - * - * Get an error string associated with an error code. The string is statically - * allocated and does not need to be freed - * - * \param [in] err the error code - * \return the error string - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -const char *AMQP_CALL amqp_error_string2(int err); - -/** - * Deserialize an amqp_table_t from AMQP wireformat - * - * This is an internal function and is not typically used by - * client applications - * - * \param [in] encoded the buffer containing the serialized data - * \param [in] pool memory pool used to allocate the table entries from - * \param [in] output the amqp_table_t structure to fill in. Any existing - * entries will be erased - * \param [in,out] offset The offset into the encoded buffer to start - * reading the serialized table. It will be updated - * by this function to end of the table - * \return AMQP_STATUS_OK on success, an amqp_status_enum value on failure - * Possible error codes: - * - AMQP_STATUS_NO_MEMORY out of memory - * - AMQP_STATUS_BAD_AMQP_DATA invalid wireformat - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_decode_table(amqp_bytes_t encoded, amqp_pool_t *pool, - amqp_table_t *output, size_t *offset); - -/** - * Serializes an amqp_table_t to the AMQP wireformat - * - * This is an internal function and is not typically used by - * client applications - * - * \param [in] encoded the buffer where to serialize the table to - * \param [in] input the amqp_table_t to serialize - * \param [in,out] offset The offset into the encoded buffer to start - * writing the serialized table. It will be updated - * by this function to where writing left off - * \return AMQP_STATUS_OK on success, an amqp_status_enum value on failure - * Possible error codes: - * - AMQP_STATUS_TABLE_TOO_BIG the serialized form is too large for the - * buffer - * - AMQP_STATUS_BAD_AMQP_DATA invalid table - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_encode_table(amqp_bytes_t encoded, amqp_table_t *input, - size_t *offset); - -/** - * Create a deep-copy of an amqp_table_t object - * - * Creates a deep-copy of an amqp_table_t object, using the provided pool - * object to allocate the necessary memory. This memory can be freed later by - * call recycle_amqp_pool(), or empty_amqp_pool() - * - * \param [in] original the table to copy - * \param [in,out] clone the table to copy to - * \param [in] pool the initialized memory pool to do allocations for the table - * from - * \return AMQP_STATUS_OK on success, amqp_status_enum value on failure. - * Possible error values: - * - AMQP_STATUS_NO_MEMORY - memory allocation failure. - * - AMQP_STATUS_INVALID_PARAMETER - invalid table (e.g., no key name) - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_table_clone(const amqp_table_t *original, - amqp_table_t *clone, amqp_pool_t *pool); - -/** - * A message object - * - * \since v0.4.0 - */ -typedef struct amqp_message_t_ { - amqp_basic_properties_t properties; /**< message properties */ - amqp_bytes_t body; /**< message body */ - amqp_pool_t pool; /**< pool used to allocate properties */ -} amqp_message_t; - -/** - * Reads the next message on a channel - * - * Reads a complete message (header + body) on a specified channel. This - * function is intended to be used with amqp_basic_get() or when an - * AMQP_BASIC_DELIVERY_METHOD method is received. - * - * \param [in,out] state the connection object - * \param [in] channel the channel on which to read the message from - * \param [in,out] message a pointer to a amqp_message_t object. Caller should - * call amqp_message_destroy() when it is done using the - * fields in the message object. The caller is responsible for - * allocating/destroying the amqp_message_t object itself. - * \param [in] flags pass in 0. Currently unused. - * \returns a amqp_rpc_reply_t object. ret.reply_type == AMQP_RESPONSE_NORMAL on - * success. - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_read_message(amqp_connection_state_t state, - amqp_channel_t channel, - amqp_message_t *message, - int flags); - -/** - * Frees memory associated with a amqp_message_t allocated in amqp_read_message - * - * \param [in] message - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL amqp_destroy_message(amqp_message_t *message); - -/** - * Envelope object - * - * \since v0.4.0 - */ -typedef struct amqp_envelope_t_ { - amqp_channel_t channel; /**< channel message was delivered on */ - amqp_bytes_t - consumer_tag; /**< the consumer tag the message was delivered to */ - uint64_t delivery_tag; /**< the messages delivery tag */ - amqp_boolean_t redelivered; /**< flag indicating whether this message is being - redelivered */ - amqp_bytes_t exchange; /**< exchange this message was published to */ - amqp_bytes_t - routing_key; /**< the routing key this message was published with */ - amqp_message_t message; /**< the message */ -} amqp_envelope_t; - -/** - * Wait for and consume a message - * - * Waits for a basic.deliver method on any channel, upon receipt of - * basic.deliver it reads that message, and returns. If any other method is - * received before basic.deliver, this function will return an amqp_rpc_reply_t - * with ret.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION, and - * ret.library_error == AMQP_STATUS_UNEXPECTED_STATE. The caller should then - * call amqp_simple_wait_frame() to read this frame and take appropriate action. - * - * This function should be used after starting a consumer with the - * amqp_basic_consume() function - * - * \param [in,out] state the connection object - * \param [in,out] envelope a pointer to a amqp_envelope_t object. Caller - * should call #amqp_destroy_envelope() when it is done using - * the fields in the envelope object. The caller is responsible - * for allocating/destroying the amqp_envelope_t object itself. - * \param [in] timeout a timeout to wait for a message delivery. Passing in - * NULL will result in blocking behavior. - * \param [in] flags pass in 0. Currently unused. - * \returns a amqp_rpc_reply_t object. ret.reply_type == AMQP_RESPONSE_NORMAL - * on success. If ret.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION, - * and ret.library_error == AMQP_STATUS_UNEXPECTED_STATE, a frame other - * than AMQP_BASIC_DELIVER_METHOD was received, the caller should call - * amqp_simple_wait_frame() to read this frame and take appropriate - * action. - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_consume_message(amqp_connection_state_t state, - amqp_envelope_t *envelope, - struct timeval *timeout, - int flags); - -/** - * Frees memory associated with a amqp_envelope_t allocated in - * amqp_consume_message() - * - * \param [in] envelope - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL amqp_destroy_envelope(amqp_envelope_t *envelope); - -/** - * Parameters used to connect to the RabbitMQ broker - * - * \since v0.2 - */ -struct amqp_connection_info { - char *user; /**< the username to authenticate with the broker, default on most - broker is 'guest' */ - char *password; /**< the password to authenticate with the broker, default on - most brokers is 'guest' */ - char *host; /**< the hostname of the broker */ - char *vhost; /**< the virtual host on the broker to connect to, a good default - is "/" */ - int port; /**< the port that the broker is listening on, default on most - brokers is 5672 */ - amqp_boolean_t ssl; -}; - -/** - * Initialze an amqp_connection_info to default values - * - * The default values are: - * - user: "guest" - * - password: "guest" - * - host: "localhost" - * - vhost: "/" - * - port: 5672 - * - * \param [out] parsed the connection info to set defaults on - * - * \since v0.2 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL - amqp_default_connection_info(struct amqp_connection_info *parsed); - -/** - * Parse a connection URL - * - * An amqp connection url takes the form: - * - * amqp://[$USERNAME[:$PASSWORD]\@]$HOST[:$PORT]/[$VHOST] - * - * Examples: - * amqp://guest:guest\@localhost:5672// - * amqp://guest:guest\@localhost/myvhost - * - * Any missing parts of the URL will be set to the defaults specified in - * amqp_default_connection_info. For amqps: URLs the default port will be set - * to 5671 instead of 5672 for non-SSL URLs. - * - * \note This function modifies url parameter. - * - * \param [in] url URI to parse, note that this parameter is modified by the - * function. - * \param [out] parsed the connection info gleaned from the URI. The char* - * members will point to parts of the url input parameter. - * Memory management will depend on how the url is allocated. - * \returns AMQP_STATUS_OK on success, AMQP_STATUS_BAD_URL on failure - * - * \since v0.2 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_parse_url(char *url, struct amqp_connection_info *parsed); - -/* socket API */ - -/** - * Open a socket connection. - * - * This function opens a socket connection returned from amqp_tcp_socket_new() - * or amqp_ssl_socket_new(). This function should be called after setting - * socket options and prior to assigning the socket to an AMQP connection with - * amqp_set_socket(). - * - * \param [in,out] self A socket object. - * \param [in] host Connect to this host. - * \param [in] port Connect on this remote port. - * - * \return AMQP_STATUS_OK on success, an amqp_status_enum on failure - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_socket_open(amqp_socket_t *self, const char *host, int port); - -/** - * Open a socket connection. - * - * This function opens a socket connection returned from amqp_tcp_socket_new() - * or amqp_ssl_socket_new(). This function should be called after setting - * socket options and prior to assigning the socket to an AMQP connection with - * amqp_set_socket(). - * - * \param [in,out] self A socket object. - * \param [in] host Connect to this host. - * \param [in] port Connect on this remote port. - * \param [in] timeout Max allowed time to spent on opening. If NULL - run in - * blocking mode - * - * \return AMQP_STATUS_OK on success, an amqp_status_enum on failure. - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_socket_open_noblock(amqp_socket_t *self, const char *host, - int port, struct timeval *timeout); - -/** - * Get the socket descriptor in use by a socket object. - * - * Retrieve the underlying socket descriptor. This function can be used to - * perform low-level socket operations that aren't supported by the socket - * interface. Use with caution! - * - * \param [in,out] self A socket object. - * - * \return The underlying socket descriptor, or -1 if there is no socket - * descriptor associated with - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_socket_get_sockfd(amqp_socket_t *self); - -/** - * Get the socket object associated with a amqp_connection_state_t - * - * \param [in] state the connection object to get the socket from - * \return a pointer to the socket object, or NULL if one has not been assigned - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -amqp_socket_t *AMQP_CALL amqp_get_socket(amqp_connection_state_t state); - -/** - * Get the broker properties table - * - * \param [in] state the connection object - * \return a pointer to an amqp_table_t containing the properties advertised - * by the broker on connection. The connection object owns the table, it - * should not be modified. - * - * \since v0.5.0 - */ -AMQP_PUBLIC_FUNCTION -amqp_table_t *AMQP_CALL - amqp_get_server_properties(amqp_connection_state_t state); - -/** - * Get the client properties table - * - * Get the properties that were passed to the broker on connection. - * - * \param [in] state the connection object - * \return a pointer to an amqp_table_t containing the properties advertised - * by the client on connection. The connection object owns the table, it - * should not be modified. - * - * \since v0.7.0 - */ -AMQP_PUBLIC_FUNCTION -amqp_table_t *AMQP_CALL - amqp_get_client_properties(amqp_connection_state_t state); - -/** - * Get the login handshake timeout. - * - * amqp_login and amqp_login_with_properties perform the login handshake with - * the broker. This function returns the timeout associated with completing - * this operation from the client side. This value can be set by using the - * amqp_set_handshake_timeout. - * - * Note that the RabbitMQ broker has configurable timeout for completing the - * login handshake, the default is 10 seconds. rabbitmq-c has a default of 12 - * seconds. - * - * \param [in] state the connection object - * \return a struct timeval representing the current login timeout for the state - * object. A NULL value represents an infinite timeout. The memory returned is - * owned by the connection object. - * - * \since v0.9.0 - */ -AMQP_PUBLIC_FUNCTION -struct timeval *AMQP_CALL - amqp_get_handshake_timeout(amqp_connection_state_t state); - -/** - * Set the login handshake timeout. - * - * amqp_login and amqp_login_with_properties perform the login handshake with - * the broker. This function sets the timeout associated with completing this - * operation from the client side. - * - * The timeout must be set before amqp_login or amqp_login_with_properties is - * called to change from the default timeout. - * - * Note that the RabbitMQ broker has a configurable timeout for completing the - * login handshake, the default is 10 seconds. rabbitmq-c has a default of 12 - * seconds. - * - * \param [in] state the connection object - * \param [in] timeout a struct timeval* representing new login timeout for the - * state object. NULL represents an infinite timeout. The value of timeout is - * copied internally, the caller is responsible for ownership of the passed in - * pointer, it does not need to remain valid after this function is called. - * \return AMQP_STATUS_OK on success. - * - * \since v0.9.0 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_set_handshake_timeout(amqp_connection_state_t state, - struct timeval *timeout); - -/** - * Get the RPC timeout - * - * Gets the timeout for any RPC-style AMQP command (e.g., amqp_queue_declare). - * This timeout may be changed at any time by calling \amqp_set_rpc_timeout - * function with a new timeout. The timeout applies individually to each RPC - * that is made. - * - * The default value is NULL, or an infinite timeout. - * - * When an RPC times out, the function will return an error AMQP_STATUS_TIMEOUT, - * and the connection will be closed. - * - *\warning RPC-timeouts are an advanced feature intended to be used to detect - * dead connections quickly when the rabbitmq-c implementation of heartbeats - * does not work. Do not use RPC timeouts unless you understand the implications - * of doing so. - * - * \param [in] state the connection object - * \return a struct timeval representing the current RPC timeout for the state - * object. A NULL value represents an infinite timeout. The memory returned is - * owned by the connection object. - * - * \since v0.9.0 - */ -AMQP_PUBLIC_FUNCTION -struct timeval *AMQP_CALL amqp_get_rpc_timeout(amqp_connection_state_t state); - -/** - * Set the RPC timeout - * - * Sets the timeout for any RPC-style AMQP command (e.g., amqp_queue_declare). - * This timeout may be changed at any time by calling this function with a new - * timeout. The timeout applies individually to each RPC that is made. - * - * The default value is NULL, or an infinite timeout. - * - * When an RPC times out, the function will return an error AMQP_STATUS_TIMEOUT, - * and the connection will be closed. - * - *\warning RPC-timeouts are an advanced feature intended to be used to detect - * dead connections quickly when the rabbitmq-c implementation of heartbeats - * does not work. Do not use RPC timeouts unless you understand the implications - * of doing so. - * - * \param [in] state the connection object - * \param [in] timeout a struct timeval* representing new RPC timeout for the - * state object. NULL represents an infinite timeout. The value of timeout is - * copied internally, the caller is responsible for ownership of the passed - * pointer, it does not need to remain valid after this function is called. - * \return AMQP_STATUS_SUCCESS on success. - * - * \since v0.9.0 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_set_rpc_timeout(amqp_connection_state_t state, - struct timeval *timeout); - -AMQP_END_DECLS - -#endif /* AMQP_H */ diff --git a/ext/librabbitmq/centos_x64/include/amqp_framing.h b/ext/librabbitmq/centos_x64/include/amqp_framing.h deleted file mode 100644 index fb20acc1f..000000000 --- a/ext/librabbitmq/centos_x64/include/amqp_framing.h +++ /dev/null @@ -1,1144 +0,0 @@ -/* Generated code. Do not edit. Edit and re-run codegen.py instead. - * - * ***** BEGIN LICENSE BLOCK ***** - * Version: MIT - * - * Portions created by Alan Antonuk are Copyright (c) 2012-2013 - * Alan Antonuk. All Rights Reserved. - * - * 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 ***** - */ - -/** @file amqp_framing.h */ -#ifndef AMQP_FRAMING_H -#define AMQP_FRAMING_H - -#include - -AMQP_BEGIN_DECLS - -#define AMQP_PROTOCOL_VERSION_MAJOR 0 /**< AMQP protocol version major */ -#define AMQP_PROTOCOL_VERSION_MINOR 9 /**< AMQP protocol version minor */ -#define AMQP_PROTOCOL_VERSION_REVISION \ - 1 /**< AMQP protocol version revision \ - */ -#define AMQP_PROTOCOL_PORT 5672 /**< Default AMQP Port */ -#define AMQP_FRAME_METHOD 1 /**< Constant: FRAME-METHOD */ -#define AMQP_FRAME_HEADER 2 /**< Constant: FRAME-HEADER */ -#define AMQP_FRAME_BODY 3 /**< Constant: FRAME-BODY */ -#define AMQP_FRAME_HEARTBEAT 8 /**< Constant: FRAME-HEARTBEAT */ -#define AMQP_FRAME_MIN_SIZE 4096 /**< Constant: FRAME-MIN-SIZE */ -#define AMQP_FRAME_END 206 /**< Constant: FRAME-END */ -#define AMQP_REPLY_SUCCESS 200 /**< Constant: REPLY-SUCCESS */ -#define AMQP_CONTENT_TOO_LARGE 311 /**< Constant: CONTENT-TOO-LARGE */ -#define AMQP_NO_ROUTE 312 /**< Constant: NO-ROUTE */ -#define AMQP_NO_CONSUMERS 313 /**< Constant: NO-CONSUMERS */ -#define AMQP_ACCESS_REFUSED 403 /**< Constant: ACCESS-REFUSED */ -#define AMQP_NOT_FOUND 404 /**< Constant: NOT-FOUND */ -#define AMQP_RESOURCE_LOCKED 405 /**< Constant: RESOURCE-LOCKED */ -#define AMQP_PRECONDITION_FAILED 406 /**< Constant: PRECONDITION-FAILED */ -#define AMQP_CONNECTION_FORCED 320 /**< Constant: CONNECTION-FORCED */ -#define AMQP_INVALID_PATH 402 /**< Constant: INVALID-PATH */ -#define AMQP_FRAME_ERROR 501 /**< Constant: FRAME-ERROR */ -#define AMQP_SYNTAX_ERROR 502 /**< Constant: SYNTAX-ERROR */ -#define AMQP_COMMAND_INVALID 503 /**< Constant: COMMAND-INVALID */ -#define AMQP_CHANNEL_ERROR 504 /**< Constant: CHANNEL-ERROR */ -#define AMQP_UNEXPECTED_FRAME 505 /**< Constant: UNEXPECTED-FRAME */ -#define AMQP_RESOURCE_ERROR 506 /**< Constant: RESOURCE-ERROR */ -#define AMQP_NOT_ALLOWED 530 /**< Constant: NOT-ALLOWED */ -#define AMQP_NOT_IMPLEMENTED 540 /**< Constant: NOT-IMPLEMENTED */ -#define AMQP_INTERNAL_ERROR 541 /**< Constant: INTERNAL-ERROR */ - -/* Function prototypes. */ - -/** - * Get constant name string from constant - * - * @param [in] constantNumber constant to get the name of - * @returns string describing the constant. String is managed by - * the library and should not be free()'d by the program - */ -AMQP_PUBLIC_FUNCTION -char const *AMQP_CALL amqp_constant_name(int constantNumber); - -/** - * Checks to see if a constant is a hard error - * - * A hard error occurs when something severe enough - * happens that the connection must be closed. - * - * @param [in] constantNumber the error constant - * @returns true if its a hard error, false otherwise - */ -AMQP_PUBLIC_FUNCTION -amqp_boolean_t AMQP_CALL amqp_constant_is_hard_error(int constantNumber); - -/** - * Get method name string from method number - * - * @param [in] methodNumber the method number - * @returns method name string. String is managed by the library - * and should not be freed()'d by the program - */ -AMQP_PUBLIC_FUNCTION -char const *AMQP_CALL amqp_method_name(amqp_method_number_t methodNumber); - -/** - * Check whether a method has content - * - * A method that has content will receive the method frame - * a properties frame, then 1 to N body frames - * - * @param [in] methodNumber the method number - * @returns true if method has content, false otherwise - */ -AMQP_PUBLIC_FUNCTION -amqp_boolean_t AMQP_CALL - amqp_method_has_content(amqp_method_number_t methodNumber); - -/** - * Decodes a method from AMQP wireformat - * - * @param [in] methodNumber the method number for the decoded parameter - * @param [in] pool the memory pool to allocate the decoded method from - * @param [in] encoded the encoded byte string buffer - * @param [out] decoded pointer to the decoded method struct - * @returns 0 on success, an error code otherwise - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_decode_method(amqp_method_number_t methodNumber, - amqp_pool_t *pool, amqp_bytes_t encoded, - void **decoded); - -/** - * Decodes a header frame properties structure from AMQP wireformat - * - * @param [in] class_id the class id for the decoded parameter - * @param [in] pool the memory pool to allocate the decoded properties from - * @param [in] encoded the encoded byte string buffer - * @param [out] decoded pointer to the decoded properties struct - * @returns 0 on success, an error code otherwise - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_decode_properties(uint16_t class_id, amqp_pool_t *pool, - amqp_bytes_t encoded, void **decoded); - -/** - * Encodes a method structure in AMQP wireformat - * - * @param [in] methodNumber the method number for the decoded parameter - * @param [in] decoded the method structure (e.g., amqp_connection_start_t) - * @param [in] encoded an allocated byte buffer for the encoded method - * structure to be written to. If the buffer isn't large enough - * to hold the encoded method, an error code will be returned. - * @returns 0 on success, an error code otherwise. - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_encode_method(amqp_method_number_t methodNumber, - void *decoded, amqp_bytes_t encoded); - -/** - * Encodes a properties structure in AMQP wireformat - * - * @param [in] class_id the class id for the decoded parameter - * @param [in] decoded the properties structure (e.g., amqp_basic_properties_t) - * @param [in] encoded an allocated byte buffer for the encoded properties to - * written to. - * If the buffer isn't large enough to hold the encoded method, an - * an error code will be returned - * @returns 0 on success, an error code otherwise. - */ -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) /**< connection.start method id \ - @internal 10, 10; 655370 */ -/** connection.start method fields */ -typedef struct amqp_connection_start_t_ { - uint8_t version_major; /**< version-major */ - uint8_t version_minor; /**< version-minor */ - amqp_table_t server_properties; /**< server-properties */ - amqp_bytes_t mechanisms; /**< mechanisms */ - amqp_bytes_t locales; /**< locales */ -} amqp_connection_start_t; - -#define AMQP_CONNECTION_START_OK_METHOD \ - ((amqp_method_number_t)0x000A000B) /**< connection.start-ok method id \ - @internal 10, 11; 655371 */ -/** connection.start-ok method fields */ -typedef struct amqp_connection_start_ok_t_ { - amqp_table_t client_properties; /**< client-properties */ - amqp_bytes_t mechanism; /**< mechanism */ - amqp_bytes_t response; /**< response */ - amqp_bytes_t locale; /**< locale */ -} amqp_connection_start_ok_t; - -#define AMQP_CONNECTION_SECURE_METHOD \ - ((amqp_method_number_t)0x000A0014) /**< connection.secure method id \ - @internal 10, 20; 655380 */ -/** connection.secure method fields */ -typedef struct amqp_connection_secure_t_ { - amqp_bytes_t challenge; /**< challenge */ -} amqp_connection_secure_t; - -#define AMQP_CONNECTION_SECURE_OK_METHOD \ - ((amqp_method_number_t)0x000A0015) /**< connection.secure-ok method id \ - @internal 10, 21; 655381 */ -/** connection.secure-ok method fields */ -typedef struct amqp_connection_secure_ok_t_ { - amqp_bytes_t response; /**< response */ -} amqp_connection_secure_ok_t; - -#define AMQP_CONNECTION_TUNE_METHOD \ - ((amqp_method_number_t)0x000A001E) /**< connection.tune method id \ - @internal 10, 30; 655390 */ -/** connection.tune method fields */ -typedef struct amqp_connection_tune_t_ { - uint16_t channel_max; /**< channel-max */ - uint32_t frame_max; /**< frame-max */ - uint16_t heartbeat; /**< heartbeat */ -} amqp_connection_tune_t; - -#define AMQP_CONNECTION_TUNE_OK_METHOD \ - ((amqp_method_number_t)0x000A001F) /**< connection.tune-ok method id \ - @internal 10, 31; 655391 */ -/** connection.tune-ok method fields */ -typedef struct amqp_connection_tune_ok_t_ { - uint16_t channel_max; /**< channel-max */ - uint32_t frame_max; /**< frame-max */ - uint16_t heartbeat; /**< heartbeat */ -} amqp_connection_tune_ok_t; - -#define AMQP_CONNECTION_OPEN_METHOD \ - ((amqp_method_number_t)0x000A0028) /**< connection.open method id \ - @internal 10, 40; 655400 */ -/** connection.open method fields */ -typedef struct amqp_connection_open_t_ { - amqp_bytes_t virtual_host; /**< virtual-host */ - amqp_bytes_t capabilities; /**< capabilities */ - amqp_boolean_t insist; /**< insist */ -} amqp_connection_open_t; - -#define AMQP_CONNECTION_OPEN_OK_METHOD \ - ((amqp_method_number_t)0x000A0029) /**< connection.open-ok method id \ - @internal 10, 41; 655401 */ -/** connection.open-ok method fields */ -typedef struct amqp_connection_open_ok_t_ { - amqp_bytes_t known_hosts; /**< known-hosts */ -} amqp_connection_open_ok_t; - -#define AMQP_CONNECTION_CLOSE_METHOD \ - ((amqp_method_number_t)0x000A0032) /**< connection.close method id \ - @internal 10, 50; 655410 */ -/** connection.close method fields */ -typedef struct amqp_connection_close_t_ { - uint16_t reply_code; /**< reply-code */ - amqp_bytes_t reply_text; /**< reply-text */ - uint16_t class_id; /**< class-id */ - uint16_t method_id; /**< method-id */ -} amqp_connection_close_t; - -#define AMQP_CONNECTION_CLOSE_OK_METHOD \ - ((amqp_method_number_t)0x000A0033) /**< connection.close-ok method id \ - @internal 10, 51; 655411 */ -/** connection.close-ok method fields */ -typedef struct amqp_connection_close_ok_t_ { - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_connection_close_ok_t; - -#define AMQP_CONNECTION_BLOCKED_METHOD \ - ((amqp_method_number_t)0x000A003C) /**< connection.blocked method id \ - @internal 10, 60; 655420 */ -/** connection.blocked method fields */ -typedef struct amqp_connection_blocked_t_ { - amqp_bytes_t reason; /**< reason */ -} amqp_connection_blocked_t; - -#define AMQP_CONNECTION_UNBLOCKED_METHOD \ - ((amqp_method_number_t)0x000A003D) /**< connection.unblocked method id \ - @internal 10, 61; 655421 */ -/** connection.unblocked method fields */ -typedef struct amqp_connection_unblocked_t_ { - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_connection_unblocked_t; - -#define AMQP_CHANNEL_OPEN_METHOD \ - ((amqp_method_number_t)0x0014000A) /**< channel.open method id @internal \ - 20, 10; 1310730 */ -/** channel.open method fields */ -typedef struct amqp_channel_open_t_ { - amqp_bytes_t out_of_band; /**< out-of-band */ -} amqp_channel_open_t; - -#define AMQP_CHANNEL_OPEN_OK_METHOD \ - ((amqp_method_number_t)0x0014000B) /**< channel.open-ok method id \ - @internal 20, 11; 1310731 */ -/** channel.open-ok method fields */ -typedef struct amqp_channel_open_ok_t_ { - amqp_bytes_t channel_id; /**< channel-id */ -} amqp_channel_open_ok_t; - -#define AMQP_CHANNEL_FLOW_METHOD \ - ((amqp_method_number_t)0x00140014) /**< channel.flow method id @internal \ - 20, 20; 1310740 */ -/** channel.flow method fields */ -typedef struct amqp_channel_flow_t_ { - amqp_boolean_t active; /**< active */ -} amqp_channel_flow_t; - -#define AMQP_CHANNEL_FLOW_OK_METHOD \ - ((amqp_method_number_t)0x00140015) /**< channel.flow-ok method id \ - @internal 20, 21; 1310741 */ -/** channel.flow-ok method fields */ -typedef struct amqp_channel_flow_ok_t_ { - amqp_boolean_t active; /**< active */ -} amqp_channel_flow_ok_t; - -#define AMQP_CHANNEL_CLOSE_METHOD \ - ((amqp_method_number_t)0x00140028) /**< channel.close method id @internal \ - 20, 40; 1310760 */ -/** channel.close method fields */ -typedef struct amqp_channel_close_t_ { - uint16_t reply_code; /**< reply-code */ - amqp_bytes_t reply_text; /**< reply-text */ - uint16_t class_id; /**< class-id */ - uint16_t method_id; /**< method-id */ -} amqp_channel_close_t; - -#define AMQP_CHANNEL_CLOSE_OK_METHOD \ - ((amqp_method_number_t)0x00140029) /**< channel.close-ok method id \ - @internal 20, 41; 1310761 */ -/** channel.close-ok method fields */ -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) /**< access.request method id @internal \ - 30, 10; 1966090 */ -/** access.request method fields */ -typedef struct amqp_access_request_t_ { - amqp_bytes_t realm; /**< realm */ - amqp_boolean_t exclusive; /**< exclusive */ - amqp_boolean_t passive; /**< passive */ - amqp_boolean_t active; /**< active */ - amqp_boolean_t write; /**< write */ - amqp_boolean_t read; /**< read */ -} amqp_access_request_t; - -#define AMQP_ACCESS_REQUEST_OK_METHOD \ - ((amqp_method_number_t)0x001E000B) /**< access.request-ok method id \ - @internal 30, 11; 1966091 */ -/** access.request-ok method fields */ -typedef struct amqp_access_request_ok_t_ { - uint16_t ticket; /**< ticket */ -} amqp_access_request_ok_t; - -#define AMQP_EXCHANGE_DECLARE_METHOD \ - ((amqp_method_number_t)0x0028000A) /**< exchange.declare method id \ - @internal 40, 10; 2621450 */ -/** exchange.declare method fields */ -typedef struct amqp_exchange_declare_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t exchange; /**< exchange */ - amqp_bytes_t type; /**< type */ - amqp_boolean_t passive; /**< passive */ - amqp_boolean_t durable; /**< durable */ - amqp_boolean_t auto_delete; /**< auto-delete */ - amqp_boolean_t internal; /**< internal */ - amqp_boolean_t nowait; /**< nowait */ - amqp_table_t arguments; /**< arguments */ -} amqp_exchange_declare_t; - -#define AMQP_EXCHANGE_DECLARE_OK_METHOD \ - ((amqp_method_number_t)0x0028000B) /**< exchange.declare-ok method id \ - @internal 40, 11; 2621451 */ -/** exchange.declare-ok method fields */ -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) /**< exchange.delete method id \ - @internal 40, 20; 2621460 */ -/** exchange.delete method fields */ -typedef struct amqp_exchange_delete_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t exchange; /**< exchange */ - amqp_boolean_t if_unused; /**< if-unused */ - amqp_boolean_t nowait; /**< nowait */ -} amqp_exchange_delete_t; - -#define AMQP_EXCHANGE_DELETE_OK_METHOD \ - ((amqp_method_number_t)0x00280015) /**< exchange.delete-ok method id \ - @internal 40, 21; 2621461 */ -/** exchange.delete-ok method fields */ -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) /**< exchange.bind method id @internal \ - 40, 30; 2621470 */ -/** exchange.bind method fields */ -typedef struct amqp_exchange_bind_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t destination; /**< destination */ - amqp_bytes_t source; /**< source */ - amqp_bytes_t routing_key; /**< routing-key */ - amqp_boolean_t nowait; /**< nowait */ - amqp_table_t arguments; /**< arguments */ -} amqp_exchange_bind_t; - -#define AMQP_EXCHANGE_BIND_OK_METHOD \ - ((amqp_method_number_t)0x0028001F) /**< exchange.bind-ok method id \ - @internal 40, 31; 2621471 */ -/** exchange.bind-ok method fields */ -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) /**< exchange.unbind method id \ - @internal 40, 40; 2621480 */ -/** exchange.unbind method fields */ -typedef struct amqp_exchange_unbind_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t destination; /**< destination */ - amqp_bytes_t source; /**< source */ - amqp_bytes_t routing_key; /**< routing-key */ - amqp_boolean_t nowait; /**< nowait */ - amqp_table_t arguments; /**< arguments */ -} amqp_exchange_unbind_t; - -#define AMQP_EXCHANGE_UNBIND_OK_METHOD \ - ((amqp_method_number_t)0x00280033) /**< exchange.unbind-ok method id \ - @internal 40, 51; 2621491 */ -/** exchange.unbind-ok method fields */ -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) /**< queue.declare method id @internal \ - 50, 10; 3276810 */ -/** queue.declare method fields */ -typedef struct amqp_queue_declare_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t queue; /**< queue */ - amqp_boolean_t passive; /**< passive */ - amqp_boolean_t durable; /**< durable */ - amqp_boolean_t exclusive; /**< exclusive */ - amqp_boolean_t auto_delete; /**< auto-delete */ - amqp_boolean_t nowait; /**< nowait */ - amqp_table_t arguments; /**< arguments */ -} amqp_queue_declare_t; - -#define AMQP_QUEUE_DECLARE_OK_METHOD \ - ((amqp_method_number_t)0x0032000B) /**< queue.declare-ok method id \ - @internal 50, 11; 3276811 */ -/** queue.declare-ok method fields */ -typedef struct amqp_queue_declare_ok_t_ { - amqp_bytes_t queue; /**< queue */ - uint32_t message_count; /**< message-count */ - uint32_t consumer_count; /**< consumer-count */ -} amqp_queue_declare_ok_t; - -#define AMQP_QUEUE_BIND_METHOD \ - ((amqp_method_number_t)0x00320014) /**< queue.bind method id @internal 50, \ - 20; 3276820 */ -/** queue.bind method fields */ -typedef struct amqp_queue_bind_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t queue; /**< queue */ - amqp_bytes_t exchange; /**< exchange */ - amqp_bytes_t routing_key; /**< routing-key */ - amqp_boolean_t nowait; /**< nowait */ - amqp_table_t arguments; /**< arguments */ -} amqp_queue_bind_t; - -#define AMQP_QUEUE_BIND_OK_METHOD \ - ((amqp_method_number_t)0x00320015) /**< queue.bind-ok method id @internal \ - 50, 21; 3276821 */ -/** queue.bind-ok method fields */ -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) /**< queue.purge method id @internal \ - 50, 30; 3276830 */ -/** queue.purge method fields */ -typedef struct amqp_queue_purge_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t queue; /**< queue */ - amqp_boolean_t nowait; /**< nowait */ -} amqp_queue_purge_t; - -#define AMQP_QUEUE_PURGE_OK_METHOD \ - ((amqp_method_number_t)0x0032001F) /**< queue.purge-ok method id @internal \ - 50, 31; 3276831 */ -/** queue.purge-ok method fields */ -typedef struct amqp_queue_purge_ok_t_ { - uint32_t message_count; /**< message-count */ -} amqp_queue_purge_ok_t; - -#define AMQP_QUEUE_DELETE_METHOD \ - ((amqp_method_number_t)0x00320028) /**< queue.delete method id @internal \ - 50, 40; 3276840 */ -/** queue.delete method fields */ -typedef struct amqp_queue_delete_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t queue; /**< queue */ - amqp_boolean_t if_unused; /**< if-unused */ - amqp_boolean_t if_empty; /**< if-empty */ - amqp_boolean_t nowait; /**< nowait */ -} amqp_queue_delete_t; - -#define AMQP_QUEUE_DELETE_OK_METHOD \ - ((amqp_method_number_t)0x00320029) /**< queue.delete-ok method id \ - @internal 50, 41; 3276841 */ -/** queue.delete-ok method fields */ -typedef struct amqp_queue_delete_ok_t_ { - uint32_t message_count; /**< message-count */ -} amqp_queue_delete_ok_t; - -#define AMQP_QUEUE_UNBIND_METHOD \ - ((amqp_method_number_t)0x00320032) /**< queue.unbind method id @internal \ - 50, 50; 3276850 */ -/** queue.unbind method fields */ -typedef struct amqp_queue_unbind_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t queue; /**< queue */ - amqp_bytes_t exchange; /**< exchange */ - amqp_bytes_t routing_key; /**< routing-key */ - amqp_table_t arguments; /**< arguments */ -} amqp_queue_unbind_t; - -#define AMQP_QUEUE_UNBIND_OK_METHOD \ - ((amqp_method_number_t)0x00320033) /**< queue.unbind-ok method id \ - @internal 50, 51; 3276851 */ -/** queue.unbind-ok method fields */ -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) /**< basic.qos method id @internal 60, \ - 10; 3932170 */ -/** basic.qos method fields */ -typedef struct amqp_basic_qos_t_ { - uint32_t prefetch_size; /**< prefetch-size */ - uint16_t prefetch_count; /**< prefetch-count */ - amqp_boolean_t global; /**< global */ -} amqp_basic_qos_t; - -#define AMQP_BASIC_QOS_OK_METHOD \ - ((amqp_method_number_t)0x003C000B) /**< basic.qos-ok method id @internal \ - 60, 11; 3932171 */ -/** basic.qos-ok method fields */ -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) /**< basic.consume method id @internal \ - 60, 20; 3932180 */ -/** basic.consume method fields */ -typedef struct amqp_basic_consume_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t queue; /**< queue */ - amqp_bytes_t consumer_tag; /**< consumer-tag */ - amqp_boolean_t no_local; /**< no-local */ - amqp_boolean_t no_ack; /**< no-ack */ - amqp_boolean_t exclusive; /**< exclusive */ - amqp_boolean_t nowait; /**< nowait */ - amqp_table_t arguments; /**< arguments */ -} amqp_basic_consume_t; - -#define AMQP_BASIC_CONSUME_OK_METHOD \ - ((amqp_method_number_t)0x003C0015) /**< basic.consume-ok method id \ - @internal 60, 21; 3932181 */ -/** basic.consume-ok method fields */ -typedef struct amqp_basic_consume_ok_t_ { - amqp_bytes_t consumer_tag; /**< consumer-tag */ -} amqp_basic_consume_ok_t; - -#define AMQP_BASIC_CANCEL_METHOD \ - ((amqp_method_number_t)0x003C001E) /**< basic.cancel method id @internal \ - 60, 30; 3932190 */ -/** basic.cancel method fields */ -typedef struct amqp_basic_cancel_t_ { - amqp_bytes_t consumer_tag; /**< consumer-tag */ - amqp_boolean_t nowait; /**< nowait */ -} amqp_basic_cancel_t; - -#define AMQP_BASIC_CANCEL_OK_METHOD \ - ((amqp_method_number_t)0x003C001F) /**< basic.cancel-ok method id \ - @internal 60, 31; 3932191 */ -/** basic.cancel-ok method fields */ -typedef struct amqp_basic_cancel_ok_t_ { - amqp_bytes_t consumer_tag; /**< consumer-tag */ -} amqp_basic_cancel_ok_t; - -#define AMQP_BASIC_PUBLISH_METHOD \ - ((amqp_method_number_t)0x003C0028) /**< basic.publish method id @internal \ - 60, 40; 3932200 */ -/** basic.publish method fields */ -typedef struct amqp_basic_publish_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t exchange; /**< exchange */ - amqp_bytes_t routing_key; /**< routing-key */ - amqp_boolean_t mandatory; /**< mandatory */ - amqp_boolean_t immediate; /**< immediate */ -} amqp_basic_publish_t; - -#define AMQP_BASIC_RETURN_METHOD \ - ((amqp_method_number_t)0x003C0032) /**< basic.return method id @internal \ - 60, 50; 3932210 */ -/** basic.return method fields */ -typedef struct amqp_basic_return_t_ { - uint16_t reply_code; /**< reply-code */ - amqp_bytes_t reply_text; /**< reply-text */ - amqp_bytes_t exchange; /**< exchange */ - amqp_bytes_t routing_key; /**< routing-key */ -} amqp_basic_return_t; - -#define AMQP_BASIC_DELIVER_METHOD \ - ((amqp_method_number_t)0x003C003C) /**< basic.deliver method id @internal \ - 60, 60; 3932220 */ -/** basic.deliver method fields */ -typedef struct amqp_basic_deliver_t_ { - amqp_bytes_t consumer_tag; /**< consumer-tag */ - uint64_t delivery_tag; /**< delivery-tag */ - amqp_boolean_t redelivered; /**< redelivered */ - amqp_bytes_t exchange; /**< exchange */ - amqp_bytes_t routing_key; /**< routing-key */ -} amqp_basic_deliver_t; - -#define AMQP_BASIC_GET_METHOD \ - ((amqp_method_number_t)0x003C0046) /**< basic.get method id @internal 60, \ - 70; 3932230 */ -/** basic.get method fields */ -typedef struct amqp_basic_get_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t queue; /**< queue */ - amqp_boolean_t no_ack; /**< no-ack */ -} amqp_basic_get_t; - -#define AMQP_BASIC_GET_OK_METHOD \ - ((amqp_method_number_t)0x003C0047) /**< basic.get-ok method id @internal \ - 60, 71; 3932231 */ -/** basic.get-ok method fields */ -typedef struct amqp_basic_get_ok_t_ { - uint64_t delivery_tag; /**< delivery-tag */ - amqp_boolean_t redelivered; /**< redelivered */ - amqp_bytes_t exchange; /**< exchange */ - amqp_bytes_t routing_key; /**< routing-key */ - uint32_t message_count; /**< message-count */ -} amqp_basic_get_ok_t; - -#define AMQP_BASIC_GET_EMPTY_METHOD \ - ((amqp_method_number_t)0x003C0048) /**< basic.get-empty method id \ - @internal 60, 72; 3932232 */ -/** basic.get-empty method fields */ -typedef struct amqp_basic_get_empty_t_ { - amqp_bytes_t cluster_id; /**< cluster-id */ -} amqp_basic_get_empty_t; - -#define AMQP_BASIC_ACK_METHOD \ - ((amqp_method_number_t)0x003C0050) /**< basic.ack method id @internal 60, \ - 80; 3932240 */ -/** basic.ack method fields */ -typedef struct amqp_basic_ack_t_ { - uint64_t delivery_tag; /**< delivery-tag */ - amqp_boolean_t multiple; /**< multiple */ -} amqp_basic_ack_t; - -#define AMQP_BASIC_REJECT_METHOD \ - ((amqp_method_number_t)0x003C005A) /**< basic.reject method id @internal \ - 60, 90; 3932250 */ -/** basic.reject method fields */ -typedef struct amqp_basic_reject_t_ { - uint64_t delivery_tag; /**< delivery-tag */ - amqp_boolean_t requeue; /**< requeue */ -} amqp_basic_reject_t; - -#define AMQP_BASIC_RECOVER_ASYNC_METHOD \ - ((amqp_method_number_t)0x003C0064) /**< basic.recover-async method id \ - @internal 60, 100; 3932260 */ -/** basic.recover-async method fields */ -typedef struct amqp_basic_recover_async_t_ { - amqp_boolean_t requeue; /**< requeue */ -} amqp_basic_recover_async_t; - -#define AMQP_BASIC_RECOVER_METHOD \ - ((amqp_method_number_t)0x003C006E) /**< basic.recover method id @internal \ - 60, 110; 3932270 */ -/** basic.recover method fields */ -typedef struct amqp_basic_recover_t_ { - amqp_boolean_t requeue; /**< requeue */ -} amqp_basic_recover_t; - -#define AMQP_BASIC_RECOVER_OK_METHOD \ - ((amqp_method_number_t)0x003C006F) /**< basic.recover-ok method id \ - @internal 60, 111; 3932271 */ -/** basic.recover-ok method fields */ -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) /**< basic.nack method id @internal 60, \ - 120; 3932280 */ -/** basic.nack method fields */ -typedef struct amqp_basic_nack_t_ { - uint64_t delivery_tag; /**< delivery-tag */ - amqp_boolean_t multiple; /**< multiple */ - amqp_boolean_t requeue; /**< requeue */ -} amqp_basic_nack_t; - -#define AMQP_TX_SELECT_METHOD \ - ((amqp_method_number_t)0x005A000A) /**< tx.select method id @internal 90, \ - 10; 5898250 */ -/** tx.select method fields */ -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) /**< tx.select-ok method id @internal \ - 90, 11; 5898251 */ -/** tx.select-ok method fields */ -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) /**< tx.commit method id @internal 90, \ - 20; 5898260 */ -/** tx.commit method fields */ -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) /**< tx.commit-ok method id @internal \ - 90, 21; 5898261 */ -/** tx.commit-ok method fields */ -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) /**< tx.rollback method id @internal \ - 90, 30; 5898270 */ -/** tx.rollback method fields */ -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) /**< tx.rollback-ok method id @internal \ - 90, 31; 5898271 */ -/** tx.rollback-ok method fields */ -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) /**< confirm.select method id @internal \ - 85, 10; 5570570 */ -/** confirm.select method fields */ -typedef struct amqp_confirm_select_t_ { - amqp_boolean_t nowait; /**< nowait */ -} amqp_confirm_select_t; - -#define AMQP_CONFIRM_SELECT_OK_METHOD \ - ((amqp_method_number_t)0x0055000B) /**< confirm.select-ok method id \ - @internal 85, 11; 5570571 */ -/** confirm.select-ok method fields */ -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) /**< connection class id @internal 10 \ - */ -/** connection class properties */ -typedef struct amqp_connection_properties_t_ { - amqp_flags_t _flags; /**< bit-mask of set fields */ - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_connection_properties_t; - -#define AMQP_CHANNEL_CLASS (0x0014) /**< channel class id @internal 20 */ -/** channel class properties */ -typedef struct amqp_channel_properties_t_ { - amqp_flags_t _flags; /**< bit-mask of set fields */ - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_channel_properties_t; - -#define AMQP_ACCESS_CLASS (0x001E) /**< access class id @internal 30 */ -/** access class properties */ -typedef struct amqp_access_properties_t_ { - amqp_flags_t _flags; /**< bit-mask of set fields */ - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_access_properties_t; - -#define AMQP_EXCHANGE_CLASS (0x0028) /**< exchange class id @internal 40 */ -/** exchange class properties */ -typedef struct amqp_exchange_properties_t_ { - amqp_flags_t _flags; /**< bit-mask of set fields */ - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_exchange_properties_t; - -#define AMQP_QUEUE_CLASS (0x0032) /**< queue class id @internal 50 */ -/** queue class properties */ -typedef struct amqp_queue_properties_t_ { - amqp_flags_t _flags; /**< bit-mask of set fields */ - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_queue_properties_t; - -#define AMQP_BASIC_CLASS (0x003C) /**< basic class id @internal 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) -/** basic class properties */ -typedef struct amqp_basic_properties_t_ { - amqp_flags_t _flags; /**< bit-mask of set fields */ - amqp_bytes_t content_type; /**< content-type */ - amqp_bytes_t content_encoding; /**< content-encoding */ - amqp_table_t headers; /**< headers */ - uint8_t delivery_mode; /**< delivery-mode */ - uint8_t priority; /**< priority */ - amqp_bytes_t correlation_id; /**< correlation-id */ - amqp_bytes_t reply_to; /**< reply-to */ - amqp_bytes_t expiration; /**< expiration */ - amqp_bytes_t message_id; /**< message-id */ - uint64_t timestamp; /**< timestamp */ - amqp_bytes_t type; /**< type */ - amqp_bytes_t user_id; /**< user-id */ - amqp_bytes_t app_id; /**< app-id */ - amqp_bytes_t cluster_id; /**< cluster-id */ -} amqp_basic_properties_t; - -#define AMQP_TX_CLASS (0x005A) /**< tx class id @internal 90 */ -/** tx class properties */ -typedef struct amqp_tx_properties_t_ { - amqp_flags_t _flags; /**< bit-mask of set fields */ - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_tx_properties_t; - -#define AMQP_CONFIRM_CLASS (0x0055) /**< confirm class id @internal 85 */ -/** confirm class properties */ -typedef struct amqp_confirm_properties_t_ { - amqp_flags_t _flags; /**< bit-mask of set fields */ - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_confirm_properties_t; - -/* API functions for methods */ - -/** - * amqp_channel_open - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @returns amqp_channel_open_ok_t - */ -AMQP_PUBLIC_FUNCTION -amqp_channel_open_ok_t *AMQP_CALL - amqp_channel_open(amqp_connection_state_t state, amqp_channel_t channel); -/** - * amqp_channel_flow - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] active active - * @returns amqp_channel_flow_ok_t - */ -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_exchange_declare - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] exchange exchange - * @param [in] type type - * @param [in] passive passive - * @param [in] durable durable - * @param [in] auto_delete auto_delete - * @param [in] internal internal - * @param [in] arguments arguments - * @returns amqp_exchange_declare_ok_t - */ -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_boolean_t auto_delete, amqp_boolean_t internal, - amqp_table_t arguments); -/** - * amqp_exchange_delete - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] exchange exchange - * @param [in] if_unused if_unused - * @returns amqp_exchange_delete_ok_t - */ -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_bind - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] destination destination - * @param [in] source source - * @param [in] routing_key routing_key - * @param [in] arguments arguments - * @returns amqp_exchange_bind_ok_t - */ -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_unbind - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] destination destination - * @param [in] source source - * @param [in] routing_key routing_key - * @param [in] arguments arguments - * @returns amqp_exchange_unbind_ok_t - */ -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_queue_declare - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] queue queue - * @param [in] passive passive - * @param [in] durable durable - * @param [in] exclusive exclusive - * @param [in] auto_delete auto_delete - * @param [in] arguments arguments - * @returns amqp_queue_declare_ok_t - */ -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_bind - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] queue queue - * @param [in] exchange exchange - * @param [in] routing_key routing_key - * @param [in] arguments arguments - * @returns amqp_queue_bind_ok_t - */ -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_purge - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] queue queue - * @returns amqp_queue_purge_ok_t - */ -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_delete - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] queue queue - * @param [in] if_unused if_unused - * @param [in] if_empty if_empty - * @returns amqp_queue_delete_ok_t - */ -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_unbind - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] queue queue - * @param [in] exchange exchange - * @param [in] routing_key routing_key - * @param [in] arguments arguments - * @returns amqp_queue_unbind_ok_t - */ -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_basic_qos - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] prefetch_size prefetch_size - * @param [in] prefetch_count prefetch_count - * @param [in] global global - * @returns amqp_basic_qos_ok_t - */ -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_consume - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] queue queue - * @param [in] consumer_tag consumer_tag - * @param [in] no_local no_local - * @param [in] no_ack no_ack - * @param [in] exclusive exclusive - * @param [in] arguments arguments - * @returns amqp_basic_consume_ok_t - */ -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_cancel - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] consumer_tag consumer_tag - * @returns amqp_basic_cancel_ok_t - */ -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_recover - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] requeue requeue - * @returns amqp_basic_recover_ok_t - */ -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_tx_select - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @returns amqp_tx_select_ok_t - */ -AMQP_PUBLIC_FUNCTION -amqp_tx_select_ok_t *AMQP_CALL amqp_tx_select(amqp_connection_state_t state, - amqp_channel_t channel); -/** - * amqp_tx_commit - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @returns amqp_tx_commit_ok_t - */ -AMQP_PUBLIC_FUNCTION -amqp_tx_commit_ok_t *AMQP_CALL amqp_tx_commit(amqp_connection_state_t state, - amqp_channel_t channel); -/** - * amqp_tx_rollback - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @returns amqp_tx_rollback_ok_t - */ -AMQP_PUBLIC_FUNCTION -amqp_tx_rollback_ok_t *AMQP_CALL amqp_tx_rollback(amqp_connection_state_t state, - amqp_channel_t channel); -/** - * amqp_confirm_select - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @returns amqp_confirm_select_ok_t - */ -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/ext/librabbitmq/centos_x64/include/amqp_tcp_socket.h b/ext/librabbitmq/centos_x64/include/amqp_tcp_socket.h deleted file mode 100644 index 3e9d82f54..000000000 --- a/ext/librabbitmq/centos_x64/include/amqp_tcp_socket.h +++ /dev/null @@ -1,68 +0,0 @@ -/** \file */ -/* - * Portions created by Alan Antonuk are Copyright (c) 2013-2014 Alan Antonuk. - * All Rights Reserved. - * - * Portions created by Michael Steinert are Copyright (c) 2012-2013 Michael - * Steinert. 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. - */ - -/** - * A TCP socket connection. - */ - -#ifndef AMQP_TCP_SOCKET_H -#define AMQP_TCP_SOCKET_H - -#include - -AMQP_BEGIN_DECLS - -/** - * Create a new TCP socket. - * - * Call amqp_connection_close() to release socket resources. - * - * \return A new socket object or NULL if an error occurred. - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -amqp_socket_t *AMQP_CALL amqp_tcp_socket_new(amqp_connection_state_t state); - -/** - * Assign an open file descriptor to a socket object. - * - * This function must not be used in conjunction with amqp_socket_open(), i.e. - * the socket connection should already be open(2) when this function is - * called. - * - * \param [in,out] self A TCP socket object. - * \param [in] sockfd An open socket descriptor. - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL amqp_tcp_socket_set_sockfd(amqp_socket_t *self, int sockfd); - -AMQP_END_DECLS - -#endif /* AMQP_TCP_SOCKET_H */ diff --git a/ext/librabbitmq/centos_x64/lib/librabbitmq.a b/ext/librabbitmq/centos_x64/lib/librabbitmq.a deleted file mode 100644 index d5c3e8b42777f42e6ce8ffde1f6810f43361c8aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139468 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 diff --git a/ext/librabbitmq/macos/include/amqp.h b/ext/librabbitmq/macos/include/amqp.h deleted file mode 100644 index 2983b1665..000000000 --- a/ext/librabbitmq/macos/include/amqp.h +++ /dev/null @@ -1,2538 +0,0 @@ -/** \file */ -/* - * ***** BEGIN LICENSE BLOCK ***** - * Version: MIT - * - * Portions created by Alan Antonuk are Copyright (c) 2012-2014 - * Alan Antonuk. All Rights Reserved. - * - * 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_H -#define AMQP_H - -/** \cond HIDE_FROM_DOXYGEN */ - -#ifdef __cplusplus -#define AMQP_BEGIN_DECLS extern "C" { -#define AMQP_END_DECLS } -#else -#define AMQP_BEGIN_DECLS -#define AMQP_END_DECLS -#endif - -/* - * \internal - * Important API decorators: - * AMQP_PUBLIC_FUNCTION - a public API function - * AMQP_PUBLIC_VARIABLE - a public API external variable - * AMQP_CALL - calling convension (used on Win32) - */ - -#if defined(_WIN32) && defined(_MSC_VER) -#if defined(AMQP_BUILD) && !defined(AMQP_STATIC) -#define AMQP_PUBLIC_FUNCTION __declspec(dllexport) -#define AMQP_PUBLIC_VARIABLE __declspec(dllexport) extern -#else -#define AMQP_PUBLIC_FUNCTION -#if !defined(AMQP_STATIC) -#define AMQP_PUBLIC_VARIABLE __declspec(dllimport) extern -#else -#define AMQP_PUBLIC_VARIABLE extern -#endif -#endif -#define AMQP_CALL __cdecl - -#elif defined(_WIN32) && defined(__BORLANDC__) -#if defined(AMQP_BUILD) && !defined(AMQP_STATIC) -#define AMQP_PUBLIC_FUNCTION __declspec(dllexport) -#define AMQP_PUBLIC_VARIABLE __declspec(dllexport) extern -#else -#define AMQP_PUBLIC_FUNCTION -#if !defined(AMQP_STATIC) -#define AMQP_PUBLIC_VARIABLE __declspec(dllimport) extern -#else -#define AMQP_PUBLIC_VARIABLE extern -#endif -#endif -#define AMQP_CALL __cdecl - -#elif defined(_WIN32) && defined(__MINGW32__) -#if defined(AMQP_BUILD) && !defined(AMQP_STATIC) -#define AMQP_PUBLIC_FUNCTION __declspec(dllexport) -#define AMQP_PUBLIC_VARIABLE __declspec(dllexport) extern -#else -#define AMQP_PUBLIC_FUNCTION -#if !defined(AMQP_STATIC) -#define AMQP_PUBLIC_VARIABLE __declspec(dllimport) extern -#else -#define AMQP_PUBLIC_VARIABLE extern -#endif -#endif -#define AMQP_CALL __cdecl - -#elif defined(_WIN32) && defined(__CYGWIN__) -#if defined(AMQP_BUILD) && !defined(AMQP_STATIC) -#define AMQP_PUBLIC_FUNCTION __declspec(dllexport) -#define AMQP_PUBLIC_VARIABLE __declspec(dllexport) -#else -#define AMQP_PUBLIC_FUNCTION -#if !defined(AMQP_STATIC) -#define AMQP_PUBLIC_VARIABLE __declspec(dllimport) extern -#else -#define AMQP_PUBLIC_VARIABLE extern -#endif -#endif -#define AMQP_CALL __cdecl - -#elif defined(__GNUC__) && __GNUC__ >= 4 -#define AMQP_PUBLIC_FUNCTION __attribute__((visibility("default"))) -#define AMQP_PUBLIC_VARIABLE __attribute__((visibility("default"))) extern -#define AMQP_CALL -#else -#define AMQP_PUBLIC_FUNCTION -#define AMQP_PUBLIC_VARIABLE extern -#define AMQP_CALL -#endif - -#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) -#define AMQP_DEPRECATED(function) function __attribute__((__deprecated__)) -#elif defined(_MSC_VER) -#define AMQP_DEPRECATED(function) __declspec(deprecated) function -#else -#define AMQP_DEPRECATED(function) -#endif - -/* Define ssize_t on Win32/64 platforms - See: http://lists.cs.uiuc.edu/pipermail/llvmdev/2010-April/030649.html for - details - */ -#if !defined(_W64) -#if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -#define _W64 __w64 -#else -#define _W64 -#endif -#endif - -#ifdef _MSC_VER -#ifdef _WIN64 -typedef __int64 ssize_t; -#else -typedef _W64 int ssize_t; -#endif -#endif - -#if defined(_WIN32) && defined(__MINGW32__) -#include -#endif - -/** \endcond */ - -#include -#include - -struct timeval; - -AMQP_BEGIN_DECLS - -/** - * \def AMQP_VERSION_MAJOR - * - * Major library version number compile-time constant - * - * The major version is incremented when backwards incompatible API changes - * are made. - * - * \sa AMQP_VERSION, AMQP_VERSION_STRING - * - * \since v0.4.0 - */ - -/** - * \def AMQP_VERSION_MINOR - * - * Minor library version number compile-time constant - * - * The minor version is incremented when new APIs are added. Existing APIs - * are left alone. - * - * \sa AMQP_VERSION, AMQP_VERSION_STRING - * - * \since v0.4.0 - */ - -/** - * \def AMQP_VERSION_PATCH - * - * Patch library version number compile-time constant - * - * The patch version is incremented when library code changes, but the API - * is not changed. - * - * \sa AMQP_VERSION, AMQP_VERSION_STRING - * - * \since v0.4.0 - */ - -/** - * \def AMQP_VERSION_IS_RELEASE - * - * Version constant set to 1 for tagged release, 0 otherwise - * - * NOTE: versions that are not tagged releases are not guaranteed to be API/ABI - * compatible with older releases, and may change commit-to-commit. - * - * \sa AMQP_VERSION, AMQP_VERSION_STRING - * - * \since v0.4.0 - */ -/* - * Developer note: when changing these, be sure to update SOVERSION constants - * in CMakeLists.txt and configure.ac - */ - -#define AMQP_VERSION_MAJOR 0 -#define AMQP_VERSION_MINOR 10 -#define AMQP_VERSION_PATCH 0 -#define AMQP_VERSION_IS_RELEASE 0 - -/** - * \def AMQP_VERSION_CODE - * - * Helper macro to geneate a packed version code suitable for - * comparison with AMQP_VERSION. - * - * \sa amqp_version_number() AMQP_VERSION_MAJOR, AMQP_VERSION_MINOR, - * AMQP_VERSION_PATCH, AMQP_VERSION_IS_RELEASE, AMQP_VERSION - * - * \since v0.6.1 - */ -#define AMQP_VERSION_CODE(major, minor, patch, release) \ - ((major << 24) | (minor << 16) | (patch << 8) | (release)) - -/** - * \def AMQP_VERSION - * - * Packed version number - * - * AMQP_VERSION is a 4-byte unsigned integer with the most significant byte - * set to AMQP_VERSION_MAJOR, the second most significant byte set to - * AMQP_VERSION_MINOR, third most significant byte set to AMQP_VERSION_PATCH, - * and the lowest byte set to AMQP_VERSION_IS_RELEASE. - * - * For example version 2.3.4 which is released version would be encoded as - * 0x02030401 - * - * \sa amqp_version_number() AMQP_VERSION_MAJOR, AMQP_VERSION_MINOR, - * AMQP_VERSION_PATCH, AMQP_VERSION_IS_RELEASE, AMQP_VERSION_CODE - * - * \since v0.4.0 - */ -#define AMQP_VERSION \ - AMQP_VERSION_CODE(AMQP_VERSION_MAJOR, AMQP_VERSION_MINOR, \ - AMQP_VERSION_PATCH, AMQP_VERSION_IS_RELEASE) - -/** \cond HIDE_FROM_DOXYGEN */ -#define AMQ_STRINGIFY(s) AMQ_STRINGIFY_HELPER(s) -#define AMQ_STRINGIFY_HELPER(s) #s - -#define AMQ_VERSION_STRING \ - AMQ_STRINGIFY(AMQP_VERSION_MAJOR) \ - "." AMQ_STRINGIFY(AMQP_VERSION_MINOR) "." AMQ_STRINGIFY(AMQP_VERSION_PATCH) -/** \endcond */ - -/** - * \def AMQP_VERSION_STRING - * - * Version string compile-time constant - * - * Non-released versions of the library will have "-pre" appended to the - * version string - * - * \sa amqp_version() - * - * \since v0.4.0 - */ -#if AMQP_VERSION_IS_RELEASE -#define AMQP_VERSION_STRING AMQ_VERSION_STRING -#else -#define AMQP_VERSION_STRING AMQ_VERSION_STRING "-pre" -#endif - -/** - * Returns the rabbitmq-c version as a packed integer. - * - * See \ref AMQP_VERSION - * - * \return packed 32-bit integer representing version of library at runtime - * - * \sa AMQP_VERSION, amqp_version() - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -uint32_t AMQP_CALL amqp_version_number(void); - -/** - * Returns the rabbitmq-c version as a string. - * - * See \ref AMQP_VERSION_STRING - * - * \return a statically allocated string describing the version of rabbitmq-c. - * - * \sa amqp_version_number(), AMQP_VERSION_STRING, AMQP_VERSION - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -char const *AMQP_CALL amqp_version(void); - -/** - * \def AMQP_DEFAULT_FRAME_SIZE - * - * Default frame size (128Kb) - * - * \sa amqp_login(), amqp_login_with_properties() - * - * \since v0.4.0 - */ -#define AMQP_DEFAULT_FRAME_SIZE 131072 - -/** - * \def AMQP_DEFAULT_MAX_CHANNELS - * - * Default maximum number of channels (2047, RabbitMQ default limit of 2048, - * minus 1 for channel 0). RabbitMQ set a default limit of 2048 channels per - * connection in v3.7.5 to prevent broken clients from leaking too many - * channels. - * - * \sa amqp_login(), amqp_login_with_properties() - * - * \since v0.4.0 - */ -#define AMQP_DEFAULT_MAX_CHANNELS 2047 - -/** - * \def AMQP_DEFAULT_HEARTBEAT - * - * Default heartbeat interval (0, heartbeat disabled) - * - * \sa amqp_login(), amqp_login_with_properties() - * - * \since v0.4.0 - */ -#define AMQP_DEFAULT_HEARTBEAT 0 - -/** - * \def AMQP_DEFAULT_VHOST - * - * Default RabbitMQ vhost: "/" - * - * \sa amqp_login(), amqp_login_with_properties() - * - * \since v0.9.0 - */ -#define AMQP_DEFAULT_VHOST "/" - -/** - * boolean type 0 = false, true otherwise - * - * \since v0.1 - */ -typedef int amqp_boolean_t; - -/** - * Method number - * - * \since v0.1 - */ -typedef uint32_t amqp_method_number_t; - -/** - * Bitmask for flags - * - * \since v0.1 - */ -typedef uint32_t amqp_flags_t; - -/** - * Channel type - * - * \since v0.1 - */ -typedef uint16_t amqp_channel_t; - -/** - * Buffer descriptor - * - * \since v0.1 - */ -typedef struct amqp_bytes_t_ { - size_t len; /**< length of the buffer in bytes */ - void *bytes; /**< pointer to the beginning of the buffer */ -} amqp_bytes_t; - -/** - * Decimal data type - * - * \since v0.1 - */ -typedef struct amqp_decimal_t_ { - uint8_t decimals; /**< the location of the decimal point */ - uint32_t value; /**< the value before the decimal point is applied */ -} amqp_decimal_t; - -/** - * AMQP field table - * - * An AMQP field table is a set of key-value pairs. - * A key is a UTF-8 encoded string up to 128 bytes long, and are not null - * terminated. - * A value can be one of several different datatypes. \sa - * amqp_field_value_kind_t - * - * \sa amqp_table_entry_t - * - * \since v0.1 - */ -typedef struct amqp_table_t_ { - int num_entries; /**< length of entries array */ - struct amqp_table_entry_t_ *entries; /**< an array of table entries */ -} amqp_table_t; - -/** - * An AMQP Field Array - * - * A repeated set of field values, all must be of the same type - * - * \since v0.1 - */ -typedef struct amqp_array_t_ { - int num_entries; /**< Number of entries in the table */ - struct amqp_field_value_t_ *entries; /**< linked list of field values */ -} amqp_array_t; - -/* - 0-9 0-9-1 Qpid/Rabbit Type Remarks ---------------------------------------------------------------------------- - t t Boolean - b b Signed 8-bit - B Unsigned 8-bit - U s Signed 16-bit (A1) - u Unsigned 16-bit - I I I Signed 32-bit - i Unsigned 32-bit - L l Signed 64-bit (B) - l Unsigned 64-bit - f f 32-bit float - d d 64-bit float - D D D Decimal - s Short string (A2) - S S S Long string - A Nested Array - T T T Timestamp (u64) - F F F Nested Table - V V V Void - x Byte array - -Remarks: - - A1, A2: Notice how the types **CONFLICT** here. In Qpid and Rabbit, - 's' means a signed 16-bit integer; in 0-9-1, it means a - short string. - - B: Notice how the signednesses **CONFLICT** here. In Qpid and Rabbit, - 'l' means a signed 64-bit integer; in 0-9-1, it means an unsigned - 64-bit integer. - -I'm going with the Qpid/Rabbit types, where there's a conflict, and -the 0-9-1 types otherwise. 0-8 is a subset of 0-9, which is a subset -of the other two, so this will work for both 0-8 and 0-9-1 branches of -the code. -*/ - -/** - * A field table value - * - * \since v0.1 - */ -typedef struct amqp_field_value_t_ { - uint8_t kind; /**< the type of the entry /sa amqp_field_value_kind_t */ - union { - amqp_boolean_t boolean; /**< boolean type AMQP_FIELD_KIND_BOOLEAN */ - int8_t i8; /**< int8_t type AMQP_FIELD_KIND_I8 */ - uint8_t u8; /**< uint8_t type AMQP_FIELD_KIND_U8 */ - int16_t i16; /**< int16_t type AMQP_FIELD_KIND_I16 */ - uint16_t u16; /**< uint16_t type AMQP_FIELD_KIND_U16 */ - int32_t i32; /**< int32_t type AMQP_FIELD_KIND_I32 */ - uint32_t u32; /**< uint32_t type AMQP_FIELD_KIND_U32 */ - int64_t i64; /**< int64_t type AMQP_FIELD_KIND_I64 */ - uint64_t u64; /**< uint64_t type AMQP_FIELD_KIND_U64, - AMQP_FIELD_KIND_TIMESTAMP */ - float f32; /**< float type AMQP_FIELD_KIND_F32 */ - double f64; /**< double type AMQP_FIELD_KIND_F64 */ - amqp_decimal_t decimal; /**< amqp_decimal_t AMQP_FIELD_KIND_DECIMAL */ - amqp_bytes_t bytes; /**< amqp_bytes_t type AMQP_FIELD_KIND_UTF8, - AMQP_FIELD_KIND_BYTES */ - amqp_table_t table; /**< amqp_table_t type AMQP_FIELD_KIND_TABLE */ - amqp_array_t array; /**< amqp_array_t type AMQP_FIELD_KIND_ARRAY */ - } value; /**< a union of the value */ -} amqp_field_value_t; - -/** - * An entry in a field-table - * - * \sa amqp_table_encode(), amqp_table_decode(), amqp_table_clone() - * - * \since v0.1 - */ -typedef struct amqp_table_entry_t_ { - amqp_bytes_t key; /**< the table entry key. Its a null-terminated UTF-8 - * string, with a maximum size of 128 bytes */ - amqp_field_value_t value; /**< the table entry values */ -} amqp_table_entry_t; - -/** - * Field value types - * - * \since v0.1 - */ -typedef enum { - AMQP_FIELD_KIND_BOOLEAN = - 't', /**< boolean type. 0 = false, 1 = true @see amqp_boolean_t */ - AMQP_FIELD_KIND_I8 = 'b', /**< 8-bit signed integer, datatype: int8_t */ - AMQP_FIELD_KIND_U8 = 'B', /**< 8-bit unsigned integer, datatype: uint8_t */ - AMQP_FIELD_KIND_I16 = 's', /**< 16-bit signed integer, datatype: int16_t */ - AMQP_FIELD_KIND_U16 = 'u', /**< 16-bit unsigned integer, datatype: uint16_t */ - AMQP_FIELD_KIND_I32 = 'I', /**< 32-bit signed integer, datatype: int32_t */ - AMQP_FIELD_KIND_U32 = 'i', /**< 32-bit unsigned integer, datatype: uint32_t */ - AMQP_FIELD_KIND_I64 = 'l', /**< 64-bit signed integer, datatype: int64_t */ - AMQP_FIELD_KIND_U64 = 'L', /**< 64-bit unsigned integer, datatype: uint64_t */ - AMQP_FIELD_KIND_F32 = - 'f', /**< single-precision floating point value, datatype: float */ - AMQP_FIELD_KIND_F64 = - 'd', /**< double-precision floating point value, datatype: double */ - AMQP_FIELD_KIND_DECIMAL = - 'D', /**< amqp-decimal value, datatype: amqp_decimal_t */ - AMQP_FIELD_KIND_UTF8 = 'S', /**< UTF-8 null-terminated character string, - datatype: amqp_bytes_t */ - AMQP_FIELD_KIND_ARRAY = 'A', /**< field array (repeated values of another - datatype. datatype: amqp_array_t */ - AMQP_FIELD_KIND_TIMESTAMP = 'T', /**< 64-bit timestamp. datatype uint64_t */ - AMQP_FIELD_KIND_TABLE = 'F', /**< field table. encapsulates a table inside a - table entry. datatype: amqp_table_t */ - AMQP_FIELD_KIND_VOID = 'V', /**< empty entry */ - AMQP_FIELD_KIND_BYTES = - 'x' /**< unformatted byte string, datatype: amqp_bytes_t */ -} amqp_field_value_kind_t; - -/** - * A list of allocation blocks - * - * \since v0.1 - */ -typedef struct amqp_pool_blocklist_t_ { - int num_blocks; /**< Number of blocks in the block list */ - void **blocklist; /**< Array of memory blocks */ -} amqp_pool_blocklist_t; - -/** - * A memory pool - * - * \since v0.1 - */ -typedef struct amqp_pool_t_ { - size_t pagesize; /**< the size of the page in bytes. Allocations less than or - * equal to this size are allocated in the pages block list. - * Allocations greater than this are allocated in their own - * own block in the large_blocks block list */ - - amqp_pool_blocklist_t pages; /**< blocks that are the size of pagesize */ - amqp_pool_blocklist_t - large_blocks; /**< allocations larger than the pagesize */ - - int next_page; /**< an index to the next unused page block */ - char *alloc_block; /**< pointer to the current allocation block */ - size_t alloc_used; /**< number of bytes in the current allocation block that - has been used */ -} amqp_pool_t; - -/** - * An amqp method - * - * \since v0.1 - */ -typedef struct amqp_method_t_ { - amqp_method_number_t id; /**< the method id number */ - void *decoded; /**< pointer to the decoded method, - * cast to the appropriate type to use */ -} amqp_method_t; - -/** - * An AMQP frame - * - * \since v0.1 - */ -typedef struct amqp_frame_t_ { - uint8_t frame_type; /**< frame type. The types: - * - AMQP_FRAME_METHOD - use the method union member - * - AMQP_FRAME_HEADER - use the properties union member - * - AMQP_FRAME_BODY - use the body_fragment union member - */ - amqp_channel_t channel; /**< the channel the frame was received on */ - union { - amqp_method_t - method; /**< a method, use if frame_type == AMQP_FRAME_METHOD */ - struct { - uint16_t class_id; /**< the class for the properties */ - uint64_t body_size; /**< size of the body in bytes */ - void *decoded; /**< the decoded properties */ - amqp_bytes_t raw; /**< amqp-encoded properties structure */ - } properties; /**< message header, a.k.a., properties, - use if frame_type == AMQP_FRAME_HEADER */ - amqp_bytes_t body_fragment; /**< a body fragment, use if frame_type == - AMQP_FRAME_BODY */ - struct { - uint8_t transport_high; /**< @internal first byte of handshake */ - uint8_t transport_low; /**< @internal second byte of handshake */ - uint8_t protocol_version_major; /**< @internal third byte of handshake */ - uint8_t protocol_version_minor; /**< @internal fourth byte of handshake */ - } protocol_header; /**< Used only when doing the initial handshake with the - broker, don't use otherwise */ - } payload; /**< the payload of the frame */ -} amqp_frame_t; - -/** - * Response type - * - * \since v0.1 - */ -typedef enum amqp_response_type_enum_ { - AMQP_RESPONSE_NONE = 0, /**< the library got an EOF from the socket */ - AMQP_RESPONSE_NORMAL, /**< response normal, the RPC completed successfully */ - AMQP_RESPONSE_LIBRARY_EXCEPTION, /**< library error, an error occurred in the - library, examine the library_error */ - AMQP_RESPONSE_SERVER_EXCEPTION /**< server exception, the broker returned an - error, check replay */ -} amqp_response_type_enum; - -/** - * Reply from a RPC method on the broker - * - * \since v0.1 - */ -typedef struct amqp_rpc_reply_t_ { - amqp_response_type_enum reply_type; /**< the reply type: - * - AMQP_RESPONSE_NORMAL - the RPC - * completed successfully - * - AMQP_RESPONSE_SERVER_EXCEPTION - the - * broker returned - * an exception, check the reply field - * - AMQP_RESPONSE_LIBRARY_EXCEPTION - the - * library - * encountered an error, check the - * library_error field - */ - amqp_method_t reply; /**< in case of AMQP_RESPONSE_SERVER_EXCEPTION this - * field will be set to the method returned from the - * broker */ - int library_error; /**< in case of AMQP_RESPONSE_LIBRARY_EXCEPTION this - * field will be set to an error code. An error - * string can be retrieved using amqp_error_string */ -} amqp_rpc_reply_t; - -/** - * SASL method type - * - * \since v0.1 - */ -typedef enum amqp_sasl_method_enum_ { - AMQP_SASL_METHOD_UNDEFINED = -1, /**< Invalid SASL method */ - AMQP_SASL_METHOD_PLAIN = - 0, /**< the PLAIN SASL method for authentication to the broker */ - AMQP_SASL_METHOD_EXTERNAL = - 1 /**< the EXTERNAL SASL method for authentication to the broker */ -} amqp_sasl_method_enum; - -/** - * connection state object - * - * \since v0.1 - */ -typedef struct amqp_connection_state_t_ *amqp_connection_state_t; - -/** - * Socket object - * - * \since v0.4.0 - */ -typedef struct amqp_socket_t_ amqp_socket_t; - -/** - * Status codes - * - * \since v0.4.0 - */ -/* NOTE: When updating this enum, update the strings in librabbitmq/amqp_api.c - */ -typedef enum amqp_status_enum_ { - AMQP_STATUS_OK = 0x0, /**< Operation successful */ - AMQP_STATUS_NO_MEMORY = -0x0001, /**< Memory allocation - failed */ - AMQP_STATUS_BAD_AMQP_DATA = -0x0002, /**< Incorrect or corrupt - data was received from - the broker. This is a - protocol error. */ - AMQP_STATUS_UNKNOWN_CLASS = -0x0003, /**< An unknown AMQP class - was received. This is - a protocol error. */ - AMQP_STATUS_UNKNOWN_METHOD = -0x0004, /**< An unknown AMQP method - was received. This is - a protocol error. */ - AMQP_STATUS_HOSTNAME_RESOLUTION_FAILED = -0x0005, /**< Unable to resolve the - * hostname */ - AMQP_STATUS_INCOMPATIBLE_AMQP_VERSION = -0x0006, /**< The broker advertised - an incompaible AMQP - version */ - AMQP_STATUS_CONNECTION_CLOSED = -0x0007, /**< The connection to the - broker has been closed - */ - AMQP_STATUS_BAD_URL = -0x0008, /**< malformed AMQP URL */ - AMQP_STATUS_SOCKET_ERROR = -0x0009, /**< A socket error - occurred */ - AMQP_STATUS_INVALID_PARAMETER = -0x000A, /**< An invalid parameter - was passed into the - function */ - AMQP_STATUS_TABLE_TOO_BIG = -0x000B, /**< The amqp_table_t object - cannot be serialized - because the output - buffer is too small */ - AMQP_STATUS_WRONG_METHOD = -0x000C, /**< The wrong method was - received */ - AMQP_STATUS_TIMEOUT = -0x000D, /**< Operation timed out */ - AMQP_STATUS_TIMER_FAILURE = -0x000E, /**< The underlying system - timer facility failed */ - AMQP_STATUS_HEARTBEAT_TIMEOUT = -0x000F, /**< Timed out waiting for - heartbeat */ - AMQP_STATUS_UNEXPECTED_STATE = -0x0010, /**< Unexpected protocol - state */ - AMQP_STATUS_SOCKET_CLOSED = -0x0011, /**< Underlying socket is - closed */ - AMQP_STATUS_SOCKET_INUSE = -0x0012, /**< Underlying socket is - already open */ - AMQP_STATUS_BROKER_UNSUPPORTED_SASL_METHOD = -0x0013, /**< Broker does not - support the requested - SASL mechanism */ - AMQP_STATUS_UNSUPPORTED = -0x0014, /**< Parameter is unsupported - in this version */ - _AMQP_STATUS_NEXT_VALUE = -0x0015, /**< Internal value */ - - AMQP_STATUS_TCP_ERROR = -0x0100, /**< A generic TCP error - occurred */ - AMQP_STATUS_TCP_SOCKETLIB_INIT_ERROR = -0x0101, /**< An error occurred trying - to initialize the - socket library*/ - _AMQP_STATUS_TCP_NEXT_VALUE = -0x0102, /**< Internal value */ - - AMQP_STATUS_SSL_ERROR = -0x0200, /**< A generic SSL error - occurred. */ - AMQP_STATUS_SSL_HOSTNAME_VERIFY_FAILED = -0x0201, /**< SSL validation of - hostname against - peer certificate - failed */ - AMQP_STATUS_SSL_PEER_VERIFY_FAILED = -0x0202, /**< SSL validation of peer - certificate failed. */ - AMQP_STATUS_SSL_CONNECTION_FAILED = -0x0203, /**< SSL handshake failed. */ - _AMQP_STATUS_SSL_NEXT_VALUE = -0x0204 /**< Internal value */ -} amqp_status_enum; - -/** - * AMQP delivery modes. - * Use these values for the #amqp_basic_properties_t::delivery_mode field. - * - * \since v0.5 - */ -typedef enum { - AMQP_DELIVERY_NONPERSISTENT = 1, /**< Non-persistent message */ - AMQP_DELIVERY_PERSISTENT = 2 /**< Persistent message */ -} amqp_delivery_mode_enum; - -AMQP_END_DECLS - -#include - -AMQP_BEGIN_DECLS - -/** - * Empty bytes structure - * - * \since v0.2 - */ -AMQP_PUBLIC_VARIABLE const amqp_bytes_t amqp_empty_bytes; - -/** - * Empty table structure - * - * \since v0.2 - */ -AMQP_PUBLIC_VARIABLE const amqp_table_t amqp_empty_table; - -/** - * Empty table array structure - * - * \since v0.2 - */ -AMQP_PUBLIC_VARIABLE const amqp_array_t amqp_empty_array; - -/* Compatibility macros for the above, to avoid the need to update - code written against earlier versions of librabbitmq. */ - -/** - * \def AMQP_EMPTY_BYTES - * - * Deprecated, use \ref amqp_empty_bytes instead - * - * \deprecated use \ref amqp_empty_bytes instead - * - * \since v0.1 - */ -#define AMQP_EMPTY_BYTES amqp_empty_bytes - -/** - * \def AMQP_EMPTY_TABLE - * - * Deprecated, use \ref amqp_empty_table instead - * - * \deprecated use \ref amqp_empty_table instead - * - * \since v0.1 - */ -#define AMQP_EMPTY_TABLE amqp_empty_table - -/** - * \def AMQP_EMPTY_ARRAY - * - * Deprecated, use \ref amqp_empty_array instead - * - * \deprecated use \ref amqp_empty_array instead - * - * \since v0.1 - */ -#define AMQP_EMPTY_ARRAY amqp_empty_array - -/** - * Initializes an amqp_pool_t memory allocation pool for use - * - * Readies an allocation pool for use. An amqp_pool_t - * must be initialized before use - * - * \param [in] pool the amqp_pool_t structure to initialize. - * Calling this function on a pool a pool that has - * already been initialized will result in undefined - * behavior - * \param [in] pagesize the unit size that the pool will allocate - * memory chunks in. Anything allocated against the pool - * with a requested size will be carved out of a block - * this size. Allocations larger than this will be - * allocated individually - * - * \sa recycle_amqp_pool(), empty_amqp_pool(), amqp_pool_alloc(), - * amqp_pool_alloc_bytes(), amqp_pool_t - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL init_amqp_pool(amqp_pool_t *pool, size_t pagesize); - -/** - * Recycles an amqp_pool_t memory allocation pool - * - * Recycles the space allocate by the pool - * - * This invalidates all allocations made against the pool before this call is - * made, any use of any allocations made before recycle_amqp_pool() is called - * will result in undefined behavior. - * - * Note: this may or may not release memory, to force memory to be released - * call empty_amqp_pool(). - * - * \param [in] pool the amqp_pool_t to recycle - * - * \sa recycle_amqp_pool(), empty_amqp_pool(), amqp_pool_alloc(), - * amqp_pool_alloc_bytes() - * - * \since v0.1 - * - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL recycle_amqp_pool(amqp_pool_t *pool); - -/** - * Empties an amqp memory pool - * - * Releases all memory associated with an allocation pool - * - * \param [in] pool the amqp_pool_t to empty - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL empty_amqp_pool(amqp_pool_t *pool); - -/** - * Allocates a block of memory from an amqp_pool_t memory pool - * - * Memory will be aligned on a 8-byte boundary. If a 0-length allocation is - * requested, a NULL pointer will be returned. - * - * \param [in] pool the allocation pool to allocate the memory from - * \param [in] amount the size of the allocation in bytes. - * \return a pointer to the memory block, or NULL if the allocation cannot - * be satisfied. - * - * \sa init_amqp_pool(), recycle_amqp_pool(), empty_amqp_pool(), - * amqp_pool_alloc_bytes() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -void *AMQP_CALL amqp_pool_alloc(amqp_pool_t *pool, size_t amount); - -/** - * Allocates a block of memory from an amqp_pool_t to an amqp_bytes_t - * - * Memory will be aligned on a 8-byte boundary. If a 0-length allocation is - * requested, output.bytes = NULL. - * - * \param [in] pool the allocation pool to allocate the memory from - * \param [in] amount the size of the allocation in bytes - * \param [in] output the location to store the pointer. On success - * output.bytes will be set to the beginning of the buffer - * output.len will be set to amount - * On error output.bytes will be set to NULL and output.len - * set to 0 - * - * \sa init_amqp_pool(), recycle_amqp_pool(), empty_amqp_pool(), - * amqp_pool_alloc() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL amqp_pool_alloc_bytes(amqp_pool_t *pool, size_t amount, - amqp_bytes_t *output); - -/** - * Wraps a c string in an amqp_bytes_t - * - * Takes a string, calculates its length and creates an - * amqp_bytes_t that points to it. The string is not duplicated. - * - * For a given input cstr, The amqp_bytes_t output.bytes is the - * same as cstr, output.len is the length of the string not including - * the \0 terminator - * - * This function uses strlen() internally so cstr must be properly - * terminated - * - * \param [in] cstr the c string to wrap - * \return an amqp_bytes_t that describes the string - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_bytes_t AMQP_CALL amqp_cstring_bytes(char const *cstr); - -/** - * Duplicates an amqp_bytes_t buffer. - * - * The buffer is cloned and the contents copied. - * - * The memory associated with the output is allocated - * with amqp_bytes_malloc() and should be freed with - * amqp_bytes_free() - * - * \param [in] src - * \return a clone of the src - * - * \sa amqp_bytes_free(), amqp_bytes_malloc() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_bytes_t AMQP_CALL amqp_bytes_malloc_dup(amqp_bytes_t src); - -/** - * Allocates a amqp_bytes_t buffer - * - * Creates an amqp_bytes_t buffer of the specified amount, the buffer should be - * freed using amqp_bytes_free() - * - * \param [in] amount the size of the buffer in bytes - * \returns an amqp_bytes_t with amount bytes allocated. - * output.bytes will be set to NULL on error - * - * \sa amqp_bytes_free(), amqp_bytes_malloc_dup() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_bytes_t AMQP_CALL amqp_bytes_malloc(size_t amount); - -/** - * Frees an amqp_bytes_t buffer - * - * Frees a buffer allocated with amqp_bytes_malloc() or amqp_bytes_malloc_dup() - * - * Calling amqp_bytes_free on buffers not allocated with one - * of those two functions will result in undefined behavior - * - * \param [in] bytes the buffer to free - * - * \sa amqp_bytes_malloc(), amqp_bytes_malloc_dup() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL amqp_bytes_free(amqp_bytes_t bytes); - -/** - * Allocate and initialize a new amqp_connection_state_t object - * - * amqp_connection_state_t objects created with this function - * should be freed with amqp_destroy_connection() - * - * \returns an opaque pointer on success, NULL or 0 on failure. - * - * \sa amqp_destroy_connection() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_connection_state_t AMQP_CALL amqp_new_connection(void); - -/** - * Get the underlying socket descriptor for the connection - * - * \warning Use the socket returned from this function carefully, incorrect use - * of the socket outside of the library will lead to undefined behavior. - * Additionally rabbitmq-c may use the socket differently version-to-version, - * what may work in one version, may break in the next version. Be sure to - * throughly test any applications that use the socket returned by this - * function especially when using a newer version of rabbitmq-c - * - * \param [in] state the connection object - * \returns the socket descriptor if one has been set, -1 otherwise - * - * \sa amqp_tcp_socket_new(), amqp_ssl_socket_new(), amqp_socket_open() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_get_sockfd(amqp_connection_state_t state); - -/** - * Deprecated, use amqp_tcp_socket_new() or amqp_ssl_socket_new() - * - * \deprecated Use amqp_tcp_socket_new() or amqp_ssl_socket_new() - * - * Sets the socket descriptor associated with the connection. The socket - * should be connected to a broker, and should not be read to or written from - * before calling this function. A socket descriptor can be created and opened - * using amqp_open_socket() - * - * \param [in] state the connection object - * \param [in] sockfd the socket - * - * \sa amqp_open_socket(), amqp_tcp_socket_new(), amqp_ssl_socket_new() - * - * \since v0.1 - */ -AMQP_DEPRECATED(AMQP_PUBLIC_FUNCTION void AMQP_CALL - amqp_set_sockfd(amqp_connection_state_t state, int sockfd)); - -/** - * Tune client side parameters - * - * \warning This function may call abort() if the connection is in a certain - * state. As such it should probably not be called code outside the library. - * connection parameters should be specified when calling amqp_login() or - * amqp_login_with_properties() - * - * This function changes channel_max, frame_max, and heartbeat parameters, on - * the client side only. It does not try to renegotiate these parameters with - * the broker. Using this function will lead to unexpected results. - * - * \param [in] state the connection object - * \param [in] channel_max the maximum number of channels. - * The largest this can be is 65535 - * \param [in] frame_max the maximum size of an frame. - * The smallest this can be is 4096 - * The largest this can be is 2147483647 - * Unless you know what you're doing the recommended - * size is 131072 or 128KB - * \param [in] heartbeat the number of seconds between heartbeats - * - * \return AMQP_STATUS_OK on success, an amqp_status_enum value otherwise. - * Possible error codes include: - * - AMQP_STATUS_NO_MEMORY memory allocation failed. - * - AMQP_STATUS_TIMER_FAILURE the underlying system timer indicated it - * failed. - * - * \sa amqp_login(), amqp_login_with_properties() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_tune_connection(amqp_connection_state_t state, - int channel_max, int frame_max, - int heartbeat); - -/** - * Get the maximum number of channels the connection can handle - * - * The maximum number of channels is set when connection negotiation takes - * place in amqp_login() or amqp_login_with_properties(). - * - * \param [in] state the connection object - * \return the maximum number of channels. 0 if there is no limit - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_get_channel_max(amqp_connection_state_t state); - -/** - * Get the maximum size of an frame the connection can handle - * - * The maximum size of an frame is set when connection negotiation takes - * place in amqp_login() or amqp_login_with_properties(). - * - * \param [in] state the connection object - * \return the maximum size of an frame. - * - * \since v0.6 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_get_frame_max(amqp_connection_state_t state); - -/** - * Get the number of seconds between heartbeats of the connection - * - * The number of seconds between heartbeats is set when connection - * negotiation takes place in amqp_login() or amqp_login_with_properties(). - * - * \param [in] state the connection object - * \return the number of seconds between heartbeats. - * - * \since v0.6 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_get_heartbeat(amqp_connection_state_t state); - -/** - * Destroys an amqp_connection_state_t object - * - * Destroys a amqp_connection_state_t object that was created with - * amqp_new_connection(). If the connection with the broker is open, it will be - * implicitly closed with a reply code of 200 (success). Any memory that - * would be freed with amqp_maybe_release_buffers() or - * amqp_maybe_release_buffers_on_channel() will be freed, and use of that - * memory will caused undefined behavior. - * - * \param [in] state the connection object - * \return AMQP_STATUS_OK on success. amqp_status_enum value failure - * - * \sa amqp_new_connection() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_destroy_connection(amqp_connection_state_t state); - -/** - * Process incoming data - * - * \warning This is a low-level function intended for those who want to - * have greater control over input and output over the socket from the - * broker. Correctly using this function requires in-depth knowledge of AMQP - * and rabbitmq-c. - * - * For a given buffer of data received from the broker, decode the first - * frame in the buffer. If more than one frame is contained in the input buffer - * the return value will be less than the received_data size, the caller should - * adjust received_data buffer descriptor to point to the beginning of the - * buffer + the return value. - * - * \param [in] state the connection object - * \param [in] received_data a buffer of data received from the broker. The - * function will return the number of bytes of the buffer it used. The - * function copies these bytes to an internal buffer: this part of the buffer - * may be reused after this function successfully completes. - * \param [in,out] decoded_frame caller should pass in a pointer to an - * amqp_frame_t struct. If there is enough data in received_data for a - * complete frame, decoded_frame->frame_type will be set to something OTHER - * than 0. decoded_frame may contain members pointing to memory owned by - * the state object. This memory can be recycled with - * amqp_maybe_release_buffers() or amqp_maybe_release_buffers_on_channel(). - * \return number of bytes consumed from received_data or 0 if a 0-length - * buffer was passed. A negative return value indicates failure. Possible - * errors: - * - AMQP_STATUS_NO_MEMORY failure in allocating memory. The library is likely - * in an indeterminate state making recovery unlikely. Client should note the - * error and terminate the application - * - AMQP_STATUS_BAD_AMQP_DATA bad AMQP data was received. The connection - * should be shutdown immediately - * - AMQP_STATUS_UNKNOWN_METHOD: an unknown method was received from the - * broker. This is likely a protocol error and the connection should be - * shutdown immediately - * - AMQP_STATUS_UNKNOWN_CLASS: a properties frame with an unknown class - * was received from the broker. This is likely a protocol error and the - * connection should be shutdown immediately - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_handle_input(amqp_connection_state_t state, - amqp_bytes_t received_data, - amqp_frame_t *decoded_frame); - -/** - * Check to see if connection memory can be released - * - * \deprecated This function is deprecated in favor of - * amqp_maybe_release_buffers() or amqp_maybe_release_buffers_on_channel() - * - * Checks the state of an amqp_connection_state_t object to see if - * amqp_release_buffers() can be called successfully. - * - * \param [in] state the connection object - * \returns TRUE if the buffers can be released FALSE otherwise - * - * \sa amqp_release_buffers() amqp_maybe_release_buffers() - * amqp_maybe_release_buffers_on_channel() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_boolean_t AMQP_CALL amqp_release_buffers_ok(amqp_connection_state_t state); - -/** - * Release amqp_connection_state_t owned memory - * - * \deprecated This function is deprecated in favor of - * amqp_maybe_release_buffers() or amqp_maybe_release_buffers_on_channel() - * - * \warning caller should ensure amqp_release_buffers_ok() returns true before - * calling this function. Failure to do so may result in abort() being called. - * - * Release memory owned by the amqp_connection_state_t for reuse by the - * library. Use of any memory returned by the library before this function is - * called will result in undefined behavior. - * - * \note internally rabbitmq-c tries to reuse memory when possible. As a result - * its possible calling this function may not have a noticeable effect on - * memory usage. - * - * \param [in] state the connection object - * - * \sa amqp_release_buffers_ok() amqp_maybe_release_buffers() - * amqp_maybe_release_buffers_on_channel() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL amqp_release_buffers(amqp_connection_state_t state); - -/** - * Release amqp_connection_state_t owned memory - * - * Release memory owned by the amqp_connection_state_t object related to any - * channel, allowing reuse by the library. Use of any memory returned by the - * library before this function is called with result in undefined behavior. - * - * \note internally rabbitmq-c tries to reuse memory when possible. As a result - * its possible calling this function may not have a noticeable effect on - * memory usage. - * - * \param [in] state the connection object - * - * \sa amqp_maybe_release_buffers_on_channel() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL amqp_maybe_release_buffers(amqp_connection_state_t state); - -/** - * Release amqp_connection_state_t owned memory related to a channel - * - * Release memory owned by the amqp_connection_state_t object related to the - * specified channel, allowing reuse by the library. Use of any memory returned - * the library for a specific channel will result in undefined behavior. - * - * \note internally rabbitmq-c tries to reuse memory when possible. As a result - * its possible calling this function may not have a noticeable effect on - * memory usage. - * - * \param [in] state the connection object - * \param [in] channel the channel specifier for which memory should be - * released. Note that the library does not care about the state of the - * channel when calling this function - * - * \sa amqp_maybe_release_buffers() - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL amqp_maybe_release_buffers_on_channel( - amqp_connection_state_t state, amqp_channel_t channel); - -/** - * Send a frame to the broker - * - * \param [in] state the connection object - * \param [in] frame the frame to send to the broker - * \return AMQP_STATUS_OK on success, an amqp_status_enum value on error. - * Possible error codes: - * - AMQP_STATUS_BAD_AMQP_DATA the serialized form of the method or - * properties was too large to fit in a single AMQP frame, or the - * method contains an invalid value. The frame was not sent. - * - AMQP_STATUS_TABLE_TOO_BIG the serialized form of an amqp_table_t is - * too large to fit in a single AMQP frame. Frame was not sent. - * - AMQP_STATUS_UNKNOWN_METHOD an invalid method type was passed in - * - AMQP_STATUS_UNKNOWN_CLASS an invalid properties type was passed in - * - AMQP_STATUS_TIMER_FAILURE system timer indicated failure. The frame - * was sent - * - AMQP_STATUS_SOCKET_ERROR - * - AMQP_STATUS_SSL_ERROR - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_send_frame(amqp_connection_state_t state, - amqp_frame_t const *frame); - -/** - * Compare two table entries - * - * Works just like strcmp(), comparing two the table keys, datatype, then values - * - * \param [in] entry1 the entry on the left - * \param [in] entry2 the entry on the right - * \return 0 if entries are equal, 0 < if left is greater, 0 > if right is - * greater - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_table_entry_cmp(void const *entry1, void const *entry2); - -/** - * Open a socket to a remote host - * - * \deprecated This function is deprecated in favor of amqp_socket_open() - * - * Looks up the hostname, then attempts to open a socket to the host using - * the specified portnumber. It also sets various options on the socket to - * improve performance and correctness. - * - * \param [in] hostname this can be a hostname or IP address. - * Both IPv4 and IPv6 are acceptable - * \param [in] portnumber the port to connect on. RabbitMQ brokers - * listen on port 5672, and 5671 for SSL - * \return a positive value indicates success and is the sockfd. A negative - * value (see amqp_status_enum)is returned on failure. Possible error codes: - * - AMQP_STATUS_TCP_SOCKETLIB_INIT_ERROR Initialization of underlying socket - * library failed. - * - AMQP_STATUS_HOSTNAME_RESOLUTION_FAILED hostname lookup failed. - * - AMQP_STATUS_SOCKET_ERROR a socket error occurred. errno or - * WSAGetLastError() may return more useful information. - * - * \note IPv6 support was added in v0.3 - * - * \sa amqp_socket_open() amqp_set_sockfd() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_open_socket(char const *hostname, int portnumber); - -/** - * Send initial AMQP header to the broker - * - * \warning this is a low level function intended for those who want to - * interact with the broker at a very low level. Use of this function without - * understanding what it does will result in AMQP protocol errors. - * - * This function sends the AMQP protocol header to the broker. - * - * \param [in] state the connection object - * \return AMQP_STATUS_OK on success, a negative value on failure. Possible - * error codes: - * - AMQP_STATUS_CONNECTION_CLOSED the connection to the broker was closed. - * - AMQP_STATUS_SOCKET_ERROR a socket error occurred. It is likely the - * underlying socket has been closed. errno or WSAGetLastError() may provide - * further information. - * - AMQP_STATUS_SSL_ERROR a SSL error occurred. The connection to the broker - * was closed. - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_send_header(amqp_connection_state_t state); - -/** - * Checks to see if there are any incoming frames ready to be read - * - * Checks to see if there are any amqp_frame_t objects buffered by the - * amqp_connection_state_t object. Having one or more frames buffered means - * that amqp_simple_wait_frame() or amqp_simple_wait_frame_noblock() will - * return a frame without potentially blocking on a read() call. - * - * \param [in] state the connection object - * \return TRUE if there are frames enqueued, FALSE otherwise - * - * \sa amqp_simple_wait_frame() amqp_simple_wait_frame_noblock() - * amqp_data_in_buffer() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_boolean_t AMQP_CALL amqp_frames_enqueued(amqp_connection_state_t state); - -/** - * Read a single amqp_frame_t - * - * Waits for the next amqp_frame_t frame to be read from the broker. - * This function has the potential to block for a long time in the case of - * waiting for a basic.deliver method frame from the broker. - * - * The library may buffer frames. When an amqp_connection_state_t object - * has frames buffered calling amqp_simple_wait_frame() will return an - * amqp_frame_t without entering a blocking read(). You can test to see if - * an amqp_connection_state_t object has frames buffered by calling the - * amqp_frames_enqueued() function. - * - * The library has a socket read buffer. When there is data in an - * amqp_connection_state_t read buffer, amqp_simple_wait_frame() may return an - * amqp_frame_t without entering a blocking read(). You can test to see if an - * amqp_connection_state_t object has data in its read buffer by calling the - * amqp_data_in_buffer() function. - * - * \param [in] state the connection object - * \param [out] decoded_frame the frame - * \return AMQP_STATUS_OK on success, an amqp_status_enum value - * is returned otherwise. Possible errors include: - * - AMQP_STATUS_NO_MEMORY failure in allocating memory. The library is likely - * in an indeterminate state making recovery unlikely. Client should note the - * error and terminate the application - * - AMQP_STATUS_BAD_AMQP_DATA bad AMQP data was received. The connection - * should be shutdown immediately - * - AMQP_STATUS_UNKNOWN_METHOD: an unknown method was received from the - * broker. This is likely a protocol error and the connection should be - * shutdown immediately - * - AMQP_STATUS_UNKNOWN_CLASS: a properties frame with an unknown class - * was received from the broker. This is likely a protocol error and the - * connection should be shutdown immediately - * - AMQP_STATUS_HEARTBEAT_TIMEOUT timed out while waiting for heartbeat - * from the broker. The connection has been closed. - * - AMQP_STATUS_TIMER_FAILURE system timer indicated failure. - * - AMQP_STATUS_SOCKET_ERROR a socket error occurred. The connection has - * been closed - * - AMQP_STATUS_SSL_ERROR a SSL socket error occurred. The connection has - * been closed. - * - * \sa amqp_simple_wait_frame_noblock() amqp_frames_enqueued() - * amqp_data_in_buffer() - * - * \note as of v0.4.0 this function will no longer return heartbeat frames - * when enabled by specifying a non-zero heartbeat value in amqp_login(). - * Heartbeating is handled internally by the library. - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_simple_wait_frame(amqp_connection_state_t state, - amqp_frame_t *decoded_frame); - -/** - * Read a single amqp_frame_t with a timeout. - * - * Waits for the next amqp_frame_t frame to be read from the broker, up to - * a timespan specified by tv. The function will return AMQP_STATUS_TIMEOUT - * if the timeout is reached. The tv value is not modified by the function. - * - * If a 0 timeval is specified, the function behaves as if its non-blocking: it - * will test to see if a frame can be read from the broker, and return - * immediately. - * - * If NULL is passed in for tv, the function will behave like - * amqp_simple_wait_frame() and block until a frame is received from the broker - * - * The library may buffer frames. When an amqp_connection_state_t object - * has frames buffered calling amqp_simple_wait_frame_noblock() will return an - * amqp_frame_t without entering a blocking read(). You can test to see if an - * amqp_connection_state_t object has frames buffered by calling the - * amqp_frames_enqueued() function. - * - * The library has a socket read buffer. When there is data in an - * amqp_connection_state_t read buffer, amqp_simple_wait_frame_noblock() may - * return - * an amqp_frame_t without entering a blocking read(). You can test to see if an - * amqp_connection_state_t object has data in its read buffer by calling the - * amqp_data_in_buffer() function. - * - * \note This function does not return heartbeat frames. When enabled, - * heartbeating is handed internally internally by the library. - * - * \param [in,out] state the connection object - * \param [out] decoded_frame the frame - * \param [in] tv the maximum time to wait for a frame to be read. Setting - * tv->tv_sec = 0 and tv->tv_usec = 0 will do a non-blocking read. Specifying - * NULL for tv will make the function block until a frame is read. - * \return AMQP_STATUS_OK on success. An amqp_status_enum value is returned - * otherwise. Possible errors include: - * - AMQP_STATUS_TIMEOUT the timeout was reached while waiting for a frame - * from the broker. - * - AMQP_STATUS_INVALID_PARAMETER the tv parameter contains an invalid value. - * - AMQP_STATUS_NO_MEMORY failure in allocating memory. The library is likely - * in an indeterminate state making recovery unlikely. Client should note the - * error and terminate the application - * - AMQP_STATUS_BAD_AMQP_DATA bad AMQP data was received. The connection - * should be shutdown immediately - * - AMQP_STATUS_UNKNOWN_METHOD: an unknown method was received from the - * broker. This is likely a protocol error and the connection should be - * shutdown immediately - * - AMQP_STATUS_UNKNOWN_CLASS: a properties frame with an unknown class - * was received from the broker. This is likely a protocol error and the - * connection should be shutdown immediately - * - AMQP_STATUS_HEARTBEAT_TIMEOUT timed out while waiting for heartbeat - * from the broker. The connection has been closed. - * - AMQP_STATUS_TIMER_FAILURE system timer indicated failure. - * - AMQP_STATUS_SOCKET_ERROR a socket error occurred. The connection has - * been closed - * - AMQP_STATUS_SSL_ERROR a SSL socket error occurred. The connection has - * been closed. - * - * \sa amqp_simple_wait_frame() amqp_frames_enqueued() amqp_data_in_buffer() - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_simple_wait_frame_noblock(amqp_connection_state_t state, - amqp_frame_t *decoded_frame, - struct timeval *tv); - -/** - * Waits for a specific method from the broker - * - * \warning You probably don't want to use this function. If this function - * doesn't receive exactly the frame requested it closes the whole connection. - * - * Waits for a single method on a channel from the broker. - * If a frame is received that does not match expected_channel - * or expected_method the program will abort - * - * \param [in] state the connection object - * \param [in] expected_channel the channel that the method should be delivered - * on - * \param [in] expected_method the method to wait for - * \param [out] output the method - * \returns AMQP_STATUS_OK on success. An amqp_status_enum value is returned - * otherwise. Possible errors include: - * - AMQP_STATUS_WRONG_METHOD a frame containing the wrong method, wrong frame - * type or wrong channel was received. The connection is closed. - * - AMQP_STATUS_NO_MEMORY failure in allocating memory. The library is likely - * in an indeterminate state making recovery unlikely. Client should note the - * error and terminate the application - * - AMQP_STATUS_BAD_AMQP_DATA bad AMQP data was received. The connection - * should be shutdown immediately - * - AMQP_STATUS_UNKNOWN_METHOD: an unknown method was received from the - * broker. This is likely a protocol error and the connection should be - * shutdown immediately - * - AMQP_STATUS_UNKNOWN_CLASS: a properties frame with an unknown class - * was received from the broker. This is likely a protocol error and the - * connection should be shutdown immediately - * - AMQP_STATUS_HEARTBEAT_TIMEOUT timed out while waiting for heartbeat - * from the broker. The connection has been closed. - * - AMQP_STATUS_TIMER_FAILURE system timer indicated failure. - * - AMQP_STATUS_SOCKET_ERROR a socket error occurred. The connection has - * been closed - * - AMQP_STATUS_SSL_ERROR a SSL socket error occurred. The connection has - * been closed. - * - * \since v0.1 - */ - -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_simple_wait_method(amqp_connection_state_t state, - amqp_channel_t expected_channel, - amqp_method_number_t expected_method, - amqp_method_t *output); - -/** - * Sends a method to the broker - * - * This is a thin wrapper around amqp_send_frame(), providing a way to send - * a method to the broker on a specified channel. - * - * \param [in] state the connection object - * \param [in] channel the channel object - * \param [in] id the method number - * \param [in] decoded the method object - * \returns AMQP_STATUS_OK on success, an amqp_status_enum value otherwise. - * Possible errors include: - * - AMQP_STATUS_BAD_AMQP_DATA the serialized form of the method or - * properties was too large to fit in a single AMQP frame, or the - * method contains an invalid value. The frame was not sent. - * - AMQP_STATUS_TABLE_TOO_BIG the serialized form of an amqp_table_t is - * too large to fit in a single AMQP frame. Frame was not sent. - * - AMQP_STATUS_UNKNOWN_METHOD an invalid method type was passed in - * - AMQP_STATUS_UNKNOWN_CLASS an invalid properties type was passed in - * - AMQP_STATUS_TIMER_FAILURE system timer indicated failure. The frame - * was sent - * - AMQP_STATUS_SOCKET_ERROR - * - AMQP_STATUS_SSL_ERROR - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_send_method(amqp_connection_state_t state, - amqp_channel_t channel, amqp_method_number_t id, - void *decoded); - -/** - * Sends a method to the broker and waits for a method response - * - * \param [in] state the connection object - * \param [in] channel the channel object - * \param [in] request_id the method number of the request - * \param [in] expected_reply_ids a 0 terminated array of expected response - * method numbers - * \param [in] decoded_request_method the method to be sent to the broker - * \return a amqp_rpc_reply_t: - * - r.reply_type == AMQP_RESPONSE_NORMAL. RPC completed successfully - * - r.reply_type == AMQP_RESPONSE_SERVER_EXCEPTION. The broker returned an - * exception: - * - If r.reply.id == AMQP_CHANNEL_CLOSE_METHOD a channel exception - * occurred, cast r.reply.decoded to amqp_channel_close_t* to see details - * of the exception. The client should amqp_send_method() a - * amqp_channel_close_ok_t. The channel must be re-opened before it - * can be used again. Any resources associated with the channel - * (auto-delete exchanges, auto-delete queues, consumers) are invalid - * and must be recreated before attempting to use them again. - * - If r.reply.id == AMQP_CONNECTION_CLOSE_METHOD a connection exception - * occurred, cast r.reply.decoded to amqp_connection_close_t* to see - * details of the exception. The client amqp_send_method() a - * amqp_connection_close_ok_t and disconnect from the broker. - * - r.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION. An exception occurred - * within the library. Examine r.library_error and compare it against - * amqp_status_enum values to determine the error. - * - * \sa amqp_simple_rpc_decoded() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_simple_rpc( - amqp_connection_state_t state, amqp_channel_t channel, - amqp_method_number_t request_id, amqp_method_number_t *expected_reply_ids, - void *decoded_request_method); - -/** - * Sends a method to the broker and waits for a method response - * - * \param [in] state the connection object - * \param [in] channel the channel object - * \param [in] request_id the method number of the request - * \param [in] reply_id the method number expected in response - * \param [in] decoded_request_method the request method - * \return a pointer to the method returned from the broker, or NULL on error. - * On error amqp_get_rpc_reply() will return an amqp_rpc_reply_t with - * details on the error that occurred. - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -void *AMQP_CALL amqp_simple_rpc_decoded(amqp_connection_state_t state, - amqp_channel_t channel, - amqp_method_number_t request_id, - amqp_method_number_t reply_id, - void *decoded_request_method); - -/** - * Get the last global amqp_rpc_reply - * - * The API methods corresponding to most synchronous AMQP methods - * return a pointer to the decoded method result. Upon error, they - * return NULL, and we need some way of discovering what, if anything, - * went wrong. amqp_get_rpc_reply() returns the most recent - * amqp_rpc_reply_t instance corresponding to such an API operation - * for the given connection. - * - * Only use it for operations that do not themselves return - * amqp_rpc_reply_t; operations that do return amqp_rpc_reply_t - * generally do NOT update this per-connection-global amqp_rpc_reply_t - * instance. - * - * \param [in] state the connection object - * \return the most recent amqp_rpc_reply_t: - * - r.reply_type == AMQP_RESPONSE_NORMAL. RPC completed successfully - * - r.reply_type == AMQP_RESPONSE_SERVER_EXCEPTION. The broker returned an - * exception: - * - If r.reply.id == AMQP_CHANNEL_CLOSE_METHOD a channel exception - * occurred, cast r.reply.decoded to amqp_channel_close_t* to see details - * of the exception. The client should amqp_send_method() a - * amqp_channel_close_ok_t. The channel must be re-opened before it - * can be used again. Any resources associated with the channel - * (auto-delete exchanges, auto-delete queues, consumers) are invalid - * and must be recreated before attempting to use them again. - * - If r.reply.id == AMQP_CONNECTION_CLOSE_METHOD a connection exception - * occurred, cast r.reply.decoded to amqp_connection_close_t* to see - * details of the exception. The client amqp_send_method() a - * amqp_connection_close_ok_t and disconnect from the broker. - * - r.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION. An exception occurred - * within the library. Examine r.library_error and compare it against - * amqp_status_enum values to determine the error. - * - * \sa amqp_simple_rpc_decoded() - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_get_rpc_reply(amqp_connection_state_t state); - -/** - * Login to the broker - * - * After using amqp_open_socket and amqp_set_sockfd, call - * amqp_login to complete connecting to the broker - * - * \param [in] state the connection object - * \param [in] vhost the virtual host to connect to on the broker. The default - * on most brokers is "/" - * \param [in] channel_max the limit for number of channels for the connection. - * 0 means no limit, and is a good default - * (AMQP_DEFAULT_MAX_CHANNELS) - * Note that the maximum number of channels the protocol supports - * is 65535 (2^16, with the 0-channel reserved). The server can - * set a lower channel_max and then the client will use the lowest - * of the two - * \param [in] frame_max the maximum size of an AMQP frame on the wire to - * request of the broker for this connection. 4096 is the minimum - * size, 2^31-1 is the maximum, a good default is 131072 (128KB), - * or AMQP_DEFAULT_FRAME_SIZE - * \param [in] heartbeat the number of seconds between heartbeat frames to - * request of the broker. A value of 0 disables heartbeats. - * Note rabbitmq-c only has partial support for heartbeats, as of - * v0.4.0 they are only serviced during amqp_basic_publish() and - * amqp_simple_wait_frame()/amqp_simple_wait_frame_noblock() - * \param [in] sasl_method the SASL method to authenticate with the broker. - * followed by the authentication information. The following SASL - * methods are implemented: - * - AMQP_SASL_METHOD_PLAIN, the AMQP_SASL_METHOD_PLAIN argument - * should be followed by two arguments in this order: - * const char* username, and const char* password. - * - AMQP_SASL_METHOD_EXTERNAL, the AMQP_SASL_METHOD_EXTERNAL - * argument should be followed one argument: - * const char* identity. - * \return amqp_rpc_reply_t indicating success or failure. - * - r.reply_type == AMQP_RESPONSE_NORMAL. Login completed successfully - * - r.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION. In most cases errors - * from the broker when logging in will be represented by the broker closing - * the socket. In this case r.library_error will be set to - * AMQP_STATUS_CONNECTION_CLOSED. This error can represent a number of - * error conditions including: invalid vhost, authentication failure. - * - r.reply_type == AMQP_RESPONSE_SERVER_EXCEPTION. The broker returned an - * exception: - * - If r.reply.id == AMQP_CHANNEL_CLOSE_METHOD a channel exception - * occurred, cast r.reply.decoded to amqp_channel_close_t* to see details - * of the exception. The client should amqp_send_method() a - * amqp_channel_close_ok_t. The channel must be re-opened before it - * can be used again. Any resources associated with the channel - * (auto-delete exchanges, auto-delete queues, consumers) are invalid - * and must be recreated before attempting to use them again. - * - If r.reply.id == AMQP_CONNECTION_CLOSE_METHOD a connection exception - * occurred, cast r.reply.decoded to amqp_connection_close_t* to see - * details of the exception. The client amqp_send_method() a - * amqp_connection_close_ok_t and disconnect from the broker. - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_login(amqp_connection_state_t state, - char const *vhost, int channel_max, - int frame_max, int heartbeat, - amqp_sasl_method_enum sasl_method, ...); - -/** - * Login to the broker passing a properties table - * - * This function is similar to amqp_login() and differs in that it provides a - * way to pass client properties to the broker. This is commonly used to - * negotiate newer protocol features as they are supported by the broker. - * - * \param [in] state the connection object - * \param [in] vhost the virtual host to connect to on the broker. The default - * on most brokers is "/" - * \param [in] channel_max the limit for the number of channels for the - * connection. - * 0 means no limit, and is a good default - * (AMQP_DEFAULT_MAX_CHANNELS) - * Note that the maximum number of channels the protocol supports - * is 65535 (2^16, with the 0-channel reserved). The server can - * set a lower channel_max and then the client will use the lowest - * of the two - * \param [in] frame_max the maximum size of an AMQP frame ont he wire to - * request of the broker for this connection. 4096 is the minimum - * size, 2^31-1 is the maximum, a good default is 131072 (128KB), - * or AMQP_DEFAULT_FRAME_SIZE - * \param [in] heartbeat the number of seconds between heartbeat frame to - * request of the broker. A value of 0 disables heartbeats. - * Note rabbitmq-c only has partial support for hearts, as of - * v0.4.0 heartbeats are only serviced during amqp_basic_publish(), - * and amqp_simple_wait_frame()/amqp_simple_wait_frame_noblock() - * \param [in] properties a table of properties to send the broker. - * \param [in] sasl_method the SASL method to authenticate with the broker - * followed by the authentication information. The following SASL - * methods are implemented: - * - AMQP_SASL_METHOD_PLAIN, the AMQP_SASL_METHOD_PLAIN argument - * should be followed by two arguments in this order: - * const char* username, and const char* password. - * - AMQP_SASL_METHOD_EXTERNAL, the AMQP_SASL_METHOD_EXTERNAL - * argument should be followed one argument: - * const char* identity. - * \return amqp_rpc_reply_t indicating success or failure. - * - r.reply_type == AMQP_RESPONSE_NORMAL. Login completed successfully - * - r.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION. In most cases errors - * from the broker when logging in will be represented by the broker closing - * the socket. In this case r.library_error will be set to - * AMQP_STATUS_CONNECTION_CLOSED. This error can represent a number of - * error conditions including: invalid vhost, authentication failure. - * - r.reply_type == AMQP_RESPONSE_SERVER_EXCEPTION. The broker returned an - * exception: - * - If r.reply.id == AMQP_CHANNEL_CLOSE_METHOD a channel exception - * occurred, cast r.reply.decoded to amqp_channel_close_t* to see details - * of the exception. The client should amqp_send_method() a - * amqp_channel_close_ok_t. The channel must be re-opened before it - * can be used again. Any resources associated with the channel - * (auto-delete exchanges, auto-delete queues, consumers) are invalid - * and must be recreated before attempting to use them again. - * - If r.reply.id == AMQP_CONNECTION_CLOSE_METHOD a connection exception - * occurred, cast r.reply.decoded to amqp_connection_close_t* to see - * details of the exception. The client amqp_send_method() a - * amqp_connection_close_ok_t and disconnect from the broker. - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_login_with_properties( - amqp_connection_state_t state, char const *vhost, int channel_max, - int frame_max, int heartbeat, const amqp_table_t *properties, - amqp_sasl_method_enum sasl_method, ...); - -struct amqp_basic_properties_t_; - -/** - * Publish a message to the broker - * - * Publish a message on an exchange with a routing key. - * - * Note that at the AMQ protocol level basic.publish is an async method: - * this means error conditions that occur on the broker (such as publishing to - * a non-existent exchange) will not be reflected in the return value of this - * function. - * - * \param [in] state the connection object - * \param [in] channel the channel identifier - * \param [in] exchange the exchange on the broker to publish to - * \param [in] routing_key the routing key to use when publishing the message - * \param [in] mandatory indicate to the broker that the message MUST be routed - * to a queue. If the broker cannot do this it should respond with - * a basic.return method. - * \param [in] immediate indicate to the broker that the message MUST be - * delivered to a consumer immediately. If the broker cannot do this - * it should respond with a basic.return method. - * \param [in] properties the properties associated with the message - * \param [in] body the message body - * \return AMQP_STATUS_OK on success, amqp_status_enum value on failure. Note - * that basic.publish is an async method, the return value from this - * function only indicates that the message data was successfully - * transmitted to the broker. It does not indicate failures that occur - * on the broker, such as publishing to a non-existent exchange. - * Possible error values: - * - AMQP_STATUS_TIMER_FAILURE: system timer facility returned an error - * the message was not sent. - * - AMQP_STATUS_HEARTBEAT_TIMEOUT: connection timed out waiting for a - * heartbeat from the broker. The message was not sent. - * - AMQP_STATUS_NO_MEMORY: memory allocation failed. The message was - * not sent. - * - AMQP_STATUS_TABLE_TOO_BIG: a table in the properties was too large - * to fit in a single frame. Message was not sent. - * - AMQP_STATUS_CONNECTION_CLOSED: the connection was closed. - * - AMQP_STATUS_SSL_ERROR: a SSL error occurred. - * - AMQP_STATUS_TCP_ERROR: a TCP error occurred. errno or - * WSAGetLastError() may provide more information - * - * Note: this function does heartbeat processing as of v0.4.0 - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_basic_publish( - amqp_connection_state_t state, amqp_channel_t channel, - amqp_bytes_t exchange, amqp_bytes_t routing_key, amqp_boolean_t mandatory, - amqp_boolean_t immediate, struct amqp_basic_properties_t_ const *properties, - amqp_bytes_t body); - -/** - * Closes an channel - * - * \param [in] state the connection object - * \param [in] channel the channel identifier - * \param [in] code the reason for closing the channel, AMQP_REPLY_SUCCESS is a - * good default - * \return amqp_rpc_reply_t indicating success or failure - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_channel_close(amqp_connection_state_t state, - amqp_channel_t channel, int code); - -/** - * Closes the entire connection - * - * Implicitly closes all channels and informs the broker the connection - * is being closed, after receiving acknowledgment from the broker it closes - * the socket. - * - * \param [in] state the connection object - * \param [in] code the reason code for closing the connection. - * AMQP_REPLY_SUCCESS is a good default. - * \return amqp_rpc_reply_t indicating the result - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_connection_close(amqp_connection_state_t state, - int code); - -/** - * Acknowledges a message - * - * Does a basic.ack on a received message - * - * \param [in] state the connection object - * \param [in] channel the channel identifier - * \param [in] delivery_tag the delivery tag of the message to be ack'd - * \param [in] multiple if true, ack all messages up to this delivery tag, if - * false ack only this delivery tag - * \return 0 on success, 0 > on failing to send the ack to the broker. - * this will not indicate failure if something goes wrong on the - * broker - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_basic_ack(amqp_connection_state_t state, - amqp_channel_t channel, uint64_t delivery_tag, - amqp_boolean_t multiple); - -/** - * Do a basic.get - * - * Synchonously polls the broker for a message in a queue, and - * retrieves the message if a message is in the queue. - * - * \param [in] state the connection object - * \param [in] channel the channel identifier to use - * \param [in] queue the queue name to retrieve from - * \param [in] no_ack if true the message is automatically ack'ed - * if false amqp_basic_ack should be called once the message - * retrieved has been processed - * \return amqp_rpc_reply indicating success or failure - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_basic_get(amqp_connection_state_t state, - amqp_channel_t channel, - amqp_bytes_t queue, - amqp_boolean_t no_ack); - -/** - * Do a basic.reject - * - * Actively reject a message that has been delivered - * - * \param [in] state the connection object - * \param [in] channel the channel identifier - * \param [in] delivery_tag the delivery tag of the message to reject - * \param [in] requeue indicate to the broker whether it should requeue the - * message or just discard it. - * \return 0 on success, 0 > on failing to send the reject method to the broker. - * This will not indicate failure if something goes wrong on the - * broker. - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_basic_reject(amqp_connection_state_t state, - amqp_channel_t channel, uint64_t delivery_tag, - amqp_boolean_t requeue); - -/** - * Do a basic.nack - * - * Actively reject a message, this has the same effect as amqp_basic_reject() - * however, amqp_basic_nack() can negatively acknowledge multiple messages with - * one call much like amqp_basic_ack() can acknowledge mutliple messages with - * one call. - * - * \param [in] state the connection object - * \param [in] channel the channel identifier - * \param [in] delivery_tag the delivery tag of the message to reject - * \param [in] multiple if set to 1 negatively acknowledge all unacknowledged - * messages on this channel. - * \param [in] requeue indicate to the broker whether it should requeue the - * message or dead-letter it. - * \return AMQP_STATUS_OK on success, an amqp_status_enum value otherwise. - * - * \since v0.5.0 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_basic_nack(amqp_connection_state_t state, - amqp_channel_t channel, uint64_t delivery_tag, - amqp_boolean_t multiple, amqp_boolean_t requeue); -/** - * Check to see if there is data left in the receive buffer - * - * Can be used to see if there is data still in the buffer, if so - * calling amqp_simple_wait_frame will not immediately enter a - * blocking read. - * - * \param [in] state the connection object - * \return true if there is data in the recieve buffer, false otherwise - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -amqp_boolean_t AMQP_CALL amqp_data_in_buffer(amqp_connection_state_t state); - -/** - * Get the error string for the given error code. - * - * \deprecated This function has been deprecated in favor of - * \ref amqp_error_string2() which returns statically allocated - * string which do not need to be freed by the caller. - * - * The returned string resides on the heap; the caller is responsible - * for freeing it. - * - * \param [in] err return error code - * \return the error string - * - * \since v0.1 - */ -AMQP_DEPRECATED( - AMQP_PUBLIC_FUNCTION char *AMQP_CALL amqp_error_string(int err)); - -/** - * Get the error string for the given error code. - * - * Get an error string associated with an error code. The string is statically - * allocated and does not need to be freed - * - * \param [in] err the error code - * \return the error string - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -const char *AMQP_CALL amqp_error_string2(int err); - -/** - * Deserialize an amqp_table_t from AMQP wireformat - * - * This is an internal function and is not typically used by - * client applications - * - * \param [in] encoded the buffer containing the serialized data - * \param [in] pool memory pool used to allocate the table entries from - * \param [in] output the amqp_table_t structure to fill in. Any existing - * entries will be erased - * \param [in,out] offset The offset into the encoded buffer to start - * reading the serialized table. It will be updated - * by this function to end of the table - * \return AMQP_STATUS_OK on success, an amqp_status_enum value on failure - * Possible error codes: - * - AMQP_STATUS_NO_MEMORY out of memory - * - AMQP_STATUS_BAD_AMQP_DATA invalid wireformat - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_decode_table(amqp_bytes_t encoded, amqp_pool_t *pool, - amqp_table_t *output, size_t *offset); - -/** - * Serializes an amqp_table_t to the AMQP wireformat - * - * This is an internal function and is not typically used by - * client applications - * - * \param [in] encoded the buffer where to serialize the table to - * \param [in] input the amqp_table_t to serialize - * \param [in,out] offset The offset into the encoded buffer to start - * writing the serialized table. It will be updated - * by this function to where writing left off - * \return AMQP_STATUS_OK on success, an amqp_status_enum value on failure - * Possible error codes: - * - AMQP_STATUS_TABLE_TOO_BIG the serialized form is too large for the - * buffer - * - AMQP_STATUS_BAD_AMQP_DATA invalid table - * - * \since v0.1 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_encode_table(amqp_bytes_t encoded, amqp_table_t *input, - size_t *offset); - -/** - * Create a deep-copy of an amqp_table_t object - * - * Creates a deep-copy of an amqp_table_t object, using the provided pool - * object to allocate the necessary memory. This memory can be freed later by - * call recycle_amqp_pool(), or empty_amqp_pool() - * - * \param [in] original the table to copy - * \param [in,out] clone the table to copy to - * \param [in] pool the initialized memory pool to do allocations for the table - * from - * \return AMQP_STATUS_OK on success, amqp_status_enum value on failure. - * Possible error values: - * - AMQP_STATUS_NO_MEMORY - memory allocation failure. - * - AMQP_STATUS_INVALID_PARAMETER - invalid table (e.g., no key name) - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_table_clone(const amqp_table_t *original, - amqp_table_t *clone, amqp_pool_t *pool); - -/** - * A message object - * - * \since v0.4.0 - */ -typedef struct amqp_message_t_ { - amqp_basic_properties_t properties; /**< message properties */ - amqp_bytes_t body; /**< message body */ - amqp_pool_t pool; /**< pool used to allocate properties */ -} amqp_message_t; - -/** - * Reads the next message on a channel - * - * Reads a complete message (header + body) on a specified channel. This - * function is intended to be used with amqp_basic_get() or when an - * AMQP_BASIC_DELIVERY_METHOD method is received. - * - * \param [in,out] state the connection object - * \param [in] channel the channel on which to read the message from - * \param [in,out] message a pointer to a amqp_message_t object. Caller should - * call amqp_message_destroy() when it is done using the - * fields in the message object. The caller is responsible for - * allocating/destroying the amqp_message_t object itself. - * \param [in] flags pass in 0. Currently unused. - * \returns a amqp_rpc_reply_t object. ret.reply_type == AMQP_RESPONSE_NORMAL on - * success. - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_read_message(amqp_connection_state_t state, - amqp_channel_t channel, - amqp_message_t *message, - int flags); - -/** - * Frees memory associated with a amqp_message_t allocated in amqp_read_message - * - * \param [in] message - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL amqp_destroy_message(amqp_message_t *message); - -/** - * Envelope object - * - * \since v0.4.0 - */ -typedef struct amqp_envelope_t_ { - amqp_channel_t channel; /**< channel message was delivered on */ - amqp_bytes_t - consumer_tag; /**< the consumer tag the message was delivered to */ - uint64_t delivery_tag; /**< the messages delivery tag */ - amqp_boolean_t redelivered; /**< flag indicating whether this message is being - redelivered */ - amqp_bytes_t exchange; /**< exchange this message was published to */ - amqp_bytes_t - routing_key; /**< the routing key this message was published with */ - amqp_message_t message; /**< the message */ -} amqp_envelope_t; - -/** - * Wait for and consume a message - * - * Waits for a basic.deliver method on any channel, upon receipt of - * basic.deliver it reads that message, and returns. If any other method is - * received before basic.deliver, this function will return an amqp_rpc_reply_t - * with ret.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION, and - * ret.library_error == AMQP_STATUS_UNEXPECTED_STATE. The caller should then - * call amqp_simple_wait_frame() to read this frame and take appropriate action. - * - * This function should be used after starting a consumer with the - * amqp_basic_consume() function - * - * \param [in,out] state the connection object - * \param [in,out] envelope a pointer to a amqp_envelope_t object. Caller - * should call #amqp_destroy_envelope() when it is done using - * the fields in the envelope object. The caller is responsible - * for allocating/destroying the amqp_envelope_t object itself. - * \param [in] timeout a timeout to wait for a message delivery. Passing in - * NULL will result in blocking behavior. - * \param [in] flags pass in 0. Currently unused. - * \returns a amqp_rpc_reply_t object. ret.reply_type == AMQP_RESPONSE_NORMAL - * on success. If ret.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION, - * and ret.library_error == AMQP_STATUS_UNEXPECTED_STATE, a frame other - * than AMQP_BASIC_DELIVER_METHOD was received, the caller should call - * amqp_simple_wait_frame() to read this frame and take appropriate - * action. - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -amqp_rpc_reply_t AMQP_CALL amqp_consume_message(amqp_connection_state_t state, - amqp_envelope_t *envelope, - struct timeval *timeout, - int flags); - -/** - * Frees memory associated with a amqp_envelope_t allocated in - * amqp_consume_message() - * - * \param [in] envelope - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL amqp_destroy_envelope(amqp_envelope_t *envelope); - -/** - * Parameters used to connect to the RabbitMQ broker - * - * \since v0.2 - */ -struct amqp_connection_info { - char *user; /**< the username to authenticate with the broker, default on most - broker is 'guest' */ - char *password; /**< the password to authenticate with the broker, default on - most brokers is 'guest' */ - char *host; /**< the hostname of the broker */ - char *vhost; /**< the virtual host on the broker to connect to, a good default - is "/" */ - int port; /**< the port that the broker is listening on, default on most - brokers is 5672 */ - amqp_boolean_t ssl; -}; - -/** - * Initialze an amqp_connection_info to default values - * - * The default values are: - * - user: "guest" - * - password: "guest" - * - host: "localhost" - * - vhost: "/" - * - port: 5672 - * - * \param [out] parsed the connection info to set defaults on - * - * \since v0.2 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL - amqp_default_connection_info(struct amqp_connection_info *parsed); - -/** - * Parse a connection URL - * - * An amqp connection url takes the form: - * - * amqp://[$USERNAME[:$PASSWORD]\@]$HOST[:$PORT]/[$VHOST] - * - * Examples: - * amqp://guest:guest\@localhost:5672// - * amqp://guest:guest\@localhost/myvhost - * - * Any missing parts of the URL will be set to the defaults specified in - * amqp_default_connection_info. For amqps: URLs the default port will be set - * to 5671 instead of 5672 for non-SSL URLs. - * - * \note This function modifies url parameter. - * - * \param [in] url URI to parse, note that this parameter is modified by the - * function. - * \param [out] parsed the connection info gleaned from the URI. The char* - * members will point to parts of the url input parameter. - * Memory management will depend on how the url is allocated. - * \returns AMQP_STATUS_OK on success, AMQP_STATUS_BAD_URL on failure - * - * \since v0.2 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_parse_url(char *url, struct amqp_connection_info *parsed); - -/* socket API */ - -/** - * Open a socket connection. - * - * This function opens a socket connection returned from amqp_tcp_socket_new() - * or amqp_ssl_socket_new(). This function should be called after setting - * socket options and prior to assigning the socket to an AMQP connection with - * amqp_set_socket(). - * - * \param [in,out] self A socket object. - * \param [in] host Connect to this host. - * \param [in] port Connect on this remote port. - * - * \return AMQP_STATUS_OK on success, an amqp_status_enum on failure - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_socket_open(amqp_socket_t *self, const char *host, int port); - -/** - * Open a socket connection. - * - * This function opens a socket connection returned from amqp_tcp_socket_new() - * or amqp_ssl_socket_new(). This function should be called after setting - * socket options and prior to assigning the socket to an AMQP connection with - * amqp_set_socket(). - * - * \param [in,out] self A socket object. - * \param [in] host Connect to this host. - * \param [in] port Connect on this remote port. - * \param [in] timeout Max allowed time to spent on opening. If NULL - run in - * blocking mode - * - * \return AMQP_STATUS_OK on success, an amqp_status_enum on failure. - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_socket_open_noblock(amqp_socket_t *self, const char *host, - int port, struct timeval *timeout); - -/** - * Get the socket descriptor in use by a socket object. - * - * Retrieve the underlying socket descriptor. This function can be used to - * perform low-level socket operations that aren't supported by the socket - * interface. Use with caution! - * - * \param [in,out] self A socket object. - * - * \return The underlying socket descriptor, or -1 if there is no socket - * descriptor associated with - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_socket_get_sockfd(amqp_socket_t *self); - -/** - * Get the socket object associated with a amqp_connection_state_t - * - * \param [in] state the connection object to get the socket from - * \return a pointer to the socket object, or NULL if one has not been assigned - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -amqp_socket_t *AMQP_CALL amqp_get_socket(amqp_connection_state_t state); - -/** - * Get the broker properties table - * - * \param [in] state the connection object - * \return a pointer to an amqp_table_t containing the properties advertised - * by the broker on connection. The connection object owns the table, it - * should not be modified. - * - * \since v0.5.0 - */ -AMQP_PUBLIC_FUNCTION -amqp_table_t *AMQP_CALL - amqp_get_server_properties(amqp_connection_state_t state); - -/** - * Get the client properties table - * - * Get the properties that were passed to the broker on connection. - * - * \param [in] state the connection object - * \return a pointer to an amqp_table_t containing the properties advertised - * by the client on connection. The connection object owns the table, it - * should not be modified. - * - * \since v0.7.0 - */ -AMQP_PUBLIC_FUNCTION -amqp_table_t *AMQP_CALL - amqp_get_client_properties(amqp_connection_state_t state); - -/** - * Get the login handshake timeout. - * - * amqp_login and amqp_login_with_properties perform the login handshake with - * the broker. This function returns the timeout associated with completing - * this operation from the client side. This value can be set by using the - * amqp_set_handshake_timeout. - * - * Note that the RabbitMQ broker has configurable timeout for completing the - * login handshake, the default is 10 seconds. rabbitmq-c has a default of 12 - * seconds. - * - * \param [in] state the connection object - * \return a struct timeval representing the current login timeout for the state - * object. A NULL value represents an infinite timeout. The memory returned is - * owned by the connection object. - * - * \since v0.9.0 - */ -AMQP_PUBLIC_FUNCTION -struct timeval *AMQP_CALL - amqp_get_handshake_timeout(amqp_connection_state_t state); - -/** - * Set the login handshake timeout. - * - * amqp_login and amqp_login_with_properties perform the login handshake with - * the broker. This function sets the timeout associated with completing this - * operation from the client side. - * - * The timeout must be set before amqp_login or amqp_login_with_properties is - * called to change from the default timeout. - * - * Note that the RabbitMQ broker has a configurable timeout for completing the - * login handshake, the default is 10 seconds. rabbitmq-c has a default of 12 - * seconds. - * - * \param [in] state the connection object - * \param [in] timeout a struct timeval* representing new login timeout for the - * state object. NULL represents an infinite timeout. The value of timeout is - * copied internally, the caller is responsible for ownership of the passed in - * pointer, it does not need to remain valid after this function is called. - * \return AMQP_STATUS_OK on success. - * - * \since v0.9.0 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_set_handshake_timeout(amqp_connection_state_t state, - struct timeval *timeout); - -/** - * Get the RPC timeout - * - * Gets the timeout for any RPC-style AMQP command (e.g., amqp_queue_declare). - * This timeout may be changed at any time by calling \amqp_set_rpc_timeout - * function with a new timeout. The timeout applies individually to each RPC - * that is made. - * - * The default value is NULL, or an infinite timeout. - * - * When an RPC times out, the function will return an error AMQP_STATUS_TIMEOUT, - * and the connection will be closed. - * - *\warning RPC-timeouts are an advanced feature intended to be used to detect - * dead connections quickly when the rabbitmq-c implementation of heartbeats - * does not work. Do not use RPC timeouts unless you understand the implications - * of doing so. - * - * \param [in] state the connection object - * \return a struct timeval representing the current RPC timeout for the state - * object. A NULL value represents an infinite timeout. The memory returned is - * owned by the connection object. - * - * \since v0.9.0 - */ -AMQP_PUBLIC_FUNCTION -struct timeval *AMQP_CALL amqp_get_rpc_timeout(amqp_connection_state_t state); - -/** - * Set the RPC timeout - * - * Sets the timeout for any RPC-style AMQP command (e.g., amqp_queue_declare). - * This timeout may be changed at any time by calling this function with a new - * timeout. The timeout applies individually to each RPC that is made. - * - * The default value is NULL, or an infinite timeout. - * - * When an RPC times out, the function will return an error AMQP_STATUS_TIMEOUT, - * and the connection will be closed. - * - *\warning RPC-timeouts are an advanced feature intended to be used to detect - * dead connections quickly when the rabbitmq-c implementation of heartbeats - * does not work. Do not use RPC timeouts unless you understand the implications - * of doing so. - * - * \param [in] state the connection object - * \param [in] timeout a struct timeval* representing new RPC timeout for the - * state object. NULL represents an infinite timeout. The value of timeout is - * copied internally, the caller is responsible for ownership of the passed - * pointer, it does not need to remain valid after this function is called. - * \return AMQP_STATUS_SUCCESS on success. - * - * \since v0.9.0 - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_set_rpc_timeout(amqp_connection_state_t state, - struct timeval *timeout); - -AMQP_END_DECLS - -#endif /* AMQP_H */ diff --git a/ext/librabbitmq/macos/include/amqp_framing.h b/ext/librabbitmq/macos/include/amqp_framing.h deleted file mode 100644 index fb20acc1f..000000000 --- a/ext/librabbitmq/macos/include/amqp_framing.h +++ /dev/null @@ -1,1144 +0,0 @@ -/* Generated code. Do not edit. Edit and re-run codegen.py instead. - * - * ***** BEGIN LICENSE BLOCK ***** - * Version: MIT - * - * Portions created by Alan Antonuk are Copyright (c) 2012-2013 - * Alan Antonuk. All Rights Reserved. - * - * 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 ***** - */ - -/** @file amqp_framing.h */ -#ifndef AMQP_FRAMING_H -#define AMQP_FRAMING_H - -#include - -AMQP_BEGIN_DECLS - -#define AMQP_PROTOCOL_VERSION_MAJOR 0 /**< AMQP protocol version major */ -#define AMQP_PROTOCOL_VERSION_MINOR 9 /**< AMQP protocol version minor */ -#define AMQP_PROTOCOL_VERSION_REVISION \ - 1 /**< AMQP protocol version revision \ - */ -#define AMQP_PROTOCOL_PORT 5672 /**< Default AMQP Port */ -#define AMQP_FRAME_METHOD 1 /**< Constant: FRAME-METHOD */ -#define AMQP_FRAME_HEADER 2 /**< Constant: FRAME-HEADER */ -#define AMQP_FRAME_BODY 3 /**< Constant: FRAME-BODY */ -#define AMQP_FRAME_HEARTBEAT 8 /**< Constant: FRAME-HEARTBEAT */ -#define AMQP_FRAME_MIN_SIZE 4096 /**< Constant: FRAME-MIN-SIZE */ -#define AMQP_FRAME_END 206 /**< Constant: FRAME-END */ -#define AMQP_REPLY_SUCCESS 200 /**< Constant: REPLY-SUCCESS */ -#define AMQP_CONTENT_TOO_LARGE 311 /**< Constant: CONTENT-TOO-LARGE */ -#define AMQP_NO_ROUTE 312 /**< Constant: NO-ROUTE */ -#define AMQP_NO_CONSUMERS 313 /**< Constant: NO-CONSUMERS */ -#define AMQP_ACCESS_REFUSED 403 /**< Constant: ACCESS-REFUSED */ -#define AMQP_NOT_FOUND 404 /**< Constant: NOT-FOUND */ -#define AMQP_RESOURCE_LOCKED 405 /**< Constant: RESOURCE-LOCKED */ -#define AMQP_PRECONDITION_FAILED 406 /**< Constant: PRECONDITION-FAILED */ -#define AMQP_CONNECTION_FORCED 320 /**< Constant: CONNECTION-FORCED */ -#define AMQP_INVALID_PATH 402 /**< Constant: INVALID-PATH */ -#define AMQP_FRAME_ERROR 501 /**< Constant: FRAME-ERROR */ -#define AMQP_SYNTAX_ERROR 502 /**< Constant: SYNTAX-ERROR */ -#define AMQP_COMMAND_INVALID 503 /**< Constant: COMMAND-INVALID */ -#define AMQP_CHANNEL_ERROR 504 /**< Constant: CHANNEL-ERROR */ -#define AMQP_UNEXPECTED_FRAME 505 /**< Constant: UNEXPECTED-FRAME */ -#define AMQP_RESOURCE_ERROR 506 /**< Constant: RESOURCE-ERROR */ -#define AMQP_NOT_ALLOWED 530 /**< Constant: NOT-ALLOWED */ -#define AMQP_NOT_IMPLEMENTED 540 /**< Constant: NOT-IMPLEMENTED */ -#define AMQP_INTERNAL_ERROR 541 /**< Constant: INTERNAL-ERROR */ - -/* Function prototypes. */ - -/** - * Get constant name string from constant - * - * @param [in] constantNumber constant to get the name of - * @returns string describing the constant. String is managed by - * the library and should not be free()'d by the program - */ -AMQP_PUBLIC_FUNCTION -char const *AMQP_CALL amqp_constant_name(int constantNumber); - -/** - * Checks to see if a constant is a hard error - * - * A hard error occurs when something severe enough - * happens that the connection must be closed. - * - * @param [in] constantNumber the error constant - * @returns true if its a hard error, false otherwise - */ -AMQP_PUBLIC_FUNCTION -amqp_boolean_t AMQP_CALL amqp_constant_is_hard_error(int constantNumber); - -/** - * Get method name string from method number - * - * @param [in] methodNumber the method number - * @returns method name string. String is managed by the library - * and should not be freed()'d by the program - */ -AMQP_PUBLIC_FUNCTION -char const *AMQP_CALL amqp_method_name(amqp_method_number_t methodNumber); - -/** - * Check whether a method has content - * - * A method that has content will receive the method frame - * a properties frame, then 1 to N body frames - * - * @param [in] methodNumber the method number - * @returns true if method has content, false otherwise - */ -AMQP_PUBLIC_FUNCTION -amqp_boolean_t AMQP_CALL - amqp_method_has_content(amqp_method_number_t methodNumber); - -/** - * Decodes a method from AMQP wireformat - * - * @param [in] methodNumber the method number for the decoded parameter - * @param [in] pool the memory pool to allocate the decoded method from - * @param [in] encoded the encoded byte string buffer - * @param [out] decoded pointer to the decoded method struct - * @returns 0 on success, an error code otherwise - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_decode_method(amqp_method_number_t methodNumber, - amqp_pool_t *pool, amqp_bytes_t encoded, - void **decoded); - -/** - * Decodes a header frame properties structure from AMQP wireformat - * - * @param [in] class_id the class id for the decoded parameter - * @param [in] pool the memory pool to allocate the decoded properties from - * @param [in] encoded the encoded byte string buffer - * @param [out] decoded pointer to the decoded properties struct - * @returns 0 on success, an error code otherwise - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_decode_properties(uint16_t class_id, amqp_pool_t *pool, - amqp_bytes_t encoded, void **decoded); - -/** - * Encodes a method structure in AMQP wireformat - * - * @param [in] methodNumber the method number for the decoded parameter - * @param [in] decoded the method structure (e.g., amqp_connection_start_t) - * @param [in] encoded an allocated byte buffer for the encoded method - * structure to be written to. If the buffer isn't large enough - * to hold the encoded method, an error code will be returned. - * @returns 0 on success, an error code otherwise. - */ -AMQP_PUBLIC_FUNCTION -int AMQP_CALL amqp_encode_method(amqp_method_number_t methodNumber, - void *decoded, amqp_bytes_t encoded); - -/** - * Encodes a properties structure in AMQP wireformat - * - * @param [in] class_id the class id for the decoded parameter - * @param [in] decoded the properties structure (e.g., amqp_basic_properties_t) - * @param [in] encoded an allocated byte buffer for the encoded properties to - * written to. - * If the buffer isn't large enough to hold the encoded method, an - * an error code will be returned - * @returns 0 on success, an error code otherwise. - */ -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) /**< connection.start method id \ - @internal 10, 10; 655370 */ -/** connection.start method fields */ -typedef struct amqp_connection_start_t_ { - uint8_t version_major; /**< version-major */ - uint8_t version_minor; /**< version-minor */ - amqp_table_t server_properties; /**< server-properties */ - amqp_bytes_t mechanisms; /**< mechanisms */ - amqp_bytes_t locales; /**< locales */ -} amqp_connection_start_t; - -#define AMQP_CONNECTION_START_OK_METHOD \ - ((amqp_method_number_t)0x000A000B) /**< connection.start-ok method id \ - @internal 10, 11; 655371 */ -/** connection.start-ok method fields */ -typedef struct amqp_connection_start_ok_t_ { - amqp_table_t client_properties; /**< client-properties */ - amqp_bytes_t mechanism; /**< mechanism */ - amqp_bytes_t response; /**< response */ - amqp_bytes_t locale; /**< locale */ -} amqp_connection_start_ok_t; - -#define AMQP_CONNECTION_SECURE_METHOD \ - ((amqp_method_number_t)0x000A0014) /**< connection.secure method id \ - @internal 10, 20; 655380 */ -/** connection.secure method fields */ -typedef struct amqp_connection_secure_t_ { - amqp_bytes_t challenge; /**< challenge */ -} amqp_connection_secure_t; - -#define AMQP_CONNECTION_SECURE_OK_METHOD \ - ((amqp_method_number_t)0x000A0015) /**< connection.secure-ok method id \ - @internal 10, 21; 655381 */ -/** connection.secure-ok method fields */ -typedef struct amqp_connection_secure_ok_t_ { - amqp_bytes_t response; /**< response */ -} amqp_connection_secure_ok_t; - -#define AMQP_CONNECTION_TUNE_METHOD \ - ((amqp_method_number_t)0x000A001E) /**< connection.tune method id \ - @internal 10, 30; 655390 */ -/** connection.tune method fields */ -typedef struct amqp_connection_tune_t_ { - uint16_t channel_max; /**< channel-max */ - uint32_t frame_max; /**< frame-max */ - uint16_t heartbeat; /**< heartbeat */ -} amqp_connection_tune_t; - -#define AMQP_CONNECTION_TUNE_OK_METHOD \ - ((amqp_method_number_t)0x000A001F) /**< connection.tune-ok method id \ - @internal 10, 31; 655391 */ -/** connection.tune-ok method fields */ -typedef struct amqp_connection_tune_ok_t_ { - uint16_t channel_max; /**< channel-max */ - uint32_t frame_max; /**< frame-max */ - uint16_t heartbeat; /**< heartbeat */ -} amqp_connection_tune_ok_t; - -#define AMQP_CONNECTION_OPEN_METHOD \ - ((amqp_method_number_t)0x000A0028) /**< connection.open method id \ - @internal 10, 40; 655400 */ -/** connection.open method fields */ -typedef struct amqp_connection_open_t_ { - amqp_bytes_t virtual_host; /**< virtual-host */ - amqp_bytes_t capabilities; /**< capabilities */ - amqp_boolean_t insist; /**< insist */ -} amqp_connection_open_t; - -#define AMQP_CONNECTION_OPEN_OK_METHOD \ - ((amqp_method_number_t)0x000A0029) /**< connection.open-ok method id \ - @internal 10, 41; 655401 */ -/** connection.open-ok method fields */ -typedef struct amqp_connection_open_ok_t_ { - amqp_bytes_t known_hosts; /**< known-hosts */ -} amqp_connection_open_ok_t; - -#define AMQP_CONNECTION_CLOSE_METHOD \ - ((amqp_method_number_t)0x000A0032) /**< connection.close method id \ - @internal 10, 50; 655410 */ -/** connection.close method fields */ -typedef struct amqp_connection_close_t_ { - uint16_t reply_code; /**< reply-code */ - amqp_bytes_t reply_text; /**< reply-text */ - uint16_t class_id; /**< class-id */ - uint16_t method_id; /**< method-id */ -} amqp_connection_close_t; - -#define AMQP_CONNECTION_CLOSE_OK_METHOD \ - ((amqp_method_number_t)0x000A0033) /**< connection.close-ok method id \ - @internal 10, 51; 655411 */ -/** connection.close-ok method fields */ -typedef struct amqp_connection_close_ok_t_ { - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_connection_close_ok_t; - -#define AMQP_CONNECTION_BLOCKED_METHOD \ - ((amqp_method_number_t)0x000A003C) /**< connection.blocked method id \ - @internal 10, 60; 655420 */ -/** connection.blocked method fields */ -typedef struct amqp_connection_blocked_t_ { - amqp_bytes_t reason; /**< reason */ -} amqp_connection_blocked_t; - -#define AMQP_CONNECTION_UNBLOCKED_METHOD \ - ((amqp_method_number_t)0x000A003D) /**< connection.unblocked method id \ - @internal 10, 61; 655421 */ -/** connection.unblocked method fields */ -typedef struct amqp_connection_unblocked_t_ { - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_connection_unblocked_t; - -#define AMQP_CHANNEL_OPEN_METHOD \ - ((amqp_method_number_t)0x0014000A) /**< channel.open method id @internal \ - 20, 10; 1310730 */ -/** channel.open method fields */ -typedef struct amqp_channel_open_t_ { - amqp_bytes_t out_of_band; /**< out-of-band */ -} amqp_channel_open_t; - -#define AMQP_CHANNEL_OPEN_OK_METHOD \ - ((amqp_method_number_t)0x0014000B) /**< channel.open-ok method id \ - @internal 20, 11; 1310731 */ -/** channel.open-ok method fields */ -typedef struct amqp_channel_open_ok_t_ { - amqp_bytes_t channel_id; /**< channel-id */ -} amqp_channel_open_ok_t; - -#define AMQP_CHANNEL_FLOW_METHOD \ - ((amqp_method_number_t)0x00140014) /**< channel.flow method id @internal \ - 20, 20; 1310740 */ -/** channel.flow method fields */ -typedef struct amqp_channel_flow_t_ { - amqp_boolean_t active; /**< active */ -} amqp_channel_flow_t; - -#define AMQP_CHANNEL_FLOW_OK_METHOD \ - ((amqp_method_number_t)0x00140015) /**< channel.flow-ok method id \ - @internal 20, 21; 1310741 */ -/** channel.flow-ok method fields */ -typedef struct amqp_channel_flow_ok_t_ { - amqp_boolean_t active; /**< active */ -} amqp_channel_flow_ok_t; - -#define AMQP_CHANNEL_CLOSE_METHOD \ - ((amqp_method_number_t)0x00140028) /**< channel.close method id @internal \ - 20, 40; 1310760 */ -/** channel.close method fields */ -typedef struct amqp_channel_close_t_ { - uint16_t reply_code; /**< reply-code */ - amqp_bytes_t reply_text; /**< reply-text */ - uint16_t class_id; /**< class-id */ - uint16_t method_id; /**< method-id */ -} amqp_channel_close_t; - -#define AMQP_CHANNEL_CLOSE_OK_METHOD \ - ((amqp_method_number_t)0x00140029) /**< channel.close-ok method id \ - @internal 20, 41; 1310761 */ -/** channel.close-ok method fields */ -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) /**< access.request method id @internal \ - 30, 10; 1966090 */ -/** access.request method fields */ -typedef struct amqp_access_request_t_ { - amqp_bytes_t realm; /**< realm */ - amqp_boolean_t exclusive; /**< exclusive */ - amqp_boolean_t passive; /**< passive */ - amqp_boolean_t active; /**< active */ - amqp_boolean_t write; /**< write */ - amqp_boolean_t read; /**< read */ -} amqp_access_request_t; - -#define AMQP_ACCESS_REQUEST_OK_METHOD \ - ((amqp_method_number_t)0x001E000B) /**< access.request-ok method id \ - @internal 30, 11; 1966091 */ -/** access.request-ok method fields */ -typedef struct amqp_access_request_ok_t_ { - uint16_t ticket; /**< ticket */ -} amqp_access_request_ok_t; - -#define AMQP_EXCHANGE_DECLARE_METHOD \ - ((amqp_method_number_t)0x0028000A) /**< exchange.declare method id \ - @internal 40, 10; 2621450 */ -/** exchange.declare method fields */ -typedef struct amqp_exchange_declare_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t exchange; /**< exchange */ - amqp_bytes_t type; /**< type */ - amqp_boolean_t passive; /**< passive */ - amqp_boolean_t durable; /**< durable */ - amqp_boolean_t auto_delete; /**< auto-delete */ - amqp_boolean_t internal; /**< internal */ - amqp_boolean_t nowait; /**< nowait */ - amqp_table_t arguments; /**< arguments */ -} amqp_exchange_declare_t; - -#define AMQP_EXCHANGE_DECLARE_OK_METHOD \ - ((amqp_method_number_t)0x0028000B) /**< exchange.declare-ok method id \ - @internal 40, 11; 2621451 */ -/** exchange.declare-ok method fields */ -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) /**< exchange.delete method id \ - @internal 40, 20; 2621460 */ -/** exchange.delete method fields */ -typedef struct amqp_exchange_delete_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t exchange; /**< exchange */ - amqp_boolean_t if_unused; /**< if-unused */ - amqp_boolean_t nowait; /**< nowait */ -} amqp_exchange_delete_t; - -#define AMQP_EXCHANGE_DELETE_OK_METHOD \ - ((amqp_method_number_t)0x00280015) /**< exchange.delete-ok method id \ - @internal 40, 21; 2621461 */ -/** exchange.delete-ok method fields */ -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) /**< exchange.bind method id @internal \ - 40, 30; 2621470 */ -/** exchange.bind method fields */ -typedef struct amqp_exchange_bind_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t destination; /**< destination */ - amqp_bytes_t source; /**< source */ - amqp_bytes_t routing_key; /**< routing-key */ - amqp_boolean_t nowait; /**< nowait */ - amqp_table_t arguments; /**< arguments */ -} amqp_exchange_bind_t; - -#define AMQP_EXCHANGE_BIND_OK_METHOD \ - ((amqp_method_number_t)0x0028001F) /**< exchange.bind-ok method id \ - @internal 40, 31; 2621471 */ -/** exchange.bind-ok method fields */ -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) /**< exchange.unbind method id \ - @internal 40, 40; 2621480 */ -/** exchange.unbind method fields */ -typedef struct amqp_exchange_unbind_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t destination; /**< destination */ - amqp_bytes_t source; /**< source */ - amqp_bytes_t routing_key; /**< routing-key */ - amqp_boolean_t nowait; /**< nowait */ - amqp_table_t arguments; /**< arguments */ -} amqp_exchange_unbind_t; - -#define AMQP_EXCHANGE_UNBIND_OK_METHOD \ - ((amqp_method_number_t)0x00280033) /**< exchange.unbind-ok method id \ - @internal 40, 51; 2621491 */ -/** exchange.unbind-ok method fields */ -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) /**< queue.declare method id @internal \ - 50, 10; 3276810 */ -/** queue.declare method fields */ -typedef struct amqp_queue_declare_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t queue; /**< queue */ - amqp_boolean_t passive; /**< passive */ - amqp_boolean_t durable; /**< durable */ - amqp_boolean_t exclusive; /**< exclusive */ - amqp_boolean_t auto_delete; /**< auto-delete */ - amqp_boolean_t nowait; /**< nowait */ - amqp_table_t arguments; /**< arguments */ -} amqp_queue_declare_t; - -#define AMQP_QUEUE_DECLARE_OK_METHOD \ - ((amqp_method_number_t)0x0032000B) /**< queue.declare-ok method id \ - @internal 50, 11; 3276811 */ -/** queue.declare-ok method fields */ -typedef struct amqp_queue_declare_ok_t_ { - amqp_bytes_t queue; /**< queue */ - uint32_t message_count; /**< message-count */ - uint32_t consumer_count; /**< consumer-count */ -} amqp_queue_declare_ok_t; - -#define AMQP_QUEUE_BIND_METHOD \ - ((amqp_method_number_t)0x00320014) /**< queue.bind method id @internal 50, \ - 20; 3276820 */ -/** queue.bind method fields */ -typedef struct amqp_queue_bind_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t queue; /**< queue */ - amqp_bytes_t exchange; /**< exchange */ - amqp_bytes_t routing_key; /**< routing-key */ - amqp_boolean_t nowait; /**< nowait */ - amqp_table_t arguments; /**< arguments */ -} amqp_queue_bind_t; - -#define AMQP_QUEUE_BIND_OK_METHOD \ - ((amqp_method_number_t)0x00320015) /**< queue.bind-ok method id @internal \ - 50, 21; 3276821 */ -/** queue.bind-ok method fields */ -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) /**< queue.purge method id @internal \ - 50, 30; 3276830 */ -/** queue.purge method fields */ -typedef struct amqp_queue_purge_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t queue; /**< queue */ - amqp_boolean_t nowait; /**< nowait */ -} amqp_queue_purge_t; - -#define AMQP_QUEUE_PURGE_OK_METHOD \ - ((amqp_method_number_t)0x0032001F) /**< queue.purge-ok method id @internal \ - 50, 31; 3276831 */ -/** queue.purge-ok method fields */ -typedef struct amqp_queue_purge_ok_t_ { - uint32_t message_count; /**< message-count */ -} amqp_queue_purge_ok_t; - -#define AMQP_QUEUE_DELETE_METHOD \ - ((amqp_method_number_t)0x00320028) /**< queue.delete method id @internal \ - 50, 40; 3276840 */ -/** queue.delete method fields */ -typedef struct amqp_queue_delete_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t queue; /**< queue */ - amqp_boolean_t if_unused; /**< if-unused */ - amqp_boolean_t if_empty; /**< if-empty */ - amqp_boolean_t nowait; /**< nowait */ -} amqp_queue_delete_t; - -#define AMQP_QUEUE_DELETE_OK_METHOD \ - ((amqp_method_number_t)0x00320029) /**< queue.delete-ok method id \ - @internal 50, 41; 3276841 */ -/** queue.delete-ok method fields */ -typedef struct amqp_queue_delete_ok_t_ { - uint32_t message_count; /**< message-count */ -} amqp_queue_delete_ok_t; - -#define AMQP_QUEUE_UNBIND_METHOD \ - ((amqp_method_number_t)0x00320032) /**< queue.unbind method id @internal \ - 50, 50; 3276850 */ -/** queue.unbind method fields */ -typedef struct amqp_queue_unbind_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t queue; /**< queue */ - amqp_bytes_t exchange; /**< exchange */ - amqp_bytes_t routing_key; /**< routing-key */ - amqp_table_t arguments; /**< arguments */ -} amqp_queue_unbind_t; - -#define AMQP_QUEUE_UNBIND_OK_METHOD \ - ((amqp_method_number_t)0x00320033) /**< queue.unbind-ok method id \ - @internal 50, 51; 3276851 */ -/** queue.unbind-ok method fields */ -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) /**< basic.qos method id @internal 60, \ - 10; 3932170 */ -/** basic.qos method fields */ -typedef struct amqp_basic_qos_t_ { - uint32_t prefetch_size; /**< prefetch-size */ - uint16_t prefetch_count; /**< prefetch-count */ - amqp_boolean_t global; /**< global */ -} amqp_basic_qos_t; - -#define AMQP_BASIC_QOS_OK_METHOD \ - ((amqp_method_number_t)0x003C000B) /**< basic.qos-ok method id @internal \ - 60, 11; 3932171 */ -/** basic.qos-ok method fields */ -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) /**< basic.consume method id @internal \ - 60, 20; 3932180 */ -/** basic.consume method fields */ -typedef struct amqp_basic_consume_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t queue; /**< queue */ - amqp_bytes_t consumer_tag; /**< consumer-tag */ - amqp_boolean_t no_local; /**< no-local */ - amqp_boolean_t no_ack; /**< no-ack */ - amqp_boolean_t exclusive; /**< exclusive */ - amqp_boolean_t nowait; /**< nowait */ - amqp_table_t arguments; /**< arguments */ -} amqp_basic_consume_t; - -#define AMQP_BASIC_CONSUME_OK_METHOD \ - ((amqp_method_number_t)0x003C0015) /**< basic.consume-ok method id \ - @internal 60, 21; 3932181 */ -/** basic.consume-ok method fields */ -typedef struct amqp_basic_consume_ok_t_ { - amqp_bytes_t consumer_tag; /**< consumer-tag */ -} amqp_basic_consume_ok_t; - -#define AMQP_BASIC_CANCEL_METHOD \ - ((amqp_method_number_t)0x003C001E) /**< basic.cancel method id @internal \ - 60, 30; 3932190 */ -/** basic.cancel method fields */ -typedef struct amqp_basic_cancel_t_ { - amqp_bytes_t consumer_tag; /**< consumer-tag */ - amqp_boolean_t nowait; /**< nowait */ -} amqp_basic_cancel_t; - -#define AMQP_BASIC_CANCEL_OK_METHOD \ - ((amqp_method_number_t)0x003C001F) /**< basic.cancel-ok method id \ - @internal 60, 31; 3932191 */ -/** basic.cancel-ok method fields */ -typedef struct amqp_basic_cancel_ok_t_ { - amqp_bytes_t consumer_tag; /**< consumer-tag */ -} amqp_basic_cancel_ok_t; - -#define AMQP_BASIC_PUBLISH_METHOD \ - ((amqp_method_number_t)0x003C0028) /**< basic.publish method id @internal \ - 60, 40; 3932200 */ -/** basic.publish method fields */ -typedef struct amqp_basic_publish_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t exchange; /**< exchange */ - amqp_bytes_t routing_key; /**< routing-key */ - amqp_boolean_t mandatory; /**< mandatory */ - amqp_boolean_t immediate; /**< immediate */ -} amqp_basic_publish_t; - -#define AMQP_BASIC_RETURN_METHOD \ - ((amqp_method_number_t)0x003C0032) /**< basic.return method id @internal \ - 60, 50; 3932210 */ -/** basic.return method fields */ -typedef struct amqp_basic_return_t_ { - uint16_t reply_code; /**< reply-code */ - amqp_bytes_t reply_text; /**< reply-text */ - amqp_bytes_t exchange; /**< exchange */ - amqp_bytes_t routing_key; /**< routing-key */ -} amqp_basic_return_t; - -#define AMQP_BASIC_DELIVER_METHOD \ - ((amqp_method_number_t)0x003C003C) /**< basic.deliver method id @internal \ - 60, 60; 3932220 */ -/** basic.deliver method fields */ -typedef struct amqp_basic_deliver_t_ { - amqp_bytes_t consumer_tag; /**< consumer-tag */ - uint64_t delivery_tag; /**< delivery-tag */ - amqp_boolean_t redelivered; /**< redelivered */ - amqp_bytes_t exchange; /**< exchange */ - amqp_bytes_t routing_key; /**< routing-key */ -} amqp_basic_deliver_t; - -#define AMQP_BASIC_GET_METHOD \ - ((amqp_method_number_t)0x003C0046) /**< basic.get method id @internal 60, \ - 70; 3932230 */ -/** basic.get method fields */ -typedef struct amqp_basic_get_t_ { - uint16_t ticket; /**< ticket */ - amqp_bytes_t queue; /**< queue */ - amqp_boolean_t no_ack; /**< no-ack */ -} amqp_basic_get_t; - -#define AMQP_BASIC_GET_OK_METHOD \ - ((amqp_method_number_t)0x003C0047) /**< basic.get-ok method id @internal \ - 60, 71; 3932231 */ -/** basic.get-ok method fields */ -typedef struct amqp_basic_get_ok_t_ { - uint64_t delivery_tag; /**< delivery-tag */ - amqp_boolean_t redelivered; /**< redelivered */ - amqp_bytes_t exchange; /**< exchange */ - amqp_bytes_t routing_key; /**< routing-key */ - uint32_t message_count; /**< message-count */ -} amqp_basic_get_ok_t; - -#define AMQP_BASIC_GET_EMPTY_METHOD \ - ((amqp_method_number_t)0x003C0048) /**< basic.get-empty method id \ - @internal 60, 72; 3932232 */ -/** basic.get-empty method fields */ -typedef struct amqp_basic_get_empty_t_ { - amqp_bytes_t cluster_id; /**< cluster-id */ -} amqp_basic_get_empty_t; - -#define AMQP_BASIC_ACK_METHOD \ - ((amqp_method_number_t)0x003C0050) /**< basic.ack method id @internal 60, \ - 80; 3932240 */ -/** basic.ack method fields */ -typedef struct amqp_basic_ack_t_ { - uint64_t delivery_tag; /**< delivery-tag */ - amqp_boolean_t multiple; /**< multiple */ -} amqp_basic_ack_t; - -#define AMQP_BASIC_REJECT_METHOD \ - ((amqp_method_number_t)0x003C005A) /**< basic.reject method id @internal \ - 60, 90; 3932250 */ -/** basic.reject method fields */ -typedef struct amqp_basic_reject_t_ { - uint64_t delivery_tag; /**< delivery-tag */ - amqp_boolean_t requeue; /**< requeue */ -} amqp_basic_reject_t; - -#define AMQP_BASIC_RECOVER_ASYNC_METHOD \ - ((amqp_method_number_t)0x003C0064) /**< basic.recover-async method id \ - @internal 60, 100; 3932260 */ -/** basic.recover-async method fields */ -typedef struct amqp_basic_recover_async_t_ { - amqp_boolean_t requeue; /**< requeue */ -} amqp_basic_recover_async_t; - -#define AMQP_BASIC_RECOVER_METHOD \ - ((amqp_method_number_t)0x003C006E) /**< basic.recover method id @internal \ - 60, 110; 3932270 */ -/** basic.recover method fields */ -typedef struct amqp_basic_recover_t_ { - amqp_boolean_t requeue; /**< requeue */ -} amqp_basic_recover_t; - -#define AMQP_BASIC_RECOVER_OK_METHOD \ - ((amqp_method_number_t)0x003C006F) /**< basic.recover-ok method id \ - @internal 60, 111; 3932271 */ -/** basic.recover-ok method fields */ -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) /**< basic.nack method id @internal 60, \ - 120; 3932280 */ -/** basic.nack method fields */ -typedef struct amqp_basic_nack_t_ { - uint64_t delivery_tag; /**< delivery-tag */ - amqp_boolean_t multiple; /**< multiple */ - amqp_boolean_t requeue; /**< requeue */ -} amqp_basic_nack_t; - -#define AMQP_TX_SELECT_METHOD \ - ((amqp_method_number_t)0x005A000A) /**< tx.select method id @internal 90, \ - 10; 5898250 */ -/** tx.select method fields */ -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) /**< tx.select-ok method id @internal \ - 90, 11; 5898251 */ -/** tx.select-ok method fields */ -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) /**< tx.commit method id @internal 90, \ - 20; 5898260 */ -/** tx.commit method fields */ -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) /**< tx.commit-ok method id @internal \ - 90, 21; 5898261 */ -/** tx.commit-ok method fields */ -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) /**< tx.rollback method id @internal \ - 90, 30; 5898270 */ -/** tx.rollback method fields */ -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) /**< tx.rollback-ok method id @internal \ - 90, 31; 5898271 */ -/** tx.rollback-ok method fields */ -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) /**< confirm.select method id @internal \ - 85, 10; 5570570 */ -/** confirm.select method fields */ -typedef struct amqp_confirm_select_t_ { - amqp_boolean_t nowait; /**< nowait */ -} amqp_confirm_select_t; - -#define AMQP_CONFIRM_SELECT_OK_METHOD \ - ((amqp_method_number_t)0x0055000B) /**< confirm.select-ok method id \ - @internal 85, 11; 5570571 */ -/** confirm.select-ok method fields */ -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) /**< connection class id @internal 10 \ - */ -/** connection class properties */ -typedef struct amqp_connection_properties_t_ { - amqp_flags_t _flags; /**< bit-mask of set fields */ - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_connection_properties_t; - -#define AMQP_CHANNEL_CLASS (0x0014) /**< channel class id @internal 20 */ -/** channel class properties */ -typedef struct amqp_channel_properties_t_ { - amqp_flags_t _flags; /**< bit-mask of set fields */ - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_channel_properties_t; - -#define AMQP_ACCESS_CLASS (0x001E) /**< access class id @internal 30 */ -/** access class properties */ -typedef struct amqp_access_properties_t_ { - amqp_flags_t _flags; /**< bit-mask of set fields */ - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_access_properties_t; - -#define AMQP_EXCHANGE_CLASS (0x0028) /**< exchange class id @internal 40 */ -/** exchange class properties */ -typedef struct amqp_exchange_properties_t_ { - amqp_flags_t _flags; /**< bit-mask of set fields */ - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_exchange_properties_t; - -#define AMQP_QUEUE_CLASS (0x0032) /**< queue class id @internal 50 */ -/** queue class properties */ -typedef struct amqp_queue_properties_t_ { - amqp_flags_t _flags; /**< bit-mask of set fields */ - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_queue_properties_t; - -#define AMQP_BASIC_CLASS (0x003C) /**< basic class id @internal 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) -/** basic class properties */ -typedef struct amqp_basic_properties_t_ { - amqp_flags_t _flags; /**< bit-mask of set fields */ - amqp_bytes_t content_type; /**< content-type */ - amqp_bytes_t content_encoding; /**< content-encoding */ - amqp_table_t headers; /**< headers */ - uint8_t delivery_mode; /**< delivery-mode */ - uint8_t priority; /**< priority */ - amqp_bytes_t correlation_id; /**< correlation-id */ - amqp_bytes_t reply_to; /**< reply-to */ - amqp_bytes_t expiration; /**< expiration */ - amqp_bytes_t message_id; /**< message-id */ - uint64_t timestamp; /**< timestamp */ - amqp_bytes_t type; /**< type */ - amqp_bytes_t user_id; /**< user-id */ - amqp_bytes_t app_id; /**< app-id */ - amqp_bytes_t cluster_id; /**< cluster-id */ -} amqp_basic_properties_t; - -#define AMQP_TX_CLASS (0x005A) /**< tx class id @internal 90 */ -/** tx class properties */ -typedef struct amqp_tx_properties_t_ { - amqp_flags_t _flags; /**< bit-mask of set fields */ - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_tx_properties_t; - -#define AMQP_CONFIRM_CLASS (0x0055) /**< confirm class id @internal 85 */ -/** confirm class properties */ -typedef struct amqp_confirm_properties_t_ { - amqp_flags_t _flags; /**< bit-mask of set fields */ - char dummy; /**< Dummy field to avoid empty struct */ -} amqp_confirm_properties_t; - -/* API functions for methods */ - -/** - * amqp_channel_open - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @returns amqp_channel_open_ok_t - */ -AMQP_PUBLIC_FUNCTION -amqp_channel_open_ok_t *AMQP_CALL - amqp_channel_open(amqp_connection_state_t state, amqp_channel_t channel); -/** - * amqp_channel_flow - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] active active - * @returns amqp_channel_flow_ok_t - */ -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_exchange_declare - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] exchange exchange - * @param [in] type type - * @param [in] passive passive - * @param [in] durable durable - * @param [in] auto_delete auto_delete - * @param [in] internal internal - * @param [in] arguments arguments - * @returns amqp_exchange_declare_ok_t - */ -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_boolean_t auto_delete, amqp_boolean_t internal, - amqp_table_t arguments); -/** - * amqp_exchange_delete - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] exchange exchange - * @param [in] if_unused if_unused - * @returns amqp_exchange_delete_ok_t - */ -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_bind - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] destination destination - * @param [in] source source - * @param [in] routing_key routing_key - * @param [in] arguments arguments - * @returns amqp_exchange_bind_ok_t - */ -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_unbind - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] destination destination - * @param [in] source source - * @param [in] routing_key routing_key - * @param [in] arguments arguments - * @returns amqp_exchange_unbind_ok_t - */ -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_queue_declare - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] queue queue - * @param [in] passive passive - * @param [in] durable durable - * @param [in] exclusive exclusive - * @param [in] auto_delete auto_delete - * @param [in] arguments arguments - * @returns amqp_queue_declare_ok_t - */ -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_bind - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] queue queue - * @param [in] exchange exchange - * @param [in] routing_key routing_key - * @param [in] arguments arguments - * @returns amqp_queue_bind_ok_t - */ -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_purge - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] queue queue - * @returns amqp_queue_purge_ok_t - */ -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_delete - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] queue queue - * @param [in] if_unused if_unused - * @param [in] if_empty if_empty - * @returns amqp_queue_delete_ok_t - */ -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_unbind - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] queue queue - * @param [in] exchange exchange - * @param [in] routing_key routing_key - * @param [in] arguments arguments - * @returns amqp_queue_unbind_ok_t - */ -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_basic_qos - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] prefetch_size prefetch_size - * @param [in] prefetch_count prefetch_count - * @param [in] global global - * @returns amqp_basic_qos_ok_t - */ -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_consume - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] queue queue - * @param [in] consumer_tag consumer_tag - * @param [in] no_local no_local - * @param [in] no_ack no_ack - * @param [in] exclusive exclusive - * @param [in] arguments arguments - * @returns amqp_basic_consume_ok_t - */ -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_cancel - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] consumer_tag consumer_tag - * @returns amqp_basic_cancel_ok_t - */ -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_recover - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @param [in] requeue requeue - * @returns amqp_basic_recover_ok_t - */ -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_tx_select - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @returns amqp_tx_select_ok_t - */ -AMQP_PUBLIC_FUNCTION -amqp_tx_select_ok_t *AMQP_CALL amqp_tx_select(amqp_connection_state_t state, - amqp_channel_t channel); -/** - * amqp_tx_commit - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @returns amqp_tx_commit_ok_t - */ -AMQP_PUBLIC_FUNCTION -amqp_tx_commit_ok_t *AMQP_CALL amqp_tx_commit(amqp_connection_state_t state, - amqp_channel_t channel); -/** - * amqp_tx_rollback - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @returns amqp_tx_rollback_ok_t - */ -AMQP_PUBLIC_FUNCTION -amqp_tx_rollback_ok_t *AMQP_CALL amqp_tx_rollback(amqp_connection_state_t state, - amqp_channel_t channel); -/** - * amqp_confirm_select - * - * @param [in] state connection state - * @param [in] channel the channel to do the RPC on - * @returns amqp_confirm_select_ok_t - */ -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/ext/librabbitmq/macos/include/amqp_tcp_socket.h b/ext/librabbitmq/macos/include/amqp_tcp_socket.h deleted file mode 100644 index 3e9d82f54..000000000 --- a/ext/librabbitmq/macos/include/amqp_tcp_socket.h +++ /dev/null @@ -1,68 +0,0 @@ -/** \file */ -/* - * Portions created by Alan Antonuk are Copyright (c) 2013-2014 Alan Antonuk. - * All Rights Reserved. - * - * Portions created by Michael Steinert are Copyright (c) 2012-2013 Michael - * Steinert. 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. - */ - -/** - * A TCP socket connection. - */ - -#ifndef AMQP_TCP_SOCKET_H -#define AMQP_TCP_SOCKET_H - -#include - -AMQP_BEGIN_DECLS - -/** - * Create a new TCP socket. - * - * Call amqp_connection_close() to release socket resources. - * - * \return A new socket object or NULL if an error occurred. - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -amqp_socket_t *AMQP_CALL amqp_tcp_socket_new(amqp_connection_state_t state); - -/** - * Assign an open file descriptor to a socket object. - * - * This function must not be used in conjunction with amqp_socket_open(), i.e. - * the socket connection should already be open(2) when this function is - * called. - * - * \param [in,out] self A TCP socket object. - * \param [in] sockfd An open socket descriptor. - * - * \since v0.4.0 - */ -AMQP_PUBLIC_FUNCTION -void AMQP_CALL amqp_tcp_socket_set_sockfd(amqp_socket_t *self, int sockfd); - -AMQP_END_DECLS - -#endif /* AMQP_TCP_SOCKET_H */ diff --git a/ext/librabbitmq/macos/lib/librabbitmq.a b/ext/librabbitmq/macos/lib/librabbitmq.a deleted file mode 100644 index f3d27b31dcda47dde6601e85aa5901ff1b3a66d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95704 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 |g!EiVi5*iarI=?_M9XGjw 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 zg#`j{2`*?LDDXsetNetconfMaster((void *)_controller); // Join existing networks in networks.d @@ -991,15 +986,7 @@ public: if (cdbp.length() > 0) _controllerDbPath = cdbp; - json &rmq = settings["rabbitmq"]; - if (rmq.is_object() && _mqc == NULL) { - fprintf(stderr, "Reading RabbitMQ Config\n"); - _mqc = new MQConfig; - _mqc->port = rmq["port"]; - _mqc->host = OSUtils::jsonString(rmq["host"], ""); - _mqc->username = OSUtils::jsonString(rmq["username"], ""); - _mqc->password = OSUtils::jsonString(rmq["password"], ""); - } + // TODO: Redis config // Bind to wildcard instead of to specific interfaces (disables full tunnel capability) json &bind = settings["bind"];