mirror of
https://github.com/acanas/swad-core.git
synced 2024-06-08 01:35:32 +02:00
Version 15.190
This commit is contained in:
parent
ad46ffcbf1
commit
cf1fb79961
|
@ -1954,7 +1954,7 @@ a:hover img.CENTRE_PHOTO_SHOW
|
||||||
color:#404040;
|
color:#404040;
|
||||||
font-size:13pt;
|
font-size:13pt;
|
||||||
}
|
}
|
||||||
.SOCIAL_IMG
|
.SOCIAL_IMG_POST
|
||||||
{
|
{
|
||||||
width:480px;
|
width:480px;
|
||||||
border-radius:4px;
|
border-radius:4px;
|
||||||
|
@ -2058,6 +2058,12 @@ a:hover img.CENTRE_PHOTO_SHOW
|
||||||
margin:0;
|
margin:0;
|
||||||
resize:none;
|
resize:none;
|
||||||
}
|
}
|
||||||
|
.SOCIAL_IMG_COMMENT
|
||||||
|
{
|
||||||
|
width:440px;
|
||||||
|
border-radius:4px;
|
||||||
|
margin:10px 0;
|
||||||
|
}
|
||||||
.SOCIAL_IMG_TIT_COMMENT
|
.SOCIAL_IMG_TIT_COMMENT
|
||||||
{
|
{
|
||||||
box-sizing:border-box;
|
box-sizing:border-box;
|
||||||
|
|
|
@ -916,6 +916,8 @@ CREATE TABLE IF NOT EXISTS sessions (
|
||||||
CREATE TABLE IF NOT EXISTS social_comments (
|
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,
|
||||||
|
ImageTitle VARCHAR(255) NOT NULL,
|
||||||
UNIQUE INDEX(PubCod),
|
UNIQUE INDEX(PubCod),
|
||||||
FULLTEXT(Content)) ENGINE = MYISAM;
|
FULLTEXT(Content)) ENGINE = MYISAM;
|
||||||
--
|
--
|
||||||
|
|
|
@ -2344,7 +2344,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
|
||||||
/* ActSeeChtRms */{ 51, 3,TabSoc,ActSeeChtRms ,0x1FC,0x1FC,0x1FC,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Cht_ShowChatRooms ,"chat64x64.gif" },
|
/* ActSeeChtRms */{ 51, 3,TabSoc,ActSeeChtRms ,0x1FC,0x1FC,0x1FC,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Cht_ShowChatRooms ,"chat64x64.gif" },
|
||||||
|
|
||||||
/* ActRcvSocPstGbl */{1492,-1,TabSoc,ActSeeSocTmlGbl ,0x1FE,0x1FE,0x1FE,Act_CONTENT_DATA,Act_MAIN_WINDOW,Soc_MarkMyNotifAsSeen ,Soc_ReceiveSocialPostGbl ,NULL},
|
/* ActRcvSocPstGbl */{1492,-1,TabSoc,ActSeeSocTmlGbl ,0x1FE,0x1FE,0x1FE,Act_CONTENT_DATA,Act_MAIN_WINDOW,Soc_MarkMyNotifAsSeen ,Soc_ReceiveSocialPostGbl ,NULL},
|
||||||
/* ActRcvSocComGbl */{1503,-1,TabSoc,ActSeeSocTmlGbl ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Soc_MarkMyNotifAsSeen ,Soc_ReceiveCommentGbl ,NULL},
|
/* ActRcvSocComGbl */{1503,-1,TabSoc,ActSeeSocTmlGbl ,0x1FE,0x1FE,0x1FE,Act_CONTENT_DATA,Act_MAIN_WINDOW,Soc_MarkMyNotifAsSeen ,Soc_ReceiveCommentGbl ,NULL},
|
||||||
/* ActShaSocNotGbl */{1495,-1,TabSoc,ActSeeSocTmlGbl ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Soc_MarkMyNotifAsSeen ,Soc_ShareSocialNoteGbl ,NULL},
|
/* ActShaSocNotGbl */{1495,-1,TabSoc,ActSeeSocTmlGbl ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Soc_MarkMyNotifAsSeen ,Soc_ShareSocialNoteGbl ,NULL},
|
||||||
/* ActUnsSocNotGbl */{1496,-1,TabSoc,ActSeeSocTmlGbl ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Soc_MarkMyNotifAsSeen ,Soc_UnshareSocialNoteGbl ,NULL},
|
/* ActUnsSocNotGbl */{1496,-1,TabSoc,ActSeeSocTmlGbl ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Soc_MarkMyNotifAsSeen ,Soc_UnshareSocialNoteGbl ,NULL},
|
||||||
/* ActFavSocNotGbl */{1512,-1,TabSoc,ActSeeSocTmlGbl ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Soc_MarkMyNotifAsSeen ,Soc_FavSocialNoteGbl ,NULL},
|
/* ActFavSocNotGbl */{1512,-1,TabSoc,ActSeeSocTmlGbl ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Soc_MarkMyNotifAsSeen ,Soc_FavSocialNoteGbl ,NULL},
|
||||||
|
@ -2359,7 +2359,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
|
||||||
/* ActReqPubPrf */{1401,-1,TabSoc,ActSeeSocPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Prf_RequestUserProfile ,NULL},
|
/* ActReqPubPrf */{1401,-1,TabSoc,ActSeeSocPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Prf_RequestUserProfile ,NULL},
|
||||||
|
|
||||||
/* ActRcvSocPstUsr */{1498,-1,TabSoc,ActSeeSocPrf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_DATA,Act_MAIN_WINDOW,NULL ,Soc_ReceiveSocialPostUsr ,NULL},
|
/* ActRcvSocPstUsr */{1498,-1,TabSoc,ActSeeSocPrf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_DATA,Act_MAIN_WINDOW,NULL ,Soc_ReceiveSocialPostUsr ,NULL},
|
||||||
/* ActRcvSocComUsr */{1504,-1,TabSoc,ActSeeSocPrf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Soc_ReceiveCommentUsr ,NULL},
|
/* ActRcvSocComUsr */{1504,-1,TabSoc,ActSeeSocPrf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_DATA,Act_MAIN_WINDOW,NULL ,Soc_ReceiveCommentUsr ,NULL},
|
||||||
/* ActShaSocNotUsr */{1499,-1,TabSoc,ActSeeSocPrf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Soc_ShareSocialNoteUsr ,NULL},
|
/* ActShaSocNotUsr */{1499,-1,TabSoc,ActSeeSocPrf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Soc_ShareSocialNoteUsr ,NULL},
|
||||||
/* ActUnsSocNotUsr */{1500,-1,TabSoc,ActSeeSocPrf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Soc_UnshareSocialNoteUsr ,NULL},
|
/* ActUnsSocNotUsr */{1500,-1,TabSoc,ActSeeSocPrf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Soc_UnshareSocialNoteUsr ,NULL},
|
||||||
/* ActFavSocNotUsr */{1514,-1,TabSoc,ActSeeSocPrf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Soc_FavSocialNoteUsr ,NULL},
|
/* ActFavSocNotUsr */{1514,-1,TabSoc,ActSeeSocPrf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Soc_FavSocialNoteUsr ,NULL},
|
||||||
|
|
|
@ -133,13 +133,18 @@
|
||||||
/****************************** Public constants *****************************/
|
/****************************** Public constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Log_PLATFORM_VERSION "SWAD 15.189.2 (2016-04-08)"
|
#define Log_PLATFORM_VERSION "SWAD 15.190 (2016-04-08)"
|
||||||
#define CSS_FILE "swad15.189.2.css"
|
#define CSS_FILE "swad15.190.css"
|
||||||
#define JS_FILE "swad15.186.js"
|
#define JS_FILE "swad15.186.js"
|
||||||
|
|
||||||
// Number of lines (includes comments but not blank lines) has been got with the following command:
|
// Number of lines (includes comments but not blank lines) has been got with the following command:
|
||||||
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1
|
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1
|
||||||
/*
|
/*
|
||||||
|
Version 15.190: Apr 08, 2016 Get image attached to a social comment. (199142 lines)
|
||||||
|
2 changes necessary in database:
|
||||||
|
ALTER TABLE social_comments ADD COLUMN ImageName VARCHAR(43) NOT NULL AFTER Content;
|
||||||
|
ALTER TABLE social_comments ADD COLUMN ImageTitle VARCHAR(255) NOT NULL AFTER ImageName;
|
||||||
|
|
||||||
Version 15.189.2: Apr 08, 2016 Remove file of the image attached to a social post when the post is removed. (199017 lines)
|
Version 15.189.2: Apr 08, 2016 Remove file of the image attached to a social post when the post is removed. (199017 lines)
|
||||||
Version 15.189.1: Apr 08, 2016 Change in layout of form to write a new social post. (198997 lines)
|
Version 15.189.1: Apr 08, 2016 Change in layout of form to write a new social post. (198997 lines)
|
||||||
Version 15.189: Apr 08, 2016 Get image attached to a social post. (198991 lines)
|
Version 15.189: Apr 08, 2016 Get image attached to a social post. (198991 lines)
|
||||||
|
|
|
@ -1935,17 +1935,21 @@ 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 | |
|
||||||
2 rows in set (0.00 sec)
|
| ImageTitle | varchar(255) | NO | | NULL | |
|
||||||
|
+------------+--------------+------+-----+---------+-------+
|
||||||
|
4 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,"
|
||||||
|
"ImageTitle VARCHAR(255) NOT NULL,"
|
||||||
"UNIQUE INDEX(PubCod),"
|
"UNIQUE INDEX(PubCod),"
|
||||||
"FULLTEXT(Content)) ENGINE = MYISAM;");
|
"FULLTEXT(Content)) ENGINE = MYISAM;");
|
||||||
|
|
||||||
|
|
43
swad_image.c
43
swad_image.c
|
@ -63,17 +63,42 @@ extern struct Globals Gbl;
|
||||||
/***************************** Internal prototypes ***************************/
|
/***************************** Internal prototypes ***************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void Img_FreeImageTitle (struct Image *Image);
|
||||||
|
|
||||||
static void Img_ProcessImage (const char *FileNameImgOriginal,
|
static void Img_ProcessImage (const char *FileNameImgOriginal,
|
||||||
const char *FileNameImgProcessed,
|
const char *FileNameImgProcessed,
|
||||||
unsigned Width,unsigned Height,unsigned Quality);
|
unsigned Width,unsigned Height,unsigned Quality);
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/*************************** Reset image fields ******************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
// Every struct Image must be initialized to zero where it is declared
|
||||||
|
// Every call to Img_InitImage must have a call to Img_FreeImage
|
||||||
|
|
||||||
|
void Img_ImageConstructor (struct Image *Image)
|
||||||
|
{
|
||||||
|
Image->Action = Img_ACTION_NO_IMAGE;
|
||||||
|
Image->Status = Img_FILE_NONE;
|
||||||
|
Image->Name[0] = '\0';
|
||||||
|
Image->Title = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************************** Free image *********************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Img_ImageDestructor (struct Image *Image)
|
||||||
|
{
|
||||||
|
Img_FreeImageTitle (Image);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*************************** Reset image title *******************************/
|
/*************************** Reset image title *******************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Img_FreeImageTitle (struct Image *Image)
|
static void Img_FreeImageTitle (struct Image *Image)
|
||||||
{
|
{
|
||||||
// Image->Title must be initialized to NULL
|
// Image->Title must be initialized to NULL after declaration
|
||||||
if (Image->Title)
|
if (Image->Title)
|
||||||
{
|
{
|
||||||
free ((void *) Image->Title);
|
free ((void *) Image->Title);
|
||||||
|
@ -99,7 +124,10 @@ void Img_GetImageNameAndTitleFromRow (const char *Name,const char *Title,
|
||||||
Img_FILE_NONE;
|
Img_FILE_NONE;
|
||||||
|
|
||||||
/***** Copy image title to struct *****/
|
/***** Copy image title to struct *****/
|
||||||
|
// Image->Title can be empty or filled with a previous title
|
||||||
|
// If filled ==> free it
|
||||||
Img_FreeImageTitle (Image);
|
Img_FreeImageTitle (Image);
|
||||||
|
|
||||||
if (Title[0])
|
if (Title[0])
|
||||||
{
|
{
|
||||||
/* Get and limit length of the title */
|
/* Get and limit length of the title */
|
||||||
|
@ -126,12 +154,13 @@ void Img_GetImageFromForm (unsigned NumOpt,struct Image *Image,
|
||||||
char Title[Img_MAX_BYTES_TITLE+1];
|
char Title[Img_MAX_BYTES_TITLE+1];
|
||||||
size_t Length;
|
size_t Length;
|
||||||
|
|
||||||
/***** Reset image *****/
|
/***** First, get action and initialize image
|
||||||
|
(except title, that will be get after the image file) *****/
|
||||||
Image->Action = Img_GetImageActionFromForm (ParamAction);
|
Image->Action = Img_GetImageActionFromForm (ParamAction);
|
||||||
Image->Status = Img_FILE_NONE;
|
Image->Status = Img_FILE_NONE;
|
||||||
Image->Name[0] = '\0';
|
Image->Name[0] = '\0';
|
||||||
Img_FreeImageTitle (Image); // Reset to NULL
|
|
||||||
|
|
||||||
|
/***** Secondly, get the image name and the file *****/
|
||||||
switch (Image->Action)
|
switch (Image->Action)
|
||||||
{
|
{
|
||||||
case Img_ACTION_NO_IMAGE: // Do not use image (remove current image if exists)
|
case Img_ACTION_NO_IMAGE: // Do not use image (remove current image if exists)
|
||||||
|
@ -163,9 +192,11 @@ void Img_GetImageFromForm (unsigned NumOpt,struct Image *Image,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Get image title from form *****/
|
/***** By last, get image title from form *****/
|
||||||
Par_GetParToHTML (ParamTitle,Title,Img_MAX_BYTES_TITLE);
|
Par_GetParToHTML (ParamTitle,Title,Img_MAX_BYTES_TITLE);
|
||||||
if ((Length = strlen (Title)) > 0) // If title comming from the form is not empty
|
/* 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)
|
/* Overwrite current title (empty or coming from database)
|
||||||
with the title coming from the form */
|
with the title coming from the form */
|
||||||
|
|
|
@ -95,7 +95,9 @@ struct Image
|
||||||
/***************************** Public prototypes *****************************/
|
/***************************** Public prototypes *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Img_FreeImageTitle (struct Image *Image);
|
void Img_ImageConstructor (struct Image *Image);
|
||||||
|
void Img_ImageDestructor (struct Image *Image);
|
||||||
|
|
||||||
void Img_GetImageNameAndTitleFromRow (const char *Name,const char *Title,
|
void Img_GetImageNameAndTitleFromRow (const char *Name,const char *Title,
|
||||||
struct Image *Image);
|
struct Image *Image);
|
||||||
|
|
||||||
|
|
172
swad_social.c
172
swad_social.c
|
@ -115,6 +115,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;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -226,6 +227,7 @@ static long Soc_GetPubCodOfOriginalSocialNote (long NotCod);
|
||||||
|
|
||||||
static void Soc_RequestRemovalSocialComment (void);
|
static void Soc_RequestRemovalSocialComment (void);
|
||||||
static void Soc_RemoveSocialComment (void);
|
static void Soc_RemoveSocialComment (void);
|
||||||
|
static void Soc_RemoveImgFileFromSocialComment (long PubCod);
|
||||||
static void Soc_RemoveASocialCommentFromDB (struct SocialComment *SocCom);
|
static void Soc_RemoveASocialCommentFromDB (struct SocialComment *SocCom);
|
||||||
|
|
||||||
static bool Soc_CheckIfNoteIsSharedByUsr (long NotCod,long UsrCod);
|
static bool Soc_CheckIfNoteIsSharedByUsr (long NotCod,long UsrCod);
|
||||||
|
@ -1153,12 +1155,8 @@ static void Soc_WriteSocialNote (const struct SocialNote *SocNot,
|
||||||
|
|
||||||
/* Write content of the note */
|
/* Write content of the note */
|
||||||
if (SocNot->NoteType == Soc_NOTE_SOCIAL_POST)
|
if (SocNot->NoteType == Soc_NOTE_SOCIAL_POST)
|
||||||
{
|
|
||||||
/* Write post content */
|
/* Write post content */
|
||||||
fprintf (Gbl.F.Out,"<div class=\"SOCIAL_TXT\">");
|
|
||||||
Soc_GetAndWriteSocialPost (SocNot->Cod);
|
Soc_GetAndWriteSocialPost (SocNot->Cod);
|
||||||
fprintf (Gbl.F.Out,"</div>");
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Get location in hierarchy */
|
/* Get location in hierarchy */
|
||||||
|
@ -1210,9 +1208,7 @@ static void Soc_WriteSocialNote (const struct SocialNote *SocNot,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write note type */
|
/* Write note type */
|
||||||
fprintf (Gbl.F.Out,"<div>");
|
|
||||||
Soc_PutFormGoToAction (SocNot);
|
Soc_PutFormGoToAction (SocNot);
|
||||||
fprintf (Gbl.F.Out,"</div>");
|
|
||||||
|
|
||||||
/* Write location in hierarchy */
|
/* Write location in hierarchy */
|
||||||
if (!SocNot->Unavailable)
|
if (!SocNot->Unavailable)
|
||||||
|
@ -1460,10 +1456,7 @@ static void Soc_GetAndWriteSocialPost (long PstCod)
|
||||||
struct Image Image;
|
struct Image Image;
|
||||||
|
|
||||||
/***** Initialize image *****/
|
/***** Initialize image *****/
|
||||||
Image.Action = Img_ACTION_NO_IMAGE;
|
Img_ImageConstructor (&Image);
|
||||||
Image.Status = Img_FILE_NONE;
|
|
||||||
Image.Name[0] = '\0';
|
|
||||||
Image.Title = NULL;
|
|
||||||
|
|
||||||
/***** Get social post from database *****/
|
/***** Get social post from database *****/
|
||||||
sprintf (Query,"SELECT Content,ImageName,ImageTitle"
|
sprintf (Query,"SELECT Content,ImageName,ImageTitle"
|
||||||
|
@ -1490,13 +1483,15 @@ static void Soc_GetAndWriteSocialPost (long PstCod)
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
|
||||||
/***** Write content *****/
|
/***** Write content *****/
|
||||||
|
fprintf (Gbl.F.Out,"<div class=\"SOCIAL_TXT\">");
|
||||||
Msg_WriteMsgContent (Content,Cns_MAX_BYTES_LONG_TEXT,true,false);
|
Msg_WriteMsgContent (Content,Cns_MAX_BYTES_LONG_TEXT,true,false);
|
||||||
|
fprintf (Gbl.F.Out,"</div>");
|
||||||
|
|
||||||
/***** Show image *****/
|
/***** Show image *****/
|
||||||
Img_ShowImage (&Image,"SOCIAL_IMG");
|
Img_ShowImage (&Image,"SOCIAL_IMG_POST");
|
||||||
|
|
||||||
/***** Free allocated memory for the title/attribution of the image *****/
|
/***** Free image *****/
|
||||||
Img_FreeImageTitle (&Image);
|
Img_ImageDestructor (&Image);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -1590,14 +1585,16 @@ static void Soc_PutFormGoToAction (const struct SocialNote *SocNot)
|
||||||
Gbl.Form.Inside) // Inside another form
|
Gbl.Form.Inside) // Inside another form
|
||||||
{
|
{
|
||||||
/***** Do not put form *****/
|
/***** Do not put form *****/
|
||||||
fprintf (Gbl.F.Out,"<span class=\"DAT_LIGHT\">%s",
|
fprintf (Gbl.F.Out,"<div class=\"DAT_LIGHT\">%s",
|
||||||
Txt_SOCIAL_NOTE[SocNot->NoteType]);
|
Txt_SOCIAL_NOTE[SocNot->NoteType]);
|
||||||
if (SocNot->Unavailable)
|
if (SocNot->Unavailable)
|
||||||
fprintf (Gbl.F.Out," (%s)",Txt_not_available);
|
fprintf (Gbl.F.Out," (%s)",Txt_not_available);
|
||||||
fprintf (Gbl.F.Out,"</span>");
|
fprintf (Gbl.F.Out,"</div>");
|
||||||
}
|
}
|
||||||
else // Not inside another form
|
else // Not inside another form
|
||||||
{
|
{
|
||||||
|
fprintf (Gbl.F.Out,"<div>");
|
||||||
|
|
||||||
/***** Parameters depending on the type of note *****/
|
/***** Parameters depending on the type of note *****/
|
||||||
switch (SocNot->NoteType)
|
switch (SocNot->NoteType)
|
||||||
{
|
{
|
||||||
|
@ -1666,6 +1663,8 @@ static void Soc_PutFormGoToAction (const struct SocialNote *SocNot)
|
||||||
Txt_SOCIAL_NOTE[SocNot->NoteType],
|
Txt_SOCIAL_NOTE[SocNot->NoteType],
|
||||||
Txt_SOCIAL_NOTE[SocNot->NoteType]);
|
Txt_SOCIAL_NOTE[SocNot->NoteType]);
|
||||||
Act_FormEnd ();
|
Act_FormEnd ();
|
||||||
|
|
||||||
|
fprintf (Gbl.F.Out,"</div>");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2113,11 +2112,10 @@ static long Soc_ReceiveSocialPost (void)
|
||||||
Par_GetParAndChangeFormat ("Content",Content,Cns_MAX_BYTES_LONG_TEXT,
|
Par_GetParAndChangeFormat ("Content",Content,Cns_MAX_BYTES_LONG_TEXT,
|
||||||
Str_TO_RIGOROUS_HTML,true);
|
Str_TO_RIGOROUS_HTML,true);
|
||||||
|
|
||||||
|
/***** Initialize image *****/
|
||||||
|
Img_ImageConstructor (&Image);
|
||||||
|
|
||||||
/***** Get attached image (action, file and title) *****/
|
/***** Get attached image (action, file and title) *****/
|
||||||
/* Initialize to zero */
|
|
||||||
// Image.Name[0] = '\0';
|
|
||||||
// Image.Title = NULL; // Initialized to NULL in order to not trying
|
|
||||||
// to free it when no memory allocated
|
|
||||||
Img_GetImageFromForm (0,&Image,NULL,
|
Img_GetImageFromForm (0,&Image,NULL,
|
||||||
"ImgAct","ImgFil","ImgTit",
|
"ImgAct","ImgFil","ImgTit",
|
||||||
Soc_IMAGE_SAVED_MAX_WIDTH,
|
Soc_IMAGE_SAVED_MAX_WIDTH,
|
||||||
|
@ -2158,13 +2156,12 @@ static long Soc_ReceiveSocialPost (void)
|
||||||
|
|
||||||
/***** Analyze content and store notifications about mentions *****/
|
/***** Analyze content and store notifications about mentions *****/
|
||||||
Str_AnalyzeTxtAndStoreNotifyEventToMentionedUsrs (SocPub.PubCod,Content);
|
Str_AnalyzeTxtAndStoreNotifyEventToMentionedUsrs (SocPub.PubCod,Content);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else // Text and image are empty
|
||||||
SocPub.NotCod = -1L;
|
SocPub.NotCod = -1L;
|
||||||
|
|
||||||
/***** Free allocated memory for the title/attribution of the image *****/
|
/***** Free image *****/
|
||||||
Img_FreeImageTitle (&Image);
|
Img_ImageDestructor (&Image);
|
||||||
|
|
||||||
return SocPub.NotCod;
|
return SocPub.NotCod;
|
||||||
}
|
}
|
||||||
|
@ -2294,7 +2291,8 @@ static void Soc_WriteCommentsInSocialNote (const struct SocialNote *SocNot)
|
||||||
sprintf (Query,"SELECT social_pubs.PubCod,social_pubs.PublisherCod,"
|
sprintf (Query,"SELECT social_pubs.PubCod,social_pubs.PublisherCod,"
|
||||||
"social_pubs.NotCod,"
|
"social_pubs.NotCod,"
|
||||||
"UNIX_TIMESTAMP(social_pubs.TimePublish),"
|
"UNIX_TIMESTAMP(social_pubs.TimePublish),"
|
||||||
"social_comments.Content"
|
"social_comments.Content,"
|
||||||
|
"social_comments.ImageName,social_comments.ImageTitle"
|
||||||
" 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'"
|
||||||
|
@ -2314,6 +2312,9 @@ static void Soc_WriteCommentsInSocialNote (const struct SocialNote *SocNot)
|
||||||
NumCom < NumComments;
|
NumCom < NumComments;
|
||||||
NumCom++)
|
NumCom++)
|
||||||
{
|
{
|
||||||
|
/* Initialize image */
|
||||||
|
Img_ImageConstructor (&SocCom.Image);
|
||||||
|
|
||||||
/* Get data of social comment */
|
/* Get data of social comment */
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
Soc_GetDataOfSocialCommentFromRow (row,&SocCom);
|
Soc_GetDataOfSocialCommentFromRow (row,&SocCom);
|
||||||
|
@ -2322,6 +2323,9 @@ static void Soc_WriteCommentsInSocialNote (const struct SocialNote *SocNot)
|
||||||
Soc_WriteSocialComment (&SocCom,
|
Soc_WriteSocialComment (&SocCom,
|
||||||
Soc_TOP_MESSAGE_NONE,-1L,
|
Soc_TOP_MESSAGE_NONE,-1L,
|
||||||
false);
|
false);
|
||||||
|
|
||||||
|
/* Free image */
|
||||||
|
Img_ImageDestructor (&SocCom.Image);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** End list *****/
|
/***** End list *****/
|
||||||
|
@ -2395,7 +2399,7 @@ static void Soc_WriteSocialComment (struct SocialComment *SocCom,
|
||||||
"PHOTO30x40",Pho_ZOOM,true); // Use unique id
|
"PHOTO30x40",Pho_ZOOM,true); // Use unique id
|
||||||
fprintf (Gbl.F.Out,"</div>");
|
fprintf (Gbl.F.Out,"</div>");
|
||||||
|
|
||||||
/***** Right: author's name, time, summary and buttons *****/
|
/***** Right: author's name, time, content, image and buttons *****/
|
||||||
fprintf (Gbl.F.Out,"<div class=\"SOCIAL_COMMENT_RIGHT_CONTAINER\">");
|
fprintf (Gbl.F.Out,"<div class=\"SOCIAL_COMMENT_RIGHT_CONTAINER\">");
|
||||||
|
|
||||||
/* Write author's full name and nickname */
|
/* Write author's full name and nickname */
|
||||||
|
@ -2409,6 +2413,9 @@ static void Soc_WriteSocialComment (struct SocialComment *SocCom,
|
||||||
Msg_WriteMsgContent (SocCom->Content,Cns_MAX_BYTES_LONG_TEXT,true,false);
|
Msg_WriteMsgContent (SocCom->Content,Cns_MAX_BYTES_LONG_TEXT,true,false);
|
||||||
fprintf (Gbl.F.Out,"</div>");
|
fprintf (Gbl.F.Out,"</div>");
|
||||||
|
|
||||||
|
/* Show image */
|
||||||
|
Img_ShowImage (&SocCom->Image,"SOCIAL_IMG_COMMENT");
|
||||||
|
|
||||||
/* Put icon to mark this social comment as favourite */
|
/* Put icon to mark this social comment as favourite */
|
||||||
if (IAmTheAuthor) // I am the author
|
if (IAmTheAuthor) // I am the author
|
||||||
Soc_PutDisabledIconFav (SocCom->NumFavs);
|
Soc_PutDisabledIconFav (SocCom->NumFavs);
|
||||||
|
@ -2846,7 +2853,8 @@ 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];
|
||||||
char Query[128+Cns_MAX_BYTES_LONG_TEXT];
|
struct Image Image;
|
||||||
|
char *Query;
|
||||||
struct SocialNote SocNot;
|
struct SocialNote SocNot;
|
||||||
struct SocialPublishing SocPub;
|
struct SocialPublishing SocPub;
|
||||||
|
|
||||||
|
@ -2860,8 +2868,32 @@ static long Soc_ReceiveComment (void)
|
||||||
Par_GetParAndChangeFormat ("Content",Content,Cns_MAX_BYTES_LONG_TEXT,
|
Par_GetParAndChangeFormat ("Content",Content,Cns_MAX_BYTES_LONG_TEXT,
|
||||||
Str_TO_RIGOROUS_HTML,true);
|
Str_TO_RIGOROUS_HTML,true);
|
||||||
|
|
||||||
if (Content[0])
|
/***** Initialize image *****/
|
||||||
|
Img_ImageConstructor (&Image);
|
||||||
|
|
||||||
|
/***** Get attached image (action, file and title) *****/
|
||||||
|
Img_GetImageFromForm (0,&Image,NULL,
|
||||||
|
"ImgAct","ImgFil","ImgTit",
|
||||||
|
Soc_IMAGE_SAVED_MAX_WIDTH,
|
||||||
|
Soc_IMAGE_SAVED_MAX_HEIGHT,
|
||||||
|
Soc_IMAGE_SAVED_QUALITY);
|
||||||
|
|
||||||
|
if (Content[0] || // Text not empty
|
||||||
|
Image.Name[0]) // An image is attached
|
||||||
{
|
{
|
||||||
|
/***** Allocate space for query *****/
|
||||||
|
if ((Query = malloc (256 +
|
||||||
|
strlen (Content) +
|
||||||
|
Cry_LENGTH_ENCRYPTED_STR_SHA256_BASE64+
|
||||||
|
Img_MAX_BYTES_TITLE)) == NULL)
|
||||||
|
Lay_ShowErrorAndExit ("Not enough memory to store database query.");
|
||||||
|
|
||||||
|
/***** Check if image is received and processed *****/
|
||||||
|
if (Image.Action == Img_ACTION_NEW_IMAGE && // Upload new image
|
||||||
|
Image.Status == Img_FILE_PROCESSED) // The new image received has been processed
|
||||||
|
/* Move processed image to definitive directory */
|
||||||
|
Img_MoveImageToDefinitiveDirectory (&Image);
|
||||||
|
|
||||||
/***** Publish *****/
|
/***** Publish *****/
|
||||||
/* Insert into publishings */
|
/* Insert into publishings */
|
||||||
SocPub.NotCod = SocNot.NotCod;
|
SocPub.NotCod = SocNot.NotCod;
|
||||||
|
@ -2870,12 +2902,19 @@ static long Soc_ReceiveComment (void)
|
||||||
Soc_PublishSocialNoteInTimeline (&SocPub); // Set SocPub.PubCod
|
Soc_PublishSocialNoteInTimeline (&SocPub); // Set SocPub.PubCod
|
||||||
|
|
||||||
/* Insert comment content in the database */
|
/* Insert comment content in the database */
|
||||||
sprintf (Query,"INSERT INTO social_comments (PubCod,Content)"
|
sprintf (Query,"INSERT INTO social_comments"
|
||||||
" VALUES ('%ld','%s')",
|
" (PubCod,Content,ImageName,ImageTitle)"
|
||||||
|
" VALUES ('%ld','%s','%s','%s')",
|
||||||
SocPub.PubCod,
|
SocPub.PubCod,
|
||||||
Content);
|
Content,
|
||||||
|
Image.Name,
|
||||||
|
(Image.Name[0] && // Save image title only if image attached
|
||||||
|
Image.Title) ? Image.Title : "");
|
||||||
DB_QueryINSERT (Query,"can not store comment content");
|
DB_QueryINSERT (Query,"can not store comment content");
|
||||||
|
|
||||||
|
/***** Free space used for query *****/
|
||||||
|
free ((void *) Query);
|
||||||
|
|
||||||
/***** 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);
|
||||||
|
|
||||||
|
@ -2887,6 +2926,9 @@ static long Soc_ReceiveComment (void)
|
||||||
Soc_TOP_MESSAGE_COMMENTED,Gbl.Usrs.Me.UsrDat.UsrCod,
|
Soc_TOP_MESSAGE_COMMENTED,Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
true,true);
|
true,true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***** Free image *****/
|
||||||
|
Img_ImageDestructor (&Image);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Lay_ShowAlert (Lay_WARNING,Txt_The_original_post_no_longer_exists);
|
Lay_ShowAlert (Lay_WARNING,Txt_The_original_post_no_longer_exists);
|
||||||
|
@ -3100,6 +3142,9 @@ static long Soc_FavSocialComment (void)
|
||||||
struct SocialComment SocCom;
|
struct SocialComment SocCom;
|
||||||
char Query[256];
|
char Query[256];
|
||||||
|
|
||||||
|
/***** Initialize image *****/
|
||||||
|
Img_ImageConstructor (&SocCom.Image);
|
||||||
|
|
||||||
/***** Get data of social comment *****/
|
/***** Get data of social comment *****/
|
||||||
SocCom.PubCod = Soc_GetParamPubCod ();
|
SocCom.PubCod = Soc_GetParamPubCod ();
|
||||||
Soc_GetDataOfSocialComByCod (&SocCom);
|
Soc_GetDataOfSocialComByCod (&SocCom);
|
||||||
|
@ -3134,6 +3179,9 @@ static long Soc_FavSocialComment (void)
|
||||||
else
|
else
|
||||||
Lay_ShowAlert (Lay_WARNING,Txt_The_comment_no_longer_exists);
|
Lay_ShowAlert (Lay_WARNING,Txt_The_comment_no_longer_exists);
|
||||||
|
|
||||||
|
/***** Free image *****/
|
||||||
|
Img_ImageDestructor (&SocCom.Image);
|
||||||
|
|
||||||
return SocCom.NotCod;
|
return SocCom.NotCod;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3388,6 +3436,9 @@ static long Soc_UnfavSocialComment (void)
|
||||||
struct SocialComment SocCom;
|
struct SocialComment SocCom;
|
||||||
char Query[256];
|
char Query[256];
|
||||||
|
|
||||||
|
/***** Initialize image *****/
|
||||||
|
Img_ImageConstructor (&SocCom.Image);
|
||||||
|
|
||||||
/***** Get data of social comment *****/
|
/***** Get data of social comment *****/
|
||||||
SocCom.PubCod = Soc_GetParamPubCod ();
|
SocCom.PubCod = Soc_GetParamPubCod ();
|
||||||
Soc_GetDataOfSocialComByCod (&SocCom);
|
Soc_GetDataOfSocialComByCod (&SocCom);
|
||||||
|
@ -3422,6 +3473,9 @@ static long Soc_UnfavSocialComment (void)
|
||||||
else
|
else
|
||||||
Lay_ShowAlert (Lay_WARNING,Txt_The_comment_no_longer_exists);
|
Lay_ShowAlert (Lay_WARNING,Txt_The_comment_no_longer_exists);
|
||||||
|
|
||||||
|
/***** Free image *****/
|
||||||
|
Img_ImageDestructor (&SocCom.Image);
|
||||||
|
|
||||||
return SocCom.NotCod;
|
return SocCom.NotCod;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3793,6 +3847,9 @@ static void Soc_RequestRemovalSocialComment (void)
|
||||||
extern const char *Txt_Remove;
|
extern const char *Txt_Remove;
|
||||||
struct SocialComment SocCom;
|
struct SocialComment SocCom;
|
||||||
|
|
||||||
|
/***** Initialize image *****/
|
||||||
|
Img_ImageConstructor (&SocCom.Image);
|
||||||
|
|
||||||
/***** Get data of social comment *****/
|
/***** Get data of social comment *****/
|
||||||
SocCom.PubCod = Soc_GetParamPubCod ();
|
SocCom.PubCod = Soc_GetParamPubCod ();
|
||||||
Soc_GetDataOfSocialComByCod (&SocCom);
|
Soc_GetDataOfSocialComByCod (&SocCom);
|
||||||
|
@ -3829,6 +3886,9 @@ static void Soc_RequestRemovalSocialComment (void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Lay_ShowAlert (Lay_WARNING,Txt_The_comment_no_longer_exists);
|
Lay_ShowAlert (Lay_WARNING,Txt_The_comment_no_longer_exists);
|
||||||
|
|
||||||
|
/***** Free image *****/
|
||||||
|
Img_ImageDestructor (&SocCom.Image);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -3871,6 +3931,9 @@ static void Soc_RemoveSocialComment (void)
|
||||||
extern const char *Txt_Comment_removed;
|
extern const char *Txt_Comment_removed;
|
||||||
struct SocialComment SocCom;
|
struct SocialComment SocCom;
|
||||||
|
|
||||||
|
/***** Initialize image *****/
|
||||||
|
Img_ImageConstructor (&SocCom.Image);
|
||||||
|
|
||||||
/***** Get data of social comment *****/
|
/***** Get data of social comment *****/
|
||||||
SocCom.PubCod = Soc_GetParamPubCod ();
|
SocCom.PubCod = Soc_GetParamPubCod ();
|
||||||
Soc_GetDataOfSocialComByCod (&SocCom);
|
Soc_GetDataOfSocialComByCod (&SocCom);
|
||||||
|
@ -3880,6 +3943,9 @@ static void Soc_RemoveSocialComment (void)
|
||||||
if (Gbl.Usrs.Me.Logged &&
|
if (Gbl.Usrs.Me.Logged &&
|
||||||
SocCom.UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) // I am the author of this comment
|
SocCom.UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) // I am the author of this comment
|
||||||
{
|
{
|
||||||
|
/***** Remove image file associated to social post *****/
|
||||||
|
Soc_RemoveImgFileFromSocialComment (SocCom.PubCod);
|
||||||
|
|
||||||
/***** Delete social comment from database *****/
|
/***** Delete social comment from database *****/
|
||||||
Soc_RemoveASocialCommentFromDB (&SocCom);
|
Soc_RemoveASocialCommentFromDB (&SocCom);
|
||||||
|
|
||||||
|
@ -3889,6 +3955,35 @@ static void Soc_RemoveSocialComment (void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Lay_ShowAlert (Lay_WARNING,Txt_The_comment_no_longer_exists);
|
Lay_ShowAlert (Lay_WARNING,Txt_The_comment_no_longer_exists);
|
||||||
|
|
||||||
|
/***** Free image *****/
|
||||||
|
Img_ImageDestructor (&SocCom.Image);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************* Remove one file associated to a social comment ****************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void Soc_RemoveImgFileFromSocialComment (long PubCod)
|
||||||
|
{
|
||||||
|
char Query[128];
|
||||||
|
MYSQL_RES *mysql_res;
|
||||||
|
MYSQL_ROW row;
|
||||||
|
|
||||||
|
/***** Get name of image associated to a social post from database *****/
|
||||||
|
sprintf (Query,"SELECT ImageName FROM social_comments WHERE PubCod='%ld'",
|
||||||
|
PubCod);
|
||||||
|
if (DB_QuerySELECT (Query,&mysql_res,"can not get image"))
|
||||||
|
{
|
||||||
|
/***** Get image name (row[0]) *****/
|
||||||
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
|
||||||
|
/***** Remove image file *****/
|
||||||
|
Img_RemoveImageFile (row[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***** Free structure that stores the query result *****/
|
||||||
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -4309,7 +4404,8 @@ static void Soc_GetDataOfSocialComByCod (struct SocialComment *SocCom)
|
||||||
sprintf (Query,"SELECT social_pubs.PubCod,social_pubs.PublisherCod,"
|
sprintf (Query,"SELECT social_pubs.PubCod,social_pubs.PublisherCod,"
|
||||||
"social_pubs.NotCod,"
|
"social_pubs.NotCod,"
|
||||||
"UNIX_TIMESTAMP(social_pubs.TimePublish),"
|
"UNIX_TIMESTAMP(social_pubs.TimePublish),"
|
||||||
"social_comments.Content"
|
"social_comments.Content,"
|
||||||
|
"social_comments.ImageName,social_comments.ImageTitle"
|
||||||
" 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'"
|
||||||
|
@ -4434,6 +4530,15 @@ static Soc_NoteType_t Soc_GetNoteTypeFromStr (const char *Str)
|
||||||
|
|
||||||
static void Soc_GetDataOfSocialCommentFromRow (MYSQL_ROW row,struct SocialComment *SocCom)
|
static void Soc_GetDataOfSocialCommentFromRow (MYSQL_ROW row,struct SocialComment *SocCom)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
row[0]: PubCod
|
||||||
|
row[1]: PublisherCod
|
||||||
|
row[2]: NotCod
|
||||||
|
row[3]: TimePublish
|
||||||
|
row[4]: Content
|
||||||
|
row[5]: ImageName
|
||||||
|
row[6]: ImageTitle
|
||||||
|
*/
|
||||||
/***** 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]);
|
||||||
|
|
||||||
|
@ -4452,6 +4557,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 *****/
|
||||||
SocCom->NumFavs = Soc_GetNumTimesACommHasBeenFav (SocCom);
|
SocCom->NumFavs = Soc_GetNumTimesACommHasBeenFav (SocCom);
|
||||||
|
|
||||||
|
/****** Get image name (row[5]) and title (row[6]) *****/
|
||||||
|
Img_GetImageNameAndTitleFromRow (row[5],row[6],&SocCom->Image);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -4591,6 +4699,7 @@ void Soc_GetNotifSocialPublishing (char *SummaryStr,char **ContentStr,long PubCo
|
||||||
if (SocNot.NoteType == Soc_NOTE_SOCIAL_POST)
|
if (SocNot.NoteType == Soc_NOTE_SOCIAL_POST)
|
||||||
{
|
{
|
||||||
/***** Get content of social post from database *****/
|
/***** Get content of social post from database *****/
|
||||||
|
// TODO: What happens if content is empty and an image is attached?
|
||||||
sprintf (Query,"SELECT Content FROM social_posts"
|
sprintf (Query,"SELECT Content FROM social_posts"
|
||||||
" WHERE PstCod='%ld'",
|
" WHERE PstCod='%ld'",
|
||||||
SocNot.Cod);
|
SocNot.Cod);
|
||||||
|
@ -4624,6 +4733,7 @@ void Soc_GetNotifSocialPublishing (char *SummaryStr,char **ContentStr,long PubCo
|
||||||
break;
|
break;
|
||||||
case Soc_PUB_COMMENT_TO_NOTE:
|
case Soc_PUB_COMMENT_TO_NOTE:
|
||||||
/***** Get content of social post from database *****/
|
/***** Get content of social post from database *****/
|
||||||
|
// TODO: What happens if content is empty and an image is attached?
|
||||||
sprintf (Query,"SELECT Content FROM social_comments"
|
sprintf (Query,"SELECT Content FROM social_comments"
|
||||||
" WHERE PubCod='%ld'",
|
" WHERE PubCod='%ld'",
|
||||||
SocPub.PubCod);
|
SocPub.PubCod);
|
||||||
|
|
36
swad_test.c
36
swad_test.c
|
@ -221,7 +221,7 @@ static void Tst_PutFormEditOneQst (char *Stem,char *Feedback);
|
||||||
static void Tst_FreeTextChoiceAnswers (void);
|
static void Tst_FreeTextChoiceAnswers (void);
|
||||||
static void Tst_FreeTextChoiceAnswer (unsigned NumOpt);
|
static void Tst_FreeTextChoiceAnswer (unsigned NumOpt);
|
||||||
|
|
||||||
static void Tst_InitImagesOfQuestion (void);
|
// static void Tst_InitImagesOfQuestion (void);
|
||||||
static void Tst_FreeImagesOfQuestion (void);
|
static void Tst_FreeImagesOfQuestion (void);
|
||||||
|
|
||||||
static void Tst_GetQstDataFromDB (char *Stem,char *Feedback);
|
static void Tst_GetQstDataFromDB (char *Stem,char *Feedback);
|
||||||
|
@ -4775,6 +4775,10 @@ void Tst_QstConstructor (void)
|
||||||
Gbl.Test.AnswerType = Tst_ANS_UNIQUE_CHOICE;
|
Gbl.Test.AnswerType = Tst_ANS_UNIQUE_CHOICE;
|
||||||
Gbl.Test.Answer.NumOptions = 0;
|
Gbl.Test.Answer.NumOptions = 0;
|
||||||
Gbl.Test.Answer.TF = ' ';
|
Gbl.Test.Answer.TF = ' ';
|
||||||
|
|
||||||
|
/***** Initialize image attached to stem *****/
|
||||||
|
Img_ImageConstructor (&Gbl.Test.Image);
|
||||||
|
|
||||||
for (NumOpt = 0;
|
for (NumOpt = 0;
|
||||||
NumOpt < Tst_MAX_OPTIONS_PER_QUESTION;
|
NumOpt < Tst_MAX_OPTIONS_PER_QUESTION;
|
||||||
NumOpt++)
|
NumOpt++)
|
||||||
|
@ -4782,12 +4786,13 @@ void Tst_QstConstructor (void)
|
||||||
Gbl.Test.Answer.Options[NumOpt].Correct = false;
|
Gbl.Test.Answer.Options[NumOpt].Correct = false;
|
||||||
Gbl.Test.Answer.Options[NumOpt].Text = NULL;
|
Gbl.Test.Answer.Options[NumOpt].Text = NULL;
|
||||||
Gbl.Test.Answer.Options[NumOpt].Feedback = NULL;
|
Gbl.Test.Answer.Options[NumOpt].Feedback = NULL;
|
||||||
|
|
||||||
|
/***** Initialize image attached to option *****/
|
||||||
|
Img_ImageConstructor (&Gbl.Test.Answer.Options[NumOpt].Image);
|
||||||
}
|
}
|
||||||
Gbl.Test.Answer.Integer = 0;
|
Gbl.Test.Answer.Integer = 0;
|
||||||
Gbl.Test.Answer.FloatingPoint[0] =
|
Gbl.Test.Answer.FloatingPoint[0] =
|
||||||
Gbl.Test.Answer.FloatingPoint[1] = 0.0;
|
Gbl.Test.Answer.FloatingPoint[1] = 0.0;
|
||||||
|
|
||||||
Tst_InitImagesOfQuestion ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -4861,26 +4866,21 @@ static void Tst_FreeTextChoiceAnswer (unsigned NumOpt)
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/***************** Initialize images of a question to zero *******************/
|
/***************** Initialize images of a question to zero *******************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
/*
|
||||||
static void Tst_InitImagesOfQuestion (void)
|
static void Tst_InitImagesOfQuestion (void)
|
||||||
{
|
{
|
||||||
unsigned NumOpt;
|
unsigned NumOpt;
|
||||||
|
|
||||||
Gbl.Test.Image.Action = Img_ACTION_NO_IMAGE;
|
***** Initialize image *****
|
||||||
Gbl.Test.Image.Status = Img_FILE_NONE;
|
Img_ResetImage (&Gbl.Test.Image);
|
||||||
Gbl.Test.Image.Name[0] = '\0';
|
|
||||||
Gbl.Test.Image.Title = NULL;
|
|
||||||
for (NumOpt = 0;
|
for (NumOpt = 0;
|
||||||
NumOpt < Tst_MAX_OPTIONS_PER_QUESTION;
|
NumOpt < Tst_MAX_OPTIONS_PER_QUESTION;
|
||||||
NumOpt++)
|
NumOpt++)
|
||||||
{
|
***** Initialize image *****
|
||||||
Gbl.Test.Answer.Options[NumOpt].Image.Action = Img_ACTION_NO_IMAGE;
|
Img_ResetImage (&Gbl.Test.Answer.Options[NumOpt].Image);
|
||||||
Gbl.Test.Answer.Options[NumOpt].Image.Status = Img_FILE_NONE;
|
|
||||||
Gbl.Test.Answer.Options[NumOpt].Image.Name[0] = '\0';
|
|
||||||
Gbl.Test.Answer.Options[NumOpt].Image.Title = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*********************** Free images of a question ***************************/
|
/*********************** Free images of a question ***************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -4889,11 +4889,11 @@ static void Tst_FreeImagesOfQuestion (void)
|
||||||
{
|
{
|
||||||
unsigned NumOpt;
|
unsigned NumOpt;
|
||||||
|
|
||||||
Img_FreeImageTitle (&Gbl.Test.Image);
|
Img_ImageDestructor (&Gbl.Test.Image);
|
||||||
for (NumOpt = 0;
|
for (NumOpt = 0;
|
||||||
NumOpt < Tst_MAX_OPTIONS_PER_QUESTION;
|
NumOpt < Tst_MAX_OPTIONS_PER_QUESTION;
|
||||||
NumOpt++)
|
NumOpt++)
|
||||||
Img_FreeImageTitle (&Gbl.Test.Answer.Options[NumOpt].Image);
|
Img_ImageDestructor (&Gbl.Test.Answer.Options[NumOpt].Image);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -5129,7 +5129,7 @@ void Tst_ReceiveQst (void)
|
||||||
else // Question is wrong
|
else // Question is wrong
|
||||||
{
|
{
|
||||||
/***** Whether images has been received or not, reset images *****/
|
/***** Whether images has been received or not, reset images *****/
|
||||||
Tst_InitImagesOfQuestion ();
|
// Tst_InitImagesOfQuestion ();
|
||||||
|
|
||||||
/***** Put form to edit question again *****/
|
/***** Put form to edit question again *****/
|
||||||
Tst_PutFormEditOneQst (Stem,Feedback);
|
Tst_PutFormEditOneQst (Stem,Feedback);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user