diff options
author | Dominik Eckelmann <deckelmann@gmail.com> | 2011-11-19 14:40:29 +0100 |
---|---|---|
committer | Dominik Eckelmann <deckelmann@gmail.com> | 2011-11-19 14:40:29 +0100 |
commit | 1017f6f159386699a10d2529c50fb5e28b5c1889 (patch) | |
tree | 180fcb104291e638e1901a41a0d36512a31a92c7 /inc/remote.php | |
parent | a4e0e797f6bce4aaabf4e115a277db8c9a1fa285 (diff) | |
download | rpg-1017f6f159386699a10d2529c50fb5e28b5c1889.tar.gz rpg-1017f6f159386699a10d2529c50fb5e28b5c1889.tar.bz2 |
begin with remote api
Diffstat (limited to 'inc/remote.php')
-rw-r--r-- | inc/remote.php | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/inc/remote.php b/inc/remote.php new file mode 100644 index 000000000..ea5e23af3 --- /dev/null +++ b/inc/remote.php @@ -0,0 +1,120 @@ +<?php + +if (!defined('DOKU_INC')) die(); + +/** + * This class provides information about remote access to the wiki. + * + * == Types of methods == + * There are two types of remote methods. The first is the core methods. + * These are always available and provided by dokuwiki. + * The other is plugin methods. These are provided by remote plugins. + * + * == Information structure == + * The information about methods will be given in an array with the following structure: + * array( + * 'method.name' => array( + * 'args' => array( + * 'type' => 'string|int|...', + * ) + * ) + * ) + * + * plugin names are formed the following: + * core methods begin by a 'dokuwiki' or 'wiki' followed by a . and the method name itself. + * i.e.: dokuwiki.version or wiki.getPage + * + * plugin methods are formed like 'plugin.<plugin name>.<method name>'. + * i.e.: plugin.clock.getTime or plugin.clock_gmt.getTime + * + * + * + * @throws RemoteException + */ +class RemoteAPI { + + /** + * @var array remote methods provided by dokuwiki. + */ + private $coreMethods = array(); + + /** + * @var array remote methods provided by dokuwiki plugins - will be filled lazy via + * {@see RemoteAPI#getPluginMethods} + */ + private $pluginMethods = null; + + /** + * Get all available methods with remote access. + * + * @return array with information to all available methods + */ + public function getMethods() { + $this->forceAccess(); + return array_merge($this->getCoreMethods(), $this->getPluginMethods()); + } + + /** + * call a method via remote api. + * + * @param string $method name of the method to call. + * @param array $args arguments to pass to the given method + * @return mixed result of method call, must be a primitive type. + */ + public function call($method, $args) { + $this->forceAccess(); + $method = explode('.', $method); + if ($method[0] === 'plugin') { + $plugin = plugin_load('remote', $method[1]); + if (!$plugin) { + throw new RemoteException('Method unavailable'); + } + return call_user_func_array(array($plugin, $method[2]), $args); + } else { + // TODO call core method + } + + } + + /** + * @return bool true if the current user has access to remote api. + */ + public function hasAccess() { + global $conf; + if (!isset($conf['remote'])) { + return false; + } + return $conf['remote']; + } + + /** + * @throws RemoteException On denied access. + * @return void + */ + private function forceAccess() { + if (!$this->hasAccess()) { + throw new RemoteException('Access denied'); + } + } + + /** + * @return array all plugin methods. + */ + public function getPluginMethods() { + if ($this->pluginMethods === null) { + // TODO: find plugin methods + $this->pluginMethods = array(); + } + return $this->pluginMethods; + } + + /** + * @return array all core methods. + */ + public function getCoreMethods() { + return $this->coreMethods; + } +} + + +class RemoteException extends Exception {}
\ No newline at end of file |