diff --git a/swad_banner.c b/swad_banner.c index 272b3458c..eb7d716e1 100644 --- a/swad_banner.c +++ b/swad_banner.c @@ -39,6 +39,7 @@ #include "swad_language.h" #include "swad_parameter.h" #include "swad_photo.h" +// struct Ban_Banners Ban_Banners; /*****************************************************************************/ /************** External global variables from others modules ****************/ @@ -54,40 +55,72 @@ extern struct Globals Gbl; /******************************* Private types *******************************/ /*****************************************************************************/ +struct Ban_Banners + { + unsigned Num; // Number of banners + struct Banner *Lst; // List of banners + long BanCodToEdit; // Used as parameter in contextual links + long BanCodClicked; // Banned clicked, used to log it + }; + /*****************************************************************************/ /***************************** Private variables *****************************/ /*****************************************************************************/ -static struct Banner *Ban_EditingBan = NULL; // Static variable to keep the banner being edited +static struct Banner *Ban_EditingBan; +static long Ban_BanCodClicked; /*****************************************************************************/ /***************************** Private prototypes ****************************/ /*****************************************************************************/ -static void Ban_WriteListOfBanners (void); +static void Ban_SetEditingBanner (struct Banner *Ban); +static struct Banner *Ban_GetEditingBanner (void); + +static void Ban_WriteListOfBanners (const struct Ban_Banners *Banners); static void Ban_PutIconsListingBanners (void *Args); static void Ban_PutIconToEditBanners (void); -static void Ban_EditBannersInternal (void); -static void Ban_GetListBanners (MYSQL_RES **mysql_res,unsigned long NumRows); +static void Ban_EditBannersInternal (struct Ban_Banners *Banners, + const struct Banner *Ban); +static void Ban_GetListBanners (struct Ban_Banners *Banners, + MYSQL_RES **mysql_res,unsigned long NumRows); +static void Ban_FreeListBanners (struct Ban_Banners *Banners); static void Ban_PutIconsEditingBanners (void *Args); -static void Ban_ListBannersForEdition (void); -static void Ban_PutParamBanCodToEdit (void *Args); +static void Ban_ListBannersForEdition (struct Ban_Banners *Banners); +static void Ban_PutParamBanCodToEdit (void *BanCod); static void Ban_PutParamBanCod (long BanCod); -static void Ban_ShowOrHideBanner (bool Hide); +static void Ban_ShowOrHideBanner (struct Banner *Ban,bool Hide); -static void Ban_RenameBanner (Cns_ShrtOrFullName_t ShrtOrFullName); +static void Ban_RenameBanner (struct Banner *Ban, + Cns_ShrtOrFullName_t ShrtOrFullName); static bool Ban_CheckIfBannerNameExists (const char *FieldName,const char *Name,long BanCod); static void Ban_UpdateBanNameDB (long BanCod,const char *FieldName, const char *NewBanName); -static void Ban_PutFormToCreateBanner (void); +static void Ban_PutFormToCreateBanner (const struct Banner *Ban); static void Ban_PutHeadBanners (void); -static void Ban_CreateBanner (struct Banner *Ban); +static void Ban_CreateBanner (const struct Banner *Ban); -static void Ban_EditingBannerConstructor (void); -static void Ban_EditingBannerDestructor (void); +static void Ban_SetBanCodClicked (long BanCod); + +static void Ban_ResetBanners (struct Ban_Banners *Banners); +static void Ban_ResetBanner (struct Banner *Ban); + +/*****************************************************************************/ +/************************** Access to editing banner *************************/ +/*****************************************************************************/ + +static void Ban_SetEditingBanner (struct Banner *Ban) + { + Ban_EditingBan = Ban; + } + +static struct Banner *Ban_GetEditingBanner (void) + { + return Ban_EditingBan; + } /*****************************************************************************/ /***************************** List all banners ******************************/ @@ -99,16 +132,20 @@ void Ban_SeeBanners (void) extern const char *Txt_Banners; extern const char *Txt_No_banners; extern const char *Txt_New_banner; + struct Ban_Banners Banners; MYSQL_RES *mysql_res; unsigned long NumRows; + /***** Reset banners *****/ + Ban_ResetBanners (&Banners); + /***** Get list of banners *****/ NumRows = DB_QuerySELECT (&mysql_res,"can not get banners", "SELECT BanCod,Hidden,ShortName,FullName,Img,WWW" " FROM banners" " WHERE Hidden='N'" " ORDER BY ShortName"); - Ban_GetListBanners (&mysql_res,NumRows); + Ban_GetListBanners (&Banners,&mysql_res,NumRows); /***** Begin box *****/ Box_BoxBegin (NULL,Txt_Banners, @@ -116,8 +153,8 @@ void Ban_SeeBanners (void) Hlp_SYSTEM_Banners,Box_NOT_CLOSABLE); /***** Write all banners *****/ - if (Gbl.Banners.Num) // There are banners - Ban_WriteListOfBanners (); + if (Banners.Num) // There are banners + Ban_WriteListOfBanners (&Banners); else // No banners created Ale_ShowAlert (Ale_INFO,Txt_No_banners); @@ -133,14 +170,14 @@ void Ban_SeeBanners (void) Box_BoxEnd (); /***** Free list of banners *****/ - Ban_FreeListBanners (); + Ban_FreeListBanners (&Banners); } /*****************************************************************************/ /*************************** Write list of banners ***************************/ /*****************************************************************************/ -static void Ban_WriteListOfBanners (void) +static void Ban_WriteListOfBanners (const struct Ban_Banners *Banners) { unsigned NumBan; @@ -149,15 +186,15 @@ static void Ban_WriteListOfBanners (void) /***** Write all the banners *****/ for (NumBan = 0; - NumBan < Gbl.Banners.Num; + NumBan < Banners->Num; NumBan++) { /* Write data of this banner */ HTM_LI_Begin (NULL); HTM_A_Begin ("href=\"%s\" title=\"%s\" class=\"DAT\" target=\"_blank\"", - Gbl.Banners.Lst[NumBan].WWW, - Gbl.Banners.Lst[NumBan].FullName); - HTM_IMG (Cfg_URL_BANNER_PUBLIC,Gbl.Banners.Lst[NumBan].Img,Gbl.Banners.Lst[NumBan].FullName, + Banners->Lst[NumBan].WWW, + Banners->Lst[NumBan].FullName); + HTM_IMG (Cfg_URL_BANNER_PUBLIC,Banners->Lst[NumBan].Img,Banners->Lst[NumBan].FullName, "class=\"BANNER\""); HTM_A_End (); HTM_LI_End (); @@ -200,17 +237,21 @@ static void Ban_PutIconToEditBanners (void) void Ban_EditBanners (void) { - /***** Banner constructor *****/ - Ban_EditingBannerConstructor (); + struct Ban_Banners Banners; + struct Banner Ban; + + /***** Reset banners *****/ + Ban_ResetBanners (&Banners); + + /***** Reset banner *****/ + Ban_ResetBanner (&Ban); /***** Edit banners *****/ - Ban_EditBannersInternal (); - - /***** Banner destructor *****/ - Ban_EditingBannerDestructor (); + Ban_EditBannersInternal (&Banners,&Ban); } -static void Ban_EditBannersInternal (void) +static void Ban_EditBannersInternal (struct Ban_Banners *Banners, + const struct Banner *Ban) { extern const char *Hlp_SYSTEM_Banners_edit; extern const char *Txt_Banners; @@ -221,7 +262,7 @@ static void Ban_EditBannersInternal (void) NumRows = DB_QuerySELECT (&mysql_res,"can not get banners", "SELECT BanCod,Hidden,ShortName,FullName,Img,WWW" " FROM banners ORDER BY ShortName"); - Ban_GetListBanners (&mysql_res,NumRows); + Ban_GetListBanners (Banners,&mysql_res,NumRows); /***** Begin box *****/ Box_BoxBegin (NULL,Txt_Banners, @@ -229,24 +270,25 @@ static void Ban_EditBannersInternal (void) Hlp_SYSTEM_Banners_edit,Box_NOT_CLOSABLE); /***** Put a form to create a new banner *****/ - Ban_PutFormToCreateBanner (); + Ban_PutFormToCreateBanner (Ban); /***** Forms to edit current banners *****/ - if (Gbl.Banners.Num) - Ban_ListBannersForEdition (); + if (Banners->Num) + Ban_ListBannersForEdition (Banners); /***** End box *****/ Box_BoxEnd (); /***** Free list of banners *****/ - Ban_FreeListBanners (); + Ban_FreeListBanners (Banners); } /*****************************************************************************/ /**************************** List all the banners ***************************/ /*****************************************************************************/ -static void Ban_GetListBanners (MYSQL_RES **mysql_res,unsigned long NumRows) +static void Ban_GetListBanners (struct Ban_Banners *Banners, + MYSQL_RES **mysql_res,unsigned long NumRows) { MYSQL_ROW row; unsigned NumBan; @@ -255,19 +297,19 @@ static void Ban_GetListBanners (MYSQL_RES **mysql_res,unsigned long NumRows) /***** Get banners from database *****/ if (NumRows) // Banners found... { - Gbl.Banners.Num = (unsigned) NumRows; + Banners->Num = (unsigned) NumRows; /***** Create list with banners *****/ - if ((Gbl.Banners.Lst = (struct Banner *) - calloc (NumRows,sizeof (struct Banner))) == NULL) + if ((Banners->Lst = (struct Banner *) + calloc (NumRows,sizeof (struct Banner))) == NULL) Lay_NotEnoughMemoryExit (); /***** Get the banners *****/ for (NumBan = 0; - NumBan < Gbl.Banners.Num; + NumBan < Banners->Num; NumBan++) { - Ban = &(Gbl.Banners.Lst[NumBan]); + Ban = &(Banners->Lst[NumBan]); /* Get next banner */ row = mysql_fetch_row (*mysql_res); @@ -297,7 +339,7 @@ static void Ban_GetListBanners (MYSQL_RES **mysql_res,unsigned long NumRows) } } else - Gbl.Banners.Num = 0; + Banners->Num = 0; /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (mysql_res); @@ -359,14 +401,14 @@ void Ban_GetDataOfBannerByCod (struct Banner *Ban) /*************************** Free list of banners ****************************/ /*****************************************************************************/ -void Ban_FreeListBanners (void) +static void Ban_FreeListBanners (struct Ban_Banners *Banners) { - if (Gbl.Banners.Lst) + if (Banners->Lst) { /***** Free memory used by the list of banners *****/ - free (Gbl.Banners.Lst); - Gbl.Banners.Lst = NULL; - Gbl.Banners.Num = 0; + free (Banners->Lst); + Banners->Lst = NULL; + Banners->Num = 0; } } @@ -404,7 +446,7 @@ void Ban_PutIconToViewBanners (void) /*************************** List all the banners ****************************/ /*****************************************************************************/ -static void Ban_ListBannersForEdition (void) +static void Ban_ListBannersForEdition (struct Ban_Banners *Banners) { unsigned NumBan; struct Banner *Ban; @@ -418,11 +460,11 @@ static void Ban_ListBannersForEdition (void) /***** Write all the banners *****/ for (NumBan = 0; - NumBan < Gbl.Banners.Num; + NumBan < Banners->Num; NumBan++) { - Ban = &Gbl.Banners.Lst[NumBan]; - Gbl.Banners.BanCodToEdit = Ban->BanCod; + Ban = &Banners->Lst[NumBan]; + Banners->BanCodToEdit = Ban->BanCod; /* Set anchor string */ Frm_SetAnchorStr (Ban->BanCod,&Anchor); @@ -432,17 +474,17 @@ static void Ban_ListBannersForEdition (void) HTM_TD_Begin ("class=\"BM\""); Ico_PutContextualIconToRemove (ActRemBan, - Ban_PutParamBanCodToEdit,&Gbl); + Ban_PutParamBanCodToEdit,&Banners->BanCodToEdit); HTM_TD_End (); /* Put icon to hide/show banner */ HTM_TD_Begin ("class=\"BM\""); if (Ban->Hidden) Ico_PutContextualIconToUnhide (ActShoBan,Anchor, - Ban_PutParamBanCodToEdit,&Gbl); + Ban_PutParamBanCodToEdit,&Banners->BanCodToEdit); else Ico_PutContextualIconToHide (ActHidBan,Anchor, - Ban_PutParamBanCodToEdit,&Gbl); + Ban_PutParamBanCodToEdit,&Banners->BanCodToEdit); HTM_TD_End (); /* Banner code */ @@ -457,7 +499,7 @@ static void Ban_ListBannersForEdition (void) /* Banner short name */ HTM_TD_Begin ("class=\"CM\""); Frm_StartForm (ActRenBanSho); - Ban_PutParamBanCodToEdit (&Gbl); + Ban_PutParamBanCodToEdit (&Banners->BanCodToEdit); HTM_INPUT_TEXT ("ShortName",Ban_MAX_CHARS_SHRT_NAME,Ban->ShrtName,true, "class=\"INPUT_SHORT_NAME\""); Frm_EndForm (); @@ -466,7 +508,7 @@ static void Ban_ListBannersForEdition (void) /* Banner full name */ HTM_TD_Begin ("class=\"CM\""); Frm_StartForm (ActRenBanFul); - Ban_PutParamBanCodToEdit (&Gbl); + Ban_PutParamBanCodToEdit (&Banners->BanCodToEdit); HTM_INPUT_TEXT ("FullName",Ban_MAX_CHARS_FULL_NAME,Ban->FullName,true, "class=\"INPUT_FULL_NAME\""); Frm_EndForm (); @@ -475,7 +517,7 @@ static void Ban_ListBannersForEdition (void) /* Banner image */ HTM_TD_Begin ("class=\"CM\""); Frm_StartForm (ActChgBanImg); - Ban_PutParamBanCodToEdit (&Gbl); + Ban_PutParamBanCodToEdit (&Banners->BanCodToEdit); HTM_INPUT_TEXT ("Img",Ban_MAX_CHARS_IMAGE,Ban->Img,true, "size=\"12\""); Frm_EndForm (); @@ -484,7 +526,7 @@ static void Ban_ListBannersForEdition (void) /* Banner WWW */ HTM_TD_Begin ("class=\"CM\""); Frm_StartForm (ActChgBanWWW); - Ban_PutParamBanCodToEdit (&Gbl); + Ban_PutParamBanCodToEdit (&Banners->BanCodToEdit); HTM_INPUT_URL ("WWW",Ban->WWW,true, "class=\"INPUT_WWW_NARROW\" required=\"required\""); Frm_EndForm (); @@ -504,10 +546,10 @@ static void Ban_ListBannersForEdition (void) /******************* Write parameter with code of banner *********************/ /*****************************************************************************/ -static void Ban_PutParamBanCodToEdit (void *Args) +static void Ban_PutParamBanCodToEdit (void *BanCod) { - if (Args) - Ban_PutParamBanCod (Gbl.Banners.BanCodToEdit); + if (BanCod) + Ban_PutParamBanCod (*((long *) BanCod)); } static void Ban_PutParamBanCod (long BanCod) @@ -532,26 +574,30 @@ long Ban_GetParamBanCod (void) void Ban_RemoveBanner (void) { extern const char *Txt_Banner_X_removed; + struct Banner Ban; - /***** Banner constructor *****/ - Ban_EditingBannerConstructor (); + /***** Reset banner *****/ + Ban_ResetBanner (&Ban); /***** Get banner code *****/ - if ((Ban_EditingBan->BanCod = Ban_GetParamBanCod ()) == -1L) + if ((Ban.BanCod = Ban_GetParamBanCod ()) == -1L) Lay_ShowErrorAndExit ("Code of banner is missing."); /***** Get data of the banner from database *****/ - Ban_GetDataOfBannerByCod (Ban_EditingBan); + Ban_GetDataOfBannerByCod (&Ban); /***** Remove banner *****/ DB_QueryDELETE ("can not remove a banner", "DELETE FROM banners WHERE BanCod=%ld", - Ban_EditingBan->BanCod); + Ban.BanCod); /***** Write message to show the change made *****/ Ale_CreateAlert (Ale_SUCCESS,NULL, Txt_Banner_X_removed, - Ban_EditingBan->ShrtName); + Ban.ShrtName); + + /***** Set editing banner to use ot in a posterior function *****/ + Ban_SetEditingBanner (&Ban); } /*****************************************************************************/ @@ -560,11 +606,16 @@ void Ban_RemoveBanner (void) void Ban_ShowBanner (void) { - /***** Banner constructor *****/ - Ban_EditingBannerConstructor (); + struct Banner Ban; + + /***** Reset banner *****/ + Ban_ResetBanner (&Ban); /***** Set banner as visible *****/ - Ban_ShowOrHideBanner (false); + Ban_ShowOrHideBanner (&Ban,false); + + /***** Set editing banner to use ot in a posterior function *****/ + Ban_SetEditingBanner (&Ban); } /*****************************************************************************/ @@ -573,34 +624,39 @@ void Ban_ShowBanner (void) void Ban_HideBanner (void) { - /***** Banner constructor *****/ - Ban_EditingBannerConstructor (); + struct Banner Ban; + + /***** Reset banner *****/ + Ban_ResetBanner (&Ban); /***** Set banner as hidden *****/ - Ban_ShowOrHideBanner (true); + Ban_ShowOrHideBanner (&Ban,true); + + /***** Set editing banner to use ot in a posterior function *****/ + Ban_SetEditingBanner (&Ban); } /*****************************************************************************/ /*************** Change hiddeness of banner in the database ******************/ /*****************************************************************************/ -static void Ban_ShowOrHideBanner (bool Hide) +static void Ban_ShowOrHideBanner (struct Banner *Ban,bool Hide) { /***** Get banner code *****/ - if ((Ban_EditingBan->BanCod = Ban_GetParamBanCod ()) == -1L) + if ((Ban->BanCod = Ban_GetParamBanCod ()) == -1L) Lay_ShowErrorAndExit ("Code of banner is missing."); /***** Get data of the banner from database *****/ - Ban_GetDataOfBannerByCod (Ban_EditingBan); + Ban_GetDataOfBannerByCod (Ban); /***** Mark file as hidden/visible in database *****/ - if (Ban_EditingBan->Hidden != Hide) + if (Ban->Hidden != Hide) DB_QueryUPDATE ("can not change status of a banner in database", "UPDATE banners SET Hidden='%c'" " WHERE BanCod=%ld", Hide ? 'Y' : 'N', - Ban_EditingBan->BanCod); + Ban->BanCod); } /*****************************************************************************/ @@ -609,11 +665,16 @@ static void Ban_ShowOrHideBanner (bool Hide) void Ban_RenameBannerShort (void) { - /***** Banner constructor *****/ - Ban_EditingBannerConstructor (); + struct Banner Ban; + + /***** Reset banner *****/ + Ban_ResetBanner (&Ban); /***** Rename banner *****/ - Ban_RenameBanner (Cns_SHRT_NAME); + Ban_RenameBanner (&Ban,Cns_SHRT_NAME); + + /***** Set editing banner to use ot in a posterior function *****/ + Ban_SetEditingBanner (&Ban); } /*****************************************************************************/ @@ -622,18 +683,24 @@ void Ban_RenameBannerShort (void) void Ban_RenameBannerFull (void) { - /***** Banner constructor *****/ - Ban_EditingBannerConstructor (); + struct Banner Ban; + + /***** Reset banner *****/ + Ban_ResetBanner (&Ban); /***** Rename banner *****/ - Ban_RenameBanner (Cns_FULL_NAME); + Ban_RenameBanner (&Ban,Cns_FULL_NAME); + + /***** Set editing banner to use ot in a posterior function *****/ + Ban_SetEditingBanner (&Ban); } /*****************************************************************************/ /*********************** Change the name of a banner *************************/ /*****************************************************************************/ -static void Ban_RenameBanner (Cns_ShrtOrFullName_t ShrtOrFullName) +static void Ban_RenameBanner (struct Banner *Ban, + Cns_ShrtOrFullName_t ShrtOrFullName) { extern const char *Txt_The_banner_X_already_exists; extern const char *Txt_The_banner_X_has_been_renamed_as_Y; @@ -650,26 +717,26 @@ static void Ban_RenameBanner (Cns_ShrtOrFullName_t ShrtOrFullName) ParamName = "ShortName"; FieldName = "ShortName"; MaxBytes = Ban_MAX_BYTES_SHRT_NAME; - CurrentBanName = Ban_EditingBan->ShrtName; + CurrentBanName = Ban->ShrtName; break; case Cns_FULL_NAME: ParamName = "FullName"; FieldName = "FullName"; MaxBytes = Ban_MAX_BYTES_FULL_NAME; - CurrentBanName = Ban_EditingBan->FullName; + CurrentBanName = Ban->FullName; break; } /***** Get parameters from form *****/ /* Get the code of the banner */ - if ((Ban_EditingBan->BanCod = Ban_GetParamBanCod ()) == -1L) + if ((Ban->BanCod = Ban_GetParamBanCod ()) == -1L) Lay_ShowErrorAndExit ("Code of banner is missing."); /* Get the new name for the banner */ Par_GetParToText (ParamName,NewBanName,MaxBytes); /***** Get banner data from the database *****/ - Ban_GetDataOfBannerByCod (Ban_EditingBan); + Ban_GetDataOfBannerByCod (Ban); /***** Check if new name is empty *****/ if (!NewBanName[0]) @@ -681,14 +748,14 @@ static void Ban_RenameBanner (Cns_ShrtOrFullName_t ShrtOrFullName) if (strcmp (CurrentBanName,NewBanName)) // Different names { /***** If banner was in database... *****/ - if (Ban_CheckIfBannerNameExists (ParamName,NewBanName,Ban_EditingBan->BanCod)) + if (Ban_CheckIfBannerNameExists (ParamName,NewBanName,Ban->BanCod)) Ale_CreateAlert (Ale_WARNING,NULL, Txt_The_banner_X_already_exists, NewBanName); else { /* Update the table changing old name by new name */ - Ban_UpdateBanNameDB (Ban_EditingBan->BanCod,FieldName,NewBanName); + Ban_UpdateBanNameDB (Ban->BanCod,FieldName,NewBanName); /* Write message to show the change made */ Ale_CreateAlert (Ale_SUCCESS,NULL, @@ -742,21 +809,22 @@ void Ban_ChangeBannerImg (void) { extern const char *Txt_The_new_image_is_X; extern const char *Txt_You_can_not_leave_the_image_empty; + struct Banner Ban; char NewImg[Ban_MAX_BYTES_IMAGE + 1]; - /***** Banner constructor *****/ - Ban_EditingBannerConstructor (); + /***** Reset banner *****/ + Ban_ResetBanner (&Ban); /***** Get parameters from form *****/ /* Get the code of the banner */ - if ((Ban_EditingBan->BanCod = Ban_GetParamBanCod ()) == -1L) + if ((Ban.BanCod = Ban_GetParamBanCod ()) == -1L) Lay_ShowErrorAndExit ("Code of banner is missing."); /* Get the new WWW for the banner */ Par_GetParToText ("Img",NewImg,Ban_MAX_BYTES_IMAGE); /***** Get banner data from the database *****/ - Ban_GetDataOfBannerByCod (Ban_EditingBan); + Ban_GetDataOfBannerByCod (&Ban); /***** Check if new image is empty *****/ if (NewImg[0]) @@ -764,7 +832,7 @@ void Ban_ChangeBannerImg (void) /* Update the table changing old image by new image */ DB_QueryUPDATE ("can not update the image of a banner", "UPDATE banners SET Img='%s' WHERE BanCod=%ld", - NewImg,Ban_EditingBan->BanCod); + NewImg,Ban.BanCod); /***** Write message to show the change made *****/ Ale_CreateAlert (Ale_SUCCESS,NULL, @@ -776,8 +844,11 @@ void Ban_ChangeBannerImg (void) Txt_You_can_not_leave_the_image_empty); /***** Update image *****/ - Str_Copy (Ban_EditingBan->Img,NewImg, + Str_Copy (Ban.Img,NewImg, Ban_MAX_BYTES_IMAGE); + + /***** Set editing banner to use ot in a posterior function *****/ + Ban_SetEditingBanner (&Ban); } /*****************************************************************************/ @@ -787,21 +858,22 @@ void Ban_ChangeBannerImg (void) void Ban_ChangeBannerWWW (void) { extern const char *Txt_The_new_web_address_is_X; + struct Banner Ban; char NewWWW[Cns_MAX_BYTES_WWW + 1]; - /***** Banner constructor *****/ - Ban_EditingBannerConstructor (); + /***** Reset banner *****/ + Ban_ResetBanner (&Ban); /***** Get parameters from form *****/ /* Get the code of the banner */ - if ((Ban_EditingBan->BanCod = Ban_GetParamBanCod ()) == -1L) + if ((Ban.BanCod = Ban_GetParamBanCod ()) == -1L) Lay_ShowErrorAndExit ("Code of banner is missing."); /* Get the new WWW for the banner */ Par_GetParToText ("WWW",NewWWW,Cns_MAX_BYTES_WWW); /***** Get banner data from the database *****/ - Ban_GetDataOfBannerByCod (Ban_EditingBan); + Ban_GetDataOfBannerByCod (&Ban); /***** Check if new WWW is empty *****/ if (NewWWW[0]) @@ -809,7 +881,7 @@ void Ban_ChangeBannerWWW (void) /* Update the table changing old WWW by new WWW */ DB_QueryUPDATE ("can not update the web of a banner", "UPDATE banners SET WWW='%s' WHERE BanCod=%ld", - NewWWW,Ban_EditingBan->BanCod); + NewWWW,Ban.BanCod); /***** Write message to show the change made *****/ Ale_CreateAlert (Ale_SUCCESS,NULL, @@ -820,8 +892,11 @@ void Ban_ChangeBannerWWW (void) Ale_CreateAlertYouCanNotLeaveFieldEmpty (); /***** Update web *****/ - Str_Copy (Ban_EditingBan->WWW,NewWWW, + Str_Copy (Ban.WWW,NewWWW, Cns_MAX_BYTES_WWW); + + /***** Set editing banner to use ot in a posterior function *****/ + Ban_SetEditingBanner (&Ban); } /*****************************************************************************/ @@ -830,21 +905,24 @@ void Ban_ChangeBannerWWW (void) void Ban_ContEditAfterChgBan (void) { + struct Ban_Banners Banners; + struct Banner *Ban = Ban_GetEditingBanner (); + + /***** Reset banners *****/ + Ban_ResetBanners (&Banners); + /***** Write message to show the change made *****/ Ale_ShowAlerts (NULL); /***** Show the form again *****/ - Ban_EditBannersInternal (); - - /***** Banner destructor *****/ - Ban_EditingBannerDestructor (); + Ban_EditBannersInternal (&Banners,Ban); } /*****************************************************************************/ /********************* Put a form to create a new banner *********************/ /*****************************************************************************/ -static void Ban_PutFormToCreateBanner (void) +static void Ban_PutFormToCreateBanner (const struct Banner *Ban) { extern const char *Hlp_SYSTEM_Banners_edit; extern const char *Txt_New_banner; @@ -874,25 +952,25 @@ static void Ban_PutFormToCreateBanner (void) /***** Banner short name *****/ HTM_TD_Begin ("class=\"CM\""); - HTM_INPUT_TEXT ("ShortName",Ban_MAX_CHARS_SHRT_NAME,Ban_EditingBan->ShrtName,false, + HTM_INPUT_TEXT ("ShortName",Ban_MAX_CHARS_SHRT_NAME,Ban->ShrtName,false, "class=\"INPUT_SHORT_NAME\" required=\"required\""); HTM_TD_End (); /***** Banner full name *****/ HTM_TD_Begin ("class=\"CM\""); - HTM_INPUT_TEXT ("FullName",Ban_MAX_CHARS_FULL_NAME,Ban_EditingBan->FullName,false, + HTM_INPUT_TEXT ("FullName",Ban_MAX_CHARS_FULL_NAME,Ban->FullName,false, "class=\"INPUT_FULL_NAME\" required=\"required\""); HTM_TD_End (); /***** Banner image *****/ HTM_TD_Begin ("class=\"CM\""); - HTM_INPUT_TEXT ("Img",Ban_MAX_CHARS_IMAGE,Ban_EditingBan->Img,false, + HTM_INPUT_TEXT ("Img",Ban_MAX_CHARS_IMAGE,Ban->Img,false, "size=\"12\" required=\"required\""); HTM_TD_End (); /***** Banner WWW *****/ HTM_TD_Begin ("class=\"CM\""); - HTM_INPUT_URL ("WWW",Ban_EditingBan->WWW,false, + HTM_INPUT_URL ("WWW",Ban->WWW,false, "class=\"INPUT_WWW_NARROW\" required=\"required\""); HTM_TD_End (); @@ -941,58 +1019,62 @@ void Ban_RecFormNewBanner (void) extern const char *Txt_You_must_specify_the_URL_of_the_new_banner; extern const char *Txt_Created_new_banner_X; extern const char *Txt_You_must_specify_the_short_name_and_the_full_name_of_the_new_banner; + struct Banner Ban; - /***** Banner constructor *****/ - Ban_EditingBannerConstructor (); + /***** Reset banner *****/ + Ban_ResetBanner (&Ban); /***** Get parameters from form *****/ /* Get banner short name */ - Par_GetParToText ("ShortName",Ban_EditingBan->ShrtName,Ban_MAX_BYTES_SHRT_NAME); + Par_GetParToText ("ShortName",Ban.ShrtName,Ban_MAX_BYTES_SHRT_NAME); /* Get banner full name */ - Par_GetParToText ("FullName",Ban_EditingBan->FullName,Ban_MAX_BYTES_FULL_NAME); + Par_GetParToText ("FullName",Ban.FullName,Ban_MAX_BYTES_FULL_NAME); /* Get banner image */ - Par_GetParToText ("Img",Ban_EditingBan->Img,Ban_MAX_BYTES_IMAGE); + Par_GetParToText ("Img",Ban.Img,Ban_MAX_BYTES_IMAGE); /* Get banner URL */ - Par_GetParToText ("WWW",Ban_EditingBan->WWW,Cns_MAX_BYTES_WWW); + Par_GetParToText ("WWW",Ban.WWW,Cns_MAX_BYTES_WWW); - if (Ban_EditingBan->ShrtName[0] && - Ban_EditingBan->FullName[0]) // If there's a banner name + if (Ban.ShrtName[0] && + Ban.FullName[0]) // If there's a banner name { /***** If name of banner was in database... *****/ - if (Ban_CheckIfBannerNameExists ("ShortName",Ban_EditingBan->ShrtName,-1L)) + if (Ban_CheckIfBannerNameExists ("ShortName",Ban.ShrtName,-1L)) Ale_CreateAlert (Ale_WARNING,NULL, Txt_The_banner_X_already_exists, - Ban_EditingBan->ShrtName); - else if (Ban_CheckIfBannerNameExists ("FullName",Ban_EditingBan->FullName,-1L)) + Ban.ShrtName); + else if (Ban_CheckIfBannerNameExists ("FullName",Ban.FullName,-1L)) Ale_CreateAlert (Ale_WARNING,NULL, Txt_The_banner_X_already_exists, - Ban_EditingBan->FullName); - else if (!Ban_EditingBan->Img[0]) + Ban.FullName); + else if (!Ban.Img[0]) Ale_CreateAlert (Ale_WARNING,NULL, Txt_You_must_specify_the_image_of_the_new_banner); - else if (!Ban_EditingBan->WWW[0]) + else if (!Ban.WWW[0]) Ale_CreateAlert (Ale_WARNING,NULL, Txt_You_must_specify_the_URL_of_the_new_banner); else // Add new banner to database { - Ban_CreateBanner (Ban_EditingBan); + Ban_CreateBanner (&Ban); Ale_CreateAlert (Ale_SUCCESS,Txt_Created_new_banner_X, - Ban_EditingBan->ShrtName); + Ban.ShrtName); } } else // If there is not a banner name Ale_CreateAlert (Ale_WARNING,NULL, Txt_You_must_specify_the_short_name_and_the_full_name_of_the_new_banner); + + /***** Set editing banner to use ot in a posterior function *****/ + Ban_SetEditingBanner (&Ban); } /*****************************************************************************/ /**************************** Create a new banner ****************************/ /*****************************************************************************/ -static void Ban_CreateBanner (struct Banner *Ban) +static void Ban_CreateBanner (const struct Banner *Ban) { /***** Create a new banner *****/ DB_QueryINSERT ("can not create banner", @@ -1009,10 +1091,14 @@ static void Ban_CreateBanner (struct Banner *Ban) void Ban_WriteMenuWithBanners (void) { + struct Ban_Banners Banners; MYSQL_RES *mysql_res; unsigned long NumRows; unsigned NumBan; + /***** Reset banners *****/ + Ban_ResetBanners (&Banners); + /***** Get random banner *****/ // The banner(s) will change once in a while NumRows = DB_QuerySELECT (&mysql_res,"can not get banners", @@ -1022,26 +1108,26 @@ void Ban_WriteMenuWithBanners (void) " ORDER BY RAND(%lu) LIMIT %u", (unsigned long) (Gbl.StartExecutionTimeUTC / Cfg_TIME_TO_CHANGE_BANNER), Cfg_NUMBER_OF_BANNERS); - Ban_GetListBanners (&mysql_res,NumRows); + Ban_GetListBanners (&Banners,&mysql_res,NumRows); /***** Write all the banners *****/ for (NumBan = 0; - NumBan < Gbl.Banners.Num; + NumBan < Banners.Num; NumBan++) { /* Write data of this banner */ HTM_DIV_Begin ("class=\"CM\""); Frm_StartForm (ActClkBan); - Ban_PutParamBanCod (Gbl.Banners.Lst[NumBan].BanCod); - Par_PutHiddenParamString (NULL,"URL",Gbl.Banners.Lst[NumBan].WWW); - HTM_INPUT_IMAGE (Cfg_URL_BANNER_PUBLIC,Gbl.Banners.Lst[NumBan].Img, - Gbl.Banners.Lst[NumBan].FullName,"BANNER"); + Ban_PutParamBanCod (Banners.Lst[NumBan].BanCod); + Par_PutHiddenParamString (NULL,"URL",Banners.Lst[NumBan].WWW); + HTM_INPUT_IMAGE (Cfg_URL_BANNER_PUBLIC,Banners.Lst[NumBan].Img, + Banners.Lst[NumBan].FullName,"BANNER"); Frm_EndForm (); HTM_DIV_End (); } /***** Free list of banners *****/ - Ban_FreeListBanners (); + Ban_FreeListBanners (&Banners); } /*****************************************************************************/ @@ -1060,7 +1146,7 @@ void Ban_ClickOnBanner (void) Ban_GetDataOfBannerByCod (&Ban); /***** Set banner clicked in order to log it *****/ - Gbl.Banners.BanCodClicked = Ban.BanCod; + Ban_SetBanCodClicked (Ban.BanCod); /***** Download the file *****/ fprintf (stdout,"Location: %s\n\n",Ban.WWW); @@ -1072,35 +1158,39 @@ void Ban_ClickOnBanner (void) Gbl.Layout.HTMLEndWritten = true; // Don't write HTML at all } -/*****************************************************************************/ -/************************* Banner constructor/destructor **********************/ -/*****************************************************************************/ - -static void Ban_EditingBannerConstructor (void) +static void Ban_SetBanCodClicked (long BanCod) { - /***** Pointer must be NULL *****/ - if (Ban_EditingBan != NULL) - Lay_ShowErrorAndExit ("Error initializing banner."); + Ban_BanCodClicked = BanCod; + } - /***** Allocate memory for banner *****/ - if ((Ban_EditingBan = (struct Banner *) malloc (sizeof (struct Banner))) == NULL) - Lay_ShowErrorAndExit ("Error allocating memory for banner."); +long Ban_GetBanCodClicked (void) + { + return Ban_BanCodClicked; + } +/*****************************************************************************/ +/******************************* Reset banners *******************************/ +/*****************************************************************************/ + +static void Ban_ResetBanners (struct Ban_Banners *Banners) + { + Banners->Num = 0; + Banners->Lst = NULL; + Banners->BanCodToEdit = -1L; + Banners->BanCodClicked = 0L; + } + +/*****************************************************************************/ +/************************* Reset banner/destructor **********************/ +/*****************************************************************************/ + +static void Ban_ResetBanner (struct Banner *Ban) + { /***** Reset banner *****/ - Ban_EditingBan->BanCod = -1L; - Ban_EditingBan->Hidden = true; - Ban_EditingBan->ShrtName[0] = '\0'; - Ban_EditingBan->FullName[0] = '\0'; - Ban_EditingBan->Img[0] = '\0'; - Ban_EditingBan->WWW[0] = '\0'; - } - -static void Ban_EditingBannerDestructor (void) - { - /***** Free memory used for place *****/ - if (Ban_EditingBan != NULL) - { - free (Ban_EditingBan); - Ban_EditingBan = NULL; - } + Ban->BanCod = -1L; + Ban->Hidden = true; + Ban->ShrtName[0] = '\0'; + Ban->FullName[0] = '\0'; + Ban->Img[0] = '\0'; + Ban->WWW[0] = '\0'; } diff --git a/swad_banner.h b/swad_banner.h index f82a17e97..34167b4e2 100644 --- a/swad_banner.h +++ b/swad_banner.h @@ -58,7 +58,6 @@ struct Banner void Ban_SeeBanners (void); void Ban_EditBanners (void); -void Ban_FreeListBanners (void); void Ban_PutIconToViewBanners (void); @@ -74,6 +73,8 @@ void Ban_ChangeBannerWWW (void); void Ban_ContEditAfterChgBan (void); void Ban_RecFormNewBanner (void); void Ban_WriteMenuWithBanners (void); + void Ban_ClickOnBanner (void); +long Ban_GetBanCodClicked (void); #endif diff --git a/swad_changelog.h b/swad_changelog.h index 456e09118..456a6c878 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -497,7 +497,7 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - * En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 19.165 (2020-04-06)" +#define Log_PLATFORM_VERSION "SWAD 19.166 (2020-04-06)" #define CSS_FILE "swad19.146.css" #define JS_FILE "swad19.153.js" /* @@ -528,6 +528,7 @@ Param // TODO: Oresti Baños: cambiar ojos por candados en descriptores para prohibir/permitir y dejar los ojos para poder elegir descriptores // TODO: Integrar pull requests con traducciones del alemán del usuario eruedin en GitHub + Version 19.166: Apr 06, 2020 Code refactoring in banners. (284805 lines) Version 19.165: Apr 06, 2020 Code refactoring in attendance events. (284743 lines) Version 19.164: Apr 05, 2020 Code refactoring in assignments and pagination. (284644 lines) Version 19.163: Apr 05, 2020 Log table is now partitioned by years. (284617 lines) diff --git a/swad_global.c b/swad_global.c index 25de0b37c..94af509ef 100644 --- a/swad_global.c +++ b/swad_global.c @@ -316,11 +316,6 @@ void Gbl_InitializeGlobals (void) Gbl.Mails.Lst = NULL; Gbl.Mails.SelectedOrder = Mai_ORDER_DEFAULT; - Gbl.Banners.Num = 0; - Gbl.Banners.Lst = NULL; - Gbl.Banners.BanCodToEdit = -1L; - Gbl.Banners.BanCodClicked = 0L; - Gbl.Links.Num = 0; Gbl.Links.Lst = NULL; diff --git a/swad_global.h b/swad_global.h index 28b9d3a02..86cd105c5 100644 --- a/swad_global.h +++ b/swad_global.h @@ -257,13 +257,6 @@ struct Globals struct Mail *Lst; // List of mail domains Mai_DomainsOrder_t SelectedOrder; } Mails; - struct - { - unsigned Num; // Number of banners - struct Banner *Lst; // List of banners - long BanCodToEdit; // Used as parameter in contextual links - long BanCodClicked; // Banned clicked, used to log it - } Banners; struct { unsigned Num; // Number of institutional links diff --git a/swad_log.c b/swad_log.c index 17d8977d7..d830ffde8 100644 --- a/swad_log.c +++ b/swad_log.c @@ -76,6 +76,7 @@ void Log_LogAccess (const char *Comments) long ActCod = Act_GetActCod (Gbl.Action.Act); size_t MaxLength; char *CommentsDB; + long BanCodClicked; Rol_Role_t RoleToStore = (Gbl.Action.Act == ActLogOut) ? Gbl.Usrs.Me.Role.LoggedBeforeCloseSession : Gbl.Usrs.Me.Role.Logged; @@ -159,14 +160,18 @@ void Log_LogAccess (const char *Comments) " (%ld,%ld,%u)", LogCod,Gbl.WebService.PlgCod, (unsigned) Gbl.WebService.Function); - else if (Gbl.Banners.BanCodClicked > 0) - /* Log banner clicked */ - DB_QueryINSERT ("can not log banner clicked", - "INSERT INTO log_banners" - " (LogCod,BanCod)" - " VALUES" - " (%ld,%ld)", - LogCod,Gbl.Banners.BanCodClicked); + else + { + BanCodClicked = Ban_GetBanCodClicked (); + if (BanCodClicked > 0) + /* Log banner clicked */ + DB_QueryINSERT ("can not log banner clicked", + "INSERT INTO log_banners" + " (LogCod,BanCod)" + " VALUES" + " (%ld,%ld)", + LogCod,BanCodClicked); + } /***** Increment my number of clicks *****/ if (Gbl.Usrs.Me.Logged)