Exemple #1
0
bool ReadObject(HSQUIRRELVM v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &o)
{
	SQObjectType t;
	_CHECK_IO(SafeRead(v,read,up,&t,sizeof(SQObjectType)));
	switch(t){
	case OT_STRING:{
		SQInteger len;
		_CHECK_IO(SafeRead(v,read,up,&len,sizeof(SQInteger)));
		_CHECK_IO(SafeRead(v,read,up,_ss(v)->GetScratchPad(rsl(len)),rsl(len)));
		o=SQString::Create(_ss(v),_ss(v)->GetScratchPad(-1),len);
				   }
		break;
	case OT_INTEGER:{
		SQInteger i;
		_CHECK_IO(SafeRead(v,read,up,&i,sizeof(SQInteger))); o = i; break;
					}
	case OT_FLOAT:{
		SQFloat f;
		_CHECK_IO(SafeRead(v,read,up,&f,sizeof(SQFloat))); o = f; break;
				  }
	case OT_NULL:
		o=_null_;
		break;
	default:
		v->Raise_Error(_SC("cannot serialize a %s"),IdType2Name(t));
		return false;
	}
	return true;
}
Exemple #2
0
SQString *SQVM::PrintObjVal(const SQObject &o)
{
	switch(type(o)) {
	case OT_STRING: return _string(o);
	case OT_INTEGER:
		scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%d"), _integer(o));
		return SQString::Create(_ss(this), _spval);
		break;
	case OT_FLOAT:
		scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%.14g"), _float(o));
		return SQString::Create(_ss(this), _spval);
		break;
	default:
		return SQString::Create(_ss(this), GetTypeName(o));
	}
}
Exemple #3
0
    void tcp_connector::async_connect( int port, std::string const& hostname
        , FactoryFunc fact_func, ConnectHandler const& handler, options_ptr opts )
    {
        tcp::resolver::iterator resolver_it;
        tcp::endpoint endpoint;
        boost::system::error_code ec;

        // hostname尝试当作IP地址使用
        address addr = address::from_string(hostname, ec);
        if (!ec)
            endpoint = tcp::endpoint(addr, port);
        else
        {
            // hostname不是IP, 当作域名解析
            ec.clear();
            tcp::resolver::query query(hostname, lexical_cast_def<std::string>(port));
            tcp::resolver rsl(m_ios);
            resolver_it = rsl.resolve(query, ec);
            if (ec || tcp::resolver::iterator() == resolver_it)
            {
                // 解析失败
                handler(tcp_session_ptr(), ec);
                return ;
            }

            // 解析成功, 在地址列表中逐个尝试连接
            endpoint = *resolver_it++;
        }

        socket_ptr pSock(new socket(m_ios));
        pSock->async_connect(endpoint
            , boost::bind(&tcp_connector::async_connect_handler, this, placeholders::error
                , pSock, fact_func, handler, opts, resolver_it ));
    }
Exemple #4
0
void SQVM::Raise_Error(const SQChar *s, ...)
{
	va_list vl;
	va_start(vl, s);
	scvsprintf(_sp(rsl((SQInteger)scstrlen(s)+(NUMBER_MAX_CHAR*2))), s, vl);
	va_end(vl);
	_lasterror = SQString::Create(_ss(this),_spval,-1);
}
Exemple #5
0
SQString *SQVM::PrintObjVal(const SQObject &o)
{
	switch(type(o)) {
	case OT_STRING: return _string(o);
	case OT_INTEGER:
		// C::B patch: Support for Windows 64 bit
		#if defined(_WIN64)
		scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%I64d"), _integer(o));
		// C::B patch: Support for Linux 64 bit
		#elif defined(_SQ64)
		scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%ld"), _integer(o));
		#else
		scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%d"), _integer(o));
		#endif
		return SQString::Create(_ss(this), _spval);
		break;
	case OT_FLOAT:
		scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%.14g"), _float(o));
		return SQString::Create(_ss(this), _spval);
		break;
	default:
		return SQString::Create(_ss(this), GetTypeName(o));
	}
}
Exemple #6
0
    tcp_session_ptr tcp_connector::connect( FactoryFunc fact_func, int port, 
        std::string const& hostname, boost::system::error_code & ec, options_ptr opts)
    {
        address addr = address::from_string(hostname, ec);
        if (ec)
        {
            // hostname不是IP地址, 尝试当作域名解析
            ec.clear();
            tcp::resolver::query query(hostname, lexical_cast_def<std::string>(port));
            tcp::resolver rsl(m_ios);
            tcp::resolver::iterator resolver_it = rsl.resolve(query, ec);
            if (ec)
                return tcp_session_ptr();

            ec = error::host_not_found;
            socket_ptr pSock(new socket(m_ios));
            while (ec && tcp::resolver::iterator() != resolver_it)
            {
                tcp::endpoint endpoint = *resolver_it++;
                std::cout << endpoint << std::endl;
                boost::system::error_code close_ec;
                pSock->close(close_ec);
                if (close_ec)
                    pSock.reset(new socket(m_ios));
                pSock->connect(endpoint, ec);
            }

            boost::system::error_code remote_ec, local_ec;
            if (!ec && pSock->remote_endpoint(remote_ec) != pSock->local_endpoint(local_ec)
                && !remote_ec && !local_ec)
                return fact_func(pSock, session_initialized(session_id(), group_id(), opts));
            else
                return tcp_session_ptr();
        }

        // hostname是IP地址
        tcp::endpoint endpoint(addr, port);
        socket_ptr pSock(new socket(m_ios));
        pSock->connect(endpoint, ec);
        
        boost::system::error_code remote_ec, local_ec;
        if (!ec && pSock->remote_endpoint(remote_ec) != pSock->local_endpoint(local_ec)
            && !remote_ec && !local_ec)
            return fact_func(pSock, session_initialized(session_id(), group_id(), opts));
        else
            return tcp_session_ptr();
    }
