Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fbee94cb81 | |||
| 779d373e1d |
+1
-1
@@ -8,7 +8,7 @@ before_install:
|
|||||||
install:
|
install:
|
||||||
- docker run -d --privileged --cidfile=/tmp/cid --volume=${PWD}:/opt/hexchat hexchat/ubuntu-ci /bin/systemd --system
|
- docker run -d --privileged --cidfile=/tmp/cid --volume=${PWD}:/opt/hexchat hexchat/ubuntu-ci /bin/systemd --system
|
||||||
script:
|
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'
|
- 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'
|
||||||
after_script:
|
after_script:
|
||||||
- docker kill `cat /tmp/cid`
|
- docker kill `cat /tmp/cid`
|
||||||
notifications:
|
notifications:
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<component type="desktop">
|
||||||
|
<id>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="translate">https://www.transifex.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>
|
||||||
|
<releases>
|
||||||
|
<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>
|
||||||
@@ -9,7 +9,6 @@ Terminal=false
|
|||||||
Type=Application
|
Type=Application
|
||||||
Categories=GTK;Network;IRCClient;
|
Categories=GTK;Network;IRCClient;
|
||||||
StartupNotify=true
|
StartupNotify=true
|
||||||
StartupWMClass=Hexchat
|
|
||||||
X-GNOME-UsesNotifications=true
|
X-GNOME-UsesNotifications=true
|
||||||
MimeType=x-scheme-handler/irc;x-scheme-handler/ircs;
|
MimeType=x-scheme-handler/irc;x-scheme-handler/ircs;
|
||||||
Actions=SafeMode;
|
Actions=SafeMode;
|
||||||
@@ -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>
|
|
||||||
@@ -1,105 +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="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>
|
|
||||||
+13
-72
@@ -1,24 +1,21 @@
|
|||||||
appdir = join_paths(get_option('datadir'), 'applications')
|
appdir = join_paths(get_option('datadir'), 'applications')
|
||||||
metainfodir = join_paths(get_option('datadir'), 'metainfo')
|
|
||||||
desktop_utils = find_program('desktop-file-validate', required: false)
|
desktop_utils = find_program('desktop-file-validate', required: false)
|
||||||
|
|
||||||
if get_option('with-gtk')
|
if get_option('with-gtk')
|
||||||
if get_option('with-appdata')
|
|
||||||
hexchat_appdata = i18n.merge_file(
|
hexchat_appdata = i18n.merge_file(
|
||||||
input: 'io.github.Hexchat.appdata.xml.in',
|
input: 'hexchat.appdata.xml.in',
|
||||||
output: 'io.github.Hexchat.appdata.xml',
|
output: 'hexchat.appdata.xml',
|
||||||
po_dir: '../../po',
|
po_dir: '../../po',
|
||||||
install: true,
|
install: true,
|
||||||
install_dir: metainfodir
|
install_dir: join_paths(get_option('datadir'), 'appdata')
|
||||||
)
|
)
|
||||||
|
|
||||||
appstream_util = find_program('appstream-util', required: false)
|
appstream_util = find_program('appstream-util', required: false)
|
||||||
if appstream_util.found()
|
if appstream_util.found()
|
||||||
test('Validate io.github.Hexchat.appdata.xml', appstream_util,
|
test('Validate hexchat.appdata.xml', appstream_util,
|
||||||
args: ['validate-relax', hexchat_appdata]
|
args: ['validate', hexchat_appdata]
|
||||||
)
|
)
|
||||||
endif
|
endif
|
||||||
endif
|
|
||||||
|
|
||||||
desktop_conf = configuration_data()
|
desktop_conf = configuration_data()
|
||||||
if get_option('with-dbus')
|
if get_option('with-dbus')
|
||||||
@@ -28,14 +25,14 @@ if get_option('with-gtk')
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
desktop_file = configure_file(
|
desktop_file = configure_file(
|
||||||
input: 'io.github.Hexchat.desktop.in.in',
|
input: 'hexchat.desktop.in.in',
|
||||||
output: 'io.github.Hexchat.desktop.in',
|
output: 'hexchat.desktop.in',
|
||||||
configuration: desktop_conf
|
configuration: desktop_conf
|
||||||
)
|
)
|
||||||
|
|
||||||
hexchat_desktop = i18n.merge_file(
|
hexchat_desktop = i18n.merge_file(
|
||||||
input: desktop_file,
|
input: desktop_file,
|
||||||
output: 'io.github.Hexchat.desktop',
|
output: 'hexchat.desktop',
|
||||||
po_dir: '../../po',
|
po_dir: '../../po',
|
||||||
type: 'desktop',
|
type: 'desktop',
|
||||||
install: true,
|
install: true,
|
||||||
@@ -43,7 +40,7 @@ if get_option('with-gtk')
|
|||||||
)
|
)
|
||||||
|
|
||||||
if desktop_utils.found()
|
if desktop_utils.found()
|
||||||
test('Validate io.github.Hexchat.desktop', desktop_utils,
|
test('Validate hexchat.desktop', desktop_utils,
|
||||||
args: [hexchat_desktop]
|
args: [hexchat_desktop]
|
||||||
)
|
)
|
||||||
endif
|
endif
|
||||||
@@ -51,8 +48,8 @@ endif
|
|||||||
|
|
||||||
if get_option('with-theme-manager')
|
if get_option('with-theme-manager')
|
||||||
htm_desktop = i18n.merge_file(
|
htm_desktop = i18n.merge_file(
|
||||||
input: 'io.github.Hexchat.ThemeManager.desktop.in',
|
input: 'htm.desktop.in',
|
||||||
output: 'io.github.Hexchat.ThemeManager.desktop',
|
output: 'htm.desktop',
|
||||||
po_dir: '../../po',
|
po_dir: '../../po',
|
||||||
type: 'desktop',
|
type: 'desktop',
|
||||||
install: true,
|
install: true,
|
||||||
@@ -60,68 +57,12 @@ if get_option('with-theme-manager')
|
|||||||
)
|
)
|
||||||
|
|
||||||
if desktop_utils.found()
|
if desktop_utils.found()
|
||||||
test('Validate io.github.Hexchat.ThemeManager.desktop', desktop_utils,
|
test('Validate htm.desktop', desktop_utils,
|
||||||
args: [htm_desktop]
|
args: [htm_desktop]
|
||||||
)
|
)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
install_data('io.github.Hexchat.ThemeManager.xml',
|
install_data('htm-mime.xml',
|
||||||
install_dir: join_paths(get_option('datadir'), 'mime/packages')
|
install_dir: join_paths(get_option('datadir'), 'mime/packages')
|
||||||
)
|
)
|
||||||
endif
|
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
|
|
||||||
@@ -7,6 +7,9 @@ ar = '/usr/bin/x86_64-w64-mingw32-gcc-ar'
|
|||||||
strip = '/usr/bin/x86_64-w64-mingw32-strip'
|
strip = '/usr/bin/x86_64-w64-mingw32-strip'
|
||||||
pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
|
pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
|
||||||
|
|
||||||
|
[properties]
|
||||||
|
c_args = ['-DNTDDI_VERSION=NTDDI_WIN7', '-D_WIN32_WINNT=_WIN32_WINNT_WIN7']
|
||||||
|
|
||||||
[host_machine]
|
[host_machine]
|
||||||
system = 'windows'
|
system = 'windows'
|
||||||
cpu_family = 'x86_64'
|
cpu_family = 'x86_64'
|
||||||
|
|||||||
+2
-15
@@ -1,5 +1,5 @@
|
|||||||
project('hexchat', 'c',
|
project('hexchat', 'c',
|
||||||
version: '2.14.2',
|
version: '2.12.4',
|
||||||
meson_version: '>= 0.38.0',
|
meson_version: '>= 0.38.0',
|
||||||
default_options: [
|
default_options: [
|
||||||
'c_std=gnu89',
|
'c_std=gnu89',
|
||||||
@@ -15,7 +15,6 @@ cc = meson.get_compiler('c')
|
|||||||
|
|
||||||
libgio_dep = dependency('gio-2.0', version: '>= 2.34.0')
|
libgio_dep = dependency('gio-2.0', version: '>= 2.34.0')
|
||||||
libgmodule_dep = dependency('gmodule-2.0')
|
libgmodule_dep = dependency('gmodule-2.0')
|
||||||
global_deps = []
|
|
||||||
if cc.get_id() == 'msvc'
|
if cc.get_id() == 'msvc'
|
||||||
libssl_dep = cc.find_library('libeay32')
|
libssl_dep = cc.find_library('libeay32')
|
||||||
else
|
else
|
||||||
@@ -77,18 +76,13 @@ configure_file(output: 'config.h', configuration: config_h)
|
|||||||
config_h_include = include_directories('.')
|
config_h_include = include_directories('.')
|
||||||
|
|
||||||
if host_machine.system() == 'windows'
|
if host_machine.system() == 'windows'
|
||||||
add_project_arguments(
|
add_project_arguments('-DWIN32', language: 'c')
|
||||||
'-DWIN32',
|
|
||||||
'-DNTDDI_VERSION=NTDDI_WIN7',
|
|
||||||
'-D_WIN32_WINNT=_WIN32_WINNT_WIN7',
|
|
||||||
language: 'c')
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
global_cflags = []
|
global_cflags = []
|
||||||
test_cflags = [
|
test_cflags = [
|
||||||
'-pipe',
|
'-pipe',
|
||||||
'-fPIE',
|
|
||||||
'-funsigned-char',
|
'-funsigned-char',
|
||||||
'-Wno-conversion',
|
'-Wno-conversion',
|
||||||
'-Wno-pointer-sign',
|
'-Wno-pointer-sign',
|
||||||
@@ -118,10 +112,6 @@ if get_option('buildtype') != 'plain'
|
|||||||
}
|
}
|
||||||
''', args: '-fstack-protector-all')
|
''', args: '-fstack-protector-all')
|
||||||
global_cflags += '-fstack-protector-strong'
|
global_cflags += '-fstack-protector-strong'
|
||||||
|
|
||||||
if host_machine.system() == 'windows'
|
|
||||||
global_deps += cc.find_library('ssp')
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
add_project_arguments(global_cflags, language: 'c')
|
add_project_arguments(global_cflags, language: 'c')
|
||||||
@@ -131,9 +121,6 @@ global_ldflags = []
|
|||||||
test_ldflags = [
|
test_ldflags = [
|
||||||
'-Wl,-z,relro',
|
'-Wl,-z,relro',
|
||||||
'-Wl,-z,now',
|
'-Wl,-z,now',
|
||||||
# mingw
|
|
||||||
'-Wl,--dynamicbase',
|
|
||||||
'-Wl,--nxcompat',
|
|
||||||
]
|
]
|
||||||
foreach ldflag : test_ldflags
|
foreach ldflag : test_ldflags
|
||||||
if cc.has_argument(ldflag) and cc.links('int main (void) { return 0; }', args: ldflag)
|
if cc.has_argument(ldflag) and cc.links('int main (void) { return 0; }', args: ldflag)
|
||||||
|
|||||||
+2
-14
@@ -25,12 +25,6 @@ option('with-libcanberra', type: 'boolean',
|
|||||||
option('with-theme-manager', type: 'boolean', value: false,
|
option('with-theme-manager', type: 'boolean', value: false,
|
||||||
description: 'Utility to help manage themes, requires mono/.net'
|
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
|
# Plugins
|
||||||
option('with-checksum', type: 'boolean',
|
option('with-checksum', type: 'boolean',
|
||||||
@@ -45,8 +39,8 @@ option('with-fishlim', type: 'boolean',
|
|||||||
option('with-lua', type: 'string', value: 'luajit',
|
option('with-lua', type: 'string', value: 'luajit',
|
||||||
description: 'Lua scripting plugin, value is pkg-config name to use or "false"'
|
description: 'Lua scripting plugin, value is pkg-config name to use or "false"'
|
||||||
)
|
)
|
||||||
option('with-perl', type: 'string', value: 'perl',
|
option('with-perl', type: 'boolean',
|
||||||
description: 'Perl scripting plugin, value is path to perl executable or "false"'
|
description: 'Perl scripting plugin'
|
||||||
)
|
)
|
||||||
option('with-python', type: 'string', value: 'python3',
|
option('with-python', type: 'string', value: 'python3',
|
||||||
description: 'Python scripting plugin. value is pkg-config name to use or "false"'
|
description: 'Python scripting plugin. value is pkg-config name to use or "false"'
|
||||||
@@ -60,9 +54,3 @@ option('with-upd', type: 'boolean',
|
|||||||
option('with-winamp', type: 'boolean',
|
option('with-winamp', type: 'boolean',
|
||||||
description: 'Winamp plugin, Windows only'
|
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'
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -189,10 +189,8 @@ dh1080_compute_key (const char *priv_key, const char *pub_key, char **secret_key
|
|||||||
char *pub_key_data;
|
char *pub_key_data;
|
||||||
gsize pub_key_len;
|
gsize pub_key_len;
|
||||||
BIGNUM *pk;
|
BIGNUM *pk;
|
||||||
DH *dh;
|
|
||||||
#ifdef HAVE_DH_SET0_KEY
|
|
||||||
BIGNUM *temp_pub_key = BN_new();
|
BIGNUM *temp_pub_key = BN_new();
|
||||||
#endif
|
DH *dh;
|
||||||
|
|
||||||
g_assert (secret_key != NULL);
|
g_assert (secret_key != NULL);
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -26,7 +26,7 @@ if get_option('with-lua') != 'false'
|
|||||||
subdir('lua')
|
subdir('lua')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if get_option('with-perl') != 'false'
|
if get_option('with-perl')
|
||||||
subdir('perl')
|
subdir('perl')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|||||||
@@ -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");}
|
||||||
@@ -0,0 +1,334 @@
|
|||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
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;}
|
||||||
|
tag = (char*) malloc(sizeof(char)*129);
|
||||||
|
//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);free(tag);return ret;}
|
||||||
|
tag[i]=(char)c;
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
//printf("tag readed: \n");
|
||||||
|
id=substring(tag,0,3);
|
||||||
|
//printf("header: %s\n",id);
|
||||||
|
res=strcmp(id,"TAG");
|
||||||
|
free(id);
|
||||||
|
if (res!=0){hexchat_printf(ph,"no id3 v1 found\n");free(tag);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");
|
||||||
|
free(tmp);
|
||||||
|
free(tag);
|
||||||
|
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");
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
EXPORTS
|
||||||
|
hexchat_plugin_init
|
||||||
|
hexchat_plugin_deinit
|
||||||
@@ -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>{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>
|
||||||
@@ -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>
|
||||||
@@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
* 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[]="_vorbis", HEADLOC3[]="_vorbis", HEADLOC5[]="_vorbis";
|
||||||
|
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[0]=1;
|
||||||
|
HEADLOC3[0]=3;
|
||||||
|
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;
|
||||||
|
free(name);
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
*/
|
||||||
@@ -0,0 +1,148 @@
|
|||||||
|
/*
|
||||||
|
* 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, *lineCap, *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");
|
||||||
|
free(hDir);
|
||||||
|
free(hFile);
|
||||||
|
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);
|
||||||
|
lineCap=toUpper(line);
|
||||||
|
if (strcmp(lineCap,"OFF_LINE")==0) notRunTheme=themeAdd(notRunTheme,val);
|
||||||
|
if (strcmp(lineCap,"TITLE_LINE")==0) titleTheme=themeAdd(titleTheme,val);
|
||||||
|
if (strcmp(lineCap,"MP3_LINE")==0) mp3Theme=themeAdd(mp3Theme,val);
|
||||||
|
if (strcmp(lineCap,"OGG_LINE")==0) mp3Theme=themeAdd(oggTheme,val);
|
||||||
|
free(lineCap);
|
||||||
|
}
|
||||||
|
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)];
|
||||||
|
}
|
||||||
@@ -51,7 +51,7 @@ sub get_context;
|
|||||||
sub HexChat::Internal::context_info;
|
sub HexChat::Internal::context_info;
|
||||||
sub HexChat::Internal::print;
|
sub HexChat::Internal::print;
|
||||||
|
|
||||||
#keep compatibility with Xchat scripts
|
#keep compability with Xchat scripts
|
||||||
sub EAT_XCHAT ();
|
sub EAT_XCHAT ();
|
||||||
BEGIN {
|
BEGIN {
|
||||||
*Xchat:: = *HexChat::;
|
*Xchat:: = *HexChat::;
|
||||||
|
|||||||
@@ -13,24 +13,19 @@ hexchat_perl_module = custom_target('hexchat-perl-header',
|
|||||||
command: [generate_perl_header, '@OUTPUT@', '@INPUT@']
|
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',
|
irc_perl_module = custom_target('irc-perl-header',
|
||||||
input: 'lib/IRC.pm',
|
input: 'lib/IRC.pm',
|
||||||
output: 'irc.pm.h',
|
output: 'irc.pm.h',
|
||||||
command: [generate_perl_header, '@OUTPUT@', '@INPUT@']
|
command: [generate_perl_header, '@OUTPUT@', '@INPUT@']
|
||||||
)
|
)
|
||||||
perl_cflags += '-DOLD_PERL'
|
|
||||||
endif
|
|
||||||
|
|
||||||
perl = find_program(get_option('with-perl'))
|
perl = find_program('perl')
|
||||||
|
|
||||||
ret = run_command([perl, '-MExtUtils::Embed', '-e', 'ccopts'])
|
ret = run_command([perl, '-MExtUtils::Embed', '-e', 'ccopts'])
|
||||||
if ret.returncode() != 0
|
if ret.returncode() != 0
|
||||||
error('perl: Failed to get cflags')
|
error('perl: Failed to get cflags')
|
||||||
endif
|
endif
|
||||||
|
perl_cflags = []
|
||||||
foreach flag : ret.stdout().strip().split(' ')
|
foreach flag : ret.stdout().strip().split(' ')
|
||||||
if flag.startswith('-I') or flag.startswith('-D')
|
if flag.startswith('-I') or flag.startswith('-D')
|
||||||
perl_cflags += flag
|
perl_cflags += flag
|
||||||
@@ -76,14 +71,11 @@ int main(void) {
|
|||||||
error('found perl not suitable for plugin')
|
error('found perl not suitable for plugin')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
perl_dep = declare_dependency(
|
|
||||||
compile_args: perl_cflags,
|
|
||||||
link_args: perl_ldflags
|
|
||||||
)
|
|
||||||
|
|
||||||
shared_module('perl',
|
shared_module('perl',
|
||||||
sources: ['perl.c', hexchat_perl_module, irc_perl_module],
|
sources: ['perl.c', hexchat_perl_module, irc_perl_module],
|
||||||
dependencies: [libgio_dep, hexchat_plugin_dep, perl_dep],
|
dependencies: [libgio_dep, hexchat_plugin_dep],
|
||||||
|
c_args: perl_cflags,
|
||||||
|
link_args: perl_ldflags,
|
||||||
install: true,
|
install: true,
|
||||||
install_dir: plugindir,
|
install_dir: plugindir,
|
||||||
install_rpath: perl_rpath,
|
install_rpath: perl_rpath,
|
||||||
|
|||||||
@@ -1532,7 +1532,7 @@ Plugin_New(char *filename, PyObject *xcoobj)
|
|||||||
if (filename) {
|
if (filename) {
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
char *file;
|
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",
|
hexchat_printf(ph, "Can't open file %s: %s\n",
|
||||||
filename, strerror(errno));
|
filename, strerror(errno));
|
||||||
goto error;
|
goto error;
|
||||||
|
|||||||
@@ -5,8 +5,7 @@ sysinfo_sources = [
|
|||||||
|
|
||||||
sysinfo_deps = [
|
sysinfo_deps = [
|
||||||
libgio_dep,
|
libgio_dep,
|
||||||
hexchat_plugin_dep,
|
hexchat_plugin_dep
|
||||||
common_sysinfo_deps,
|
|
||||||
]
|
]
|
||||||
|
|
||||||
sysinfo_includes = []
|
sysinfo_includes = []
|
||||||
@@ -20,8 +19,8 @@ if system == 'linux' or system == 'darwin'
|
|||||||
]
|
]
|
||||||
|
|
||||||
if system == 'linux'
|
if system == 'linux'
|
||||||
libpci = dependency('libpci', required: false, method: 'pkg-config')
|
libpci = dependency('libpci', required: false)
|
||||||
if libpci.found()
|
if libpci.found() and cc.has_header('pci/pci.h')
|
||||||
sysinfo_deps += libpci
|
sysinfo_deps += libpci
|
||||||
sysinfo_cargs += '-DHAVE_LIBPCI'
|
sysinfo_cargs += '-DHAVE_LIBPCI'
|
||||||
sysinfo_sources += 'unix/pci.c'
|
sysinfo_sources += 'unix/pci.c'
|
||||||
@@ -42,10 +41,7 @@ if system == 'linux' or system == 'darwin'
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
elif system == 'windows'
|
elif system == 'windows'
|
||||||
sysinfo_sources += [
|
sysinfo_sources += 'win32/backend.c'
|
||||||
'win32/backend.c',
|
|
||||||
'../../src/common/sysinfo/win32/backend.c'
|
|
||||||
]
|
|
||||||
else
|
else
|
||||||
error('sysinfo: Unknown system?')
|
error('sysinfo: Unknown system?')
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -30,7 +30,14 @@
|
|||||||
|
|
||||||
#include "../format.h"
|
#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 *
|
char *
|
||||||
sysinfo_backend_get_sound (void)
|
sysinfo_backend_get_sound (void)
|
||||||
@@ -91,6 +98,11 @@ sysinfo_backend_get_os (void)
|
|||||||
return sysinfo_get_os ();
|
return sysinfo_get_os ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_cpu_arch (void)
|
||||||
|
{
|
||||||
|
return sysinfo_get_cpu_arch ();
|
||||||
|
}
|
||||||
|
|
||||||
static char *get_memory_info (void)
|
static char *get_memory_info (void)
|
||||||
{
|
{
|
||||||
MEMORYSTATUSEX meminfo = { 0 };
|
MEMORYSTATUSEX meminfo = { 0 };
|
||||||
|
|||||||
+3
-3
@@ -1,6 +1,6 @@
|
|||||||
data/misc/io.github.Hexchat.appdata.xml.in
|
data/misc/hexchat.appdata.xml.in
|
||||||
data/misc/io.github.Hexchat.desktop.in.in
|
data/misc/hexchat.desktop.in.in
|
||||||
data/misc/io.github.Hexchat.ThemeManager.desktop.in
|
data/misc/htm.desktop.in
|
||||||
src/common/cfgfiles.c
|
src/common/cfgfiles.c
|
||||||
src/common/chanopt.c
|
src/common/chanopt.c
|
||||||
src/common/dcc.c
|
src/common/dcc.c
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
data/misc/io.github.Hexchat.desktop.in.in
|
data/misc/hexchat.desktop.in.in
|
||||||
|
|||||||
+537
-449
File diff suppressed because it is too large
Load Diff
+478
-399
File diff suppressed because it is too large
Load Diff
@@ -1,9 +1 @@
|
|||||||
i18n.gettext('hexchat', preset: 'glib')
|
i18n.gettext('hexchat', preset: 'glib')
|
||||||
|
|
||||||
validate_translations = find_program('validate-textevent-translations')
|
|
||||||
test('Validate translations', validate_translations,
|
|
||||||
args: [
|
|
||||||
join_paths(meson.current_source_dir(), 'LINGUAS'),
|
|
||||||
meson.current_source_dir(),
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|||||||
+519
-416
File diff suppressed because it is too large
Load Diff
+473
-407
File diff suppressed because it is too large
Load Diff
@@ -1,69 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
|
|
||||||
ret = 0
|
|
||||||
|
|
||||||
|
|
||||||
def log(prefix, suffix, fallback):
|
|
||||||
try:
|
|
||||||
print(prefix, suffix) # Non-utf8 output...
|
|
||||||
except UnicodeEncodeError:
|
|
||||||
print(prefix, fallback)
|
|
||||||
|
|
||||||
|
|
||||||
def validate_translation(input, translation):
|
|
||||||
if not translation:
|
|
||||||
return True
|
|
||||||
|
|
||||||
if re.findall(r'(?:(?<!%)%[^%OCRUHBIH]|\$[^at1234])', translation):
|
|
||||||
log('Translation includes invalid formatting:', translation, input)
|
|
||||||
return False
|
|
||||||
|
|
||||||
in_vars = re.findall(r'(\$(?:\d|t))', input)
|
|
||||||
if not all(var in translation for var in in_vars):
|
|
||||||
log('Translation does not contain all variables:', translation, input)
|
|
||||||
return False
|
|
||||||
|
|
||||||
in_ascii = re.findall(r'\$a(\d{3})', translation)
|
|
||||||
if any(int(i) > 256 for i in in_ascii):
|
|
||||||
log('Translation contains invalid ascii value:', translation, input)
|
|
||||||
return False
|
|
||||||
|
|
||||||
# We could try to validate colors but that is pretty flexible
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def validate_language(path):
|
|
||||||
global ret
|
|
||||||
|
|
||||||
print('Validating', path)
|
|
||||||
|
|
||||||
with open(path, 'r', encoding='utf-8') as f:
|
|
||||||
in_event = False
|
|
||||||
event_input = ''
|
|
||||||
|
|
||||||
for line in f:
|
|
||||||
if 'textevents.h' in line:
|
|
||||||
in_event = True
|
|
||||||
elif in_event is False:
|
|
||||||
continue
|
|
||||||
elif line.startswith('msgid'):
|
|
||||||
event_input = line[7:-2]
|
|
||||||
elif line.startswith('msgstr'):
|
|
||||||
if not validate_translation(event_input, line[8:-2]):
|
|
||||||
ret = 1
|
|
||||||
in_event = False
|
|
||||||
elif line == '\n':
|
|
||||||
print('Failed to find translation for', event_input)
|
|
||||||
in_event = False
|
|
||||||
|
|
||||||
|
|
||||||
with open(sys.argv[1], 'r') as linguas:
|
|
||||||
for lang in linguas:
|
|
||||||
path = os.path.join(sys.argv[2], lang.strip() + '.po')
|
|
||||||
validate_language(path)
|
|
||||||
|
|
||||||
sys.exit(ret)
|
|
||||||
+651
-556
File diff suppressed because it is too large
Load Diff
+519
-468
File diff suppressed because it is too large
Load Diff
@@ -111,10 +111,11 @@
|
|||||||
<PreBuildEvent>
|
<PreBuildEvent>
|
||||||
<Command><![CDATA[
|
<Command><![CDATA[
|
||||||
SET SOLUTIONDIR=$(SolutionDir)..\
|
SET SOLUTIONDIR=$(SolutionDir)..\
|
||||||
"$(Python3Path)\python.exe" $(ProjectDir)make-te.py "$(ProjectDir)textevents.in" "$(HexChatLib)textevents.h" "$(HexChatLib)textenums.h"
|
"$(HexChatLib)make-te.exe" < "$(ProjectDir)textevents.in" > "$(HexChatLib)textevents.h" 2> "$(HexChatLib)textenums.h"
|
||||||
powershell -File "$(SolutionDir)..\win32\version-template.ps1" "$(SolutionDir)..\win32\config.h.tt" "$(HexChatLib)config.h"
|
powershell -File "$(SolutionDir)..\win32\version-template.ps1" "$(SolutionDir)..\win32\config.h.tt" "$(HexChatLib)config.h"
|
||||||
"$(Python3Path)\python.exe" "$(DepsRoot)\bin\glib-genmarshal" --prefix=_hexchat_marshal --header "$(ProjectDir)marshalers.list" --output "$(HexChatLib)marshal.h"
|
"$(DepsRoot)\bin\glib-genmarshal.exe" --prefix=_hexchat_marshal --header "$(ProjectDir)marshalers.list" > "$(HexChatLib)marshal.h"
|
||||||
"$(Python3Path)\python.exe" "$(DepsRoot)\bin\glib-genmarshal" --prefix=_hexchat_marshal --body "$(ProjectDir)marshalers.list" --output "$(HexChatLib)marshal.c"
|
"$(DepsRoot)\bin\glib-genmarshal.exe" --prefix=_hexchat_marshal --body "$(ProjectDir)marshalers.list" > "$(HexChatLib)marshal.c"
|
||||||
|
|
||||||
]]></Command>
|
]]></Command>
|
||||||
</PreBuildEvent>
|
</PreBuildEvent>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|||||||
+1
-9
@@ -91,7 +91,6 @@ ctcp_handle (session *sess, char *to, char *nick, char *ip,
|
|||||||
char *po;
|
char *po;
|
||||||
session *chansess;
|
session *chansess;
|
||||||
server *serv = sess->server;
|
server *serv = sess->server;
|
||||||
char outbuf[1024];
|
|
||||||
int ctcp_offset = 2;
|
int ctcp_offset = 2;
|
||||||
|
|
||||||
if (serv->have_idmsg && (word[4][1] == '+' || word[4][1] == '-') )
|
if (serv->have_idmsg && (word[4][1] == '+' || word[4][1] == '-') )
|
||||||
@@ -138,14 +137,7 @@ ctcp_handle (session *sess, char *to, char *nick, char *ip,
|
|||||||
|
|
||||||
if (!g_ascii_strcasecmp (msg, "VERSION") && !prefs.hex_irc_hide_version)
|
if (!g_ascii_strcasecmp (msg, "VERSION") && !prefs.hex_irc_hide_version)
|
||||||
{
|
{
|
||||||
#ifdef WIN32
|
serv->p_nctcp (serv, nick, "VERSION HexChat "PACKAGE_VERSION);
|
||||||
g_snprintf (outbuf, sizeof (outbuf), "VERSION HexChat "PACKAGE_VERSION" [x%d] / %s",
|
|
||||||
get_cpu_arch (), get_sys_str (1));
|
|
||||||
#else
|
|
||||||
g_snprintf (outbuf, sizeof (outbuf), "VERSION HexChat "PACKAGE_VERSION" / %s",
|
|
||||||
get_sys_str (1));
|
|
||||||
#endif
|
|
||||||
serv->p_nctcp (serv, nick, outbuf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (word[4][1] == '\0')
|
if (word[4][1] == '\0')
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
#include "hexchat.h"
|
#include "hexchat.h"
|
||||||
#include "hexchatc.h"
|
#include "hexchatc.h"
|
||||||
|
|
||||||
|
#define DBUS_SERVICE "org.hexchat.service"
|
||||||
#define DBUS_REMOTE_PATH "/org/hexchat/Remote"
|
#define DBUS_REMOTE_PATH "/org/hexchat/Remote"
|
||||||
#define DBUS_REMOTE_INTERFACE "org.hexchat.plugin"
|
#define DBUS_REMOTE_INTERFACE "org.hexchat.plugin"
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
#define PDESC _("plugin for remote access using DBUS")
|
#define PDESC _("plugin for remote access using DBUS")
|
||||||
#define PVERSION ""
|
#define PVERSION ""
|
||||||
|
|
||||||
|
#define DBUS_SERVICE "org.hexchat.service"
|
||||||
#define DBUS_OBJECT_PATH "/org/hexchat"
|
#define DBUS_OBJECT_PATH "/org/hexchat"
|
||||||
|
|
||||||
static hexchat_plugin *ph;
|
static hexchat_plugin *ph;
|
||||||
|
|||||||
@@ -14,22 +14,11 @@ dbus_includes = [
|
|||||||
|
|
||||||
dbus_service_dir = join_paths(get_option('datadir'), 'dbus-1/services')
|
dbus_service_dir = join_paths(get_option('datadir'), 'dbus-1/services')
|
||||||
|
|
||||||
if get_option('dbus-service-use-appid')
|
|
||||||
dbus_service_name = 'io.github.Hexchat'
|
|
||||||
dbus_output_file = 'io.github.Hexchat.service'
|
|
||||||
dbus_cargs = '-DDBUS_SERVICE="io.github.Hexchat"'
|
|
||||||
else
|
|
||||||
dbus_service_name = 'org.hexchat.service'
|
|
||||||
dbus_output_file = 'org.hexchat.service.service'
|
|
||||||
dbus_cargs = '-DDBUS_SERVICE="org.hexchat.service"'
|
|
||||||
endif
|
|
||||||
|
|
||||||
dbus_conf = configuration_data()
|
dbus_conf = configuration_data()
|
||||||
dbus_conf.set('bindir', join_paths(get_option('prefix'), get_option('bindir')))
|
dbus_conf.set('bindir', join_paths(get_option('prefix'), get_option('bindir')))
|
||||||
dbus_conf.set('service_name', dbus_service_name)
|
|
||||||
configure_file(
|
configure_file(
|
||||||
input: 'org.hexchat.service.service.in',
|
input: 'org.hexchat.service.service.in',
|
||||||
output: dbus_output_file,
|
output: 'org.hexchat.service.service',
|
||||||
configuration: dbus_conf,
|
configuration: dbus_conf,
|
||||||
install: true,
|
install: true,
|
||||||
install_dir: dbus_service_dir
|
install_dir: dbus_service_dir
|
||||||
@@ -45,7 +34,6 @@ dbus_remote_object = custom_target('remote-object-glue',
|
|||||||
|
|
||||||
hexchat_dbus = static_library('hexchatdbus',
|
hexchat_dbus = static_library('hexchatdbus',
|
||||||
sources: [dbus_remote_object, marshal] + dbus_sources,
|
sources: [dbus_remote_object, marshal] + dbus_sources,
|
||||||
c_args: dbus_cargs,
|
|
||||||
dependencies: common_deps + dbus_deps,
|
dependencies: common_deps + dbus_deps,
|
||||||
include_directories: dbus_includes,
|
include_directories: dbus_includes,
|
||||||
pic: true
|
pic: true
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
[D-BUS Service]
|
[D-BUS Service]
|
||||||
Name=@service_name@
|
Name=org.hexchat.service
|
||||||
Exec=@bindir@/hexchat
|
Exec=@bindir@/hexchat
|
||||||
|
|||||||
+1
-1
@@ -59,7 +59,7 @@
|
|||||||
#include "hexchatc.h"
|
#include "hexchatc.h"
|
||||||
|
|
||||||
/* Setting _FILE_OFFSET_BITS to 64 doesn't change lseek to use off64_t on Windows, so override lseek to the version that does */
|
/* Setting _FILE_OFFSET_BITS to 64 doesn't change lseek to use off64_t on Windows, so override lseek to the version that does */
|
||||||
#if defined(WIN32) && (!defined(__MINGW32__) && !defined(__MINGW64__))
|
#ifdef WIN32
|
||||||
#define lseek _lseeki64
|
#define lseek _lseeki64
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -758,7 +758,6 @@ static char defaultconf_commands[] =
|
|||||||
"NAME SPING\n" "CMD ping\n\n"\
|
"NAME SPING\n" "CMD ping\n\n"\
|
||||||
"NAME SQUERY\n" "CMD quote SQUERY %2 :&3\n\n"\
|
"NAME SQUERY\n" "CMD quote SQUERY %2 :&3\n\n"\
|
||||||
"NAME SSLSERVER\n" "CMD server -ssl &2\n\n"\
|
"NAME SSLSERVER\n" "CMD server -ssl &2\n\n"\
|
||||||
"NAME SV\n" "CMD echo HexChat %v %m\n\n"\
|
|
||||||
"NAME UMODE\n" "CMD mode %n &2\n\n"\
|
"NAME UMODE\n" "CMD mode %n &2\n\n"\
|
||||||
"NAME UPTIME\n" "CMD quote STATS u\n\n"\
|
"NAME UPTIME\n" "CMD quote STATS u\n\n"\
|
||||||
"NAME VER\n" "CMD ctcp %2 VERSION\n\n"\
|
"NAME VER\n" "CMD ctcp %2 VERSION\n\n"\
|
||||||
|
|||||||
+21
-15
@@ -340,6 +340,17 @@ flood_autodialog_timeout (gpointer data)
|
|||||||
int
|
int
|
||||||
flood_check (char *nick, char *ip, server *serv, session *sess, int what) /*0=ctcp 1=priv */
|
flood_check (char *nick, char *ip, server *serv, session *sess, int what) /*0=ctcp 1=priv */
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
serv
|
||||||
|
int ctcp_counter;
|
||||||
|
time_t ctcp_last_time;
|
||||||
|
prefs
|
||||||
|
unsigned int ctcp_number_limit;
|
||||||
|
unsigned int ctcp_time_limit;
|
||||||
|
*/
|
||||||
|
char buf[512];
|
||||||
|
char real_ip[132];
|
||||||
|
int i;
|
||||||
time_t current_time;
|
time_t current_time;
|
||||||
current_time = time (NULL);
|
current_time = time (NULL);
|
||||||
|
|
||||||
@@ -356,24 +367,20 @@ flood_check (char *nick, char *ip, server *serv, session *sess, int what) /*0=ct
|
|||||||
serv->ctcp_counter++;
|
serv->ctcp_counter++;
|
||||||
if (serv->ctcp_counter == prefs.hex_flood_ctcp_num) /*if we reached the maximun numbers of ctcp in the seconds limits */
|
if (serv->ctcp_counter == prefs.hex_flood_ctcp_num) /*if we reached the maximun numbers of ctcp in the seconds limits */
|
||||||
{
|
{
|
||||||
char *mask, *message, *real_ip;
|
|
||||||
|
|
||||||
serv->ctcp_last_time = current_time; /*we got the flood, restore all the vars for next one */
|
serv->ctcp_last_time = current_time; /*we got the flood, restore all the vars for next one */
|
||||||
serv->ctcp_counter = 0;
|
serv->ctcp_counter = 0;
|
||||||
|
for (i = 0; i < 128; i++)
|
||||||
|
if (ip[i] == '@')
|
||||||
|
break;
|
||||||
|
g_snprintf (real_ip, sizeof (real_ip), "*!*%s", &ip[i]);
|
||||||
|
|
||||||
real_ip = strchr (ip, '@');
|
g_snprintf (buf, sizeof (buf),
|
||||||
if (real_ip != NULL)
|
_("You are being CTCP flooded from %s, ignoring %s\n"),
|
||||||
mask = g_strdup_printf ("*!*%s", real_ip);
|
nick, real_ip);
|
||||||
else
|
PrintText (sess, buf);
|
||||||
mask = g_strdup_printf ("%s!*", nick);
|
|
||||||
|
|
||||||
message = g_strdup_printf (_("You are being CTCP flooded from %s, ignoring %s\n"), nick, mask);
|
/* ignore CTCP */
|
||||||
|
ignore_add (real_ip, IG_CTCP, FALSE);
|
||||||
PrintText (sess, message);
|
|
||||||
ignore_add (mask, IG_CTCP, FALSE);
|
|
||||||
|
|
||||||
g_free (message);
|
|
||||||
g_free (mask);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -389,7 +396,6 @@ flood_check (char *nick, char *ip, server *serv, session *sess, int what) /*0=ct
|
|||||||
if (difftime (current_time, serv->msg_last_time) <
|
if (difftime (current_time, serv->msg_last_time) <
|
||||||
prefs.hex_flood_msg_time)
|
prefs.hex_flood_msg_time)
|
||||||
{
|
{
|
||||||
char buf[512];
|
|
||||||
serv->msg_counter++;
|
serv->msg_counter++;
|
||||||
if (serv->msg_counter == prefs.hex_flood_msg_num) /*if we reached the maximun numbers of ctcp in the seconds limits */
|
if (serv->msg_counter == prefs.hex_flood_msg_num) /*if we reached the maximun numbers of ctcp in the seconds limits */
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,100 @@
|
|||||||
|
/* HexChat
|
||||||
|
* Copyright (C) 1998-2010 Peter Zelezny.
|
||||||
|
* Copyright (C) 2009-2013 Berke Viktor.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Process textevents.in with make-te < textevents.in > textevents.h 2> textenums.h
|
||||||
|
*
|
||||||
|
* textevents.in notes:
|
||||||
|
*
|
||||||
|
* - The number in the ending lines indicates the total number of arguments
|
||||||
|
* a text event supports. So don't touch them unless you actually modify the
|
||||||
|
* EMIT_SIGNAL commands, too.
|
||||||
|
*
|
||||||
|
* - The "n" prefix means the event text does not have to be translated thus
|
||||||
|
* the N_() gettext encapsulation will be omitted.
|
||||||
|
*
|
||||||
|
* - EMIT_SIGNAL is just a macro for text_emit() which can take a total amount
|
||||||
|
* of 4 event arguments, so events have a hard limit of 4 arguments.
|
||||||
|
*
|
||||||
|
* - $t means the xtext tab, i.e. the vertical separator line for indented nicks.
|
||||||
|
* That means $t forces a new line for that event.
|
||||||
|
*
|
||||||
|
* - Text events are emitted in ctcp.c, dcc.c, hexchat.c, ignore.c, inbound.c,
|
||||||
|
* modes.c, notify.c, outbound.c, proto-irc.c, server.c and text.c.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
char name[512];
|
||||||
|
char num[512];
|
||||||
|
char help[512];
|
||||||
|
char def[512];
|
||||||
|
char args[512];
|
||||||
|
char buf[512];
|
||||||
|
char *defines[512];
|
||||||
|
int i = 0, max;
|
||||||
|
|
||||||
|
printf("/* this file is auto generated, edit textevents.in instead! */\n\nconst struct text_event te[] = {\n");
|
||||||
|
while(fgets(name, sizeof(name), stdin))
|
||||||
|
{
|
||||||
|
name[strlen(name)-1] = 0;
|
||||||
|
fgets(num, sizeof(num), stdin);
|
||||||
|
num[strlen(num)-1] = 0;
|
||||||
|
fgets(help, sizeof(help), stdin);
|
||||||
|
help[strlen(help)-1] = 0;
|
||||||
|
fgets(def, sizeof(def), stdin);
|
||||||
|
def[strlen(def)-1] = 0;
|
||||||
|
fgets(args, sizeof(args), stdin);
|
||||||
|
args[strlen(args)-1] = 0;
|
||||||
|
fgets(buf, sizeof(buf), stdin);
|
||||||
|
|
||||||
|
if (args[0] == 'n')
|
||||||
|
printf("\n{\"%s\", %s, %d, \n\"%s\"},\n",
|
||||||
|
name, help, atoi(args+1) | 128, def);
|
||||||
|
else
|
||||||
|
printf("\n{\"%s\", %s, %d, \nN_(\"%s\")},\n",
|
||||||
|
name, help, atoi(args), def);
|
||||||
|
defines[i] = strdup (num);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("};\n");
|
||||||
|
|
||||||
|
fprintf(stderr, "/* this file is auto generated, edit textevents.in instead! */\n\nenum\n{\n");
|
||||||
|
max = i;
|
||||||
|
i = 0;
|
||||||
|
while (i < max)
|
||||||
|
{
|
||||||
|
if (i + 1 < max)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "\t%s,\t\t%s,\n", defines[i], defines[i+1]);
|
||||||
|
free (defines[i]);
|
||||||
|
i++;
|
||||||
|
} else
|
||||||
|
fprintf(stderr, "\t%s,\n", defines[i]);
|
||||||
|
free (defines[i]);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
fprintf(stderr, "\tNUM_XP\n};\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
<?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>Application</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>{A7D7CE59-2A31-48AE-BED2-A9828E241832}</ProjectGuid>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<RootNamespace>makete</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>
|
||||||
|
<OutDir>$(HexChatLib)</OutDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="make-te.c" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
<?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="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</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="make-te.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
@@ -24,11 +24,9 @@ common_sources = [
|
|||||||
'util.c'
|
'util.c'
|
||||||
]
|
]
|
||||||
|
|
||||||
common_sysinfo_deps = []
|
|
||||||
|
|
||||||
common_deps = [
|
common_deps = [
|
||||||
libgio_dep,
|
libgio_dep,
|
||||||
] + global_deps
|
]
|
||||||
|
|
||||||
common_includes = [
|
common_includes = [
|
||||||
config_h_include,
|
config_h_include,
|
||||||
@@ -43,10 +41,7 @@ if host_machine.system() == 'windows'
|
|||||||
common_deps += [
|
common_deps += [
|
||||||
cc.find_library('ws2_32'), # winsock
|
cc.find_library('ws2_32'), # winsock
|
||||||
cc.find_library('winmm'), # playsound
|
cc.find_library('winmm'), # playsound
|
||||||
]
|
|
||||||
common_sysinfo_deps += [
|
|
||||||
cc.find_library('wbemuuid'), # sysinfo
|
cc.find_library('wbemuuid'), # sysinfo
|
||||||
cc.find_library('wbemcore'),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
common_sources += 'sysinfo/win32/backend.c'
|
common_sources += 'sysinfo/win32/backend.c'
|
||||||
@@ -103,7 +98,7 @@ endif
|
|||||||
hexchat_common = static_library('hexchatcommon',
|
hexchat_common = static_library('hexchatcommon',
|
||||||
sources: [textevents] + marshal + common_sources,
|
sources: [textevents] + marshal + common_sources,
|
||||||
include_directories: config_h_include,
|
include_directories: config_h_include,
|
||||||
dependencies: common_deps + common_sysinfo_deps,
|
dependencies: common_deps,
|
||||||
c_args: common_cflags,
|
c_args: common_cflags,
|
||||||
pic: true
|
pic: true
|
||||||
)
|
)
|
||||||
@@ -118,5 +113,4 @@ hexchat_common_dep = declare_dependency(
|
|||||||
hexchat_plugin_dep = declare_dependency(
|
hexchat_plugin_dep = declare_dependency(
|
||||||
include_directories: common_includes,
|
include_directories: common_includes,
|
||||||
compile_args: common_cflags,
|
compile_args: common_cflags,
|
||||||
dependencies: global_deps,
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -2342,10 +2342,7 @@ cmd_ignore (struct session *sess, char *tbuf, char *word[], char *word_eol[])
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
mask = word[2];
|
mask = word[2];
|
||||||
/* If not a full mask or using wildcards, assume nick */
|
if (strchr (mask, '?') == NULL &&
|
||||||
if (strchr (mask, '!') == NULL &&
|
|
||||||
strchr (mask, '@') == NULL &&
|
|
||||||
strchr (mask, '?') == NULL &&
|
|
||||||
strchr (mask, '*') == NULL)
|
strchr (mask, '*') == NULL)
|
||||||
{
|
{
|
||||||
mask = tbuf;
|
mask = tbuf;
|
||||||
@@ -2610,7 +2607,7 @@ cmd_load (struct session *sess, char *tbuf, char *word[], char *word_eol[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_PLUGIN
|
#ifdef USE_PLUGIN
|
||||||
if (g_str_has_suffix (word[2], "."PLUGIN_SUFFIX))
|
if (g_str_has_suffix (word[2], "."G_MODULE_SUFFIX))
|
||||||
{
|
{
|
||||||
arg = NULL;
|
arg = NULL;
|
||||||
if (word_eol[3][0])
|
if (word_eol[3][0])
|
||||||
@@ -3616,7 +3613,7 @@ cmd_unload (struct session *sess, char *tbuf, char *word[], char *word_eol[])
|
|||||||
#ifdef USE_PLUGIN
|
#ifdef USE_PLUGIN
|
||||||
gboolean by_file = FALSE;
|
gboolean by_file = FALSE;
|
||||||
|
|
||||||
if (g_str_has_suffix (word[2], "."PLUGIN_SUFFIX))
|
if (g_str_has_suffix (word[2], "."G_MODULE_SUFFIX))
|
||||||
by_file = TRUE;
|
by_file = TRUE;
|
||||||
|
|
||||||
switch (plugin_kill (word[2], by_file))
|
switch (plugin_kill (word[2], by_file))
|
||||||
@@ -3641,7 +3638,7 @@ cmd_reload (struct session *sess, char *tbuf, char *word[], char *word_eol[])
|
|||||||
#ifdef USE_PLUGIN
|
#ifdef USE_PLUGIN
|
||||||
gboolean by_file = FALSE;
|
gboolean by_file = FALSE;
|
||||||
|
|
||||||
if (g_str_has_suffix (word[2], "."PLUGIN_SUFFIX))
|
if (g_str_has_suffix (word[2], "."G_MODULE_SUFFIX))
|
||||||
by_file = TRUE;
|
by_file = TRUE;
|
||||||
|
|
||||||
switch (plugin_reload (sess, word[2], by_file))
|
switch (plugin_reload (sess, word[2], by_file))
|
||||||
@@ -4301,7 +4298,7 @@ auto_insert (char *dest, gsize destlen, unsigned char *src, char *word[],
|
|||||||
case 'h':
|
case 'h':
|
||||||
utf = h; break;
|
utf = h; break;
|
||||||
case 'm':
|
case 'm':
|
||||||
utf = get_sys_str (1); break;
|
utf = ""; break; /* Used to be machine info */
|
||||||
case 'n':
|
case 'n':
|
||||||
utf = n; break;
|
utf = n; break;
|
||||||
case 's':
|
case 's':
|
||||||
|
|||||||
+5
-6
@@ -200,15 +200,13 @@ plugin_list_add (hexchat_context *ctx, char *filename, const char *name,
|
|||||||
return pl;
|
return pl;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef WIN32
|
|
||||||
static void *
|
static void *
|
||||||
hexchat_dummy (hexchat_plugin *ph)
|
hexchat_dummy (hexchat_plugin *ph)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#ifdef WIN32
|
||||||
|
|
||||||
static int
|
static int
|
||||||
hexchat_read_fd (hexchat_plugin *ph, GIOChannel *source, char *buf, int *len)
|
hexchat_read_fd (hexchat_plugin *ph, GIOChannel *source, char *buf, int *len)
|
||||||
{
|
{
|
||||||
@@ -457,6 +455,7 @@ plugin_auto_load (session *sess)
|
|||||||
for_files (lib_dir, "hcexec.dll", plugin_auto_load_cb);
|
for_files (lib_dir, "hcexec.dll", plugin_auto_load_cb);
|
||||||
for_files (lib_dir, "hcfishlim.dll", plugin_auto_load_cb);
|
for_files (lib_dir, "hcfishlim.dll", plugin_auto_load_cb);
|
||||||
for_files(lib_dir, "hclua.dll", plugin_auto_load_cb);
|
for_files(lib_dir, "hclua.dll", plugin_auto_load_cb);
|
||||||
|
for_files (lib_dir, "hcmpcinfo.dll", plugin_auto_load_cb);
|
||||||
for_files (lib_dir, "hcperl.dll", plugin_auto_load_cb);
|
for_files (lib_dir, "hcperl.dll", plugin_auto_load_cb);
|
||||||
for_files (lib_dir, "hcpython2.dll", plugin_auto_load_cb);
|
for_files (lib_dir, "hcpython2.dll", plugin_auto_load_cb);
|
||||||
for_files (lib_dir, "hcpython3.dll", plugin_auto_load_cb);
|
for_files (lib_dir, "hcpython3.dll", plugin_auto_load_cb);
|
||||||
@@ -464,10 +463,10 @@ plugin_auto_load (session *sess)
|
|||||||
for_files (lib_dir, "hcwinamp.dll", plugin_auto_load_cb);
|
for_files (lib_dir, "hcwinamp.dll", plugin_auto_load_cb);
|
||||||
for_files (lib_dir, "hcsysinfo.dll", plugin_auto_load_cb);
|
for_files (lib_dir, "hcsysinfo.dll", plugin_auto_load_cb);
|
||||||
#else
|
#else
|
||||||
for_files (lib_dir, "*."PLUGIN_SUFFIX, plugin_auto_load_cb);
|
for_files (lib_dir, "*."G_MODULE_SUFFIX, plugin_auto_load_cb);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for_files (sub_dir, "*."PLUGIN_SUFFIX, plugin_auto_load_cb);
|
for_files (sub_dir, "*."G_MODULE_SUFFIX, plugin_auto_load_cb);
|
||||||
|
|
||||||
g_free (sub_dir);
|
g_free (sub_dir);
|
||||||
}
|
}
|
||||||
@@ -2010,7 +2009,7 @@ hexchat_pluginpref_list (hexchat_plugin *pl, char* dest)
|
|||||||
else /* existing config file, get list of settings */
|
else /* existing config file, get list of settings */
|
||||||
{
|
{
|
||||||
strcpy (dest, ""); /* clean up garbage */
|
strcpy (dest, ""); /* clean up garbage */
|
||||||
while (fscanf (fpIn, " %511[^\n]", bufp) != EOF) /* read whole lines including whitespaces */
|
while (fscanf (fpIn, " %[^\n]", bufp) != EOF) /* read whole lines including whitespaces */
|
||||||
{
|
{
|
||||||
token = strtok (buffer, "=");
|
token = strtok (buffer, "=");
|
||||||
g_strlcat (dest, g_strchomp (token), 4096); /* Dest must not be smaller than this */
|
g_strlcat (dest, g_strchomp (token), 4096); /* Dest must not be smaller than this */
|
||||||
|
|||||||
@@ -181,12 +181,4 @@ int plugin_show_help (session *sess, char *cmd);
|
|||||||
void plugin_command_foreach (session *sess, void *userdata, void (*cb) (session *sess, void *userdata, char *name, char *usage));
|
void plugin_command_foreach (session *sess, void *userdata, void (*cb) (session *sess, void *userdata, char *name, char *usage));
|
||||||
session *plugin_find_context (const char *servname, const char *channel, server *current_server);
|
session *plugin_find_context (const char *servname, const char *channel, server *current_server);
|
||||||
|
|
||||||
/* On macOS, G_MODULE_SUFFIX says "so" but meson uses "dylib"
|
|
||||||
* https://github.com/mesonbuild/meson/issues/1160 */
|
|
||||||
#if defined(__APPLE__)
|
|
||||||
# define PLUGIN_SUFFIX "dylib"
|
|
||||||
#else
|
|
||||||
# define PLUGIN_SUFFIX G_MODULE_SUFFIX
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+4
-33
@@ -53,9 +53,7 @@ irc_login (server *serv, char *user, char *realname)
|
|||||||
|
|
||||||
if (serv->password[0] && serv->loginmethod == LOGIN_PASS)
|
if (serv->password[0] && serv->loginmethod == LOGIN_PASS)
|
||||||
{
|
{
|
||||||
tcp_sendf (serv, "PASS %s%s\r\n",
|
tcp_sendf (serv, "PASS %s\r\n", serv->password);
|
||||||
(serv->password[0] == ':' || strchr (serv->password, ' ')) ? ":" : "",
|
|
||||||
serv->password);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tcp_sendf (serv,
|
tcp_sendf (serv,
|
||||||
@@ -1243,36 +1241,15 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[],
|
|||||||
len = strlen (text);
|
len = strlen (text);
|
||||||
if (text[0] == 1 && text[len - 1] == 1) /* ctcp */
|
if (text[0] == 1 && text[len - 1] == 1) /* ctcp */
|
||||||
{
|
{
|
||||||
char *new_pdibuf = NULL;
|
|
||||||
text[len - 1] = 0;
|
text[len - 1] = 0;
|
||||||
text++;
|
text++;
|
||||||
if (g_ascii_strncasecmp (text, "ACTION", 6) != 0)
|
if (g_ascii_strncasecmp (text, "ACTION", 6) != 0)
|
||||||
flood_check (nick, ip, serv, sess, 0);
|
flood_check (nick, ip, serv, sess, 0);
|
||||||
if (g_ascii_strncasecmp (text, "DCC ", 4) == 0)
|
if (g_ascii_strncasecmp (text, "DCC ", 4) == 0)
|
||||||
{
|
/* redo this with handle_quotes TRUE */
|
||||||
int i;
|
process_data_init (word[1], word_eol[1], word, word_eol, TRUE, FALSE);
|
||||||
char *new_word[PDIWORDS+1] = { NULL };
|
|
||||||
char *new_word_eol[PDIWORDS+1] = { NULL };
|
|
||||||
|
|
||||||
new_pdibuf = g_malloc (strlen (word_eol[6]) + 1);
|
|
||||||
|
|
||||||
/* This is a bit ugly but we handle the contents of the DCC message containing
|
|
||||||
* "quoted paths for files" here which means reparsing the message with handle_quotes.
|
|
||||||
* We avoid reparsing the entire message to avoid corrupting the non DCC parts.
|
|
||||||
* Greater than PDIWORD length DCC messages will be truncated. */
|
|
||||||
process_data_init (new_pdibuf, word_eol[6], new_word, new_word_eol, TRUE, FALSE);
|
|
||||||
for (i = 6; i < PDIWORDS; ++i)
|
|
||||||
{
|
|
||||||
word[i] = new_word[i - 5];
|
|
||||||
word_eol[i] = new_word_eol[i - 5];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ctcp_handle (sess, to, nick, ip, text, word, word_eol, id,
|
ctcp_handle (sess, to, nick, ip, text, word, word_eol, id,
|
||||||
tags_data);
|
tags_data);
|
||||||
|
|
||||||
/* Note word will be invalid beyond this scope */
|
|
||||||
g_free (new_pdibuf);
|
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
if (is_channel (serv, to))
|
if (is_channel (serv, to))
|
||||||
@@ -1473,13 +1450,7 @@ handle_message_tag_time (const char *time, message_tags_data *tags_data)
|
|||||||
long long int t;
|
long long int t;
|
||||||
|
|
||||||
/* we ignore the milisecond part */
|
/* we ignore the milisecond part */
|
||||||
if (
|
if (sscanf (time, "%lld", &t) != 1)
|
||||||
#if defined(__MINGW64__) || defined(__MINGW32__)
|
|
||||||
__mingw_sscanf
|
|
||||||
#else
|
|
||||||
sscanf
|
|
||||||
#endif
|
|
||||||
(time, "%lld", &t) != 1)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
tags_data->timestamp = (time_t) t;
|
tags_data->timestamp = (time_t) t;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user