Version 18.63.1

This commit is contained in:
Antonio Cañas Vargas 2019-03-03 12:27:29 +01:00
parent 5758e3c7f6
commit 88c1e2ee24
9 changed files with 161 additions and 121 deletions

View File

@ -411,6 +411,8 @@ Antonio
// TODO: Chequear "Imagen no encontrada" en timeline. Mensaje de Víctor González Argudo // TODO: Chequear "Imagen no encontrada" en timeline. Mensaje de Víctor González Argudo
// TODO: Comprobar "Error when getting publishing code from session." tras horas de inactividad.
/*****************************************************************************/ /*****************************************************************************/
/****************************** Public constants *****************************/ /****************************** Public constants *****************************/
/*****************************************************************************/ /*****************************************************************************/
@ -430,10 +432,11 @@ En OpenSWAD:
ps2pdf source.ps destination.pdf ps2pdf source.ps destination.pdf
*/ */
#define Log_PLATFORM_VERSION "SWAD 18.63 (2019-03-02)" #define Log_PLATFORM_VERSION "SWAD 18.63.1 (2019-03-03)"
#define CSS_FILE "swad18.61.css" #define CSS_FILE "swad18.61.css"
#define JS_FILE "swad18.62.js" #define JS_FILE "swad18.62.js"
/* /*
Version 18.63.1: Mar 02, 2019 Allowing animated GIFs. Not finished. (238162 lines)
Version 18.63: Mar 02, 2019 Allowing animated GIFs. Not finished. (238125 lines) Version 18.63: Mar 02, 2019 Allowing animated GIFs. Not finished. (238125 lines)
Rename the following directory: Rename the following directory:
sudo mv /var/www/swad/img /var/www/swad/med sudo mv /var/www/swad/img /var/www/swad/med

View File

@ -511,13 +511,16 @@ static long For_InsertForumPst (long ThrCod,long UsrCod,
DB_QueryINSERTandReturnCode ("can not create a new post in a forum", DB_QueryINSERTandReturnCode ("can not create a new post in a forum",
"INSERT INTO forum_post" "INSERT INTO forum_post"
" (ThrCod,UsrCod,CreatTime,ModifTime,NumNotif," " (ThrCod,UsrCod,CreatTime,ModifTime,NumNotif,"
"Subject,Content,MediaName,MediaTitle,MediaURL)" "Subject,Content,"
"MediaName,MediaType,MediaTitle,MediaURL)"
" VALUES" " VALUES"
" (%ld,%ld,NOW(),NOW(),0," " (%ld,%ld,NOW(),NOW(),0,"
"'%s','%s','%s','%s','%s')", "'%s','%s',"
"'%s','%s','%s','%s')",
ThrCod,UsrCod, ThrCod,UsrCod,
Subject,Content, Subject,Content,
Media->Name, Media->Name,
Med_GetStringTypeForDB (Media->Type),
Media->Title ? Media->Title : "", Media->Title ? Media->Title : "",
Media->URL ? Media->URL : ""); Media->URL ? Media->URL : "");
@ -1369,9 +1372,8 @@ static void For_GetPstData (long PstCod,long *UsrCod,time_t *CreatTimeUTC,
Str_Copy (Content,row[3], Str_Copy (Content,row[3],
Cns_MAX_BYTES_LONG_TEXT); Cns_MAX_BYTES_LONG_TEXT);
/****** Get media name (row[4]), type (row[5]), /****** Get media data (row[4], row[5], row[6], row[7]) *****/
title (row[6]) and URL (row[7]) *****/ Med_GetMediaDataFromRow (row[4],row[5],row[6],row[7],Media);
Med_GetMediaNameTitleAndURLFromRow (row[4],row[5],row[6],row[7],Media);
/***** Free structure that stores the query result *****/ /***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res); DB_FreeMySQLResult (&mysql_res);

View File

@ -2923,13 +2923,12 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Game *Game,
Tst_GetAndWriteTagsQst (Gbl.Test.QstCod); Tst_GetAndWriteTagsQst (Gbl.Test.QstCod);
fprintf (Gbl.F.Out,"</td>"); fprintf (Gbl.F.Out,"</td>");
/* Write the stem (row[2]), the image (row[4], row[5], row[6], row[7]), /* Write stem (row[2]), media data (row[4], row[5], row[6], row[7]),
the feedback (row[3]) and the answers */ feedback (row[3]) and answers */
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">", fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
Tst_WriteQstStem (row[2],"TEST_EDI"); Tst_WriteQstStem (row[2],"TEST_EDI");
Med_GetMediaNameTitleAndURLFromRow (row[4],row[5],row[6],row[7], Med_GetMediaDataFromRow (row[4],row[5],row[6],row[7],&Gbl.Test.Media);
&Gbl.Test.Media);
Med_ShowMedia (&Gbl.Test.Media, Med_ShowMedia (&Gbl.Test.Media,
"TEST_IMG_EDIT_LIST_STEM_CONTAINER", "TEST_IMG_EDIT_LIST_STEM_CONTAINER",
"TEST_IMG_EDIT_LIST_STEM"); "TEST_IMG_EDIT_LIST_STEM");
@ -3554,10 +3553,9 @@ static void Gam_PlayGameShowQuestionAndAnswers (bool ShowAnswers)
fprintf (Gbl.F.Out,"<div class=\"GAM_PLAY_QST_CONTAINER\">"); fprintf (Gbl.F.Out,"<div class=\"GAM_PLAY_QST_CONTAINER\">");
/* Write the stem (row[2]) and the image (row[3], row[4], row[5], row[6]) */ /* Write stem (row[2]) and media data (row[3], row[4], row[5], row[6]) */
Tst_WriteQstStem (row[2],"GAM_PLAY_QST"); Tst_WriteQstStem (row[2],"GAM_PLAY_QST");
Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6], Med_GetMediaDataFromRow (row[3],row[4],row[5],row[6],&Gbl.Test.Media);
&Gbl.Test.Media);
Med_ShowMedia (&Gbl.Test.Media, Med_ShowMedia (&Gbl.Test.Media,
"TEST_IMG_EDIT_LIST_STEM_CONTAINER", "TEST_IMG_EDIT_LIST_STEM_CONTAINER",
"TEST_IMG_EDIT_LIST_STEM"); "TEST_IMG_EDIT_LIST_STEM");

