[moodle] / contrib / patches / dfws / webservice / lib.php Repository:

View of /contrib/patches/dfws/webservice/lib.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (download) (annotate)
Wed Apr 23 20:30:49 2008 WST (19 months ago) by tusefomal
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +0 -1 lines
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