1
0
mirror of https://github.com/irssi/irssi.git synced 2024-07-21 03:14:16 -04:00

Perl works again :) Split to Irssi and Irssi::Irc packages.

git-svn-id: http://svn.irssi.org/repos/irssi/trunk@705 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
Timo Sirainen 2000-10-01 20:48:48 +00:00 committed by cras
parent c1a191955b
commit 62dee8fdaf
20 changed files with 904 additions and 23 deletions

View File

@ -11,39 +11,54 @@ INCLUDES = $(GLIB_CFLAGS) \
libirssi_perl_la_SOURCES = \
irssi-perl.c \
perl-common.c \
xsinit.c
perl-signals.h: $(top_srcdir)/docs/signals.txt $(srcdir)/get-signals.pl
cat $(top_srcdir)/docs/signals.txt | $(perlpath) $(srcdir)/get-signals.pl > perl-signals.h
EXTRA_DIST = \
libperl_dynaloader.la \
get-signals.pl \
core/Irssi-bans.xs \
core/Irssi-channel.xs \
core/Irssi-core.xs \
core/Irssi-dcc.xs \
core/Irssi-flood.xs \
core/Irssi-ignore.xs \
core/Irssi-log.xs \
core/Irssi-masks.xs \
core/Irssi-modes.xs \
core/Irssi-netsplit.xs \
core/Irssi-notifylist.xs \
core/Irssi-query.xs \
core/Irssi-rawlog.xs \
core/Irssi-server.xs \
core/Irssi-settings.xs \
core/Irssi-window.xs \
CORE_SOURCES = \
core/Channel.xs \
core/Core.xs \
core/Log.xs \
core/Masks.xs \
core/Query.xs \
core/Rawlog.xs \
core/Server.xs \
core/Settings.xs \
core/Window.xs \
core/Irssi.xs \
core/Irssi.pm \
core/Makefile.PL.in \
core/typemap
core/typemap \
core/module.h
IRC_SOURCES = \
irc/Bans.xs \
irc/Dcc.xs \
irc/Flood.xs \
irc/Ignore.xs \
irc/IrcChannel.xs \
irc/IrcQuery.xs \
irc/IrcServer.xs \
irc/Modes.xs \
irc/Netsplit.xs \
irc/Notifylist.xs \
irc/Irc.xs \
irc/Irc.pm \
irc/Makefile.PL.in \
irc/typemap \
irc/module.h
EXTRA_DIST = \
libperl_dynaloader.la \
get-signals.pl \
$(CORE_SOURCES) \
$(IRC_SOURCES)
noinst_HEADERS = \
module.h \
core/module.h \
irc/module.h
perl-common.h
all-local:
for dir in core irc; do cd $$dir && if [ ! -f Makefile ]; then if [ "x$(PERL_LIB_DIR)" = "x" ]; then $(perlpath) Makefile.PL; else $(perlpath) Makefile.PL LIB=$(PERL_LIB_DIR); fi; fi && $(MAKE) && cd ..; done

7
src/perl/irc/.cvsignore Normal file
View File

@ -0,0 +1,7 @@
Makefile
Makefile.PL
Irc.c
Irc.bs
*.o
pm_to_blib
blib

40
src/perl/irc/Bans.xs Normal file
View File

@ -0,0 +1,40 @@
MODULE = Irssi::Irc PACKAGE = Irssi::Irc
void
ban_set_type(type)
char *type
#*******************************
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Channel
#*******************************
char *
ban_get_mask(channel, nick)
Irssi::Irc::Channel channel
char *nick
void
ban_set(channel, bans)
Irssi::Irc::Channel channel
char *bans
void
ban_remove(channel, ban)
Irssi::Irc::Channel channel
char *ban
#*******************************
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Ban
#*******************************
void
values(ban)
Irssi::Irc::Ban ban
PREINIT:
HV *hv;
PPCODE:
hv = newHV();
hv_store(hv, "ban", 3, new_pv(ban->ban), 0);
hv_store(hv, "setby", 5, new_pv(ban->setby), 0);
hv_store(hv, "time", 4, newSViv(ban->time), 0);
XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));

