diff --git a/Makefile b/Makefile
index 1e30dac2..597d68e3 100644
--- a/Makefile
+++ b/Makefile
@@ -40,11 +40,10 @@ OBJS = swad_account.o swad_action.o swad_agenda.o swad_alert.o \
swad_forum.o \
swad_game.o swad_global.o swad_group.o \
swad_help.o swad_hierarchy.o swad_holiday.o \
- swad_icon.o swad_ID.o swad_image.o swad_indicator.o swad_info.o \
- swad_institution.o \
+ swad_icon.o swad_ID.o swad_indicator.o swad_info.o swad_institution.o \
swad_language.o swad_layout.o swad_link.o swad_logo.o \
- swad_mail.o swad_main.o swad_mark.o swad_menu.o swad_message.o \
- swad_MFU.o \
+ swad_mail.o swad_main.o swad_mark.o swad_media.o swad_menu.o \
+ swad_message.o swad_MFU.o \
swad_network.o swad_nickname.o swad_notice.o swad_notification.o \
swad_pagination.o swad_parameter.o swad_password.o swad_photo.o \
swad_place.o swad_plugin.o swad_preference.o swad_privacy.o \
diff --git a/css/swad18.61.css b/css/swad18.61.css
index 8d3befbb..d47f2abb 100644
--- a/css/swad18.61.css
+++ b/css/swad18.61.css
@@ -2676,28 +2676,28 @@ a:hover img.CENTRE_PHOTO_SHOW
opacity:0.3;
}
-/****************************** Image uploading ******************************/
-.IMG_UPLOAD_CONTAINER
+/*********************** Media (image/video) uploading ***********************/
+.MED_UPL_CON /* Upload container */
{
vertical-align:top;
margin-bottom:10px;
}
-.IMG_UPLOAD_BUTTON
+.MED_UPL_BUT /* Upload button _*/
{
cursor:pointer;
}
-.IMG_UPLOAD_ICO
+.MED_UPL_ICO /* Upload icon */
{
width:16px;
height:16px;
margin:0 5px;
vertical-align:middle;
}
-.IMG_UPLOAD_FILE
+.MED_UPL_FIL /* Upload file */
{
display:none;
}
-.IMG_UPLOAD_FILENAME
+.MED_UPL_NAM /* Upload filename */
{
color:#808080;
font-size:12pt;
diff --git a/js/swad18.62.js b/js/swad18.62.js
index 12f09b72..f7e53617 100644
--- a/js/swad18.62.js
+++ b/js/swad18.62.js
@@ -1052,10 +1052,10 @@ function enableDisableImgAns (elem, isDisabled) {
var Tst_MAX_OPTIONS_PER_QUESTION = 10;
for (var i = 0; i < Tst_MAX_OPTIONS_PER_QUESTION; i++)
- if (elem.name == ('ImgAct' + i) ||
- elem.name == ('ImgFil' + i) ||
- elem.name == ('ImgTit' + i) ||
- elem.name == ('ImgURL' + i))
+ if (elem.name == ('MedAct' + i) ||
+ elem.name == ('MedFil' + i) ||
+ elem.name == ('MedTit' + i) ||
+ elem.name == ('MedURL' + i))
elem.disabled = isDisabled;
}
@@ -1079,7 +1079,7 @@ function disableDetailedClicks () {
/************************** Upload images in a form **************************/
/*****************************************************************************/
-function imageUploadOnSelectFile (inputFile,id) {
+function mediaUploadOnSelectFile (inputFile,id) {
document.getElementById(id + '_fil').innerHTML = inputFile.value; // Display image filename
document.getElementById(id + '_tit_url').style.display = ''; // Show hidden fields
}
diff --git a/swad_centre.c b/swad_centre.c
index 4d578d18..db4fc81f 100644
--- a/swad_centre.c
+++ b/swad_centre.c
@@ -2381,13 +2381,13 @@ void Ctr_ReceivePhoto (void)
/* Create private directory for images if it does not exist */
snprintf (PathImgPriv,sizeof (PathImgPriv),
"%s/%s",
- Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG);
+ Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA);
Fil_CreateDirIfNotExists (PathImgPriv);
/* Create temporary private directory for images if it does not exist */
snprintf (PathImgPriv,sizeof (PathImgPriv),
"%s/%s/%s",
- Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG,Cfg_FOLDER_IMG_TMP);
+ Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,Cfg_FOLDER_IMG_TMP);
Fil_CreateDirIfNotExists (PathImgPriv);
/* Get filename extension */
@@ -2407,7 +2407,7 @@ void Ctr_ReceivePhoto (void)
/* End the reception of image in a temporary file */
snprintf (FileNameImgTmp,sizeof (FileNameImgTmp),
"%s/%s/%s/%s.%s",
- Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG,Cfg_FOLDER_IMG_TMP,
+ Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,Cfg_FOLDER_IMG_TMP,
Gbl.UniqueNameEncrypted,PtrExtension);
if (!Fil_EndReceptionOfFile (FileNameImgTmp,Param))
{
@@ -2476,11 +2476,11 @@ void Ctr_ReceivePhoto (void)
void Ctr_ChangeCtrPhotoAttribution (void)
{
- char NewPhotoAttribution[Img_MAX_BYTES_ATTRIBUTION + 1];
+ char NewPhotoAttribution[Med_MAX_BYTES_ATTRIBUTION + 1];
/***** Get parameters from form *****/
/* Get the new photo attribution for the centre */
- Par_GetParToText ("Attribution",NewPhotoAttribution,Img_MAX_BYTES_ATTRIBUTION);
+ Par_GetParToText ("Attribution",NewPhotoAttribution,Med_MAX_BYTES_ATTRIBUTION);
/***** Update the table changing old attribution by new attribution *****/
DB_QueryUPDATE ("can not update the photo attribution"
diff --git a/swad_changelog.h b/swad_changelog.h
index 4bdf6f20..f6e42bcf 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -430,10 +430,48 @@ En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
-#define Log_PLATFORM_VERSION "SWAD 18.62 (2019-02-27)"
+#define Log_PLATFORM_VERSION "SWAD 18.63 (2019-03-02)"
#define CSS_FILE "swad18.61.css"
#define JS_FILE "swad18.62.js"
/*
+ Version 18.63: Mar 02, 2019 Allowing animated GIFs. Not finished. (238125 lines)
+ Rename the following directory:
+sudo mv /var/www/swad/img /var/www/swad/med
+
+ 28 changes necessary in database:
+ALTER TABLE forum_post CHANGE COLUMN ImageName MediaName VARCHAR(43) NOT NULL DEFAULT '';
+ALTER TABLE games CHANGE COLUMN ImageName MediaName VARCHAR(43) NOT NULL DEFAULT '';
+ALTER TABLE msg_content CHANGE COLUMN ImageName MediaName VARCHAR(43) NOT NULL DEFAULT '';
+ALTER TABLE msg_content_deleted CHANGE COLUMN ImageName MediaName VARCHAR(43) NOT NULL DEFAULT '';
+ALTER TABLE social_comments CHANGE COLUMN ImageName MediaName VARCHAR(43) NOT NULL DEFAULT '';
+ALTER TABLE social_posts CHANGE COLUMN ImageName MediaName VARCHAR(43) NOT NULL DEFAULT '';
+ALTER TABLE tst_answers CHANGE COLUMN ImageName MediaName VARCHAR(43) NOT NULL DEFAULT '';
+ALTER TABLE tst_questions CHANGE COLUMN ImageName MediaName VARCHAR(43) NOT NULL DEFAULT '';
+
+ALTER TABLE forum_post ADD COLUMN MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg' AFTER MediaName;
+ALTER TABLE msg_content ADD COLUMN MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg' AFTER MediaName;
+ALTER TABLE msg_content_deleted ADD COLUMN MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg' AFTER MediaName;
+ALTER TABLE social_comments ADD COLUMN MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg' AFTER MediaName;
+ALTER TABLE social_posts ADD COLUMN MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg' AFTER MediaName;
+ALTER TABLE tst_answers ADD COLUMN MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg' AFTER MediaName;
+ALTER TABLE tst_questions ADD COLUMN MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg' AFTER MediaName;
+
+ALTER TABLE forum_post CHANGE COLUMN ImageTitle MediaTitle VARCHAR(2047) NOT NULL DEFAULT '';
+ALTER TABLE msg_content CHANGE COLUMN ImageTitle MediaTitle VARCHAR(2047) NOT NULL DEFAULT '';
+ALTER TABLE msg_content_deleted CHANGE COLUMN ImageTitle MediaTitle VARCHAR(2047) NOT NULL DEFAULT '';
+ALTER TABLE social_comments CHANGE COLUMN ImageTitle MediaTitle VARCHAR(2047) NOT NULL DEFAULT '';
+ALTER TABLE social_posts CHANGE COLUMN ImageTitle MediaTitle VARCHAR(2047) NOT NULL DEFAULT '';
+ALTER TABLE tst_answers CHANGE COLUMN ImageTitle MediaTitle VARCHAR(2047) NOT NULL DEFAULT '';
+ALTER TABLE tst_questions CHANGE COLUMN ImageTitle MediaTitle VARCHAR(2047) NOT NULL DEFAULT '';
+
+ALTER TABLE forum_post CHANGE COLUMN ImageURL MediaURL VARCHAR(255) NOT NULL DEFAULT '';
+ALTER TABLE msg_content CHANGE COLUMN ImageURL MediaURL VARCHAR(255) NOT NULL DEFAULT '';
+ALTER TABLE msg_content_deleted CHANGE COLUMN ImageURL MediaURL VARCHAR(255) NOT NULL DEFAULT '';
+ALTER TABLE social_comments CHANGE COLUMN ImageURL MediaURL VARCHAR(255) NOT NULL DEFAULT '';
+ALTER TABLE social_posts CHANGE COLUMN ImageURL MediaURL VARCHAR(255) NOT NULL DEFAULT '';
+ALTER TABLE tst_answers CHANGE COLUMN ImageURL MediaURL VARCHAR(255) NOT NULL DEFAULT '';
+ALTER TABLE tst_questions CHANGE COLUMN ImageURL MediaURL VARCHAR(255) NOT NULL DEFAULT '';
+
Version 18.62: Feb 27, 2019 By default show only the last comments in a social publishing. (237901 lines)
Version 18.61: Feb 27, 2019 Hide/show comments in a social publishing. (237855 lines)
Version 18.60.5: Feb 26, 2019 Changes in CSS for responsive design in timeline. (237788 lines)
diff --git a/swad_config.h b/swad_config.h
index ff735f43..5822928e 100644
--- a/swad_config.h
+++ b/swad_config.h
@@ -363,8 +363,8 @@
/* Folder for compression of assignments and works into a zip files, inside private swad directory */
#define Cfg_FOLDER_ZIP "zip" // Created automatically the first time it is accessed
-/* Folders for images inside public and private swad directories */
-#define Cfg_FOLDER_IMG "img" // Created automatically the first time it is accessed
+/* Folders for images/videos inside public and private swad directories */
+#define Cfg_FOLDER_MEDIA "med" // Created automatically the first time it is accessed
/* Folders for temporary users' photos inside photos directories */
#define Cfg_FOLDER_IMG_TMP "tmp" // Created automatically the first time it is accessed
diff --git a/swad_country.c b/swad_country.c
index a457d56e..4a4e3997 100644
--- a/swad_country.c
+++ b/swad_country.c
@@ -1940,11 +1940,11 @@ void Cty_ChangeCtyWWW (void)
void Cty_ChangeCtyMapAttribution (void)
{
- char NewMapAttribution[Img_MAX_BYTES_ATTRIBUTION + 1];
+ char NewMapAttribution[Med_MAX_BYTES_ATTRIBUTION + 1];
/***** Get parameters from form *****/
/* Get the new map attribution for the country */
- Par_GetParToText ("Attribution",NewMapAttribution,Img_MAX_BYTES_ATTRIBUTION);
+ Par_GetParToText ("Attribution",NewMapAttribution,Med_MAX_BYTES_ATTRIBUTION);
/***** Update the table changing old attribution by new attribution *****/
DB_QueryUPDATE ("can not update the map attribution of a country",
diff --git a/swad_database.c b/swad_database.c
index ef7155cf..521c402a 100644
--- a/swad_database.c
+++ b/swad_database.c
@@ -442,7 +442,7 @@ mysql> DESCRIBE centres;
"ShortName VARCHAR(511) COLLATE latin1_spanish_ci NOT NULL," // Hie_MAX_BYTES_SHRT_NAME
"FullName VARCHAR(2047) COLLATE latin1_spanish_ci NOT NULL," // Hie_MAX_BYTES_FULL_NAME
"WWW VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW
- "PhotoAttribution TEXT NOT NULL," // Img_MAX_BYTES_ATTRIBUTION
+ "PhotoAttribution TEXT NOT NULL," // Med_MAX_BYTES_ATTRIBUTION
"UNIQUE INDEX(CtrCod),"
"INDEX(InsCod),"
"INDEX(PlcCod),"
@@ -588,7 +588,7 @@ mysql> DESCRIBE countries;
DB_CreateTable ("CREATE TABLE IF NOT EXISTS countries ("
"CtyCod INT NOT NULL,"
"Alpha2 CHAR(2) NOT NULL,"
- "MapAttribution TEXT NOT NULL," // Img_MAX_BYTES_ATTRIBUTION
+ "MapAttribution TEXT NOT NULL," // Med_MAX_BYTES_ATTRIBUTION
"Name_ca VARCHAR(767) NOT NULL," // Cty_MAX_BYTES_NAME
"Name_de VARCHAR(767) NOT NULL," // Cty_MAX_BYTES_NAME
"Name_en VARCHAR(767) NOT NULL," // Cty_MAX_BYTES_NAME
@@ -1207,22 +1207,23 @@ mysql> DESCRIBE forum_disabled_post;
/***** Table forum_post *****/
/*
mysql> DESCRIBE forum_post;
-+------------+---------------+------+-----+---------+----------------+
-| Field | Type | Null | Key | Default | Extra |
-+------------+---------------+------+-----+---------+----------------+
-| PstCod | int(11) | NO | PRI | NULL | auto_increment |
-| ThrCod | int(11) | NO | MUL | NULL | |
-| UsrCod | int(11) | NO | MUL | NULL | |
-| CreatTime | datetime | NO | MUL | NULL | |
-| ModifTime | datetime | NO | MUL | NULL | |
-| NumNotif | int(11) | NO | | 0 | |
-| Subject | text | NO | | NULL | |
-| Content | longtext | NO | | NULL | |
-| ImageName | varchar(43) | NO | | NULL | |
-| ImageTitle | varchar(2047) | NO | | NULL | |
-| ImageURL | varchar(255) | NO | | NULL | |
-+------------+---------------+------+-----+---------+----------------+
-11 rows in set (0,00 sec)
++------------+-------------------+------+-----+---------+----------------+
+| Field | Type | Null | Key | Default | Extra |
++------------+-------------------+------+-----+---------+----------------+
+| PstCod | int(11) | NO | PRI | NULL | auto_increment |
+| ThrCod | int(11) | NO | MUL | NULL | |
+| UsrCod | int(11) | NO | MUL | NULL | |
+| CreatTime | datetime | NO | MUL | NULL | |
+| ModifTime | datetime | NO | MUL | NULL | |
+| NumNotif | int(11) | NO | | 0 | |
+| Subject | text | NO | | NULL | |
+| Content | longtext | NO | | NULL | |
+| MediaName | varchar(43) | NO | | | |
+| MediaType | enum('jpg','gif') | NO | | jpg | |
+| MediaTitle | varchar(2047) | NO | | | |
+| MediaURL | varchar(255) | NO | | | |
++------------+-------------------+------+-----+---------+----------------+
+12 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS forum_post ("
"PstCod INT NOT NULL AUTO_INCREMENT,"
@@ -1231,11 +1232,12 @@ mysql> DESCRIBE forum_post;
"CreatTime DATETIME NOT NULL,"
"ModifTime DATETIME NOT NULL,"
"NumNotif INT NOT NULL DEFAULT 0,"
- "Subject TEXT NOT NULL," // Cns_MAX_BYTES_SUBJECT
- "Content LONGTEXT NOT NULL," // Cns_MAX_BYTES_LONG_TEXT
- "ImageName VARCHAR(43) NOT NULL," // Img_BYTES_NAME
- "ImageTitle VARCHAR(2047) NOT NULL," // Img_MAX_BYTES_TITLE
- "ImageURL VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW
+ "Subject TEXT NOT NULL," // Cns_MAX_BYTES_SUBJECT
+ "Content LONGTEXT NOT NULL," // Cns_MAX_BYTES_LONG_TEXT
+ "MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
+ "MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg',"
+ "MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
+ "MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"UNIQUE INDEX(PstCod),"
"INDEX(ThrCod),"
"INDEX(UsrCod),"
@@ -1731,50 +1733,54 @@ mysql> DESCRIBE msg_banned;
/***** Table msg_content *****/
/*
mysql> DESCRIBE msg_content;
-+------------+---------------+------+-----+---------+----------------+
-| Field | Type | Null | Key | Default | Extra |
-+------------+---------------+------+-----+---------+----------------+
-| MsgCod | int(11) | NO | PRI | NULL | auto_increment |
-| Subject | text | NO | MUL | NULL | |
-| Content | longtext | NO | | NULL | |
-| ImageName | varchar(43) | NO | | | |
-| ImageTitle | varchar(2047) | NO | | | |
-| ImageURL | varchar(255) | NO | | | |
-+------------+---------------+------+-----+---------+----------------+
-6 rows in set (0,00 sec)
++------------+-------------------+------+-----+---------+----------------+
+| Field | Type | Null | Key | Default | Extra |
++------------+-------------------+------+-----+---------+----------------+
+| MsgCod | int(11) | NO | PRI | NULL | auto_increment |
+| Subject | text | NO | MUL | NULL | |
+| Content | longtext | NO | | NULL | |
+| MediaName | varchar(43) | NO | | | |
+| MediaType | enum('jpg','gif') | NO | | jpg | |
+| MediaTitle | varchar(2047) | NO | | | |
+| MediaURL | varchar(255) | NO | | | |
++------------+-------------------+------+-----+---------+----------------+
+7 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS msg_content ("
"MsgCod INT NOT NULL AUTO_INCREMENT,"
"Subject TEXT NOT NULL,"
"Content LONGTEXT NOT NULL,"
- "ImageName VARCHAR(43) NOT NULL DEFAULT ''," // Img_BYTES_NAME
- "ImageTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Img_MAX_BYTES_TITLE
- "ImageURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
+ "MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
+ "MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg',"
+ "MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
+ "MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"UNIQUE INDEX(MsgCod),"
"FULLTEXT(Subject,Content)) ENGINE = MYISAM;");
/***** Table msg_content_deleted *****/
/*
mysql> DESCRIBE msg_content_deleted;
-+------------+---------------+------+-----+---------+-------+
-| Field | Type | Null | Key | Default | Extra |
-+------------+---------------+------+-----+---------+-------+
-| MsgCod | int(11) | NO | PRI | NULL | |
-| Subject | text | NO | MUL | NULL | |
-| Content | longtext | NO | | NULL | |
-| ImageName | varchar(43) | NO | | | |
-| ImageTitle | varchar(2047) | NO | | | |
-| ImageURL | varchar(255) | NO | | | |
-+------------+---------------+------+-----+---------+-------+
-6 rows in set (0,00 sec)
++------------+-------------------+------+-----+---------+-------+
+| Field | Type | Null | Key | Default | Extra |
++------------+-------------------+------+-----+---------+-------+
+| MsgCod | int(11) | NO | PRI | NULL | |
+| Subject | text | NO | MUL | NULL | |
+| Content | longtext | NO | | NULL | |
+| MediaName | varchar(43) | NO | | | |
+| MediaType | enum('jpg','gif') | NO | | jpg | |
+| MediaTitle | varchar(2047) | NO | | | |
+| MediaURL | varchar(255) | NO | | | |
++------------+-------------------+------+-----+---------+-------+
+7 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS msg_content_deleted ("
"MsgCod INT NOT NULL,"
"Subject TEXT NOT NULL,"
"Content LONGTEXT NOT NULL,"
- "ImageName VARCHAR(43) NOT NULL DEFAULT ''," // Img_BYTES_NAME
- "ImageTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Img_MAX_BYTES_TITLE
- "ImageURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
+ "MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
+ "MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg',"
+ "MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
+ "MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"UNIQUE INDEX(MsgCod),"
"FULLTEXT(Subject,Content)) ENGINE = MYISAM;");
@@ -2170,23 +2176,25 @@ mysql> DESCRIBE sessions;
/***** Table social_comments *****/
/*
mysql> DESCRIBE social_comments;
-+------------+---------------+------+-----+---------+-------+
-| Field | Type | Null | Key | Default | Extra |
-+------------+---------------+------+-----+---------+-------+
-| PubCod | bigint(20) | NO | PRI | NULL | |
-| Content | longtext | NO | MUL | NULL | |
-| ImageName | varchar(43) | NO | | NULL | |
-| ImageTitle | varchar(2047) | NO | | NULL | |
-| ImageURL | varchar(255) | NO | | NULL | |
-+------------+---------------+------+-----+---------+-------+
-5 rows in set (0,00 sec)
++------------+-------------------+------+-----+---------+-------+
+| Field | Type | Null | Key | Default | Extra |
++------------+-------------------+------+-----+---------+-------+
+| PubCod | bigint(20) | NO | PRI | NULL | |
+| Content | longtext | NO | MUL | NULL | |
+| MediaName | varchar(43) | NO | | | |
+| MediaType | enum('jpg','gif') | NO | | jpg | |
+| MediaTitle | varchar(2047) | NO | | | |
+| MediaURL | varchar(255) | NO | | | |
++------------+-------------------+------+-----+---------+-------+
+6 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS social_comments ("
"PubCod BIGINT NOT NULL,"
"Content LONGTEXT NOT NULL,"
- "ImageName VARCHAR(43) NOT NULL," // Img_BYTES_NAME
- "ImageTitle VARCHAR(2047) NOT NULL," // Img_MAX_BYTES_TITLE
- "ImageURL VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW
+ "MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
+ "MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg',"
+ "MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
+ "MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"UNIQUE INDEX(PubCod),"
"FULLTEXT(Content)) ENGINE = MYISAM;");
@@ -2266,23 +2274,25 @@ mysql> DESCRIBE social_notes_fav;
/***** Table social_posts *****/
/*
mysql> DESCRIBE social_posts;
-+------------+---------------+------+-----+---------+----------------+
-| Field | Type | Null | Key | Default | Extra |
-+------------+---------------+------+-----+---------+----------------+
-| PstCod | int(11) | NO | PRI | NULL | auto_increment |
-| Content | longtext | NO | MUL | NULL | |
-| ImageName | varchar(43) | NO | | NULL | |
-| ImageTitle | varchar(2047) | NO | | NULL | |
-| ImageURL | varchar(255) | NO | | NULL | |
-+------------+---------------+------+-----+---------+----------------+
-5 rows in set (0,00 sec)
++------------+-------------------+------+-----+---------+----------------+
+| Field | Type | Null | Key | Default | Extra |
++------------+-------------------+------+-----+---------+----------------+
+| PstCod | int(11) | NO | PRI | NULL | auto_increment |
+| Content | longtext | NO | MUL | NULL | |
+| MediaName | varchar(43) | NO | | | |
+| MediaType | enum('jpg','gif') | NO | | jpg | |
+| MediaTitle | varchar(2047) | NO | | | |
+| MediaURL | varchar(255) | NO | | | |
++------------+-------------------+------+-----+---------+----------------+
+6 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS social_posts ("
"PubCod INT NOT NULL AUTO_INCREMENT,"
"Content LONGTEXT NOT NULL,"
- "ImageName VARCHAR(43) NOT NULL," // Img_BYTES_NAME
- "ImageTitle VARCHAR(2047) NOT NULL," // Img_MAX_BYTES_TITLE
- "ImageURL VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW
+ "MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
+ "MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg',"
+ "MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
+ "MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"UNIQUE INDEX(PubCod),"
"FULLTEXT(Content)) ENGINE = MYISAM;");
@@ -2537,28 +2547,30 @@ mysql> DESCRIBE timetable_tut;
/***** Table tst_answers *****/
/*
mysql> DESCRIBE tst_answers;
-+------------+---------------+------+-----+---------+-------+
-| Field | Type | Null | Key | Default | Extra |
-+------------+---------------+------+-----+---------+-------+
-| QstCod | int(11) | NO | MUL | NULL | |
-| AnsInd | tinyint(4) | NO | | NULL | |
-| Answer | text | NO | | NULL | |
-| Feedback | text | NO | | NULL | |
-| ImageName | varchar(43) | NO | | NULL | |
-| ImageTitle | varchar(2047) | NO | | NULL | |
-| ImageURL | varchar(255) | NO | | NULL | |
-| Correct | enum('N','Y') | NO | | NULL | |
-+------------+---------------+------+-----+---------+-------+
-8 rows in set (0,00 sec)
++------------+-------------------+------+-----+---------+-------+
+| Field | Type | Null | Key | Default | Extra |
++------------+-------------------+------+-----+---------+-------+
+| QstCod | int(11) | NO | MUL | NULL | |
+| AnsInd | tinyint(4) | NO | | NULL | |
+| Answer | text | NO | | NULL | |
+| Feedback | text | NO | | NULL | |
+| MediaName | varchar(43) | NO | | | |
+| MediaType | enum('jpg','gif') | NO | | jpg | |
+| MediaTitle | varchar(2047) | NO | | | |
+| MediaURL | varchar(255) | NO | | | |
+| Correct | enum('N','Y') | NO | | NULL | |
++------------+-------------------+------+-----+---------+-------+
+9 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_answers ("
"QstCod INT NOT NULL,"
"AnsInd TINYINT NOT NULL,"
- "Answer TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK
- "Feedback TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK
- "ImageName VARCHAR(43) NOT NULL," // Img_BYTES_NAME
- "ImageTitle VARCHAR(2047) NOT NULL," // Img_MAX_BYTES_TITLE
- "ImageURL VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW
+ "Answer TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK
+ "Feedback TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK
+ "MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
+ "MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg',"
+ "MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
+ "MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"Correct ENUM('N','Y') NOT NULL,"
"INDEX(QstCod))");
@@ -2672,14 +2684,15 @@ mysql> DESCRIBE tst_questions;
| Shuffle | enum('N','Y') | NO | | NULL | |
| Stem | text | NO | | NULL | |
| Feedback | text | NO | | NULL | |
-| ImageName | varchar(43) | NO | | NULL | |
-| ImageTitle | varchar(2047) | NO | | NULL | |
-| ImageURL | varchar(255) | NO | | NULL | |
+| MediaName | varchar(43) | NO | | | |
+| MediaType | enum('jpg','gif') | NO | | jpg | |
+| MediaTitle | varchar(2047) | NO | | | |
+| MediaURL | varchar(255) | NO | | | |
| NumHits | int(11) | NO | | 0 | |
| NumHitsNotBlank | int(11) | NO | | 0 | |
| Score | double | NO | | 0 | |
+-----------------+---------------------------------------------------------------------------+------+-----+---------+----------------+
-13 rows in set (0,00 sec)
+14 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_questions ("
"QstCod INT NOT NULL AUTO_INCREMENT,"
@@ -2687,11 +2700,12 @@ mysql> DESCRIBE tst_questions;
"EditTime DATETIME NOT NULL,"
"AnsType ENUM ('int','float','true_false','unique_choice','multiple_choice','text') NOT NULL,"
"Shuffle ENUM('N','Y') NOT NULL,"
- "Stem TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
- "Feedback TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
- "ImageName VARCHAR(43) NOT NULL," // Img_BYTES_NAME
- "ImageTitle VARCHAR(2047) NOT NULL," // Img_MAX_BYTES_TITLE
- "ImageURL VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW
+ "Stem TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
+ "Feedback TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
+ "MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
+ "MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg',"
+ "MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
+ "MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"NumHits INT NOT NULL DEFAULT 0,"
"NumHitsNotBlank INT NOT NULL DEFAULT 0,"
"Score DOUBLE PRECISION NOT NULL DEFAULT 0,"
diff --git a/swad_file.c b/swad_file.c
index c2a1f5f9..cee718bf 100644
--- a/swad_file.c
+++ b/swad_file.c
@@ -273,7 +273,6 @@ struct Param *Fil_StartReceptionOfFile (const char *ParamFile,
bool Fil_EndReceptionOfFile (char *FileNameDataTmp,struct Param *Param)
{
- extern const char *Txt_UPLOAD_FILE_File_too_large_maximum_X_MiB_NO_HTML;
FILE *FileDataTmp;
unsigned char Bytes[NUM_BYTES_PER_CHUNK];
size_t RemainingBytesToCopy;
diff --git a/swad_forum.c b/swad_forum.c
index 45b83071..dc508d69 100644
--- a/swad_forum.c
+++ b/swad_forum.c
@@ -282,8 +282,8 @@ static void For_InsertPstIntoBannedPstTable (long PstCod);
static long For_InsertForumPst (long ThrCod,long UsrCod,
const char *Subject,const char *Content,
- struct Image *Image);
-static bool For_RemoveForumPst (long PstCod,struct Image *Image);
+ struct Media *Media);
+static bool For_RemoveForumPst (long PstCod,struct Media *Media);
static unsigned For_NumPstsInThrWithPstCod (long PstCod,long *ThrCod);
static long For_InsertForumThread (long FirstPstCod);
@@ -313,7 +313,7 @@ static void For_ShowAForumPost (unsigned PstNum,long PstCod,
static void For_GetPstData (long PstCod,long *UsrCod,time_t *CreatTimeUTC,
char Subject[Cns_MAX_BYTES_SUBJECT + 1],
char Content[Cns_MAX_BYTES_LONG_TEXT + 1],
- struct Image *Image);
+ struct Media *Media);
static void For_WriteNumberOfPosts (long UsrCod);
static void For_PutParamForumSet (For_ForumSet_t ForumSet);
@@ -496,30 +496,30 @@ static void For_InsertPstIntoBannedPstTable (long PstCod)
static long For_InsertForumPst (long ThrCod,long UsrCod,
const char *Subject,const char *Content,
- struct Image *Image)
+ struct Media *Media)
{
long PstCod;
/***** Check if image is received and processed *****/
- if (Image->Action == Img_ACTION_NEW_IMAGE && // Upload new image
- Image->Status == Img_FILE_PROCESSED) // The new image received has been processed
+ if (Media->Action == Med_ACTION_NEW_MEDIA && // Upload new image
+ Media->Status == Med_FILE_PROCESSED) // The new image received has been processed
/* Move processed image to definitive directory */
- Img_MoveImageToDefinitiveDirectory (Image);
+ Med_MoveMediaToDefinitiveDirectory (Media);
/***** Insert forum post in the database *****/
PstCod =
DB_QueryINSERTandReturnCode ("can not create a new post in a forum",
"INSERT INTO forum_post"
" (ThrCod,UsrCod,CreatTime,ModifTime,NumNotif,"
- "Subject,Content,ImageName,ImageTitle,ImageURL)"
+ "Subject,Content,MediaName,MediaTitle,MediaURL)"
" VALUES"
" (%ld,%ld,NOW(),NOW(),0,"
"'%s','%s','%s','%s','%s')",
ThrCod,UsrCod,
Subject,Content,
- Image->Name,
- Image->Title ? Image->Title : "",
- Image->URL ? Image->URL : "");
+ Media->Name,
+ Media->Title ? Media->Title : "",
+ Media->URL ? Media->URL : "");
return PstCod;
}
@@ -529,13 +529,13 @@ static long For_InsertForumPst (long ThrCod,long UsrCod,
/*****************************************************************************/
// Return true if the post thread is deleted
-static bool For_RemoveForumPst (long PstCod,struct Image *Image)
+static bool For_RemoveForumPst (long PstCod,struct Media *Media)
{
long ThrCod;
bool ThreadDeleted = false;
- /***** Remove image file attached to forum post *****/
- Img_RemoveImageFile (Image->Name);
+ /***** Remove media file attached to forum post *****/
+ Med_RemoveMediaFile (Media->Name,Media->Type);
/***** If the post is the only one in its thread, delete that thread *****/
if (For_NumPstsInThrWithPstCod (PstCod,&ThrCod) < 2)
@@ -1157,7 +1157,7 @@ static void For_ShowAForumPost (unsigned PstNum,long PstCod,
char OriginalContent[Cns_MAX_BYTES_LONG_TEXT + 1];
char Subject[Cns_MAX_BYTES_SUBJECT + 1];
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
- struct Image Image;
+ struct Media Media;
bool Enabled;
bool ItsMe;
@@ -1165,14 +1165,14 @@ static void For_ShowAForumPost (unsigned PstNum,long PstCod,
Usr_UsrDataConstructor (&UsrDat);
/***** Initialize image *****/
- Img_ImageConstructor (&Image);
+ Med_MediaConstructor (&Media);
/***** Check if post is enabled *****/
Enabled = For_GetIfPstIsEnabled (PstCod);
/***** Get data of post *****/
For_GetPstData (PstCod,&UsrDat.UsrCod,&CreatTimeUTC,
- Subject,OriginalContent,&Image);
+ Subject,OriginalContent,&Media);
if (Enabled)
/* Return this subject as last subject */
@@ -1308,7 +1308,7 @@ static void For_ShowAForumPost (unsigned PstNum,long PstCod,
Msg_WriteMsgContent (Content,Cns_MAX_BYTES_LONG_TEXT,true,false);
/***** Show image *****/
- Img_ShowImage (&Image,"FOR_IMG_CONTAINER","FOR_IMG");
+ Med_ShowMedia (&Media,"FOR_IMG_CONTAINER","FOR_IMG");
}
else
fprintf (Gbl.F.Out,"%s",Txt_This_post_has_been_banned_probably_for_not_satisfy_the_rules_of_the_forums);
@@ -1316,7 +1316,7 @@ static void For_ShowAForumPost (unsigned PstNum,long PstCod,
"");
/***** Free image *****/
- Img_ImageDestructor (&Image);
+ Med_MediaDestructor (&Media);
/***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&UsrDat);
@@ -1329,7 +1329,7 @@ static void For_ShowAForumPost (unsigned PstNum,long PstCod,
static void For_GetPstData (long PstCod,long *UsrCod,time_t *CreatTimeUTC,
char Subject[Cns_MAX_BYTES_SUBJECT + 1],
char Content[Cns_MAX_BYTES_LONG_TEXT + 1],
- struct Image *Image)
+ struct Media *Media)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
@@ -1337,8 +1337,14 @@ static void For_GetPstData (long PstCod,long *UsrCod,time_t *CreatTimeUTC,
/***** Get data of a post from database *****/
NumRows = DB_QuerySELECT (&mysql_res,"can not get data of a post",
- "SELECT UsrCod,UNIX_TIMESTAMP(CreatTime),"
- "Subject,Content,ImageName,ImageTitle,ImageURL"
+ "SELECT UsrCod," // row[0]
+ "UNIX_TIMESTAMP(CreatTime)," // row[1]
+ "Subject," // row[2]
+ "Content," // row[3]
+ "MediaName," // row[4]
+ "MediaType," // row[5]
+ "MediaTitle," // row[6]
+ "MediaURL" // row[7]
" FROM forum_post WHERE PstCod=%ld",
PstCod);
@@ -1363,8 +1369,9 @@ static void For_GetPstData (long PstCod,long *UsrCod,time_t *CreatTimeUTC,
Str_Copy (Content,row[3],
Cns_MAX_BYTES_LONG_TEXT);
- /****** Get image name (row[4]), title (row[5]) and URL (row[6]) *****/
- Img_GetImageNameTitleAndURLFromRow (row[4],row[5],row[6],Image);
+ /****** Get media name (row[4]), type (row[5]),
+ title (row[6]) and URL (row[7]) *****/
+ Med_GetMediaNameTitleAndURLFromRow (row[4],row[5],row[6],row[7],Media);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
@@ -3999,7 +4006,7 @@ static void For_WriteFormForumPst (bool IsReply,const char *Subject)
Lay_HelpPlainEditor ();
/***** Attached image (optional) *****/
- Img_PutImageUploader (-1,"FOR_IMG_TIT_URL");
+ Med_PutMediaUploader (-1,"FOR_IMG_TIT_URL");
/***** Send button *****/
Btn_PutCreateButton (Txt_Send);
@@ -4023,7 +4030,7 @@ void For_ReceiveForumPost (void)
unsigned NumUsrsToBeNotifiedByEMail;
struct SocialPublishing SocPub;
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
- struct Image Image;
+ struct Media Media;
/***** Get parameters related to forum *****/
For_GetParamsForum ();
@@ -4045,13 +4052,13 @@ void For_ReceiveForumPost (void)
Str_TO_RIGOROUS_HTML,false);
/***** Initialize image *****/
- Img_ImageConstructor (&Image);
+ Med_MediaConstructor (&Media);
/***** Get attached image (action, file and title) *****/
- Image.Width = For_IMAGE_SAVED_MAX_WIDTH;
- Image.Height = For_IMAGE_SAVED_MAX_HEIGHT;
- Image.Quality = For_IMAGE_SAVED_QUALITY;
- Img_GetImageFromForm (-1,&Image,NULL);
+ Media.Width = For_IMAGE_SAVED_MAX_WIDTH;
+ Media.Height = For_IMAGE_SAVED_MAX_HEIGHT;
+ Media.Quality = For_IMAGE_SAVED_QUALITY;
+ Med_GetMediaFromForm (-1,&Media,NULL);
/***** Create a new message *****/
if (IsReply) // This post is a reply to another posts in the thread
@@ -4060,7 +4067,7 @@ void For_ReceiveForumPost (void)
/***** Create last message of the thread *****/
PstCod = For_InsertForumPst (Gbl.Forum.ForumSelected.ThrCod,Gbl.Usrs.Me.UsrDat.UsrCod,
- Gbl.Msg.Subject,Content,&Image);
+ Gbl.Msg.Subject,Content,&Media);
/***** Modify last message of the thread *****/
For_UpdateThrLastPst (Gbl.Forum.ForumSelected.ThrCod,PstCod);
@@ -4072,14 +4079,14 @@ void For_ReceiveForumPost (void)
/***** Create first (and last) message of the thread *****/
PstCod = For_InsertForumPst (Gbl.Forum.ForumSelected.ThrCod,Gbl.Usrs.Me.UsrDat.UsrCod,
- Gbl.Msg.Subject,Content,&Image);
+ Gbl.Msg.Subject,Content,&Media);
/***** Update first and last posts of new thread *****/
For_UpdateThrFirstAndLastPst (Gbl.Forum.ForumSelected.ThrCod,PstCod,PstCod);
}
/***** Free image *****/
- Img_ImageDestructor (&Image);
+ Med_MediaDestructor (&Media);
/***** Increment number of forum posts in my user's figures *****/
Prf_IncrementNumForPstUsr (Gbl.Usrs.Me.UsrDat.UsrCod);
@@ -4148,7 +4155,7 @@ void For_RemovePost (void)
time_t CreatTimeUTC; // Creation time of a message
char Subject[Cns_MAX_BYTES_SUBJECT + 1];
char OriginalContent[Cns_MAX_BYTES_LONG_TEXT + 1];
- struct Image Image;
+ struct Media Media;
bool ItsMe;
bool ThreadDeleted = false;
@@ -4156,11 +4163,11 @@ void For_RemovePost (void)
For_GetParamsForum ();
/***** Initialize image *****/
- Img_ImageConstructor (&Image);
+ Med_MediaConstructor (&Media);
/***** Get forum post data *****/
For_GetPstData (Gbl.Forum.ForumSelected.PstCod,&UsrDat.UsrCod,&CreatTimeUTC,
- Subject,OriginalContent,&Image);
+ Subject,OriginalContent,&Media);
/***** Check if I can remove the post *****/
/* Check if the message really exists, if it has not been removed */
@@ -4177,10 +4184,10 @@ void For_RemovePost (void)
Lay_ShowErrorAndExit ("You can not remove post because it is not the last of the thread.");
/***** Remove the post *****/
- ThreadDeleted = For_RemoveForumPst (Gbl.Forum.ForumSelected.PstCod,&Image);
+ ThreadDeleted = For_RemoveForumPst (Gbl.Forum.ForumSelected.PstCod,&Media);
/***** Free image *****/
- Img_ImageDestructor (&Image);
+ Med_MediaDestructor (&Media);
/***** Mark possible notifications as removed *****/
Ntf_MarkNotifAsRemoved (Ntf_EVENT_FORUM_POST_COURSE,Gbl.Forum.ForumSelected.PstCod);
diff --git a/swad_game.c b/swad_game.c
index 0fdd669d..b628a6db 100644
--- a/swad_game.c
+++ b/swad_game.c
@@ -2729,23 +2729,15 @@ static void Gam_ListGameQuestions (struct Game *Game)
ActionToDoWithQuestions = Tst_SHOW_GAME_RESULT;
/***** Get data of questions from database *****/
- /*
- row[0] QstCod
- row[1] AnsType
- row[2] Stem
- row[3] Feedback
- row[4] ImageName
- row[5] ImageTitle
- row[6] ImageURL
- */
NumQsts = (unsigned) DB_QuerySELECT (&mysql_res,"can not get data of a question",
- "SELECT tst_questions.QstCod,"
- "tst_questions.AnsType,"
- "tst_questions.Stem,"
- "tst_questions.Feedback,"
- "tst_questions.ImageName,"
- "tst_questions.ImageTitle,"
- "tst_questions.ImageURL"
+ "SELECT tst_questions.QstCod," // row[0]
+ "tst_questions.AnsType," // row[1]
+ "tst_questions.Stem," // row[2]
+ "tst_questions.Feedback," // row[3]
+ "tst_questions.MediaName," // row[4]
+ "tst_questions.MediaType," // row[5]
+ "tst_questions.MediaTitle," // row[6]
+ "tst_questions.MediaURL" // row[7]
" FROM gam_questions,tst_questions"
" WHERE gam_questions.GamCod=%ld"
" AND gam_questions.QstCod=tst_questions.QstCod"
@@ -2850,9 +2842,10 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Game *Game,
row[1] AnsType
row[2] Stem
row[3] Feedback
- row[4] ImageName
- row[5] ImageTitle
- row[6] ImageURL
+ row[4] MediaName
+ row[5] MediaType
+ row[6] MediaTitle
+ row[7] MediaURL
*/
/***** Create test question *****/
Tst_QstConstructor ();
@@ -2930,13 +2923,14 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Game *Game,
Tst_GetAndWriteTagsQst (Gbl.Test.QstCod);
fprintf (Gbl.F.Out,"");
- /* Write the stem (row[2]), the image (row[4], row[5], row[6]),
+ /* Write the stem (row[2]), the image (row[4], row[5], row[6], row[7]),
the feedback (row[3]) and the answers */
fprintf (Gbl.F.Out,"
",
Gbl.RowEvenOdd);
Tst_WriteQstStem (row[2],"TEST_EDI");
- Img_GetImageNameTitleAndURLFromRow (row[4],row[5],row[6],&Gbl.Test.Image);
- Img_ShowImage (&Gbl.Test.Image,
+ Med_GetMediaNameTitleAndURLFromRow (row[4],row[5],row[6],row[7],
+ &Gbl.Test.Media);
+ Med_ShowMedia (&Gbl.Test.Media,
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
"TEST_IMG_EDIT_LIST_STEM");
Tst_WriteQstFeedback (row[3],"TEST_EDI_LIGHT");
@@ -3534,22 +3528,14 @@ static void Gam_PlayGameShowQuestionAndAnswers (bool ShowAnswers)
QstInd = Gam_GetParamQstInd ();
/***** Get data of question from database *****/
- /*
- row[0] AnsType
- row[1] QstCod
- row[2] Stem
- row[3] ImageName
- row[4] ImageTitle
- row[5] ImageURL
- */
if (!DB_QuerySELECT (&mysql_res,"can not get data of a question",
- "SELECT "
- "tst_questions.QstCod,"
- "tst_questions.AnsType,"
- "tst_questions.Stem,"
- "tst_questions.ImageName,"
- "tst_questions.ImageTitle,"
- "tst_questions.ImageURL"
+ "SELECT tst_questions.QstCod," // row[0]
+ "tst_questions.AnsType," // row[1]
+ "tst_questions.Stem," // row[2]
+ "tst_questions.MediaName," // row[3]
+ "tst_questions.MediaType," // row[4]
+ "tst_questions.MediaTitle," // row[5]
+ "tst_questions.MediaURL" // row[6]
" FROM gam_questions,tst_questions"
" WHERE gam_questions.GamCod=%ld"
" AND gam_questions.QstInd=%u"
@@ -3568,10 +3554,11 @@ static void Gam_PlayGameShowQuestionAndAnswers (bool ShowAnswers)
fprintf (Gbl.F.Out,"");
- /* Write the stem (row[2]) and the image (row[3], row[4], row[5]) */
+ /* Write the stem (row[2]) and the image (row[3], row[4], row[5], row[6]) */
Tst_WriteQstStem (row[2],"GAM_PLAY_QST");
- Img_GetImageNameTitleAndURLFromRow (row[3],row[4],row[5],&Gbl.Test.Image);
- Img_ShowImage (&Gbl.Test.Image,
+ Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6],
+ &Gbl.Test.Media);
+ Med_ShowMedia (&Gbl.Test.Media,
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
"TEST_IMG_EDIT_LIST_STEM");
diff --git a/swad_global.h b/swad_global.h
index 27a7f2ee..b5a46d23 100644
--- a/swad_global.h
+++ b/swad_global.h
@@ -54,7 +54,6 @@
#include "swad_forum.h"
#include "swad_game.h"
#include "swad_holiday.h"
-#include "swad_image.h"
#include "swad_icon.h"
#include "swad_indicator.h"
#include "swad_institution.h"
@@ -62,8 +61,9 @@
#include "swad_link.h"
#include "swad_mail.h"
#include "swad_mark.h"
-#include "swad_message.h"
+#include "swad_media.h"
#include "swad_menu.h"
+#include "swad_message.h"
#include "swad_parameter.h"
#include "swad_password.h"
#include "swad_photo.h"
@@ -702,7 +702,7 @@ struct Globals
char *Text;
size_t Length;
} Stem, Feedback;
- struct Image Image;
+ struct Media Media;
bool Shuffle;
struct
{
@@ -713,7 +713,7 @@ struct Globals
bool Correct;
char *Text;
char *Feedback;
- struct Image Image;
+ struct Media Media;
} Options[Tst_MAX_OPTIONS_PER_QUESTION];
long Integer;
double FloatingPoint[2];
diff --git a/swad_image.c b/swad_image.c
deleted file mode 100644
index 61eec034..00000000
--- a/swad_image.c
+++ /dev/null
@@ -1,673 +0,0 @@
-// swad_image.c: processing of image uploaded in a form
-
-/*
- SWAD (Shared Workspace At a Distance),
- is a web platform developed at the University of Granada (Spain),
- and used to support university teaching.
-
- This file is part of SWAD core.
- Copyright (C) 1999-2019 Antonio Caņas Vargas
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General 3 License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This program 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 Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see
.
-*/
-/*****************************************************************************/
-/*********************************** Headers *********************************/
-/*****************************************************************************/
-
-#include
// For PATH_MAX
-#include // For boolean type
-#include // For exit, system, malloc, free, etc
-#include // For string functions
-#include // For the macro WEXITSTATUS
-#include // For unlink
-
-#include "swad_config.h"
-#include "swad_global.h"
-#include "swad_file.h"
-#include "swad_file_browser.h"
-#include "swad_form.h"
-#include "swad_image.h"
-
-/*****************************************************************************/
-/****************************** Public constants *****************************/
-/*****************************************************************************/
-
-/*****************************************************************************/
-/***************************** Internal constants ****************************/
-/*****************************************************************************/
-
-/*****************************************************************************/
-/****************************** Internal types *******************************/
-/*****************************************************************************/
-
-/*****************************************************************************/
-/************** External global variables from others modules ****************/
-/*****************************************************************************/
-
-extern struct Globals Gbl;
-
-/*****************************************************************************/
-/************************* Internal global variables *************************/
-/*****************************************************************************/
-
-/*****************************************************************************/
-/***************************** Internal prototypes ***************************/
-/*****************************************************************************/
-
-static Img_Action_t Img_GetImageActionFromForm (const char *ParamAction);
-static void Img_GetAndProcessImageFileFromForm (struct Image *Image,
- const char *ParamFile);
-
-static int Img_ProcessImage (struct Image *Image,
- const char *FileNameImgOriginal,
- const char *FileNameImgProcessed);
-
-/*****************************************************************************/
-/*************************** Reset image fields ******************************/
-/*****************************************************************************/
-// Every struct Image must be initialized with this function Img_ImageConstructor after it is declared
-// Every call to Img_ImageConstructor must have a call to Img_ImageDestructor
-
-void Img_ImageConstructor (struct Image *Image)
- {
- Img_ResetImageExceptTitleAndURL (Image);
- Image->Title = NULL;
- Image->URL = NULL;
- }
-
-/*****************************************************************************/
-/***************** Reset image fields except title and URL *******************/
-/*****************************************************************************/
-
-void Img_ResetImageExceptTitleAndURL (struct Image *Image)
- {
- Image->Action = Img_ACTION_NO_IMAGE;
- Image->Status = Img_FILE_NONE;
- Image->Name[0] = '\0';
- }
-
-/*****************************************************************************/
-/******************************** Free image *********************************/
-/*****************************************************************************/
-// Every call to Img_ImageConstructor must have a call to Img_ImageDestructor
-
-void Img_ImageDestructor (struct Image *Image)
- {
- Img_FreeImageTitle (Image);
- Img_FreeImageURL (Image);
- }
-
-/*****************************************************************************/
-/****************************** Free image title *****************************/
-/*****************************************************************************/
-
-void Img_FreeImageTitle (struct Image *Image)
- {
- // Image->Title must be initialized to NULL after declaration
- if (Image->Title)
- {
- free ((void *) Image->Title);
- Image->Title = NULL;
- }
- }
-
-/*****************************************************************************/
-/******************************* Free image URL ******************************/
-/*****************************************************************************/
-
-void Img_FreeImageURL (struct Image *Image)
- {
- // Image->URL must be initialized to NULL after declaration
- if (Image->URL)
- {
- free ((void *) Image->URL);
- Image->URL = NULL;
- }
- }
-
-/*****************************************************************************/
-/**** Get image name, title and URL from a query result and copy to struct ***/
-/*****************************************************************************/
-
-void Img_GetImageNameTitleAndURLFromRow (const char *Name,
- const char *Title,
- const char *URL,
- struct Image *Image)
- {
- size_t Length;
-
- /***** Copy image name to struct *****/
- Str_Copy (Image->Name,Name,
- Img_BYTES_NAME);
-
- /***** Set status of image file *****/
- Image->Status = Image->Name[0] ? Img_NAME_STORED_IN_DB :
- Img_FILE_NONE;
-
-
- /***** Copy image title to struct *****/
- // Image->Title can be empty or filled with previous value
- // If filled ==> free it
- Img_FreeImageTitle (Image);
- if (Title[0])
- {
- /* Get and limit length of the title */
- Length = strlen (Title);
- if (Length > Img_MAX_BYTES_TITLE)
- Length = Img_MAX_BYTES_TITLE;
-
- if ((Image->Title = (char *) malloc (Length + 1)) == NULL)
- Lay_ShowErrorAndExit ("Error allocating memory for image title.");
- Str_Copy (Image->Title,Title,
- Length);
- }
-
- /***** Copy image URL to struct *****/
- // Image->URL can be empty or filled with previous value
- // If filled ==> free it
- Img_FreeImageURL (Image);
- if (URL[0])
- {
- /* Get and limit length of the URL */
- Length = strlen (URL);
- if (Length > Img_MAX_BYTES_TITLE)
- Length = Img_MAX_BYTES_TITLE;
-
- if ((Image->URL = (char *) malloc (Length + 1)) == NULL)
- Lay_ShowErrorAndExit ("Error allocating memory for image URL.");
- Str_Copy (Image->URL,URL,
- Length);
- }
- }
-
-/*****************************************************************************/
-/************ Draw input fields to upload an image inside a form *************/
-/*****************************************************************************/
-
-void Img_PutImageUploader (int NumImgInForm,const char *ClassImgTitURL)
- {
- extern const char *Txt_Image;
- extern const char *Txt_optional;
- extern const char *Txt_Image_title_attribution;
- extern const char *Txt_Link;
- struct ParamUploadImg ParamUploadImg;
- char Id[Frm_MAX_BYTES_ID + 1];
-
- /***** Set names of parameters depending on number of image in form *****/
- Img_SetParamNames (&ParamUploadImg,NumImgInForm);
-
- /***** Create unique id for this image uploader *****/
- Frm_SetUniqueId (Id);
-
- /***** Start container *****/
- fprintf (Gbl.F.Out,"");
-
- /***** Action to perform on image *****/
- Par_PutHiddenParamUnsigned (ParamUploadImg.Action,(unsigned) Img_ACTION_NEW_IMAGE);
-
- /***** Image file *****/
- fprintf (Gbl.F.Out,"
"
- " "
- " "
- " "
- ""
- " ",
- Gbl.Prefs.URLIcons,
- Txt_Image,Txt_Image,Txt_optional,
- ParamUploadImg.File,
- Id,Id);
-
- /***** Image title/attribution and URL *****/
- fprintf (Gbl.F.Out,"
",
- Id);
- fprintf (Gbl.F.Out," ",
- ParamUploadImg.Title,
- Txt_Image_title_attribution,Txt_optional,
- ClassImgTitURL,Img_MAX_CHARS_TITLE);
- fprintf (Gbl.F.Out," "
- " ",
- ParamUploadImg.URL,
- Txt_Link,Txt_optional,
- ClassImgTitURL,Cns_MAX_CHARS_WWW);
- fprintf (Gbl.F.Out,"
");
-
- /***** End container *****/
- fprintf (Gbl.F.Out,"
");
- }
-
-/*****************************************************************************/
-/***************************** Get image from form ***************************/
-/*****************************************************************************/
-// If NumImgInForm < 0, params have no suffix
-// If NumImgInForm >= 0, the number is a suffix of the params
-
-void Img_GetImageFromForm (int NumImgInForm,struct Image *Image,
- void (*GetImageFromDB) (int NumImgInForm,struct Image *Image))
- {
- struct ParamUploadImg ParamUploadImg;
- char Title[Img_MAX_BYTES_TITLE + 1];
- char URL[Cns_MAX_BYTES_WWW + 1];
- size_t Length;
-
- /***** Set names of parameters depending on number of image in form *****/
- Img_SetParamNames (&ParamUploadImg,NumImgInForm);
-
- /***** First, get action and initialize image
- (except title, that will be get after the image file) *****/
- Image->Action = Img_GetImageActionFromForm (ParamUploadImg.Action);
- Image->Status = Img_FILE_NONE;
- Image->Name[0] = '\0';
-
- /***** Secondly, get the image name and the file *****/
- switch (Image->Action)
- {
- case Img_ACTION_NEW_IMAGE: // Upload new image
- /***** Get new image (if present ==> process and create temporary file) *****/
- Img_GetAndProcessImageFileFromForm (Image,ParamUploadImg.File);
- switch (Image->Status)
- {
- case Img_FILE_NONE: // No new image received
- Image->Action = Img_ACTION_NO_IMAGE;
- Image->Name[0] = '\0';
- break;
- case Img_FILE_RECEIVED: // New image received, but not processed
- Image->Status = Img_FILE_NONE;
- Image->Name[0] = '\0';
- break;
- default:
- break;
- }
- break;
- case Img_ACTION_KEEP_IMAGE: // Keep current image unchanged
- /***** Get image name *****/
- if (GetImageFromDB != NULL)
- GetImageFromDB (NumImgInForm,Image);
- break;
- case Img_ACTION_CHANGE_IMAGE: // Replace old image by new image
- /***** Get new image (if present ==> process and create temporary file) *****/
- Img_GetAndProcessImageFileFromForm (Image,ParamUploadImg.File);
- if (Image->Status != Img_FILE_PROCESSED && // No new image received-processed successfully
- GetImageFromDB != NULL)
- /* Get image name */
- GetImageFromDB (NumImgInForm,Image);
- break;
- case Img_ACTION_NO_IMAGE: // Do not use image (remove current image if exists)
- break;
- }
-
- /***** Third, get image title from form *****/
- Par_GetParToText (ParamUploadImg.Title,Title,Img_MAX_BYTES_TITLE);
- /* If the title coming from the form is empty, keep current image title unchanged
- If not empty, copy it to current image title */
- if ((Length = strlen (Title)) > 0)
- {
- /* Overwrite current title (empty or coming from database)
- with the title coming from the form */
- Img_FreeImageTitle (Image);
- if ((Image->Title = (char *) malloc (Length + 1)) == NULL)
- Lay_ShowErrorAndExit ("Error allocating memory for image title.");
- Str_Copy (Image->Title,Title,
- Length);
- }
-
- /***** By last, get image URL from form *****/
- Par_GetParToText (ParamUploadImg.URL,URL,Cns_MAX_BYTES_WWW);
- /* If the URL coming from the form is empty, keep current image URL unchanged
- If not empty, copy it to current image URL */
- if ((Length = strlen (URL)) > 0)
- {
- /* Overwrite current URL (empty or coming from database)
- with the URL coming from the form */
- Img_FreeImageURL (Image);
- if ((Image->URL = (char *) malloc (Length + 1)) == NULL)
- Lay_ShowErrorAndExit ("Error allocating memory for image URL.");
- Str_Copy (Image->URL,URL,
- Length);
- }
- }
-
-/*****************************************************************************/
-/********* Set parameters names depending on number of image in form *********/
-/*****************************************************************************/
-// If NumImgInForm < 0, params have no suffix
-// If NumImgInForm >= 0, the number is a suffix of the params
-
-void Img_SetParamNames (struct ParamUploadImg *ParamUploadImg,int NumImgInForm)
- {
- if (NumImgInForm < 0) // One unique image in form ==> no suffix needed
- {
- Str_Copy (ParamUploadImg->Action,"ImgAct",
- Img_MAX_BYTES_PARAM_UPLOAD_IMG);
- Str_Copy (ParamUploadImg->File ,"ImgFil",
- Img_MAX_BYTES_PARAM_UPLOAD_IMG);
- Str_Copy (ParamUploadImg->Title ,"ImgTit",
- Img_MAX_BYTES_PARAM_UPLOAD_IMG);
- Str_Copy (ParamUploadImg->URL ,"ImgURL",
- Img_MAX_BYTES_PARAM_UPLOAD_IMG);
- }
- else // Several images in form ==> add suffix
- {
- snprintf (ParamUploadImg->Action,sizeof (ParamUploadImg->Action),
- "ImgAct%u",
- NumImgInForm);
- snprintf (ParamUploadImg->File ,sizeof (ParamUploadImg->File),
- "ImgFil%u",
- NumImgInForm);
- snprintf (ParamUploadImg->Title ,sizeof (ParamUploadImg->Title),
- "ImgTit%u",
- NumImgInForm);
- snprintf (ParamUploadImg->URL ,sizeof (ParamUploadImg->URL),
- "ImgURL%u",
- NumImgInForm);
- }
- }
-
-/*****************************************************************************/
-/************************* Get image action from form ************************/
-/*****************************************************************************/
-
-static Img_Action_t Img_GetImageActionFromForm (const char *ParamAction)
- {
- /***** Get parameter with the action to perform on image *****/
- return (Img_Action_t)
- Par_GetParToUnsignedLong (ParamAction,
- 0,
- Img_NUM_ACTIONS - 1,
- (unsigned long) Img_ACTION_DEFAULT);
- }
-
-/*****************************************************************************/
-/**************************** Get image from form ****************************/
-/*****************************************************************************/
-
-static void Img_GetAndProcessImageFileFromForm (struct Image *Image,
- const char *ParamFile)
- {
- extern const char *Txt_The_image_could_not_be_processed_successfully;
- struct Param *Param;
- char FileNameImgSrc[PATH_MAX + 1];
- char *PtrExtension;
- size_t LengthExtension;
- char MIMEType[Brw_MAX_BYTES_MIME_TYPE + 1];
- char PathImgPriv[PATH_MAX + 1];
- char FileNameImgOrig[PATH_MAX + 1]; // Full name of original uploaded file
- char FileNameImgTmp[PATH_MAX + 1]; // Full name of temporary processed file
- bool WrongType = false;
-
- /***** Set image file status *****/
- Image->Status = Img_FILE_NONE;
-
- /***** Get filename and MIME type *****/
- Param = Fil_StartReceptionOfFile (ParamFile,FileNameImgSrc,MIMEType);
- if (!FileNameImgSrc[0]) // No file present
- return;
-
- /* Get filename extension */
- if ((PtrExtension = strrchr (FileNameImgSrc,(int) '.')) == NULL)
- return;
- // PtrExtension now points to last '.' in file
-
- PtrExtension++;
- // PtrExtension now points to first char in extension
-
- LengthExtension = strlen (PtrExtension);
- if (LengthExtension < Fil_MIN_BYTES_FILE_EXTENSION ||
- LengthExtension > Fil_MAX_BYTES_FILE_EXTENSION)
- return;
-
- /* Check if the file type is image/ or application/octet-stream */
- if (strncmp (MIMEType,"image/",strlen ("image/")))
- if (strcmp (MIMEType,"application/octet-stream"))
- if (strcmp (MIMEType,"application/octetstream"))
- if (strcmp (MIMEType,"application/octet"))
- WrongType = true;
- if (WrongType)
- return;
-
- /***** Assign a unique name for the image *****/
- Cry_CreateUniqueNameEncrypted (Image->Name);
-
- /***** Create private directories if not exist *****/
- /* Create private directory for images if it does not exist */
- snprintf (PathImgPriv,sizeof (PathImgPriv),
- "%s/%s",
- Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG);
- Fil_CreateDirIfNotExists (PathImgPriv);
-
- /* Create temporary private directory for images if it does not exist */
- snprintf (PathImgPriv,sizeof (PathImgPriv),
- "%s/%s/%s",
- Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG,Cfg_FOLDER_IMG_TMP);
- Fil_CreateDirIfNotExists (PathImgPriv);
-
- /***** Remove old temporary private files *****/
- Fil_RemoveOldTmpFiles (PathImgPriv,Cfg_TIME_TO_DELETE_IMAGES_TMP_FILES,false);
-
- /***** End the reception of original not processed image
- (it may be very big) into a temporary file *****/
- Image->Status = Img_FILE_NONE;
- snprintf (FileNameImgOrig,sizeof (FileNameImgOrig),
- "%s/%s/%s/%s_original.%s",
- Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG,Cfg_FOLDER_IMG_TMP,
- Image->Name,PtrExtension);
- if (Fil_EndReceptionOfFile (FileNameImgOrig,Param)) // Success
- {
- Image->Status = Img_FILE_RECEIVED;
-
- /***** Convert original image to temporary JPEG processed file
- by calling to program that makes the conversion *****/
- snprintf (FileNameImgTmp,sizeof (FileNameImgTmp),
- "%s/%s/%s/%s.jpg",
- Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG,Cfg_FOLDER_IMG_TMP,
- Image->Name);
- if (Img_ProcessImage (Image,FileNameImgOrig,FileNameImgTmp) == 0) // Return 0 on success
- /* Success */
- Image->Status = Img_FILE_PROCESSED;
- else // Error processing image
- {
- /* Error ==> remove temporary destination image file */
- if (Fil_CheckIfPathExists (FileNameImgTmp))
- unlink (FileNameImgTmp);
-
- /* Show error alert */
- Ale_ShowAlert (Ale_ERROR,Txt_The_image_could_not_be_processed_successfully);
- }
-
- /***** Remove temporary original file *****/
- unlink (FileNameImgOrig);
- }
- }
-
-/*****************************************************************************/
-/************ Process original image generating processed image **************/
-/*****************************************************************************/
-// Return 0 on success
-// Return != 0 on error
-
-static int Img_ProcessImage (struct Image *Image,
- const char *FileNameImgOriginal,
- const char *FileNameImgProcessed)
- {
- char Command[1024 + PATH_MAX * 2];
- int ReturnCode;
- // char ErrorMsg[256];
-
- snprintf (Command,sizeof (Command),
- "convert %s -resize '%ux%u>' -quality %u %s",
- FileNameImgOriginal,
- Image->Width,
- Image->Height,
- Image->Quality,
- FileNameImgProcessed);
- ReturnCode = system (Command);
- if (ReturnCode == -1)
- Lay_ShowErrorAndExit ("Error when running command to process image.");
-
- ReturnCode = WEXITSTATUS(ReturnCode);
-
- return ReturnCode;
- }
-
-/*****************************************************************************/
-/**** Move temporary processed image file to definitive private directory ****/
-/*****************************************************************************/
-
-void Img_MoveImageToDefinitiveDirectory (struct Image *Image)
- {
- char PathImgPriv[PATH_MAX + 1];
- char FileNameImgTmp[PATH_MAX + 1]; // Full name of temporary processed file
- char FileNameImg[PATH_MAX + 1]; // Full name of definitive processed file
-
- /***** Create subdirectory if it does not exist *****/
- snprintf (PathImgPriv,sizeof (PathImgPriv),
- "%s/%s/%c%c",
- Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG,
- Image->Name[0],
- Image->Name[1]);
- Fil_CreateDirIfNotExists (PathImgPriv);
-
- /***** Temporary processed file *****/
- snprintf (FileNameImgTmp,sizeof (FileNameImgTmp),
- "%s/%s/%s/%s.jpg",
- Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG,Cfg_FOLDER_IMG_TMP,
- Image->Name);
-
- /***** Definitive processed file *****/
- snprintf (FileNameImg,sizeof (FileNameImg),
- "%s/%s/%c%c/%s.jpg",
- Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG,
- Image->Name[0],
- Image->Name[1],
- Image->Name);
-
- /***** Move file *****/
- if (rename (FileNameImgTmp,FileNameImg)) // Fail
- Ale_ShowAlert (Ale_ERROR,"Can not move file.");
- else // Success
- Image->Status = Img_FILE_MOVED;
- }
-
-/*****************************************************************************/
-/****** Show a user uploaded image (in a test question, timeline, etc.) ******/
-/*****************************************************************************/
-
-void Img_ShowImage (struct Image *Image,
- const char *ClassContainer,const char *ClassImg)
- {
- extern const char *Txt_Image_not_found;
- char FileNameImgPriv[PATH_MAX + 1];
- char FullPathImgPriv[PATH_MAX + 1];
- char URL[PATH_MAX + 1];
- bool PutLink;
-
- /***** If no image to show ==> nothing to do *****/
- if (!Image->Name)
- return;
- if (!Image->Name[0])
- return;
- if (Image->Status != Img_NAME_STORED_IN_DB)
- return;
-
- /***** Create a temporary public directory used to show the image *****/
- Brw_CreateDirDownloadTmp ();
-
- /***** Build private path to image *****/
- snprintf (FileNameImgPriv,sizeof (FileNameImgPriv),
- "%s.jpg",
- Image->Name);
- snprintf (FullPathImgPriv,sizeof (FullPathImgPriv),
- "%s/%s/%c%c/%s",
- Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG,
- Image->Name[0],
- Image->Name[1],
- FileNameImgPriv);
-
- /***** Check if private image file exists *****/
- if (Fil_CheckIfPathExists (FullPathImgPriv))
- {
- /***** Create symbolic link from temporary public directory to private file
- in order to gain access to it for showing/downloading *****/
- Brw_CreateTmpPublicLinkToPrivateFile (FullPathImgPriv,FileNameImgPriv);
-
- /***** Create URL pointing to symbolic link *****/
- snprintf (URL,sizeof (URL),
- "%s/%s/%s/%s",
- Cfg_URL_SWAD_PUBLIC,Cfg_FOLDER_FILE_BROWSER_TMP,
- Gbl.FileBrowser.TmpPubDir,
- FileNameImgPriv);
-
- /***** Show image *****/
- /* Check if optional link is present */
- PutLink = false;
- if (Image->URL)
- if (Image->URL[0])
- PutLink = true;
-
- /* Start image container */
- fprintf (Gbl.F.Out,"");
- }
- else
- Ale_ShowAlert (Ale_WARNING,Txt_Image_not_found);
- }
-
-/*****************************************************************************/
-/** Remove private file with an image, given the image name (without .jpg) ***/
-/*****************************************************************************/
-
-void Img_RemoveImageFile (const char *ImageName)
- {
- char FullPathImgPriv[PATH_MAX + 1];
-
- if (ImageName[0])
- {
- /***** Build path to private file *****/
- snprintf (FullPathImgPriv,sizeof (FullPathImgPriv),
- "%s/%s/%c%c/%s.jpg",
- Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG,
- ImageName[0],
- ImageName[1],
- ImageName);
-
- /***** Remove private file *****/
- unlink (FullPathImgPriv);
-
- // Public links are removed automatically after a period
- }
- }
diff --git a/swad_image.h b/swad_image.h
deleted file mode 100644
index 1e57e40c..00000000
--- a/swad_image.h
+++ /dev/null
@@ -1,142 +0,0 @@
-// swad_image.h: processing of image uploaded in a form
-
-#ifndef _SWAD_IMG
-#define _SWAD_IMG
-/*
- SWAD (Shared Workspace At a Distance in Spanish),
- is a web platform developed at the University of Granada (Spain),
- and used to support university teaching.
-
- This file is part of SWAD core.
- Copyright (C) 1999-2019 Antonio Caņas Vargas
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This program 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 Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-/*****************************************************************************/
-/********************************* Headers ***********************************/
-/*****************************************************************************/
-
-/*****************************************************************************/
-/***************************** Public constants ******************************/
-/*****************************************************************************/
-
-#define Img_BYTES_NAME Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64
-
-#define Img_MAX_CHARS_TITLE (128 - 1) // 127
-#define Img_MAX_BYTES_TITLE ((Img_MAX_CHARS_TITLE + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
-
-#define Img_MAX_CHARS_ATTRIBUTION (256 - 1) // 255
-#define Img_MAX_BYTES_ATTRIBUTION ((Img_MAX_CHARS_ATTRIBUTION + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 4095
-
-/*****************************************************************************/
-/******************************* Public types ********************************/
-/*****************************************************************************/
-
-/***** Action to perform when editing a form with an image *****/
-#define Img_NUM_ACTIONS 4
-typedef enum
- {
- Img_ACTION_NEW_IMAGE, // Upload new image
- Img_ACTION_KEEP_IMAGE, // Keep current image unchanged
- Img_ACTION_CHANGE_IMAGE, // Change existing image by a new image
- Img_ACTION_NO_IMAGE, // Do not use image (remove current image if exists)
- } Img_Action_t;
-#define Img_ACTION_DEFAULT Img_ACTION_NO_IMAGE
-
-/***** Status of an image file *****/
-/*
-No image Original file Temporary Definitive Name of the image
-uploaded uploaded by user processed image processed image stored in database
---------- --------------------------- ------------------ ------------------ ---------------------
-Img_NONE Img_FILE_RECEIVED Img_FILE_PROCESSED Img_FILE_MOVED Img_NAME_STORED_IN_DB
---------- --------------------------- ------------------ ------------------ ---------------------
--> upload-file -> -> process-file -> b -> move-file -> -> insert-name ->
---------- --------------------------- ------------------ ------------------ ---------------------
-file.ext / / / xx-unique-name
- | | |
- var var var
- | | |
- www www www
- | | |
- swad swad swad
- | | |
- img img img
- | | |
- tmp tmp xx (2 first chars)
- | | |
- xx-unique-name_original.ext xx-unique-name.jpg xx-unique-name.jpg
-
-xx-unique-name: a unique name encrypted starting by two random chars xx
-*/
-typedef enum
- {
- Img_FILE_NONE,
- Img_FILE_RECEIVED,
- Img_FILE_PROCESSED,
- Img_FILE_MOVED,
- Img_NAME_STORED_IN_DB,
- } Img_FileStatus_t;
-
-/***** Struct used to get images from forms *****/
-struct Image
- {
- Img_Action_t Action;
- Img_FileStatus_t Status;
- char Name[Img_BYTES_NAME + 1];
- char *Title; // Title/attribution (it must be initialized to NULL
- // in order to not trying to free it when no memory allocated)
- char *URL; // URL, i.e. link to original big photo or video
- // (it must be initialized to NULL
- // in order to not trying to free it when no memory allocated)
- unsigned Width;
- unsigned Height;
- unsigned Quality;
- };
-
-/***** Parameters used in a form to upload an image *****/
-#define Img_MAX_BYTES_PARAM_UPLOAD_IMG (16 - 1)
-struct ParamUploadImg
- {
- char Action[Img_MAX_BYTES_PARAM_UPLOAD_IMG + 1];
- char File [Img_MAX_BYTES_PARAM_UPLOAD_IMG + 1];
- char Title [Img_MAX_BYTES_PARAM_UPLOAD_IMG + 1];
- char URL [Img_MAX_BYTES_PARAM_UPLOAD_IMG + 1];
- };
-
-/*****************************************************************************/
-/***************************** Public prototypes *****************************/
-/*****************************************************************************/
-
-void Img_ImageConstructor (struct Image *Image);
-void Img_ResetImageExceptTitleAndURL (struct Image *Image);
-void Img_ImageDestructor (struct Image *Image);
-void Img_FreeImageTitle (struct Image *Image);
-void Img_FreeImageURL (struct Image *Image);
-
-void Img_GetImageNameTitleAndURLFromRow (const char *Name,
- const char *Title,
- const char *URL,
- struct Image *Image);
-
-void Img_PutImageUploader (int NumImgInForm,const char *ClassImgTitURL);
-void Img_GetImageFromForm (int NumImgInForm,struct Image *Image,
- void (*GetImageFromDB) (int NumImgInForm,struct Image *Image));
-void Img_SetParamNames (struct ParamUploadImg *ParamUploadImg,int NumImgInForm);
-
-void Img_MoveImageToDefinitiveDirectory (struct Image *Image);
-void Img_ShowImage (struct Image *Image,
- const char *ClassContainer,const char *ClassImg);
-void Img_RemoveImageFile (const char *ImageName);
-
-#endif
diff --git a/swad_message.c b/swad_message.c
index 442487c1..37c1716f 100644
--- a/swad_message.c
+++ b/swad_message.c
@@ -121,7 +121,7 @@ static void Msg_ContractSentMsg (long MsgCod);
static void Msg_ContractReceivedMsg (long MsgCod);
static long Msg_InsertNewMsg (const char *Subject,const char *Content,
- struct Image *Image);
+ struct Media *Media);
static unsigned long Msg_DelSomeRecOrSntMsgsUsr (Msg_TypeOfMessages_t TypeOfMessages,long UsrCod,
long FilterCrsCod,const char *FilterFromToSubquery);
@@ -139,7 +139,7 @@ static void Msg_GetMsgSntData (long MsgCod,long *CrsCod,long *UsrCod,
char Subject[Cns_MAX_BYTES_SUBJECT + 1],
bool *Deleted);
static void Msg_GetMsgContent (long MsgCod,char Content[Cns_MAX_BYTES_LONG_TEXT + 1],
- struct Image *Image);
+ struct Media *Media);
static void Msg_WriteSentOrReceivedMsgSubject (long MsgCod,const char *Subject,bool Open,bool Expanded);
static void Msg_WriteFormToReply (long MsgCod,long CrsCod,
@@ -325,7 +325,7 @@ static void Msg_PutFormMsgUsrs (char Content[Cns_MAX_BYTES_LONG_TEXT + 1])
Lay_HelpPlainEditor ();
/***** Attached image (optional) *****/
- Img_PutImageUploader (-1,"MSG_IMG_TIT_URL");
+ Med_PutMediaUploader (-1,"MSG_IMG_TIT_URL");
/***** Send button *****/
Btn_PutCreateButton (Txt_Send_message);
@@ -669,7 +669,7 @@ void Msg_RecMsgFromUsr (void)
bool CreateNotif;
bool NotifyByEmail;
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
- struct Image Image;
+ struct Media Media;
bool Error = false;
/***** Get data from form *****/
@@ -727,13 +727,13 @@ void Msg_RecMsgFromUsr (void)
Usr_UsrDataConstructor (&UsrDstData);
/***** Initialize image *****/
- Img_ImageConstructor (&Image);
+ Med_MediaConstructor (&Media);
/***** Get attached image (action, file and title) *****/
- Image.Width = Msg_IMAGE_SAVED_MAX_WIDTH;
- Image.Height = Msg_IMAGE_SAVED_MAX_HEIGHT;
- Image.Quality = Msg_IMAGE_SAVED_QUALITY;
- Img_GetImageFromForm (-1,&Image,NULL);
+ Media.Width = Msg_IMAGE_SAVED_MAX_WIDTH;
+ Media.Height = Msg_IMAGE_SAVED_MAX_HEIGHT;
+ Media.Quality = Msg_IMAGE_SAVED_QUALITY;
+ Med_GetMediaFromForm (-1,&Media,NULL);
/***** Loop over the list Gbl.Usrs.Select[Rol_UNK], that holds the list of the
recipients, creating a received message for each recipient *****/
@@ -761,7 +761,7 @@ void Msg_RecMsgFromUsr (void)
if (!MsgAlreadyInserted)
{
// The message is inserted only once in the table of messages sent
- NewMsgCod = Msg_InsertNewMsg (Gbl.Msg.Subject,Content,&Image);
+ NewMsgCod = Msg_InsertNewMsg (Gbl.Msg.Subject,Content,&Media);
MsgAlreadyInserted = true;
}
@@ -806,7 +806,7 @@ void Msg_RecMsgFromUsr (void)
}
/***** Free image *****/
- Img_ImageDestructor (&Image);
+ Med_MediaDestructor (&Media);
/***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&UsrDstData);
@@ -1277,27 +1277,28 @@ void Msg_SetReceivedMsgAsOpen (long MsgCod,long UsrCod)
// Return the code of the new inserted message
static long Msg_InsertNewMsg (const char *Subject,const char *Content,
- struct Image *Image)
+ struct Media *Media)
{
long MsgCod;
/***** Check if image is received and processed *****/
- if (Image->Action == Img_ACTION_NEW_IMAGE && // Upload new image
- Image->Status == Img_FILE_PROCESSED) // The new image received has been processed
+ if (Media->Action == Med_ACTION_NEW_MEDIA && // Upload new image
+ Media->Status == Med_FILE_PROCESSED) // The new image received has been processed
/* Move processed image to definitive directory */
- Img_MoveImageToDefinitiveDirectory (Image);
+ Med_MoveMediaToDefinitiveDirectory (Media);
/***** Insert message subject and content in the database *****/
MsgCod =
DB_QueryINSERTandReturnCode ("can not create message",
"INSERT INTO msg_content"
- " (Subject,Content,ImageName,ImageTitle,ImageURL)"
+ " (Subject,Content,MediaName,MediaType,MediaTitle,MediaURL)"
" VALUES"
- " ('%s','%s','%s','%s','%s')",
+ " ('%s','%s','%s','%s','%s','%s')",
Subject,Content,
- Image->Name,
- Image->Title ? Image->Title : "",
- Image->URL ? Image->URL : "");
+ Media->Name,
+ Med_GetStringTypeForDB (Media->Type),
+ Media->Title ? Media->Title : "",
+ Media->URL ? Media->URL : "");
/***** Insert message in sent messages *****/
DB_QueryINSERT ("can not create message",
@@ -1490,8 +1491,8 @@ static void Msg_MoveMsgContentToDeleted (long MsgCod)
/* Insert message content into msg_content_deleted */
DB_QueryINSERT ("can not remove the content of a message",
"INSERT IGNORE INTO msg_content_deleted"
- " (MsgCod,Subject,Content,ImageName,ImageTitle,ImageURL)"
- " SELECT MsgCod,Subject,Content,ImageName,ImageTitle,ImageURL"
+ " (MsgCod,Subject,Content,MediaName,MediaType,MediaTitle,MediaURL)"
+ " SELECT MsgCod,Subject,Content,MediaName,MediaType,MediaTitle,MediaURL"
" FROM msg_content WHERE MsgCod=%ld",
MsgCod);
@@ -2774,7 +2775,7 @@ void Msg_GetMsgSubject (long MsgCod,char Subject[Cns_MAX_BYTES_SUBJECT + 1])
/*****************************************************************************/
static void Msg_GetMsgContent (long MsgCod,char Content[Cns_MAX_BYTES_LONG_TEXT + 1],
- struct Image *Image)
+ struct Media *Media)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
@@ -2782,7 +2783,11 @@ static void Msg_GetMsgContent (long MsgCod,char Content[Cns_MAX_BYTES_LONG_TEXT
/***** Get content of message from database *****/
NumRows = DB_QuerySELECT (&mysql_res,"can not get the content of a message",
- "SELECT Content,ImageName,ImageTitle,ImageURL"
+ "SELECT Content," // row[0]
+ "MediaName," // row[1]
+ "MediaType," // row[2]
+ "MediaTitle," // row[3]
+ "MediaURL" // row[4]
" FROM msg_content WHERE MsgCod=%ld",
MsgCod);
@@ -2797,8 +2802,8 @@ static void Msg_GetMsgContent (long MsgCod,char Content[Cns_MAX_BYTES_LONG_TEXT
Str_Copy (Content,row[0],
Cns_MAX_BYTES_LONG_TEXT);
- /****** Get image name (row[1]), title (row[2]) and URL (row[3]) *****/
- Img_GetImageNameTitleAndURLFromRow (row[1],row[2],row[3],Image);
+ /****** Get image name (row[1]), type (row[2]), title (row[3]) and URL (row[4]) *****/
+ Med_GetMediaNameTitleAndURLFromRow (row[1],row[2],row[3],row[4],Media);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
@@ -2897,7 +2902,7 @@ static void Msg_ShowASentOrReceivedMessage (long MsgNum,long MsgCod)
long CrsCod;
char Subject[Cns_MAX_BYTES_SUBJECT + 1];
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
- struct Image Image;
+ struct Media Media;
bool Deleted;
bool Open = true;
bool Replied = false; // Initialized to avoid warning
@@ -3030,21 +3035,21 @@ static void Msg_ShowASentOrReceivedMessage (long MsgNum,long MsgCod)
Txt_MSG_Content);
/***** Initialize image *****/
- Img_ImageConstructor (&Image);
+ Med_MediaConstructor (&Media);
/***** Get message content and optional image *****/
- Msg_GetMsgContent (MsgCod,Content,&Image);
+ Msg_GetMsgContent (MsgCod,Content,&Media);
/***** Show content and image *****/
fprintf (Gbl.F.Out,"");
if (Content[0])
Msg_WriteMsgContent (Content,Cns_MAX_BYTES_LONG_TEXT,true,false);
- Img_ShowImage (&Image,"MSG_IMG_CONTAINER","MSG_IMG");
+ Med_ShowMedia (&Media,"MSG_IMG_CONTAINER","MSG_IMG");
fprintf (Gbl.F.Out," "
"");
/***** Free image *****/
- Img_ImageDestructor (&Image);
+ Med_MediaDestructor (&Media);
}
/***** Free memory used for user's data *****/
diff --git a/swad_social.c b/swad_social.c
index 91280750..186d2019 100644
--- a/swad_social.c
+++ b/swad_social.c
@@ -40,8 +40,8 @@
#include "swad_follow.h"
#include "swad_form.h"
#include "swad_global.h"
-#include "swad_image.h"
#include "swad_layout.h"
+#include "swad_media.h"
#include "swad_notice.h"
#include "swad_notification.h"
#include "swad_parameter.h"
@@ -113,7 +113,7 @@ struct SocialComment
time_t DateTimeUTC;
unsigned NumFavs; // Number of times (users) this comment has been favourited
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
- struct Image Image;
+ struct Media Media;
};
/*****************************************************************************/
@@ -523,7 +523,6 @@ void Soc_MarkMyNotifAsSeen (void)
/*****************************************************************************/
/************************ Build query to get timeline ************************/
/*****************************************************************************/
-// Query must have space for at least 1024 chars
#define Soc_MAX_BYTES_SUBQUERY_ALREADY_EXISTS (256 - 1)
@@ -1809,15 +1808,19 @@ static void Soc_GetAndWriteSocialPost (long PstCod)
MYSQL_ROW row;
unsigned long NumRows;
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
- struct Image Image;
+ struct Media Media;
/***** Initialize image *****/
- Img_ImageConstructor (&Image);
+ Med_MediaConstructor (&Media);
/***** Get social post from database *****/
NumRows = DB_QuerySELECT (&mysql_res,"can not get the content"
" of a social post",
- "SELECT Content,ImageName,ImageTitle,ImageURL"
+ "SELECT Content," // row[0]
+ "MediaName," // row[1]
+ "MediaType," // row[2]
+ "MediaTitle," // row[3]
+ "MediaURL" // row[4]
" FROM social_posts WHERE PstCod=%ld",
PstCod);
@@ -1830,8 +1833,8 @@ static void Soc_GetAndWriteSocialPost (long PstCod)
Str_Copy (Content,row[0],
Cns_MAX_BYTES_LONG_TEXT);
- /****** Get image name (row[1]), title (row[2]) and URL (row[3]) *****/
- Img_GetImageNameTitleAndURLFromRow (row[1],row[2],row[3],&Image);
+ /****** Get image name (row[1]), type (row[2]), title (row[3]) and URL (row[4]) *****/
+ Med_GetMediaNameTitleAndURLFromRow (row[1],row[2],row[3],row[4],&Media);
}
else
Content[0] = '\0';
@@ -1848,11 +1851,11 @@ static void Soc_GetAndWriteSocialPost (long PstCod)
}
/***** Show image *****/
- Img_ShowImage (&Image,"TL_POST_IMG_CONTAINER TL_RIGHT_WIDTH",
+ Med_ShowMedia (&Media,"TL_POST_IMG_CONTAINER TL_RIGHT_WIDTH",
"TL_POST_IMG TL_RIGHT_WIDTH");
/***** Free image *****/
- Img_ImageDestructor (&Image);
+ Med_MediaDestructor (&Media);
}
/*****************************************************************************/
@@ -2381,7 +2384,7 @@ static void Soc_PutTextarea (const char *Placeholder,
Lay_HelpPlainEditor ();
/***** Attached image (optional) *****/
- Img_PutImageUploader (-1,ClassImgTit);
+ Med_PutMediaUploader (-1,ClassImgTit);
/***** Submit button *****/
fprintf (Gbl.F.Out," ",
@@ -2804,7 +2809,7 @@ static void Soc_WriteSocialComment (struct SocialComment *SocCom,
fprintf (Gbl.F.Out," ");
/* Show image */
- Img_ShowImage (&SocCom->Image,"TL_COMMENT_IMG_CONTAINER TL_COMMENT_WIDTH",
+ Med_ShowMedia (&SocCom->Media,"TL_COMMENT_IMG_CONTAINER TL_COMMENT_WIDTH",
"TL_COMMENT_IMG TL_COMMENT_WIDTH");
/* Put icon to mark this social comment as favourite */
@@ -3154,7 +3159,7 @@ static long Soc_ReceiveComment (void)
{
extern const char *Txt_The_original_post_no_longer_exists;
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
- struct Image Image;
+ struct Media Media;
struct SocialNote SocNot;
struct SocialPublishing SocPub;
@@ -3169,22 +3174,22 @@ static long Soc_ReceiveComment (void)
Str_TO_RIGOROUS_HTML,true);
/***** Initialize image *****/
- Img_ImageConstructor (&Image);
+ Med_MediaConstructor (&Media);
/***** Get attached image (action, file and title) *****/
- Image.Width = Soc_IMAGE_SAVED_MAX_WIDTH;
- Image.Height = Soc_IMAGE_SAVED_MAX_HEIGHT;
- Image.Quality = Soc_IMAGE_SAVED_QUALITY;
- Img_GetImageFromForm (-1,&Image,NULL);
+ Media.Width = Soc_IMAGE_SAVED_MAX_WIDTH;
+ Media.Height = Soc_IMAGE_SAVED_MAX_HEIGHT;
+ Media.Quality = Soc_IMAGE_SAVED_QUALITY;
+ Med_GetMediaFromForm (-1,&Media,NULL);
if (Content[0] || // Text not empty
- Image.Name[0]) // An image is attached
+ Media.Name[0]) // An image is attached
{
/***** Check if image is received and processed *****/
- if (Image.Action == Img_ACTION_NEW_IMAGE && // Upload new image
- Image.Status == Img_FILE_PROCESSED) // The new image received has been processed
+ if (Media.Action == Med_ACTION_NEW_MEDIA && // Upload new image
+ Media.Status == Med_FILE_PROCESSED) // The new image received has been processed
/* Move processed image to definitive directory */
- Img_MoveImageToDefinitiveDirectory (&Image);
+ Med_MoveMediaToDefinitiveDirectory (&Media);
/***** Publish *****/
/* Insert into publishings */
@@ -3196,16 +3201,17 @@ static long Soc_ReceiveComment (void)
/* Insert comment content in the database */
DB_QueryINSERT ("can not store comment content",
"INSERT INTO social_comments"
- " (PubCod,Content,ImageName,ImageTitle,ImageURL)"
+ " (PubCod,Content,MediaName,MediaType,MediaTitle,MediaURL)"
" VALUES"
- " (%ld,'%s','%s','%s','%s')",
+ " (%ld,'%s','%s','%s','%s','%s')",
SocPub.PubCod,
Content,
- Image.Name,
- (Image.Name[0] && // Save image title only if image attached
- Image.Title) ? Image.Title : "",
- (Image.Name[0] && // Save image URL only if image attached
- Image.URL ) ? Image.URL : "");
+ Media.Name,
+ Med_GetStringTypeForDB (Media.Type),
+ (Media.Name[0] && // Save image title only if image attached
+ Media.Title) ? Media.Title : "",
+ (Media.Name[0] && // Save image URL only if image attached
+ Media.URL ) ? Media.URL : "");
/***** Store notifications about the new comment *****/
Ntf_StoreNotifyEventsToAllUsrs (Ntf_EVENT_TIMELINE_COMMENT,SocPub.PubCod);
@@ -3220,7 +3226,7 @@ static long Soc_ReceiveComment (void)
}
/***** Free image *****/
- Img_ImageDestructor (&Image);
+ Med_MediaDestructor (&Media);
}
else
Ale_ShowAlert (Ale_WARNING,Txt_The_original_post_no_longer_exists);
@@ -3411,7 +3417,7 @@ static void Soc_FavSocialComment (struct SocialComment *SocCom)
bool ItsMe;
/***** Initialize image *****/
- Img_ImageConstructor (&SocCom->Image);
+ Med_MediaConstructor (&SocCom->Media);
/***** Get data of social comment *****/
SocCom->PubCod = Soc_GetParamPubCod ();
@@ -3443,7 +3449,7 @@ static void Soc_FavSocialComment (struct SocialComment *SocCom)
}
/***** Free image *****/
- Img_ImageDestructor (&SocCom->Image);
+ Med_MediaDestructor (&SocCom->Media);
}
/*****************************************************************************/
@@ -3665,7 +3671,7 @@ static void Soc_UnfavSocialComment (struct SocialComment *SocCom)
bool ItsMe;
/***** Initialize image *****/
- Img_ImageConstructor (&SocCom->Image);
+ Med_MediaConstructor (&SocCom->Media);
/***** Get data of social comment *****/
SocCom->PubCod = Soc_GetParamPubCod ();
@@ -3695,7 +3701,7 @@ static void Soc_UnfavSocialComment (struct SocialComment *SocCom)
}
/***** Free image *****/
- Img_ImageDestructor (&SocCom->Image);
+ Med_MediaDestructor (&SocCom->Media);
}
/*****************************************************************************/
@@ -3859,19 +3865,16 @@ static void Soc_RemoveSocialNote (void)
static void Soc_RemoveImgFileFromSocialPost (long PstCod)
{
MYSQL_RES *mysql_res;
- MYSQL_ROW row;
/***** Get name of image associated to a social post from database *****/
if (DB_QuerySELECT (&mysql_res,"can not get image",
- "SELECT ImageName FROM social_posts WHERE PstCod=%ld",
+ "SELECT MediaName," // row[0]
+ "MediaType" // row[1]
+ " FROM social_posts"
+ " WHERE PstCod=%ld",
PstCod))
- {
- /***** Get image name (row[0]) *****/
- row = mysql_fetch_row (mysql_res);
-
- /***** Remove image file *****/
- Img_RemoveImageFile (row[0]);
- }
+ /***** Remove media file *****/
+ Med_RemoveMediaFileFromRow (mysql_res);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
@@ -4072,7 +4075,7 @@ static void Soc_RequestRemovalSocialComment (void)
bool ItsMe;
/***** Initialize image *****/
- Img_ImageConstructor (&SocCom.Image);
+ Med_MediaConstructor (&SocCom.Media);
/***** Get data of social comment *****/
SocCom.PubCod = Soc_GetParamPubCod ();
@@ -4108,7 +4111,7 @@ static void Soc_RequestRemovalSocialComment (void)
Ale_ShowAlert (Ale_WARNING,Txt_The_comment_no_longer_exists);
/***** Free image *****/
- Img_ImageDestructor (&SocCom.Image);
+ Med_MediaDestructor (&SocCom.Media);
}
/*****************************************************************************/
@@ -4166,7 +4169,7 @@ static void Soc_RemoveSocialComment (void)
bool ItsMe;
/***** Initialize image *****/
- Img_ImageConstructor (&SocCom.Image);
+ Med_MediaConstructor (&SocCom.Media);
/***** Get data of social comment *****/
SocCom.PubCod = Soc_GetParamPubCod ();
@@ -4191,7 +4194,7 @@ static void Soc_RemoveSocialComment (void)
Ale_ShowAlert (Ale_WARNING,Txt_The_comment_no_longer_exists);
/***** Free image *****/
- Img_ImageDestructor (&SocCom.Image);
+ Med_MediaDestructor (&SocCom.Media);
}
/*****************************************************************************/
@@ -4201,20 +4204,16 @@ static void Soc_RemoveSocialComment (void)
static void Soc_RemoveImgFileFromSocialComment (long PubCod)
{
MYSQL_RES *mysql_res;
- MYSQL_ROW row;
- /***** Get name of image associated to a social post from database *****/
- if (DB_QuerySELECT (&mysql_res,"can not get image",
- "SELECT ImageName FROM social_comments"
+ /***** Get name of media associated to a social post from database *****/
+ if (DB_QuerySELECT (&mysql_res,"can not get media",
+ "SELECT MediaName," // row[0]
+ "MediaType" // row[1]
+ " FROM social_comments"
" WHERE PubCod=%ld",
PubCod))
- {
- /***** Get image name (row[0]) *****/
- row = mysql_fetch_row (mysql_res);
-
- /***** Remove image file *****/
- Img_RemoveImageFile (row[0]);
- }
+ /***** Remove media file *****/
+ Med_RemoveMediaFileFromRow (mysql_res);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
@@ -4670,9 +4669,10 @@ static void Soc_GetDataOfSocialComByCod (struct SocialComment *SocCom)
"social_pubs.NotCod," // row[2]
"UNIX_TIMESTAMP(social_pubs.TimePublish)," // row[3]
"social_comments.Content," // row[4]
- "social_comments.ImageName," // row[5]
- "social_comments.ImageTitle," // row[6]
- "social_comments.ImageURL" // row[7]
+ "social_comments.MediaName," // row[5]
+ "social_comments.MediaType," // row[6]
+ "social_comments.MediaTitle," // row[7]
+ "social_comments.MediaURL" // row[8]
" FROM social_pubs,social_comments"
" WHERE social_pubs.PubCod=%ld"
" AND social_pubs.PubType=%u"
@@ -4802,9 +4802,10 @@ static void Soc_GetDataOfSocialCommentFromRow (MYSQL_ROW row,struct SocialCommen
row[2]: NotCod
row[3]: TimePublish
row[4]: Content
- row[5]: ImageName
- row[6]: ImageTitle
- row[7]: ImageURL
+ row[5]: MediaName
+ row[6]: MediaType
+ row[7]: MediaTitle
+ row[8]: MediaURL
*/
/***** Get code of social comment (row[0]) *****/
SocCom->PubCod = Str_ConvertStrCodToLongCod (row[0]);
@@ -4825,8 +4826,9 @@ static void Soc_GetDataOfSocialCommentFromRow (MYSQL_ROW row,struct SocialCommen
/***** Get number of times this comment has been favourited *****/
Soc_GetNumTimesACommHasBeenFav (SocCom);
- /****** Get image name (row[5]), title (row[6]) and URL (row[7]) *****/
- Img_GetImageNameTitleAndURLFromRow (row[5],row[6],row[7],&SocCom->Image);
+ /****** Get image name (row[5]), type (row[6]), title (row[7]) and URL (row[8]) *****/
+ Med_GetMediaNameTitleAndURLFromRow (row[5],row[6],row[7],row[8],
+ &SocCom->Media);
}
/*****************************************************************************/
diff --git a/swad_social.h b/swad_social.h
index 7b93f093..179b157e 100644
--- a/swad_social.h
+++ b/swad_social.h
@@ -50,7 +50,7 @@ typedef enum
Soc_USRS_FOLLOWED = 1,
Soc_USRS_ALL = 2,
} Soc_WhichUsrs_t; // Which users I want to see: only users I follow or all users
-#define Soc_DEFAULT_WHICH_USRS Soc_USRS_ALL
+#define Soc_DEFAULT_WHICH_USRS Soc_USRS_FOLLOWED
#define Soc_NUM_PUB_TYPES 4
// If the numbers assigned to each event type change,
diff --git a/swad_test.c b/swad_test.c
index f75b4bba..2a95a8d0 100644
--- a/swad_test.c
+++ b/swad_test.c
@@ -42,8 +42,8 @@
#include "swad_form.h"
#include "swad_global.h"
#include "swad_ID.h"
-#include "swad_image.h"
#include "swad_language.h"
+#include "swad_media.h"
#include "swad_parameter.h"
#include "swad_table.h"
#include "swad_theme.h"
@@ -155,10 +155,10 @@ static Tst_Status_t Tst_GetTstStatus (unsigned NumTst);
static unsigned Tst_GetNumAccessesTst (void);
static void Tst_ShowTestQuestionsWhenSeeing (MYSQL_RES *mysql_res);
static void Tst_ShowTestResultAfterAssess (long TstCod,unsigned *NumQstsNotBlank,double *TotalScore);
-static void Tst_PutFormToEditQstImage (struct Image *Image,int NumImgInForm,
+static void Tst_PutFormToEditQstMedia (struct Media *Media,int NumMediaInForm,
const char *ClassContainer,
- const char *ClassImg,
- const char *ClassImgTitURL,
+ const char *ClassMedia,
+ const char *ClassMediaTitURL,
bool OptionsDisabled);
static void Tst_UpdateScoreQst (long QstCod,float ScoreThisQst,bool AnswerIsNotBlank);
static void Tst_UpdateMyNumAccessTst (unsigned NumAccessesTst);
@@ -247,16 +247,16 @@ static void Tst_PutTFInputField (const char *Label,char Value);
static void Tst_FreeTextChoiceAnswers (void);
static void Tst_FreeTextChoiceAnswer (unsigned NumOpt);
-static void Tst_InitImagesOfQuestion (void);
-static void Tst_FreeImagesOfQuestion (void);
+static void Tst_InitMediaOfQuestion (void);
+static void Tst_FreeMediaOfQuestion (void);
static void Tst_GetQstDataFromDB (char Stem[Cns_MAX_BYTES_TEXT + 1],
char Feedback[Cns_MAX_BYTES_TEXT + 1]);
-static void Tst_GetImageFromDB (int NumOpt,struct Image *Image);
+static void Tst_GetMediaFromDB (int NumOpt,struct Media *Media);
static Tst_AnswerType_t Tst_ConvertFromUnsignedStrToAnsTyp (const char *UnsignedStr);
static void Tst_GetQstFromForm (char *Stem,char *Feedback);
-static void Tst_MoveImagesToDefinitiveDirectories (void);
+static void Tst_MoveMediaToDefinitiveDirectories (void);
static long Tst_GetTagCodFromTagTxt (const char *TagTxt);
static long Tst_CreateNewTag (long CrsCod,const char *TagTxt);
@@ -939,12 +939,13 @@ static void Tst_ShowTestResultAfterAssess (long TstCod,unsigned *NumQstsNotBlank
row[ 3] Shuffle
row[ 4] Stem
row[ 5] Feedback
- row[ 6] ImageName
- row[ 7] ImageTitle
- row[ 8] ImageURL
- row[ 9] NumHits
- row[10] NumHitsNotBlank
- row[11] Score
+ row[ 6] MediaName
+ row[ 7] MediaType
+ row[ 8] MediaTitle
+ row[ 9] MediaURL
+ row[10] NumHits
+ row[11] NumHitsNotBlank
+ row[12] Score
*/
/***** Get the code of question (row[0]) *****/
@@ -1007,12 +1008,13 @@ void Tst_WriteQstAndAnsTest (Tst_ActionToDoWithQuestions_t ActionToDoWithQuestio
row[ 3] Shuffle
row[ 4] Stem
row[ 5] Feedback
- row[ 6] ImageName
- row[ 7] ImageTitle
- row[ 8] ImageURL
- row[ 9] NumHits
- row[10] NumHitsNotBlank
- row[11] Score
+ row[ 6] MediaName
+ row[ 7] MediaType
+ row[ 8] MediaTitle
+ row[ 9] MediaURL
+ row[10] NumHits
+ row[11] NumHitsNotBlank
+ row[12] Score
*/
/***** Create test question *****/
@@ -1032,13 +1034,14 @@ void Tst_WriteQstAndAnsTest (Tst_ActionToDoWithQuestions_t ActionToDoWithQuestio
" ",
Txt_TST_STR_ANSWER_TYPES[Gbl.Test.AnswerType]);
- /***** Write stem (row[4]), image (row[6], row[7], row[8]),
+ /***** Write stem (row[4]), media (row[6], row[7], row[8], row[9]),
answers depending on shuffle (row[3]) and feedback (row[5]) *****/
fprintf (Gbl.F.Out,"",
Gbl.RowEvenOdd);
Tst_WriteQstStem (row[4],"TEST_EXA");
- Img_GetImageNameTitleAndURLFromRow (row[6],row[7],row[8],&Gbl.Test.Image);
- Img_ShowImage (&Gbl.Test.Image,
+ Med_GetMediaNameTitleAndURLFromRow (row[6],row[7],row[8],row[9],
+ &Gbl.Test.Media);
+ Med_ShowMedia (&Gbl.Test.Media,
"TEST_IMG_SHOW_STEM_CONTAINER",
"TEST_IMG_SHOW_STEM");
@@ -1106,10 +1109,10 @@ void Tst_WriteQstStem (const char *Stem,const char *ClassStem)
/************* Put form to upload a new image for a test question ************/
/*****************************************************************************/
-static void Tst_PutFormToEditQstImage (struct Image *Image,int NumImgInForm,
+static void Tst_PutFormToEditQstMedia (struct Media *Media,int NumMediaInForm,
const char *ClassContainer,
- const char *ClassImg,
- const char *ClassImgTitURL,
+ const char *ClassMedia,
+ const char *ClassMediaTitURL,
bool OptionsDisabled)
{
extern const char *The_ClassFormInBox[The_NUM_THEMES];
@@ -1120,12 +1123,12 @@ static void Tst_PutFormToEditQstImage (struct Image *Image,int NumImgInForm,
extern const char *Txt_Link;
extern const char *Txt_optional;
static unsigned UniqueId = 0;
- struct ParamUploadImg ParamUploadImg;
+ struct ParamUploadMedia ParamUploadMedia;
- if (Image->Name[0])
+ if (Media->Name[0])
{
/***** Set names of parameters depending on number of image in form *****/
- Img_SetParamNames (&ParamUploadImg,NumImgInForm);
+ Med_SetParamNames (&ParamUploadMedia,NumMediaInForm);
/***** Start container *****/
fprintf (Gbl.F.Out,"");
@@ -1134,7 +1137,7 @@ static void Tst_PutFormToEditQstImage (struct Image *Image,int NumImgInForm,
fprintf (Gbl.F.Out,""
" "
@@ -1147,14 +1150,14 @@ static void Tst_PutFormToEditQstImage (struct Image *Image,int NumImgInForm,
" "
"%s"
" ",
Txt_Current_image);
- Img_ShowImage (Image,ClassContainer,ClassImg);
+ Med_ShowMedia (Media,ClassContainer,ClassMedia);
/***** Choice 3: Change/new image *****/
UniqueId++;
@@ -1162,8 +1165,8 @@ static void Tst_PutFormToEditQstImage (struct Image *Image,int NumImgInForm,
" "
@@ -1171,30 +1174,30 @@ static void Tst_PutFormToEditQstImage (struct Image *Image,int NumImgInForm,
""
" ",
UniqueId);
- /***** Image title/attribution *****/
+ /***** Media title/attribution *****/
fprintf (Gbl.F.Out," "
" ",
- ParamUploadImg.Title,Txt_Image_title_attribution,Txt_optional,
- ClassImgTitURL,Img_MAX_CHARS_TITLE,
- Image->Title ? Image->Title :
+ ParamUploadMedia.Title,Txt_Image_title_attribution,Txt_optional,
+ ClassMediaTitURL,Med_MAX_CHARS_TITLE,
+ Media->Title ? Media->Title :
"");
- /***** Image URL *****/
+ /***** Media URL *****/
fprintf (Gbl.F.Out," "
" ",
- ParamUploadImg.URL,Txt_Link,Txt_optional,
- ClassImgTitURL,Cns_MAX_CHARS_WWW,
- Image->URL ? Image->URL :
+ ParamUploadMedia.URL,Txt_Link,Txt_optional,
+ ClassMediaTitURL,Cns_MAX_CHARS_WWW,
+ Media->URL ? Media->URL :
"");
/***** End container *****/
@@ -1202,7 +1205,7 @@ static void Tst_PutFormToEditQstImage (struct Image *Image,int NumImgInForm,
}
else // No current image
/***** Attached image (optional) *****/
- Img_PutImageUploader (NumImgInForm,ClassImgTitURL);
+ Med_PutMediaUploader (NumMediaInForm,ClassMediaTitURL);
}
/*****************************************************************************/
@@ -2471,30 +2474,20 @@ static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
/***** Select questions *****/
/* Start query */
- /*
- row[ 0] QstCod
- row[ 1] UNIX_TIMESTAMP(EditTime)
- row[ 2] AnsType
- row[ 3] Shuffle
- row[ 4] Stem
- row[ 5] Feedback
- row[ 6] ImageName
- row[ 7] ImageTitle
- row[ 8] ImageURL
- row[ 9] NumHits
- row[10] NumHitsNotBlank
- row[11] Score
- */
snprintf (Query,Tst_MAX_BYTES_QUERY_TEST + 1,
- "SELECT tst_questions.QstCod,"
- "UNIX_TIMESTAMP(tst_questions.EditTime) AS F,"
- "tst_questions.AnsType,tst_questions.Shuffle,"
- "tst_questions.Stem,tst_questions.Feedback,"
- "tst_questions.ImageName,"
- "tst_questions.ImageTitle,"
- "tst_questions.ImageURL,"
- "tst_questions.NumHits,tst_questions.NumHitsNotBlank,"
- "tst_questions.Score"
+ "SELECT tst_questions.QstCod," // row[ 0]
+ "UNIX_TIMESTAMP(tst_questions.EditTime) AS F," // row[ 1]
+ "tst_questions.AnsType," // row[ 2]
+ "tst_questions.Shuffle," // row[ 3]
+ "tst_questions.Stem," // row[ 4]
+ "tst_questions.Feedback," // row[ 5]
+ "tst_questions.MediaName," // row[ 6]
+ "tst_questions.MediaType," // row[ 7]
+ "tst_questions.MediaTitle," // row[ 8]
+ "tst_questions.MediaURL," // row[ 9]
+ "tst_questions.NumHits," // row[10]
+ "tst_questions.NumHitsNotBlank," // row[11]
+ "tst_questions.Score" // row[12]
" FROM tst_questions");
if (!Gbl.Test.Tags.All)
Str_Concat (Query,",tst_question_tags,tst_tags",
@@ -2650,34 +2643,24 @@ static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
Lay_NotEnoughMemoryExit ();
/***** Select questions without hidden tags *****/
- /*
- row[ 0] QstCod
- row[ 1] UNIX_TIMESTAMP(EditTime)
- row[ 2] AnsType
- row[ 3] Shuffle
- row[ 4] Stem
- row[ 5] Feedback
- row[ 6] ImageName
- row[ 7] ImageTitle
- row[ 8] ImageURL
- row[ 9] NumHits
- row[10] NumHitsNotBlank
- row[11] Score
- */
/* Start query */
// Reject questions with any tag hidden
// Select only questions with tags
// DISTINCTROW is necessary to not repeat questions
snprintf (Query,Tst_MAX_BYTES_QUERY_TEST + 1,
- "SELECT DISTINCTROW tst_questions.QstCod,"
- "UNIX_TIMESTAMP(tst_questions.EditTime),"
- "tst_questions.AnsType,tst_questions.Shuffle,"
- "tst_questions.Stem,tst_questions.Feedback,"
- "tst_questions.ImageName,"
- "tst_questions.ImageTitle,"
- "tst_questions.ImageURL,"
- "tst_questions.NumHits,tst_questions.NumHitsNotBlank,"
- "tst_questions.Score"
+ "SELECT DISTINCTROW tst_questions.QstCod," // row[ 0]
+ "UNIX_TIMESTAMP(tst_questions.EditTime)," // row[ 1]
+ "tst_questions.AnsType," // row[ 2]
+ "tst_questions.Shuffle," // row[ 3]
+ "tst_questions.Stem," // row[ 4]
+ "tst_questions.Feedback," // row[ 5]
+ "tst_questions.MediaName," // row[ 6]
+ "tst_questions.MediaType," // row[ 7]
+ "tst_questions.MediaTitle," // row[ 8]
+ "tst_questions.MediaURL," // row[ 9]
+ "tst_questions.NumHits," // row[10]
+ "tst_questions.NumHitsNotBlank," // row[11]
+ "tst_questions.Score" // row[12]
" FROM tst_questions,tst_question_tags,tst_tags"
" WHERE tst_questions.CrsCod=%ld"
" AND tst_questions.QstCod NOT IN"
@@ -2790,25 +2773,20 @@ static void Tst_ListOneQstToEdit (void)
bool Tst_GetOneQuestionByCod (long QstCod,MYSQL_RES **mysql_res)
{
/***** Get data of a question from database *****/
- /*
- row[ 0] QstCod
- row[ 1] UNIX_TIMESTAMP(EditTime)
- row[ 2] AnsType
- row[ 3] Shuffle
- row[ 4] Stem
- row[ 5] Feedback
- row[ 6] ImageName
- row[ 7] ImageTitle
- row[ 8] ImageURL
- row[ 9] NumHits
- row[10] NumHitsNotBlank
- row[11] Score
- */
return (DB_QuerySELECT (mysql_res,"can not get data of a question",
- "SELECT QstCod,UNIX_TIMESTAMP(EditTime),"
- "AnsType,Shuffle,Stem,Feedback,"
- "ImageName,ImageTitle,ImageURL,"
- "NumHits,NumHitsNotBlank,Score"
+ "SELECT QstCod," // row[ 0]
+ "UNIX_TIMESTAMP(EditTime)," // row[ 1]
+ "AnsType," // row[ 2]
+ "Shuffle," // row[ 3]
+ "Stem," // row[ 4]
+ "Feedback," // row[ 5]
+ "MediaName," // row[ 6]
+ "MediaType," // row[ 7]
+ "MediaTitle," // row[ 8]
+ "MediaURL," // row[ 9]
+ "NumHits," // row[10]
+ "NumHitsNotBlank," // row[11]
+ "Score" // row[12]
" FROM tst_questions"
" WHERE QstCod=%ld",
QstCod) == 1);
@@ -2916,12 +2894,13 @@ static void Tst_ListOneOrMoreQuestionsForEdition (unsigned long NumRows,
row[ 3] Shuffle
row[ 4] Stem
row[ 5] Feedback
- row[ 6] ImageName
- row[ 7] ImageTitle
- row[ 8] ImageURL
- row[ 9] NumHits
- row[10] NumHitsNotBlank
- row[11] Score
+ row[ 6] MediaName
+ row[ 7] MediaType
+ row[ 8] MediaTitle
+ row[ 9] MediaURL
+ row[10] NumHits
+ row[11] NumHitsNotBlank
+ row[12] Score
*/
/***** Create test question *****/
Tst_QstConstructor ();
@@ -3008,13 +2987,14 @@ static void Tst_ListOneOrMoreQuestionsForEdition (unsigned long NumRows,
}
fprintf (Gbl.F.Out,"
");
- /* Write the stem (row[4]), the image (row[6], row[7], row[8]),
+ /* Write the stem (row[4]), the media (row[6], row[7], row[8], row[9]),
the feedback (row[5]) and the answers */
fprintf (Gbl.F.Out,"",
Gbl.RowEvenOdd);
Tst_WriteQstStem (row[4],"TEST_EDI");
- Img_GetImageNameTitleAndURLFromRow (row[6],row[7],row[8],&Gbl.Test.Image);
- Img_ShowImage (&Gbl.Test.Image,
+ Med_GetMediaNameTitleAndURLFromRow (row[6],row[7],row[8],row[9],
+ &Gbl.Test.Media);
+ Med_ShowMedia (&Gbl.Test.Media,
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
"TEST_IMG_EDIT_LIST_STEM");
Tst_WriteQstFeedback (row[5],"TEST_EDI_LIGHT");
@@ -3023,19 +3003,19 @@ static void Tst_ListOneOrMoreQuestionsForEdition (unsigned long NumRows,
/* Get number of hits
(number of times that the question has been answered,
- including blank answers) (row[9]) */
- if (sscanf (row[9],"%lu",&NumHitsThisQst) != 1)
+ including blank answers) (row[10]) */
+ if (sscanf (row[10],"%lu",&NumHitsThisQst) != 1)
Lay_ShowErrorAndExit ("Wrong number of hits to a question.");
/* Get number of hits not blank
(number of times that the question has been answered
- with a not blank answer) (row[10]) */
- if (sscanf (row[10],"%lu",&NumHitsNotBlankThisQst) != 1)
+ with a not blank answer) (row[11]) */
+ if (sscanf (row[11],"%lu",&NumHitsNotBlankThisQst) != 1)
Lay_ShowErrorAndExit ("Wrong number of hits not blank to a question.");
- /* Get the acumulated score of the question (row[11]) */
+ /* Get the acumulated score of the question (row[12]) */
Str_SetDecimalPointToUS (); // To get the decimal point as a dot
- if (sscanf (row[11],"%lf",&TotalScoreThisQst) != 1)
+ if (sscanf (row[12],"%lf",&TotalScoreThisQst) != 1)
Lay_ShowErrorAndExit ("Wrong score of a question.");
Str_SetDecimalPointToLocal (); // Return to local system
@@ -3169,12 +3149,13 @@ static void Tst_ListOneOrMoreQuestionsForSelection (long GamCod,
row[ 3] Shuffle
row[ 4] Stem
row[ 5] Feedback
- row[ 6] ImageName
- row[ 7] ImageTitle
- row[ 8] ImageURL
- row[ 9] NumHits
- row[10] NumHitsNotBlank
- row[11] Score
+ row[ 6] MediaName
+ row[ 7] MediaType
+ row[ 8] MediaTitle
+ row[ 9] MediaURL
+ row[10] NumHits
+ row[11] NumHitsNotBlank
+ row[12] Score
*/
/***** Create test question *****/
Tst_QstConstructor ();
@@ -3242,13 +3223,14 @@ static void Tst_ListOneOrMoreQuestionsForSelection (long GamCod,
fprintf (Gbl.F.Out," ");
- /* Write the stem (row[4]), the image (row[6], row[7], row[8]),
+ /* Write the stem (row[4]), the image (row[6], row[7], row[8], row[9]),
the feedback (row[5]) and the answers */
fprintf (Gbl.F.Out,"",
Gbl.RowEvenOdd);
Tst_WriteQstStem (row[4],"TEST_EDI");
- Img_GetImageNameTitleAndURLFromRow (row[6],row[7],row[8],&Gbl.Test.Image);
- Img_ShowImage (&Gbl.Test.Image,
+ Med_GetMediaNameTitleAndURLFromRow (row[6],row[7],row[8],row[9],
+ &Gbl.Test.Media);
+ Med_ShowMedia (&Gbl.Test.Media,
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
"TEST_IMG_EDIT_LIST_STEM");
Tst_WriteQstFeedback (row[5],"TEST_EDI_LIGHT");
@@ -3301,8 +3283,14 @@ unsigned Tst_GetAnswersQst (long QstCod,MYSQL_RES **mysql_res,bool Shuffle)
/***** Get answers of a question from database *****/
NumRows = DB_QuerySELECT (mysql_res,"can not get answers of a question",
- "SELECT AnsInd,Answer,Feedback,"
- "ImageName,ImageTitle,ImageURL,Correct"
+ "SELECT AnsInd," // row[0]
+ "Answer," // row[1]
+ "Feedback," // row[2]
+ "MediaName," // row[3]
+ "MediaType," // row[4]
+ "MediaTitle," // row[5]
+ "MediaURL," // row[6]
+ "Correct" // row[7]
" FROM tst_answers WHERE QstCod=%ld ORDER BY %s",
QstCod,
Shuffle ? "RAND(NOW())" :
@@ -3335,10 +3323,11 @@ static void Tst_WriteAnswersEdit (long QstCod)
row[ 0] AnsInd
row[ 1] Answer
row[ 2] Feedback
- row[ 3] ImageName
- row[ 4] ImageTitle
- row[ 5] ImageURL
- row[ 6] Correct
+ row[ 3] MediaName
+ row[ 4] MediaType
+ row[ 5] MediaTitle
+ row[ 6] MediaURL
+ row[ 7] Correct
*/
/***** Write the answers *****/
switch (Gbl.Test.AnswerType)
@@ -3405,13 +3394,14 @@ static void Tst_WriteAnswersEdit (long QstCod)
}
/* Copy image */
- Img_GetImageNameTitleAndURLFromRow (row[3],row[4],row[5],&Gbl.Test.Answer.Options[NumOpt].Image);
+ Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6],
+ &Gbl.Test.Answer.Options[NumOpt].Media);
/* Put an icon that indicates whether the answer is correct or wrong */
fprintf (Gbl.F.Out," "
"",
Gbl.RowEvenOdd);
- if (row[6][0] == 'Y')
+ if (row[7][0] == 'Y')
fprintf (Gbl.F.Out," ",
@@ -3431,7 +3421,7 @@ static void Tst_WriteAnswersEdit (long QstCod)
""
"%s",
Answer);
- Img_ShowImage (&Gbl.Test.Answer.Options[NumOpt].Image,
+ Med_ShowMedia (&Gbl.Test.Answer.Options[NumOpt].Media,
"TEST_IMG_EDIT_LIST_ANS_CONTAINER",
"TEST_IMG_EDIT_LIST_ANS");
fprintf (Gbl.F.Out,"
");
@@ -3508,10 +3498,11 @@ static void Tst_WriteAnswersTestResult (struct UsrData *UsrDat,
row[ 0] AnsInd
row[ 1] Answer
row[ 2] Feedback
- row[ 3] ImageName
- row[ 4] ImageTitle
- row[ 5] ImageURL
- row[ 6] Correct
+ row[ 3] MediaName
+ row[ 4] MediaType
+ row[ 5] MediaTitle
+ row[ 6] MediaURL
+ row[ 7] Correct
*/
/***** Write answer depending on type *****/
switch (Gbl.Test.AnswerType)
@@ -3622,13 +3613,14 @@ static void Tst_WriteTFAnsAssessTest (struct UsrData *UsrDat,
MYSQL_ROW row;
char AnsTF;
/*
- row[ 0] AnsInd
- row[ 1] Answer
- row[ 2] Feedback
- row[ 3] ImageName
- row[ 4] ImageTitle
- row[ 5] ImageURL
- row[ 6] Correct
+ row[0] AnsInd
+ row[1] Answer
+ row[2] Feedback
+ row[3] MediaName
+ row[4] MediaType
+ row[5] MediaTitle
+ row[6] MediaURL
+ row[7] Correct
*/
/***** Check if number of rows is correct *****/
Tst_CheckIfNumberOfAnswersIsOne ();
@@ -3716,10 +3708,11 @@ static void Tst_WriteChoiceAnsViewTest (unsigned NumQst,long QstCod,bool Shuffle
row[ 0] AnsInd
row[ 1] Answer
row[ 2] Feedback
- row[ 3] ImageName
- row[ 4] ImageTitle
- row[ 5] ImageURL
- row[ 6] Correct
+ row[ 3] MediaName
+ row[ 4] MediaType
+ row[ 5] MediaTitle
+ row[ 6] MediaURL
+ row[ 7] Correct
*/
/***** Start table *****/
@@ -3757,7 +3750,8 @@ static void Tst_WriteChoiceAnsViewTest (unsigned NumQst,long QstCod,bool Shuffle
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false);
/***** Copy image *****/
- Img_GetImageNameTitleAndURLFromRow (row[3],row[4],row[5],&Gbl.Test.Answer.Options[NumOpt].Image);
+ Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6],
+ &Gbl.Test.Answer.Options[NumOpt].Media);
/***** Write selectors and letter of this option *****/
fprintf (Gbl.F.Out," "
@@ -3792,7 +3786,7 @@ static void Tst_WriteChoiceAnsViewTest (unsigned NumQst,long QstCod,bool Shuffle
"",
NumQst,NumOpt,
Gbl.Test.Answer.Options[NumOpt].Text);
- Img_ShowImage (&Gbl.Test.Answer.Options[NumOpt].Image,
+ Med_ShowMedia (&Gbl.Test.Answer.Options[NumOpt].Media,
"TEST_IMG_SHOW_ANS_CONTAINER",
"TEST_IMG_SHOW_ANS");
fprintf (Gbl.F.Out,""
@@ -3836,13 +3830,14 @@ static void Tst_WriteChoiceAnsAssessTest (struct UsrData *UsrDat,
/***** Get text and correctness of answers for this question
from database (one row per answer) *****/
/*
- row[ 0] AnsInd
- row[ 1] Answer
- row[ 2] Feedback
- row[ 3] ImageName
- row[ 4] ImageTitle
- row[ 5] ImageURL
- row[ 6] Correct
+ row[0] AnsInd
+ row[1] Answer
+ row[2] Feedback
+ row[3] MediaName
+ row[4] MediaType
+ row[5] MediaTitle
+ row[6] MediaURL
+ row[7] Correct
*/
for (NumOpt = 0;
NumOpt < Gbl.Test.Answer.NumOptions;
@@ -3877,10 +3872,11 @@ static void Tst_WriteChoiceAnsAssessTest (struct UsrData *UsrDat,
}
/***** Copy image *****/
- Img_GetImageNameTitleAndURLFromRow (row[3],row[4],row[5],&Gbl.Test.Answer.Options[NumOpt].Image);
+ Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6],
+ &Gbl.Test.Answer.Options[NumOpt].Media);
- /***** Assign correctness (row[6]) of this answer (this option) *****/
- Gbl.Test.Answer.Options[NumOpt].Correct = (row[6][0] == 'Y');
+ /***** Assign correctness (row[7]) of this answer (this option) *****/
+ Gbl.Test.Answer.Options[NumOpt].Correct = (row[7][0] == 'Y');
}
/***** Get indexes for this question from string *****/
@@ -3979,7 +3975,7 @@ static void Tst_WriteChoiceAnsAssessTest (struct UsrData *UsrDat,
""
"%s",
Gbl.Test.Answer.Options[Indexes[NumOpt]].Text);
- Img_ShowImage (&Gbl.Test.Answer.Options[Indexes[NumOpt]].Image,
+ Med_ShowMedia (&Gbl.Test.Answer.Options[Indexes[NumOpt]].Media,
"TEST_IMG_SHOW_ANS_CONTAINER",
"TEST_IMG_SHOW_ANS");
fprintf (Gbl.F.Out,"
");
@@ -4080,13 +4076,14 @@ static void Tst_WriteChoiceAnsViewGame (struct Game *Game,
/***** Get answers of a question from database *****/
Gbl.Test.Answer.NumOptions = Tst_GetAnswersQst (QstCod,&mysql_res,false);
/*
- row[ 0] AnsInd
- row[ 1] Answer
- row[ 2] Feedback
- row[ 3] ImageName
- row[ 4] ImageTitle
- row[ 5] ImageURL
- row[ 6] Correct
+ row[0] AnsInd
+ row[1] Answer
+ row[2] Feedback
+ row[3] MediaName
+ row[4] MediaType
+ row[5] MediaTitle
+ row[6] MediaURL
+ row[7] Correct
*/
/***** Start table *****/
@@ -4124,7 +4121,8 @@ static void Tst_WriteChoiceAnsViewGame (struct Game *Game,
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false);
/***** Copy image *****/
- Img_GetImageNameTitleAndURLFromRow (row[3],row[4],row[5],&Gbl.Test.Answer.Options[NumOpt].Image);
+ Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6],
+ &Gbl.Test.Answer.Options[NumOpt].Media);
/***** Write letter of this option *****/
fprintf (Gbl.F.Out," "
@@ -4143,7 +4141,7 @@ static void Tst_WriteChoiceAnsViewGame (struct Game *Game,
"",
NumQst,NumOpt,Class,
Gbl.Test.Answer.Options[NumOpt].Text);
- Img_ShowImage (&Gbl.Test.Answer.Options[NumOpt].Image,
+ Med_ShowMedia (&Gbl.Test.Answer.Options[NumOpt].Media,
"TEST_IMG_SHOW_ANS_CONTAINER",
"TEST_IMG_SHOW_ANS");
fprintf (Gbl.F.Out,""
@@ -4198,10 +4196,11 @@ static void Tst_WriteTextAnsAssessTest (struct UsrData *UsrDat,
row[ 0] AnsInd
row[ 1] Answer
row[ 2] Feedback
- row[ 3] ImageName
- row[ 4] ImageTitle
- row[ 5] ImageURL
- row[ 6] Correct
+ row[ 3] MediaName
+ row[ 4] MediaType
+ row[ 5] MediaTitle
+ row[ 6] MediaURL
+ row[ 7] Correct
*/
/***** Get text and correctness of answers for this question from database (one row per answer) *****/
for (NumOpt = 0;
@@ -4234,8 +4233,8 @@ static void Tst_WriteTextAnsAssessTest (struct UsrData *UsrDat,
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false);
}
- /***** Assign correctness (row[6]) of this answer (this option) *****/
- Gbl.Test.Answer.Options[NumOpt].Correct = (row[6][0] == 'Y');
+ /***** Assign correctness (row[7]) of this answer (this option) *****/
+ Gbl.Test.Answer.Options[NumOpt].Correct = (row[7][0] == 'Y');
}
/***** Header with the title of each column *****/
@@ -4387,13 +4386,14 @@ static void Tst_WriteIntAnsAssessTest (struct UsrData *UsrDat,
long IntAnswerUsr;
long IntAnswerCorr;
/*
- row[ 0] AnsInd
- row[ 1] Answer
- row[ 2] Feedback
- row[ 3] ImageName
- row[ 4] ImageTitle
- row[ 5] ImageURL
- row[ 6] Correct
+ row[0] AnsInd
+ row[1] Answer
+ row[2] Feedback
+ row[3] MediaName
+ row[4] MediaType
+ row[5] MediaTitle
+ row[6] MediaURL
+ row[7] Correct
*/
/***** Check if number of rows is correct *****/
Tst_CheckIfNumberOfAnswersIsOne ();
@@ -4502,13 +4502,14 @@ static void Tst_WriteFloatAnsAssessTest (struct UsrData *UsrDat,
double FloatAnsUsr = 0.0,Tmp;
double FloatAnsCorr[2];
/*
- row[ 0] AnsInd
- row[ 1] Answer
- row[ 2] Feedback
- row[ 3] ImageName
- row[ 4] ImageTitle
- row[ 5] ImageURL
- row[ 6] Correct
+ row[0] AnsInd
+ row[1] Answer
+ row[2] Feedback
+ row[3] MediaName
+ row[4] MediaType
+ row[5] MediaTitle
+ row[6] MediaURL
+ row[7] Correct
*/
/***** Check if number of rows is correct *****/
if (Gbl.Test.Answer.NumOptions != 2)
@@ -5085,7 +5086,7 @@ static void Tst_PutFormEditOneQst (char Stem[Cns_MAX_BYTES_TEXT + 1],
The_ClassFormInBox[Gbl.Prefs.Theme],
Txt_Stem,
Stem);
- Tst_PutFormToEditQstImage (&Gbl.Test.Image,-1,
+ Tst_PutFormToEditQstMedia (&Gbl.Test.Media,-1,
"TEST_IMG_EDIT_ONE_STEM_CONTAINER",
"TEST_IMG_EDIT_ONE_STEM",
"STEM", // Title / attribution
@@ -5297,8 +5298,8 @@ static void Tst_PutFormEditOneQst (char Stem[Cns_MAX_BYTES_TEXT + 1],
fprintf (Gbl.F.Out,"%s",Gbl.Test.Answer.Options[NumOpt].Text);
fprintf (Gbl.F.Out,"");
- /* Image */
- Tst_PutFormToEditQstImage (&Gbl.Test.Answer.Options[NumOpt].Image,
+ /* Media */
+ Tst_PutFormToEditQstMedia (&Gbl.Test.Answer.Options[NumOpt].Media,
(int) NumOpt,
"TEST_IMG_EDIT_ONE_ANS_CONTAINER",
"TEST_IMG_EDIT_ONE_ANS",
@@ -5407,7 +5408,7 @@ void Tst_QstConstructor (void)
Gbl.Test.Answer.TF = ' ';
/***** Initialize image attached to stem *****/
- Img_ImageConstructor (&Gbl.Test.Image);
+ Med_MediaConstructor (&Gbl.Test.Media);
for (NumOpt = 0;
NumOpt < Tst_MAX_OPTIONS_PER_QUESTION;
@@ -5418,7 +5419,7 @@ void Tst_QstConstructor (void)
Gbl.Test.Answer.Options[NumOpt].Feedback = NULL;
/***** Initialize image attached to option *****/
- Img_ImageConstructor (&Gbl.Test.Answer.Options[NumOpt].Image);
+ Med_MediaConstructor (&Gbl.Test.Answer.Options[NumOpt].Media);
}
Gbl.Test.Answer.Integer = 0;
Gbl.Test.Answer.FloatingPoint[0] =
@@ -5432,7 +5433,7 @@ void Tst_QstConstructor (void)
void Tst_QstDestructor (void)
{
Tst_FreeTextChoiceAnswers ();
- Tst_FreeImagesOfQuestion ();
+ Tst_FreeMediaOfQuestion ();
}
/*****************************************************************************/
@@ -5501,23 +5502,23 @@ static void Tst_FreeTextChoiceAnswer (unsigned NumOpt)
/***************** Initialize images of a question to zero *******************/
/*****************************************************************************/
-static void Tst_InitImagesOfQuestion (void)
+static void Tst_InitMediaOfQuestion (void)
{
unsigned NumOpt;
/***** Initialize image *****/
- Img_ResetImageExceptTitleAndURL (&Gbl.Test.Image);
- Img_FreeImageTitle (&Gbl.Test.Image);
- Img_FreeImageURL (&Gbl.Test.Image);
+ Med_ResetMediaExceptTitleAndURL (&Gbl.Test.Media);
+ Med_FreeMediaTitle (&Gbl.Test.Media);
+ Med_FreeMediaURL (&Gbl.Test.Media);
for (NumOpt = 0;
NumOpt < Tst_MAX_OPTIONS_PER_QUESTION;
NumOpt++)
{
/***** Initialize image *****/
- Img_ResetImageExceptTitleAndURL (&Gbl.Test.Answer.Options[NumOpt].Image);
- Img_FreeImageTitle (&Gbl.Test.Image);
- Img_FreeImageURL (&Gbl.Test.Image);
+ Med_ResetMediaExceptTitleAndURL (&Gbl.Test.Answer.Options[NumOpt].Media);
+ Med_FreeMediaTitle (&Gbl.Test.Media);
+ Med_FreeMediaURL (&Gbl.Test.Media);
}
}
@@ -5525,15 +5526,15 @@ static void Tst_InitImagesOfQuestion (void)
/*********************** Free images of a question ***************************/
/*****************************************************************************/
-static void Tst_FreeImagesOfQuestion (void)
+static void Tst_FreeMediaOfQuestion (void)
{
unsigned NumOpt;
- Img_ImageDestructor (&Gbl.Test.Image);
+ Med_MediaDestructor (&Gbl.Test.Media);
for (NumOpt = 0;
NumOpt < Tst_MAX_OPTIONS_PER_QUESTION;
NumOpt++)
- Img_ImageDestructor (&Gbl.Test.Answer.Options[NumOpt].Image);
+ Med_MediaDestructor (&Gbl.Test.Answer.Options[NumOpt].Media);
}
/*****************************************************************************/
@@ -5552,22 +5553,19 @@ static void Tst_GetQstDataFromDB (char Stem[Cns_MAX_BYTES_TEXT + 1],
/***** Get the type of answer and the stem from the database *****/
/* Get the question from database */
DB_QuerySELECT (&mysql_res,"can not get a question",
- "SELECT AnsType,Shuffle,Stem,Feedback,"
- "ImageName,ImageTitle,ImageURL"
+ "SELECT AnsType," // row[0]
+ "Shuffle," // row[1]
+ "Stem," // row[2]
+ "Feedback," // row[3]
+ "MediaName," // row[4]
+ "MediaType," // row[5]
+ "MediaTitle," // row[6]
+ "MediaURL" // row[7]
" FROM tst_questions"
" WHERE QstCod=%ld AND CrsCod=%ld",
Gbl.Test.QstCod,Gbl.CurrentCrs.Crs.CrsCod);
-
row = mysql_fetch_row (mysql_res);
- /*
- row[ 0] AnsType
- row[ 1] Shuffle
- row[ 2] Stem
- row[ 3] Feedback
- row[ 4] ImageName
- row[ 5] ImageTitle
- row[ 6] ImageURL
- */
+
/* Get the type of answer */
Gbl.Test.AnswerType = Tst_ConvertFromStrAnsTypDBToAnsTyp (row[0]);
@@ -5586,8 +5584,9 @@ static void Tst_GetQstDataFromDB (char Stem[Cns_MAX_BYTES_TEXT + 1],
Cns_MAX_BYTES_TEXT);
/* Get the image name, title and URL of the question
- from the database (row[4], row[5], row[6]) */
- Img_GetImageNameTitleAndURLFromRow (row[4],row[5],row[6],&Gbl.Test.Image);
+ from the database (row[4], row[5], row[6], row[7]) */
+ Med_GetMediaNameTitleAndURLFromRow (row[4],row[5],row[6],row[7],
+ &Gbl.Test.Media);
/* Free structure that stores the query result */
DB_FreeMySQLResult (&mysql_res);
@@ -5609,13 +5608,14 @@ static void Tst_GetQstDataFromDB (char Stem[Cns_MAX_BYTES_TEXT + 1],
/***** Get the answers from the database *****/
Gbl.Test.Answer.NumOptions = Tst_GetAnswersQst (Gbl.Test.QstCod,&mysql_res,false);
/*
- row[ 0] AnsInd
- row[ 1] Answer
- row[ 2] Feedback
- row[ 3] ImageName
- row[ 4] ImageTitle
- row[ 5] ImageURL
- row[ 6] Correct
+ row[0] AnsInd
+ row[1] Answer
+ row[2] Feedback
+ row[3] MediaName
+ row[4] MediaType
+ row[5] MediaTitle
+ row[6] MediaURL
+ row[7] Correct
*/
for (NumOpt = 0;
NumOpt < Gbl.Test.Answer.NumOptions;
@@ -5657,9 +5657,10 @@ static void Tst_GetQstDataFromDB (char Stem[Cns_MAX_BYTES_TEXT + 1],
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK);
/* Copy image */
- Img_GetImageNameTitleAndURLFromRow (row[3],row[4],row[5],&Gbl.Test.Answer.Options[NumOpt].Image);
+ Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6],
+ &Gbl.Test.Answer.Options[NumOpt].Media);
- Gbl.Test.Answer.Options[NumOpt].Correct = (row[6][0] == 'Y');
+ Gbl.Test.Answer.Options[NumOpt].Correct = (row[7][0] == 'Y');
break;
default:
break;
@@ -5675,7 +5676,7 @@ static void Tst_GetQstDataFromDB (char Stem[Cns_MAX_BYTES_TEXT + 1],
// NumOpt < 0 ==> image associated to stem
// NumOpt >= 0 ==> image associated to answer
-static void Tst_GetImageFromDB (int NumOpt,struct Image *Image)
+static void Tst_GetMediaFromDB (int NumOpt,struct Media *Media)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
@@ -5684,20 +5685,30 @@ static void Tst_GetImageFromDB (int NumOpt,struct Image *Image)
if (NumOpt < 0)
// Get image associated to stem
DB_QuerySELECT (&mysql_res,"can not get image name",
- "SELECT ImageName,ImageTitle,ImageURL FROM tst_questions"
+ "SELECT MediaName," // row[0]
+ "MediaType," // row[1]
+ "MediaTitle," // row[2]
+ "MediaURL" // row[3]
+ " FROM tst_questions"
" WHERE QstCod=%ld AND CrsCod=%ld",
Gbl.Test.QstCod,Gbl.CurrentCrs.Crs.CrsCod);
else
// Get image associated to answer
DB_QuerySELECT (&mysql_res,"can not get image name",
- "SELECT ImageName,ImageTitle,ImageURL FROM tst_answers"
+ "SELECT MediaName," // row[0]
+ "MediaType," // row[1]
+ "MediaTitle," // row[2]
+ "MediaURL" // row[3]
+ " FROM tst_answers"
" WHERE QstCod=%ld AND AnsInd=%u",
Gbl.Test.QstCod,(unsigned) NumOpt);
row = mysql_fetch_row (mysql_res);
- /***** Get the image name, title and URL (row[0], row[1], row[2]) *****/
- Img_GetImageNameTitleAndURLFromRow (row[0],row[1],row[2],Image);
+ /***** Get the image name, type, title and URL
+ (row[0], row[1], row[2], row[3]) *****/
+ Med_GetMediaNameTitleAndURLFromRow (row[0],row[1],row[2],row[3],
+ Media);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
@@ -5757,7 +5768,7 @@ void Tst_ReceiveQst (void)
if (Tst_CheckIfQstFormatIsCorrectAndCountNumOptions ())
{
/***** Move images to definitive directories *****/
- Tst_MoveImagesToDefinitiveDirectories ();
+ Tst_MoveMediaToDefinitiveDirectories ();
/***** Insert or update question, tags and answer in the database *****/
Tst_InsertOrUpdateQstTagsAnsIntoDB ();
@@ -5768,7 +5779,7 @@ void Tst_ReceiveQst (void)
else // Question is wrong
{
/***** Whether images has been received or not, reset images *****/
- Tst_InitImagesOfQuestion ();
+ Tst_InitMediaOfQuestion ();
/***** Put form to edit question again *****/
Tst_PutFormEditOneQst (Stem,Feedback);
@@ -5841,11 +5852,11 @@ static void Tst_GetQstFromForm (char *Stem,char *Feedback)
Par_GetParToHTML ("Feedback",Feedback,Cns_MAX_BYTES_TEXT);
/***** Get image associated to the stem (action, file and title) *****/
- Gbl.Test.Image.Width = Tst_IMAGE_SAVED_MAX_WIDTH;
- Gbl.Test.Image.Height = Tst_IMAGE_SAVED_MAX_HEIGHT;
- Gbl.Test.Image.Quality = Tst_IMAGE_SAVED_QUALITY;
- Img_GetImageFromForm (-1, // < 0 ==> the image associated to the stem
- &Gbl.Test.Image,Tst_GetImageFromDB);
+ Gbl.Test.Media.Width = Tst_IMAGE_SAVED_MAX_WIDTH;
+ Gbl.Test.Media.Height = Tst_IMAGE_SAVED_MAX_HEIGHT;
+ Gbl.Test.Media.Quality = Tst_IMAGE_SAVED_QUALITY;
+ Med_GetMediaFromForm (-1, // < 0 ==> the image associated to the stem
+ &Gbl.Test.Media,Tst_GetMediaFromDB);
/***** Get answers *****/
Gbl.Test.Shuffle = false;
@@ -5909,12 +5920,12 @@ static void Tst_GetQstFromForm (char *Stem,char *Feedback)
if (Gbl.Test.AnswerType == Tst_ANS_UNIQUE_CHOICE ||
Gbl.Test.AnswerType == Tst_ANS_MULTIPLE_CHOICE)
{
- Gbl.Test.Answer.Options[NumOpt].Image.Width = Tst_IMAGE_SAVED_MAX_WIDTH;
- Gbl.Test.Answer.Options[NumOpt].Image.Height = Tst_IMAGE_SAVED_MAX_HEIGHT;
- Gbl.Test.Answer.Options[NumOpt].Image.Quality = Tst_IMAGE_SAVED_QUALITY;
- Img_GetImageFromForm ((int) NumOpt, // >= 0 ==> the image associated to an answer
- &Gbl.Test.Answer.Options[NumOpt].Image,
- Tst_GetImageFromDB);
+ Gbl.Test.Answer.Options[NumOpt].Media.Width = Tst_IMAGE_SAVED_MAX_WIDTH;
+ Gbl.Test.Answer.Options[NumOpt].Media.Height = Tst_IMAGE_SAVED_MAX_HEIGHT;
+ Gbl.Test.Answer.Options[NumOpt].Media.Quality = Tst_IMAGE_SAVED_QUALITY;
+ Med_GetMediaFromForm ((int) NumOpt, // >= 0 ==> the image associated to an answer
+ &Gbl.Test.Answer.Options[NumOpt].Media,
+ Tst_GetMediaFromDB);
}
}
@@ -5989,9 +6000,9 @@ bool Tst_CheckIfQstFormatIsCorrectAndCountNumOptions (void)
bool ThereIsEndOfAnswers;
unsigned i;
- if ((Gbl.Test.Image.Action == Img_ACTION_NEW_IMAGE || // Upload new image
- Gbl.Test.Image.Action == Img_ACTION_CHANGE_IMAGE) && // Replace existing image by new image
- Gbl.Test.Image.Status != Img_FILE_PROCESSED)
+ if ((Gbl.Test.Media.Action == Med_ACTION_NEW_MEDIA || // Upload new image
+ Gbl.Test.Media.Action == Med_ACTION_CHANGE_MEDIA) && // Replace existing image by new image
+ Gbl.Test.Media.Status != Med_FILE_PROCESSED)
{
Ale_ShowAlert (Ale_WARNING,Txt_Error_receiving_or_processing_image);
return false;
@@ -6159,23 +6170,23 @@ bool Tst_CheckIfQstFormatIsCorrectAndCountNumOptions (void)
/* Move images associates to a test question to their definitive directories */
/*****************************************************************************/
-static void Tst_MoveImagesToDefinitiveDirectories (void)
+static void Tst_MoveMediaToDefinitiveDirectories (void)
{
unsigned NumOpt;
/****** Move image associated to question stem *****/
if (Gbl.Test.QstCod > 0 && // Question already exists
- Gbl.Test.Image.Action != Img_ACTION_KEEP_IMAGE) // Don't keep the current image
+ Gbl.Test.Media.Action != Med_ACTION_KEEP_MEDIA) // Don't keep the current image
/* Remove possible file with the old image
(the new image file is already processed
and moved to the definitive directory) */
Tst_RemoveImgFileFromStemOfQst (Gbl.CurrentCrs.Crs.CrsCod,Gbl.Test.QstCod);
- if ((Gbl.Test.Image.Action == Img_ACTION_NEW_IMAGE || // Upload new image
- Gbl.Test.Image.Action == Img_ACTION_CHANGE_IMAGE) && // Replace existing image by new image
- Gbl.Test.Image.Status == Img_FILE_PROCESSED) // The new image received has been processed
+ if ((Gbl.Test.Media.Action == Med_ACTION_NEW_MEDIA || // Upload new image
+ Gbl.Test.Media.Action == Med_ACTION_CHANGE_MEDIA) && // Replace existing image by new image
+ Gbl.Test.Media.Status == Med_FILE_PROCESSED) // The new image received has been processed
/* Move processed image to definitive directory */
- Img_MoveImageToDefinitiveDirectory (&Gbl.Test.Image);
+ Med_MoveMediaToDefinitiveDirectory (&Gbl.Test.Media);
/****** Move images associated to answers *****/
if (Gbl.Test.AnswerType == Tst_ANS_UNIQUE_CHOICE ||
@@ -6185,17 +6196,17 @@ static void Tst_MoveImagesToDefinitiveDirectories (void)
NumOpt++)
{
if (Gbl.Test.QstCod > 0 && // Question already exists
- Gbl.Test.Answer.Options[NumOpt].Image.Action != Img_ACTION_KEEP_IMAGE) // Don't keep the current image
+ Gbl.Test.Answer.Options[NumOpt].Media.Action != Med_ACTION_KEEP_MEDIA) // Don't keep the current image
/* Remove possible file with the old image
(the new image file is already processed
and moved to the definitive directory) */
Tst_RemoveImgFileFromAnsOfQst (Gbl.CurrentCrs.Crs.CrsCod,Gbl.Test.QstCod,NumOpt);
- if ((Gbl.Test.Answer.Options[NumOpt].Image.Action == Img_ACTION_NEW_IMAGE || // Upload new image
- Gbl.Test.Answer.Options[NumOpt].Image.Action == Img_ACTION_CHANGE_IMAGE) && // Replace existing image by new image
- Gbl.Test.Answer.Options[NumOpt].Image.Status == Img_FILE_PROCESSED) // The new image received has been processed
+ if ((Gbl.Test.Answer.Options[NumOpt].Media.Action == Med_ACTION_NEW_MEDIA || // Upload new image
+ Gbl.Test.Answer.Options[NumOpt].Media.Action == Med_ACTION_CHANGE_MEDIA) && // Replace existing image by new image
+ Gbl.Test.Answer.Options[NumOpt].Media.Status == Med_FILE_PROCESSED) // The new image received has been processed
/* Move processed image to definitive directory */
- Img_MoveImageToDefinitiveDirectory (&Gbl.Test.Answer.Options[NumOpt].Image);
+ Med_MoveMediaToDefinitiveDirectory (&Gbl.Test.Answer.Options[NumOpt].Media);
}
}
@@ -6534,11 +6545,13 @@ static void Tst_InsertOrUpdateQstIntoDB (void)
DB_QueryINSERTandReturnCode ("can not create question",
"INSERT INTO tst_questions"
" (CrsCod,EditTime,AnsType,Shuffle,"
- "Stem,Feedback,ImageName,ImageTitle,ImageURL,"
+ "Stem,Feedback,"
+ "MediaName,MediaType,MediaTitle,MediaURL,"
"NumHits,Score)"
" VALUES"
" (%ld,NOW(),'%s','%c',"
- "'%s','%s','%s','%s','%s',"
+ "'%s','%s',"
+ "'%s','%s','%s','%s',"
"0,0)",
Gbl.CurrentCrs.Crs.CrsCod,
Tst_StrAnswerTypesDB[Gbl.Test.AnswerType],
@@ -6546,13 +6559,14 @@ static void Tst_InsertOrUpdateQstIntoDB (void)
'N',
Gbl.Test.Stem.Text,
Gbl.Test.Feedback.Text ? Gbl.Test.Feedback.Text : "",
- Gbl.Test.Image.Name,
- Gbl.Test.Image.Title ? Gbl.Test.Image.Title : "",
- Gbl.Test.Image.URL ? Gbl.Test.Image.URL : "");
+ Gbl.Test.Media.Name,
+ Med_GetStringTypeForDB (Gbl.Test.Media.Type),
+ Gbl.Test.Media.Title ? Gbl.Test.Media.Title : "",
+ Gbl.Test.Media.URL ? Gbl.Test.Media.URL : "");
/* Update image status */
- if (Gbl.Test.Image.Name[0])
- Gbl.Test.Image.Status = Img_NAME_STORED_IN_DB;
+ if (Gbl.Test.Media.Name[0])
+ Gbl.Test.Media.Status = Med_NAME_STORED_IN_DB;
}
else // It's an existing question
{
@@ -6562,21 +6576,22 @@ static void Tst_InsertOrUpdateQstIntoDB (void)
"UPDATE tst_questions"
" SET EditTime=NOW(),AnsType='%s',Shuffle='%c',"
"Stem='%s',Feedback='%s',"
- "ImageName='%s',ImageTitle='%s',ImageURL='%s'"
+ "MediaName='%s',MediaType='%s',MediaTitle='%s',MediaURL='%s'"
" WHERE QstCod=%ld AND CrsCod=%ld",
Tst_StrAnswerTypesDB[Gbl.Test.AnswerType],
Gbl.Test.Shuffle ? 'Y' :
'N',
Gbl.Test.Stem.Text,
Gbl.Test.Feedback.Text ? Gbl.Test.Feedback.Text : "",
- Gbl.Test.Image.Name,
- Gbl.Test.Image.Title ? Gbl.Test.Image.Title : "",
- Gbl.Test.Image.URL ? Gbl.Test.Image.URL : "",
+ Gbl.Test.Media.Name,
+ Med_GetStringTypeForDB (Gbl.Test.Media.Type),
+ Gbl.Test.Media.Title ? Gbl.Test.Media.Title : "",
+ Gbl.Test.Media.URL ? Gbl.Test.Media.URL : "",
Gbl.Test.QstCod,Gbl.CurrentCrs.Crs.CrsCod);
/* Update image status */
- if (Gbl.Test.Image.Name[0])
- Gbl.Test.Image.Status = Img_NAME_STORED_IN_DB;
+ if (Gbl.Test.Media.Name[0])
+ Gbl.Test.Media.Status = Med_NAME_STORED_IN_DB;
/* Remove answers and tags from this test question */
Tst_RemAnsFromQst ();
@@ -6630,8 +6645,8 @@ static void Tst_InsertAnswersIntoDB (void)
/***** Allocate space for query *****/
if ((Query = (char *) malloc (256 +
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK * 2 +
- Img_BYTES_NAME +
- Img_MAX_BYTES_TITLE +
+ Med_BYTES_NAME +
+ Med_MAX_BYTES_TITLE +
Cns_MAX_BYTES_WWW)) == NULL)
Lay_NotEnoughMemoryExit ();
@@ -6642,9 +6657,10 @@ static void Tst_InsertAnswersIntoDB (void)
DB_QueryINSERT ("can not create answer",
"INSERT INTO tst_answers"
" (QstCod,AnsInd,Answer,Feedback,"
- "ImageName,ImageTitle,ImageURL,Correct)"
+ "MediaName,MediaType,MediaTitle,MediaURL,Correct)"
" VALUES"
- " (%ld,0,%ld,'','','','','Y')",
+ " (%ld,0,%ld,'',"
+ "'','','','','Y')",
Gbl.Test.QstCod,
Gbl.Test.Answer.Integer);
break;
@@ -6656,9 +6672,10 @@ static void Tst_InsertAnswersIntoDB (void)
DB_QueryINSERT ("can not create answer",
"INSERT INTO tst_answers"
" (QstCod,AnsInd,Answer,Feedback,"
- "ImageName,ImageTitle,ImageURL,Correct)"
+ "MediaName,MediaType,MediaTitle,MediaURL,Correct)"
" VALUES"
- " (%ld,%u,'%lg','','','','','Y')",
+ " (%ld,%u,'%lg','',"
+ "'','','','','Y')",
Gbl.Test.QstCod,i,
Gbl.Test.Answer.FloatingPoint[i]);
Str_SetDecimalPointToLocal (); // Return to local system
@@ -6667,9 +6684,10 @@ static void Tst_InsertAnswersIntoDB (void)
DB_QueryINSERT ("can not create answer",
"INSERT INTO tst_answers"
" (QstCod,AnsInd,Answer,Feedback,"
- "ImageName,ImageTitle,ImageURL,Correct)"
+ "MediaName,Mediatype,MediaTitle,MediaURL,Correct)"
" VALUES"
- " (%ld,0,'%c','','','','','Y')",
+ " (%ld,0,'%c','',"
+ "'','','','','Y')",
Gbl.Test.QstCod,
Gbl.Test.Answer.TF);
break;
@@ -6684,21 +6702,23 @@ static void Tst_InsertAnswersIntoDB (void)
DB_QueryINSERT ("can not create answer",
"INSERT INTO tst_answers"
" (QstCod,AnsInd,Answer,Feedback,"
- "ImageName,ImageTitle,ImageURL,Correct)"
+ "MediaName,MediaType,MediaTitle,MediaURL,Correct)"
" VALUES"
- " (%ld,%u,'%s','%s','%s','%s','%s','%c')",
+ " (%ld,%u,'%s','%s',"
+ "'%s','%s','%s','%s','%c')",
Gbl.Test.QstCod,NumOpt,
Gbl.Test.Answer.Options[NumOpt].Text,
Gbl.Test.Answer.Options[NumOpt].Feedback ? Gbl.Test.Answer.Options[NumOpt].Feedback : "",
- Gbl.Test.Answer.Options[NumOpt].Image.Name,
- Gbl.Test.Answer.Options[NumOpt].Image.Title ? Gbl.Test.Answer.Options[NumOpt].Image.Title : "",
- Gbl.Test.Answer.Options[NumOpt].Image.URL ? Gbl.Test.Answer.Options[NumOpt].Image.URL : "",
+ Gbl.Test.Answer.Options[NumOpt].Media.Name,
+ Med_GetStringTypeForDB (Gbl.Test.Answer.Options[NumOpt].Media.Type),
+ Gbl.Test.Answer.Options[NumOpt].Media.Title ? Gbl.Test.Answer.Options[NumOpt].Media.Title : "",
+ Gbl.Test.Answer.Options[NumOpt].Media.URL ? Gbl.Test.Answer.Options[NumOpt].Media.URL : "",
Gbl.Test.Answer.Options[NumOpt].Correct ? 'Y' :
'N');
/* Update image status */
- if (Gbl.Test.Answer.Options[NumOpt].Image.Name[0])
- Gbl.Test.Answer.Options[NumOpt].Image.Status = Img_NAME_STORED_IN_DB;
+ if (Gbl.Test.Answer.Options[NumOpt].Media.Name[0])
+ Gbl.Test.Answer.Options[NumOpt].Media.Status = Med_NAME_STORED_IN_DB;
}
break;
default:
@@ -6758,20 +6778,16 @@ static void Tst_RemoveUnusedTagsFromCurrentCrs (void)
static void Tst_RemoveImgFileFromStemOfQst (long CrsCod,long QstCod)
{
MYSQL_RES *mysql_res;
- MYSQL_ROW row;
- /***** Get names of images associated to stems of test questions from database *****/
+ /***** Get names of media files associated to stems of test questions from database *****/
if (DB_QuerySELECT (&mysql_res,"can not get image",
- "SELECT ImageName FROM tst_questions"
+ "SELECT MediaName," // row[0]
+ "MediaType" // row[1]
+ " FROM tst_questions"
" WHERE QstCod=%ld AND CrsCod=%ld",
QstCod,CrsCod))
- {
- /***** Get image name (row[0]) *****/
- row = mysql_fetch_row (mysql_res);
-
- /***** Remove image file *****/
- Img_RemoveImageFile (row[0]);
- }
+ /***** Remove media file *****/
+ Med_RemoveMediaFileFromRow (mysql_res);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
@@ -6785,28 +6801,19 @@ static void Tst_RemoveImgFileFromStemOfQst (long CrsCod,long QstCod)
static void Tst_RemoveAllImgFilesFromStemOfAllQstsInCrs (long CrsCod)
{
MYSQL_RES *mysql_res;
- MYSQL_ROW row;
- unsigned NumImages;
- unsigned NumImg;
+ unsigned NumMedia;
/***** Get names of images associated to stems of test questions from database *****/
- NumImages =
+ NumMedia =
(unsigned) DB_QuerySELECT (&mysql_res,"can not get images",
- "SELECT ImageName FROM tst_questions"
+ "SELECT MediaName," // row[0]
+ "MediaType" // row[1]
+ " FROM tst_questions"
" WHERE CrsCod=%ld",
CrsCod);
- /***** Go over result removing image files *****/
- for (NumImg = 0;
- NumImg < NumImages;
- NumImg++)
- {
- /***** Get image name (row[0]) *****/
- row = mysql_fetch_row (mysql_res);
-
- /***** Remove image file *****/
- Img_RemoveImageFile (row[0]);
- }
+ /***** Go over result removing media files *****/
+ Med_RemoveMediaFilesFromAllRows (NumMedia,mysql_res);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
@@ -6819,11 +6826,11 @@ static void Tst_RemoveAllImgFilesFromStemOfAllQstsInCrs (long CrsCod)
static void Tst_RemoveImgFileFromAnsOfQst (long CrsCod,long QstCod,unsigned AnsInd)
{
MYSQL_RES *mysql_res;
- MYSQL_ROW row;
- /***** Get names of images associated to answers of test questions from database *****/
+ /***** Get names of media files associated to answers of test questions from database *****/
if (DB_QuerySELECT (&mysql_res,"can not get images",
- "SELECT tst_answers.ImageName"
+ "SELECT tst_answers.MediaName," // row[0]
+ "tst_answers.MediaType" // row[1]
" FROM tst_questions,tst_answers"
" WHERE tst_questions.CrsCod=%ld" // Extra check
" AND tst_questions.QstCod=%ld" // Extra check
@@ -6831,13 +6838,8 @@ static void Tst_RemoveImgFileFromAnsOfQst (long CrsCod,long QstCod,unsigned AnsI
" AND tst_answers.QstCod=%ld"
" AND tst_answers.AnsInd=%u",
CrsCod,QstCod,QstCod,AnsInd))
- {
- /***** Get image name (row[0]) *****/
- row = mysql_fetch_row (mysql_res);
-
- /***** Remove image file *****/
- Img_RemoveImageFile (row[0]);
- }
+ /***** Remove media file *****/
+ Med_RemoveMediaFileFromRow (mysql_res);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
@@ -6850,14 +6852,13 @@ static void Tst_RemoveImgFileFromAnsOfQst (long CrsCod,long QstCod,unsigned AnsI
static void Tst_RemoveAllImgFilesFromAnsOfQst (long CrsCod,long QstCod)
{
MYSQL_RES *mysql_res;
- MYSQL_ROW row;
- unsigned NumImages;
- unsigned NumImg;
+ unsigned NumMedia;
- /***** Get names of images associated to answers of test questions from database *****/
- NumImages =
+ /***** Get names of media files associated to answers of test questions from database *****/
+ NumMedia =
(unsigned) DB_QuerySELECT (&mysql_res,"can not get images",
- "SELECT tst_answers.ImageName"
+ "SELECT tst_answers.MediaName," // row[0]
+ "tst_answers.MediaType" // row[1]
" FROM tst_questions,tst_answers"
" WHERE tst_questions.CrsCod=%ld" // Extra check
" AND tst_questions.QstCod=%ld" // Extra check
@@ -6865,54 +6866,35 @@ static void Tst_RemoveAllImgFilesFromAnsOfQst (long CrsCod,long QstCod)
" AND tst_answers.QstCod=%ld",
CrsCod,QstCod,QstCod);
- /***** Go over result removing image files *****/
- for (NumImg = 0;
- NumImg < NumImages;
- NumImg++)
- {
- /***** Get image name (row[0]) *****/
- row = mysql_fetch_row (mysql_res);
-
- /***** Remove image file *****/
- Img_RemoveImageFile (row[0]);
- }
+ /***** Go over result removing media files *****/
+ Med_RemoveMediaFilesFromAllRows (NumMedia,mysql_res);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
}
/*****************************************************************************/
-/** Remove all image files associated to all answers of all test questions ***/
+/** Remove all media files associated to all answers of all test questions ***/
/** in a course ***/
/*****************************************************************************/
static void Tst_RemoveAllImgFilesFromAnsOfAllQstsInCrs (long CrsCod)
{
MYSQL_RES *mysql_res;
- MYSQL_ROW row;
- unsigned NumImages;
- unsigned NumImg;
+ unsigned NumMedia;
- /***** Get names of images associated to answers of test questions from database *****/
- NumImages =
+ /***** Get names of media files associated to answers of test questions from database *****/
+ NumMedia =
(unsigned) DB_QuerySELECT (&mysql_res,"can not get images",
- "SELECT tst_answers.ImageName"
+ "SELECT tst_answers.MediaName," // row[0]
+ "tst_answers.MediaType" // row[1]
" FROM tst_questions,tst_answers"
" WHERE tst_questions.CrsCod=%ld"
" AND tst_questions.QstCod=tst_answers.QstCod",
CrsCod);
- /***** Go over result removing image files *****/
- for (NumImg = 0;
- NumImg < NumImages;
- NumImg++)
- {
- /***** Get image name (row[0]) *****/
- row = mysql_fetch_row (mysql_res);
-
- /***** Remove image file *****/
- Img_RemoveImageFile (row[0]);
- }
+ /***** Go over result removing media files *****/
+ Med_RemoveMediaFilesFromAllRows (NumMedia,mysql_res);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
@@ -8363,12 +8345,13 @@ static void Tst_ShowTestResult (time_t TstTimeUTC)
row[ 3] Shuffle
row[ 4] Stem
row[ 5] Feedback
- row[ 6] ImageName
- row[ 7] ImageTitle
- row[ 8] ImageURL
- row[ 9] NumHits
- row[10] NumHitsNotBlank
- row[11] Score
+ row[ 6] MediaName
+ row[ 7] MediaType
+ row[ 8] MediaTitle
+ row[ 9] MediaURL
+ row[10] NumHits
+ row[11] NumHitsNotBlank
+ row[12] Score
*/
/***** If this question has been edited later than test time
==> don't show question ****/
diff --git a/swad_test_import.c b/swad_test_import.c
index 117f59b1..7c8afedd 100644
--- a/swad_test_import.c
+++ b/swad_test_import.c
@@ -200,12 +200,13 @@ void TsI_CreateXML (unsigned long NumRows,MYSQL_RES *mysql_res)
row[ 3] Shuffle
row[ 4] Stem
row[ 5] Feedback
- row[ 6] ImageName
- row[ 7] ImageTitle
- row[ 8] ImageURL
- row[ 9] NumHits
- row[10] NumHitsNotBlank
- row[11] Score
+ row[ 6] MediaName
+ row[ 7] MediaType
+ row[ 8] MediaTitle
+ row[ 9] MediaURL
+ row[10] NumHits
+ row[11] NumHitsNotBlank
+ row[12] Score
*/
/* row[0] holds the code of the question */
if ((QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
@@ -309,13 +310,14 @@ static void TsI_WriteAnswersOfAQstXML (long QstCod)
Gbl.Test.Answer.NumOptions = Tst_GetAnswersQst (QstCod,&mysql_res,false); // Result: AnsInd,Answer,Correct
/*
- row[ 0] AnsInd
- row[ 1] Answer
- row[ 2] Feedback
- row[ 3] ImageName
- row[ 4] ImageTitle
- row[ 5] ImageURL
- row[ 6] Correct
+ row[0] AnsInd
+ row[1] Answer
+ row[2] Feedback
+ row[3] MediaName
+ row[4] MediaType
+ row[5] MediaTitle
+ row[6] MediaURL
+ row[7] Correct
*/
/***** Write the answers *****/
switch (Gbl.Test.AnswerType)
@@ -365,7 +367,7 @@ static void TsI_WriteAnswersOfAQstXML (long QstCod)
fprintf (Gbl.Test.XML.FileXML,"%s"
"%s %s",
diff --git a/swad_web_service.c b/swad_web_service.c
index 37bce192..d7251033 100644
--- a/swad_web_service.c
+++ b/swad_web_service.c
@@ -3446,9 +3446,11 @@ static int Svc_SendMessageToUsr (long OriginalMsgCod,
NewMsgCod =
DB_QueryINSERTandReturnCode ("can not create message",
"INSERT INTO msg_content"
- " (Subject,Content,ImageName,ImageTitle,ImageURL)"
+ " (Subject,Content,"
+ "MediaName,MediaType,MediaTitle,MediaURL)"
" VALUES"
- " ('%s','%s','','','')",
+ " ('%s','%s',"
+ "'','','','')",
Subject,Content);
/* Insert message in sent messages */