mirror of https://github.com/acanas/swad-core.git
Version 18.63
This commit is contained in:
parent
2f5773f810
commit
97610ac7b7
7
Makefile
7
Makefile
|
@ -40,11 +40,10 @@ OBJS = swad_account.o swad_action.o swad_agenda.o swad_alert.o \
|
||||||
swad_forum.o \
|
swad_forum.o \
|
||||||
swad_game.o swad_global.o swad_group.o \
|
swad_game.o swad_global.o swad_group.o \
|
||||||
swad_help.o swad_hierarchy.o swad_holiday.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_icon.o swad_ID.o swad_indicator.o swad_info.o swad_institution.o \
|
||||||
swad_institution.o \
|
|
||||||
swad_language.o swad_layout.o swad_link.o swad_logo.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_mail.o swad_main.o swad_mark.o swad_media.o swad_menu.o \
|
||||||
swad_MFU.o \
|
swad_message.o swad_MFU.o \
|
||||||
swad_network.o swad_nickname.o swad_notice.o swad_notification.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_pagination.o swad_parameter.o swad_password.o swad_photo.o \
|
||||||
swad_place.o swad_plugin.o swad_preference.o swad_privacy.o \
|
swad_place.o swad_plugin.o swad_preference.o swad_privacy.o \
|
||||||
|
|
|
@ -2676,28 +2676,28 @@ a:hover img.CENTRE_PHOTO_SHOW
|
||||||
opacity:0.3;
|
opacity:0.3;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************** Image uploading ******************************/
|
/*********************** Media (image/video) uploading ***********************/
|
||||||
.IMG_UPLOAD_CONTAINER
|
.MED_UPL_CON /* Upload container */
|
||||||
{
|
{
|
||||||
vertical-align:top;
|
vertical-align:top;
|
||||||
margin-bottom:10px;
|
margin-bottom:10px;
|
||||||
}
|
}
|
||||||
.IMG_UPLOAD_BUTTON
|
.MED_UPL_BUT /* Upload button _*/
|
||||||
{
|
{
|
||||||
cursor:pointer;
|
cursor:pointer;
|
||||||
}
|
}
|
||||||
.IMG_UPLOAD_ICO
|
.MED_UPL_ICO /* Upload icon */
|
||||||
{
|
{
|
||||||
width:16px;
|
width:16px;
|
||||||
height:16px;
|
height:16px;
|
||||||
margin:0 5px;
|
margin:0 5px;
|
||||||
vertical-align:middle;
|
vertical-align:middle;
|
||||||
}
|
}
|
||||||
.IMG_UPLOAD_FILE
|
.MED_UPL_FIL /* Upload file */
|
||||||
{
|
{
|
||||||
display:none;
|
display:none;
|
||||||
}
|
}
|
||||||
.IMG_UPLOAD_FILENAME
|
.MED_UPL_NAM /* Upload filename */
|
||||||
{
|
{
|
||||||
color:#808080;
|
color:#808080;
|
||||||
font-size:12pt;
|
font-size:12pt;
|
||||||
|
|
|
@ -1052,10 +1052,10 @@ function enableDisableImgAns (elem, isDisabled) {
|
||||||
var Tst_MAX_OPTIONS_PER_QUESTION = 10;
|
var Tst_MAX_OPTIONS_PER_QUESTION = 10;
|
||||||
|
|
||||||
for (var i = 0; i < Tst_MAX_OPTIONS_PER_QUESTION; i++)
|
for (var i = 0; i < Tst_MAX_OPTIONS_PER_QUESTION; i++)
|
||||||
if (elem.name == ('ImgAct' + i) ||
|
if (elem.name == ('MedAct' + i) ||
|
||||||
elem.name == ('ImgFil' + i) ||
|
elem.name == ('MedFil' + i) ||
|
||||||
elem.name == ('ImgTit' + i) ||
|
elem.name == ('MedTit' + i) ||
|
||||||
elem.name == ('ImgURL' + i))
|
elem.name == ('MedURL' + i))
|
||||||
elem.disabled = isDisabled;
|
elem.disabled = isDisabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1079,7 +1079,7 @@ function disableDetailedClicks () {
|
||||||
/************************** Upload images in a form **************************/
|
/************************** 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 + '_fil').innerHTML = inputFile.value; // Display image filename
|
||||||
document.getElementById(id + '_tit_url').style.display = ''; // Show hidden fields
|
document.getElementById(id + '_tit_url').style.display = ''; // Show hidden fields
|
||||||
}
|
}
|
||||||
|
|
|
@ -2381,13 +2381,13 @@ void Ctr_ReceivePhoto (void)
|
||||||
/* Create private directory for images if it does not exist */
|
/* Create private directory for images if it does not exist */
|
||||||
snprintf (PathImgPriv,sizeof (PathImgPriv),
|
snprintf (PathImgPriv,sizeof (PathImgPriv),
|
||||||
"%s/%s",
|
"%s/%s",
|
||||||
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG);
|
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA);
|
||||||
Fil_CreateDirIfNotExists (PathImgPriv);
|
Fil_CreateDirIfNotExists (PathImgPriv);
|
||||||
|
|
||||||
/* Create temporary private directory for images if it does not exist */
|
/* Create temporary private directory for images if it does not exist */
|
||||||
snprintf (PathImgPriv,sizeof (PathImgPriv),
|
snprintf (PathImgPriv,sizeof (PathImgPriv),
|
||||||
"%s/%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);
|
||||||
Fil_CreateDirIfNotExists (PathImgPriv);
|
Fil_CreateDirIfNotExists (PathImgPriv);
|
||||||
|
|
||||||
/* Get filename extension */
|
/* Get filename extension */
|
||||||
|
@ -2407,7 +2407,7 @@ void Ctr_ReceivePhoto (void)
|
||||||
/* End the reception of image in a temporary file */
|
/* End the reception of image in a temporary file */
|
||||||
snprintf (FileNameImgTmp,sizeof (FileNameImgTmp),
|
snprintf (FileNameImgTmp,sizeof (FileNameImgTmp),
|
||||||
"%s/%s/%s/%s.%s",
|
"%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);
|
Gbl.UniqueNameEncrypted,PtrExtension);
|
||||||
if (!Fil_EndReceptionOfFile (FileNameImgTmp,Param))
|
if (!Fil_EndReceptionOfFile (FileNameImgTmp,Param))
|
||||||
{
|
{
|
||||||
|
@ -2476,11 +2476,11 @@ void Ctr_ReceivePhoto (void)
|
||||||
|
|
||||||
void Ctr_ChangeCtrPhotoAttribution (void)
|
void Ctr_ChangeCtrPhotoAttribution (void)
|
||||||
{
|
{
|
||||||
char NewPhotoAttribution[Img_MAX_BYTES_ATTRIBUTION + 1];
|
char NewPhotoAttribution[Med_MAX_BYTES_ATTRIBUTION + 1];
|
||||||
|
|
||||||
/***** Get parameters from form *****/
|
/***** Get parameters from form *****/
|
||||||
/* Get the new photo attribution for the centre */
|
/* 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 *****/
|
/***** Update the table changing old attribution by new attribution *****/
|
||||||
DB_QueryUPDATE ("can not update the photo attribution"
|
DB_QueryUPDATE ("can not update the photo attribution"
|
||||||
|
|
|
@ -430,10 +430,48 @@ En OpenSWAD:
|
||||||
ps2pdf source.ps destination.pdf
|
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 CSS_FILE "swad18.61.css"
|
||||||
#define JS_FILE "swad18.62.js"
|
#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.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.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)
|
Version 18.60.5: Feb 26, 2019 Changes in CSS for responsive design in timeline. (237788 lines)
|
||||||
|
|
|
@ -363,8 +363,8 @@
|
||||||
/* Folder for compression of assignments and works into a zip files, inside private swad directory */
|
/* 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
|
#define Cfg_FOLDER_ZIP "zip" // Created automatically the first time it is accessed
|
||||||
|
|
||||||
/* Folders for images inside public and private swad directories */
|
/* Folders for images/videos inside public and private swad directories */
|
||||||
#define Cfg_FOLDER_IMG "img" // Created automatically the first time it is accessed
|
#define Cfg_FOLDER_MEDIA "med" // Created automatically the first time it is accessed
|
||||||
/* Folders for temporary users' photos inside photos directories */
|
/* Folders for temporary users' photos inside photos directories */
|
||||||
#define Cfg_FOLDER_IMG_TMP "tmp" // Created automatically the first time it is accessed
|
#define Cfg_FOLDER_IMG_TMP "tmp" // Created automatically the first time it is accessed
|
||||||
|
|
||||||
|
|
|
@ -1940,11 +1940,11 @@ void Cty_ChangeCtyWWW (void)
|
||||||
|
|
||||||
void Cty_ChangeCtyMapAttribution (void)
|
void Cty_ChangeCtyMapAttribution (void)
|
||||||
{
|
{
|
||||||
char NewMapAttribution[Img_MAX_BYTES_ATTRIBUTION + 1];
|
char NewMapAttribution[Med_MAX_BYTES_ATTRIBUTION + 1];
|
||||||
|
|
||||||
/***** Get parameters from form *****/
|
/***** Get parameters from form *****/
|
||||||
/* Get the new map attribution for the country */
|
/* 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 *****/
|
/***** Update the table changing old attribution by new attribution *****/
|
||||||
DB_QueryUPDATE ("can not update the map attribution of a country",
|
DB_QueryUPDATE ("can not update the map attribution of a country",
|
||||||
|
|
222
swad_database.c
222
swad_database.c
|
@ -442,7 +442,7 @@ mysql> DESCRIBE centres;
|
||||||
"ShortName VARCHAR(511) COLLATE latin1_spanish_ci NOT NULL," // Hie_MAX_BYTES_SHRT_NAME
|
"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
|
"FullName VARCHAR(2047) COLLATE latin1_spanish_ci NOT NULL," // Hie_MAX_BYTES_FULL_NAME
|
||||||
"WWW VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW
|
"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),"
|
"UNIQUE INDEX(CtrCod),"
|
||||||
"INDEX(InsCod),"
|
"INDEX(InsCod),"
|
||||||
"INDEX(PlcCod),"
|
"INDEX(PlcCod),"
|
||||||
|
@ -588,7 +588,7 @@ mysql> DESCRIBE countries;
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS countries ("
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS countries ("
|
||||||
"CtyCod INT NOT NULL,"
|
"CtyCod INT NOT NULL,"
|
||||||
"Alpha2 CHAR(2) 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_ca VARCHAR(767) NOT NULL," // Cty_MAX_BYTES_NAME
|
||||||
"Name_de 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
|
"Name_en VARCHAR(767) NOT NULL," // Cty_MAX_BYTES_NAME
|
||||||
|
@ -1207,22 +1207,23 @@ mysql> DESCRIBE forum_disabled_post;
|
||||||
/***** Table forum_post *****/
|
/***** Table forum_post *****/
|
||||||
/*
|
/*
|
||||||
mysql> DESCRIBE forum_post;
|
mysql> DESCRIBE forum_post;
|
||||||
+------------+---------------+------+-----+---------+----------------+
|
+------------+-------------------+------+-----+---------+----------------+
|
||||||
| Field | Type | Null | Key | Default | Extra |
|
| Field | Type | Null | Key | Default | Extra |
|
||||||
+------------+---------------+------+-----+---------+----------------+
|
+------------+-------------------+------+-----+---------+----------------+
|
||||||
| PstCod | int(11) | NO | PRI | NULL | auto_increment |
|
| PstCod | int(11) | NO | PRI | NULL | auto_increment |
|
||||||
| ThrCod | int(11) | NO | MUL | NULL | |
|
| ThrCod | int(11) | NO | MUL | NULL | |
|
||||||
| UsrCod | int(11) | NO | MUL | NULL | |
|
| UsrCod | int(11) | NO | MUL | NULL | |
|
||||||
| CreatTime | datetime | NO | MUL | NULL | |
|
| CreatTime | datetime | NO | MUL | NULL | |
|
||||||
| ModifTime | datetime | NO | MUL | NULL | |
|
| ModifTime | datetime | NO | MUL | NULL | |
|
||||||
| NumNotif | int(11) | NO | | 0 | |
|
| NumNotif | int(11) | NO | | 0 | |
|
||||||
| Subject | text | NO | | NULL | |
|
| Subject | text | NO | | NULL | |
|
||||||
| Content | longtext | NO | | NULL | |
|
| Content | longtext | NO | | NULL | |
|
||||||
| ImageName | varchar(43) | NO | | NULL | |
|
| MediaName | varchar(43) | NO | | | |
|
||||||
| ImageTitle | varchar(2047) | NO | | NULL | |
|
| MediaType | enum('jpg','gif') | NO | | jpg | |
|
||||||
| ImageURL | varchar(255) | NO | | NULL | |
|
| MediaTitle | varchar(2047) | NO | | | |
|
||||||
+------------+---------------+------+-----+---------+----------------+
|
| MediaURL | varchar(255) | NO | | | |
|
||||||
11 rows in set (0,00 sec)
|
+------------+-------------------+------+-----+---------+----------------+
|
||||||
|
12 rows in set (0.00 sec)
|
||||||
*/
|
*/
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS forum_post ("
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS forum_post ("
|
||||||
"PstCod INT NOT NULL AUTO_INCREMENT,"
|
"PstCod INT NOT NULL AUTO_INCREMENT,"
|
||||||
|
@ -1231,11 +1232,12 @@ mysql> DESCRIBE forum_post;
|
||||||
"CreatTime DATETIME NOT NULL,"
|
"CreatTime DATETIME NOT NULL,"
|
||||||
"ModifTime DATETIME NOT NULL,"
|
"ModifTime DATETIME NOT NULL,"
|
||||||
"NumNotif INT NOT NULL DEFAULT 0,"
|
"NumNotif INT NOT NULL DEFAULT 0,"
|
||||||
"Subject TEXT NOT NULL," // Cns_MAX_BYTES_SUBJECT
|
"Subject TEXT NOT NULL," // Cns_MAX_BYTES_SUBJECT
|
||||||
"Content LONGTEXT NOT NULL," // Cns_MAX_BYTES_LONG_TEXT
|
"Content LONGTEXT NOT NULL," // Cns_MAX_BYTES_LONG_TEXT
|
||||||
"ImageName VARCHAR(43) NOT NULL," // Img_BYTES_NAME
|
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
||||||
"ImageTitle VARCHAR(2047) NOT NULL," // Img_MAX_BYTES_TITLE
|
"MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg',"
|
||||||
"ImageURL VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW
|
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
||||||
|
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
||||||
"UNIQUE INDEX(PstCod),"
|
"UNIQUE INDEX(PstCod),"
|
||||||
"INDEX(ThrCod),"
|
"INDEX(ThrCod),"
|
||||||
"INDEX(UsrCod),"
|
"INDEX(UsrCod),"
|
||||||
|
@ -1731,50 +1733,54 @@ mysql> DESCRIBE msg_banned;
|
||||||
/***** Table msg_content *****/
|
/***** Table msg_content *****/
|
||||||
/*
|
/*
|
||||||
mysql> DESCRIBE msg_content;
|
mysql> DESCRIBE msg_content;
|
||||||
+------------+---------------+------+-----+---------+----------------+
|
+------------+-------------------+------+-----+---------+----------------+
|
||||||
| Field | Type | Null | Key | Default | Extra |
|
| Field | Type | Null | Key | Default | Extra |
|
||||||
+------------+---------------+------+-----+---------+----------------+
|
+------------+-------------------+------+-----+---------+----------------+
|
||||||
| MsgCod | int(11) | NO | PRI | NULL | auto_increment |
|
| MsgCod | int(11) | NO | PRI | NULL | auto_increment |
|
||||||
| Subject | text | NO | MUL | NULL | |
|
| Subject | text | NO | MUL | NULL | |
|
||||||
| Content | longtext | NO | | NULL | |
|
| Content | longtext | NO | | NULL | |
|
||||||
| ImageName | varchar(43) | NO | | | |
|
| MediaName | varchar(43) | NO | | | |
|
||||||
| ImageTitle | varchar(2047) | NO | | | |
|
| MediaType | enum('jpg','gif') | NO | | jpg | |
|
||||||
| ImageURL | varchar(255) | NO | | | |
|
| MediaTitle | varchar(2047) | NO | | | |
|
||||||
+------------+---------------+------+-----+---------+----------------+
|
| MediaURL | varchar(255) | NO | | | |
|
||||||
6 rows in set (0,00 sec)
|
+------------+-------------------+------+-----+---------+----------------+
|
||||||
|
7 rows in set (0.00 sec)
|
||||||
*/
|
*/
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS msg_content ("
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS msg_content ("
|
||||||
"MsgCod INT NOT NULL AUTO_INCREMENT,"
|
"MsgCod INT NOT NULL AUTO_INCREMENT,"
|
||||||
"Subject TEXT NOT NULL,"
|
"Subject TEXT NOT NULL,"
|
||||||
"Content LONGTEXT NOT NULL,"
|
"Content LONGTEXT NOT NULL,"
|
||||||
"ImageName VARCHAR(43) NOT NULL DEFAULT ''," // Img_BYTES_NAME
|
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
||||||
"ImageTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Img_MAX_BYTES_TITLE
|
"MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg',"
|
||||||
"ImageURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
||||||
|
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
||||||
"UNIQUE INDEX(MsgCod),"
|
"UNIQUE INDEX(MsgCod),"
|
||||||
"FULLTEXT(Subject,Content)) ENGINE = MYISAM;");
|
"FULLTEXT(Subject,Content)) ENGINE = MYISAM;");
|
||||||
|
|
||||||
/***** Table msg_content_deleted *****/
|
/***** Table msg_content_deleted *****/
|
||||||
/*
|
/*
|
||||||
mysql> DESCRIBE msg_content_deleted;
|
mysql> DESCRIBE msg_content_deleted;
|
||||||
+------------+---------------+------+-----+---------+-------+
|
+------------+-------------------+------+-----+---------+-------+
|
||||||
| Field | Type | Null | Key | Default | Extra |
|
| Field | Type | Null | Key | Default | Extra |
|
||||||
+------------+---------------+------+-----+---------+-------+
|
+------------+-------------------+------+-----+---------+-------+
|
||||||
| MsgCod | int(11) | NO | PRI | NULL | |
|
| MsgCod | int(11) | NO | PRI | NULL | |
|
||||||
| Subject | text | NO | MUL | NULL | |
|
| Subject | text | NO | MUL | NULL | |
|
||||||
| Content | longtext | NO | | NULL | |
|
| Content | longtext | NO | | NULL | |
|
||||||
| ImageName | varchar(43) | NO | | | |
|
| MediaName | varchar(43) | NO | | | |
|
||||||
| ImageTitle | varchar(2047) | NO | | | |
|
| MediaType | enum('jpg','gif') | NO | | jpg | |
|
||||||
| ImageURL | varchar(255) | NO | | | |
|
| MediaTitle | varchar(2047) | NO | | | |
|
||||||
+------------+---------------+------+-----+---------+-------+
|
| MediaURL | varchar(255) | NO | | | |
|
||||||
6 rows in set (0,00 sec)
|
+------------+-------------------+------+-----+---------+-------+
|
||||||
|
7 rows in set (0.00 sec)
|
||||||
*/
|
*/
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS msg_content_deleted ("
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS msg_content_deleted ("
|
||||||
"MsgCod INT NOT NULL,"
|
"MsgCod INT NOT NULL,"
|
||||||
"Subject TEXT NOT NULL,"
|
"Subject TEXT NOT NULL,"
|
||||||
"Content LONGTEXT NOT NULL,"
|
"Content LONGTEXT NOT NULL,"
|
||||||
"ImageName VARCHAR(43) NOT NULL DEFAULT ''," // Img_BYTES_NAME
|
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
||||||
"ImageTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Img_MAX_BYTES_TITLE
|
"MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg',"
|
||||||
"ImageURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
||||||
|
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
||||||
"UNIQUE INDEX(MsgCod),"
|
"UNIQUE INDEX(MsgCod),"
|
||||||
"FULLTEXT(Subject,Content)) ENGINE = MYISAM;");
|
"FULLTEXT(Subject,Content)) ENGINE = MYISAM;");
|
||||||
|
|
||||||
|
@ -2170,23 +2176,25 @@ mysql> DESCRIBE sessions;
|
||||||
/***** Table social_comments *****/
|
/***** Table social_comments *****/
|
||||||
/*
|
/*
|
||||||
mysql> DESCRIBE social_comments;
|
mysql> DESCRIBE social_comments;
|
||||||
+------------+---------------+------+-----+---------+-------+
|
+------------+-------------------+------+-----+---------+-------+
|
||||||
| Field | Type | Null | Key | Default | Extra |
|
| Field | Type | Null | Key | Default | Extra |
|
||||||
+------------+---------------+------+-----+---------+-------+
|
+------------+-------------------+------+-----+---------+-------+
|
||||||
| PubCod | bigint(20) | NO | PRI | NULL | |
|
| PubCod | bigint(20) | NO | PRI | NULL | |
|
||||||
| Content | longtext | NO | MUL | NULL | |
|
| Content | longtext | NO | MUL | NULL | |
|
||||||
| ImageName | varchar(43) | NO | | NULL | |
|
| MediaName | varchar(43) | NO | | | |
|
||||||
| ImageTitle | varchar(2047) | NO | | NULL | |
|
| MediaType | enum('jpg','gif') | NO | | jpg | |
|
||||||
| ImageURL | varchar(255) | NO | | NULL | |
|
| MediaTitle | varchar(2047) | NO | | | |
|
||||||
+------------+---------------+------+-----+---------+-------+
|
| MediaURL | varchar(255) | NO | | | |
|
||||||
5 rows in set (0,00 sec)
|
+------------+-------------------+------+-----+---------+-------+
|
||||||
|
6 rows in set (0.00 sec)
|
||||||
*/
|
*/
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS social_comments ("
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS social_comments ("
|
||||||
"PubCod BIGINT NOT NULL,"
|
"PubCod BIGINT NOT NULL,"
|
||||||
"Content LONGTEXT NOT NULL,"
|
"Content LONGTEXT NOT NULL,"
|
||||||
"ImageName VARCHAR(43) NOT NULL," // Img_BYTES_NAME
|
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
||||||
"ImageTitle VARCHAR(2047) NOT NULL," // Img_MAX_BYTES_TITLE
|
"MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg',"
|
||||||
"ImageURL VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW
|
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
||||||
|
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
||||||
"UNIQUE INDEX(PubCod),"
|
"UNIQUE INDEX(PubCod),"
|
||||||
"FULLTEXT(Content)) ENGINE = MYISAM;");
|
"FULLTEXT(Content)) ENGINE = MYISAM;");
|
||||||
|
|
||||||
|
@ -2266,23 +2274,25 @@ mysql> DESCRIBE social_notes_fav;
|
||||||
/***** Table social_posts *****/
|
/***** Table social_posts *****/
|
||||||
/*
|
/*
|
||||||
mysql> DESCRIBE social_posts;
|
mysql> DESCRIBE social_posts;
|
||||||
+------------+---------------+------+-----+---------+----------------+
|
+------------+-------------------+------+-----+---------+----------------+
|
||||||
| Field | Type | Null | Key | Default | Extra |
|
| Field | Type | Null | Key | Default | Extra |
|
||||||
+------------+---------------+------+-----+---------+----------------+
|
+------------+-------------------+------+-----+---------+----------------+
|
||||||
| PstCod | int(11) | NO | PRI | NULL | auto_increment |
|
| PstCod | int(11) | NO | PRI | NULL | auto_increment |
|
||||||
| Content | longtext | NO | MUL | NULL | |
|
| Content | longtext | NO | MUL | NULL | |
|
||||||
| ImageName | varchar(43) | NO | | NULL | |
|
| MediaName | varchar(43) | NO | | | |
|
||||||
| ImageTitle | varchar(2047) | NO | | NULL | |
|
| MediaType | enum('jpg','gif') | NO | | jpg | |
|
||||||
| ImageURL | varchar(255) | NO | | NULL | |
|
| MediaTitle | varchar(2047) | NO | | | |
|
||||||
+------------+---------------+------+-----+---------+----------------+
|
| MediaURL | varchar(255) | NO | | | |
|
||||||
5 rows in set (0,00 sec)
|
+------------+-------------------+------+-----+---------+----------------+
|
||||||
|
6 rows in set (0.00 sec)
|
||||||
*/
|
*/
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS social_posts ("
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS social_posts ("
|
||||||
"PubCod INT NOT NULL AUTO_INCREMENT,"
|
"PubCod INT NOT NULL AUTO_INCREMENT,"
|
||||||
"Content LONGTEXT NOT NULL,"
|
"Content LONGTEXT NOT NULL,"
|
||||||
"ImageName VARCHAR(43) NOT NULL," // Img_BYTES_NAME
|
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
||||||
"ImageTitle VARCHAR(2047) NOT NULL," // Img_MAX_BYTES_TITLE
|
"MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg',"
|
||||||
"ImageURL VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW
|
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
||||||
|
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
||||||
"UNIQUE INDEX(PubCod),"
|
"UNIQUE INDEX(PubCod),"
|
||||||
"FULLTEXT(Content)) ENGINE = MYISAM;");
|
"FULLTEXT(Content)) ENGINE = MYISAM;");
|
||||||
|
|
||||||
|
@ -2537,28 +2547,30 @@ mysql> DESCRIBE timetable_tut;
|
||||||
/***** Table tst_answers *****/
|
/***** Table tst_answers *****/
|
||||||
/*
|
/*
|
||||||
mysql> DESCRIBE tst_answers;
|
mysql> DESCRIBE tst_answers;
|
||||||
+------------+---------------+------+-----+---------+-------+
|
+------------+-------------------+------+-----+---------+-------+
|
||||||
| Field | Type | Null | Key | Default | Extra |
|
| Field | Type | Null | Key | Default | Extra |
|
||||||
+------------+---------------+------+-----+---------+-------+
|
+------------+-------------------+------+-----+---------+-------+
|
||||||
| QstCod | int(11) | NO | MUL | NULL | |
|
| QstCod | int(11) | NO | MUL | NULL | |
|
||||||
| AnsInd | tinyint(4) | NO | | NULL | |
|
| AnsInd | tinyint(4) | NO | | NULL | |
|
||||||
| Answer | text | NO | | NULL | |
|
| Answer | text | NO | | NULL | |
|
||||||
| Feedback | text | NO | | NULL | |
|
| Feedback | text | NO | | NULL | |
|
||||||
| ImageName | varchar(43) | NO | | NULL | |
|
| MediaName | varchar(43) | NO | | | |
|
||||||
| ImageTitle | varchar(2047) | NO | | NULL | |
|
| MediaType | enum('jpg','gif') | NO | | jpg | |
|
||||||
| ImageURL | varchar(255) | NO | | NULL | |
|
| MediaTitle | varchar(2047) | NO | | | |
|
||||||
| Correct | enum('N','Y') | NO | | NULL | |
|
| MediaURL | varchar(255) | NO | | | |
|
||||||
+------------+---------------+------+-----+---------+-------+
|
| Correct | enum('N','Y') | NO | | NULL | |
|
||||||
8 rows in set (0,00 sec)
|
+------------+-------------------+------+-----+---------+-------+
|
||||||
|
9 rows in set (0.00 sec)
|
||||||
*/
|
*/
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_answers ("
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_answers ("
|
||||||
"QstCod INT NOT NULL,"
|
"QstCod INT NOT NULL,"
|
||||||
"AnsInd TINYINT NOT NULL,"
|
"AnsInd TINYINT NOT NULL,"
|
||||||
"Answer TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK
|
"Answer TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK
|
||||||
"Feedback 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
|
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
||||||
"ImageTitle VARCHAR(2047) NOT NULL," // Img_MAX_BYTES_TITLE
|
"MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg',"
|
||||||
"ImageURL VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW
|
"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,"
|
"Correct ENUM('N','Y') NOT NULL,"
|
||||||
"INDEX(QstCod))");
|
"INDEX(QstCod))");
|
||||||
|
|
||||||
|
@ -2672,14 +2684,15 @@ mysql> DESCRIBE tst_questions;
|
||||||
| Shuffle | enum('N','Y') | NO | | NULL | |
|
| Shuffle | enum('N','Y') | NO | | NULL | |
|
||||||
| Stem | text | NO | | NULL | |
|
| Stem | text | NO | | NULL | |
|
||||||
| Feedback | text | NO | | NULL | |
|
| Feedback | text | NO | | NULL | |
|
||||||
| ImageName | varchar(43) | NO | | NULL | |
|
| MediaName | varchar(43) | NO | | | |
|
||||||
| ImageTitle | varchar(2047) | NO | | NULL | |
|
| MediaType | enum('jpg','gif') | NO | | jpg | |
|
||||||
| ImageURL | varchar(255) | NO | | NULL | |
|
| MediaTitle | varchar(2047) | NO | | | |
|
||||||
|
| MediaURL | varchar(255) | NO | | | |
|
||||||
| NumHits | int(11) | NO | | 0 | |
|
| NumHits | int(11) | NO | | 0 | |
|
||||||
| NumHitsNotBlank | int(11) | NO | | 0 | |
|
| NumHitsNotBlank | int(11) | NO | | 0 | |
|
||||||
| Score | double | 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 ("
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_questions ("
|
||||||
"QstCod INT NOT NULL AUTO_INCREMENT,"
|
"QstCod INT NOT NULL AUTO_INCREMENT,"
|
||||||
|
@ -2687,11 +2700,12 @@ mysql> DESCRIBE tst_questions;
|
||||||
"EditTime DATETIME NOT NULL,"
|
"EditTime DATETIME NOT NULL,"
|
||||||
"AnsType ENUM ('int','float','true_false','unique_choice','multiple_choice','text') NOT NULL,"
|
"AnsType ENUM ('int','float','true_false','unique_choice','multiple_choice','text') NOT NULL,"
|
||||||
"Shuffle ENUM('N','Y') NOT NULL,"
|
"Shuffle ENUM('N','Y') NOT NULL,"
|
||||||
"Stem TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
|
"Stem TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
|
||||||
"Feedback TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
|
"Feedback TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
|
||||||
"ImageName VARCHAR(43) NOT NULL," // Img_BYTES_NAME
|
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
||||||
"ImageTitle VARCHAR(2047) NOT NULL," // Img_MAX_BYTES_TITLE
|
"MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg',"
|
||||||
"ImageURL VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW
|
"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,"
|
"NumHits INT NOT NULL DEFAULT 0,"
|
||||||
"NumHitsNotBlank INT NOT NULL DEFAULT 0,"
|
"NumHitsNotBlank INT NOT NULL DEFAULT 0,"
|
||||||
"Score DOUBLE PRECISION NOT NULL DEFAULT 0,"
|
"Score DOUBLE PRECISION NOT NULL DEFAULT 0,"
|
||||||
|
|
|
@ -273,7 +273,6 @@ struct Param *Fil_StartReceptionOfFile (const char *ParamFile,
|
||||||
|
|
||||||
bool Fil_EndReceptionOfFile (char *FileNameDataTmp,struct Param *Param)
|
bool Fil_EndReceptionOfFile (char *FileNameDataTmp,struct Param *Param)
|
||||||
{
|
{
|
||||||
extern const char *Txt_UPLOAD_FILE_File_too_large_maximum_X_MiB_NO_HTML;
|
|
||||||
FILE *FileDataTmp;
|
FILE *FileDataTmp;
|
||||||
unsigned char Bytes[NUM_BYTES_PER_CHUNK];
|
unsigned char Bytes[NUM_BYTES_PER_CHUNK];
|
||||||
size_t RemainingBytesToCopy;
|
size_t RemainingBytesToCopy;
|
||||||
|
|
85
swad_forum.c
85
swad_forum.c
|
@ -282,8 +282,8 @@ static void For_InsertPstIntoBannedPstTable (long PstCod);
|
||||||
|
|
||||||
static long For_InsertForumPst (long ThrCod,long UsrCod,
|
static long For_InsertForumPst (long ThrCod,long UsrCod,
|
||||||
const char *Subject,const char *Content,
|
const char *Subject,const char *Content,
|
||||||
struct Image *Image);
|
struct Media *Media);
|
||||||
static bool For_RemoveForumPst (long PstCod,struct Image *Image);
|
static bool For_RemoveForumPst (long PstCod,struct Media *Media);
|
||||||
static unsigned For_NumPstsInThrWithPstCod (long PstCod,long *ThrCod);
|
static unsigned For_NumPstsInThrWithPstCod (long PstCod,long *ThrCod);
|
||||||
|
|
||||||
static long For_InsertForumThread (long FirstPstCod);
|
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,
|
static void For_GetPstData (long PstCod,long *UsrCod,time_t *CreatTimeUTC,
|
||||||
char Subject[Cns_MAX_BYTES_SUBJECT + 1],
|
char Subject[Cns_MAX_BYTES_SUBJECT + 1],
|
||||||
char Content[Cns_MAX_BYTES_LONG_TEXT + 1],
|
char Content[Cns_MAX_BYTES_LONG_TEXT + 1],
|
||||||
struct Image *Image);
|
struct Media *Media);
|
||||||
static void For_WriteNumberOfPosts (long UsrCod);
|
static void For_WriteNumberOfPosts (long UsrCod);
|
||||||
|
|
||||||
static void For_PutParamForumSet (For_ForumSet_t ForumSet);
|
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,
|
static long For_InsertForumPst (long ThrCod,long UsrCod,
|
||||||
const char *Subject,const char *Content,
|
const char *Subject,const char *Content,
|
||||||
struct Image *Image)
|
struct Media *Media)
|
||||||
{
|
{
|
||||||
long PstCod;
|
long PstCod;
|
||||||
|
|
||||||
/***** Check if image is received and processed *****/
|
/***** Check if image is received and processed *****/
|
||||||
if (Image->Action == Img_ACTION_NEW_IMAGE && // Upload new image
|
if (Media->Action == Med_ACTION_NEW_MEDIA && // Upload new image
|
||||||
Image->Status == Img_FILE_PROCESSED) // The new image received has been processed
|
Media->Status == Med_FILE_PROCESSED) // The new image received has been processed
|
||||||
/* Move processed image to definitive directory */
|
/* Move processed image to definitive directory */
|
||||||
Img_MoveImageToDefinitiveDirectory (Image);
|
Med_MoveMediaToDefinitiveDirectory (Media);
|
||||||
|
|
||||||
/***** Insert forum post in the database *****/
|
/***** Insert forum post in the database *****/
|
||||||
PstCod =
|
PstCod =
|
||||||
DB_QueryINSERTandReturnCode ("can not create a new post in a forum",
|
DB_QueryINSERTandReturnCode ("can not create a new post in a forum",
|
||||||
"INSERT INTO forum_post"
|
"INSERT INTO forum_post"
|
||||||
" (ThrCod,UsrCod,CreatTime,ModifTime,NumNotif,"
|
" (ThrCod,UsrCod,CreatTime,ModifTime,NumNotif,"
|
||||||
"Subject,Content,ImageName,ImageTitle,ImageURL)"
|
"Subject,Content,MediaName,MediaTitle,MediaURL)"
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" (%ld,%ld,NOW(),NOW(),0,"
|
" (%ld,%ld,NOW(),NOW(),0,"
|
||||||
"'%s','%s','%s','%s','%s')",
|
"'%s','%s','%s','%s','%s')",
|
||||||
ThrCod,UsrCod,
|
ThrCod,UsrCod,
|
||||||
Subject,Content,
|
Subject,Content,
|
||||||
Image->Name,
|
Media->Name,
|
||||||
Image->Title ? Image->Title : "",
|
Media->Title ? Media->Title : "",
|
||||||
Image->URL ? Image->URL : "");
|
Media->URL ? Media->URL : "");
|
||||||
|
|
||||||
return PstCod;
|
return PstCod;
|
||||||
}
|
}
|
||||||
|
@ -529,13 +529,13 @@ static long For_InsertForumPst (long ThrCod,long UsrCod,
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
// Return true if the post thread is deleted
|
// 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;
|
long ThrCod;
|
||||||
bool ThreadDeleted = false;
|
bool ThreadDeleted = false;
|
||||||
|
|
||||||
/***** Remove image file attached to forum post *****/
|
/***** Remove media file attached to forum post *****/
|
||||||
Img_RemoveImageFile (Image->Name);
|
Med_RemoveMediaFile (Media->Name,Media->Type);
|
||||||
|
|
||||||
/***** If the post is the only one in its thread, delete that thread *****/
|
/***** If the post is the only one in its thread, delete that thread *****/
|
||||||
if (For_NumPstsInThrWithPstCod (PstCod,&ThrCod) < 2)
|
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 OriginalContent[Cns_MAX_BYTES_LONG_TEXT + 1];
|
||||||
char Subject[Cns_MAX_BYTES_SUBJECT + 1];
|
char Subject[Cns_MAX_BYTES_SUBJECT + 1];
|
||||||
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
|
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
|
||||||
struct Image Image;
|
struct Media Media;
|
||||||
bool Enabled;
|
bool Enabled;
|
||||||
bool ItsMe;
|
bool ItsMe;
|
||||||
|
|
||||||
|
@ -1165,14 +1165,14 @@ static void For_ShowAForumPost (unsigned PstNum,long PstCod,
|
||||||
Usr_UsrDataConstructor (&UsrDat);
|
Usr_UsrDataConstructor (&UsrDat);
|
||||||
|
|
||||||
/***** Initialize image *****/
|
/***** Initialize image *****/
|
||||||
Img_ImageConstructor (&Image);
|
Med_MediaConstructor (&Media);
|
||||||
|
|
||||||
/***** Check if post is enabled *****/
|
/***** Check if post is enabled *****/
|
||||||
Enabled = For_GetIfPstIsEnabled (PstCod);
|
Enabled = For_GetIfPstIsEnabled (PstCod);
|
||||||
|
|
||||||
/***** Get data of post *****/
|
/***** Get data of post *****/
|
||||||
For_GetPstData (PstCod,&UsrDat.UsrCod,&CreatTimeUTC,
|
For_GetPstData (PstCod,&UsrDat.UsrCod,&CreatTimeUTC,
|
||||||
Subject,OriginalContent,&Image);
|
Subject,OriginalContent,&Media);
|
||||||
|
|
||||||
if (Enabled)
|
if (Enabled)
|
||||||
/* Return this subject as last subject */
|
/* 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);
|
Msg_WriteMsgContent (Content,Cns_MAX_BYTES_LONG_TEXT,true,false);
|
||||||
|
|
||||||
/***** Show image *****/
|
/***** Show image *****/
|
||||||
Img_ShowImage (&Image,"FOR_IMG_CONTAINER","FOR_IMG");
|
Med_ShowMedia (&Media,"FOR_IMG_CONTAINER","FOR_IMG");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
fprintf (Gbl.F.Out,"%s",Txt_This_post_has_been_banned_probably_for_not_satisfy_the_rules_of_the_forums);
|
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,
|
||||||
"</tr>");
|
"</tr>");
|
||||||
|
|
||||||
/***** Free image *****/
|
/***** Free image *****/
|
||||||
Img_ImageDestructor (&Image);
|
Med_MediaDestructor (&Media);
|
||||||
|
|
||||||
/***** Free memory used for user's data *****/
|
/***** Free memory used for user's data *****/
|
||||||
Usr_UsrDataDestructor (&UsrDat);
|
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,
|
static void For_GetPstData (long PstCod,long *UsrCod,time_t *CreatTimeUTC,
|
||||||
char Subject[Cns_MAX_BYTES_SUBJECT + 1],
|
char Subject[Cns_MAX_BYTES_SUBJECT + 1],
|
||||||
char Content[Cns_MAX_BYTES_LONG_TEXT + 1],
|
char Content[Cns_MAX_BYTES_LONG_TEXT + 1],
|
||||||
struct Image *Image)
|
struct Media *Media)
|
||||||
{
|
{
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
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 *****/
|
/***** Get data of a post from database *****/
|
||||||
NumRows = DB_QuerySELECT (&mysql_res,"can not get data of a post",
|
NumRows = DB_QuerySELECT (&mysql_res,"can not get data of a post",
|
||||||
"SELECT UsrCod,UNIX_TIMESTAMP(CreatTime),"
|
"SELECT UsrCod," // row[0]
|
||||||
"Subject,Content,ImageName,ImageTitle,ImageURL"
|
"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",
|
" FROM forum_post WHERE PstCod=%ld",
|
||||||
PstCod);
|
PstCod);
|
||||||
|
|
||||||
|
@ -1363,8 +1369,9 @@ static void For_GetPstData (long PstCod,long *UsrCod,time_t *CreatTimeUTC,
|
||||||
Str_Copy (Content,row[3],
|
Str_Copy (Content,row[3],
|
||||||
Cns_MAX_BYTES_LONG_TEXT);
|
Cns_MAX_BYTES_LONG_TEXT);
|
||||||
|
|
||||||
/****** Get image name (row[4]), title (row[5]) and URL (row[6]) *****/
|
/****** Get media name (row[4]), type (row[5]),
|
||||||
Img_GetImageNameTitleAndURLFromRow (row[4],row[5],row[6],Image);
|
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 *****/
|
/***** Free structure that stores the query result *****/
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
@ -3999,7 +4006,7 @@ static void For_WriteFormForumPst (bool IsReply,const char *Subject)
|
||||||
Lay_HelpPlainEditor ();
|
Lay_HelpPlainEditor ();
|
||||||
|
|
||||||
/***** Attached image (optional) *****/
|
/***** Attached image (optional) *****/
|
||||||
Img_PutImageUploader (-1,"FOR_IMG_TIT_URL");
|
Med_PutMediaUploader (-1,"FOR_IMG_TIT_URL");
|
||||||
|
|
||||||
/***** Send button *****/
|
/***** Send button *****/
|
||||||
Btn_PutCreateButton (Txt_Send);
|
Btn_PutCreateButton (Txt_Send);
|
||||||
|
@ -4023,7 +4030,7 @@ void For_ReceiveForumPost (void)
|
||||||
unsigned NumUsrsToBeNotifiedByEMail;
|
unsigned NumUsrsToBeNotifiedByEMail;
|
||||||
struct SocialPublishing SocPub;
|
struct SocialPublishing SocPub;
|
||||||
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
|
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
|
||||||
struct Image Image;
|
struct Media Media;
|
||||||
|
|
||||||
/***** Get parameters related to forum *****/
|
/***** Get parameters related to forum *****/
|
||||||
For_GetParamsForum ();
|
For_GetParamsForum ();
|
||||||
|
@ -4045,13 +4052,13 @@ void For_ReceiveForumPost (void)
|
||||||
Str_TO_RIGOROUS_HTML,false);
|
Str_TO_RIGOROUS_HTML,false);
|
||||||
|
|
||||||
/***** Initialize image *****/
|
/***** Initialize image *****/
|
||||||
Img_ImageConstructor (&Image);
|
Med_MediaConstructor (&Media);
|
||||||
|
|
||||||
/***** Get attached image (action, file and title) *****/
|
/***** Get attached image (action, file and title) *****/
|
||||||
Image.Width = For_IMAGE_SAVED_MAX_WIDTH;
|
Media.Width = For_IMAGE_SAVED_MAX_WIDTH;
|
||||||
Image.Height = For_IMAGE_SAVED_MAX_HEIGHT;
|
Media.Height = For_IMAGE_SAVED_MAX_HEIGHT;
|
||||||
Image.Quality = For_IMAGE_SAVED_QUALITY;
|
Media.Quality = For_IMAGE_SAVED_QUALITY;
|
||||||
Img_GetImageFromForm (-1,&Image,NULL);
|
Med_GetMediaFromForm (-1,&Media,NULL);
|
||||||
|
|
||||||
/***** Create a new message *****/
|
/***** Create a new message *****/
|
||||||
if (IsReply) // This post is a reply to another posts in the thread
|
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 *****/
|
/***** Create last message of the thread *****/
|
||||||
PstCod = For_InsertForumPst (Gbl.Forum.ForumSelected.ThrCod,Gbl.Usrs.Me.UsrDat.UsrCod,
|
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 *****/
|
/***** Modify last message of the thread *****/
|
||||||
For_UpdateThrLastPst (Gbl.Forum.ForumSelected.ThrCod,PstCod);
|
For_UpdateThrLastPst (Gbl.Forum.ForumSelected.ThrCod,PstCod);
|
||||||
|
@ -4072,14 +4079,14 @@ void For_ReceiveForumPost (void)
|
||||||
|
|
||||||
/***** Create first (and last) message of the thread *****/
|
/***** Create first (and last) message of the thread *****/
|
||||||
PstCod = For_InsertForumPst (Gbl.Forum.ForumSelected.ThrCod,Gbl.Usrs.Me.UsrDat.UsrCod,
|
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 *****/
|
/***** Update first and last posts of new thread *****/
|
||||||
For_UpdateThrFirstAndLastPst (Gbl.Forum.ForumSelected.ThrCod,PstCod,PstCod);
|
For_UpdateThrFirstAndLastPst (Gbl.Forum.ForumSelected.ThrCod,PstCod,PstCod);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Free image *****/
|
/***** Free image *****/
|
||||||
Img_ImageDestructor (&Image);
|
Med_MediaDestructor (&Media);
|
||||||
|
|
||||||
/***** Increment number of forum posts in my user's figures *****/
|
/***** Increment number of forum posts in my user's figures *****/
|
||||||
Prf_IncrementNumForPstUsr (Gbl.Usrs.Me.UsrDat.UsrCod);
|
Prf_IncrementNumForPstUsr (Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||||
|
@ -4148,7 +4155,7 @@ void For_RemovePost (void)
|
||||||
time_t CreatTimeUTC; // Creation time of a message
|
time_t CreatTimeUTC; // Creation time of a message
|
||||||
char Subject[Cns_MAX_BYTES_SUBJECT + 1];
|
char Subject[Cns_MAX_BYTES_SUBJECT + 1];
|
||||||
char OriginalContent[Cns_MAX_BYTES_LONG_TEXT + 1];
|
char OriginalContent[Cns_MAX_BYTES_LONG_TEXT + 1];
|
||||||
struct Image Image;
|
struct Media Media;
|
||||||
bool ItsMe;
|
bool ItsMe;
|
||||||
bool ThreadDeleted = false;
|
bool ThreadDeleted = false;
|
||||||
|
|
||||||
|
@ -4156,11 +4163,11 @@ void For_RemovePost (void)
|
||||||
For_GetParamsForum ();
|
For_GetParamsForum ();
|
||||||
|
|
||||||
/***** Initialize image *****/
|
/***** Initialize image *****/
|
||||||
Img_ImageConstructor (&Image);
|
Med_MediaConstructor (&Media);
|
||||||
|
|
||||||
/***** Get forum post data *****/
|
/***** Get forum post data *****/
|
||||||
For_GetPstData (Gbl.Forum.ForumSelected.PstCod,&UsrDat.UsrCod,&CreatTimeUTC,
|
For_GetPstData (Gbl.Forum.ForumSelected.PstCod,&UsrDat.UsrCod,&CreatTimeUTC,
|
||||||
Subject,OriginalContent,&Image);
|
Subject,OriginalContent,&Media);
|
||||||
|
|
||||||
/***** Check if I can remove the post *****/
|
/***** Check if I can remove the post *****/
|
||||||
/* Check if the message really exists, if it has not been removed */
|
/* 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.");
|
Lay_ShowErrorAndExit ("You can not remove post because it is not the last of the thread.");
|
||||||
|
|
||||||
/***** Remove the post *****/
|
/***** Remove the post *****/
|
||||||
ThreadDeleted = For_RemoveForumPst (Gbl.Forum.ForumSelected.PstCod,&Image);
|
ThreadDeleted = For_RemoveForumPst (Gbl.Forum.ForumSelected.PstCod,&Media);
|
||||||
|
|
||||||
/***** Free image *****/
|
/***** Free image *****/
|
||||||
Img_ImageDestructor (&Image);
|
Med_MediaDestructor (&Media);
|
||||||
|
|
||||||
/***** Mark possible notifications as removed *****/
|
/***** Mark possible notifications as removed *****/
|
||||||
Ntf_MarkNotifAsRemoved (Ntf_EVENT_FORUM_POST_COURSE,Gbl.Forum.ForumSelected.PstCod);
|
Ntf_MarkNotifAsRemoved (Ntf_EVENT_FORUM_POST_COURSE,Gbl.Forum.ForumSelected.PstCod);
|
||||||
|
|
67
swad_game.c
67
swad_game.c
|
@ -2729,23 +2729,15 @@ static void Gam_ListGameQuestions (struct Game *Game)
|
||||||
ActionToDoWithQuestions = Tst_SHOW_GAME_RESULT;
|
ActionToDoWithQuestions = Tst_SHOW_GAME_RESULT;
|
||||||
|
|
||||||
/***** Get data of questions from database *****/
|
/***** 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",
|
NumQsts = (unsigned) DB_QuerySELECT (&mysql_res,"can not get data of a question",
|
||||||
"SELECT tst_questions.QstCod,"
|
"SELECT tst_questions.QstCod," // row[0]
|
||||||
"tst_questions.AnsType,"
|
"tst_questions.AnsType," // row[1]
|
||||||
"tst_questions.Stem,"
|
"tst_questions.Stem," // row[2]
|
||||||
"tst_questions.Feedback,"
|
"tst_questions.Feedback," // row[3]
|
||||||
"tst_questions.ImageName,"
|
"tst_questions.MediaName," // row[4]
|
||||||
"tst_questions.ImageTitle,"
|
"tst_questions.MediaType," // row[5]
|
||||||
"tst_questions.ImageURL"
|
"tst_questions.MediaTitle," // row[6]
|
||||||
|
"tst_questions.MediaURL" // row[7]
|
||||||
" FROM gam_questions,tst_questions"
|
" FROM gam_questions,tst_questions"
|
||||||
" WHERE gam_questions.GamCod=%ld"
|
" WHERE gam_questions.GamCod=%ld"
|
||||||
" AND gam_questions.QstCod=tst_questions.QstCod"
|
" AND gam_questions.QstCod=tst_questions.QstCod"
|
||||||
|
@ -2850,9 +2842,10 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Game *Game,
|
||||||
row[1] AnsType
|
row[1] AnsType
|
||||||
row[2] Stem
|
row[2] Stem
|
||||||
row[3] Feedback
|
row[3] Feedback
|
||||||
row[4] ImageName
|
row[4] MediaName
|
||||||
row[5] ImageTitle
|
row[5] MediaType
|
||||||
row[6] ImageURL
|
row[6] MediaTitle
|
||||||
|
row[7] MediaURL
|
||||||
*/
|
*/
|
||||||
/***** Create test question *****/
|
/***** Create test question *****/
|
||||||
Tst_QstConstructor ();
|
Tst_QstConstructor ();
|
||||||
|
@ -2930,13 +2923,14 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Game *Game,
|
||||||
Tst_GetAndWriteTagsQst (Gbl.Test.QstCod);
|
Tst_GetAndWriteTagsQst (Gbl.Test.QstCod);
|
||||||
fprintf (Gbl.F.Out,"</td>");
|
fprintf (Gbl.F.Out,"</td>");
|
||||||
|
|
||||||
/* Write the stem (row[2]), the image (row[4], row[5], row[6]),
|
/* Write the stem (row[2]), the image (row[4], row[5], row[6], row[7]),
|
||||||
the feedback (row[3]) and the answers */
|
the feedback (row[3]) and the answers */
|
||||||
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
|
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
|
||||||
Gbl.RowEvenOdd);
|
Gbl.RowEvenOdd);
|
||||||
Tst_WriteQstStem (row[2],"TEST_EDI");
|
Tst_WriteQstStem (row[2],"TEST_EDI");
|
||||||
Img_GetImageNameTitleAndURLFromRow (row[4],row[5],row[6],&Gbl.Test.Image);
|
Med_GetMediaNameTitleAndURLFromRow (row[4],row[5],row[6],row[7],
|
||||||
Img_ShowImage (&Gbl.Test.Image,
|
&Gbl.Test.Media);
|
||||||
|
Med_ShowMedia (&Gbl.Test.Media,
|
||||||
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
|
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
|
||||||
"TEST_IMG_EDIT_LIST_STEM");
|
"TEST_IMG_EDIT_LIST_STEM");
|
||||||
Tst_WriteQstFeedback (row[3],"TEST_EDI_LIGHT");
|
Tst_WriteQstFeedback (row[3],"TEST_EDI_LIGHT");
|
||||||
|
@ -3534,22 +3528,14 @@ static void Gam_PlayGameShowQuestionAndAnswers (bool ShowAnswers)
|
||||||
QstInd = Gam_GetParamQstInd ();
|
QstInd = Gam_GetParamQstInd ();
|
||||||
|
|
||||||
/***** Get data of question from database *****/
|
/***** 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",
|
if (!DB_QuerySELECT (&mysql_res,"can not get data of a question",
|
||||||
"SELECT "
|
"SELECT tst_questions.QstCod," // row[0]
|
||||||
"tst_questions.QstCod,"
|
"tst_questions.AnsType," // row[1]
|
||||||
"tst_questions.AnsType,"
|
"tst_questions.Stem," // row[2]
|
||||||
"tst_questions.Stem,"
|
"tst_questions.MediaName," // row[3]
|
||||||
"tst_questions.ImageName,"
|
"tst_questions.MediaType," // row[4]
|
||||||
"tst_questions.ImageTitle,"
|
"tst_questions.MediaTitle," // row[5]
|
||||||
"tst_questions.ImageURL"
|
"tst_questions.MediaURL" // row[6]
|
||||||
" FROM gam_questions,tst_questions"
|
" FROM gam_questions,tst_questions"
|
||||||
" WHERE gam_questions.GamCod=%ld"
|
" WHERE gam_questions.GamCod=%ld"
|
||||||
" AND gam_questions.QstInd=%u"
|
" AND gam_questions.QstInd=%u"
|
||||||
|
@ -3568,10 +3554,11 @@ static void Gam_PlayGameShowQuestionAndAnswers (bool ShowAnswers)
|
||||||
|
|
||||||
fprintf (Gbl.F.Out,"<div class=\"GAM_PLAY_QST_CONTAINER\">");
|
fprintf (Gbl.F.Out,"<div class=\"GAM_PLAY_QST_CONTAINER\">");
|
||||||
|
|
||||||
/* Write the stem (row[2]) and the image (row[3], row[4], row[5]) */
|
/* Write the stem (row[2]) and the image (row[3], row[4], row[5], row[6]) */
|
||||||
Tst_WriteQstStem (row[2],"GAM_PLAY_QST");
|
Tst_WriteQstStem (row[2],"GAM_PLAY_QST");
|
||||||
Img_GetImageNameTitleAndURLFromRow (row[3],row[4],row[5],&Gbl.Test.Image);
|
Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6],
|
||||||
Img_ShowImage (&Gbl.Test.Image,
|
&Gbl.Test.Media);
|
||||||
|
Med_ShowMedia (&Gbl.Test.Media,
|
||||||
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
|
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
|
||||||
"TEST_IMG_EDIT_LIST_STEM");
|
"TEST_IMG_EDIT_LIST_STEM");
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,6 @@
|
||||||
#include "swad_forum.h"
|
#include "swad_forum.h"
|
||||||
#include "swad_game.h"
|
#include "swad_game.h"
|
||||||
#include "swad_holiday.h"
|
#include "swad_holiday.h"
|
||||||
#include "swad_image.h"
|
|
||||||
#include "swad_icon.h"
|
#include "swad_icon.h"
|
||||||
#include "swad_indicator.h"
|
#include "swad_indicator.h"
|
||||||
#include "swad_institution.h"
|
#include "swad_institution.h"
|
||||||
|
@ -62,8 +61,9 @@
|
||||||
#include "swad_link.h"
|
#include "swad_link.h"
|
||||||
#include "swad_mail.h"
|
#include "swad_mail.h"
|
||||||
#include "swad_mark.h"
|
#include "swad_mark.h"
|
||||||
#include "swad_message.h"
|
#include "swad_media.h"
|
||||||
#include "swad_menu.h"
|
#include "swad_menu.h"
|
||||||
|
#include "swad_message.h"
|
||||||
#include "swad_parameter.h"
|
#include "swad_parameter.h"
|
||||||
#include "swad_password.h"
|
#include "swad_password.h"
|
||||||
#include "swad_photo.h"
|
#include "swad_photo.h"
|
||||||
|
@ -702,7 +702,7 @@ struct Globals
|
||||||
char *Text;
|
char *Text;
|
||||||
size_t Length;
|
size_t Length;
|
||||||
} Stem, Feedback;
|
} Stem, Feedback;
|
||||||
struct Image Image;
|
struct Media Media;
|
||||||
bool Shuffle;
|
bool Shuffle;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
@ -713,7 +713,7 @@ struct Globals
|
||||||
bool Correct;
|
bool Correct;
|
||||||
char *Text;
|
char *Text;
|
||||||
char *Feedback;
|
char *Feedback;
|
||||||
struct Image Image;
|
struct Media Media;
|
||||||
} Options[Tst_MAX_OPTIONS_PER_QUESTION];
|
} Options[Tst_MAX_OPTIONS_PER_QUESTION];
|
||||||
long Integer;
|
long Integer;
|
||||||
double FloatingPoint[2];
|
double FloatingPoint[2];
|
||||||
|
|
673
swad_image.c
673
swad_image.c
|
@ -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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
/*****************************************************************************/
|
|
||||||
/*********************************** Headers *********************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
#include <linux/limits.h> // For PATH_MAX
|
|
||||||
#include <stdbool.h> // For boolean type
|
|
||||||
#include <stdlib.h> // For exit, system, malloc, free, etc
|
|
||||||
#include <string.h> // For string functions
|
|
||||||
#include <sys/wait.h> // For the macro WEXITSTATUS
|
|
||||||
#include <unistd.h> // 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,"<div class=\"IMG_UPLOAD_CONTAINER\">");
|
|
||||||
|
|
||||||
/***** Action to perform on image *****/
|
|
||||||
Par_PutHiddenParamUnsigned (ParamUploadImg.Action,(unsigned) Img_ACTION_NEW_IMAGE);
|
|
||||||
|
|
||||||
/***** Image file *****/
|
|
||||||
fprintf (Gbl.F.Out,"<label class=\"IMG_UPLOAD_BUTTON\">"
|
|
||||||
"<img src=\"%s/camera.svg\""
|
|
||||||
" alt=\"%s\" title=\"%s (%s)\""
|
|
||||||
" class=\"IMG_UPLOAD_ICO\" />"
|
|
||||||
"<input type=\"file\" name=\"%s\" accept=\"image/*\""
|
|
||||||
" class=\"IMG_UPLOAD_FILE\""
|
|
||||||
" onchange=\"imageUploadOnSelectFile (this,'%s');\" />"
|
|
||||||
"<span id=\"%s_fil\" class=\"IMG_UPLOAD_FILENAME\" />"
|
|
||||||
"</span>"
|
|
||||||
"</label>",
|
|
||||||
Gbl.Prefs.URLIcons,
|
|
||||||
Txt_Image,Txt_Image,Txt_optional,
|
|
||||||
ParamUploadImg.File,
|
|
||||||
Id,Id);
|
|
||||||
|
|
||||||
/***** Image title/attribution and URL *****/
|
|
||||||
fprintf (Gbl.F.Out,"<div id=\"%s_tit_url\" style=\"display:none;\">",
|
|
||||||
Id);
|
|
||||||
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"%s\""
|
|
||||||
" placeholder=\"%s (%s)\""
|
|
||||||
" class=\"%s\" maxlength=\"%u\" value=\"\" />",
|
|
||||||
ParamUploadImg.Title,
|
|
||||||
Txt_Image_title_attribution,Txt_optional,
|
|
||||||
ClassImgTitURL,Img_MAX_CHARS_TITLE);
|
|
||||||
fprintf (Gbl.F.Out,"<br />"
|
|
||||||
"<input type=\"url\" name=\"%s\""
|
|
||||||
" placeholder=\"%s (%s)\""
|
|
||||||
" class=\"%s\" maxlength=\"%u\" value=\"\" />",
|
|
||||||
ParamUploadImg.URL,
|
|
||||||
Txt_Link,Txt_optional,
|
|
||||||
ClassImgTitURL,Cns_MAX_CHARS_WWW);
|
|
||||||
fprintf (Gbl.F.Out,"</div>");
|
|
||||||
|
|
||||||
/***** End container *****/
|
|
||||||
fprintf (Gbl.F.Out,"</div>");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/***************************** 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,"<div class=\"%s\">",ClassContainer);
|
|
||||||
|
|
||||||
/* Start optional link to external URL */
|
|
||||||
if (PutLink)
|
|
||||||
fprintf (Gbl.F.Out,"<a href=\"%s\" target=\"_blank\">",Image->URL);
|
|
||||||
|
|
||||||
/* Image */
|
|
||||||
fprintf (Gbl.F.Out,"<img src=\"%s\" class=\"%s\" alt=\"\"",URL,ClassImg);
|
|
||||||
if (Image->Title)
|
|
||||||
if (Image->Title[0])
|
|
||||||
fprintf (Gbl.F.Out," title=\"%s\"",Image->Title);
|
|
||||||
fprintf (Gbl.F.Out," lazyload=\"on\" />"); // Lazy load of the image
|
|
||||||
|
|
||||||
/* End optional link to external URL */
|
|
||||||
if (PutLink)
|
|
||||||
fprintf (Gbl.F.Out,"</a>");
|
|
||||||
|
|
||||||
/* End image container */
|
|
||||||
fprintf (Gbl.F.Out,"</div>");
|
|
||||||
}
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
142
swad_image.h
142
swad_image.h
|
@ -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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
/*****************************************************************************/
|
|
||||||
/********************************* 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
|
|
|
@ -121,7 +121,7 @@ static void Msg_ContractSentMsg (long MsgCod);
|
||||||
static void Msg_ContractReceivedMsg (long MsgCod);
|
static void Msg_ContractReceivedMsg (long MsgCod);
|
||||||
|
|
||||||
static long Msg_InsertNewMsg (const char *Subject,const char *Content,
|
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,
|
static unsigned long Msg_DelSomeRecOrSntMsgsUsr (Msg_TypeOfMessages_t TypeOfMessages,long UsrCod,
|
||||||
long FilterCrsCod,const char *FilterFromToSubquery);
|
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],
|
char Subject[Cns_MAX_BYTES_SUBJECT + 1],
|
||||||
bool *Deleted);
|
bool *Deleted);
|
||||||
static void Msg_GetMsgContent (long MsgCod,char Content[Cns_MAX_BYTES_LONG_TEXT + 1],
|
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_WriteSentOrReceivedMsgSubject (long MsgCod,const char *Subject,bool Open,bool Expanded);
|
||||||
static void Msg_WriteFormToReply (long MsgCod,long CrsCod,
|
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 ();
|
Lay_HelpPlainEditor ();
|
||||||
|
|
||||||
/***** Attached image (optional) *****/
|
/***** Attached image (optional) *****/
|
||||||
Img_PutImageUploader (-1,"MSG_IMG_TIT_URL");
|
Med_PutMediaUploader (-1,"MSG_IMG_TIT_URL");
|
||||||
|
|
||||||
/***** Send button *****/
|
/***** Send button *****/
|
||||||
Btn_PutCreateButton (Txt_Send_message);
|
Btn_PutCreateButton (Txt_Send_message);
|
||||||
|
@ -669,7 +669,7 @@ void Msg_RecMsgFromUsr (void)
|
||||||
bool CreateNotif;
|
bool CreateNotif;
|
||||||
bool NotifyByEmail;
|
bool NotifyByEmail;
|
||||||
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
|
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
|
||||||
struct Image Image;
|
struct Media Media;
|
||||||
bool Error = false;
|
bool Error = false;
|
||||||
|
|
||||||
/***** Get data from form *****/
|
/***** Get data from form *****/
|
||||||
|
@ -727,13 +727,13 @@ void Msg_RecMsgFromUsr (void)
|
||||||
Usr_UsrDataConstructor (&UsrDstData);
|
Usr_UsrDataConstructor (&UsrDstData);
|
||||||
|
|
||||||
/***** Initialize image *****/
|
/***** Initialize image *****/
|
||||||
Img_ImageConstructor (&Image);
|
Med_MediaConstructor (&Media);
|
||||||
|
|
||||||
/***** Get attached image (action, file and title) *****/
|
/***** Get attached image (action, file and title) *****/
|
||||||
Image.Width = Msg_IMAGE_SAVED_MAX_WIDTH;
|
Media.Width = Msg_IMAGE_SAVED_MAX_WIDTH;
|
||||||
Image.Height = Msg_IMAGE_SAVED_MAX_HEIGHT;
|
Media.Height = Msg_IMAGE_SAVED_MAX_HEIGHT;
|
||||||
Image.Quality = Msg_IMAGE_SAVED_QUALITY;
|
Media.Quality = Msg_IMAGE_SAVED_QUALITY;
|
||||||
Img_GetImageFromForm (-1,&Image,NULL);
|
Med_GetMediaFromForm (-1,&Media,NULL);
|
||||||
|
|
||||||
/***** Loop over the list Gbl.Usrs.Select[Rol_UNK], that holds the list of the
|
/***** Loop over the list Gbl.Usrs.Select[Rol_UNK], that holds the list of the
|
||||||
recipients, creating a received message for each recipient *****/
|
recipients, creating a received message for each recipient *****/
|
||||||
|
@ -761,7 +761,7 @@ void Msg_RecMsgFromUsr (void)
|
||||||
if (!MsgAlreadyInserted)
|
if (!MsgAlreadyInserted)
|
||||||
{
|
{
|
||||||
// The message is inserted only once in the table of messages sent
|
// 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;
|
MsgAlreadyInserted = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -806,7 +806,7 @@ void Msg_RecMsgFromUsr (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Free image *****/
|
/***** Free image *****/
|
||||||
Img_ImageDestructor (&Image);
|
Med_MediaDestructor (&Media);
|
||||||
|
|
||||||
/***** Free memory used for user's data *****/
|
/***** Free memory used for user's data *****/
|
||||||
Usr_UsrDataDestructor (&UsrDstData);
|
Usr_UsrDataDestructor (&UsrDstData);
|
||||||
|
@ -1277,27 +1277,28 @@ void Msg_SetReceivedMsgAsOpen (long MsgCod,long UsrCod)
|
||||||
// Return the code of the new inserted message
|
// Return the code of the new inserted message
|
||||||
|
|
||||||
static long Msg_InsertNewMsg (const char *Subject,const char *Content,
|
static long Msg_InsertNewMsg (const char *Subject,const char *Content,
|
||||||
struct Image *Image)
|
struct Media *Media)
|
||||||
{
|
{
|
||||||
long MsgCod;
|
long MsgCod;
|
||||||
|
|
||||||
/***** Check if image is received and processed *****/
|
/***** Check if image is received and processed *****/
|
||||||
if (Image->Action == Img_ACTION_NEW_IMAGE && // Upload new image
|
if (Media->Action == Med_ACTION_NEW_MEDIA && // Upload new image
|
||||||
Image->Status == Img_FILE_PROCESSED) // The new image received has been processed
|
Media->Status == Med_FILE_PROCESSED) // The new image received has been processed
|
||||||
/* Move processed image to definitive directory */
|
/* Move processed image to definitive directory */
|
||||||
Img_MoveImageToDefinitiveDirectory (Image);
|
Med_MoveMediaToDefinitiveDirectory (Media);
|
||||||
|
|
||||||
/***** Insert message subject and content in the database *****/
|
/***** Insert message subject and content in the database *****/
|
||||||
MsgCod =
|
MsgCod =
|
||||||
DB_QueryINSERTandReturnCode ("can not create message",
|
DB_QueryINSERTandReturnCode ("can not create message",
|
||||||
"INSERT INTO msg_content"
|
"INSERT INTO msg_content"
|
||||||
" (Subject,Content,ImageName,ImageTitle,ImageURL)"
|
" (Subject,Content,MediaName,MediaType,MediaTitle,MediaURL)"
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" ('%s','%s','%s','%s','%s')",
|
" ('%s','%s','%s','%s','%s','%s')",
|
||||||
Subject,Content,
|
Subject,Content,
|
||||||
Image->Name,
|
Media->Name,
|
||||||
Image->Title ? Image->Title : "",
|
Med_GetStringTypeForDB (Media->Type),
|
||||||
Image->URL ? Image->URL : "");
|
Media->Title ? Media->Title : "",
|
||||||
|
Media->URL ? Media->URL : "");
|
||||||
|
|
||||||
/***** Insert message in sent messages *****/
|
/***** Insert message in sent messages *****/
|
||||||
DB_QueryINSERT ("can not create message",
|
DB_QueryINSERT ("can not create message",
|
||||||
|
@ -1490,8 +1491,8 @@ static void Msg_MoveMsgContentToDeleted (long MsgCod)
|
||||||
/* Insert message content into msg_content_deleted */
|
/* Insert message content into msg_content_deleted */
|
||||||
DB_QueryINSERT ("can not remove the content of a message",
|
DB_QueryINSERT ("can not remove the content of a message",
|
||||||
"INSERT IGNORE INTO msg_content_deleted"
|
"INSERT IGNORE INTO msg_content_deleted"
|
||||||
" (MsgCod,Subject,Content,ImageName,ImageTitle,ImageURL)"
|
" (MsgCod,Subject,Content,MediaName,MediaType,MediaTitle,MediaURL)"
|
||||||
" SELECT MsgCod,Subject,Content,ImageName,ImageTitle,ImageURL"
|
" SELECT MsgCod,Subject,Content,MediaName,MediaType,MediaTitle,MediaURL"
|
||||||
" FROM msg_content WHERE MsgCod=%ld",
|
" FROM msg_content WHERE MsgCod=%ld",
|
||||||
MsgCod);
|
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],
|
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_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
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 *****/
|
/***** Get content of message from database *****/
|
||||||
NumRows = DB_QuerySELECT (&mysql_res,"can not get the content of a message",
|
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",
|
" FROM msg_content WHERE MsgCod=%ld",
|
||||||
MsgCod);
|
MsgCod);
|
||||||
|
|
||||||
|
@ -2797,8 +2802,8 @@ static void Msg_GetMsgContent (long MsgCod,char Content[Cns_MAX_BYTES_LONG_TEXT
|
||||||
Str_Copy (Content,row[0],
|
Str_Copy (Content,row[0],
|
||||||
Cns_MAX_BYTES_LONG_TEXT);
|
Cns_MAX_BYTES_LONG_TEXT);
|
||||||
|
|
||||||
/****** Get image name (row[1]), title (row[2]) and URL (row[3]) *****/
|
/****** Get image name (row[1]), type (row[2]), title (row[3]) and URL (row[4]) *****/
|
||||||
Img_GetImageNameTitleAndURLFromRow (row[1],row[2],row[3],Image);
|
Med_GetMediaNameTitleAndURLFromRow (row[1],row[2],row[3],row[4],Media);
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
/***** Free structure that stores the query result *****/
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
@ -2897,7 +2902,7 @@ static void Msg_ShowASentOrReceivedMessage (long MsgNum,long MsgCod)
|
||||||
long CrsCod;
|
long CrsCod;
|
||||||
char Subject[Cns_MAX_BYTES_SUBJECT + 1];
|
char Subject[Cns_MAX_BYTES_SUBJECT + 1];
|
||||||
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
|
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
|
||||||
struct Image Image;
|
struct Media Media;
|
||||||
bool Deleted;
|
bool Deleted;
|
||||||
bool Open = true;
|
bool Open = true;
|
||||||
bool Replied = false; // Initialized to avoid warning
|
bool Replied = false; // Initialized to avoid warning
|
||||||
|
@ -3030,21 +3035,21 @@ static void Msg_ShowASentOrReceivedMessage (long MsgNum,long MsgCod)
|
||||||
Txt_MSG_Content);
|
Txt_MSG_Content);
|
||||||
|
|
||||||
/***** Initialize image *****/
|
/***** Initialize image *****/
|
||||||
Img_ImageConstructor (&Image);
|
Med_MediaConstructor (&Media);
|
||||||
|
|
||||||
/***** Get message content and optional image *****/
|
/***** Get message content and optional image *****/
|
||||||
Msg_GetMsgContent (MsgCod,Content,&Image);
|
Msg_GetMsgContent (MsgCod,Content,&Media);
|
||||||
|
|
||||||
/***** Show content and image *****/
|
/***** Show content and image *****/
|
||||||
fprintf (Gbl.F.Out,"<td colspan=\"2\" class=\"MSG_TXT LEFT_TOP\">");
|
fprintf (Gbl.F.Out,"<td colspan=\"2\" class=\"MSG_TXT LEFT_TOP\">");
|
||||||
if (Content[0])
|
if (Content[0])
|
||||||
Msg_WriteMsgContent (Content,Cns_MAX_BYTES_LONG_TEXT,true,false);
|
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,"</td>"
|
fprintf (Gbl.F.Out,"</td>"
|
||||||
"</tr>");
|
"</tr>");
|
||||||
|
|
||||||
/***** Free image *****/
|
/***** Free image *****/
|
||||||
Img_ImageDestructor (&Image);
|
Med_MediaDestructor (&Media);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Free memory used for user's data *****/
|
/***** Free memory used for user's data *****/
|
||||||
|
|
182
swad_social.c
182
swad_social.c
|
@ -40,8 +40,8 @@
|
||||||
#include "swad_follow.h"
|
#include "swad_follow.h"
|
||||||
#include "swad_form.h"
|
#include "swad_form.h"
|
||||||
#include "swad_global.h"
|
#include "swad_global.h"
|
||||||
#include "swad_image.h"
|
|
||||||
#include "swad_layout.h"
|
#include "swad_layout.h"
|
||||||
|
#include "swad_media.h"
|
||||||
#include "swad_notice.h"
|
#include "swad_notice.h"
|
||||||
#include "swad_notification.h"
|
#include "swad_notification.h"
|
||||||
#include "swad_parameter.h"
|
#include "swad_parameter.h"
|
||||||
|
@ -113,7 +113,7 @@ struct SocialComment
|
||||||
time_t DateTimeUTC;
|
time_t DateTimeUTC;
|
||||||
unsigned NumFavs; // Number of times (users) this comment has been favourited
|
unsigned NumFavs; // Number of times (users) this comment has been favourited
|
||||||
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
|
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 ************************/
|
/************************ Build query to get timeline ************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
// Query must have space for at least 1024 chars
|
|
||||||
|
|
||||||
#define Soc_MAX_BYTES_SUBQUERY_ALREADY_EXISTS (256 - 1)
|
#define Soc_MAX_BYTES_SUBQUERY_ALREADY_EXISTS (256 - 1)
|
||||||
|
|
||||||
|
@ -1809,15 +1808,19 @@ static void Soc_GetAndWriteSocialPost (long PstCod)
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
unsigned long NumRows;
|
unsigned long NumRows;
|
||||||
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
|
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
|
||||||
struct Image Image;
|
struct Media Media;
|
||||||
|
|
||||||
/***** Initialize image *****/
|
/***** Initialize image *****/
|
||||||
Img_ImageConstructor (&Image);
|
Med_MediaConstructor (&Media);
|
||||||
|
|
||||||
/***** Get social post from database *****/
|
/***** Get social post from database *****/
|
||||||
NumRows = DB_QuerySELECT (&mysql_res,"can not get the content"
|
NumRows = DB_QuerySELECT (&mysql_res,"can not get the content"
|
||||||
" of a social post",
|
" 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",
|
" FROM social_posts WHERE PstCod=%ld",
|
||||||
PstCod);
|
PstCod);
|
||||||
|
|
||||||
|
@ -1830,8 +1833,8 @@ static void Soc_GetAndWriteSocialPost (long PstCod)
|
||||||
Str_Copy (Content,row[0],
|
Str_Copy (Content,row[0],
|
||||||
Cns_MAX_BYTES_LONG_TEXT);
|
Cns_MAX_BYTES_LONG_TEXT);
|
||||||
|
|
||||||
/****** Get image name (row[1]), title (row[2]) and URL (row[3]) *****/
|
/****** Get image name (row[1]), type (row[2]), title (row[3]) and URL (row[4]) *****/
|
||||||
Img_GetImageNameTitleAndURLFromRow (row[1],row[2],row[3],&Image);
|
Med_GetMediaNameTitleAndURLFromRow (row[1],row[2],row[3],row[4],&Media);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Content[0] = '\0';
|
Content[0] = '\0';
|
||||||
|
@ -1848,11 +1851,11 @@ static void Soc_GetAndWriteSocialPost (long PstCod)
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Show image *****/
|
/***** 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");
|
"TL_POST_IMG TL_RIGHT_WIDTH");
|
||||||
|
|
||||||
/***** Free image *****/
|
/***** Free image *****/
|
||||||
Img_ImageDestructor (&Image);
|
Med_MediaDestructor (&Media);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -2381,7 +2384,7 @@ static void Soc_PutTextarea (const char *Placeholder,
|
||||||
Lay_HelpPlainEditor ();
|
Lay_HelpPlainEditor ();
|
||||||
|
|
||||||
/***** Attached image (optional) *****/
|
/***** Attached image (optional) *****/
|
||||||
Img_PutImageUploader (-1,ClassImgTit);
|
Med_PutMediaUploader (-1,ClassImgTit);
|
||||||
|
|
||||||
/***** Submit button *****/
|
/***** Submit button *****/
|
||||||
fprintf (Gbl.F.Out,"<button type=\"submit\""
|
fprintf (Gbl.F.Out,"<button type=\"submit\""
|
||||||
|
@ -2436,7 +2439,7 @@ void Soc_ReceiveSocialPostUsr (void)
|
||||||
static long Soc_ReceiveSocialPost (void)
|
static long Soc_ReceiveSocialPost (void)
|
||||||
{
|
{
|
||||||
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
|
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
|
||||||
struct Image Image;
|
struct Media Media;
|
||||||
long PstCod;
|
long PstCod;
|
||||||
struct SocialPublishing SocPub;
|
struct SocialPublishing SocPub;
|
||||||
|
|
||||||
|
@ -2445,37 +2448,38 @@ static long Soc_ReceiveSocialPost (void)
|
||||||
Str_TO_RIGOROUS_HTML,true);
|
Str_TO_RIGOROUS_HTML,true);
|
||||||
|
|
||||||
/***** Initialize image *****/
|
/***** Initialize image *****/
|
||||||
Img_ImageConstructor (&Image);
|
Med_MediaConstructor (&Media);
|
||||||
|
|
||||||
/***** Get attached image (action, file and title) *****/
|
/***** Get attached image (action, file and title) *****/
|
||||||
Image.Width = Soc_IMAGE_SAVED_MAX_WIDTH;
|
Media.Width = Soc_IMAGE_SAVED_MAX_WIDTH;
|
||||||
Image.Height = Soc_IMAGE_SAVED_MAX_HEIGHT;
|
Media.Height = Soc_IMAGE_SAVED_MAX_HEIGHT;
|
||||||
Image.Quality = Soc_IMAGE_SAVED_QUALITY;
|
Media.Quality = Soc_IMAGE_SAVED_QUALITY;
|
||||||
Img_GetImageFromForm (-1,&Image,NULL);
|
Med_GetMediaFromForm (-1,&Media,NULL);
|
||||||
|
|
||||||
if (Content[0] || // Text not empty
|
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 *****/
|
/***** Check if image is received and processed *****/
|
||||||
if (Image.Action == Img_ACTION_NEW_IMAGE && // Upload new image
|
if (Media.Action == Med_ACTION_NEW_MEDIA && // Upload new image
|
||||||
Image.Status == Img_FILE_PROCESSED) // The new image received has been processed
|
Media.Status == Med_FILE_PROCESSED) // The new image received has been processed
|
||||||
/* Move processed image to definitive directory */
|
/* Move processed image to definitive directory */
|
||||||
Img_MoveImageToDefinitiveDirectory (&Image);
|
Med_MoveMediaToDefinitiveDirectory (&Media);
|
||||||
|
|
||||||
/***** Publish *****/
|
/***** Publish *****/
|
||||||
/* Insert post content in the database */
|
/* Insert post content in the database */
|
||||||
PstCod =
|
PstCod =
|
||||||
DB_QueryINSERTandReturnCode ("can not create post",
|
DB_QueryINSERTandReturnCode ("can not create post",
|
||||||
"INSERT INTO social_posts"
|
"INSERT INTO social_posts"
|
||||||
" (Content,ImageName,ImageTitle,ImageURL)"
|
" (Content,MediaName,MediaType,MediaTitle,MediaURL)"
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" ('%s','%s','%s','%s')",
|
" ('%s','%s','%s','%s','%s')",
|
||||||
Content,
|
Content,
|
||||||
Image.Name,
|
Media.Name,
|
||||||
(Image.Name[0] && // Save image title only if image attached
|
Med_GetStringTypeForDB (Media.Type),
|
||||||
Image.Title) ? Image.Title : "",
|
(Media.Name[0] && // Save image title only if image attached
|
||||||
(Image.Name[0] && // Save image URL only if image attached
|
Media.Title) ? Media.Title : "",
|
||||||
Image.URL ) ? Image.URL : "");
|
(Media.Name[0] && // Save image URL only if image attached
|
||||||
|
Media.URL ) ? Media.URL : "");
|
||||||
|
|
||||||
/* Insert post in social notes */
|
/* Insert post in social notes */
|
||||||
Soc_StoreAndPublishSocialNote (Soc_NOTE_SOCIAL_POST,PstCod,&SocPub);
|
Soc_StoreAndPublishSocialNote (Soc_NOTE_SOCIAL_POST,PstCod,&SocPub);
|
||||||
|
@ -2487,7 +2491,7 @@ static long Soc_ReceiveSocialPost (void)
|
||||||
SocPub.NotCod = -1L;
|
SocPub.NotCod = -1L;
|
||||||
|
|
||||||
/***** Free image *****/
|
/***** Free image *****/
|
||||||
Img_ImageDestructor (&Image);
|
Med_MediaDestructor (&Media);
|
||||||
|
|
||||||
return SocPub.NotCod;
|
return SocPub.NotCod;
|
||||||
}
|
}
|
||||||
|
@ -2616,9 +2620,10 @@ static void Soc_WriteCommentsInSocialNote (const struct SocialNote *SocNot)
|
||||||
"UNIX_TIMESTAMP("
|
"UNIX_TIMESTAMP("
|
||||||
"social_pubs.TimePublish)," // row[3]
|
"social_pubs.TimePublish)," // row[3]
|
||||||
"social_comments.Content," // row[4]
|
"social_comments.Content," // row[4]
|
||||||
"social_comments.ImageName," // row[5]
|
"social_comments.MediaName," // row[5]
|
||||||
"social_comments.ImageTitle," // row[6]
|
"social_comments.MediaType," // row[6]
|
||||||
"social_comments.ImageURL" // row[7]
|
"social_comments.MediaTitle," // row[7]
|
||||||
|
"social_comments.MediaURL" // row[8]
|
||||||
" FROM social_pubs,social_comments"
|
" FROM social_pubs,social_comments"
|
||||||
" WHERE social_pubs.NotCod=%ld"
|
" WHERE social_pubs.NotCod=%ld"
|
||||||
" AND social_pubs.PubType=%u"
|
" AND social_pubs.PubType=%u"
|
||||||
|
@ -2687,7 +2692,7 @@ static void Soc_WriteOneSocialCommentInList (MYSQL_RES *mysql_res)
|
||||||
struct SocialComment SocCom;
|
struct SocialComment SocCom;
|
||||||
|
|
||||||
/***** Initialize image *****/
|
/***** Initialize image *****/
|
||||||
Img_ImageConstructor (&SocCom.Image);
|
Med_MediaConstructor (&SocCom.Media);
|
||||||
|
|
||||||
/***** Get data of social comment *****/
|
/***** Get data of social comment *****/
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
@ -2699,7 +2704,7 @@ static void Soc_WriteOneSocialCommentInList (MYSQL_RES *mysql_res)
|
||||||
false);
|
false);
|
||||||
|
|
||||||
/***** Free image *****/
|
/***** Free image *****/
|
||||||
Img_ImageDestructor (&SocCom.Image);
|
Med_MediaDestructor (&SocCom.Media);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -2711,7 +2716,7 @@ static void Soc_PutIconToToggleComments (const char *UniqueId,
|
||||||
{
|
{
|
||||||
extern const char *The_ClassFormInBox[The_NUM_THEMES];
|
extern const char *The_ClassFormInBox[The_NUM_THEMES];
|
||||||
|
|
||||||
/***** Link to toggle on/off some fields of project *****/
|
/***** Link to toggle on/off some divs *****/
|
||||||
fprintf (Gbl.F.Out,"<a href=\"\" title=\"%s\" class=\"%s\""
|
fprintf (Gbl.F.Out,"<a href=\"\" title=\"%s\" class=\"%s\""
|
||||||
" onclick=\"toggleComments('%s');"
|
" onclick=\"toggleComments('%s');"
|
||||||
"return false;\" />",
|
"return false;\" />",
|
||||||
|
@ -2804,7 +2809,7 @@ static void Soc_WriteSocialComment (struct SocialComment *SocCom,
|
||||||
fprintf (Gbl.F.Out,"</div>");
|
fprintf (Gbl.F.Out,"</div>");
|
||||||
|
|
||||||
/* Show image */
|
/* 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");
|
"TL_COMMENT_IMG TL_COMMENT_WIDTH");
|
||||||
|
|
||||||
/* Put icon to mark this social comment as favourite */
|
/* 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;
|
extern const char *Txt_The_original_post_no_longer_exists;
|
||||||
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
|
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
|
||||||
struct Image Image;
|
struct Media Media;
|
||||||
struct SocialNote SocNot;
|
struct SocialNote SocNot;
|
||||||
struct SocialPublishing SocPub;
|
struct SocialPublishing SocPub;
|
||||||
|
|
||||||
|
@ -3169,22 +3174,22 @@ static long Soc_ReceiveComment (void)
|
||||||
Str_TO_RIGOROUS_HTML,true);
|
Str_TO_RIGOROUS_HTML,true);
|
||||||
|
|
||||||
/***** Initialize image *****/
|
/***** Initialize image *****/
|
||||||
Img_ImageConstructor (&Image);
|
Med_MediaConstructor (&Media);
|
||||||
|
|
||||||
/***** Get attached image (action, file and title) *****/
|
/***** Get attached image (action, file and title) *****/
|
||||||
Image.Width = Soc_IMAGE_SAVED_MAX_WIDTH;
|
Media.Width = Soc_IMAGE_SAVED_MAX_WIDTH;
|
||||||
Image.Height = Soc_IMAGE_SAVED_MAX_HEIGHT;
|
Media.Height = Soc_IMAGE_SAVED_MAX_HEIGHT;
|
||||||
Image.Quality = Soc_IMAGE_SAVED_QUALITY;
|
Media.Quality = Soc_IMAGE_SAVED_QUALITY;
|
||||||
Img_GetImageFromForm (-1,&Image,NULL);
|
Med_GetMediaFromForm (-1,&Media,NULL);
|
||||||
|
|
||||||
if (Content[0] || // Text not empty
|
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 *****/
|
/***** Check if image is received and processed *****/
|
||||||
if (Image.Action == Img_ACTION_NEW_IMAGE && // Upload new image
|
if (Media.Action == Med_ACTION_NEW_MEDIA && // Upload new image
|
||||||
Image.Status == Img_FILE_PROCESSED) // The new image received has been processed
|
Media.Status == Med_FILE_PROCESSED) // The new image received has been processed
|
||||||
/* Move processed image to definitive directory */
|
/* Move processed image to definitive directory */
|
||||||
Img_MoveImageToDefinitiveDirectory (&Image);
|
Med_MoveMediaToDefinitiveDirectory (&Media);
|
||||||
|
|
||||||
/***** Publish *****/
|
/***** Publish *****/
|
||||||
/* Insert into publishings */
|
/* Insert into publishings */
|
||||||
|
@ -3196,16 +3201,17 @@ static long Soc_ReceiveComment (void)
|
||||||
/* Insert comment content in the database */
|
/* Insert comment content in the database */
|
||||||
DB_QueryINSERT ("can not store comment content",
|
DB_QueryINSERT ("can not store comment content",
|
||||||
"INSERT INTO social_comments"
|
"INSERT INTO social_comments"
|
||||||
" (PubCod,Content,ImageName,ImageTitle,ImageURL)"
|
" (PubCod,Content,MediaName,MediaType,MediaTitle,MediaURL)"
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" (%ld,'%s','%s','%s','%s')",
|
" (%ld,'%s','%s','%s','%s','%s')",
|
||||||
SocPub.PubCod,
|
SocPub.PubCod,
|
||||||
Content,
|
Content,
|
||||||
Image.Name,
|
Media.Name,
|
||||||
(Image.Name[0] && // Save image title only if image attached
|
Med_GetStringTypeForDB (Media.Type),
|
||||||
Image.Title) ? Image.Title : "",
|
(Media.Name[0] && // Save image title only if image attached
|
||||||
(Image.Name[0] && // Save image URL only if image attached
|
Media.Title) ? Media.Title : "",
|
||||||
Image.URL ) ? Image.URL : "");
|
(Media.Name[0] && // Save image URL only if image attached
|
||||||
|
Media.URL ) ? Media.URL : "");
|
||||||
|
|
||||||
/***** Store notifications about the new comment *****/
|
/***** Store notifications about the new comment *****/
|
||||||
Ntf_StoreNotifyEventsToAllUsrs (Ntf_EVENT_TIMELINE_COMMENT,SocPub.PubCod);
|
Ntf_StoreNotifyEventsToAllUsrs (Ntf_EVENT_TIMELINE_COMMENT,SocPub.PubCod);
|
||||||
|
@ -3220,7 +3226,7 @@ static long Soc_ReceiveComment (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Free image *****/
|
/***** Free image *****/
|
||||||
Img_ImageDestructor (&Image);
|
Med_MediaDestructor (&Media);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Ale_ShowAlert (Ale_WARNING,Txt_The_original_post_no_longer_exists);
|
Ale_ShowAlert (Ale_WARNING,Txt_The_original_post_no_longer_exists);
|
||||||
|
@ -3411,7 +3417,7 @@ static void Soc_FavSocialComment (struct SocialComment *SocCom)
|
||||||
bool ItsMe;
|
bool ItsMe;
|
||||||
|
|
||||||
/***** Initialize image *****/
|
/***** Initialize image *****/
|
||||||
Img_ImageConstructor (&SocCom->Image);
|
Med_MediaConstructor (&SocCom->Media);
|
||||||
|
|
||||||
/***** Get data of social comment *****/
|
/***** Get data of social comment *****/
|
||||||
SocCom->PubCod = Soc_GetParamPubCod ();
|
SocCom->PubCod = Soc_GetParamPubCod ();
|
||||||
|
@ -3443,7 +3449,7 @@ static void Soc_FavSocialComment (struct SocialComment *SocCom)
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Free image *****/
|
/***** Free image *****/
|
||||||
Img_ImageDestructor (&SocCom->Image);
|
Med_MediaDestructor (&SocCom->Media);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -3665,7 +3671,7 @@ static void Soc_UnfavSocialComment (struct SocialComment *SocCom)
|
||||||
bool ItsMe;
|
bool ItsMe;
|
||||||
|
|
||||||
/***** Initialize image *****/
|
/***** Initialize image *****/
|
||||||
Img_ImageConstructor (&SocCom->Image);
|
Med_MediaConstructor (&SocCom->Media);
|
||||||
|
|
||||||
/***** Get data of social comment *****/
|
/***** Get data of social comment *****/
|
||||||
SocCom->PubCod = Soc_GetParamPubCod ();
|
SocCom->PubCod = Soc_GetParamPubCod ();
|
||||||
|
@ -3695,7 +3701,7 @@ static void Soc_UnfavSocialComment (struct SocialComment *SocCom)
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Free image *****/
|
/***** 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)
|
static void Soc_RemoveImgFileFromSocialPost (long PstCod)
|
||||||
{
|
{
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
|
||||||
|
|
||||||
/***** Get name of image associated to a social post from database *****/
|
/***** Get name of image associated to a social post from database *****/
|
||||||
if (DB_QuerySELECT (&mysql_res,"can not get image",
|
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))
|
PstCod))
|
||||||
{
|
/***** Remove media file *****/
|
||||||
/***** Get image name (row[0]) *****/
|
Med_RemoveMediaFileFromRow (mysql_res);
|
||||||
row = mysql_fetch_row (mysql_res);
|
|
||||||
|
|
||||||
/***** Remove image file *****/
|
|
||||||
Img_RemoveImageFile (row[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
/***** Free structure that stores the query result *****/
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
@ -4072,7 +4075,7 @@ static void Soc_RequestRemovalSocialComment (void)
|
||||||
bool ItsMe;
|
bool ItsMe;
|
||||||
|
|
||||||
/***** Initialize image *****/
|
/***** Initialize image *****/
|
||||||
Img_ImageConstructor (&SocCom.Image);
|
Med_MediaConstructor (&SocCom.Media);
|
||||||
|
|
||||||
/***** Get data of social comment *****/
|
/***** Get data of social comment *****/
|
||||||
SocCom.PubCod = Soc_GetParamPubCod ();
|
SocCom.PubCod = Soc_GetParamPubCod ();
|
||||||
|
@ -4108,7 +4111,7 @@ static void Soc_RequestRemovalSocialComment (void)
|
||||||
Ale_ShowAlert (Ale_WARNING,Txt_The_comment_no_longer_exists);
|
Ale_ShowAlert (Ale_WARNING,Txt_The_comment_no_longer_exists);
|
||||||
|
|
||||||
/***** Free image *****/
|
/***** Free image *****/
|
||||||
Img_ImageDestructor (&SocCom.Image);
|
Med_MediaDestructor (&SocCom.Media);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -4166,7 +4169,7 @@ static void Soc_RemoveSocialComment (void)
|
||||||
bool ItsMe;
|
bool ItsMe;
|
||||||
|
|
||||||
/***** Initialize image *****/
|
/***** Initialize image *****/
|
||||||
Img_ImageConstructor (&SocCom.Image);
|
Med_MediaConstructor (&SocCom.Media);
|
||||||
|
|
||||||
/***** Get data of social comment *****/
|
/***** Get data of social comment *****/
|
||||||
SocCom.PubCod = Soc_GetParamPubCod ();
|
SocCom.PubCod = Soc_GetParamPubCod ();
|
||||||
|
@ -4191,7 +4194,7 @@ static void Soc_RemoveSocialComment (void)
|
||||||
Ale_ShowAlert (Ale_WARNING,Txt_The_comment_no_longer_exists);
|
Ale_ShowAlert (Ale_WARNING,Txt_The_comment_no_longer_exists);
|
||||||
|
|
||||||
/***** Free image *****/
|
/***** 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)
|
static void Soc_RemoveImgFileFromSocialComment (long PubCod)
|
||||||
{
|
{
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
|
||||||
|
|
||||||
/***** Get name of image associated to a social post from database *****/
|
/***** Get name of media associated to a social post from database *****/
|
||||||
if (DB_QuerySELECT (&mysql_res,"can not get image",
|
if (DB_QuerySELECT (&mysql_res,"can not get media",
|
||||||
"SELECT ImageName FROM social_comments"
|
"SELECT MediaName," // row[0]
|
||||||
|
"MediaType" // row[1]
|
||||||
|
" FROM social_comments"
|
||||||
" WHERE PubCod=%ld",
|
" WHERE PubCod=%ld",
|
||||||
PubCod))
|
PubCod))
|
||||||
{
|
/***** Remove media file *****/
|
||||||
/***** Get image name (row[0]) *****/
|
Med_RemoveMediaFileFromRow (mysql_res);
|
||||||
row = mysql_fetch_row (mysql_res);
|
|
||||||
|
|
||||||
/***** Remove image file *****/
|
|
||||||
Img_RemoveImageFile (row[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
/***** Free structure that stores the query result *****/
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
@ -4670,9 +4669,10 @@ static void Soc_GetDataOfSocialComByCod (struct SocialComment *SocCom)
|
||||||
"social_pubs.NotCod," // row[2]
|
"social_pubs.NotCod," // row[2]
|
||||||
"UNIX_TIMESTAMP(social_pubs.TimePublish)," // row[3]
|
"UNIX_TIMESTAMP(social_pubs.TimePublish)," // row[3]
|
||||||
"social_comments.Content," // row[4]
|
"social_comments.Content," // row[4]
|
||||||
"social_comments.ImageName," // row[5]
|
"social_comments.MediaName," // row[5]
|
||||||
"social_comments.ImageTitle," // row[6]
|
"social_comments.MediaType," // row[6]
|
||||||
"social_comments.ImageURL" // row[7]
|
"social_comments.MediaTitle," // row[7]
|
||||||
|
"social_comments.MediaURL" // row[8]
|
||||||
" FROM social_pubs,social_comments"
|
" FROM social_pubs,social_comments"
|
||||||
" WHERE social_pubs.PubCod=%ld"
|
" WHERE social_pubs.PubCod=%ld"
|
||||||
" AND social_pubs.PubType=%u"
|
" AND social_pubs.PubType=%u"
|
||||||
|
@ -4802,9 +4802,10 @@ static void Soc_GetDataOfSocialCommentFromRow (MYSQL_ROW row,struct SocialCommen
|
||||||
row[2]: NotCod
|
row[2]: NotCod
|
||||||
row[3]: TimePublish
|
row[3]: TimePublish
|
||||||
row[4]: Content
|
row[4]: Content
|
||||||
row[5]: ImageName
|
row[5]: MediaName
|
||||||
row[6]: ImageTitle
|
row[6]: MediaType
|
||||||
row[7]: ImageURL
|
row[7]: MediaTitle
|
||||||
|
row[8]: MediaURL
|
||||||
*/
|
*/
|
||||||
/***** Get code of social comment (row[0]) *****/
|
/***** Get code of social comment (row[0]) *****/
|
||||||
SocCom->PubCod = Str_ConvertStrCodToLongCod (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 *****/
|
/***** Get number of times this comment has been favourited *****/
|
||||||
Soc_GetNumTimesACommHasBeenFav (SocCom);
|
Soc_GetNumTimesACommHasBeenFav (SocCom);
|
||||||
|
|
||||||
/****** Get image name (row[5]), title (row[6]) and URL (row[7]) *****/
|
/****** Get image name (row[5]), type (row[6]), title (row[7]) and URL (row[8]) *****/
|
||||||
Img_GetImageNameTitleAndURLFromRow (row[5],row[6],row[7],&SocCom->Image);
|
Med_GetMediaNameTitleAndURLFromRow (row[5],row[6],row[7],row[8],
|
||||||
|
&SocCom->Media);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -50,7 +50,7 @@ typedef enum
|
||||||
Soc_USRS_FOLLOWED = 1,
|
Soc_USRS_FOLLOWED = 1,
|
||||||
Soc_USRS_ALL = 2,
|
Soc_USRS_ALL = 2,
|
||||||
} Soc_WhichUsrs_t; // Which users I want to see: only users I follow or all users
|
} 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
|
#define Soc_NUM_PUB_TYPES 4
|
||||||
// If the numbers assigned to each event type change,
|
// If the numbers assigned to each event type change,
|
||||||
|
|
731
swad_test.c
731
swad_test.c
File diff suppressed because it is too large
Load Diff
|
@ -200,12 +200,13 @@ void TsI_CreateXML (unsigned long NumRows,MYSQL_RES *mysql_res)
|
||||||
row[ 3] Shuffle
|
row[ 3] Shuffle
|
||||||
row[ 4] Stem
|
row[ 4] Stem
|
||||||
row[ 5] Feedback
|
row[ 5] Feedback
|
||||||
row[ 6] ImageName
|
row[ 6] MediaName
|
||||||
row[ 7] ImageTitle
|
row[ 7] MediaType
|
||||||
row[ 8] ImageURL
|
row[ 8] MediaTitle
|
||||||
row[ 9] NumHits
|
row[ 9] MediaURL
|
||||||
row[10] NumHitsNotBlank
|
row[10] NumHits
|
||||||
row[11] Score
|
row[11] NumHitsNotBlank
|
||||||
|
row[12] Score
|
||||||
*/
|
*/
|
||||||
/* row[0] holds the code of the question */
|
/* row[0] holds the code of the question */
|
||||||
if ((QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
|
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
|
Gbl.Test.Answer.NumOptions = Tst_GetAnswersQst (QstCod,&mysql_res,false); // Result: AnsInd,Answer,Correct
|
||||||
/*
|
/*
|
||||||
row[ 0] AnsInd
|
row[0] AnsInd
|
||||||
row[ 1] Answer
|
row[1] Answer
|
||||||
row[ 2] Feedback
|
row[2] Feedback
|
||||||
row[ 3] ImageName
|
row[3] MediaName
|
||||||
row[ 4] ImageTitle
|
row[4] MediaType
|
||||||
row[ 5] ImageURL
|
row[5] MediaTitle
|
||||||
row[ 6] Correct
|
row[6] MediaURL
|
||||||
|
row[7] Correct
|
||||||
*/
|
*/
|
||||||
/***** Write the answers *****/
|
/***** Write the answers *****/
|
||||||
switch (Gbl.Test.AnswerType)
|
switch (Gbl.Test.AnswerType)
|
||||||
|
@ -365,7 +367,7 @@ static void TsI_WriteAnswersOfAQstXML (long QstCod)
|
||||||
fprintf (Gbl.Test.XML.FileXML,"<option");
|
fprintf (Gbl.Test.XML.FileXML,"<option");
|
||||||
if (Gbl.Test.AnswerType != Tst_ANS_TEXT)
|
if (Gbl.Test.AnswerType != Tst_ANS_TEXT)
|
||||||
fprintf (Gbl.Test.XML.FileXML," correct=\"%s\"",
|
fprintf (Gbl.Test.XML.FileXML," correct=\"%s\"",
|
||||||
(row[6][0] == 'Y') ? "yes" :
|
(row[7][0] == 'Y') ? "yes" :
|
||||||
"no");
|
"no");
|
||||||
fprintf (Gbl.Test.XML.FileXML,">%s"
|
fprintf (Gbl.Test.XML.FileXML,">%s"
|
||||||
"<text>%s</text>%s",
|
"<text>%s</text>%s",
|
||||||
|
|
|
@ -3446,9 +3446,11 @@ static int Svc_SendMessageToUsr (long OriginalMsgCod,
|
||||||
NewMsgCod =
|
NewMsgCod =
|
||||||
DB_QueryINSERTandReturnCode ("can not create message",
|
DB_QueryINSERTandReturnCode ("can not create message",
|
||||||
"INSERT INTO msg_content"
|
"INSERT INTO msg_content"
|
||||||
" (Subject,Content,ImageName,ImageTitle,ImageURL)"
|
" (Subject,Content,"
|
||||||
|
"MediaName,MediaType,MediaTitle,MediaURL)"
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" ('%s','%s','','','')",
|
" ('%s','%s',"
|
||||||
|
"'','','','')",
|
||||||
Subject,Content);
|
Subject,Content);
|
||||||
|
|
||||||
/* Insert message in sent messages */
|
/* Insert message in sent messages */
|
||||||
|
|
Loading…
Reference in New Issue