pidgin/pidgin
Clone
Summary
Browse
Changes
Graph
Make sure we remove all the files we install.
release-2.x.y
2021-04-11, Gary Kramlich
5407cbf3c5dd
Make sure we remove all the files we install.
Patch was provided by Johann Lochner.
Testing Done:
Build and ran the installer and uninstaller and verified that `C:\Program Files (x86)\Pidgin` was empty and therefore removed.
Bugs closed: PIDGIN-17515
Reviewed at https://reviews.imfreedom.org/r/612/
#include "module.h"
static
void
purple_perl_util_url_cb
(
PurpleUtilFetchUrlData
*
url_data
,
void
*
user_data
,
const
gchar
*
url_text
,
size_t
size
,
const
gchar
*
error_message
)
{
SV
*
sv
=
(
SV
*
)
user_data
;
dSP
;
ENTER
;
SAVETMPS
;
PUSHMARK
(
SP
);
XPUSHs
(
sv_2mortal
(
newSVpvn
(
url_text
,
size
)));
PUTBACK
;
call_sv
(
sv
,
G_EVAL
|
G_SCALAR
);
SPAGAIN
;
/*
XXX
Make
sure
this
destroys
it
correctly
and
that
we
don
't want
*
something
like
sv_2mortal
(
sv
)
or
something
else
here
instead
.
*/
SvREFCNT_dec
(
sv
);
PUTBACK
;
FREETMPS
;
LEAVE
;
}
static
void
markup_find_tag_foreach
(
GQuark
key_id
,
char
*
data
,
HV
*
hv
)
{
const
char
*
key
=
NULL
;
key
=
g_quark_to_string
(
key_id
);
if
(
hv_store
(
hv
,
key
,
strlen
(
key
),
newSVpv
(
data
,
0
),
0
)
==
NULL
)
purple_debug_error
(
"perl"
,
"hv_store failed
\n
"
);
}
MODULE
=
Purple
::
Util
PACKAGE
=
Purple
::
Util
PREFIX
=
purple_
PROTOTYPES
:
ENABLE
gboolean
purple_running_gnome
()
gboolean
purple_running_kde
()
gboolean
purple_running_osx
()
int
purple_build_dir
(
path
,
mode
)
const
char
*
path
int
mode
gboolean
purple_email_is_valid
(
address
)
const
char
*
address
const
char
*
purple_escape_filename
(
str
)
const
char
*
str
gchar_own
*
purple_fd_get_ip
(
fd
)
int
fd
const
gchar
*
purple_home_dir
()
gchar_own
*
purple_message_meify
(
SV
*
msg
)
PREINIT
:
char
*
message
=
NULL
;
gboolean
ret
;
gsize
len
;
CODE
:
message
=
SvPV
(
msg
,
len
);
message
=
g_strndup
(
message
,
len
);
ret
=
purple_message_meify
(
message
,
len
);
if
(
ret
)
{
/*
message
will
get
g_free
()
'd later on, since RETVAL is gchar_own* */
RETVAL
=
message
;
}
else
{
RETVAL
=
NULL
;
g_free
(
message
);
}
OUTPUT
:
RETVAL
FILE
*
purple_mkstemp
(
OUTLIST
gchar_own
*
path
,
binary
)
gboolean
binary
PROTOTYPE
:
$
const
char
*
purple_normalize
(
account
,
str
)
Purple
::
Account
account
const
char
*
str
gboolean
purple_program_is_valid
(
program
)
const
char
*
program
gchar_own
*
purple_strdup_withhtml
(
src
)
const
gchar
*
src
gchar_own
*
purple_text_strip_mnemonic
(
in
)
const
char
*
in
time_t
purple_time_build
(
year
,
month
,
day
,
hour
,
min
,
sec
)
int
year
int
month
int
day
int
hour
int
min
int
sec
const
char
*
purple_time_format
(
tm
)
const
struct
tm
*
tm
const
char
*
purple_unescape_filename
(
str
)
const
char
*
str
gchar_own
*
purple_unescape_html
(
html
)
const
char
*
html
const
char
*
purple_url_decode
(
str
)
const
char
*
str
const
char
*
purple_url_encode
(
str
)
const
char
*
str
# XXX: this made perl assert()...
#
#gboolean
#purple_url_parse(url, OUTLIST gchar_own *ret_host, OUTLIST int ret_port, OUTLIST gchar_own *ret_path, OUTLIST gchar_own *ret_user, OUTLIST gchar_own *ret_passwd)
# const char *url
# PROTOTYPE: $
void
purple_url_parse
(
url
)
const
char
*
url
PREINIT
:
char
*
ret_host
;
int
ret_port
;
char
*
ret_path
;
char
*
ret_user
;
char
*
ret_passwd
;
gboolean
ret
;
PPCODE
:
ret
=
purple_url_parse
(
url
,
&
ret_host
,
&
ret_port
,
&
ret_path
,
&
ret_user
,
&
ret_passwd
);
XPUSHs
(
sv_2mortal
(
newSViv
(
ret
)));
XPUSHs
(
ret_host
?
sv_2mortal
(
newSVpv
(
ret_host
,
0
))
:
sv_2mortal
(
newSV
(
0
)));
XPUSHs
(
sv_2mortal
(
newSViv
(
ret_port
)));
XPUSHs
(
ret_path
?
sv_2mortal
(
newSVpv
(
ret_path
,
0
))
:
sv_2mortal
(
newSV
(
0
)));
XPUSHs
(
ret_user
?
sv_2mortal
(
newSVpv
(
ret_user
,
0
))
:
sv_2mortal
(
newSV
(
0
)));
XPUSHs
(
ret_passwd
?
sv_2mortal
(
newSVpv
(
ret_passwd
,
0
))
:
sv_2mortal
(
newSV
(
0
)));
g_free
(
ret_host
);
g_free
(
ret_path
);
g_free
(
ret_user
);
g_free
(
ret_passwd
);
const
char
*
purple_user_dir
()
const
char
*
purple_utf8_strftime
(
const
char
*
format
,
const
struct
tm
*
tm
);
gboolean
purple_utf8_has_word
(
haystack
,
needle
)
const
char
*
haystack
const
char
*
needle
gchar_own
*
purple_utf8_ncr_decode
(
in
)
const
char
*
in
gchar_own
*
purple_utf8_ncr_encode
(
in
)
const
char
*
in
gchar_own
*
purple_utf8_salvage
(
str
)
const
char
*
str
int
purple_utf8_strcasecmp
(
a
,
b
)
const
char
*
a
const
char
*
b
gchar_own
*
purple_utf8_try_convert
(
str
)
const
char
*
str
gboolean
purple_ip_address_is_valid
(
ip
)
const
char
*
ip
const
char
*
purple_normalize_nocase
(
account
,
str
)
Purple
::
Account
account
const
char
*
str
const
gchar
*
purple_gai_strerror
(
errnum
)
gint
errnum
void
purple_got_protocol_handler_uri
(
uri
)
const
char
*
uri
gchar_own
*
purple_base16_encode
(
const
guchar
*
data
,
gsize
length
(
data
))
PROTOTYPE
:
$
gchar_own
*
purple_base16_encode_chunked
(
const
guchar
*
data
,
gsize
length
(
data
))
PROTOTYPE
:
$
gchar_own
*
purple_base64_encode
(
const
guchar
*
data
,
gsize
length
(
data
))
PROTOTYPE
:
$
void
purple_restore_default_signal_handlers
()
SV
*
purple_base16_decode
(
str
)
const
char
*
str
PREINIT
:
gsize
len
;
guchar
*
ret
;
CODE
:
ret
=
purple_base16_decode
(
str
,
&
len
);
if
(
ret
&&
len
>
0
)
{
RETVAL
=
newSVpv
((
gchar
*
)
ret
,
len
);
}
else
{
g_free
(
ret
);
XSRETURN_UNDEF
;
}
g_free
(
ret
);
OUTPUT
:
RETVAL
SV
*
purple_base64_decode
(
str
)
const
char
*
str
PREINIT
:
gsize
len
;
guchar
*
ret
;
CODE
:
ret
=
purple_base64_decode
(
str
,
&
len
);
if
(
ret
&&
len
>
0
)
{
RETVAL
=
newSVpv
((
gchar
*
)
ret
,
len
);
}
else
{
g_free
(
ret
);
XSRETURN_UNDEF
;
}
g_free
(
ret
);
OUTPUT
:
RETVAL
SV
*
purple_quotedp_decode
(
str
)
const
char
*
str
PREINIT
:
gsize
len
;
guchar
*
ret
;
CODE
:
ret
=
purple_quotedp_decode
(
str
,
&
len
);
if
(
len
)
{
RETVAL
=
newSVpv
((
gchar
*
)
ret
,
len
);
}
else
{
g_free
(
ret
);
XSRETURN_UNDEF
;
}
g_free
(
ret
);
OUTPUT
:
RETVAL
void
purple_uri_list_extract_uris
(
uri_list
)
const
gchar
*
uri_list
PREINIT
:
GList
*
l
=
NULL
,
*
gl
=
NULL
;
PPCODE
:
gl
=
purple_uri_list_extract_uris
(
uri_list
);
for
(
l
=
gl
;
l
;
l
=
l
->
next
)
{
XPUSHs
(
sv_2mortal
(
newSVpv
(
l
->
data
,
0
)));
g_free
(
l
->
data
);
}
g_list_free
(
gl
);
void
purple_uri_list_extract_filenames
(
uri_list
)
const
gchar
*
uri_list
PREINIT
:
GList
*
l
=
NULL
,
*
gl
=
NULL
;
PPCODE
:
gl
=
purple_uri_list_extract_filenames
(
uri_list
);
for
(
l
=
gl
;
l
;
l
=
l
->
next
)
{
XPUSHs
(
sv_2mortal
(
newSVpv
(
l
->
data
,
0
)));
g_free
(
l
->
data
);
}
g_list_free
(
gl
);
MODULE
=
Purple
::
Util
PACKAGE
=
Purple
::
Util
::
Str
PREFIX
=
purple_str_
PROTOTYPES
:
ENABLE
gchar_own
*
purple_str_add_cr
(
str
)
const
char
*
str
gchar_own
*
purple_str_binary_to_ascii
(
const
unsigned
char
*
binary
,
guint
length
(
binary
))
PROTOTYPE
:
$
gboolean
purple_str_has_prefix
(
s
,
p
)
const
char
*
s
const
char
*
p
gboolean
purple_str_has_suffix
(
s
,
x
)
const
char
*
s
const
char
*
x
gchar_own
*
purple_str_seconds_to_string
(
sec
)
guint
sec
gchar_own
*
purple_str_size_to_units
(
size
)
size_t
size
time_t
purple_str_to_time
(
timestamp
,
utc
=
FALSE
,
tm
=
NULL
,
OUTLIST
long
tz_off
,
OUTLIST
const
char
*
rest
)
const
char
*
timestamp
gboolean
utc
struct
tm
*
tm
PROTOTYPE
:
$
;
$$
MODULE
=
Purple
::
Util
PACKAGE
=
Purple
::
Util
::
Date
PREFIX
=
purple_date_
PROTOTYPES
:
ENABLE
const
char
*
purple_date_format_full
(
tm
)
const
struct
tm
*
tm
const
char
*
purple_date_format_long
(
tm
)
const
struct
tm
*
tm
const
char
*
purple_date_format_short
(
tm
)
const
struct
tm
*
tm
MODULE
=
Purple
::
Util
PACKAGE
=
Purple
::
Util
::
Markup
PREFIX
=
purple_markup_
PROTOTYPES
:
ENABLE
gboolean
purple_markup_extract_info_field
(
str
,
len
,
user_info
,
start_token
,
skip
,
end_token
,
check_value
,
no_value_token
,
display_name
,
is_link
,
link_prefix
,
format_cb
)
const
char
*
str
int
len
Purple
::
NotifyUserInfo
user_info
const
char
*
start_token
int
skip
const
char
*
end_token
char
check_value
const
char
*
no_value_token
const
char
*
display_name
gboolean
is_link
const
char
*
link_prefix
Purple
::
Util
::
InfoFieldFormatCallback
format_cb
# XXX: returning start/end to perl doesn't make a lot of sense...
# XXX: the actual tag data can be gotten with $start =~ s/$end//g;
void
purple_markup_find_tag
(
needle
,
haystack
)
const
char
*
needle
const
char
*
haystack
PREINIT
:
const
char
*
start
=
NULL
;
const
char
*
end
=
NULL
;
GData
*
attributes
;
gboolean
ret
;
HV
*
hv
=
NULL
;
PPCODE
:
ret
=
purple_markup_find_tag
(
needle
,
haystack
,
&
start
,
&
end
,
&
attributes
);
if
(
!
ret
)
XSRETURN_UNDEF
;
hv
=
newHV
();
g_datalist_foreach
(
&
attributes
,
(
GDataForeachFunc
)
markup_find_tag_foreach
,
hv
);
g_datalist_clear
(
&
attributes
);
XPUSHs
(
sv_2mortal
(
newSVpv
(
start
,
0
)));
XPUSHs
(
sv_2mortal
(
newSVpv
(
end
,
0
)));
XPUSHs
(
sv_2mortal
(
newRV_noinc
((
SV
*
)
hv
)));
gchar_own
*
purple_markup_get_tag_name
(
tag
)
const
char
*
tag
void
purple_markup_html_to_xhtml
(
html
,
OUTLIST
gchar_own
*
dest_xhtml
,
OUTLIST
gchar_own
*
dest_plain
)
const
char
*
html
PROTOTYPE
:
$
gchar_own
*
purple_markup_linkify
(
str
)
const
char
*
str
gchar_own
*
purple_markup_slice
(
str
,
x
,
y
)
const
char
*
str
guint
x
guint
y
gchar_own
*
purple_markup_strip_html
(
str
)
const
char
*
str
gchar_own
*
purple_markup_get_css_property
(
style
,
opt
)
const
gchar
*
style
const
gchar
*
opt
SV
*
purple_markup_unescape_entity
(
text
)
const
char
*
text
PREINIT
:
int
length
;
CODE
:
{
const
char
*
str
=
purple_markup_unescape_entity
(
text
,
&
length
);
if
(
length
)
{
RETVAL
=
newSVpv
(
str
,
length
);
}
else
{
XSRETURN_UNDEF
;
}
}
OUTPUT
:
RETVAL
MODULE
=
Purple
::
Util
PACKAGE
=
Purple
::
Util
PREFIX
=
purple_util_
PROTOTYPES
:
ENABLE
#XXX: expand...
void
purple_util_fetch_url
(
plugin
,
url
,
full
,
user_agent
,
http11
,
cb
)
Purple
::
Plugin
plugin
const
char
*
url
gboolean
full
const
char
*
user_agent
gboolean
http11
SV
*
cb
PREINIT
:
PurpleUtilFetchUrlData
*
data
;
PPCODE
:
/*
XXX
:
i
don
't like this... only plugins can use it... */
SV
*
sv
=
purple_perl_sv_from_fun
(
plugin
,
cb
);
if
(
sv
!=
NULL
)
{
data
=
purple_util_fetch_url
(
url
,
full
,
user_agent
,
http11
,
purple_perl_util_url_cb
,
sv
);
XPUSHs
(
sv_2mortal
(
purple_perl_bless_object
(
data
,
"Purple::Util::FetchUrlData"
)));
}
else
{
purple_debug_warning
(
"perl"
,
"Callback not a valid type, only strings and coderefs allowed in purple_util_fetch_url.
\n
"
);
XSRETURN_UNDEF
;
}
void
purple_util_set_user_dir
(
dir
)
const
char
*
dir
gboolean
purple_util_write_data_to_file
(
filename
,
const
char
*
data
,
size_t
length
(
data
))
const
char
*
filename
PROTOTYPE
:
$$
void
purple_util_set_current_song
(
title
,
artist
,
album
)
const
char
*
title
const
char
*
artist
const
char
*
album
gchar_own
*
purple_util_format_song_info
(
title
,
artist
,
album
,
unused
)
const
char
*
title
const
char
*
artist
const
char
*
album
gpointer
unused
const
char
*
purple_util_get_image_extension
(
const
char
*
data
,
size_t
length
(
data
))
PROTOTYPE
:
$
gchar_own
*
purple_util_get_image_filename
(
const
char
*
image_data
,
size_t
length
(
image_data
))
PROTOTYPE
:
$
Purple
::
XMLNode
purple_util_read_xml_from_file
(
filename
,
description
)
const
char
*
filename
const
char
*
description
gboolean
purple_util_write_data_to_file_absolute
(
filename_full
,
char
*
data
,
gssize
length
(
data
))
const
char
*
filename_full
PROTOTYPE
:
$$