This looks a bit like an ugly hack, I know :(

But hopefully it will solve most of our encoding problems with jabber [Bug #1585]


git-svn-id: file:///svn/phpbb/trunk@6034 89ea8834-ac86-4346-8a33-228a782c2dd0
This commit is contained in:
Nils Adermann 2006-06-09 23:46:39 +00:00
parent 06981cb97b
commit ace2ee4eec
2 changed files with 89 additions and 7 deletions

View file

@ -27,6 +27,7 @@
*/ */
class jabber class jabber
{ {
var $encoding;
var $server; var $server;
var $port; var $port;
var $username; var $username;
@ -69,6 +70,8 @@ class jabber
$this->packet_queue = $this->subscription_queue = array(); $this->packet_queue = $this->subscription_queue = array();
$this->iq_sleep_timer = $this->delay_disconnect = 1; $this->iq_sleep_timer = $this->delay_disconnect = 1;
$this->encoding = 'UTF-8';
$this->returned_keep_alive = true; $this->returned_keep_alive = true;
$this->txnid = 0; $this->txnid = 0;
@ -452,7 +455,8 @@ class jabber
$id = $type . '_' . time(); $id = $type . '_' . time();
} }
$content = $this->_array_htmlspecialchars($content); $this->_array_xmlspecialchars($content);
$this->_array_conv_utf8($content);
$xml = "<message to='$to' type='$type' id='$id'>\n"; $xml = "<message to='$to' type='$type' id='$id'>\n";
@ -762,20 +766,97 @@ class jabber
} }
/** /**
* _array_htmlspecialchars() * Recursively prepares the strings in an array to be used in XML data.
* applies htmlspecialchars() to all values in an array * @private
*/ */
function _array_htmlspecialchars(&$array) function _array_xmlspecialchars(&$array)
{ {
if (is_array($array)) if (is_array($array))
{ {
foreach ($array as $k => $v) foreach ($array as $k => $v)
{ {
$v = (is_array($v)) ? $this->_array_htmlspecialchars($v) : htmlspecialchars($v); if (is_array($v))
{
$this->_array_xmlspecialchars($array[$k]);
}
else
{
$this->_xmlspecialchars($array[$k]);
}
}
} }
} }
return $array; /**
* Prepares a string for usage in XML data.
* @private
*/
function _xmlspecialchars(&$string)
{
// we only have a few entities in xml
$string = str_replace(array('&', '>', '<', '"', '\''), array('&amp;', '&gt;', '&lt;', '&quot;', '&apos;'), $string);
}
/**
* Recursively converts all elements in an array to UTF-8 from the encoding stored in {@link encoding the encoding attribute}.
* @private
*/
function _array_conv_utf8(&$array)
{
// no need to do anything if the encoding already is UTF-8
if (strtoupper($this->encoding) == 'UTF-8')
{
return true;
}
if (is_array($array))
{
foreach ($array as $k => $v)
{
if (is_array($v))
{
$this->_array_conv_utf8($array[$k]);
}
else
{
$this->_conv_utf8($array[$k]);
}
}
}
}
/**
* Converts a string to utf8 encoding.
* @private
*
* @param string $string has to have the same encoding as {@link encoding the encoding attribute} is set to.
*
* @return boolean True on success, false on failure.
*/
function _conv_utf8(&$string)
{
// no need to do anything if the encoding already is UTF-8
if (strtoupper($this->encoding) == 'UTF-8')
{
return true;
}
// first try iconv then mb_convert_encoding and as a last fall back try recode_string
if (function_exists('iconv') && (($string = iconv($this->encoding, 'UTF-8', $string)) !== false))
{
return true;
}
elseif (function_exists('mb_convert_encoding') && (($string = mb_convert_encoding($string, 'UTF-8', $this->encoding)) !== false))
{
return true;
}
elseif (function_exists('recode_string') && (($string = recode_string($this->encoding . '..UTF-8', $string)) !== false))
{
return true;
}
// if everything fails we will just have to live with what we have, good luck!
return false;
} }
// ====================================================================== // ======================================================================

View file

@ -425,6 +425,7 @@ class messenger
$this->jabber->username = $config['jab_username']; $this->jabber->username = $config['jab_username'];
$this->jabber->password = $config['jab_password']; $this->jabber->password = $config['jab_password'];
$this->jabber->resource = ($config['jab_resource']) ? $config['jab_resource'] : ''; $this->jabber->resource = ($config['jab_resource']) ? $config['jab_resource'] : '';
$this->jabber->encoding = $this->encoding;
if (!$this->jabber->connect()) if (!$this->jabber->connect())
{ {
@ -441,7 +442,7 @@ class messenger
foreach ($addresses as $address) foreach ($addresses as $address)
{ {
$this->jabber->send_message($address, 'normal', NULL, array('body' => htmlentities($this->msg))); $this->jabber->send_message($address, 'normal', NULL, array('body' => $this->msg));
} }
sleep(1); sleep(1);