|
|
@ -38,9 +38,7 @@ require_once realpath(dirname(__FILE__) . '/../autoload.php'); |
|
|
|
* Represents an active call that allows sending and recieving binary data |
|
|
|
* Represents an active call that allows sending and recieving binary data |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
class ActiveCall { |
|
|
|
class ActiveCall { |
|
|
|
private $completion_queue; |
|
|
|
|
|
|
|
private $call; |
|
|
|
private $call; |
|
|
|
private $flags; |
|
|
|
|
|
|
|
private $metadata; |
|
|
|
private $metadata; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
@ -48,24 +46,15 @@ class ActiveCall { |
|
|
|
* @param Channel $channel The channel to communicate on |
|
|
|
* @param Channel $channel The channel to communicate on |
|
|
|
* @param string $method The method to call on the remote server |
|
|
|
* @param string $method The method to call on the remote server |
|
|
|
* @param array $metadata Metadata to send with the call, if applicable |
|
|
|
* @param array $metadata Metadata to send with the call, if applicable |
|
|
|
* @param long $flags Write flags to use with this call |
|
|
|
|
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public function __construct(Channel $channel, |
|
|
|
public function __construct(Channel $channel, |
|
|
|
$method, |
|
|
|
$method, |
|
|
|
$metadata = array(), |
|
|
|
$metadata = array()) { |
|
|
|
$flags = 0) { |
|
|
|
|
|
|
|
$this->completion_queue = new CompletionQueue(); |
|
|
|
|
|
|
|
$this->call = new Call($channel, $method, Timeval::inf_future()); |
|
|
|
$this->call = new Call($channel, $method, Timeval::inf_future()); |
|
|
|
$this->call->add_metadata($metadata, 0); |
|
|
|
|
|
|
|
$this->flags = $flags; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Invoke the call. |
|
|
|
$event = $this->call->start_batch([OP_SEND_INITIAL_METADATA => $metadata]); |
|
|
|
$this->call->invoke($this->completion_queue, |
|
|
|
|
|
|
|
CLIENT_METADATA_READ, |
|
|
|
$this->metadata = $event->metadata; |
|
|
|
FINISHED, 0); |
|
|
|
|
|
|
|
$metadata_event = $this->completion_queue->pluck(CLIENT_METADATA_READ, |
|
|
|
|
|
|
|
Timeval::inf_future()); |
|
|
|
|
|
|
|
$this->metadata = $metadata_event->data; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
@ -87,8 +76,7 @@ class ActiveCall { |
|
|
|
* @return The next message from the server, or null if there is none. |
|
|
|
* @return The next message from the server, or null if there is none. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public function read() { |
|
|
|
public function read() { |
|
|
|
$this->call->start_read(READ); |
|
|
|
$read_event = $this->call->start_batch([OP_RECV_MESSAGE => true]); |
|
|
|
$read_event = $this->completion_queue->pluck(READ, Timeval::inf_future()); |
|
|
|
|
|
|
|
return $read_event->data; |
|
|
|
return $read_event->data; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -98,16 +86,14 @@ class ActiveCall { |
|
|
|
* @param ByteBuffer $data The data to write |
|
|
|
* @param ByteBuffer $data The data to write |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public function write($data) { |
|
|
|
public function write($data) { |
|
|
|
$this->call->start_write($data, WRITE_ACCEPTED, $this->flags); |
|
|
|
$this->call->start_batch([OP_SEND_MESSAGE => $data]); |
|
|
|
$this->completion_queue->pluck(WRITE_ACCEPTED, Timeval::inf_future()); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Indicate that no more writes will be sent. |
|
|
|
* Indicate that no more writes will be sent. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public function writesDone() { |
|
|
|
public function writesDone() { |
|
|
|
$this->call->writes_done(FINISH_ACCEPTED); |
|
|
|
$this->call->start_batch([OP_SEND_CLOSE_FROM_CLIENT => true]); |
|
|
|
$this->completion_queue->pluck(FINISH_ACCEPTED, Timeval::inf_future()); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
@ -116,8 +102,7 @@ class ActiveCall { |
|
|
|
* and array $metadata members |
|
|
|
* and array $metadata members |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public function getStatus() { |
|
|
|
public function getStatus() { |
|
|
|
$status_event = $this->completion_queue->pluck(FINISHED, |
|
|
|
$status_event = $this->call->start_batch([RECV_STATUS_ON_CLIENT => true]); |
|
|
|
Timeval::inf_future()); |
|
|
|
|
|
|
|
return $status_event->data; |
|
|
|
return $status_event->data; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|