avatar.c
author Myhailo Danylenko <isbear@ukrpost.net>
Thu, 10 May 2012 00:50:00 +0300
changeset 37 62e97e4f562c
parent 36 32424a111e97
child 38 1e64659fe32e
permissions -rw-r--r--
Fix compatibility with libpng 1.5 Use accessors for fields in info struct
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
/*
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
 * avatar.c             -- Pep avatar events
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
 *
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
 * Copyrigth (C) 2009      Myhailo Danylenko <isbear@ukrpost.net>
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
 *
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or modify
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
 * the Free Software Foundation; either version 2 of the License, or (at
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
 * your option) any later version.
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
 *
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful, but
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
 * WITHOUT ANY WARRANTY; without even the implied warranty of
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
 * General Public License for more details.
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
 *
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
 * along with this program; if not, write to the Free Software
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
 * USA
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
 */
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
#define PNG_USER_MEM_SUPPORTED
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
#include <glib.h>
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
#include <loudmouth/loudmouth.h>
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
#include <aalib.h>
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
#include <png.h>
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
#include <string.h>
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
#include <unistd.h>
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    30
#include <sys/types.h>
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    31
#include <sys/stat.h>
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    32
#include <fcntl.h>
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    33
#include <stdlib.h>
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    34
#include <errno.h>
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    35
11
2f9ffa1c24c5 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    36
#include <mcabber/compl.h>
2f9ffa1c24c5 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    37
#include <mcabber/commands.h>
2f9ffa1c24c5 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    38
#include <mcabber/utils.h>
2f9ffa1c24c5 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    39
#include <mcabber/xmpp.h>
2f9ffa1c24c5 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    40
#include <mcabber/screen.h>
2f9ffa1c24c5 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    41
#include <mcabber/hbuf.h>
2f9ffa1c24c5 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    42
#include <mcabber/hooks.h>
2f9ffa1c24c5 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    43
#include <mcabber/settings.h>
23
2b7060ce1152 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    44
#include <mcabber/modules.h>
27
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
    45
#include <mcabber/xmpp_helper.h>
11
2f9ffa1c24c5 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    46
2f9ffa1c24c5 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    47
#include <mcabber/pep.h>
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    48
14
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
    49
#include "config.h"
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
    50
23
2b7060ce1152 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    51
// module description
2b7060ce1152 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    52
33
1cc77413e85d Add AVV module description
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
    53
void avatar_init   (void);
1cc77413e85d Add AVV module description
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
    54
void avatar_uninit (void);
23
2b7060ce1152 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    55
24
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    56
#define DESCRIPTION ( \
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    57
	"PEP avatars handling\n" \
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    58
	"Recognizes options avatar_directory, avatar_font_height, avatar_font_width, avatar_max_height, avatar_max_width and avatar_background\n" \
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    59
	"Provides command /avatar" )
23
2b7060ce1152 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    60
static const gchar *deps[] = { "pep", NULL };
24
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    61
35
d0bb20377181 Update mcabber versions, fix warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
    62
static module_info_t info_avatar_dev = {
d0bb20377181 Update mcabber versions, fix warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
    63
	.branch      = "dev",
d0bb20377181 Update mcabber versions, fix warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
    64
	.api         = 20,
24
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    65
	.version     = PROJECT_VERSION,
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    66
	.description = DESCRIPTION,
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    67
	.requires    = deps,
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    68
	.init        = avatar_init,
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    69
	.uninit      = avatar_uninit,
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    70
	.next        = NULL,
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    71
};
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    72
36
32424a111e97 remove api.h, offending 0.10.0
Myhailo Danylenko <isbear@ukrpost.net>
parents: 35
diff changeset
    73
module_info_t info_avatar_0_10_0 = {
32424a111e97 remove api.h, offending 0.10.0
Myhailo Danylenko <isbear@ukrpost.net>
parents: 35
diff changeset
    74
	.branch      = "0.10.0",
35
d0bb20377181 Update mcabber versions, fix warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
    75
	.api         = 1,
24
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    76
	.version     = PROJECT_VERSION,
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    77
	.description = DESCRIPTION,
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    78
	.requires    = deps,
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    79
	.init        = avatar_init,
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
    80
	.uninit      = avatar_uninit,
35
d0bb20377181 Update mcabber versions, fix warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
    81
	.next        = &info_avatar_dev,
23
2b7060ce1152 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    82
};
2b7060ce1152 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    83
30
5192b35e1327 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 29
diff changeset
    84
module_info_t info_avatar = {
36
32424a111e97 remove api.h, offending 0.10.0
Myhailo Danylenko <isbear@ukrpost.net>
parents: 35
diff changeset
    85
	.branch      = "0.10.1",
30
5192b35e1327 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 29
diff changeset
    86
	.api         = 1,
5192b35e1327 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 29
diff changeset
    87
	.version     = PROJECT_VERSION,
5192b35e1327 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 29
diff changeset
    88
	.description = DESCRIPTION,
5192b35e1327 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 29
diff changeset
    89
	.requires    = deps,
5192b35e1327 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 29
diff changeset
    90
	.init        = avatar_init,
5192b35e1327 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 29
diff changeset
    91
	.uninit      = avatar_uninit,
36
32424a111e97 remove api.h, offending 0.10.0
Myhailo Danylenko <isbear@ukrpost.net>
parents: 35
diff changeset
    92
	.next        = &info_avatar_0_10_0,
30
5192b35e1327 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 29
diff changeset
    93
};
5192b35e1327 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 29
diff changeset
    94
23
2b7060ce1152 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    95
// globals
2b7060ce1152 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    96
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    97
#define NS_AVATAR_DATA            ( "urn:xmpp:avatar:data"            )
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    98
#define NS_AVATAR_METADATA        ( "urn:xmpp:avatar:metadata"        )
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    99
#define NS_AVATAR_METADATA_NOTIFY ( "urn:xmpp:avatar:metadata+notify" )
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   100
35
d0bb20377181 Update mcabber versions, fix warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   101
#ifdef MCABBER_API_HAVE_CMD_ID
29
378fc85f60f3 Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
   102
static gpointer avatar_cmid = NULL;
378fc85f60f3 Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
   103
static gboolean avatar_set_safe = FALSE;
378fc85f60f3 Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
   104
