Example #1
0
VALUE CRbWin32API::initialize(int argc, VALUE * argv, VALUE obj)
{
	VALUE dllname, proc, _import, _export;
	rb_scan_args(argc, argv, "4", &dllname, &proc, &_import, &_export);

	SafeStringValue(dllname);
	SafeStringValue(proc);
	m_hDll = LoadLibraryA(RSTRING_PTR(dllname));
	if (!m_hDll)
		rb_raise(rb_eSinError, "LoadLibrary: %s\n", RSTRING_PTR(dllname));
	
	HANDLE hproc = (HANDLE)GetProcAddress(m_hDll, RSTRING_PTR(proc));
	if (!hproc) 
	{
		VALUE str = rb_str_new3(proc); str = rb_str_cat(str, "A", 1);
		hproc = (HANDLE)GetProcAddress(m_hDll, RSTRING_PTR(str));
		if (!hproc)
		{
			rb_raise(rb_eSinError, "GetProcAddress: %s or %s\n", RSTRING_PTR(proc), RSTRING_PTR(str));
		}
	}
	rb_iv_set(obj, "__dll__",		rb_uint2inum((u32)m_hDll));
	rb_iv_set(obj, "__dllname__",	dllname);
	rb_iv_set(obj, "__proc__",		rb_uint2inum((u32)hproc));

	VALUE ary_import = SinParseImportArgs(_import);
	if (16 < RARRAY_LEN(ary_import))
	{
		rb_raise(rb_eSinError, "too many parameters: %ld\n", RARRAY_LEN(ary_import));
	}
	rb_iv_set(obj, "__import__", ary_import);

	rb_iv_set(obj, "__export__", INT2FIX(SinParseExportArgs(_export)));

	return obj;
}
Example #2
0
/*
 * Verse::MaterialNode class
 */
void
rbverse_init_verse_materialnode( void ) {
	rbverse_log( "debug", "Initializing Verse::MaterialNode" );

	/* Class methods */
	rbverse_cVerseMaterialNode = rb_define_class_under( rbverse_mVerse, "MaterialNode", rbverse_cVerseNode );

    /* Constants */
	rb_define_const( rbverse_cVerseMaterialNode, "TYPE_NUMBER", rb_uint2inum(V_NT_MATERIAL) );

	/* Initializer */
	rb_define_method( rbverse_cVerseMaterialNode, "initialize", rbverse_verse_materialnode_initialize, 0 );

	/* Tell Verse::Node about this subclass */
	rbverse_nodetype_to_nodeclass[ V_NT_MATERIAL ] = rbverse_cVerseMaterialNode;
	node_mark_funcs[ V_NT_MATERIAL ] = &rbverse_materialnode_gc_mark;
	node_free_funcs[ V_NT_MATERIAL ] = &rbverse_materialnode_gc_free;
}
Example #3
0
/*
 * Verse namespace.
 * 
 */
