Parent Directory
|
Revision Log
I press enter for error in last commit. New features: -the * service selector (for exmple "mod.*" will require all mod services) -created a new service called "globals" which contains some global data structures -user service include some moodle required batch functions (get_users or delete_users).
<?php
/**
* Created on 05/03/2008
*
* support library for Moodle api layer
*
* @author Ferran Recio
* @author David Castro Garcia
*/
/**
* returns an array with all files in a directory
*
* @param string $path path to dir
* @param string $ext=false just files with this extension
* @param boolean $dirs=false include dirs in the list
*
* @return mixed array of strings or false if firectory doesn't exists
*
*/
function mdl_dir_files ($path,$ext=false,$dirs=false){
if (!is_dir($path)) return false;
//el resultat
$res = array();
//llegim el directori
if (!$dir = opendir($path)) return false;
while ($file = readdir($dir)){
//saltem les tonteries
if ($file==='.' || $file==='..') continue;
//mirem si també posem els directoris
if (is_dir($path.'/'.$file) && $dirs===false) continue;
//si ens han passat un array biut el posem a saco
if ($ext==false){
$res[] = $file;
} else {
if (strpos($file,$ext)===strlen($file)-strlen($ext)){
$res[] = $file;
}
}
}
return $res;
}
/**
* returns an array with all subdirectories in a directory
*
* @param string $path path to dir
*
* @return mixed array of strings or false if firectory doesn't exists
*
*/
function mdl_dir_dirs ($path){
if (!is_dir($path)) return false;
//el resultat
$res = array();
//llegim el directori
if (!$dir = opendir($path)) return false;
while ($file = readdir($dir)){
//saltem les tonteries
if ($file==='.' || $file==='..') continue;
//mirem si també posem els directoris
if (is_dir($path.'/'.$file)) $res[]=$file;
}
return $res;
}
//------------- APIS INFO FUNCTIONS -----------
/**
* add a new api to the superstructure
*
* @param string $api_name the api identifier
* @param api_info $api_info the specific api info (generated by the mdl_XXX_info function)
*
* @return boolean true if success
*/
function mdl_add_api_info ($api_name,$api_info) {
global $CFG,$API_INFO;
if (!isset($API_INFO) || !$API_INFO) {
$API_INFO = new stdClass;
$API_INFO->apis = array();
$API_INFO->complete = new stdClass;
$API_INFO->complete->structs = array();
$API_INFO->complete->functions = array();
$API_INFO->complete->instance = $CFG->wwwroot;
$API_INFO->complete->api_list =mdl_get_basic_api_services();
}
//some checks
if (!isset($api_info->structs) || !is_array($api_info->structs)) return false;
if (!isset($api_info->functions) || !is_array($api_info->functions)) return false;
//add the api to list
$API_INFO->apis[$api_name] = $api_info;
//add api's structures to general structure
$API_INFO->complete->structs = array_merge($API_INFO->complete->structs,$api_info->structs);
//add api's functions to general structure
$API_INFO->complete->functions = array_merge($API_INFO->complete->functions,$api_info->functions);
$API_INFO->complete->api_list[] = $api_name;
return true;
}
/**
* declare an api (will be loaded when access to inout)
*
* @param string $api_name
*
* @return boolean
*/
function mdl_require_api ($api_name) {
global $CFG,$API_INFO;
if (!isset($API_INFO) || !$API_INFO) {
$API_INFO = new stdClass;
$API_INFO->apis = array();
$API_INFO->complete = new stdClass;
$API_INFO->complete->structs = array();
$API_INFO->complete->functions = array();
$API_INFO->complete->instance = $CFG->wwwroot;
$API_INFO->complete->api_list = mdl_get_basic_api_services();//array();
}
if (in_array($api_name,$API_INFO->complete->api_list)) return true;
//check the api
$api_dir = dirname(__FILE__);
$parts = explode('.',$api_name,2);
if (count($parts)>1 && $parts[1]=='*') {
//we want a set of services
$res = false;
//include module services
$file_path = $CFG->dirroot.'/'.$parts[0];
if (file_exists($file_path) && is_dir($file_path)) {
$dirs = mdl_dir_dirs($file_path);
foreach ($dirs as $dir) {
if (!$res) $res = true;
mdl_require_api ($parts[0].'.'.$dir);
}
}
//include packaged services
$file_path = $api_dir.'/'.$parts[0];
if (file_exists($file_path) && is_dir($file_path)) {
$services = mdl_dir_files ($file_path,'.lib.php');
if ($services) {
foreach ($services as $api) {
if (!$res) $res = true;
$api_n = substr($api,0,strlen($api)-8);
if (!in_array($parts[0].'.'.$api_n,$API_INFO->complete->api_list)) {
mdl_require_api ($parts[0].'.'.$api_n);
}
}
}
}
} else {
//we want a single service
$file_path = '';
if (count($parts)>1) {
//check module file
$file_path = $CFG->dirroot.'/'.$parts[0].'/'.$parts[1].'/api.lib.php';
if (!file_exists($file_path)) {
//check packaged service
$file_path = $api_dir.'/'.$parts[0].'/'.$parts[1].'.lib.php';
}
} else {
$file_path = $api_dir.'/apis/'.$api_name.'.lib.php';
}
if (!file_exists($file_path)) return false;
$API_INFO->complete->api_list[] = $api_name;
}
return true;
}
/**
* returns a list of basic api services
*
* @return Array of Strings
*/
function mdl_get_basic_api_services () {
$res = array();
$api_dir = dirname(__FILE__);
$global_apis = mdl_dir_files ($api_dir.'/apis','.lib.php');
if ($global_apis) {
foreach ($global_apis as $api) {
$api_name = substr($api,0,strlen($api)-8);
if ($api_name == 'config') continue;
$res[] = $api_name;
}
}
return $res;
}
/**
* load a default API_INFO structure
*/
function mdl_reset_api_info () {
global $CFG,$API_INFO;
$API_INFO = new stdClass;
$API_INFO->apis = array();
$API_INFO->complete = new stdClass;
$API_INFO->complete->structs = array();
$API_INFO->complete->functions = array();
$API_INFO->complete->instance = $CFG->wwwroot;
$API_INFO->complete->api_list = mdl_get_basic_api_services();
//$API_INFO->complete->api_list =array();
}
/**
* return the definition of one single api
*
* @param string $api_name
*
* @return mixed the api info structure or false
*/
function mdl_get_api_info ($api_name) {
global $API_INFO;
if (!isset($API_INFO->apis[$api_name])) return false;
return $API_INFO->apis[$api_name];
}
/**
* return the global api info
*
* @return mixed the global api info or false
*/
function mdl_get_global_api () {
global $API_INFO;
if (!isset($API_INFO->complete)) return false;
return $API_INFO->complete;
}
/**
* return the list of declared apis
*
* @return array of strings
*/
function mdl_get_declared_apis () {
global $API_INFO;
if (!isset($API_INFO->complete->api_list)) return false;
return $API_INFO->complete->api_list;
}
/**
* check if a functions is callable.
*
* @param string $funcname
*
* @return boolean
*/
function mdl_is_callable ($funcname,$rettype=false) {
global $API_INFO;
if (!isset($API_INFO->complete->functions[$funcname])) return false;
return function_exists ($funcname);
}
/**
* check if an API info is loaded or just declared
*
* @param string $api_name
*
* @return boolean
*/
function mdl_is_api_info_loaded ($api_name) {
global $API_INFO;
return isset($API_INFO->apis[$api_name]);
}
/**
* require a callable function. Stops the script if the function is not callable
*
* @param string $funcname
*/
function mdl_require_callable ($funcname) {
if (!mdl_is_callable($funcname)) {
$message = get_string('not callable','webservice');
$func = 'mdl_conn_'.mdl_get_current_connector().'_error';
if (function_exists($func)) {
$func($message);
die();
}
die ($message);
}
}
/**
* return a null complex type
*
* @param string $type
*
* @return mixed
*/
function mdl_get_empty_complex ($type) {
global $API_INFO;
if (!isset($API_INFO->complete->structs[$type])) {
$simples = array('integer'=>0, 'string'=>'',
'boolean'=>false,'decimal'=>0,
'float'=>0,'binary'=>'');
if (isset($simples[$type])) return $simples[$type];
return null;
}
//complex type
$ctype = $API_INFO->complete->structs[$type];
switch ($ctype->type) {
case 'array':
return array();
case 'struct':
$res = new stdClass;
if (isset($ctype->elems)) {
foreach ($ctype->elems as $key => $val) {
$res->$key = mdl_get_empty_complex ($val);
}
}
return $res;
}
return null;
}
//------------- CONNECTORS FUNCTIONS ------------
/**
* return the current connector (SOAP, direct...)
*
* @return string or false
*/
function mdl_get_current_connector () {
static $ret='';
if (!$ret) {
$ret = basename(mdl_get_connector_url());
}
return $ret;
}
/**
* return the current connector base url
*
* @return string
*/
function mdl_get_connector_url () {
static $ret='';
if (!$ret) {
$ret = dirname(qualified_me());
}
return $ret;
}
//--------------- API GENERAL SESSION FUNCTIONS ----------------
/**
* saves an api session
*
* @param string $sessid
*
* @return boolean
*/
function mdl_register_api_session ($sessid) {
global $_SESSION,$USER,$_COOKIE,$_SERVER;
if (isset($USER->id) && $USER->id) {
if (isset($_COOKIE)) $_SESSION['COOKIE'] = $_COOKIE;
$sess = new stdClass;
$sess->userid = addslashes($USER->id);
$sess->username = addslashes($USER->username);
$sess->ip = $_SERVER['REMOTE_ADDR'];
$sess->content = addslashes(serialize($_SESSION));
$sess->session_id = addslashes($sessid);//session_id();
$sess->expires = time()+30*60;
insert_record ('api_session',$sess);
}
}
/**
* update api session information
*
* @param string $sessid
*
* @return boolean
*/
function mdl_update_api_session ($sessid) {
global $_SESSION,$USER,$_COOKIE,$_SERVER;
//get session id
$sess = get_record ('api_session','session_id',$sessid,'ip',$_SERVER['REMOTE_ADDR']);
if ($sess) {
if (isset($USER->id) && $USER->id) {
if (isset($_COOKIE)) $_SESSION['COOKIE'] = $_COOKIE;
$sess->userid = addslashes($USER->id);
$sess->username = addslashes($USER->username);
//$sess->ip = '';
$sess->content = addslashes(serialize($_SESSION));
//$sess->session_id = $sessid;//session_id();
$sess->expires = time()+30*60;
update_record ('api_session',$sess);
}
}
}
/**.
* restore an api session
*
* @param string $sessid
*
* @return boolean
*/
function mdl_restore_api_session ($sessid) {
global $_SESSION,$_SERVER;
//global $USER,$SESSION,$_SESSION,$COOKIE;
$tempsess = get_record ('api_session','session_id',$sessid,'ip',$_SERVER['REMOTE_ADDR']);
if ($tempsess) {
if ($tempsess->expires < time()) {
delete_records ('api_session','session_id',$sessid);
return false;
}
$unserial = unserialize($tempsess->content);
foreach ($unserial as $key => $elem) {
$_SESSION[$key] = $elem;
}
//ping session
set_field ('api_session','expires',time()+30*60,'session_id',$sessid);
return true;
}
return false;
}
/**
* destroy a session
*
* @param string $sessid
*
* @return boolean
*/
function mdl_destroy_api_session ($sessid) {
global $_SERVER;
$rip = get_field ('api_session','ip','session_id',$sessid);
if (!$rip) return false;
if ($rip != $_SERVER['REMOTE_ADDR']) return false;
return delete_records ('api_session','session_id',$sessid);
}
?>
| Moodle CVS Admin | ViewVC Help |
| Powered by ViewVC 1.0.7 |