#endif
378fc85f60f3 Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
   105
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   106
static guint avatar_hid_connect    = 0;
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   107
static guint avatar_hid_disconnect = 0;
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   108
6
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   109
static GSList *reply_handlers = NULL;
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   110
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   111
static LmMessageHandler *avatar_metadata_reply_handler = NULL;
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   112
14
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   113
static gboolean  publish_delayed = FALSE;
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   114
static gsize     publish_len     = 0;
27
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
   115
static guchar   *publish_data    = NULL;
14
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   116
6
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   117
// predeclarations
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   118
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   119
static LmHandlerResult avatar_retrieve_data_reply_handler (LmMessageHandler *handler, LmConnection *connection, LmMessage *message, gpointer userdata);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   120
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   121
// png stuff
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   122
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   123
static png_voidp png_glib_malloc (png_structp ignore, png_size_t size)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   124
{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   125
	return g_malloc (size);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   126
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   127
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   128
static void png_glib_free (png_structp ignore, png_voidp chunk)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   129
{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   130
	g_free (chunk);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   131
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   132
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   133
// reads file and returns array of pointers to image rows in
3
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   134
// grayscale 8-bit without alpha-channel format (i.e. one byte per pixel)
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   135
// after use just do g_free of this pointer - all data are in one memory chunk
3
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   136
static png_bytep *png_read_file (const char *file, int *rheight, int *rwidth, png_uint_16 background)
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   137
{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   138
	FILE        *fd       = fopen (file, "rb");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   139
	png_infop    info_ptr;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   140
	png_structp  png_ptr;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   141
	int          rowbytes;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   142
	png_bytep   *row_pointers;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   143
	int          width;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   144
	int          height;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   145
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   146
	if (!fd)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   147
		return NULL;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   148
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   149
	{ // check signature
27
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
   150
		png_byte header[8];
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   151
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   152
		fread (header, 1, 8, fd);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   153
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   154
		if (png_sig_cmp (header, 0, 8)) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   155
			fclose (fd);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   156
			return NULL;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   157
		}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   158
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   159
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   160
	// initialize reader
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   161
	png_ptr = png_create_read_struct_2 (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL, NULL, png_glib_malloc, png_glib_free);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   162
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   163
	if (!png_ptr) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   164
		fclose (fd);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   165
		return NULL;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   166
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   167
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   168
	info_ptr = png_create_info_struct (png_ptr);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   169
	if (!info_ptr) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   170
		png_destroy_read_struct (&png_ptr, NULL, NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   171
		fclose (fd);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   172
		return NULL;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   173
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   174
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   175
	if (setjmp (png_jmpbuf (png_ptr))) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   176
		png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   177
		fclose (fd);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   178
		return NULL;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   179
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   180
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   181
	png_init_io (png_ptr, fd);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   182
	png_set_sig_bytes (png_ptr, 8);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   183
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   184
	// get information
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   185
	png_read_info (png_ptr, info_ptr);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   186
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   187
	{ // set up transformations
37
62e97e4f562c Fix compatibility with libpng 1.5
Myhailo Danylenko <isbear@ukrpost.net>
parents: 36
diff changeset
   188
		png_byte color_type = png_get_color_type ( png_ptr, info_ptr );
62e97e4f562c Fix compatibility with libpng 1.5
Myhailo Danylenko <isbear@ukrpost.net>
parents: 36
diff changeset
   189
		png_byte bit_depth  = png_get_bit_depth  ( png_ptr, info_ptr );
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   190
3
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   191
		// trying to convert anything to grayscale 8-bit without alpha channel
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   192
		if (color_type == PNG_COLOR_TYPE_PALETTE)
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   193
			png_set_palette_to_rgb (png_ptr);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   194
		if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   195
			png_set_expand_gray_1_2_4_to_8 (png_ptr);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   196
		if (bit_depth == 16)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   197
			png_set_strip_16 (png_ptr);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   198
		if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   199
			png_set_tRNS_to_alpha (png_ptr);
3
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   200
		if (color_type & PNG_COLOR_MASK_COLOR)
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   201
			png_set_rgb_to_gray_fixed (png_ptr, 1, -1, -1);
3
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   202
		if (color_type & PNG_COLOR_MASK_ALPHA) {
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   203
			png_color_16 my_background = {
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   204
				.red   = background,
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   205
				.green = background,
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   206
				.blue  = background,
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   207
				.gray  = background,
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   208
			};
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   209
			png_set_background (png_ptr, &my_background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   210
		}
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   211
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   212
		// renew information in info structure
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   213
		png_read_update_info (png_ptr, info_ptr);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   214
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   215
37
62e97e4f562c Fix compatibility with libpng 1.5
Myhailo Danylenko <isbear@ukrpost.net>
parents: 36
diff changeset
   216
	width    = png_get_image_width  ( png_ptr, info_ptr );
62e97e4f562c Fix compatibility with libpng 1.5
Myhailo Danylenko <isbear@ukrpost.net>
parents: 36
diff changeset
   217
	height   = png_get_image_height ( png_ptr, info_ptr );
62e97e4f562c Fix compatibility with libpng 1.5
Myhailo Danylenko <isbear@ukrpost.net>
parents: 36
diff changeset
   218
	rowbytes = png_get_rowbytes     ( png_ptr, info_ptr );
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   219
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   220
	{ // allocate buffer for image data
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   221
		png_bytep chunk = g_malloc ((sizeof(png_bytep) + rowbytes) * height);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   222
		png_bytep start = chunk + sizeof(png_bytep) * height;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   223
		int       y;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   224
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   225
		row_pointers = (png_bytep *) chunk;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   226
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   227
		for (y = 0; y < height; ++y)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   228
			row_pointers[y] = start + y * rowbytes;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   229
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   230
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   231
	// read image
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   232
	if (setjmp (png_jmpbuf (png_ptr))) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   233
		g_free (row_pointers);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   234
		png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   235
		fclose (fd);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   236
		return NULL;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   237
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   238
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   239
	png_read_image (png_ptr, row_pointers);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   240
	png_read_end (png_ptr, NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   241
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   242
	// free resources
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   243
	png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   244
	fclose (fd);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   245
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   246
	*rheight = height;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   247
	*rwidth  = width;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   248
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   249
	return row_pointers;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   250
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   251
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   252
// aa stuff
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   253
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   254
// converts image in format, returned by png_read_file into ascii,
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   255
// scaling it to fit specified max values. If font parameters are
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   256
// set properly, should result in image on screen with original png
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   257
// aspect ratio.
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   258
static gchar *aa_convert_image (png_bytep *row_pointers, int height, int width, int maxcharh, int maxcharw, int fonth, int fontw)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   259
{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   260
	gchar                     *result;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   261
	struct aa_hardware_params  hwparams = {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   262
		.font      = NULL,
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   263
		.supported = AA_NORMAL_MASK,
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   264
		.width     = 0,
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   265
		.height    = 0,
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   266
	};
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   267
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   268
	// params for zooming
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   269
	int finalcharh;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   270
	int finalcharw;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   271
	int finalh;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   272
	int finalw;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   273
	int starty;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   274
	int startx;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   275
	int finalratioh;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   276
	int finalratiow;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   277
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   278
	// process aa parameters from environment variables
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   279
	aa_parseoptions (&hwparams, NULL, NULL, NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   280
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   281
	{ // calculate parameters for image zooming into aa surface
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   282
	  // this always makes me a hard time, thus such a mess :/
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   283
	  // I hope, compiler will optimize out all these variables...
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   284
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   285
		// font size in font pixels (real?)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   286
		//int fonth = 16;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   287
		//int fontw = 8;
27
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
   288
		//float fontaspect = (float) fontw / fonth;
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   289
		// aa pixels per character
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   290
		const int aappch = 2;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   291
		const int aappcw = 2;
27
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
   292
		//const float aaaspect = (float) aappcw / aappch;
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   293
		// font pixels per aa pixel
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   294
		int aappph = (float) fonth / aappch;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   295
		int aapppw = (float) fontw / aappcw;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   296
		float aapixelaspect = (float) aapppw / aappph;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   297
		// original image size in real pixels
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   298
		int originh = height;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   299
		int originw = width;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   300
		float originaspect = (float) originw / originh;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   301
		// maximal resulting image size in chars
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   302
		//int maxcharh = res_height;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   303
		//int maxcharw = res_width;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   304
		// maximal resulting image size in aa pixels
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   305
		int maxh = maxcharh * aappch;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   306
		int maxw = maxcharw * aappcw;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   307
		// maximal resulting image size in real pixels
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   308
		int maxh_rp;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   309
		int maxw_rp;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   310
		if (aapixelaspect > 1) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   311
			maxh_rp = maxh;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   312
			maxw_rp = (float) maxw * aapixelaspect;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   313
		} else {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   314
			maxh_rp = (float) maxh / aapixelaspect;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   315
			maxw_rp = maxw;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   316
		}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   317
		float maxaspect_rp = (float) maxw_rp / maxh_rp;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   318
		// resulting image size in real pixels
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   319
		float ratio_rp;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   320
		int resh_rp;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   321
		int resw_rp;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   322
		if (originh > maxh_rp || originw > maxw_rp) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   323
			// boundaries crossed, will zoom
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   324
			if (originaspect > maxaspect_rp) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   325
				// width is bigger
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   326
				ratio_rp = (float) maxw_rp / originw;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   327
				resh_rp = (float) originh * ratio_rp;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   328
				resw_rp = maxw_rp;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   329
			} else {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   330
				// height is bigger
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   331
				ratio_rp = (float) maxh_rp / originh;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   332
				resh_rp = maxh_rp;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   333
				resw_rp = (float) originw * ratio_rp;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   334
			}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   335
		} else {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   336
			// image fits, no zooming
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   337
			ratio_rp = 1;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   338
			resh_rp = originh;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   339
			resw_rp = originw;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   340
		}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   341
		// resulting image size in aa pixels
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   342
		int resh;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   343
		int resw;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   344
		if (aapixelaspect > 1) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   345
			resh = resh_rp;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   346
			resw = (float) resw_rp / aapixelaspect;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   347
		} else {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   348
			resh = (float) resh_rp * aapixelaspect;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   349
			resw = resw_rp;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   350
		}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   351
		// number of original image pixels per one resulting image pixel
27
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
   352
		//int ratioh = (float) originh / resh;
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
   353
		//int ratiow = (float) originw / resw;
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   354
		// resulting image size in chars
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   355
		int rescharh = (float) resh / aappch;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   356
		int rescharw = (float) resw / aappcw;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   357
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   358
		// re-calculate parameters, as they may change due to rounding (?)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   359
		finalcharh = rescharh;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   360
		finalcharw = rescharw;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   361
		finalh = rescharh * aappch;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   362
		finalw = rescharw * aappcw;
35
d0bb20377181 Update mcabber versions, fix warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   363
#if 0
d0bb20377181 Update mcabber versions, fix warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   364
		// I do not know, why I added this here, and it needs more digging
d0bb20377181 Update mcabber versions, fix warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   365
		// to know, if this is supposed to be used somewhere, so, for now
d0bb20377181 Update mcabber versions, fix warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   366
		// let it be this way
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   367
		int finalh_rp;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   368
		int finalw_rp;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   369
		if (aapixelaspect > 1) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   370
			finalh_rp = finalh;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   371
			finalw_rp = (float) finalw * aapixelaspect;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   372
		} else {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   373
			finalh_rp = (float) finalh / aapixelaspect;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   374
			finalw_rp = finalw;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   375
		}
35
d0bb20377181 Update mcabber versions, fix warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   376
#endif
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   377
		finalratioh = (float) originh / finalh;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   378
		finalratiow = (float) originw / finalw;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   379
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   380
		// center image part actually used
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   381
		int areah = (float) finalh * finalratioh;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   382
		int areaw = (float) finalw * finalratiow;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   383
		int losth = originh - areah;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   384
		int lostw = originw - areaw;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   385
		starty = losth / 2;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   386
		startx = lostw / 2;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   387
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   388
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   389
	// create aa image
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   390
	hwparams.height = finalcharh;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   391
	hwparams.width  = finalcharw;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   392
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   393
	aa_context *context = aa_init (&mem_d, &hwparams, NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   394
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   395
	if (context == NULL)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   396
		return NULL;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   397
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   398
	{ // fill aa image from png buffer with scaling
3
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   399
		int height, width;
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   400
		int y;
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   401
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   402
		height = aa_imgheight (context);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   403
		width  = aa_imgwidth (context);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   404
		
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   405
		if (height > finalh)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   406
			height = finalh;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   407
		if (width > finalw)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   408
			width = finalw;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   409
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   410
		for (y = 0;  y < height; ++y) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   411
			int x;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   412
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   413
			for (x = 0; x < width; ++x) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   414
				png_bytep    *row_pointer = row_pointers + starty + y * finalratioh;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   415
				unsigned int  color = 0;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   416
				unsigned int  cy;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   417
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   418
				// just arithmetic average
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   419
				for (cy = 0; cy < finalratioh; ++cy) {
3
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   420
					png_bytep row = row_pointer[cy] + startx + x * finalratiow;
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   421
					int       cx;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   422
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   423
					for (cx = 0; cx < finalratiow; ++cx)
3
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   424
						color += row[cx];
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   425
				}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   426
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   427
				color /= finalratioh * finalratiow;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   428
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   429
				aa_putpixel (context, x, y, color);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   430
			}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   431
		}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   432
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   433
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   434
	// render ascii image
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   435
	aa_render (context, &aa_defrenderparams, 0, 0, aa_scrwidth (context), aa_scrheight (context));
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   436
	aa_flush (context);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   437
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   438
	{ // format the result
27
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
   439
		char    *text   = (char *) aa_text (context);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   440
		int      width  = aa_scrwidth (context);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   441
		int      height = aa_scrheight (context);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   442
		GString *avatar = g_string_new (NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   443
		char    *end    = text + width * height;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   444
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   445
		while (text < end) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   446
			g_string_append_len (avatar, text, width);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   447
			g_string_append_c (avatar, '\n');
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   448
			text += width;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   449
		}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   450
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   451
		// strip last '\n'
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   452
		g_string_truncate (avatar, avatar->len - 1);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   453
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   454
		result = g_string_free (avatar, FALSE);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   455
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   456
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   457
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   458
	// free resources
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   459
	aa_close (context);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   460
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   461
	return result;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   462
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   463
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   464
// avatar stuff
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   465
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   466
// returns filename to save this avatar. NULL on error. g_free result.
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   467
static gchar *avatar_id_filename (const gchar *id)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   468
{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   469
	gchar *escid = g_strdup (id);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   470
	gchar *dir   = (gchar *) settings_opt_get ("avatar_directory");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   471
	gchar *file;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   472
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   473
	if (!dir)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   474
		return NULL;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   475
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   476
	{ // neutralize id
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   477
		const gchar *valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   478
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   479
		g_strcanon (escid, valid, '_');
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   480
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   481
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   482
	dir = expand_filename (dir);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   483
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   484
	file = g_strdup_printf ("%s/%s.png", dir, escid);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   485
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   486
	g_free (dir);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   487
	g_free (escid);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   488
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   489
	return file;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   490
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   491
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   492
// returns name of symlink to avatar image file for this jid
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   493
static gchar *avatar_jid_filename (const gchar *jid)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   494
{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   495
	gchar *dir  = (gchar *) settings_opt_get ("avatar_directory");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   496
	gchar *file = NULL;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   497
	gchar *bjid;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   498
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   499
	if (!dir)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   500
		return NULL;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   501
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   502
	// if jid validity alone is enough for mcabber to use as
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   503
	// names for history logs, it's fine for us too.
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   504
	if (check_jid_syntax (jid))
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   505
		return NULL;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   506
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   507
	bjid = jidtodisp (jid);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   508
	mc_strtolower (bjid);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   509
	dir  = expand_filename (dir);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   510
	file = g_strdup_printf ("%s/%s", dir, bjid);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   511
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   512
	g_free (bjid);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   513
	return file;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   514
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   515
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   516
// symlinks specified jid to specified file. performs jid
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   517
// checks, but not file checks.
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   518
static void set_jid_avatar (const char *jid, const char *file)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   519
{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   520
	gchar *jfile;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   521
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   522
	if (!jid || !file)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   523
		return;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   524
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   525
	jfile = avatar_jid_filename (jid);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   526
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   527
	if (!jfile)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   528
		return;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   529
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   530
	unlink (jfile);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   531
	if (symlink (file, jfile) == -1)
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   532
		scr_log_print (LPRINT_LOGNORM, "avatar: Cannot symlink jid-file to avatar: %s.", strerror (errno));
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   533
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   534
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   535
// reply handler for metadata publish request
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   536
// just prints error message if unsuccessful
6
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   537
static LmHandlerResult avatar_publish_metadata_reply_handler (LmMessageHandler *handler, LmConnection *connection, LmMessage *message, gpointer userdata)
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   538
{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   539
	switch (lm_message_get_sub_type (message)) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   540
	case LM_MESSAGE_SUB_TYPE_RESULT:
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   541
		break;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   542
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   543
	case LM_MESSAGE_SUB_TYPE_ERROR:
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   544
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   545
		{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   546
			LmMessageNode *node   = lm_message_get_node (message);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   547
			const gchar   *type;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   548
			const gchar   *reason;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   549
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   550
			node = lm_message_node_get_child (node, "error");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   551
			type = lm_message_node_get_attribute (node, "type");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   552
			if (node->children)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   553
				reason = node->children->name;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   554
			else
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   555
				reason = "undefined";
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   556
	
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   557
			scr_log_print (LPRINT_LOGNORM, "avatar: Metadata publishing failed: %s - %s.", type, reason);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   558
		}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   559
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   560
		break;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   561
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   562
	default:
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   563
		return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   564
		break;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   565
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   566
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   567
	return LM_HANDLER_RESULT_REMOVE_MESSAGE;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   568
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   569
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   570
// reply handler for data publish request
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   571
// sends metadata update request or prints error message
6
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   572
static LmHandlerResult avatar_publish_data_reply_handler (LmMessageHandler *handler, LmConnection *connection, LmMessage *message, gpointer userdata)
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   573
{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   574
	LmMessage *request = (LmMessage *) userdata;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   575
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   576
	reply_handlers = g_slist_remove (reply_handlers, handler);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   577
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   578
	switch (lm_message_get_sub_type (message)) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   579
	case LM_MESSAGE_SUB_TYPE_RESULT:
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   580
18
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   581
		{ // send
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   582
			GError *error = NULL;
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   583
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   584
			lm_connection_send_with_reply (connection, request, avatar_metadata_reply_handler, &error);
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   585
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   586
			if (error) {
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   587
				scr_log_print (LPRINT_DEBUG, "avatar: Metadata publication error: %s.", error -> message);
18
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   588
				g_error_free (error);
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   589
			}
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   590
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   591
			lm_message_unref (request);
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   592
		}
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   593
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   594
		break;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   595
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   596
	case LM_MESSAGE_SUB_TYPE_ERROR:
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   597
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   598
		{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   599
			LmMessageNode *node   = lm_message_get_node (message);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   600
			const gchar   *type;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   601
			const gchar   *reason;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   602
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   603
			node = lm_message_node_get_child (node, "error");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   604
			type = lm_message_node_get_attribute (node, "type");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   605
			if (node->children)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   606
				reason = node->children->name;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   607
			else
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   608
				reason = "undefined";
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   609
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   610
			scr_log_print (LPRINT_LOGNORM, "avatar: Data publishing failed: %s - %s.", type, reason);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   611
		}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   612
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   613
		break;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   614
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   615
	default:
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   616
		return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   617
		break;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   618
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   619
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   620
	return LM_HANDLER_RESULT_REMOVE_MESSAGE;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   621
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   622
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   623
// prints avatar (if available) for jid into jid's buffer
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   624
// id can be omitted
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   625
static gboolean print_avatar (const gchar *file, const gchar *jid, const gchar *id)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   626
{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   627
	png_bytep *row_pointers;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   628
	gchar     *avatar;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   629
	int        width;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   630
	int        height;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   631
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   632
	if (!file)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   633
		return FALSE;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   634
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   635
	{ // check if file exists to not trigger unnecessary error messages
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   636
		struct stat buf;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   637
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   638
		if (stat (file, &buf) == -1) {
14
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   639
			gchar         *bjid;
9
a838a4ecf834 Send metadata request on missing avatar
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   640
			LmMessage     *request;
a838a4ecf834 Send metadata request on missing avatar
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   641
			LmMessageNode *node;
6
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   642
14
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   643
			if (!xmpp_is_online ()) {
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   644
				scr_log_print (LPRINT_NORMAL, "avatar: You are not online, request not sent.");
14
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   645
				return FALSE;
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   646
			}
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   647
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   648
			bjid = jidtodisp (jid);
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   649
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   650
			scr_write_incoming_message (bjid, "No avatar for this buddy yet, sending request.", 0, HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG, 0); // NO conversion from utf-8
6
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   651
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   652
			// create data request
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   653
			request = lm_message_new_with_sub_type (bjid, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_GET);
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   654
			node = lm_message_get_node (request);
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   655
			lm_message_node_set_attribute (node, "from", lm_connection_get_jid (lconnection));
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   656
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   657
			node = lm_message_node_add_child (node, "pubsub", NULL);
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   658
			lm_message_node_set_attribute (node, "xmlns", NS_PUBSUB);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   659
6
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   660
			node = lm_message_node_add_child (node, "items", NULL);
9
a838a4ecf834 Send metadata request on missing avatar
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   661
			lm_message_node_set_attribute (node, "node", NS_AVATAR_METADATA);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   662
18
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   663
			{ // send, result will be handled by pep
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   664
				GError *error = NULL;
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   665
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   666
				lm_connection_send (lconnection, request, &error);
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   667
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   668
				if (error) {
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   669
					scr_log_print (LPRINT_DEBUG, "avatar: Request sending error: %s.", error -> message);
18
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   670
					g_error_free (error);
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   671
				}
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   672
			}
1
285017b7713c Forgot to return, when no avatar available
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   673
6
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   674
			lm_message_unref (request);
9
a838a4ecf834 Send metadata request on missing avatar
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   675
			g_free (bjid);
1
285017b7713c Forgot to return, when no avatar available
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   676
			return TRUE;
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   677
		}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   678
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   679
3
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   680
	{
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   681
		png_uint_16 background = settings_opt_get_int ("avatar_background");
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   682
	
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   683
		row_pointers = png_read_file (file, &width, &height, background);
c920fcf835c7 Added background for transparent images
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   684
	}
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   685
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   686
	if (!row_pointers) {
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   687
		scr_log_print (LPRINT_LOGNORM, "avatar: Cannot decode png data from file %s.", file);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   688
		return FALSE;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   689
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   690
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   691
	{ // convert to ascii
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   692
		int maxcharh = settings_opt_get_int ("avatar_max_height");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   693
		int maxcharw = settings_opt_get_int ("avatar_max_width");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   694
		int fonth    = settings_opt_get_int ("avatar_font_height");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   695
		int fontw    = settings_opt_get_int ("avatar_font_width");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   696
24
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
   697
		// if not set explicitly, calculate available space
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
   698
		if (!maxcharh)
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
   699
			maxcharh = scr_gettextheight() - 1; // -1 due to avatar header line
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   700
24
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
   701
		if (!maxcharw)
7aa499342e2b Use new interface to obtain available screen space
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
   702
			maxcharw = scr_gettextwidth();
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   703
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   704
		if (!fonth)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   705
			fonth = 16;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   706
		if (!fontw)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   707
			fontw = 8;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   708
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   709
		avatar = aa_convert_image (row_pointers, width, height, maxcharh, maxcharw, fonth, fontw);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   710
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   711
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   712
	g_free (row_pointers);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   713
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   714
	if (!avatar) {
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   715
		scr_log_print (LPRINT_LOGNORM, "avatar: Error converting image to ascii.");
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   716
		return FALSE;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   717
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   718
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   719
	{ // print out avatar
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   720
		gchar *bjid = jidtodisp (jid);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   721
		gchar *mesg;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   722
		if (id)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   723
			mesg = g_strdup_printf ("Avatar [%s]:\n%s", id, avatar);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   724
		else
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   725
			mesg = g_strdup_printf ("Avatar:\n%s", avatar);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   726
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   727
		scr_write_incoming_message (bjid, mesg, 0, HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG, 0); // NO conversion from utf-8
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   728
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   729
		g_free (bjid);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   730
		g_free (mesg);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   731
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   732
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   733
	g_free (avatar);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   734
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   735
	return TRUE;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   736
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   737
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   738
// reply handler for image/png data request
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   739
// saves image and prints it to buddy buffer
6
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   740
static LmHandlerResult avatar_retrieve_data_reply_handler (LmMessageHandler *handler, LmConnection *connection, LmMessage *message, gpointer userdata)
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   741
{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   742
	gchar *from = (gchar *) userdata;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   743
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   744
	reply_handlers = g_slist_remove (reply_handlers, handler);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   745
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   746
	switch (lm_message_get_sub_type (message)) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   747
	case LM_MESSAGE_SUB_TYPE_RESULT:
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   748
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   749
		{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   750
			LmMessageNode *node = lm_message_get_node (message);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   751
			node = lm_message_node_get_child (node, "pubsub");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   752
			if (!node)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   753
				return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   754
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   755
			node = lm_message_node_get_child (node, "items");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   756
			if (!node)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   757
				return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   758
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   759
			{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   760
				LmMessageNode *item;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   761
				
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   762
				for (item = node->children; item; item = item->next) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   763
					if (!strcmp (item->name, "item")) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   764
						LmMessageNode *data = lm_message_node_get_child (item, "data");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   765
						const gchar   *id   = lm_message_node_get_attribute (item, "id");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   766
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   767
						if (!data)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   768
							continue;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   769
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   770
						{ // save to file and display in ascii
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   771
							const gchar *base64 = lm_message_node_get_value (data);
27
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
   772
							guchar      *png;
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   773
							gsize        len;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   774
							gchar       *file;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   775
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   776
							if (!base64)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   777
								continue;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   778
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   779
							png = g_base64_decode (base64, &len);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   780
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   781
							if (!png)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   782
								continue;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   783
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   784
							file = avatar_id_filename (id);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   785
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   786
							if (!file) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   787
								g_free (png);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   788
								continue;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   789
							}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   790
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   791
							{ // write image to file
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   792
								int fd = open (file, O_WRONLY|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   793
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   794
								if (fd == -1) {
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   795
									scr_log_print (LPRINT_LOGNORM, "avatar: Cannot create file: %s.", strerror (errno));
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   796
									g_free (png);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   797
									g_free (file);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   798
									continue;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   799
								}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   800
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   801
								write (fd, png, len);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   802
								close (fd);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   803
							}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   804
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   805
							// create jid symlink to avatar image
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   806
							set_jid_avatar (from, file);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   807
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   808
							g_free (png);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   809
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   810
							// read it back :/
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   811
							print_avatar (file, from, id);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   812
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   813
							g_free (file);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   814
						}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   815
					}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   816
				}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   817
			}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   818
		}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   819
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   820
		break;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   821
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   822
	case LM_MESSAGE_SUB_TYPE_ERROR:
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   823
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   824
		{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   825
			LmMessageNode *node   = lm_message_get_node (message);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   826
			const gchar   *type;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   827
			const gchar   *reason;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   828
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   829
			node = lm_message_node_get_child (node, "error");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   830
			type = lm_message_node_get_attribute (node, "type");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   831
			if (node->children)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   832
				reason = node->children->name;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   833
			else
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   834
				reason = "undefined";
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   835
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   836
			scr_log_print (LPRINT_LOGNORM, "avatar: Obtaining avatar data for %s failed: %s - %s.", from, type, reason);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   837
		}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   838
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   839
		break;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   840
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   841
	default:
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   842
		return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   843
		break;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   844
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   845
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   846
	return LM_HANDLER_RESULT_REMOVE_MESSAGE;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   847
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   848
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   849
// data is image/png data of length len
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   850
// call with len = 0 to publish empty avatar
27
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
   851
static void avatar_publish (const guchar *data, gsize len)
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   852
{
27
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
   853
	LmMessage     *datarequest;
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
   854
	gchar         *id;
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
   855
	LmMessage     *request;
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
   856
	LmMessageNode *node;
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
   857
	GError        *error       = NULL;
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   858
14
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   859
	if (!xmpp_is_online ()) {
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   860
		scr_log_print (LPRINT_DEBUG, "avatar: Not connected, delaying publish.");
14
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   861
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   862
		g_free (publish_data);
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   863
27
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
   864
		publish_data    = (guchar *) g_strndup ((gchar *) data, len);
14
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   865
		publish_len     = len;
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   866
		publish_delayed = TRUE;
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   867
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   868
		return;
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   869
	}
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
   870
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   871
	request = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   872
	node = lm_message_get_node (request);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   873
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   874
	if (len) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   875
		// create data publish request
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   876
		lm_message_node_set_attribute (node, "from", lm_connection_get_jid (lconnection));
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   877
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   878
		node = lm_message_node_add_child (node, "pubsub", NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   879
		lm_message_node_set_attribute (node, "xmlns", NS_PUBSUB);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   880
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   881
		node = lm_message_node_add_child (node, "publish", NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   882
		lm_message_node_set_attribute (node, "node", NS_AVATAR_DATA);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   883
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   884
		node = lm_message_node_add_child (node, "item", NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   885
		id = g_compute_checksum_for_data (G_CHECKSUM_SHA1, data, len);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   886
		lm_message_node_set_attribute (node, "id", id);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   887
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   888
		{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   889
			gchar *base64 = g_base64_encode (data, len);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   890
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   891
			node = lm_message_node_add_child (node, "data", base64);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   892
			lm_message_node_set_attribute (node, "xmlns", NS_AVATAR_DATA);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   893
	
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   894
			g_free (base64);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   895
		}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   896
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   897
		// then create metadata publish request to be supplied to reply handler as userdata
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   898
		datarequest = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   899
		node = lm_message_get_node (datarequest);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   900
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   901
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   902
	lm_message_node_set_attribute (node, "from", lm_connection_get_jid (lconnection));
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   903
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   904
	node = lm_message_node_add_child (node, "pubsub", NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   905
	lm_message_node_set_attribute (node, "xmlns", NS_PUBSUB);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   906
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   907
	node = lm_message_node_add_child (node, "publish", NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   908
	lm_message_node_set_attribute (node, "node", NS_AVATAR_METADATA);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   909
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   910
	node = lm_message_node_add_child (node, "item", NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   911
	if (len)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   912
		lm_message_node_set_attribute (node, "id", id);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   913
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   914
	node = lm_message_node_add_child (node, "metadata", NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   915
	lm_message_node_set_attribute (node, "xmlns", NS_AVATAR_METADATA);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   916
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   917
	if (len) {
35
d0bb20377181 Update mcabber versions, fix warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
   918
		gchar *bytes = g_strdup_printf ("%u", (guint) len);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   919
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   920
		node = lm_message_node_add_child (node, "info", NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   921
		lm_message_node_set_attributes (node, "bytes", bytes, "id", id, "type", "image/png", NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   922
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   923
		g_free (bytes);
6
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   924
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   925
		// create handler
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   926
		LmMessageHandler *handler = lm_message_handler_new (avatar_publish_data_reply_handler, (gpointer) datarequest, (GDestroyNotify) lm_message_unref /* custom, remove from queue? */);
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   927
		reply_handlers = g_slist_append (reply_handlers, handler);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   928
6
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   929
		// send
18
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   930
		lm_connection_send_with_reply (lconnection, request, handler, &error);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   931
6
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   932
		lm_message_handler_unref (handler);
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   933
	} else 
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
   934
		// send
18
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   935
		lm_connection_send_with_reply (lconnection, request, avatar_metadata_reply_handler, &error);
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   936
	
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   937
	if (error) {
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   938
		scr_log_print (LPRINT_DEBUG, "avatar: Publish request sending error: %s.", error -> message);
18
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   939
		g_error_free (error);
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   940
	}
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   941
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   942
	lm_message_unref (request);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   943
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   944
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   945
// pep node handler
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   946
// if avatar is not yet saved, sends data request, else updates jid's symlink
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   947
static void avatar_handler (const gchar *from, const gchar *enode, LmMessageNode *n, const gchar *id, gpointer ignore)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   948
{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   949
	LmMessageNode *node;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   950
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   951
	// well, anyway we now do not store information about jid-avatar relationship,
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   952
	// thus "no avatar" publishes are meaningless to us
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   953
	for (node = n->children; node; node = node->next) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   954
		const gchar *name = node->name;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   955
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   956
		if (!strcmp (name, "info")) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   957
			gchar       *jid    = jidtodisp (from);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   958
			const gchar *url    = lm_message_node_get_attribute (node, "url");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   959
			const gchar *type   = lm_message_node_get_attribute (node, "type");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   960
			const gchar *id     = lm_message_node_get_attribute (node, "id");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   961
			const gchar *bytes  = lm_message_node_get_attribute (node, "bytes");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   962
			const gchar *height = lm_message_node_get_attribute (node, "height");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   963
			const gchar *width  = lm_message_node_get_attribute (node, "width");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   964
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   965
			{ // print to buddy's buffer
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   966
				GString *mesg = g_string_new ("Avatar:");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   967
				gchar   *text;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   968
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   969
				// [id] type w x h (# bytes) url
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   970
				g_string_append_printf (mesg, " [%s]", id ? id : "(none)");
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   971
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   972
				if (type) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   973
					g_string_append_c (mesg, ' ');
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   974
					g_string_append (mesg, type);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   975
				}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   976
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   977
				if (width && height)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   978
					g_string_append_printf (mesg, " %s x %s", width, height);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   979
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   980
				if (bytes)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   981
					g_string_append_printf (mesg, " (%s bytes)", bytes);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   982
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   983
				if (url) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   984
					g_string_append_c (mesg, ' ');
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   985
					g_string_append (mesg, url);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   986
				}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   987
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   988
				text = g_string_free (mesg, FALSE);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   989
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
   990
				scr_write_incoming_message (jid, text, 0, HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG, 0); // NO conversion from utf-8
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   991
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   992
				g_free (text);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   993
			}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   994
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   995
			if (!url) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   996
				// it is server-published png, go ahead and request data
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   997
				LmMessage        *request;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   998
				LmMessageNode    *node;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   999
				LmMessageHandler *dhandler;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1000
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1001
				{ // check, if file already exists
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1002
					gchar       *file = avatar_id_filename (id);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1003
					struct stat  buf;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1004
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1005
					if (!file) {
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1006
						scr_log_print (LPRINT_LOGNORM, "avatar: Cannot obtain filename to save file, probably avatar_directory is not set.");
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1007
						g_free (jid);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1008
						continue;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1009
					}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1010
					
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1011
					if (stat (file, &buf) != -1) {
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1012
						scr_write_incoming_message (jid, "Avatar file exists, will not download.", 0, HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG, 0);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1013
						// link jid to this file
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1014
						set_jid_avatar (jid, file);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1015
						g_free (file);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1016
						g_free (jid);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1017
						continue;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1018
					}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1019
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1020
					g_free (file);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1021
				}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1022
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1023
				// create data request
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1024
				request = lm_message_new_with_sub_type (jid, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_GET);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1025
				node = lm_message_get_node (request);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1026
				lm_message_node_set_attribute (node, "from", lm_connection_get_jid (lconnection));
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1027
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1028
				node = lm_message_node_add_child (node, "pubsub", NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1029
				lm_message_node_set_attribute (node, "xmlns", NS_PUBSUB);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1030
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1031
				node = lm_message_node_add_child (node, "items", NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1032
				lm_message_node_set_attribute (node, "node", NS_AVATAR_DATA);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1033
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1034
				node = lm_message_node_add_child (node, "item", NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1035
				lm_message_node_set_attribute (node, "id", id);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1036
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1037
				// create handler
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1038
				dhandler = lm_message_handler_new (avatar_retrieve_data_reply_handler, jid, g_free);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1039
				reply_handlers = g_slist_append (reply_handlers, dhandler);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1040
18
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
  1041
				{ // send
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
  1042
					GError *error = NULL;
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
  1043
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
  1044
					lm_connection_send_with_reply (lconnection, request, dhandler, &error);
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
  1045
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
  1046
					if (error) {
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1047
						scr_log_print (LPRINT_DEBUG, "avatar: Data request sending error: %s.", error -> message);
18
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
  1048
						g_error_free (error);
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
  1049
					}
8b21c7eaa08e Check for error while sending messages
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
  1050
				}
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1051
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1052
				lm_message_handler_unref (dhandler);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1053
				lm_message_unref (request);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1054
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1055
				// NOT free jid here - it will be freed on handler destruction
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1056
			} else
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1057
				g_free (jid);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1058
		}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1059
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1060
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1061
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1062
// /AVATAR [filename|-]
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1063
static void do_avatar (char *arg)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1064
{
27
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
  1065
	gchar  *fname;
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
  1066
	guchar *data;
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
  1067
	gsize   len;
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1068
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1069
	if (!*arg) { // print current byddy's avatar
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1070
		const gchar *jid = CURRENT_JID;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1071
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1072
		if (!jid) {
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1073
			scr_log_print (LPRINT_NORMAL, "This item cannot have avatar.");
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1074
			return;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1075
		}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1076
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1077
		fname = avatar_jid_filename (jid);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1078
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1079
		print_avatar (fname, jid, NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1080
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1081
		g_free (fname);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1082
		return;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1083
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1084
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1085
	// publish
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1086
	if (arg[0] == '-' && arg[1] == '\0') {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1087
		// no avatar
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1088
		avatar_publish (NULL, 0);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1089
		return;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1090
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1091
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1092
	fname = expand_filename (arg);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1093
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1094
	{ // read file
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1095
		char     buffer[1024];
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1096
		GString *datastring;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1097
		int      fd           = open (fname, O_RDONLY);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1098
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1099
		if (!fd) {
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1100
			scr_log_print (LPRINT_NORMAL, "Cannot open file '%s': %s.", fname, strerror (errno));
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1101
			g_free (fname);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1102
			return;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1103
		}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1104
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1105
		datastring = g_string_new (NULL);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1106
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1107
		{ // read data
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1108
			int ret;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1109
			while ((ret = read (fd, buffer, 1024)) > 0)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1110
				g_string_append_len (datastring, buffer, ret);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1111
		}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1112
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1113
		close (fd);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1114
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1115
		len  = datastring->len;
27
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
  1116
		data = (guchar *) g_string_free (datastring, FALSE);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1117
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1118
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1119
	g_free (fname);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1120
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1121
	avatar_publish (data, len);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1122
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1123
	g_free (data);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1124
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1125
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1126
static void avatar_free_reply_handlers (void)
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1127
{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1128
	GSList *hel;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1129
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1130
	for (hel = reply_handlers; hel; hel = hel->next) {
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1131
		LmMessageHandler *handler = (LmMessageHandler *) hel->data;
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1132
		lm_message_handler_invalidate (handler);
14
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1133
#ifdef HAVE_LM_CONNECTION_UNREGISTER_REPLY_HANDLER
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1134
		if (lconnection)
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1135
			lm_connection_unregister_reply_handler (lconnection, handler);
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1136
#endif
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1137
	}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1138
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1139
	g_slist_free (reply_handlers);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1140
	reply_handlers = NULL;
14
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1141
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1142
#ifdef HAVE_LM_CONNECTION_UNREGISTER_REPLY_HANDLERS
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1143
	if (lconnection)
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1144
		lm_connection_unregister_reply_handler (lconnection, avatar_metadata_reply_handler);
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1145
#endif
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1146
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1147
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1148
// release handlers before reconnect
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1149
static guint avatar_hdh (const gchar *hid, hk_arg_t *args, gpointer userdata)
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1150
{
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1151
	avatar_free_reply_handlers ();
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1152
	return HOOK_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1153
}
15
06f8bb3de689 Publish delayed data in non-split hooks case too
Myhailo Danylenko <isbear@ukrpost.net>
parents: 14
diff changeset
  1154
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1155
static guint avatar_hch (const gchar *hid, hk_arg_t *args, gpointer userdata)
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1156
{
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1157
	if (publish_data) {
27
c641ef370d18 Fix signedness warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
  1158
		guchar *tmp_data = publish_data;
14
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1159
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1160
		scr_log_print (LPRINT_DEBUG, "avatar: Publishing delayed data.");
14
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1161
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1162
		publish_data    = NULL;
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1163
		publish_delayed = FALSE;
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1164
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1165
		avatar_publish (publish_data, publish_len);
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1166
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1167
		g_free (tmp_data);
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1168
	}
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1169
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1170
	return HOOK_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1171
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1172
33
1cc77413e85d Add AVV module description
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
  1173
void avatar_init (void)
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1174
{
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1175
	pep_register_xmlns_handler (NS_AVATAR_METADATA, avatar_handler, NULL, NULL);
6
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1176
	avatar_metadata_reply_handler = lm_message_handler_new (avatar_publish_metadata_reply_handler, NULL, NULL);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1177
35
d0bb20377181 Update mcabber versions, fix warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1178
#ifndef MCABBER_API_HAVE_CMD_ID
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1179
	cmd_add ("avatar", "", COMPL_FILENAME, 0, do_avatar, NULL);
29
378fc85f60f3 Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
  1180
#else
378fc85f60f3 Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
  1181
	avatar_cmid = cmd_add ("avatar", "", COMPL_FILENAME, 0, do_avatar, NULL);
378fc85f60f3 Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
  1182
	avatar_set_safe = cmd_set_safe ("avatar", TRUE);
378fc85f60f3 Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
  1183
#endif
14
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1184
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1185
	avatar_hid_connect    = hk_add_handler (avatar_hch, HOOK_POST_CONNECT, G_PRIORITY_DEFAULT, NULL);
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1186
	avatar_hid_disconnect = hk_add_handler (avatar_hdh, HOOK_PRE_DISCONNECT, G_PRIORITY_DEFAULT, NULL);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1187
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1188
	xmpp_add_feature (NS_AVATAR_METADATA);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1189
	xmpp_add_feature (NS_AVATAR_METADATA_NOTIFY);
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1190
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1191
33
1cc77413e85d Add AVV module description
Myhailo Danylenko <isbear@ukrpost.net>
parents: 30
diff changeset
  1192
void avatar_uninit (void)
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1193
{
6
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1194
	xmpp_del_feature (NS_AVATAR_METADATA);
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1195
	xmpp_del_feature (NS_AVATAR_METADATA_NOTIFY);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1196
26
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1197
	hk_del_handler (HOOK_POST_CONNECT, avatar_hid_connect);
fec515d07dd2 Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 25
diff changeset
  1198
	hk_del_handler (HOOK_PRE_DISCONNECT, avatar_hid_disconnect);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1199
35
d0bb20377181 Update mcabber versions, fix warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 33
diff changeset
  1200
#ifndef MCABBER_API_HAVE_CMD_ID
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1201
	cmd_del ("avatar");
29
378fc85f60f3 Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
  1202
#else
378fc85f60f3 Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
  1203
	if (avatar_cmid)
378fc85f60f3 Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
  1204
		cmd_del (avatar_cmid);
378fc85f60f3 Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
  1205
	if (avatar_set_safe)
378fc85f60f3 Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
  1206
		cmd_set_safe ("avatar", FALSE);
378fc85f60f3 Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
  1207
#endif
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1208
6
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1209
	pep_unregister_xmlns_handler (NS_AVATAR_METADATA);
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1210
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1211
	avatar_free_reply_handlers ();
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1212
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1213
	if (avatar_metadata_reply_handler) {
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1214
		lm_message_handler_invalidate (avatar_metadata_reply_handler);
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1215
		lm_message_handler_unref (avatar_metadata_reply_handler);
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1216
	}
14
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1217
9a4d0f04c7d3 Check online status
Myhailo Danylenko <isbear@ukrpost.net>
parents: 11
diff changeset
  1218
	g_free (publish_data);
0
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1219
}
29423ceb6adf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
  1220
6
a0231d43ae53 Request avatar data if not present
Myhailo Danylenko <isbear@ukrpost.net>
parents: 3
diff changeset
  1221
/* vim: se ts=4 sw=4: */