View File

@ -56,6 +56,8 @@ const char *Med_StringsTypeDB[Med_NUM_TYPES] =
"gif", // Med_GIF "gif", // Med_GIF
}; };
#define Med_MAX_SIZE_GIF (5UL * 1024UL * 1024UL) // 5 MiB
/*****************************************************************************/ /*****************************************************************************/
/****************************** Internal types *******************************/ /****************************** Internal types *******************************/
/*****************************************************************************/ /*****************************************************************************/
@ -78,7 +80,7 @@ static Med_Action_t Med_GetMediaActionFromForm (const char *ParamAction);
static void Med_GetAndProcessFileFromForm (struct Media *Media, static void Med_GetAndProcessFileFromForm (struct Media *Media,
const char *ParamFile); const char *ParamFile);
static int Med_ProcessMedia (struct Media *Media, static int Med_ConvertImage (struct Media *Media,
const char *FileNameOriginal, const char *FileNameOriginal,
const char *FileNameProcessed); const char *FileNameProcessed);
@ -152,11 +154,11 @@ void Med_FreeMediaURL (struct Media *Media)
/**** Get media name, title and URL from a query result and copy to struct ***/ /**** Get media name, title and URL from a query result and copy to struct ***/
/*****************************************************************************/ /*****************************************************************************/
void Med_GetMediaNameTitleAndURLFromRow (const char *Name, void Med_GetMediaDataFromRow (const char *Name,
const char *TypeStr, const char *TypeStr,
const char *Title, const char *Title,
const char *URL, const char *URL,
struct Media *Media) struct Media *Media)
{ {
size_t Length; size_t Length;
@ -421,6 +423,7 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media,
const char *ParamFile) const char *ParamFile)
{ {
extern const char *Txt_The_image_could_not_be_processed_successfully; extern const char *Txt_The_image_could_not_be_processed_successfully;
extern const char *Txt_The_size_of_the_gif_file_exceeds_the_maximum_allowed_X;
struct Param *Param; struct Param *Param;
char FileNameImgSrc[PATH_MAX + 1]; char FileNameImgSrc[PATH_MAX + 1];
char *PtrExtension; char *PtrExtension;
@ -430,6 +433,7 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media,
char FileNameOrig[PATH_MAX + 1]; // Full name of original uploaded file char FileNameOrig[PATH_MAX + 1]; // Full name of original uploaded file
char FileNameTmp[PATH_MAX + 1]; // Full name of temporary processed file char FileNameTmp[PATH_MAX + 1]; // Full name of temporary processed file
struct stat FileStatus; struct stat FileStatus;
char FileSizeStr[Fil_MAX_BYTES_FILE_SIZE_STRING + 1];
bool WrongType = false; bool WrongType = false;
/***** Set media file status *****/ /***** Set media file status *****/
@ -502,18 +506,18 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media,
switch (Media->Type) switch (Media->Type)
{ {
case Med_JPG: case Med_JPG:
/***** Convert original media to temporary JPEG processed file /***** Convert original media to temporary JPG processed file
by calling to program that makes the conversion *****/ by calling to program that makes the conversion *****/
snprintf (FileNameTmp,sizeof (FileNameTmp), snprintf (FileNameTmp,sizeof (FileNameTmp),
"%s/%s/%s/%s.jpg", "%s/%s/%s/%s.jpg",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,Cfg_FOLDER_IMG_TMP, Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,Cfg_FOLDER_IMG_TMP,
Media->Name); Media->Name);
if (Med_ProcessMedia (Media,FileNameOrig,FileNameTmp) == 0) // Return 0 on success if (Med_ConvertImage (Media,FileNameOrig,FileNameTmp) == 0) // On success ==> 0 is returned
/* Success */ /* Success */
Media->Status = Med_FILE_PROCESSED; Media->Status = Med_FILE_PROCESSED;
else // Error processing media else // Error processing media
{ {
/* Error ==> remove temporary destination media file */ /* Remove temporary destination media file */
if (Fil_CheckIfPathExists (FileNameTmp)) if (Fil_CheckIfPathExists (FileNameTmp))
unlink (FileNameTmp); unlink (FileNameTmp);
@ -526,15 +530,10 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media,
break; break;
case Med_GIF: case Med_GIF:
/***** Check size of media file *****/ /***** Check size of media file *****/
if (lstat (FileNameOrig,&FileStatus)) // On success ==> 0 is returned if (lstat (FileNameOrig,&FileStatus) == 0) // On success ==> 0 is returned
{ {
// Error on lstat /* Success */
/* Show error alert */ if (FileStatus.st_size <= (__off_t) Med_MAX_SIZE_GIF)
Ale_ShowAlert (Ale_ERROR,"Can not check gif file.");
}
else
{
if (FileStatus.st_size <= 5*1024*1024)
{ {
/***** Move original file to temporary file *****/ /***** Move original file to temporary file *****/
snprintf (FileNameTmp,sizeof (FileNameTmp), snprintf (FileNameTmp,sizeof (FileNameTmp),
@ -542,13 +541,20 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media,
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,Cfg_FOLDER_IMG_TMP, Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,Cfg_FOLDER_IMG_TMP,
Media->Name); Media->Name);
if (rename (FileNameOrig,FileNameTmp)) // Fail if (rename (FileNameOrig,FileNameTmp)) // Fail
Ale_ShowAlert (Ale_ERROR,"No se puede cambiar el nombre..."); // TODO: Need translation!!!! Ale_ShowAlert (Ale_ERROR,"Can not change file name.");
else // Success else // Success
Media->Status = Med_FILE_PROCESSED; Media->Status = Med_FILE_PROCESSED;
} }
else else // Size exceeded
Ale_ShowAlert (Ale_WARNING,"El tama&ntilde;o del archivo excede el l&iacute;mite..."); // TODO: Need translation!!!! {
Fil_WriteFileSizeBrief ((double) Med_MAX_SIZE_GIF,FileSizeStr);
Ale_ShowAlert (Ale_WARNING,Txt_The_size_of_the_gif_file_exceeds_the_maximum_allowed_X,
FileSizeStr);
}
} }
else // Error getting file data
/* Show error alert */
Ale_ShowAlert (Ale_ERROR,"Can not get file size.");
/***** Remove temporary original file *****/ /***** Remove temporary original file *****/
unlink (FileNameOrig); unlink (FileNameOrig);
@ -565,7 +571,7 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media,
// Return 0 on success // Return 0 on success
// Return != 0 on error // Return != 0 on error
static int Med_ProcessMedia (struct Media *Media, static int Med_ConvertImage (struct Media *Media,
const char *FileNameOriginal, const char *FileNameOriginal,
const char *FileNameProcessed) const char *FileNameProcessed)
{ {

View File

@ -133,11 +133,11 @@ void Med_MediaDestructor (struct Media *Media);
void Med_FreeMediaTitle (struct Media *Media); void Med_FreeMediaTitle (struct Media *Media);
void Med_FreeMediaURL (struct Media *Media); void Med_FreeMediaURL (struct Media *Media);
void Med_GetMediaNameTitleAndURLFromRow (const char *Name, void Med_GetMediaDataFromRow (const char *Name,
const char *TypeStr, const char *TypeStr,
const char *Title, const char *Title,
const char *URL, const char *URL,
struct Media *Media); struct Media *Media);
void Med_PutMediaUploader (int NumMediaInForm,const char *ClassMediaTitURL); void Med_PutMediaUploader (int NumMediaInForm,const char *ClassMediaTitURL);
void Med_GetMediaFromForm (int NumMediaInForm,struct Media *Media, void Med_GetMediaFromForm (int NumMediaInForm,struct Media *Media,

View File

@ -1291,9 +1291,11 @@ static long Msg_InsertNewMsg (const char *Subject,const char *Content,
MsgCod = MsgCod =
DB_QueryINSERTandReturnCode ("can not create message", DB_QueryINSERTandReturnCode ("can not create message",
"INSERT INTO msg_content" "INSERT INTO msg_content"
" (Subject,Content,MediaName,MediaType,MediaTitle,MediaURL)" " (Subject,Content,"
"MediaName,MediaType,MediaTitle,MediaURL)"
" VALUES" " VALUES"
" ('%s','%s','%s','%s','%s','%s')", " ('%s','%s',"
"'%s','%s','%s','%s')",
Subject,Content, Subject,Content,
Media->Name, Media->Name,
Med_GetStringTypeForDB (Media->Type), Med_GetStringTypeForDB (Media->Type),
@ -1491,8 +1493,10 @@ static void Msg_MoveMsgContentToDeleted (long MsgCod)
/* Insert message content into msg_content_deleted */ /* Insert message content into msg_content_deleted */
DB_QueryINSERT ("can not remove the content of a message", DB_QueryINSERT ("can not remove the content of a message",
"INSERT IGNORE INTO msg_content_deleted" "INSERT IGNORE INTO msg_content_deleted"
" (MsgCod,Subject,Content,MediaName,MediaType,MediaTitle,MediaURL)" " (MsgCod,Subject,Content,"
" SELECT MsgCod,Subject,Content,MediaName,MediaType,MediaTitle,MediaURL" "MediaName,MediaType,MediaTitle,MediaURL)"
" SELECT MsgCod,Subject,Content,"
"MediaName,MediaType,MediaTitle,MediaURL"
" FROM msg_content WHERE MsgCod=%ld", " FROM msg_content WHERE MsgCod=%ld",
MsgCod); MsgCod);
@ -2802,8 +2806,8 @@ static void Msg_GetMsgContent (long MsgCod,char Content[Cns_MAX_BYTES_LONG_TEXT
Str_Copy (Content,row[0], Str_Copy (Content,row[0],
Cns_MAX_BYTES_LONG_TEXT); Cns_MAX_BYTES_LONG_TEXT);
/****** Get image name (row[1]), type (row[2]), title (row[3]) and URL (row[4]) *****/ /****** Get media data (row[1], row[2], row[3], row[4]) *****/
Med_GetMediaNameTitleAndURLFromRow (row[1],row[2],row[3],row[4],Media); Med_GetMediaDataFromRow (row[1],row[2],row[3],row[4],Media);
/***** Free structure that stores the query result *****/ /***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res); DB_FreeMySQLResult (&mysql_res);

View File

@ -1833,8 +1833,8 @@ static void Soc_GetAndWriteSocialPost (long PstCod)
Str_Copy (Content,row[0], Str_Copy (Content,row[0],
Cns_MAX_BYTES_LONG_TEXT); Cns_MAX_BYTES_LONG_TEXT);
/****** Get image name (row[1]), type (row[2]), title (row[3]) and URL (row[4]) *****/ /****** Get media data (row[1], row[2], row[3], row[4]) *****/
Med_GetMediaNameTitleAndURLFromRow (row[1],row[2],row[3],row[4],&Media); Med_GetMediaDataFromRow (row[1],row[2],row[3],row[4],&Media);
} }
else else
Content[0] = '\0'; Content[0] = '\0';
@ -2470,9 +2470,11 @@ static long Soc_ReceiveSocialPost (void)
PstCod = PstCod =
DB_QueryINSERTandReturnCode ("can not create post", DB_QueryINSERTandReturnCode ("can not create post",
"INSERT INTO social_posts" "INSERT INTO social_posts"
" (Content,MediaName,MediaType,MediaTitle,MediaURL)" " (Content,"
"MediaName,MediaType,MediaTitle,MediaURL)"
" VALUES" " VALUES"
" ('%s','%s','%s','%s','%s')", " ('%s',"
"'%s','%s','%s','%s')",
Content, Content,
Media.Name, Media.Name,
Med_GetStringTypeForDB (Media.Type), Med_GetStringTypeForDB (Media.Type),
@ -3201,9 +3203,11 @@ static long Soc_ReceiveComment (void)
/* Insert comment content in the database */ /* Insert comment content in the database */
DB_QueryINSERT ("can not store comment content", DB_QueryINSERT ("can not store comment content",
"INSERT INTO social_comments" "INSERT INTO social_comments"
" (PubCod,Content,MediaName,MediaType,MediaTitle,MediaURL)" " (PubCod,Content,"
"MediaName,MediaType,MediaTitle,MediaURL)"
" VALUES" " VALUES"
" (%ld,'%s','%s','%s','%s','%s')", " (%ld,'%s',"
"'%s','%s','%s','%s')",
SocPub.PubCod, SocPub.PubCod,
Content, Content,
Media.Name, Media.Name,
@ -4826,9 +4830,8 @@ static void Soc_GetDataOfSocialCommentFromRow (MYSQL_ROW row,struct SocialCommen
/***** Get number of times this comment has been favourited *****/ /***** Get number of times this comment has been favourited *****/
Soc_GetNumTimesACommHasBeenFav (SocCom); Soc_GetNumTimesACommHasBeenFav (SocCom);
/****** Get image name (row[5]), type (row[6]), title (row[7]) and URL (row[8]) *****/ /****** Get media data (row[5], row[6], row[7], row[8]) *****/
Med_GetMediaNameTitleAndURLFromRow (row[5],row[6],row[7],row[8], Med_GetMediaDataFromRow (row[5],row[6],row[7],row[8],&SocCom->Media);
&SocCom->Media);
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -1034,13 +1034,12 @@ void Tst_WriteQstAndAnsTest (Tst_ActionToDoWithQuestions_t ActionToDoWithQuestio
"</td>", "</td>",
Txt_TST_STR_ANSWER_TYPES[Gbl.Test.AnswerType]); Txt_TST_STR_ANSWER_TYPES[Gbl.Test.AnswerType]);
/***** Write stem (row[4]), media (row[6], row[7], row[8], row[9]), /***** Write stem (row[4]), media data (row[6], row[7], row[8], row[9]),
answers depending on shuffle (row[3]) and feedback (row[5]) *****/ answers depending on shuffle (row[3]) and feedback (row[5]) *****/
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">", fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
Tst_WriteQstStem (row[4],"TEST_EXA"); Tst_WriteQstStem (row[4],"TEST_EXA");
Med_GetMediaNameTitleAndURLFromRow (row[6],row[7],row[8],row[9], Med_GetMediaDataFromRow (row[6],row[7],row[8],row[9],&Gbl.Test.Media);
&Gbl.Test.Media);
Med_ShowMedia (&Gbl.Test.Media, Med_ShowMedia (&Gbl.Test.Media,
"TEST_IMG_SHOW_STEM_CONTAINER", "TEST_IMG_SHOW_STEM_CONTAINER",
"TEST_IMG_SHOW_STEM"); "TEST_IMG_SHOW_STEM");
@ -2987,13 +2986,12 @@ static void Tst_ListOneOrMoreQuestionsForEdition (unsigned long NumRows,
} }
fprintf (Gbl.F.Out,"</td>"); fprintf (Gbl.F.Out,"</td>");
/* Write the stem (row[4]), the media (row[6], row[7], row[8], row[9]), /* Write stem (row[4]), media data (row[6], row[7], row[8], row[9]),
the feedback (row[5]) and the answers */ feedback (row[5]) and answers */
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">", fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
Tst_WriteQstStem (row[4],"TEST_EDI"); Tst_WriteQstStem (row[4],"TEST_EDI");
Med_GetMediaNameTitleAndURLFromRow (row[6],row[7],row[8],row[9], Med_GetMediaDataFromRow (row[6],row[7],row[8],row[9],&Gbl.Test.Media);
&Gbl.Test.Media);
Med_ShowMedia (&Gbl.Test.Media, Med_ShowMedia (&Gbl.Test.Media,
"TEST_IMG_EDIT_LIST_STEM_CONTAINER", "TEST_IMG_EDIT_LIST_STEM_CONTAINER",
"TEST_IMG_EDIT_LIST_STEM"); "TEST_IMG_EDIT_LIST_STEM");
@ -3223,13 +3221,12 @@ static void Tst_ListOneOrMoreQuestionsForSelection (long GamCod,
fprintf (Gbl.F.Out,"</td>"); fprintf (Gbl.F.Out,"</td>");
/* Write the stem (row[4]), the image (row[6], row[7], row[8], row[9]), /* Write stem (row[4]), media data (row[6], row[7], row[8], row[9]),
the feedback (row[5]) and the answers */ feedback (row[5]) and answers */
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">", fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
Tst_WriteQstStem (row[4],"TEST_EDI"); Tst_WriteQstStem (row[4],"TEST_EDI");
Med_GetMediaNameTitleAndURLFromRow (row[6],row[7],row[8],row[9], Med_GetMediaDataFromRow (row[6],row[7],row[8],row[9],&Gbl.Test.Media);
&Gbl.Test.Media);
Med_ShowMedia (&Gbl.Test.Media, Med_ShowMedia (&Gbl.Test.Media,
"TEST_IMG_EDIT_LIST_STEM_CONTAINER", "TEST_IMG_EDIT_LIST_STEM_CONTAINER",
"TEST_IMG_EDIT_LIST_STEM"); "TEST_IMG_EDIT_LIST_STEM");
@ -3320,14 +3317,14 @@ static void Tst_WriteAnswersEdit (long QstCod)
Gbl.Test.Answer.NumOptions = Tst_GetAnswersQst (QstCod,&mysql_res,false); Gbl.Test.Answer.NumOptions = Tst_GetAnswersQst (QstCod,&mysql_res,false);
/* /*
row[ 0] AnsInd row[0] AnsInd
row[ 1] Answer row[1] Answer
row[ 2] Feedback row[2] Feedback
row[ 3] MediaName row[3] MediaName
row[ 4] MediaType row[4] MediaType
row[ 5] MediaTitle row[5] MediaTitle
row[ 6] MediaURL row[6] MediaURL
row[ 7] Correct row[7] Correct
*/ */
/***** Write the answers *****/ /***** Write the answers *****/
switch (Gbl.Test.AnswerType) switch (Gbl.Test.AnswerType)
@ -3393,9 +3390,9 @@ static void Tst_WriteAnswersEdit (long QstCod)
Feedback,LengthFeedback,false); Feedback,LengthFeedback,false);
} }
/* Copy image */ /* Get media data (row[3], row[4], row[5], row[6]) */
Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6], Med_GetMediaDataFromRow (row[3],row[4],row[5],row[6],
&Gbl.Test.Answer.Options[NumOpt].Media); &Gbl.Test.Answer.Options[NumOpt].Media);
/* Put an icon that indicates whether the answer is correct or wrong */ /* Put an icon that indicates whether the answer is correct or wrong */
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
@ -3495,14 +3492,14 @@ static void Tst_WriteAnswersTestResult (struct UsrData *UsrDat,
/***** Get answers of a question from database *****/ /***** Get answers of a question from database *****/
Gbl.Test.Answer.NumOptions = Tst_GetAnswersQst (QstCod,&mysql_res,false); Gbl.Test.Answer.NumOptions = Tst_GetAnswersQst (QstCod,&mysql_res,false);
/* /*
row[ 0] AnsInd row[0] AnsInd
row[ 1] Answer row[1] Answer
row[ 2] Feedback row[2] Feedback
row[ 3] MediaName row[3] MediaName
row[ 4] MediaType row[4] MediaType
row[ 5] MediaTitle row[5] MediaTitle
row[ 6] MediaURL row[6] MediaURL
row[ 7] Correct row[7] Correct
*/ */
/***** Write answer depending on type *****/ /***** Write answer depending on type *****/
switch (Gbl.Test.AnswerType) switch (Gbl.Test.AnswerType)
@ -3705,14 +3702,14 @@ static void Tst_WriteChoiceAnsViewTest (unsigned NumQst,long QstCod,bool Shuffle
/***** Get answers of a question from database *****/ /***** Get answers of a question from database *****/
Gbl.Test.Answer.NumOptions = Tst_GetAnswersQst (QstCod,&mysql_res,Shuffle); Gbl.Test.Answer.NumOptions = Tst_GetAnswersQst (QstCod,&mysql_res,Shuffle);
/* /*
row[ 0] AnsInd row[0] AnsInd
row[ 1] Answer row[1] Answer
row[ 2] Feedback row[2] Feedback
row[ 3] MediaName row[3] MediaName
row[ 4] MediaType row[4] MediaType
row[ 5] MediaTitle row[5] MediaTitle
row[ 6] MediaURL row[6] MediaURL
row[ 7] Correct row[7] Correct
*/ */
/***** Start table *****/ /***** Start table *****/
@ -3749,9 +3746,9 @@ static void Tst_WriteChoiceAnsViewTest (unsigned NumQst,long QstCod,bool Shuffle
Gbl.Test.Answer.Options[NumOpt].Text, Gbl.Test.Answer.Options[NumOpt].Text,
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false); Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false);
/***** Copy image *****/ /***** Get media data (row[3], row[4], row[5], row[6]) *****/
Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6], Med_GetMediaDataFromRow (row[3],row[4],row[5],row[6],
&Gbl.Test.Answer.Options[NumOpt].Media); &Gbl.Test.Answer.Options[NumOpt].Media);
/***** Write selectors and letter of this option *****/ /***** Write selectors and letter of this option *****/
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
@ -3871,9 +3868,9 @@ static void Tst_WriteChoiceAnsAssessTest (struct UsrData *UsrDat,
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false); Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false);
} }
/***** Copy image *****/ /***** Get media data (row[3], row[4], row[5], row[6]) *****/
Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6], Med_GetMediaDataFromRow (row[3],row[4],row[5],row[6],
&Gbl.Test.Answer.Options[NumOpt].Media); &Gbl.Test.Answer.Options[NumOpt].Media);
/***** Assign correctness (row[7]) of this answer (this option) *****/ /***** Assign correctness (row[7]) of this answer (this option) *****/
Gbl.Test.Answer.Options[NumOpt].Correct = (row[7][0] == 'Y'); Gbl.Test.Answer.Options[NumOpt].Correct = (row[7][0] == 'Y');
@ -4120,9 +4117,9 @@ static void Tst_WriteChoiceAnsViewGame (struct Game *Game,
Gbl.Test.Answer.Options[NumOpt].Text, Gbl.Test.Answer.Options[NumOpt].Text,
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false); Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false);
/***** Copy image *****/ /***** Get media data (row[3], row[4], row[5], row[6]) *****/
Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6], Med_GetMediaDataFromRow (row[3],row[4],row[5],row[6],
&Gbl.Test.Answer.Options[NumOpt].Media); &Gbl.Test.Answer.Options[NumOpt].Media);
/***** Write letter of this option *****/ /***** Write letter of this option *****/
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
@ -4193,14 +4190,14 @@ static void Tst_WriteTextAnsAssessTest (struct UsrData *UsrDat,
char TextAnsOK[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1]; char TextAnsOK[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1];
bool Correct = false; bool Correct = false;
/* /*
row[ 0] AnsInd row[0] AnsInd
row[ 1] Answer row[1] Answer
row[ 2] Feedback row[2] Feedback
row[ 3] MediaName row[3] MediaName
row[ 4] MediaType row[4] MediaType
row[ 5] MediaTitle row[5] MediaTitle
row[ 6] MediaURL row[6] MediaURL
row[ 7] Correct row[7] Correct
*/ */
/***** Get text and correctness of answers for this question from database (one row per answer) *****/ /***** Get text and correctness of answers for this question from database (one row per answer) *****/
for (NumOpt = 0; for (NumOpt = 0;
@ -5583,10 +5580,8 @@ static void Tst_GetQstDataFromDB (char Stem[Cns_MAX_BYTES_TEXT + 1],
Str_Copy (Feedback,row[3], Str_Copy (Feedback,row[3],
Cns_MAX_BYTES_TEXT); Cns_MAX_BYTES_TEXT);
/* Get the image name, title and URL of the question /* Get media data (row[4], row[5], row[6], row[7]) */
from the database (row[4], row[5], row[6], row[7]) */ Med_GetMediaDataFromRow (row[4],row[5],row[6],row[7],&Gbl.Test.Media);
Med_GetMediaNameTitleAndURLFromRow (row[4],row[5],row[6],row[7],
&Gbl.Test.Media);
/* Free structure that stores the query result */ /* Free structure that stores the query result */
DB_FreeMySQLResult (&mysql_res); DB_FreeMySQLResult (&mysql_res);
@ -5656,10 +5651,11 @@ static void Tst_GetQstDataFromDB (char Stem[Cns_MAX_BYTES_TEXT + 1],
Str_Copy (Gbl.Test.Answer.Options[NumOpt].Feedback,row[2], Str_Copy (Gbl.Test.Answer.Options[NumOpt].Feedback,row[2],
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK); Tst_MAX_BYTES_ANSWER_OR_FEEDBACK);
/* Copy image */ /* Get media data (row[3], row[4], row[5], row[6]) */
Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6], Med_GetMediaDataFromRow (row[3],row[4],row[5],row[6],
&Gbl.Test.Answer.Options[NumOpt].Media); &Gbl.Test.Answer.Options[NumOpt].Media);
/* Get if this option is correct */
Gbl.Test.Answer.Options[NumOpt].Correct = (row[7][0] == 'Y'); Gbl.Test.Answer.Options[NumOpt].Correct = (row[7][0] == 'Y');
break; break;
default: default:
@ -5705,10 +5701,8 @@ static void Tst_GetMediaFromDB (int NumOpt,struct Media *Media)
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
/***** Get the image name, type, title and URL /***** Get media data (row[0], row[1], row[2], row[3]) *****/
(row[0], row[1], row[2], row[3]) *****/ Med_GetMediaDataFromRow (row[0],row[1],row[2],row[3],Media);
Med_GetMediaNameTitleAndURLFromRow (row[0],row[1],row[2],row[3],
Media);
/***** Free structure that stores the query result *****/ /***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res); DB_FreeMySQLResult (&mysql_res);
@ -6832,7 +6826,7 @@ static void Tst_RemoveImgFileFromAnsOfQst (long CrsCod,long QstCod,unsigned AnsI
"SELECT tst_answers.MediaName," // row[0] "SELECT tst_answers.MediaName," // row[0]
"tst_answers.MediaType" // row[1] "tst_answers.MediaType" // row[1]
" FROM tst_questions,tst_answers" " FROM tst_questions,tst_answers"
" WHERE tst_questions.CrsCod=%ld" // Extra check " WHERE tst_questions.CrsCod=%ld"// Extra check
" AND tst_questions.QstCod=%ld" // Extra check " AND tst_questions.QstCod=%ld" // Extra check
" AND tst_questions.QstCod=tst_answers.QstCod" " AND tst_questions.QstCod=tst_answers.QstCod"
" AND tst_answers.QstCod=%ld" " AND tst_answers.QstCod=%ld"

View File

@ -46871,6 +46871,36 @@ const char *Txt_The_session_has_expired =
"A sess&atilde;o expirou."; "A sess&atilde;o expirou.";
#endif #endif
const char *Txt_The_size_of_the_gif_file_exceeds_the_maximum_allowed_X = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"La mida del fitxer <em>GIF</em>"
" supera el m&agrave;xim perm&egrave;s (%s).";
#elif L==2 // de
"Die Gr&ouml;&szlig;e der <em>GIF</em>-Datei"
" &uuml;berschreitet den zul&auml;ssigen H&ouml;chstwert (%s).";
#elif L==3 // en
"The size of the <em>GIF</em> file"
" exceeds the maximum allowed (%s).";
#elif L==4 // es
"El tama&ntilde;o del archivo <em>GIF</em>"
" excede el m&aacute;ximo permitido (%s).";
#elif L==5 // fr
"La taille du fichier <em>GIF</em>"
" d&eacute;passe le maximum autoris&eacute; (%s).";
#elif L==6 // gn
"El tama&ntilde;o del archivo <em>GIF</em>"
" excede el m&aacute;ximo permitido (%s)."; // Okoteve traducción
#elif L==7 // it
"La dimensione del file <em>GIF</em>"
" supera il massimo consentito (%s).";
#elif L==8 // pl
"Rozmiar pliku <em>GIF</em>"
" przekracza maksymalne dozwolone (%s).";
#elif L==9 // pt
"O tamanho do arquivo <em>GIF</em>"
" excede o m&aacute;ximo permitido (%s).";
#endif
const char *Txt_The_status_of_the_centre_X_has_changed = // Warning: it is very important to include %s in the following sentences const char *Txt_The_status_of_the_centre_X_has_changed = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca #if L==1 // ca
"El estado del centro <strong>%s</strong> ha cambiado."; // Necessita traduccio "El estado del centro <strong>%s</strong> ha cambiado."; // Necessita traduccio