/**
  *
  * @brief return XoopsXmlRpcTag that has response of this request
  *
  * @return XoopsXmlRpcTag
  */
 function render()
 {
     $unicode =& xoonips_getutility('unicode');
     $index = $this->response->getSuccess();
     $struct = new XoopsXmlRpcStruct();
     $struct->add('id', new XoopsXmlRpcInt($index['id']));
     $struct->add('name', new XoopsXmlRpcString(htmlspecialchars($unicode->encode_utf8($index['name'], xoonips_get_server_charset()), ENT_QUOTES, 'UTF-8')));
     $struct->add('parent', new XoopsXmlRpcInt($index['parent']));
     $struct->add('open_level', new XoopsXmlRpcString(htmlspecialchars($unicode->encode_utf8($index['open_level'], xoonips_get_server_charset()), ENT_QUOTES, 'UTF-8')));
     $struct->add('path', new XoopsXmlRpcString(htmlspecialchars($unicode->encode_utf8($index['path'], xoonips_get_server_charset()), ENT_QUOTES, 'UTF-8')));
     return $struct;
 }
 /**
  *
  * @brief return XoopsXmlRpcTag that has response of this request
  *
  * @return XoopsXmlRpcTag
  */
 function render()
 {
     $metadata = $this->response->getSuccess();
     $resp = new XoopsXmlRpcStruct();
     $unicode =& xoonips_getutility('unicode');
     $resp->add('id', new XoopsXmlRpcInt($metadata['id']));
     $resp->add('filetype', new XoopsXmlRpcString($metadata['filetype']));
     $resp->add('originalname', new XoopsXmlRpcString(htmlspecialchars($unicode->encode_utf8($metadata['originalname'], xoonips_get_server_charset()), ENT_QUOTES, 'UTF-8')));
     $resp->add('size', new XoopsXmlRpcInt($metadata['size']));
     $resp->add('mimetype', new XoopsXmlRpcString($metadata['mimetype']));
     $resp->add('caption', new XoopsXmlRpcString(htmlspecialchars($unicode->encode_utf8($metadata['caption'], xoonips_get_server_charset()), ENT_QUOTES, 'UTF-8')));
     $resp->add('thumbnail', new XoopsXmlRpcBase64($metadata['thumbnail']));
     $resp->add('registration_date', new XoopsXmlRpcDatetime($metadata['registration_date']));
     $resp->add('last_modified_date', new XoopsXmlRpcDatetime($metadata['last_modified_date']));
     $resp->add('download_count', new XoopsXmlRpcInt($metadata['download_count']));
     $resp->add('download_count_sum', new XoopsXmlRpcInt($metadata['download_count_sum']));
     return $resp;
 }
 /**
  * load and execute xoonips logic.
  *
  * @param[in] XooNIpsXmlRpcRequest $request
  * @param[out] XooNIpsXmlRpcResponse $response
  *  result of logic(success/fault, response, error)
  */
 function execute(&$request, &$response)
 {
     // load logic instance
     $factory =& XooNIpsLogicFactory::getInstance();
     $logic =& $factory->create($request->getMethodName());
     if (!is_object($logic)) {
         $response->setResult(false);
         $error =& $response->getError();
         $logic = $request->getMethodName();
         $error->add(XNPERR_SERVER_ERROR, "can't create a logic of {$logic}");
         return;
     }
     // execute logic
     $params =& $request->getParams();
     $xoonips_response = new XooNIpsResponse();
     if (count($params) < 3) {
         $response->setResult(false);
         $error =& $response->getError();
         $error->add(XNPERR_MISSING_PARAM);
         return false;
     } else {
         if (count($params) > 3) {
             $response->setResult(false);
             $error =& $response->getError();
             $error->add(XNPERR_EXTRA_PARAM);
             return false;
         }
     }
     $vars = array();
     $vars[0] = $params[0];
     $unicode =& xoonips_getutility('unicode');
     $vars[1] = array();
     foreach ($params[1] as $key => $val) {
         $vars[1][$key] = $unicode->decode_utf8($val, xoonips_get_server_charset(), 'h');
     }
     $vars[2] = $params[2];
     $logic->execute($vars, $xoonips_response);
     //
     $response->setResult($xoonips_response->getResult());
     $response->setError($xoonips_response->getError());
     $response->setSuccess($xoonips_response->getSuccess());
 }
 /**
  * 
  * @param
  * @return void
  */
 function xmlEndElementHandler($parser, $name)
 {
     global $xoopsDB;
     $binder_item_links =& $this->_import_item->getVar('binder_item_links');
     $unicode =& xoonips_getutility('unicode');
     switch (implode('/', $this->_tag_stack)) {
         case "ITEM/DETAIL":
             if (count($binder_item_links) == 0) {
                 $this->_import_item->setErrors(E_XOONIPS_TAG_NOT_FOUND, " no binder_item_link" . $this->_get_parser_error_at());
             }
             break;
         case "ITEM/DETAIL/BINDER_ITEM_LINK":
             $handler =& xoonips_getormhandler('xnpbinder', 'binder_item_link');
             $link =& $handler->create();
             $link->set('item_id', intval($unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h')));
             $binder_item_links[] =& $link;
             break;
     }
     parent::xmlEndElementHandler($parser, $name);
 }
 function harvest()
 {
     global $xoopsDB;
     $handler =& xoonips_getormhandler('xoonips', 'oaipmh_repositories');
     $ts =& MyTextSanitizer::getInstance();
     $criteria = new Criteria('URL', $this->_baseUrl);
     $repository =& $handler->getObjects($criteria);
     if (!$repository) {
         return false;
     }
     $repository[0]->set('last_access_date', time());
     $repository[0]->set('last_access_result', null);
     if ($handler->insert($repository[0], true)) {
         if ($this->Identify()) {
             $unicode =& xoonips_getutility('unicode');
             $repository[0]->set('repository_name', $unicode->decode_utf8($this->_repositoryName, xoonips_get_server_charset(), 'h'));
             $handler->insert($repository[0], true);
             if ($this->ListMetadataFormats()) {
                 $args = array('metadataPrefix' => $this->_metadataPrefix);
                 if ('' == $repository[0]->get('last_success_date')) {
                     $args['from'] = gmdate($this->_dateFormat, $this->_earliestDatestamp);
                 } else {
                     $args['from'] = gmdate($this->_dateFormat, $repository[0]->get('last_success_date'));
                 }
                 if ($this->ListRecords($args)) {
                     //update repositories table
                     $repository[0]->set('last_access_result', $this->_lastStatus);
                     $repository[0]->set('last_success_date', time());
                     $repository[0]->set('metadata_count', $this->getMetadataCount($repository[0]->get('repository_id')));
                     return $handler->insert($repository[0], true);
                 }
             }
         }
     } else {
         $this->_lastError = $xoopsDB->error();
     }
     //update repositories table(last_access_result)
     $repository[0]->set('last_access_result', $this->_lastError);
     $handler->insert($repository[0], true);
     return false;
 }
 /**
  *
  * @brief return XoopsXmlRpcTag that has response of this request
  *
  * @return XoopsXmlRpcTag
  */
 function render()
 {
     $file = $this->response->getSuccess();
     $filetype_handler =& xoonips_getormhandler('xoonips', 'file_type');
     $filetype = $filetype_handler->get($file->get('file_type_id'));
     if (!$filetype) {
         return new XooNIpsXmlRpcFault(106, 'file_type not found: id=' . $file->get('file_type_id'));
     }
     if (!file_exists($file->getFilepath())) {
         return new XooNIpsXmlRpcFault(106, 'file not found: id=' . $file->get('file_type_id'));
     }
     $resp = new XoopsXmlRpcStruct();
     $resp->add('id', new XoopsXmlRpcInt($file->get('file_id')));
     $resp->add('filetype', new XoopsXmlRpcString($filetype->get('name')));
     $unicode =& xoonips_getutility('unicode');
     $resp->add('originalname', new XoopsXmlRpcString(htmlspecialchars($unicode->encode_utf8($file->get('original_file_name'), xoonips_get_server_charset()), ENT_QUOTES, 'UTF-8')));
     $resp->add('size', new XoopsXmlRpcInt($file->get('file_size')));
     $resp->add('mimetype', new XoopsXmlRpcString($file->get('mime_type')));
     $resp->add('caption', new XoopsXmlRpcString(htmlspecialchars($unicode->encode_utf8($file->get('caption'), xoonips_get_server_charset()), ENT_QUOTES, 'UTF-8')));
     $resp->add('thumbnail', new XoopsXmlRpcBase64($file->get('thumbnail_file')));
     $resp->add('data', new XoopsXmlRpcBase64(file_get_contents($file->getFilepath())));
     return $resp;
 }
 function getObject($array)
 {
     $obj = new XooNIpsOrmFile();
     //$file_handler=&xoonips_getormhandler('xoonips', 'file');
     //$obj=&$file_handler->create();
     //
     // filetype to file_type_id
     $file_type_handler =& xoonips_getormhandler('xoonips', 'file_type');
     $filetypes =& $file_type_handler->getObjects(new Criteria('name', $array['filetype']));
     if (!$filetypes || count($filetypes) != 1) {
         return false;
     }
     //
     //
     $unicode =& xoonips_getutility('unicode');
     $obj->assignVar('file_id', $array['id']);
     $obj->assignVar('file_type_id', $filetypes[0]->get('file_type_id'));
     $obj->assignVar('original_file_name', $unicode->decode_utf8($array['originalname'], xoonips_get_server_charset(), 'h'));
     $obj->assignVar('file_size', intval($array['size']));
     $obj->assignVar('mime_type', $array['mimetype']);
     $obj->assignVar('caption', $unicode->decode_utf8($array['caption'], xoonips_get_server_charset(), 'h'));
     $obj->assignVar('thumbnail_file', $array['thumbnail']);
     return $obj;
 }
 /**
  *
  * @brief return XoopsXmlRpcTag that has response of this request
  *
  * @return XoopsXmlRpcTag
  */
 function render()
 {
     $resp = new XoopsXmlRpcStruct();
     $itemtype = $this->response->getSuccess();
     $resp->add('id', new XoopsXmlRpcInt($itemtype->get('item_type_id')));
     $resp->add('name', new XoopsXmlRpcString($itemtype->get('name')));
     $resp->add('title', new XoopsXmlRpcString($itemtype->get('display_name')));
     $resp->add('description', new XoopsXmlRpcString($itemtype->getDescription()));
     $fields = new XoopsXmlRpcArray();
     $iteminfo = $itemtype->getIteminfo();
     // include language file of itemtype
     $langman =& xoonips_getutility('languagemanager');
     $modulename = $iteminfo['ormcompo']['module'];
     $langman->read('main.php', $modulename);
     $unicode =& xoonips_getutility('unicode');
     foreach ($iteminfo['io']['xmlrpc']['item'] as $i) {
         // data_type mapping
         switch ($i['xmlrpc']['type']) {
             case 'dateTime.iso8601':
                 $datatype = 'calendar';
                 break;
             case 'boolean':
                 $datatype = 'int';
                 break;
             default:
                 $datatype = $i['xmlrpc']['type'];
                 break;
         }
         $field = new XoopsXmlRpcStruct();
         $field->add('name', new XoopsXmlRpcString(implode('.', $i['xmlrpc']['field'])));
         $field->add('display_name', new XoopsXmlRpcString($unicode->encode_utf8(constant($i['xmlrpc']['display_name']), xoonips_get_server_charset())));
         $field->add('type', new XoopsXmlRpcString($datatype));
         if (isset($i['xmlrpc']['options'])) {
             $options = new XoopsXmlRpcArray();
             foreach ($i['xmlrpc']['options'] as $option_key => $option_val) {
                 $option = new XoopsXmlRpcStruct();
                 $option->add('option', new XoopsXmlRpcString($option_val['option']));
                 $option->add('display_name', new XoopsXmlRpcString($unicode->encode_utf8(constant($option_val['display_name']), xoonips_get_server_charset())));
                 $options->add($option);
                 unset($option);
             }
             $field->add('options', $options);
             unset($options);
         } else {
             $options = new XoopsXmlRpcArray();
             $field->add('options', $options);
             unset($options);
         }
         $field->add('required', new XoopsXmlRpcBoolean(isset($i['xmlrpc']['required']) ? $i['xmlrpc']['required'] : false));
         $field->add('multiple', new XoopsXmlRpcBoolean(isset($i['xmlrpc']['multiple']) ? $i['xmlrpc']['multiple'] : false));
         $field->add('readonly', new XoopsXmlRpcBoolean(isset($i['xmlrpc']['readonly']) ? $i['xmlrpc']['readonly'] : false));
         $fields->add($field);
         unset($field);
     }
     $resp->add('fields', $fields);
     if (strlen($itemtype->getMainFileName()) == 0) {
         $resp->add('mainfile', new XoopsXmlRpcString(''));
     } else {
         $iteminfo = $itemtype->getIteminfo();
         foreach ($iteminfo['io']['xmlrpc']['item'] as $f) {
             if ($f['orm']['field'][0]['orm'] == $itemtype->getMainFileName()) {
                 $resp->add('mainfile', new XoopsXmlRpcString(implode('.', $f['xmlrpc']['field'])));
                 break;
             }
         }
     }
     if (strlen($itemtype->getPreviewFileName()) == 0) {
         $resp->add('previewfile', new XoopsXmlRpcString(''));
     } else {
         $iteminfo = $itemtype->getIteminfo();
         foreach ($iteminfo['io']['xmlrpc']['item'] as $f) {
             if ($f['orm']['field'][0]['orm'] == $itemtype->getPreviewFileName()) {
                 $resp->add('previewfile', new XoopsXmlRpcString(implode('.', $f['xmlrpc']['field'])));
                 break;
             }
         }
     }
     return $resp;
 }
 /**
  * 
  * @param
  * @return void
  */
 function xmlEndElementHandler($parser, $name)
 {
     global $xoopsDB;
     $detail =& $this->_import_item->getVar('detail');
     $unicode =& xoonips_getutility('unicode');
     switch (implode('/', $this->_tag_stack)) {
         case "ITEM/DETAIL":
             foreach (array('editor', 'publisher', 'isbn', 'url') as $key) {
                 if (is_null($detail->get($key, 'n'))) {
                     $this->_import_item->setErrors(E_XOONIPS_TAG_NOT_FOUND, " no {$key}" . $this->_get_parser_error_at());
                 }
             }
             if (is_null($detail->get('attachment_dl_limit'))) {
                 if ($this->_detail_version == '1.00') {
                     //
                     // set zero to attachment_dl_limit
                     // if it is not declared in xml
                     //
                     $detail->set('attachment_dl_limit', 0);
                 } else {
                     $this->_import_item->setErrors(E_XOONIPS_TAG_NOT_FOUND, " no attachment_dl_limit tag " . $this->_get_parser_error_at());
                 }
             }
             if (is_null($detail->get('attachment_dl_notify'))) {
                 if ($this->_detail_version == '1.00' || $this->_detail_version == '1.01') {
                     $detail->set('attachment_dl_notify', 0);
                 } else {
                     $this->_import_item->setErrors(E_XOONIPS_TAG_NOT_FOUND, " no attachment_dl_notify tag " . $this->_get_parser_error_at());
                 }
             }
             break;
         case 'ITEM/DETAIL/AUTHOR':
             if ($this->_detail_version != '1.00' && $this->_detail_version != '1.01' && $this->_detail_version != '1.02') {
                 //<author> is only for 1.00, 1.01 and 1.02
                 break;
             }
             $cdata = $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h');
             if (trim($cdata) == '') {
                 break;
             }
             $author_handler =& xoonips_getormhandler('xnpbook', 'author');
             $authors =& $this->_import_item->getVar('author');
             $author =& $author_handler->create();
             $author->set('author', $cdata);
             $author->set('author_order', 0);
             $authors[0] = $author;
             break;
         case 'ITEM/DETAIL/AUTHORS/AUTHOR':
             if ($this->_detail_version != '1.03') {
                 break;
             }
             $cdata = $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h');
             if (trim($cdata) == '') {
                 break;
             }
             $authors =& $this->_import_item->getVar('author');
             $author_handler =& xoonips_getormhandler('xnpbook', 'author');
             $author =& $author_handler->create();
             $author->set('author', $cdata);
             $author->set('author_order', count($authors));
             $authors[] = $author;
             break;
         case "ITEM/DETAIL/EDITOR":
             $detail->set('editor', $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'), true);
             break;
         case "ITEM/DETAIL/PUBLISHER":
             $detail->set('publisher', $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'), true);
             break;
         case "ITEM/DETAIL/ISBN":
             $detail->set('isbn', $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'), true);
             break;
         case "ITEM/DETAIL/URL":
             $detail->set('url', $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'), true);
             break;
         case "ITEM/DETAIL/ATTACHMENT_DL_LIMIT":
             if ($this->_attachment_dl_limit_flag) {
                 $this->_import_item->setErrors(E_XOONIPS_TAG_REDUNDANT, "attachment_dl_limit is redundant" . $this->_get_parser_error_at());
             } else {
                 if (ctype_digit($this->_cdata)) {
                     $detail->set('attachment_dl_limit', intval($this->_cdata));
                     $this->_attachment_dl_limit_flag = true;
                 } else {
                     $this->_import_item->setErrors(E_XOONIPS_INVALID_VALUE, "invalid value(" . $this->_cdata . ") of attachment_dl_limit" . $this->_get_parser_error_at());
                 }
             }
             break;
         case "ITEM/DETAIL/ATTACHMENT_DL_NOTIFY":
             if ($this->_attachment_dl_notify_limit_flag) {
                 $this->_import_item->setErrors(E_XOONIPS_TAG_REDUNDANT, "attachment_dl_notify is redundant" . $this->_get_parser_error_at());
             } else {
                 if (ctype_digit($this->_cdata)) {
                     $detail->set('attachment_dl_notify', intval($this->_cdata));
                     $this->_attachment_dl_notify_limit_flag = true;
                 } else {
                     $this->_import_item->setErrors(E_XOONIPS_INVALID_VALUE, "invalid value(" . $this->_cdata . ") of attachment_dl_notify" . $this->_get_parser_error_at());
                 }
             }
             break;
         case "ITEM/DETAIL/FILE":
             $this->_book_pdf_file_flag = true;
             $file_handler =& xoonips_getormhandler('xoonips', 'file');
             if (!$file_handler->insert($this->_book_pdf_file)) {
                 $this->_import_item->setErrors(E_XOONIPS_DB_QUERY, "can't insert attachment file:" . $this->_book_pdf_file->get('original_file_name') . $this->_get_parser_error_at());
             }
             $this->_book_pdf_file = $file_handler->get($this->_book_pdf_file->get('file_id'));
             $this->_import_item->setVar('book_pdf', $this->_book_pdf_file);
             $this->_import_item->setHasBookPdf();
             break;
         case 'ITEM/DETAIL/FILE/CAPTION':
             $unicode =& xoonips_getutility('unicode');
             $this->_book_pdf_file->set('caption', $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'));
             break;
         case 'ITEM/DETAIL/FILE/THUMBNAIL':
             $this->_book_pdf_file->set('thumbnail_file', base64_decode($this->_cdata));
             break;
     }
     parent::xmlEndElementHandler($parser, $name);
 }
function xoonips_get_download_filename($file_id)
{
    $file_handler =& xoonips_getormhandler('xoonips', 'file');
    $file = $file_handler->get($file_id);
    if ($file == NULL) {
        return NULL;
    }
    $item_basic_handler =& xoonips_getormhandler('xoonips', 'item_basic');
    $item_basic = $item_basic_handler->get($file->get('item_id'));
    if ($item_basic == NULL) {
        return NULL;
    }
    $item_type_handler =& xoonips_getormhandler('xoonips', 'item_type');
    $item_type = $item_type_handler->get($item_basic->get('item_type_id'));
    if ($item_type == NULL) {
        return NULL;
    }
    $xconfig_handler =& xoonips_getormhandler('xoonips', 'config');
    $download_file_compression = $xconfig_handler->getValue('download_file_compression');
    if (is_null($download_file_compression)) {
        return NULL;
    }
    if ($download_file_compression == 'on') {
        return $item_type->get('display_name') . '_' . $file->get('file_id') . '.zip';
    } else {
        $unicode =& xoonips_getutility('unicode');
        return mb_decode_numericentity($unicode->encode_utf8($file->get('original_file_name'), xoonips_get_server_charset()), xoonips_get_conversion_map(), 'UTF-8');
    }
}
 /**
  * 
  * get index_id of given an array of index hierarchy
  * (ex: index_array2index_id <id of root index>, array( 'foo', 'bar' ),
  *  'group' ); you can get group index id of /foo/bar )
  * 
  * @param index_id parent index id
  * @param indexes array of index hierarchy
  * @param open_level open_level of index of target index
  *  (public|group|private)
  * @return index id or false if index is not found.
  * 
  */
 function index_array2index_id($index_id, $indexes, $open_level = 'private')
 {
     global $xoopsDB;
     switch ($open_level) {
         case 'public':
             $open_level_val = OL_PUBLIC;
             break;
         case 'group':
             $open_level_val = OL_GROUP_ONLY;
             break;
         case 'private':
         default:
             $open_level_val = OL_PRIVATE;
             break;
     }
     $unicode =& xoonips_getutility('unicode');
     $sql = "SELECT i.item_id FROM " . $xoopsDB->prefix("xoonips_item_basic") . " AS i, " . $xoopsDB->prefix("xoonips_item_title") . " AS t, " . $xoopsDB->prefix("xoonips_index") . " AS x " . "WHERE title_id = 0 AND x.parent_index_id = {$index_id}" . " AND x.index_id = t.item_id AND t.item_id = i.item_id" . " AND t.title = " . $xoopsDB->quoteString($unicode->decode_utf8(reset($indexes), xoonips_get_server_charset(), 'h')) . " AND open_level = {$open_level_val}";
     $result = $xoopsDB->query($sql);
     if (!$result) {
         return false;
     } else {
         if ($xoopsDB->getRowsNum($result) == 0) {
             return false;
         }
     }
     list($next_index_id) = $xoopsDB->fetchRow($result);
     array_shift($indexes);
     if (count($indexes) >= 1) {
         return $this->index_array2index_id($next_index_id, $indexes, $open_level);
     } else {
         return $next_index_id;
     }
 }
/**
 * 
 * convert file encoding
 * 
 * @param $infile input file path(any encoindg)
 * @param $outfile output file path(UTF-8)
 * @return bool true(succeed) or false(failed)
 * 
 */
function xoonips_convert_file_encoding_to_utf8($tmpfile, $filename)
{
    $fp_r = fopen($tmpfile, "r");
    $fp_w = fopen($filename, "w");
    if (!$fp_r || !$fp_w) {
        unlink($filename);
        if ($fp_r) {
            fclose($fp_r);
        }
        if ($fp_w) {
            fclose($fp_w);
        }
        return false;
    }
    while (!feof($fp_r)) {
        $unicode =& xoonips_getutility('unicode');
        fputs($fp_w, $unicode->encode_utf8(fgets($fp_r, 131072), xoonips_get_server_charset()));
    }
    fclose($fp_r);
    fclose($fp_w);
    return true;
}
function xoops_module_update_xnpbook($xoopsMod, $oldversion)
{
    global $xoopsDB;
    switch ($oldversion) {
        // remember that version is multiplied with 100 to get an integer
        case 100:
            // perform actions to upgrade from version 1.00
            //    global $xoopsDB;
            $sql = sprintf('ALTER TABLE %s ADD attachment_dl_limit int(1) unsigned default 0', $xoopsDB->prefix('xnpbook_item_detail'));
            $result = $xoopsDB->query($sql);
            if (!$result) {
                echo 'ERROR: ' . $xoopsDB->error();
                return false;
            }
            return true;
        case 101:
        case 102:
            // correction different encoding data in DB caused by no-converting ISBN information from 'UTF-8' to specified encoding at registration.
            if (_CHARSET != 'UTF-8') {
                $table1 = $xoopsDB->prefix('xnpbook_item_detail');
                $table2 = $xoopsDB->prefix('xoonips_item_basic');
                $items = array();
                $sql1 = "SELECT book_id, author, publisher FROM {$table1}";
                $result1 = $xoopsDB->query($sql1);
                if (!$result1) {
                    echo 'ERROR: ' . $xoopsDB->error();
                    return false;
                }
                $i = 0;
                while (list($book_id, $author, $publisher) = $xoopsDB->fetchRow($result1)) {
                    $unicode =& xoonips_getutility('unicode');
                    if (_CHARSET == 'EUC-JP') {
                        $author = $unicode->encode_utf8($author, xoonips_get_server_charset());
                        $publisher = $unicode->encode_utf8($publisher, xoonips_get_server_charset());
                    }
                    $author = $unicode->decode_utf8($author, xoonips_get_server_charset(), 'h');
                    $author = addslashes($author);
                    $publisher = $unicode->decode_utf8($publisher, xoonips_get_server_charset(), 'h');
                    $publisher = addslashes($publisher);
                    $sql2 = "SELECT title FROM {$table2} where item_id={$book_id}";
                    $result2 = $xoopsDB->query($sql2);
                    if (!$result2) {
                        echo 'ERROR: ' . $xoopsDB->error();
                        return false;
                    }
                    list($title) = $xoopsDB->fetchRow($result2);
                    if (_CHARSET == 'EUC-JP') {
                        $title = $unicode->encode_utf8($title, xoonips_get_server_charset());
                    }
                    $title = $unicode->decode_utf8($title, xoonips_get_server_charset(), 'h');
                    $title = addslashes($title);
                    $sql3 = "UPDATE {$table2} SET title='{$title}' where item_id={$book_id}";
                    $result3 = $xoopsDB->query($sql3);
                    if (!$result3) {
                        echo 'ERROR: ' . $xoopsDB->error();
                        return false;
                    }
                    $sql4 = "UPDATE {$table1} SET author='{$author}', publisher='{$publisher}' where book_id={$book_id}";
                    $result4 = $xoopsDB->query($sql4);
                    if (!$result4) {
                        echo 'ERROR: ' . $xoopsDB->error();
                        return false;
                    }
                }
            }
        case 110:
            // 110->111: author varchar -> text
            $result = $xoopsDB->query('ALTER TABLE ' . $xoopsDB->prefix('xnpbook_item_detail') . ' CHANGE COLUMN author author TEXT NOT NULL');
            if (!$result) {
                echo 'ERROR: ' . $xoopsDB->error();
                return false;
            }
        case 111:
        case 200:
        case 300:
        case 310:
            $sql = 'ALTER TABLE ' . $xoopsDB->prefix('xnpbook_item_detail') . ' TYPE = innodb';
            $result = $xoopsDB->query($sql);
            if (!$result) {
                echo 'ERROR: line=' . __LINE__ . " sql={$sql} " . $xoopsDB->error();
            }
        case 311:
            $sql = 'ALTER TABLE ' . $xoopsDB->prefix('xnpbook_item_detail') . ' ADD COLUMN attachment_dl_notify int(1) unsigned default 0 ';
            $result = $xoopsDB->query($sql);
            if (!$result) {
                echo 'ERROR: line=' . __LINE__ . " sql={$sql} " . $xoopsDB->error();
            }
        case 330:
        case 331:
        case 332:
        case 333:
        case 334:
        case 335:
        case 336:
        case 337:
        case 338:
        case 339:
            // support for ISBN13
            $sql = sprintf('ALTER TABLE `%s` MODIFY `isbn` char(13) default NULL', $xoopsDB->prefix('xnpbook_item_detail'));
            $result = $xoopsDB->query($sql);
            if (!$result) {
                echo 'ERROR: line=' . __LINE__ . " sql={$sql} " . $xoopsDB->error();
            }
            // support authors
            $key_name = 'book_id';
            $table_detail = 'xnpbook_item_detail';
            $table_author = 'xnpbook_author';
            $sql = 'CREATE TABLE ' . $xoopsDB->prefix($table_author) . ' (';
            $sql .= '`book_author_id` int(10) unsigned NOT NULL auto_increment,';
            $sql .= '`book_id` int(10) unsigned NOT NULL,';
            $sql .= '`author` varchar(255) NOT NULL,';
            $sql .= '`author_order` int(10) unsigned NOT NULL default \'0\',';
            $sql .= '  PRIMARY KEY  (`book_author_id`)';
            $sql .= ') TYPE=InnoDB';
            $result = $xoopsDB->query($sql);
            if (!$result) {
                echo '&nbsp;&nbsp;' . $xoopsDB->error() . '<br />';
                return false;
            }
            $result = $xoopsDB->query('select ' . $key_name . ',author from ' . $xoopsDB->prefix($table_detail) . ' where author!=\'\'');
            while (list($id, $author) = $xoopsDB->fetchRow($result)) {
                $author_array = array_map('trim', explode(',', $author));
                $i = 0;
                foreach ($author_array as $author) {
                    if (empty($author)) {
                        continue;
                    }
                    $sql = 'insert into ' . $xoopsDB->prefix($table_author);
                    $sql .= '(' . $key_name . ',author,author_order) values (';
                    $sql .= $id . ',' . $xoopsDB->quoteString($author) . ',' . $i . ')';
                    if ($xoopsDB->queryF($sql) == false) {
                        echo '&nbsp;&nbsp;' . $xoopsDB->error() . '<br />';
                        return false;
                    }
                    $i++;
                }
            }
            $sql = 'ALTER TABLE ' . $xoopsDB->prefix($table_detail) . ' DROP COLUMN `author`';
            $result = $xoopsDB->query($sql);
            if (!$result) {
                echo '&nbsp;&nbsp;' . $xoopsDB->error() . '<br />';
                return false;
            }
        case 340:
        case 341:
        case 342:
        case 343:
        case 344:
        case 345:
        case 346:
            // drop year field from datail table
            $sql = 'ALTER TABLE `' . $xoopsDB->prefix('xnpbook_item_detail') . '` DROP COLUMN `year`';
            $result = $xoopsDB->query($sql);
            if (!$result) {
                echo '&nbsp;&nbsp;' . $xoopsDB->error() . '<br />';
                return false;
            }
        case 347:
        default:
    }
    return true;
}
    /**
     * 
     * @param $uploadfile string import file path
     * @pram $error_check_only string 'on' or else
     * 
     */
    function _read_index_tree($uploadfile, $error_check_only, $import_index_ids = array())
    {
        global $xoopsDB, $xoopsConfig, $xoopsUser, $xoopsLogger, $xoopsUserIsAdmin;
        //
        // Import index tree if uploaded file has index.xml.
        // In this case, other files are ignored.
        //
        $unzip =& xoonips_getutility('unzip');
        if (!$unzip->open($uploadfile)) {
            redirect_header('import.php?action=default', 3, _MD_XOONIPS_IMPORT_FILE_NOT_FOUND);
            exit;
        }
        $fnames = $unzip->get_file_list();
        foreach ($fnames as $fname) {
            if (strtolower($fname) != 'index.xml') {
                continue;
            }
            //
            // start transaction
            //
            $xoopsDB->query('START TRANSACTION');
            //
            // check index tree structures
            // and show the structures
            //
            $xml = $unzip->get_data($fname);
            $indexes = array();
            xnpImportIndexCheck($xml, $indexes);
            // To construct tree structure from given indexes by $indexes
            $c2p = array();
            //associative array (child ID -> parent ID)
            $p2c = array();
            //associative array (parent ID -> array of child ID)
            $index_by_id = array();
            // $index_by_id[ index_id ] => index array;
            foreach ($indexes as $i) {
                if (empty($i)) {
                    continue;
                }
                $c2p[$i['index_id']] = $i['parent_id'];
                if (!isset($p2c[$i['parent_id']])) {
                    $p2c[$i['parent_id']] = array();
                }
                $p2c[$i['parent_id']][] = $i['index_id'];
                $index_by_id[$i['index_id']] = $i;
            }
            $str_indexes = '';
            $error = false;
            //true if cyclic reference
            foreach ($index_by_id as $index_id => $index) {
                if ($index['index_id'] == $index['parent_id']) {
                    //
                    // cyclic reference detected( refers itself )
                    //
                    $error = true;
                    continue;
                }
                if (isset($p2c[$index['index_id']])) {
                    continue;
                }
                //index_id already visited(to detect cyclic reference)
                $visited = array($index['index_id']);
                // $index is not parent of all indexes
                $path = array();
                array_push($path, $index['titles'][0]);
                while (isset($index_by_id[$index['parent_id']])) {
                    $parent = $index_by_id[$index['parent_id']];
                    if (in_array($parent['index_id'], $visited)) {
                        // cyclic reference detecetd( $index refers
                        // already visited index )
                        //
                        $error = true;
                        break;
                    }
                    $visited[] = $parent['index_id'];
                    $unicode =& xoonips_getutility('unicode');
                    array_push($path, $unicode->decode_utf8($parent['titles'][0], xoonips_get_server_charset(), 'h'));
                    $index = $parent;
                }
                $str_indexes .= htmlspecialchars(implode('/', array_reverse($path)), ENT_QUOTES) . "<br />\n";
            }
            $unzip->close();
            include XOOPS_ROOT_PATH . '/header.php';
            if ($error) {
                $submit = _MD_XOONIPS_ITEM_BACK_BUTTON_LABEL;
                $message = _MD_XOONIPS_IMPORT_CIRCULAR_INDEX;
                echo <<<EOT
                    <p>
                    {$message} <br />
                    </p>
                    <form id='form_submit_back' action='import.php?action=default'
                     method='post'>
                    <input class="formButton" id='submit_back' type='submit'
                    value='{$submit}'/>
                    </form>
EOT;
                unlink($uploadfile);
            } else {
                if ($error_check_only == 'on') {
                    $submit = _MD_XOONIPS_ITEM_BACK_BUTTON_LABEL;
                    $message = _MD_XOONIPS_IMPORT_ERROR_CKECK_DONE . "<br />\n" . _MD_XOONIPS_IMPORT_FOLLOWING_INDEX_TEST;
                    echo <<<EOT
                    <p>
                    {$message}
                    </p>
                    <p>
                    {$str_indexes}
                    </p>
                    <form id='form_submit_back' action='import.php?action=default'
                    method='post'>
                    <input class="formButton" id='submit_back' type='submit' 
                    value='{$submit}'/>
                    </form>
EOT;
                    unlink($uploadfile);
                } else {
                    $_SESSION['xoonips_import_file_path'] = $uploadfile;
                    $_SESSION['xoonips_import_index_ids'] = serialize($import_index_ids);
                    $submit = _MD_XOONIPS_IMPORT_UPLOAD_SUBMIT;
                    $message = _MD_XOONIPS_IMPORT_FOLLOWING_INDEX;
                    $xoonipsCheckedXID = implode(',', $import_index_ids);
                    echo <<<EOT
                    <p>
                    {$message}
                    </p>
                    <p>
                    {$str_indexes}
                    </p>
                    <form id='form_import_index'
                    action='import.php?action=import_index_tree'
                    method='post'>
                    <input class="formButton" id='submit_import_index'
                    type='submit' value='{$submit}'/>
                    </form>
EOT;
                }
            }
            include XOOPS_ROOT_PATH . '/footer.php';
            exit;
        }
    }
 /**
  *
  * get orm composer object( subclass of XooNIpsItemCompo ) from associative array
  * see also {@link $this -> iteminfo}
  *
  * @param array associative array of XML-RPC argument
  * @return XooNIpsTableObject reference of subclass of XooNIpsTableObject
  */
 function getObject($in_array)
 {
     $handler =& xoonips_getormcompohandler($this->iteminfo['ormcompo']['module'], $this->iteminfo['ormcompo']['name']);
     $this->iteminfo = $handler->getIteminfo();
     //
     // get primary key
     $primary_id = false;
     foreach ($this->iteminfo['io']['xmlrpc']['item'] as $input) {
         if ($input['orm']['field'][0]['orm'] == $this->iteminfo['ormcompo']['primary_orm'] && $input['orm']['field'][0]['field'] == $this->iteminfo['ormcompo']['primary_key']) {
             $primary_id = isset($in_array[$input['xmlrpc']['field'][0]]) ? $in_array[$input['xmlrpc']['field'][0]] : false;
             break;
         }
     }
     if (false == $primary_id) {
         // create ormcompo
         $obj = $handler->create();
     } else {
         // get object from database
         $obj = $handler->get($primary_id);
         //var_dump('obj=get(primary_id):', $obj);
         if (!$obj) {
             $obj = $handler->create();
         }
     }
     $primary_orm = $obj->getVar($this->iteminfo['ormcompo']['primary_orm']);
     //
     // apply all input rule in iteminfo
     $unicode =& xoonips_getutility('unicode');
     foreach ($this->iteminfo['io']['xmlrpc']['item'] as $input) {
         $in_field = null;
         $in_var = array();
         $out_var = array();
         //
         // get reference of orm's information corresnponds to $input
         $orminfo = null;
         foreach ($this->iteminfo['orm'] as $orm) {
             if ($orm['field'] == $input['orm']['field'][0]['orm']) {
                 $orminfo = $orm;
                 break;
             }
         }
         //
         // get variable in $in_var according to $this -> iteminfo['input'] rule
         $is_multiple = isset($input['xmlrpc']['multiple']) ? $input['xmlrpc']['multiple'] : false;
         if ($input['xmlrpc']['field'][0] == 'detail_field') {
             if ($is_multiple) {
                 $in_field = array();
             }
             foreach ($in_array['detail_field'] as $field) {
                 if (trim($field['name']) == $input['xmlrpc']['field'][1]) {
                     if (isset($in_field) && !is_array($in_field)) {
                         $in_field = array($in_field);
                     }
                     if (is_array($in_field)) {
                         $in_field[] = $field['value'];
                     } else {
                         $in_field = trim($field['value']);
                     }
                 }
             }
         } else {
             $in_field = $in_array;
             foreach ($input['xmlrpc']['field'] as $field) {
                 if (array_key_exists($field, $in_field)) {
                     $in_field = $in_field[$field];
                 } else {
                     // set empty array if $field is not given in $in_array
                     $in_field = array();
                     break;
                 }
             }
         }
         //
         // set value to orm variable
         if ($orminfo['multiple']) {
             //
             // get handler of orm to set variable
             $handler =& $this->handlers[$input['orm']['field'][0]['orm']];
             // prepare orm array
             $foreign_key = $orminfo['foreign_key'];
             $cri = new CriteriaCompo(new Criteria($foreign_key, $primary_orm->get($this->iteminfo['ormcompo']['primary_key'])));
             $var_objs =& $handler->getObjects($cri);
             array_splice($var_objs, count($in_field));
             //delete redundant element
             while (count($var_objs) < count($in_field)) {
                 $var_objs[] = $handler->create();
             }
             //
             $pos = 0;
             $array = array();
             foreach ($in_field as $v) {
                 if (isset($array[$pos])) {
                     $var_obj = $array[$pos];
                 } else {
                     $var_obj = $handler->create();
                 }
                 // convert to numeric reference
                 if (is_string($v)) {
                     $in = $v;
                     $v = $unicode->decode_utf8($v, xoonips_get_server_charset(), 'h');
                 }
                 // evaluate
                 $in_var = array($v);
                 $out_var = array();
                 $context = array('position' => $pos);
                 eval(isset($input['eval']['xmlrpc2orm']) ? $input['eval']['xmlrpc2orm'] : '$out_var[0] = $in_var[0];');
                 //
                 for ($i = 0; $i < count($input['orm']['field']); $i++) {
                     if (isset($out_var[$i])) {
                         $var_objs[$pos]->setVar($input['orm']['field'][$i]['field'], $out_var[$i], true);
                     } else {
                         $var_objs[$pos]->setDefault($input['orm']['field'][$i]['field']);
                     }
                 }
                 $array[$pos] = $var_objs[$pos];
                 $pos++;
             }
             $obj->setVar($input['orm']['field'][0]['orm'], $array);
         } else {
             // convert to numeric reference
             if (is_string($in_field)) {
                 $in_field = $unicode->decode_utf8($in_field, xoonips_get_server_charset(), 'h');
             }
             //
             // evaluate
             $in_var = array($in_field);
             $out_var = array();
             eval(isset($input['eval']['xmlrpc2orm']) ? $input['eval']['xmlrpc2orm'] : '$out_var[0] = $in_var[0];');
             $i = 0;
             foreach ($input['orm']['field'] as $field) {
                 $orm = $obj->getVar($field['orm']);
                 if (!isset($out_var[$i])) {
                     //this field musn't be transformed XML to ORM
                     continue;
                 } else {
                     if (strlen($out_var[$i]) == 0) {
                         $orm->setDefault($field['field']);
                     } else {
                         $orm->setVar($field['field'], $out_var[$i], true);
                     }
                 }
                 $obj->setVar($field['orm'], $orm);
                 $i++;
             }
         }
     }
     return $obj;
 }
 /**
  * insert metadata fields
  * @access private
  * @param integer metadata id of metadata fields
  */
 function insertMetadataFeilds($metadata_id)
 {
     $unicode =& xoonips_getutility('unicode');
     $handler =& xoonips_getormhandler('xoonips', 'oaipmh_metadata_field');
     $this->deleteMetadataFields($metadata_id);
     foreach ($this->_metadata as $key => $field) {
         $orm =& $handler->create();
         $orm->set('name', $field['name']);
         $orm->set('metadata_id', $metadata_id);
         $orm->set('format', $this->metadataPrefix);
         $orm->set('category_name', $field['category_name']);
         $orm->set('value', $unicode->decode_utf8($field['value'], xoonips_get_server_charset(), 'h'));
         $orm->set('ordernum', intval($key) + 1);
         $orm->set('namespace', $field['namespace']);
         $orm->set('namespace_uri', $field['namespace_uri']);
         $result = $handler->insert($orm, true);
     }
 }
/**
 * Importing indexes to a index that is specified by $parent_index_id.
 * Associations of pseudo ID and Real index ID are sotred to $id_table.
 *
 * @param parent_index_id index_id that indexes is imported to.
 * @param $indexes array of index information to be imported.
 * $indexes = array(
 *                   array( 'titles' => array( TITLE1, TITLE2, ... )
 *                          'parent_id' => pseudo id of parent index
 *                          'item_id' => pseudo id of own index
 *                          'child' => array( [0] => array( 'titles' => ..., 'parent_id' => ..., 'child' => ....)
 *                                            [1] => array( same above ),
 *                                            ....
 *                           )
 *                         ),
 *                   array( 'titles' => array( TITLE1, TITLE2, ... )
 *                          same above ... ),
 *                   ...
 *                   );
 * @param id_table reference of associative array for output( [pseudo id] => [real index id] )
 * @return no return value.
 */
function _xoonips_import_index($parent_index_id, &$indexes, &$id_table)
{
    $xnpsid = $_SESSION['XNPSID'];
    $lengths = xnpGetColumnLengths('xoonips_item_title');
    $unicode =& xoonips_getutility('unicode');
    foreach ($indexes as $index) {
        foreach ($index['titles'] as $k => $title) {
            list($index['titles'][$k], $dummy) = xnpTrimString($unicode->decode_utf8($title, xoonips_get_server_charset(), 'h'), $lengths['title'], 'UTF-8');
        }
        $child = array();
        // numbers of same index name
        $cnt = 0;
        $index_id = 0;
        if (xnp_get_indexes($xnpsid, $parent_index_id, array(), $child) == RES_OK) {
            foreach ($child as $i) {
                $diff = array_diff($i['titles'], $index['titles']);
                if (empty($diff)) {
                    // true if $index have only same names of $i ( $i['titles'] == $index['titles'] )
                    $cnt++;
                    $index_id = $i['item_id'];
                }
            }
        }
        if ($cnt == 1) {
            $id_table[$index['index_id']] = $index_id;
        } else {
            $insert_index = array();
            $insert_index['titles'] = $index['titles'];
            $insert_index['parent_index_id'] = $parent_index_id;
            $result = xnp_insert_index($xnpsid, $insert_index, $index_id);
            if ($result != RES_OK) {
                break;
            }
            $id_table[$index['index_id']] = $index_id;
            // record event log
            $mydirname = basename(dirname(__DIR__));
            $event_handler =& xoonips_getormhandler('xoonips', 'event_log');
            $event_handler->recordInsertIndexEvent($index_id);
        }
        if (array_key_exists('child', $index)) {
            _xoonips_import_index($index_id, $index['child'], $id_table);
        }
    }
}
 /**
  *
  * @param[in] XooNIpsXmlRpcRequest $request
  * @param[out] XooNIpsXmlRpcResponse $response result of logic(success/fault, response, error)
  */
 function execute(&$request, &$response)
 {
     $error =& $response->getError();
     // load logic instance
     $factory =& XooNIpsLogicFactory::getInstance();
     $logic =& $factory->create($request->getMethodName());
     if (!is_object($logic)) {
         $response->setResult(false);
         $error =& $response->getError();
         $logic = $request->getMethodName();
         $error->add(XNPERR_SERVER_ERROR, "can't create a logic of {$logic}");
         return false;
     }
     //
     $params =& $request->getParams();
     $vars = array();
     if (count($params) < 5) {
         $response->setResult(false);
         $error->add(XNPERR_MISSING_PARAM);
         return false;
     } else {
         if (count($params) > 5) {
             $response->setResult(false);
             $error->add(XNPERR_EXTRA_PARAM);
             return false;
         }
     }
     //
     // parameter 1(sessionid)
     $vars[0] = $params[0];
     //
     // parameter 2(itemid)
     $unicode =& xoonips_getutility('unicode');
     $vars[1] = $unicode->decode_utf8($params[1], xoonips_get_server_charset(), 'h');
     //
     // parameter 3(id_type)
     $vars[2] = $params[2];
     //
     // parameter 4(fieldName)
     $vars[3] = $params[3];
     //
     //
     // transform array to object
     // parameter 5(file structure) to XooNIpsFile object
     // using XooNIpsTransformFile
     // and write file data to temporary file
     $factory =& XooNIpsXmlRpcTransformFactory::getInstance();
     $trans =& $factory->create('xoonips', 'file');
     $fileobj = $trans->getObject($params[4]);
     if (!$fileobj) {
         $response->setResult(false);
         $error->add(XNPERR_INVALID_PARAM, 'can not get file from parameter #5');
         return false;
     }
     $tmpfile = tempnam("/tmp", "FOO");
     $h = fopen($tmpfile, "wb");
     if ($h) {
         $len = fwrite($h, $params[4]['data']);
         fclose($h);
     }
     if (!$h || $len != strlen($params[4]['data'])) {
         $response->setResult(false);
         $error->add(XNPERR_SERVER_ERROR, "can't write to file {$tmpfile}");
         return false;
     }
     $fileobj->setFilepath($tmpfile);
     $vars[4] = $fileobj;
     // execute logic
     $xoonips_response = new XooNIpsResponse();
     $logic->execute($vars, $xoonips_response);
     //
     $response->setResult($xoonips_response->getResult());
     $response->setError($xoonips_response->getError());
     $response->setSuccess($xoonips_response->getSuccess());
 }
 /**
  * 
  * @param
  * @return void
  */
 function xmlEndElementHandler($parser, $name)
 {
     global $xoopsDB;
     $detail =& $this->_import_item->getVar('detail');
     $unicode =& xoonips_getutility('unicode');
     switch (implode('/', $this->_tag_stack)) {
         case "ITEM/DETAIL":
             if (is_null($detail->get('url', 'n'))) {
                 $this->_import_item->setErrors(E_XOONIPS_TAG_NOT_FOUND, " no item_link" . $this->_get_parser_error_at());
             }
             break;
         case "ITEM/DETAIL/URL":
             $detail->set('url', $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'), true);
             break;
         case "ITEM/DETAIL/FILE":
             $this->_url_banner_file_flag = true;
             $file_handler =& xoonips_getormhandler('xoonips', 'file');
             if (!$file_handler->insert($this->_url_banner_file)) {
                 $this->_import_item->setErrors(E_XOONIPS_DB_QUERY, "can't insert attachment file:" . $this->_url_banner_file->get('original_file_name') . $this->_get_parser_error_at());
             }
             $this->_url_banner_file = $file_handler->get($this->_url_banner_file->get('file_id'));
             $this->_import_item->setVar('url_banner_file', $this->_url_banner_file);
             $this->_import_item->setHasUrlBannerFile();
             break;
         case 'ITEM/DETAIL/FILE/CAPTION':
             $this->_url_banner_file->set('caption', $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'));
             break;
         case 'ITEM/DETAIL/FILE/THUMBNAIL':
             $this->_url_banner_file->set('thumbnail_file', base64_decode($this->_cdata));
             break;
     }
     parent::xmlEndElementHandler($parser, $name);
 }
 /**
  * 
  * @param
  * @return void
  */
 function xmlEndElementHandler($parser, $name)
 {
     global $xoopsDB;
     $detail =& $this->_import_item->getVar('detail');
     $unicode =& xoonips_getutility('unicode');
     switch (implode('/', $this->_tag_stack)) {
         case "ITEM/DETAIL":
             foreach (array('journal', 'volume', 'number', 'page', 'abstract', 'pubmed_id') as $key) {
                 if (is_null($detail->get($key, 'n'))) {
                     $this->_import_item->setErrors(E_XOONIPS_TAG_NOT_FOUND, " no {$key}" . $this->_get_parser_error_at());
                 }
             }
             //error is no authors
             if (count($this->_import_item->getVar('author')) == 0) {
                 $this->_import_item->setErrors(E_XOONIPS_TAG_NOT_FOUND, " no author" . $this->_get_parser_error_at());
             }
             break;
         case "ITEM/DETAIL/AUTHORS/AUTHOR":
             $authors =& $this->_import_item->getVar('author');
             $author_handler =& xoonips_getormhandler('xnppaper', 'author');
             $author =& $author_handler->create();
             $author->set('author', $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'));
             $author->set('author_order', count($authors));
             $authors[] = $author;
             break;
         case "ITEM/DETAIL/JOURNAL":
         case "ITEM/DETAIL/VOLUME":
         case "ITEM/DETAIL/NUMBER":
         case "ITEM/DETAIL/PAGE":
         case "ITEM/DETAIL/ABSTRACT":
         case "ITEM/DETAIL/PUBMED_ID":
             $detail->set(strtolower(end($this->_tag_stack)), $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'), true);
             break;
         case "ITEM/DETAIL/FILE":
             $this->_paper_pdf_reprint_file_flag = true;
             $file_handler =& xoonips_getormhandler('xoonips', 'file');
             if (!$file_handler->insert($this->_paper_pdf_reprint_file)) {
                 $this->_import_item->setErrors(E_XOONIPS_DB_QUERY, "can't insert attachment file:" . $this->_paper_pdf_reprint_file->get('original_file_name') . $this->_get_parser_error_at());
             }
             $this->_paper_pdf_reprint_file = $file_handler->get($this->_paper_pdf_reprint_file->get('file_id'));
             $this->_import_item->setVar('paper_pdf_reprint', $this->_paper_pdf_reprint_file);
             $this->_import_item->setHasPaperPdfReprint();
             break;
         case 'ITEM/DETAIL/FILE/CAPTION':
             $this->_paper_pdf_reprint_file->set('caption', $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'));
             break;
         case 'ITEM/DETAIL/FILE/THUMBNAIL':
             $this->_paper_pdf_reprint_file->set('thumbnail_file', base64_decode($this->_cdata));
             break;
     }
     parent::xmlEndElementHandler($parser, $name);
 }
 /**
  * 
  * @param
  * @return void
  */
 function xmlEndElementHandler($parser, $name)
 {
     global $xoopsDB;
     $detail =& $this->_import_item->getVar('detail');
     $unicode =& xoonips_getutility('unicode');
     switch (implode('/', $this->_tag_stack)) {
         case "ITEM/DETAIL":
             foreach (array('model_type', 'rights', 'readme', 'use_cc', 'cc_commercial_use', 'cc_modification') as $key) {
                 if (is_null($detail->get($key, 'n'))) {
                     $this->_import_item->setErrors(E_XOONIPS_TAG_NOT_FOUND, " no {$key}" . $this->_get_parser_error_at());
                 }
             }
             //error if no creators
             if (count($this->_import_item->getVar('creator')) == 0) {
                 $this->_import_item->setErrors(E_XOONIPS_TAG_NOT_FOUND, " no creator" . $this->_get_parser_error_at());
             }
             break;
         case "ITEM/DETAIL/MODEL_TYPE":
         case "ITEM/DETAIL/RIGHTS":
         case "ITEM/DETAIL/README":
         case "ITEM/DETAIL/USE_CC":
         case "ITEM/DETAIL/CC_MODIFICATION":
         case "ITEM/DETAIL/CC_COMMERCIAL_USE":
             $detail->set(strtolower(end($this->_tag_stack)), $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'), true);
             break;
         case 'ITEM/DETAIL/CREATORS/CREATOR':
             if ($this->_detail_version != '1.03') {
                 break;
             }
             $creators =& $this->_import_item->getVar('creator');
             $creator_handler =& xoonips_getormhandler('xnpmodel', 'creator');
             $creator =& $creator_handler->create();
             $creator->set('creator', $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'));
             $creator->set('creator_order', count($creators));
             $creators[] = $creator;
             break;
         case "ITEM/DETAIL/CREATOR":
             if ($this->_detail_version != '1.00' && $this->_detail_version != '1.01' && $this->_detail_version != '1.02') {
                 //<creator> is only for 1.00, 1.01 and 1.02
                 break;
             }
             $creator_handler =& xoonips_getormhandler('xnpmodel', 'creator');
             $creators =& $this->_import_item->getVar('creator');
             $creator =& $creator_handler->create();
             $creator->set('creator', trim($unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h')));
             $creator->set('creator_order', 0);
             $creators[0] = $creator;
             break;
         case "ITEM/DETAIL/ATTACHMENT_DL_LIMIT":
             if ($this->_attachment_dl_limit_flag) {
                 $this->_import_item->setErrors(E_XOONIPS_TAG_REDUNDANT, "attachment_dl_limit is redundant" . $this->_get_parser_error_at());
             } else {
                 if (ctype_digit($this->_cdata)) {
                     $detail->set('attachment_dl_limit', intval($this->_cdata));
                     $this->_attachment_dl_limit_flag = true;
                 } else {
                     $this->_import_item->setErrors(E_XOONIPS_INVALID_VALUE, "invalid value(" . $this->_cdata . ") of attachment_dl_limit" . $this->_get_parser_error_at());
                 }
             }
             break;
         case "ITEM/DETAIL/ATTACHMENT_DL_NOTIFY":
             if ($this->_attachment_dl_notify_limit_flag) {
                 $this->_import_item->setErrors(E_XOONIPS_TAG_REDUNDANT, "attachment_dl_notify is redundant" . $this->_get_parser_error_at());
             } else {
                 if (ctype_digit($this->_cdata)) {
                     $detail->set('attachment_dl_notify', intval($this->_cdata));
                     $this->_attachment_dl_notify_limit_flag = true;
                 } else {
                     $this->_import_item->setErrors(E_XOONIPS_INVALID_VALUE, "invalid value(" . $this->_cdata . ") of attachment_dl_notify" . $this->_get_parser_error_at());
                 }
             }
             break;
         case "ITEM/DETAIL/FILE":
             $file_handler =& xoonips_getormhandler('xoonips', 'file');
             if ($this->_file_type_attribute == 'model_data') {
                 $this->_model_data_flag = true;
                 if (!$file_handler->insert($this->_model_data)) {
                     global $xoopsDB;
                     $this->_import_item->setErrors(E_XOONIPS_DB_QUERY, "can't insert attachment file:" . $this->_model_data->get('original_file_name') . $this->_get_parser_error_at());
                     trigger_error($xoopsDB->error());
                 }
                 $this->_model_data = $file_handler->get($this->_model_data->get('file_id'));
                 $this->_import_item->setVar('model_data', $this->_model_data);
                 $this->_import_item->setHasModelData();
                 $this->_file_type_attribute = null;
             } else {
                 if ($this->_file_type_attribute == 'preview') {
                     $this->_preview_flag = true;
                     if (!$file_handler->insert($this->_preview)) {
                         $this->_import_item->setErrors(E_XOONIPS_DB_QUERY, "can't insert attachment file:" . $this->_preview->get('original_file_name') . $this->_get_parser_error_at());
                     }
                     $this->_preview = $file_handler->get($this->_preview->get('file_id'));
                     $previews =& $this->_import_item->getVar('preview');
                     $previews[] = $this->_preview;
                     $this->_import_item->setHasPreview();
                     $this->_file_type_attribute = null;
                 } else {
                     die('unknown file type:' . $this->_file_type_attribute);
                 }
             }
             break;
         case 'ITEM/DETAIL/FILE/CAPTION':
             if ($this->_file_type_attribute == 'model_data') {
                 $this->_model_data->set('caption', $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'));
             } else {
                 if ($this->_file_type_attribute == 'preview') {
                     $this->_preview->set('caption', $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'));
                 }
             }
             break;
             break;
         case 'ITEM/DETAIL/FILE/THUMBNAIL':
             if ($this->_file_type_attribute == 'model_data') {
                 $this->_model_data->set('thumbnail_file', base64_decode($this->_cdata));
             } else {
                 if ($this->_file_type_attribute == 'preview') {
                     $this->_preview->set('thumbnail_file', base64_decode($this->_cdata));
                 }
             }
             break;
     }
     parent::xmlEndElementHandler($parser, $name);
 }
 /**
  * 
  * @param
  * @return void
  */
 function xmlEndElementHandler($parser, $name)
 {
     global $xoopsDB;
     $detail =& $this->_import_item->getVar('detail');
     $unicode =& xoonips_getutility('unicode');
     switch (implode('/', $this->_tag_stack)) {
         case "ITEM/DETAIL":
             if ($this->_detail_version == '1.00') {
             } else {
                 if ($this->_detail_version == '1.01') {
                     $keys[] = 'attachment_dl_limit';
                 } else {
                     $keys[] = 'attachment_dl_limit';
                     $keys[] = 'attachment_dl_notify';
                 }
             }
             foreach (array('presentation_type', 'conference_title', 'place', 'abstract', 'conference_from_year', 'conference_from_month', 'conference_from_mday', 'conference_to_year', 'conference_to_month', 'conference_to_mday') as $key) {
                 if (is_null($detail->get($key, 'n'))) {
                     $this->_import_item->setErrors(E_XOONIPS_TAG_NOT_FOUND, " no {$key}" . $this->_get_parser_error_at());
                 }
             }
             //error if no authors
             if (count($this->_import_item->getVar('author')) == 0) {
                 $this->_import_item->setErrors(E_XOONIPS_TAG_NOT_FOUND, " no author" . $this->_get_parser_error_at());
             }
             break;
         case "ITEM/DETAIL/AUTHORS/AUTHOR":
             if ($this->_detail_version != '1.01' && $this->_detail_version != '1.02') {
                 break;
             }
             $authors =& $this->_import_item->getVar('author');
             $author_handler =& xoonips_getormhandler('xnpconference', 'author');
             $author =& $author_handler->create();
             $author->set('author', $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'));
             $author->set('author_order', count($authors));
             $authors[] = $author;
             break;
         case "ITEM/DETAIL/AUTHOR":
             // /item/detail/author is only available in ver 1.00
             if ($this->_detail_version != '1.00') {
                 break;
             }
             $authors =& $this->_import_item->getVar('author');
             $author_handler =& xoonips_getormhandler('xnpconference', 'author');
             $author =& $author_handler->create();
             $author->set('author', $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'));
             $author->set('author_order', 0);
             $authors[0] = $author;
             break;
         case "ITEM/DETAIL/PRESENTATION_TYPE":
         case "ITEM/DETAIL/CONFERENCE_TITLE":
         case "ITEM/DETAIL/PLACE":
         case "ITEM/DETAIL/ABSTRACT":
         case "ITEM/DETAIL/CONFERENCE_FROM_YEAR":
         case "ITEM/DETAIL/CONFERENCE_FROM_MONTH":
         case "ITEM/DETAIL/CONFERENCE_FROM_MDAY":
         case "ITEM/DETAIL/CONFERENCE_TO_YEAR":
         case "ITEM/DETAIL/CONFERENCE_TO_MONTH":
         case "ITEM/DETAIL/CONFERENCE_TO_MDAY":
             $unicode =& xoonips_getutility('unicode');
             $detail->set(strtolower(end($this->_tag_stack)), $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'), true);
             break;
         case "ITEM/DETAIL/ATTACHMENT_DL_LIMIT":
             if ($this->_attachment_dl_limit_flag) {
                 $this->_import_item->setErrors(E_XOONIPS_TAG_REDUNDANT, "attachment_dl_limit is redundant" . $this->_get_parser_error_at());
             } else {
                 if (ctype_digit($this->_cdata)) {
                     $detail->set('attachment_dl_limit', intval($this->_cdata));
                     $this->_attachment_dl_limit_flag = true;
                 } else {
                     $this->_import_item->setErrors(E_XOONIPS_INVALID_VALUE, "invalid value(" . $this->_cdata . ") of attachment_dl_limit" . $this->_get_parser_error_at());
                 }
             }
             break;
         case "ITEM/DETAIL/ATTACHMENT_DL_NOTIFY":
             if ($this->_attachment_dl_notify_limit_flag) {
                 $this->_import_item->setErrors(E_XOONIPS_TAG_REDUNDANT, "attachment_dl_notify is redundant" . $this->_get_parser_error_at());
             } else {
                 if (ctype_digit($this->_cdata)) {
                     $detail->set('attachment_dl_notify', intval($this->_cdata));
                     $this->_attachment_dl_notify_limit_flag = true;
                 } else {
                     $this->_import_item->setErrors(E_XOONIPS_INVALID_VALUE, "invalid value(" . $this->_cdata . ") of attachment_dl_notify" . $this->_get_parser_error_at());
                 }
             }
             break;
         case "ITEM/DETAIL/FILE":
             $file_handler =& xoonips_getormhandler('xoonips', 'file');
             if ($this->_file_type_attribute == 'conference_file') {
                 $this->_conference_file_flag = true;
                 if (!$file_handler->insert($this->_conference_file)) {
                     $this->_import_item->setErrors(E_XOONIPS_DB_QUERY, "can't insert attachment file:" . $this->_conference_file->get('original_file_name') . $this->_get_parser_error_at());
                 }
                 $this->_conference_file = $file_handler->get($this->_conference_file->get('file_id'));
                 $this->_import_item->setVar('conference_file', $this->_conference_file);
                 $this->_import_item->setHasConferenceFile();
                 $this->_file_type_attribute = null;
             } else {
                 if ($this->_file_type_attribute == 'conference_paper') {
                     $this->_conference_paper_flag = true;
                     if (!$file_handler->insert($this->_conference_paper)) {
                         $this->_import_item->setErrors(E_XOONIPS_DB_QUERY, "can't insert attachment file:" . $this->_conference_paper->get('original_file_name') . $this->_get_parser_error_at());
                     }
                     $this->_conference_paper = $file_handler->get($this->_conference_paper->get('file_id'));
                     $this->_import_item->setVar('conference_paper', $this->_conference_paper);
                     $this->_import_item->setHasConferencePaper();
                     $this->_file_type_attribute = null;
                 } else {
                     die('unknown file type:' . $this->_file_type_attribute);
                 }
             }
             break;
         case 'ITEM/DETAIL/FILE/CAPTION':
             $unicode =& xoonips_getutility('unicode');
             if ($this->_file_type_attribute == 'conference_file') {
                 $this->_conference_file->set('caption', $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'));
             } else {
                 if ($this->_file_type_attribute == 'conference_paper') {
                     $this->_conference_paper->set('caption', $unicode->decode_utf8($this->_cdata, xoonips_get_server_charset(), 'h'));
                 }
             }
             break;
         case 'ITEM/DETAIL/FILE/THUMBNAIL':
             if ($this->_file_type_attribute == 'conference_file') {
                 $this->_conference_file->set('thumbnail_file', base64_decode($this->_cdata));
             } else {
                 if ($this->_file_type_attribute == 'conference_paper') {
                     $this->_conference_paper->set('thumbnail_file', base64_decode($this->_cdata));
                 }
             }
             break;
     }
     parent::xmlEndElementHandler($parser, $name);
 }