void
Init_verse_ext( void ) {
	rb_require( "verse" );

	rbverse_mVerse = rb_define_module( "Verse" );

	rbverse_mVerseLoggable = rb_define_module_under( rbverse_mVerse, "Loggable" );
	rbverse_mVerseVersionUtilities = rb_define_module_under( rbverse_mVerse, "VersionUtilities" );

	rbverse_mVerseVersioned = rb_define_module_under( rbverse_mVerse, "Versioned" );
	rbverse_mVerseObserver = rb_define_module_under( rbverse_mVerse, "Observer" );
	rbverse_mVerseObservable = rb_define_module_under( rbverse_mVerse, "Observable" );

	rbverse_mVersePingObserver = rb_define_module_under( rbverse_mVerse, "PingObserver" );

	rbverse_eVerseError =
		rb_define_class_under( rbverse_mVerse, "Error", rb_eRuntimeError );
	rbverse_eVerseServerError =
		rb_define_class_under( rbverse_mVerse, "ServerError", rbverse_eVerseError );
	rbverse_eVerseConnectError =
		rb_define_class_under( rbverse_mVerse, "ConnectError", rbverse_eVerseError );
	rbverse_eVerseSessionError =
		rb_define_class_under( rbverse_mVerse, "SessionError", rbverse_eVerseError );
	rbverse_eVerseNodeError =
		rb_define_class_under( rbverse_mVerse, "NodeError", rbverse_eVerseError );

	/* Verse constants */
	rb_define_const( rbverse_mVerse, "RELEASE_NUMBER", INT2FIX(V_RELEASE_NUMBER) );
	rb_define_const( rbverse_mVerse, "RELEASE_PATCH",  INT2FIX(V_RELEASE_PATCH) );
	rb_define_const( rbverse_mVerse, "RELEASE_LABEL",  rb_str_new2(V_RELEASE_LABEL) );

	/* Module methods */
	rb_define_singleton_method( rbverse_mVerse, "port=", rbverse_verse_port_eq, 1 );
	rb_define_alias( CLASS_OF(rbverse_mVerse),  "connect_port=", "port=" );
	rb_define_singleton_method( rbverse_mVerse, "create_host_id", rbverse_verse_create_host_id, 0 );
	rb_define_alias( CLASS_OF(rbverse_mVerse),  "make_host_id", "create_host_id" );
	rb_define_singleton_method( rbverse_mVerse, "host_id=", rbverse_verse_host_id_eq, 1 );
	rb_define_singleton_method( rbverse_mVerse, "ping", rbverse_verse_ping, 2 );
	rb_define_singleton_method( rbverse_mVerse, "update", rbverse_verse_update, -1 );
	rb_define_alias( CLASS_OF(rbverse_mVerse),  "callback_update", "update" );

	/*
	 * Constants
	 */
	rbverse_mVerseConstants = rb_define_module_under( rbverse_mVerse, "Constants" );

	rb_define_const( rbverse_mVerseConstants, "HOST_ID_SIZE", INT2FIX(V_HOST_ID_SIZE) );

	rb_define_const( rbverse_mVerseConstants, "V_NT_OBJECT", rb_uint2inum(V_NT_OBJECT) );
	rb_define_const( rbverse_mVerseConstants, "V_NT_GEOMETRY", rb_uint2inum(V_NT_GEOMETRY) );
	rb_define_const( rbverse_mVerseConstants, "V_NT_MATERIAL", rb_uint2inum(V_NT_MATERIAL) );
	rb_define_const( rbverse_mVerseConstants, "V_NT_BITMAP", rb_uint2inum(V_NT_BITMAP) );
	rb_define_const( rbverse_mVerseConstants, "V_NT_TEXT", rb_uint2inum(V_NT_TEXT) );
	rb_define_const( rbverse_mVerseConstants, "V_NT_CURVE", rb_uint2inum(V_NT_CURVE) );
	rb_define_const( rbverse_mVerseConstants, "V_NT_AUDIO", rb_uint2inum(V_NT_AUDIO) );
	rb_define_const( rbverse_mVerseConstants, "V_NT_NUM_TYPES", rb_uint2inum(V_NT_NUM_TYPES) );
	rb_define_const( rbverse_mVerseConstants, "V_NT_SYSTEM", rb_uint2inum(V_NT_SYSTEM) );
	rb_define_const( rbverse_mVerseConstants, "V_NT_NUM_TYPES_NETPACK",
	                 rb_uint2inum(V_NT_NUM_TYPES_NETPACK) );

	/* Init the subordinate classes */
	rbverse_init_verse_session();
	rbverse_init_verse_server();
	rbverse_init_verse_node();
	rbverse_init_verse_mixins();

	/* Set up calbacks */
	verse_callback_set( verse_send_ping, rbverse_cb_ping, NULL );

	rbverse_log( "debug", "Initialized the extension." );
}
Example #4
0
VALUE
bpObjectToRuby(const bp::Object * obj,
               unsigned int tid)
{
    if (obj == NULL) return Qnil;

    VALUE v = Qnil;

    switch (obj->type()) {
        case BPTNull:
            v = Qnil;
            break;
        case BPTBoolean:
        {
            if (((bp::Bool *) obj)->value()) v = Qtrue;
            else v = Qfalse;
            break;
        }
        case BPTInteger:
            v = rb_ull2inum(((bp::Integer *) obj)->value());
            break;
        case BPTCallBack: {
            VALUE args[2];
            args[0] = rb_uint2inum(tid);
            args[1] = rb_ull2inum(((bp::Integer *) obj)->value());
            v = rb_class_new_instance(2, args, bp_rb_cCallback);
            break;
        }           
        case BPTDouble:
            v = rb_float_new(((bp::Double *) obj)->value());
            break;
        case BPTString:
            v = rb_str_new2(((bp::String *) obj)->value());
            break;
        case BPTNativePath: {
            VALUE id = rb_intern("Pathname");
            VALUE klass = 0;
            if (rb_const_defined(rb_cObject, id) &&
                (klass = rb_const_get(rb_cObject, id)) &&
                TYPE(klass) == T_CLASS)
            {
				std::string path = convert::toUTF8(((bp::Path *) obj)->value());
                VALUE p = rb_str_new2(path.c_str());
                v = rb_class_new_instance(1, &p, klass);
            }
            break;
        }
        case BPTMap: 
        {
            bp::Map * m = (bp::Map *) obj;
            v = rb_hash_new();
            bp::Map::Iterator i(*m);
            const char * key;
            while (NULL != (key = i.nextKey())) {
                rb_hash_aset(v,ID2SYM(rb_intern(key)), 
                             bpObjectToRuby(m->value(key), tid));
            }
            
            break;
        }
        
        case BPTList: 
        {
            bp::List * l = (bp::List *) obj;

            v = rb_ary_new();
            
            unsigned int i;
            for (i=0; i < l->size(); i++) {
                rb_ary_push(v, bpObjectToRuby(l->value(i), tid));
            }
            
            break;
        }
        case BPTAny: 
            // invalid
            break;
    }
    
    return v;
}