tune.c
author Myhailo Danylenko <isbear@ukrpost.net>
Sun, 20 May 2012 22:15:51 +0300
changeset 29 23fa36d480fb
child 31 e404cd1c7077
permissions -rw-r--r--
Merge pep modules & use events * merge mood, tune, activity, geoloc, avatar * split them into functionality/ui * tune, geoloc: fix timeout bug * geoloc: fix guard unregistering * tune, mood: fix memleaking delayed info * mood: fix non-publish of offline-delayed data * activity: unregister reply handler on disconnect * fix silly copyright typo * update hgignore * v0.0.3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
29
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
/* Copyright 2009-2012 Myhailo Danylenko
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
 *
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
 * This file is part of mcabber-pep
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
 *
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
 * mcabber-pep is free software: you can redistribute it and/or modify
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
 * the Free Software Foundation, either version 2 of the License, or
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
 * (at your option) any later version.
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
 *
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
 * GNU General Public License for more details.
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
 *
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
 * along with this program.  If not, see <http://www.gnu.org/licenses/>. */
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
#include <glib.h>
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
#include <string.h>
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
#include <mcabber/commands.h>
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
#include <mcabber/compl.h>
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
#include <mcabber/utils.h>
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
#include <mcabber/screen.h>
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
#include <mcabber/logprint.h>
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
#include <mcabber/roster.h>
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
#include <mcabber/hbuf.h>      // HBUF_PREFIX_*
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
#include <mcabber/hooks.h>
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    30
#include <mcabber/modules.h>
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    31
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    32
#include "tune.h"
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    33
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    34
#include "config.h"
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    35
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    36
//
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    37
//  module description
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    38
//
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    39
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    40
void tune_init   (void);
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
void tune_uninit (void);
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
#define DESCRIPTION ( \
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
	"User interface for PEP tune events\n" \
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
	"Prints incoming notifications into buddies buffers\n" \
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    46
	"Provides command /tune" )
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    47
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    48
static const gchar *deps[] = { "pep_tune", NULL };
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    49
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    50
static module_info_t info_tune_dev = {
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    51
	.branch      = "dev",
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    52
	.api         = 20,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    53
	.version     = PROJECT_VERSION,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    54
	.description = DESCRIPTION,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    55
	.requires    = deps,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    56
	.init        = tune_init,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    57
	.uninit      = tune_uninit,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    58
	.next        = NULL,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    59
};
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    60
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    61
static module_info_t info_tune_0_10_0 = {
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    62
	.branch      = "0.10.0",
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    63
	.api         = 1,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    64
	.version     = PROJECT_VERSION,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    65
	.description = DESCRIPTION,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    66
	.requires    = deps,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    67
	.init        = tune_init,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    68
	.uninit      = tune_uninit,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    69
	.next        = &info_tune_dev,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    70
};
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    71
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    72
module_info_t info_tune = {
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    73
	.branch      = "0.10.1",
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    74
	.api         = 1,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    75
	.version     = PROJECT_VERSION,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    76
	.description = DESCRIPTION,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    77
	.requires    = deps,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
	.init        = tune_init,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    79
	.uninit      = tune_uninit,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    80
	.next        = &info_tune_0_10_0,
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    81
};
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    82
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    83
//
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    84
//  globals
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    85
//
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    86
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    87
#ifdef MCABBER_API_HAVE_CMD_ID
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    88
static gpointer tune_cmid     = NULL;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    89
static gboolean tune_set_safe = FALSE;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    90
#endif
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    91
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    92
static guint tune_cid        = 0;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    93
static guint tune_hid_tunein = 0;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    94
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    95
//
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    96
//  code
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    97
//
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    98
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    99
static void do_tune (char *arg)
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   100
{
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   101
	hk_arg_t tags[] = {
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   102
		{ "artist", NULL },
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   103
		{ "length", NULL },
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   104
		{ "rating", NULL },
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   105
		{ "source", NULL },
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   106
		{ "title",  NULL },
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   107
		{ "track",  NULL },
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   108
		{ "uri",    NULL },
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   109
		{ NULL,     NULL },
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   110
	};
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   111
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   112
	if (!*arg) { // request
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   113
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   114
		GError *error = NULL;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   115
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   116
		tune_request ( CURRENT_JID, &error );
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   117
		if ( error ) {
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   118
			scr_log_print ( LPRINT_NORMAL, "Error sending request: %s.", error -> message );
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   119
			g_error_free ( error );
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   120
		} else
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   121
			scr_log_print ( LPRINT_NORMAL, "Request sent." ); // XXX
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   122
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   123
		return;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   124
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   125
	} else if (arg[0] != '-' || arg[1] != '\0') { 
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   126
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   127
		char *p;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   128
		char *argstart     = NULL;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   129
		char *argstop      = NULL;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   130
		char *tagstart     = NULL;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   131
		char *tagstop      = NULL;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   132
		char *wordstart    = arg;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   133
		gboolean proceed   = TRUE;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   134
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   135
// pt = p, ws = wordstart, ts = tagstart, tt = tagstop, as = argstart, at = argstop
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   136
// tag=value value tag=value
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   137
// w  p
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   138
// s  t
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   139
// t  ta
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   140
// s  t*
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   141
// tag=value value tag=value
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   142
// t  ta    p
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   143
// s  t*    t
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   144
// t  ta    aw
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   145
// s  ts    ts
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   146
// tag=value value tag=value
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   147
// t  ta    aw    p
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   148
// s  ts    ts    t
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   149
// t  ta          aw
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   150
// s  ts          ts
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   151
// tag=value value tag=value
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   152
// t  ta          aw  p
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   153
// s  ts          ts  t
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   154
//                 t  ta
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   155
//                 s  t*
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   156
// tag=value value tag=value
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   157
//                 t  ta    p
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   158
//                 s  t*    t
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   159
//                 t  ta    a
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   160
//                 s  ts    t
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   161
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   162
		for (p = arg; proceed; ++p) {
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   163
			switch (*p) {
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   164
			case '=':
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   165
				if (tagstart && tagstop - tagstart) {
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   166
					// process previous args
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   167
					hk_arg_t *tag;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   168
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   169
					for (tag = tags; tag->name; ++tag) {
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   170
						if (!strncmp (tag->name, tagstart, tagstop - tagstart)) {
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   171
							g_free ( (gchar *) tag->value );
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   172
							if (argstop - argstart) {
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   173
								*argstop = '\0';
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   174
								tag->value = to_utf8 (argstart);
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   175
							}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   176
							break;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   177
						}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   178
					}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   179
				}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   180
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   181
				tagstart = wordstart;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   182
				tagstop  = p;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   183
				argstop  = p+1;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   184
				argstart = p+1;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   185
				break;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   186
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   187
			case '\0':
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   188
				argstop = p;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   189
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   190
				if (tagstop - tagstart) {
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   191
					// process previous args
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   192
					hk_arg_t *tag;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   193
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   194
					for (tag = tags; tag->name; ++tag) {
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   195
						if (!strncmp (tag->name, tagstart, tagstop - tagstart)) {
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   196
							g_free ( (gchar *) tag->value );
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   197
							if (argstop - argstart)
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   198
								tag->value = to_utf8 (argstart);
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   199
							break;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   200
						}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   201
					}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   202
				}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   203
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   204
				proceed = FALSE;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   205
				break;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   206
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   207
			case ' ':
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   208
				argstop = p;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   209
				wordstart = p+1;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   210
				break;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   211
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   212
			default:
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   213
				break;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   214
			}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   215
		}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   216
	}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   217
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   218
	hk_run_handlers ( HOOK_TUNE_OUT, tags );
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   219
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   220
	{
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   221
		hk_arg_t *tag;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   222
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   223
		for (tag = tags; tag->name; ++tag)
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   224
			g_free ( (gchar *) tag->value );
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   225
	}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   226
}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   227
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   228
static guint tune_htih ( const gchar *htype, hk_arg_t *args, gpointer udata )
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   229
{
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   230
	GString     *mesg = g_string_new ( NULL );
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   231
	const gchar *from = NULL;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   232
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   233
	{
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   234
		hk_arg_t *arg;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   235
		for ( arg = args; arg -> name; arg ++ )
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   236
			if ( arg -> value ) {
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   237
				if ( ! strcmp ( arg -> name, "from" ) )
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   238
					from = arg -> value;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   239
				else
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   240
					g_string_append_printf ( mesg, "\n - %s: %s", arg -> name, arg -> value );
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   241
			}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   242
	}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   243
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   244
	if (mesg->len)
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   245
		g_string_prepend (mesg, "Now listens to:");
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   246
	else
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   247
		g_string_overwrite (mesg, 0, "Now listening to nothing");
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   248
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   249
	{ // print to buddy's buffer
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   250
		gchar *jid = jidtodisp ( from );
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   251
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   252
		scr_write_incoming_message ( jid, mesg->str, 0, HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG, 0 ); // NO conversion from utf-8
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   253
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   254
		g_free ( jid );
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   255
	}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   256
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   257
	g_string_free ( mesg, TRUE );
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   258
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   259
	return HOOK_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   260
}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   261
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   262
void tune_init(void)
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   263
{
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   264
	tune_cid = compl_new_category ();
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   265
	if (tune_cid) {
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   266
		compl_add_category_word (tune_cid, "artist=");
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   267
		compl_add_category_word (tune_cid, "length=");
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   268
		compl_add_category_word (tune_cid, "rating=");
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   269
		compl_add_category_word (tune_cid, "source=");
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   270
		compl_add_category_word (tune_cid, "title=");
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   271
		compl_add_category_word (tune_cid, "track=");
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   272
		compl_add_category_word (tune_cid, "uri=");
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   273
	}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   274
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   275
#ifndef MCABBER_API_HAVE_CMD_ID
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   276
	cmd_add ("tune", "", tune_cid, tune_cid, do_tune, NULL);
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   277
#else
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   278
	tune_cmid     = cmd_add ("tune", "", tune_cid, tune_cid, do_tune, NULL);
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   279
	tune_set_safe = cmd_set_safe ("tune", TRUE);
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   280
#endif
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   281
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   282
	tune_hid_tunein = hk_add_handler (tune_htih, HOOK_TUNE_IN, G_PRIORITY_DEFAULT, NULL);
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   283
}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   284
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   285
void tune_uninit(void)
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   286
{
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   287
	hk_del_handler (HOOK_TUNE_IN, tune_hid_tunein);
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   288
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   289
#ifndef MCABBER_API_HAVE_CMD_ID
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   290
	cmd_del ("tune");
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   291
#else
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   292
	if (tune_cmid)
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   293
		cmd_del (tune_cmid);
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   294
	if (tune_set_safe)
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   295
		cmd_set_safe ("tune", FALSE);
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   296
#endif
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   297
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   298
	if (tune_cid)
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   299
		compl_del_category (tune_cid);
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   300
}
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   301
23fa36d480fb Merge pep modules & use events
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   302
/* vim: se ts=4 sw=4: */