Changeset View
Changeset View
Standalone View
Standalone View
src/channel/PhutilChannelChannel.php
- This file was added.
| <?php | |||||
| /** | |||||
| * Channel that wraps some other channel. This class is not interesting on its | |||||
| * own and just serves as a no-op proxy, but extending it allows you to compose | |||||
| * channels to mutate their characteristics (for instance, to add protocol | |||||
| * semantics with @{class:PhutilProtocolChannel}). | |||||
| * | |||||
| * The implementation of this class is entirely uninteresting. | |||||
| */ | |||||
| abstract class PhutilChannelChannel extends PhutilChannel { | |||||
| private $channel; | |||||
| public function __construct(PhutilChannel $channel) { | |||||
| parent::__construct(); | |||||
| $this->channel = $channel; | |||||
| $this->didConstruct(); | |||||
| } | |||||
| protected function didConstruct() { | |||||
| // Hook for subclasses. | |||||
| } | |||||
| public function read() { | |||||
| return $this->channel->read(); | |||||
| } | |||||
| public function write($message) { | |||||
| $this->channel->write($message); | |||||
| return $this; | |||||
| } | |||||
| public function update() { | |||||
| return $this->channel->update(); | |||||
| } | |||||
| public function isOpen() { | |||||
| return $this->channel->isOpen(); | |||||
| } | |||||
| public function closeWriteChannel() { | |||||
| return $this->channel->closeWriteChannel(); | |||||
| } | |||||
| public function isOpenForReading() { | |||||
| return $this->channel->isOpenForReading(); | |||||
| } | |||||
| public function isOpenForWriting() { | |||||
| return $this->channel->isOpenForWriting(); | |||||
| } | |||||
| protected function readBytes($length) { | |||||
| $this->throwOnRawByteOperations(); | |||||
| } | |||||
| protected function writeBytes($bytes) { | |||||
| $this->throwOnRawByteOperations(); | |||||
| } | |||||
| protected function getReadSockets() { | |||||
| return $this->channel->getReadSockets(); | |||||
| } | |||||
| protected function getWriteSockets() { | |||||
| return $this->channel->getWriteSockets(); | |||||
| } | |||||
| public function setReadBufferSize($size) { | |||||
| $this->channel->setReadBufferSize($size); | |||||
| return $this; | |||||
| } | |||||
| public function isReadBufferEmpty() { | |||||
| return $this->channel->isReadBufferEmpty(); | |||||
| } | |||||
| public function isWriteBufferEmpty() { | |||||
| return $this->channel->isWriteBufferEmpty(); | |||||
| } | |||||
| public function getWriteBufferSize() { | |||||
| return $this->channel->getWriteBufferSize(); | |||||
| } | |||||
| public function flush() { | |||||
| $this->channel->flush(); | |||||
| return $this; | |||||
| } | |||||
| protected function getUnderlyingChannel() { | |||||
| return $this->channel; | |||||
| } | |||||
| private function throwOnRawByteOperations() { | |||||
| // NOTE: You should only be able to end up here if you subclass this class | |||||
| // and implement your subclass incorrectly, since the byte methods are | |||||
| // protected. | |||||
| throw new Exception( | |||||
| pht( | |||||
| 'Do not call %s or %s directly on a %s. Instead, call %s or %s.', | |||||
| 'readBytes()', | |||||
| 'writeBytes()', | |||||
| __CLASS__, | |||||
| 'read()', | |||||
| 'write()')); | |||||
| } | |||||
| } | |||||