OSDN Git Service

コピーライトを2007から2009に変更
[nucleus-jp/nucleus-jp-ancient.git] / nucleus / xmlrpc / api_metaweblog.inc.php
index 271b1ef..a777c05 100755 (executable)
-<?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