loudmouth/lm-utils.c
author hallski <hallski>
Sun, 10 Sep 2006 22:09:45 +0000
changeset 175 5e665ffe3e9c
parent 99 81e9d035de02
child 140 103227122f45
permissions -rw-r--r--
2006-09-11 Mikael Hallendal <micke@imendio.com> * Release 1.0.5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     2
/*
99
81e9d035de02 2004-10-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 84
diff changeset
     3
 * Copyright (C) 2003 Imendio AB 
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     4
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     6
 * modify it under the terms of the GNU Lesser General Public License as
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     7
 * published by the Free Software Foundation; either version 2 of the
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     8
 * License, or (at your option) any later version.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     9
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    10
 * This program is distributed in the hope that it will be useful,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    13
 * Lesser General Public License for more details.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    14
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    15
 * You should have received a copy of the GNU Lesser General Public
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    16
 * License along with this program; if not, write to the
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    17
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    18
 * Boston, MA 02111-1307, USA.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    19
 */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    20
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    21
#include <config.h>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    22
#include <string.h>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    23
#include <stdio.h>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    24
#include <time.h>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    25
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    26
#include "lm-internals.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    27
#include "lm-utils.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    28
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    29
LmCallback *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    30
_lm_utils_new_callback (gpointer func, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    31
			gpointer user_data,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    32
			GDestroyNotify notify)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    33
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    34
	LmCallback *cb;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    35
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    36
	cb = g_new0 (LmCallback, 1);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    37
	cb->func = func;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    38
	cb->user_data = user_data;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    39
	cb->notify = notify;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    40
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    41
	return cb;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    42
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    43
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    44
void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    45
_lm_utils_free_callback (LmCallback *cb)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    46
{
64
dd835d5cee71 2004-01-06 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 57
diff changeset
    47
	if (!cb) {
dd835d5cee71 2004-01-06 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 57
diff changeset
    48
		return;
dd835d5cee71 2004-01-06 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 57
diff changeset
    49
	}
dd835d5cee71 2004-01-06 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 57
diff changeset
    50
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    51
	if (cb->notify) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    52
		(* cb->notify) (cb->user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    53
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    54
	g_free (cb);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    55
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    56
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    57
gchar *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    58
_lm_utils_generate_id (void)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    59
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    60
	static gint  number = 0;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    61
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    62
	return g_strdup_printf ("msg_%d", ++number);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    63
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    64
66
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    65
gchar * 
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    66
_lm_utils_base64_encode (const gchar *s)
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    67
{
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    68
	static const gchar *base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    69
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    70
	guint    i, j;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    71
	guint32  bits = 0;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    72
	guint    maxlen = (strlen(s) * 2) + 3;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    73
	gchar   *str;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    74
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    75
	str = g_malloc(maxlen);
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    76
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    77
	j = 0;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    78
	for (i = 0; i < strlen(s); i++) {
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    79
		bits <<= 8;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    80
		bits |= s[i] & 0xff;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    81
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    82
		if (!((i+1) % 3)) {
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    83
			guint indices[4];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    84
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    85
			indices[0] = (bits >> 18) & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    86
			indices[1] = (bits >> 12) & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    87
			indices[2] = (bits >> 6) & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    88
			indices[3] = bits & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    89
			bits = 0;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    90
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    91
			str[j++] = base64chars[(indices[0])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    92
			str[j++] = base64chars[(indices[1])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    93
			str[j++] = base64chars[(indices[2])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    94
			str[j++] = base64chars[(indices[3])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    95
		}
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    96
	}
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    97
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    98
	if (j + 4 < maxlen) {
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    99
		if ((i % 3) == 1) {
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   100
			guint indices[2];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   101
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   102
			indices[0] = (bits >> 2) & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   103
			indices[1] = (bits << 4) & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   104
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   105
			str[j++] = base64chars[(indices[0])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   106
			str[j++] = base64chars[(indices[1])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   107
			str[j++] = '=';
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   108
			str[j++] = '=';
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   109
		} else if ((i % 3) == 2) {
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   110
			guint indices[3];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   111
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   112
			indices[0] = (bits >> 10) & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   113
			indices[1] = (bits >> 4) & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   114
			indices[2] = (bits << 2) & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   115
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   116
			str[j++] = base64chars[(indices[0])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   117
			str[j++] = base64chars[(indices[1])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   118
			str[j++] = base64chars[(indices[2])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   119
			str[j++] = '=';
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   120
		}
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   121
	}
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   122
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   123
	str[j] = '\0';
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   124
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   125
	return str;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   126
}
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   127
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   128
struct tm *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   129
lm_utils_get_localtime (const gchar *stamp)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   130
{
65
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   131
	struct tm tm;
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   132
	time_t    t;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   133
	gint      year, month;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   134
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   135
	/* 20021209T23:51:30 */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   136
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   137
	sscanf (stamp, "%4d%2d%2dT%2d:%2d:%2d", 
65
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   138
		&year, &month, &tm.tm_mday, &tm.tm_hour,
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   139
		&tm.tm_min, &tm.tm_sec);
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   140
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   141
	tm.tm_year = year - 1900;
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   142
	tm.tm_mon = month - 1;
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   143
	tm.tm_isdst = -1;
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   144
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   145
 	t = mktime (&tm);
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   146
65
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   147
#if defined(HAVE_TM_GMTOFF)
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   148
	t += tm.tm_gmtoff;
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   149
#elif defined(HAVE_TIMEZONE)
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   150
	t -= timezone;
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   151
	if (tm.tm_isdst > 0) {
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   152
		t += 3600;
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   153
	}
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   154
#endif	
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   155
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   156
	return localtime (&t);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   157
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   158