81
src/perl/irc/Dcc.xs Normal file
View File

@ -0,0 +1,81 @@
MODULE = Irssi::Irc PACKAGE = Irssi::Irc
void
dccs()
PREINIT:
GSList *tmp;
HV *stash;
PPCODE:
stash = gv_stashpv("Irssi::Irc::Dcc", 0);
for (tmp = dcc_conns; tmp != NULL; tmp = tmp->next) {
XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
}
Irssi::Irc::Dcc
dcc_find_item(type, nick, arg)
int type
char *nick
char *arg
Irssi::Irc::Dcc
dcc_find_by_port(nick, port)
char *nick
int port
void
dcc_ctcp_message(target, server, chat, notice, msg)
char *target
Irssi::Irc::Server server
Irssi::Irc::Dcc chat
int notice
char *msg
Irssi::Irc::Dcc
item_get_dcc(item)
void *item
#*******************************
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Dcc PREFIX = dcc_
#*******************************
void
dcc_destroy(dcc)
Irssi::Irc::Dcc dcc
void
dcc_chat_send(dcc, data)
Irssi::Irc::Dcc dcc
char *data
void
values(dcc)
Irssi::Irc::Dcc dcc
PREINIT:
HV *hv, *stash;
PPCODE:
hv = newHV();
hv_store(hv, "type", 4, new_pv((char *) dcc_type2str(dcc->type)), 0);
hv_store(hv, "created", 7, newSViv(dcc->created), 0);
hv_store(hv, "server", 6, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(dcc->server))),
irssi_get_stash(dcc->server)), 0);
hv_store(hv, "nick", 4, new_pv(dcc->nick), 0);
stash = gv_stashpv("Irssi::Irc::Dcc", 0);
hv_store(hv, "chat", 4, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(dcc->chat))), stash), 0);
hv_store(hv, "ircnet", 6, new_pv(dcc->ircnet), 0);
hv_store(hv, "mynick", 6, new_pv(dcc->mynick), 0);
hv_store(hv, "arg", 3, new_pv(dcc->arg), 0);
hv_store(hv, "file", 4, new_pv(dcc->file), 0);
hv_store(hv, "addr", 4, new_pv(dcc->addrstr), 0);
hv_store(hv, "port", 4, newSViv(dcc->port), 0);
hv_store(hv, "size", 4, newSViv(dcc->size), 0);
hv_store(hv, "transfd", 7, newSViv(dcc->transfd), 0);
hv_store(hv, "skipped", 7, newSViv(dcc->skipped), 0);
hv_store(hv, "starttime", 9, newSViv(dcc->starttime), 0);
XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));

29
src/perl/irc/Flood.xs Normal file
View File

@ -0,0 +1,29 @@
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server
void
autoignore_add(server, nick, level)
Irssi::Irc::Server server
char *nick
int level
int
autoignore_remove(server, mask, level)
Irssi::Irc::Server server
char *mask
int level
#*******************************
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Autoignore
#*******************************
void
values(ai)
Irssi::Irc::Autoignore ai
PREINIT:
HV *hv;
PPCODE:
hv = newHV();
hv_store(hv, "nick", 4, new_pv(ai->nick), 0);
hv_store(hv, "timeleft", 8, newSViv(ai->timeleft), 0);
hv_store(hv, "level", 5, newSViv(ai->level), 0);
XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));

74
src/perl/irc/Ignore.xs Normal file
View File

