main.c
author Myhailo Danylenko <isbear@ukrpost.net>
Wed, 31 Mar 2010 00:09:47 +0300
changeset 96 270ce1cfc823
parent 95 f2f4c7810a72
child 97 b00f9ce82016
permissions -rw-r--r--
Enable compiler warnings
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
     1
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
     2
/* Copyright 2009 Myhailo Danylenko
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
     3
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
     4
This file is part of mcabber-lua.
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
     5
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
     6
mcabber-lua is free software: you can redistribute it and/or modify
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
     7
it under the terms of the GNU General Public License as published by
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
     8
the Free Software Foundation, either version 2 of the License, or
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
     9
(at your option) any later version.
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
    10
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
    11
This program is distributed in the hope that it will be useful,
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
    12
but WITHOUT ANY WARRANTY; without even the implied warranty of
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
    13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
    14
GNU General Public License for more details.
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
    15
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
    16
You should have received a copy of the GNU General Public License
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
    17
along with this program.  If not, see <http://www.gnu.org/licenses/>. */
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
#include <glib.h>
93
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
    20
#include <gmodule.h>   // g_module_*
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
#include <lua.h>
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
#include <lauxlib.h>
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
#include <lualib.h>
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    24
#include <stdio.h>
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    25
#include <stdlib.h>    // getenv
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    26
#include <string.h>    // strcmp
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
88
9b5c2357fad7 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 83
diff changeset
    28
#include <mcabber/logprint.h>    // scr_LogPrint
9b5c2357fad7 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 83
diff changeset
    29
#include <mcabber/screen.h>      // scr_Beep, scr_WriteIncomingMessage
9b5c2357fad7 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 83
diff changeset
    30
#include <mcabber/hbuf.h>        // HBB_PREFIX_INFO
9b5c2357fad7 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 83
diff changeset
    31
#include <mcabber/commands.h>    // process_command, cmd_add, cmd_del
9b5c2357fad7 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 83
diff changeset
    32
#include <mcabber/xmpp.h>        // xmpp_getstatus, xmpp_getstatusmsg, lconnection
9b5c2357fad7 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 83
diff changeset
    33
#include <mcabber/xmpp_helper.h> // xmpp_add_feature, xmpp_del_feature
9b5c2357fad7 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 83
diff changeset
    34
#include <mcabber/roster.h>      // imstatus2char, foreach_buddy, buddy_*, current_buddy, BUDDATA, ROSTER_TYPE_*
9b5c2357fad7 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 83
diff changeset
    35
#include <mcabber/utils.h>       // from_utf8, jidtodisp
9b5c2357fad7 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 83
diff changeset
    36
#include <mcabber/hooks.h>       // hk_add_handler, hk_del_handler
9b5c2357fad7 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 83
diff changeset
    37
#include <mcabber/settings.h>    // settings_set, settings_del, settings_get
9b5c2357fad7 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 83
diff changeset
    38
#include <mcabber/compl.h>       // compl_new_category, compl_add_category_word, compl_del_category_word
9b5c2357fad7 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 83
diff changeset
    39
#include <mcabber/events.h>      // evs_*
93
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
    40
#include <mcabber/modules.h>     // module_info_t
88
9b5c2357fad7 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 83
diff changeset
    41
3
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
    42
#include "config.h"
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    43
#include "util.h"
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
93
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
    45
// module description
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
    46
static void mlua_init   (void);
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
    47
static void mlua_uninit (void);
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
    48
95
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    49
#ifdef LLM_LOG_HANDLER
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    50
#define DESCRIPTION ( \
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    51
	"Lua scripting interface\n" \
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    52
	"Recognizes options lua_init_file, lua_hook_function and lua_lm_debug\n" \
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    53
	"Provides command /lua" )
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    54
#else
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    55
#define DESCRIPTION ( \
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    56
	"Lua scripting interface\n" \
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    57
	"Recognizes options lua_init_file and lua_hook_function\n" \
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    58
	"Provides command /lua" )
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    59
#endif
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    60
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    61
static module_info_t info_lua_experimental = {
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    62
	.branch      = "experimental",
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    63
	.api         = 5,
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    64
	.version     = PROJECT_VERSION,
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    65
	.description = DESCRIPTION,
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    66
	.requires    = NULL,
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    67
	.init        = mlua_init,
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    68
	.uninit      = mlua_uninit,
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    69
	.next        = NULL,
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    70
};
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    71
93
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
    72
module_info_t info_lua = {
95
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    73
	.branch      = "dev",
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    74
	.api         = 4,
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    75
	.version     = PROJECT_VERSION,
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    76
	.description = DESCRIPTION,
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    77
	.requires    = NULL,
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    78
	.init        = mlua_init,
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    79
	.uninit      = mlua_uninit,
f2f4c7810a72 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 94
diff changeset
    80
	.next        = &info_lua_experimental,
93
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
    81
};
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
    82
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    83
// global lua state object, necessary for uninitialization function
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    84
static lua_State *lua = NULL;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    85
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    86
// caller sould g_free result
18
ba74a9aadaf4 Fix namespace for config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 17
diff changeset
    87
static char *mcabber_config_filename (const char *file)
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    88
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    89
	const char *home = getenv ("HOME");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    90
	if (!home)
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    91
		return NULL;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    92
	return g_strconcat (home, "/.mcabber/", file ? file : "", NULL);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    93
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    94
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    95
/// print
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    96
/// Prints its arguments to log with default priority.
72
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
    97
