Esempio n. 1
0
/*----------------------------------------------------------
	IPaddress class
----------------------------------------------------------*/
static EEL_xno ipa_construct(EEL_vm *vm, EEL_types type,
		EEL_value *initv, int initc, EEL_value *result)
{
	IPaddress *ipa;
	EEL_object *eo = eel_o_alloc(vm, sizeof(IPaddress), type);
	if(!eo)
		return EEL_XMEMORY;
	ipa = o2IPaddress(eo);
	switch(initc)
	{
	  case 0:
		ipa->host = INADDR_NONE;
		ipa->port = 9999;
		break;
	  case 1:
		if(EEL_TYPE(initv) == md.ipaddress_cid)
		{
			IPaddress *src = o2IPaddress(initv->objref.v);
			memcpy(ipa, src, sizeof(IPaddress));
		}
		else
		{
			/* Create server socket */
			if(SDLNet_ResolveHost(ipa, NULL, eel_v2l(initv)) != 0)
			{
				eel_o_free(eo);
				return EEL_XDEVICEOPEN;
			}
		}
		break;
	  case 2:
	  {
		const char *s;
		switch((EEL_classes)EEL_TYPE(initv))
		{
		  case EEL_CSTRING:
		  case EEL_CDSTRING:
			s = eel_v2s(initv);
		  default:
			s = NULL;
		}
		/* Connect as client */
		if(SDLNet_ResolveHost(ipa, s, eel_v2l(initv + 1)) != 0)
		{
			eel_o_free(eo);
			return EEL_XDEVICEOPEN;
		}
		break;
	  }
	  default:
		eel_o_free(eo);
		return EEL_XARGUMENTS;
	}
	eel_o2v(result, eo);
	return 0;
}
Esempio n. 2
0
static EEL_xno m_construct(EEL_vm *vm, EEL_classes cid,
		EEL_value *initv, int initc, EEL_value *result)
{
	EEL_xno x;
	EEL_value v;
	EEL_module *m;
	EEL_object *eo;

	eel_clean_modules(vm);

	eo = eel_o_alloc(vm, sizeof(EEL_module), cid);
	if(!eo)
		return EEL_XMEMORY;
	m = o2EEL_module(eo);
	memset(m, 0, sizeof(EEL_module));
	m->id = VMP->state->module_id_counter++;
	x = eel_o_construct(vm, EEL_CTABLE, NULL, 0, &v);
	if(x)
	{
		eel_o_free(eo);
		return x;
	}
	m->exports = v.objref.v;
	eel_o2v(result,  eo);
	return 0;
}
Esempio n. 3
0
static EEL_xno n2s_construct(EEL_vm *vm, EEL_types type,
		EEL_value *initv, int initc, EEL_value *result)
{
	REAL_EB_socket *rs;
	EB_socket *ebs;
	EEL_object *eo;
	rs = malloc(sizeof(REAL_EB_socket));
	if(!rs)
		return EEL_XMEMORY;
	eo = eel_o_alloc(vm, sizeof(EB_socket), type);
	if(!eo)
	{
		free(rs);
		return EEL_XMEMORY;
	}
	ebs = o2EB_socket(eo);
	ebs->rs = rs;
	rs->pollperiod = 50;
	rs->sender = NULL;
	rs->fifo.buffer = NULL;
	rs->closed = 0;
	rs->status = EEL_XOK;
	switch(initc)
	{
	  case 1:
		if(initv->type == EEL_TINTEGER)
		{
			rs->n2socket = eel_v2l(initv);
			if(rs->n2socket > NET2_MAX_SOCKETS)
			{
				eel_o_free(eo);
				return EEL_XHIGHINDEX;
			}
		}
		else
		{
			IPaddress *ipa;
			if(EEL_TYPE(initv) != md.ipaddress_cid)
			{
				eel_o_free(eo);
				return EEL_XWRONGTYPE;
			}
			ipa = o2IPaddress(initv->objref.v);
			rs->n2socket = NET2_TCPConnectToIP(ipa);
			if(rs->n2socket < 0)
			{
				eel_o_free(eo);
				return EEL_XDEVICEOPEN;
			}
		}
		break;
	  case 2:
		rs->n2socket = NET2_TCPConnectTo(eel_v2s(initv),
				eel_v2l(initv + 1));
		if(rs->n2socket < 0)
		{
			eel_o_free(eo);
			return EEL_XDEVICEOPEN;
		}
		break;
	  default:
		eel_o_free(eo);
		return EEL_XARGUMENTS;
	}
	if(eb_sockets && (rs->n2socket >= 0))
		eb_sockets[rs->n2socket] = eo;
	eel_o2v(result, eo);
	return 0;
}