98 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Buffer class for a string.
 | 
						|
 * Will fix issues with sockets that don't care about linebreaks.
 | 
						|
 * Can also be used for all kinds of purpose.
 | 
						|
 * TODO: implement a method to return the next X bytes (return false if not enough bytes there,yet)
 | 
						|
 * @author jpt
 | 
						|
 * @package Misc
 | 
						|
 */
 | 
						|
class Misc_Buffer {
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Bufferstring - contains all the data.
 | 
						|
	 * @var string
 | 
						|
	 */
 | 
						|
	protected $buffer;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Linebreak to use for pulling lines out of the buffer.
 | 
						|
	 * @var string
 | 
						|
	 */
 | 
						|
	protected $linebreak;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Default constructor. Sets a default linebreak and initializes the buffer.
 | 
						|
	 * @param $linebreak
 | 
						|
	 * @return void
 | 
						|
	 */
 | 
						|
	function __construct($linebreak = "") {
 | 
						|
		$this->buffer = "";
 | 
						|
		$this->linebreak = $linebreak;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Prunes empty lines out of the buffer.
 | 
						|
	 * @return void
 | 
						|
	 */
 | 
						|
	protected function pruneEmptyLines() {
 | 
						|
			//no need to do this when there are no linebreaks.
 | 
						|
		if($this->linebreak === "") return;
 | 
						|
		if(strpos($this->buffer, $this->linebreak) === FALSE) return;
 | 
						|
		$has_linebreak_at_end = (substr($this->buffer, (-1) * strlen($this->linebreak)) === $this->linebreak) ? TRUE : FALSE;
 | 
						|
		$lines = explode($this->linebreak, $this->buffer);
 | 
						|
		foreach($lines AS $key=>$line) {
 | 
						|
			$line = str_replace($this->linebreak, "", $line);
 | 
						|
			$line = trim($line);
 | 
						|
			if($line === "") unset($lines[$key]);
 | 
						|
		}
 | 
						|
		$this->buffer = implode($this->linebreak, $lines);
 | 
						|
		if($has_linebreak_at_end) $this->buffer .= $this->linebreak;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Appends data to the buffer.
 | 
						|
	 * @param string $data
 | 
						|
	 * @return void
 | 
						|
	 */
 | 
						|
	public function addData($data) {
 | 
						|
		$this->buffer .= $data;
 | 
						|
		$this->pruneEmptyLines();
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Returns the next line in the buffer and removes it from the buffer.
 | 
						|
	 * @return string
 | 
						|
	 * @throws Exception_GeneralException
 | 
						|
	 */
 | 
						|
	public function getNextLine() {
 | 
						|
		if($this->linebreak === "") throw new Exception_GeneralException("Cannot return a line - no linebreak is set!", 1290964174);
 | 
						|
		if(!$this->hasLines()) return "";
 | 
						|
		list($line) = explode($this->linebreak, $this->buffer);
 | 
						|
		$this->buffer = str_replace($line.$this->linebreak, "", $this->buffer);
 | 
						|
		$line = trim($line);
 | 
						|
		$result = ($line !== "") ? $line.$this->linebreak : "";
 | 
						|
		return $result;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Returns the next $length chars from the buffer.
 | 
						|
	 * @return string Returns "" if no
 | 
						|
	 */
 | 
						|
	public function getNextChars($length) {
 | 
						|
		//TODO: substr und so
 | 
						|
		return "";
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Checks whether the buffer contains more lines to process.
 | 
						|
	 * @return boolean
 | 
						|
	 * @throws Exception_GeneralException
 | 
						|
	 */
 | 
						|
	public function hasLines() {
 | 
						|
		if($this->linebreak === "") throw new Exception_GeneralException("Cannot tell whether the buffer has lines - no linebreak set!", 1290964243);
 | 
						|
		return (trim(strstr($this->buffer, $this->linebreak, TRUE)) !== "") ? TRUE : FALSE;
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
?>
 |