1
Changeset 962 – MultiMag

Changeset 962


Ignore:
Timestamp:
Feb 1, 2018, 9:41:04 PM (3 weeks ago)
Author:
blacklight
Message:
  • Обновлена библиотека XMPPHP для совместимости с PHP7
Location:
trunk
Files:
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/cli/core.cli.inc.php

    r958 r962  
    7272                }               
    7373                if(!$action->isEnabled()) {
    74                     echo " ОТКЛЮЧЕНО.\n";
     74                    if($verbose) {
     75                        echo " ОТКЛЮЧЕНО.\n";
     76                    }
    7577                    return false;
    7678                }   
     
    8991                }
    9092            }
    91             catch (XMPPHP_Exception $e) {
     93            catch (\XMPPHP\Exception $e) {
    9294                if (\cfg::get('site', 'admin_email')) {
    9395                    mailto(\cfg::get('site', 'admin_email'), "XMPP exception in daily.php", $e->getMessage());
     
    124126        }
    125127
    126     } catch (XMPPHP_Exception $e) {
     128    } catch (\XMPPHP\Exception $e) {
    127129        if (\cfg::get('site', 'admin_email')) {
    128130            mailto(\cfg::get('site', 'admin_email'), "Global XMPP exception in daily.php", $e->getMessage());
  • trunk/common/XMPPHP/BOSH.php

    r2 r962  
    11<?php
    2 /**
    3  * XMPPHP: The PHP XMPP Library
    4  * Copyright (C) 2008  Nathanael C. Fritz
    5  * This file is part of SleekXMPP.
    6  *
    7  * XMPPHP is free software; you can redistribute it and/or modify
    8  * it under the terms of the GNU General Public License as published by
    9  * the Free Software Foundation; either version 2 of the License, or
    10  * (at your option) any later version.
    11  *
    12  * XMPPHP is distributed in the hope that it will be useful,
    13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    15  * GNU General Public License for more details.
    16  *
    17  * You should have received a copy of the GNU General Public License
    18  * along with XMPPHP; if not, write to the Free Software
    19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    20  *
    21  * @category   xmpphp
    22  * @package     XMPPHP
    23  * @author       Nathanael C. Fritz <JID: fritzy@netflint.net>
    24  * @author       Stephan Wentz <JID: stephan@jabber.wentz.it>
    25  * @author       Michael Garvin <JID: gar@netflint.net>
    26  * @copyright  2008 Nathanael C. Fritz
    27  */
    282
    29 /** XMPPHP_XMLStream */
    30 require_once "XMPP.php";
     3namespace XMPPHP;
     4
     5    /**
     6     * XMPPHP: The PHP XMPP Library
     7     * Copyright (C) 2008  Nathanael C. Fritz
     8     * This file is part of SleekXMPP.
     9     *
     10     * XMPPHP is free software; you can redistribute it and/or modify
     11     * it under the terms of the GNU General Public License as published by
     12     * the Free Software Foundation; either version 2 of the License, or
     13     * (at your option) any later version.
     14     *
     15     * XMPPHP is distributed in the hope that it will be useful,
     16     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     17     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18     * GNU General Public License for more details.
     19     *
     20     * You should have received a copy of the GNU General Public License
     21     * along with XMPPHP; if not, write to the Free Software
     22     * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     23     *
     24     * @category   xmpphp
     25     * @package    XMPPHP
     26     * @author     Nathanael C. Fritz <JID: fritzy@netflint.net>
     27     * @author     Stephan Wentz <JID: stephan@jabber.wentz.it>
     28     * @author     Michael Garvin <JID: gar@netflint.net>
     29     * @author     Alexander Birkner (https://github.com/BirknerAlex)
     30     * @copyright  2008 Nathanael C. Fritz
     31     */
    3132
    3233/**
    3334 * XMPPHP Main Class
    34  * 
    35  * @category   xmpphp 
    36  * @package     XMPPHP
    37  * @author      Nathanael C. Fritz <JID: fritzy@netflint.net>
    38  * @author      Stephan Wentz <JID: stephan@jabber.wentz.it>
    39  * @author      Michael Garvin <JID: gar@netflint.net>
     35 *
     36 * @category   xmpphp
     37 * @package    XMPPHP
     38 * @author    Nathanael C. Fritz <JID: fritzy@netflint.net>
     39 * @author    Stephan Wentz <JID: stephan@jabber.wentz.it>
     40 * @author    Michael Garvin <JID: gar@netflint.net>
    4041 * @copyright  2008 Nathanael C. Fritz
    41  * @version     $Id$
     42 * @version    $Id$
    4243 */
    43 class XMPPHP_BOSH extends XMPPHP_XMPP {
     44class BOSH extends XMPP
     45{
     46    protected $rid;
     47    protected $sid;
     48    protected $http_server;
     49    protected $http_buffer = Array();
     50    protected $session = false;
    4451
    45                 protected $rid;
    46                 protected $sid;
    47                 protected $http_server;
    48                 protected $http_buffer = Array();
    49                 protected $session = false;
     52    public function connect($server, $wait = '1', $session = false)
     53    {
     54        $this->http_server = $server;
     55        $this->use_encryption = false;
     56        $this->session = $session;
    5057
    51                 public function connect($server, $wait='1', $session=false) {
    52                         $this->http_server = $server;
    53                         $this->use_encryption = false;
    54                         $this->session = $session;
     58        $this->rid = 3001;
     59        $this->sid = null;
     60        if ($session) {
     61            $this->loadSession();
     62        }
     63        if (!$this->sid) {
     64            $body = $this->__buildBody();
     65            $body->addAttribute('hold', '1');
     66            $body->addAttribute('to', $this->host);
     67            $body->addAttribute('route', "xmpp:{$this->host}:{$this->port}");
     68            $body->addAttribute('secure', 'true');
     69            $body->addAttribute('xmpp:version', '1.6', 'urn:xmpp:xbosh');
     70            $body->addAttribute('wait', strval($wait));
     71            $body->addAttribute('ack', '1');
     72            $body->addAttribute('xmlns:xmpp', 'urn:xmpp:xbosh');
     73            $buff = "<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>";
     74            xml_parse($this->parser, $buff, false);
     75            $response = $this->__sendBody($body);
     76            $rxml = new \SimpleXMLElement($response);
     77            $this->sid = $rxml['sid'];
    5578
    56                         $this->rid = 3001;
    57                         $this->sid = null;
    58                         if($session)
    59                         {
    60                                 $this->loadSession();
    61                         }
    62                         if(!$this->sid) {
    63                                 $body = $this->__buildBody();
    64                                 $body->addAttribute('hold','1');
    65                                 $body->addAttribute('to', $this->host);
    66                                 $body->addAttribute('route', "xmpp:{$this->host}:{$this->port}");
    67                                 $body->addAttribute('secure','true');
    68                                 $body->addAttribute('xmpp:version','1.6', 'urn:xmpp:xbosh');
    69                                 $body->addAttribute('wait', strval($wait));
    70                                 $body->addAttribute('ack','1');
    71                                 $body->addAttribute('xmlns:xmpp','urn:xmpp:xbosh');
    72                                 $buff = "<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>";
    73                                 xml_parse($this->parser, $buff, false);
    74                                 $response = $this->__sendBody($body);
    75                                 $rxml = new SimpleXMLElement($response);
    76                                 $this->sid = $rxml['sid'];
     79        } else {
     80            $buff = "<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>";
     81            xml_parse($this->parser, $buff, false);
     82        }
     83    }
    7784
    78                         } else {
    79                                 $buff = "<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>";
    80                                 xml_parse($this->parser, $buff, false);
    81                         }
    82                 }
     85    public function __sendBody($body = null, $recv = true)
     86    {
     87        if (!$body) {
     88            $body = $this->__buildBody();
     89        }
     90        $ch = curl_init($this->http_server);
     91        curl_setopt($ch, CURLOPT_HEADER, 0);
     92        curl_setopt($ch, CURLOPT_POST, 1);
     93        curl_setopt($ch, CURLOPT_POSTFIELDS, $body->asXML());
     94        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
     95        $header = array('Accept-Encoding: gzip, deflate', 'Content-Type: text/xml; charset=utf-8');
     96        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
     97        curl_setopt($ch, CURLOPT_VERBOSE, 0);
     98        $output = '';
     99        if ($recv) {
     100            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     101            $output = curl_exec($ch);
     102            $this->http_buffer[] = $output;
     103        }
     104        curl_close($ch);
     105        return $output;
     106    }
    83107
    84                 public function __sendBody($body=null, $recv=true) {
    85                         if(!$body) {
    86                                 $body = $this->__buildBody();
    87                         }
    88                         $ch = curl_init($this->http_server);
    89                         curl_setopt($ch, CURLOPT_HEADER, 0);
    90                         curl_setopt($ch, CURLOPT_POST, 1);
    91                         curl_setopt($ch, CURLOPT_POSTFIELDS, $body->asXML());
    92                         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    93                         $header = array('Accept-Encoding: gzip, deflate','Content-Type: text/xml; charset=utf-8');
    94                         curl_setopt($ch, CURLOPT_HTTPHEADER, $header );
    95                         curl_setopt($ch, CURLOPT_VERBOSE, 0);
    96                         $output = '';
    97                         if($recv) {
    98                                 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    99                                 $output = curl_exec($ch);
    100                                 $this->http_buffer[] = $output;
    101                         }
    102                         curl_close($ch);
    103                         return $output;
    104                 }
     108    public function __buildBody($sub = null)
     109    {
     110        $xml = new \SimpleXMLElement("<body xmlns='http://jabber.org/protocol/httpbind' xmlns:xmpp='urn:xmpp:xbosh' />");
     111        $xml->addAttribute('content', 'text/xml; charset=utf-8');
     112        $xml->addAttribute('rid', $this->rid);
     113        $this->rid += 1;
     114        if ($this->sid) $xml->addAttribute('sid', $this->sid);
     115        #if($this->sid) $xml->addAttribute('xmlns', 'http://jabber.org/protocol/httpbind');
     116        $xml->addAttribute('xml:lang', 'en');
     117        if ($sub) { // ok, so simplexml is lame
     118            $p = dom_import_simplexml($xml);
     119            $c = dom_import_simplexml($sub);
     120            $cn = $p->ownerDocument->importNode($c, true);
     121            $p->appendChild($cn);
     122            $xml = simplexml_import_dom($p);
     123        }
     124        return $xml;
     125    }
    105126
    106                 public function __buildBody($sub=null) {
    107                         $xml = new SimpleXMLElement("<body xmlns='http://jabber.org/protocol/httpbind' xmlns:xmpp='urn:xmpp:xbosh' />");
    108                         $xml->addAttribute('content', 'text/xml; charset=utf-8');
    109                         $xml->addAttribute('rid', $this->rid);
    110                         $this->rid += 1;
    111                         if($this->sid) $xml->addAttribute('sid', $this->sid);
    112                         #if($this->sid) $xml->addAttribute('xmlns', 'http://jabber.org/protocol/httpbind');
    113                         $xml->addAttribute('xml:lang', 'en');
    114                         if($sub) { // ok, so simplexml is lame
    115                                 $p = dom_import_simplexml($xml);
    116                                 $c = dom_import_simplexml($sub);
    117                                 $cn = $p->ownerDocument->importNode($c, true);
    118                                 $p->appendChild($cn);
    119                                 $xml = simplexml_import_dom($p);
    120                         }
    121                         return $xml;
    122                 }
     127    public function __process()
     128    {
     129        if ($this->http_buffer) {
     130            $this->__parseBuffer();
     131        } else {
     132            $this->__sendBody();
     133            $this->__parseBuffer();
     134        }
     135    }
    123136
    124                 public function __process() {
    125                         if($this->http_buffer) {
    126                                 $this->__parseBuffer();
    127                         } else {
    128                                 $this->__sendBody();
    129                                 $this->__parseBuffer();
    130                         }
    131                 }
     137    public function __parseBuffer()
     138    {
     139        while ($this->http_buffer) {
     140            $idx = key($this->http_buffer);
     141            $buffer = $this->http_buffer[$idx];
     142            unset($this->http_buffer[$idx]);
     143            if ($buffer) {
     144                $xml = new \SimpleXMLElement($buffer);
     145                $children = $xml->xpath('child::node()');
     146                foreach ($children as $child) {
     147                    $buff = $child->asXML();
     148                    $this->log->log("RECV: $buff", Log::LEVEL_VERBOSE);
     149                    xml_parse($this->parser, $buff, false);
     150                }
     151            }
     152        }
     153    }
    132154
    133                 public function __parseBuffer() {
    134                         while ($this->http_buffer) {
    135                                 $idx = key($this->http_buffer);
    136                                 $buffer = $this->http_buffer[$idx];
    137                                 unset($this->http_buffer[$idx]);
    138                                 if($buffer) {
    139                                         $xml = new SimpleXMLElement($buffer);
    140                                         $children = $xml->xpath('child::node()');
    141                                         foreach ($children as $child) {
    142                                                 $buff = $child->asXML();
    143                                                 $this->log->log("RECV: $buff",  XMPPHP_Log::LEVEL_VERBOSE);
    144                                                 xml_parse($this->parser, $buff, false);
    145                                         }
    146                                 }
    147                         }
    148                 }
     155    public function send($msg)
     156    {
     157        $this->log->log("SEND: $msg", Log::LEVEL_VERBOSE);
     158        $msg = new \SimpleXMLElement($msg);
     159        #$msg->addAttribute('xmlns', 'jabber:client');
     160        $this->__sendBody($this->__buildBody($msg), true);
     161        #$this->__parseBuffer();
     162    }
    149163
    150                 public function send($msg) {
    151                         $this->log->log("SEND: $msg",  XMPPHP_Log::LEVEL_VERBOSE);
    152                         $msg = new SimpleXMLElement($msg);
    153                         #$msg->addAttribute('xmlns', 'jabber:client');
    154                         $this->__sendBody($this->__buildBody($msg), true);
    155                         #$this->__parseBuffer();
    156                 }
     164    public function reset()
     165    {
     166        $this->xml_depth = 0;
     167        unset($this->xmlobj);
     168        $this->xmlobj = array();
     169        $this->setupParser();
     170        #$this->send($this->stream_start);
     171        $body = $this->__buildBody();
     172        $body->addAttribute('to', $this->host);
     173        $body->addAttribute('xmpp:restart', 'true', 'urn:xmpp:xbosh');
     174        $buff = "<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>";
     175        $response = $this->__sendBody($body);
     176        $this->been_reset = true;
     177        xml_parse($this->parser, $buff, false);
     178    }
    157179
    158                 public function reset() {
    159                         $this->xml_depth = 0;
    160                         unset($this->xmlobj);
    161                         $this->xmlobj = array();
    162                         $this->setupParser();
    163                         #$this->send($this->stream_start);
    164                         $body = $this->__buildBody();
    165                         $body->addAttribute('to', $this->host);
    166                         $body->addAttribute('xmpp:restart', 'true', 'urn:xmpp:xbosh');
    167                         $buff = "<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>";
    168                         $response = $this->__sendBody($body);
    169                         $this->been_reset = true;
    170                         xml_parse($this->parser, $buff, false);
    171                 }
     180    public function loadSession()
     181    {
     182        if (isset($_SESSION['XMPPHP_BOSH_RID'])) $this->rid = $_SESSION['XMPPHP_BOSH_RID'];
     183        if (isset($_SESSION['XMPPHP_BOSH_SID'])) $this->sid = $_SESSION['XMPPHP_BOSH_SID'];
     184        if (isset($_SESSION['XMPPHP_BOSH_authed'])) $this->authed = $_SESSION['XMPPHP_BOSH_authed'];
     185        if (isset($_SESSION['XMPPHP_BOSH_jid'])) $this->jid = $_SESSION['XMPPHP_BOSH_jid'];
     186        if (isset($_SESSION['XMPPHP_BOSH_fulljid'])) $this->fulljid = $_SESSION['XMPPHP_BOSH_fulljid'];
     187    }
    172188
    173                 public function loadSession() {
    174                         if(isset($_SESSION['XMPPHP_BOSH_RID'])) $this->rid = $_SESSION['XMPPHP_BOSH_RID'];
    175                         if(isset($_SESSION['XMPPHP_BOSH_SID'])) $this->sid = $_SESSION['XMPPHP_BOSH_SID'];
    176                         if(isset($_SESSION['XMPPHP_BOSH_authed'])) $this->authed = $_SESSION['XMPPHP_BOSH_authed'];
    177                         if(isset($_SESSION['XMPPHP_BOSH_jid'])) $this->jid = $_SESSION['XMPPHP_BOSH_jid'];
    178                         if(isset($_SESSION['XMPPHP_BOSH_fulljid'])) $this->fulljid = $_SESSION['XMPPHP_BOSH_fulljid'];
    179                 }
    180 
    181                 public function saveSession() {
    182                         $_SESSION['XMPPHP_BOSH_RID'] = (string) $this->rid;
    183                         $_SESSION['XMPPHP_BOSH_SID'] = (string) $this->sid;
    184                         $_SESSION['XMPPHP_BOSH_authed'] = (boolean) $this->authed;
    185                         $_SESSION['XMPPHP_BOSH_jid'] = (string) $this->jid;
    186                         $_SESSION['XMPPHP_BOSH_fulljid'] = (string) $this->fulljid;
    187                 }
     189    public function saveSession()
     190    {
     191        $_SESSION['XMPPHP_BOSH_RID'] = (string)$this->rid;
     192        $_SESSION['XMPPHP_BOSH_SID'] = (string)$this->sid;
     193        $_SESSION['XMPPHP_BOSH_authed'] = (boolean)$this->authed;
     194        $_SESSION['XMPPHP_BOSH_jid'] = (string)$this->jid;
     195        $_SESSION['XMPPHP_BOSH_fulljid'] = (string)$this->fulljid;
     196    }
    188197}
  • trunk/common/XMPPHP/Exception.php

    r2 r962  
    11<?php
     2
     3namespace XMPPHP;
     4
     5use \Exception as ObjectException;
     6
    27/**
    38 * XMPPHP: The PHP XMPP Library
    49 * Copyright (C) 2008  Nathanael C. Fritz
    510 * This file is part of SleekXMPP.
    6  * 
     11 *
    712 * XMPPHP is free software; you can redistribute it and/or modify
    813 * it under the terms of the GNU General Public License as published by
    914 * the Free Software Foundation; either version 2 of the License, or
    1015 * (at your option) any later version.
    11  * 
     16 *
    1217 * XMPPHP is distributed in the hope that it will be useful,
    1318 * but WITHOUT ANY WARRANTY; without even the implied warranty of
    1419 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    1520 * GNU General Public License for more details.
    16  * 
     21 *
    1722 * You should have received a copy of the GNU General Public License
    1823 * along with XMPPHP; if not, write to the Free Software
    1924 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    2025 *
    21  * @category   xmpphp 
     26 * @category   xmpphp
    2227 * @package    XMPPHP
    2328 * @author     Nathanael C. Fritz <JID: fritzy@netflint.net>
    2429 * @author     Stephan Wentz <JID: stephan@jabber.wentz.it>
    25  * @author       Michael Garvin <JID: gar@netflint.net>
     30 * @author     Michael Garvin <JID: gar@netflint.net>
     31 * @author     Alexander Birkner (https://github.com/BirknerAlex)
    2632 * @copyright  2008 Nathanael C. Fritz
    2733 */
    2834
    2935/**
    30  * XMPPHP Exception
     36 * XMPPHP Main Class
    3137 *
    32  * @category   xmpphp 
     38 * @category   xmpphp
    3339 * @package    XMPPHP
    3440 * @author     Nathanael C. Fritz <JID: fritzy@netflint.net>
    3541 * @author     Stephan Wentz <JID: stephan@jabber.wentz.it>
    36  * @author      Michael Garvin <JID: gar@netflint.net>
     42 * @author    Michael Garvin <JID: gar@netflint.net>
    3743 * @copyright  2008 Nathanael C. Fritz
    3844 * @version    $Id$
    3945 */
    40 class XMPPHP_Exception extends Exception {
     46class Exception extends ObjectException {
    4147}
  • trunk/common/XMPPHP/Log.php

    r2 r962  
    11<?php
    2 /**
    3  * XMPPHP: The PHP XMPP Library
    4  * Copyright (C) 2008  Nathanael C. Fritz
    5  * This file is part of SleekXMPP.
    6  *
    7  * XMPPHP is free software; you can redistribute it and/or modify
    8  * it under the terms of the GNU General Public License as published by
    9  * the Free Software Foundation; either version 2 of the License, or
    10  * (at your option) any later version.
    11  *
    12  * XMPPHP is distributed in the hope that it will be useful,
    13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    15  * GNU General Public License for more details.
    16  *
    17  * You should have received a copy of the GNU General Public License
    18  * along with XMPPHP; if not, write to the Free Software
    19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    20  *
    21  * @category   xmpphp
    22  * @package     XMPPHP
    23  * @author       Nathanael C. Fritz <JID: fritzy@netflint.net>
    24  * @author       Stephan Wentz <JID: stephan@jabber.wentz.it>
    25  * @author       Michael Garvin <JID: gar@netflint.net>
    26  * @copyright  2008 Nathanael C. Fritz
    27  */
     2
     3namespace XMPPHP;
     4
     5        /**
     6         * XMPPHP: The PHP XMPP Library
     7         * Copyright (C) 2008  Nathanael C. Fritz
     8         * This file is part of SleekXMPP.
     9         *
     10         * XMPPHP is free software; you can redistribute it and/or modify
     11         * it under the terms of the GNU General Public License as published by
     12         * the Free Software Foundation; either version 2 of the License, or
     13         * (at your option) any later version.
     14         *
     15         * XMPPHP is distributed in the hope that it will be useful,
     16         * but WITHOUT ANY WARRANTY; without even the implied warranty of
     17         * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18         * GNU General Public License for more details.
     19         *
     20         * You should have received a copy of the GNU General Public License
     21         * along with XMPPHP; if not, write to the Free Software
     22         * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     23         *
     24         * @category   xmpphp
     25         * @package    XMPPHP
     26         * @author     Nathanael C. Fritz <JID: fritzy@netflint.net>
     27         * @author     Stephan Wentz <JID: stephan@jabber.wentz.it>
     28         * @author     Michael Garvin <JID: gar@netflint.net>
     29         * @author     Alexander Birkner (https://github.com/BirknerAlex)
     30         * @copyright  2008 Nathanael C. Fritz
     31         */
    2832
    2933/**
    30  * XMPPHP Log
    31  *
    32  * @package     XMPPHP
    33  * @author       Nathanael C. Fritz <JID: fritzy@netflint.net>
    34  * @author       Stephan Wentz <JID: stephan@jabber.wentz.it>
    35  * @author       Michael Garvin <JID: gar@netflint.net>
     34 * XMPPHP Main Class
     35 *
     36 * @category   xmpphp
     37 * @package    XMPPHP
     38 * @author     Nathanael C. Fritz <JID: fritzy@netflint.net>
     39 * @author     Stephan Wentz <JID: stephan@jabber.wentz.it>
     40 * @author     Michael Garvin <JID: gar@netflint.net>
    3641 * @copyright  2008 Nathanael C. Fritz
    37  * @version     $Id$
     42 * @version    $Id$
    3843 */
    39 class XMPPHP_Log {
     44class Log {
    4045       
    4146        const LEVEL_ERROR   = 0;
  • trunk/common/XMPPHP/Roster.php

    r616 r962  
    11<?php
     2
     3namespace XMPPHP;
     4
    25/**
    36 * XMPPHP: The PHP XMPP Library
    47 * Copyright (C) 2008  Nathanael C. Fritz
    58 * This file is part of SleekXMPP.
    6  * 
     9 *
    710 * XMPPHP is free software; you can redistribute it and/or modify
    811 * it under the terms of the GNU General Public License as published by
    912 * the Free Software Foundation; either version 2 of the License, or
    1013 * (at your option) any later version.
    11  * 
     14 *
    1215 * XMPPHP is distributed in the hope that it will be useful,
    1316 * but WITHOUT ANY WARRANTY; without even the implied warranty of
    1417 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    1518 * GNU General Public License for more details.
    16  * 
     19 *
    1720 * You should have received a copy of the GNU General Public License
    1821 * along with XMPPHP; if not, write to the Free Software
    1922 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    2023 *
    21  * @category   xmpphp
    22  * @package     XMPPHP
    23  * @author       Nathanael C. Fritz <JID: fritzy@netflint.net>
    24  * @author       Stephan Wentz <JID: stephan@jabber.wentz.it>
    25  * @author       Michael Garvin <JID: gar@netflint.net>
     24 * @category   xmpphp
     25 * @package    XMPPHP
     26 * @author     Nathanael C. Fritz <JID: fritzy@netflint.net>
     27 * @author     Stephan Wentz <JID: stephan@jabber.wentz.it>
     28 * @author     Michael Garvin <JID: gar@netflint.net>
     29 * @author     Alexander Birkner (https://github.com/BirknerAlex)
    2630 * @copyright  2008 Nathanael C. Fritz
    2731 */
    2832
    2933/**
    30  * XMPPHP Roster Object
    31  * 
    32  * @category   xmpphp 
    33  * @package     XMPPHP
    34  * @author      Nathanael C. Fritz <JID: fritzy@netflint.net>
    35  * @author      Stephan Wentz <JID: stephan@jabber.wentz.it>
    36  * @author      Michael Garvin <JID: gar@netflint.net>
     34 * XMPPHP Main Class
     35 *
     36 * @category   xmpphp
     37 * @package    XMPPHP
     38 * @author    Nathanael C. Fritz <JID: fritzy@netflint.net>
     39 * @author    Stephan Wentz <JID: stephan@jabber.wentz.it>
     40 * @author    Michael Garvin <JID: gar@netflint.net>
    3741 * @copyright  2008 Nathanael C. Fritz
    38  * @version     $Id$
     42 * @version    $Id$
    3943 */
    40 
    4144class Roster {
    4245        /**
     
    119122        */
    120123        public function setPresence($presence, $priority, $show, $status) {
    121                 list($jid, $resource) = explode("/", $presence);
     124                $presence = explode('/', $presence, 2);
     125                $jid = $presence[0];
     126                $resource = isset($presence[1]) ? $presence[1] : '';
    122127                if ($show != 'unavailable') {
    123128                        if (!$this->isContact($jid)) {
    124129                                $this->addContact($jid, 'not-in-roster');
    125130                        }
    126                         $resource = $resource ? $resource : '';
    127131                        $this->roster_array[$jid]['presence'][$resource] = array('priority' => $priority, 'show' => $show, 'status' => $status);
    128132                } else { //Nuke unavailable resources to save memory
    129133                        unset($this->roster_array[$jid]['resource'][$resource]);
     134                        unset($this->roster_array[$jid]['presence'][$resource]);
    130135                }
    131136        }
     
    138143         */
    139144        public function getPresence($jid) {
    140                 $split = explode("/", $jid);
     145                $split = explode('/', $jid, 2);
    141146                $jid = $split[0];
    142147                if($this->isContact($jid)) {
  • trunk/common/XMPPHP/XMLObj.php

    r2 r962  
    1 <?php
    2 /**
    3  * XMPPHP: The PHP XMPP Library
    4  * Copyright (C) 2008  Nathanael C. Fritz
    5  * This file is part of SleekXMPP.
    6  *
    7  * XMPPHP is free software; you can redistribute it and/or modify
    8  * it under the terms of the GNU General Public License as published by
    9  * the Free Software Foundation; either version 2 of the License, or
    10  * (at your option) any later version.
    11  *
    12  * XMPPHP is distributed in the hope that it will be useful,
    13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    15  * GNU General Public License for more details.
    16  *
    17  * You should have received a copy of the GNU General Public License
    18  * along with XMPPHP; if not, write to the Free Software
    19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    20  *
    21  * @category   xmpphp
    22  * @package     XMPPHP
    23  * @author       Nathanael C. Fritz <JID: fritzy@netflint.net>
    24  * @author       Stephan Wentz <JID: stephan@jabber.wentz.it>
    25  * @author       Michael Garvin <JID: gar@netflint.net>
    26  * @copyright  2008 Nathanael C. Fritz
    27  */
     1<?php
     2
     3namespace XMPPHP;
     4
     5        /**
     6         * XMPPHP: The PHP XMPP Library
     7         * Copyright (C) 2008  Nathanael C. Fritz
     8         * This file is part of SleekXMPP.
     9         *
     10         * XMPPHP is free software; you can redistribute it and/or modify
     11         * it under the terms of the GNU General Public License as published by
     12         * the Free Software Foundation; either version 2 of the License, or
     13         * (at your option) any later version.
     14         *
     15         * XMPPHP is distributed in the hope that it will be useful,
     16         * but WITHOUT ANY WARRANTY; without even the implied warranty of
     17         * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18         * GNU General Public License for more details.
     19         *
     20         * You should have received a copy of the GNU General Public License
     21         * along with XMPPHP; if not, write to the Free Software
     22         * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     23         *
     24         * @category   xmpphp
     25         * @package    XMPPHP
     26         * @author     Nathanael C. Fritz <JID: fritzy@netflint.net>
     27         * @author     Stephan Wentz <JID: stephan@jabber.wentz.it>
     28         * @author     Michael Garvin <JID: gar@netflint.net>
     29         * @author     Alexander Birkner (https://github.com/BirknerAlex)
     30         * @copyright  2008 Nathanael C. Fritz
     31         */
    2832
    2933/**
    30  * XMPPHP XML Object
    31  * 
    32  * @category   xmpphp 
    33  * @package     XMPPHP
    34  * @author      Nathanael C. Fritz <JID: fritzy@netflint.net>
    35  * @author      Stephan Wentz <JID: stephan@jabber.wentz.it>
    36  * @author      Michael Garvin <JID: gar@netflint.net>
     34 * XMPPHP Main Class
     35 *
     36 * @category   xmpphp
     37 * @package    XMPPHP
     38 * @author    Nathanael C. Fritz <JID: fritzy@netflint.net>
     39 * @author    Stephan Wentz <JID: stephan@jabber.wentz.it>
     40 * @author    Michael Garvin <JID: gar@netflint.net>
    3741 * @copyright  2008 Nathanael C. Fritz
    38  * @version     $Id$
     42 * @version    $Id$
    3943 */
    40 class XMPPHP_XMLObj {
     44class XMLObj {
    4145        /**
    4246         * Tag name
  • trunk/common/XMPPHP/XMLStream.php

    r547 r962  
    11<?php
     2
     3namespace XMPPHP;
     4
     5        /**
     6         * XMPPHP: The PHP XMPP Library
     7         * Copyright (C) 2008  Nathanael C. Fritz
     8         * This file is part of SleekXMPP.
     9         *
     10         * XMPPHP is free software; you can redistribute it and/or modify
     11         * it under the terms of the GNU General Public License as published by
     12         * the Free Software Foundation; either version 2 of the License, or
     13         * (at your option) any later version.
     14         *
     15         * XMPPHP is distributed in the hope that it will be useful,
     16         * but WITHOUT ANY WARRANTY; without even the implied warranty of
     17         * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18         * GNU General Public License for more details.
     19         *
     20         * You should have received a copy of the GNU General Public License
     21         * along with XMPPHP; if not, write to the Free Software
     22         * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     23         *
     24         * @category   xmpphp
     25         * @package    XMPPHP
     26         * @author     Nathanael C. Fritz <JID: fritzy@netflint.net>
     27         * @author     Stephan Wentz <JID: stephan@jabber.wentz.it>
     28         * @author     Michael Garvin <JID: gar@netflint.net>
     29         * @author     Alexander Birkner (https://github.com/BirknerAlex)
     30         * @copyright  2008 Nathanael C. Fritz
     31         */
     32
    233/**
    3  * XMPPHP: The PHP XMPP Library
    4  * Copyright (C) 2008  Nathanael C. Fritz
    5  * This file is part of SleekXMPP.
    6  *
    7  * XMPPHP is free software; you can redistribute it and/or modify
    8  * it under the terms of the GNU General Public License as published by
    9  * the Free Software Foundation; either version 2 of the License, or
    10  * (at your option) any later version.
    11  *
    12  * XMPPHP is distributed in the hope that it will be useful,
    13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    15  * GNU General Public License for more details.
    16  *
    17  * You should have received a copy of the GNU General Public License
    18  * along with XMPPHP; if not, write to the Free Software
    19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     34 * XMPPHP Main Class
    2035 *
    2136 * @category   xmpphp
    22  * @package     XMPPHP
    23  * @author      Nathanael C. Fritz <JID: fritzy@netflint.net>
    24  * @author      Stephan Wentz <JID: stephan@jabber.wentz.it>
    25  * @author      Michael Garvin <JID: gar@netflint.net>
     37 * @package    XMPPHP
     38 * @author    Nathanael C. Fritz <JID: fritzy@netflint.net>
     39 * @author    Stephan Wentz <JID: stephan@jabber.wentz.it>
     40 * @author    Michael Garvin <JID: gar@netflint.net>
    2641 * @copyright  2008 Nathanael C. Fritz
     42 * @version    $Id$
    2743 */
    28 
    29 /** XMPPHP_Exception */
    30 require_once 'Exception.php';
    31 
    32 /** XMPPHP_XMLObj */
    33 require_once 'XMLObj.php';
    34 
    35 /** XMPPHP_Log */
    36 
    37 require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'Log.php'; // BUG: по относительному пути не подключает файл и не бросает ошибку
    38 
    39 /**
    40  * XMPPHP XML Stream
    41  *
    42  * @category   xmpphp
    43  * @package     XMPPHP
    44  * @author       Nathanael C. Fritz <JID: fritzy@netflint.net>
    45  * @author       Stephan Wentz <JID: stephan@jabber.wentz.it>
    46  * @author       Michael Garvin <JID: gar@netflint.net>
    47  * @copyright  2008 Nathanael C. Fritz
    48  * @version     $Id$
    49  */
    50 class XMPPHP_XMLStream {
     44class XMLStream {
    5145        /**
    5246         * @var resource
     
    8478         * @var boolean
    8579         */
    86         protected $disconnected = false;
     80        protected $disconnected = true;
    8781        /**
    8882         * @var boolean
     
    126120        protected $default_ns;
    127121        /**
    128          * @var string
    129          */
    130         protected $until = '';
    131         /**
    132          * @var string
    133          */
    134         protected $until_count = '';
     122         * @var string[]
     123         */
     124        protected $until = array();
     125        /**
     126         * @var int[]
     127         */
     128        protected $until_count = array();
    135129        /**
    136130         * @var array
     
    142136        protected $until_payload = array();
    143137        /**
    144          * @var XMPPHP_Log
     138         * @var Log
    145139         */
    146140        protected $log;
     
    185179                $this->port = $port;
    186180                $this->setupParser();
    187                 $this->log = new XMPPHP_Log($printlog, $loglevel);
     181                $this->log = new Log($printlog, $loglevel);
    188182        }
    189183
     
    197191                }
    198192        }
    199 
     193       
    200194        /**
    201195         * Return the log instance
    202196         *
    203          * @return XMPPHP_Log
     197         * @return Log
    204198         */
    205199        public function getLog() {
    206200                return $this->log;
    207201        }
    208 
     202       
    209203        /**
    210204         * Get next ID
     
    265259                }
    266260                foreach($ns_tags as $ns_tag) {
    267                         list($l, $r) = explode("}", $ns_tag);
     261                        list($l, $r) = explode('}', $ns_tag);
    268262                        if ($r != null) {
    269263                                $xpart = array(substr($l, 1), $r);
     
    290284         * Connect to XMPP Host
    291285         *
    292          * @param integer $timeout
     286         * @param integer $timeout    Timeout in seconds
    293287         * @param boolean $persistent
    294          * @param boolean $sendinit
     288         * @param boolean $sendinit   Send XMPP starting sequence after connect
     289         *                            automatically
     290         *
     291         * @throws Exception When the connection fails
    295292         */
    296293        public function connect($timeout = 30, $persistent = false, $sendinit = true) {
    297294                $this->sent_disconnect = false;
    298295                $starttime = time();
    299 
     296               
    300297                do {
    301298                        $this->disconnected = false;
     
    312309                                $this->socket = @stream_socket_client("$conntype://{$this->host}:{$this->port}", $errno, $errstr, $timeout, $conflag);
    313310                        } catch (Exception $e) {
    314                                 throw new XMPPHP_Exception($e->getMessage());
     311                                throw new Exception($e->getMessage());
    315312                        }
    316313                        if(!$this->socket) {
    317                                 $this->log->log("Could not connect.",  XMPPHP_Log::LEVEL_ERROR);
     314                                $this->log->log("Could not connect.",  Log::LEVEL_ERROR);
    318315                                $this->disconnected = true;
    319316                                # Take it easy for a few seconds
     
    321318                        }
    322319                } while (!$this->socket && (time() - $starttime) < $timeout);
    323 
     320               
    324321                if ($this->socket) {
    325322                        stream_set_blocking($this->socket, 1);
    326323                        if($sendinit) $this->send($this->stream_start);
    327324                } else {
    328                         throw new XMPPHP_Exception("Could not connect before timeout.");
     325                        throw new Exception("Could not connect before timeout.");
    329326                }
    330327        }
     
    332329        /**
    333330         * Reconnect XMPP Host
     331         *
     332         * @throws Exception When the connection fails
     333         * @uses   $reconnectTimeout
     334         * @see    setReconnectTimeout()
    334335         */
    335336        public function doReconnect() {
    336337                if(!$this->is_server) {
    337                         $this->log->log("Reconnecting ($this->reconnectTimeout)...",  XMPPHP_Log::LEVEL_WARNING);
     338                        $this->log->log("Reconnecting ($this->reconnectTimeout)...",  Log::LEVEL_WARNING);
    338339                        $this->connect($this->reconnectTimeout, false, false);
    339340                        $this->reset();
     
    345346                $this->reconnectTimeout = $timeout;
    346347        }
    347 
     348       
    348349        /**
    349350         * Disconnect from XMPP Host
    350351         */
    351352        public function disconnect() {
    352                 $this->log->log("Disconnecting...",  XMPPHP_Log::LEVEL_VERBOSE);
     353                $this->log->log("Disconnecting...",  Log::LEVEL_VERBOSE);
    353354                if(false == (bool) $this->socket) {
    354355                        return;
     
    371372
    372373        /**
     374         * Checks if the given string is closed with the same tag as it is
     375         * opened. We try to be as fast as possible here.
     376         *
     377         * @param string $buff Read buffer of __process()
     378         *
     379         * @return boolean true if the buffer seems to be complete
     380         */
     381        protected function bufferComplete($buff)
     382        {
     383                if (substr($buff, -1) != '>') {
     384                        return false;
     385                }
     386                //we always have a space since the namespace needs to be
     387                //declared. could be a tab, though
     388                $start = substr(
     389                        $buff, 1,
     390                        min(strpos($buff, '>', 2), strpos($buff, ' ', 2)) - 1
     391                );
     392                $stop  = substr($buff, -strlen($start) - 3);
     393
     394                if ($start == '?xml') {
     395                        //starting with an xml tag. this means a stream is being
     396                        // opened, which is not much of data, so no fear it's
     397                        // not complete
     398                        return true;
     399                }
     400                if (substr($stop, -2) == '/>') {
     401                        //one tag, i.e. <success />
     402                        return true;
     403                }
     404                if ('</' . $start . '>' == $stop) {
     405                        return true;
     406                }
     407
     408                return false;
     409        }
     410
     411        /**
    373412         * Core reading tool
    374          * 0 -> only read if data is immediately ready
    375          * NULL -> wait forever and ever
    376          * integer -> process for this amount of time
    377          */
    378 
    379         private function __process($maximum=0) {
    380 
     413         *
     414         * @param mixed   $maximum Limit when to return
     415         *                         - 0: only read if data is immediately ready
     416         *                         - NULL: wait forever and ever
     417         *                         - integer: process for this amount of microseconds
     418         * @param boolean $return_when_received Immediately return when data have been
     419         *                                      received
     420         *
     421         * @return boolean True when all goes well, false when something fails
     422         */
     423        private function __process($maximum = 5, $return_when_received = false)
     424        {
    381425                $remaining = $maximum;
    382 
     426               
    383427                do {
    384428                        $starttime = (microtime(true) * 1000000);
     
    398442                        $updated = @stream_select($read, $write, $except, $secs, $usecs);
    399443                        if ($updated === false) {
    400                                 $this->log->log("Error on stream_select()",  XMPPHP_Log::LEVEL_VERBOSE);
     444                                $this->log->log("Error on stream_select()",  Log::LEVEL_VERBOSE);
    401445                                if ($this->reconnect) {
    402446                                        $this->doReconnect();
     
    407451                                }
    408452                        } else if ($updated > 0) {
    409                                 # XXX: Is this big enough?
    410                                 $buff = @fread($this->socket, 4096);
    411                                 if(!$buff) {
    412                                         if($this->reconnect) {
    413                                                 $this->doReconnect();
    414                                         } else {
    415                                                 fclose($this->socket);
    416                                                 $this->socket = NULL;
    417                                                 return false;
     453                                $buff = '';
     454                                do {
     455                                        if ($buff != '') {
     456                                                //disable blocking for now because fread() will
     457                                                // block until the 4k are full if we already
     458                                                // read a part of the packet
     459                                                stream_set_blocking($this->socket, 0);
    418460                                        }
    419                                 }
    420                                 $this->log->log("RECV: $buff",  XMPPHP_Log::LEVEL_VERBOSE);
     461                                        $part = fread($this->socket, 4096);
     462                                        stream_set_blocking($this->socket, 1);
     463
     464                                        if (!$part) {
     465                                                if($this->reconnect) {
     466                                                        $this->doReconnect();
     467                                                } else {
     468                                                        fclose($this->socket);
     469                                                        $this->socket = NULL;
     470                                                        return false;
     471                                                }
     472                                        }
     473                                        $this->log->log("RECV: $part",  Log::LEVEL_VERBOSE);
     474                                        $buff .= $part;
     475                                } while (!$this->bufferComplete($buff));
     476
    421477                                xml_parse($this->parser, $buff, false);
     478                                if ($return_when_received) {
     479                                        return true;
     480                                }
    422481                        } else {
    423482                                # $updated == 0 means no changes during timeout.
     
    429488                return true;
    430489        }
    431 
     490       
    432491        /**
    433492         * Process
     
    442501         * Process until a timeout occurs
    443502         *
    444          * @param integer $timeout
     503         * @param integer $timeout Time in seconds
     504         *
    445505         * @return string
     506         *
     507         * @see __process()
    446508         */
    447509        public function processTime($timeout=NULL) {
     
    456518         * Process until a specified event or a timeout occurs
    457519         *
    458          * @param string|array $event
    459          * @param integer $timeout
    460          * @return string
    461          */
    462         public function processUntil($event, $timeout=-1) {
     520         * @param string|array $event   Event name or array of event names
     521         * @param integer      $timeout Timeout in seconds
     522         *
     523         * @return array Payload
     524         */
     525        public function processUntil($event, $timeout = -1)
     526        {
     527                if ($this->disconnected) {
     528                        throw new Exception('You need to connect first');
     529                }
     530
    463531                $start = time();
    464                 if(!is_array($event)) $event = array($event);
     532                if (!is_array($event)) {
     533                        $event = array($event);
     534                }
     535
    465536                $this->until[] = $event;
    466537                end($this->until);
    467538                $event_key = key($this->until);
    468539                reset($this->until);
     540
    469541                $this->until_count[$event_key] = 0;
    470542                $updated = '';
    471                 while(!$this->disconnected and $this->until_count[$event_key] < 1 and (time() - $start < $timeout or $timeout == -1)) {
    472                         $this->__process();
    473                 }
    474                 if(array_key_exists($event_key, $this->until_payload)) {
     543                while (!$this->disconnected
     544                        && $this->until_count[$event_key] < 1
     545                        && ($timeout == -1 || time() - $start < $timeout)
     546                ) {
     547                        $maximum = $timeout == -1
     548                                ? NULL
     549                                : ($timeout - (time() - $start)) * 1000000;
     550                        $ret = $this->__process($maximum, true);
     551                        if (!$ret) {
     552                                break;
     553                        }
     554                }
     555
     556                if (array_key_exists($event_key, $this->until_payload)) {
    475557                        $payload = $this->until_payload[$event_key];
    476558                        unset($this->until_payload[$event_key]);
     
    480562                        $payload = array();
    481563                }
     564
    482565                return $payload;
    483566        }
     
    492575        /**
    493576         * XML start callback
    494          *
     577         * 
    495578         * @see xml_set_element_handler
    496579         *
     
    524607                        $name = $name[1];
    525608                }
    526                 $obj = new XMPPHP_XMLObj($name, $ns, $attr);
     609                $obj = new XMLObj($name, $ns, $attr);
    527610                if($this->xml_depth > 1) {
    528611                        $this->xmlobj[$this->xml_depth - 1]->subs[] = $obj;
     
    533616        /**
    534617         * XML end callback
    535          *
     618         * 
    536619         * @see xml_set_element_handler
    537620         *
     
    540623         */
    541624        public function endXML($parser, $name) {
    542                 #$this->log->log("Ending $name",  XMPPHP_Log::LEVEL_DEBUG);
     625                #$this->log->log("Ending $name",  Log::LEVEL_DEBUG);
    543626                #print "$name\n";
    544627                if($this->been_reset) {
     
    565648                                                if ($searchxml !== null) {
    566649                                                        if($handler[2] === null) $handler[2] = $this;
    567                                                         $this->log->log("Calling {$handler[1]}",  XMPPHP_Log::LEVEL_DEBUG);
    568                                                         $handler[2]->$handler[1]($this->xmlobj[2]);
     650                                                        $this->log->log("Calling {$handler[1]}",  Log::LEVEL_DEBUG);
     651                                                        $handler[2]->{$handler[1]}($this->xmlobj[2]);
    569652                                                }
    570653                                        }
     
    579662                                if($searchxml !== null and $searchxml->name == $handler[0] and ($searchxml->ns == $handler[1] or (!$handler[1] and $searchxml->ns == $this->default_ns))) {
    580663                                        if($handler[3] === null) $handler[3] = $this;
    581                                         $this->log->log("Calling {$handler[2]}",  XMPPHP_Log::LEVEL_DEBUG);
    582                                         $handler[3]->$handler[2]($this->xmlobj[2]);
     664                                        $this->log->log("Calling {$handler[2]}",  Log::LEVEL_DEBUG);
     665                                        $handler[3]->{$handler[2]}($this->xmlobj[2]);
    583666                                }
    584667                        }
     
    586669                                if(array_key_exists('id', $this->xmlobj[2]->attrs) and $this->xmlobj[2]->attrs['id'] == $id) {
    587670                                        if($handler[1] === null) $handler[1] = $this;
    588                                         $handler[1]->$handler[0]($this->xmlobj[2]);
     671                                        $handler[1]->{$handler[0]}($this->xmlobj[2]);
    589672                                        #id handlers are only used once
    590673                                        unset($this->idhandlers[$id]);
     
    594677                        if(is_array($this->xmlobj)) {
    595678                                $this->xmlobj = array_slice($this->xmlobj, 0, 1);
    596                                 if(isset($this->xmlobj[0]) && $this->xmlobj[0] instanceof XMPPHP_XMLObj) {
     679                                if(isset($this->xmlobj[0]) && $this->xmlobj[0] instanceof XMLObj) {
    597680                                        $this->xmlobj[0]->subs = null;
    598681                                }
     
    636719         */
    637720        public function event($name, $payload = null) {
    638                 $this->log->log("EVENT: $name",  XMPPHP_Log::LEVEL_DEBUG);
     721                $this->log->log("EVENT: $name",  Log::LEVEL_DEBUG);
    639722                foreach($this->eventhandlers as $handler) {
    640723                        if($name == $handler[0]) {
     
    642725                                        $handler[2] = $this;
    643726                                }
    644                                 $handler[2]->$handler[1]($payload);
    645                         }
    646                 }
     727                                $handler[2]->{$handler[1]}($payload);
     728                        }
     729                }
     730
    647731                foreach($this->until as $key => $until) {
    648732                        if(is_array($until)) {
     
    664748        public function read() {
    665749                $buff = @fread($this->socket, 1024);
    666                 if(!$buff) {
     750                if(!$buff) { 
    667751                        if($this->reconnect) {
    668752                                $this->doReconnect();
     
    672756                        }
    673757                }
    674                 $this->log->log("RECV: $buff",  XMPPHP_Log::LEVEL_VERBOSE);
     758                $this->log->log("RECV: $buff",  Log::LEVEL_VERBOSE);
    675759                xml_parse($this->parser, $buff, false);
    676760        }
     
    694778                        $secs = floor(($maximum - $usecs) / 1000000);
    695779                }
    696 
     780               
    697781                $read = array();
    698782                $write = array($this->socket);
    699783                $except = array();
    700 
     784               
    701785                $select = @stream_select($read, $write, $except, $secs, $usecs);
    702 
     786               
    703787                if($select === False) {
    704788                        $this->log->log("ERROR sending message; reconnecting.");
     
    707791                        return false;
    708792                } elseif ($select > 0) {
    709                         $this->log->log("Socket is ready; send it.", XMPPHP_Log::LEVEL_VERBOSE);
     793                        $this->log->log("Socket is ready; send it.", Log::LEVEL_VERBOSE);
    710794                } else {
    711                         $this->log->log("Socket is not ready; break.", XMPPHP_Log::LEVEL_ERROR);
     795                        $this->log->log("Socket is not ready; break.", Log::LEVEL_ERROR);
    712796                        return false;
    713797                }
    714 
     798               
    715799                $sentbytes = @fwrite($this->socket, $msg);
    716                 $this->log->log("SENT: " . mb_substr($msg, 0, $sentbytes, '8bit'), XMPPHP_Log::LEVEL_VERBOSE);
     800                $this->log->log("SENT: " . mb_substr($msg, 0, $sentbytes, '8bit'), Log::LEVEL_VERBOSE);
    717801                if($sentbytes === FALSE) {
    718                         $this->log->log("ERROR sending message; reconnecting.", XMPPHP_Log::LEVEL_ERROR);
     802                        $this->log->log("ERROR sending message; reconnecting.", Log::LEVEL_ERROR);
    719803                        $this->doReconnect();
    720804                        return false;
    721805                }
    722                 $this->log->log("Successfully sent $sentbytes bytes.", XMPPHP_Log::LEVEL_VERBOSE);
     806                $this->log->log("Successfully sent $sentbytes bytes.", Log::LEVEL_VERBOSE);
    723807                return $sentbytes;
    724808        }
  • trunk/common/XMPPHP/XMPP.php

    r2 r962  
    11<?php
    2 /**
    3  * XMPPHP: The PHP XMPP Library
    4  * Copyright (C) 2008  Nathanael C. Fritz
    5  * This file is part of SleekXMPP.
    6  *
    7  * XMPPHP is free software; you can redistribute it and/or modify
    8  * it under the terms of the GNU General Public License as published by
    9  * the Free Software Foundation; either version 2 of the License, or
    10  * (at your option) any later version.
    11  *
    12  * XMPPHP is distributed in the hope that it will be useful,
    13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    15  * GNU General Public License for more details.
    16  *
    17  * You should have received a copy of the GNU General Public License
    18  * along with XMPPHP; if not, write to the Free Software
    19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    20  *
    21  * @category   xmpphp
    22  * @package     XMPPHP
    23  * @author       Nathanael C. Fritz <JID: fritzy@netflint.net>
    24  * @author       Stephan Wentz <JID: stephan@jabber.wentz.it>
    25  * @author       Michael Garvin <JID: gar@netflint.net>
    26  * @copyright  2008 Nathanael C. Fritz
    27  */
    28 
    29 /** XMPPHP_XMLStream */
    30 require_once "XMLStream.php";
    31 require_once "Roster.php";
     2
     3namespace XMPPHP;
     4
     5        /**
     6         * XMPPHP: The PHP XMPP Library
     7         * Copyright (C) 2008  Nathanael C. Fritz
     8         * This file is part of SleekXMPP.
     9         *
     10         * XMPPHP is free software; you can redistribute it and/or modify
     11         * it under the terms of the GNU General Public License as published by
     12         * the Free Software Foundation; either version 2 of the License, or
     13         * (at your option) any later version.
     14         *
     15         * XMPPHP is distributed in the hope that it will be useful,
     16         * but WITHOUT ANY WARRANTY; without even the implied warranty of
     17         * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18         * GNU General Public License for more details.
     19         *
     20         * You should have received a copy of the GNU General Public License
     21         * along with XMPPHP; if not, write to the Free Software
     22         * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     23         *
     24         * @category   xmpphp
     25         * @package    XMPPHP
     26         * @author     Nathanael C. Fritz <JID: fritzy@netflint.net>
     27         * @author     Stephan Wentz <JID: stephan@jabber.wentz.it>
     28         * @author     Michael Garvin <JID: gar@netflint.net>
     29         * @author     Alexander Birkner (https://github.com/BirknerAlex)
     30         * @copyright  2008 Nathanael C. Fritz
     31         */
    3232
    3333/**
    3434 * XMPPHP Main Class
    35  * 
    36  * @category   xmpphp 
    37  * @package     XMPPHP
    38  * @author      Nathanael C. Fritz <JID: fritzy@netflint.net>
    39  * @author      Stephan Wentz <JID: stephan@jabber.wentz.it>
    40  * @author      Michael Garvin <JID: gar@netflint.net>
     35 *
     36 * @category   xmpphp
     37 * @package    XMPPHP
     38 * @author    Nathanael C. Fritz <JID: fritzy@netflint.net>
     39 * @author    Stephan Wentz <JID: stephan@jabber.wentz.it>
     40 * @author    Michael Garvin <JID: gar@netflint.net>
    4141 * @copyright  2008 Nathanael C. Fritz
    42  * @version     $Id$
     42 * @version    $Id$
    4343 */
    44 class XMPPHP_XMPP extends XMPPHP_XMLStream {
    45         /**
    46          * @var string
    47          */
    48         protected $server;
    49 
    50         /**
    51          * @var string
    52          */
    53         protected $user;
     44class XMPP extends XMLStream {
     45        /**
     46         * @var string
     47         */
     48        public $server;
     49
     50        /**
     51         * @var string
     52         */
     53        public $user;
    5454       
    5555        /**
     
    163163         */
    164164        public function message($to, $body, $type = 'chat', $subject = null, $payload = null) {
    165             if(is_null($type))
    166             {
     165                if ($this->disconnected) {
     166                        throw new Exception('You need to connect first');
     167                }
     168
     169            if(empty($type)) {
    167170                $type = 'chat';
    168171            }
    169            
     172
    170173                $to       = htmlspecialchars($to);
    171174                $body   = htmlspecialchars($body);
    172175                $subject = htmlspecialchars($subject);
    173176               
    174                 $out = "<message from='{$this->fulljid}' to='$to' type='$type'>";
     177                $out = "<message from=\"{$this->fulljid}\" to=\"$to\" type='$type'>";
    175178                if($subject) $out .= "<subject>$subject</subject>";
    176179                $out .= "<body>$body</body>";
     
    188191         * @param string $to
    189192         */
    190         public function presence($status = null, $show = 'available', $to = null, $type='available') {
     193        public function presence($status = null, $show = 'available', $to = null, $type='available', $priority=null) {
     194                if ($this->disconnected) {
     195                        throw new Exception('You need to connect first');
     196                }
     197
    191198                if($type == 'available') $type = '';
    192199                $to      = htmlspecialchars($to);
     
    195202               
    196203                $out = "<presence";
    197                 if($to) $out .= " to='$to'";
     204                if($to) $out .= " to=\"$to\"";
    198205                if($type) $out .= " type='$type'";
    199                 if($show == 'available' and !$status) {
     206                if($show == 'available' and !$status and $priority !== null) {
    200207                        $out .= "/>";
    201208                } else {
     
    203210                        if($show != 'available') $out .= "<show>$show</show>";
    204211                        if($status) $out .= "<status>$status</status>";
     212                        if($priority !== null) $out .= "<priority>$priority</priority>";
    205213                        $out .= "</presence>";
    206214                }
    207215               
    208216                $this->send($out);
     217        }
     218        /**
     219         * Send Auth request
     220         *
     221         * @param string $jid
     222         */
     223        public function subscribe($jid) {
     224                $this->send("<presence type='subscribe' to='{$jid}' from='{$this->fulljid}' />");
     225                #$this->send("<presence type='subscribed' to='{$jid}' from='{$this->fulljid}' />");
    209226        }
    210227
     
    220237                        $payload['type'] = 'chat';
    221238                }
     239                $body = $xml->sub('body');
    222240                $payload['from'] = $xml->attrs['from'];
    223                 $payload['body'] = $xml->sub('body')->data;
    224                 $this->log->log("Message: {$xml->sub('body')->data}", XMPPHP_Log::LEVEL_DEBUG);
     241                $payload['body'] = is_object($body) ? $body->data : FALSE; // $xml->sub('body')->data;
     242                $payload['xml'] = $xml;
     243                $this->log->log("Message: {$payload['body']}", Log::LEVEL_DEBUG);
    225244                $this->event('message', $payload);
    226245        }
     
    237256                $payload['status'] = (isset($xml->sub('status')->data)) ? $xml->sub('status')->data : '';
    238257                $payload['priority'] = (isset($xml->sub('priority')->data)) ? intval($xml->sub('priority')->data) : 0;
     258                $payload['xml'] = $xml;
    239259                if($this->track_presence) {
    240260                        $this->roster->setPresence($payload['from'], $payload['priority'], $payload['show'], $payload['status']);
    241261                }
    242                 $this->log->log("Presence: {$payload['from']} [{$payload['show']}] {$payload['status']}",  XMPPHP_Log::LEVEL_DEBUG);
     262                $this->log->log("Presence: {$payload['from']} [{$payload['show']}] {$payload['status']}",  Log::LEVEL_DEBUG);
    243263                if(array_key_exists('type', $xml->attrs) and $xml->attrs['type'] == 'subscribe') {
    244264                        if($this->auto_subscribe) {
     
    293313         */
    294314        protected function sasl_failure_handler($xml) {
    295                 $this->log->log("Auth failed!",  XMPPHP_Log::LEVEL_ERROR);
     315                $this->log->log("Auth failed!",  Log::LEVEL_ERROR);
    296316                $this->disconnect();
    297317               
    298                 throw new XMPPHP_Exception('Auth failed!');
     318                throw new Exception('Auth failed!');
    299319        }
    300320
     
    381401                $this->reset();
    382402        }
     403
     404        /**
     405        * Retrieves the vcard
     406        *
     407        */
     408        public function getVCard($jid = Null) {
     409                $id = $this->getID();
     410                $this->addIdHandler($id, 'vcard_get_handler');
     411                if($jid) {
     412                        $this->send("<iq type='get' id='$id' to='$jid'><vCard xmlns='vcard-temp' /></iq>");
     413                } else {
     414                        $this->send("<iq type='get' id='$id'><vCard xmlns='vcard-temp' /></iq>");
     415                }
     416        }
     417
     418        /**
     419        * VCard retrieval handler
     420        *
     421        * @param XML Object $xml
     422        */
     423        protected function vcard_get_handler($xml) {
     424                $vcard_array = array();
     425                $vcard = $xml->sub('vcard');
     426                // go through all of the sub elements and add them to the vcard array
     427                foreach ($vcard->subs as $sub) {
     428                        if ($sub->subs) {
     429                                $vcard_array[$sub->name] = array();
     430                                foreach ($sub->subs as $sub_child) {
     431                                        $vcard_array[$sub->name][$sub_child->name] = $sub_child->data;
     432                                }
     433                        } else {
     434                                $vcard_array[$sub->name] = $sub->data;
     435                        }
     436                }
     437                $vcard_array['from'] = $xml->attrs['from'];
     438                $this->event('vcard', $vcard_array);
     439        }
    383440}
  • trunk/common/actions/respdebtnotify.php

    r958 r962  
    6868
    6969        if (\cfg::get('xmpp', 'host')) {
    70             $xmppclient = new \XMPPHP_XMPP(\cfg::get('xmpp', 'host'), \cfg::get('xmpp', 'port'), \cfg::get('xmpp','login'), \cfg::get('xmpp','pass')
     70            $xmppclient = new \XMPPHP\XMPP(\cfg::get('xmpp', 'host'), \cfg::get('xmpp', 'port'), \cfg::get('xmpp','login'), \cfg::get('xmpp','pass')
    7171                , 'MultiMag r' . MULTIMAG_REV .','. get_class($this));
    7272        }
  • trunk/common/core.common.php

    r958 r962  
    2626function common_autoload($class_name) {
    2727    global $CONFIG;
    28     $class_name = strtolower($class_name);
     28    $class_name_lc = strtolower($class_name);
     29    $class_name_lc = str_replace('\\', '/', $class_name_lc);
    2930    $class_name = str_replace('\\', '/', $class_name);
     31    $file = $CONFIG['location'] . "/common/" . $class_name_lc . '.php';
     32    if(file_exists($file)) {
     33        include_once $CONFIG['location'] . "/common/" . $class_name_lc . '.php';
     34    }
    3035    $file = $CONFIG['location'] . "/common/" . $class_name . '.php';
    3136    if(file_exists($file)) {
     
    144149        try {
    145150            require_once($CONFIG['location'] . '/common/XMPPHP/XMPP.php');
    146             $xmppclient = new XMPPHP_XMPP($CONFIG['xmpp']['host'], $CONFIG['xmpp']['port'], $CONFIG['xmpp']['login'], $CONFIG['xmpp']['pass'], 'MultiMag r'.MULTIMAG_REV);
     151            $xmppclient = new \XMPPHP\XMPP($CONFIG['xmpp']['host'], $CONFIG['xmpp']['port'], $CONFIG['xmpp']['login'], $CONFIG['xmpp']['pass'], 'MultiMag r'.MULTIMAG_REV);
    147152            $xmppclient->connect();
    148153            $xmppclient->processUntil('session_start');
     
    150155            $xmppclient->message($CONFIG['site']['doc_adm_jid'], $text);
    151156            $xmppclient->disconnect();
    152         } catch (XMPPHP_Exception $e) {
     157        } catch (\XMPPHP\Exception $e) {
    153158            writeLogException($e);
    154159            $tmpl->errorMessage("Невозможно отправить сообщение по XMPP!");
  • trunk/web/include/doc.nulltype.php

    r958 r962  
    482482        if (count($addresses) > 0) {
    483483            require_once($CONFIG['location'] . '/common/XMPPHP/XMPP.php');
    484             $xmppclient = new XMPPHP_XMPP($CONFIG['xmpp']['host'], $CONFIG['xmpp']['port'], $CONFIG['xmpp']['login'], $CONFIG['xmpp']['pass'], 'MultiMag r' . MULTIMAG_REV);
     484            $xmppclient = new \XMPPHP\XMPP($CONFIG['xmpp']['host'], $CONFIG['xmpp']['port'], $CONFIG['xmpp']['login'], $CONFIG['xmpp']['pass'], 'MultiMag r' . MULTIMAG_REV);
    485485            $xmppclient->connect();
    486486            $xmppclient->processUntil('session_start');
     
    14011401            if (\cfg::get('site', 'doc_adm_jid') && \cfg::get('xmpp', 'host')) {
    14021402                require_once(\cfg::getroot('location') . '/common/XMPPHP/XMPP.php');
    1403                 $xmppclient = new \XMPPHP_XMPP(\cfg::get('xmpp', 'host'), \cfg::get('xmpp', 'port'), \cfg::get('xmpp', 'login'), \cfg::get('xmpp', 'pass')
     1403                $xmppclient = new \XMPPHP\XMPP(\cfg::get('xmpp', 'host'), \cfg::get('xmpp', 'port'), \cfg::get('xmpp', 'login'), \cfg::get('xmpp', 'pass')
    14041404                    , 'MultiMag r' . MULTIMAG_REV);
    14051405                $xmppclient->connect();
     
    14101410            }
    14111411            $ret['message'] = "Сообщение было отправлено уполномоченному лицу! Ответ о снятии проводки придёт вам на e-mail!";
    1412         } catch (XMPPHP_Exception $e) {
     1412        } catch (\XMPPHP\Exception $e) {
    14131413            writeLogException($e);
    14141414            $ret = array('object' => 'send_petition', 'response' => 'error',
  • trunk/web/include/doc.zayavka.php

    r958 r962  
    315315        if(count($addresses)>0) {
    316316            require_once(\cfg::getroot('location').'/common/XMPPHP/XMPP.php');
    317             $xmppclient = new XMPPHP_XMPP(
     317            $xmppclient = new \XMPPHP\XMPP(
    318318                \cfg::get('xmpp', 'host'), \cfg::get('xmpp', 'port'), \cfg::get('xmpp', 'login'), \cfg::get('xmpp', 'pass'), 'MultiMag r'.MULTIMAG_REV);
    319319            $xmppclient->connect();
  • trunk/web/include/modules/service/tickets.php

    r958 r962  
    545545            try {
    546546                require_once( \cfg::getroot('location') . '/common/XMPPHP/XMPP.php');
    547                 $xmppclient = new \XMPPHP_XMPP(\cfg::get('xmpp', 'host'), \cfg::get('xmpp', 'port'), \cfg::get('xmpp','login'), \cfg::get('xmpp','pass')
     547                $xmppclient = new \XMPPHP\XMPP(\cfg::get('xmpp', 'host'), \cfg::get('xmpp', 'port'), \cfg::get('xmpp','login'), \cfg::get('xmpp','pass')
    548548                    , 'MultiMag r' . MULTIMAG_REV);
    549549                $xmppclient->connect();
  • trunk/web/include/modules/site/message.php

    r961 r962  
    160160            try {
    161161                require_once(\cfg::getroot('location') . '/common/XMPPHP/XMPP.php');
    162                 $xmppclient = new \XMPPHP_XMPP(\cfg::get('xmpp', 'host'), \cfg::get('xmpp', 'port'), \cfg::get('xmpp','login'), \cfg::get('xmpp','pass')
     162                $xmppclient = new \XMPPHP\XMPP(\cfg::get('xmpp', 'host'), \cfg::get('xmpp', 'port'), \cfg::get('xmpp','login'), \cfg::get('xmpp','pass')
    163163                    , 'MultiMag r' . MULTIMAG_REV);
    164164                $xmppclient->connect();
     
    168168                $xmppclient->disconnect();
    169169                $tmpl->msg("Сообщение было отправлено!", "ok");
    170             } catch (XMPPHP_Exception $e) {
     170            } catch (\XMPPHP\Exception $e) {
    171171                writeLogException($e);
    172172                $tmpl->errorMessage("Невозможно отправить сообщение XMPP!");
     
    236236            if (\cfg::get('call_request', 'xmpp') && \cfg::get('xmpp', 'host')) {
    237237                require_once(\cfg::getroot('location') . '/common/XMPPHP/XMPP.php');
    238                 $xmppclient = new \XMPPHP_XMPP(\cfg::get('xmpp', 'host'), \cfg::get('xmpp', 'port'), \cfg::get('xmpp','login'), \cfg::get('xmpp','pass')
     238                $xmppclient = new \XMPPHP\_XMPP(\cfg::get('xmpp', 'host'), \cfg::get('xmpp', 'port'), \cfg::get('xmpp','login'), \cfg::get('xmpp','pass')
    239239                    , 'MultiMag r' . MULTIMAG_REV);
    240240                $xmppclient->connect();
  • trunk/web/include/modules/site/qa.php

    r958 r962  
    232232        if(@$user_data['dop']['jid']) {
    233233            require_once(\cfg::getroot('location').'/common/XMPPHP/XMPP.php');
    234             $xmppclient = new \XMPPHP_XMPP(
     234            $xmppclient = new \XMPPHP\XMPP(
    235235                \cfg::get('xmpp', 'host'), \cfg::get('xmpp', 'port'), \cfg::get('xmpp', 'login'), \cfg::get('xmpp', 'pass'), 'MultiMag r'.MULTIMAG_REV);
    236236            $xmppclient->connect();
  • trunk/web/vitrina.php

    r958 r962  
    20422042                try {
    20432043                    require_once($CONFIG['location'] . '/common/XMPPHP/XMPP.php');
    2044                     $xmppclient = new XMPPHP_XMPP($CONFIG['xmpp']['host'], $CONFIG['xmpp']['port'], $CONFIG['xmpp']['login'], $CONFIG['xmpp']['pass'], 'MultiMag r' . MULTIMAG_REV);
     2044                    $xmppclient = new \XMPPHP\XMPP($CONFIG['xmpp']['host'], $CONFIG['xmpp']['port'], $CONFIG['xmpp']['login'], $CONFIG['xmpp']['pass'], 'MultiMag r' . MULTIMAG_REV);
    20452045                    $xmppclient->connect();
    20462046                    $xmppclient->processUntil('session_start');
     
    20482048                    $xmppclient->message($pref->getSitePref('jid'), $text);
    20492049                    $xmppclient->disconnect();
    2050                 } catch (XMPPHP_Exception $e) {
     2050                } catch (\XMPPHP\Exception $e) {
    20512051                    writeLogException($e);
    20522052                    $tmpl->errorMessage("Невозможно отправить сообщение XMPP!", "err");
Note: See TracChangeset for help on using the changeset viewer.