2012-10-25 10 views
5

Mam biblioteki dla transakcji XMPP używanych bibliotek jaxl:jaxl powrócić do funkcji, która nazywa się to z

class xmpp{ 

     public function register_user($username, $password){ 
      require_once 'JAXL/jaxl.php'; 

      $this->client = new JAXL(array(
       'jid' => 'localhost', 
       'log_level' => JAXL_ERROR 
      ));   
      $this->username = $username; 
      $this->password = $password; 

      $this->client->require_xep(array(
       '0077' // InBand Registration 
      ));  
      $thisClassObject =& $this; 

      $this->client->add_cb('on_stream_features', function($stanza) use(&$thisClassObject) { 
       $thisClassObject->client->xeps['0077']->get_form('localhost'); 
       return array($thisClassObject, 'wait_for_register_form'); 
      }); 

      $this->client->start();  

      return; 
     } 

     public function wait_for_register_response($event, $args) { 


      if($event == 'end_stream') { 
       return; 
      } 
      else if($event == 'stanza_cb') { 
       $stanza = $args[0]; 
       if($stanza->name == 'iq') { 
       if($stanza->attrs['type'] == 'result') { 
        echo "registration successful".PHP_EOL."shutting down...".PHP_EOL; 
        $this->client->end_stream(); 
        return 'logged_out'; 
       } 
       else if($stanza->attrs['type'] == 'error') { 
        $error = $stanza->exists('error'); 
        echo "registration failed with error code: ".$error->attrs['code']." and type: ".$error->attrs['type'].PHP_EOL; 
        echo "error text: ".$error->exists('text')->text.PHP_EOL; 
        echo "shutting down...".PHP_EOL; 
        $this->client->end_stream(); 
        return "logged_out"; 
       } 
      } 
     } 
    } 

     public function wait_for_register_form($event, $args) { 

      $stanza = $args[0]; 
      $query = $stanza->exists('query', NS_INBAND_REGISTER); 
      if($query) { 
       $form = array(); 
       $instructions = $query->exists('instructions'); 
       if($instructions) { 
       echo $instructions->text.PHP_EOL; 
      } 

      $this->client->xeps['0077']->set_form($stanza->attrs['from'], array('username' => $this->username, 'password' => $this->password)); 
      return array($this, "wait_for_register_response"); 
     } 
     else { 
      $this->client->end_stream(); 
      return "logged_out"; 
     } 
     }  
    } 

nich kod są takie same jak register_user.php, ale realizowanych w klasie;

użyć tej klasy w moim kodu w ten sposób:

$xmppObj = new xmpp(); 
$xmppObj('user','password'); 
/* 
some more code after this 
/* 

kiedy to wykonać, należy utworzyć użytkownika powodzeniem, ale to print („Rejestracja sukces ...”), a aplikacja wyszła wiadomość i nie robi” t wykonać "jakiś kod po tym" po funkcji klasy, w innym słowie nie podąża za kodem ...

Co mogę zrobić, aby rozwiązać ten problem, osoba może mi pomóc, że zna bibliotekę JAXL .

Odpowiedz

1

Wygląda na to, że używasz tego samego kodu, co w wersji examples/register_user.php. Po rejestracji użytkownik jest udany, skrypt zamyka XMPPStream jak wynika z tej części kodu:

if($stanza->attrs['type'] == 'result') { 
    echo "registration successful".PHP_EOL."shutting down...".PHP_EOL; 
    $this->client->end_stream(); 
    return 'logged_out'; 
} 

MUSISZ zamiast zadzwonić $client->send_end_stream(); i nie $client->end_stream();. Spowoduje to, że podstawowy XMPPStream dokona właściwego FSM state transition. Dodaj także wywołanie zwrotne dla zdarzenia on_disconnect, wewnątrz tego wywołania zwrotnego możesz ponownie spróbować połączyć się z nowo zarejestrowanym kontem XMPP i powinno po prostu działać poprawnie.

Uwaga: Prosimy o sprawdzenie ostatniego kodu z repozytorium. Zrobiłem kilka aktualizacji, które umożliwią ponowne zainicjowanie podstawowego JAXLLoopa. Jeśli interesują Cię szczegóły, tutaj jest commit log.