/// A: something, ...
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    98
static int lua_global_print (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    99
{
72
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   100
	int         top = lua_gettop (L);
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   101
	int         i;
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   102
	luaL_Buffer B;
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   103
	luaL_buffinit (L, &B);
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   104
	for (i = 1; i <= top; i++) {
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   105
		int type = lua_type (L, i);
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   106
		if (i > 1)
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   107
			luaL_addchar (&B, '\t');
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   108
		if (type == LUA_TSTRING) {
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   109
			size_t len;
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   110
			const char *str = lua_tolstring (L, i, &len);
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   111
			luaL_addlstring (&B, str, len);
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   112
		} else if (type == LUA_TNUMBER)
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   113
			luaL_addstring (&B, lua_tostring (L, i)); // XXX: modifies
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   114
		else if (type == LUA_TBOOLEAN) {
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   115
			if (lua_toboolean (L, i))
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   116
				 luaL_addstring (&B, "true");
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   117
			else
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   118
				luaL_addstring (&B, "false");
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   119
		} else if (type == LUA_TNIL)
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   120
			luaL_addstring (&B, "nil");
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   121
		else {
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   122
			char xbuf[9];
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   123
			luaL_addstring (&B, luaL_typename (L, i));
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   124
			luaL_addstring (&B, ": 0x");
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   125
			snprintf (&xbuf[0], 9, "%08x", (int) lua_topointer (L, i));
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   126
			luaL_addlstring (&B, xbuf, 8); // XXX
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   127
		}
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   128
	}
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   129
	luaL_pushresult (&B);
d049c92d0809 True print
Myhailo Danylenko <isbear@ukrpost.net>
parents: 52
diff changeset
   130
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   131
	scr_LogPrint (LPRINT_LOGNORM | LPRINT_NOTUTF8, lua_tostring (L, -1));
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   132
	return 0;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   133
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   134
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   135
/// dopath
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   136
/// Loads lua file from default location.
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   137
/// XXX: g_filename_from_utf8?
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   138
/// A: string (filename, without ".lua")
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   139
/// R: string (error message, optional)
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   140
static int lua_global_dopath (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   141
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   142
	const char *name = luaL_checkstring (L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   143
	size_t      size = lua_objlen (L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   144
	char       *path;
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   145
	int         ret = 0;
33
db5396037b43 main.fileoption
Myhailo Danylenko <isbear@ukrpost.net>
parents: 32
diff changeset
   146
	if (size > 4 && !strncmp (name + size - 4, ".lua", 4))
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   147
		path = mcabber_config_filename (name);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   148
	else {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   149
		char *fname = g_strconcat (name, ".lua", NULL);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   150
		path = mcabber_config_filename (fname);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   151
		g_free (fname);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   152
	}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   153
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   154
	if (ret = luaL_loadfile (L, path))
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   155
		scr_LogPrint (LPRINT_LOGNORM, "lua: Unable to compile file %s: %s", path, lua_tostring (L, -1));
76
11bd9d10ee3b Two more localizations
Myhailo Danylenko <isbear@ukrpost.net>
parents: 75
diff changeset
   156
	else if (ret = lua_pcall (L, 0, LUA_MULTRET, 0))
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   157
		scr_LogPrint (LPRINT_LOGNORM, "lua: Runtime error in file %s: %s", path, lua_tostring (L, -1));
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   158
	g_free (path);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   159
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   160
	if (ret)
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   161
		return 1;
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   162
	else
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   163
		return 0;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   164
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   165
31
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   166
/// yes or no ansvers
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   167
/// G:
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   168
static const string2enum_t lua_yesno[] = {
39
0d43f33243cc Minor aligning
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
   169
	{ "1",       1 },
0d43f33243cc Minor aligning
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
   170
	{ "0",       0 },
31
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   171
	{ "enable",  1 },
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   172
	{ "disable", 0 },
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   173
	{ "true",    1 },
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   174
	{ "false",   0 },
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   175
	{ "on",      1 },
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   176
	{ "off",     0 },
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   177
	{ "yes",     1 },
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   178
	{ "no",      0 },
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   179
	{ NULL,     -1 },
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   180
};
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   181
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   182
/// main.yesno
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   183
/// According to yes or no ansvers returns true or false.
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   184
/// If ansver is not recognized, returns nil.
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   185
/// A: anything (string expected)
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   186
/// R: boolean or nil
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   187
static int lua_main_yesno (lua_State *L)
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   188
{
31
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   189
	int type = lua_type (L, 1);
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   190
	if (type == LUA_TSTRING) {
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   191
		int ret = luaL_checkenum (L, 1, lua_yesno);
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   192
		if (ret == -1)
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   193
			lua_pushnil (L);
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   194
		else
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   195
			lua_pushboolean (L, ret);
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   196
	} else if (type == LUA_TNUMBER)
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   197
		lua_pushboolean (L, lua_tointeger (L, 1));
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   198
	else if (type != LUA_TBOOLEAN)
54957980a83a yesno in C, no config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
   199
		lua_pushnil (L);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   200
	return 1;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   201
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   202
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   203
/// log print type
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   204
/// G:
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   205
static const string2enum_t lua_lprint[] = {
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   206
	{ "normal",  LPRINT_NORMAL  },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   207
	{ "log",     LPRINT_LOG     },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   208
	{ "debug",   LPRINT_DEBUG   },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   209
	{ "notutf0", LPRINT_NOTUTF8 },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   210
	{ NULL,      0              },
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   211
};
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   212
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   213
/// roster type
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   214
/// G:
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   215
static const string2enum_t lua_roster_type[] = {
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   216
	{ "user",    ROSTER_TYPE_USER    },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   217
	{ "group",   ROSTER_TYPE_GROUP   },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   218
	{ "agent",   ROSTER_TYPE_AGENT   },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   219
	{ "room",    ROSTER_TYPE_ROOM    },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   220
	{ "special", ROSTER_TYPE_SPECIAL },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   221
	{ NULL,      0                   },
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   222
};
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   223
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   224
/// main.log
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   225
/// Prints message to log.
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   226
/// Note: most likely you need notutf8 flag enabled.
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   227
/// A: log print type, message, message...
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   228
static int lua_main_log (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   229
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   230
	int type = luaL_checkenum_multi (L, 1, lua_lprint);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   231
	lua_concat (L, lua_gettop (L) - 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   232
	scr_LogPrint (type, lua_tostring (L, -1));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   233
	return 0;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   234
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   235
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   236
// expects table on top
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   237
static void lua_options_callback (char *key, char *value, lua_State *L)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   238
{
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   239
	char *loc = from_utf8 (key);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   240
	lua_pushstring (L, loc);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   241
	g_free (loc);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   242
	loc = from_utf8 (value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   243
	lua_pushstring (L, loc);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   244
	g_free (loc);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   245
	lua_settable (L, -3);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   246
}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   247
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   248
/// main.option
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   249
/// Sets or gets value of mcabber option.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   250
/// You can specify nil as a value to delete option.
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   251
/// If you omit option name, it returns hash table of all options.
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   252
/// A: string (option name, optional), string (value, optional)
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   253
/// R: string (value, optional)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   254
static int lua_main_option (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   255
{
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   256
	int top = lua_gettop (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   257
	if (top > 0) {
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   258
		char *name = to_utf8 (luaL_checkstring (L, 1));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   259
		if (top > 1) { // Set
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   260
			if (lua_type (L, 2) == LUA_TNIL) // Unset
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   261
				settings_del (SETTINGS_TYPE_OPTION, name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   262
			else { // Set
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   263
				char *value = to_utf8 (luaL_checkstring (L, 2));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   264
				settings_set (SETTINGS_TYPE_OPTION, name, value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   265
				g_free (value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   266
			}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   267
			g_free (name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   268
			return 0;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   269
		} else { // Get
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   270
			char *value = from_utf8 (settings_get (SETTINGS_TYPE_OPTION, name));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   271
			if (value) {
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   272
				lua_pushstring (L, value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   273
				g_free (value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   274
			} else
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   275
				lua_pushnil (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   276
			g_free (name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   277
			return 1;
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   278
		}
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   279
	} else { // List
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   280
		lua_newtable (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   281
		settings_foreach (SETTINGS_TYPE_OPTION, (void (*)(char *key, char *val, void *ud)) lua_options_callback, L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   282
		return 1;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   283
	}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   284
}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   285
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   286
/// main.alias
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   287
/// Sets or gets alias.
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   288
/// You can specify nil as a command to delete alias.
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   289
/// If you omit alias name, it will return hash table of all aliases.
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   290
/// A: string (alias name, optional), string (command, optional)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   291
/// R: string (command, optional)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   292
static int lua_main_alias (lua_State *L)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   293
{
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   294
	int top = lua_gettop (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   295
	if (top > 0) {
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   296
		char *name = to_utf8 (luaL_checkstring (L, 1));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   297
		if (top > 1) { // Set
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   298
			if (lua_type (L, 2) == LUA_TNIL) { // Unset
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   299
				settings_del (SETTINGS_TYPE_ALIAS, name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   300
				compl_del_category_word (COMPL_CMD, name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   301
			} else { // Set
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   302
				char *value = to_utf8 (luaL_checkstring (L, 2));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   303
				if (!settings_get (SETTINGS_TYPE_ALIAS, name))
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   304
					compl_add_category_word (COMPL_CMD, name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   305
				settings_set (SETTINGS_TYPE_ALIAS, name, value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   306
				g_free (value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   307
			}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   308
			g_free (name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   309
			return 0;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   310
		} else { // Get
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   311
			char *value = from_utf8 (settings_get (SETTINGS_TYPE_ALIAS, name));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   312
			if (value) {
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   313
				lua_pushstring (L, value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   314
				g_free (value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   315
			} else
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   316
				lua_pushnil (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   317
			g_free (name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   318
			return 1;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   319
		}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   320
	} else { // List
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   321
		lua_newtable (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   322
		settings_foreach (SETTINGS_TYPE_ALIAS, (void (*)(char *key, char *val, void *ud)) lua_options_callback, L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   323
		return 1;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   324
	}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   325
}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   326
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   327
/// main.bind
15
Myhailo Danylenko <isbear@ukrpost.net>
parents: 14
diff changeset
   328
/// Sets or gets binding.
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   329
/// You can specify nil as a command to unbind key.
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   330
/// If you omit keycode, it will return hash table of all bindings.
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   331
/// A: string (keycode, optional), string (command, optional)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   332
/// R: string (command, optional)
15
Myhailo Danylenko <isbear@ukrpost.net>
parents: 14
diff changeset
   333
static int lua_main_binding (lua_State *L)
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   334
{
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   335
	int top = lua_gettop (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   336
	if (top > 0) {
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   337
		// just to be sure...
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   338
		char *name = to_utf8 (luaL_checkstring (L, 1));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   339
		if (top > 1) { // Set
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   340
			if (lua_type (L, 2) == LUA_TNIL) // Unset
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   341
				settings_del (SETTINGS_TYPE_BINDING, name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   342
			else { // Set
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   343
				char *value = to_utf8 (luaL_checkstring (L, 2));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   344
				settings_set (SETTINGS_TYPE_BINDING, name, value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   345
				g_free (value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   346
			}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   347
			g_free (name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   348
			return 0;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   349
		} else { // Get
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   350
			char *value = from_utf8 (settings_get (SETTINGS_TYPE_BINDING, name));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   351
			if (value) {
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   352
				lua_pushstring (L, value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   353
				g_free (value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   354
			} else
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   355
				lua_pushnil (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   356
			g_free (name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   357
			return 1;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   358
		}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   359
	} else { // List
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   360
		lua_newtable (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   361
		settings_foreach (SETTINGS_TYPE_BINDING, (void (*)(char *key, char *val, void *ud)) lua_options_callback, L);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   362
		return 1;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   363
	}
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   364
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   365
33
db5396037b43 main.fileoption
Myhailo Danylenko <isbear@ukrpost.net>
parents: 32
diff changeset
   366
/// main.fileoption
db5396037b43 main.fileoption
Myhailo Danylenko <isbear@ukrpost.net>
parents: 32
diff changeset
   367
/// Gets option, expanding it as filename.
db5396037b43 main.fileoption
Myhailo Danylenko <isbear@ukrpost.net>
parents: 32
diff changeset
   368
/// A: string (option name)
db5396037b43 main.fileoption
Myhailo Danylenko <isbear@ukrpost.net>
parents: 32
diff changeset
   369
/// R: string (expanded option value) or nil
db5396037b43 main.fileoption
Myhailo Danylenko <isbear@ukrpost.net>
parents: 32
diff changeset
   370
static int lua_main_fileoption (lua_State *L)
db5396037b43 main.fileoption
Myhailo Danylenko <isbear@ukrpost.net>
parents: 32
diff changeset
   371
{
db5396037b43 main.fileoption
Myhailo Danylenko <isbear@ukrpost.net>
parents: 32
diff changeset
   372
	char *fname = expand_filename (settings_opt_get (luaL_checkstring (L, 1)));
db5396037b43 main.fileoption
Myhailo Danylenko <isbear@ukrpost.net>
parents: 32
diff changeset
   373
	if (fname) {
db5396037b43 main.fileoption
Myhailo Danylenko <isbear@ukrpost.net>
parents: 32
diff changeset
   374
		lua_pushstring (L, fname);
db5396037b43 main.fileoption
Myhailo Danylenko <isbear@ukrpost.net>
parents: 32
diff changeset
   375
		g_free (fname);
db5396037b43 main.fileoption
Myhailo Danylenko <isbear@ukrpost.net>
parents: 32
diff changeset
   376
	} else
db5396037b43 main.fileoption
Myhailo Danylenko <isbear@ukrpost.net>
parents: 32
diff changeset
   377
		lua_pushnil (L);
db5396037b43 main.fileoption
Myhailo Danylenko <isbear@ukrpost.net>
parents: 32
diff changeset
   378
	return 1;
db5396037b43 main.fileoption
Myhailo Danylenko <isbear@ukrpost.net>
parents: 32
diff changeset
   379
}
db5396037b43 main.fileoption
Myhailo Danylenko <isbear@ukrpost.net>
parents: 32
diff changeset
   380
78
1253cacc0f21 Build system updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 76
diff changeset
   381
#ifdef LLM_CONNECTION_ENABLE
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   382
/// main.connection
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   383
/// Returns lightuserdata of mcabber's loudmouth connection.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   384
/// This can be very useful with lua-loudmouth, and not much otherwise.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   385
/// R: lightuserdata
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   386
static int lua_main_connection (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   387
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   388
	lua_pushlightuserdata (L, lconnection);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   389
	return 1;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   390
}
78
1253cacc0f21 Build system updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 76
diff changeset
   391
#endif
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   392
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   393
/// main.print_info
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   394
/// Prints a system message to buddy's window.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   395
/// A: string (jid), string (message)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   396
static int lua_main_print_info (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   397
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   398
	char *jid  = to_utf8 (luaL_checkstring (L, 1));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   399
	char *to   = jidtodisp (jid);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   400
	char *mesg = to_utf8 (luaL_checkstring (L, 2));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   401
	scr_WriteIncomingMessage (to, mesg, 0, HBB_PREFIX_INFO, 0);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   402
	g_free (mesg);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   403
	g_free (to);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   404
	g_free (jid);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   405
	return 0;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   406
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   407
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   408
/// main.beep
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   409
/// Beeps with system speaker.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   410
static int lua_main_beep (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   411
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   412
	scr_Beep ();
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   413
	return 0;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   414
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   415
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   416
/// main.run
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   417
/// Runs specified mcabber command.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   418
/// A: string
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   419
static int lua_main_run (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   420
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   421
	process_command (luaL_checkstring (L, 1), TRUE);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   422
	return 0;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   423
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   424
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   425
/// main.status
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   426
/// Returns your current status.
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   427
/// R: string (status letter), string (status message)
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   428
static int lua_main_status (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   429
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   430
	char *sm = from_utf8 (xmpp_getstatusmsg ());
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   431
	lua_pushlstring (L, &imstatus2char[xmpp_getstatus ()], 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   432
	lua_pushstring (L, sm);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   433
	g_free (sm);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   434
	return 2;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   435
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   436
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   437
// expects table on top
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   438
static void lua_rosterlist_callback (gpointer buddy, lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   439
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   440
	char *jid = from_utf8 (buddy_getjid (buddy));
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   441
	lua_pushnumber (L, lua_objlen (L, -1) + 1);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   442
	lua_pushstring (L, jid);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   443
	lua_settable (L, -3);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   444
	g_free (jid);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   445
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   446
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   447
/// main.roster
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   448
/// Returns array of jids of buddies in roster.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   449
/// R: table
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   450
static int lua_main_roster (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   451
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   452
	lua_newtable (L);
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   453
	foreach_buddy (ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_ROOM, (void (*) (gpointer buddy, void *data)) lua_rosterlist_callback, L);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   454
	return 1;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   455
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   456
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   457
/// main.current_buddy
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   458
/// Returns jid of current selected buddy or sets current buddy to buddy with specified jid.
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   459
/// A: string (optional)
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   460
/// R: string (optional)
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   461
static int lua_main_current_buddy (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   462
{
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   463
	if (lua_gettop (L) > 0) { // Set
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   464
		// XXX: we need not convert to utf, RS works on jids/names in locale charset,
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   465
		// but will jidtodisp always correctly work on such tings?
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   466
		char *jid = jidtodisp (luaL_checkstring (L, 1));
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   467
		scr_RosterSearch (jid);
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   468
		g_free (jid);
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   469
		return 0;
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   470
	} else { // Get
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   471
		char *jid = from_utf8 (buddy_getjid (BUDDATA (current_buddy)));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   472
		lua_pushstring (L, jid);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   473
		g_free (jid);
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   474
		return 1;
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   475
	}
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   476
}
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   477
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   478
/// main.full_jid
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   479
/// Returns full jid (with current resource) of specified buddy (or current, if not specified).
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   480
/// Note, that if there are no resources online, it will return just what it got.
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   481
/// A: string (jid, optional)
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   482
/// R: string (jid)
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   483
static int lua_main_full_jid (lua_State *L)
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   484
{
40
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
   485
	GList  *buddy;
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   486
	GSList *resources;
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   487
	GSList *resource;
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   488
	if (lua_gettop (L) > 0) {
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   489
		char *jid = from_utf8 (luaL_checkstring (L, 1));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   490
		buddy = buddy_search_jid (jid);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   491
		g_free (jid);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   492
	} else
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   493
		buddy = current_buddy;
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   494
	if (!buddy)
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   495
		return 0;
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   496
	resources = buddy_getresources (BUDDATA (buddy));
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   497
	if (!resources) {
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   498
		char *loc = from_utf8 (buddy_getjid (BUDDATA (buddy)));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   499
		lua_pushstring (L, loc);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   500
		g_free (loc);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   501
	} else {
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   502
		char *jid = from_utf8 (buddy_getjid (BUDDATA (buddy)));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   503
		char *res = from_utf8 (g_slist_last (resources)->data);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   504
		lua_pushfstring (L, "%s%c%s", jid, JID_RESOURCE_SEPARATOR, res);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   505
		for (resource = resources; resource; resource = g_slist_next (resource))
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   506
			g_free (resource->data);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   507
		g_slist_free (resources);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   508
		g_free (jid);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   509
		g_free (res);
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   510
	}
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   511
	return 1;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   512
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   513
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   514
typedef struct {
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   515
	lua_State *L;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   516
	gpointer   buddy;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   517
} lua_state_and_buddy_t; // :)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   518
29
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
   519
/// resources table
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
   520
/// Hash table with resource name as keys and another hash tables as values.
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
   521
/// Inner tables contain resource-specific information: priority, status and message.
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   522
static void lua_buddy_resources_callback (gpointer resource, lua_state_and_buddy_t *d)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   523
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   524
	char *loc = from_utf8 (resource);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   525
	lua_pushstring (d->L, loc);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   526
	g_free (loc);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   527
	lua_createtable (d->L, 0, 3);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   528
	lua_pushstring (d->L, "priority");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   529
	lua_pushnumber (d->L, buddy_getresourceprio (d->buddy, resource));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   530
	lua_settable   (d->L, -3);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   531
	lua_pushstring  (d->L, "status");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   532
	lua_pushlstring (d->L, &imstatus2char[buddy_getstatus (d->buddy, resource)], 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   533
	lua_settable    (d->L, -3);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   534
	lua_pushstring (d->L, "message");
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   535
	loc = from_utf8 (buddy_getstatusmsg (d->buddy, resource));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   536
	lua_pushstring (d->L, loc);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   537
	g_free (loc);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   538
	lua_settable   (d->L, -3);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   539
	lua_settable (d->L, -3);
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   540
	g_free (resource);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   541
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   542
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   543
/// main.buddy_info
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   544
/// Returns a hash table with information on specified buddy.
29
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
   545
/// Table contains fields type, name, onserver and resources (which points to resources table).
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   546
/// A: string (jid)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   547
/// R: table
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   548
static int lua_main_buddy_info (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   549
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   550
	char                  *loc   = to_utf8 (luaL_checkstring (L, 1));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   551
	char                  *jid   = jidtodisp (loc);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   552
	GSList                *buddy = roster_find (jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_ROOM);
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   553
	GSList                *resources;
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   554
	lua_state_and_buddy_t  snb;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   555
	g_free (jid);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   556
	g_free (loc);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   557
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   558
	if (!buddy) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   559
		lua_pushnil (L);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   560
		return 1;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   561
	}
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   562
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   563
	lua_createtable (L, 0, 3);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   564
	lua_pushstring (L, "type");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   565
	luaL_pushenum  (L, buddy_gettype (BUDDATA (buddy)), lua_roster_type);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   566
	lua_settable   (L, -3);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   567
	lua_pushstring (L, "name");
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   568
	loc = from_utf8 (buddy_getname (BUDDATA (buddy)));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   569
	lua_pushstring (L, loc);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   570
	g_free (loc);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   571
	lua_settable   (L, -3);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   572
	lua_pushstring  (L, "onserver");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   573
	lua_pushboolean (L, buddy_getonserverflag (BUDDATA (buddy)));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   574
	lua_settable    (L, -3);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   575
	lua_pushstring  (L, "resources");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   576
	lua_createtable (L, 0, 0);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   577
	snb.L     = L;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   578
	snb.buddy = BUDDATA (buddy);
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   579
	resources = buddy_getresources (BUDDATA (buddy));
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   580
	g_slist_foreach (buddy_getresources (BUDDATA (buddy)), (GFunc) lua_buddy_resources_callback, &snb);
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   581
	g_slist_free (resources);
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   582
	lua_settable (L, -3);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   583
	
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   584
	return 1;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   585
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   586
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   587
// XMPP DISCO FEATURES
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   588
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   589
GSList *lua_added_features = NULL;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   590
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   591
/// main.add_feature
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   592
/// Adds xmlns to disco#info features list.
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   593
/// A: string (xmlns)
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   594
static int lua_main_add_feature (lua_State *L)
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   595
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   596
	char *xmlns = to_utf8 (luaL_checkstring (L, 1));
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   597
	xmpp_add_feature (xmlns);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   598
	lua_added_features = g_slist_prepend (lua_added_features, xmlns);
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   599
	return 0;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   600
}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   601
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   602
/// main.del_feature
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   603
/// Removes xmlns from disco#info features list.
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   604
/// A: stirng (xmlns)
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   605
static int lua_main_del_feature (lua_State *L)
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   606
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   607
	char   *xmlns = to_utf8 (luaL_checkstring (L, 1));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   608
	GSList *el    = g_slist_find_custom (lua_added_features, xmlns, (GCompareFunc) strcmp);
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   609
	xmpp_del_feature (xmlns);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   610
	if (el) {
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   611
		g_free (el->data);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   612
		lua_added_features = g_slist_delete_link (lua_added_features, el);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   613
	}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   614
	return 0;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   615
}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   616
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   617
// MCABBER EVENTS
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   618
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   619
/// event context
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   620
/// Enum, indicating what exactly caused event function firing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   621
/// G:
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   622
static const string2enum_t lua_event_context[] = {
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   623
	{ "timeout", EVS_CONTEXT_TIMEOUT  },
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   624
	{ "cancel",  EVS_CONTEXT_CANCEL   },
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   625
	{ "reject",  EVS_CONTEXT_REJECT   },
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   626
	{ "accept",  EVS_CONTEXT_ACCEPT   },
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   627
	{ NULL,      0                    },
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   628
};
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   629
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   630
typedef struct {
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   631
	lua_State *L;
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   632
	int        reference;
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   633
	int        evid;
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   634
} lua_event_callback_t;
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   635
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   636
static GSList *lua_events = NULL;
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   637
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   638
static void lua_event_callback_destroy_notify (gpointer udata)
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   639
{
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   640
	lua_event_callback_t *cb = udata;
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   641
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   642
	luaL_unref (cb -> L, LUA_REGISTRYINDEX, cb->reference);
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   643
	luaL_unref (cb -> L, LUA_REGISTRYINDEX, cb->evid);
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   644
	luaL_free  (cb -> L, cb);
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   645
}
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   646
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   647
/// event function
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   648
/// Function to be called, when some event state change occurs
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   649
/// A: event context, string (event args)
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   650
/// R: boolean (if event shoud be preserved)
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   651
static gboolean lua_event_callback (guint context, const gchar *arg, gpointer userdata)
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   652
{
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   653
	lua_event_callback_t *cb = userdata;
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   654
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   655
	lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference);
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   656
	luaL_pushenum (cb->L, context, lua_event_context);
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   657
	lua_pushstring (cb -> L, arg);
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   658
	if (lua_pcall (cb->L, 2, 1, 0)) {
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   659
		scr_LogPrint (LPRINT_LOGNORM, "lua: Event callback execution error: %s", lua_tostring (cb->L, -1));
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   660
		lua_pop (cb->L, 1);
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   661
	}
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   662
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   663
	if (lua_toboolean (cb -> L, -1))
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   664
		return TRUE;
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   665
	else {
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   666
		lua_events = g_slist_remove (lua_events, cb); // XXX
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   667
		return FALSE;
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   668
	}
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   669
}
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   670
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   671
/// main.event
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   672
/// Creates new event. If called without arguments, returns event id list.
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   673
/// A: event function (optional), string (event id), string (description, optional), integer (expiration timeout, optional)
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   674
/// R: string (event id) or nothing (creation error) or table (list of event names)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   675
static int lua_main_event (lua_State *L)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   676
{
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   677
	int top = lua_gettop (L);
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   678
	if (top > 0) { // Create
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   679
		lua_event_callback_t *cb;
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   680
		const char           *evid    = NULL;
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   681
		int                   timeout = 0;
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   682
		const char           *desc    = NULL;
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   683
		luaL_argcheck (L, lua_type (L, 1) == LUA_TFUNCTION, 1, "event function expected");
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   684
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   685
		if (top > 1) {
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   686
			evid = luaL_checkstring (L, 2);
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   687
			if (top > 2) {
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   688
				timeout = luaL_checkinteger (L, 3);
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   689
				if (top > 2) {
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   690
					desc = luaL_checkstring (L, 4);
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   691
					lua_pop (L, 3);
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   692
				} else
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   693
					lua_pop (L, 2);
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   694
			} else
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   695
				lua_pop (L, 1);
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   696
		}
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   697
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   698
		lua_pushvalue (L, 1); // XXX
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   699
		cb              = luaL_malloc (L, sizeof (lua_event_callback_t));
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   700
		cb -> L         = L;
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   701
		cb -> reference = luaL_ref (L, LUA_REGISTRYINDEX);
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   702
		cb -> evid      = LUA_NOREF;
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   703
		lua_events      = g_slist_prepend (lua_events, cb);
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   704
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   705
		evid = evs_new (desc, evid, timeout, lua_event_callback, cb, lua_event_callback_destroy_notify);
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   706
		if (!evid) {
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   707
			lua_events = g_slist_remove (lua_events, cb); // XXX
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   708
			return 0;
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   709
		}
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   710
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   711
		lua_pushstring (L, evid);
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   712
		lua_pushvalue (L, -1);
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   713
		cb -> evid = luaL_ref (L, LUA_REGISTRYINDEX); // XXX
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   714
		return 1;
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   715
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   716
	} else { // List
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
   717
		GSList *events = evs_geteventslist ();
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   718
		GSList *event;
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   719
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   720
		lua_newtable (L);
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   721
		for (event = events; event; event = g_slist_next (event)) {
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   722
			lua_pushstring (L, event->data);
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   723
			luaL_ref (L, -2);
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   724
		}
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   725
		g_slist_free (events);
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   726
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   727
		return 1;
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   728
	}
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   729
}
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
   730
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   731
// MCABBER COMMANDS
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   732
9
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   733
/// completion type
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   734
/// Built-it completion types can be specified as string, instead of id.
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   735
/// G:
32
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
   736
static string2enum_t lua_completion_type[] = { // not const,  we need to modify yesno
9
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   737
	{ "cmd",       COMPL_CMD       },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   738
	{ "jid",       COMPL_JID       },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   739
	{ "urljid",    COMPL_URLJID    },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   740
	{ "name",      COMPL_NAME      },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   741
	{ "status",    COMPL_STATUS    },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   742
	{ "filename",  COMPL_FILENAME  },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   743
	{ "roster",    COMPL_ROSTER    },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   744
	{ "buffer",    COMPL_BUFFER    },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   745
	{ "group",     COMPL_GROUP     },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   746
	{ "groupname", COMPL_GROUPNAME },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   747
	{ "multiline", COMPL_MULTILINE },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   748
	{ "room",      COMPL_ROOM      },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   749
	{ "resource",  COMPL_RESOURCE  },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   750
	{ "auth",      COMPL_AUTH      },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   751
	{ "request",   COMPL_REQUEST   },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   752
	{ "events",    COMPL_EVENTS    },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   753
	{ "eventsid",  COMPL_EVENTSID  },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   754
	{ "pgp",       COMPL_PGP       },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   755
	{ "color",     COMPL_COLOR     },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   756
	{ "otr",       COMPL_OTR       },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   757
	{ "ortpolicy", COMPL_OTRPOLICY },
32
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
   758
	{ "yesno",     0               },
9
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   759
	{ NULL,        0               },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   760
};
32
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
   761
#define MLUA_YESNO_POS ( 21 )
9
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   762
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   763
typedef struct {
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   764
	int        reference;
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   765
	int        parse_args;
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   766
	lua_State *L;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   767
} lua_command_callback_t;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   768
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   769
static GSList *lua_added_commands = NULL;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   770
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   771
static GSList *lua_added_categories = NULL;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   772
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   773
// returns true if string contains errors - unclosed quotes or unvalued option
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   774
/// command arguments table
27
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   775
/// It can parse barewords (with escapes), double-quoted strings (with escapes), single-quoted strings (without escapes), options and arguments.
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   776
/// Arguments are separated only by whitespace, so, consequential quoted strings or barewords are one argument.
27
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   777
/// This strings are equal:
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   778
/// * ab\ cd\'e\\f\"
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   779
/// * "ab cd'e\\f\""
27
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   780
/// * 'ab cd'\''e\f"'
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   781
/// * ab" cd'"'e\f"'
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   782
/// Returned table have option names as keys, option values as values, and arguments as sequential members. -- option is supported.
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   783
/// Example: "-t jid -m 9 -- -aa bb cc" will result in { t = 'jid', m = 9, '-aa', 'bb', 'cc' }
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   784
/// Implementation notes:
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   785
/// * All options should be before any arguments. First non-option argument disables options recognizing.
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   786
/// * EOL is a cutting edge, that can cut much earlier, than you expect. Non-closed quoted strings lose leading quote and option without value loses its leading minus.
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   787
/// * Escape character just before EOL is preserved.
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   788
static int luaL_pushargs (lua_State *L, const char *args)
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   789
{
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   790
	const char  *p       = args;
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   791
	luaL_Buffer  buf;
27
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   792
	int          option  = 0;
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   793
	int          options = 1;
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   794
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   795
	lua_newtable (L);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   796
	luaL_buffinit (L, &buf);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   797
	while (*p) {
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   798
		if (*p == ' ') {
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   799
			++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   800
			continue;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   801
		}
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   802
		if (*p == '"') { // soft quote
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   803
			const char *start = ++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   804
			while (*p) {
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   805
				if (*p == '\\') { // escape symbol
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   806
					luaL_addlstring (&buf, start, p - start);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   807
					start = ++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   808
					if (*p) // skip symbol
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   809
						++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   810
					else // add last \ in line
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   811
						luaL_addchar (&buf, '\\');
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   812
				} else if (*p == '"') // quotation end
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   813
					break;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   814
				else
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   815
					++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   816
			}
27
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   817
			luaL_addlstring (&buf, start, p - start); // XXX: eats quote on eol
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   818
			if (*p)
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   819
				++p;
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   820
			else
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   821
				return 1;
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   822
		} else if (*p == '\'') { // no-escape quote
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   823
			const char *start = ++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   824
			while (*p && *p != '\'')
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   825
				p++;
27
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   826
			luaL_addlstring (&buf, start, p - start); // XXX: eats quote on eol
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   827
			if (*p)
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   828
				++p;
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   829
			else
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   830
				return 1;
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   831
		} else { // bareword
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   832
			const char *start = p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   833
			while (*p) {
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   834
				if (*p == '\\') {
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   835
					luaL_addlstring (&buf, start, p - start);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   836
					start = ++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   837
					if (*p) // skip symbol
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   838
						++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   839
					else // add last \ in line
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   840
						luaL_addchar (&buf, '\\');
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   841
				} else if (*p == ' ' || *p == '\'' || *p == '"')
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   842
					break;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   843
				else
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   844
					++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   845
			}
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   846
			luaL_addlstring (&buf, start, p - start);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   847
		}
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   848
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   849
		if ((!*p) || *p == ' ') {
27
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   850
			const char *result;
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   851
			luaL_pushresult (&buf);
27
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   852
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   853
			result = lua_tostring (L, -1);
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   854
			if (options && !option && *result == '-') { // option
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   855
				if (*(result+1) == '-' && !*(result+2)) { // end of options
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   856
					lua_pop (L, 1);
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   857
					options = 0;
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   858
				} else { // option name
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   859
					lua_pushstring (L, result + 1);
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   860
					lua_remove (L, -2);
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   861
					option = 1;
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   862
				}
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   863
			} else if (option) { // opion value
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   864
				lua_settable (L, -3);
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   865
				option = 0;
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   866
			} else { // argument
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   867
				options = 0;
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   868
				luaL_ref (L, -2);
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   869
			}
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   870
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   871
			luaL_buffinit (L, &buf);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   872
		}
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   873
	}
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   874
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   875
	if (option) {
27
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   876
		luaL_ref (L, -2); // XXX: eats minus on eol
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   877
		return 1;
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   878
	}
27
92b254b64360 Full C args parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 24
diff changeset
   879
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   880
	return 0;
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   881
}
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   882
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   883
/// command function
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   884
/// Function to handle newly registered command.
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   885
/// Argument type passed depends on how command is registered.
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   886
/// A: string (arguments) or command arguments table
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   887
static void lua_main_command_handler (char *args, lua_command_callback_t *cb)
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   888
{
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   889
	lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference);
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   890
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   891
	if (cb->parse_args)
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   892
		luaL_pushargs (cb->L, args);
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   893
	else
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   894
		lua_pushstring (cb->L, args);
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   895
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   896
	if (lua_pcall (cb->L, 1, 0, 0)) {
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   897
		scr_LogPrint (LPRINT_LOGNORM, "lua: Command execution error: %s", lua_tostring (cb->L, -1));
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   898
		lua_pop (cb->L, 1);
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   899
	}
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   900
}
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   901
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   902
/// main.parse_args
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   903
/// Function to parse command argument string to command arguments table.
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   904
/// A: string
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   905
/// R: table
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   906
static int lua_main_parse_args (lua_State *L)
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   907
{
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   908
	luaL_pushargs (L, luaL_checkstring (L, 1));
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   909
	return 1;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   910
}
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   911
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   912
/// main.add_category
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   913
/// Adds completion category.
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   914
/// A: table (values are used as words for completion, optional)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   915
/// R: integer (category id, in fact completion type) or nil
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   916
static int lua_main_add_category (lua_State *L)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   917
{
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   918
	guint cid;
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   919
15
Myhailo Danylenko <isbear@ukrpost.net>
parents: 14
diff changeset
   920
	if (lua_gettop (L) > 0) {
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   921
		luaL_argcheck (L, lua_type (L, 1) == LUA_TTABLE, 1, "table expected");
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   922
		cid = compl_new_category ();
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   923
		if (cid) {
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   924
			lua_pushnil (L);
17
3a12759a22b1 Fix segfault in add_category
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   925
			while (lua_next (L, 1)) {
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   926
				char *word = to_utf8 (luaL_checkstring (L, -1));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   927
				if (word) {
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   928
					compl_add_category_word (cid, word);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   929
					g_free (word);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   930
				}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   931
				lua_pop (L, 1);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   932
			}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   933
		}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   934
	} else
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   935
		cid = compl_new_category ();
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   936
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   937
	if (cid) {
15
Myhailo Danylenko <isbear@ukrpost.net>
parents: 14
diff changeset
   938
		lua_added_categories = g_slist_prepend (lua_added_categories, (gpointer) cid);
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   939
		lua_pushinteger (L, cid);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   940
	} else
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   941
		lua_pushnil (L);
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   942
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   943
	return 1;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   944
}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   945
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   946
/// main.del_category
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   947
/// Removes completion category.
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   948
/// A: integer (category id)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   949
static int lua_main_del_category (lua_State *L)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   950
{
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   951
	guint cid = luaL_checkinteger (L, 1);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   952
	compl_del_category (cid);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   953
	lua_added_categories = g_slist_remove (lua_added_categories, (gpointer) cid);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   954
	return 0;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   955
}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   956
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   957
/// main.add_completion
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   958
/// Adds word to a completion list.
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   959
/// A: integer (completion group id), string (word)
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   960
static int lua_main_add_completion (lua_State *L)
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   961
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   962
	guint  cid  = luaL_checkinteger (L, 1);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   963
	char  *word = to_utf8 (luaL_checkstring (L, 2)); // XXX
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   964
	compl_add_category_word (cid, word);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   965
	g_free (word);
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   966
}
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   967
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   968
/// main.del_completion
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   969
/// Removes word from a completion list.
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   970
/// A: integer (completion group id), string (word)
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   971
static int lua_main_del_completion (lua_State *L)
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   972
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   973
	guint  cid  = luaL_checkinteger (L, 1);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   974
	char  *word = to_utf8 (luaL_checkstring (L, 2)); // XXX
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   975
	compl_del_category_word (cid, word);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   976
	g_free (word);
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   977
}
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   978
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   979
/// main.command
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   980
/// Associates or breaks association between mcabber command name and lua function.
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   981
/// To unregister command omit function argument.
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   982
/// If you specify a third argument, table (even empty), function will return completion group id or nothing.
9
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   983
/// You can also specify a string name (see completion type) instead of table, for non-builtin, you can just pass integer id.
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   984
/// Note, that for now there are no way to unregister completion group, so, resources can be exausted easily.
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   985
/// Also note, that it ignores keys in a completion table.
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   986
/// A: string (command name), command function (optional), boolean (parse args flag, optional), table (completions, optional)/completion type (or integer comletion group id, optional)
9
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   987
/// R: completion type (integer completion group id or string for builtin types, optional)
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   988
static int lua_main_command (lua_State *L)
39
0d43f33243cc Minor aligning
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
   989
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   990
	const char             *name = luaL_checkstring (L, 1); // XXX: to_utf8? looks like no :/
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   991
	lua_command_callback_t *cb;
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   992
	int                     top  = lua_gettop (L);
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   993
	if (top > 1) { // Register
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   994
		guint cid = 0;
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   995
		int parse = 0;
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   996
		luaL_argcheck (L, lua_isfunction (L, 2), 2, "function expected");
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   997
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   998
		if (top > 2) { // parse flag provided
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   999
			parse = lua_toboolean (L, 3);
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1000
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1001
			if (top > 3) { // Completions provided
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1002
				if (lua_type (L, 4) == LUA_TTABLE) {
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1003
					cid = compl_new_category ();
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1004
					if (cid) {
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1005
						lua_added_categories = g_slist_prepend (lua_added_categories, (gpointer) cid);
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1006
						lua_pushnil (L);
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1007
						while (lua_next (L, 4)) {
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1008
							char *word = to_utf8 (luaL_checkstring (L, -1));
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1009
							compl_add_category_word (cid, word);
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1010
							lua_pop (L, 1);
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1011
							g_free (word);
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1012
						}
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
  1013
					}
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1014
				} else
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1015
					cid = luaL_checkenum (L, 4, lua_completion_type);
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1016
			}
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
  1017
		}
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
  1018
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1019
		cb = luaL_malloc (L, sizeof (lua_command_callback_t));
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
  1020
		lua_pushvalue (L, 2);
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1021
		cb->reference  = luaL_ref (L, LUA_REGISTRYINDEX);
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1022
		cb->parse_args = parse;
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1023
		cb->L          = L;
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
  1024
		cmd_add (name, "", cid, 0, (void (*) (char *p)) lua_main_command_handler, cb);
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1025
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1026
		lua_added_commands = g_slist_prepend (lua_added_commands, g_strdup (name));
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
  1027
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
  1028
		if (cid) {
9
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
  1029
			luaL_pushenum (L, cid, lua_completion_type);
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
  1030
			return 1;
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
  1031
		}
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1032
	} else { // Unregister
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1033
		GSList *el = g_slist_find_custom (lua_added_commands, name, (GCompareFunc) g_strcmp0);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1034
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1035
		cb = cmd_del (name);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1036
		if (cb) {
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1037
			luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1038
			luaL_free (cb->L, cb);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1039
		}
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1040
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1041
		if (el) {
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1042
			g_free (el->data);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1043
			lua_added_commands = g_slist_delete_link (lua_added_commands, el);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1044
		}
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1045
	}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1046
	return 0;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1047
}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1048
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1049
// TIMER
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1050
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1051
typedef struct {
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1052
	int        reference;
29
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1053
	guint      source;
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1054
	lua_State *L;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1055
} lua_timer_callback_t;
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1056
29
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1057
static GSList *lua_timers = NULL;
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1058
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1059
static void lua_timer_callback_destroy (lua_timer_callback_t *cb)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1060
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1061
	luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference);
29
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1062
	lua_timers = g_slist_remove (lua_timers, (gpointer) cb->source);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1063
	luaL_free (cb->L, cb);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1064
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1065
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1066
/// timer function
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1067
/// Function, that will be called periodically until it returns false.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1068
/// R: boolean
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1069
static gboolean lua_timer_callback (lua_timer_callback_t *cb)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1070
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1071
	int ret;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1072
	lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1073
	if (lua_pcall (cb->L, 0, 1, 0)) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1074
		scr_LogPrint (LPRINT_LOGNORM, "lua: Timer callback execution error: %s", lua_tostring (cb->L, -1));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1075
		lua_pop (cb->L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1076
		return FALSE;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1077
	}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1078
	ret = lua_toboolean (cb->L, -1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1079
	lua_pop (cb->L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1080
	return ret;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1081
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1082
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1083
/// main.timer
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1084
/// Creates new timer function, that will be called periodically.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1085
/// A: integer (interval, seconds), timer function
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1086
static int lua_main_timer (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1087
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1088
	int                   interval = luaL_checkint (L, 1);
29
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1089
	guint                 source;
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1090
	lua_timer_callback_t *cb;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1091
	luaL_argcheck (L, lua_isfunction (L, 2), 2, "function expected");
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1092
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1093
	cb = luaL_malloc (L, sizeof (lua_timer_callback_t));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1094
	cb->reference = luaL_ref (L, LUA_REGISTRYINDEX);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1095
	cb->L         = L;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1096
30
2cf24aced294 Definitions moved to cmake options
Myhailo Danylenko <isbear@ukrpost.net>
parents: 29
diff changeset
  1097
	source = g_timeout_add_seconds_full (MLUA_SOURCE_PRIORITY, interval, (GSourceFunc) lua_timer_callback, cb, (GDestroyNotify) lua_timer_callback_destroy);
29
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1098
	cb->source = source;
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1099
	lua_timers = g_slist_prepend (lua_timers, (gpointer) source);
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1100
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1101
	return 0;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1102
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1103
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1104
// BACKGROUND PIPE READING
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1105
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1106
typedef struct {
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1107
	lua_State *L;
80
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1108
	guint      source;
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1109
	FILE      *fd;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1110
	int        reference;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1111
} lua_bgread_callback_t;
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1112
80
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1113
static GSList *lua_bgreads = NULL;
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1114
30
2cf24aced294 Definitions moved to cmake options
Myhailo Danylenko <isbear@ukrpost.net>
parents: 29
diff changeset
  1115
static gchar lua_bgread_buffer[MLUA_BGREAD_BUFFER];
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1116
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1117
static void lua_bgread_callback_destroy (lua_bgread_callback_t *cb)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1118
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1119
	luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference);
80
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1120
	pclose (cb->fd); // Not necessary?
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1121
	lua_bgreads = g_slist_remove (lua_bgreads, (gpointer) cb->source);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1122
	luaL_free (cb->L, cb);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1123
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1124
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1125
/// background reading function
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1126
/// Function, that processes output from pipe in asynchroneous way.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1127
/// A: string (data) or nil (eof)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1128
/// R: boolean (false if reading should be terminated)
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1129
static gboolean lua_bgread_callback (GIOChannel *source, GIOCondition condition, lua_bgread_callback_t *cb)
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1130
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1131
	int ret = TRUE;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1132
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1133
	if (condition | G_IO_IN) { // data
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1134
		while (TRUE) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1135
			gsize read = 0;
30
2cf24aced294 Definitions moved to cmake options
Myhailo Danylenko <isbear@ukrpost.net>
parents: 29
diff changeset
  1136
			g_io_channel_read_chars (source, lua_bgread_buffer, MLUA_BGREAD_BUFFER, &read, NULL);
78
1253cacc0f21 Build system updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 76
diff changeset
  1137
			if (!read) // exhausted
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1138
				break;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1139
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1140
			lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1141
			lua_pushlstring (cb->L, lua_bgread_buffer, read);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1142
			if (lua_pcall (cb->L, 1, 1, 0)) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1143
				scr_LogPrint (LPRINT_LOGNORM, "lua: Bgread callback execution error: %s", lua_tostring (cb->L, -1));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1144
				lua_pop (cb->L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1145
				return FALSE;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1146
			}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1147
			ret = lua_toboolean (cb->L, -1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1148
			lua_pop (cb->L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1149
			if (!ret) // enough
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1150
				return FALSE;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1151
		}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1152
	}
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1153
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1154
	if (condition & ~G_IO_IN) { // err or hup
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1155
		lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1156
		lua_pushnil (cb->L);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1157
		if (lua_pcall (cb->L, 1, 1, 0)) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1158
			scr_LogPrint (LPRINT_LOGNORM, "lua: Bgread callback execution error: %s", lua_tostring (cb->L, -1));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1159
			lua_pop (cb->L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1160
			return FALSE;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1161
		}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1162
		ret = lua_toboolean (cb->L, -1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1163
		lua_pop (cb->L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1164
	}
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1165
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1166
	return ret;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1167
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1168
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1169
/// main.bgread
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1170
/// Runs specified command and passes its output to a given function.
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1171
/// A: string (command), background reading function
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1172
static int lua_main_bgread (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1173
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1174
	const char            *command = luaL_checkstring (L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1175
	lua_bgread_callback_t *cb;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1176
	FILE                  *fd;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1177
	GIOChannel            *channel;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1178
	const char            *charset = NULL;
80
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1179
	guint                  source;
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1180
	luaL_argcheck (L, lua_isfunction (L, 2), 2, "function expected");
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1181
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1182
	fd = popen (command, "r");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1183
	if (!fd) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1184
		lua_pushstring (L, "Error opening pipe");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1185
		lua_error (L);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1186
	}
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1187
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1188
	channel = g_io_channel_unix_new (fileno (fd));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1189
	// We, most likely, need this,
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1190
	// But we cannot use this,
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1191
	// It will block.
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1192
	//if (!g_get_charset (&charset))
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1193
	g_io_channel_set_encoding (channel, charset, NULL);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1194
	g_io_channel_set_buffered (channel, FALSE);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1195
	g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, NULL);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1196
	g_io_channel_set_close_on_unref (channel, TRUE);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1197
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1198
	cb = luaL_malloc (L, sizeof (lua_bgread_callback_t));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1199
	cb->reference = luaL_ref (L, LUA_REGISTRYINDEX);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1200
	cb->L         = L;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1201
	cb->fd        = fd;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1202
80
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1203
	source = g_io_add_watch_full (channel, MLUA_SOURCE_PRIORITY, G_IO_IN|G_IO_HUP|G_IO_ERR, (GIOFunc) lua_bgread_callback, cb, (GDestroyNotify) lua_bgread_callback_destroy);
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1204
	cb->source = source;
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1205
	lua_bgreads = g_slist_prepend (lua_bgreads, (gpointer) source);
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1206
83
794e54ea1022 Package/module name change
Myhailo Danylenko <isbear@ukrpost.net>
parents: 81
diff changeset
  1207
	// unref?
794e54ea1022 Package/module name change
Myhailo Danylenko <isbear@ukrpost.net>
parents: 81
diff changeset
  1208
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1209
	return 0;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1210
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1211
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1212
// MAIN INITIALIZATION CODE
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1213
3
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1214
#ifdef LLM_LOG_HANDLER
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1215
// FIXME: this should not be here
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1216
guint lua_lm_log_handler_id;
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1217
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1218
void lua_lm_log_handler (const gchar *domain, GLogLevelFlags log_level, const gchar *message, gpointer ignore)
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1219
{
29
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1220
	if (settings_opt_get_int ("lua_lm_debug"))
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1221
		scr_LogPrint (LPRINT_LOGNORM, "%s: %s", domain, message);
3
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1222
}
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1223
#endif
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1224
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1225
static void do_lua(char *arg, lua_State *L)
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1226
{
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1227
	if (luaL_loadbuffer (L, arg, strlen (arg), "line")) {
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1228
		scr_LogPrint (LPRINT_LOGNORM, "lua: Compilation error: %s", lua_tostring (L, -1));
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1229
		lua_pop (L, 1);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1230
		return;
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1231
	}
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1232
 
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1233
	if (lua_pcall (L, 0, 0, 0)) {
76
11bd9d10ee3b Two more localizations
Myhailo Danylenko <isbear@ukrpost.net>
parents: 75
diff changeset
  1234
		scr_LogPrint (LPRINT_NORMAL, "lua: Runtime error: %s", lua_tostring(L, -1));
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
  1235
		lua_pop (L, 1);
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1236
		return;
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1237
	}
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1238
}
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1239
81
9008e2daa1b1 Hooks flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 80
diff changeset
  1240
static void lua_hook (guint32 hookid, hk_arg_t *args, lua_State *L)
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1241
{
40
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1242
	hk_arg_t   *arg  = args;
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1243
	const char *hook = settings_opt_get ("lua_hook_function");
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1244
	if (!hook)
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1245
		return;
75
5eecd8854660 Hook callback use local lua state
Myhailo Danylenko <isbear@ukrpost.net>
parents: 72
diff changeset
  1246
	lua_getglobal (L, hook);
5eecd8854660 Hook callback use local lua state
Myhailo Danylenko <isbear@ukrpost.net>
parents: 72
diff changeset
  1247
	if (!lua_isfunction (L, -1)) {
5eecd8854660 Hook callback use local lua state
Myhailo Danylenko <isbear@ukrpost.net>
parents: 72
diff changeset
  1248
		lua_pop (L, 1);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1249
		return;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1250
	}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1251
	lua_newtable (L);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1252
	while (arg->name != NULL) {
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1253
		char *name  = from_utf8 (arg->name);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1254
		char *value = from_utf8 (arg->value);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1255
		lua_pushstring (L, name);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1256
		lua_pushstring (L, value);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1257
		lua_settable (L, -3);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1258
		g_free (name);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1259
		g_free (value);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1260
		arg++;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1261
	}
75
5eecd8854660 Hook callback use local lua state
Myhailo Danylenko <isbear@ukrpost.net>
parents: 72
diff changeset
  1262
	if (lua_pcall (L, 1, 0, 0)) {
5eecd8854660 Hook callback use local lua state
Myhailo Danylenko <isbear@ukrpost.net>
parents: 72
diff changeset
  1263
		scr_LogPrint (LPRINT_NORMAL, "lua: Error in hook handler: %s", lua_tostring (L, -1));
5eecd8854660 Hook callback use local lua state
Myhailo Danylenko <isbear@ukrpost.net>
parents: 72
diff changeset
  1264
		lua_pop (L, 1);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1265
	}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1266
}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1267
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1268
static void *lua_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1269
	if (nsize == 0) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1270
		g_free (ptr);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1271
		return NULL;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1272
	} else
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1273
		return g_realloc (ptr, nsize);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1274
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1275
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
  1276
#define reg(NAME)                   \
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
  1277
	{ #NAME, lua_main_##NAME },
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1278
static const luaL_Reg lua_reg_main[] = {
40
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1279
	reg ( yesno          ) 
94
0379139a2003 Forgotten ifdefs (reported by McKael)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 93
diff changeset
  1280
#ifdef LLM_CONNECTION_ENABLE
40
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1281
	reg ( connection     ) 
94
0379139a2003 Forgotten ifdefs (reported by McKael)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 93
diff changeset
  1282
#endif
40
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1283
	reg ( log            ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1284
	reg ( option         ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1285
	reg ( alias          ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1286
	reg ( binding        ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1287
	reg ( fileoption     ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1288
	reg ( add_feature    ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1289
	reg ( del_feature    ) 
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
  1290
	reg ( event          )
40
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1291
	reg ( parse_args     ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1292
	reg ( add_category   ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1293
	reg ( del_category   ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1294
	reg ( add_completion ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1295
	reg ( del_completion ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1296
	reg ( command        ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1297
	reg ( print_info     ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1298
	reg ( beep           ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1299
	reg ( run            ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1300
	reg ( status         ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1301
	reg ( roster         ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1302
	reg ( current_buddy  ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1303
	reg ( full_jid       ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1304
	reg ( buddy_info     ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1305
	reg ( timer          ) 
4e598287dec4 Now that aligning :/
Myhailo Danylenko <isbear@ukrpost.net>
parents: 39
diff changeset
  1306
	reg ( bgread         ) 
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
  1307
	{ NULL, NULL },
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1308
};
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
  1309
#undef reg
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
  1310
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1311
const gchar *g_module_check_init (GModule *module)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1312
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1313
	lua = lua_newstate (lua_alloc, NULL);
93
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
  1314
	if (!lua)
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1315
		return "Lua initialization error";
93
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
  1316
	else
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
  1317
		return NULL;
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
  1318
}
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
  1319
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
  1320
void g_module_unload (GModule *module)
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
  1321
{
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
  1322
	if (lua) {
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
  1323
		lua_close (lua);
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
  1324
		lua = NULL;
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1325
	}
93
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
  1326
}
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1327
93
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
  1328
static void mlua_init (void)
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
  1329
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1330
	luaL_openlibs (lua);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1331
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1332
	luaL_register (lua, "main", lua_reg_main);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1333
	lua_pop (lua, 1); // XXX
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1334
	lua_register (lua, "dopath", lua_global_dopath);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1335
	lua_register (lua, "print",  lua_global_print );
3
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1336
32
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
  1337
	{
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
  1338
		int cid = compl_new_category ();
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
  1339
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
  1340
		if (cid) {
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
  1341
			const string2enum_t *word = lua_yesno;
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
  1342
			lua_completion_type[MLUA_YESNO_POS].value = cid;
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
  1343
			lua_added_categories = g_slist_prepend (lua_added_categories, (gpointer) cid);
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
  1344
			while (word->string) {
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
  1345
				compl_add_category_word (cid, word->string);
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
  1346
				++word;
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
  1347
			}
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
  1348
		}
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
  1349
	}
524fde5be49a Yesno completion in C
Myhailo Danylenko <isbear@ukrpost.net>
parents: 31
diff changeset
  1350
11
f74fff438888 Branching buddy code
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
  1351
	cmd_add ("lua", "Evaluate lua string", 0, 0, (void (*) (char *p)) do_lua, lua);
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1352
3
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1353
#ifdef LLM_LOG_HANDLER
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1354
	// FIXME: this should not be here.
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1355
	lua_lm_log_handler_id = g_log_set_handler ("lua-lm", G_LOG_LEVEL_MASK, (GLogFunc) lua_lm_log_handler, NULL);
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1356
#endif
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1357
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1358
	{
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1359
		char *initfile = expand_filename (settings_opt_get ("lua_init_filename"));
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1360
		
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1361
		if (!initfile)
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1362
			scr_LogPrint (LPRINT_LOGNORM, "lua: Cannot determine config file name");
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1363
		else {
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1364
			if (luaL_loadfile(lua, initfile)) {
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1365
				scr_LogPrint (LPRINT_LOGNORM, "lua: Unable to compile rc file: %s", lua_tostring (lua, -1));
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1366
				lua_pop (lua, 1);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1367
			} else if (lua_pcall (lua, 0, LUA_MULTRET, 0)) {
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1368
				scr_LogPrint (LPRINT_LOGNORM, "lua: Runtime error in rc file: %s", lua_tostring(lua, -1));
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1369
				lua_pop (lua, 1);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1370
			} else
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1371
				scr_LogPrint (LPRINT_LOGNORM, "lua: Loaded %s", initfile);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1372
			g_free (initfile);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1373
		}
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1374
	}
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1375
81
9008e2daa1b1 Hooks flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 80
diff changeset
  1376
	hk_add_handler ((hk_handler_t) lua_hook, ~((guint32)0), lua);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1377
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1378
	{
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1379
		hk_arg_t args[] = {
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1380
			{ "hook", "hook-start" },
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1381
			{ NULL,   NULL         },
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1382
		};
81
9008e2daa1b1 Hooks flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 80
diff changeset
  1383
		lua_hook (0, args, lua);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1384
	}
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1385
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1386
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1387
static void lua_events_cancel (gpointer data, gpointer ignore)
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
  1388
{
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1389
	lua_event_callback_t *cb = data;
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1390
	const char *evid;
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1391
	if (cb->evid == LUA_NOREF)
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1392
		return;
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1393
	lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->evid);
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1394
	evid = lua_tostring (cb ->L, -1);
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1395
	evs_callback (evid, EVS_CONTEXT_CANCEL, "Module unloading");
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1396
}
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1397
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1398
static void lua_events_destroy (gpointer data, gpointer ignore)
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1399
{
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1400
	lua_event_callback_t *cb = data;
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1401
	const char *evid;
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1402
	if (cb->evid == LUA_NOREF)
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1403
		return;
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1404
	lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->evid);
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1405
	evid = lua_tostring (cb ->L, -1);
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1406
	evs_del (evid);
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
  1407
}
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
  1408
80
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1409
static void lua_bgreads_destroy (guint source, gpointer ignore)
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1410
{
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1411
	g_source_remove (source);
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1412
}
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1413
29
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1414
static void lua_timers_destroy (guint source, gpointer ignore)
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1415
{
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1416
	g_source_remove (source);
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1417
}
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1418
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1419
static void lua_features_destroy (char *xmlns, gpointer ignore)
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1420
{
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1421
	xmpp_del_feature (xmlns);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1422
	g_free (xmlns);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1423
}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1424
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1425
static void lua_commands_destroy (char *name, gpointer ignore)
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1426
{
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1427
	lua_command_callback_t *cb = cmd_del (name);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1428
	if (cb) {
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1429
		luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1430
		luaL_free (cb->L, cb);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1431
	}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1432
	g_free (name);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1433
}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1434
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1435
static void lua_categories_destroy (guint id, gpointer ignore)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1436
{
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1437
	compl_del_category (id);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1438
}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1439
93
0a10228296c1 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 92
diff changeset
  1440
static void mlua_uninit (void)
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1441
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1442
	if (lua) {
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1443
		hk_arg_t args[] = {
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1444
			{ "hook", "hook-quit" },
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1445
			{ NULL,   NULL        },
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1446
		};
81
9008e2daa1b1 Hooks flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 80
diff changeset
  1447
		lua_hook (0, args, lua);
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1448
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1449
		hk_del_handler ((hk_handler_t) lua_hook, lua);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1450
80
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1451
		g_slist_foreach (lua_bgreads, (GFunc) lua_bgreads_destroy, NULL);
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1452
		g_slist_free (lua_bgreads);
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1453
		lua_bgreads = NULL;
c8271a839357 Added bgread destroying on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 78
diff changeset
  1454
29
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1455
		g_slist_foreach (lua_timers, (GFunc) lua_timers_destroy, NULL);
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1456
		g_slist_free (lua_timers);
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1457
		lua_timers = NULL;
0199ecce6c11 Timers destruction
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
  1458
92
5d691423c8a6 New events interface (ugly, untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 88
diff changeset
  1459
		g_slist_foreach (lua_events, (GFunc) lua_events_cancel, NULL);
52
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
  1460
		g_slist_foreach (lua_events, (GFunc) lua_events_destroy, NULL);
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
  1461
		g_slist_free (lua_events);
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
  1462
		lua_events = NULL;
Myhailo Danylenko <isbear@ukrpost.net>
parents: 40
diff changeset
  1463
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1464
		g_slist_foreach (lua_added_features, (GFunc) lua_features_destroy, NULL);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1465
		g_slist_free (lua_added_features);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1466
		lua_added_features = NULL;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1467
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1468
		g_slist_foreach (lua_added_commands, (GFunc) lua_commands_destroy, NULL);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1469
		g_slist_free (lua_added_commands);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1470
		lua_added_commands = NULL;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1471
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1472
		g_slist_foreach (lua_added_categories, (GFunc) lua_categories_destroy, NULL);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1473
		g_slist_free (lua_added_categories);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1474
		lua_added_categories = NULL;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1475
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1476
		cmd_del ("lua");
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1477
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1478
		lua_close (lua);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1479
		lua = NULL;
3
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1480
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1481
#ifdef LLM_LOG_HANDLER
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1482
		// FIXME: shouldn't be here
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1483
		g_log_remove_handler ("lua-lm", lua_lm_log_handler_id);
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1484
#endif
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1485
	}
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1486
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1487