You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
510 lines
15 KiB
510 lines
15 KiB
<?php
|
|
// This file is part of Moodle - http://moodle.org/
|
|
//
|
|
// Moodle 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 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// Moodle is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
/**
|
|
* This page export the game to javame for mobile phones
|
|
*
|
|
* @package mod_game
|
|
* @copyright 2007 Vasilis Daloukas
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
|
|
defined('MOODLE_INTERNAL') || die();
|
|
|
|
/**
|
|
* Exports to javame.
|
|
*
|
|
* @param object $game
|
|
* @param object $javame
|
|
*/
|
|
function game_onexportjavame( $game, $javame) {
|
|
global $CFG, $DB;
|
|
|
|
$courseid = $game->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 <br><b>jar ".
|
|
"cvfm {$javame->filename}.jar META-INF/MANIFEST.MF<br></b> to produce the jar files<br><br>";
|
|
}
|
|
|
|
$file = ($filejar != '' ? $filejar : $filezip);
|
|
game_send_stored_file( $file);
|
|
}
|
|
|
|
/**
|
|
* Exports data.
|
|
*
|
|
* @param string $src
|
|
* @param string $destmobiledir
|
|
* @param string $destdir
|
|
* @param stdClass $game
|
|
* @param int $maxwidth
|
|
* @param int $maxheight
|
|
*/
|
|
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();
|
|
}
|
|
$sourcefile = $src. '/lang/'.$lang.'/language.txt';
|
|
if (!file_exists( $sourcefile)) {
|
|
$sourcefile = $src. '/lang/'.$lang.'_utf8/language.txt';
|
|
}
|
|
copy( $sourcefile, $destdir."/$destmobiledir/language.txt");
|
|
|
|
$exportattachment = ( $destmobiledir == 'hangmanp');
|
|
|
|
$map = game_exmportjavame_getanswers( $game, $exportattachment, 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);
|
|
}
|
|
|
|
/**
|
|
* Exports data of hangman with pictures.
|
|
*
|
|
* @param string $src
|
|
* @param string $destmobiledir
|
|
* @param string $destdir
|
|
* @param stdClass $game
|
|
* @param array $map
|
|
* @param int $maxwidth
|
|
* @param int $maxheight
|
|
*/
|
|
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);
|
|
}
|
|
|
|
/**
|
|
* Exports to javame.
|
|
*
|
|
* @param stdClas $game
|
|
* @param stdClass $context
|
|
* @param boolean $exportattachments
|
|
* @param string $dest
|
|
* @param array $files
|
|
*/
|
|
function game_exmportjavame_getanswers( $game, $context, $exportattachment, $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, $exportattachment, $dest, $files);
|
|
case 'quiz':
|
|
return game_exmportjavame_getanswers_quiz( $game, $context, $dest, $files);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Exports to javame.
|
|
*
|
|
* @param stdClass $game
|
|
* @param stdClass $context
|
|
* @param string $destdir
|
|
* @param array $files
|
|
*/
|
|
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);
|
|
}
|
|
|
|
/**
|
|
* Exports to javame.
|
|
*
|
|
* @param stdClass $game
|
|
* @param stdClass $context
|
|
* @param string $destdir
|
|
* @param array $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);
|
|
}
|
|
|
|
/**
|
|
* Exports to javame.
|
|
*
|
|
* @param stdClass $game
|
|
* @param stdClass $context
|
|
* @param string $table
|
|
* @param string $select
|
|
* @param string $fields
|
|
* @param int $courseid
|
|
* @param string $destdir
|
|
* @param array $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 = new stdClass();
|
|
$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;
|
|
}
|
|
|
|
/**
|
|
* Exports to javame.
|
|
*
|
|
* @param stdClass $game
|
|
* @param stdClass $context
|
|
* @param boolean $exportattachments
|
|
* @param string $destdir
|
|
* @param array $files
|
|
*/
|
|
function game_exmportjavame_getanswers_glossary( $game, $context, $exportattachment, $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 ($exportattachment) {
|
|
$select .= " AND attachment <> ''";
|
|
}
|
|
|
|
$fields = 'ge.id,definition,concept';
|
|
if ($exportattachment) {
|
|
$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 ($exportattachment) {
|
|
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;
|
|
}
|
|
|
|
/**
|
|
* Create manifest mf.
|
|
*
|
|
* @param string $dir
|
|
* @param stdClass $javame
|
|
* @param string $destmobiledir
|
|
*/
|
|
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);
|
|
}
|
|
|
|
/**
|
|
* Creates a jar file.
|
|
*
|
|
* @param string $srcdir
|
|
* @param stdClass $course
|
|
* @param stdClass $javame
|
|
*/
|
|
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) ? $filejar : '');
|
|
}
|
|
|
|
/**
|
|
* Exports to javame.
|
|
*
|
|
* @param stdClass $form
|
|
*/
|
|
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 '';
|
|
}
|
|
|
|
/**
|
|
* Copy images
|
|
*
|
|
* @param string $filename
|
|
* @param string $dest
|
|
* @param int $maxwidth
|
|
*/
|
|
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':
|
|
$srcimage = imagecreatefrompng( $filename);
|
|
break;
|
|
case 'image/jpeg':
|
|
$srcimage = imagecreatefromjpeg( $filename);
|
|
break;
|
|
case 'image/gif':
|
|
$srcimage = imagecreatefromgif( $filename);
|
|
break;
|
|
default:
|
|
die('Aknown mime type $mime');
|
|
return false;
|
|
}
|
|
|
|
$dstw = $size[ 0] * $mul;
|
|
$dsth = $size[ 1] * $mul;
|
|
$dstimage = imagecreatetruecolor( $dstw, $dsth);
|
|
imagecopyresampled( $dstimage, $srcimage, 0, 0, 0, 0, $dstw, $dsth, $size[ 0], $size[ 1]);
|
|
|
|
imagejpeg( $dstimage, $dest);
|
|
}
|
|
|