@ -0,0 +1,74 @@
MODULE = Irssi::Irc PACKAGE = Irssi::Irc
void
ignores()
PREINIT:
GSList *tmp;
HV *stash;
PPCODE:
stash = gv_stashpv("Irssi::Irc::Ignore", 0);
for (tmp = servers; tmp != NULL; tmp = tmp->next) {
XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
}
int
ignore_check(nick, host, channel, text, level)
char *nick
char *host
char *channel
char *text
int level
CODE:
RETVAL = ignore_check(NULL, nick, host, channel, text, level);
OUTPUT:
RETVAL
#*******************************
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server
#*******************************
int
ignore_check(server, nick, host, channel, text, level)
Irssi::Irc::Server server
char *nick
char *host
char *channel
char *text
int level
#*******************************
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Ignore PREFIX = ignore_
#*******************************
void
values(ignore)
Irssi::Irc::Ignore ignore
PREINIT:
HV *hv;
AV *av;
char **tmp;
PPCODE:
hv = newHV();
hv_store(hv, "mask", 4, new_pv(ignore->mask), 0);
hv_store(hv, "servertag", 9, new_pv(ignore->servertag), 0);
av = newAV();
for (tmp = ignore->channels; *tmp != NULL; tmp++) {
av_push(av, new_pv(*tmp));
}
hv_store(hv, "channels", 8, newRV_noinc((SV*)av), 0);
hv_store(hv, "pattern", 7, new_pv(ignore->pattern), 0);
hv_store(hv, "level", 5, newSViv(ignore->level), 0);
hv_store(hv, "except_level", 12, newSViv(ignore->except_level), 0);
hv_store(hv, "regexp", 6, newSViv(ignore->regexp), 0);
hv_store(hv, "fullword", 8, newSViv(ignore->fullword), 0);
XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
void
ignore_add_rec(rec)
Irssi::Irc::Ignore rec
void
ignore_update_rec(rec)
Irssi::Irc::Ignore rec

29
src/perl/irc/Irc.pm Normal file
View File

@ -0,0 +1,29 @@
#
# Perl interface to irssi functions.
#
package Irssi::Irc;
use strict;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
$VERSION = "0.20";
require Exporter;
require DynaLoader;
@ISA = qw(Exporter DynaLoader);
@EXPORT = qw();
@EXPORT_OK = qw();
bootstrap Irssi::Irc $VERSION;
@Irssi::Irc::Chatnet::ISA = qw(Irssi::Chatnet);
@Irssi::Irc::Server::ISA = qw(Irssi::Server);
@Irssi::Irc::ServerConnect::ISA = qw(Irssi::ServerConnect);
@Irssi::Irc::ServerSetup::ISA = qw(Irssi::ServerSetup);
@Irssi::Irc::Channel::ISA = qw(Irssi::Channel);
@Irssi::Irc::Query::ISA = qw(Irssi::Query);
1;

17
src/perl/irc/Irc.xs Normal file
View File

@ -0,0 +1,17 @@
#include "module.h"
MODULE = Irssi::Irc PACKAGE = Irssi::Irc
PROTOTYPES: ENABLE
INCLUDE: Bans.xs
INCLUDE: Ignore.xs
INCLUDE: IrcServer.xs
INCLUDE: IrcChannel.xs
INCLUDE: IrcQuery.xs
INCLUDE: Modes.xs
INCLUDE: Netsplit.xs
INCLUDE: Dcc.xs
INCLUDE: Flood.xs
INCLUDE: Notifylist.xs

View File

@ -0,0 +1,44 @@
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Channel PREFIX = irc_channel_
void
bans(channel)
Irssi::Irc::Channel channel
PREINIT:
GSList *tmp;
HV *stash;
PPCODE:
stash = gv_stashpv("Irssi::Irc::Ban", 0);
for (tmp = channel->banlist; tmp != NULL; tmp = tmp->next) {
XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
}
void
ebans(channel)
Irssi::Irc::Channel channel
PREINIT:
GSList *tmp;
HV *stash;
PPCODE:
stash = gv_stashpv("Irssi::Irc::Ban", 0);
for (tmp = channel->ebanlist; tmp != NULL; tmp = tmp->next) {
XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
}
void
invites(channel)
Irssi::Irc::Channel channel
PREINIT:
GSList *tmp;
HV *stash;
PPCODE:
for (tmp = channel->invitelist; tmp != NULL; tmp = tmp->next) {
XPUSHs(new_pv(tmp->data));
}
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server PREFIX = irc_
Irssi::Irc::Channel
irc_channel_create(server, name, automatic)
Irssi::Irc::Server server
char *name
int automatic

