degesch: Lua: add a "buffer" property to servers
This commit is contained in:
		
							parent
							
								
									0044672b85
								
							
						
					
					
						commit
						87e1236b30
					
				
							
								
								
									
										49
									
								
								degesch.c
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								degesch.c
									
									
									
									
									
								
							| @ -7446,6 +7446,19 @@ lua_server_gc (lua_State *L) | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int | ||||||
|  | lua_server_get_buffer (lua_State *L) | ||||||
|  | { | ||||||
|  | 	struct lua_server *wrapper = luaL_checkudata (L, 1, XLUA_SERVER_METATABLE); | ||||||
|  | 	luaL_argcheck (L, wrapper->server, 1, "dead reference used"); | ||||||
|  | 
 | ||||||
|  | 	if (wrapper->server->buffer) | ||||||
|  | 		lua_plugin_push_buffer (wrapper->plugin, wrapper->server->buffer); | ||||||
|  | 	else | ||||||
|  | 		lua_pushnil (L); | ||||||
|  | 	return 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static int | static int | ||||||
| lua_server_send (lua_State *L) | lua_server_send (lua_State *L) | ||||||
| { | { | ||||||
| @ -7461,6 +7474,7 @@ static luaL_Reg lua_server_table[] = | |||||||
| { | { | ||||||
| 	// TODO: some useful methods or values
 | 	// TODO: some useful methods or values
 | ||||||
| 	{ "__gc",       lua_server_gc         }, | 	{ "__gc",       lua_server_gc         }, | ||||||
|  | 	{ "get_buffer", lua_server_get_buffer }, | ||||||
| 	{ "send",       lua_server_send       }, | 	{ "send",       lua_server_send       }, | ||||||
| 	{ NULL,         NULL                  } | 	{ NULL,         NULL                  } | ||||||
| }; | }; | ||||||
| @ -7820,20 +7834,41 @@ lua_plugin_panic (lua_State *L) | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int | ||||||
|  | lua_plugin_property_get (lua_State *L) | ||||||
|  | { | ||||||
|  | 	luaL_checktype (L, 1, LUA_TUSERDATA); | ||||||
|  | 	const char *property_name = luaL_checkstring (L, 2); | ||||||
|  | 
 | ||||||
|  | 	// Either it's directly present in the metatable
 | ||||||
|  | 	if (luaL_getmetafield (L, 1, property_name)) | ||||||
|  | 		return 1; | ||||||
|  | 
 | ||||||
|  | 	// Or we try to find and eventually call a getter method
 | ||||||
|  | 	char *getter_name = xstrdup_printf ("get_%s", property_name); | ||||||
|  | 	bool found = luaL_getmetafield (L, 1, getter_name); | ||||||
|  | 	free (getter_name); | ||||||
|  | 
 | ||||||
|  | 	if (found) | ||||||
|  | 	{ | ||||||
|  | 		lua_pushvalue (L, 1); | ||||||
|  | 		lua_call (L, 1, 1); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return luaL_error (L, "%s: %s", | ||||||
|  | 		"no such method or property", property_name); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void | static void | ||||||
| lua_plugin_create_meta (lua_State *L, const char *name, luaL_Reg *fns) | lua_plugin_create_meta (lua_State *L, const char *name, luaL_Reg *fns) | ||||||
| { | { | ||||||
| 	luaL_newmetatable (L, name); | 	luaL_newmetatable (L, name); | ||||||
| 	luaL_setfuncs (L, fns, 0); | 	luaL_setfuncs (L, fns, 0); | ||||||
| 
 | 
 | ||||||
| 	// Otherwise any non-meta functions would be inaccessible
 | 	// Emulate properties for convenience
 | ||||||
| 	bool has_own_index = (lua_getfield (L, -1, "__index") != LUA_TNIL); | 	lua_pushcfunction (L, lua_plugin_property_get); | ||||||
| 	lua_pop (L, 1); |  | ||||||
| 	if (!has_own_index) |  | ||||||
| 	{ |  | ||||||
| 		lua_pushvalue (L, -1); |  | ||||||
| 	lua_setfield (L, -2, "__index"); | 	lua_setfield (L, -2, "__index"); | ||||||
| 	} |  | ||||||
| 	lua_pop (L, 1); | 	lua_pop (L, 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user