public function createXMLStream()
{
$this->xml = new XMLStream();
$this->xml->setDefaultNS('jabber:client');
$this->xml->addXPathHandler('{http://etherx.jabber.org/streams}features', function ($xml) {
/** @var XMLStream $xml */
if ($xml->hasSub('starttls') and $this->use_encryption) {
$this->sendXML("<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'><required /></starttls>");
} elseif ($xml->hasSub('bind') and $this->authorized) {
$id = $this->getId();
$this->iqSet('<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>' . $this->path . '</resource></bind>', function ($xml) {
if ($xml->attrs['type'] === 'result') {
$this->fulljid = $xml->sub('bind')->sub('jid')->data;
$jidarray = explode('/', $this->fulljid);
$this->jid = $jidarray[0];
}
$this->iqSet('<session xmlns="urn:ietf:params:xml:ns:xmpp-session" />', function ($xml) {
$this->roster = new XMPPRoster($this);
if ($this->onConnected) {
$this->connected = true;
$this->onConnected->executeAll($this);
$this->onConnected = null;
}
$this->event('connected');
});
});
} else {
if (mb_orig_strlen($this->password)) {
$this->sendXML("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>" . base64_encode("" . $this->user . "" . $this->password) . "</auth>");
} else {
$this->sendXML("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='ANONYMOUS'/>");
}
}
});
$this->xml->addXPathHandler('{urn:ietf:params:xml:ns:xmpp-sasl}success', function ($xml) {
$this->authorized = true;
$this->xml->finish();
$this->createXMLStream();
$this->startXMLStream();
});
$this->xml->addXPathHandler('{urn:ietf:params:xml:ns:xmpp-sasl}failure', function ($xml) {
if ($this->onConnected) {
$this->connected = false;
$func = $this->onConnected;
$func($this);
$this->onConnected = null;
}
$this->finish();
});
$this->xml->addXPathHandler('{urn:ietf:params:xml:ns:xmpp-tls}proceed', function ($xml) {
Daemon::log("XMPPClient: TLS not supported.");
});
$this->xml->addXPathHandler('{jabber:client}message', function ($xml) {
if (isset($xml->attrs['type'])) {
$payload['type'] = $xml->attrs['type'];
} else {
$payload['type'] = 'chat';
}
$payload['xml'] = $xml;
$payload['from'] = $xml->attrs['from'];
if ($xml->hasSub('body')) {
$payload['body'] = $xml->sub('body')->data;
$this->event('message', $payload);
}
});
}