summaryrefslogtreecommitdiff
path: root/librabbitmq/amqp.h
blob: 314e2c9d6dea84272db1ed8c6f87d004dd921902 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#ifndef librabbitmq_amqp_h
#define librabbitmq_amqp_h

#ifdef __cplusplus
extern "C" {
#endif

typedef int (*amqp_writer_fun_t)(int context, void const *buf, size_t len);

typedef int amqp_boolean_t;
typedef uint32_t amqp_method_number_t;
typedef uint32_t amqp_flags_t;
typedef uint16_t amqp_channel_t;

typedef struct amqp_bytes_t_ {
  size_t len;
  void *bytes;
} amqp_bytes_t;

typedef struct amqp_decimal_t_ {
  int decimals;
  uint32_t value;
} amqp_decimal_t;

typedef struct amqp_table_t_ {
  int num_entries;
  struct amqp_table_entry_t_ *entries;
} amqp_table_t;

typedef struct amqp_table_entry_t_ {
  amqp_bytes_t key;
  char kind;
  union {
    amqp_bytes_t bytes;
    int32_t i32;
    amqp_decimal_t decimal;
    uint64_t u64;
    amqp_table_t table;
  } value;
} amqp_table_entry_t;

typedef struct amqp_pool_blocklist_t_ {
  int num_blocks;
  void **blocklist;
} amqp_pool_blocklist_t;

typedef struct amqp_pool_t_ {
  size_t pagesize;

  amqp_pool_blocklist_t pages;
  amqp_pool_blocklist_t large_blocks;

  int next_page;
  char *alloc_block;
  size_t alloc_used;
} amqp_pool_t;

typedef struct amqp_frame_t_ {
  uint8_t frame_type; /* 0 means no event */
  amqp_channel_t channel;
  union {
    struct {
      amqp_method_number_t id;
      void *decoded;
    } method;
    struct {
      uint16_t class_id;
      void *decoded;
    } properties;
    amqp_bytes_t body_fragment;
  } payload;
} amqp_frame_t;

#define AMQP_EXCEPTION_CATEGORY_UNKNOWN 0
#define AMQP_EXCEPTION_CATEGORY_CONNECTION 1
#define AMQP_EXCEPTION_CATEGORY_CHANNEL 2

#define AMQP_FRAME_COMPLETE 0
#define AMQP_FRAME_INCOMPLETE 1

/* Opaque struct. */
typedef struct amqp_connection_state_t_ *amqp_connection_state_t;

extern char const *amqp_version(void);

extern void init_amqp_pool(amqp_pool_t *pool, size_t pagesize);
extern void recycle_amqp_pool(amqp_pool_t *pool);
extern void empty_amqp_pool(amqp_pool_t *pool);

extern void *amqp_pool_alloc(amqp_pool_t *pool, size_t amount);

extern amqp_connection_state_t amqp_new_connection(void);
extern void amqp_tune_connection(amqp_connection_state_t state,
				 int frame_max);
extern void amqp_destroy_connection(amqp_connection_state_t state);

extern int amqp_handle_input(amqp_connection_state_t state,
			     amqp_bytes_t received_data,
			     amqp_frame_t *decoded_frame);

extern int amqp_send_frame(amqp_connection_state_t state,
			   amqp_writer_fun_t writer,
			   int context,
			   amqp_frame_t const *frame);

extern int amqp_table_entry_cmp(void const *entry1, void const *entry2);

extern int amqp_open_socket(char const *hostname, int portnumber);

extern int amqp_send_header(amqp_writer_fun_t writer, int context);

extern int amqp_simple_wait_frame(amqp_connection_state_t state,
				  int sockfd,
				  amqp_frame_t *decoded_frame);

#ifdef __cplusplus
}
#endif

#endif