main.c
author Myhailo Danylenko <isbear@ukrpost.net>
Sun, 15 Mar 2009 23:57:49 +0200
changeset 26 fc83934f9b8d
parent 24 25552b21d3fb
child 27 92b254b64360
permissions -rw-r--r--
Pubsub interface merged into one command
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
#include <glib.h>
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
#include <gmodule.h>
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
#include <lua.h>
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
#include <lauxlib.h>
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
#include <lualib.h>
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
     7
#include <stdio.h>
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
     8
#include <stdlib.h>    // getenv
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
     9
#include <string.h>    // strcmp
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
3
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
    11
#include "config.h"
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    12
#include "util.h"
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
    13
#include "logprint.h"    // scr_LogPrint
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
    14
#include "screen.h"      // scr_Beep, scr_WriteIncomingMessage
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
    15
#include "hbuf.h"        // HBB_PREFIX_INFO
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
    16
#include "commands.h"    // process_command, cmd_add, cmd_del
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
    17
#include "xmpp.h"        // xmpp_getstatus, xmpp_getstatusmsg, lconnection
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
    18
#include "xmpp_helper.h" // xmpp_add_feature, xmpp_del_feature
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
    19
#include "roster.h"      // imstatus2char, foreach_buddy, buddy_*, current_buddy, BUDDATA, ROSTER_TYPE_*
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
    20
#include "utils.h"       // from_utf8, jidtodisp
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
    21
#include "hooks.h"       // hk_add_handler, hk_del_handler
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
    22
#include "settings.h"    // settings_set, settings_del, settings_get
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
    23
#include "compl.h"       // compl_new_category, compl_add_category_word, compl_del_category_word
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    26
// global lua state object, necessary for uninitialization function
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    27
static lua_State *lua = NULL;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    29
// caller sould g_free result
18
ba74a9aadaf4 Fix namespace for config_file
Myhailo Danylenko <isbear@ukrpost.net>
parents: 17
diff changeset
    30
