add() public method

Add data to buffer.
public add ( mixed $data )
$data mixed Data to add (string, resource, or Horde_Stream object).
Exemplo n.º 1
0
 /**
  * Read data from incoming IMAP stream.
  *
  * @return Horde_Imap_Client_Tokenize  The tokenized data.
  *
  * @throws Horde_Imap_Client_Exception
  */
 public function read()
 {
     $got_data = false;
     $literal_len = null;
     $token = new Horde_Imap_Client_Tokenize();
     do {
         if (feof($this->_stream)) {
             $this->close();
             $this->_params['debug']->info('ERROR: Server closed the connection.');
             throw new Horde_Imap_Client_Exception(Horde_Imap_Client_Translation::r("Mail server closed the connection unexpectedly."), Horde_Imap_Client_Exception::DISCONNECT);
         }
         if (is_null($literal_len)) {
             $buffer = '';
             while (($in = fgets($this->_stream)) !== false) {
                 $got_data = true;
                 if (substr($in, -1) === "\n") {
                     $in = rtrim($in);
                     $this->_params['debug']->server($buffer . $in);
                     $token->add($in);
                     break;
                 }
                 $buffer .= $in;
                 $token->add($in);
             }
             /* Check for literal data. */
             if (is_null($len = $token->getLiteralLength())) {
                 break;
             }
             // Skip 0-length literal data.
             if ($len['length']) {
                 $binary = $len['binary'];
                 $literal_len = $len['length'];
             }
             continue;
         }
         $old_len = $literal_len;
         while ($literal_len > 0 && !feof($this->_stream)) {
             $in = fread($this->_stream, min($literal_len, 8192));
             $token->add($in);
             if (!empty($this->_params['debugliteral'])) {
                 $this->_params['debug']->raw($in);
             }
             $got_data = true;
             $literal_len -= strlen($in);
         }
         $literal_len = null;
         if (empty($this->_params['debugliteral'])) {
             $this->_params['debug']->server('[' . ($binary ? 'BINARY' : 'LITERAL') . ' DATA: ' . $old_len . ' bytes]');
         }
     } while (true);
     if (!$got_data) {
         $this->_params['debug']->info('ERROR: read/timeout error.');
         throw new Horde_Imap_Client_Exception(Horde_Imap_Client_Translation::r("Error when communicating with the mail server."), Horde_Imap_Client_Exception::SERVER_READERROR);
     }
     return $token;
 }
Exemplo n.º 2
0
 /**
  * Read data from incoming IMAP stream.
  *
  * @return Horde_Imap_Client_Tokenize  The tokenized data.
  *
  * @throws Horde_Imap_Client_Exception
  */
 protected function _readStream()
 {
     $got_data = false;
     $literal_len = null;
     $token = new Horde_Imap_Client_Tokenize();
     do {
         if (feof($this->_stream)) {
             $this->_temp['logout'] = true;
             $this->logout();
             $this->writeDebug("ERROR: Server closed the connection.\n", Horde_Imap_Client::DEBUG_INFO);
             throw new Horde_Imap_Client_Exception(Horde_Imap_Client_Translation::t("Mail server closed the connection unexpectedly."), Horde_Imap_Client_Exception::DISCONNECT);
         }
         if (is_null($literal_len)) {
             $this->writeDebug('', Horde_Imap_Client::DEBUG_SERVER);
             while (($in = fgets($this->_stream)) !== false) {
                 $got_data = true;
                 if (substr($in, -1) == "\n") {
                     $in = rtrim($in);
                     if ($this->_debug) {
                         $this->writeDebug($in . "\n");
                     }
                     $token->add($in);
                     break;
                 }
                 if ($this->_debug) {
                     $this->writeDebug($in);
                 }
                 $token->add($in);
             }
             /* Check for literal data. */
             fseek($token->stream->stream, -1, SEEK_END);
             if ($token->stream->peek() == '}') {
                 $literal_data = $token->stream->getString($token->stream->search('{', true) - 1);
                 $literal_len = substr($literal_data, 2, -1);
                 if (is_numeric($literal_len)) {
                     if ($literal_len) {
                         $binary = $literal_data[0] == '~';
                     } else {
                         // Skip 0-length literal data.
                         $literal_len = null;
                     }
                     continue;
                 }
             }
             break;
         }
         $debug_literal = $this->_debug && !empty($this->_params['debug_literal']);
         $old_len = $literal_len;
         $this->writeDebug('', Horde_Imap_Client::DEBUG_SERVER);
         while ($literal_len && !feof($this->_stream)) {
             $in = fread($this->_stream, min($literal_len, 8192));
             $token->add($in);
             if ($debug_literal) {
                 $this->writeDebug($in);
             }
             $got_data = true;
             $in_len = strlen($in);
             if ($in_len > $literal_len) {
                 break;
             }
             $literal_len -= $in_len;
         }
         $literal_len = null;
         if (!$debug_literal) {
             $this->writeDebug('[' . ($binary ? 'BINARY' : 'LITERAL') . ' DATA: ' . $old_len . ' bytes]' . "\n");
         }
     } while (true);
     if (!$got_data) {
         $this->writeDebug("ERROR: IMAP read/timeout error.\n", Horde_Imap_Client::DEBUG_INFO);
         $this->logout();
         throw new Horde_Imap_Client_Exception(Horde_Imap_Client_Translation::t("Error when communicating with the mail server."), Horde_Imap_Client_Exception::SERVER_READERROR);
     }
     return $token;
 }
Exemplo n.º 3
0
 public function testLiteralStream()
 {
     $token = new Horde_Imap_Client_Tokenize();
     $token->add('FOO {10}');
     $token->addLiteralStream('1234567890');
     $token->add(' BAR');
     $token->rewind();
     $this->assertEquals('FOO', $token->next());
     /* Internal stream is converted to string. */
     $this->assertEquals('1234567890', $token->next());
     $this->assertEquals('BAR', $token->next());
     $this->assertTrue($token->eos);
     /* Check to see stream is returned if nextStream() is called and
      * a literal is encountered. */
     $token->rewind();
     $this->assertEquals('FOO', $token->nextStream());
     $stream = $token->nextStream();
     $this->assertInstanceOf('Horde_Stream_Temp', $stream);
     $this->assertEquals('1234567890', strval($stream));
     $this->assertEquals('BAR', $token->nextStream());
     $token = new Horde_Imap_Client_Tokenize();
     $token->add('{200}' . str_repeat('Z', 200));
     $token->rewind();
     $this->assertEquals(str_repeat('Z', 200), $token->next());
     $token->rewind();
     $stream = $token->nextStream();
     $this->assertInstanceOf('Horde_Stream_Temp', $stream);
     $this->assertEquals(str_repeat('Z', 200), strval($stream));
 }