lua.c
author Myhailo Danylenko <isbear@ukrpost.net>
Wed, 28 Nov 2012 20:17:53 +0200
changeset 146 04d19c9c1196
parent 144 690b5524b895
child 147 66a63c9609de
permissions -rw-r--r--
Fix module loading problem
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
143
4232a5da1af2 Support lua 5.2
Myhailo Danylenko <isbear@ukrpost.net>
parents: 142
diff changeset
     2
/* Copyright 2009-2012 Myhailo Danylenko
4232a5da1af2 Support lua 5.2
Myhailo Danylenko <isbear@ukrpost.net>
parents: 142
diff changeset
     3
 * Copyright 2011      Mikael Berthe
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
This file is part of mcabber-lua.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
mcabber-lua is free software: you can redistribute it and/or modify
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
it under the terms of the GNU General Public License as published by
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
the Free Software Foundation, either version 2 of the License, or
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
(at your option) any later version.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
This program is distributed in the hope that it will be useful,
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
but WITHOUT ANY WARRANTY; without even the implied warranty of
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
GNU General Public License for more details.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
You should have received a copy of the GNU General Public License
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
along with this program.  If not, see <http://www.gnu.org/licenses/>. */
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
#include <glib.h>
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
#include <gmodule.h>   // g_module_*
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
#include <lua.h>
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
#include <lauxlib.h>
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
#include <lualib.h>
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
#include <stdio.h>
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
#include <stdlib.h>    // getenv
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
#include <string.h>    // strcmp
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
#include <mcabber/logprint.h>    // scr_log_print
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    30
#include <mcabber/screen.h>      // scr_Beep, scr_WriteIncomingMessage
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    31
#include <mcabber/hbuf.h>        // HBB_PREFIX_INFO
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    32
#include <mcabber/commands.h>    // process_command, cmd_add, cmd_del
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    33
#include <mcabber/xmpp.h>        // xmpp_getstatus, xmpp_getstatusmsg, lconnection
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    34
#include <mcabber/xmpp_helper.h> // xmpp_add_feature, xmpp_del_feature
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    35
#include <mcabber/roster.h>      // imstatus2char, foreach_buddy, buddy_*, current_buddy, BUDDATA, ROSTER_TYPE_*
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    36
#include <mcabber/utils.h>       // from_utf8, jidtodisp
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    37
#include <mcabber/hooks.h>       // hk_add_handler, hk_del_handler
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    38
#include <mcabber/settings.h>    // settings_set, settings_del, settings_get
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    39
#include <mcabber/compl.h>       // compl_new_category, compl_add_category_word, compl_del_category_word
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    40
#include <mcabber/events.h>      // evs_*
118
1ad8103b72d6 Revert previous commit
Myhailo Danylenko <isbear@ukrpost.net>
parents: 117
diff changeset
    41
#include <mcabber/modules.h>     // module_info_t
1ad8103b72d6 Revert previous commit
Myhailo Danylenko <isbear@ukrpost.net>
parents: 117
diff changeset
    42
#include <mcabber/api.h>         // mcabber_branch, mcabber_api_version, MCABBER_API_HAVE_CMD_ID
107
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
    43
#include <mcabber/main.h>        // mcabber_version
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
#include "config.h"
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    46
#include "util.h"
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    47
128
8692a6fbe415 Add headers for docs
Myhailo Danylenko <isbear@ukrpost.net>
parents: 125
diff changeset
    48
/// Lua for mcabber
8692a6fbe415 Add headers for docs
Myhailo Danylenko <isbear@ukrpost.net>
parents: 125
diff changeset
    49
/// Module provides embedded lua environment with some accessors to
8692a6fbe415 Add headers for docs
Myhailo Danylenko <isbear@ukrpost.net>
parents: 125
diff changeset
    50
/// mcabber functionality.
8692a6fbe415 Add headers for docs
Myhailo Danylenko <isbear@ukrpost.net>
parents: 125
diff changeset
    51
8692a6fbe415 Add headers for docs
Myhailo Danylenko <isbear@ukrpost.net>
parents: 125
diff changeset
    52
/// Options
8692a6fbe415 Add headers for docs
Myhailo Danylenko <isbear@ukrpost.net>
parents: 125
diff changeset
    53
/// * lua_init_filename - lua script, that will be loaded at startup
8692a6fbe415 Add headers for docs
Myhailo Danylenko <isbear@ukrpost.net>
parents: 125
diff changeset
    54
/// * lua_lm_debug      - if lm log handler is enabled, this option controls, whether lm log messages are dropped or passed to mcabber logging facility
121
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
    55
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
    56
//
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
    57
//  module description
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
    58
//
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
    59
115
47bed161e3b0 Add AVV description file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 113
diff changeset
    60
void mlua_init   (void);
47bed161e3b0 Add AVV description file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 113
diff changeset
    61
void mlua_uninit (void);
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    62
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    63
#ifdef LLM_LOG_HANDLER
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    64
#define DESCRIPTION ( \
144
690b5524b895 v0.0.3 Module and command names include lua version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 143
diff changeset
    65
	LUA_RELEASE " scripting interface\n" \
121
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
    66
	"Options: " OPT_MLUA_RC ", " OPT_MLUA_LM_DEBUG "\n" \
144
690b5524b895 v0.0.3 Module and command names include lua version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 143
diff changeset
    67
	"Command: /" MLUA_COMMAND_NAME )
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    68
#else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    69
#define DESCRIPTION ( \
144
690b5524b895 v0.0.3 Module and command names include lua version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 143
diff changeset
    70
	LUA_RELEASE " scripting interface\n" \
121
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
    71
	"Options: " OPT_MLUA_RC "\n" \
144
690b5524b895 v0.0.3 Module and command names include lua version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 143
diff changeset
    72
	"Command: /" MLUA_COMMAND_NAME )
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    73
#endif
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    74
146
04d19c9c1196 Fix module loading problem
Myhailo Danylenko <isbear@ukrpost.net>
parents: 144
diff changeset
    75
module_info_t info_lua52 = {
122
9a803cc75245 Use build-time api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 121
diff changeset
    76
	.branch      = MCABBER_BRANCH,
9a803cc75245 Use build-time api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 121
diff changeset
    77
	.api         = MCABBER_API_VERSION,
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
	.version     = PROJECT_VERSION,
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    79
	.description = DESCRIPTION,
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    80
	.requires    = NULL,
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    81
	.init        = mlua_init,
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    82
	.uninit      = mlua_uninit,
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    83
	.next        = NULL,
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    84
};
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    85
121
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
    86
//
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
    87
//  globals
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
    88
//
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
    89
113
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
    90
#ifdef MCABBER_API_HAVE_CMD_ID
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
    91
static gpointer lua_cmdid;
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
    92
#endif
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
    93
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    94
// global lua state object, necessary for uninitialization function
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    95
static lua_State *lua = NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    96
121
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
    97
//
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
    98
//  code
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
    99
//
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
   100
134
d7ab555b9766 Add section header to docs
Myhailo Danylenko <isbear@ukrpost.net>
parents: 132
diff changeset
   101
/// Provided lua functions
d7ab555b9766 Add section header to docs
Myhailo Danylenko <isbear@ukrpost.net>
parents: 132
diff changeset
   102
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   103
// caller sould g_free result
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   104
static char *mcabber_config_filename (const char *file)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   105
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   106
	const char *home = getenv ("HOME");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   107
	if (!home)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   108
		return NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   109
	return g_strconcat (home, "/.mcabber/", file ? file : "", NULL);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   110
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   111
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   112
/// print
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   113
/// Prints its arguments to log with default priority.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   114
/// A: something, ...
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   115
static int lua_global_print (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   116
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   117
	int         top = lua_gettop (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   118
	int         i;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   119
	luaL_Buffer B;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   120
	luaL_buffinit (L, &B);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   121
	for (i = 1; i <= top; i++) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   122
		int type = lua_type (L, i);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   123
		if (i > 1)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   124
			luaL_addchar (&B, '\t');
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   125
		if (type == LUA_TSTRING) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   126
			size_t len;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   127
			const char *str = lua_tolstring (L, i, &len);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   128
			luaL_addlstring (&B, str, len);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   129
		} else if (type == LUA_TNUMBER)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   130
			luaL_addstring (&B, lua_tostring (L, i)); // XXX: modifies
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   131
		else if (type == LUA_TBOOLEAN) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   132
			if (lua_toboolean (L, i))
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   133
				 luaL_addstring (&B, "true");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   134
			else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   135
				luaL_addstring (&B, "false");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   136
		} else if (type == LUA_TNIL)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   137
			luaL_addstring (&B, "nil");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   138
		else {
112
15f4c09ffb86 Hopefully fix size issues on 64-bit architectures
Myhailo Danylenko <isbear@ukrpost.net>
parents: 110
diff changeset
   139
			char xbuf[32];
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   140
			luaL_addstring (&B, luaL_typename (L, i));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   141
			luaL_addstring (&B, ": 0x");
112
15f4c09ffb86 Hopefully fix size issues on 64-bit architectures
Myhailo Danylenko <isbear@ukrpost.net>
parents: 110
diff changeset
   142
			snprintf (&xbuf[0], 32, "%p", lua_topointer (L, i));
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   143
			luaL_addlstring (&B, xbuf, 8); // XXX
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   144
		}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   145
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   146
	luaL_pushresult (&B);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   147
