<?php
/**
 * XML-RPC : Wordpress API
 *
 * b2evolution - {@link http://b2evolution.net/}
 * Released under GNU GPL License - {@link http://b2evolution.net/about/gnu-gpl-license}
 * @copyright (c)2009-2016 by Francois Planque - {@link http://fplanque.com/}
 *
 * @author waltercruz
 *
 * @see http://codex.wordpress.org/XML-RPC_wp
 *
 * @package xmlsrv
 * @version $Id: _wordpress.api.php 8935 2015-05-11 16:42:29Z fplanque $
 */
if( !defined('EVO_MAIN_INIT') ) die( 'Please, do not access this page directly.' );


$wordpressgetusersblogs_doc = 'returns information about all the blogs a given user is a member of.';
$wordpressgetusersblogs_sig = array(array($xmlrpcArray,$xmlrpcString,$xmlrpcString));
/**
 * wp.getUsersBlogs
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.getUsersBlogs
 *
 * Data is returned as an array of <struct>s containing the ID (blogid), name (blogName),
 * and URL (url) of each blog.
 *
 * Non official: Also return a boolean stating wether or not the user can edit the blog options
 * (isAdmin). Also return a value for xmlrpc url.
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 username (string): Login for the Blogger user who's blogs will be retrieved.
 *					1 password (string): Password for said username.
 *						(currently not required by b2evo)
 * @return xmlrpcresp XML-RPC Response, an array of <struct>s containing for each blog:
 *					- isAdmin (boolean)
 *					- url (string)
 *					- blogid (string)
 *					- blogName (string)
 *					- xmlrpc (string)
 */
function wp_getusersblogs($m)
{
	return _wp_or_blogger_getusersblogs( 'wp', $m );
}


$wordpressgetauthors_doc = 'Retrieve list of all authors.';
$wordpressgetauthors_sig = array(array($xmlrpcArray,$xmlrpcInt,$xmlrpcString,$xmlrpcString));
/**
 * wp.getAuthors
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.getAuthors
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.

 */
