# Keitairc::Config
#
# Copyright (c) 2008 Jun Morimoto <morimoto@mrmt.net>
+# Copyright (c) 2010 ISHIKAWA Mutsumi <ishikawa@hanzubon.jp>
# This program is covered by the GNU General Public License 2
package Keitairc::Config;
$me->define(
# required
- 'irc_nick',
- 'irc_username',
- 'irc_server',
- 'web_password',
- 'web_host',
+ 'irc_nick' => {ATTR => 'RO|REQ'},
+ 'irc_username' => {ATTR => 'RO|REQ'},
+ 'irc_server' => {ATTR => 'RO|REQ'},
+ 'web_password' => {ATTR => 'RO|REQ'},
+ 'web_host' => {ATTR => 'RO|REQ'},
# optional
'irc_password',
'softbank_serial_key' => {DEFAULT => ''},
'emobile_userid' => {DEFAULT => ''},
'irc_keyword',
- 'web_listen_port',
+ 'web_listen_port' => {ATTR => 'RO'},
'web_title' => {DEFAULT => 'keitairc'},
'common_header' => {DEFAULT => '
<meta name="Robots" content="noindex,nofollow" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="-1" />'},
'extra_header' => {DEFAULT => ''},
- 'silent_config' => {DEFAULT => $arg->{silent}},
+ 'silent_config' => {DEFAULT => $arg->{silent}, ATTR => 'RO'},
'version' => {DEFAULT => $arg->{version}},
- 'template_dir' => {DEFAULT => getcwd() . '/data/templates:__KEITAIRC_DATA_DIR__/templates'},
- 'plugin_dir' => {DEFAULT => getcwd() . '/data/plugins:__KEITAIRC_DATA_DIR__/plugins'},
- 'public_dir' => {DEFAULT => getcwd() . '/data/public:__KEITAIRC_DATA_DIR__/public'},
+ 'template_dir' => {DEFAULT => getcwd() . '/data/templates:__KEITAIRC_DATA_DIR__/templates', ATTR => 'RO'},
+ 'plugin_dir' => {DEFAULT => getcwd() . '/data/plugins:__KEITAIRC_DATA_DIR__/plugins', ATTR => 'RO'},
+ 'public_dir' => {DEFAULT => getcwd() . '/data/public:__KEITAIRC_DATA_DIR__/public', ATTR => 'RO'},
'url_redirect' => {DEFAULT => ''},
'smtp_server' => {DEFAULT => ''},
'smtp_from' => {DEFAULT => ''},
'smtp_to' => {DEFAULT => ''},
'rgeocode_server' => {DEFAULT => 'finds'},
- 'pid_file' => {DEFAULT => 'keitairc.pid'},
-
- 'web_root' => {DEFAULT => '/', VALIDATE => \&valid_web_root},
- 'web_schema' => {DEFAULT => 'http', VALIDATE => \&valid_web_schema},
- 'fontsize' => {DEFAULT => '+0', VALIDATE => \&valid_fontsize},
- 'mobile_fontsize' => {DEFAULT => -1, VALIDATE => \&valid_fontsize},
- 'irc_charset' => {DEFAULT => 'utf8', VALIDATE => \&valid_charset},
- 'web_charset' => {DEFAULT => 'shiftjis', VALIDATE => \&valid_charset},
- 'pid_dir' => {DEFAULT => $ENV{HOME} . '/.keitairc_log', VALIDATE => \&valid_dir},
- 'url_target' => {DEFAULT => '_self', VALIDATE => \&valid_url_target},
- 'log' => {DEFAULT => 'file', VALIDATE => \&valid_log},
+ 'pid_file' => {DEFAULT => 'keitairc.pid', ATTR => 'RO'},
+
+ 'web_root' => {TYPE => 'web_root', DEFAULT => '/', ATTR => 'RO'},
+ 'web_schema' => {TYPE => 'web_schema', DEFAULT => 'http', ATTR => 'RO'},
+ 'fontsize' => {TYPE => 'fontsize', DEFAULT => '+0'},
+ 'mobile_fontsize' => {TYPE => 'fontsize', DEFAULT => -1},
+ 'irc_charset' => {TYPE => 'charset', DEFAULT => 'utf8'},
+ 'web_charset' => {TYPE => 'charset', DEFAULT => 'shiftjis'},
+ 'pid_dir' => {TYPE => 'dir', DEFAULT => $ENV{HOME} . '/.keitairc_log', ATTR => 'RO'},
+ 'url_target' => {TYPE => 'url_target', DEFAULT => '_self'},
+ 'log' => {TYPE => 'log', DEFAULT => 'file', ATTR => 'RO'},
# optional integer params
- 'irc_port' => {DEFAULT => 6667, VALIDATE => \&valid_int},
- 'cookie_ttl' => {DEFAULT => 86400 * 3, VALIDATE => \&valid_int}, # 3 days
- 'session_ttl' => {DEFAULT => 60 * 30, VALIDATE => \&valid_int}, # 30 min
- 'cache_expire' => {DEFAULT => 10800, VALIDATE => \&valid_int},
- 'web_port' => {DEFAULT => 8080, VALIDATE => \&valid_int},
- 'web_lines' => {DEFAULT => 100, VALIDATE => \&valid_int},
- 'ping_delay' => {DEFAULT => 30, VALIDATE => \&valid_int},
- 'reconnect_delay' => {DEFAULT => 10, VALIDATE => \&valid_int},
+ 'irc_port' => {TYPE => 'int', DEFAULT => 6667},
+ 'cookie_ttl' => {TYPE => 'int', DEFAULT => 86400 * 3}, # 3 days
+ 'session_ttl' => {TYPE => 'int', DEFAULT => 60 * 30}, # 30 min
+ 'cache_expire' => {TYPE => 'int', DEFAULT => 3600 * 12}, # 12 hour
+ 'web_port' => {TYPE => 'int', DEFAULT => 8080},
+ 'web_lines' => {TYPE => 'int', DEFAULT => 100},
+ 'ping_delay' => {TYPE => 'int', DEFAULT => 30},
+ 'reconnect_delay' => {TYPE => 'int', DEFAULT => 10},
# optional boolean params
- 'show_joinleave' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1},
- 'show_console' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0},
- 'follow_nick' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1},
- 'debug' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0},
- 'daemonize' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0},
- 'reverse_message' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1},
- 'reverse_recent' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1},
- 'reverse_unread' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1},
- 'webkit_newui' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1},
+ 'show_joinleave' => {TYPE => 'bool', DEFAULT => 1},
+ 'show_console' => {TYPE => 'bool', DEFAULT => 0},
+ 'follow_nick' => {TYPE => 'bool', DEFAULT => 1},
+ 'debug' => {TYPE => 'bool', DEFAULT => 0},
+ 'daemonize' => {TYPE => 'bool', DEFAULT => 0},
+ 'reverse_message' => {TYPE => 'bool', DEFAULT => 1},
+ 'reverse_recent' => {TYPE => 'bool', DEFAULT => 1},
+ 'reverse_unread' => {TYPE => 'bool', DEFAULT => 1},
+ 'webkit_newui' => {TYPE => 'bool', DEFAULT => 1},
# obsolates (ignored)
- 'show_newmsgonly' => {VALIDATE => \&valid_obsolates},
- 'web_username' => {VALIDATE => \&valid_obsolates},
- 'use_cookie' => {VALIDATE => \&valid_obsolates},
- 'au_pcsv' => {VALIDATE => \&valid_obsolates},
+ 'show_newmsgonly' => {TYPE => 'obsolates'},
+ 'web_username' => {TYPE => 'obsolates'},
+ 'use_cookie' => {TYPE => 'obsolates'},
+ 'au_pcsv' => {TYPE => 'obsolates'},
);
if(-r '/etc/keitairc'){
$me->args(\@argv);
# check required parameters
- foreach my $n (qw(irc_nick irc_username irc_server web_host web_password)) {
+ foreach my $n (keys %{$me->{'REQ'}}) {
if(!defined($me->get($n)) || !length($me->get($n))) {
die($n . ' does not specified');
}
}
################################################################
-sub file{
+sub file {
my $me = shift;
my $file = shift;
if(-r $file){
}
################################################################
+sub define {
+ my $me = shift;
+ my @args = ();
+
+ while (@_) {
+ my $var = shift;
+ my $cfg = ref($_[0]) eq 'HASH' ? shift : { };
+ if (defined $cfg->{TYPE}) {
+ if (!defined $cfg->{VALIDATE} && defined &{'valid_' . $cfg->{TYPE}}) {
+ $cfg->{VALIDATE} = \&{'valid_' . $cfg->{TYPE}};
+ }
+ if (!defined $cfg->{ARGCOUNT} && $cfg->{TYPE} eq 'bool') {
+ $cfg->{ARGCOUNT} = ARGCOUNT_NONE;
+ }
+ $me->type($var, $cfg->{TYPE});
+ delete $cfg->{TYPE};
+ }
+ if (defined $cfg->{ATTR}) {
+ my @attr = split(/\|/, $cfg->{ATTR});
+ foreach my $at (@attr) {
+ if ($at eq 'RO') {
+ $me->readonly($var, 1);
+ } elsif ($at eq 'REQ') {
+ $me->required($var, 1);
+ } else {
+ warn 'Ignore unknown attribute: ' . $at;
+ }
+ }
+ delete $cfg->{ATTR};
+ }
+ push(@args, $var => $cfg);
+ }
+
+ return $me->SUPER::define(@args);
+}
+
+sub type {
+ my ($me, $name, $type) = @_;
+ $me->{TYPE} = {} if (!defined $me->{TYPE});
+ $me->{TYPE}->{$name} = $type if (defined $type);
+ return (defined $me->{TYPE}->{$name} ? $me->{TYPE}->{$name} : 'string');
+}
+
+sub bool_attr {
+ my ($me, $type_name, $name, $flag) = @_;
+ $me->{$type_name} = {} if (!defined $me->{$type_name});
+ if (defined $flag) {
+ if ($flag) {
+ $me->{$type_name}->{$name} = 1;
+ } else {
+ delete $me->{$type_name}->{$name};
+ }
+ }
+ return defined $me->{$type_name}->{$name};
+}
+
+sub readonly {
+ my $me = shift;
+ return $me->bool_attr('RO', @_);
+}
+
+sub required {
+ my $me = shift;
+ return $me->bool_attr('REQ', @_);
+}
+
+################################################################
sub content_charset{
my $me = shift;
Encode::MIME::Name::get_mime_name(Encode::resolve_alias($me->web_charset()));