toxon
/
lita-tox
Archived
1
0
Fork 0

Implement Tox#bootstrap

This commit is contained in:
Braiden Vasco 2015-09-12 17:22:59 +00:00
parent d5f9a91265
commit c1f551050f
2 changed files with 70 additions and 0 deletions

View File

@ -10,5 +10,6 @@ have_library LIBTOXCORE, 'tox_new'
have_library LIBTOXCORE, 'tox_get_savedata_size'
have_library LIBTOXCORE, 'tox_get_savedata'
have_library LIBTOXCORE, 'tox_self_get_address'
have_library LIBTOXCORE, 'tox_bootstrap'
create_makefile "#{NAME}/#{NAME}"

View File

@ -4,6 +4,21 @@
void Init_tox();
#define IP_LENGTH_MAX 15
typedef char IP[IP_LENGTH_MAX + 1];
typedef char Key[(TOX_PUBLIC_KEY_SIZE * 2) + 1];
typedef struct Node {
IP ip;
int port;
Key key;
} Node;
typedef uint8_t KeyBin[TOX_PUBLIC_KEY_SIZE];
static void Key_to_KeyBin(const char *key, uint8_t *key_bin);
typedef struct cTox_ {
Tox *tox;
} cTox_;
@ -14,6 +29,7 @@ static void cTox_free(void *ptr);
static VALUE cTox_initialize(VALUE self, VALUE options);
static VALUE cTox_savedata(VALUE self);
static VALUE cTox_id(VALUE self);
static VALUE cTox_bootstrap(VALUE self, VALUE options);
typedef struct Tox_Options cTox_cOptions_;
@ -30,6 +46,7 @@ void Init_tox()
rb_define_method(cTox, "initialize", cTox_initialize, 1);
rb_define_method(cTox, "savedata", cTox_savedata, 0);
rb_define_method(cTox, "id", cTox_id, 0);
rb_define_method(cTox, "bootstrap", cTox_bootstrap, 1);
cTox_cOptions = rb_define_class_under(cTox, "Options", rb_cObject);
rb_define_alloc_func(cTox_cOptions, cTox_cOptions_alloc);
@ -37,6 +54,19 @@ void Init_tox()
rb_define_method(cTox_cOptions, "data=", cTox_cOptions_data_EQUALS, 1);
}
/******************************************************************************
* KeyBin
******************************************************************************/
void Key_to_KeyBin(const char *const key, uint8_t *const key_bin)
{
long i;
for (i = 0; i < TOX_PUBLIC_KEY_SIZE; ++i)
sscanf(&key[i * 2], "%2hhx", &key_bin[i]);
}
/******************************************************************************
* Tox
******************************************************************************/
@ -113,6 +143,45 @@ VALUE cTox_id(const VALUE self)
return rb_str_new(id, 2 * TOX_ADDRESS_SIZE);
}
VALUE cTox_bootstrap(const VALUE self, const VALUE options)
{
cTox_ *tox;
VALUE ip;
VALUE port;
VALUE key;
Node node;
KeyBin key_bin;
TOX_ERR_BOOTSTRAP error;
Check_Type(options, T_HASH);
ip = rb_hash_aref(options, ID2SYM(rb_intern("ip")));
port = rb_hash_aref(options, ID2SYM(rb_intern("port")));
key = rb_hash_aref(options, ID2SYM(rb_intern("key")));
if (ip == Qnil) rb_raise(rb_eRuntimeError, "option \"ip\" is required");
if (port == Qnil) rb_raise(rb_eRuntimeError, "option \"port\" is required");
if (key == Qnil) rb_raise(rb_eRuntimeError, "option \"key\" is required");
Data_Get_Struct(self, cTox_, tox);
memcpy(node.ip, RSTRING_PTR(ip), RSTRING_LEN(ip) + 1);
node.port = NUM2INT(port);
memcpy(node.key, RSTRING_PTR(key), RSTRING_LEN(key) + 1);
Key_to_KeyBin(node.key, key_bin);
tox_bootstrap(tox->tox, node.ip, node.port, key_bin, &error);
if (error == TOX_ERR_BOOTSTRAP_OK)
return Qtrue;
else
return Qfalse;
}
/******************************************************************************
* Tox::Options
******************************************************************************/