135
0e407455faca Fix print () to not segfault on format expressions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 134
diff changeset
   148
	scr_log_print (LPRINT_LOGNORM | LPRINT_NOTUTF8, "%s", lua_tostring (L, -1));
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   149
	return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   150
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   151
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   152
/// dopath
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   153
/// Loads lua file from default location.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   154
/// XXX: g_filename_from_utf8?
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   155
/// A: string (filename, without ".lua")
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   156
/// R: string (error message, optional)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   157
static int lua_global_dopath (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   158
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   159
	const char *name = luaL_checkstring (L, 1);
143
4232a5da1af2 Support lua 5.2
Myhailo Danylenko <isbear@ukrpost.net>
parents: 142
diff changeset
   160
	size_t      size = lua_rawlen (L, 1);
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   161
	char       *path;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   162
	int         ret = 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   163
	if (size > 4 && !strncmp (name + size - 4, ".lua", 4))
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   164
		path = mcabber_config_filename (name);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   165
	else {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   166
		char *fname = g_strconcat (name, ".lua", NULL);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   167
		path = mcabber_config_filename (fname);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   168
		g_free (fname);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   169
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   170
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   171
	if ((ret = luaL_loadfile (L, path)))
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   172
		scr_log_print (LPRINT_LOGNORM, "lua: Unable to compile file %s: %s", path, lua_tostring (L, -1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   173
	else if ((ret = lua_pcall (L, 0, LUA_MULTRET, 0)))
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   174
		scr_log_print (LPRINT_LOGNORM, "lua: Runtime error in file %s: %s", path, lua_tostring (L, -1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   175
	g_free (path);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   176
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   177
	if (ret)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   178
		return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   179
	else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   180
		return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   181
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   182
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   183
/// yes or no ansvers
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   184
/// G:
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   185
static const string2enum_t lua_yesno[] = {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   186
	{ "1",       1 },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   187
	{ "0",       0 },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   188
	{ "enable",  1 },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   189
	{ "disable", 0 },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   190
	{ "true",    1 },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   191
	{ "false",   0 },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   192
	{ "on",      1 },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   193
	{ "off",     0 },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   194
	{ "yes",     1 },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   195
	{ "no",      0 },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   196
	{ NULL,     -1 },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   197
};
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   198
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   199
/// main.yesno
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   200
/// According to yes or no ansvers returns true or false.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   201
/// If ansver is not recognized, returns nil.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   202
/// A: anything (string expected)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   203
/// R: boolean or nil
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   204
static int lua_main_yesno (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   205
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   206
	int type = lua_type (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   207
	if (type == LUA_TSTRING) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   208
		int ret = luaL_checkenum (L, 1, lua_yesno);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   209
		if (ret == -1)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   210
			lua_pushnil (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   211
		else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   212
			lua_pushboolean (L, ret);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   213
	} else if (type == LUA_TNUMBER)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   214
		lua_pushboolean (L, lua_tointeger (L, 1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   215
	else if (type != LUA_TBOOLEAN)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   216
		lua_pushnil (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   217
	return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   218
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   219
107
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   220
/// main.version
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   221
/// Returns information about mcabber version
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   222
/// R: table
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   223
static int lua_main_version (lua_State *L)
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   224
{
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   225
	lua_createtable (L, 0, 3);
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   226
	lua_pushstring (L, mcabber_branch);
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   227
	lua_setfield (L, -2, "branch");
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   228
	lua_pushinteger (L, mcabber_api_version);
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   229
	lua_setfield (L, -2, "api");
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   230
	{
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   231
		gchar *version = mcabber_version ();
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   232
		lua_pushstring (L, version);
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   233
		g_free (version);
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   234
	}
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   235
	lua_setfield (L, -2, "version");
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   236
	lua_pushliteral (L, MCABBER_BRANCH);
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   237
	lua_setfield (L, -2, "build_branch");
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   238
	lua_pushinteger (L, MCABBER_API_VERSION);
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   239
	lua_setfield (L, -2, "build_api");
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   240
	lua_pushinteger (L, MCABBER_API_MIN);
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   241
	lua_setfield (L, -2, "build_api_min");
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   242
	return 1;
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   243
}
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
   244
132
2827e775d5fa Fix notutf8 flag name
Myhailo Danylenko <isbear@ukrpost.net>
parents: 128
diff changeset
   245
/// log message type
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   246
/// G:
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   247
static const string2enum_t lua_lprint[] = {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   248
	{ "normal",  LPRINT_NORMAL  },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   249
	{ "log",     LPRINT_LOG     },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   250
	{ "debug",   LPRINT_DEBUG   },
132
2827e775d5fa Fix notutf8 flag name
Myhailo Danylenko <isbear@ukrpost.net>
parents: 128
diff changeset
   251
	{ "notutf8", LPRINT_NOTUTF8 },
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   252
	{ NULL,      0              },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   253
};
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   254
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   255
/// roster type
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   256
/// G:
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   257
static const string2enum_t lua_roster_type[] = {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   258
	{ "user",    ROSTER_TYPE_USER    },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   259
	{ "group",   ROSTER_TYPE_GROUP   },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   260
	{ "agent",   ROSTER_TYPE_AGENT   },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   261
	{ "room",    ROSTER_TYPE_ROOM    },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   262
	{ "special", ROSTER_TYPE_SPECIAL },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   263
	{ NULL,      0                   },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   264
};
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   265
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   266
/// main.log
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   267
/// Prints message to log.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   268
/// Note: most likely you need notutf8 flag enabled.
132
2827e775d5fa Fix notutf8 flag name
Myhailo Danylenko <isbear@ukrpost.net>
parents: 128
diff changeset
   269
/// A: log message type, message, message...
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   270
static int lua_main_log (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   271
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   272
	int type = luaL_checkenum_multi (L, 1, lua_lprint);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   273
	lua_concat (L, lua_gettop (L) - 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   274
	scr_log_print (type, lua_tostring (L, -1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   275
	return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   276
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   277
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   278
// expects table on top
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   279
static void lua_options_callback (char *key, char *value, lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   280
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   281
	char *loc = from_utf8 (key);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   282
	lua_pushstring (L, loc);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   283
	g_free (loc);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   284
	loc = from_utf8 (value);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   285
	lua_pushstring (L, loc);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   286
	g_free (loc);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   287
	lua_settable (L, -3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   288
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   289
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   290
/// main.option
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   291
/// Sets or gets value of mcabber option.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   292
/// You can specify nil as a value to delete option.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   293
/// If you omit option name, it returns hash table of all options.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   294
/// A: string (option name, optional), string (value, optional)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   295
/// R: string (value, optional)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   296
static int lua_main_option (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   297
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   298
	int top = lua_gettop (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   299
	if (top > 0) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   300
		char *name = to_utf8 (luaL_checkstring (L, 1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   301
		if (top > 1) { // Set
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   302
			if (lua_type (L, 2) == LUA_TNIL) // Unset
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   303
				settings_del (SETTINGS_TYPE_OPTION, name);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   304
			else { // Set
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   305
				char *value = to_utf8 (luaL_checkstring (L, 2));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   306
				settings_set (SETTINGS_TYPE_OPTION, name, value);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   307
				g_free (value);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   308
			}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   309
			g_free (name);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   310
			return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   311
		} else { // Get
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   312
			char *value = from_utf8 (settings_get (SETTINGS_TYPE_OPTION, name));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   313
			if (value) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   314
				lua_pushstring (L, value);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   315
				g_free (value);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   316
			} else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   317
				lua_pushnil (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   318
			g_free (name);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   319
			return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   320
		}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   321
	} else { // List
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   322
		lua_newtable (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   323
		settings_foreach (SETTINGS_TYPE_OPTION, (void (*)(char *key, char *val, void *ud)) lua_options_callback, L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   324
		return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   325
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   326
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   327
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   328
/// main.alias
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   329
/// Sets or gets alias.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   330
/// You can specify nil as a command to delete alias.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   331
/// If you omit alias name, it will return hash table of all aliases.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   332
/// A: string (alias name, optional), string (command, optional)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   333
/// R: string (command, optional)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   334
static int lua_main_alias (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   335
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   336
	int top = lua_gettop (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   337
	if (top > 0) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   338
		char *name = to_utf8 (luaL_checkstring (L, 1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   339
		if (top > 1) { // Set
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   340
			if (lua_type (L, 2) == LUA_TNIL) { // Unset
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   341
				settings_del (SETTINGS_TYPE_ALIAS, name);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   342
				compl_del_category_word (COMPL_CMD, name);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   343
			} else { // Set
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   344
				char *value = to_utf8 (luaL_checkstring (L, 2));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   345
				if (!settings_get (SETTINGS_TYPE_ALIAS, name))
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   346
					compl_add_category_word (COMPL_CMD, name);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   347
				settings_set (SETTINGS_TYPE_ALIAS, name, value);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   348
				g_free (value);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   349
			}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   350
			g_free (name);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   351
			return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   352
		} else { // Get
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   353
			char *value = from_utf8 (settings_get (SETTINGS_TYPE_ALIAS, name));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   354
			if (value) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   355
				lua_pushstring (L, value);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   356
				g_free (value);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   357
			} else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   358
				lua_pushnil (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   359
			g_free (name);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   360
			return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   361
		}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   362
	} else { // List
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   363
		lua_newtable (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   364
		settings_foreach (SETTINGS_TYPE_ALIAS, (void (*)(char *key, char *val, void *ud)) lua_options_callback, L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   365
		return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   366
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   367
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   368
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   369
/// main.bind
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   370
/// Sets or gets binding.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   371
/// You can specify nil as a command to unbind key.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   372
/// If you omit keycode, it will return hash table of all bindings.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   373
/// A: string (keycode, optional), string (command, optional)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   374
/// R: string (command, optional)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   375
static int lua_main_binding (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   376
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   377
	int top = lua_gettop (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   378
	if (top > 0) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   379
		// just to be sure...
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   380
		char *name = to_utf8 (luaL_checkstring (L, 1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   381
		if (top > 1) { // Set
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   382
			if (lua_type (L, 2) == LUA_TNIL) // Unset
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   383
				settings_del (SETTINGS_TYPE_BINDING, name);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   384
			else { // Set
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   385
				char *value = to_utf8 (luaL_checkstring (L, 2));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   386
				settings_set (SETTINGS_TYPE_BINDING, name, value);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   387
				g_free (value);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   388
			}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   389
			g_free (name);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   390
			return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   391
		} else { // Get
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   392
			char *value = from_utf8 (settings_get (SETTINGS_TYPE_BINDING, name));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   393
			if (value) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   394
				lua_pushstring (L, value);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   395
				g_free (value);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   396
			} else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   397
				lua_pushnil (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   398
			g_free (name);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   399
			return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   400
		}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   401
	} else { // List
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   402
		lua_newtable (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   403
		settings_foreach (SETTINGS_TYPE_BINDING, (void (*)(char *key, char *val, void *ud)) lua_options_callback, L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   404
		return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   405
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   406
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   407
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   408
/// main.fileoption
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   409
/// Gets option, expanding it as filename.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   410
/// A: string (option name)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   411
/// R: string (expanded option value) or nil
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   412
static int lua_main_fileoption (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   413
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   414
	char *fname = expand_filename (settings_opt_get (luaL_checkstring (L, 1)));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   415
	if (fname) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   416
		lua_pushstring (L, fname);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   417
		g_free (fname);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   418
	} else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   419
		lua_pushnil (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   420
	return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   421
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   422
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   423
#ifdef LLM_CONNECTION_ENABLE
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   424
/// main.connection
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   425
/// Returns lightuserdata of mcabber's loudmouth connection.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   426
/// This can be very useful with lua-loudmouth, and not much otherwise.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   427
/// R: lightuserdata or nil
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   428
static int lua_main_connection (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   429
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   430
	if (xmpp_is_online ())
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   431
		lua_pushlightuserdata (L, lconnection);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   432
	else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   433
		lua_pushnil (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   434
	return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   435
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   436
#endif
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   437
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   438
/// main.print_info
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   439
/// Prints a system message to buddy's window.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   440
/// A: string (jid), string (message)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   441
static int lua_main_print_info (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   442
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   443
	char *jid  = to_utf8 (luaL_checkstring (L, 1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   444
	char *to   = jidtodisp (jid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   445
	char *mesg = to_utf8 (luaL_checkstring (L, 2));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   446
	scr_write_incoming_message (to, mesg, 0, HBB_PREFIX_INFO, 0);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   447
	g_free (mesg);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   448
	g_free (to);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   449
	g_free (jid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   450
	return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   451
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   452
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   453
/// main.beep
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   454
/// Beeps with system speaker.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   455
static int lua_main_beep (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   456
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   457
	scr_beep ();
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   458
	return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   459
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   460
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   461
/// main.run
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   462
/// Runs specified mcabber command.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   463
/// A: string
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   464
static int lua_main_run (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   465
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   466
	process_command (luaL_checkstring (L, 1), TRUE);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   467
	return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   468
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   469
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   470
/// main.status
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   471
/// Returns your current status.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   472
/// R: string (status letter), string (status message)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   473
static int lua_main_status (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   474
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   475
	char *sm = from_utf8 (xmpp_getstatusmsg ());
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   476
	lua_pushlstring (L, &imstatus2char[xmpp_getstatus ()], 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   477
	lua_pushstring (L, sm);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   478
	g_free (sm);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   479
	return 2;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   480
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   481
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   482
// expects table on top
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   483
static void lua_rosterlist_callback (gpointer buddy, lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   484
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   485
	char *jid = from_utf8 (buddy_getjid (buddy));
143
4232a5da1af2 Support lua 5.2
Myhailo Danylenko <isbear@ukrpost.net>
parents: 142
diff changeset
   486
	lua_pushnumber (L, lua_rawlen (L, -1) + 1);
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   487
	lua_pushstring (L, jid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   488
	lua_settable (L, -3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   489
	g_free (jid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   490
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   491
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   492
/// main.roster
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   493
/// Returns array of jids of buddies in roster.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   494
/// R: table
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   495
static int lua_main_roster (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   496
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   497
	lua_newtable (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   498
	foreach_buddy (ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_ROOM, (void (*) (gpointer buddy, void *data)) lua_rosterlist_callback, L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   499
	return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   500
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   501
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   502
/// main.current_buddy
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   503
/// Returns jid of current selected buddy or sets current buddy to buddy with specified jid.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   504
/// A: string (optional)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   505
/// R: string (optional)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   506
static int lua_main_current_buddy (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   507
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   508
	if (lua_gettop (L) > 0) { // Set
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   509
		// XXX: we need not convert to utf, RS works on jids/names in locale charset,
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   510
		// but will jidtodisp always correctly work on such tings?
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   511
		char *jid = jidtodisp (luaL_checkstring (L, 1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   512
		scr_roster_search (jid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   513
		g_free (jid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   514
		return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   515
	} else { // Get
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   516
		char *jid = from_utf8 (buddy_getjid (BUDDATA (current_buddy)));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   517
		lua_pushstring (L, jid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   518
		g_free (jid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   519
		return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   520
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   521
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   522
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   523
/// main.full_jid
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   524
/// Returns full jid (with current resource) of specified buddy (or current, if not specified).
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   525
/// Note, that if there are no resources online, it will return just what it got.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   526
/// A: string (jid, optional)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   527
/// R: string (jid)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   528
static int lua_main_full_jid (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   529
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   530
	GList  *buddy;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   531
	GSList *resources;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   532
	GSList *resource;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   533
	if (lua_gettop (L) > 0) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   534
		char *jid = from_utf8 (luaL_checkstring (L, 1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   535
		buddy = buddy_search_jid (jid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   536
		g_free (jid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   537
	} else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   538
		buddy = current_buddy;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   539
	if (!buddy)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   540
		return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   541
	resources = buddy_getresources (BUDDATA (buddy));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   542
	if (!resources) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   543
		char *loc = from_utf8 (buddy_getjid (BUDDATA (buddy)));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   544
		lua_pushstring (L, loc);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   545
		g_free (loc);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   546
	} else {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   547
		char *jid = from_utf8 (buddy_getjid (BUDDATA (buddy)));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   548
		char *res = from_utf8 (g_slist_last (resources)->data);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   549
		lua_pushfstring (L, "%s%c%s", jid, JID_RESOURCE_SEPARATOR, res);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   550
		for (resource = resources; resource; resource = g_slist_next (resource))
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   551
			g_free (resource->data);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   552
		g_slist_free (resources);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   553
		g_free (jid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   554
		g_free (res);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   555
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   556
	return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   557
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   558
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   559
typedef struct {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   560
	lua_State *L;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   561
	gpointer   buddy;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   562
} lua_state_and_buddy_t; // :)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   563
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   564
/// resources table
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   565
/// Hash table with resource name as keys and another hash tables as values.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   566
/// Inner tables contain resource-specific information: priority, status and message.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   567
static void lua_buddy_resources_callback (gpointer resource, lua_state_and_buddy_t *d)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   568
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   569
	char *loc = from_utf8 (resource);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   570
	lua_pushstring (d->L, loc);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   571
	g_free (loc);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   572
	lua_createtable (d->L, 0, 3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   573
	lua_pushstring (d->L, "priority");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   574
	lua_pushnumber (d->L, buddy_getresourceprio (d->buddy, resource));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   575
	lua_settable   (d->L, -3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   576
	lua_pushstring  (d->L, "status");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   577
	lua_pushlstring (d->L, &imstatus2char[buddy_getstatus (d->buddy, resource)], 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   578
	lua_settable    (d->L, -3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   579
	lua_pushstring (d->L, "message");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   580
	loc = from_utf8 (buddy_getstatusmsg (d->buddy, resource));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   581
	lua_pushstring (d->L, loc);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   582
	g_free (loc);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   583
	lua_settable   (d->L, -3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   584
	lua_settable (d->L, -3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   585
	g_free (resource);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   586
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   587
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   588
/// main.buddy_info
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   589
/// Returns a hash table with information on specified buddy.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   590
/// Table contains fields type, name, onserver and resources (which points to resources table).
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   591
/// A: string (jid)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   592
/// R: table
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   593
static int lua_main_buddy_info (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   594
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   595
	char                  *loc   = to_utf8 (luaL_checkstring (L, 1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   596
	char                  *jid   = jidtodisp (loc);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   597
	GSList                *buddy = roster_find (jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_ROOM);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   598
	GSList                *resources;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   599
	lua_state_and_buddy_t  snb;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   600
	g_free (jid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   601
	g_free (loc);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   602
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   603
	if (!buddy) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   604
		lua_pushnil (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   605
		return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   606
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   607
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   608
	lua_createtable (L, 0, 3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   609
	lua_pushstring (L, "type");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   610
	luaL_pushenum  (L, buddy_gettype (BUDDATA (buddy)), lua_roster_type);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   611
	lua_settable   (L, -3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   612
	lua_pushstring (L, "name");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   613
	loc = from_utf8 (buddy_getname (BUDDATA (buddy)));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   614
	lua_pushstring (L, loc);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   615
	g_free (loc);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   616
	lua_settable   (L, -3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   617
	lua_pushstring  (L, "onserver");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   618
	lua_pushboolean (L, buddy_getonserverflag (BUDDATA (buddy)));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   619
	lua_settable    (L, -3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   620
	lua_pushstring  (L, "resources");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   621
	lua_createtable (L, 0, 0);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   622
	snb.L     = L;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   623
	snb.buddy = BUDDATA (buddy);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   624
	resources = buddy_getresources (BUDDATA (buddy));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   625
	g_slist_foreach (buddy_getresources (BUDDATA (buddy)), (GFunc) lua_buddy_resources_callback, &snb);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   626
	g_slist_free (resources);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   627
	lua_settable (L, -3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   628
	
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   629
	return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   630
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   631
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   632
// XMPP DISCO FEATURES
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   633
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   634
GSList *lua_added_features = NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   635
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   636
/// main.add_feature
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   637
/// Adds xmlns to disco#info features list.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   638
/// A: string (xmlns)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   639
static int lua_main_add_feature (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   640
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   641
	char *xmlns = to_utf8 (luaL_checkstring (L, 1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   642
	xmpp_add_feature (xmlns);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   643
	lua_added_features = g_slist_prepend (lua_added_features, xmlns);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   644
	return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   645
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   646
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   647
/// main.del_feature
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   648
/// Removes xmlns from disco#info features list.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   649
/// A: stirng (xmlns)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   650
static int lua_main_del_feature (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   651
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   652
	char   *xmlns = to_utf8 (luaL_checkstring (L, 1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   653
	GSList *el    = g_slist_find_custom (lua_added_features, xmlns, (GCompareFunc) strcmp);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   654
	xmpp_del_feature (xmlns);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   655
	if (el) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   656
		g_free (el->data);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   657
		lua_added_features = g_slist_delete_link (lua_added_features, el);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   658
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   659
	return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   660
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   661
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   662
// MCABBER EVENTS
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   663
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   664
/// event context
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   665
/// Enum, indicating what exactly caused event function firing.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   666
/// G:
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   667
static const string2enum_t lua_event_context[] = {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   668
	{ "timeout", EVS_CONTEXT_TIMEOUT  },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   669
	{ "cancel",  EVS_CONTEXT_CANCEL   },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   670
	{ "reject",  EVS_CONTEXT_REJECT   },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   671
	{ "accept",  EVS_CONTEXT_ACCEPT   },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   672
	{ NULL,      0                    },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   673
};
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   674
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   675
typedef struct {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   676
	lua_State *L;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   677
	int        reference;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   678
	int        evid;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   679
} lua_event_callback_t;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   680
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   681
static GSList *lua_events = NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   682
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   683
static void lua_event_callback_destroy_notify (gpointer udata)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   684
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   685
	lua_event_callback_t *cb = udata;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   686
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   687
	luaL_unref (cb -> L, LUA_REGISTRYINDEX, cb->reference);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   688
	luaL_unref (cb -> L, LUA_REGISTRYINDEX, cb->evid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   689
	luaL_free  (cb -> L, cb);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   690
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   691
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   692
/// event function
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   693
/// Function to be called, when some event state change occurs
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   694
/// A: event context, string (event args)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   695
/// R: boolean (if event shoud be preserved)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   696
static gboolean lua_event_callback (guint context, const gchar *arg, gpointer userdata)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   697
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   698
	lua_event_callback_t *cb = userdata;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   699
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   700
	lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   701
	luaL_pushenum (cb->L, context, lua_event_context);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   702
	lua_pushstring (cb -> L, arg);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   703
	if (lua_pcall (cb->L, 2, 1, 0)) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   704
		scr_log_print (LPRINT_LOGNORM, "lua: Event callback execution error: %s", lua_tostring (cb->L, -1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   705
		lua_pop (cb->L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   706
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   707
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   708
	if (lua_toboolean (cb -> L, -1))
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   709
		return TRUE;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   710
	else {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   711
		lua_events = g_slist_remove (lua_events, cb); // XXX
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   712
		return FALSE;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   713
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   714
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   715
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   716
/// main.event
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   717
/// Creates new event. If called without arguments, returns event id list.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   718
/// A: event function (optional), string (event id), string (description, optional), integer (expiration timeout, optional)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   719
/// R: string (event id) or nothing (creation error) or table (list of event names)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   720
static int lua_main_event (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   721
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   722
	int top = lua_gettop (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   723
	if (top > 0) { // Create
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   724
		lua_event_callback_t *cb;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   725
		const char           *evid    = NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   726
		int                   timeout = 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   727
		const char           *desc    = NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   728
		luaL_argcheck (L, lua_type (L, 1) == LUA_TFUNCTION, 1, "event function expected");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   729
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   730
		if (top > 1) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   731
			evid = luaL_checkstring (L, 2);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   732
			if (top > 2) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   733
				timeout = luaL_checkinteger (L, 3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   734
				if (top > 2) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   735
					desc = luaL_checkstring (L, 4);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   736
					lua_pop (L, 3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   737
				} else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   738
					lua_pop (L, 2);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   739
			} else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   740
				lua_pop (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   741
		}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   742
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   743
		lua_pushvalue (L, 1); // XXX
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   744
		cb              = luaL_malloc (L, sizeof (lua_event_callback_t));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   745
		cb -> L         = L;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   746
		cb -> reference = luaL_ref (L, LUA_REGISTRYINDEX);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   747
		cb -> evid      = LUA_NOREF;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   748
		lua_events      = g_slist_prepend (lua_events, cb);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   749
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   750
		evid = evs_new (desc, evid, timeout, lua_event_callback, cb, lua_event_callback_destroy_notify);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   751
		if (!evid) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   752
			lua_events = g_slist_remove (lua_events, cb); // XXX
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   753
			return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   754
		}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   755
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   756
		lua_pushstring (L, evid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   757
		lua_pushvalue (L, -1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   758
		cb -> evid = luaL_ref (L, LUA_REGISTRYINDEX); // XXX
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   759
		return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   760
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   761
	} else { // List
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   762
		GSList *events = evs_geteventslist ();
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   763
		GSList *event;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   764
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   765
		lua_newtable (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   766
		for (event = events; event; event = g_slist_next (event)) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   767
			lua_pushstring (L, event->data);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   768
			luaL_ref (L, -2);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   769
		}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   770
		g_slist_free (events);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   771
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   772
		return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   773
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   774
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   775
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   776
// MCABBER COMMANDS
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   777
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   778
/// completion type
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   779
/// Built-it completion types can be specified as string, instead of id.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   780
/// G:
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   781
static string2enum_t lua_completion_type[] = { // not const,  we need to modify yesno
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   782
	{ "cmd",       COMPL_CMD       },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   783
	{ "jid",       COMPL_JID       },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   784
	{ "urljid",    COMPL_URLJID    },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   785
	{ "name",      COMPL_NAME      },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   786
	{ "status",    COMPL_STATUS    },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   787
	{ "filename",  COMPL_FILENAME  },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   788
	{ "roster",    COMPL_ROSTER    },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   789
	{ "buffer",    COMPL_BUFFER    },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   790
	{ "group",     COMPL_GROUP     },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   791
	{ "groupname", COMPL_GROUPNAME },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   792
	{ "multiline", COMPL_MULTILINE },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   793
	{ "room",      COMPL_ROOM      },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   794
	{ "resource",  COMPL_RESOURCE  },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   795
	{ "auth",      COMPL_AUTH      },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   796
	{ "request",   COMPL_REQUEST   },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   797
	{ "events",    COMPL_EVENTS    },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   798
	{ "eventsid",  COMPL_EVENTSID  },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   799
	{ "pgp",       COMPL_PGP       },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   800
	{ "color",     COMPL_COLOR     },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   801
	{ "otr",       COMPL_OTR       },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   802
	{ "ortpolicy", COMPL_OTRPOLICY },
142
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   803
	{ "module",    COMPL_MODULE    },
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   804
	{ "yesno",     0               },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   805
	{ NULL,        0               },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   806
};
142
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   807
#define MLUA_YESNO_POS ( 22 )
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   808
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   809
#ifdef MCABBER_API_HAVE_COMPL_FLAGS
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   810
/// completion sorting order
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   811
/// Sorting order for completion category.
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   812
/// G:
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   813
static const string2enum_t lua_completion_sortorder[] = {
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   814
	{ "sort",    COMPL_FLAGS_SORT    },
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   815
	{ "direct",  COMPL_FLAGS_SORT    },
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   816
	{ "reverse", COMPL_FLAGS_REVERSE },
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   817
	{ "append",  COMPL_FLAGS_APPEND  },
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   818
	{ "prepend", COMPL_FLAGS_PREPEND },
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   819
	{ NULL,        0                 },
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   820
};
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   821
#endif
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   822
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   823
typedef struct {
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
   824
	int        cbref;
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   825
	int        parse_args;
113
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
   826
#ifdef MCABBER_API_HAVE_CMD_ID
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
   827
	gpointer   cmid;
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
   828
#else
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
   829
	int        nameref;
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
   830
#endif
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
   831
	int        selfref;
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   832
	lua_State *L;
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
   833
} lua_command_t;
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   834
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   835
static GSList *lua_added_categories = NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   836
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   837
// returns true if string contains errors - unclosed quotes or unvalued option
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   838
/// command arguments table
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   839
/// It can parse barewords (with escapes), double-quoted strings (with escapes), single-quoted strings (without escapes), options and arguments.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   840
/// Arguments are separated only by whitespace, so, consequential quoted strings or barewords are one argument.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   841
/// This strings are equal:
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   842
/// * ab\ cd\'e\\f\"
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   843
/// * "ab cd'e\\f\""
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   844
/// * 'ab cd'\''e\f"'
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   845
/// * ab" cd'"'e\f"'
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   846
/// Returned table have option names as keys, option values as values, and arguments as sequential members. -- option is supported.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   847
/// Example: "-t jid -m 9 -- -aa bb cc" will result in { t = 'jid', m = 9, '-aa', 'bb', 'cc' }
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   848
/// Implementation notes:
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   849
/// * All options should be before any arguments. First non-option argument disables options recognizing.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   850
/// * 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.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   851
/// * Escape character just before EOL is preserved.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   852
static int luaL_pushargs (lua_State *L, const char *args)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   853
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   854
	const char  *p       = args;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   855
	luaL_Buffer  buf;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   856
	int          option  = 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   857
	int          options = 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   858
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   859
	lua_newtable (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   860
	luaL_buffinit (L, &buf);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   861
	while (*p) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   862
		if (*p == ' ') {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   863
			++p;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   864
			continue;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   865
		}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   866
		if (*p == '"') { // soft quote
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   867
			const char *start = ++p;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   868
			while (*p) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   869
				if (*p == '\\') { // escape symbol
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   870
					luaL_addlstring (&buf, start, p - start);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   871
					start = ++p;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   872
					if (*p) // skip symbol
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   873
						++p;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   874
					else // add last \ in line
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   875
						luaL_addchar (&buf, '\\');
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   876
				} else if (*p == '"') // quotation end
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   877
					break;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   878
				else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   879
					++p;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   880
			}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   881
			luaL_addlstring (&buf, start, p - start); // XXX: eats quote on eol
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   882
			if (*p)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   883
				++p;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   884
			else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   885
				return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   886
		} else if (*p == '\'') { // no-escape quote
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   887
			const char *start = ++p;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   888
			while (*p && *p != '\'')
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   889
				p++;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   890
			luaL_addlstring (&buf, start, p - start); // XXX: eats quote on eol
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   891
			if (*p)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   892
				++p;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   893
			else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   894
				return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   895
		} else { // bareword
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   896
			const char *start = p;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   897
			while (*p) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   898
				if (*p == '\\') {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   899
					luaL_addlstring (&buf, start, p - start);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   900
					start = ++p;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   901
					if (*p) // skip symbol
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   902
						++p;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   903
					else // add last \ in line
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   904
						luaL_addchar (&buf, '\\');
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   905
				} else if (*p == ' ' || *p == '\'' || *p == '"')
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   906
					break;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   907
				else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   908
					++p;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   909
			}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   910
			luaL_addlstring (&buf, start, p - start);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   911
		}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   912
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   913
		if ((!*p) || *p == ' ') {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   914
			const char *result;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   915
			luaL_pushresult (&buf);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   916
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   917
			result = lua_tostring (L, -1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   918
			if (options && !option && *result == '-') { // option
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   919
				if (*(result+1) == '-' && !*(result+2)) { // end of options
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   920
					lua_pop (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   921
					options = 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   922
				} else { // option name
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   923
					lua_pushstring (L, result + 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   924
					lua_remove (L, -2);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   925
					option = 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   926
				}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   927
			} else if (option) { // opion value
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   928
				lua_settable (L, -3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   929
				option = 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   930
			} else { // argument
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   931
				options = 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   932
				luaL_ref (L, -2);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   933
			}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   934
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   935
			luaL_buffinit (L, &buf);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   936
		}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   937
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   938
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   939
	if (option) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   940
		luaL_ref (L, -2); // XXX: eats minus on eol
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   941
		return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   942
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   943
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   944
	return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   945
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   946
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   947
/// command function
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   948
/// Function to handle newly registered command.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   949
/// Argument type passed depends on how command is registered.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   950
/// A: string (arguments) or command arguments table
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
   951
static void lua_main_command_handler (char *args, lua_command_t *cb)
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   952
{
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
   953
	lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->cbref);
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   954
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   955
	if (cb->parse_args)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   956
		luaL_pushargs (cb->L, args);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   957
	else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   958
		lua_pushstring (cb->L, args);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   959
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   960
	if (lua_pcall (cb->L, 1, 0, 0)) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   961
		scr_log_print (LPRINT_LOGNORM, "lua: Command execution error: %s", lua_tostring (cb->L, -1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   962
		lua_pop (cb->L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   963
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   964
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   965
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   966
/// main.parse_args
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   967
/// Function to parse command argument string to command arguments table.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   968
/// A: string
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   969
/// R: table
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   970
static int lua_main_parse_args (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   971
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   972
	luaL_pushargs (L, luaL_checkstring (L, 1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   973
	return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   974
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   975
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   976
/// main.add_category
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   977
/// Adds completion category.
142
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   978
/// A: table (values are used as words for completion, optional), argument enum value (completion sorting order, optional)
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   979
/// R: integer (category id, in fact completion type) or nil
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   980
static int lua_main_add_category (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   981
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   982
	guint cid;
142
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   983
	int   top = lua_gettop ( L );
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   984
#ifdef MCABBER_API_HAVE_COMPL_FLAGS
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   985
	if ( top > 1 )
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   986
		cid = compl_new_category ( luaL_checkenum ( L, 2, lua_completion_sortorder ) );
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   987
	else
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   988
		cid = compl_new_category ( COMPL_FLAGS_SORT );
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   989
#else
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   990
	cid = compl_new_category ();
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   991
#endif
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   992
	if ( cid ) {
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   993
		if ( ( top > 0 ) && ( lua_type ( L, 1 ) == LUA_TTABLE ) ) {
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   994
			lua_pushnil ( L );
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   995
			while ( lua_next ( L, 1 ) ) {
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   996
				char * word = to_utf8 ( lua_tostring ( L, 4 ) );
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   997
				if ( word ) {
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   998
					compl_add_category_word ( cid, word );
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
   999
					g_free ( word );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1000
				}
142
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
  1001
				lua_pop ( L, 1 );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1002
			}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1003
		}
142
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
  1004
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
  1005
		lua_added_categories = g_slist_prepend ( lua_added_categories, (gpointer) ((gsize) cid) );
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
  1006
		lua_pushinteger ( L, cid );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1007
	} else
142
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
  1008
		lua_pushnil ( L );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1009
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1010
	return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1011
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1012
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1013
/// main.del_category
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1014
/// Removes completion category.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1015
/// A: integer (category id)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1016
static int lua_main_del_category (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1017
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1018
	guint cid = luaL_checkinteger (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1019
	compl_del_category (cid);
112
15f4c09ffb86 Hopefully fix size issues on 64-bit architectures
Myhailo Danylenko <isbear@ukrpost.net>
parents: 110
diff changeset
  1020
	lua_added_categories = g_slist_remove (lua_added_categories, (gpointer) ((gsize) cid));
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1021
	return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1022
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1023
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1024
/// main.add_completion
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1025
/// Adds word to a completion list.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1026
/// A: integer (completion group id), string (word)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1027
static int lua_main_add_completion (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1028
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1029
	guint  cid  = luaL_checkinteger (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1030
	char  *word = to_utf8 (luaL_checkstring (L, 2)); // XXX
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1031
	compl_add_category_word (cid, word);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1032
	g_free (word);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1033
	return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1034
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1035
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1036
/// main.del_completion
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1037
/// Removes word from a completion list.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1038
/// A: integer (completion group id), string (word)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1039
static int lua_main_del_completion (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1040
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1041
	guint  cid  = luaL_checkinteger (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1042
	char  *word = to_utf8 (luaL_checkstring (L, 2)); // XXX
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1043
	compl_del_category_word (cid, word);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1044
	g_free (word);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1045
	return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1046
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1047
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1048
/// main.command
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1049
/// Associates mcabber command name and lua function.
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1050
/// As a completion you can also specify a string name (see completion type) instead of table, for non-builtin, you can just pass integer id.
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1051
/// Note, that for now there are no way to unregister completion group, so, resources can be exausted easily.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1052
/// Also note, that it ignores keys in a completion table.
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1053
/// A: string (command name), command function, boolean (parse args flag, optional), table (completions, optional)/completion type (or integer comletion group id, optional)
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1054
/// R: userdata (command object)
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1055
static int lua_main_command (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1056
{
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1057
	const char    *name  = luaL_checkstring (L, 1); // XXX: to_utf8? looks like no :/
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1058
	lua_command_t *cb;
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1059
	int            top   = lua_gettop (L);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1060
	guint          cid   = 0;
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1061
	int            parse = 0;
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1062
	luaL_argcheck (L, lua_isfunction (L, 2), 2, "function expected");
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1063
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1064
	if (top > 2) { // parse flag provided
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1065
		parse = lua_toboolean (L, 3);
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1066
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1067
		if (top > 3) { // Completions provided
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1068
			if (lua_type (L, 4) == LUA_TTABLE) {
142
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
  1069
#ifdef MCABBER_API_HAVE_COMPL_FLAGS
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
  1070
				cid = compl_new_category (COMPL_FLAGS_SORT);
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
  1071
#else
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1072
				cid = compl_new_category ();
142
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
  1073
#endif
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1074
				if (cid) {
112
15f4c09ffb86 Hopefully fix size issues on 64-bit architectures
Myhailo Danylenko <isbear@ukrpost.net>
parents: 110
diff changeset
  1075
					lua_added_categories = g_slist_prepend (lua_added_categories, (gpointer) ((gsize) cid));
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1076
					lua_pushnil (L);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1077
					while (lua_next (L, 4)) {
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1078
						char *word = to_utf8 (luaL_checkstring (L, -1));
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1079
						compl_add_category_word (cid, word);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1080
						lua_pop (L, 1);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1081
						g_free (word);
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1082
					}
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1083
				}
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1084
			} else
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1085
				cid = luaL_checkenum (L, 4, lua_completion_type);
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1086
		}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1087
	}
113
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
  1088
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1089
	cb = lua_newuserdata (L, sizeof (lua_command_t));
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1090
	luaL_getmetatable (L, "mcabber.command");
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1091
	lua_setmetatable (L, -2);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1092
	lua_pushvalue (L, 2);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1093
	cb -> cbref      = luaL_ref (L, LUA_REGISTRYINDEX);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1094
	lua_pushvalue (L, -1);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1095
	cb -> selfref    = luaL_ref (L, LUA_REGISTRYINDEX);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1096
	cb -> parse_args = parse;
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1097
	cb -> L          = L;
113
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
  1098
#ifdef MCABBER_API_HAVE_CMD_ID
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1099
	cb -> cmid       = cmd_add (name, "", cid, 0, (void (*) (char *p)) lua_main_command_handler, cb);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1100
#else
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1101
	lua_pushvalue (L, 1);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1102
	cb -> nameref    = luaL_ref (L, LUA_REGISTRYINDEX);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1103
	cmd_add (name, "", cid, 0, (void (*) (char *p)) lua_main_command_handler, cb);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1104
#endif
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1105
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1106
	return 1;
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1107
}
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1108
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1109
static void lua_mcabber_unregister_command (lua_State *L, lua_command_t *cb)
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1110
{
113
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
  1111
#ifdef MCABBER_API_HAVE_CMD_ID
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1112
	if (cb -> cmid)
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1113
		cmd_del (cb -> cmid);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1114
#else
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1115
	const char *name;
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1116
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1117
	if (cb -> nameref == LUA_NOREF)
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1118
		return;
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1119
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1120
	lua_rawgeti (L, LUA_REGISTRYINDEX, cb -> nameref);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1121
	name = lua_tostring (L, -1);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1122
	cmd_del (name);
110
bd9f24178d67 Prevent re-unregistering commands
Myhailo Danylenko <isbear@ukrpost.net>
parents: 109
diff changeset
  1123
	luaL_unref (L, LUA_REGISTRYINDEX, cb -> nameref);
bd9f24178d67 Prevent re-unregistering commands
Myhailo Danylenko <isbear@ukrpost.net>
parents: 109
diff changeset
  1124
	cb -> nameref = LUA_NOREF;
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1125
	lua_pop (L, 1);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1126
#endif
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1127
}
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1128
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1129
/// command:del
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1130
/// Unregisters given command from mcabber. Object will be destroyed later.
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1131
static int lua_mcabber_command_del (lua_State *L)
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1132
{
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1133
	lua_command_t *cb = luaL_checkudata (L, 1, "mcabber.command");
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1134
	luaL_argcheck (L, cb != NULL, 1, "mcabber command object expected");
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1135
	lua_mcabber_unregister_command (L, cb);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1136
	if (cb -> selfref != LUA_NOREF) {
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1137
		luaL_unref (L, LUA_REGISTRYINDEX, cb -> selfref);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1138
		cb -> selfref = LUA_NOREF;
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1139
	}
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1140
	return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1141
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1142
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1143
static int lua_mcabber_command_gc (lua_State *L)
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1144
{
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1145
	lua_command_t *cb = luaL_checkudata (L, 1, "mcabber.command");
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1146
	luaL_argcheck (L, cb != NULL, 1, "mcabber command object expected");
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1147
	lua_mcabber_unregister_command (L, cb);
113
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
  1148
#ifndef MCABBER_API_HAVE_CMD_ID
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1149
	if (cb -> nameref != LUA_NOREF)
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1150
		luaL_unref (L, LUA_REGISTRYINDEX, cb -> nameref);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1151
#endif
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1152
	if (cb -> cbref != LUA_NOREF)
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1153
		luaL_unref (L, LUA_REGISTRYINDEX, cb -> cbref);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1154
	return 0;
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1155
}
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1156
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1157
static const luaL_Reg lua_mcabber_command_reg_m[] = {
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1158
	{ "del",  lua_mcabber_command_del },
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1159
	{ "__gc", lua_mcabber_command_gc  },
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1160
	{ NULL,   NULL                 },
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1161
};
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1162
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1163
static void lua_command_init (lua_State *L)
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1164
{
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1165
	luaL_newmetatable (L, "mcabber.command");
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1166
	lua_pushvalue (L, -1);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1167
	lua_setfield (L, -2, "__index");
143
4232a5da1af2 Support lua 5.2
Myhailo Danylenko <isbear@ukrpost.net>
parents: 142
diff changeset
  1168
	luaL_setfuncs (L, lua_mcabber_command_reg_m, 0);
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1169
	lua_pop (L, 1);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1170
}
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1171
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1172
// TIMER
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1173
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1174
typedef struct {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1175
	int        reference;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1176
	guint      source;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1177
	lua_State *L;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1178
} lua_timer_callback_t;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1179
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1180
static GSList *lua_timers = NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1181
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1182
static void lua_timer_callback_destroy (lua_timer_callback_t *cb)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1183
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1184
	luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference);
112
15f4c09ffb86 Hopefully fix size issues on 64-bit architectures
Myhailo Danylenko <isbear@ukrpost.net>
parents: 110
diff changeset
  1185
	lua_timers = g_slist_remove (lua_timers, (gpointer) ((gsize) cb->source));
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1186
	luaL_free (cb->L, cb);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1187
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1188
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1189
/// timer function
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1190
/// Function, that will be called periodically until it returns false.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1191
/// R: boolean
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1192
static gboolean lua_timer_callback (lua_timer_callback_t *cb)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1193
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1194
	int ret;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1195
	lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1196
	if (lua_pcall (cb->L, 0, 1, 0)) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1197
		scr_log_print (LPRINT_LOGNORM, "lua: Timer callback execution error: %s", lua_tostring (cb->L, -1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1198
		lua_pop (cb->L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1199
		return FALSE;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1200
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1201
	ret = lua_toboolean (cb->L, -1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1202
	lua_pop (cb->L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1203
	return ret;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1204
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1205
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1206
/// main.timer
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1207
/// Creates new timer function, that will be called periodically.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1208
/// A: integer (interval, seconds), timer function
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1209
static int lua_main_timer (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1210
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1211
	int                   interval = luaL_checkint (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1212
	guint                 source;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1213
	lua_timer_callback_t *cb;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1214
	luaL_argcheck (L, lua_isfunction (L, 2), 2, "function expected");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1215
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1216
	cb = luaL_malloc (L, sizeof (lua_timer_callback_t));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1217
	cb->reference = luaL_ref (L, LUA_REGISTRYINDEX);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1218
	cb->L         = L;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1219
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1220
	source = g_timeout_add_seconds_full (MLUA_SOURCE_PRIORITY, interval, (GSourceFunc) lua_timer_callback, cb, (GDestroyNotify) lua_timer_callback_destroy);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1221
	cb->source = source;
112
15f4c09ffb86 Hopefully fix size issues on 64-bit architectures
Myhailo Danylenko <isbear@ukrpost.net>
parents: 110
diff changeset
  1222
	lua_timers = g_slist_prepend (lua_timers, (gpointer) ((gsize) source));
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1223
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1224
	return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1225
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1226
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1227
// BACKGROUND PIPE READING
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1228
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1229
typedef struct {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1230
	lua_State *L;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1231
	guint      source;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1232
	FILE      *fd;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1233
	int        reference;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1234
} lua_bgread_callback_t;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1235
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1236
static GSList *lua_bgreads = NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1237
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1238
static gchar lua_bgread_buffer[MLUA_BGREAD_BUFFER];
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1239
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1240
static void lua_bgread_callback_destroy (lua_bgread_callback_t *cb)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1241
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1242
	luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1243
	pclose (cb->fd); // Not necessary?
112
15f4c09ffb86 Hopefully fix size issues on 64-bit architectures
Myhailo Danylenko <isbear@ukrpost.net>
parents: 110
diff changeset
  1244
	lua_bgreads = g_slist_remove (lua_bgreads, (gpointer) ((gsize) cb->source));
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1245
	luaL_free (cb->L, cb);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1246
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1247
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1248
/// background reading function
125
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 123
diff changeset
  1249
/// Function, that processes output from pipe in asynchronous way.
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1250
/// A: string (data) or nil (eof)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1251
/// R: boolean (false if reading should be terminated)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1252
static gboolean lua_bgread_callback (GIOChannel *source, GIOCondition condition, lua_bgread_callback_t *cb)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1253
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1254
	int ret = TRUE;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1255
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1256
	if (condition | G_IO_IN) { // data
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1257
		while (TRUE) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1258
			gsize read = 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1259
			g_io_channel_read_chars (source, lua_bgread_buffer, MLUA_BGREAD_BUFFER, &read, NULL);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1260
			if (!read) // exhausted
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1261
				break;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1262
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1263
			lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1264
			lua_pushlstring (cb->L, lua_bgread_buffer, read);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1265
			if (lua_pcall (cb->L, 1, 1, 0)) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1266
				scr_log_print (LPRINT_LOGNORM, "lua: Bgread callback execution error: %s", lua_tostring (cb->L, -1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1267
				lua_pop (cb->L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1268
				return FALSE;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1269
			}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1270
			ret = lua_toboolean (cb->L, -1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1271
			lua_pop (cb->L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1272
			if (!ret) // enough
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1273
				return FALSE;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1274
		}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1275
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1276
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1277
	if (condition & ~G_IO_IN) { // err or hup
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1278
		lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1279
		lua_pushnil (cb->L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1280
		if (lua_pcall (cb->L, 1, 1, 0)) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1281
			scr_log_print (LPRINT_LOGNORM, "lua: Bgread callback execution error: %s", lua_tostring (cb->L, -1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1282
			lua_pop (cb->L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1283
			return FALSE;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1284
		}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1285
		ret = lua_toboolean (cb->L, -1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1286
		lua_pop (cb->L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1287
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1288
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1289
	return ret;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1290
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1291
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1292
/// main.bgread
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1293
/// Runs specified command and passes its output to a given function.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1294
/// A: string (command), background reading function
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1295
static int lua_main_bgread (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1296
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1297
	const char            *command = luaL_checkstring (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1298
	lua_bgread_callback_t *cb;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1299
	FILE                  *fd;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1300
	GIOChannel            *channel;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1301
	const char            *charset = NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1302
	guint                  source;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1303
	luaL_argcheck (L, lua_isfunction (L, 2), 2, "function expected");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1304
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1305
	fd = popen (command, "r");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1306
	if (!fd) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1307
		lua_pushstring (L, "Error opening pipe");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1308
		lua_error (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1309
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1310
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1311
	channel = g_io_channel_unix_new (fileno (fd));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1312
	// We, most likely, need this,
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1313
	// But we cannot use this,
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1314
	// It will block.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1315
	//if (!g_get_charset (&charset))
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1316
	g_io_channel_set_encoding (channel, charset, NULL);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1317
	g_io_channel_set_buffered (channel, FALSE);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1318
	g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, NULL);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1319
	g_io_channel_set_close_on_unref (channel, TRUE);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1320
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1321
	cb = luaL_malloc (L, sizeof (lua_bgread_callback_t));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1322
	cb->reference = luaL_ref (L, LUA_REGISTRYINDEX);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1323
	cb->L         = L;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1324
	cb->fd        = fd;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1325
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1326
	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);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1327
	cb->source = source;
112
15f4c09ffb86 Hopefully fix size issues on 64-bit architectures
Myhailo Danylenko <isbear@ukrpost.net>
parents: 110
diff changeset
  1328
	lua_bgreads = g_slist_prepend (lua_bgreads, (gpointer) ((gsize) source));
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1329
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1330
	// unref?
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1331
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1332
	return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1333
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1334
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1335
// HOOK HANDLING
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1336
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1337
typedef struct {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1338
	lua_State *L;       // lua environment for handler use
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1339
	int        nameref; // reference to hook name string
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1340
	int        cbref;   // reference to hook handler function
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1341
	int        selfref; // self-reference to object
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1342
	guint      hid;     // hook id for object destruction
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1343
} lua_hook_t;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1344
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1345
/// hook handler result
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1346
/// What to do with hook processing afterwards
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1347
/// G:
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1348
static const string2enum_t lua_hook_handler_result[] = {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1349
	{ "proceed", HOOK_HANDLER_RESULT_ALLOW_MORE_HANDLERS       },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1350
	{ "stop",    HOOK_HANDLER_RESULT_NO_MORE_HANDLER           },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1351
	{ "drop",    HOOK_HANDLER_RESULT_NO_MORE_HANDLER_DROP_DATA },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1352
	{ NULL,      HOOK_HANDLER_RESULT_ALLOW_MORE_HANDLERS       },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1353
};
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1354
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1355
/// hook handler priority
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1356
/// Feel free to specify just a number instead of some preset value.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1357
/// G:
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1358
static const string2enum_t lua_hook_handler_priority[] = {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1359
	{ "high",      G_PRIORITY_HIGH         },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1360
	{ "default",   G_PRIORITY_DEFAULT      },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1361
	{ "idle-high", G_PRIORITY_HIGH_IDLE    },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1362
	{ "idle",      G_PRIORITY_DEFAULT_IDLE },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1363
	{ "low",       G_PRIORITY_LOW          },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1364
	{ NULL,        G_PRIORITY_DEFAULT      },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1365
};
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1366
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1367
/// hook function
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1368
/// Function to be called, when hook will be processsed.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1369
/// XXX: we can provide object as argument, but is this necessary?
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1370
/// A: table (arguments hash)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1371
/// R: hook handler result
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1372
static guint lua_hook_cb (const gchar *hookid, hk_arg_t *args, gpointer data)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1373
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1374
	lua_hook_t *cb  = data;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1375
	hk_arg_t   *arg = args;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1376
	guint       ret = HOOK_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1377
	lua_State  *L   = cb -> L;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1378
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1379
	if (cb -> cbref == LUA_NOREF)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1380
		return HOOK_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1381
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1382
	lua_rawgeti (L, LUA_REGISTRYINDEX, cb -> cbref);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1383
	if (!lua_isfunction (L, -1)) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1384
		lua_pop (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1385
		return HOOK_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1386
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1387
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1388
	lua_newtable (L);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1389
	lua_pushliteral (L, "hook");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1390
	lua_pushstring  (L, hookid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1391
	lua_settable (L, -3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1392
	while (arg->name != NULL) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1393
		char *name  = from_utf8 (arg->name);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1394
		char *value = from_utf8 (arg->value);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1395
		lua_pushstring (L, name);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1396
		lua_pushstring (L, value);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1397
		lua_settable (L, -3);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1398
		g_free (name);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1399
		g_free (value);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1400
		arg++;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1401
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1402
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1403
	if (lua_pcall (L, 1, 1, 0)) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1404
		scr_log_print (LPRINT_NORMAL, "lua: Error in hook handler: %s", lua_tostring (L, -1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1405
		lua_pop (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1406
	} else {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1407
		switch (lua_type (L, -1)) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1408
		case LUA_TSTRING:
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1409
		case LUA_TNUMBER:
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1410
			ret = luaL_checkenum (L, -1, lua_hook_handler_result);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1411
			break;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1412
		default:
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1413
			ret = HOOK_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1414
			break;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1415
		}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1416
		lua_pop (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1417
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1418
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1419
	return ret;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1420
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1421
137
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1422
/// main.hook_run
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1423
/// Runs handlers for given hook with supplied arguments.
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1424
/// A: string (hook name), table (hook arguments)
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1425
/// R: return enum field (hook handler result)
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1426
static int lua_main_hook_run ( lua_State *L )
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1427
{
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1428
	const char * hook_name = luaL_checkstring ( L, 1 );
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1429
	int          num       = 1;
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1430
	hk_arg_t *   args;
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1431
	guint        ret;
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1432
	lua_settop ( L, 2 );                            // 1 name, 2 args_in
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1433
	luaL_argcheck ( L, lua_type ( L, 2 ) == LUA_TTABLE, 2, "table with hook arguments expected" );
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1434
	// count fields, build temporary stringified table
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1435
	lua_newtable ( L );                             // 3 args
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1436
	lua_pushnil ( L );                              // 4 key
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1437
	while ( lua_next ( L, 2 ) != 0 ) {              // 5 value
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1438
		int ktype = lua_type ( L, 4 );
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1439
		if ( ktype == LUA_TSTRING || ktype == LUA_TNUMBER ) {
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1440
			int vtype = lua_type ( L, 5 );
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1441
			if ( vtype == LUA_TSTRING || vtype == LUA_TNUMBER ) {
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1442
				lua_pushvalue ( L, 4 ); // 6 key copy
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1443
				lua_pushvalue ( L, 5 ); // 7 value copy
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1444
				lua_tostring ( L, 6 );
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1445
				lua_tostring ( L, 7 );
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1446
				lua_settable ( L, 3 );  // 5 value
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1447
				num ++;
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1448
			}
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1449
		}
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1450
		lua_pop ( L, 1 );                       // 4 key
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1451
	}
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1452
	// alloc args, populate from temporary table
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1453
	args = luaL_malloc ( L, num * sizeof ( hk_arg_t ) );
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1454
	num  = 0;
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1455
	lua_pushnil ( L );                              // 4 key
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1456
	while ( lua_next ( L, 3 ) != 0 ) {              // 5 value
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1457
		( args + num ) -> name  = lua_tostring ( L, 4 );
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1458
		( args + num ) -> value = lua_tostring ( L, 5 );
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1459
		num ++;
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1460
		lua_pop ( L, 1 );                       // 4 key
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1461
	}
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1462
	( args + num ) -> name  = NULL;
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1463
	( args + num ) -> value = NULL;
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1464
	// run hook
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1465
	ret = hk_run_handlers ( hook_name, args );
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1466
	luaL_free ( L, args );
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1467
	luaL_pushenum ( L, ret, lua_hook_handler_result );
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1468
	return 1;
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1469
}
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1470
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1471
/// main.hook
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1472
/// Installs hook handler, returns an object, that you need to keep until
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1473
/// hook handling is no more needed.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1474
/// A: string (hook name), hook function, integer (priority, optional)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1475
/// R: userdata (hook object)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1476
static int lua_main_hook (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1477
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1478
	const char   *hook_name = luaL_checkstring (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1479
	int           priority  = G_PRIORITY_DEFAULT;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1480
	lua_hook_t   *cb;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1481
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1482
	luaL_argcheck (L, lua_isfunction (L, 2), 2, "function expected");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1483
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1484
	if (lua_gettop (L) > 2)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1485
		priority = luaL_checkenum (L, 3, lua_hook_handler_priority);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1486
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1487
	cb = lua_newuserdata (L, sizeof (lua_hook_t));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1488
	luaL_getmetatable (L, "mcabber.hook");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1489
	lua_setmetatable (L, -2);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1490
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1491
	lua_pushvalue (L, -1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1492
	cb -> selfref = luaL_ref (L, LUA_REGISTRYINDEX);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1493
	lua_pushvalue (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1494
	cb -> nameref = luaL_ref (L, LUA_REGISTRYINDEX);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1495
	lua_pushvalue (L, 2);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1496
	cb -> cbref   = luaL_ref (L, LUA_REGISTRYINDEX);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1497
	cb -> L       = L;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1498
	cb -> hid     = hk_add_handler (lua_hook_cb, hook_name, priority, cb);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1499
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1500
	return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1501
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1502
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1503
static void lua_mcabber_unregister_hook (lua_State *L, lua_hook_t *cb)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1504
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1505
	const char *name;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1506
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1507
	if (!cb -> hid || cb -> nameref == LUA_NOREF)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1508
		return;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1509
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1510
	lua_rawgeti (L, LUA_REGISTRYINDEX, cb -> nameref);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1511
	name = lua_tostring (L, -1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1512
	if (name) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1513
		hk_del_handler (name, cb -> hid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1514
		cb -> hid = 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1515
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1516
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1517
	lua_pop (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1518
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1519
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1520
/// hook:del
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1521
/// Unregisters given hook handler from mcabber. Object will be destroyed later.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1522
static int lua_mcabber_hook_del (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1523
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1524
	lua_hook_t *cb = luaL_checkudata (L, 1, "mcabber.hook");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1525
	luaL_argcheck (L, cb != NULL, 1, "mcabber hook object expected");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1526
	lua_mcabber_unregister_hook (L, cb);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1527
	if (cb -> selfref != LUA_NOREF) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1528
		luaL_unref (L, LUA_REGISTRYINDEX, cb -> selfref);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1529
		cb -> selfref = LUA_NOREF;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1530
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1531
	return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1532
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1533
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1534
static int lua_mcabber_hook_gc (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1535
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1536
	lua_hook_t *cb = luaL_checkudata (L, 1, "mcabber.hook");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1537
	luaL_argcheck (L, cb != NULL, 1, "mcabber hook object expected");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1538
	lua_mcabber_unregister_hook (L, cb);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1539
	if (cb -> nameref != LUA_NOREF)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1540
		luaL_unref (L, LUA_REGISTRYINDEX, cb -> nameref);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1541
	if (cb -> cbref != LUA_NOREF)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1542
		luaL_unref (L, LUA_REGISTRYINDEX, cb -> cbref);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1543
	return 0;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1544
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1545
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1546
static const luaL_Reg lua_mcabber_hook_reg_m[] = {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1547
	{ "del",  lua_mcabber_hook_del },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1548
	{ "__gc", lua_mcabber_hook_gc  },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1549
	{ NULL,   NULL                 },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1550
};
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1551
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1552
static void lua_hook_init (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1553
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1554
	luaL_newmetatable (L, "mcabber.hook");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1555
	lua_pushvalue (L, -1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1556
	lua_setfield (L, -2, "__index");
143
4232a5da1af2 Support lua 5.2
Myhailo Danylenko <isbear@ukrpost.net>
parents: 142
diff changeset
  1557
	luaL_setfuncs (L, lua_mcabber_hook_reg_m, 0);
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1558
	lua_pop (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1559
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1560
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1561
// OPTION GUARDS
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1562
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1563
#define MLUA_GUARD_REGISTRY "mcabber_guards"
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1564
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1565
/// guard function
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1566
/// Function to be called, when option changes it's value.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1567
/// Old option value is still accessible through main.option.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1568
/// A: string (key), string (new value)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1569
/// R: string (value to save in hash table)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1570
static gchar *lua_guard_cb (const gchar *key, const gchar *value)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1571
{
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1572
	lua_State *L = lua; // FIXME
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1573
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1574
	lua_getfield ( L, LUA_REGISTRYINDEX, MLUA_GUARD_REGISTRY ); // +1
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1575
	lua_getfield ( L, -1, key );                                // +2
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1576
	if ( ! lua_isfunction ( L, -1 ) ) {
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1577
		lua_pop ( L, 2 );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1578
		return g_strdup ( value );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1579
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1580
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1581
	lua_pushstring ( L, key );                                  // +3
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1582
	lua_pushstring ( L, value );                                // +4
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1583
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1584
	if ( lua_pcall ( L, 2, 1, 0 ) ) {                           // +2
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1585
		scr_log_print ( LPRINT_NORMAL, "lua: Error in hook handler: %s", lua_tostring ( L, -1 ) );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1586
		lua_pop ( L, 2 );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1587
		return g_strdup ( value );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1588
	} else {
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1589
		gchar *result = g_strdup ( lua_tostring ( L, -1 ) );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1590
		lua_pop ( L, 2 );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1591
		return result;
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1592
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1593
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1594
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1595
/// main.add_guard
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1596
/// Installs option guard for given option.
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1597
/// A: string ( option name ), guard function
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1598
/// R: boolean ( success )
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1599
static int lua_main_add_guard ( lua_State *L )
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1600
{
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1601
	const char *name = luaL_checkstring ( L, 1 );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1602
	luaL_argcheck ( L, lua_isfunction (L, 2), 2, "function expected" );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1603
	lua_settop ( L, 2 );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1604
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1605
	if ( settings_set_guard ( name, lua_guard_cb ) ) {
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1606
		lua_getfield ( L, LUA_REGISTRYINDEX, MLUA_GUARD_REGISTRY );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1607
		lua_pushvalue ( L, 2 );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1608
		lua_setfield ( L, 3, name );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1609
		lua_pushboolean ( L, 1 );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1610
	} else
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1611
		lua_pushboolean ( L, 0 );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1612
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1613
	return 1;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1614
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1615
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1616
/// main.del_guard
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1617
/// Removes option guard from given option.
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1618
/// By default, lua will refuse to remove guards, not installed
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1619
/// by lua. Still, you can force guard removal.
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1620
/// A: string ( option name ), boolean ( force removal )
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1621
/// R: boolean ( success )
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1622
static int lua_main_del_guard ( lua_State *L )
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1623
{
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1624
	const char *name = luaL_checkstring ( L, 1 );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1625
	lua_settop ( L, 2 );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1626
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1627
	lua_getfield ( L, LUA_REGISTRYINDEX, MLUA_GUARD_REGISTRY );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1628
	lua_getfield ( L, 3, name );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1629
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1630
	if ( ! lua_isnil ( L, 4 ) || lua_toboolean ( L, 2 ) ) {
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1631
		settings_del_guard ( name );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1632
		lua_pushnil ( L );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1633
		lua_setfield ( L, 3, name );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1634
		lua_pushboolean ( L, 1 );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1635
	} else
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1636
		lua_pushboolean ( L, 0 );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1637
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1638
	return 1;
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1639
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1640
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1641
static void lua_guard_init (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1642
{
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1643
	lua_createtable ( L, 0, 0 );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1644
	lua_setfield ( L, LUA_REGISTRYINDEX, MLUA_GUARD_REGISTRY );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1645
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1646
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1647
static void lua_guard_uninit (lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1648
{
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1649
	lua_getfield ( L, LUA_REGISTRYINDEX, MLUA_GUARD_REGISTRY );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1650
	lua_pushnil ( L );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1651
	while ( lua_next ( L, -2 ) ) {
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1652
		const char *key = lua_tostring ( L, -2 );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1653
		settings_del_guard ( key );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1654
		lua_pop ( L, 1 );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1655
	}
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1656
	lua_pop ( L, 1 );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1657
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1658
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1659
// MAIN INITIALIZATION CODE
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1660
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1661
#ifdef LLM_LOG_HANDLER
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1662
// FIXME: this should not be here
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1663
guint lua_lm_log_handler_id;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1664
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1665
void lua_lm_log_handler (const gchar *domain, GLogLevelFlags log_level, const gchar *message, gpointer ignore)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1666
{
121
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
  1667
	if (settings_opt_get_int (OPT_MLUA_LM_DEBUG))
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1668
		scr_log_print (LPRINT_LOGNORM, "%s: %s", domain, message);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1669
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1670
#endif
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1671
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1672
static void do_lua(char *arg, lua_State *L)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1673
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1674
	if (luaL_loadbuffer (L, arg, strlen (arg), "line")) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1675
		scr_log_print (LPRINT_LOGNORM, "lua: Compilation error: %s", lua_tostring (L, -1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1676
		lua_pop (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1677
		return;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1678
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1679
 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1680
	if (lua_pcall (L, 0, 0, 0)) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1681
		scr_log_print (LPRINT_NORMAL, "lua: Runtime error: %s", lua_tostring(L, -1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1682
		lua_pop (L, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1683
		return;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1684
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1685
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1686
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1687
static void *lua_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1688
	if (nsize == 0) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1689
		g_free (ptr);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1690
		return NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1691
	} else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1692
		return g_realloc (ptr, nsize);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1693
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1694
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1695
#define reg(NAME)                   \
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1696
	{ #NAME, lua_main_##NAME },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1697
static const luaL_Reg lua_reg_main[] = {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1698
	reg ( yesno          ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1699
#ifdef LLM_CONNECTION_ENABLE
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1700
	reg ( connection     ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1701
#endif
107
1ed8491ae1b4 Add main.version ()
Myhailo Danylenko <isbear@ukrpost.net>
parents: 105
diff changeset
  1702
	reg ( version        )
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1703
	reg ( log            ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1704
	reg ( option         ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1705
	reg ( alias          ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1706
	reg ( binding        ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1707
	reg ( fileoption     ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1708
	reg ( add_feature    ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1709
	reg ( del_feature    ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1710
	reg ( event          )
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1711
	reg ( parse_args     ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1712
	reg ( add_category   ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1713
	reg ( del_category   ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1714
	reg ( add_completion ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1715
	reg ( del_completion ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1716
	reg ( command        ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1717
	reg ( print_info     ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1718
	reg ( beep           ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1719
	reg ( run            ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1720
	reg ( status         ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1721
	reg ( roster         ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1722
	reg ( current_buddy  ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1723
	reg ( full_jid       ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1724
	reg ( buddy_info     ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1725
	reg ( timer          ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1726
	reg ( alias          ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1727
	reg ( binding        ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1728
	reg ( fileoption     ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1729
	reg ( add_feature    ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1730
	reg ( del_feature    ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1731
	reg ( event          )
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1732
	reg ( parse_args     ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1733
	reg ( add_category   ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1734
	reg ( del_category   ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1735
	reg ( add_completion ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1736
	reg ( del_completion ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1737
	reg ( command        ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1738
	reg ( print_info     ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1739
	reg ( beep           ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1740
	reg ( run            ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1741
	reg ( status         ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1742
	reg ( roster         ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1743
	reg ( current_buddy  ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1744
	reg ( full_jid       ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1745
	reg ( buddy_info     ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1746
	reg ( timer          ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1747
	reg ( bgread         ) 
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1748
	reg ( hook           )
137
4fda19d05965 Add main.hook_run
Myhailo Danylenko <isbear@ukrpost.net>
parents: 135
diff changeset
  1749
	reg ( hook_run       )
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1750
	reg ( add_guard      )
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1751
	reg ( del_guard      )
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1752
	{ NULL, NULL },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1753
};
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1754
#undef reg
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1755
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1756
const gchar *g_module_check_init (GModule *module)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1757
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1758
	lua = lua_newstate (lua_alloc, NULL);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1759
	if (!lua)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1760
		return "Lua initialization error";
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1761
	else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1762
		return NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1763
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1764
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1765
void g_module_unload (GModule *module)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1766
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1767
	if (lua) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1768
		lua_close (lua);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1769
		lua = NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1770
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1771
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1772
115
47bed161e3b0 Add AVV description file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 113
diff changeset
  1773
void mlua_init (void)
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1774
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1775
	luaL_openlibs (lua);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1776
143
4232a5da1af2 Support lua 5.2
Myhailo Danylenko <isbear@ukrpost.net>
parents: 142
diff changeset
  1777
	lua_newtable(lua);
4232a5da1af2 Support lua 5.2
Myhailo Danylenko <isbear@ukrpost.net>
parents: 142
diff changeset
  1778
	luaL_setfuncs (lua, lua_reg_main, 0);
4232a5da1af2 Support lua 5.2
Myhailo Danylenko <isbear@ukrpost.net>
parents: 142
diff changeset
  1779
	lua_setglobal (lua, "main");
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1780
	lua_register (lua, "dopath", lua_global_dopath);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1781
	lua_register (lua, "print",  lua_global_print );
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1782
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1783
	{
142
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
  1784
#ifdef MCABBER_API_HAVE_COMPL_FLAGS
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
  1785
		int cid = compl_new_category (COMPL_FLAGS_PREPEND);
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
  1786
#else
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1787
		int cid = compl_new_category ();
142
7e8f523b66af Add completion sorting.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 137
diff changeset
  1788
#endif
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1789
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1790
		if (cid) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1791
			const string2enum_t *word = lua_yesno;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1792
			lua_completion_type[MLUA_YESNO_POS].value = cid;
112
15f4c09ffb86 Hopefully fix size issues on 64-bit architectures
Myhailo Danylenko <isbear@ukrpost.net>
parents: 110
diff changeset
  1793
			lua_added_categories = g_slist_prepend (lua_added_categories, (gpointer) ((gsize) cid));
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1794
			while (word->string) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1795
				compl_add_category_word (cid, word->string);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1796
				++word;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1797
			}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1798
		}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1799
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1800
113
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
  1801
#ifdef MCABBER_API_HAVE_CMD_ID
144
690b5524b895 v0.0.3 Module and command names include lua version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 143
diff changeset
  1802
	lua_cmdid = cmd_add (MLUA_COMMAND_NAME, "Evaluate lua string", 0, 0, (void (*) (char *p)) do_lua, lua);
113
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
  1803
#else
144
690b5524b895 v0.0.3 Module and command names include lua version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 143
diff changeset
  1804
	cmd_add (MLUA_COMMAND_NAME, "Evaluate lua string", 0, 0, (void (*) (char *p)) do_lua, lua);
690b5524b895 v0.0.3 Module and command names include lua version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 143
diff changeset
  1805
#endif
690b5524b895 v0.0.3 Module and command names include lua version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 143
diff changeset
  1806
690b5524b895 v0.0.3 Module and command names include lua version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 143
diff changeset
  1807
#ifdef ENABLE_LUA_ALIAS
690b5524b895 v0.0.3 Module and command names include lua version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 143
diff changeset
  1808
	settings_set(SETTINGS_TYPE_ALIAS, "lua", MLUA_COMMAND_NAME);
113
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
  1809
#endif
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1810
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1811
#ifdef LLM_LOG_HANDLER
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1812
	// FIXME: this should not be here.
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1813
	lua_lm_log_handler_id = g_log_set_handler ("lua-lm", G_LOG_LEVEL_MASK, (GLogFunc) lua_lm_log_handler, NULL);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1814
#endif
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1815
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1816
	lua_hook_init    (lua);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1817
	lua_command_init (lua);
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1818
	lua_guard_init   (lua);
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1819
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1820
	{
121
75a7d595817c Put help into separate files
Myhailo Danylenko <isbear@ukrpost.net>
parents: 120
diff changeset
  1821
		char *initfile = expand_filename (settings_opt_get (OPT_MLUA_RC));
113
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
  1822
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1823
		if (!initfile)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1824
			scr_log_print (LPRINT_LOGNORM, "lua: Cannot determine config file name");
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1825
		else {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1826
			if (luaL_loadfile(lua, initfile)) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1827
				scr_log_print (LPRINT_LOGNORM, "lua: Unable to compile rc file: %s", lua_tostring (lua, -1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1828
				lua_pop (lua, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1829
			} else if (lua_pcall (lua, 0, LUA_MULTRET, 0)) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1830
				scr_log_print (LPRINT_LOGNORM, "lua: Runtime error in rc file: %s", lua_tostring(lua, -1));
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1831
				lua_pop (lua, 1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1832
			} else
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1833
				scr_log_print (LPRINT_LOGNORM, "lua: Loaded %s", initfile);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1834
			g_free (initfile);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1835
		}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1836
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1837
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1838
	{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1839
		hk_arg_t args[] = {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1840
			{ NULL, NULL },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1841
		};
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1842
		hk_run_handlers("hook-lua-start", args);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1843
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1844
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1845
123
6b753fbacd4c Do not use g_slist_free_full (for now)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 122
diff changeset
  1846
static void lua_events_destroy ( gpointer data, gpointer udata )
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1847
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1848
	lua_event_callback_t *cb = data;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1849
	const char *evid;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1850
	if (cb->evid == LUA_NOREF)
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1851
		return;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1852
	lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->evid);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1853
	evid = lua_tostring (cb ->L, -1);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1854
	evs_callback (evid, EVS_CONTEXT_CANCEL, "Module unloading");
123
6b753fbacd4c Do not use g_slist_free_full (for now)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 122
diff changeset
  1855
	evs_del (evid);
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1856
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1857
123
6b753fbacd4c Do not use g_slist_free_full (for now)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 122
diff changeset
  1858
static void lua_bgreads_destroy ( gpointer data, gpointer udata )
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1859
{
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1860
	g_source_remove ( ( gulong ) data );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1861
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1862
123
6b753fbacd4c Do not use g_slist_free_full (for now)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 122
diff changeset
  1863
static void lua_timers_destroy ( gpointer data, gpointer udata )
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1864
{
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1865
	g_source_remove ( ( gulong ) data );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1866
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1867
123
6b753fbacd4c Do not use g_slist_free_full (for now)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 122
diff changeset
  1868
static void lua_features_destroy ( gpointer data, gpointer udata )
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1869
{
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1870
	gchar *xmlns = data;
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1871
	xmpp_del_feature (xmlns);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1872
	g_free (xmlns);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1873
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1874
123
6b753fbacd4c Do not use g_slist_free_full (for now)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 122
diff changeset
  1875
static void lua_categories_destroy ( gpointer data, gpointer udata )
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1876
{
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1877
	compl_del_category ( ( gulong ) data );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1878
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1879
115
47bed161e3b0 Add AVV description file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 113
diff changeset
  1880
void mlua_uninit (void)
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1881
{
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1882
	if (lua) {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1883
		hk_arg_t args[] = {
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1884
			{ NULL, NULL },
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1885
		};
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1886
		hk_run_handlers ("hook-lua-quit", args);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1887
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1888
		// hook handlers and commands will be unregistered upon objects destruction
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1889
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1890
		lua_guard_uninit ( lua );
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1891
123
6b753fbacd4c Do not use g_slist_free_full (for now)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 122
diff changeset
  1892
		g_slist_foreach ( lua_bgreads, lua_bgreads_destroy, NULL );
6b753fbacd4c Do not use g_slist_free_full (for now)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 122
diff changeset
  1893
		g_slist_free ( lua_bgreads );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1894
		lua_bgreads = NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1895
123
6b753fbacd4c Do not use g_slist_free_full (for now)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 122
diff changeset
  1896
		g_slist_foreach ( lua_timers, lua_timers_destroy, NULL );
6b753fbacd4c Do not use g_slist_free_full (for now)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 122
diff changeset
  1897
		g_slist_free ( lua_timers );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1898
		lua_timers = NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1899
123
6b753fbacd4c Do not use g_slist_free_full (for now)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 122
diff changeset
  1900
		g_slist_foreach ( lua_events, lua_events_destroy, NULL );
6b753fbacd4c Do not use g_slist_free_full (for now)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 122
diff changeset
  1901
		g_slist_free ( lua_events );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1902
		lua_events = NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1903
113
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
  1904
#ifdef MCABBER_API_HAVE_CMD_ID
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
  1905
		cmd_del (lua_cmdid);
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
  1906
		lua_cmdid = NULL;
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
  1907
#else
144
690b5524b895 v0.0.3 Module and command names include lua version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 143
diff changeset
  1908
		cmd_del (MLUA_COMMAND_NAME);
113
3d4f0415c8f8 Sync with new dev API
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
  1909
#endif
109
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1910
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1911
		lua_close (lua);
2d2111cb5109 Switch to object-based command handling
Myhailo Danylenko <isbear@ukrpost.net>
parents: 108
diff changeset
  1912
		lua = NULL;
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1913
123
6b753fbacd4c Do not use g_slist_free_full (for now)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 122
diff changeset
  1914
		g_slist_foreach ( lua_added_features, lua_features_destroy, NULL );
6b753fbacd4c Do not use g_slist_free_full (for now)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 122
diff changeset
  1915
		g_slist_free ( lua_added_features );
120
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1916
		lua_added_features = NULL;
1be9411caf31 Add guards
Myhailo Danylenko <isbear@ukrpost.net>
parents: 118
diff changeset
  1917
123
6b753fbacd4c Do not use g_slist_free_full (for now)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 122
diff changeset
  1918
		g_slist_foreach ( lua_added_categories, lua_categories_destroy, NULL );
6b753fbacd4c Do not use g_slist_free_full (for now)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 122
diff changeset
  1919
		g_slist_free ( lua_added_categories );
103
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1920
		lua_added_categories = NULL;
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1921
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1922
#ifdef LLM_LOG_HANDLER
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1923
		// FIXME: shouldn't be here
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1924
		g_log_remove_handler ("lua-lm", lua_lm_log_handler_id);
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1925
#endif
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1926
	}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1927
}
2cb96eae301a Move main.c to lua.c
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1928