Compare commits

..

5 Commits

Author SHA1 Message Date
52a685238c Fix comment typo 2016-03-19 13:01:28 -04:00
951b7563bf Consistently use bools 2016-03-19 13:01:28 -04:00
2ea12bce1d Don't mark own messages as new message 2016-03-19 13:01:28 -04:00
382908ab6d Add support for self-message
See: https://github.com/ircv3/ircv3-specifications/blob/master/extensions/self-message-3.2.md
2016-03-19 13:01:28 -04:00
e3838a6e67 Clean up finding correct context for messages/actions
Don't ever print actions in the wrong tab
and warn if you can't find the correct one
2016-03-19 13:00:53 -04:00
238 changed files with 106047 additions and 116395 deletions

View File

@ -1,19 +0,0 @@
# EditorConfig is awesome: http://EditorConfig.org
# top-most EditorConfig file
root = true
[*.{c,cpp,h,hpp,m}]
indent_style = tab
indent_size = 4
end_of_line = lf
[*.cs]
indent_style = space
indent_size = 4
end_of_line = lf
[{meson.build,meson_options.txt}]
indent_size = 2
indent_style = space
insert_final_newline = true

79
.gitignore vendored
View File

@ -1,9 +1,79 @@
/build
builddir/
# git ignore file
# Unix generated files
.deps/
.libs/
.dirstamp
Makefile
Makefile.in
aclocal.m4
autom4te.cache/
compile
ar-lib
confdefs.h
conftest
conftest.c
conftest.err
config.guess
config.h.in
config.h.in~
config.h
config.log
config.status
config.sub
config-win32.h
configure
configure.tmp
depcomp
doxygen*.tmp
html/
install-sh
intl/
libtool
ltmain.sh
m4/
missing
plugins/perl/irc.pm.h
plugins/perl/xchat.pm.h
plugins/perl/hexchat.pm.h
po/Makefile.in.in
po/POTFILES
po/remove-potcdate.sed
po/stamp-*
osx/Info.plist
data/man/hexchat.1
data/pkgconfig/hexchat-plugin.pc
data/misc/hexchat.appdata.xml
data/misc/hexchat.desktop
data/misc/htm.desktop
src/common/dbus/example
src/common/dbus/org.hexchat.service.service
src/common/dbus/remote-object-glue.h
src/common/make-te
src/common/marshal.*
src/common/textenums.h
src/common/textevents.h
src/fe-gtk/hexchat
src/fe-gtk/hexchat.rc
src/fe-gtk/resources.c
src/fe-gtk/resources.h
src/fe-text/hexchat-text
src/htm/Main.resources
src/htm/thememan.exe
src/htm/thememan.exe.config
src/htm/thememan.exe.mdb
src/htm/thememan
stamp-h1
*.a
*.o
*.la
*.lo
*.gmo
*.mo
*.po~
*.pot
*.patch
tags
src/**/*.plist
# Win32 generated files
plugins/wmpa/wmpa_h.h
plugins/wmpa/wmpa_i.c
@ -20,10 +90,9 @@ resource.h
*.suo
*.user
*.exe
# OSX
#OSX
osx/HexChat.app
osx/.HexChat.app
po/.intltool-merge-cache
*.zip
*.dmg
*.VC.db
*.VC.opendb

View File

@ -1,10 +0,0 @@
Berke Viktor <github.bviktor@outlook.com> <berkeviktor@aol.com>
Berke Viktor <github.bviktor@outlook.com> <bviktor@hexchat.org>
Berke Viktor <github.bviktor@outlook.com> <bviktor@outlook.com>
Berke Viktor <github.bviktor@outlook.com> berkeviktor@aol.com
Patrick Griffis <tingping@tingping.se> TingPing <tingping@fedoraproject.org>
Patrick Griffis <tingping@tingping.se> TingPing <tingping@tingping.se>
Patrick Griffis <tingping@tingping.se> TingPing <tngpng@gmail.com>
Patrick Griffis <tingping@tingping.se> TingPing <TingPing@users.noreply.github.com>
Arnav Singh <arnavion@gmail.com> Arnavion
Eustachy Kapusta <Eustachy.kapusta@gmail.com> tomek

View File

@ -1,16 +1,10 @@
sudo: required
services: docker
before_install:
- docker pull ubuntu:16.04
- docker run --privileged --cidfile=/tmp/cid ubuntu:16.04 /bin/sh -c 'apt-get update && apt-get install -y meson/xenial-backports libcanberra-dev libdbus-glib-1-dev libglib2.0-dev libgtk2.0-dev libluajit-5.1-dev libnotify-dev libpci-dev libperl-dev libproxy-dev libssl-dev python3-dev mono-devel desktop-file-utils'
- docker commit `cat /tmp/cid` hexchat/ubuntu-ci
- rm -f /tmp/cid
install:
- docker run -d --privileged --cidfile=/tmp/cid --volume=${PWD}:/opt/hexchat hexchat/ubuntu-ci /bin/systemd --system
sudo: false
language: c
cache: apt
compiler: clang
script:
- docker exec `cat /tmp/cid` /bin/sh -c 'meson /opt/hexchat /opt/hexchat-build -Dwith-text=true -Dwith-theme-manager=true && ninja -C /opt/hexchat-build install && ninja -C /opt/hexchat-build test'
after_script:
- docker kill `cat /tmp/cid`
- ./autogen.sh --enable-textfe --with-theme-manager --enable-static-analysis
- make V=1 -j$(nproc)
notifications:
irc:
channels: "chat.freenode.net#hexchat-devel"
@ -18,3 +12,23 @@ notifications:
on_success: change
matrix:
fast_finish: true
addons:
apt:
packages:
- automake
- autoconf-archive
- imagemagick
- intltool
- libcanberra-dev
- libdbus-glib-1-dev
- libglib2.0-dev
- libgtk2.0-dev
- libnotify-dev
- libpci-dev
- libperl-dev
- libproxy-dev
- libssl-dev
- libtool
- monodevelop
- mono-devel
- python-dev

7
Makefile.am Normal file
View File

@ -0,0 +1,7 @@
## Process this file with automake to produce Makefile.in
ACLOCAL_AMFLAGS = -I m4
SUBDIRS = po src plugins data
EXTRA_DIST = autogen.sh Doxyfile readme.md

27
autogen.sh Executable file
View File

@ -0,0 +1,27 @@
#!/bin/sh
# Run this to generate all the initial makefiles, etc.
srcdir=`dirname $0`
test -z "$srcdir" && srcdir=.
(test -f $srcdir/src/common/hexchat.c) || {
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the top-level directory"
exit 1
}
aclocal --install -I m4 || exit 1
glib-gettextize --force --copy || exit 1
intltoolize --force --copy --automake || exit 1
autoreconf --force --install -Wno-portability || exit 1
if [ "$NOCONFIGURE" = "" ]; then
$srcdir/configure "$@" || exit 1
if [ "$1" = "--help" ]; then exit 0 else
echo "Now type \`make\' to compile" || exit 1
fi
else
echo "Skipping configure process."
fi
set +x

762
configure.ac Normal file
View File