Exemple #7
0
	Span3d IsPtsSpan3d(const double* a, int n, double tolerance, double* deviation) {
		// returns a span3d if all points are within tolerance
		int np = n / 3;					// number of points
		if(np < 2) return Span3d();		// Invalid span3d
		Point3d sp = Point3d(&a[0]);
		Point3d ep = Point3d(&a[n-3]);
		Line line = IsPtsLine(a, n, tolerance, deviation);
		if(line.ok) return Span3d(sp, ep);	// it's a line

		*deviation = 0;					// cumulative deviation
		Point3d mp = Point3d(&a[np / 2 * 3]);	// mid point
		Plane plane(sp, mp, ep);
		if(plane.ok) {
			// plane of the arc is ok
			// calculate centre point
			Vector3d vs(mp, sp);
			vs.normalise();
			Vector3d ve(mp, ep);
			ve.normalise();
			Vector3d rs = vs ^ plane.normal;
			Vector3d re = ve ^ plane.normal;

			Line rsl(sp.Mid(mp), rs, false);
			Line rel(ep.Mid(mp), re, false);

			Point3d pc;
			Intof(rsl, rel, pc);
			double radius = pc.Dist(sp);

			// check other points on circle
			for(int i = 2; i < np - 1; i++) {
				Point3d p(&a[i*3]);
				double dp = fabs(plane.Dist(p));
				double dr = fabs(p.Dist(pc) - radius);
double tolerance = 10.0 * 1.0e-6;
				if(dp > tolerance || dr > tolerance) {
					return Span3d();
				}

			}
			return Span3d(CW, plane.normal, sp, ep, pc);

		}
		return Span3d();
	}
Exemple #8
0
bool WriteObject( HSQUIRRELVM v, SQUserPointer up, SQWRITEFUNC write, SQObjectPtr &o ) {
	_CHECK_IO( SafeWrite( v, write, up, &type( o ), sizeof( SQObjectType ) ) );
	switch ( type( o ) ) {
	case OT_STRING:
		_CHECK_IO( SafeWrite( v, write, up, &_string( o )->_len, sizeof( SQInteger ) ) );
		_CHECK_IO( SafeWrite( v, write, up, _stringval( o ), rsl( _string( o )->_len ) ) );
		break;
	case OT_INTEGER:
		_CHECK_IO( SafeWrite( v, write, up, &_integer( o ), sizeof( SQInteger ) ) );break;
	case OT_FLOAT:
		_CHECK_IO( SafeWrite( v, write, up, &_float( o ), sizeof( SQFloat ) ) );break;
	case OT_NULL:
		break;
	default:
		v->Raise_Error( _SC( "cannot serialize a %s" ), GetTypeName( o ) );
		return false;
	}
	return true;
}
Exemple #9
0
void SQVM::Raise_ErrorV(const SQChar *s, va_list &vl)
{
	scvsprintf(_sp(rsl((SQInteger)scstrlen(s)+(NUMBER_MAX_CHAR*2))), s, vl);
	Raise_Error(_spval);
}