7
src/perl/irc/IrcQuery.xs Normal file
View File

@ -0,0 +1,7 @@
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server PREFIX = irc_
Irssi::Irc::Query
irc_query_create(server, nick, automatic)
Irssi::Irc::Server server
char *nick
int automatic

37
src/perl/irc/IrcServer.xs Normal file
View File

@ -0,0 +1,37 @@
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server PREFIX = irc_server_
void
values(server)
Irssi::Irc::Server server
PREINIT:
HV *hv;
PPCODE:
hv = newHV();
perl_server_fill_hash(hv, (SERVER_REC *) server);
hv_store(hv, "real_address", 12, new_pv(server->real_address), 0);
hv_store(hv, "usermode", 8, new_pv(server->usermode), 0);
hv_store(hv, "userhost", 8, new_pv(server->userhost), 0);
XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
char *
irc_server_get_channels(server)
Irssi::Irc::Server server
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Connect PREFIX = irc_server_
void
values(conn)
Irssi::Irc::Connect conn
PREINIT:
HV *hv;
PPCODE:
hv = newHV();
perl_server_connect_fill_hash(hv, (SERVER_CONNECT_REC *) conn);
hv_store(hv, "alternate_nick", 14, new_pv(conn->alternate_nick), 0);
XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
Irssi::Irc::Server
irc_server_connect(conn)
Irssi::Irc::Connect conn

View File

@ -0,0 +1,6 @@
use ExtUtils::MakeMaker;
WriteMakefile('NAME' => 'Irssi::Irc',
'LIBS' => '',
'INC' => '-I@top_srcdir@/src -I@top_srcdir@/src/core -I@top_srcdir@/src/irc/core -I@top_srcdir@/src/irc @GLIB_CFLAGS@',
'VERSION_FROM' => '@srcdir@/Irc.pm');

67
src/perl/irc/Modes.xs Normal file
View File

@ -0,0 +1,67 @@
MODULE = Irssi::Irc PACKAGE = Irssi::Irc
char *
modes_join(old, mode)
char *old
char *mode
#*******************************
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server
#*******************************
void
channel_set_singlemode(server, channel, nicks, mode)
Irssi::Irc::Server server
char *channel
char *nicks
char *mode
void
channel_set_mode(server, channel, mode)
Irssi::Irc::Server server
char *channel
char *mode
#*******************************
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Channel PREFIX = channel_
#*******************************
void
parse_channel_modes(channel, setby, modestr)
Irssi::Irc::Channel channel
char *setby
char *modestr
Irssi::Irc::Ban
banlist_add(channel, ban, nick, time)
Irssi::Irc::Channel channel
char *ban
char *nick
time_t time
void
banlist_remove(channel, ban)
Irssi::Irc::Channel channel
char *ban
Irssi::Irc::Ban
banlist_exception_add(channel, ban, nick, time)
Irssi::Irc::Channel channel
char *ban
char *nick
time_t time
void
banlist_exception_remove(channel, ban)
Irssi::Irc::Channel channel
char *ban
void
invitelist_add(channel, mask)
Irssi::Irc::Channel channel
char *mask
void
invitelist_remove(channel, mask)
Irssi::Irc::Channel channel
char *mask

51
src/perl/irc/Netsplit.xs Normal file
View File