function wp_getauthors($m)
{
	// CHECK LOGIN:
	/**
	 * @var User
	 */
	if( ! $current_User = & xmlrpcs_login( $m, 1, 2 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	if( ! check_user_perm('users', 'view') )
	{
		return xmlrpcs_resperror( 5, T_('You have no permission to view other users!') );
	}

	load_class( 'users/model/_userlist.class.php', 'UserList' );
	$UserList = new UserList( '', NULL, 'u_', array( 'join_group' => false, 'join_session' => false, 'join_country' => false, 'join_city' => false ) );

	// Run the query:
	$UserList->query();

	logIO( 'Found users: '.$UserList->result_num_rows );

	$data = array();
	while( $User = & $UserList->get_next() )
	{
		$data[] = new xmlrpcval(array(
				'user_id' => new xmlrpcval( $User->ID, 'int' ),
				'user_login' => new xmlrpcval( $User->login ),
				'display_name' => new xmlrpcval( $User->get_preferred_name() ),
			),'struct');
	}

	logIO( 'OK.' );
	return new xmlrpcresp( new xmlrpcval( $data, 'array' ) );
}


$wordpressgettags_doc = 'Get list of all tags.';
$wordpressgettags_sig =  array(array($xmlrpcArray,$xmlrpcInt,$xmlrpcString,$xmlrpcString));
/**
 * wp.getTags
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.getTags
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 */
function wp_gettags( $m )
{
	// CHECK LOGIN:
	/**
	 * @var User
	 */
	if( ! $current_User = & xmlrpcs_login( $m, 1, 2 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	$data = array();
	$tags = get_tags( $Blog->ID );

	if( !empty($tags) )
	{
		logIO( 'Got '.count($tags).' tags' );

		load_funcs( '_core/_url.funcs.php' );

		$BlogCache = & get_BlogCache();

		foreach( $tags as $tag )
		{
			if( ($l_Blog = & $BlogCache->get_by_id( $tag->cat_blog_ID, false )) === false ) continue;

			$tag_url = $l_Blog->gen_tag_url($tag->tag_name);

			$data[] = new xmlrpcval(array(
					'tag_id' => new xmlrpcval( $tag->tag_ID, 'int' ),
					'name' => new xmlrpcval( $tag->tag_name ),
					'count' => new xmlrpcval( $tag->tag_count, 'int'),
					'slug' => new xmlrpcval(''), // not used in b2evolution
					'html_url' => new xmlrpcval( $tag_url ),
					'rss_url' => new xmlrpcval( url_add_param($tag_url, 'tempskin=_rss2', '&') ),
				),'struct');
		}
	}

	logIO( 'OK.' );
	return new xmlrpcresp( new xmlrpcval( $data, 'array' ) );
}


$wordpressgetpagelist_doc = 'Get an array of all the pages on a blog. Just the minimum details, lighter than wp.getPages.';
$wordpressgetpagelist_sig =  array(array($xmlrpcArray,$xmlrpcInt,$xmlrpcString,$xmlrpcString));
/**
 * wp.getPageList
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.getPageList
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 */
function wp_getpagelist( $m )
{
	// CHECK LOGIN:
	/**
	 * @var User
	 */
	if( ! $current_User = & xmlrpcs_login( $m, 1, 2 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// Get the pages to display:
	load_class( 'items/model/_itemlistlight.class.php', 'ItemListLight' );
	$MainList = new ItemListLight( $Blog, NULL, NULL, 0 );

	// Protected and private get checked by statuses_where_clause().
	$statuses = array( 'published', 'redirected', 'protected', 'private' );
	if( check_user_perm( 'blog_ismember', 'view', false, $Blog->ID ) )
	{	// These statuses require member status:
		$statuses = array_merge( $statuses, array( 'draft', 'deprecated' ) );
	}
	logIO( 'Statuses: '.implode( ', ', $statuses ) );

	$MainList->set_filters( array(
			'visibility_array' => $statuses,
			'order' => 'DESC',
			'unit' => 'posts',
			'itemtype_usage' => 'page',
		) );

	// Run the query:
	$MainList->query();

	logIO( 'Items:'.$MainList->result_num_rows );

	$data = array();
	while( $Item = & $MainList->get_item() )
	{
		logIO( 'Item:'.$Item->title.
					' - Issued: '.$Item->issue_date.
					' - Modified: '.$Item->datemodified );

		$data[] = new xmlrpcval(array(
				'page_id' => new xmlrpcval($Item->ID, 'int'),
				'page_title' => new xmlrpcval($Item->title),
				'page_parent_id' => new xmlrpcval( (isset($Item->parent_ID) ? $Item->parent_ID : 0), 'int'),
				'dateCreated' => new xmlrpcval( datetime_to_iso8601($Item->issue_date), 'dateTime.iso8601' ),
				'date_created_gmt' => new xmlrpcval( datetime_to_iso8601($Item->issue_date, true), 'dateTime.iso8601' ),
			),'struct');
	}

	logIO( 'OK.' );
	return new xmlrpcresp( new xmlrpcval( $data, 'array' ) );
}


$wordpressgetpages_doc = 'Get an array of all the pages on a blog.';
$wordpressgetpages_sig =  array(array($xmlrpcArray,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcInt));
/**
 * wp.getPages
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.getPages
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 *					3 max_pages (int) optional, default=10.
 */
function wp_getpages( $m )
{
	logIO( 'wp_getpages start' );

	// CHECK LOGIN:
	/**
	 * @var User
	 */
	if( ! $current_User = & xmlrpcs_login( $m, 1, 2 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	$limit = $m->getParam(3);
	$limit = abs($limit->scalarval());

	$items = xmlrpc_get_items( array(
			'limit' => $limit,
			'itemtype_usage' => 'page',
		), $Blog );

	if( empty($items) )
	{
		return new xmlrpcresp( new xmlrpcval( array(), 'array' ) );
	}

	$data = array();
	foreach( $items as $item )
	{
		$data[] = new xmlrpcval( $item, 'struct' );
	}

	logIO( 'OK.' );
	return new xmlrpcresp( new xmlrpcval( $data, 'array' ) );
}


$wordpressgetpage_doc = 'Get the page identified by the page id.';
$wordpressgetpage_sig =  array(array($xmlrpcArray,$xmlrpcInt,$xmlrpcInt,$xmlrpcString,$xmlrpcString));
/**
 * wp.getPage
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.getPage
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 page_id (int): Requested page ID.
 *					2 username (string): User login.
 *					3 password (string): Password for said username.
 */
function wp_getpage( $m )
{
	logIO( 'wp_getpage start' );

	// CHECK LOGIN:
	/**
	 * @var User
	 */
	if( ! $current_User = & xmlrpcs_login( $m, 2, 3 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	$item_ID = $m->getParam(1);
	$item_ID = abs($item_ID->scalarval());

	$items = xmlrpc_get_items( array(
			'item_ID' => $item_ID,
		), $Blog );

	if( empty($items) )
	{
		return xmlrpcs_resperror( 6, 'Requested post/Item ('.$item_ID.') does not exist.' );
	}

	logIO( 'OK.' );
	return new xmlrpcresp( new xmlrpcval( $items[0], 'struct' ) );
}

$wordpressgetpagestatuslist_doc = 'Retrieve all of the WordPress supported page statuses.';
$wordpressgetpoststatuslist_doc = 'Retrieve post statuses.';
$wordpressgetpagestatuslist_sig =  array(array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString));
/**
 * wp.getPageStatusList
 * wp.getPostStatusList
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.getPageStatusList
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 */
function wp_getpagestatuslist( $m )
{
	// CHECK LOGIN:
	/**
	 * @var User
	 */
	if( ! $current_User = & xmlrpcs_login( $m, 1, 2 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	$status_list = array();

	if( check_user_perm( 'blog_post!published', 'edit', false, $Blog->ID ) )
	{
		$status_list[ wp_or_b2evo_item_status('published', 'wp') ] = new xmlrpcval(T_('Published')) ;
	}

	if( check_user_perm( 'blog_post!protected', 'edit', false, $Blog->ID ) )
	{	// Not supported by WP, maps to 'private'
		$status_list[ wp_or_b2evo_item_status('protected', 'wp') ] = new xmlrpcval(T_('Protected')) ;
	}

	if( check_user_perm( 'blog_post!private', 'edit', false, $Blog->ID ) )
	{
		$status_list[ wp_or_b2evo_item_status('private', 'wp') ] = new xmlrpcval(T_('Private')) ;
	}

	if( check_user_perm( 'blog_post!draft', 'edit', false, $Blog->ID ) )
	{
		$status_list[ wp_or_b2evo_item_status('draft', 'wp') ] = new xmlrpcval(T_('Draft')) ;
	}

	if( check_user_perm( 'blog_post!deprecated', 'edit', false, $Blog->ID ) )
	{
		$status_list[ wp_or_b2evo_item_status('deprecated', 'wp') ] = new xmlrpcval(T_('Deprecated')) ;
	}

	if( check_user_perm( 'blog_post!redirected', 'edit', false, $Blog->ID ) )
	{	// Not supported by WP, maps to 'published'
		$status_list[ wp_or_b2evo_item_status('redirected', 'wp') ] = new xmlrpcval(T_('Redirected')) ;
	}
	return new xmlrpcresp(  new xmlrpcval($status_list,'struct') );
}


$wordpressgetpostformats_doc = 'Retrieve post formats.';
$wordpressgetpostformats_sig =  array(
		array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString), // WP for iOS
		array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcStruct), // WP specs
	);
/**
 * wp.getPostFormats
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.getPostFormats
 *
 * Note: by default (no filter) we return supported formats only.
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 *					3 filter (struct):
 * 						- show-supported
 */
function wp_getpostformats( $m )
{
	// CHECK LOGIN:
	/**
	 * @var User
	 */
	if( ! $current_User = & xmlrpcs_login( $m, 1, 2 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	if( isset($m->params[3]) )
	{
		$xcontent = $m->getParam(3);
		$contentstruct = xmlrpc_decode_recurse($xcontent);
	}

	// Compile an array of post type IDs to exclude:
	$exclude_posttype_IDs = array();

	// Get all item types with no "post" usage:
	$nopost_item_type_IDs = $DB->get_assoc( 'SELECT ityp_ID, ityp_usage FROM T_items__type WHERE ityp_usage != "post"' );

	foreach( $nopost_item_type_IDs as $ityp_ID => $ityp_usage )
	{
		if( ! check_user_perm( 'blog_'.$ityp_usage, 'edit', false, $Blog->ID ) )
		{	// No permission to use this post type:
			$exclude_posttype_IDs[] = $ityp_ID;
		}
	}

	$ItemTypeCache = & get_ItemTypeCache();

	$supported = $ItemTypeCache->get_option_array( $exclude_posttype_IDs );
	ksort($supported);

	$all = $ItemTypeCache->get_option_array();
	ksort($all);

	logIO( "All Post Types:\n".var_export($all, true) );
	logIO( "Supported Post Types:\n".var_export($supported, true) );

	$all_types = $supported_types = array();
	foreach( $all as $k=>$v )
	{
		$all_types[ strval($k) ] = new xmlrpcval($v);
	}

	foreach( $supported as $k=>$v )
	{
		$supported_types[ strval($k) ] = new xmlrpcval($v);
	}

	if( !empty($contentstruct) && is_array($contentstruct) )
	{	// Make sure there's a filter 'show-supported' that evaluates to TRUE
		if( isset($contentstruct['show-supported']) && $contentstruct['show-supported'] )
		{	// Display both 'all' and 'supported' post types
			$types = array(
					'all'		=> new xmlrpcval($all_types, 'struct'),
					'supported'	=> php_xmlrpc_encode( array_keys($supported_types) ),
				);

			logIO('OK.');
			return new xmlrpcresp( new xmlrpcval($types, 'struct') );
		}
	}

	logIO('OK.');
	return new xmlrpcresp( new xmlrpcval($supported_types, 'struct') );
}


$wordpressnewpage_doc = 'Create a new page';
$wordpressnewpage_sig = array(
		array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcStruct),
		array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcStruct,$xmlrpcBoolean),
	);
/**
 * wp.newPage
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.newPage
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (string): Unique identifier of the blog the post will be added to.
 *						Currently ignored in b2evo, in favor of the category.
 *					1 username (string): Login for a Blogger user who has permission to edit the given
 *						post (either the user who originally created it or an admin of the blog).
 *					2 password (string): Password for said username.
 *					3 struct (struct)
 *					4 publish (bool)
 */
function wp_newpage( $m )
{	// Call metaWeblog.newPost
	return mw_newpost( $m, 'page' );
}


$wordpresseditpage_doc = 'Make changes to a blog page';
$wordpresseditpage_sig = array(
		array($xmlrpcStruct,$xmlrpcInt,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcStruct),
		array($xmlrpcStruct,$xmlrpcInt,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcStruct,$xmlrpcBoolean),
	);
/**
 * wp.editPage
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.editPage
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (string): Unique identifier of the blog the post will be added to.
 *						Currently ignored in b2evo, in favor of the category.
 *					1 postid (string): Unique identifier of the post to edit
 *					2 username (string): Login for a Blogger user who has permission to edit the given
 *						post (either the user who originally created it or an admin of the blog).
 *					3 password (string): Password for said username.
 *					4 struct (struct)
 *					5 publish (bool)
 */
function wp_editpage( $m )
{
	// Arrange args in the way mw_editpost() understands.
	array_shift($m->params);

	// Call metaWeblog.editPost
	return mw_editpost( $m, 'page' );
}


$wordpressdeletepage_doc = 'Removes a page from the blog';
$wordpressdeletepage_sig = array(array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcInt));
/**
 * wp.deletePage
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.deletePage
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (string): Unique identifier of the blog the post will be added to.
 *						Currently ignored in b2evo, in favor of the category.
 *					1 username (string): Login for a Blogger user who has permission to edit the given
 *						post (either the user who originally created it or an admin of the blog).
 *					2 password (string): Password for said username.
 * 					3 postid (string): Unique identifier of the post to edit
 */
function wp_deletepage( $m )
{
	// CHECK LOGIN:
	if( ! $current_User = & xmlrpcs_login( $m, 1, 2 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET POST:
	/**
	 * @var Item
	 */
	if( ! $edited_Item = & xmlrpcs_get_Item( $m, 3 ) )
	{	// Failed, return (last) error:
		return xmlrpcs_resperror();
	}

	return xmlrpcs_delete_item( $edited_Item );
}


$wordpressUploadFile_doc = 'Uploads a file to the media library of the blog';
$wordpressUploadFile_sig = array(array( $xmlrpcStruct, $xmlrpcInt, $xmlrpcString, $xmlrpcString, $xmlrpcStruct ));
/**
 * wp.uploadFile
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.uploadFile
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 *					3 struct (struct)
 * 							- name : filename
 * 							- type : mimetype
 * 							- bits : base64 encoded file
 *							- overwrite : boolean
 * @return xmlrpcresp XML-RPC Response
 */
function wp_uploadfile($m)
{
	return _wp_mw_newmediaobject( $m );
}


$wordpressgetcats_sig =  array(array($xmlrpcStruct,$xmlrpcString,$xmlrpcString,$xmlrpcString));
$wordpressgetcats_doc = 'Get categories of a post, MetaWeblog API-style';
/**
 * wp.getCategories
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.getCategories
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 */
function wp_getcategories( $m )
{
	return _wp_mw_getcategories( $m );
}


$wordpresssuggestcats_sig =  array(
		array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcString),
		array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcString,$xmlrpcInt),
	);
$wordpresssuggestcats_doc = 'Get an array of categories that start with a given string.';
/**
 * wp.suggestCategories
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.suggestCategories
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 *					3 search (string): search string
 *					4 max_results (int)
 */
function wp_suggestcategories( $m )
{
	// Note: we display all cats if search string is empty
	$params['search'] = '';

	if( isset($m->params[3]) )
	{
		$search = $m->getParam(3);
		$params['search'] = trim($search->scalarval());
	}

	if( isset($m->params[4]) )
	{
		$limit = $m->getParam(4);
		$params['limit'] = abs($limit->scalarval());
	}

	return _wp_mw_getcategories( $m, $params );
}


$wordpressnewcategory_sig =  array(
		array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcStruct),
		array($xmlrpcStruct,$xmlrpcString,$xmlrpcString,$xmlrpcString,$xmlrpcStruct),
	);
$wordpressnewcategory_doc = 'Create a new category.';
/**
 * wp.newCategory
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.newCategory
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 *					3 params (struct):
 *						- name (string)
 *						- slug (string)
 *						- parent_id (int)
 *						- description (string)
 */
function wp_newcategory( $m )
{
	global $DB;

	// CHECK LOGIN:
	/**
	 * @var User
	 */
	if( ! $current_User = & xmlrpcs_login( $m, 1, 2 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	if( ! check_user_perm( 'blog_cats', '', false, $Blog->ID ) )
	{
		return xmlrpcs_resperror( 5, 'You are not allowed to add or edit categories in this blog.' );
	}

	$xcontent = $m->getParam(3);
	$contentstruct = xmlrpc_decode_recurse($xcontent);

	$slug = strtolower($contentstruct['name']);
	if( !empty($contentstruct['slug']) )
	{
		$slug = $contentstruct['slug'];
	}

	load_class('chapters/model/_chapter.class.php', 'Chapter');

	$new_Chapter = new Chapter(NULL, $Blog->ID);
	$new_Chapter->set('name', $contentstruct['name']);
	$new_Chapter->set('urlname', $slug);
	$new_Chapter->set('parent_ID', intval($contentstruct['parent_id']));

	if( !empty($contentstruct['description']) )
	{	// Set decription
		$new_Chapter->set('description', $contentstruct['description']);
	}

	$cat_ID = $new_Chapter->dbinsert();

	logIO( 'OK.' );
	return new xmlrpcresp( new xmlrpcval($cat_ID, 'int') );
}


$wordpressdeletecategory_doc = 'Remove category.';
$wordpressdeletecategory_sig =  array(array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcInt));
/**
 * wp.deleteCategory
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.deleteCategory
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 *					3 category_id (int): Category ID to delete
 */
function wp_deletecategory( $m )
{
	global $DB;

	// CHECK LOGIN:
	/**
	 * @var User
	 */
	if( ! $current_User = & xmlrpcs_login( $m, 1, 2 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	if( ! check_user_perm( 'blog_cats', 'edit', false, $Blog->ID ) )
	{	// Permission denied
		return xmlrpcs_resperror( 5, 'You are not allowed to delete categories in this blog.' );
	}

	/**
	 * @var Comment
	 */
	if( ! $edited_Chapter = & xmlrpcs_get_Chapter( $m, 3 ) )
	{	// Return (last) error:
		return xmlrpcs_resperror();
	}

	$restriction_Messages = $edited_Chapter->check_relations( 'delete_restrictions' );
	if( $restriction_Messages->count() )
	{
		return xmlrpcs_resperror( 5, $restriction_Messages->get_string( T_('The following relations prevent deletion:'),
					T_('Please delete related objects before you proceed.'), "  //  \n", 'xmlrpc' ) );
	}

	$ok = (bool) $edited_Chapter->dbdelete();

	logIO( 'Category deleted: '.($ok ? 'yes' : 'no') );

	return new xmlrpcresp( new xmlrpcval( $ok, 'boolean' ) );
}


$wordpressgetcommentstatuslist_doc = 'Retrieve all of the comment status.';
$wordpressgetcommentstatuslist_sig =  array(array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString));
/**
 * wp.getCommentStatusList
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.getCommentStatusList
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 */
function wp_getcommentstatuslist( $m )
{
	// CHECK LOGIN:
	/**
	 * @var User
	 */
	if( ! $current_User = & xmlrpcs_login( $m, 1, 2 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	$statuses = array();
	foreach( get_allowed_statuses() as $status )
	{
		switch($status)
		{
			case 'draft':
				$statuses[] = new xmlrpcval('hold');

			case 'published':
				$statuses[] = new xmlrpcval('approve');

			case 'deprecated':
				$statuses[] = new xmlrpcval('spam');
		}
	}

	if( check_user_perm('blog_comment!trash', '', false, $Blog->ID) )
	{
		$statuses[] = new xmlrpcval('trash');
	}

	return new xmlrpcresp( new xmlrpcval($statuses,'struct') );
}


$wordpressgetcomments_doc = 'Gets a set of comments for a given post.';
$wordpressgetcomments_sig =  array(array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcStruct));
/**
 * wp.getComments
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.getComments
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 *					3 params (struct): Filter array
 *						- post_id : The post where the comment is posted. Empty string shows all comments.
 *						- status (defaults to published) : Filter by status (published, deprecated, draft, trash)
 *						- number : Total number of comments to retrieve.
 *						- offset : Not used
 */
function wp_getcomments( $m )
{
	// CHECK LOGIN:
	/**
	 * @var User
	 */
	if( ! $current_User = & xmlrpcs_login( $m, 1, 2 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	$xcontent = $m->getParam(3);
	$contentstruct = xmlrpc_decode_recurse($xcontent);

	$limit = 10;
	$contentstruct['number'] = abs( intval($contentstruct['number']) );
	if( $contentstruct['number'] > 0 )
	{
		$limit = $contentstruct['number'];
	}

	$status = '';
	if( !empty($contentstruct['status']) )
	{
		$status = wp_or_b2evo_comment_status( $contentstruct['status'], 'b2evo' );
	}

	$item_ID = isset($contentstruct['post_id']) ? $contentstruct['post_id'] : 0;

	$comments = xmlrpc_get_comments( array(
			'limit'		=> $limit,
			'statuses'	=> $status,
			'item_ID'	=> $item_ID,
		), $Blog );

	if( empty($comments) )
	{
		return new xmlrpcresp( new xmlrpcval( array(), 'array' ) );
	}

	$data = array();
	foreach( $comments as $comment )
	{
		$data[] = new xmlrpcval( $comment, 'struct' );
	}
	logIO( 'OK.' );

	return new xmlrpcresp( new xmlrpcval( $data, 'array' ) );
}


$wordpressgetcomment_doc = 'Gets a comment, given it\'s comment ID';
$wordpressgetcomment_sig =  array(array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcInt));
/**
 * wp.getComments
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.getComment
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 *					3 comment_id (int) : Requested comment ID
 */
function wp_getcomment( $m )
{
	// CHECK LOGIN:
	/**
	 * @var User
	 */
	if( ! $current_User = & xmlrpcs_login( $m, 1, 2 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	$comment_ID = $m->getParam(3);
	$comment_ID = abs($comment_ID->scalarval());

	$comments = xmlrpc_get_comments( array(
			'comment_ID' => $comment_ID,
		), $Blog );

	if( empty($comments) )
	{
		return xmlrpcs_resperror( 6, 'Requested comment ('.$comment_ID.') does not exist.' );
	}

	logIO( 'OK.' );
	return new xmlrpcresp( new xmlrpcval( $comments[0], 'struct' ) );
}


$wordpressgetcommentcount_doc = 'Retrieve comment count for a specific post.';
$wordpressgetcommentcount_sig =  array(array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcInt));
/**
 * wp.getCommentCount
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.getCommentCount
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 *					3 post_id (int): The id of the post
 */
function wp_getcommentcount( $m )
{
	// CHECK LOGIN:
	/**
	 * @var User
	 */
	if( ! $current_User = & xmlrpcs_login( $m, 1, 2 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	$approved = $awaiting = $spam = $total = 0;
	if( $Blog->get_setting( 'allow_comments' ) != 'never' )
	{
		$item_ID = $m->getParam(3);
		$item_ID = $item_ID->scalarval();

		$approved	= generic_ctp_number($item_ID, 'feedbacks');
		$awaiting	= generic_ctp_number($item_ID, 'feedbacks', 'draft');
		$spam		= generic_ctp_number($item_ID, 'feedbacks', 'deprecated');
		$total		= generic_ctp_number($item_ID, 'feedbacks', 'total');
	}

	// Maybe we should do a check_perm here?
	$data = array(
			'approved'				=> new xmlrpcval( $approved, 'int' ),
			'awaiting_moderation'	=> new xmlrpcval( $awaiting, 'int' ),
			'spam'					=> new xmlrpcval( $spam,'int' ),
			'total_comment'			=> new xmlrpcval( $total,'int' ),
		);

	logIO( "published: $approved, draft: $awaiting, deprecated: $spam, total: $total" );

	return new xmlrpcresp( new xmlrpcval( $data, 'struct' ) );
}


$wordpressnewcomment_sig =  array(array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcInt,$xmlrpcStruct));
$wordpressnewcomment_doc = 'Create new comment.';
/**
 * wp.newComment
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.newComment
 *
 * Leave the second and third parameter blank to send anonymous comments
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 *					3 post_id (int): Target post ID
 *					4 params (struct):
 *						- comment_parent (int)
 *						- content (string)
 *						- author (string)
 *						- author_url (string)
 *						- author_email (string)
 */
function wp_newcomment( $m )
{
	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Blog not found
		return xmlrpcs_resperror();
	}

	if( ! $commented_Item = & xmlrpcs_get_Item( $m, 3 ) )
	{	// Item not found
		return xmlrpcs_resperror();
	}

	$username = $m->getParam(1);
	$username = $username->scalarval();

	$password = $m->getParam(2);
	$password = $password->scalarval();

	$options = $m->getParam(4);
	$options = xmlrpc_decode_recurse($options);

	logIO( 'Params: '.var_export($options, true) );

	$User = NULL;
	if( !empty($password) || !empty($username) )
	{	// Not an anonymous comment, let's check username

		// CHECK LOGIN:
		/**
		 * @var User
		 */
		if( ! $User = & xmlrpcs_login( $m, 1, 2 ) )
		{	// Login failed, return (last) error:
			return xmlrpcs_resperror();
		}
	}

	$params = array(
			'User'				=> & $User,
			'password'			=> $password,
			'username'			=> $username,
			'content'			=> $options['content'],
			'comment_parent'	=> intval($options['comment_parent']),
			'author'			=> $options['author'],
			'author_url'		=> $options['author_url'],
			'author_email'		=> $options['author_email'],
		);

	return xmlrpcs_new_comment( $params, $commented_Item );
}


$wordpresseditcomment_sig =  array(array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcInt,$xmlrpcStruct));
$wordpresseditcomment_doc = 'Edit comment.';
/**
 * wp.editComment
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.editComment
 *
 * Leave the second and third parameter blank to send anonymous comments
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 *					3 comment_id (int): Target post ID
 *					4 params (struct):
 *						- status (string)
 *						- date_created_gmt (string)
 *						- content (string)
 *						- author (string)
 *						- author_url (string)
 *						- author_email (string)
 */
function wp_editcomment( $m )
{
	// CHECK LOGIN:
	/**
	 * @var User
	 */
	if( ! $current_User = & xmlrpcs_login( $m, 1, 2 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Blog not found
		return xmlrpcs_resperror();
	}

	/**
	 * @var Comment
	 */
	if( ! $edited_Comment = & xmlrpcs_get_Comment( $m, 3 ) )
	{	// Return (last) error:
		return xmlrpcs_resperror();
	}

	if( ! check_user_perm( 'comment!CURSTATUS', 'edit', false, $edited_Comment ) )
	{	// Permission denied
		return xmlrpcs_resperror(3);
	}

	$options = $m->getParam(4);
	$options = xmlrpc_decode_recurse($options);

	//logIO( 'Params: '.var_export($options, true) );

	$params = array(
			'status'		=> wp_or_b2evo_comment_status($options['status'], 'b2evo'),
			'date'			=> _mw_decode_date($options),
			'content'		=> $options['content'],
			'author'		=> isset($options['author']) ? $options['author'] : '',
			'author_url'	=> isset($options['author_url']) ? $options['author_url'] : '',
			'author_email'	=> isset($options['author_email']) ? $options['author_email'] : '',
		);

	return xmlrpcs_edit_comment( $params, $edited_Comment );
}


$wordpressdeletecomment_doc = 'Remove comment.';
$wordpressdeletecomment_sig =  array(array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcInt));
/**
 * wp.deleteComment
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.deleteComment
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 *					3 comment_id (int): Comment ID to delete
 */
function wp_deletecomment( $m )
{
	global $DB;

	// CHECK LOGIN:
	/**
	 * @var User
	 */
	if( ! $current_User = & xmlrpcs_login( $m, 1, 2 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	/**
	 * @var Comment
	 */
	if( ! $edited_Comment = & xmlrpcs_get_Comment( $m, 3 ) )
	{	// Return (last) error:
		return xmlrpcs_resperror();
	}

	if( ! check_user_perm( 'comment!CURSTATUS', 'delete', false, $edited_Comment ) )
	{	// Permission denied
		return xmlrpcs_resperror(3);
	}

	$ok = (bool) $edited_Comment->dbdelete();

	logIO( 'Comment deleted: '.($ok ? 'yes' : 'no') );

	return new xmlrpcresp( new xmlrpcval( $ok, 'boolean' ) );
}


$wordpressgetoptions_doc = 'Retrieve blog options';
$wordpressgetoptions_sig =  array(
		array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString),
		array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcStruct),
		array($xmlrpcStruct,$xmlrpcInt,$xmlrpcString,$xmlrpcString,$xmlrpcArray),
	);
/**
 * wp.getOptions
 *
 * @see http://codex.wordpress.org/XML-RPC_wp#wp.getOptions
 *
 * Note: If passing in a struct, search for options listed within it.
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (int): Unique identifier of the blog.
 *					1 username (string): User login.
 *					2 password (string): Password for said username.
 *					3 options (struct)
 */
function wp_getoptions( $m )
{
	global $Settings;

	// CHECK LOGIN:
	/**
	 * @var User
	 */
	if( ! $current_User = & xmlrpcs_login( $m, 1, 2 ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	// GET BLOG:
	/**
	 * @var Blog
	 */
	if( ! ( $Collection = $Blog = & xmlrpcs_get_Blog( $m, 0 ) ) )
	{	// Login failed, return (last) error:
		return xmlrpcs_resperror();
	}

	if( isset($m->params[3]) )
	{
		$options = $m->getParam(3);
		$options = xmlrpc_decode_recurse($options);
	}

	$defaults = array(
			'software_name'			=> array( 'desc' => 'Software Name', 'value' => 'WordPress' ), // Pretend that we are running WP
			'software_version'		=> array( 'desc' => 'Software Version', 'value' => '3.3.2' ),
			'blog_url'				=> array( 'desc' => 'Site URL', 'value' => $Blog->gen_blogurl() ),
			'blog_title'			=> array( 'desc' => 'Site TitleL', 'value' => $Blog->get('name') ),
			'blog_tagline'			=> array( 'desc' => 'Site Tagline', 'value' => $Blog->get('tagline') ),
			'date_format'			=> array( 'desc' => 'Date Format', 'value' => locale_datefmt() ),
			'time_format'			=> array( 'desc' => 'Time Format', 'value' => locale_timefmt() ),
			'users_can_register'	=> array( 'desc' => 'Allow new users to sign up', 'value' => $Settings->get('newusers_canregister') == 'yes' ? '1' : '0' ),

			// We are using default thumbnail sizes from config
			'thumbnail_crop'		=> array( 'desc' => 'Crop thumbnail to exact dimensions', 'value' => false ),
			'thumbnail_size_w'		=> array( 'desc' => 'Thumbnail Width', 'value' => '160' ),
			'thumbnail_size_h'		=> array( 'desc' => 'Thumbnail Height', 'value' => '160' ),
			'medium_size_w'			=> array( 'desc' => 'Medium size image width', 'value' => '320' ),
			'medium_size_h'			=> array( 'desc' => 'Medium size image height', 'value' => '320' ),
			'large_size_w'			=> array( 'desc' => 'Large size image width', 'value' => '720' ),
			'large_size_h'			=> array( 'desc' => 'Large size image height', 'value' => '500' ),
		);

	$data = array();
	if( empty($options) )
	{	// No specific options where asked for, return all of them
		foreach( $defaults as $k => $opt )
		{
			$data[$k] = new xmlrpcval(array(
					'desc' => new xmlrpcval( $opt['desc'] ),
					'readonly' => new xmlrpcval( true, 'boolean' ),
					'value' => new xmlrpcval( $opt['value'] ),
				),'struct');
		}
		logIO('Retrieving all options');
	}
	else
	{
		foreach( $options as $k )
		{
			if( !isset($defaults[$k]) ) continue;

			$data[$k] = new xmlrpcval(array(
					'desc' => new xmlrpcval( $defaults[$k]['desc'] ),
					'readonly' => new xmlrpcval( true, 'boolean' ),
					'value' => new xmlrpcval( $defaults[$k]['value'] ),
				),'struct');

			logIO( 'Retrieving option: '.$k );
		}
	}
	logIO('OK.');

	return new xmlrpcresp( new xmlrpcval( $data, 'struct' ) );
}


// ========= Items
$xmlrpc_procs['wp.getPage'] = array( // OK
				'function' => 'wp_getpage',
				'signature' => $wordpressgetpage_sig,
				'docstring' => $wordpressgetpage_doc);

$xmlrpc_procs['wp.getPages'] = array( // OK
				'function' => 'wp_getpages',
				'signature' => $wordpressgetpages_sig,
				'docstring' => $wordpressgetpages_doc);

$xmlrpc_procs['wp.getPageList'] = array( // OK
				'function' => 'wp_getpagelist',
				'signature' => $wordpressgetpagelist_sig,
				'docstring' => $wordpressgetpagelist_doc);

$xmlrpc_procs['wp.getPageStatusList'] = array( // Incomplete (minor): protected and redirected
				'function' => 'wp_getpagestatuslist',
				'signature' => $wordpressgetpagestatuslist_sig,
				'docstring' => $wordpressgetpagestatuslist_doc);

$xmlrpc_procs['wp.getPostStatusList'] = array( // Alias to wp.getPageStatusList
				'function' => 'wp_getpagestatuslist',
				'signature' => $wordpressgetpagestatuslist_sig,
				'docstring' => $wordpressgetpoststatuslist_doc);

$xmlrpc_procs['wp.getPostFormats'] = array( // Incomplete (minor): 'show-supported'
				'function' => 'wp_getpostformats',
				'signature' => $wordpressgetpostformats_sig,
				'docstring' => $wordpressgetpostformats_doc);

$xmlrpc_procs['wp.newPage'] = array( // Untested
				'function' => 'wp_newpage',
				'signature' => $wordpressnewpage_sig,
				'docstring' => $wordpressnewpage_doc);

$xmlrpc_procs['wp.editPage'] = array( // Untested
				'function' => 'wp_editpage',
				'signature' => $wordpresseditpage_sig,
				'docstring' => $wordpresseditpage_doc);

$xmlrpc_procs['wp.deletePage'] = array( // OK
				'function' => 'wp_deletepage',
				'signature' => $wordpressdeletepage_sig,
				'docstring' => $wordpressdeletepage_doc);

/*
$xmlrpc_procs['wp.getPageTemplates'] = array( // Useless in b2evo
				'function' => 'wp_getpagetemplates',
				'signature' => $wordpressgetpagetemplates_sig,
				'docstring' => $wordpressgetpagetemplates_doc);
*/

// ========= Categories
$xmlrpc_procs['wp.getCategories'] = array( // OK
				'function' => 'wp_getcategories',
				'signature' => $wordpressgetcats_sig,
				'docstring' => $wordpressgetcats_doc );

$xmlrpc_procs['wp.newCategory'] = array( // OK
				'function' => 'wp_newcategory',
				'signature' => $wordpressnewcategory_sig,
				'docstring' => $wordpressnewcategory_doc);

$xmlrpc_procs['wp.deleteCategory'] = array( // OK
				'function' => 'wp_deletecategory',
				'signature' => $wordpressdeletecategory_sig,
				'docstring' => $wordpressdeletecategory_doc);

$xmlrpc_procs['wp.suggestCategories'] = array( // OK
				'function' => 'wp_suggestcategories',
				'signature' => $wordpresssuggestcats_sig,
				'docstring' => $wordpresssuggestcats_doc);


// ========= Comments
$xmlrpc_procs['wp.getComment'] = array( // OK
				'function' => 'wp_getcomment',
				'signature' => $wordpressgetcomment_sig,
				'docstring' => $wordpressgetcomment_doc);

$xmlrpc_procs['wp.getComments'] = array( // OK
				'function' => 'wp_getcomments',
				'signature' => $wordpressgetcomments_sig,
				'docstring' => $wordpressgetcomments_doc);

$xmlrpc_procs['wp.getCommentStatusList'] = array( // OK
				'function' => 'wp_getcommentstatuslist',
				'signature' => $wordpressgetcommentstatuslist_sig,
				'docstring' => $wordpressgetcommentstatuslist_doc);

$xmlrpc_procs['wp.newComment'] = array( // OK
				'function' => 'wp_newcomment',
				'signature' => $wordpressnewcomment_sig,
				'docstring' => $wordpressnewcomment_doc);

$xmlrpc_procs['wp.editComment'] = array( // OK
				'function' => 'wp_editcomment',
				'signature' => $wordpresseditcomment_sig,
				'docstring' => $wordpresseditcomment_doc);

$xmlrpc_procs['wp.getCommentCount'] = array( // OK
				'function' => 'wp_getcommentcount',
				'signature' => $wordpressgetcommentcount_sig,
				'docstring' => $wordpressgetcommentcount_doc);

$xmlrpc_procs['wp.deleteComment'] = array( // OK
				'function' => 'wp_deletecomment',
				'signature' => $wordpressdeletecomment_sig,
				'docstring' => $wordpressdeletecomment_doc);


// ========= Other
$xmlrpc_procs['wp.uploadFile'] = array( // OK
				'function' => 'wp_uploadfile',
				'signature' => $wordpressUploadFile_sig,
				'docstring' => $wordpressUploadFile_doc);

$xmlrpc_procs['wp.getTags'] = array( // OK
				'function' => 'wp_gettags',
				'signature' => $wordpressgettags_sig,
				'docstring' => $wordpressgettags_doc);

$xmlrpc_procs['wp.getUsersBlogs'] = array( // OK
				'function' => 'wp_getusersblogs',
				'signature' => $wordpressgetusersblogs_sig ,
				'docstring' => $wordpressgetusersblogs_doc );

$xmlrpc_procs['wp.getAuthors'] = array( // OK
				'function' => 'wp_getauthors',
				'signature' => $wordpressgetauthors_sig,
				'docstring' => $wordpressgetauthors_doc);

$xmlrpc_procs['wp.getOptions'] = array( // OK
				'function' => 'wp_getoptions',
				'signature' => $wordpressgetoptions_sig,
				'docstring' => $wordpressgetoptions_doc);

/*
$xmlrpc_procs['wp.setOptions'] = array( // TODO
				'function' => 'wp_setoptions',
				'signature' => $wordpresssetoptions_sig,
				'docstring' => $wordpresssetoptions_doc);

$xmlrpc_procs['wp.getMediaItem'] = array( // TODO
				'function' => 'wp_getmediaitem',
				'signature' => $wordpressgetmediaitem_sig,
				'docstring' => $wordpressgetmediaitem_doc);

$xmlrpc_procs['wp.getMediaLibrary'] = array( // TODO
				'function' => 'wp_getmedialibrary',
				'signature' => $wordpressgetmedialibrary_sig,
				'docstring' => $wordpressgetmedialibrary_doc);
*/

?>