mosquitto 0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.travis.yml +29 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +25 -0
- data/LICENSE.md +13 -0
- data/README.md +244 -0
- data/Rakefile +42 -0
- data/TODO.md +19 -0
- data/examples/pub_sub.rb +41 -0
- data/ext/mosquitto/client.c +2163 -0
- data/ext/mosquitto/client.h +145 -0
- data/ext/mosquitto/extconf.rb +31 -0
- data/ext/mosquitto/message.c +168 -0
- data/ext/mosquitto/message.h +16 -0
- data/ext/mosquitto/mosquitto_ext.c +88 -0
- data/ext/mosquitto/mosquitto_ext.h +35 -0
- data/ext/mosquitto/mosquitto_prelude.h +26 -0
- data/ext/mosquitto/rubinius.h +6 -0
- data/ext/mosquitto/ruby18.h +6 -0
- data/ext/mosquitto/ruby19.h +9 -0
- data/ext/mosquitto/ruby2.h +6 -0
- data/lib/mosquitto.rb +11 -0
- data/lib/mosquitto/client.rb +8 -0
- data/lib/mosquitto/logging.rb +32 -0
- data/lib/mosquitto/version.rb +5 -0
- data/mosquitto.gemspec +23 -0
- data/test/helper.rb +59 -0
- data/test/ssl/all-ca.crt +75 -0
- data/test/ssl/client-expired.crt +61 -0
- data/test/ssl/client-revoked.crt +61 -0
- data/test/ssl/client-revoked.csr +12 -0
- data/test/ssl/client-revoked.key +15 -0
- data/test/ssl/client.crt +61 -0
- data/test/ssl/client.csr +12 -0
- data/test/ssl/client.key +15 -0
- data/test/ssl/crl.pem +10 -0
- data/test/ssl/demoCA/crlnumber +1 -0
- data/test/ssl/demoCA/index.txt +1 -0
- data/test/ssl/demoCA/index.txt.attr +1 -0
- data/test/ssl/demoCA/serial +1 -0
- data/test/ssl/gen.sh +70 -0
- data/test/ssl/mosquitto.org.crt +18 -0
- data/test/ssl/openssl.cnf +406 -0
- data/test/ssl/readme.txt +2 -0
- data/test/ssl/rootCA/crlnumber +1 -0
- data/test/ssl/rootCA/index.txt +2 -0
- data/test/ssl/rootCA/index.txt.attr +1 -0
- data/test/ssl/rootCA/serial +1 -0
- data/test/ssl/server-expired.crt +0 -0
- data/test/ssl/server.crt +60 -0
- data/test/ssl/server.csr +12 -0
- data/test/ssl/server.key +15 -0
- data/test/ssl/signingCA/crlnumber +1 -0
- data/test/ssl/signingCA/index.txt +4 -0
- data/test/ssl/signingCA/index.txt.attr +1 -0
- data/test/ssl/signingCA/serial +1 -0
- data/test/ssl/test-alt-ca.crt +58 -0
- data/test/ssl/test-alt-ca.key +15 -0
- data/test/ssl/test-bad-root-ca.crt +17 -0
- data/test/ssl/test-bad-root-ca.key +15 -0
- data/test/ssl/test-ca.srl +1 -0
- data/test/ssl/test-fake-root-ca.crt +17 -0
- data/test/ssl/test-fake-root-ca.key +15 -0
- data/test/ssl/test-root-ca.crt +17 -0
- data/test/ssl/test-root-ca.key +15 -0
- data/test/ssl/test-signing-ca.crt +58 -0
- data/test/ssl/test-signing-ca.key +15 -0
- data/test/test_callbacks.rb +93 -0
- data/test/test_client.rb +141 -0
- data/test/test_custom_logger.rb +30 -0
- data/test/test_integration.rb +572 -0
- data/test/test_loops.rb +56 -0
- data/test/test_mosquitto.rb +28 -0
- data/test/test_pub_sub.rb +51 -0
- data/test/test_threads.rb +69 -0
- data/test/test_tls.rb +67 -0
- metadata +203 -0
@@ -0,0 +1,145 @@
|
|
1
|
+
#ifndef MOSQUITTO_CLIENT_H
|
2
|
+
#define MOSQUITTO_CLIENT_H
|
3
|
+
|
4
|
+
typedef struct mosquitto_callback_t mosquitto_callback_t;
|
5
|
+
|
6
|
+
typedef struct {
|
7
|
+
struct mosquitto *mosq;
|
8
|
+
VALUE connect_cb;
|
9
|
+
VALUE disconnect_cb;
|
10
|
+
VALUE publish_cb;
|
11
|
+
VALUE message_cb;
|
12
|
+
VALUE subscribe_cb;
|
13
|
+
VALUE unsubscribe_cb;
|
14
|
+
VALUE log_cb;
|
15
|
+
VALUE callback_thread;
|
16
|
+
pthread_mutex_t callback_mutex;
|
17
|
+
pthread_cond_t callback_cond;
|
18
|
+
mosquitto_callback_t *callback_queue;
|
19
|
+
} mosquitto_client_wrapper;
|
20
|
+
|
21
|
+
#define MosquittoGetClient(obj) \
|
22
|
+
mosquitto_client_wrapper *client = NULL; \
|
23
|
+
Data_Get_Struct(obj, mosquitto_client_wrapper, client); \
|
24
|
+
if (!client) rb_raise(rb_eTypeError, "uninitialized Mosquitto client!");
|
25
|
+
|
26
|
+
#define MosquittoAssertCallback(cb, arity) \
|
27
|
+
if (NIL_P(cb)){ \
|
28
|
+
cb = proc; \
|
29
|
+
} else { \
|
30
|
+
if (rb_class_of(cb) != rb_cProc) \
|
31
|
+
rb_raise(rb_eTypeError, "Expected a Proc callback"); \
|
32
|
+
if (rb_proc_arity(cb) != arity) \
|
33
|
+
rb_raise(rb_eArgError, "Callback expects %d argument(s), got %d", arity, NUM2INT(rb_proc_arity(cb))); \
|
34
|
+
}
|
35
|
+
|
36
|
+
// TODO: xmalloc, the Ruby VM's preferred allocation method for managing memory pressure fails under GC stress when callbacks
|
37
|
+
// fire on a non-Ruby thread ( mosquitto_loop_start )
|
38
|
+
#define MOSQ_ALLOC(type) ((type*)malloc(sizeof(type)))
|
39
|
+
|
40
|
+
#define ON_CONNECT_CALLBACK 0x00
|
41
|
+
#define ON_DISCONNECT_CALLBACK 0x01
|
42
|
+
#define ON_PUBLISH_CALLBACK 0x02
|
43
|
+
#define ON_MESSAGE_CALLBACK 0x04
|
44
|
+
#define ON_SUBSCRIBE_CALLBACK 0x08
|
45
|
+
#define ON_UNSUBSCRIBE_CALLBACK 0x10
|
46
|
+
#define ON_LOG_CALLBACK 0x20
|
47
|
+
|
48
|
+
typedef struct on_connect_callback_args_t on_connect_callback_args_t;
|
49
|
+
struct on_connect_callback_args_t {
|
50
|
+
int rc;
|
51
|
+
};
|
52
|
+
|
53
|
+
typedef struct on_disconnect_callback_args_t on_disconnect_callback_args_t;
|
54
|
+
struct on_disconnect_callback_args_t {
|
55
|
+
int rc;
|
56
|
+
};
|
57
|
+
|
58
|
+
typedef struct on_publish_callback_args_t on_publish_callback_args_t;
|
59
|
+
struct on_publish_callback_args_t {
|
60
|
+
int mid;
|
61
|
+
};
|
62
|
+
|
63
|
+
typedef struct on_message_callback_args_t on_message_callback_args_t;
|
64
|
+
struct on_message_callback_args_t {
|
65
|
+
struct mosquitto_message *msg;
|
66
|
+
};
|
67
|
+
|
68
|
+
typedef struct on_subscribe_callback_args_t on_subscribe_callback_args_t;
|
69
|
+
struct on_subscribe_callback_args_t {
|
70
|
+
int mid;
|
71
|
+
int qos_count;
|
72
|
+
const int *granted_qos;
|
73
|
+
};
|
74
|
+
|
75
|
+
typedef struct on_unsubscribe_callback_args_t on_unsubscribe_callback_args_t;
|
76
|
+
struct on_unsubscribe_callback_args_t {
|
77
|
+
int mid;
|
78
|
+
};
|
79
|
+
|
80
|
+
typedef struct on_log_callback_args_t on_log_callback_args_t;
|
81
|
+
struct on_log_callback_args_t {
|
82
|
+
int level;
|
83
|
+
char *str;
|
84
|
+
};
|
85
|
+
|
86
|
+
struct mosquitto_callback_t {
|
87
|
+
int type;
|
88
|
+
mosquitto_client_wrapper *client;
|
89
|
+
void *data;
|
90
|
+
mosquitto_callback_t *next;
|
91
|
+
};
|
92
|
+
|
93
|
+
typedef struct mosquitto_callback_waiting_t mosquitto_callback_waiting_t;
|
94
|
+
struct mosquitto_callback_waiting_t {
|
95
|
+
mosquitto_callback_t *callback;
|
96
|
+
mosquitto_client_wrapper *client;
|
97
|
+
bool abort;
|
98
|
+
};
|
99
|
+
|
100
|
+
struct nogvl_connect_args {
|
101
|
+
struct mosquitto *mosq;
|
102
|
+
char *host;
|
103
|
+
int port;
|
104
|
+
int keepalive;
|
105
|
+
char *bind_address;
|
106
|
+
};
|
107
|
+
|
108
|
+
struct nogvl_loop_stop_args {
|
109
|
+
struct mosquitto *mosq;
|
110
|
+
bool force;
|
111
|
+
};
|
112
|
+
|
113
|
+
struct nogvl_loop_args {
|
114
|
+
struct mosquitto *mosq;
|
115
|
+
int timeout;
|
116
|
+
int max_packets;
|
117
|
+
};
|
118
|
+
|
119
|
+
struct nogvl_reinitialise_args {
|
120
|
+
struct mosquitto *mosq;
|
121
|
+
char *client_id;
|
122
|
+
bool clean_session;
|
123
|
+
void *obj;
|
124
|
+
};
|
125
|
+
|
126
|
+
struct nogvl_publish_args {
|
127
|
+
struct mosquitto *mosq;
|
128
|
+
int *mid;
|
129
|
+
char *topic;
|
130
|
+
int payloadlen;
|
131
|
+
const void *payload;
|
132
|
+
int qos;
|
133
|
+
bool retain;
|
134
|
+
};
|
135
|
+
|
136
|
+
struct nogvl_subscribe_args {
|
137
|
+
struct mosquitto *mosq;
|
138
|
+
int *mid;
|
139
|
+
const char *subscription;
|
140
|
+
int qos;
|
141
|
+
};
|
142
|
+
|
143
|
+
void _init_rb_mosquitto_client();
|
144
|
+
|
145
|
+
#endif
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
|
3
|
+
RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC'] if ENV['CC']
|
4
|
+
|
5
|
+
dir_config('mosquitto')
|
6
|
+
|
7
|
+
# detect homebrew installs, via @brianmario
|
8
|
+
if !have_library 'mosquitto'
|
9
|
+
base = if !`which brew`.empty?
|
10
|
+
`brew --prefix`.strip
|
11
|
+
elsif File.exists?("/usr/local/Cellar/mosquitto")
|
12
|
+
'/usr/local/Cellar'
|
13
|
+
end
|
14
|
+
|
15
|
+
if base and mosquitto = Dir[File.join(base, 'Cellar/mosquitto/*')].sort.last
|
16
|
+
$INCFLAGS << " -I#{mosquitto}/include "
|
17
|
+
$LDFLAGS << " -L#{mosquitto}/lib "
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
(have_header('ruby/thread.h') && have_func('rb_thread_call_without_gvl', 'ruby/thread.h')) || have_func('rb_thread_blocking_region')
|
22
|
+
|
23
|
+
(have_header("mosquitto.h") && have_library('mosquitto')) or abort("libmosquitto missing!")
|
24
|
+
have_header("pthread.h") or abort('pthread support required!')
|
25
|
+
have_macro("LIBMOSQUITTO_VERSION_NUMBER", "mosquitto.h")
|
26
|
+
|
27
|
+
$defs << "-pedantic"
|
28
|
+
$CFLAGS << ' -Wall -funroll-loops'
|
29
|
+
$CFLAGS << ' -Wextra -O0 -ggdb3' if ENV['DEBUG']
|
30
|
+
|
31
|
+
create_makefile('mosquitto_ext')
|
@@ -0,0 +1,168 @@
|
|
1
|
+
#include "mosquitto_ext.h"
|
2
|
+
|
3
|
+
/*
|
4
|
+
* :nodoc:
|
5
|
+
* GC callback for releasing an out of scope Mosquitto::Message object
|
6
|
+
*
|
7
|
+
*/
|
8
|
+
static void rb_mosquitto_free_message(void *ptr)
|
9
|
+
{
|
10
|
+
mosquitto_message_wrapper *message = (mosquitto_message_wrapper *)ptr;
|
11
|
+
if (message) {
|
12
|
+
mosquitto_message_free(&message->msg);
|
13
|
+
xfree(message);
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
/*
|
18
|
+
* :nodoc:
|
19
|
+
* Allocator function for Mosquitto::Message. This is only ever called from within an on_message callback
|
20
|
+
* within the binding scope, NEVER by the user.
|
21
|
+
*
|
22
|
+
*/
|
23
|
+
VALUE rb_mosquitto_message_alloc(const struct mosquitto_message *msg)
|
24
|
+
{
|
25
|
+
VALUE message;
|
26
|
+
mosquitto_message_wrapper *wrapper = NULL;
|
27
|
+
message = Data_Make_Struct(rb_cMosquittoMessage, mosquitto_message_wrapper, 0, rb_mosquitto_free_message, wrapper);
|
28
|
+
wrapper->msg = msg;
|
29
|
+
rb_obj_call_init(message, 0, NULL);
|
30
|
+
return message;
|
31
|
+
}
|
32
|
+
|
33
|
+
/*
|
34
|
+
* call-seq:
|
35
|
+
* msg.mid -> Integer
|
36
|
+
*
|
37
|
+
* Message identifier for this message. Note that although the MQTT protocol doesn't use message ids
|
38
|
+
* for messages with QoS=0, libmosquitto assigns them message ids so they can be tracked with this parameter.
|
39
|
+
*
|
40
|
+
* @return [Integer] message identifier
|
41
|
+
* @example
|
42
|
+
* msg.mid -> 2
|
43
|
+
*
|
44
|
+
*/
|
45
|
+
static VALUE rb_mosquitto_message_mid(VALUE obj)
|
46
|
+
{
|
47
|
+
struct mosquitto_message *msg;
|
48
|
+
MosquittoGetMessage(obj);
|
49
|
+
msg = message->msg;
|
50
|
+
return INT2NUM(msg->mid);
|
51
|
+
}
|
52
|
+
|
53
|
+
/*
|
54
|
+
* call-seq:
|
55
|
+
* msg.topic -> String
|
56
|
+
*
|
57
|
+
* Topic this message was published on.
|
58
|
+
*
|
59
|
+
* @return [String] topic
|
60
|
+
* @example
|
61
|
+
* msg.topic -> "test"
|
62
|
+
*
|
63
|
+
*/
|
64
|
+
static VALUE rb_mosquitto_message_topic(VALUE obj)
|
65
|
+
{
|
66
|
+
struct mosquitto_message *msg;
|
67
|
+
MosquittoGetMessage(obj);
|
68
|
+
msg = message->msg;
|
69
|
+
return MosquittoEncode(rb_str_new2(msg->topic));
|
70
|
+
}
|
71
|
+
|
72
|
+
/*
|
73
|
+
* call-seq:
|
74
|
+
* msg.to_s -> String
|
75
|
+
*
|
76
|
+
* Coerces the Mosquitto::Message payload to a Ruby string.
|
77
|
+
*
|
78
|
+
* @return [String] message payload
|
79
|
+
* @example
|
80
|
+
* msg.to_s -> "message"
|
81
|
+
*
|
82
|
+
*/
|
83
|
+
static VALUE rb_mosquitto_message_to_s(VALUE obj)
|
84
|
+
{
|
85
|
+
struct mosquitto_message *msg;
|
86
|
+
MosquittoGetMessage(obj);
|
87
|
+
msg = message->msg;
|
88
|
+
return MosquittoEncode(rb_str_new(msg->payload, msg->payloadlen));
|
89
|
+
}
|
90
|
+
|
91
|
+
/*
|
92
|
+
* call-seq:
|
93
|
+
* msg.length -> Integer
|
94
|
+
*
|
95
|
+
* The length of the message payload
|
96
|
+
*
|
97
|
+
* @return [Integer] message length
|
98
|
+
* @example
|
99
|
+
* msg.length -> 7
|
100
|
+
*
|
101
|
+
*/
|
102
|
+
static VALUE rb_mosquitto_message_length(VALUE obj)
|
103
|
+
{
|
104
|
+
struct mosquitto_message *msg;
|
105
|
+
MosquittoGetMessage(obj);
|
106
|
+
msg = message->msg;
|
107
|
+
return INT2NUM(msg->payloadlen);
|
108
|
+
}
|
109
|
+
|
110
|
+
/*
|
111
|
+
* call-seq:
|
112
|
+
* msg.qos -> Integer
|
113
|
+
*
|
114
|
+
* Quality of Service used for the message
|
115
|
+
*
|
116
|
+
* @see Mosquitto::AT_MOST_ONCE
|
117
|
+
* @see Mosquitto::AT_LEAST_ONCE
|
118
|
+
* @see Mosquitto::EXACTLY_ONCE
|
119
|
+
*
|
120
|
+
* @return [Integer] message quality of service
|
121
|
+
* @example
|
122
|
+
* msg.qos -> Mosquitto::AT_MOST_ONCE
|
123
|
+
*
|
124
|
+
*/
|
125
|
+
static VALUE rb_mosquitto_message_qos(VALUE obj)
|
126
|
+
{
|
127
|
+
struct mosquitto_message *msg;
|
128
|
+
MosquittoGetMessage(obj);
|
129
|
+
msg = message->msg;
|
130
|
+
return INT2NUM(msg->qos);
|
131
|
+
}
|
132
|
+
|
133
|
+
/*
|
134
|
+
* call-seq:
|
135
|
+
* msg.retain? -> Boolean
|
136
|
+
*
|
137
|
+
* Set to true if this message was flagged to retain.
|
138
|
+
*
|
139
|
+
* @return [true, false] retention flag
|
140
|
+
* @example
|
141
|
+
* msg.retain? -> true
|
142
|
+
*
|
143
|
+
*/
|
144
|
+
static VALUE rb_mosquitto_message_retain_p(VALUE obj)
|
145
|
+
{
|
146
|
+
struct mosquitto_message *msg;
|
147
|
+
MosquittoGetMessage(obj);
|
148
|
+
msg = message->msg;
|
149
|
+
return (msg->retain == true) ? Qtrue : Qfalse;
|
150
|
+
}
|
151
|
+
|
152
|
+
/*
|
153
|
+
* Represents libmosquitto messages. They cannot be allocated or initialized from user code - they are
|
154
|
+
* spawned exclusively from within on_message callbacks and are thus read-only wrapper objects.
|
155
|
+
*
|
156
|
+
*/
|
157
|
+
|
158
|
+
void _init_rb_mosquitto_message()
|
159
|
+
{
|
160
|
+
rb_cMosquittoMessage = rb_define_class_under(rb_mMosquitto, "Message", rb_cObject);
|
161
|
+
|
162
|
+
rb_define_method(rb_cMosquittoMessage, "mid", rb_mosquitto_message_mid, 0);
|
163
|
+
rb_define_method(rb_cMosquittoMessage, "topic", rb_mosquitto_message_topic, 0);
|
164
|
+
rb_define_method(rb_cMosquittoMessage, "to_s", rb_mosquitto_message_to_s, 0);
|
165
|
+
rb_define_method(rb_cMosquittoMessage, "length", rb_mosquitto_message_length, 0);
|
166
|
+
rb_define_method(rb_cMosquittoMessage, "qos", rb_mosquitto_message_qos, 0);
|
167
|
+
rb_define_method(rb_cMosquittoMessage, "retain?", rb_mosquitto_message_retain_p, 0);
|
168
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#ifndef MOSQUITTO_MESSAGE_H
|
2
|
+
#define MOSQUITTO_MESSAGE_H
|
3
|
+
|
4
|
+
typedef struct {
|
5
|
+
struct mosquitto_message *msg;
|
6
|
+
} mosquitto_message_wrapper;
|
7
|
+
|
8
|
+
#define MosquittoGetMessage(obj) \
|
9
|
+
mosquitto_message_wrapper *message = NULL; \
|
10
|
+
Data_Get_Struct(obj, mosquitto_message_wrapper, message); \
|
11
|
+
if (!message) rb_raise(rb_eTypeError, "uninitialized Mosquitto message!");
|
12
|
+
|
13
|
+
VALUE rb_mosquitto_message_alloc(const struct mosquitto_message *msg);
|
14
|
+
void _init_rb_mosquitto_message();
|
15
|
+
|
16
|
+
#endif
|
@@ -0,0 +1,88 @@
|
|
1
|
+
#include "mosquitto_ext.h"
|
2
|
+
|
3
|
+
VALUE rb_mMosquitto;
|
4
|
+
VALUE rb_eMosquittoError;
|
5
|
+
VALUE rb_cMosquittoClient;
|
6
|
+
VALUE rb_cMosquittoMessage;
|
7
|
+
|
8
|
+
VALUE intern_call;
|
9
|
+
|
10
|
+
rb_encoding *binary_encoding;
|
11
|
+
|
12
|
+
/*
|
13
|
+
* call-seq:
|
14
|
+
* Mosquitto.version -> Integer
|
15
|
+
*
|
16
|
+
* The libmosquitto version linked against. It returns for libmosquitto 1.2.3 an integer as :
|
17
|
+
*
|
18
|
+
* 1002003
|
19
|
+
*
|
20
|
+
* === Examples
|
21
|
+
* Mosquitto.version -> 1002003
|
22
|
+
*
|
23
|
+
*/
|
24
|
+
static VALUE rb_mosquitto_version(MOSQ_UNUSED VALUE obj)
|
25
|
+
{
|
26
|
+
return INT2NUM(mosquitto_lib_version(NULL, NULL, NULL));
|
27
|
+
}
|
28
|
+
|
29
|
+
/*
|
30
|
+
* call-seq:
|
31
|
+
* Mosquitto.cleanup -> nil
|
32
|
+
*
|
33
|
+
* Release resources associated with the libmosquitto library.
|
34
|
+
*
|
35
|
+
* === Examples
|
36
|
+
* Mosquitto.cleanup -> nil
|
37
|
+
*
|
38
|
+
*/
|
39
|
+
static VALUE rb_mosquitto_cleanup(MOSQ_UNUSED VALUE obj)
|
40
|
+
{
|
41
|
+
mosquitto_lib_cleanup();
|
42
|
+
return Qnil;
|
43
|
+
}
|
44
|
+
|
45
|
+
void Init_mosquitto_ext()
|
46
|
+
{
|
47
|
+
mosquitto_lib_init();
|
48
|
+
|
49
|
+
intern_call = rb_intern("call");
|
50
|
+
|
51
|
+
binary_encoding = rb_enc_find("binary");
|
52
|
+
|
53
|
+
rb_mMosquitto = rb_define_module("Mosquitto");
|
54
|
+
|
55
|
+
/*
|
56
|
+
* Message QOS specific constants
|
57
|
+
*/
|
58
|
+
rb_define_const(rb_mMosquitto, "AT_MOST_ONCE", INT2NUM(0));
|
59
|
+
rb_define_const(rb_mMosquitto, "AT_LEAST_ONCE", INT2NUM(1));
|
60
|
+
rb_define_const(rb_mMosquitto, "EXACTLY_ONCE", INT2NUM(2));
|
61
|
+
|
62
|
+
/*
|
63
|
+
* Log specific constants *
|
64
|
+
*/
|
65
|
+
rb_define_const(rb_mMosquitto, "LOG_NONE", INT2NUM(0x00));
|
66
|
+
rb_define_const(rb_mMosquitto, "LOG_INFO", INT2NUM(0x01));
|
67
|
+
rb_define_const(rb_mMosquitto, "LOG_NOTICE", INT2NUM(0x02));
|
68
|
+
rb_define_const(rb_mMosquitto, "LOG_WARNING", INT2NUM(0x04));
|
69
|
+
rb_define_const(rb_mMosquitto, "LOG_ERR", INT2NUM(0x08));
|
70
|
+
rb_define_const(rb_mMosquitto, "LOG_DEBUG", INT2NUM(0x10));
|
71
|
+
rb_define_const(rb_mMosquitto, "LOG_SUBSCRIBE", INT2NUM(0x20));
|
72
|
+
rb_define_const(rb_mMosquitto, "LOG_UNSUBSCRIBE", INT2NUM(0x40));
|
73
|
+
rb_define_const(rb_mMosquitto, "LOG_ALL", INT2NUM(0xFFFF));
|
74
|
+
|
75
|
+
/*
|
76
|
+
* TLS specific constants
|
77
|
+
*/
|
78
|
+
rb_define_const(rb_mMosquitto, "SSL_VERIFY_NONE", INT2NUM(0));
|
79
|
+
rb_define_const(rb_mMosquitto, "SSL_VERIFY_PEER", INT2NUM(1));
|
80
|
+
|
81
|
+
rb_eMosquittoError = rb_define_class_under(rb_mMosquitto, "Error", rb_eStandardError);
|
82
|
+
|
83
|
+
rb_define_module_function(rb_mMosquitto, "version", rb_mosquitto_version, 0);
|
84
|
+
rb_define_module_function(rb_mMosquitto, "cleanup", rb_mosquitto_cleanup, 0);
|
85
|
+
|
86
|
+
_init_rb_mosquitto_client();
|
87
|
+
_init_rb_mosquitto_message();
|
88
|
+
}
|