@ -0,0 +1,51 @@
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server
Irssi::Irc::Netsplit
netsplit_find(server, nick, address)
Irssi::Irc::Server server
char *nick
char *address
Irssi::Nick
netsplit_find_channel(server, nick, address, channel)
Irssi::Irc::Server server
char *nick
char *address
char *channel
#*******************************
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Netsplit
#*******************************
void
values(netsplit)
Irssi::Irc::Netsplit netsplit
PREINIT:
HV *hv, *stash;
PPCODE:
hv = newHV();
hv_store(hv, "nick", 4, new_pv(netsplit->nick), 0);
hv_store(hv, "address", 7, new_pv(netsplit->address), 0);
hv_store(hv, "destroy", 7, newSViv(netsplit->destroy), 0);
stash = gv_stashpv("Irssi::Irc::Netsplitserver", 0);
hv_store(hv, "server", 6, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(netsplit->server))), stash), 0);
/*FIXME: add GSList *channels;*/
XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
#*******************************
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Netsplitserver
#*******************************
void
values(rec)
Irssi::Irc::Netsplitserver rec
PREINIT:
HV *hv;
PPCODE:
hv = newHV();
hv_store(hv, "server", 6, new_pv(rec->server), 0);
hv_store(hv, "destserver", 10, new_pv(rec->destserver), 0);
hv_store(hv, "count", 5, newSViv(rec->count), 0);
XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));

View File

@ -0,0 +1,71 @@
MODULE = Irssi::Irc PACKAGE = Irssi::Irc
void
notifies()
PREINIT:
GSList *tmp;
HV *stash;
PPCODE:
stash = gv_stashpv("Irssi::Irc::Notifylist", 0);
for (tmp = notifies; tmp != NULL; tmp = tmp->next) {
XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
}
Irssi::Irc::Notifylist
notifylist_add(mask, ircnets, away_check, idle_check_time)
char *mask
char *ircnets
int away_check
int idle_check_time
void
notifylist_remove(mask)
char *mask
Irssi::Irc::Server
notifylist_ison(nick, serverlist)
char *nick
char *serverlist
Irssi::Irc::Notifylist
notifylist_find(mask, ircnet)
char *mask
char *ircnet
#*******************************
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server
#*******************************
int
notifylist_ison_server(server, nick)
Irssi::Irc::Server server
char *nick
#*******************************
MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Notifylist PREFIX = notifylist_
#*******************************
void
values(notify)
Irssi::Irc::Notifylist notify
PREINIT:
HV *hv;
AV *av;
char **tmp;
PPCODE:
hv = newHV();
hv_store(hv, "mask", 4, new_pv(notify->mask), 0);
hv_store(hv, "away_check", 10, newSViv(notify->away_check), 0);
hv_store(hv, "idle_check_time", 15, newSViv(notify->idle_check_time), 0);
av = newAV();
for (tmp = notify->ircnets; *tmp != NULL; tmp++) {
av_push(av, new_pv(*tmp));
}
hv_store(hv, "ircnets", 7, newRV_noinc((SV*)av), 0);
XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
int
notifylist_ircnets_match(rec, ircnet)
Irssi::Irc::Notifylist rec
char *ircnet

28
src/perl/irc/module.h Normal file
View File

@ -0,0 +1,28 @@
#include "../core/module.h"
#include "irc-servers.h"
#include "irc-channels.h"
#include "irc-queries.h"
#include "bans.h"
#include "modes.h"
#include "mode-lists.h"
#include "netsplit.h"
#include "ignore.h"
#include "dcc/dcc.h"
#include "flood/autoignore.h"
#include "notifylist/notifylist.h"
typedef IRC_SERVER_REC *Irssi__Irc__Server;
typedef IRC_SERVER_CONNECT_REC *Irssi__Irc__Connect;
typedef IRC_CHANNEL_REC *Irssi__Irc__Channel;
typedef QUERY_REC *Irssi__Irc__Query;
typedef BAN_REC *Irssi__Irc__Ban;
typedef DCC_REC *Irssi__Irc__Dcc;
typedef NETSPLIT_REC *Irssi__Irc__Netsplit;
typedef NETSPLIT_SERVER_REC *Irssi__Irc__Netsplitserver;
typedef AUTOIGNORE_REC *Irssi__Irc__Autoignore;
typedef NOTIFYLIST_REC *Irssi__Irc__Notifylist;
typedef IGNORE_REC *Irssi__Irc__Ignore;

