-<?php\r
-\r
-/** \r
- * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/) \r
- * Copyright (C) 2002-2004 The Nucleus Group\r
- *\r
- * This program is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License\r
- * as published by the Free Software Foundation; either version 2\r
- * of the License, or (at your option) any later version.\r
- * (see nucleus/documentation/index.html#license for more info)\r
- */\r
-\r
-/*\r
- * This file contains definitions for the methods of the metaWeblog API\r
- */\r
- \r
- \r
- // metaWeblog.newPost\r
- $f_metaWeblog_newPost_sig = array(array(\r
- // return type\r
- $xmlrpcString, // itemid of the new item\r
-\r
- // params:\r
- $xmlrpcString, // blogid\r
- $xmlrpcString, // username\r
- $xmlrpcString, // password\r
- $xmlrpcStruct, // content\r
- $xmlrpcBoolean, // publish boolean (set to false to create draft)\r
-\r
- ));\r
- $f_metaWeblog_newPost_doc = "Adds a new item to the given blog. Adds it as a draft when publish is false";\r
- function f_metaWeblog_newPost($m) {\r
- $blogid = _getScalar($m,0);\r
- $username = _getScalar($m,1);\r
- $password = _getScalar($m,2);\r
- $struct = $m->getParam(3);\r
- $content = _getStructVal($struct, 'description');\r
- $title = _getStructVal($struct, 'title');\r
-\r
- // category is optional (thus: be careful)!\r
- $catlist = $struct->structmem('categories');\r
- if ($catlist && ($catlist->kindOf() == "array") && ($catlist->arraysize() > 0)) \r
- $category = _getArrayVal($catlist, 0);\r
-\r
- $publish = _getScalar($m,4);\r
-\r
- return _addItem($blogid, $username, $password, $title, $content, '', $publish, 0, $category);\r
- }\r
- \r
- \r
- // metaWeblog.getCategories\r
- $f_metaWeblog_getCategories_sig = array(array(\r
- // return\r
- $xmlrpcStruct, // categories for blog\r
- \r
- // params\r
- $xmlrpcString, // blogid\r
- $xmlrpcString, // username\r
- $xmlrpcString, // password\r
- \r
- ));\r
- $f_metaWeblog_getCategories_doc = "Returns the categories for a given blog";\r
- function f_metaWeblog_getCategories($m) {\r
- $blogid = _getScalar($m,0);\r
- $username = _getScalar($m,1);\r
- $password = _getScalar($m,2);\r
- \r
- return _categoryList($blogid, $username, $password);\r
- }\r
- \r
-\r
- // metaWeblog.getPost\r
- $f_metaWeblog_getPost_sig = array(array(\r
- // return\r
- $xmlrpcStruct, // the juice \r
- \r
- // params\r
- $xmlrpcString, // itemid\r
- $xmlrpcString, // username\r
- $xmlrpcString, // password\r
- \r
- ));\r
- $f_metaWeblog_getPost_doc = "Retrieves a post";\r
- function f_metaWeblog_getPost($m) {\r
- $itemid = _getScalar($m,0);\r
- $username = _getScalar($m,1);\r
- $password = _getScalar($m,2);\r
- \r
- return _mw_getPost($itemid, $username, $password);\r
- }\r
- \r
-\r
- // metaWeblog.editPost\r
- $f_metaWeblog_editPost_sig = array(array(\r
- // return type\r
- $xmlrpcBoolean, // true\r
-\r
- // params:\r
- $xmlrpcString, // itemid\r
- $xmlrpcString, // username\r
- $xmlrpcString, // password\r
- $xmlrpcStruct, // content\r
- $xmlrpcBoolean, // publish boolean (set to false to create draft)\r
-\r
- ));\r
- $f_metaWeblog_editPost_doc = "Edits an item";\r
- function f_metaWeblog_editPost($m) {\r
- global $manager;\r
-\r
- $itemid = _getScalar($m,0);\r
- $username = _getScalar($m,1);\r
- $password = _getScalar($m,2);\r
-\r
- $category = '';\r
- $struct = $m->getParam(3);\r
- $content = _getStructVal($struct, 'description');\r
- $title = _getStructVal($struct, 'title');\r
-\r
- // category is optional (thus: be careful)!\r
- $catlist = $struct->structmem('categories');\r
- if ($catlist && ($catlist->kindOf() == "array") && ($catlist->arraysize() > 0)) {\r
- $category = _getArrayVal($catlist, 0);\r
- } \r
- \r
- $publish = _getScalar($m,4);\r
-\r
- // get old title and extended part \r
- if (!$manager->existsItem($itemid,1,1))\r
- return _error(6,"No such item ($itemid)");\r
- $blogid = getBlogIDFromItemID($itemid);\r
-\r
- $old =& $manager->getItem($itemid,1,1);\r
- \r
- if ($category == '')\r
- {\r
- // leave category unchanged when not present\r
- $catid = $old['catid'];\r
- }\r
- else\r
- {\r
- $blog = new BLOG($blogid);\r
- $catid = $blog->getCategoryIdFromName($category);\r
- }\r
- \r
- if ($old['draft'] && $publish) {\r
- $wasdraft = 1;\r
- $publish = 1;\r
+<?php
+
+/*
+ * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
+ * Copyright (C) 2002-2009 The Nucleus Group
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * (see nucleus/documentation/index.html#license for more info)
+ */
+
+/**
+ * This file contains definitions for the methods of the metaWeblog API
+ *
+ * @license http://nucleuscms.org/license.txt GNU General Public License
+ * @copyright Copyright (C) 2002-2009 The Nucleus Group
+ * @version $Id: api_metaweblog.inc.php,v 1.6 2007-02-04 06:28:46 kimitake Exp $
+ * $NucleusJP: api_metaweblog.inc.php,v 1.5 2006/07/17 20:03:45 kimitake Exp $
+ */
+
+
+ // metaWeblog.newPost
+ $f_metaWeblog_newPost_sig = array(array(
+ // return type
+ $xmlrpcString, // itemid of the new item
+
+ // params:
+ $xmlrpcString, // blogid
+ $xmlrpcString, // username
+ $xmlrpcString, // password
+ $xmlrpcStruct, // content
+ $xmlrpcBoolean, // publish boolean (set to false to create draft)
+
+ ));
+ $f_metaWeblog_newPost_doc = "Adds a new item to the given blog. Adds it as a draft when publish is false";
+ function f_metaWeblog_newPost($m) {
+ global $manager;
+
+ $blogid = _getScalar($m,0);
+ $username = _getScalar($m,1);
+ $password = _getScalar($m,2);
+ $struct = $m->getParam(3);
+
+ $content = _getStructVal($struct, 'description');
+ $more = _getStructVal($struct, 'mt_text_more');
+ $title = _getStructVal($struct, 'title');
+
+ // category is optional (thus: be careful)!
+ $catlist = $struct->structmem('categories');
+ if ($catlist && ($catlist->kindOf() == "array") && ($catlist->arraysize() > 0))
+ $category = _getArrayVal($catlist, 0);
+
+
+// $comments = (int) _getStructVal($struct, 'mt_allow_comments') ? 0 : 1;\r
+ $comments = $struct->structmem('mt_allow_comments');\r
+ if ($comments) {\r
+ $closed = (intval(_getStructVal($struct, 'mt_allow_comments')) == 1) ? 0 : 1;\r
} else {\r
- $wasdraft = 0;\r
- }\r
-\r
- return _edititem($itemid, $username, $password, $catid, $title, $content, $old['more'], $wasdraft, $publish, $old['closed']);\r
-\r
- }\r
- \r
- // metaWeblog.newMediaObject\r
- $f_metaWeblog_newMediaObject_sig = array(array(\r
- // return type\r
- $xmlrpcStruct, // "url" element\r
- \r
- // params\r
- $xmlrpcString, // blogid\r
- $xmlrpcString, // username\r
- $xmlrpcString, // password\r
- $xmlrpcStruct // 'name', 'type' and 'bits'\r
- ));\r
- $f_metaWeblog_newMediaObject_doc = 'Uploads a file to to the media library of the user';\r
- function f_metaWeblog_newMediaObject($m) {\r
- $blogid = _getScalar($m, 0);\r
- $username = _getScalar($m, 1);\r
- $password = _getScalar($m, 2);\r
- \r
- $struct = $m->getParam(3);\r
- $name = _getStructVal($struct, 'name');\r
- $type = _getStructVal($struct, 'type');\r
- $bits = _getStructVal($struct, 'bits');\r
- \r
- return _newMediaObject($blogid, $username, $password, array('name' => $name, 'type' => $type, 'bits' => $bits));\r
- }\r
- \r
- // metaWeblog.getRecentPosts\r
- $f_metaWeblog_getRecentPosts_sig = array(array(\r
- // return type\r
- $xmlrpcStruct, // array of structs\r
-\r
- // params\r
- $xmlrpcString, // blogid\r
- $xmlrpcString, // username\r
- $xmlrpcString, // password\r
- $xmlrpcInt // number of posts\r
- ));\r
- $f_metaWeblog_getRecentPosts_doc = 'Returns recent weblog items.';\r
- function f_metaWeblog_getRecentPosts($m) {\r
- $blogid = _getScalar($m, 0);\r
- $username = _getScalar($m, 1);\r
- $password = _getScalar($m, 2);\r
- $amount = intval(_getScalar($m, 3));\r
- \r
- return _getRecentItemsMetaWeblog($blogid, $username, $password, $amount); \r
- }\r
- \r
- function _getRecentItemsMetaWeblog($blogid, $username, $password, $amount) {\r
- \r
- $blogid = intval($blogid);\r
- $amount = intval($amount);\r
- \r
- // 1. login\r
- $mem = new MEMBER();\r
- if (!$mem->login($username, $password))\r
- return _error(1,"Could not log in");\r
-\r
- // 2. check if allowed \r
- if (!BLOG::existsID($blogid))\r
- return _error(2,"No such blog ($blogid)");\r
- if (!$mem->teamRights($blogid))\r
- return _error(3,"Not a team member");\r
- $amount = intval($amount);\r
- if (($amount < 1) or ($amount > 20))\r
- return _error(5,"Amount parameter must be in range 1..20");\r
-\r
- // 3. create and return list of recent items\r
- // Struct returned has dateCreated, userid, blogid and content\r
- \r
- $blog = new BLOG($blogid);\r
-\r
- $structarray = array(); // the array in which the structs will be stored\r
-\r
- $query = "SELECT mname, ibody, iauthor, ibody, inumber, ititle as title, itime, cname as category"\r
- .' FROM '.sql_table('item').', '.sql_table('category').', '.sql_table('member')\r
- ." WHERE iblog=$blogid and icat=catid and iauthor=mnumber"\r
- ." ORDER BY itime DESC"\r
- ." LIMIT $amount";\r
- $r = sql_query($query);\r
- \r
- while ($row = mysql_fetch_assoc($r)) {\r
- \r
- // remove linebreaks if needed\r
- if ($blog->convertBreaks())\r
- $row['ibody'] = removeBreaks($row['ibody']);\r
-\r
- $newstruct = new xmlrpcval(array(\r
- "dateCreated" => new xmlrpcval(iso8601_encode(strtotime($row['itime'])),"dateTime.iso8601"),\r
- "userid" => new xmlrpcval($row['iauthor'],"string"),\r
- "blogid" => new xmlrpcval($blogid,"string"),\r
- "postid" => new xmlrpcval($row['inumber'],"string"),\r
- "description" => new xmlrpcval($row['ibody'],"string"),\r
- "title" => new xmlrpcval($row['title'],"string"),\r
- "categories" => new xmlrpcval(\r
- array(\r
- new xmlrpcval($row['category'], "string")\r
- )\r
- ,"array")\r
- ),'struct');\r
- \r
- //TODO: String link?\r
- //TODO: String permaLink?\r
- //TODO: String nucleus_more?\r
- \r
- \r
- array_push($structarray, $newstruct); \r
- }\r
-\r
- return new xmlrpcresp(new xmlrpcval( $structarray , "array"));\r
- }\r
- \r
- function _newMediaObject($blogid, $username, $password, $info) {\r
- global $CONF, $DIR_MEDIA, $DIR_LIBS;\r
- \r
- // - login\r
- $mem = new MEMBER();\r
- if (!$mem->login($username, $password))\r
- return _error(1,'Could not log in');\r
- \r
- // - check if team member \r
- if (!BLOG::existsID($blogid))\r
- return _error(2,"No such blog ($blogid)");\r
- if (!$mem->teamRights($blogid))\r
- return _error(3,'Not a team member');\r
- \r
- $b = new BLOG($blogid);\r
- \r
- // - decode data\r
- $data = $info['bits']; // decoding was done transparantly by xmlrpclib\r
- \r
- // - check filesize\r
- if (strlen($data) > $CONF['MaxUploadSize'])\r
- return _error(9, 'filesize is too big');\r
-\r
- \r
- // - check if filetype is allowed (check filename)\r
- $filename = $info['name'];\r
- $ok = 0;\r
- $allowedtypes = explode (',', $CONF['AllowedTypes']);\r
- foreach ( $allowedtypes as $type ) \r
- if (eregi("\." .$type. "$",$filename)) $ok = 1; \r
- if (!$ok) \r
- _error(8, 'Filetype is not allowed');\r
- \r
- // - add file to media library\r
- include_once($DIR_LIBS . 'MEDIA.php'); // media classes\r
- \r
- // always use private media library of member\r
- $collection = $mem->getID();\r
-\r
- // prefix filename with current date (YYYY-MM-DD-)\r
- // this to avoid nameclashes\r
- if ($CONF['MediaPrefix'])\r
- $filename = strftime("%Y%m%d-", time()) . $filename; \r
- \r
- $res = MEDIA::addMediaObjectRaw($collection, $filename, $data);\r
- if ($res)\r
- return _error(10, $res);\r
- \r
- // - return URL\r
- $urlstruct = new xmlrpcval(array(\r
- "url" => new xmlrpcval($CONF['MediaURL'] . $collection. '/' . $filename,'string')\r
- ),'struct'); \r
- \r
- return new xmlrpcresp($urlstruct);\r
- }\r
- \r
- function _categoryList($blogid, $username, $password) {\r
- // 1. login\r
- $mem = new MEMBER();\r
- if (!$mem->login($username, $password))\r
- return _error(1,"Could not log in");\r
-\r
- // check if on team and blog exists\r
- if (!BLOG::existsID($blogid))\r
- return _error(2,"No such blog ($blogid)");\r
- if (!$mem->teamRights($blogid))\r
- return _error(3,"Not a team member");\r
- \r
- $b = new BLOG($blogid);\r
- \r
- $categorystruct = array();\r
-\r
- $query = "SELECT cname, cdesc, catid"\r
- . ' FROM '.sql_table('category')\r
- . " WHERE cblog=" . intval($blogid)\r
- . " ORDER BY cname";\r
- $r = sql_query($query);\r
-\r
- while ($obj = mysql_fetch_object($r)) {\r
-\r
- $categorystruct[$obj->cname] = new xmlrpcval(\r
- array(\r
- "description" => new xmlrpcval($obj->cdesc,"string"),\r
- "htmlUrl" => new xmlrpcval($b->getURL() . "?catid=" . $obj->catid ,"string"),\r
- "rssUrl" => new xmlrpcval("","string")\r
- )\r
- ,'struct');\r
+ $closed = 0;\r
}\r
- \r
- \r
- return new xmlrpcresp(new xmlrpcval( $categorystruct , "struct"));\r
- \r
- }\r
- \r
- \r
- function _mw_getPost($itemid, $username, $password) {\r
- global $manager;\r
- \r
- // 1. login\r
- $mem = new MEMBER();\r
- if (!$mem->login($username, $password))\r
- return _error(1,"Could not log in");\r
-\r
- // 2. check if allowed \r
- if (!$manager->existsItem($itemid,1,1))\r
- return _error(6,"No such item ($itemid)");\r
- $blogid = getBlogIDFromItemID($itemid);\r
- if (!$mem->teamRights($blogid))\r
- return _error(3,"Not a team member");\r
-\r
- // 3. return the item\r
- $item =& $manager->getItem($itemid,1,1); // (also allow drafts and future items)\r
- \r
- $b = new BLOG($blogid);\r
- if ($b->convertBreaks())\r
- $item['body'] = removeBreaks($item['body']);\r
- \r
- $categoryname = $b->getCategoryName($item['catid']);\r
-\r
- $newstruct = new xmlrpcval(array(\r
- "dateCreated" => new xmlrpcval(iso8601_encode($item['timestamp']),"dateTime.iso8601"),\r
- "userid" => new xmlrpcval($item['authorid'],"string"),\r
- "blogid" => new xmlrpcval($blogid,"string"),\r
- "postid" => new xmlrpcval($itemid, "string"),\r
- "description" => new xmlrpcval($item['body'],"string"),\r
- "title" => new xmlrpcval($item['title'],"string"),\r
- "categories" => new xmlrpcval(\r
- array(\r
- new xmlrpcval($categoryname, "string")\r
- )\r
- ,"array")\r
- ),'struct');\r
- \r
- //TODO: add "String link" to struct?\r
- //TODO: add "String permaLink" to struct? \r
- //TODO: add "String nucleus_more" to struct?\r
-\r
- return new xmlrpcresp($newstruct);\r
- \r
- }\r
- \r
- $functionDefs = array_merge($functionDefs,\r
- array(\r
- "metaWeblog.newPost" =>\r
- array(\r
- "function" => "f_metaWeblog_newPost",\r
- "signature" => $f_metaWeblog_newPost_sig,\r
- "docstring" => $f_metaWeblog_newPost_doc\r
- ),\r
-\r
- "metaWeblog.getCategories" =>\r
- array(\r
- "function" => "f_metaWeblog_getCategories",\r
- "signature" => $f_metaWeblog_getCategories_sig,\r
- "docstring" => $f_metaWeblog_getCategories_doc\r
- ), \r
-\r
- "metaWeblog.getPost" =>\r
- array(\r
- "function" => "f_metaWeblog_getPost",\r
- "signature" => $f_metaWeblog_getPost_sig,\r
- "docstring" => $f_metaWeblog_getPost_doc\r
- ), \r
-\r
- "metaWeblog.editPost" =>\r
- array(\r
- "function" => "f_metaWeblog_editPost",\r
- "signature" => $f_metaWeblog_editPost_sig,\r
- "docstring" => $f_metaWeblog_editPost_doc\r
- ),\r
- \r
- 'metaWeblog.newMediaObject' =>\r
- array(\r
- 'function' => 'f_metaWeblog_newMediaObject',\r
- 'signature' => $f_metaWeblog_newMediaObject_sig,\r
- 'docstring' => $f_metaWeblog_newMediaObject_doc\r
- ),\r
- \r
- 'metaWeblog.getRecentPosts' =>\r
- array(\r
- 'function' => 'f_metaWeblog_getRecentPosts',\r
- 'signature' => $f_metaWeblog_getRecentPosts_sig,\r
- 'docstring' => $f_metaWeblog_getRecentPosts_doc\r
- ) \r
- \r
- )\r
- );\r
+ $publish = _getScalar($m,4);
+
+
+ // Add item
+// $res = _addItem($blogid, $username, $password, $title, $content, $more, $publish, $comments, $category);\r
+ $res = _addItem($blogid, $username, $password, $title, $content, $more, $publish, $closed, $category);\r
+
+ // Handle trackbacks
+ $trackbacks = array();
+ $tblist = $struct->structmem('mt_tb_ping_urls');
+ if ($tblist && ($tblist->kindOf() == "array") && ($tblist->arraysize() > 0)) {
+
+ for ($i = 0; $i < $tblist->arraysize(); $i++) {
+ $trackbacks[] = _getArrayVal($tblist, $i);
+ }
+
+ $manager->notify('SendTrackback', array ('tb_id' => $itemid, 'urls' => & $trackbacks));
+ }
+
+ return $res;
+ }
+
+
+ // metaWeblog.getCategories
+ $f_metaWeblog_getCategories_sig = array(array(
+ // return
+ $xmlrpcStruct, // categories for blog
+
+ // params
+ $xmlrpcString, // blogid
+ $xmlrpcString, // username
+ $xmlrpcString, // password
+
+ ));
+ $f_metaWeblog_getCategories_doc = "Returns the categories for a given blog";
+ function f_metaWeblog_getCategories($m) {
+ $blogid = _getScalar($m,0);
+ $username = _getScalar($m,1);
+ $password = _getScalar($m,2);
+
+ return _categoryList($blogid, $username, $password);
+ }
+
+
+ // metaWeblog.getPost
+ $f_metaWeblog_getPost_sig = array(array(
+ // return
+ $xmlrpcStruct, // the juice
+
+ // params
+ $xmlrpcString, // itemid
+ $xmlrpcString, // username
+ $xmlrpcString, // password
+
+ ));
+ $f_metaWeblog_getPost_doc = "Retrieves a post";
+ function f_metaWeblog_getPost($m) {
+ $itemid = _getScalar($m,0);
+ $username = _getScalar($m,1);
+ $password = _getScalar($m,2);
+
+ return _mw_getPost($itemid, $username, $password);
+ }
+
+
+ // metaWeblog.editPost
+ $f_metaWeblog_editPost_sig = array(array(
+ // return type
+ $xmlrpcBoolean, // true
+
+ // params:
+ $xmlrpcString, // itemid
+ $xmlrpcString, // username
+ $xmlrpcString, // password
+ $xmlrpcStruct, // content
+ $xmlrpcBoolean, // publish boolean (set to false to create draft)
+
+ ));
+ $f_metaWeblog_editPost_doc = "Edits an item";
+ function f_metaWeblog_editPost($m) {
+ global $manager;
+
+ $itemid = _getScalar($m,0);
+ $username = _getScalar($m,1);
+ $password = _getScalar($m,2);
+
+ $category = '';
+ $struct = $m->getParam(3);
+ $content = _getStructVal($struct, 'description');
+ $title = _getStructVal($struct, 'title');
+
+ // category is optional (thus: be careful)!
+ $catlist = $struct->structmem('categories');
+ if ($catlist && ($catlist->kindOf() == "array") && ($catlist->arraysize() > 0)) {
+ $category = _getArrayVal($catlist, 0);
+ }
+
+ $publish = _getScalar($m,4);
+
+
+ // get old title and extended part
+ if (!$manager->existsItem($itemid,1,1))
+ return _error(6,"No such item ($itemid)");
+ $blogid = getBlogIDFromItemID($itemid);
+
+ $old =& $manager->getItem($itemid,1,1);
+
+ if ($category == '')
+ {
+ // leave category unchanged when not present
+ $catid = $old['catid'];
+ }
+ else
+ {
+ $blog = new BLOG($blogid);
+ $catid = $blog->getCategoryIdFromName($category);
+ }
+
+ if ($old['draft'] && $publish) {
+ $wasdraft = 1;
+ $publish = 1;
+ } else {
+ $wasdraft = 0;
+ }
+
+ $more = $struct->structmem('mt_text_more');
+ if ($more) {
+ $more = _getStructVal($struct, 'mt_text_more');
+ } else {
+ $more = $old['more'];
+ }
+
+ $comments = $struct->structmem('mt_allow_comments');
+ if ($comments) {
+// $comments = (int) _getStructVal($struct, 'mt_allow_comments') ? 0 : 1;\r
+ $closed = (intval(_getStructVal($struct, 'mt_allow_comments')) == 1) ? 0 : 1;\r
+ } else {
+// $comments = $old['closed'];\r
+ $closed = $old['closed'];\r
+ }
+
+// $res = _edititem($itemid, $username, $password, $catid, $title, $content, $more, $wasdraft, $publish, $comments);\r
+ $res = _edititem($itemid, $username, $password, $catid, $title, $content, $more, $wasdraft, $publish, $closed);
+ // Handle trackbacks
+ $trackbacks = array();
+ $tblist = $struct->structmem('mt_tb_ping_urls');
+ if ($tblist && ($tblist->kindOf() == "array") && ($tblist->arraysize() > 0)) {
+
+ for ($i = 0; $i < $tblist->arraysize(); $i++) {
+ $trackbacks[] = _getArrayVal($tblist, $i);
+ }
+
+ $manager->notify('SendTrackback', array ('tb_id' => $itemid, 'urls' => & $trackbacks));
+ }
+
+ return $res;
+ }
+
+ // metaWeblog.newMediaObject
+ $f_metaWeblog_newMediaObject_sig = array(array(
+ // return type
+ $xmlrpcStruct, // "url" element
+
+ // params
+ $xmlrpcString, // blogid
+ $xmlrpcString, // username
+ $xmlrpcString, // password
+ $xmlrpcStruct // 'name', 'type' and 'bits'
+ ));
+ $f_metaWeblog_newMediaObject_doc = 'Uploads a file to to the media library of the user';
+ function f_metaWeblog_newMediaObject($m) {
+ $blogid = _getScalar($m, 0);
+ $username = _getScalar($m, 1);
+ $password = _getScalar($m, 2);
+
+ $struct = $m->getParam(3);
+ $name = _getStructVal($struct, 'name');
+ $type = _getStructVal($struct, 'type');
+ $bits = _getStructVal($struct, 'bits');
+
+ return _newMediaObject($blogid, $username, $password, array('name' => $name, 'type' => $type, 'bits' => $bits));
+ }
+
+ // metaWeblog.getRecentPosts
+ $f_metaWeblog_getRecentPosts_sig = array(array(
+ // return type
+ $xmlrpcStruct, // array of structs
+
+ // params
+ $xmlrpcString, // blogid
+ $xmlrpcString, // username
+ $xmlrpcString, // password
+ $xmlrpcInt // number of posts
+ ));
+ $f_metaWeblog_getRecentPosts_doc = 'Returns recent weblog items.';
+ function f_metaWeblog_getRecentPosts($m) {
+ $blogid = _getScalar($m, 0);
+ $username = _getScalar($m, 1);
+ $password = _getScalar($m, 2);
+ $amount = intval(_getScalar($m, 3));
+
+ return _getRecentItemsMetaWeblog($blogid, $username, $password, $amount);
+ }
+
+ function _getRecentItemsMetaWeblog($blogid, $username, $password, $amount) {
+
+ $blogid = intval($blogid);
+ $amount = intval($amount);
+
+ // 1. login
+ $mem = new MEMBER();
+ if (!$mem->login($username, $password))
+ return _error(1,"Could not log in");
+
+ // 2. check if allowed
+ if (!BLOG::existsID($blogid))
+ return _error(2,"No such blog ($blogid)");
+ if (!$mem->teamRights($blogid))
+ return _error(3,"Not a team member");
+ $amount = intval($amount);
+ if (($amount < 1) or ($amount > 20))
+ return _error(5,"Amount parameter must be in range 1..20");
+
+ // 3. create and return list of recent items
+ // Struct returned has dateCreated, userid, blogid and content
+
+ $blog = new BLOG($blogid);
+
+ $structarray = array(); // the array in which the structs will be stored
+
+ $query = "SELECT mname, ibody, imore, iauthor, ibody, inumber, ititle as title, itime, cname as category, iclosed"
+ .' FROM '.sql_table('item').', '.sql_table('category').', '.sql_table('member')
+ ." WHERE iblog=$blogid and icat=catid and iauthor=mnumber"
+ ." ORDER BY itime DESC"
+ ." LIMIT $amount";
+ $r = sql_query($query);
+
+ while ($row = mysql_fetch_assoc($r)) {
+
+ // remove linebreaks if needed
+ if ($blog->convertBreaks()) {
+ $row['ibody'] = removeBreaks($row['ibody']);
+ $row['imore'] = removeBreaks($row['imore']);
+ }
+
+ $newstruct = new xmlrpcval(array(
+ "dateCreated" => new xmlrpcval(iso8601_encode(strtotime($row['itime'])),"dateTime.iso8601"),
+ "userid" => new xmlrpcval($row['iauthor'],"string"),
+ "blogid" => new xmlrpcval($blogid,"string"),
+ "postid" => new xmlrpcval($row['inumber'],"string"),
+ "description" => new xmlrpcval($row['ibody'],"string"),
+ "title" => new xmlrpcval($row['title'],"string"),
+ "categories" => new xmlrpcval(
+ array(
+ new xmlrpcval($row['category'], "string")
+ )
+ ,"array"),
+
+
+ "mt_text_more" => new xmlrpcval($row['imore'], "string"),
+ "mt_allow_comments" => new xmlrpcval($row['iclosed'] ? 0 : 1, "int"),
+ "mt_allow_pings" => new xmlrpcval(1, "int")
+ ),'struct');
+
+ //TODO: String link?
+ //TODO: String permaLink?
+
+
+ array_push($structarray, $newstruct);
+ }
+
+ return new xmlrpcresp(new xmlrpcval( $structarray , "array"));
+ }
+
+ function _newMediaObject($blogid, $username, $password, $info) {
+ global $CONF, $DIR_MEDIA, $DIR_LIBS;
+
+ // - login
+ $mem = new MEMBER();
+ if (!$mem->login($username, $password))
+ return _error(1,'Could not log in');
+
+ // - check if team member
+ if (!BLOG::existsID($blogid))
+ return _error(2,"No such blog ($blogid)");
+ if (!$mem->teamRights($blogid))
+ return _error(3,'Not a team member');
+
+ $b = new BLOG($blogid);
+
+ // - decode data
+ $data = $info['bits']; // decoding was done transparantly by xmlrpclib
+
+ // - check filesize
+ if (strlen($data) > $CONF['MaxUploadSize'])
+ return _error(9, 'filesize is too big');
+
+
+ // - check if filetype is allowed (check filename)
+ $filename = $info['name'];
+ $ok = 0;
+ $allowedtypes = explode (',', $CONF['AllowedTypes']);
+ foreach ( $allowedtypes as $type )
+ if (eregi("\." .$type. "$",$filename)) $ok = 1;
+ if (!$ok)
+ _error(8, 'Filetype is not allowed');
+
+ // - add file to media library
+ include_once($DIR_LIBS . 'MEDIA.php'); // media classes
+
+ // always use private media library of member
+ $collection = $mem->getID();
+
+ // prefix filename with current date (YYYY-MM-DD-)
+ // this to avoid nameclashes
+ if ($CONF['MediaPrefix'])
+ $filename = strftime("%Y%m%d-", time()) . $filename;
+
+ $res = MEDIA::addMediaObjectRaw($collection, $filename, $data);
+ if ($res)
+ return _error(10, $res);
+
+ // - return URL
+ $urlstruct = new xmlrpcval(array(
+ "url" => new xmlrpcval($CONF['MediaURL'] . $collection. '/' . $filename,'string')
+ ),'struct');
+
+ return new xmlrpcresp($urlstruct);
+ }
+
+ function _categoryList($blogid, $username, $password) {
+ // 1. login
+ $mem = new MEMBER();
+ if (!$mem->login($username, $password))
+ return _error(1,"Could not log in");
+
+ // check if on team and blog exists
+ if (!BLOG::existsID($blogid))
+ return _error(2,"No such blog ($blogid)");
+ if (!$mem->teamRights($blogid))
+ return _error(3,"Not a team member");
+
+ $b = new BLOG($blogid);
+
+ $categorystruct = array();
+
+ $query = "SELECT cname, cdesc, catid"
+ . ' FROM '.sql_table('category')
+ . " WHERE cblog=" . intval($blogid)
+ . " ORDER BY cname";
+ $r = sql_query($query);
+
+ while ($obj = mysql_fetch_object($r)) {
+
+ $categorystruct[$obj->cname] = new xmlrpcval(
+ array(
+ "description" => new xmlrpcval($obj->cdesc,"string"),
+ "htmlUrl" => new xmlrpcval($b->getURL() . "?catid=" . $obj->catid ,"string"),
+ "rssUrl" => new xmlrpcval("","string")
+ )
+ ,'struct');
+ }
+
+
+ return new xmlrpcresp(new xmlrpcval( $categorystruct , "struct"));
+
+ }
+
+
+ function _mw_getPost($itemid, $username, $password) {
+ global $manager;
+
+ // 1. login
+ $mem = new MEMBER();
+ if (!$mem->login($username, $password))
+ return _error(1,"Could not log in");
+
+ // 2. check if allowed
+ if (!$manager->existsItem($itemid,1,1))
+ return _error(6,"No such item ($itemid)");
+ $blogid = getBlogIDFromItemID($itemid);
+ if (!$mem->teamRights($blogid))
+ return _error(3,"Not a team member");
+
+ // 3. return the item
+ $item =& $manager->getItem($itemid,1,1); // (also allow drafts and future items)
+
+ $b = new BLOG($blogid);
+ if ($b->convertBreaks()) {
+ $item['body'] = removeBreaks($item['body']);
+ $item['more'] = removeBreaks($item['more']);
+ }
+
+ $categoryname = $b->getCategoryName($item['catid']);
+
+ $newstruct = new xmlrpcval(array(
+ "dateCreated" => new xmlrpcval(iso8601_encode($item['timestamp']),"dateTime.iso8601"),
+ "userid" => new xmlrpcval($item['authorid'],"string"),
+ "blogid" => new xmlrpcval($blogid,"string"),
+ "postid" => new xmlrpcval($itemid, "string"),
+ "description" => new xmlrpcval($item['body'],"string"),
+ "title" => new xmlrpcval($item['title'],"string"),
+ "categories" => new xmlrpcval(
+ array(
+ new xmlrpcval($categoryname, "string")
+ )
+ ,"array"),
+
+ "mt_text_more" => new xmlrpcval($item['more'], "string"),
+ "mt_allow_comments" => new xmlrpcval($item['closed'] ? 0 : 1, "int"),
+ "mt_allow_pings" => new xmlrpcval(1, "int")
+ ),'struct');
+
+ //TODO: add "String link" to struct?
+ //TODO: add "String permaLink" to struct?
+
+ return new xmlrpcresp($newstruct);
+
+ }
+
+ $functionDefs = array_merge($functionDefs,
+ array(
+ "metaWeblog.newPost" =>
+ array(
+ "function" => "f_metaWeblog_newPost",
+ "signature" => $f_metaWeblog_newPost_sig,
+ "docstring" => $f_metaWeblog_newPost_doc
+ ),
+
+ "metaWeblog.getCategories" =>
+ array(
+ "function" => "f_metaWeblog_getCategories",
+ "signature" => $f_metaWeblog_getCategories_sig,
+ "docstring" => $f_metaWeblog_getCategories_doc
+ ),
+
+ "metaWeblog.getPost" =>
+ array(
+ "function" => "f_metaWeblog_getPost",
+ "signature" => $f_metaWeblog_getPost_sig,
+ "docstring" => $f_metaWeblog_getPost_doc
+ ),
+
+ "metaWeblog.editPost" =>
+ array(
+ "function" => "f_metaWeblog_editPost",
+ "signature" => $f_metaWeblog_editPost_sig,
+ "docstring" => $f_metaWeblog_editPost_doc
+ ),
+
+ 'metaWeblog.newMediaObject' =>
+ array(
+ 'function' => 'f_metaWeblog_newMediaObject',
+ 'signature' => $f_metaWeblog_newMediaObject_sig,
+ 'docstring' => $f_metaWeblog_newMediaObject_doc
+ ),
+
+ 'metaWeblog.getRecentPosts' =>
+ array(
+ 'function' => 'f_metaWeblog_getRecentPosts',
+ 'signature' => $f_metaWeblog_getRecentPosts_sig,
+ 'docstring' => $f_metaWeblog_getRecentPosts_doc
+ )
+
+ )
+ );
?>
\ No newline at end of file