<?php

namespace Thrift\Server;

use Thrift\Server\TServer;
use Thrift\Exception\TTransportException;

/**
 * Simple implemtation of a Thrift server.
 *
 * @package thrift.server
 */
class TSimpleServer extends TServer {
  /**
   * Flag for the main serving loop
   *
   * @var bool
   */
  private $stop_ = false;

  /**
   * Listens for new client using the supplied
   * transport. It handles TTransportExceptions
   * to avoid timeouts etc killing it
   *
   * @return void
   */
  public function serve() {
    $this->transport_->listen();

    while (!$this->stop_) {
      try {
        $transport = $this->transport_->accept();

        if ($transport != null) {
          $inputTransport = $this->inputTransportFactory_->getTransport($transport);
          $outputTransport = $this->outputTransportFactory_->getTransport($transport);
          $inputProtocol = $this->inputProtocolFactory_->getProtocol($inputTransport);
          $outputProtocol = $this->outputProtocolFactory_->getProtocol($outputTransport);
          while ($this->processor_->process($inputProtocol, $outputProtocol)) { }
        }
      }
      catch (TTransportException $e) { }
    }
  }

  /**
   * Stops the server running. Kills the transport
   * and then stops the main serving loop
   *
   * @return void
   */
  public function stop() {
    $this->transport_->close();
    $this->stop_ = true;
  }
}
