_protocols[$uri])) { $this->_protocols[$uri] = $this->_initProtocol($uri); } $this->_registerControllerPlugin(); return $this->_protocols[$uri]; } /** * Initialize a new protocol * * @param string $uri The URI for the protocol to be initialized * @return object Returns the new initialized protocol instance * @throws Zend_Wildfire_Exception */ protected function _initProtocol($uri) { switch ($uri) { case Zend_Wildfire_Protocol_JsonStream::PROTOCOL_URI; return new Zend_Wildfire_Protocol_JsonStream(); } require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Tyring to initialize unknown protocol for URI "'.$uri.'".'); } /** * Flush all data from all protocols and send all data to response headers. * * @return boolean Returns TRUE if data was flushed */ public function flush() { if (!$this->_protocols || !$this->isReady()) { return false; } foreach ( $this->_protocols as $protocol ) { $payload = $protocol->getPayload($this); if ($payload) { foreach( $payload as $message ) { $this->getResponse()->setHeader(self::$_headerPrefix.$message[0], $message[1], true); } } } return true; } /** * Set the index of the plugin in the controller dispatch loop plugin stack * * @param integer $index The index of the plugin in the stack * @return integer The previous index. */ public static function setControllerPluginStackIndex($index) { $previous = self::$_controllerPluginStackIndex; self::$_controllerPluginStackIndex = $index; return $previous; } /** * Register this object as a controller plugin. * * @return void */ protected function _registerControllerPlugin() { $controller = Zend_Controller_Front::getInstance(); if (!$controller->hasPlugin(get_class($this))) { $controller->registerPlugin($this, self::$_controllerPluginStackIndex); } } /* * Zend_Wildfire_Channel_Interface */ /** * Determine if channel is ready. * * The channel is ready as long as the request and response objects are initialized, * can send headers and the FirePHP header exists in the User-Agent. * * If the header does not exist in the User-Agent, no appropriate client * is making this request and the messages should not be sent. * * A timing issue arises when messages are logged before the request/response * objects are initialized. In this case we do not yet know if the client * will be able to accept the messages. If we consequently indicate that * the channel is not ready, these messages will be dropped which is in * most cases not the intended behaviour. The intent is to send them at the * end of the request when the request/response objects will be available * for sure. * * If the request/response objects are not yet initialized we assume if messages are * logged, the client will be able to receive them. As soon as the request/response * objects are availoable and a message is logged this assumption is challenged. * If the client cannot accept the messages any further messages are dropped * and messages sent prior are kept but discarded when the channel is finally * flushed at the end of the request. * * When the channel is flushed the $forceCheckRequest option is used to force * a check of the request/response objects. This is the last verification to ensure * messages are only sent when the client can accept them. * * @param boolean $forceCheckRequest OPTIONAL Set to TRUE if the request must be checked * @return boolean Returns TRUE if channel is ready. */ public function isReady($forceCheckRequest=false) { if (!$forceCheckRequest && !$this->_request && !$this->_response ) { return true; } if (!($this->getRequest() instanceof Zend_Controller_Request_Http)) { return false; } return ($this->getResponse()->canSendHeaders() && (preg_match_all( '/\s?FirePHP\/([\.\d]*)\s?/si', $this->getRequest()->getHeader('User-Agent'), $m ) || (($header = $this->getRequest()->getHeader('X-FirePHP-Version')) && preg_match_all('/^([\.\d]*)$/si', $header, $m) )) ); } /* * Zend_Controller_Plugin_Abstract */ /** * Flush messages to headers as late as possible but before headers have been sent. * * @return void */ public function dispatchLoopShutdown() { $this->flush(); } /** * Get the request object * * @return Zend_Controller_Request_Abstract * @throws Zend_Wildfire_Exception */ public function getRequest() { if (!$this->_request) { $controller = Zend_Controller_Front::getInstance(); $this->setRequest($controller->getRequest()); } if (!$this->_request) { require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Request objects not initialized.'); } return $this->_request; } /** * Get the response object * * @return Zend_Controller_Response_Abstract * @throws Zend_Wildfire_Exception */ public function getResponse() { if (!$this->_response) { $response = Zend_Controller_Front::getInstance()->getResponse(); if ($response) { $this->setResponse($response); } } if (!$this->_response) { require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Response objects not initialized.'); } return $this->_response; } }