14
src/perl/irc/typemap Normal file
View File

@ -0,0 +1,14 @@
TYPEMAP
Irssi::Irc::Server T_PTROBJ
Irssi::Irc::Connect T_PTROBJ
Irssi::Irc::Channel T_PTROBJ
Irssi::Irc::Query T_PTROBJ
Irssi::Irc::Ban T_PTROBJ
Irssi::Irc::Dcc T_PTROBJ
Irssi::Irc::Netsplit T_PTROBJ
Irssi::Irc::Netsplitserver T_PTROBJ
Irssi::Irc::Autoignore T_PTROBJ
Irssi::Irc::Notifylist T_PTROBJ
Irssi::Irc::Ignore T_PTROBJ
Irssi::Nick T_PTROBJ

View File

@ -32,6 +32,7 @@
#include "signals.h"
#include "commands.h"
#include "misc.h"
#include "perl-common.h"
/* For compatibility with perl 5.004 and older */
#ifndef ERRSV
@ -667,8 +668,9 @@ static void irssi_perl_autorun(void)
void irssi_perl_init(void)
{
perl_scripts = NULL;
perl_common_init();
perl_scripts = NULL;
command_bind("run", NULL, (SIGNAL_FUNC) cmd_run);
command_bind_first("unload", NULL, (SIGNAL_FUNC) cmd_unload);
command_bind("perlflush", NULL, (SIGNAL_FUNC) cmd_perlflush);
@ -682,6 +684,7 @@ void irssi_perl_init(void)
void irssi_perl_deinit(void)
{
irssi_perl_stop();
perl_common_deinit();
if (signal_grabbed) signal_remove("signal", (SIGNAL_FUNC) sig_signal);
if (siglast_grabbed) signal_remove("last signal", (SIGNAL_FUNC) sig_lastsignal);

240
src/perl/perl-common.c Normal file
View File

@ -0,0 +1,240 @@
/*
perl-common.c : irssi
Copyright (C) 2000 Timo Sirainen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <EXTERN.h>
#ifndef _SEM_SEMUN_UNDEFINED
#define HAS_UNION_SEMUN
#endif
#include <perl.h>
#undef _
#undef PACKAGE
#include "module.h"
#include "modules.h"
#include "signals.h"
#include "chat-protocols.h"
#include "servers.h"
#include "channels.h"
#include "queries.h"
#include "window-item-def.h"
#include "perl-common.h"
GHashTable *perl_stashes;
HV *irssi_get_stash_item(int type, int chat_type)
{
char *str;
str = g_hash_table_lookup(perl_stashes,
GINT_TO_POINTER(type | (chat_type << 24)));
g_return_val_if_fail(str != NULL, gv_stashpv("", 0));
return gv_stashpv(str, 1);
}
void perl_connect_fill_hash(HV *hv, SERVER_CONNECT_REC *conn)
{
char *type, *chat_type;
type = "SERVER CONNECT";
chat_type = (char *) chat_protocol_find_id(conn->chat_type)->name;
hv_store(hv, "type", 4, new_pv(type), 0);
hv_store(hv, "chat_type", 9, new_pv(chat_type), 0);
hv_store(hv, "address", 7, new_pv(conn->address), 0);
hv_store(hv, "port", 4, newSViv(conn->port), 0);
hv_store(hv, "chatnet", 7, new_pv(conn->chatnet), 0);
hv_store(hv, "password", 8, new_pv(conn->password), 0);
hv_store(hv, "wanted_nick", 11, new_pv(conn->nick), 0);
hv_store(hv, "username", 8, new_pv(conn->username), 0);
hv_store(hv, "realname", 8, new_pv(conn->realname), 0);
}
void perl_server_fill_hash(HV *hv, SERVER_REC *server)
{
char *type, *chat_type;
HV *stash;
perl_connect_fill_hash(hv, server->connrec);
type = "SERVER";
chat_type = (char *) chat_protocol_find_id(server->chat_type)->name;
hv_store(hv, "type", 4, new_pv(type), 0);
hv_store(hv, "chat_type", 9, new_pv(chat_type), 0);
hv_store(hv, "connect_time", 12, newSViv(server->connect_time), 0);
hv_store(hv, "real_connect_time", 17, newSViv(server->real_connect_time), 0);
hv_store(hv, "tag", 3, new_pv(server->tag), 0);
hv_store(hv, "nick", 4, new_pv(server->nick), 0);
hv_store(hv, "connected", 9, newSViv(server->connected), 0);
hv_store(hv, "connection_lost", 15, newSViv(server->connection_lost), 0);
stash = gv_stashpv("Irssi::Rawlog", 0);
hv_store(hv, "rawlog", 6, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(server->rawlog))), stash), 0);
hv_store(hv, "version", 7, new_pv(server->version), 0);
hv_store(hv, "away_reason", 11, new_pv(server->away_reason), 0);
hv_store(hv, "last_invite", 11, new_pv(server->last_invite), 0);
hv_store(hv, "server_operator", 15, newSViv(server->server_operator), 0);
hv_store(hv, "usermode_away", 13, newSViv(server->usermode_away), 0);
hv_store(hv, "banned", 6, newSViv(server->banned), 0);
hv_store(hv, "lag", 3, newSViv(server->lag), 0);
}
void perl_window_item_fill_hash(HV *hv, WI_ITEM_REC *item)
{
char *type, *chat_type;
type = (char *) module_find_id_str("WINDOW ITEM", item->type);
chat_type = (char *) chat_protocol_find_id(item->chat_type)->name;
hv_store(hv, "type", 4, new_pv(type), 0);
hv_store(hv, "chat_type", 9, new_pv(chat_type), 0);
if (item->server != NULL) {
hv_store(hv, "server", 6, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(item->server))),
irssi_get_stash(item->server)), 0);
}
hv_store(hv, "name", 4, new_pv(item->name), 0);
hv_store(hv, "createtime", 10, newSViv(item->createtime), 0);
hv_store(hv, "new_data", 8, newSViv(item->new_data), 0);
hv_store(hv, "last_color", 10, newSViv(item->last_color), 0);
}
void perl_channel_fill_hash(HV *hv, CHANNEL_REC *channel)
{
perl_window_item_fill_hash(hv, (WI_ITEM_REC *) channel);
hv_store(hv, "topic", 5, new_pv(channel->topic), 0);
hv_store(hv, "no_modes", 8, newSViv(channel->no_modes), 0);
hv_store(hv, "mode", 4, new_pv(channel->mode), 0);
hv_store(hv, "limit", 5, newSViv(channel->limit), 0);
hv_store(hv, "key", 3, new_pv(channel->key), 0);
hv_store(hv, "chanop", 6, newSViv(channel->chanop), 0);
hv_store(hv, "names_got", 9, newSViv(channel->names_got), 0);
hv_store(hv, "wholist", 7, newSViv(channel->wholist), 0);
hv_store(hv, "synced", 6, newSViv(channel->synced), 0);
hv_store(hv, "joined", 6, newSViv(channel->joined), 0);
hv_store(hv, "left", 4, newSViv(channel->left), 0);
hv_store(hv, "kicked", 6, newSViv(channel->kicked), 0);
}
void perl_query_fill_hash(HV *hv, QUERY_REC *query)
{
perl_window_item_fill_hash(hv, (WI_ITEM_REC *) query);
hv_store(hv, "address", 7, new_pv(query->address), 0);
hv_store(hv, "server_tag", 10, new_pv(query->server_tag), 0);
hv_store(hv, "unwanted", 8, newSViv(query->unwanted), 0);
}
static void perl_register_protocol(CHAT_PROTOCOL_REC *rec)
{
char *name, stash[100];
int type, chat_type;
chat_type = chat_protocol_lookup(rec->name);
g_return_if_fail(chat_type >= 0);
name = g_strdup(rec->name);
g_strdown(name+1);
/* window items: channel, query */
type = module_get_uniq_id_str("WINDOW ITEM TYPE", "CHANNEL");
g_snprintf(stash, sizeof(stash), "Irssi::%s::Channel", name);
irssi_add_stash(type, chat_type, stash);
type = module_get_uniq_id_str("WINDOW ITEM TYPE", "QUERY");
g_snprintf(stash, sizeof(stash), "Irssi::%s::Query", name);
irssi_add_stash(type, chat_type, stash);
/* server specific */
type = module_get_uniq_id("SERVER", 0);
g_snprintf(stash, sizeof(stash), "Irssi::%s::Server", name);
irssi_add_stash(type, chat_type, stash);
type = module_get_uniq_id("SERVER CONNECT", 0);
g_snprintf(stash, sizeof(stash), "Irssi::%s::Connect", name);
irssi_add_stash(type, chat_type, stash);
g_free(name);
}
static int perl_free_protocol(void *key, void *value, void *chat_type)
{
if ((GPOINTER_TO_INT(key) >> 24) == GPOINTER_TO_INT(chat_type)) {
g_free(value);
return TRUE;
}
return FALSE;
}
static void perl_unregister_protocol(CHAT_PROTOCOL_REC *rec)
{
g_hash_table_foreach_remove(perl_stashes, (GHRFunc) perl_free_protocol,
GINT_TO_POINTER(rec->id));
}
static void free_perl_stash(void *key, void *value)
{
g_free(value);
}
static void sig_protocol_created(CHAT_PROTOCOL_REC *rec)
{
perl_register_protocol(rec);
}
static void sig_protocol_destroyed(CHAT_PROTOCOL_REC *rec)
{
perl_unregister_protocol(rec);
}
void perl_common_init(void)
{
perl_stashes = g_hash_table_new((GHashFunc) g_direct_hash,
(GCompareFunc) g_direct_equal);
g_slist_foreach(chat_protocols, (GFunc) perl_register_protocol, NULL);
signal_add("chat protocol created", (SIGNAL_FUNC) sig_protocol_created);
signal_add("chat protocol destroyed", (SIGNAL_FUNC) sig_protocol_destroyed);
}
void perl_common_deinit(void)
{
g_hash_table_foreach(perl_stashes, (GHFunc) free_perl_stash, NULL);
g_hash_table_destroy(perl_stashes);
signal_remove("chat protocol created", (SIGNAL_FUNC) sig_protocol_created);
signal_remove("chat protocol destroyed", (SIGNAL_FUNC) sig_protocol_destroyed);
}

21
src/perl/perl-common.h Normal file
View File

@ -0,0 +1,21 @@
#ifndef __PERL_COMMON_H
#define __PERL_COMMON_H
#define new_pv(a) \
(newSVpv((a) == NULL ? "" : (a), (a) == NULL ? 0 : strlen(a)))
extern GHashTable *perl_stashes;
HV *irssi_get_stash_item(int type, int chat_type);
#define irssi_get_stash(item) \
irssi_get_stash_item((item)->type, (item)->chat_type)
#define irssi_add_stash(type, chat_type, stash) \
g_hash_table_insert(perl_stashes, GINT_TO_POINTER(type | \
(chat_type << 24)), g_strdup(stash))
void perl_common_init(void);
void perl_common_deinit(void);
#endif