course; $course = $DB->get_record( 'course', array( 'id' => $courseid)); $destdir = game_export_createtempdir(); if( $javame->type == 'hangmanp'){ $destmobiledir = 'hangmanp'; }else{ $destmobiledir = 'hangman'; } $src = $CFG->dirroot.'/mod/game/export/javame/'.$destmobiledir.'/simple'; if( $javame->filename == ''){ $javame->filename = 'moodle'.$destmobiledir; } $handle = opendir( $src); while (false!==($item = readdir($handle))) { if($item != '.' && $item != '..') { if(!is_dir($src.'/'.$item)) { $itemdest = $item; if( substr( $item, -5) == '.java'){ continue; //don't copy the java source code files } if( substr( $itemdest, -8) == '-1.class'){ $itemdest = substr( $itemdest, 0, -8).'$1.class'; } copy( $src.'/'.$item, $destdir.'/'.$itemdest); } } } mkdir( $destdir.'/META-INF'); game_exportjavame_exportdata( $src, $destmobiledir, $destdir, $game, $javame->maxpicturewidth, $javame->maxpictureheight); game_create_manifest_mf( $destdir.'/META-INF', $javame, $destmobiledir); $filejar = game_create_jar( $destdir, $course, $javame); if( $filejar == ''){ $filezip = game_create_zip( $destdir, $course->id, $javame->filename.'.zip'); }else{ $filezip = ''; } if( $destdir != ''){ remove_dir( $destdir); } if( $filezip != ''){ echo "unzip the $filezip in a directory and when you are in this directory use the command
jar cvfm {$javame->filename}.jar META-INF/MANIFEST.MF
to produce the jar files

"; } $file = ($filejar != '' ? $filejar : $filezip); game_send_stored_file( $file); } function game_exportjavame_exportdata( $src, $destmobiledir, $destdir, $game, $maxwidth, $maxheight){ global $CFG; mkdir( $destdir.'/'.$destmobiledir); $handle = opendir( $src); while (false!==($item = readdir($handle))) { if($item != '.' && $item != '..') { if(!is_dir($src.'/'.$item)) { if( substr( $item, -4) == '.jpg'){ copy( $src.'/'.$item, $destdir."/$destmobiledir/".$item); } } } } $lang = $game->language; if( $lang == '') $lang = current_language(); copy( $src. '/lang/'.$lang.'/language.txt', $destdir."/$destmobiledir/language.txt"); $export_attachment = ( $destmobiledir == 'hangmanp'); $map = game_exmportjavame_getanswers( $game, $export_attachment, false, $destdir, $files); if( $map == false){ print_error( 'No Questions'); } if( $destmobiledir == 'hangmanp'){ game_exportjavame_exportdata_hangmanp( $src, $destmobiledir, $destdir, $game, $map, $maxwidth, $maxheight); return; } $fp = fopen( $destdir."/$destmobiledir/hangman.txt","w"); fputs( $fp, "1.txt=$destmobiledir\r\n"); fclose( $fp); $fp = fopen( $destdir."/$destmobiledir/1.txt","w"); foreach( $map as $line){ $s = game_upper( $line->answer) . '=' . $line->question; fputs( $fp, "$s\r\n"); } fclose( $fp); } function game_exportjavame_exportdata_hangmanp( $src, $destmobiledir, $destdir, $game, $map, $maxwidth, $maxheight) { global $CFG; $fp = fopen( $destdir."/$destmobiledir/$destmobiledir.txt","w"); fputs( $fp, "01=01\r\n"); fclose( $fp); $destdirphoto = $destdir.'/'.$destmobiledir.'/01'; mkdir( $destdirphoto); $fp = fopen( $destdirphoto.'/photo.txt',"w"); foreach( $map as $line){ $file = $line->attachment; $pos = strrpos( $file, '.'); if( $pos != false){ $file = $line->id.substr( $file, $pos); $src = $CFG->dataroot.'/'.$game->course.'/moddata/'.$line->attachment; game_export_javame_smartcopyimage( $src, $destdirphoto.'/'.$file, $maxwidth, $maxheight); $s = $file . '=' . game_upper( $line->answer); fputs( $fp, "$s\r\n"); } } fclose( $fp); } function game_exmportjavame_getanswers( $game, $context, $export_attachment, $dest, &$files){ $map = array(); $files = array(); switch( $game->sourcemodule){ case 'question': return game_exmportjavame_getanswers_question( $game, $context, $dest, $files); case 'glossary': return game_exmportjavame_getanswers_glossary( $game, $context, $export_attachment, $dest, $files); case 'quiz': return game_exmportjavame_getanswers_quiz( $game, $context, $dest, $files); } return false; } function game_exmportjavame_getanswers_question( $game, $context, $destdir, &$files){ $select = 'hidden = 0 AND category='.$game->questioncategoryid; $select .= game_showanswers_appendselect( $game); return game_exmportjavame_getanswers_question_select( $game, $context, 'question', $select, '*', $game->course, $destdir, $files); } function game_exmportjavame_getanswers_quiz( $game, $context, $destdir, $files) { global $CFG; $select = "quiz='$game->quizid' ". " AND qqi.question=q.id". " AND q.hidden=0". game_showanswers_appendselect( $game); $table = "{question} q,{quiz_question_instances} qqi"; return game_exmportjavame_getanswers_question_select( $game, $context, $table, $select, "q.*", $game->course, $destdir, $files); } function game_exmportjavame_getanswers_question_select( $game, $context, $table, $select, $fields, $courseid, $destdir, &$files) { global $CFG, $DB; if( ($questions = $DB->get_records_select( $table, $select, null, '', $fields)) === false){ return; } $line = 0; $map = array(); foreach( $questions as $question){ unset( $ret); $ret->qtype = $question->qtype; $ret->question = $question->questiontext; $ret->question = str_replace( array( '"', '#'), array( "'", ' '), game_export_split_files( $game->course, $context, 'questiontext', $question->id, $ret->question, $destdir, $files)); switch( $question->qtype){ case 'shortanswer': $rec = $DB->get_record( 'question_answers', array( 'question' => $question->id), 'id,answer,feedback'); $ret->answer = $rec->answer; $ret->feedback = $rec->feedback; $map[] = $ret; break; default: break; } } return $map; } function game_exmportjavame_getanswers_glossary( $game, $context, $export_attachment, $destdir, &$files) { global $CFG, $DB; $table = '{glossary_entries} ge'; $select = "glossaryid={$game->glossaryid}"; if( $game->glossarycategoryid){ $select .= " AND gec.entryid = ge.id ". " AND gec.categoryid = {$game->glossarycategoryid}"; $table .= ",{glossary_entries_categories} gec"; } if( $export_attachment){ $select .= " AND attachment <> ''"; } $fields = 'ge.id,definition,concept'; if( $export_attachment){ $fields .= ',attachment'; } $sql = "SELECT $fields FROM $table WHERE $select ORDER BY definition"; if( ($questions = $DB->get_records_sql( $sql)) === false){ return false; } $fs = get_file_storage(); $map = array(); $cmglossary = false; foreach( $questions as $question){ $ret = new stdClass(); $ret->id = $question->id; $ret->qtype = 'shortanswer'; $ret->question = strip_tags( $question->definition); $ret->answer = $question->concept; $ret->feedback = ''; $ret->attachment = ''; //Copies the appropriate files from the file storage to destdir if( $export_attachment){ if( $question->attachment != ''){ if( $cmglossary === false) { $cmglossary = get_coursemodule_from_instance('glossary', $game->glossaryid, $game->course); $contextglossary = get_context_instance(CONTEXT_MODULE, $cmglossary->id); } $ret->attachment = "glossary/{$game->glossaryid}/$question->id/$question->attachment"; $myfiles = $fs->get_area_files( $contextglossary->id, 'mod_glossary', 'attachment', $ret->id); $i=0; foreach ($myfiles as $f) { if( $f->is_directory()) continue; $filename = $f->get_filename(); $url = "{$CFG->wwwroot}/pluginfile.php/{$f->get_contextid()}/mod_glossary/attachment}"; $fileurl = $url.$f->get_filepath().$f->get_itemid().'/'.$filename; $pos = strrpos( $filename, '.'); $ext = substr( $filename, $pos); $destfile = $ret->id; if( $i > 0) $destfile .= '_'.$i; $destfile = $destdir.'/'.$destfile.$ext; $f->copy_content_to( $destfile); $ret->attachment = $destfile; $i++; $files[] = $destfile; } } } $map[] = $ret; } return $map; } function game_create_manifest_mf( $dir, $javame, $destmobiledir){ $fp = fopen( $dir.'/MANIFEST.MF',"w"); fputs( $fp, "Manifest-Version: 1.0\r\n"); fputs( $fp, "Ant-Version: Apache Ant 1.7.0\r\n"); fputs( $fp, "Created-By: {$javame->createdby}\r\n"); fputs( $fp, "MIDlet-1: MoodleHangman,,$destmobiledir\r\n"); fputs( $fp, "MIDlet-Vendor: {$javame->vendor}\r\n"); fputs( $fp, "MIDlet-Name: {$javame->vendor}\r\n"); fputs( $fp, "MIDlet-Description: {$javame->description}\r\n"); fputs( $fp, "MIDlet-Version: {$javame->version}\r\n"); fputs( $fp, "MicroEdition-Configuration: CLDC-1.0\r\n"); fputs( $fp, "MicroEdition-Profile: MIDP-1.0\r\n"); fclose( $fp); } function game_create_jar( $srcdir, $course, $javame){ global $CFG; $dir = $CFG->dataroot . '/' . $course->id; $filejar = $dir . "/export/{$javame->filename}.jar"; if (!file_exists( $dir)){ mkdir( $dir); } if (!file_exists( $dir.'/export')){ mkdir( $dir.'/export'); } if (file_exists( $filejar)){ unlink( $filejar); } $cmd = "cd $srcdir;jar cvfm $filejar META-INF/MANIFEST.MF *"; exec( $cmd); return (file_exists( $filejar) ? "{$javame->filename}.jar" : ''); } function game_showanswers_appendselect( $form) { switch( $form->gamekind){ case 'hangman': case 'cross': case 'crypto': return " AND qtype='shortanswer'"; case 'millionaire': return " AND qtype = 'multichoice'"; case 'sudoku': case 'bookquiz': case 'snakes': return " AND qtype in ('shortanswer', 'truefalse', 'multichoice')"; } return ''; } function game_export_javame_smartcopyimage( $filename, $dest, $maxwidth) { if( $maxwidth == 0){ copy( $filename, $dest); return; } $size = getimagesize( $filename); if( $size == false){ copy( $filename, $dest); return; } $mul = $maxwidth / $size[ 0]; if( $mul > 1){ copy( $filename, $dest); return; } $mime = $size[ 'mime']; switch( $mime){ case 'image/png': $src_image = imageCreateFromPNG( $filename); break; case 'image/jpeg': $src_image = imagecreatefromjpeg( $filename); break; case 'image/gif': $src_image = imageCreateFromGIF( $filename); break; default: die('Aknown mime type $mime'); return false; } $dst_w = $size[ 0] * $mul; $dst_h = $size[ 1] * $mul; $dst_image = imagecreatetruecolor( $dst_w, $dst_h); imagecopyresampled( $dst_image, $src_image, 0, 0, 0, 0, $dst_w, $dst_h, $size[ 0], $size[ 1]); imagejpeg( $dst_image, $dest); }