@ -0,0 +1,762 @@
dnl Process this file with autoconf to produce a configure script.
AC_INIT([HexChat],[2.12.0])
AC_PREREQ([2.64])
AC_COPYRIGHT([Copyright (C) 1998-2010 Peter Zelezny])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([configure.ac])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([1.11.1 dist-xz no-dist-gzip subdir-objects no-define foreign])
AM_SILENT_RULES([yes])
AC_DEFUN([HEX_CHECK_MACRO], [m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined. Is ]$2[ installed?])])])
HEX_CHECK_MACRO([AX_APPEND_COMPILE_FLAGS], [autoconf-archive])
HEX_CHECK_MACRO([PKG_PROG_PKG_CONFIG], [pkg-config])
AX_IS_RELEASE([minor-version])
AX_CHECK_ENABLE_DEBUG([yes])
AC_USE_SYSTEM_EXTENSIONS
AM_MAINTAINER_MODE([enable])
AC_PROG_CC
AM_PROG_CC_C_O
AC_PROG_CPP
AC_PROG_OBJC
AM_PROG_AS
AM_PROG_AR
LT_PREREQ([2.2.6])
LT_INIT([disable-static])
AC_PATH_PROG(MDTOOL, mdtool, no)
PKG_PROG_PKG_CONFIG
dnl -----------------------------------------------------------
dnl Language Support
dnl -----------------------------------------------------------
GETTEXT_PACKAGE=hexchat
AC_SUBST(GETTEXT_PACKAGE)
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Gettext package name])
IT_PROG_INTLTOOL([0.40.0])
AM_GLIB_GNU_GETTEXT
dnl displaced from acconfig.h
AH_VERBATIM([OLD_PERL],[#undef OLD_PERL])
AH_VERBATIM([PREFIX],[#undef PREFIX])
AH_VERBATIM([HEXCHATLIBDIR],[#undef HEXCHATLIBDIR])
AH_VERBATIM([HEXCHATSHAREDIR],[#undef HEXCHATSHAREDIR])
AH_VERBATIM([USE_LIBPROXY],[#undef USE_LIBPROXY])
AH_VERBATIM([HAVE_LIBPCI],[#undef HAVE_LIBPCI])
AH_VERBATIM([HAVE_ISO_CODES],[#undef HAVE_ISO_CODES])
AH_VERBATIM([HAVE_GTK_MAC],[#undef HAVE_GTK_MAC])
AH_VERBATIM([USE_LIBNOTIFY],[#undef USE_LIBNOTIFY])
AH_VERBATIM([USE_LIBCANBERRA],[#undef USE_LIBCANBERRA])
AH_VERBATIM([USE_OPENSSL],[#undef USE_OPENSSL])
AH_VERBATIM([USE_PLUGIN],[#undef USE_PLUGIN])
AH_VERBATIM([USE_SIGACTION],[#undef USE_SIGACTION])
AH_VERBATIM([USING_FREEBSD],[#undef USING_FREEBSD])
AH_VERBATIM([USING_LINUX],[#undef USING_LINUX])
AH_VERBATIM([socklen_t],[#undef socklen_t])
AH_VERBATIM([USE_DBUS],[#undef USE_DBUS])
AC_PATH_PROG(sedpath, sed)
AS_IF([test "_$sedpath" = _], [
AC_MSG_ERROR(Cannot find sed: I need it!)
])
AC_PATH_PROG(unamepath, uname)
AS_IF([test "_$unamepath" = _], [
system="unknown"
], [
AC_MSG_CHECKING(system type)
system=`$unamepath -s`
AC_MSG_RESULT($system)
AS_IF([test "$system" = "Linux"], [
AC_DEFINE(USING_LINUX)
], [test "$system" = "FreeBSD"], [
AC_DEFINE(USING_FREEBSD)
])
])
platform_win32=no
platform_osx=no
AS_CASE([$host_os],
[*mingw*|*cygwin*|*msys*], [
platform_win32=yes
],
[darwin*], [
platform_osx=yes
]
)
dnl *********************************************************************
dnl ** configure switches ***********************************************
dnl *********************************************************************
AC_ARG_ENABLE(openssl,
[AS_HELP_STRING([--enable-openssl[=PATH]],[enable use of openSSL])],
openssl=$enableval, openssl=yes)
AC_ARG_ENABLE(gtkfe,
[AS_HELP_STRING([--disable-gtkfe],[disable building gtk frontend])],
gtkfe=$enableval, gtkfe=yes)
AC_ARG_ENABLE(textfe,
[AS_HELP_STRING([--enable-textfe],[build the text frontend (default: no)])],
textfe=$enableval, textfe=no)
AC_ARG_ENABLE(python,
[AS_HELP_STRING([--enable-python=pythonversion],[build the python plugin; possible values: "python2", "python3" or specific such as "python3.3" (default on, python2)])],
python=$enableval, python=python2)
AS_IF([test "x$python" = "xyes"], [python=python2])
AC_ARG_ENABLE(perl,
[AS_HELP_STRING([--disable-perl],[don\'t build the perl plugin])],
perl=$enableval, perl=yes)
AC_ARG_ENABLE(perl_old,
[AS_HELP_STRING([--disable-perl_old],[no backwards compatibility for perl plugin])],
perl_old=$enableval, perl_old=yes)
AC_ARG_ENABLE(plugin,
[AS_HELP_STRING([--disable-plugin],[disable plugin support])],
plugin=$enableval, plugin=yes)
AC_ARG_ENABLE(checksum,
[AS_HELP_STRING([--disable-checksum],[disable the Checksum plugin])],
checksum=$enableval, checksum=yes)
AC_ARG_ENABLE(doat,
[AS_HELP_STRING([--disable-doat],[disable the Do At plugin])],
doat=$enableval, doat=yes)
AC_ARG_ENABLE(fishlim,
[AS_HELP_STRING([--disable-fishlim],[disable the FiSHLiM plugin])],
fishlim=$enableval, fishlim=yes)
AC_ARG_ENABLE(sysinfo,
[AS_HELP_STRING([--disable-sysinfo],[disable the SysInfo plugin])],
sysinfo=$enableval, sysinfo=yes)
AC_ARG_ENABLE(dbus,
[AS_HELP_STRING([--disable-dbus],[disable DBUS support])],
dbus=$enableval, dbus=yes)
AC_ARG_ENABLE(libnotify,
[AS_HELP_STRING([--disable-libnotify],[disable libnotify support])],
libnotify=$enableval, libnotify=yes)
AC_ARG_ENABLE(libcanberra,
[AS_HELP_STRING([--disable-libcanberra],[disable libcanberra support])],
libcanberra=$enableval, libcanberra=yes)
AC_ARG_ENABLE(libproxy,
[AS_HELP_STRING([--disable-libproxy],[disable libproxy support (default: auto)])],
libproxy=$enableval, libproxy=auto)
AC_ARG_ENABLE(isocodes,
[AS_HELP_STRING([--disable-isocodes],[disable iso-codes with spell-check])],
isocodes=$enableval, isocodes=yes)
AC_ARG_ENABLE(static-analysis,
[AS_HELP_STRING([--enable-static-analysis],[if using clang run static analysis during build (default: no)])],
analyze=$enableval, analyze=no)
AC_ARG_WITH(theme-manager,
[AS_HELP_STRING([--with-theme-manager],[compile theme manager (needs monodevelop, default: off)])],
theme_manager=$withval, theme_manager=no)
dnl *********************************************************************
dnl ** THEME-MANAGER ****************************************************
dnl *********************************************************************
AS_IF([test "x$theme_manager" != "xno"], [
AS_IF([test "x$MDTOOL" = "xno"], [
AC_MSG_ERROR([No "mdtool" found, you need to install monodevelop!])
])
])
dnl *********************************************************************
dnl ** GLIB *************************************************************
dnl *********************************************************************
AM_PATH_GLIB_2_0([2.32.0], [], [AC_MSG_ERROR([Glib not found!])], [gmodule gobject gio])
COMMON_CFLAGS="$GLIB_CFLAGS -DG_DISABLE_SINGLE_INCLUDES"
COMMON_LIBS="$GLIB_LIBS"
AC_DEFINE([GLIB_VERSION_MIN_REQUIRED], [GLIB_VERSION_2_32], [Dont warn using older APIs])
AC_DEFINE([GLIB_VERSION_MAX_ALLOWED], [GLIB_VERSION_2_32], [Prevents using newer APIs])
dnl *********************************************************************
dnl ** GTK **************************************************************
dnl *********************************************************************
AS_IF([test "$gtkfe" = yes], [
PKG_CHECK_MODULES(GTK, [gtk+-2.0 >= 2.24.0], [
GUI_LIBS="$GUI_LIBS $GTK_LIBS"
GUI_CFLAGS="$GUI_CFLAGS $GTK_CFLAGS -DGDK_PIXBUF_DISABLE_SINGLE_INCLUDES -DGTK_DISABLE_SINGLE_INCLUDES -DGTK_DISABLE_DEPRECATED"
], [
gtkfe=no
])
])
dnl *********************************************************************
dnl ** MAC_INTEGRATION **************************************************
dnl *********************************************************************
_gdk_tgt=`$PKG_CONFIG --variable=target gdk-2.0`
AS_IF([test "x$_gdk_tgt" = xquartz], [
PKG_CHECK_MODULES(GTK_MAC, gtk-mac-integration-gtk2, [
GUI_LIBS="$GUI_LIBS $GTK_MAC_LIBS"
GUI_CFLAGS="$GUI_CFLAGS $GTK_MAC_CFLAGS"
AC_DEFINE(HAVE_GTK_MAC)
])
])
dnl *********************************************************************
dnl ** PERL *************************************************************
dnl *********************************************************************
AS_IF([test "$perl" = yes], [
AC_MSG_CHECKING(for plugin interface used by Perl)
AS_IF([test "$plugin" = yes], [
AC_MSG_RESULT([yes])
AX_PERL_EXT_FLAGS([PERL_CFLAGS], [PERL_LDFLAGS])
original_cflags="$CFLAGS"
original_ldflags="$LDFLAGS"
CFLAGS="$PERL_CFLAGS"
LDFLAGS="$PERL_LDFLAGS"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#define PERL_NO_INLINE_FUNCTIONS
#include <EXTERN.h>
#include <perl.h>
]], [[]])],[perl_is_usable=yes],[perl_is_usable=no])
CFLAGS="$original_cflags"
LDFLAGS="$original_ldflags"
AS_IF([test "$perl_is_usable" = "no"], [
AC_MSG_WARN([perl test failed to compile, disabling])
perl=no
], [
AC_MSG_CHECKING([if perl plugin will be backward compatible])
AS_IF([test "$perl_old" = "yes"], [
AC_MSG_RESULT([yes])
AC_DEFINE(OLD_PERL)
], [
AC_MSG_RESULT([no])
])
])
], [
AC_MSG_RESULT([plugins are disabled, use the --enable-plugin option for Perl])
perl=no
])
])
dnl *********************************************************************
dnl ** PYTHON ***********************************************************
dnl *********************************************************************
AS_IF([test "x$python" != xno], [
AC_MSG_CHECKING(for plugin interface used by Python)
AS_IF([test "$plugin" = yes], [
AC_MSG_RESULT([yes])
AS_CASE([$python],
dnl set python2 default here
[python2], [
PYTHON_VERSION=2
AX_PYTHON_DEVEL([>= '2.7'])
],
dnl set python3 default here
[python3], [
PYTHON_VERSION=3
AX_PYTHON_DEVEL([>= '3.3'])
],
dnl add broken versions here
[python2.5|python2.6|python3.1|python3.2], [
AC_MSG_WARN(Unsupported Python version ${python}!)
],
dnl user supplied version
[python*], [
PYTHON_VERSION="${python#python}"
AX_PYTHON_DEVEL()
],[
AC_MSG_WARN(Unsupported Python ${python}!)
]
)
AC_MSG_CHECKING(Python version)
AS_IF([test "$ac_python_version" != ""], [
AC_MSG_RESULT($ac_python_version)
python="python-${ac_python_version}"
], [
AC_MSG_RESULT(Not found)
python=no
])
], [
AC_MSG_RESULT([plugins are disabled, use the --enable-plugin option for Python])
python=no
])
])
dnl *********************************************************************
dnl ** IPv6 *************************************************************
dnl *********************************************************************
dnl purely for Solaris
AC_CHECK_FUNC(select, ,
AC_CHECK_LIB(socket, select, ,
AC_CHECK_LIB(nsl, select, ,
AC_CHECK_LIB(inet, select, ,
AC_CHECK_LIB(cposix, select, ,
AC_CHECK_LIB(net, select, ,
AC_MSG_WARN(i can not find select. you might need to help me)))))))
AC_CHECK_LIB(socket, select)
AC_CHECK_FUNCS(getaddrinfo, have_getaddrinfo=yes)
AC_MSG_CHECKING(whether IPv6 is supported)
AS_IF([test "$have_getaddrinfo" = yes], [
AC_MSG_RESULT(yes)
], [
AC_MSG_RESULT(no)
AC_MSG_ERROR(ipv6 support not found!)
])
dnl *********************************************************************
dnl ** OPENSSL **********************************************************
dnl *********************************************************************
AS_IF([test "$openssl" != no], [
PKG_CHECK_MODULES(OPENSSL, [openssl], [
AC_DEFINE(USE_OPENSSL)
openssl=yes
COMMON_LIBS="$COMMON_LIBS $OPENSSL_LIBS"
COMMON_CFLAGS="$COMMON_CFLAGS $OPENSSL_CFLAGS"
], [
unset openssl_path ac_cv_lib_ssl_SSL_new ac_cv_header_openssl_ssl_h
AS_IF([test "$openssl" != yes], [
openssl_path=$openssl
])
openssl=no
OPENSSL_LIBS="-lcrypto"
AS_IF([test -n "$openssl_path"], [
OPENSSL_LIBS="-L$openssl_path/lib $OPENSSL_LIBS"
])
SAVED_LIBS=$LIBS
LIBS="$LIBS $OPENSSL_LIBS"
AC_CHECK_LIB(ssl, SSL_new, [
AS_IF([test -n "$openssl_path"], [
OPENSSL_CFLAGS="-I$openssl_path/include"
])
SAVED_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS $OPENSSL_CFLAGS"
AC_CHECK_HEADERS(openssl/ssl.h, [
openssl=yes
AC_DEFINE(USE_OPENSSL)
OPENSSL_LIBS="$OPENSSL_LIBS -lssl"
COMMON_LIBS="$COMMON_LIBS $OPENSSL_LIBS"
COMMON_CFLAGS="$COMMON_CFLAGS $OPENSSL_CFLAGS"
])
CFLAGS=$SAVED_CFLAGS
])
LIBS=$SAVED_LIBS
])
])
dnl *********************************************************************
dnl ** LIBPROXY *********************************************************
dnl *********************************************************************
AS_IF([test "x$libproxy" = "xyes" -o "x$libproxy" = "xauto"], [
PKG_CHECK_MODULES([LIBPROXY], [libproxy-1.0], [
COMMON_LIBS="$COMMON_LIBS $LIBPROXY_LIBS"
COMMON_CFLAGS="$COMMON_CFLAGS $LIBPROXY_CFLAGS"
AC_DEFINE(USE_LIBPROXY)
libproxy=yes
], [
AS_IF([test "x$libproxy" = "xyes"], [
AC_MSG_ERROR(Cannot find libproxy!)
])
libproxy=no
])
], [
libproxy=no
])
dnl *********************************************************************
dnl ** PLUGIN ***********************************************************
dnl *********************************************************************
AS_IF([test "$plugin" = yes], [
AC_DEFINE(USE_PLUGIN)
PLUGIN_LDFLAGS="-avoid-version"
AS_IF([test "$platform_win32" = yes], [
PLUGIN_LDFLAGS="$PLUGIN_LDFLAGS -no-undefined"
])
])
dnl *********************************************************************
dnl ** Checksum *********************************************************
dnl *********************************************************************
AS_IF([test "$checksum" != "no"], [
checksum=no
AC_MSG_CHECKING(for plugin interface used by Checksum)
AS_IF([test "$plugin" = yes], [
checksum=yes
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([plugins are disabled, use the --enable-plugin option])
])
])
dnl *********************************************************************
dnl ** DO AT ************************************************************
dnl *********************************************************************
AS_IF([test "$doat" != "no"], [
AC_MSG_CHECKING(for plugin interface used by Do At)
doat=no
AS_IF([test "$plugin" = yes], [
doat=yes
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([plugins are disabled, use the --enable-plugin option for Do At])
])
])
dnl *********************************************************************
dnl ** FiSHLiM **********************************************************
dnl *********************************************************************
AS_IF([test "$fishlim" != "no"], [
fishlim=no
AC_MSG_CHECKING(for plugin interface used by FiSHLiM)
AS_IF([test "$plugin" = yes], [
AC_MSG_RESULT([yes])
AC_MSG_CHECKING(for OpenSSL used by FiSHLiM)
AS_IF([test "$openssl" = yes], [
fishlim=yes
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([OpenSSL cannot be found, use the --enable-openssl option])
])
], [
AC_MSG_RESULT([plugins are disabled, use the --enable-plugin option])
])
])
dnl *********************************************************************
dnl ** SYSINFO **********************************************************
dnl *********************************************************************
AS_IF([test "$sysinfo" != "no"], [
AC_MSG_CHECKING(for plugin interface used by SysInfo)
AS_IF([test "$plugin" = yes], [
AC_MSG_RESULT([yes])
AS_IF([test "$platform_osx" = yes], [
sysinfo=yes
], [
PKG_CHECK_MODULES(LIBPCI, libpci >= 3.0.0, [
sysinfo=yes
AC_DEFINE(HAVE_LIBPCI)
], [sysinfo=no])
])
], [
AC_MSG_RESULT([plugins are disabled, use the --enable-plugin option for SysInfo])
sysinfo=no
])
])
dnl #######################################################################
dnl # Check for DBUS libraries
dnl #######################################################################
AS_IF([test "x$dbus" = "xyes"], [
PKG_CHECK_MODULES(DBUS, [dbus-1 >= 0.60 dbus-glib-1 >= 0.60 gthread-2.0], dbus=yes, [
dbus=no
])
AC_PATH_PROG(DBUS_BINDING_TOOL, dbus-binding-tool, no)
AS_IF([test "x$DBUS_BINDING_TOOL" = "xno" || test "x$dbus" = "xno"], [
dbus="no"
], [
COMMON_LIBS="$COMMON_LIBS $DBUS_LIBS"
COMMON_CFLAGS="$COMMON_CFLAGS $DBUS_CFLAGS"
AC_DEFINE(USE_DBUS)
AS_AC_EXPAND(DBUS_SERVICES_DIR, "$datadir/dbus-1/services")
AC_SUBST(DBUS_SERVICES_DIR)
AC_DEFINE_UNQUOTED(DBUS_SERVICES_DIR, "$DBUS_SERVICES_DIR", [Where services dir for DBUS is])
])
])
dnl *********************************************************************
dnl ** LIBNOTIFY ********************************************************
dnl *********************************************************************
AS_IF([test "x$libnotify" = "xyes"], [
PKG_CHECK_MODULES(LIBNOTIFY, libnotify >= 0.4, [], [
libnotify=no
])
AS_IF([test "$libnotify" != "no"], [
GUI_LIBS="$GUI_LIBS $LIBNOTIFY_LIBS"
GUI_CFLAGS="$GUI_CFLAGS $LIBNOTIFY_CFLAGS"
AC_DEFINE(USE_LIBNOTIFY)
])
])
dnl *********************************************************************
dnl ** LIBCANBERRA ******************************************************
dnl *********************************************************************
AS_IF([test "x$libcanberra" = "xyes"], [
PKG_CHECK_MODULES(LIBCANBERRA, libcanberra >= 0.22, [], [
libcanberra=no
])
AS_IF([test "$libcanberra" != "no"], [
COMMON_LIBS="$COMMON_LIBS $LIBCANBERRA_LIBS"
COMMON_CFLAGS="$COMMON_CFLAGS $LIBCANBERRA_CFLAGS"
AC_DEFINE(USE_LIBCANBERRA)
])
])
dnl *********************************************************************
dnl ** SPELL ************************************************************
dnl *********************************************************************
AS_IF([test "x$isocodes" = "xyes"], [
PKG_CHECK_MODULES(ISOCODES, "iso-codes", [
iso_codes_prefix=`$PKG_CONFIG --variable=prefix iso-codes 2>/dev/null || echo /usr`
AC_MSG_NOTICE([iso-codes prefix: $iso_codes_prefix])
AC_DEFINE_UNQUOTED([ISO_CODES_PREFIX], ["$iso_codes_prefix"], [ISO codes prefix])
AC_DEFINE_UNQUOTED([ISO_CODES_LOCALEDIR], ["$iso_codes_prefix/share/locale"], [ISO codes locale dir])
AC_DEFINE([HAVE_ISO_CODES], [1], [iso-codes available])
], [
isocodes=no
AC_MSG_WARN(iso-codes not found!)
])
])
dnl *********************************************************************
dnl ** Static Analysis **************************************************
dnl *********************************************************************
AS_IF([test "x$analyze" = "xyes"], [
AS_IF([test "$CC" != "clang"], [
AC_MSG_WARN(CC is not clang for static analysis)
analyze=no
])
])
dnl *********************************************************************
dnl ** CONDITIONALS *****************************************************
dnl *********************************************************************
AM_CONDITIONAL(USE_OPENSSL, test "x$openssl" = "xyes")
AM_CONDITIONAL(USE_LIBNOTIFY, test "x$libnotify" = "xyes")
AM_CONDITIONAL(USE_LIBCANBERRA, test "x$libcanberra" = "xyes")
AM_CONDITIONAL(DO_TEXT, test "x$textfe" = "xyes")
AM_CONDITIONAL(DO_GTK, test "x$gtkfe" = "xyes")
AM_CONDITIONAL(DO_PERL, test "x$perl" = "xyes")
AM_CONDITIONAL(DO_PYTHON, test "x$python" != "xno")
AM_CONDITIONAL(DO_PLUGIN, test "x$plugin" = "xyes")
AM_CONDITIONAL(DO_CHECKSUM, test "x$checksum" = "xyes")
AM_CONDITIONAL(DO_DOAT, test "x$doat" = "xyes")
AM_CONDITIONAL(DO_FISHLIM, test "x$fishlim" = "xyes")
AM_CONDITIONAL(DO_SYSINFO, test "x$sysinfo" = "xyes")
AM_CONDITIONAL(DO_STATIC_ANALYSIS, test "x$analyze" = "xyes")
AM_CONDITIONAL(USE_DBUS, test "x$dbus" = "xyes")
AM_CONDITIONAL(HAVE_ISO_CODES, test "x$isocodes" = "xyes")
AM_CONDITIONAL(HAVE_GTK_MAC, test "x$_gdk_tgt" = xquartz)
AM_CONDITIONAL(WITH_TM, test "x$theme_manager" != "xno")
AM_CONDITIONAL(PLATFORM_OSX, test "x$platform_osx" == "xyes")
dnl *********************************************************************
dnl ** CFLAGS ***********************************************************
dnl *********************************************************************
AX_APPEND_COMPILE_FLAGS([\
-pipe \
-funsigned-char \
-fstack-protector-strong \
-fPIE \
-fPIC \
-Wall \
-Wextra \
-Wstrict-prototypes \
-Wno-unused-parameter \
-Wno-sign-compare \
-Wno-pointer-sign \
-Wno-missing-field-initializers \
-Wno-unused-result \
-Werror=format-security \
-Werror=init-self \
-Werror=declaration-after-statement \
-Werror=missing-include-dirs \
-Werror=date-time \
-Werror=implicit-function-declaration \
-Werror=pointer-arith \
])
AX_APPEND_LINK_FLAGS([ \
-pie \
-Wl,-z,relro \
-Wl,-z,now \
])
dnl *********************************************************************
dnl ** FUNCTIONS/LIBS/CFLAGS ********************************************
dnl *********************************************************************
AC_MSG_CHECKING(for modern sigaction)
dnl libc5 on linux and FreeBSD 3.x doesn\'t have siginfo_t
dnl and the sa_sigation field.
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <signal.h>]], [[struct sigaction act;
siginfo_t *si;
act.sa_sigaction = 0;]])],[
AC_MSG_RESULT(yes)
AC_DEFINE(USE_SIGACTION)
],[AC_MSG_RESULT(no)])
AC_CHECK_FUNCS(memrchr)
AC_CHECK_FUNC(gethostbyname, ,
AC_CHECK_LIB(resolv, gethostbyname, ,
AC_CHECK_LIB(nsl, gethostbyname)))
AC_CHECK_FUNC(gethostname, , AC_CHECK_LIB(nsl, gethostname))
dnl necessary for IRIX
AC_CHECK_HEADERS(strings.h)
dnl Check for type in sys/socket.h - from Squid source (GPL)
AC_CACHE_CHECK(for socklen_t, ac_cv_type_socklen_t, [
AC_EGREP_CPP([socklen_t[^a-zA-Z_0-9]], [#include <sys/types.h>
#include <sys/socket.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif],
ac_cv_type_socklen_t=yes,
ac_cv_type_socklen_t=no)
])
AS_IF([test $ac_cv_type_socklen_t = no], [
AC_DEFINE(socklen_t, int)
])
dnl Mac OS X and Darwin use lookupd, which caches DNS queries by default
AC_EGREP_CPP(lookupd, dnl
[#if (defined(__APPLE__) && defined(__MACH__))
lookupd
#endif], AC_DEFINE([LOOKUPD],1,[Define to 1 if the system uses lookupd]))
dnl freebsd needs this
LIBS="$LIBS $INTLLIBS"
GUI_LIBS="$GUI_LIBS $COMMON_LIBS"
dnl make these visible to all Makefiles
AC_SUBST(GUI_LIBS)
AC_SUBST(GUI_CFLAGS)
AC_SUBST(COMMON_LIBS)
AC_SUBST(COMMON_CFLAGS)
AC_SUBST(PERL_CFLAGS)
AC_SUBST(PERL_LDFLAGS)
AC_SUBST(PYTHON_CPPFLAGS)
AC_SUBST(PYTHON_LIBS)
AC_SUBST(DBUS_CFLAGS)
AC_SUBST(DBUS_LIBS)
AC_SUBST(OPENSSL_LIBS)
AC_SUBST(OPENSSL_CFLAGS)
AC_SUBST(PLUGIN_LDFLAGS)
m4_ifdef([PKG_INSTALLDIR], [PKG_INSTALLDIR], AC_SUBST([pkgconfigdir], ${libdir}/pkgconfig))
dnl for plugin.c and pixmaps.c
AS_IF([test "x$prefix" = xNONE], [
prefix="$ac_default_prefix"
])
AS_IF([test "x$exec_prefix" = xNONE], [
exec_prefix="$prefix"
])
AC_DEFINE_UNQUOTED(PREFIX, "${prefix}")
AS_AC_EXPAND(HEXCHATLIBDIR, "${libdir}/hexchat/plugins")
AC_DEFINE_UNQUOTED(HEXCHATLIBDIR, "$HEXCHATLIBDIR")
AS_AC_EXPAND(HEXCHATSHAREDIR, "$datadir")
AC_DEFINE_UNQUOTED(HEXCHATSHAREDIR, "$HEXCHATSHAREDIR")
dnl for plugins/xxx/Makefile.am
hexchatlibdir=${libdir}/hexchat/plugins
AC_SUBST(hexchatlibdir)
AC_CONFIG_FILES([
Makefile
data/Makefile
data/icons/Makefile
data/misc/Makefile
data/man/Makefile
data/man/hexchat.1
data/pkgconfig/Makefile
data/pkgconfig/hexchat-plugin.pc
src/Makefile
src/common/Makefile
src/common/dbus/Makefile
src/fe-text/Makefile
src/fe-gtk/Makefile
src/htm/Makefile
src/htm/thememan
osx/Info.plist
plugins/Makefile
plugins/python/Makefile
plugins/perl/Makefile
plugins/checksum/Makefile
plugins/doat/Makefile
plugins/fishlim/Makefile
plugins/sysinfo/Makefile
po/Makefile.in
])
AC_OUTPUT
echo
echo HexChat $VERSION
echo
echo GTK+ interface ........ : $gtkfe
echo Text interface ........ : $textfe
echo Theme manager ......... : $theme_manager
echo
echo OpenSSL support ....... : $openssl
echo D-Bus support ......... : $dbus
echo libnotify support ..... : $libnotify
echo libcanberra support ... : $libcanberra
echo Plugin interface ...... : $plugin
echo libproxy support ...... : $libproxy
echo
echo Perl .................. : $perl
echo Python ................ : $python
echo
echo Checksum .............. : $checksum
echo Do At ................. : $doat
echo FiSHLiM ............... : $fishlim
echo SysInfo ............... : $sysinfo
echo
echo Debug mode ............ : $enable_debug
echo
echo The binary will be installed in $prefix/bin
echo
if test "$gtkfe" = no; then
echo Warning: The GTK \(GUI\) frontend will not be built.
echo
fi
echo configure complete, now type \'make\' and pray.
echo

8
data/Makefile.am Normal file
View File

@ -0,0 +1,8 @@
SUBDIRS = pkgconfig man
if DO_GTK
SUBDIRS += icons misc
endif
EXTRA_DIST = \
hexchat.gresource.xml

View File

@ -1,24 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/icons">
<file alias="hexchat.png" preprocess="to-pixdata">icons/hexchat.png</file>
<file alias="book.png" preprocess="to-pixdata">icons/book.png</file>
<file alias="hexchat.png" preprocess="to-pixdata" compressed="true">icons/hexchat.png</file>
<file alias="book.png" preprocess="to-pixdata" compressed="true">icons/book.png</file>
<file alias="ulist_voice.png" preprocess="to-pixdata">icons/ulist_voice.png</file>
<file alias="ulist_halfop.png" preprocess="to-pixdata">icons/ulist_halfop.png</file>
<file alias="ulist_op.png" preprocess="to-pixdata">icons/ulist_op.png</file>
<file alias="ulist_owner.png" preprocess="to-pixdata">icons/ulist_owner.png</file>
<file alias="ulist_founder.png" preprocess="to-pixdata">icons/ulist_founder.png</file>
<file alias="ulist_netop.png" preprocess="to-pixdata">icons/ulist_netop.png</file>
<file alias="ulist_voice.png" preprocess="to-pixdata" compressed="true">icons/ulist_voice.png</file>
<file alias="ulist_halfop.png" preprocess="to-pixdata" compressed="true">icons/ulist_halfop.png</file>
<file alias="ulist_op.png" preprocess="to-pixdata" compressed="true">icons/ulist_op.png</file>
<file alias="ulist_owner.png" preprocess="to-pixdata" compressed="true">icons/ulist_owner.png</file>
<file alias="ulist_founder.png" preprocess="to-pixdata" compressed="true">icons/ulist_founder.png</file>
<file alias="ulist_netop.png" preprocess="to-pixdata" compressed="true">icons/ulist_netop.png</file>
<file alias="tray_normal.png" preprocess="to-pixdata">icons/hexchat.png</file>
<file alias="tray_fileoffer.png" preprocess="to-pixdata">icons/tray_fileoffer.png</file>
<file alias="tray_highlight.png" preprocess="to-pixdata">icons/tray_highlight.png</file>
<file alias="tray_message.png" preprocess="to-pixdata">icons/tray_message.png</file>
<file alias="tray_fileoffer.png" preprocess="to-pixdata" compressed="true">icons/tray_fileoffer.png</file>
<file alias="tray_highlight.png" preprocess="to-pixdata" compressed="true">icons/tray_highlight.png</file>
<file alias="tray_message.png" preprocess="to-pixdata" compressed="true">icons/tray_message.png</file>
<file alias="tree_channel.png" preprocess="to-pixdata">icons/tree_channel.png</file>
<file alias="tree_dialog.png" preprocess="to-pixdata">icons/tree_dialog.png</file>
<file alias="tree_server.png" preprocess="to-pixdata">icons/tree_server.png</file>
<file alias="tree_util.png" preprocess="to-pixdata">icons/tree_util.png</file>
<file alias="tree_dialog.png" preprocess="to-pixdata" compressed="true">icons/tree_dialog.png</file>
<file alias="tree_server.png" preprocess="to-pixdata" compressed="true">icons/tree_server.png</file>
<file alias="tree_util.png" preprocess="to-pixdata" compressed="true">icons/tree_util.png</file>
</gresource>
</gresources>

15
data/icons/Makefile.am Normal file
View File

@ -0,0 +1,15 @@
icon_DATA = hexchat.png
icondir = $(datadir)/icons/hicolor/48x48/apps
hicolor_DATA = hexchat.svg
hicolordir = $(datadir)/icons/hicolor/scalable/apps
UPDATE_ICON_CACHE = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor || :
install-data-hook:
$(UPDATE_ICON_CACHE);
uninstall-hook:
$(UPDATE_ICON_CACHE);
EXTRA_DIST = $(icon_DATA) $(hicolor_DATA)

View File

@ -1,9 +0,0 @@
icondir = join_paths(get_option('datadir'), 'icons/hicolor')
install_data(
'hexchat.png',
install_dir: join_paths(icondir, '48x48/apps')
)
install_data(
'hexchat.svg',
install_dir: join_paths(icondir, 'scalable/apps')
)

3
data/man/Makefile.am Normal file
View File

@ -0,0 +1,3 @@
man_MANS = hexchat.1
EXTRA_DIST = hexchat.1.in

View File

@ -1,10 +0,0 @@
man_conf = configuration_data()
man_conf.set('VERSION', meson.project_version())
configure_file(
input: 'hexchat.1.in',
output: 'hexchat.1',
configuration: man_conf,
install: true,
install_dir: join_paths(get_option('mandir'), 'man1')
)

View File

@ -1,11 +0,0 @@
if get_option('with-plugin')
subdir('pkgconfig')
endif
if get_option('with-gtk')
subdir('icons')
subdir('misc')
subdir('man')
elif get_option('with-theme-manager')
subdir('misc')
endif

31
data/misc/Makefile.am Normal file
View File

@ -0,0 +1,31 @@
appdata_in_files = hexchat.appdata.xml.in
appdata_DATA = $(appdata_in_files:.xml.in=.xml)
appdatadir = $(datadir)/appdata
@INTLTOOL_XML_RULE@
data_desktopdir = $(datadir)/applications
data_desktop_in_files = hexchat.desktop.in
if WITH_TM
data_desktop_in_files += htm.desktop.in
mime_DATA = htm-mime.xml
mimedir = $(datadir)/mime/packages
endif
data_desktop_DATA = $(data_desktop_in_files:.desktop.in=.desktop)
@INTLTOOL_DESKTOP_RULE@
UPDATE_MIME_DATABASE = update-mime-database "$(datadir)/mime" || :
UPDATE_DESKTOP_DATABASE = update-desktop-database -q "$(datadir)/applications" || :
install-data-hook:
$(UPDATE_MIME_DATABASE);
$(UPDATE_DESKTOP_DATABASE);
uninstall-hook:
$(UPDATE_MIME_DATABASE);
$(UPDATE_DESKTOP_DATABASE);
EXTRA_DIST = hexchat.appdata.xml.in hexchat.desktop.in htm.desktop.in htm-mime.xml
CLEANFILES = $(appdata_DATA) $(data_desktop_DATA)

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<application>
<id type="desktop">hexchat.desktop</id>
<licence>CC0</licence>
<description>
<_p>HexChat is an easy to use yet extensible IRC Client. It allows you to securely join multiple networks and talk to users privately or in channels using a customizable interface. You can even transfer files.</_p>
<_p>HexChat supports features such as: DCC, SASL, proxies, spellcheck, alerts, logging, custom themes, and Python/Perl scripts.</_p>
</description>
<url type="homepage">http://hexchat.github.io</url>
<screenshots>
<screenshot type="default">http://i.imgur.com/XBbQKXf.png</screenshot>
</screenshots>
<updatecontact>tingping_at_fedoraproject.org</updatecontact>
</application>

View File

@ -1,19 +1,18 @@
[Desktop Entry]
Name=HexChat
GenericName=IRC Client
Comment=Chat with other people online
Keywords=IM;Chat;
Exec=@exec_command@
_Name=HexChat
_GenericName=IRC Client
_Comment=Chat with other people online
_Keywords=IM;Chat;
Exec=hexchat %U
Icon=hexchat
Terminal=false
Type=Application
Categories=GTK;Network;IRCClient;
StartupNotify=true
StartupWMClass=Hexchat
X-GNOME-UsesNotifications=true
MimeType=x-scheme-handler/irc;x-scheme-handler/ircs;
Actions=SafeMode;
[Desktop Action SafeMode]
Name=Open Safe Mode
_Name=Open Safe Mode
Exec=hexchat --no-auto --no-plugins

View File

@ -1,5 +1,5 @@
[Desktop Entry]
Name=HexChat Theme Manager
_Name=HexChat Theme Manager
Exec=thememan %f
Icon=hexchat
Terminal=false

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="addon">
<id>io.github.Hexchat.Plugin.@NAME@</id>
<extends>io.github.Hexchat.desktop</extends>
<name>@NAME@ Plugin</name>
<summary>@SUMMARY@</summary>
<url type="homepage">https://hexchat.github.io/</url>
<project_license>@LICENSE@</project_license>
<metadata_license>CC0-1.0</metadata_license>
<update_contact>tingping_AT_fedoraproject.org</update_contact>
</component>

View File

@ -1,118 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop">
<id>io.github.Hexchat.desktop</id>
<name>HexChat</name>
<developer_name>HexChat</developer_name>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-2.0+</project_license>
<translation type="gettext">hexchat</translation>
<summary>IRC Client</summary>
<description>
<p>HexChat is an easy to use yet extensible IRC Client. It allows you to securely join multiple networks and talk to users privately or in channels using a customizable interface. You can even transfer files.</p>
<p>HexChat supports features such as: DCC, SASL, proxies, spellcheck, alerts, logging, custom themes, and Python/Perl scripts.</p>
</description>
<url type="homepage">http://hexchat.github.io</url>
<url type="bugtracker">https://github.com/hexchat/hexchat</url>
<url type="donation">https://goo.gl/jESZvU</url>
<url type="help">https://hexchat.readthedocs.io/en/latest/</url>
<screenshots>
<screenshot type="default">
<image>http://i.imgur.com/tLMguQz.png</image>
<caption>Main Chat Window</caption>
</screenshot>
</screenshots>
<provides>
<!-- Renamed from this -->
<id>hexchat.desktop</id>
</provides>
<releases>
<release date="2019-12-20" version="2.14.3">
<description>
<p>This is a bug-fix release:</p>
<ul>
<li>Fix various incorrect parsing of IRC messages relating to trailing parameters</li>
<li>Fix SASL negotiation combined with multi-line cap</li>
<li>Fix input box theming with Yaru theme</li>
<li>python: Work around Python 3.7 regression causing crash on unload</li>
<li>sysinfo: Add support for /etc/os-release</li>
<li>sysinfo: Ignore irrelevant mounts when calculating storage size</li>
</ul>
</description>
</release>
<release date="2018-08-29" version="2.14.2">
<description>
<p>This is a minor release:</p>
<ul>
<li>Remove shift+click to close tab binding</li>
<li>Always unminimize when opening from tray</li>
<li>Fix some translations containing invalid text events</li>
<li>Fix sending server passwords starting with ":"</li>
</ul>
</description>
</release>
<release date="2018-03-13" version="2.14.1">
<description>
<p>This is a very minor bug-fix release:</p>
<ul>
<li>Fix performance regression</li>
</ul>
</description>
</release>
<release date="2018-03-10" version="2.14.0">
<description>
<p>This is largely a bug fix release though it has some large behind the scenes changes:</p>
<ul>
<li>Rename data files to use *io.github.Hexchat* name</li>
<li>Add option (irc_reconnect_rejoin) to disable auto-rejoin on reconnect</li>
<li>Add ability to set custom tray icon separate of app icon</li>
<li>Fix Enchant 2.0+ support</li>
<li>Fix input box theming with Adwaita-dark</li>
<li>Fix custom sounds not respecting omit if away option</li>
<li>Fix detecting if a tray doesn't exist on x11</li>
<li>Fix cutting off ctcp text after ending \01</li>
<li>Fix /ignore not accepting full hosts</li>
<li>Fix characters getting cut off when their width changes</li>
<li>Fix various possible crashes</li>
<li>Change preference window to be scroll-able</li>
<li>Remove ctrl+w binding by default</li>
<li>doat: Fix channels with / in them</li>
<li>fishlim: Fix key exchange</li>
<li>fishlim: Fix building against LibreSSL</li>
<li>sysinfo: Fix pci.ids file not being found on some distros</li>
<li>sysinfo: Make libpci optional</li>
<li>lua: Avoid loading the same script multiple times</li>
<li>Update translations</li>
</ul>
</description>
</release>
<release date="2016-12-10" version="2.12.4">
<description>
<p>This is another bug fix release:</p>
<ul>
<li>Fix issue with timers causing ping timeouts</li>
<li>Fix building against OpenSSL 1.1</li>
<li>Fix /exec output printing invalid utf8</li>
<li>Replace doat plugin with an internal command</li>
<li>Change how tab colors interact with plugins</li>
<li>Enable filtering the beep character by default</li>
</ul>
</description>
</release>
<release date="2016-10-22" version="2.12.3">
<description>
<p>This is a minor bug fix release just cleaning up a few issues:</p>
<ul>
<li>Fix crash with bad translations</li>
<li>Add new mhop command</li>
<li>Change ping timeout to 60 by default</li>
</ul>
</description>
</release>
</releases>
<kudos>
<kudo>UserDocs</kudo>
<kudo>HiDpiIcon</kudo>
<kudo>Notifications</kudo>
</kudos>
<update_contact>tingping_at_fedoraproject.org</update_contact>
</component>

View File

@ -1,127 +0,0 @@
appdir = join_paths(get_option('datadir'), 'applications')
metainfodir = join_paths(get_option('datadir'), 'metainfo')
desktop_utils = find_program('desktop-file-validate', required: false)
if get_option('with-gtk')
if get_option('with-appdata')
hexchat_appdata = i18n.merge_file(
input: 'io.github.Hexchat.appdata.xml.in',
output: 'io.github.Hexchat.appdata.xml',
po_dir: '../../po',
install: true,
install_dir: metainfodir
)
appstream_util = find_program('appstream-util', required: false)
if appstream_util.found()
test('Validate io.github.Hexchat.appdata.xml', appstream_util,
args: ['validate-relax', hexchat_appdata]
)
endif
endif
desktop_conf = configuration_data()
if get_option('with-dbus')
desktop_conf.set('exec_command', 'hexchat --existing %U')
else
desktop_conf.set('exec_command', 'hexchat %U')
endif
desktop_file = configure_file(
input: 'io.github.Hexchat.desktop.in.in',
output: 'io.github.Hexchat.desktop.in',
configuration: desktop_conf
)
hexchat_desktop = i18n.merge_file(
input: desktop_file,
output: 'io.github.Hexchat.desktop',
po_dir: '../../po',
type: 'desktop',
install: true,
install_dir: appdir
)
if desktop_utils.found()
test('Validate io.github.Hexchat.desktop', desktop_utils,
args: [hexchat_desktop]
)
endif
endif
if get_option('with-theme-manager')
htm_desktop = i18n.merge_file(
input: 'io.github.Hexchat.ThemeManager.desktop.in',
output: 'io.github.Hexchat.ThemeManager.desktop',
po_dir: '../../po',
type: 'desktop',
install: true,
install_dir: appdir
)
if desktop_utils.found()
test('Validate io.github.Hexchat.ThemeManager.desktop', desktop_utils,
args: [htm_desktop]
)
endif
install_data('io.github.Hexchat.ThemeManager.xml',
install_dir: join_paths(get_option('datadir'), 'mime/packages')
)
endif
if get_option('with-plugin') and get_option('with-appdata')
plugin_metainfo = []
# FIXME: These should all get translated somewhere
if get_option('with-checksum')
plugin_metainfo += [
['Checksum', 'Calculates a checksum for all sent and recieved DCC files', 'MIT']
]
endif
if get_option('with-fishlim')
plugin_metainfo += [
['Fishlim', 'Allows setting a key for encrypted conversations', 'MIT AND GPL-2.0+']
]
endif
if get_option('with-lua') != 'false'
plugin_metainfo += [
['Lua', 'Provides a scripting interface in Lua', 'MIT']
]
endif
if get_option('with-perl') != 'false'
plugin_metainfo += [
['Perl', 'Provides a scripting interface in Perl', 'GPL-2.0+']
]
endif
if get_option('with-python') != 'false'
plugin_metainfo += [
['Python', 'Provides a scripting interface in Python', 'GPL-2.0+']
]
endif
if get_option('with-sysinfo')
plugin_metainfo += [
['Sysinfo', 'Adds command to display system information', 'GPL-2.0+']
]
endif
foreach metainfo : plugin_metainfo
name = metainfo[0]
conf = configuration_data()
conf.set('NAME', name)
conf.set('SUMMARY', metainfo[1])
conf.set('LICENSE', metainfo[2])
configure_file(
input: 'io.github.Hexchat.Plugin.metainfo.xml.in',
output: 'io.github.Hexchat.Plugin.@0@.metainfo.xml'.format(name),
configuration: conf,
install_dir: get_option('install-plugin-metainfo') ? metainfodir : '',
)
endforeach
endif

View File

@ -0,0 +1,4 @@
pkgcfgdir = $(pkgconfigdir)
pkgcfg_DATA = hexchat-plugin.pc
EXTRA_DIST = hexchat-plugin.pc.in

View File

@ -1,14 +0,0 @@
pkg_conf = configuration_data()
prefix = get_option('prefix')
pkg_conf.set('prefix', prefix)
pkg_conf.set('VERSION', meson.project_version())
pkg_conf.set('hexchatlibdir', join_paths('${prefix}', plugindir))
pkg_conf.set('includedir', join_paths('${prefix}', get_option('includedir')))
configure_file(
input: 'hexchat-plugin.pc.in',
output: 'hexchat-plugin.pc',
configuration: pkg_conf,
install: true,
install_dir: join_paths(get_option('libdir'), 'pkgconfig'),
)

View File

@ -1,14 +0,0 @@
; dnf install mingw64-{gtk,openssl}
[binaries]
c = '/usr/bin/x86_64-w64-mingw32-gcc'
cpp = '/usr/bin/x86_64-w64-mingw32-g++'
ar = '/usr/bin/x86_64-w64-mingw32-gcc-ar'
strip = '/usr/bin/x86_64-w64-mingw32-strip'
pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
[host_machine]
system = 'windows'
cpu_family = 'x86_64'
cpu = 'x86_64'
endian = 'little'

40
m4/as-ac-expand.m4 Normal file
View File

@ -0,0 +1,40 @@
dnl AS_AC_EXPAND(VAR, CONFIGURE_VAR)
dnl
dnl example
dnl AS_AC_EXPAND(SYSCONFDIR, $sysconfdir)
dnl will set SYSCONFDIR to /usr/local/etc if prefix=/usr/local
AC_DEFUN([AS_AC_EXPAND],
[
EXP_VAR=[$1]
FROM_VAR=[$2]
dnl first expand prefix and exec_prefix if necessary
prefix_save=$prefix
exec_prefix_save=$exec_prefix
dnl if no prefix given, then use /usr/local, the default prefix
if test "x$prefix" = "xNONE"; then
prefix=$ac_default_prefix
fi
dnl if no exec_prefix given, then use prefix
if test "x$exec_prefix" = "xNONE"; then
exec_prefix=$prefix
fi
full_var="$FROM_VAR"
dnl loop until it doesn't change anymore
while true; do
new_full_var="`eval echo $full_var`"
if test "x$new_full_var" = "x$full_var"; then break; fi
full_var=$new_full_var
done
dnl clean up
full_var=$new_full_var
AC_SUBST([$1], "$full_var")
dnl restore prefix and exec_prefix
prefix=$prefix_save
exec_prefix=$exec_prefix_save
])

124
m4/ax_check_enable_debug.m4 Normal file
View File

@ -0,0 +1,124 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_check_enable_debug.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_CHECK_ENABLE_DEBUG([enable by default=yes/info/profile/no], [ENABLE DEBUG VARIABLES ...], [DISABLE DEBUG VARIABLES NDEBUG ...], [IS-RELEASE])
#
# DESCRIPTION
#
# Check for the presence of an --enable-debug option to configure, with
# the specified default value used when the option is not present. Return
# the value in the variable $ax_enable_debug.
#
# Specifying 'yes' adds '-g -O0' to the compilation flags for all
# languages. Specifying 'info' adds '-g' to the compilation flags.
# Specifying 'profile' adds '-g -pg' to the compilation flags and '-pg' to
# the linking flags. Otherwise, nothing is added.
#
# Define the variables listed in the second argument if debug is enabled,
# defaulting to no variables. Defines the variables listed in the third
# argument if debug is disabled, defaulting to NDEBUG. All lists of
# variables should be space-separated.
#
# If debug is not enabled, ensure AC_PROG_* will not add debugging flags.
# Should be invoked prior to any AC_PROG_* compiler checks.
#
# IS-RELEASE can be used to change the default to 'no' when making a
# release. Set IS-RELEASE to 'yes' or 'no' as appropriate. By default, it
# uses the value of $ax_is_release, so if you are using the AX_IS_RELEASE
# macro, there is no need to pass this parameter.
#
# AX_IS_RELEASE([git-directory])
# AX_CHECK_ENABLE_DEBUG()
#
# LICENSE
#
# Copyright (c) 2011 Rhys Ulerich <rhys.ulerich@gmail.com>
# Copyright (c) 2014, 2015 Philip Withnall <philip@tecnocode.co.uk>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved.
#serial 5
AC_DEFUN([AX_CHECK_ENABLE_DEBUG],[
AC_BEFORE([$0],[AC_PROG_CC])dnl
AC_BEFORE([$0],[AC_PROG_CXX])dnl
AC_BEFORE([$0],[AC_PROG_F77])dnl
AC_BEFORE([$0],[AC_PROG_FC])dnl
AC_MSG_CHECKING(whether to enable debugging)
ax_enable_debug_default=m4_tolower(m4_normalize(ifelse([$1],,[no],[$1])))
ax_enable_debug_is_release=m4_tolower(m4_normalize(ifelse([$4],,
[$ax_is_release],
[$4])))
# If this is a release, override the default.
AS_IF([test "$ax_enable_debug_is_release" = "yes"],
[ax_enable_debug_default="no"])
m4_define(ax_enable_debug_vars,[m4_normalize(ifelse([$2],,,[$2]))])
m4_define(ax_disable_debug_vars,[m4_normalize(ifelse([$3],,[NDEBUG],[$3]))])
AC_ARG_ENABLE(debug,
[AS_HELP_STRING([--enable-debug=]@<:@yes/info/profile/no@:>@,[compile with debugging])],
[],enable_debug=$ax_enable_debug_default)
# empty mean debug yes
AS_IF([test "x$enable_debug" = "x"],
[enable_debug="yes"])
# case of debug
AS_CASE([$enable_debug],
[yes],[
AC_MSG_RESULT(yes)
CFLAGS="${CFLAGS} -g -O0"
CXXFLAGS="${CXXFLAGS} -g -O0"
FFLAGS="${FFLAGS} -g -O0"
FCFLAGS="${FCFLAGS} -g -O0"
OBJCFLAGS="${OBJCFLAGS} -g -O0"
],
[info],[
AC_MSG_RESULT(info)
CFLAGS="${CFLAGS} -g"
CXXFLAGS="${CXXFLAGS} -g"
FFLAGS="${FFLAGS} -g"
FCFLAGS="${FCFLAGS} -g"
OBJCFLAGS="${OBJCFLAGS} -g"
],
[profile],[
AC_MSG_RESULT(profile)
CFLAGS="${CFLAGS} -g -pg"
CXXFLAGS="${CXXFLAGS} -g -pg"
FFLAGS="${FFLAGS} -g -pg"
FCFLAGS="${FCFLAGS} -g -pg"
OBJCFLAGS="${OBJCFLAGS} -g -pg"
LDFLAGS="${LDFLAGS} -pg"
],
[
AC_MSG_RESULT(no)
dnl Ensure AC_PROG_CC/CXX/F77/FC/OBJC will not enable debug flags
dnl by setting any unset environment flag variables
AS_IF([test "x${CFLAGS+set}" != "xset"],
[CFLAGS=""])
AS_IF([test "x${CXXFLAGS+set}" != "xset"],
[CXXFLAGS=""])
AS_IF([test "x${FFLAGS+set}" != "xset"],
[FFLAGS=""])
AS_IF([test "x${FCFLAGS+set}" != "xset"],
[FCFLAGS=""])
AS_IF([test "x${OBJCFLAGS+set}" != "xset"],
[OBJCFLAGS=""])
])
dnl Define various variables if debugging is disabled.
dnl assert.h is a NOP if NDEBUG is defined, so define it by default.
AS_IF([test "x$enable_debug" = "xyes"],
[m4_map_args_w(ax_enable_debug_vars, [AC_DEFINE(], [,,[Define if debugging is enabled])])],
[m4_map_args_w(ax_disable_debug_vars, [AC_DEFINE(], [,,[Define if debugging is disabled])])])
ax_enable_debug=$enable_debug
])

69
m4/ax_is_release.m4 Normal file
View File

@ -0,0 +1,69 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_is_release.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_IS_RELEASE(POLICY)
#
# DESCRIPTION
#
# Determine whether the code is being configured as a release, or from
# git. Set the ax_is_release variable to 'yes' or 'no'.
#
# If building a release version, it is recommended that the configure
# script disable compiler errors and debug features, by conditionalising
# them on the ax_is_release variable. If building from git, these
# features should be enabled.
#
# The POLICY parameter specifies how ax_is_release is determined. It can
# take the following values:
#
# * git-directory: ax_is_release will be 'no' if a '.git' directory exists
# * minor-version: ax_is_release will be 'no' if the minor version number
# in $PACKAGE_VERSION is odd; this assumes
# $PACKAGE_VERSION follows the 'major.minor.micro' scheme
# * micro-version: ax_is_release will be 'no' if the micro version number
# in $PACKAGE_VERSION is odd; this assumes
# $PACKAGE_VERSION follows the 'major.minor.micro' scheme
# * always: ax_is_release will always be 'yes'
# * never: ax_is_release will always be 'no'
#
# Other policies may be added in future.
#
# LICENSE
#
# Copyright (c) 2015 Philip Withnall <philip@tecnocode.co.uk>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved.
#serial 3
AC_DEFUN([AX_IS_RELEASE],[
AC_BEFORE([AC_INIT],[$0])
m4_case([$1],
[git-directory],[
# $is_release = (.git directory does not exist)
AS_IF([test -d .git],[ax_is_release=no],[ax_is_release=yes])
],
[minor-version],[
# $is_release = ($minor_version is even)
minor_version=`echo "$PACKAGE_VERSION" | sed 's/[[^.]][[^.]]*.\([[^.]][[^.]]*\).*/\1/'`
AS_IF([test "$(( $minor_version % 2 ))" -ne 0],
[ax_is_release=no],[ax_is_release=yes])
],
[micro-version],[
# $is_release = ($micro_version is even)
micro_version=`echo "$PACKAGE_VERSION" | sed 's/[[^.]]*\.[[^.]]*\.\([[^.]]*\).*/\1/'`
AS_IF([test "$(( $micro_version % 2 ))" -ne 0],
[ax_is_release=no],[ax_is_release=yes])
],
[always],[ax_is_release=yes],
[never],[ax_is_release=no],
[
AC_MSG_ERROR([Invalid policy. Valid policies: git-directory, minor-version.])
])
])

8
m4/clang-analyze.am Normal file
View File

@ -0,0 +1,8 @@
analysis_verbose = $(analysis_verbose_$(V))
analysis_verbose_ = $(analysis_verbose_$(AM_DEFAULT_VERBOSITY))
analysis_verbose_0 = @echo " CCSA " $@; $(COMPILE) --analyze $< -o $@;
analysis_verbose_1 = $(COMPILE) --analyze $< -o $@;
%.plist: %.c
$(analysis_verbose)

View File

@ -1,160 +0,0 @@
project('hexchat', 'c',
version: '2.14.3',
meson_version: '>= 0.40.0',
default_options: [
'c_std=gnu89',
'buildtype=debugoptimized',
'warning_level=1',
]
)
i18n = import('i18n')
gnome = import('gnome')
cc = meson.get_compiler('c')
libgio_dep = dependency('gio-2.0', version: '>= 2.34.0')
libgmodule_dep = dependency('gmodule-2.0')
global_deps = []
if cc.get_id() == 'msvc'
libssl_dep = cc.find_library('libeay32')
else
libssl_dep = dependency('openssl', version: '>= 0.9.8',
required: get_option('with-ssl'))
endif
config_h = configuration_data()
config_h.set_quoted('PACKAGE_VERSION', meson.project_version())
config_h.set_quoted('PACKAGE_NAME', meson.project_name())
config_h.set_quoted('GETTEXT_PACKAGE', 'hexchat')
config_h.set_quoted('LOCALEDIR', join_paths(get_option('prefix'),
get_option('datadir'), 'locale'))
config_h.set10('ENABLE_NLS', true)
# Optional features
config_h.set('USE_OPENSSL', get_option('with-ssl'))
config_h.set('USE_LIBPROXY', get_option('with-libproxy'))
config_h.set('USE_LIBCANBERRA', get_option('with-libcanberra'))
config_h.set('USE_DBUS', get_option('with-dbus'))
config_h.set('USE_PLUGIN', get_option('with-plugin'))
config_h.set('G_DISABLE_SINGLE_INCLUDES', true)
config_h.set('GTK_DISABLE_DEPRECATED', true)
config_h.set('GTK_DISABLE_SINGLE_INCLUDES', true)
config_h.set('GDK_PIXBUF_DISABLE_SINGLE_INCLUDES', true)
config_h.set('GLIB_VERSION_MAX_ALLOWED', 'GLIB_VERSION_2_34')
config_h.set('GLIB_VERSION_MIN_REQUIRED', 'GLIB_VERSION_2_34')
# Detected features
config_h.set('HAVE_MEMRCHR', cc.has_function('memrchr'))
config_h.set('HAVE_STRINGS_H', cc.has_header('strings.h'))
if libssl_dep.found()
config_h.set('HAVE_X509_GET_SIGNATURE_NID',
cc.has_function('X509_get_signature_nid', dependencies: libssl_dep)
)
config_h.set('HAVE_SSL_CTX_GET_SSL_METHOD',
cc.has_function('SSL_CTX_get_ssl_method', dependencies: libssl_dep)
)
config_h.set('HAVE_DH_SET0_PQG',
cc.has_function('DH_set0_pqg', dependencies: libssl_dep)
)
config_h.set('HAVE_DH_GET0_KEY',
cc.has_function('DH_get0_key', dependencies: libssl_dep)
)
config_h.set('HAVE_DH_SET0_KEY',
cc.has_function('DH_set0_key', dependencies: libssl_dep)
)
config_h.set('HAVE_ERR_REMOVE_THREAD_STATE',
cc.has_function('ERR_remove_thread_state', dependencies: libssl_dep)
)
config_h.set('HAVE_ASN1_STRING_GET0_DATA',
cc.has_function('ASN1_STRING_get0_data', dependencies: libssl_dep)
)
endif
configure_file(output: 'config.h', configuration: config_h)
config_h_include = include_directories('.')
if host_machine.system() == 'windows'
add_project_arguments(
'-DWIN32',
'-DNTDDI_VERSION=NTDDI_WIN7',
'-D_WIN32_WINNT=_WIN32_WINNT_WIN7',
language: 'c')
endif
global_cflags = []
test_cflags = [
'-funsigned-char',
'-Wno-conversion',
'-Wno-pointer-sign',
'-Wno-padded',
'-Wno-unused-parameter',
'-Wno-missing-prototypes',
'-Winline',
'-Wstrict-prototypes',
'-Werror=implicit-function-declaration',
'-Werror=pointer-arith',
'-Werror=init-self',
['-Werror=format-security', '-Werror=format=1'],
'-Werror=missing-include-dirs',
'-Werror=date-time',
]
foreach cflag : test_cflags
if cc.has_multi_arguments(cflag)
global_cflags += cflag
endif
endforeach
if get_option('buildtype') != 'plain'
if cc.has_argument('-fstack-protector-strong') and cc.links('''
int main (void) {
char buffer[16];
strcpy(buffer, "foo");
return 0;
}
''', args: '-fstack-protector-all')
global_cflags += '-fstack-protector-strong'
if host_machine.system() == 'windows'
global_deps += cc.find_library('ssp')
endif
endif
endif
add_project_arguments(global_cflags, language: 'c')
global_ldflags = []
test_ldflags = [
'-Wl,-z,relro',
'-Wl,-z,now',
# mingw
'-Wl,--dynamicbase',
'-Wl,--nxcompat',
]
foreach ldflag : test_ldflags
if meson.version().version_compare('>= 0.46.0')
has_arg = cc.has_link_argument(ldflag)
else
has_arg = cc.has_argument(ldflag)
endif
if has_arg and cc.links('int main (void) { return 0; }', args: ldflag)
global_ldflags += ldflag
endif
endforeach
add_project_link_arguments(global_ldflags, language: 'c')
subdir('src')
if get_option('with-plugin')
subdir('plugins')
endif
if cc.get_id() != 'msvc'
subdir('data')
subdir('po') # FIXME: build xgettext
meson.add_install_script('meson_post_install.py',
'@0@'.format(get_option('with-theme-manager'))
)
endif

View File

@ -1,68 +0,0 @@
option('with-gtk', type: 'boolean',
description: 'Main graphical interface'
)
option('with-text', type: 'boolean', value: false,
description: 'Text interface (not generally useful)'
)
option('with-ssl', type: 'boolean',
description: 'Support for TLS connections, requires openssl'
)
option('with-plugin', type: 'boolean',
description: 'Support for loadable plugins'
)
option('with-dbus', type: 'boolean',
description: 'Support used for single-instance and scripting interface, Unix only'
)
option('with-libproxy', type: 'boolean',
description: 'Support for getting proxy information, Unix only'
)
option('with-libnotify', type: 'boolean',
description: 'Support for freedesktop notifications, Unix only'
)
option('with-libcanberra', type: 'boolean',
description: 'Support for sound alerts, Unix only'
)
option('with-theme-manager', type: 'boolean', value: false,
description: 'Utility to help manage themes, requires mono/.net'
)
option('dbus-service-use-appid', type: 'boolean', value: false,
description: 'Rename dbus service to match app-id, required for Flatpak'
)
option('with-appdata', type: 'boolean',
description: 'Install appdata files for app stores'
)
# Plugins
option('with-checksum', type: 'boolean',
description: 'DCC checksum plugin'
)
option('with-exec', type: 'boolean',
description: '/exec plugin, Windows only'
)
option('with-fishlim', type: 'boolean',
description: 'Fish encryption plugin, requires openssl'
)
option('with-lua', type: 'string', value: 'luajit',
description: 'Lua scripting plugin, value is pkg-config name to use or "false"'
)
option('with-perl', type: 'string', value: 'perl',
description: 'Perl scripting plugin, value is path to perl executable or "false"'
)
option('with-python', type: 'string', value: 'python3',
description: 'Python scripting plugin. value is pkg-config name to use or "false"'
)
option('with-sysinfo', type: 'boolean',
description: 'System information plugin, requires libpci on Unix'
)
option('with-upd', type: 'boolean',
description: 'Update plugin, Windows only'
)
option('with-winamp', type: 'boolean',
description: 'Winamp plugin, Windows only'
)
option('install-plugin-metainfo', type: 'boolean', value: false,
description: 'Installs metainfo files for enabled plugins, useful when distros create split packages'
)
option('with-perl-legacy-api', type: 'boolean', value: false,
description: 'Enables the legacy IRC perl module for compatibility with old scripts'
)

View File

@ -1,24 +0,0 @@
#!/usr/bin/env python3
import os
import sys
import subprocess
prefix = os.environ.get('MESON_INSTALL_PREFIX', '/usr/local')
datadir = os.path.join(prefix, 'share')
with_thememan = sys.argv[1] == 'true'
# Packaging tools define DESTDIR and this isn't needed for them
if 'DESTDIR' not in os.environ:
print('Updating icon cache...')
subprocess.call(['gtk-update-icon-cache', '-qtf',
os.path.join(datadir, 'icons', 'hicolor')])
print('Updating desktop database...')
subprocess.call(['update-desktop-database', '-q',
os.path.join(datadir, 'applications')])
if with_thememan:
print('Updating mime database...')
subprocess.call(['update-mime-database',
os.path.join(datadir, 'mime')])

25
plugins/Makefile.am Normal file
View File

@ -0,0 +1,25 @@
if DO_PYTHON
pythondir = python
endif
if DO_PERL
perldir = perl
endif
if DO_DOAT
doatdir = doat
endif
if DO_FISHLIM
fishlimdir = fishlim
endif
if DO_CHECKSUM
checksumdir = checksum
endif
if DO_SYSINFO
sysinfodir = sysinfo
endif
SUBDIRS = $(pythondir) $(perldir) $(checksumdir) $(doatdir) $(fishlimdir) $(sysinfodir)

View File

@ -0,0 +1,7 @@
libdir = $(hexchatlibdir)
lib_LTLIBRARIES = checksum.la
checksum_la_SOURCES = checksum.c
checksum_la_LDFLAGS = $(PLUGIN_LDFLAGS) -module
checksum_la_LIBADD = $(GLIB_LIBS)
checksum_la_CFLAGS = $(GLIB_CFLAGS) -I$(top_srcdir)/src/common

View File

@ -1,6 +0,0 @@
shared_module('checksum', 'checksum.c',
dependencies: [libgio_dep, hexchat_plugin_dep],
install: true,
install_dir: plugindir,
name_prefix: '',
)

8
plugins/doat/Makefile.am Normal file
View File

@ -0,0 +1,8 @@
libdir = $(hexchatlibdir)
lib_LTLIBRARIES = doat.la
doat_la_SOURCES = doat.c
doat_la_LDFLAGS = $(PLUGIN_LDFLAGS) -module
doat_la_LIBADD = $(GLIB_LIBS)
doat_la_CFLAGS = $(GLIB_CFLAGS) -I$(top_srcdir)/src/common

92
plugins/doat/doat.c Normal file
View File

@ -0,0 +1,92 @@
/* This program is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING or http://lwsitu.com/xchat/COPYING
* for more details. */
#include "config.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <glib.h>
#include "hexchat-plugin.h"
static hexchat_plugin *ph;
static int
parse_command( char *word[], char *word_eol[], void *userdata ) {
char *channel = NULL, *server = NULL, *token = NULL;
/* char *save_ptr1 = NULL;*/
char *str1 = NULL;
char *delimiter = NULL;
hexchat_context *ctx = NULL;
if( word[2] != NULL && word[3] != NULL ) {
for( str1 = word[2]; ; str1 = NULL ) {
/* token = strtok_r( str1, ",", &save_ptr1 );*/
token = strtok( str1, "," );
/* printf( "token: %s\n", token );*/
if( token == NULL ) {
break;
}
channel = g_strdup( token );
delimiter = strchr( channel, '/' );
server = NULL;
if( delimiter != NULL ) {
*delimiter = '\0';
if( strlen( delimiter + 1 ) > 0 ) {
server = g_strdup( delimiter + 1 );
}
}
/* /Network form */
if( strlen( channel ) == 0 ) {
g_free( channel );
channel = NULL;
}
/* printf( "channel[%s] server[%s]\n", channel, server );*/
if( (ctx = hexchat_find_context( ph, server, channel ) ) != NULL ) {
if( hexchat_set_context( ph, ctx ) ) {
hexchat_command( ph, word_eol[3] );
}
}
g_free( channel );
g_free( server );
}
}
return HEXCHAT_EAT_HEXCHAT;
}
int
hexchat_plugin_init( hexchat_plugin * plugin_handle, char **plugin_name,
char **plugin_desc, char **plugin_version, char *arg ) {
ph = plugin_handle;
*plugin_name = "Do At";
*plugin_version = "1.0001";
*plugin_desc = "Perform an arbitrary command on multiple channels";
hexchat_hook_command( ph, "doat", HEXCHAT_PRI_NORM, parse_command, "DOAT [channel,list,/network] [command], perform a command on multiple contexts", NULL );
hexchat_print (ph, "Do At plugin loaded\n");
return 1;
}
int
hexchat_plugin_deinit (void)
{
hexchat_print (ph, "Do At plugin unloaded\n");
return 1;
}

3
plugins/doat/doat.def Normal file
View File

@ -0,0 +1,3 @@
EXPORTS
hexchat_plugin_init
hexchat_plugin_deinit

59
plugins/doat/doat.vcxproj Normal file
View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v140</PlatformToolset>
<ConfigurationType>DynamicLibrary</ConfigurationType>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{4980AF24-9D42-427D-A8E6-0DF3B97C455D}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>doat</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
<PropertyGroup>
<TargetName>hcdoat</TargetName>
<OutDir>$(HexChatRel)plugins\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;DOAT_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\src\common;$(HexChatLib);$(Glib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>doat.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;DOAT_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\src\common;$(HexChatLib);$(Glib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>doat.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="doat.c" />
</ItemGroup>
<ItemGroup>
<None Include="doat.def" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
</Project>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="doat.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="doat.def">
<Filter>Resource Files</Filter>
</None>
</ItemGroup>
</Project>

View File

@ -1,5 +0,0 @@
shared_module('exec', 'exec.c',
dependencies: hexchat_plugin_dep,
install: true,
install_dir: plugindir
)

16
plugins/fishlim/INSTALL Normal file
View File

@ -0,0 +1,16 @@
Install dependencies (on Debian/Ubuntu):
sudo apt-get install build-essential libglib2.0-dev libssl-dev
Build the plugin with:
make
Install with:
sudo make install

View File

@ -0,0 +1,9 @@
EXTRA_DIST = INSTALL LICENSE fish.h irc.h keystore.h plugin_hexchat.h
libdir = $(hexchatlibdir)
lib_LTLIBRARIES = fishlim.la
fishlim_la_SOURCES = fish.c irc.c keystore.c plugin_hexchat.c
fishlim_la_LDFLAGS = $(PLUGIN_LDFLAGS) -module
fishlim_la_LIBADD = $(GLIB_LIBS) $(OPENSSL_LIBS)
fishlim_la_CFLAGS = $(GLIB_CFLAGS) $(OPENSSL_CFLAGS) -I$(top_srcdir)/src/common

View File

@ -1,238 +0,0 @@
/* HexChat
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
/*
* For Diffie-Hellman key-exchange a 1080bit germain prime is used, the
* generator g=2 renders a field Fp from 1 to p-1. Therefore breaking it
* means to solve a discrete logarithm problem with no less than 1080bit.
*
* Base64 format is used to send the public keys over IRC.
*
* The calculated secret key is hashed with SHA-256, the result is converted
* to base64 for final use with blowfish.
*/
#include "config.h"
#include "dh1080.h"
#include <openssl/bn.h>
#include <openssl/dh.h>
#include <openssl/sha.h>
#include <string.h>
#include <glib.h>
#define DH1080_PRIME_BITS 1080
#define DH1080_PRIME_BYTES 135
#define SHA256_DIGEST_LENGTH 32
#define B64ABC "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
#define MEMZERO(x) memset(x, 0x00, sizeof(x))
/* All clients must use the same prime number to be able to keyx */
static const guchar prime1080[DH1080_PRIME_BYTES] =
{
0xFB, 0xE1, 0x02, 0x2E, 0x23, 0xD2, 0x13, 0xE8, 0xAC, 0xFA, 0x9A, 0xE8, 0xB9, 0xDF, 0xAD, 0xA3, 0xEA,
0x6B, 0x7A, 0xC7, 0xA7, 0xB7, 0xE9, 0x5A, 0xB5, 0xEB, 0x2D, 0xF8, 0x58, 0x92, 0x1F, 0xEA, 0xDE, 0x95,
0xE6, 0xAC, 0x7B, 0xE7, 0xDE, 0x6A, 0xDB, 0xAB, 0x8A, 0x78, 0x3E, 0x7A, 0xF7, 0xA7, 0xFA, 0x6A, 0x2B,
0x7B, 0xEB, 0x1E, 0x72, 0xEA, 0xE2, 0xB7, 0x2F, 0x9F, 0xA2, 0xBF, 0xB2, 0xA2, 0xEF, 0xBE, 0xFA, 0xC8,
0x68, 0xBA, 0xDB, 0x3E, 0x82, 0x8F, 0xA8, 0xBA, 0xDF, 0xAD, 0xA3, 0xE4, 0xCC, 0x1B, 0xE7, 0xE8, 0xAF,
0xE8, 0x5E, 0x96, 0x98, 0xA7, 0x83, 0xEB, 0x68, 0xFA, 0x07, 0xA7, 0x7A, 0xB6, 0xAD, 0x7B, 0xEB, 0x61,
0x8A, 0xCF, 0x9C, 0xA2, 0x89, 0x7E, 0xB2, 0x8A, 0x61, 0x89, 0xEF, 0xA0, 0x7A, 0xB9, 0x9A, 0x8A, 0x7F,
0xA9, 0xAE, 0x29, 0x9E, 0xFA, 0x7B, 0xA6, 0x6D, 0xEA, 0xFE, 0xFB, 0xEF, 0xBF, 0x0B, 0x7D, 0x8B
};
static DH *g_dh;
int
dh1080_init (void)
{
g_return_val_if_fail (g_dh == NULL, 0);
if ((g_dh = DH_new()))
{
int codes;
BIGNUM *p, *g;
p = BN_bin2bn (prime1080, DH1080_PRIME_BYTES, NULL);
g = BN_new ();
if (p == NULL || g == NULL)
return 1;
BN_set_word (g, 2);
#ifndef HAVE_DH_SET0_PQG
g_dh->p = p;
g_dh->g = g;
#else
if (!DH_set0_pqg (g_dh, p, NULL, g))
return 1;
#endif
if (DH_check (g_dh, &codes))
return codes == 0;
}
return 0;
}
void
dh1080_deinit (void)
{
g_clear_pointer (&g_dh, DH_free);
}
static inline int
DH_verifyPubKey (BIGNUM *pk)
{
int codes;
return DH_check_pub_key (g_dh, pk, &codes) && codes == 0;
}
static guchar *
dh1080_decode_b64 (const char *data, gsize *out_len)
{
GString *str = g_string_new (data);
guchar *ret;
if (str->len % 4 == 1 && str->str[str->len - 1] == 'A')
g_string_truncate (str, str->len - 1);
while (str->len % 4 != 0)
g_string_append_c (str, '=');
ret = g_base64_decode_inplace (str->str, out_len);
g_string_free (str, FALSE);
return ret;
}
static char *
dh1080_encode_b64 (const guchar *data, gsize data_len)
{
char *ret = g_base64_encode (data, data_len);
char *p;
if (!(p = strchr (ret, '=')))
{
char *new_ret = g_new(char, strlen(ret) + 2);
strcpy (new_ret, ret);
strcat (new_ret, "A");
g_free (ret);
ret = new_ret;
}
else
{
*p = '\0';
}
return ret;
}
int
dh1080_generate_key (char **priv_key, char **pub_key)
{
guchar buf[DH1080_PRIME_BYTES];
int len;
DH *dh;
const BIGNUM *dh_priv_key, *dh_pub_key;
g_assert (priv_key != NULL);
g_assert (pub_key != NULL);
dh = DHparams_dup (g_dh);
if (!dh)
return 0;
if (!DH_generate_key (dh))
{
DH_free (dh);
return 0;
}
#ifndef HAVE_DH_GET0_KEY
dh_pub_key = dh->pub_key;
dh_priv_key = dh->priv_key;
#else
DH_get0_key (dh, &dh_pub_key, &dh_priv_key);
#endif
MEMZERO (buf);
len = BN_bn2bin (dh_priv_key, buf);
*priv_key = dh1080_encode_b64 (buf, len);
MEMZERO (buf);
len = BN_bn2bin (dh_pub_key, buf);
*pub_key = dh1080_encode_b64 (buf, len);
OPENSSL_cleanse (buf, sizeof (buf));
DH_free (dh);
return 1;
}
int
dh1080_compute_key (const char *priv_key, const char *pub_key, char **secret_key)
{
char *pub_key_data;
gsize pub_key_len;
BIGNUM *pk;
DH *dh;
#ifdef HAVE_DH_SET0_KEY
BIGNUM *temp_pub_key = BN_new();
#endif
g_assert (secret_key != NULL);
/* Verify base64 strings */
if (strspn (priv_key, B64ABC) != strlen (priv_key)
|| strspn (pub_key, B64ABC) != strlen (pub_key))
return 0;
dh = DHparams_dup (g_dh);
pub_key_data = dh1080_decode_b64 (pub_key, &pub_key_len);
pk = BN_bin2bn (pub_key_data, pub_key_len, NULL);
if (DH_verifyPubKey (pk))
{
guchar shared_key[DH1080_PRIME_BYTES] = { 0 };
guchar sha256[SHA256_DIGEST_LENGTH] = { 0 };
char *priv_key_data;
gsize priv_key_len;
int shared_len;
BIGNUM *priv_key_num;
priv_key_data = dh1080_decode_b64 (priv_key, &priv_key_len);
priv_key_num = BN_bin2bn(priv_key_data, priv_key_len, NULL);
#ifndef HAVE_DH_SET0_KEY
dh->priv_key = priv_key_num;
#else
DH_set0_key (dh, temp_pub_key, priv_key_num);
#endif
shared_len = DH_compute_key (shared_key, pk, dh);
SHA256(shared_key, shared_len, sha256);
*secret_key = dh1080_encode_b64 (sha256, sizeof(sha256));
OPENSSL_cleanse (priv_key_data, priv_key_len);
g_free (priv_key_data);
}
BN_free (pk);
DH_free (dh);
g_free (pub_key_data);
return 1;
}

View File

@ -1,24 +0,0 @@
/* HexChat
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#pragma once
int dh1080_generate_key (char **, char **);
int dh1080_compute_key (const char *, const char *, char **);
int dh1080_init (void);
void dh1080_deinit (void);

View File

@ -53,14 +53,13 @@
<None Include="fishlim.def" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="dh1080.h" />
<ClInclude Include="bool.h" />
<ClInclude Include="fish.h" />
<ClInclude Include="irc.h" />
<ClInclude Include="keystore.h" />
<ClInclude Include="plugin_hexchat.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="dh1080.c" />
<ClCompile Include="fish.c" />
<ClCompile Include="irc.c" />
<ClCompile Include="keystore.c" />

View File

@ -50,9 +50,7 @@ gboolean irc_parse_message(const char *words[],
if (command) *command = words[w];
w++;
if (parameters_offset)
*parameters_offset = w;
*parameters_offset = w;
return TRUE;
}

View File

@ -63,22 +63,6 @@ static const char *get_keystore_password(void) {
}
static char *escape_nickname(const char *nick) {
char *escaped = g_strdup(nick);
char *p = escaped;
while (*p) {
if (*p == '[')
*p = '~';
else if (*p == ']')
*p = '!';
++p;
}
return escaped;
}
/**
* Gets a value for a nick/channel from addon_fishlim.conf. Unlike
* g_key_file_get_string, this function is case insensitive.
@ -106,13 +90,9 @@ static gchar *get_nick_value(GKeyFile *keyfile, const char *nick, const char *it
char *keystore_get_key(const char *nick) {
/* Get the key */
GKeyFile *keyfile = getConfigFile();
char *escaped_nick = escape_nickname(nick);
gchar *value = get_nick_value(keyfile, escaped_nick, "key");
gchar *value = get_nick_value(keyfile, nick, "key");
g_key_file_free(keyfile);
g_free(escaped_nick);
if (!value)
return NULL;
if (!value) return NULL;
if (strncmp(value, "+OK ", 4) != 0) {
/* Key is stored in plaintext */
@ -177,9 +157,7 @@ static gboolean save_keystore(GKeyFile *keyfile) {
#if !GLIB_CHECK_VERSION(2,40,0)
ok = keyfile_save_to_file (keyfile, filename);
#else
G_GNUC_BEGIN_IGNORE_DEPRECATIONS /* Hide false positive */
ok = g_key_file_save_to_file (keyfile, filename, NULL);
G_GNUC_END_IGNORE_DEPRECATIONS
#endif
g_free (filename);
@ -195,10 +173,9 @@ gboolean keystore_store_key(const char *nick, const char *key) {
char *wrapped;
gboolean ok = FALSE;
GKeyFile *keyfile = getConfigFile();
char *escaped_nick = escape_nickname(nick);
/* Remove old key */
delete_nick(keyfile, escaped_nick);
delete_nick(keyfile, nick);
/* Add new key */
password = get_keystore_password();
@ -212,11 +189,11 @@ gboolean keystore_store_key(const char *nick, const char *key) {
g_free(encrypted);
/* Store encrypted in file */
g_key_file_set_string(keyfile, escaped_nick, "key", wrapped);
g_key_file_set_string(keyfile, nick, "key", wrapped);
g_free(wrapped);
} else {
/* Store unencrypted in file */
g_key_file_set_string(keyfile, escaped_nick, "key", key);
g_key_file_set_string(keyfile, nick, "key", key);
}
/* Save key store file */
@ -224,7 +201,6 @@ gboolean keystore_store_key(const char *nick, const char *key) {
end:
g_key_file_free(keyfile);
g_free(escaped_nick);
return ok;
}
@ -233,15 +209,13 @@ gboolean keystore_store_key(const char *nick, const char *key) {
*/
gboolean keystore_delete_nick(const char *nick) {
GKeyFile *keyfile = getConfigFile();
char *escaped_nick = escape_nickname(nick);
/* Delete entry */
gboolean ok = delete_nick(keyfile, escaped_nick);
gboolean ok = delete_nick(keyfile, nick);
/* Save */
if (ok) save_keystore(keyfile);
g_key_file_free(keyfile);
g_free(escaped_nick);
return ok;
}

View File

@ -1,18 +0,0 @@
if not libssl_dep.found()
error('fish plugin requires openssl')
endif
fishlim_sources = [
'dh1080.c',
'fish.c',
'irc.c',
'keystore.c',
'plugin_hexchat.c'
]
shared_module('fishlim', fishlim_sources,
dependencies: [libgio_dep, hexchat_plugin_dep, libssl_dep],
install: true,
install_dir: plugindir,
name_prefix: '',
)

View File

@ -1,7 +1,6 @@
/*
Copyright (c) 2010-2011 Samuel Lidén Borell <samuel@kodafritt.se>
Copyright (c) 2015 <the.cypher@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@ -33,24 +32,17 @@
#define HEXCHAT_MAX_WORDS 32
#include "fish.h"
#include "dh1080.h"
#include "keystore.h"
#include "irc.h"
static const char plugin_name[] = "FiSHLiM";
static const char plugin_desc[] = "Encryption plugin for the FiSH protocol. Less is More!";
static const char plugin_version[] = "0.1.0";
static const char plugin_version[] = "0.0.17";
static const char usage_setkey[] = "Usage: SETKEY [<nick or #channel>] <password>, sets the key for a channel or nick";
static const char usage_delkey[] = "Usage: DELKEY <nick or #channel>, deletes the key for a channel or nick";
static const char usage_keyx[] = "Usage: KEYX [<nick>], performs DH1080 key-exchange with <nick>";
static const char usage_topic[] = "Usage: TOPIC+ <topic>, sets a new encrypted topic for the current channel";
static const char usage_notice[] = "Usage: NOTICE+ <nick or #channel> <notice>";
static const char usage_msg[] = "Usage: MSG+ <nick or #channel> <message>";
static hexchat_plugin *ph;
static GHashTable *pending_exchanges;
/**
@ -66,38 +58,6 @@ gchar *get_config_filename(void) {
return filename_fs;
}
static inline gboolean irc_is_query (const char *name) {
const char *chantypes = hexchat_list_str (ph, NULL, "chantypes");
return strchr (chantypes, name[0]) == NULL;
}
static hexchat_context *find_context_on_network (const char *name) {
hexchat_list *channels;
hexchat_context *ret = NULL;
int id;
if (hexchat_get_prefs(ph, "id", NULL, &id) != 2)
return NULL;
channels = hexchat_list_get(ph, "channels");
if (!channels)
return NULL;
while (hexchat_list_next(ph, channels)) {
int chan_id = hexchat_list_int(ph, channels, "id");
const char *chan_name = hexchat_list_str(ph, channels, "channel");
if (chan_id == id && chan_name && hexchat_nickcmp (ph, chan_name, name) == 0) {
ret = (hexchat_context*)hexchat_list_str(ph, channels, "context");
break;
}
};
hexchat_list_free(ph, channels);
return ret;
}
int irc_nick_cmp(const char *a, const char *b) {
return hexchat_nickcmp (ph, a, b);
}
@ -203,11 +163,11 @@ static int handle_incoming(char *word[], char *word_eol[], hexchat_event_attrs *
/* Prefix with colon, which gets stripped out otherwise */
g_string_append_c (message, ':');
}
if (prefix_char) {
g_string_append_c (message, prefix_char);
}
} else {
/* Add unencrypted data (for example, a prefix from a bouncer or bot) */
peice = word[uw];
@ -216,7 +176,7 @@ static int handle_incoming(char *word[], char *word_eol[], hexchat_event_attrs *
g_string_append (message, peice);
}
g_free(decrypted);
/* Simulate unencrypted message */
/* hexchat_printf(ph, "simulating: %s\n", message->str); */
hexchat_command(ph, message->str);
@ -224,103 +184,26 @@ static int handle_incoming(char *word[], char *word_eol[], hexchat_event_attrs *
g_string_free (message, TRUE);
g_free(sender_nick);
return HEXCHAT_EAT_HEXCHAT;
decrypt_error:
g_free(decrypted);
g_free(sender_nick);
return HEXCHAT_EAT_NONE;
}
static int handle_keyx_notice(char *word[], char *word_eol[], void *userdata) {
const char *dh_message = word[4];
const char *dh_pubkey = word[5];
hexchat_context *query_ctx;
const char *prefix;
gboolean cbc;
char *sender, *secret_key, *priv_key = NULL;
if (!*dh_message || !*dh_pubkey || strlen(dh_pubkey) != 181)
return HEXCHAT_EAT_NONE;
if (!irc_parse_message((const char**)word, &prefix, NULL, NULL) || !prefix)
return HEXCHAT_EAT_NONE;
sender = irc_prefix_get_nick(prefix);
query_ctx = find_context_on_network(sender);
if (query_ctx)
hexchat_set_context(ph, query_ctx);
dh_message++; /* : prefix */
if (*dh_message == '+' || *dh_message == '-')
dh_message++; /* identify-msg */
cbc = g_strcmp0 (word[6], "CBC") == 0;
if (!strcmp(dh_message, "DH1080_INIT")) {
char *pub_key;
if (cbc) {
hexchat_print(ph, "Received key exchange for CBC mode which is not supported.");
goto cleanup;
}
hexchat_printf(ph, "Received public key from %s, sending mine...", sender);
if (dh1080_generate_key(&priv_key, &pub_key)) {
hexchat_commandf(ph, "quote NOTICE %s :DH1080_FINISH %s", sender, pub_key);
g_free(pub_key);
} else {
hexchat_print(ph, "Failed to generate keys");
goto cleanup;
}
} else if (!strcmp (dh_message, "DH1080_FINISH")) {
char *sender_lower = g_ascii_strdown(sender, -1);
/* FIXME: Properly respect irc casing */
priv_key = g_hash_table_lookup(pending_exchanges, sender_lower);
g_hash_table_steal(pending_exchanges, sender_lower);
g_free(sender_lower);
if (cbc) {
hexchat_print(ph, "Received key exchange for CBC mode which is not supported.");
goto cleanup;
}
if (!priv_key) {
hexchat_printf(ph, "Received a key exchange response for unknown user: %s", sender);
goto cleanup;
}
} else {
/* Regular notice */
g_free(sender);
return HEXCHAT_EAT_NONE;
}
if (dh1080_compute_key(priv_key, dh_pubkey, &secret_key)) {
keystore_store_key(sender, secret_key);
hexchat_printf(ph, "Stored new key for %s", sender);
g_free(secret_key);
} else {
hexchat_print(ph, "Failed to create secret key!");
}
cleanup:
g_free(sender);
g_free(priv_key);
return HEXCHAT_EAT_ALL;
}
/**
* Command handler for /setkey
*/
static int handle_setkey(char *word[], char *word_eol[], void *userdata) {
const char *nick;
const char *key;
/* Check syntax */
if (*word[2] == '\0') {
hexchat_printf(ph, "%s\n", usage_setkey);
return HEXCHAT_EAT_HEXCHAT;
}
if (*word[3] == '\0') {
/* /setkey password */
nick = hexchat_get_info(ph, "channel");
@ -330,14 +213,14 @@ static int handle_setkey(char *word[], char *word_eol[], void *userdata) {
nick = word[2];
key = word_eol[3];
}
/* Set password */
if (keystore_store_key(nick, key)) {
hexchat_printf(ph, "Stored key for %s\n", nick);
} else {
hexchat_printf(ph, "\00305Failed to store key in addon_fishlim.conf\n");
}
return HEXCHAT_EAT_HEXCHAT;
}
@ -346,174 +229,25 @@ static int handle_setkey(char *word[], char *word_eol[], void *userdata) {
*/
static int handle_delkey(char *word[], char *word_eol[], void *userdata) {
const char *nick;
/* Check syntax */
if (*word[2] == '\0' || *word[3] != '\0') {
hexchat_printf(ph, "%s\n", usage_delkey);
return HEXCHAT_EAT_HEXCHAT;
}
nick = g_strstrip (word_eol[2]);
/* Delete the given nick from the key store */
if (keystore_delete_nick(nick)) {
hexchat_printf(ph, "Deleted key for %s\n", nick);
} else {
hexchat_printf(ph, "\00305Failed to delete key in addon_fishlim.conf!\n");
}
return HEXCHAT_EAT_HEXCHAT;
}
static int handle_keyx(char *word[], char *word_eol[], void *userdata) {
const char *target = word[2];
hexchat_context *query_ctx = NULL;
char *pub_key, *priv_key;
int ctx_type;
if (*target)
query_ctx = find_context_on_network(target);
else {
target = hexchat_get_info(ph, "channel");
query_ctx = hexchat_get_context (ph);
}
if (query_ctx) {
hexchat_set_context(ph, query_ctx);
ctx_type = hexchat_list_int(ph, NULL, "type");
}
if ((query_ctx && ctx_type != 3) || (!query_ctx && !irc_is_query(target))) {
hexchat_print(ph, "You can only exchange keys with individuals");
return HEXCHAT_EAT_ALL;
}
if (dh1080_generate_key(&priv_key, &pub_key)) {
g_hash_table_replace (pending_exchanges, g_ascii_strdown(target, -1), priv_key);
hexchat_commandf(ph, "quote NOTICE %s :DH1080_INIT %s", target, pub_key);
hexchat_printf(ph, "Sent public key to %s, waiting for reply...", target);
g_free(pub_key);
} else {
hexchat_print(ph, "Failed to generate keys");
}
return HEXCHAT_EAT_ALL;
}
/**
* Command handler for /topic+
*/
static int handle_crypt_topic(char *word[], char *word_eol[], void *userdata) {
const char *target;
const char *topic = word_eol[2];
char *buf;
if (!*topic) {
hexchat_print(ph, usage_topic);
return HEXCHAT_EAT_ALL;
}
if (hexchat_list_int(ph, NULL, "type") != 2) {
hexchat_printf(ph, "Please change to the channel window where you want to set the topic!");
return HEXCHAT_EAT_ALL;
}
target = hexchat_get_info(ph, "channel");
buf = fish_encrypt_for_nick(target, topic);
if (buf == NULL) {
hexchat_printf(ph, "/topic+ error, no key found for %s", target);
return HEXCHAT_EAT_ALL;
}
hexchat_commandf(ph, "TOPIC %s +OK %s", target, buf);
g_free(buf);
return HEXCHAT_EAT_ALL;
}
/**
* Command handler for /notice+
*/
static int handle_crypt_notice(char *word[], char *word_eol[], void *userdata)
{
const char *target = word[2];
const char *notice = word_eol[3];
char *buf;
if (!*target || !*notice) {
hexchat_print(ph, usage_notice);
return HEXCHAT_EAT_ALL;
}
buf = fish_encrypt_for_nick(target, notice);
if (buf == NULL) {
hexchat_printf(ph, "/notice+ error, no key found for %s.", target);
return HEXCHAT_EAT_ALL;
}
hexchat_commandf(ph, "quote NOTICE %s :+OK %s", target, buf);
hexchat_emit_print(ph, "Notice Sent", target, notice);
g_free(buf);
return HEXCHAT_EAT_ALL;
}
/**
* Command handler for /msg+
*/
static int handle_crypt_msg(char *word[], char *word_eol[], void *userdata)
{
const char *target = word[2];
const char *message = word_eol[3];
hexchat_context *query_ctx;
char *buf;
if (!*target || !*message) {
hexchat_print(ph, usage_msg);
return HEXCHAT_EAT_ALL;
}
buf = fish_encrypt_for_nick(target, message);
if (buf == NULL) {
hexchat_printf(ph, "/msg+ error, no key found for %s", target);
return HEXCHAT_EAT_ALL;
}
hexchat_commandf(ph, "PRIVMSG %s :+OK %s", target, buf);
query_ctx = find_context_on_network(target);
if (query_ctx) {
hexchat_set_context(ph, query_ctx);
/* FIXME: Mode char */
hexchat_emit_print(ph, "Your Message", hexchat_get_info(ph, "nick"),
message, "", "");
}
else {
hexchat_emit_print(ph, "Message Send", target, message);
}
g_free(buf);
return HEXCHAT_EAT_ALL;
}
static int handle_crypt_me(char *word[], char *word_eol[], void *userdata) {
const char *channel = hexchat_get_info(ph, "channel");
char *buf;
buf = fish_encrypt_for_nick(channel, word_eol[2]);
if (!buf)
return HEXCHAT_EAT_NONE;
hexchat_commandf(ph, "PRIVMSG %s :\001ACTION +OK %s \001", channel, buf);
hexchat_emit_print(ph, "Your Action", hexchat_get_info(ph, "nick"),
word_eol[2], NULL);
g_free(buf);
return HEXCHAT_EAT_ALL;
}
/**
* Returns the plugin name version information.
*/
@ -533,44 +267,30 @@ int hexchat_plugin_init(hexchat_plugin *plugin_handle,
const char **version,
char *arg) {
ph = plugin_handle;
/* Send our info to HexChat */
*name = plugin_name;
*desc = plugin_desc;
*version = plugin_version;
/* Register commands */
hexchat_hook_command(ph, "SETKEY", HEXCHAT_PRI_NORM, handle_setkey, usage_setkey, NULL);
hexchat_hook_command(ph, "DELKEY", HEXCHAT_PRI_NORM, handle_delkey, usage_delkey, NULL);
hexchat_hook_command(ph, "KEYX", HEXCHAT_PRI_NORM, handle_keyx, usage_keyx, NULL);
hexchat_hook_command(ph, "TOPIC+", HEXCHAT_PRI_NORM, handle_crypt_topic, usage_topic, NULL);
hexchat_hook_command(ph, "NOTICE+", HEXCHAT_PRI_NORM, handle_crypt_notice, usage_notice, NULL);
hexchat_hook_command(ph, "MSG+", HEXCHAT_PRI_NORM, handle_crypt_msg, usage_msg, NULL);
hexchat_hook_command(ph, "ME", HEXCHAT_PRI_NORM, handle_crypt_me, NULL, NULL);
/* Add handlers */
hexchat_hook_command(ph, "", HEXCHAT_PRI_NORM, handle_outgoing, NULL, NULL);
hexchat_hook_server(ph, "NOTICE", HEXCHAT_PRI_HIGHEST, handle_keyx_notice, NULL);
hexchat_hook_server_attrs(ph, "NOTICE", HEXCHAT_PRI_NORM, handle_incoming, NULL);
hexchat_hook_server_attrs(ph, "PRIVMSG", HEXCHAT_PRI_NORM, handle_incoming, NULL);
/* hexchat_hook_server(ph, "RAW LINE", HEXCHAT_PRI_NORM, handle_debug, NULL); */
hexchat_hook_server_attrs(ph, "TOPIC", HEXCHAT_PRI_NORM, handle_incoming, NULL);
hexchat_hook_server_attrs(ph, "332", HEXCHAT_PRI_NORM, handle_incoming, NULL);
if (!dh1080_init())
return 0;
pending_exchanges = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
hexchat_printf(ph, "%s plugin loaded\n", plugin_name);
/* Return success */
return 1;
}
int hexchat_plugin_deinit(void) {
g_clear_pointer(&pending_exchanges, g_hash_table_destroy);
dh1080_deinit();
hexchat_printf(ph, "%s plugin unloaded\n", plugin_name);
return 1;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{f4eaf231-f095-42d3-8427-b2b6006cacb1}</UniqueIdentifier>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{0166c0f9-7968-4a09-9ef5-a5179c7746eb}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="lua.c" />
</ItemGroup>
</Project>

View File

@ -1,12 +0,0 @@
if cc.get_id() == 'msvc'
lua_dep = cc.find_library('lua51')
else
lua_dep = dependency(get_option('with-lua'))
endif
shared_module('lua', 'lua.c',
dependencies: [libgio_dep, hexchat_plugin_dep, lua_dep],
install: true,
install_dir: plugindir,
name_prefix: '',
)

View File

@ -1,39 +0,0 @@
plugindir = join_paths(get_option('libdir'), 'hexchat/plugins')
if host_machine.system() == 'windows'
if get_option('with-exec')
subdir('exec')
endif
if get_option('with-upd')
subdir('upd')
endif
if get_option('with-winamp')
subdir('winamp')
endif
endif
if get_option('with-checksum')
subdir('checksum')
endif
if get_option('with-fishlim')
subdir('fishlim')
endif
if get_option('with-lua') != 'false'
subdir('lua')
endif
if get_option('with-perl') != 'false'
subdir('perl')
endif
if get_option('with-python') != 'false'
subdir('python')
endif
if get_option('with-sysinfo')
subdir('sysinfo')
endif

156
plugins/mpcinfo/functions.c Normal file
View File

@ -0,0 +1,156 @@
/*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <glib.h>
char *split(char *text, char separator)
{
int pos = -1;
size_t i;
for (i = 0; i < strlen(text); i++)
{
if (text[i] == separator) {
pos = i;
i = strlen(text) + 1;
}
}
if (pos == -1)
{
return text;
}
text[pos] = 0;
return &(text[pos + 1]);
}
int endsWith(char *text, char *suffix){
char *tmp=strstr(text,suffix);
if (tmp==NULL) return 0;
if (strlen(tmp)==strlen(suffix)) return 1;
return 0;
}
int inStr(char *s1, size_t sl1, char *s2)
{
size_t i;
for (i = 0; i < sl1 - strlen(s2); i++)
{
size_t j;
for (j = 0; j < strlen(s2); j++)
{
if (s1[i + j] != s2[j])
{
j = strlen(s2) + 2;
}
}
if (j == strlen(s2))
{
return i;
}
}
return -1;
}
static char *subString(char *text, int first, int length, int spcKill){
//if (DEBUG==1) putlog("creating substring");
char *ret = g_new (char, length + 1);
int i;
ret[length]=0;
for (i=0;i<length;i++){
ret[i]=text[i+first];
//if (ret[i]==0) ret[i]='0';
}
if (spcKill==1){
for (i=length-1;i>=0;i--){
if (ret[i]==32) ret[i]=0;
else i=-1;
}
}
//if (DEBUG==1) putlog("substring created");
return ret;
}
static char *substring(char *text, int first, int length){return subString(text,first,length,0);}
char *readLine(FILE *f){
//if (DEBUG==1) putlog("reading line from file");
char *buffer = g_new (char, 1024);
int pos=0;
int cc=0;
while((cc!=EOF)&&(pos<1024)&&(cc!=10)){
cc=fgetc(f);
if ((cc!=10)&&(cc!=13)){
if (cc==EOF) buffer[pos]=0;
else buffer[pos]=(char)cc;pos++;
}
}
if (buffer[pos]==EOF) hexchat_printf(ph,"EOF: %i\n",pos);
return buffer;
}
char *toUpper(char *text)
{
char *ret = (char*) calloc(strlen(text) + 1, sizeof(char));
size_t i;
for (i = 0; i < strlen(text); i++)
{
ret[i] = toupper(text[i]);
}
ret[strlen(text)] = 0;
return ret;
}
static char *str3cat(char *s1, char *s2, char *s3){
//if (DEBUG==1) putlog("cating 3 strings");
char *ret=(char*)calloc(strlen(s1)+strlen(s2)+strlen(s3)+1,sizeof(char));
strcpy(ret,s1);strcat(ret,s2);strcat(ret,s3);
ret[strlen(s1)+strlen(s2)+strlen(s3)]=0;
//if (DEBUG==1) putlog("strings cated");
return ret;
}
char *replace(char *text, char *from, char *to){
//if (DEBUG==1) putlog("replacing");
char *ret=(char*)calloc( strlen(text)+(strlen(to)-strlen(from)),sizeof(char));
char *left;
char *right;
int pos=inStr(text,strlen(text),from);
if (pos!=-1){
left=substring(text,0,pos);
right=substring(text,pos+strlen(from),strlen(text)-(pos+strlen(from)));
ret=str3cat(left,to,right);
return replace(ret,from,to);
}
//if (DEBUG==1) putlog("replaced");
return text;
}
char *intReplaceF(char *text, char *from, int to, char *form){
//if (DEBUG==1) putlog("replaceF");
char *buffer=(char*) calloc(16,sizeof(char));
sprintf(buffer,form,to);
//if (DEBUG==1) putlog("replaceF done");
return replace(text,from,buffer);
}
char *intReplace(char *text, char *from, int to){return intReplaceF(text,from,to,"%i");}

330
plugins/mpcinfo/mp3Info.c Normal file
View File

@ -0,0 +1,330 @@
/*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
//#include <stdio.h>
#include <sys/stat.h>
//#include "functions.c"
struct tagInfo{
int mode;
int cbr;
int bitrate;
unsigned int freq;
char *artist;
char *title;
char *album;
char *comment;
char *genre;
//int genre;
//int track;
};
static int RATES[2][3][15]={
{//mpeg2
{-1,8,16,24,32,64,80,56,64,128,160,112,128,256,320},//layer3 (V2)
{-1,32,48,56,64,80,96,112,128,160,192,224,256,320,384},//layer2 (V2)
{-1,32,64,96,128,160,192,224,256,288,320,352,384,416,448},//layer1 (V2)
},
{//mpeg1
{-1,32,40,48,56,64,80,96,112,128,160,192,224,256,320},//layer3 (V1)
{-1,32,48,56,64,80,96,112,128,160,192,224,256,320,384},//layer2 (V1)
{-1,32,64,96,128,160,192,224,256,288,320,352,384,416,448},//layer1 (V1)
}};
static int FREQS[2][4]={{22050,24000,16000,-1},{44100,48000,32000,-1}};
//static double FRATES[]={38.5,32.5,27.8,0.0};
static char GENRES[][50]={"Blues","Classic Rock","Country","Dance","Disco","Funk","Grunge","Hip-Hop","Jazz","Metal",
"New Age","Oldies","Other","Pop","R&B","Rap","Reggae","Rock","Techno","Industrial",
"Alternative","Ska","Death Metal","Pranks","Soundtrack","Euro-Techno","Ambient","Trip-Hop","Vocal","Jazz+Funk",
"Fusion","Trance","Classical","Instrumental","Acid","House","Game","Sound Clip","Gospel","Noise",
"AlternRock","Bass","Soul","Punk","Space","Meditative","Instrumental Pop","Instrumental Rock","Ethnic","Gothic",
"Darkwave","Techno-Industrial","Electronic","Pop-Folk","Eurodance","Dream","Southern Rock","Comedy","Cult","Gangsta",
"Top 40","Christian Rap","Pop/Funk","Jungle","Native American","Cabaret","New Wave","Psychadelic","Rave","Showtunes",
"Trailer","Lo-Fi","Tribal","Acid Punk","Acid Jazz","Polka","Retro","Musical","Rock & Roll","Hard Rock",
//################## END OF OFFICIAL ID3 TAGS, WINAMP TAGS BELOW ########################################
"Folk","Folk/Rock","National Folk","Swing","Fast Fusion","Bebob","Latin","Revival","Celtic","Bluegrass",
"Avantgarde","Gothic Rock","Progressive Rock","Psychedelic Rock","Symphonic Rock","Slow Rock","Big Band","Chorus","Easy Listening","Acoustic",
"Humour","Speech","Chanson","Opera","Chamber Music","Sonata","Symphony","Booty Bass","Primus","Porn Groove",
"Satire","Slow Jam","Club","Tango","Samba","Folklore","Ballad","Poweer Ballad","Rhytmic Soul","Freestyle",
"Duet","Punk Rock","Drum Solo","A Capela","Euro-House","Dance Hall",
//################## FOUND AT http://en.wikipedia.org/wiki/ID3 ###########################################
"Goa","Drum & Bass","Club-House","Hardcore",
"Terror","Indie","BritPop","Negerpunk","Polsk Punk","Beat","Christian Gangsta Rap","Heavy Metal","Black Metal","Crossover",
"Contemporary Christian","Christian Rock","Merengue","Salsa","Thrash Metal","Anime","JPop","Synthpop"
};
static char MODES [][13]={"Stereo","Joint-Stereo","Dual-Channel","Mono"};
int iPow(int x, int y){return (int)(pow((double)x,(double) y));}
int str2int(char *text)
{
int ret = 0;
size_t i;
for (i = 1; i <= strlen(text); i++)
{
if ((text[strlen(text) - i] > 57) || (text[strlen(text) - i] < 48))
{
hexchat_printf(ph, "invalid char in string: %i", (int) text[strlen(text) - i]);
return 255;
}
ret += ((int) text[strlen(text) - i] - 48)*iPow(10, i - 1);
}
return ret;
}
static char *tagExtract(char *tag, int tagLen, char* info){
//if (DEBUG==1) putlog("extracting tag");
int pos, len, i;
pos=inStr(tag,tagLen,info);
//hexchat_printf(ph,"pos=%i",pos);
if (pos==-1) return "";//NULL;
//printf("position of %s = %i\n",info,pos);
len=0;
//for (i=pos;i<pos+10;i++)printf("tag[%i]=%i \n",i,tag[i]);
for (i=0;i<4;i++) {
len+=tag[pos+strlen(info)+i]*iPow(255,3-i);
}
//printf("Tag-Length: %i\n",len);
if (strcmp("COMM",info)!=0) return substring(tag,pos+7+strlen(info),len-1);//11
return substring(tag,pos+7+strlen(info),len-1);//11
//char *ct=substring(tag,pos+7+strlen(info),len-1);//11
//return substring(ct,strlen(ct)+1,len-1-strlen(ct)); //<-- do not understand, what i did here :(
}
struct tagInfo readID3V1(char *file){
//if (DEBUG==1) putlog("reading ID3V1");
FILE *f;
struct tagInfo ret;
int res, i, c, val;
char *tag;
char *id;
char *tmp;
tag = (char*) malloc(sizeof(char)*129);
ret.artist=NULL;
f=fopen(file,"rb");
if (f==NULL){
hexchat_print(ph,"file not found while trying to read id3v1");
//if (DEBUG==1) putlog("file not found while trying to read id3v1");
return ret;
}
//int offset=getSize(file)-128;
res=fseek(f,-128,SEEK_END);
if (res!=0) {printf("seek failed\n");fclose(f);return ret;}
//long int pos=ftell(f);
//printf("position= %li\n",pos);
for (i=0;i<128;i++) {
c=fgetc(f);
if (c==EOF) {hexchat_printf(ph,"read ID3V1 failed\n");fclose(f);return ret;}
tag[i]=(char)c;
}
fclose(f);
//printf("tag readed: \n");
id=substring(tag,0,3);
//printf("header: %s\n",id);
if (strcmp(id,"TAG")!=0){hexchat_printf(ph,"no id3 v1 found\n");return ret;}
ret.title=subString(tag,3,30,1);
ret.artist=subString(tag,33,30,1);
ret.album=subString(tag,63,30,1);
ret.comment=subString(tag,97,30,1);
tmp=substring(tag,127,1);
//ret.genre=substring(tag,127,1);
val=(int)tmp[0];
if (val<0)val+=256;
//hexchat_printf(ph, "tmp[0]=%i (%i)",val,tmp[0]);
if ((val<148)&&(val>=0))
ret.genre=GENRES[val];//#############changed
else {
ret.genre="unknown";
//hexchat_printf(ph, "tmp[0]=%i (%i)",val,tmp[0]);
}
//hexchat_printf(ph, "tmp: \"%s\" -> %i",tmp,tmp[0]);
//hexchat_printf(ph,"genre \"%s\"",ret.genre);
//if (DEBUG==1) putlog("id3v1 extracted");
return ret;
}
char *extractID3Genre(char *tag)
{
if (tag[strlen(tag) - 1] == ')')
{
tag[strlen(tag) - 1] = 0;
tag = &tag[1];
return GENRES[str2int(tag)];
}
else
{
size_t i;
for (i = 0; i < strlen(tag); i++)
{
if (tag[i] == ')')
{
tag = &tag[i] + 1;
return tag;
}
}
}
return "[152] failed";
}
struct tagInfo readID3V2(char *file){
//if (DEBUG==1) putlog("reading id3v2");
FILE *f;
int i, c, len;
char header[10];
char *tag;
struct tagInfo ret;
f = fopen(file,"rb");
//hexchat_printf(ph,"file :%s",file);
if (f==NULL)
{
hexchat_print(ph,"file not found whilt trying to read ID3V2");
//if (DEBUG==1)putlog("file not found while trying to read ID3V2");
return ret;
}
ret.artist=NULL;
for (i=0;i<10;i++){
c=fgetc(f);
if (c==EOF){
fclose(f);
//putlog("found eof while reading id3v2");
return ret;
}
header[i]=(char)c;
}
if (strstr(header,"ID3")==header){
//hexchat_printf(ph,"found id3v2\n");
len=0;
for (i=6;i<10;i++) len+=(int)header[i]*iPow(256,9-i);
//char *tag=(char*)malloc(sizeof(char)*len);
tag=(char*) calloc(len,sizeof(char)); //malloc(sizeof(char)*len);
for (i=0;i<len;i++){c=fgetc(f);tag[i]=(char)c;}
//hexchat_printf(ph,"tag length: %i\n",len);
//hexchat_printf(ph,"tag: %s\n",tag);
fclose(f);
ret.comment=tagExtract(tag,len,"COMM");
//hexchat_printf(ph,"Comment: %s\n",ret.comment);
ret.genre=tagExtract(tag,len,"TCON");
//if (strcmp(ret.genre,"(127)")==0) ret.genre="unknown";
//hexchat_printf(ph, "ret.genre = %s",ret.genre);
if ((ret.genre!=NULL)&&(ret.genre[0]=='(')) ret.genre=extractID3Genre(ret.genre);
//hexchat_printf(ph,"genre: %s\n",ret.genre);
ret.title=tagExtract(tag,len,"TIT2");
//hexchat_printf(ph,"Title: %s\n",ret.title);
ret.album=tagExtract(tag,len,"TALB");
//hexchat_printf(ph,"Album: %s\n",ret.album);
ret.artist=tagExtract(tag,len,"TPE1");
//hexchat_printf(ph,"Artist: %s\n",ret.artist);
}
else{fclose(f);printf("no id3v2 tag found\n"); return ret;}
//printf("id2v2 done\n");
//if (DEBUG==1) putlog("id3v2 readed");
return ret;
}
struct tagInfo readHeader(char *file){
//if (DEBUG==1) putlog("reading header");
FILE *f;
//int buffer[5120];
int versionB, layerB, bitrateB, freqB, modeB;
int header[4];
int count=0;
int cc=0;
struct tagInfo info;
info.artist=NULL;
f = fopen(file,"rb");
if (f==NULL)
{
hexchat_print(ph,"file not found while trying to read mp3 header");
//if (DEBUG==1) putlog("file not found while trying to read mp3 header");
return info;
}
//struct tagInfo tagv2
info=readID3V2(file);
//struct tagInfo tagv1;//=readID3V1(file);
//if (tagv2.artist!=NULL){info=tagv2;}
//else {
if (info.artist==NULL){
//printf("searching for id3v1\n");
//tagv1=readID3V1(file);
info=readID3V1(file); //#####################
}
/*
if (tagv1.artist!=NULL){
//printf("Artist: %s\nTitle: %s\nAlbum: %s\nComment: %s\nGenre: %s\n",tagv1.artist,tagv1.title,tagv1.album,tagv1.comment,tagv1.genre);
info=tagv1;
}
*/
while ((count<5120)&&(cc!=EOF)&&(cc!=255)) {cc=fgetc(f);count++;}
if ((cc==EOF)||(count==5119)) printf("no header found\n");
else {
//printf("located header at %i\n",count);
header[0]=255;
for (count=1;count<4;count++){
header[count]=fgetc(f);
//printf("header[%i]=%i\n",count,header[count]);
}
versionB=(header[1]&8)>>3;
layerB=(header[1]&6)>>1;
bitrateB=(header[2]&240)>>4; //4
freqB=(header[2]&12)>>2;//2
modeB=(header[3]&192)>>6;//6
//printf("Mpeg: %i\nLayer: %i\nBitrate: %i\nFreq: %i\nMode: %i\n",versionB, layerB, bitrateB, freqB, modeB);
//int Bitrate=RATES[versionB][layerB-1][bitrateB];
//int Freq=FREQS[versionB][freqB];
info.bitrate=RATES[versionB][layerB-1][bitrateB];
info.freq=FREQS[versionB][freqB];
info.mode=modeB;
}
fclose(f);
//if (DEBUG==1) putlog("header readed");
return info;
}
/*
static void printMp3Info(char *file){
//printf("\nScanning Mp3-File for Informations: %s\n",file);
//printf("size:\t%10d byte\n",getSize(file));
struct tagInfo info =readHeader(file);
printf("%s | %10d",file,getSize(file));
if (info.bitrate>0){
//printf("Bitrate: %i\nFreq: %i\nMode: %s\n",info.bitrate,info.freq,MODES[info.mode]);
printf(" | %i kbps | %i kHz | %s",info.bitrate,info.freq,MODES[info.mode]);
//if (info.artist!=NULL) printf("\nArtist: %s\nTitle: %s\nAlbum: %s\nComment: %s\nGenre: %s\n",info.artist,info.title,info.album,info.comment,info.genre);
if (info.artist!=NULL) {
printf("| %s | %s | %s | %s | %s",info.artist,info.title,info.album,info.comment,info.genre);
//printf("| %s ",info.title);//,info.title,info.album,info.comment,info.genre
}
}
printf("\n");
}
*/

160
plugins/mpcinfo/mpcInfo.c Normal file
View File

@ -0,0 +1,160 @@
/*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
//static int DEBUG=0;
static char *VERSION="0.0.6";
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include "hexchat-plugin.h"
static hexchat_plugin *ph;
#include "functions.c"
#include "mp3Info.c"
#include "oggInfo.c"
#include "theme.c"
static int print_themes (char *word[], char *word_eol[], void *userdata){
printThemes();
return HEXCHAT_EAT_ALL;
}
static int mpc_themeReload(char *word[], char *word_eol[], void *userdata){
themeInit();
loadThemes();
return HEXCHAT_EAT_ALL;
}
static int mpc_tell(char *word[], char *word_eol[], void *userdata){
char *tTitle, *zero, *oggLine, *line;
struct tagInfo info;
HWND hwnd = FindWindow("MediaPlayerClassicW",NULL);
if (hwnd==0) {hexchat_print(ph, randomLine(notRunTheme));return HEXCHAT_EAT_ALL;}
tTitle = g_new(char, 1024);
GetWindowText(hwnd, tTitle, 1024);
zero = strstr (tTitle, " - Media Player Classic");
if (zero != NULL)
{
zero[0] = 0;
}
else
{
g_free(tTitle);
hexchat_print(ph, "pattern not found");
return HEXCHAT_EAT_ALL;
}
if ((tTitle[1]==':')&&(tTitle[2]=='\\')){
//hexchat_print(ph,"seams to be full path");
if (endsWith(tTitle,".mp3")==1){
//hexchat_print(ph,"seams to be a mp3 file");
info = readHeader(tTitle);
if ((info.artist!=NULL)&&(strcmp(info.artist,"")!=0)){
char *mode=MODES[info.mode];
//hexchat_printf(ph,"mode: %s\n",mode);
char *mp3Line=randomLine(mp3Theme);
mp3Line=replace(mp3Line,"%art",info.artist);
mp3Line=replace(mp3Line,"%tit",info.title);
mp3Line=replace(mp3Line,"%alb",info.album);
mp3Line=replace(mp3Line,"%com",info.comment);
mp3Line=replace(mp3Line,"%gen",info.genre);
//mp3Line=replace(mp3Line,"%time",pos);
//mp3Line=replace(mp3Line,"%length",len);
//mp3Line=replace(mp3Line,"%ver",waVers);
//mp3Line=intReplace(mp3Line,"%br",br);
//mp3Line=intReplace(mp3Line,"%frq",frq);
mp3Line=intReplace(mp3Line,"%br",info.bitrate);
mp3Line=intReplace(mp3Line,"%frq",info.freq);
mp3Line=replace(mp3Line,"%mode",mode);
//mp3Line=replace(mp3Line,"%size",size);
//mp3Line=intReplace(mp3Line,"%perc",perc);
//mp3Line=replace(mp3Line,"%plTitle",title);
mp3Line=replace(mp3Line,"%file",tTitle);
g_free(tTitle);
hexchat_command(ph, mp3Line);
return HEXCHAT_EAT_ALL;
}
}
if (endsWith(tTitle,".ogg")==1){
hexchat_printf(ph,"Ogg detected\n");
info = getOggHeader(tTitle);
if (info.artist!=NULL){
char *cbr;
if (info.cbr==1) cbr="CBR"; else cbr="VBR";
oggLine=randomLine(oggTheme);
//if (cue==1) oggLine=cueLine;
//hexchat_printf(ph,"ogg-line: %s\n",oggLine);
oggLine=replace(oggLine,"%art",info.artist);
oggLine=replace(oggLine,"%tit",info.title);
oggLine=replace(oggLine,"%alb",info.album);
oggLine=replace(oggLine,"%com",info.comment);
oggLine=replace(oggLine,"%gen",info.genre);
//oggLine=replace(oggLine,"%time",pos);
//oggLine=replace(oggLine,"%length",len);
//oggLine=replace(oggLine,"%ver",waVers);
oggLine=intReplace(oggLine,"%chan",info.mode);
oggLine=replace(oggLine,"%cbr",cbr);
oggLine=intReplace(oggLine,"%br",info.bitrate/1000);//br);
oggLine=intReplace(oggLine,"%frq",info.freq);
//oggLine=replace(oggLine,"%size",size);
//oggLine=intReplace(oggLine,"%perc",perc);
//oggLine=replace(oggLine,"%plTitle",title);
oggLine=replace(oggLine,"%file",tTitle);
g_free(tTitle);
hexchat_command(ph, oggLine);
return HEXCHAT_EAT_ALL;
}
}
}
line=randomLine(titleTheme);
line=replace(line,"%title", tTitle);
g_free(tTitle);
hexchat_command(ph, line);
return HEXCHAT_EAT_ALL;
}
int hexchat_plugin_init(hexchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg){
ph = plugin_handle;
*plugin_name = "mpcInfo";
*plugin_desc = "Information-Script for Media Player Classic";
*plugin_version=VERSION;
hexchat_hook_command(ph, "mpc", HEXCHAT_PRI_NORM, mpc_tell,"no help text", 0);
hexchat_hook_command(ph, "mpc_themes", HEXCHAT_PRI_NORM, print_themes,"no help text", 0);
hexchat_hook_command(ph, "mpc_reloadthemes", HEXCHAT_PRI_NORM, mpc_themeReload,"no help text", 0);
hexchat_command (ph, "MENU -ishare\\music.png ADD \"Window/Display Current Song (MPC)\" \"MPC\"");
themeInit();
loadThemes();
hexchat_printf(ph, "%s plugin loaded\n", *plugin_name);
return 1;
}
int
hexchat_plugin_deinit (void)
{
hexchat_command (ph, "MENU DEL \"Window/Display Current Song (MPC)\"");
hexchat_print (ph, "mpcInfo plugin unloaded\n");
return 1;
}

View File

@ -0,0 +1,3 @@
EXPORTS
hexchat_plugin_init
hexchat_plugin_deinit

View File

@ -1,54 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v140</PlatformToolset>
<ConfigurationType>DynamicLibrary</ConfigurationType>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>lua</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
<PropertyGroup>
<TargetName>$(LuaOutput)</TargetName>
<OutDir>$(HexChatRel)plugins\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;$(OwnFlags);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(Glib);$(LuaInclude);..\..\src\common;$(HexChatLib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalDependencies>"$(LuaLib).lib";$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;$(OwnFlags);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(Glib);$(LuaInclude);..\..\src\common;$(HexChatLib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalDependencies>"$(LuaLib).lib";$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="lua.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
</Project>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v140</PlatformToolset>
<ConfigurationType>DynamicLibrary</ConfigurationType>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{B0E36D93-CA2A-49FE-9EB9-9C96C6016EEC}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>mpcinfo</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
<PropertyGroup>
<TargetName>hcmpcinfo</TargetName>
<OutDir>$(HexChatRel)plugins\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;MPCINFO_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\src\common;$(Glib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>mpcinfo.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;MPCINFO_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\src\common;$(Glib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>mpcinfo.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<None Include="mpcinfo.def" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="mpcInfo.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
</Project>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<None Include="mpcinfo.def">
<Filter>Resource Files</Filter>
</None>
</ItemGroup>
<ItemGroup>
<ClCompile Include="mpcInfo.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

126
plugins/mpcinfo/oggInfo.c Normal file
View File

@ -0,0 +1,126 @@
/*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
static int getOggInt(char *buff, int beg, int bytes){
//if (DEBUG==1) putlog("getOggInt");
int ret=0;
int i;
for (i=0;i<bytes;i++){
if (buff[i+beg]>=0) ret+=buff[i+beg]*iPow(256,i);else ret+=(256+buff[i+beg])*iPow(256,i);
//printf("[%i]=%i\n",i,buff[i+beg]);
}
return ret;
}
static char *upperStr(char *text)
{
char *ret = (char*) malloc(sizeof(char)*(strlen(text) + 1));
size_t i;
for (i = 0; i < strlen(text); i++)
{
ret[i] = toupper(text[i]);
}
ret[strlen(text)] = 0;
return ret;
}
struct tagInfo getOggHeader(char *file){
//if (DEBUG==1) putlog("reading ogg header");
char header[4096];
int i, c;
int h1pos, h3pos, maxBr, nomBr, minBr, pos, count, tagLen;
char *sub;
char *name;
char *val;
char *HEADLOC1, *HEADLOC3, *HEADLOC5;
FILE *f;
struct tagInfo info;
info.artist=NULL;
f = fopen(file,"rb");
if (f==NULL){
hexchat_print(ph,"file not found while trying to read ogg header");
//if (DEBUG==1) putlog("file not found while trying to read ogg header");
return info;
}
for (i=0;i<4095;i++) {c=fgetc(f);header[i]=(char)c;}
fclose(f);
HEADLOC1="_vorbis";
HEADLOC1[0]=1;
HEADLOC3="_vorbis";
HEADLOC3[0]=3;
HEADLOC5="_vorbis";
HEADLOC5[0]=5;
h1pos=inStr(header,4096,HEADLOC1);
h3pos=inStr(header,4096,HEADLOC3);
//int h5pos=inStr(header,4096,HEADLOC5); //not needed
//printf("loc1: %i\n",h1pos);printf("loc3: %i\n",h3pos);printf("loc5: %i\n",h5pos);
maxBr=getOggInt(header,h1pos+7+9,4);
nomBr=getOggInt(header,h1pos+7+13,4);
minBr=getOggInt(header,h1pos+7+17,4);
info.freq=getOggInt(header,h1pos+7+5,4);
info.mode=header[h1pos+7+4];
info.bitrate=nomBr;
if (((maxBr==nomBr)&&(nomBr=minBr))||((minBr==0)&&(maxBr==0))||((minBr=-1)&&(maxBr=-1)) )info.cbr=1;else info.cbr=0;
printf("bitrates: %i|%i|%i\n",maxBr,nomBr,minBr);
printf("freq: %u\n",info.freq);
pos=h3pos+7;
pos+=getOggInt(header,pos,4)+4;
count=getOggInt(header,pos,4);
//printf("tags: %i\n",count);
pos+=4;
info.artist=NULL;info.title=NULL;info.album=NULL;info.comment=NULL;info.genre=NULL;
for (i=0;i<count;i++){
tagLen=getOggInt(header,pos,4);
//printf("taglength: %i\n",tagLen);
sub=substring(header,pos+4,tagLen);
name=upperStr(substring(sub,0,inStr(sub,tagLen,"=")));
val=substring(sub,inStr(sub,tagLen,"=")+1,tagLen-inStr(sub,tagLen,"=")-1);
//printf("Tag: %s\n",sub);
//printf("Name: %s\n",name);
//printf("value: %s\n",val);
if (strcmp(name,"ARTIST")==0) info.artist=val;
if (strcmp(name,"TITLE")==0) info.title=val;
if (strcmp(name,"ALBUM")==0) info.album=val;
if (strcmp(name,"GENRE")==0) info.genre=val;
if (strcmp(name,"COMMENT")==0) info.comment=val;
pos+=4+tagLen;
}
if (info.artist==NULL) info.artist="";
if (info.album==NULL) info.album ="";
if (info.title==NULL) info.title="";
if (info.genre==NULL) info.genre="";
if (info.comment==NULL) info.comment="";
printf("Artist: %s\nTitle: %s\nAlbum: %s\n",info.artist,info.title, info.album);
printf("Genre: %s\nComment: %s\nMode: %i\nCBR: %i\n",info.genre,info.comment,info.mode,info.cbr);
//if (DEBUG==1) putlog("ogg header readed");
return info;
}
/*
void printOggInfo(char *file){
printf("Scanning Ogg-File for Informations: %s\n",file);
printf("size:\t%10d byte\n",getSize(file));
struct tagInfo info = getOggHeader(file);
}
*/

144
plugins/mpcinfo/theme.c Normal file
View File

@ -0,0 +1,144 @@
/*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <time.h>
struct theme{
int size;
char **line;
};
static struct theme notRunTheme;
static struct theme titleTheme;
static struct theme mp3Theme;
static struct theme oggTheme;
void themeInit(){
//if (DEBUG==1) putlog("init theme");
/*mp3Theme.size=0;oggTheme.size=0;cueTheme.size=0;streamTheme.size=0;etcTheme.size=0;
stopTheme.size=0;pauseTheme.size=0;*/
notRunTheme.size=0;titleTheme.size=0;
srand((unsigned int)time((time_t *)NULL));
//if (DEBUG==1) putlog("theme init done");
}
void printTheme(struct theme data){
int i;
for (i=0;i<data.size;i++) hexchat_printf(ph,"line[%i]=%s\n",i,data.line[i]);
}
void printThemes(){
hexchat_printf(ph,"\nNotRun-Theme:\n");printTheme(notRunTheme);
hexchat_printf(ph,"\nMP3-Theme:\n");printTheme(mp3Theme);
hexchat_printf(ph,"\nOGG-Theme:\n");printTheme(oggTheme);
hexchat_printf(ph,"\nTitle-Theme:\n");printTheme(titleTheme);
}
void cbFix(char *line)
{
size_t i;
for (i = 0; i < strlen(line); i++)
{
size_t j;
if (line[i] == '%')
{
if ((line[i + 1] == 'C') || (line[i + 1] == 'B') || (line[i + 1] == 'U') || (line[i + 1] == 'O') || (line[i + 1] == 'R'))
{
if (line[i + 1] == 'C') line[i] = 3;
if (line[i + 1] == 'B') line[i] = 2;
if (line[i + 1] == 'U') line[i] = 37;
if (line[i + 1] == 'O') line[i] = 17;
if (line[i + 1] == 'R') line[i] = 26;
for (j = i + 1; j < strlen(line) - 1; j++)
{
line[j] = line[j + 1];
}
line[strlen(line) - 1] = 0;
}
}
}
}
struct theme themeAdd(struct theme data, char *info){
//if (DEBUG==1) putlog("adding theme");
struct theme ret;
char **newLine=(char **)calloc(data.size+1,sizeof(char*));
int i;
for (i=0;i<data.size;i++) newLine[i]=data.line[i];
cbFix(info);
newLine[data.size]=info;
ret.line=newLine;ret.size=data.size+1;
//if (DEBUG==1) putlog("theme added");
return ret;
}
void loadThemes(){
char *hDir, *hFile, *line, *val;
FILE *f;
hexchat_print(ph,"loading themes\n");
hDir=(char*)calloc(1024,sizeof(char));
strcpy(hDir,hexchat_get_info(ph,"configdir"));
hFile=str3cat(hDir,"\\","mpcInfo.theme.txt");
f = fopen(hFile,"r");
if(f==NULL)
{
hexchat_print(ph,"no theme in homedir, checking global theme");
f=fopen("mpcInfo.theme.txt","r");
}
//hexchat_printf(ph,"file_desc: %p\n",f);
if (f==NULL) hexchat_print(ph, "no theme found, using hardcoded\n");
else {
if (f > 0)
{
line=" ";
} else
{
line="\0";
}
while (line[0]!=0)
{
line=readLine(f);
val=split(line,'=');
printf("line: %s\n",line);
printf("val: %s\n",val);
if (strcmp(toUpper(line),"OFF_LINE")==0) notRunTheme=themeAdd(notRunTheme,val);
if (strcmp(toUpper(line),"TITLE_LINE")==0) titleTheme=themeAdd(titleTheme,val);
if (strcmp(toUpper(line),"MP3_LINE")==0) mp3Theme=themeAdd(mp3Theme,val);
if (strcmp(toUpper(line),"OGG_LINE")==0) mp3Theme=themeAdd(oggTheme,val);
}
fclose(f);
hexchat_print(ph, "theme loaded successfull\n");
}
if (notRunTheme.size==0) notRunTheme=themeAdd(notRunTheme,"Media Player Classic not running");
if (titleTheme.size==0) titleTheme=themeAdd(titleTheme,"say Playing %title in Media Player Classic");
if (mp3Theme.size==0) mp3Theme=themeAdd(mp3Theme,"me listens to %art with %tit from %alb [%gen|%br kbps|%frq kHz|%mode] in Media Player Classic ");
if (oggTheme.size==0) oggTheme=themeAdd(oggTheme,"me listens to %art with %tit from %alb [%gen|%br kbps|%frq kHz|%chan channels] in Media Player Classic ");
//mp3Theme=themeAdd(mp3Theme,"me listens to %art with %tit from %alb [%time|%length|%perc%|%br kbps|%frq kHz|%mode] in Media Player Classic ");
}
int rnd(int max){
return rand()%max;
}
char *randomLine(struct theme data){
return data.line[rnd(data.size)];
}

19
plugins/perl/Makefile.am Normal file
View File

@ -0,0 +1,19 @@
EXTRA_DIST=generate_header lib/HexChat.pm lib/Xchat.pm lib/HexChat/Embed.pm lib/HexChat/List/Network.pm \
lib/HexChat/List/Network/Entry.pm lib/HexChat/List/Network/AutoJoin.pm lib/IRC.pm
libdir = $(hexchatlibdir)
lib_LTLIBRARIES = perl.la
perl_la_SOURCES = perl.c
perl_la_LDFLAGS = $(PERL_LDFLAGS) $(PLUGIN_LDFLAGS) -module
perl_la_LIBADD = $(GLIB_LIBS)
perl_la_CFLAGS = $(PERL_CFLAGS) $(GLIB_CFLAGS) -I$(top_srcdir)/src/common
BUILT_SOURCES = hexchat.pm.h irc.pm.h
CLEANFILES = $(BUILT_SOURCES)
hexchat.pm.h irc.pm.h: lib/HexChat.pm lib/Xchat.pm lib/HexChat/Embed.pm \
lib/HexChat/List/Network.pm lib/HexChat/List/Network/Entry.pm \
lib/HexChat/List/Network/AutoJoin.pm lib/IRC.pm
cd $(srcdir); perl generate_header

View File

@ -1,29 +0,0 @@
#!/usr/bin/env python3
import sys
from os.path import basename
out_file = sys.argv[1]
in_files = sys.argv[2:]
def escape_perl(file):
ret = ''
for line in file:
# Escape " and \, strip empty space, shove in C strings.
ret += '"' + line.strip().replace('\\', '\\\\').replace('"', '\\"') + '\\n"\n'
return ret
with open(out_file, 'w') as o:
o.write('"BEGIN {\\n"\n')
for in_file in in_files:
o.write("\"$INC{{'{}'}} = 'Compiled into the plugin.';\\n\"\n".format(basename(in_file)))
o.write('"}\\n"\n')
for in_file in in_files:
o.write('"{\\n"\n')
o.write('"#line 1 \\"{}\\"\\n"\n'.format(basename(in_file)))
with open(in_file) as i:
o.write(escape_perl(i))
o.write('"}\\n"\n')

View File

@ -51,7 +51,7 @@ sub get_context;
sub HexChat::Internal::context_info;
sub HexChat::Internal::print;
#keep compatibility with Xchat scripts
#keep compability with Xchat scripts
sub EAT_XCHAT ();
BEGIN {
*Xchat:: = *HexChat::;

View File

@ -1,91 +0,0 @@
generate_perl_header = find_program('generate_header.py')
hexchat_perl_module = custom_target('hexchat-perl-header',
input: [
'lib/HexChat.pm',
'lib/Xchat.pm',
'lib/HexChat/Embed.pm',
'lib/HexChat/List/Network.pm',
'lib/HexChat/List/Network/Entry.pm',
'lib/HexChat/List/Network/AutoJoin.pm',
],
output: 'hexchat.pm.h',
command: [generate_perl_header, '@OUTPUT@', '@INPUT@']
)
perl_cflags = []
irc_perl_module = []
if get_option('with-perl-legacy-api')
irc_perl_module = custom_target('irc-perl-header',
input: 'lib/IRC.pm',
output: 'irc.pm.h',
command: [generate_perl_header, '@OUTPUT@', '@INPUT@']
)
perl_cflags += '-DOLD_PERL'
endif
perl = find_program(get_option('with-perl'))
ret = run_command([perl, '-MExtUtils::Embed', '-e', 'ccopts'])
if ret.returncode() != 0
error('perl: Failed to get cflags')
endif
foreach flag : ret.stdout().strip().split(' ')
if flag.startswith('-I') or flag.startswith('-D')
perl_cflags += flag
endif
endforeach
ret = run_command([perl, '-MExtUtils::Embed', '-e', 'ldopts'])
if ret.returncode() != 0
error('perl: Failed to get ldflags')
endif
perl_ldflags = []
perl_rpath = ''
foreach flag : ret.stdout().strip().split(' ')
if flag.startswith('-L') or flag.startswith('-l')
perl_ldflags += flag
endif
if flag.startswith('-Wl,-rpath,')
# Install rpath
split = flag.split(',')
perl_rpath = split[split.length() - 1]
# For in tree
perl_ldflags += flag
endif
endforeach
perl_cflags += [
# Perl has its own 'config.h' that we must override
# TODO: Just rename ours to something more unique.
'-include', meson.build_root() + '/config.h'
]
if not cc.links('''
#define PERL_NO_INLINE_FUNCTIONS
#include <EXTERN.h>
#include <perl.h>
int main(void) {
PerlInterpreter *my_perl = perl_alloc();
return 0;
}
''', args: perl_cflags + perl_ldflags)
error('found perl not suitable for plugin')
endif
perl_dep = declare_dependency(
compile_args: perl_cflags,
link_args: perl_ldflags
)
shared_module('perl',
sources: ['perl.c', hexchat_perl_module, irc_perl_module],
dependencies: [libgio_dep, hexchat_plugin_dep, perl_dep],
install: true,
install_dir: plugindir,
install_rpath: perl_rpath,
name_prefix: '',
)

View File

@ -29,7 +29,6 @@
#endif
#ifdef WIN32
#include <windows.h>
#include <stdbool.h>
#else
#include <dirent.h>
#endif
@ -208,6 +207,8 @@ get_filename (char *word[], char *word_eol[])
int len;
char *file;
len = strlen (word[2]);
/* if called as /load "filename.pl" the only difference between word and
* word_eol will be the two quotes
*/

View File

@ -0,0 +1,9 @@
libdir = $(hexchatlibdir)
lib_LTLIBRARIES = python.la
python_la_SOURCES = python.c
python_la_LDFLAGS = $(PLUGIN_LDFLAGS) -module
python_la_LIBADD = $(PYTHON_LIBS) $(GLIB_LIBS)
python_la_CPPFLAGS = $(PYTHON_CPPFLAGS)
python_la_CFLAGS = $(GLIB_CFLAGS) -I$(top_srcdir)/src/common

View File

@ -1,13 +0,0 @@
python_opt = get_option('with-python')
if python_opt.startswith('python3')
python_dep = dependency(python_opt, version: '>= 3.3')
else
python_dep = dependency(python_opt, version: '>= 2.7')
endif
shared_module('python', 'python.c',
dependencies: [libgio_dep, hexchat_plugin_dep, python_dep],
install: true,
install_dir: plugindir,
name_prefix: '',
)

View File

@ -69,8 +69,6 @@
#include "hexchat-plugin.h"
#undef _POSIX_C_SOURCE /* Avoid warnings from /usr/include/features.h */
#undef _XOPEN_SOURCE
#undef HAVE_MEMRCHR /* Avoid redefinition in Python.h */
#undef HAVE_STRINGS_H
#include <Python.h>
#include <structmember.h>
#include <pythread.h>
@ -570,7 +568,7 @@ Callback_Server(char *word[], char *word_eol[], hexchat_event_attrs *attrs, void
PyObject *retobj;
PyObject *word_list, *word_eol_list;
PyObject *attributes;
int ret = HEXCHAT_EAT_NONE;
int ret = 0;
PyObject *plugin;
plugin = hook->plugin;
@ -579,13 +577,13 @@ Callback_Server(char *word[], char *word_eol[], hexchat_event_attrs *attrs, void
word_list = Util_BuildList(word);
if (word_list == NULL) {
END_PLUGIN(plugin);
return HEXCHAT_EAT_NONE;
return 0;
}
word_eol_list = Util_BuildList(word_eol);
if (word_eol_list == NULL) {
Py_DECREF(word_list);
END_PLUGIN(plugin);
return HEXCHAT_EAT_NONE;
return 0;
}
attributes = Attribute_New(attrs);
@ -621,7 +619,7 @@ Callback_Command(char *word[], char *word_eol[], void *userdata)
Hook *hook = (Hook *) userdata;
PyObject *retobj;
PyObject *word_list, *word_eol_list;
int ret = HEXCHAT_EAT_NONE;
int ret = 0;
PyObject *plugin;
plugin = hook->plugin;
@ -630,13 +628,13 @@ Callback_Command(char *word[], char *word_eol[], void *userdata)
word_list = Util_BuildList(word);
if (word_list == NULL) {
END_PLUGIN(plugin);
return HEXCHAT_EAT_NONE;
return 0;
}
word_eol_list = Util_BuildList(word_eol);
if (word_eol_list == NULL) {
Py_DECREF(word_list);
END_PLUGIN(plugin);
return HEXCHAT_EAT_NONE;
return 0;
}
retobj = PyObject_CallFunction(hook->callback, "(OOO)", word_list,
@ -667,7 +665,7 @@ Callback_Print_Attrs(char *word[], hexchat_event_attrs *attrs, void *userdata)
PyObject *word_list;
PyObject *word_eol_list;
PyObject *attributes;
int ret = HEXCHAT_EAT_NONE;
int ret = 0;
PyObject *plugin;
plugin = hook->plugin;
@ -676,13 +674,13 @@ Callback_Print_Attrs(char *word[], hexchat_event_attrs *attrs, void *userdata)
word_list = Util_BuildList(word);
if (word_list == NULL) {
END_PLUGIN(plugin);
return HEXCHAT_EAT_NONE;
return 0;
}
word_eol_list = Util_BuildEOLList(word);
if (word_eol_list == NULL) {
Py_DECREF(word_list);
END_PLUGIN(plugin);
return HEXCHAT_EAT_NONE;
return 0;
}
attributes = Attribute_New(attrs);
@ -716,7 +714,7 @@ Callback_Print(char *word[], void *userdata)
PyObject *retobj;
PyObject *word_list;
PyObject *word_eol_list;
int ret = HEXCHAT_EAT_NONE;
int ret = 0;
PyObject *plugin;
plugin = hook->plugin;
@ -725,13 +723,13 @@ Callback_Print(char *word[], void *userdata)
word_list = Util_BuildList(word);
if (word_list == NULL) {
END_PLUGIN(plugin);
return HEXCHAT_EAT_NONE;
return 0;
}
word_eol_list = Util_BuildEOLList(word);
if (word_eol_list == NULL) {
Py_DECREF(word_list);
END_PLUGIN(plugin);
return HEXCHAT_EAT_NONE;
return 0;
}
retobj = PyObject_CallFunction(hook->callback, "(OOO)", word_list,
@ -1532,7 +1530,7 @@ Plugin_New(char *filename, PyObject *xcoobj)
if (filename) {
#ifdef WIN32
char *file;
if (!g_file_get_contents(filename, &file, NULL, NULL)) {
if (!g_file_get_contents_utf8(filename, &file, NULL, NULL)) {
hexchat_printf(ph, "Can't open file %s: %s\n",
filename, strerror(errno));
goto error;
@ -1851,7 +1849,7 @@ Module_hexchat_pluginpref_get(PyObject *self, PyObject *args)
BEGIN_XCHAT_CALLS(NONE);
retint = hexchat_pluginpref_get_int(prefph, var);
END_XCHAT_CALLS();
if ((retint == -1) && (strcmp(retstr, "-1") != 0))
if ((retint == 0) && (strcmp(retstr, "0") != 0))
ret = PyUnicode_FromString(retstr);
else
ret = PyLong_FromLong(retint);
@ -2510,9 +2508,9 @@ IInterp_Cmd(char *word[], char *word_eol[], void *userdata)
if (channel && channel[0] == '>' && strcmp(channel, ">>python<<") == 0) {
hexchat_printf(ph, ">>> %s\n", word_eol[1]);
IInterp_Exec(word_eol[1]);
return HEXCHAT_EAT_HEXCHAT;
return 1;
}
return HEXCHAT_EAT_NONE;
return 0;
}
@ -2806,9 +2804,6 @@ hexchat_plugin_deinit(void)
xchatout_buffer = NULL;
if (interp_plugin) {
PyThreadState *tstate = ((PluginObject*)interp_plugin)->tstate;
PyThreadState_Swap(tstate);
Py_EndInterpreter(tstate);
Py_DECREF(interp_plugin);
interp_plugin = NULL;
}

View File

@ -0,0 +1,17 @@
libdir = $(hexchatlibdir)
sources = sysinfo.c format.c shared/df.c
if PLATFORM_OSX
sources += osx/backend.m
else
sources += unix/backend.c unix/match.c unix/parse.c unix/pci.c
endif
EXTRA_DIST = osx unix win32 shared format.h sysinfo.h sysinfo-backend.h
lib_LTLIBRARIES = sysinfo.la
sysinfo_la_SOURCES = $(sources)
sysinfo_la_LDFLAGS = $(PLUGIN_LDFLAGS) -module
sysinfo_la_LIBADD = $(LIBPCI_LIBS) $(GLIB_LIBS)
AM_CPPFLAGS = $(LIBPCI_CFLAGS) $(GLIB_CFLAGS) -I$(top_srcdir)/src/common -I$(srcdir)/shared

View File

@ -1,60 +0,0 @@
sysinfo_sources = [
'format.c',
'sysinfo.c',
]
sysinfo_deps = [
libgio_dep,
hexchat_plugin_dep,
common_sysinfo_deps,
]
sysinfo_includes = []
sysinfo_cargs = []
system = host_machine.system()
if system == 'linux' or system == 'gnu' or system.startswith('gnu/') or system == 'darwin'
sysinfo_includes += 'shared'
sysinfo_sources += [
'shared/df.c'
]
if system == 'linux' or system == 'gnu' or system.startswith('gnu/')
libpci = dependency('libpci', required: false, method: 'pkg-config')
if libpci.found()
sysinfo_deps += libpci
sysinfo_cargs += '-DHAVE_LIBPCI'
sysinfo_sources += 'unix/pci.c'
picidsdir = libpci.get_pkgconfig_variable('idsdir')
pciids = join_paths(picidsdir, 'pci.ids')
sysinfo_cargs += '-DPCIIDS_FILE="@0@"'.format(pciids)
endif
sysinfo_includes += 'unix'
sysinfo_sources += [
'unix/backend.c',
'unix/match.c',
'unix/parse.c',
]
elif system == 'darwin'
add_languages('objc')
sysinfo_sources += 'osx/backend.m'
endif
elif system == 'windows'
sysinfo_sources += [
'win32/backend.c',
'../../src/common/sysinfo/win32/backend.c'
]
else
error('sysinfo: Unknown system?')
endif
shared_module('sysinfo', sysinfo_sources,
dependencies: sysinfo_deps,
include_directories: include_directories(sysinfo_includes),
c_args: sysinfo_cargs,
install: true,
install_dir: plugindir,
name_prefix: '',
)

View File

@ -78,22 +78,10 @@ get_os (void)
static char *
get_os_fallback (void)
{
#if !defined (MAC_OS_X_VERSION_10_9) || MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_9
SInt32 ver_major = 0,
ver_minor = 0,
ver_patch = 0;
Gestalt (gestaltSystemVersionMajor, &ver_major);
Gestalt (gestaltSystemVersionMinor, &ver_minor);
Gestalt (gestaltSystemVersionBugFix, &ver_patch);
return g_strdup_printf ("OS X %d.%d.%d", ver_major, ver_minor, ver_patch);
#else
NSProcessInfo *info = [NSProcessInfo processInfo];
NSOperatingSystemVersion version = [info operatingSystemVersion];
return g_strdup_printf ("OS X %ld.%ld.%ld", version.majorVersion, version.minorVersion, version.patchVersion);
#endif
}
char *
sysinfo_backend_get_os(void)

View File

@ -26,7 +26,7 @@ int xs_parse_df(gint64 *out_total, gint64 *out_free)
FILE *pipe;
char buffer[bsize];
pipe = popen("df -k -l -P --exclude-type=squashfs --exclude-type=devtmpfs --exclude-type=tmpfs", "r");
pipe = popen("df -k -l -P", "r");
if(pipe==NULL)
return 1;

View File

@ -133,6 +133,16 @@ print_info (char *info, gboolean announce)
hexchat_print (ph, _("Sysinfo: No info by that name\n"));
}
/*
* Simple wrapper for backend specific options.
* Ensure dest >= 512.
*/
int
sysinfo_get_str_pref (const char *pref, char *dest)
{
return hexchat_pluginpref_get_str (ph, pref, dest);
}
static gboolean
sysinfo_get_bool_pref (const char *pref, gboolean def)
{
@ -174,6 +184,24 @@ sysinfo_set_pref (char *key, char *value)
sysinfo_set_pref_real (key, value, DEFAULT_ANNOUNCE);
return;
}
#ifdef HAVE_LIBPCI
else if (!strcmp (key, "pciids"))
{
if (value && value[0])
{
hexchat_pluginpref_set_str (ph, "pciids", value);
hexchat_printf (ph, _("Sysinfo: pciids is set to: %s\n"), value);
}
else
{
char buf[512];
if (hexchat_pluginpref_get_str (ph, "pciids", buf) == 0)
strcpy (buf, DEFAULT_PCIIDS);
hexchat_printf (ph, _("Sysinfo: pciids is set to: %s\n"), buf);
}
return;
}
#endif
else if (g_str_has_prefix (key, "hide_"))
{
int i;

View File

@ -22,5 +22,8 @@
#define SYSINFO_H
#define bsize 1024
#define DEFAULT_PCIIDS "/usr/share/hwdata/pci.ids"
int sysinfo_get_str_pref (const char *name, char *dest);
#endif

View File

@ -60,7 +60,7 @@ char *sysinfo_backend_get_memory(void)
{
return NULL;
}
if (xs_parse_meminfo (&swap_total, &swap_free, 1) != 1 && swap_total != 0)
if (xs_parse_meminfo (&swap_total, &swap_free, 1) != 1)
{
swap_fmt = sysinfo_format_memory (swap_total, swap_free);
}

View File

@ -23,16 +23,14 @@
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#ifdef HAVE_LIBPCI
#include <pci/header.h>
#include "pci.h"
#endif
#include <pci/header.h>
#include <glib.h>
#ifdef __sparc__
#include <dirent.h>
#endif
#include "pci.h"
#include "match.h"
#include "parse.h"
#include "sysinfo.h"
@ -134,24 +132,21 @@ gint64 xs_parse_uptime(void)
if(fgets(buffer, bsize, fp) != NULL)
uptime = g_ascii_strtoll(buffer, NULL, 0);
fclose(fp);
return uptime;
}
int xs_parse_sound(char *snd_card)
{
#ifndef HAVE_LIBPCI
return 1;
#else
char buffer[bsize], cards[bsize] = "\0", vendor[7] = "\0", device[7] = "\0", *pos;
u16 class = PCI_CLASS_MULTIMEDIA_AUDIO;
FILE *fp = NULL;
if((fp = fopen("/proc/asound/cards", "r"))== NULL)
{
if (pci_find_by_class(&class, vendor, device) == 0)
if (pci_find_by_class(&class, vendor, device) == 0)
{
pci_find_fullname(snd_card, vendor, device);
return 0;
@ -159,8 +154,8 @@ int xs_parse_sound(char *snd_card)
else
return 1;
}
while(fgets(buffer, bsize, fp) != NULL)
{
if(isdigit(buffer[0]) || isdigit(buffer[1]))
@ -180,17 +175,13 @@ int xs_parse_sound(char *snd_card)
}
strcpy(snd_card, cards);
fclose(fp);
return 0;
#endif
}
int xs_parse_video(char *vid_card)
{
#ifndef HAVE_LIBPCI
return 1;
#else
char vendor[7] = "\0", device[7] = "\0";
u16 class = PCI_CLASS_DISPLAY_VGA;
if (pci_find_by_class(&class, vendor, device))
@ -198,14 +189,10 @@ int xs_parse_video(char *vid_card)
else
pci_find_fullname(vid_card, vendor, device);
return 0;
#endif
}
int xs_parse_ether(char *ethernet_card)
{
#ifndef HAVE_LIBPCI
return 1;
#else
char vendor[7] = "\0", device[7] = "\0";
u16 class = PCI_CLASS_NETWORK_ETHERNET;
if (pci_find_by_class(&class, vendor, device))
@ -213,14 +200,10 @@ int xs_parse_ether(char *ethernet_card)
else
pci_find_fullname(ethernet_card, vendor, device);
return 0;
#endif
}
int xs_parse_agpbridge(char *agp_bridge)
{
#ifndef HAVE_LIBPCI
return 1;
#else
char vendor[7] = "\0", device[7] = "\0";
u16 class = PCI_CLASS_BRIDGE_HOST;
if (pci_find_by_class(&class, vendor, device))
@ -228,7 +211,6 @@ int xs_parse_agpbridge(char *agp_bridge)
else
pci_find_fullname(agp_bridge, vendor, device);
return 0;
#endif
}
int xs_parse_meminfo(unsigned long long *mem_tot, unsigned long long *mem_free, int swap)
@ -269,22 +251,24 @@ int xs_parse_meminfo(unsigned long long *mem_tot, unsigned long long *mem_free,
return 0;
}
static void strip_quotes(char *string)
{
size_t len = strlen(string);
if (string[len - 1] == '"')
string[--len] = '\0';
if (string[0] == '"')
memmove(string, string + 1, len);
}
int xs_parse_distro(char *name)
{
FILE *fp = NULL;
char buffer[bsize], *pos = NULL;
if((fp = fopen("/etc/redhat-release", "r")) != NULL)
if((fp = fopen("/etc/portage/make.conf", "r")) != NULL ||
(fp = fopen("/etc/make.conf", "r")) != NULL)
{
char keywords[bsize];
while(fgets(buffer, bsize, fp) != NULL)
find_match_char(buffer, "ACCEPT_KEYWORDS", keywords);
/* cppcheck-suppress uninitvar */
if (strstr(keywords, "\"") == NULL)
g_snprintf(buffer, bsize, "Gentoo Linux (stable)");
else
g_snprintf(buffer, bsize, "Gentoo Linux %s", keywords);
}
else if((fp = fopen("/etc/redhat-release", "r")) != NULL)
fgets(buffer, bsize, fp);
else if((fp = fopen("/etc/mageia-release", "r")) != NULL)
fgets(buffer, bsize, fp);
@ -318,37 +302,11 @@ int xs_parse_distro(char *name)
fgets(release, bsize, fp);
g_snprintf(buffer, bsize, "Debian %s", release);
}
else if((fp = fopen("/etc/portage/make.conf", "r")) != NULL ||
(fp = fopen("/etc/make.conf", "r")) != NULL)
{
char keywords[bsize];
while(fgets(buffer, bsize, fp) != NULL)
find_match_char(buffer, "ACCEPT_KEYWORDS", keywords);
/* cppcheck-suppress uninitvar */
if (strstr(keywords, "\"") == NULL)
g_snprintf(buffer, bsize, "Gentoo Linux (stable)");
else
g_snprintf(buffer, bsize, "Gentoo Linux %s", keywords);
}
else if((fp = fopen("/etc/os-release", "r")) != NULL)
{
char name[bsize], version[bsize];
strcpy(name, "?");
strcpy(version, "?");
while(fgets(buffer, bsize, fp) != NULL)
{
find_match_char(buffer, "NAME=", name);
find_match_char(buffer, "VERSION=", version);
}
strip_quotes(name);
strip_quotes(version);
g_snprintf(buffer, bsize, "%s %s", name, version);
}
else
g_snprintf(buffer, bsize, "Unknown Distro");
if(fp != NULL)
fclose(fp);
pos=strchr(buffer, '\n');
if(pos != NULL)
*pos = '\0';

View File

@ -92,11 +92,6 @@ int pci_find_by_class(u16 *class, char *vendor, char *device)
struct pci_dev *p;
int nomatch = 1;
/* libpci has no way to report errors it calls exit()
* so we need to manually avoid potential failures like this one */
if (!g_file_test ("/proc/bus/pci", G_FILE_TEST_EXISTS))
return 1;
pacc = pci_alloc();
pci_filter_init(pacc, &filter);
pci_init(pacc);
@ -127,8 +122,11 @@ void pci_find_fullname(char *fullname, char *vendor, char *device)
char *position;
int cardfound = 0;
FILE *fp;
if (!sysinfo_get_str_pref ("pciids", buffer))
strcpy (buffer, DEFAULT_PCIIDS);
fp = fopen (PCIIDS_FILE, "r");
fp = fopen (buffer, "r");
if(fp == NULL)
{
g_snprintf(fullname, bsize, "%s:%s", vendor, device);
@ -142,7 +140,7 @@ void pci_find_fullname(char *fullname, char *vendor, char *device)
{
position = strstr(buffer, vendor);
position += 6;
g_strlcpy(vendorname, position, sizeof (vendorname));
strncpy(vendorname, position, bsize/2);
position = strstr(vendorname, "\n");
*(position) = '\0';
break;
@ -154,7 +152,7 @@ void pci_find_fullname(char *fullname, char *vendor, char *device)
{
position = strstr(buffer, device);
position += 6;
g_strlcpy(devicename, position, sizeof (devicename));
strncpy(devicename, position, bsize/2);
position = strstr(devicename, " (");
if (position == NULL)
position = strstr(devicename, "\n");
@ -166,6 +164,6 @@ void pci_find_fullname(char *fullname, char *vendor, char *device)
if (cardfound == 1)
g_snprintf(fullname, bsize, "%s %s", vendorname, devicename);
else
g_snprintf(fullname, bsize, "%s:%s", vendor, device);
g_snprintf(fullname, bsize, "%s:%s", vendor, device);
fclose(fp);
}

View File

@ -30,7 +30,14 @@
#include "../format.h"
static char *get_memory_info (void);
static int command_callback (char *word[], char *word_eol[], void *user_data);
void print_info (void);
guint64 hdd_capacity;
guint64 hdd_free_space;
char *read_hdd_info (IWbemClassObject *object);
char *get_memory_info (void);
char *
sysinfo_backend_get_sound (void)
@ -91,6 +98,11 @@ sysinfo_backend_get_os (void)
return sysinfo_get_os ();
}
static int get_cpu_arch (void)
{
return sysinfo_get_cpu_arch ();
}
static char *get_memory_info (void)
{
MEMORYSTATUSEX meminfo = { 0 };

View File

@ -1,8 +0,0 @@
winsparkle_dep = cc.find_library('WinSparkle')
shared_module('upd', 'upd.c',
dependencies: [winsparkle_dep, hexchat_plugin_dep],
install: true,
install_dir: plugindir,
name_prefix: '',
)

View File

@ -1,6 +0,0 @@
shared_module('winamp', 'winamp.c',
dependencies: [libgio_dep, hexchat_plugin_dep],
install: true,
install_dir: plugindir,
name_prefix: '',
)

7
po/Makevars Normal file
View File

@ -0,0 +1,7 @@
DOMAIN = $(PACKAGE)
subdir = po
top_builddir = ..
XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
COPYRIGHT_HOLDER =
MSGID_BUGS_ADDRESS = www.hexchat.org
EXTRA_LOCALE_CATEGORIES =

View File

@ -1,6 +1,6 @@
data/misc/io.github.Hexchat.appdata.xml.in
data/misc/io.github.Hexchat.desktop.in.in
data/misc/io.github.Hexchat.ThemeManager.desktop.in
data/misc/hexchat.appdata.xml.in
data/misc/hexchat.desktop.in
data/misc/htm.desktop.in
src/common/cfgfiles.c
src/common/chanopt.c
src/common/dcc.c

View File

@ -1 +0,0 @@
data/misc/io.github.Hexchat.desktop.in.in

3448
po/af.po

File diff suppressed because it is too large Load Diff

3466
po/am.po

File diff suppressed because it is too large Load Diff

3806
po/ast.po

File diff suppressed because it is too large Load Diff

3554
po/az.po

File diff suppressed because it is too large Load Diff

3817
po/be.po

File diff suppressed because it is too large Load Diff

3614
po/bg.po

File diff suppressed because it is too large Load Diff

4854
po/ca.po

File diff suppressed because it is too large Load Diff

3852
po/cs.po

File diff suppressed because it is too large Load Diff

5205
po/da.po

File diff suppressed because it is too large Load Diff

4402
po/de.po

File diff suppressed because it is too large Load Diff

4012
po/el.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

4312
po/es.po

File diff suppressed because it is too large Load Diff

3806
po/et.po

File diff suppressed because it is too large Load Diff

3633
po/eu.po

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More