X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=program%2Finclude%2Frcube_json_output.php;h=6801a40962ce4ec01df35beb63b481dd08ee33b4;hb=76507f7c63a660742e76889ad6e3919f3dde3bb0;hp=a633f8555e2eebe595f8ff7824f9367b740801a5;hpb=48e8459231a1efa3e97284d07a328776a5b7485b;p=roundcube.git diff --git a/program/include/rcube_json_output.php b/program/include/rcube_json_output.php index a633f85..6801a40 100644 --- a/program/include/rcube_json_output.php +++ b/program/include/rcube_json_output.php @@ -4,8 +4,8 @@ +-----------------------------------------------------------------------+ | program/include/rcube_json_output.php | | | - | This file is part of the RoundCube Webmail client | - | Copyright (C) 2008, RoundCube Dev. - Switzerland | + | This file is part of the Roundcube Webmail client | + | Copyright (C) 2008-2010, The Roundcube Dev Team | | Licensed under the GNU GPL | | | | PURPOSE: | @@ -16,7 +16,7 @@ | Author: Thomas Bruederli | +-----------------------------------------------------------------------+ - $Id: $ + $Id: rcube_json_output.php 5227 2011-09-16 17:54:07Z thomasb $ */ @@ -28,46 +28,62 @@ */ class rcube_json_output { + /** + * Stores configuration object. + * + * @var rcube_config + */ private $config; - private $charset = 'UTF-8'; - private $env = array(); + private $charset = RCMAIL_CHARSET; private $texts = array(); private $commands = array(); + private $callbacks = array(); + private $message = null; - public $task = ''; + public $browser; + public $env = array(); + public $type = 'js'; public $ajax_call = true; - - + + /** * Constructor */ - public function __construct($task) + public function __construct($task=null) { - $this->task = $task; - $this->config = rcmail::get_instance()->config; + $this->config = rcmail::get_instance()->config; + $this->browser = new rcube_browser(); } - - + + /** * Set environment variable * - * @param string Property name - * @param mixed Property value + * @param string $name Property name + * @param mixed $value Property value */ public function set_env($name, $value) { $this->env[$name] = $value; } - + + /** - * @ignore + * Issue command to set page title + * + * @param string $title New page title */ public function set_pagetitle($title) { - $name = $this->config->get('product_name'); - $this->command('set_pagetitle', JQ(empty($name) ? $title : $name.' :: '.$title)); + if ($this->config->get('devel_mode') && !empty($_SESSION['username'])) + $name = $_SESSION['username']; + else + $name = $this->config->get('product_name'); + + $this->command('set_pagetitle', empty($name) ? $title : $name.' :: '.$title); } + /** * @ignore */ @@ -91,8 +107,8 @@ class rcube_json_output /** * Register a template object handler * - * @param string Object name - * @param string Function name to call + * @param string $obj Object name + * @param string $func Function name to call * @return void */ public function add_handler($obj, $func) @@ -100,18 +116,19 @@ class rcube_json_output // ignore } + /** * Register a list of template object handlers * - * @param array Hash array with object=>handler pairs + * @param array $arr Hash array with object=>handler pairs * @return void */ public function add_handlers($arr) { // ignore } - - + + /** * Call a client method * @@ -120,50 +137,83 @@ class rcube_json_output */ public function command() { - $this->commands[] = func_get_args(); + $cmd = func_get_args(); + + if (strpos($cmd[0], 'plugin.') === 0) + $this->callbacks[] = $cmd; + else + $this->commands[] = $cmd; } - - + + /** * Add a localized label to the client environment */ public function add_label() { - $arg_list = func_get_args(); - foreach ($arg_list as $i => $name) { + $args = func_get_args(); + if (count($args) == 1 && is_array($args[0])) + $args = $args[0]; + + foreach ($args as $name) { $this->texts[$name] = rcube_label($name); } } - + /** * Invoke display_message command * - * @param string Message to display - * @param string Message type [notice|confirm|error] - * @param array Key-value pairs to be replaced in localized text + * @param string $message Message to display + * @param string $type Message type [notice|confirm|error] + * @param array $vars Key-value pairs to be replaced in localized text + * @param boolean $override Override last set message + * @param int $timeout Message displaying time in seconds * @uses self::command() */ - public function show_message($message, $type='notice', $vars=null) + public function show_message($message, $type='notice', $vars=null, $override=true, $timeout=0) { - $this->command( - 'display_message', - rcube_label(array('name' => $message, 'vars' => $vars)), - $type - ); + if ($override || !$this->message) { + if (rcube_label_exists($message)) { + if (!empty($vars)) + $vars = array_map('Q', $vars); + $msgtext = rcube_label(array('name' => $message, 'vars' => $vars)); + } + else + $msgtext = $message; + + $this->message = $message; + $this->command('display_message', $msgtext, $type, $timeout * 1000); + } } - + + /** * Delete all stored env variables and commands */ - public public function reset() + public function reset() { $this->env = array(); $this->texts = array(); $this->commands = array(); } - - + + + /** + * Redirect to a certain url + * + * @param mixed $p Either a string with the action or url parameters as key-value pairs + * @param int $delay Delay in seconds + * @see rcmail::url() + */ + public function redirect($p = array(), $delay = 1) + { + $location = rcmail::get_instance()->url($p); + $this->remote_response("window.setTimeout(\"location.href='{$location}'\", $delay);"); + exit; + } + + /** * Send an AJAX response to the client. */ @@ -172,39 +222,52 @@ class rcube_json_output $this->remote_response(); exit; } - - + + /** * Send an AJAX response with executable JS code * - * @param string Additional JS code + * @param string $add Additional JS code * @param boolean True if output buffer should be flushed * @return void * @deprecated */ - public function remote_response($add='', $flush=false) + public function remote_response($add='') { static $s_header_sent = false; if (!$s_header_sent) { $s_header_sent = true; send_nocacheing_headers(); - header('Content-Type: application/x-javascript; charset=' . $this->get_charset()); - print '/** ajax response ['.date('d/M/Y h:i:s O')."] **/\n"; + header('Content-Type: text/plain; charset=' . $this->get_charset()); } // unset default env vars unset($this->env['task'], $this->env['action'], $this->env['comm_path']); - // send response code - echo $this->get_js_commands() . $add; + $rcmail = rcmail::get_instance(); + $response['action'] = $rcmail->action; + + if ($unlock = get_input_value('_unlock', RCUBE_INPUT_GPC)) { + $response['unlock'] = $unlock; + } + + if (!empty($this->env)) + $response['env'] = $this->env; + + if (!empty($this->texts)) + $response['texts'] = $this->texts; + + // send function calls + $response['exec'] = $this->get_js_commands() . $add; - // flush the output buffer - if ($flush) - flush(); + if (!empty($this->callbacks)) + $response['callbacks'] = $this->callbacks; + + echo json_serialize($response); } - - + + /** * Return executable javascript code for all registered commands * @@ -213,13 +276,6 @@ class rcube_json_output private function get_js_commands() { $out = ''; - - if (sizeof($this->env)) - $out .= 'this.set_env('.json_serialize($this->env).");\n"; - - foreach($this->texts as $name => $text) { - $out .= sprintf("this.add_label('%s', '%s');\n", $name, JQ($text)); - } foreach ($this->commands as $i => $args) { $method = array_shift($args); @@ -237,5 +293,3 @@ class rcube_json_output return $out; } } - -