static char *mcabber_config_filename (const char *file)
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    31
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    32
	const char *home = getenv ("HOME");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    33
	if (!home)
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    34
		return NULL;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    35
	return g_strconcat (home, "/.mcabber/", file ? file : "", NULL);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    36
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    37
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    38
/// print
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    39
/// Prints its arguments to log with default priority.
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    40
/// A: string/number, ...
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
static int lua_global_print (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    43
	lua_concat (L, lua_gettop (L));
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
    44
	scr_LogPrint (LPRINT_LOGNORM | LPRINT_NOTUTF8, lua_tostring (L, -1));
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    45
	return 0;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    46
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    47
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    48
/// dopath
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    49
/// Loads lua file from default location.
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
    50
/// XXX: g_filename_from_utf8?
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    51
/// A: string (filename, without ".lua")
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
    52
/// R: string (error message, optional)
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    53
static int lua_global_dopath (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    54
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    55
	const char *name = luaL_checkstring (L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    56
	size_t      size = lua_objlen (L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    57
	char       *path;
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
    58
	int         ret = 0;
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    59
	if (!strncmp (name + size - 4, ".lua", 4))
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    60
		path = mcabber_config_filename (name);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    61
	else {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    62
		char *fname = g_strconcat (name, ".lua", NULL);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    63
		path = mcabber_config_filename (fname);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    64
		g_free (fname);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    65
	}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    66
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
    67
	if (ret = luaL_loadfile (L, path))
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    68
		scr_LogPrint (LPRINT_LOGNORM, "lua: Unable to compile file %s: %s", path, lua_tostring (L, -1));
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
    69
	else if (ret = lua_pcall (lua, 0, LUA_MULTRET, 0))
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
    70
		scr_LogPrint (LPRINT_LOGNORM, "lua: Runtime error in file %s: %s", path, lua_tostring (L, -1));
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
    71
	g_free (path);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    72
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
    73
	if (ret)
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
    74
		return 1;
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
    75
	else
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
    76
		return 0;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    77
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    79
/// main.config_file
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    80
/// Adds mcabber default config location path to config file name.
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    81
/// Note: deprecated, use dopath.
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
    82
/// XXX: should we use g_filename_from_utf8?
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    83
/// A: string (filename)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    84
/// R: string (full path)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    85
static int lua_main_config_file (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    86
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    87
	char *home = mcabber_config_filename (luaL_checkstring (L, 1));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    88
	if (!home) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    89
		lua_pushstring (L, "Cannot find home dir!");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    90
		lua_error (L);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    91
	}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    92
	lua_pushstring (L, home);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    93
	g_free (home);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    94
	return 1;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    95
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    96
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    97
/// log print type
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    98
/// G:
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    99
static const string2enum_t lua_lprint[] = {
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   100
	{ "normal",  LPRINT_NORMAL  },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   101
	{ "log",     LPRINT_LOG     },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   102
	{ "debug",   LPRINT_DEBUG   },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   103
	{ "notutf0", LPRINT_NOTUTF8 },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   104
	{ NULL,      0              },
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   105
};
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   106
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   107
/// roster type
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   108
/// G:
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   109
static const string2enum_t lua_roster_type[] = {
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   110
	{ "user",    ROSTER_TYPE_USER    },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   111
	{ "group",   ROSTER_TYPE_GROUP   },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   112
	{ "agent",   ROSTER_TYPE_AGENT   },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   113
	{ "room",    ROSTER_TYPE_ROOM    },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   114
	{ "special", ROSTER_TYPE_SPECIAL },
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   115
	{ NULL,      0                   },
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   116
};
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   117
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   118
/// main.log
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   119
/// Prints message to log.
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   120
/// Note: most likely you need notutf8 flag enabled.
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   121
/// A: log print type, message, message...
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   122
static int lua_main_log (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   123
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   124
	int type = luaL_checkenum_multi (L, 1, lua_lprint);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   125
	lua_concat (L, lua_gettop (L) - 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   126
	scr_LogPrint (type, lua_tostring (L, -1));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   127
	return 0;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   128
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   129
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   130
// expects table on top
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   131
static void lua_options_callback (char *key, char *value, lua_State *L)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   132
{
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   133
	char *loc = from_utf8 (key);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   134
	lua_pushstring (L, loc);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   135
	g_free (loc);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   136
	loc = from_utf8 (value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   137
	lua_pushstring (L, loc);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   138
	g_free (loc);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   139
	lua_settable (L, -3);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   140
}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   141
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   142
/// main.option
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   143
/// Sets or gets value of mcabber option.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   144
/// You can specify nil as a value to delete option.
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   145
/// If you omit option name, it returns hash table of all options.
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   146
/// A: string (option name, optional), string (value, optional)
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   147
/// R: string (value, optional)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   148
static int lua_main_option (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   149
{
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   150
	int top = lua_gettop (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   151
	if (top > 0) {
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   152
		char *name = to_utf8 (luaL_checkstring (L, 1));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   153
		if (top > 1) { // Set
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   154
			if (lua_type (L, 2) == LUA_TNIL) // Unset
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   155
				settings_del (SETTINGS_TYPE_OPTION, name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   156
			else { // Set
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   157
				char *value = to_utf8 (luaL_checkstring (L, 2));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   158
				settings_set (SETTINGS_TYPE_OPTION, name, value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   159
				g_free (value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   160
			}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   161
			g_free (name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   162
			return 0;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   163
		} else { // Get
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   164
			char *value = from_utf8 (settings_get (SETTINGS_TYPE_OPTION, name));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   165
			if (value) {
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   166
				lua_pushstring (L, value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   167
				g_free (value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   168
			} else
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   169
				lua_pushnil (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   170
			g_free (name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   171
			return 1;
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   172
		}
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   173
	} else { // List
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   174
		lua_newtable (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   175
		settings_foreach (SETTINGS_TYPE_OPTION, (void (*)(char *key, char *val, void *ud)) lua_options_callback, L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   176
		return 1;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   177
	}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   178
}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   179
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   180
/// main.alias
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   181
/// Sets or gets alias.
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   182
/// You can specify nil as a command to delete alias.
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   183
/// If you omit alias name, it will return hash table of all aliases.
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   184
/// A: string (alias name, optional), string (command, optional)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   185
/// R: string (command, optional)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   186
static int lua_main_alias (lua_State *L)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   187
{
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   188
	int top = lua_gettop (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   189
	if (top > 0) {
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   190
		char *name = to_utf8 (luaL_checkstring (L, 1));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   191
		if (top > 1) { // Set
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   192
			if (lua_type (L, 2) == LUA_TNIL) { // Unset
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   193
				settings_del (SETTINGS_TYPE_ALIAS, name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   194
				compl_del_category_word (COMPL_CMD, name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   195
			} else { // Set
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   196
				char *value = to_utf8 (luaL_checkstring (L, 2));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   197
				if (!settings_get (SETTINGS_TYPE_ALIAS, name))
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   198
					compl_add_category_word (COMPL_CMD, name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   199
				settings_set (SETTINGS_TYPE_ALIAS, name, value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   200
				g_free (value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   201
			}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   202
			g_free (name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   203
			return 0;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   204
		} else { // Get
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   205
			char *value = from_utf8 (settings_get (SETTINGS_TYPE_ALIAS, name));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   206
			if (value) {
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   207
				lua_pushstring (L, value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   208
				g_free (value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   209
			} else
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   210
				lua_pushnil (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   211
			g_free (name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   212
			return 1;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   213
		}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   214
	} else { // List
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   215
		lua_newtable (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   216
		settings_foreach (SETTINGS_TYPE_ALIAS, (void (*)(char *key, char *val, void *ud)) lua_options_callback, L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   217
		return 1;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   218
	}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   219
}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   220
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   221
/// main.bind
15
Myhailo Danylenko <isbear@ukrpost.net>
parents: 14
diff changeset
   222
/// Sets or gets binding.
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   223
/// You can specify nil as a command to unbind key.
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   224
/// If you omit keycode, it will return hash table of all bindings.
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   225
/// A: string (keycode, optional), string (command, optional)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   226
/// R: string (command, optional)
15
Myhailo Danylenko <isbear@ukrpost.net>
parents: 14
diff changeset
   227
static int lua_main_binding (lua_State *L)
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   228
{
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   229
	int top = lua_gettop (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   230
	if (top > 0) {
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   231
		// just to be sure...
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   232
		char *name = to_utf8 (luaL_checkstring (L, 1));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   233
		if (top > 1) { // Set
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   234
			if (lua_type (L, 2) == LUA_TNIL) // Unset
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   235
				settings_del (SETTINGS_TYPE_BINDING, name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   236
			else { // Set
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   237
				char *value = to_utf8 (luaL_checkstring (L, 2));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   238
				settings_set (SETTINGS_TYPE_BINDING, name, value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   239
				g_free (value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   240
			}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   241
			g_free (name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   242
			return 0;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   243
		} else { // Get
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   244
			char *value = from_utf8 (settings_get (SETTINGS_TYPE_BINDING, name));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   245
			if (value) {
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   246
				lua_pushstring (L, value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   247
				g_free (value);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   248
			} else
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   249
				lua_pushnil (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   250
			g_free (name);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   251
			return 1;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   252
		}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   253
	} else { // List
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   254
		lua_newtable (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   255
		settings_foreach (SETTINGS_TYPE_BINDING, (void (*)(char *key, char *val, void *ud)) lua_options_callback, L);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   256
		return 1;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   257
	}
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   258
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   259
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   260
/// main.connection
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   261
/// Returns lightuserdata of mcabber's loudmouth connection.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   262
/// This can be very useful with lua-loudmouth, and not much otherwise.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   263
/// R: lightuserdata
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   264
static int lua_main_connection (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   265
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   266
	lua_pushlightuserdata (L, lconnection);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   267
	return 1;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   268
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   269
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   270
/// main.print_info
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   271
/// Prints a system message to buddy's window.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   272
/// A: string (jid), string (message)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   273
static int lua_main_print_info (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   274
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   275
	char *jid  = to_utf8 (luaL_checkstring (L, 1));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   276
	char *to   = jidtodisp (jid);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   277
	char *mesg = to_utf8 (luaL_checkstring (L, 2));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   278
	scr_WriteIncomingMessage (to, mesg, 0, HBB_PREFIX_INFO, 0);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   279
	g_free (mesg);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   280
	g_free (to);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   281
	g_free (jid);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   282
	return 0;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   283
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   284
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   285
/// main.beep
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   286
/// Beeps with system speaker.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   287
static int lua_main_beep (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   288
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   289
	scr_Beep ();
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   290
	return 0;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   291
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   292
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   293
/// main.run
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   294
/// Runs specified mcabber command.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   295
/// A: string
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   296
static int lua_main_run (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   297
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   298
	process_command (luaL_checkstring (L, 1), TRUE);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   299
	return 0;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   300
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   301
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   302
/// main.status
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   303
/// Returns your current status.
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   304
/// R: string (status letter), string (status message)
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   305
static int lua_main_status (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   306
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   307
	char *sm = from_utf8 (xmpp_getstatusmsg ());
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   308
	lua_pushlstring (L, &imstatus2char[xmpp_getstatus ()], 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   309
	lua_pushstring (L, sm);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   310
	g_free (sm);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   311
	return 2;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   312
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   313
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   314
// expects table on top
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   315
static void lua_rosterlist_callback (gpointer buddy, lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   316
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   317
	char *jid = from_utf8 (buddy_getjid (buddy));
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   318
	lua_pushnumber (L, lua_objlen (L, -1) + 1);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   319
	lua_pushstring (L, jid);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   320
	lua_settable (L, -3);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   321
	g_free (jid);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   322
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   323
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   324
/// main.roster
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   325
/// Returns array of jids of buddies in roster.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   326
/// R: table
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   327
static int lua_main_roster (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   328
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   329
	lua_newtable (L);
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   330
	foreach_buddy (ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_ROOM, (void (*) (gpointer buddy, void *data)) lua_rosterlist_callback, L);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   331
	return 1;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   332
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   333
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   334
/// main.current_buddy
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   335
/// Returns jid of current selected buddy or sets current buddy to buddy with specified jid.
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   336
/// A: string (optional)
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   337
/// R: string (optional)
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   338
static int lua_main_current_buddy (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   339
{
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   340
	if (lua_gettop (L) > 0) { // Set
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   341
		// XXX: we need not convert to utf, RS works on jids/names in locale charset,
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   342
		// but will jidtodisp always correctly work on such tings?
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   343
		char *jid = jidtodisp (luaL_checkstring (L, 1));
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   344
		scr_RosterSearch (jid);
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   345
		g_free (jid);
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   346
		return 0;
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   347
	} else { // Get
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   348
		char *jid = from_utf8 (buddy_getjid (BUDDATA (current_buddy)));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   349
		lua_pushstring (L, jid);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   350
		g_free (jid);
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   351
		return 1;
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   352
	}
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   353
}
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   354
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   355
/// main.full_jid
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   356
/// Returns full jid (with current resource) of specified buddy (or current, if not specified).
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   357
/// Note, that if there are no resources online, it will return just what it got.
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   358
/// A: string (jid, optional)
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   359
/// R: string (jid)
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   360
static int lua_main_full_jid (lua_State *L)
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   361
{
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   362
	GList *buddy;
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   363
	GSList *resources;
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   364
	GSList *resource;
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   365
	if (lua_gettop (L) > 0) {
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   366
		char *jid = from_utf8 (luaL_checkstring (L, 1));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   367
		buddy = buddy_search_jid (jid);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   368
		g_free (jid);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   369
	} else
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   370
		buddy = current_buddy;
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   371
	if (!buddy)
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   372
		return 0;
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   373
	resources = buddy_getresources (BUDDATA (buddy));
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   374
	if (!resources) {
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   375
		char *loc = from_utf8 (buddy_getjid (BUDDATA (buddy)));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   376
		lua_pushstring (L, loc);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   377
		g_free (loc);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   378
	} else {
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   379
		char *jid = from_utf8 (buddy_getjid (BUDDATA (buddy)));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   380
		char *res = from_utf8 (g_slist_last (resources)->data);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   381
		lua_pushfstring (L, "%s%c%s", jid, JID_RESOURCE_SEPARATOR, res);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   382
		for (resource = resources; resource; resource = g_slist_next (resource))
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   383
			g_free (resource->data);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   384
		g_slist_free (resources);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   385
		g_free (jid);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   386
		g_free (res);
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   387
	}
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   388
	return 1;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   389
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   390
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   391
typedef struct {
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   392
	lua_State *L;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   393
	gpointer   buddy;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   394
} lua_state_and_buddy_t; // :)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   395
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   396
// expects table on top!
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   397
static void lua_buddy_resources_callback (gpointer resource, lua_state_and_buddy_t *d)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   398
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   399
	char *loc = from_utf8 (resource);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   400
	lua_pushstring (d->L, loc);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   401
	g_free (loc);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   402
	lua_createtable (d->L, 0, 3);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   403
	lua_pushstring (d->L, "priority");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   404
	lua_pushnumber (d->L, buddy_getresourceprio (d->buddy, resource));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   405
	lua_settable   (d->L, -3);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   406
	lua_pushstring  (d->L, "status");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   407
	lua_pushlstring (d->L, &imstatus2char[buddy_getstatus (d->buddy, resource)], 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   408
	lua_settable    (d->L, -3);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   409
	lua_pushstring (d->L, "message");
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   410
	loc = from_utf8 (buddy_getstatusmsg (d->buddy, resource));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   411
	lua_pushstring (d->L, loc);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   412
	g_free (loc);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   413
	lua_settable   (d->L, -3);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   414
	lua_settable (d->L, -3);
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   415
	g_free (resource);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   416
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   417
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   418
/// main.buddy_info
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   419
/// Returns a hash table with information on specified buddy.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   420
/// Table contains fields type, name, onserver and resources.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   421
/// Resources is also a hash table, that contains tables with information,
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   422
/// specific for each resource. In each resource table there are fields
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   423
/// priority, status and message.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   424
/// A: string (jid)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   425
/// R: table
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   426
static int lua_main_buddy_info (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   427
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   428
	char                  *loc   = to_utf8 (luaL_checkstring (L, 1));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   429
	char                  *jid   = jidtodisp (loc);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   430
	GSList                *buddy = roster_find (jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_ROOM);
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   431
	GSList                *resources;
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   432
	lua_state_and_buddy_t  snb;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   433
	g_free (jid);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   434
	g_free (loc);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   435
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   436
	if (!buddy) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   437
		lua_pushnil (L);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   438
		return 1;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   439
	}
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   440
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   441
	lua_createtable (L, 0, 3);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   442
	lua_pushstring (L, "type");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   443
	luaL_pushenum  (L, buddy_gettype (BUDDATA (buddy)), lua_roster_type);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   444
	lua_settable   (L, -3);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   445
	lua_pushstring (L, "name");
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   446
	loc = from_utf8 (buddy_getname (BUDDATA (buddy)));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   447
	lua_pushstring (L, loc);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   448
	g_free (loc);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   449
	lua_settable   (L, -3);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   450
	lua_pushstring  (L, "onserver");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   451
	lua_pushboolean (L, buddy_getonserverflag (BUDDATA (buddy)));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   452
	lua_settable    (L, -3);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   453
	lua_pushstring  (L, "resources");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   454
	lua_createtable (L, 0, 0);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   455
	snb.L     = L;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   456
	snb.buddy = BUDDATA (buddy);
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   457
	resources = buddy_getresources (BUDDATA (buddy));
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   458
	g_slist_foreach (buddy_getresources (BUDDATA (buddy)), (GFunc) lua_buddy_resources_callback, &snb);
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   459
	g_slist_free (resources);
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   460
	lua_settable (L, -3);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   461
	
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   462
	return 1;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   463
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   464
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   465
// XMPP DISCO FEATURES
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   466
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   467
GSList *lua_added_features = NULL;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   468
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   469
/// main.add_feature
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   470
/// Adds xmlns to disco#info features list.
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   471
/// A: string (xmlns)
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   472
static int lua_main_add_feature (lua_State *L)
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   473
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   474
	char *xmlns = to_utf8 (luaL_checkstring (L, 1));
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   475
	xmpp_add_feature (xmlns);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   476
	lua_added_features = g_slist_prepend (lua_added_features, xmlns);
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   477
	return 0;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   478
}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   479
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   480
/// main.del_feature
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   481
/// Removes xmlns from disco#info features list.
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   482
/// A: stirng (xmlns)
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   483
static int lua_main_del_feature (lua_State *L)
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   484
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   485
	char   *xmlns = to_utf8 (luaL_checkstring (L, 1));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   486
	GSList *el    = g_slist_find_custom (lua_added_features, xmlns, (GCompareFunc) strcmp);
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   487
	xmpp_del_feature (xmlns);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   488
	if (el) {
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   489
		g_free (el->data);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   490
		lua_added_features = g_slist_delete_link (lua_added_features, el);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   491
	}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   492
	return 0;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   493
}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   494
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   495
// MCABBER COMMANDS
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   496
9
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   497
/// completion type
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   498
/// Built-it completion types can be specified as string, instead of id.
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   499
/// G:
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   500
static const string2enum_t lua_completion_type[] = {
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   501
	{ "cmd",       COMPL_CMD       },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   502
	{ "jid",       COMPL_JID       },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   503
	{ "urljid",    COMPL_URLJID    },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   504
	{ "name",      COMPL_NAME      },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   505
	{ "status",    COMPL_STATUS    },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   506
	{ "filename",  COMPL_FILENAME  },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   507
	{ "roster",    COMPL_ROSTER    },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   508
	{ "buffer",    COMPL_BUFFER    },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   509
	{ "group",     COMPL_GROUP     },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   510
	{ "groupname", COMPL_GROUPNAME },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   511
	{ "multiline", COMPL_MULTILINE },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   512
	{ "room",      COMPL_ROOM      },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   513
	{ "resource",  COMPL_RESOURCE  },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   514
	{ "auth",      COMPL_AUTH      },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   515
	{ "request",   COMPL_REQUEST   },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   516
	{ "events",    COMPL_EVENTS    },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   517
	{ "eventsid",  COMPL_EVENTSID  },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   518
	{ "pgp",       COMPL_PGP       },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   519
	{ "color",     COMPL_COLOR     },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   520
	{ "otr",       COMPL_OTR       },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   521
	{ "ortpolicy", COMPL_OTRPOLICY },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   522
	{ NULL,        0               },
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   523
};
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   524
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   525
typedef struct {
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   526
	int        reference;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   527
	lua_State *L;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   528
} lua_command_callback_t;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   529
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   530
static GSList *lua_added_commands = NULL;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   531
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   532
static GSList *lua_added_categories = NULL;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   533
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   534
/// command function
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   535
/// Function to handle newly registered command.
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   536
/// A: string (arguments)
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   537
static void lua_main_command_handler (char *args, lua_command_callback_t *cb)
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   538
{
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   539
	lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   540
	lua_pushstring (cb->L, args);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   541
	if (lua_pcall (cb->L, 1, 0, 0)) {
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   542
		scr_LogPrint (LPRINT_LOGNORM, "lua: Command execution error: %s", lua_tostring (cb->L, -1));
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   543
		lua_pop (cb->L, 1);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   544
	}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   545
}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   546
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   547
/// main.parse_args
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   548
/// Function to parse command argument string. Returns table of strings.
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   549
/// It can parse barewords (with escapes), double-quoted strings (with escapes) and single-quoted strings (without escapes).
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   550
/// If args string ends with escape symbol, it is preserved.
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   551
/// Arguments are separated only by whitespace, so, consequential quoted strings or barewords are one argument.
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   552
/// Note: As for now, it does not preserve leading quote symbol for non-closed quoted strings. You should not rely on this behaviour.
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   553
/// Examples:
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   554
/// * ab\ cd\'e\\f\"
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   555
/// * "ab cd'e\\f\""
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   556
/// * 'ab cd'\''e\f'
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   557
/// * ab" cd'"'e\f'
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   558
/// A: string
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   559
/// R: table
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   560
static int lua_main_parse_args (lua_State *L)
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   561
{
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   562
	const char  *args = luaL_checkstring (L, 1);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   563
	const char  *p    = args;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   564
	luaL_Buffer  buf;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   565
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   566
	lua_newtable (L);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   567
	luaL_buffinit (L, &buf);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   568
	while (*p) {
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   569
		if (*p == ' ') {
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   570
			++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   571
			continue;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   572
		}
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   573
		if (*p == '"') { // soft quote
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   574
			const char *start = ++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   575
			while (*p) {
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   576
				if (*p == '\\') { // escape symbol
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   577
					luaL_addlstring (&buf, start, p - start);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   578
					start = ++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   579
					if (*p) // skip symbol
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   580
						++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   581
					else // add last \ in line
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   582
						luaL_addchar (&buf, '\\');
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   583
				} else if (*p == '"') // quotation end
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   584
					break;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   585
				else
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   586
					++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   587
			}
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   588
			luaL_addlstring (&buf, start, p - start);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   589
			if (*p)
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   590
				++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   591
		} else if (*p == '\'') { // no-escape quote
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   592
			const char *start = ++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   593
			while (*p && *p != '\'')
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   594
				p++;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   595
			luaL_addlstring (&buf, start, p - start);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   596
			if (*p)
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   597
				++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   598
		} else { // bareword
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   599
			const char *start = p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   600
			while (*p) {
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   601
				if (*p == '\\') {
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   602
					luaL_addlstring (&buf, start, p - start);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   603
					start = ++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   604
					if (*p) // skip symbol
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   605
						++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   606
					else // add last \ in line
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   607
						luaL_addchar (&buf, '\\');
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   608
				} else if (*p == ' ' || *p == '\'' || *p == '"')
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   609
					break;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   610
				else
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   611
					++p;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   612
			}
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   613
			luaL_addlstring (&buf, start, p - start);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   614
		}
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   615
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   616
		if ((!*p) || *p == ' ') {
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   617
			luaL_pushresult (&buf);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   618
			luaL_ref (L, -2);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   619
			luaL_buffinit (L, &buf);
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   620
		}
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   621
	}
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   622
	return 1;
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   623
}
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   624
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   625
/// main.add_category
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   626
/// Adds completion category.
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   627
/// A: table (values are used as words for completion, optional)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   628
/// R: integer (category id, in fact completion type) or nil
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   629
static int lua_main_add_category (lua_State *L)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   630
{
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   631
	guint cid;
15
Myhailo Danylenko <isbear@ukrpost.net>
parents: 14
diff changeset
   632
	if (lua_gettop (L) > 0) {
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   633
		luaL_argcheck (L, lua_type (L, 1) == LUA_TTABLE, 1, "table expected");
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   634
		cid = compl_new_category ();
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   635
		if (cid) {
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   636
			lua_pushnil (L);
17
3a12759a22b1 Fix segfault in add_category
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   637
			while (lua_next (L, 1)) {
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   638
				char *word = to_utf8 (luaL_checkstring (L, -1));
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   639
				if (word) {
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   640
					compl_add_category_word (cid, word);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   641
					g_free (word);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   642
				}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   643
				lua_pop (L, 1);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   644
			}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   645
		}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   646
	} else
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   647
		cid = compl_new_category ();
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   648
	if (cid) {
15
Myhailo Danylenko <isbear@ukrpost.net>
parents: 14
diff changeset
   649
		lua_added_categories = g_slist_prepend (lua_added_categories, (gpointer) cid);
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   650
		lua_pushinteger (L, cid);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   651
	} else
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   652
		lua_pushnil (L);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   653
	return 1;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   654
}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   655
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   656
/// main.del_category
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   657
/// Removes completion category.
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   658
/// A: integer (category id)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   659
static int lua_main_del_category (lua_State *L)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   660
{
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   661
	guint cid = luaL_checkinteger (L, 1);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   662
	compl_del_category (cid);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   663
	lua_added_categories = g_slist_remove (lua_added_categories, (gpointer) cid);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   664
	return 0;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   665
}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   666
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   667
/// main.add_completion
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   668
/// Adds word to a completion list.
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   669
/// A: integer (completion group id), string (word)
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   670
static int lua_main_add_completion (lua_State *L)
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   671
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   672
	guint  cid  = luaL_checkinteger (L, 1);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   673
	char  *word = to_utf8 (luaL_checkstring (L, 2)); // XXX
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   674
	compl_add_category_word (cid, word);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   675
	g_free (word);
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   676
}
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   677
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   678
/// main.del_completion
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   679
/// Removes word from a completion list.
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   680
/// A: integer (completion group id), string (word)
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   681
static int lua_main_del_completion (lua_State *L)
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   682
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   683
	guint  cid  = luaL_checkinteger (L, 1);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   684
	char  *word = to_utf8 (luaL_checkstring (L, 2)); // XXX
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   685
	compl_del_category_word (cid, word);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   686
	g_free (word);
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   687
}
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   688
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   689
/// main.command
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   690
/// Associates or breaks association between mcabber command name and lua function.
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   691
/// To unregister command omit function argument.
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   692
/// If you specify a third argument, table (even empty), function will return completion group id or nothing.
9
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   693
/// You can also specify a string name (see completion type) instead of table, for non-builtin, you can just pass integer id.
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   694
/// Note, that for now there are no way to unregister completion group, so, resources can be exausted easily.
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   695
/// Also note, that it ignores keys in a completion table.
9
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   696
/// A: string (command name), command function (optional), table (completions, optional)/completion type (or integer comletion group id, optional)
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   697
/// R: completion type (integer completion group id or string for builtin types, optional)
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   698
static int lua_main_command (lua_State *L)
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   699
{
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   700
	const char             *name = luaL_checkstring (L, 1); // XXX: to_utf8? looks like no :/
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   701
	lua_command_callback_t *cb;
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   702
	if (lua_gettop (L) > 1) { // Register
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   703
		guint cid = 0;
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   704
		luaL_argcheck (L, lua_isfunction (L, 2), 2, "function expected");
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   705
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   706
		if (lua_gettop (L) > 2) { // Completions provided
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   707
			if (lua_type (L, 3) == LUA_TTABLE) {
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   708
				cid = compl_new_category ();
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   709
				if (cid) {
15
Myhailo Danylenko <isbear@ukrpost.net>
parents: 14
diff changeset
   710
					lua_added_categories = g_slist_prepend (lua_added_categories, (gpointer) cid);
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   711
					lua_pushnil (L);
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   712
					while (lua_next (L, 3)) {
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   713
						char *word = to_utf8 (luaL_checkstring (L, -1));
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   714
						compl_add_category_word (cid, word);
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   715
						lua_pop (L, 1);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   716
						g_free (word);
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   717
					}
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   718
				}
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   719
			} else
9
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   720
				cid = luaL_checkenum (L, 3, lua_completion_type);
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   721
		}
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   722
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   723
		cb = luaL_malloc (L, sizeof (lua_command_callback_t));
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   724
		lua_pushvalue (L, 2);
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   725
		cb->reference = luaL_ref (L, LUA_REGISTRYINDEX);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   726
		cb->L         = L;
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   727
		cmd_add (name, "", cid, 0, (void (*) (char *p)) lua_main_command_handler, cb);
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   728
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   729
		lua_added_commands = g_slist_prepend (lua_added_commands, g_strdup (name));
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   730
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   731
		if (cid) {
9
c2517f8bf647 Enum completion type
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   732
			luaL_pushenum (L, cid, lua_completion_type);
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   733
			return 1;
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   734
		}
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   735
	} else { // Unregister
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   736
		GSList *el = g_slist_find_custom (lua_added_commands, name, (GCompareFunc) g_strcmp0);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   737
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   738
		cb = cmd_del (name);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   739
		if (cb) {
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   740
			luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   741
			luaL_free (cb->L, cb);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   742
		}
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   743
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   744
		if (el) {
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   745
			g_free (el->data);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   746
			lua_added_commands = g_slist_delete_link (lua_added_commands, el);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   747
		}
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   748
	}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   749
	return 0;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   750
}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   751
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   752
// TIMER
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   753
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   754
#define LUA_TIMER_PRIORITY ( G_PRIORITY_HIGH_IDLE )
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   755
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   756
typedef struct {
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   757
	int        reference;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   758
	lua_State *L;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   759
} lua_timer_callback_t;
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   760
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   761
static void lua_timer_callback_destroy (lua_timer_callback_t *cb)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   762
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   763
	luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   764
	luaL_free (cb->L, cb);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   765
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   766
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   767
/// timer function
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   768
/// Function, that will be called periodically until it returns false.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   769
/// R: boolean
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   770
static gboolean lua_timer_callback (lua_timer_callback_t *cb)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   771
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   772
	int ret;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   773
	lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   774
	if (lua_pcall (cb->L, 0, 1, 0)) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   775
		scr_LogPrint (LPRINT_LOGNORM, "lua: Timer callback execution error: %s", lua_tostring (cb->L, -1));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   776
		lua_pop (cb->L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   777
		return FALSE;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   778
	}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   779
	ret = lua_toboolean (cb->L, -1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   780
	lua_pop (cb->L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   781
	return ret;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   782
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   783
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   784
/// main.timer
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   785
/// Creates new timer function, that will be called periodically.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   786
/// A: integer (interval, seconds), timer function
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   787
static int lua_main_timer (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   788
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   789
	int                   interval = luaL_checkint (L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   790
	lua_timer_callback_t *cb;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   791
	luaL_argcheck (L, lua_isfunction (L, 2), 2, "function expected");
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   792
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   793
	cb = luaL_malloc (L, sizeof (lua_timer_callback_t));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   794
	cb->reference = luaL_ref (L, LUA_REGISTRYINDEX);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   795
	cb->L         = L;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   796
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   797
	g_timeout_add_seconds_full (LUA_TIMER_PRIORITY, interval, (GSourceFunc) lua_timer_callback, cb, (GDestroyNotify) lua_timer_callback_destroy);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   798
	return 0;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   799
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   800
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   801
// BACKGROUND PIPE READING
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   802
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   803
#define LUA_BGREAD_BUFFER ( 4096 )
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   804
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   805
typedef struct {
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   806
	lua_State *L;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   807
	FILE      *fd;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   808
	int        reference;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   809
} lua_bgread_callback_t;
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   810
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   811
static gchar lua_bgread_buffer[LUA_BGREAD_BUFFER];
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   812
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   813
static void lua_bgread_callback_destroy (lua_bgread_callback_t *cb)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   814
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   815
	luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   816
	pclose (cb->fd);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   817
	luaL_free (cb->L, cb);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   818
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   819
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   820
/// background reading function
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   821
/// Function, that processes output from pipe in asynchroneous way.
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   822
/// A: string (data) or nil (eof)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   823
/// R: boolean (false if reading should be terminated)
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   824
static gboolean lua_bgread_callback (GIOChannel *source, GIOCondition condition, lua_bgread_callback_t *cb)
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   825
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   826
	int ret = TRUE;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   827
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   828
	if (condition | G_IO_IN) { // data
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   829
		while (TRUE) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   830
			gsize read = 0;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   831
			g_io_channel_read_chars (source, lua_bgread_buffer, LUA_BGREAD_BUFFER, &read, NULL);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   832
			if (!read) // exausted
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   833
				break;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   834
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   835
			lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   836
			lua_pushlstring (cb->L, lua_bgread_buffer, read);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   837
			if (lua_pcall (cb->L, 1, 1, 0)) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   838
				scr_LogPrint (LPRINT_LOGNORM, "lua: Bgread callback execution error: %s", lua_tostring (cb->L, -1));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   839
				lua_pop (cb->L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   840
				return FALSE;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   841
			}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   842
			ret = lua_toboolean (cb->L, -1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   843
			lua_pop (cb->L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   844
			if (!ret) // enough
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   845
				return FALSE;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   846
		}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   847
	}
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   848
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   849
	if (condition & ~G_IO_IN) { // err or hup
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   850
		lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   851
		lua_pushnil (cb->L);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   852
		if (lua_pcall (cb->L, 1, 1, 0)) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   853
			scr_LogPrint (LPRINT_LOGNORM, "lua: Bgread callback execution error: %s", lua_tostring (cb->L, -1));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   854
			lua_pop (cb->L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   855
			return FALSE;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   856
		}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   857
		ret = lua_toboolean (cb->L, -1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   858
		lua_pop (cb->L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   859
	}
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   860
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   861
	return ret;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   862
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   863
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   864
/// main.bgread
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   865
/// Runs specified command and passes its output to a given function.
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   866
/// A: string (command), background reading function
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   867
static int lua_main_bgread (lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   868
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   869
	const char            *command = luaL_checkstring (L, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   870
	lua_bgread_callback_t *cb;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   871
	FILE                  *fd;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   872
	GIOChannel            *channel;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   873
	const char            *charset = NULL;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   874
	luaL_argcheck (L, lua_isfunction (L, 2), 2, "function expected");
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   875
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   876
	fd = popen (command, "r");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   877
	if (!fd) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   878
		lua_pushstring (L, "Error opening pipe");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   879
		lua_error (L);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   880
	}
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   881
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   882
	channel = g_io_channel_unix_new (fileno (fd));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   883
	// We, most likely, need this,
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   884
	// But we cannot use this,
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   885
	// It will block.
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   886
	//if (!g_get_charset (&charset))
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   887
	g_io_channel_set_encoding (channel, charset, NULL);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   888
	g_io_channel_set_buffered (channel, FALSE);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   889
	g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, NULL);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   890
	g_io_channel_set_close_on_unref (channel, TRUE);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   891
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   892
	cb = luaL_malloc (L, sizeof (lua_bgread_callback_t));
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   893
	cb->reference = luaL_ref (L, LUA_REGISTRYINDEX);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   894
	cb->L         = L;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   895
	cb->fd        = fd;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   896
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   897
	g_io_add_watch_full (channel, G_PRIORITY_HIGH_IDLE, G_IO_IN|G_IO_HUP|G_IO_ERR, (GIOFunc) lua_bgread_callback, cb, (GDestroyNotify) lua_bgread_callback_destroy);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   898
	return 0;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   899
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   900
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   901
// MAIN INITIALIZATION CODE
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   902
3
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   903
#ifdef LLM_LOG_HANDLER
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   904
// FIXME: this should not be here
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   905
guint lua_lm_log_handler_id;
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   906
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   907
void lua_lm_log_handler (const gchar *domain, GLogLevelFlags log_level, const gchar *message, gpointer ignore)
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   908
{
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   909
	scr_LogPrint (LPRINT_LOGNORM, "%s: %s", domain, message);
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   910
}
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   911
#endif
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   912
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   913
static void do_lua(char *arg, lua_State *L)
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   914
{
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   915
	if (luaL_loadbuffer (L, arg, strlen (arg), "line")) {
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   916
		scr_LogPrint (LPRINT_LOGNORM, "lua: Compilation error: %s", lua_tostring (L, -1));
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   917
		lua_pop (L, 1);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   918
		return;
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   919
	}
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   920
 
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   921
	if (lua_pcall (L, 0, 0, 0)) {
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   922
		scr_LogPrint (LPRINT_NORMAL, "lua: Runtime error: %s", lua_tostring(lua, -1));
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   923
		lua_pop (L, 1);
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   924
		return;
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   925
	}
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   926
}
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   927
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   928
static void lua_hook (hk_arg_t *args, lua_State *L)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   929
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   930
	hk_arg_t *arg = args;
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   931
	const char *hook = settings_opt_get ("lua_hook_function");
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   932
	if (!hook)
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   933
		return;
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   934
	lua_getglobal (lua, hook);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   935
	if (!lua_isfunction (lua, -1)) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   936
		lua_pop (lua, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   937
		return;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   938
	}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   939
	lua_newtable (L);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   940
	while (arg->name != NULL) {
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   941
		char *name  = from_utf8 (arg->name);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   942
		char *value = from_utf8 (arg->value);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   943
		lua_pushstring (L, name);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   944
		lua_pushstring (L, value);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   945
		lua_settable (L, -3);
13
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   946
		g_free (name);
0b716ba23b03 Charset conversion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   947
		g_free (value);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   948
		arg++;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   949
	}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   950
	if (lua_pcall (lua, 1, 0, 0)) {
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   951
		scr_LogPrint (LPRINT_NORMAL, "lua: Error in hook handler: %s", lua_tostring (lua, -1));
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   952
		lua_pop (lua, 1);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   953
	}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   954
}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   955
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   956
static void *lua_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   957
	if (nsize == 0) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   958
		g_free (ptr);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   959
		return NULL;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   960
	} else
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   961
		return g_realloc (ptr, nsize);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   962
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   963
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   964
#define reg(NAME)                   \
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   965
	{ #NAME, lua_main_##NAME },
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   966
static const luaL_Reg lua_reg_main[] = {
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   967
	reg ( config_file )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   968
	reg ( connection )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   969
	reg ( log )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   970
	reg ( option )
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   971
	reg ( alias )
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   972
	reg ( binding )
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   973
	reg ( add_feature )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   974
	reg ( del_feature )
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   975
	reg ( parse_args )
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   976
	reg ( add_category )
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   977
	reg ( del_category )
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   978
	reg ( add_completion )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   979
	reg ( del_completion )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   980
	reg ( command )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   981
	reg ( print_info )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   982
	reg ( beep )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   983
	reg ( run )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   984
	reg ( status )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   985
	reg ( roster )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   986
	reg ( current_buddy )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   987
	reg ( full_jid )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   988
	reg ( buddy_info )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   989
	reg ( timer )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   990
	reg ( bgread )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   991
	{ NULL, NULL },
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   992
};
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   993
#undef reg
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   994
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   995
const gchar *g_module_check_init (GModule *module)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   996
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   997
	lua = lua_newstate (lua_alloc, NULL);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   998
	if (!lua) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   999
		scr_LogPrint (LPRINT_LOGNORM, "lua: Initialization error");
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1000
		return "Lua initialization error";
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1001
	}
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1002
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1003
	luaL_openlibs (lua);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1004
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1005
	luaL_register (lua, "main", lua_reg_main);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1006
	lua_pop (lua, 1); // XXX
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1007
	lua_register (lua, "dopath", lua_global_dopath);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1008
	lua_register (lua, "print",  lua_global_print );
3
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1009
11
f74fff438888 Branching buddy code
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
  1010
	cmd_add ("lua", "Evaluate lua string", 0, 0, (void (*) (char *p)) do_lua, lua);
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1011
3
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1012
#ifdef LLM_LOG_HANDLER
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1013
	// FIXME: this should not be here.
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1014
	lua_lm_log_handler_id = g_log_set_handler ("lua-lm", G_LOG_LEVEL_MASK, (GLogFunc) lua_lm_log_handler, NULL);
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1015
#endif
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1016
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1017
#if 1
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1018
	{
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1019
		char *initfile = expand_filename (settings_opt_get ("lua_init_filename"));
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1020
		
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1021
		if (!initfile)
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1022
			scr_LogPrint (LPRINT_LOGNORM, "lua: Cannot determine config file name");
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1023
		else {
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1024
			if (luaL_loadfile(lua, initfile)) {
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1025
				scr_LogPrint (LPRINT_LOGNORM, "lua: Unable to compile rc file: %s", lua_tostring (lua, -1));
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1026
				lua_pop (lua, 1);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1027
			} else if (lua_pcall (lua, 0, LUA_MULTRET, 0)) {
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1028
				scr_LogPrint (LPRINT_LOGNORM, "lua: Runtime error in rc file: %s", lua_tostring(lua, -1));
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1029
				lua_pop (lua, 1);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1030
			} else
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1031
				scr_LogPrint (LPRINT_LOGNORM, "lua: Loaded %s", initfile);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1032
			g_free (initfile);
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1033
		}
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1034
	}
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1035
#endif
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1036
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1037
	hk_add_handler ((hk_handler_t) lua_hook, lua);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1038
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1039
	{
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1040
		hk_arg_t args[] = {
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1041
			{ "hook", "hook-start" },
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1042
			{ NULL,   NULL         },
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1043
		};
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1044
		lua_hook (args, lua);
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1045
	}
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1046
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1047
	return NULL;
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1048
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1049
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1050
static void lua_features_destroy (char *xmlns, gpointer ignore)
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1051
{
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1052
	xmpp_del_feature (xmlns);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1053
	g_free (xmlns);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1054
}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1055
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1056
static void lua_commands_destroy (char *name, gpointer ignore)
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1057
{
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1058
	lua_command_callback_t *cb = cmd_del (name);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1059
	if (cb) {
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1060
		luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1061
		luaL_free (cb->L, cb);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1062
	}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1063
	g_free (name);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1064
}
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1065
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1066
static void lua_categories_destroy (guint id, gpointer ignore)
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1067
{
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1068
	compl_del_category (id);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1069
}
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1070
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1071
void g_module_unload (GModule *module)
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1072
{
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1073
	if (lua) {
6
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1074
		hk_arg_t args[] = {
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1075
			{ "hook", "hook-quit" },
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1076
			{ NULL,   NULL        },
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1077
		};
90dceae3ed1f Hooks unification
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1078
		lua_hook (args, lua);
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1079
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1080
		hk_del_handler ((hk_handler_t) lua_hook, lua);
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1081
2
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1082
		g_slist_foreach (lua_added_features, (GFunc) lua_features_destroy, NULL);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1083
		g_slist_free (lua_added_features);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1084
		lua_added_features = NULL;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1085
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1086
		g_slist_foreach (lua_added_commands, (GFunc) lua_commands_destroy, NULL);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1087
		g_slist_free (lua_added_commands);
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1088
		lua_added_commands = NULL;
a88a395e6868 Delete commands and features on unloading
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
  1089
14
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1090
		g_slist_foreach (lua_added_categories, (GFunc) lua_categories_destroy, NULL);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1091
		g_slist_free (lua_added_categories);
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1092
		lua_added_categories = NULL;
ff13ba17fb6d Completion and settings improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
  1093
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1094
		cmd_del ("lua");
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
  1095
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1096
		lua_close (lua);
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1097
		lua = NULL;
3
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1098
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1099
#ifdef LLM_LOG_HANDLER
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1100
		// FIXME: shouldn't be here
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1101
		g_log_remove_handler ("lua-lm", lua_lm_log_handler_id);
a5f864d4207f Fixes for build system
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
  1102
#endif
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
  1103
	}
0
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1104
}
65cbecad22b4 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1105