Version 15.190

This commit is contained in:
Antonio Cañas Vargas 2016-04-08 23:30:43 +02:00
parent ad46ffcbf1
commit cf1fb79961
9 changed files with 228 additions and 68 deletions

View File

@ -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;

View File

@ -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;
-- --

View File

@ -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},

View File

@ -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)

View File

@ -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;");

View File

@ -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 */

View File

@ -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);

View File

@ -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);

View File

@ -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);