From bf1010c1a7228d5b14258bad7560ec65b25ba5a2 Mon Sep 17 00:00:00 2001 From: acanas Date: Sun, 12 Apr 2020 20:08:37 +0200 Subject: [PATCH] Version19.177 --- swad_action.c | 4 +- swad_changelog.h | 3 +- swad_date.c | 2 +- swad_date.h | 2 +- swad_exam.c | 720 +++++++++++++++++++++++++++-------------------- swad_exam.h | 25 +- swad_global.c | 8 - swad_global.h | 11 - swad_layout.c | 22 +- 9 files changed, 460 insertions(+), 337 deletions(-) diff --git a/swad_action.c b/swad_action.c index 68cb97450..fa8d65182 100644 --- a/swad_action.c +++ b/swad_action.c @@ -718,8 +718,8 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = [ActReqRemSvyQst ] = {1524,-1,TabUnk,ActSeeAllSvy ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Svy_RequestRemoveQst ,NULL}, [ActRemSvyQst ] = { 981,-1,TabUnk,ActSeeAllSvy ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Svy_RemoveQst ,NULL}, - [ActSeeOneExaAnn ] = {1572,-1,TabUnk,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Exa_GetExaCodToHighlight ,Exa_ListExamAnnouncementsSee ,NULL}, - [ActSeeDatExaAnn ] = {1571,-1,TabUnk,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Exa_GetDateToHighlight ,Exa_ListExamAnnouncementsSee ,NULL}, + [ActSeeOneExaAnn ] = {1572,-1,TabUnk,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Exa_ListExamAnnouncementsCod ,NULL}, + [ActSeeDatExaAnn ] = {1571,-1,TabUnk,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Exa_ListExamAnnouncementsDay ,NULL}, [ActEdiExaAnn ] = { 91,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Exa_PutFrmEditAExamAnnouncement,NULL}, [ActRcvExaAnn ] = { 110,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Exa_ReceiveExamAnnouncement1 ,Exa_ReceiveExamAnnouncement2 ,NULL}, [ActPrnExaAnn ] = { 179,-1,TabUnk,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,NULL ,Exa_PrintExamAnnouncement ,NULL}, diff --git a/swad_changelog.h b/swad_changelog.h index d2604b5eb..b83d8e2a3 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.176 (2020-04-12)" +#define Log_PLATFORM_VERSION "SWAD 19.177 (2020-04-12)" #define CSS_FILE "swad19.146.css" #define JS_FILE "swad19.172.1.js" /* @@ -548,6 +548,7 @@ Funci // 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.177: Apr 12, 2020 Code refactoring in exam announcements. (285509 lines) Version 19.176: Apr 12, 2020 Code refactoring in agenda. (285419 lines) Version 19.175: Apr 12, 2020 Code refactoring in syllabus. (285345 lines) Version 19.174: Apr 11, 2020 Code refactoring in messages. (285250 lines) diff --git a/swad_date.c b/swad_date.c index 45ed0582c..bae6018ef 100644 --- a/swad_date.c +++ b/swad_date.c @@ -383,7 +383,7 @@ struct tm *Dat_GetLocalTimeFromClock (const time_t *timep) /********* Convert a struct with Day, Month and Year to a date string ********/ /*****************************************************************************/ -void Dat_ConvDateToDateStr (struct Date *Date,char StrDate[Cns_MAX_BYTES_DATE + 1]) +void Dat_ConvDateToDateStr (const struct Date *Date,char StrDate[Cns_MAX_BYTES_DATE + 1]) { extern const char *Txt_MONTHS_SMALL_SHORT[12]; diff --git a/swad_date.h b/swad_date.h index f796fc7f0..e1a15a91f 100644 --- a/swad_date.h +++ b/swad_date.h @@ -141,7 +141,7 @@ bool Dat_GetDateFromYYYYMMDD (struct Date *Date,const char *YYYYMMDDString); void Dat_ShowClientLocalTime (void); struct tm *Dat_GetLocalTimeFromClock (const time_t *timep); -void Dat_ConvDateToDateStr (struct Date *Date,char StrDate[Cns_MAX_BYTES_DATE + 1]); +void Dat_ConvDateToDateStr (const struct Date *Date,char StrDate[Cns_MAX_BYTES_DATE + 1]); void Dat_PutFormStartEndClientLocalDateTimesWithYesterdayToday (const Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME]); void Dat_PutFormStartEndClientLocalDateTimes (const time_t TimeUTC[Dat_NUM_START_END_TIME], diff --git a/swad_exam.c b/swad_exam.c index e803c3fdc..6aa058ee7 100644 --- a/swad_exam.c +++ b/swad_exam.c @@ -73,24 +73,64 @@ extern struct Globals Gbl; /***************************** Private prototypes ****************************/ /*****************************************************************************/ -static long Exa_GetParamsExamAnnouncement (void); -static void Exa_AllocMemExamAnnouncement (void); +static struct Exa_ExamAnnouncements *Exa_GetGlobalExamAnnouncements (void); + +static long Exa_GetParamsExamAnnouncement (struct Exa_ExamAnnouncements *ExamAnns); + +static void Exa_AllocMemExamAnnouncement (struct Exa_ExamAnnouncements *ExamAnns); +static void Exa_FreeMemExamAnnouncement (struct Exa_ExamAnnouncements *ExamAnns); + static void Exa_UpdateNumUsrsNotifiedByEMailAboutExamAnnouncement (long ExaCod,unsigned NumUsrsToBeNotifiedByEMail); -static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement); + +static void Exa_GetExaCodToHighlight (struct Exa_ExamAnnouncements *ExamAnns); +static void Exa_GetDateToHighlight (struct Exa_ExamAnnouncements *ExamAnns); + +static void Exa_ListExamAnnouncements (struct Exa_ExamAnnouncements *ExamAnns, + Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement); static void Exa_PutIconToCreateNewExamAnnouncement (__attribute__((unused)) void *Args); static void Exa_PutButtonToCreateNewExamAnnouncement (void); -static long Exa_AddExamAnnouncementToDB (void); -static void Exa_ModifyExamAnnouncementInDB (long ExaCod); -static void Exa_GetDataExamAnnouncementFromDB (long ExaCod); -static void Exa_ShowExamAnnouncement (long ExaCod, +static long Exa_AddExamAnnouncementToDB (const struct Exa_ExamAnnouncements *ExamAnns); +static void Exa_ModifyExamAnnouncementInDB (const struct Exa_ExamAnnouncements *ExamAnns, + long ExaCod); +static void Exa_GetDataExamAnnouncementFromDB (struct Exa_ExamAnnouncements *ExamAnns, + long ExaCod); +static void Exa_ShowExamAnnouncement (struct Exa_ExamAnnouncements *ExamAnns, + long ExaCod, Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement, bool HighLight); -static void Exa_PutIconsExamAnnouncement (__attribute__((unused)) void *Args); +static void Exa_PutIconsExamAnnouncement (void *ExamAnns); static void Exa_PutParamExaCodToEdit (void *ExaCod); static long Exa_GetParamExaCod (void); -static void Exa_GetNotifContentExamAnnouncement (char **ContentStr); +static void Exa_GetNotifContentExamAnnouncement (const struct Exa_ExamAnnouncements *ExamAnns, + char **ContentStr); + +/*****************************************************************************/ +/******************* Get global exam announcements context *******************/ +/*****************************************************************************/ + +static struct Exa_ExamAnnouncements *Exa_GetGlobalExamAnnouncements (void) + { + static struct Exa_ExamAnnouncements Exa_GlobalExamAnns; // Used to preserve information between priori and posteriori functions + + return &Exa_GlobalExamAnns; + } + +/*****************************************************************************/ +/********************** Reset exam announcements context *********************/ +/*****************************************************************************/ + +void Exa_ResetExamAnnouncements (struct Exa_ExamAnnouncements *ExamAnns) + { + ExamAnns->NumExaAnns = 0; + ExamAnns->Lst = NULL; + ExamAnns->NewExaCod = -1L; + ExamAnns->HighlightExaCod = -1L; + ExamAnns->HighlightDate[0] = '\0'; // No exam announcements highlighted + ExamAnns->ExaCod = -1L; + ExamAnns->Anchor = NULL; + } /*****************************************************************************/ /********************** Form to edit an exam announcement ********************/ @@ -98,31 +138,35 @@ static void Exa_GetNotifContentExamAnnouncement (char **ContentStr); void Exa_PutFrmEditAExamAnnouncement (void) { + struct Exa_ExamAnnouncements ExamAnns; long ExaCod; + /***** Reset exam announcements context *****/ + Exa_ResetExamAnnouncements (&ExamAnns); + /***** Allocate memory for the exam announcement *****/ - Exa_AllocMemExamAnnouncement (); + Exa_AllocMemExamAnnouncement (&ExamAnns); /***** Get the code of the exam announcement *****/ - ExaCod = Exa_GetParamsExamAnnouncement (); + ExaCod = Exa_GetParamsExamAnnouncement (&ExamAnns); if (ExaCod > 0) // -1 indicates that this is a new exam announcement /***** Read exam announcement from the database *****/ - Exa_GetDataExamAnnouncementFromDB (ExaCod); + Exa_GetDataExamAnnouncementFromDB (&ExamAnns,ExaCod); /***** Show exam announcement *****/ - Exa_ShowExamAnnouncement (ExaCod,Exa_FORM_VIEW, + Exa_ShowExamAnnouncement (&ExamAnns,ExaCod,Exa_FORM_VIEW, false); // Don't highlight /***** Free memory of the exam announcement *****/ - Exa_FreeMemExamAnnouncement (); + Exa_FreeMemExamAnnouncement (&ExamAnns); } /*****************************************************************************/ /**************** Get parameters of an exam announcement *********************/ /*****************************************************************************/ -static long Exa_GetParamsExamAnnouncement (void) +static long Exa_GetParamsExamAnnouncement (struct Exa_ExamAnnouncements *ExamAnns) { long ExaCod; @@ -130,68 +174,68 @@ static long Exa_GetParamsExamAnnouncement (void) ExaCod = Exa_GetParamExaCod (); /***** Get the name of the course (it is allowed to be different from the official name of the course) *****/ - Par_GetParToText ("CrsName",Gbl.ExamAnns.ExaDat.CrsFullName,Hie_MAX_BYTES_FULL_NAME); + Par_GetParToText ("CrsName",ExamAnns->ExamAnn.CrsFullName,Hie_MAX_BYTES_FULL_NAME); // If the parameter is not present or is empty, initialize the string to the full name of the current course - if (!Gbl.ExamAnns.ExaDat.CrsFullName[0]) - Str_Copy (Gbl.ExamAnns.ExaDat.CrsFullName,Gbl.Hierarchy.Crs.FullName, + if (!ExamAnns->ExamAnn.CrsFullName[0]) + Str_Copy (ExamAnns->ExamAnn.CrsFullName,Gbl.Hierarchy.Crs.FullName, Hie_MAX_BYTES_FULL_NAME); /***** Get the year *****/ - Gbl.ExamAnns.ExaDat.Year = (unsigned) - Par_GetParToUnsignedLong ("Year", - 0, // N.A. - Deg_MAX_YEARS_PER_DEGREE, - (unsigned long) Gbl.Hierarchy.Crs.Year); + ExamAnns->ExamAnn.Year = (unsigned) + Par_GetParToUnsignedLong ("Year", + 0, // N.A. + Deg_MAX_YEARS_PER_DEGREE, + (unsigned long) Gbl.Hierarchy.Crs.Year); /***** Get the type of exam announcement *****/ - Par_GetParToText ("ExamSession",Gbl.ExamAnns.ExaDat.Session,Exa_MAX_BYTES_SESSION); + Par_GetParToText ("ExamSession",ExamAnns->ExamAnn.Session,Exa_MAX_BYTES_SESSION); /***** Get the data of the exam *****/ Dat_GetDateFromForm ("ExamDay","ExamMonth","ExamYear", - &Gbl.ExamAnns.ExaDat.ExamDate.Day, - &Gbl.ExamAnns.ExaDat.ExamDate.Month, - &Gbl.ExamAnns.ExaDat.ExamDate.Year); - if (Gbl.ExamAnns.ExaDat.ExamDate.Day == 0 || - Gbl.ExamAnns.ExaDat.ExamDate.Month == 0 || - Gbl.ExamAnns.ExaDat.ExamDate.Year == 0) + &ExamAnns->ExamAnn.ExamDate.Day, + &ExamAnns->ExamAnn.ExamDate.Month, + &ExamAnns->ExamAnn.ExamDate.Year); + if (ExamAnns->ExamAnn.ExamDate.Day == 0 || + ExamAnns->ExamAnn.ExamDate.Month == 0 || + ExamAnns->ExamAnn.ExamDate.Year == 0) { - Gbl.ExamAnns.ExaDat.ExamDate.Day = Gbl.Now.Date.Day; - Gbl.ExamAnns.ExaDat.ExamDate.Month = Gbl.Now.Date.Month; - Gbl.ExamAnns.ExaDat.ExamDate.Year = Gbl.Now.Date.Year; + ExamAnns->ExamAnn.ExamDate.Day = Gbl.Now.Date.Day; + ExamAnns->ExamAnn.ExamDate.Month = Gbl.Now.Date.Month; + ExamAnns->ExamAnn.ExamDate.Year = Gbl.Now.Date.Year; } /***** Get the hour of the exam *****/ - Gbl.ExamAnns.ExaDat.StartTime.Hour = (unsigned) Par_GetParToUnsignedLong ("ExamHour", - 0,23,0); - Gbl.ExamAnns.ExaDat.StartTime.Minute = (unsigned) Par_GetParToUnsignedLong ("ExamMinute", - 0,59,0); + ExamAnns->ExamAnn.StartTime.Hour = (unsigned) Par_GetParToUnsignedLong ("ExamHour", + 0,23,0); + ExamAnns->ExamAnn.StartTime.Minute = (unsigned) Par_GetParToUnsignedLong ("ExamMinute", + 0,59,0); /***** Get the duration of the exam *****/ - Gbl.ExamAnns.ExaDat.Duration.Hour = (unsigned) Par_GetParToUnsignedLong ("DurationHour", - 0,23,0); - Gbl.ExamAnns.ExaDat.Duration.Minute = (unsigned) Par_GetParToUnsignedLong ("DurationMinute", - 0,59,0); + ExamAnns->ExamAnn.Duration.Hour = (unsigned) Par_GetParToUnsignedLong ("DurationHour", + 0,23,0); + ExamAnns->ExamAnn.Duration.Minute = (unsigned) Par_GetParToUnsignedLong ("DurationMinute", + 0,59,0); /***** Get the place where the exam will happen *****/ - Par_GetParToHTML ("Place",Gbl.ExamAnns.ExaDat.Place,Cns_MAX_BYTES_TEXT); + Par_GetParToHTML ("Place",ExamAnns->ExamAnn.Place,Cns_MAX_BYTES_TEXT); /***** Get the modality of exam *****/ - Par_GetParToHTML ("ExamMode",Gbl.ExamAnns.ExaDat.Mode,Cns_MAX_BYTES_TEXT); + Par_GetParToHTML ("ExamMode",ExamAnns->ExamAnn.Mode,Cns_MAX_BYTES_TEXT); /***** Get the structure of exam *****/ - Par_GetParToHTML ("Structure",Gbl.ExamAnns.ExaDat.Structure,Cns_MAX_BYTES_TEXT); + Par_GetParToHTML ("Structure",ExamAnns->ExamAnn.Structure,Cns_MAX_BYTES_TEXT); /***** Get the mandatory documentation *****/ - Par_GetParToHTML ("DocRequired",Gbl.ExamAnns.ExaDat.DocRequired,Cns_MAX_BYTES_TEXT); + Par_GetParToHTML ("DocRequired",ExamAnns->ExamAnn.DocRequired,Cns_MAX_BYTES_TEXT); /***** Get the mandatory material *****/ - Par_GetParToHTML ("MatRequired",Gbl.ExamAnns.ExaDat.MatRequired,Cns_MAX_BYTES_TEXT); + Par_GetParToHTML ("MatRequired",ExamAnns->ExamAnn.MatRequired,Cns_MAX_BYTES_TEXT); /***** Get the allowed material *****/ - Par_GetParToHTML ("MatAllowed",Gbl.ExamAnns.ExaDat.MatAllowed,Cns_MAX_BYTES_TEXT); + Par_GetParToHTML ("MatAllowed",ExamAnns->ExamAnn.MatAllowed,Cns_MAX_BYTES_TEXT); /***** Get other information *****/ - Par_GetParToHTML ("OtherInfo",Gbl.ExamAnns.ExaDat.OtherInfo,Cns_MAX_BYTES_TEXT); + Par_GetParToHTML ("OtherInfo",ExamAnns->ExamAnn.OtherInfo,Cns_MAX_BYTES_TEXT); return ExaCod; } @@ -200,27 +244,27 @@ static long Exa_GetParamsExamAnnouncement (void) /* Allocate memory for those parameters of an exam anno. with a lot of text **/ /*****************************************************************************/ -static void Exa_AllocMemExamAnnouncement (void) +static void Exa_AllocMemExamAnnouncement (struct Exa_ExamAnnouncements *ExamAnns) { - if ((Gbl.ExamAnns.ExaDat.Place = (char *) malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) + if ((ExamAnns->ExamAnn.Place = (char *) malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) Lay_NotEnoughMemoryExit (); - if ((Gbl.ExamAnns.ExaDat.Mode = (char *) malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) + if ((ExamAnns->ExamAnn.Mode = (char *) malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) Lay_NotEnoughMemoryExit (); - if ((Gbl.ExamAnns.ExaDat.Structure = (char *) malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) + if ((ExamAnns->ExamAnn.Structure = (char *) malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) Lay_NotEnoughMemoryExit (); - if ((Gbl.ExamAnns.ExaDat.DocRequired = (char *) malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) + if ((ExamAnns->ExamAnn.DocRequired = (char *) malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) Lay_NotEnoughMemoryExit (); - if ((Gbl.ExamAnns.ExaDat.MatRequired = (char *) malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) + if ((ExamAnns->ExamAnn.MatRequired = (char *) malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) Lay_NotEnoughMemoryExit (); - if ((Gbl.ExamAnns.ExaDat.MatAllowed = (char *) malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) + if ((ExamAnns->ExamAnn.MatAllowed = (char *) malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) Lay_NotEnoughMemoryExit (); - if ((Gbl.ExamAnns.ExaDat.OtherInfo = (char *) malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) + if ((ExamAnns->ExamAnn.OtherInfo = (char *) malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) Lay_NotEnoughMemoryExit (); } @@ -228,42 +272,42 @@ static void Exa_AllocMemExamAnnouncement (void) /* Free memory of those parameters of an exam announcem. with a lot of text **/ /*****************************************************************************/ -void Exa_FreeMemExamAnnouncement (void) +static void Exa_FreeMemExamAnnouncement (struct Exa_ExamAnnouncements *ExamAnns) { - if (Gbl.ExamAnns.ExaDat.Place) + if (ExamAnns->ExamAnn.Place) { - free (Gbl.ExamAnns.ExaDat.Place); - Gbl.ExamAnns.ExaDat.Place = NULL; + free (ExamAnns->ExamAnn.Place); + ExamAnns->ExamAnn.Place = NULL; } - if (Gbl.ExamAnns.ExaDat.Mode) + if (ExamAnns->ExamAnn.Mode) { - free (Gbl.ExamAnns.ExaDat.Mode); - Gbl.ExamAnns.ExaDat.Mode = NULL; + free (ExamAnns->ExamAnn.Mode); + ExamAnns->ExamAnn.Mode = NULL; } - if (Gbl.ExamAnns.ExaDat.Structure) + if (ExamAnns->ExamAnn.Structure) { - free (Gbl.ExamAnns.ExaDat.Structure); - Gbl.ExamAnns.ExaDat.Structure = NULL; + free (ExamAnns->ExamAnn.Structure); + ExamAnns->ExamAnn.Structure = NULL; } - if (Gbl.ExamAnns.ExaDat.DocRequired) + if (ExamAnns->ExamAnn.DocRequired) { - free (Gbl.ExamAnns.ExaDat.DocRequired); - Gbl.ExamAnns.ExaDat.DocRequired = NULL; + free (ExamAnns->ExamAnn.DocRequired); + ExamAnns->ExamAnn.DocRequired = NULL; } - if (Gbl.ExamAnns.ExaDat.MatRequired) + if (ExamAnns->ExamAnn.MatRequired) { - free (Gbl.ExamAnns.ExaDat.MatRequired); - Gbl.ExamAnns.ExaDat.MatRequired = NULL; + free (ExamAnns->ExamAnn.MatRequired); + ExamAnns->ExamAnn.MatRequired = NULL; } - if (Gbl.ExamAnns.ExaDat.MatAllowed) + if (ExamAnns->ExamAnn.MatAllowed) { - free (Gbl.ExamAnns.ExaDat.MatAllowed); - Gbl.ExamAnns.ExaDat.MatAllowed = NULL; + free (ExamAnns->ExamAnn.MatAllowed); + ExamAnns->ExamAnn.MatAllowed = NULL; } - if (Gbl.ExamAnns.ExaDat.OtherInfo) + if (ExamAnns->ExamAnn.OtherInfo) { - free (Gbl.ExamAnns.ExaDat.OtherInfo); - Gbl.ExamAnns.ExaDat.OtherInfo = NULL; + free (ExamAnns->ExamAnn.OtherInfo); + ExamAnns->ExamAnn.OtherInfo = NULL; } } @@ -277,25 +321,29 @@ void Exa_ReceiveExamAnnouncement1 (void) { extern const char *Txt_Created_new_announcement_of_exam; extern const char *Txt_The_announcement_of_exam_has_been_successfully_updated; + struct Exa_ExamAnnouncements *ExamAnns = Exa_GetGlobalExamAnnouncements (); long ExaCod; bool NewExamAnnouncement; char *Anchor = NULL; + /***** Reset exam announcements context *****/ + Exa_ResetExamAnnouncements (ExamAnns); + /***** Allocate memory for the exam announcement *****/ - Exa_AllocMemExamAnnouncement (); + Exa_AllocMemExamAnnouncement (ExamAnns); /***** Get parameters of the exam announcement *****/ - ExaCod = Exa_GetParamsExamAnnouncement (); + ExaCod = Exa_GetParamsExamAnnouncement (ExamAnns); NewExamAnnouncement = (ExaCod < 0); /***** Add the exam announcement to the database and read it again from the database *****/ if (NewExamAnnouncement) - Gbl.ExamAnns.NewExaCod = ExaCod = Exa_AddExamAnnouncementToDB (); + ExamAnns->NewExaCod = ExaCod = Exa_AddExamAnnouncementToDB (ExamAnns); else - Exa_ModifyExamAnnouncementInDB (ExaCod); + Exa_ModifyExamAnnouncementInDB (ExamAnns,ExaCod); /***** Free memory of the exam announcement *****/ - Exa_FreeMemExamAnnouncement (); + Exa_FreeMemExamAnnouncement (ExamAnns); /***** Create alert to show the change made *****/ Frm_SetAnchorStr (ExaCod,&Anchor); @@ -305,20 +353,21 @@ void Exa_ReceiveExamAnnouncement1 (void) Frm_FreeAnchorStr (Anchor); /***** Set exam to be highlighted *****/ - Gbl.ExamAnns.HighlightExaCod = ExaCod; + ExamAnns->HighlightExaCod = ExaCod; } void Exa_ReceiveExamAnnouncement2 (void) { + struct Exa_ExamAnnouncements *ExamAnns = Exa_GetGlobalExamAnnouncements (); unsigned NumUsrsToBeNotifiedByEMail; struct TL_Publication SocPub; /***** Notify by email about the new exam announcement *****/ - if ((NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs (Ntf_EVENT_EXAM_ANNOUNCEMENT,Gbl.ExamAnns.HighlightExaCod))) - Exa_UpdateNumUsrsNotifiedByEMailAboutExamAnnouncement (Gbl.ExamAnns.HighlightExaCod,NumUsrsToBeNotifiedByEMail); + if ((NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs (Ntf_EVENT_EXAM_ANNOUNCEMENT,ExamAnns->HighlightExaCod))) + Exa_UpdateNumUsrsNotifiedByEMailAboutExamAnnouncement (ExamAnns->HighlightExaCod,NumUsrsToBeNotifiedByEMail); /***** Create a new social note about the new exam announcement *****/ - TL_StoreAndPublishNote (TL_NOTE_EXAM_ANNOUNCEMENT,Gbl.ExamAnns.HighlightExaCod,&SocPub); + TL_StoreAndPublishNote (TL_NOTE_EXAM_ANNOUNCEMENT,ExamAnns->HighlightExaCod,&SocPub); /***** Update RSS of current course *****/ RSS_UpdateRSSFileForACrs (&Gbl.Hierarchy.Crs); @@ -347,24 +396,28 @@ static void Exa_UpdateNumUsrsNotifiedByEMailAboutExamAnnouncement (long ExaCod,u void Exa_PrintExamAnnouncement (void) { + struct Exa_ExamAnnouncements ExamAnns; long ExaCod; + /***** Reset exam announcements context *****/ + Exa_ResetExamAnnouncements (&ExamAnns); + /***** Allocate memory for the exam announcement *****/ - Exa_AllocMemExamAnnouncement (); + Exa_AllocMemExamAnnouncement (&ExamAnns); /***** Get the code of the exam announcement *****/ if ((ExaCod = Exa_GetParamExaCod ()) <= 0) Lay_ShowErrorAndExit ("Code of exam announcement is missing."); /***** Read exam announcement from the database *****/ - Exa_GetDataExamAnnouncementFromDB (ExaCod); + Exa_GetDataExamAnnouncementFromDB (&ExamAnns,ExaCod); /***** Show exam announcement *****/ - Exa_ShowExamAnnouncement (ExaCod,Exa_PRINT_VIEW, + Exa_ShowExamAnnouncement (&ExamAnns,ExaCod,Exa_PRINT_VIEW, false); // Don't highlight /***** Free memory of the exam announcement *****/ - Exa_FreeMemExamAnnouncement (); + Exa_FreeMemExamAnnouncement (&ExamAnns); } /*****************************************************************************/ @@ -375,8 +428,12 @@ void Exa_ReqRemoveExamAnnouncement (void) { extern const char *Txt_Do_you_really_want_to_remove_the_following_announcement_of_exam; extern const char *Txt_Remove; + struct Exa_ExamAnnouncements ExamAnns; long ExaCod; + /***** Reset exam announcements context *****/ + Exa_ResetExamAnnouncements (&ExamAnns); + /***** Get the code of the exam announcement *****/ if ((ExaCod = Exa_GetParamExaCod ()) <= 0) Lay_ShowErrorAndExit ("Code of exam announcement is missing."); @@ -386,16 +443,16 @@ void Exa_ReqRemoveExamAnnouncement (void) Ale_ShowAlertAndButton1 (Ale_QUESTION,Txt_Do_you_really_want_to_remove_the_following_announcement_of_exam); /* Show announcement */ - Exa_AllocMemExamAnnouncement (); - Exa_GetDataExamAnnouncementFromDB (ExaCod); - Exa_ShowExamAnnouncement (ExaCod,Exa_NORMAL_VIEW, + Exa_AllocMemExamAnnouncement (&ExamAnns); + Exa_GetDataExamAnnouncementFromDB (&ExamAnns,ExaCod); + Exa_ShowExamAnnouncement (&ExamAnns,ExaCod,Exa_NORMAL_VIEW, false); // Don't highlight - Exa_FreeMemExamAnnouncement (); + Exa_FreeMemExamAnnouncement (&ExamAnns); /* End alert */ Ale_ShowAlertAndButton2 (ActRemExaAnn,NULL,NULL, - Exa_PutParamExaCodToEdit,&Gbl.ExamAnns.ExaCod, + Exa_PutParamExaCodToEdit,&ExamAnns.ExaCod, Btn_REMOVE_BUTTON,Txt_Remove); } @@ -407,8 +464,12 @@ void Exa_ReqRemoveExamAnnouncement (void) void Exa_RemoveExamAnnouncement1 (void) { + struct Exa_ExamAnnouncements *ExamAnns = Exa_GetGlobalExamAnnouncements (); long ExaCod; + /***** Reset exam announcements context *****/ + Exa_ResetExamAnnouncements (ExamAnns); + /***** Get the code of the exam announcement *****/ if ((ExaCod = Exa_GetParamExaCod ()) <= 0) Lay_ShowErrorAndExit ("Code of exam announcement is missing."); @@ -449,8 +510,12 @@ void Exa_RemoveExamAnnouncement2 (void) void Exa_HideExamAnnouncement (void) { + struct Exa_ExamAnnouncements *ExamAnns = Exa_GetGlobalExamAnnouncements (); long ExaCod; + /***** Reset exam announcements context *****/ + Exa_ResetExamAnnouncements (ExamAnns); + /***** Get the code of the exam announcement *****/ if ((ExaCod = Exa_GetParamExaCod ()) <= 0) Lay_ShowErrorAndExit ("Code of exam announcement is missing."); @@ -463,7 +528,7 @@ void Exa_HideExamAnnouncement (void) ExaCod,Gbl.Hierarchy.Crs.CrsCod); /***** Set exam to be highlighted *****/ - Gbl.ExamAnns.HighlightExaCod = ExaCod; + ExamAnns->HighlightExaCod = ExaCod; } /*****************************************************************************/ @@ -474,8 +539,12 @@ void Exa_HideExamAnnouncement (void) void Exa_UnhideExamAnnouncement (void) { + struct Exa_ExamAnnouncements *ExamAnns = Exa_GetGlobalExamAnnouncements (); long ExaCod; + /***** Reset exam announcements context *****/ + Exa_ResetExamAnnouncements (ExamAnns); + /***** Get the code of the exam announcement *****/ if ((ExaCod = Exa_GetParamExaCod ()) <= 0) Lay_ShowErrorAndExit ("Code of exam announcement is missing."); @@ -488,7 +557,7 @@ void Exa_UnhideExamAnnouncement (void) ExaCod,Gbl.Hierarchy.Crs.CrsCod); /***** Set exam to be highlighted *****/ - Gbl.ExamAnns.HighlightExaCod = ExaCod; + ExamAnns->HighlightExaCod = ExaCod; } /*****************************************************************************/ @@ -497,8 +566,13 @@ void Exa_UnhideExamAnnouncement (void) void Exa_ListExamAnnouncementsSee (void) { + struct Exa_ExamAnnouncements ExamAnns; + + /***** Reset exam announcements context *****/ + Exa_ResetExamAnnouncements (&ExamAnns); + /***** List all exam announcements *****/ - Exa_ListExamAnnouncements (Exa_NORMAL_VIEW); + Exa_ListExamAnnouncements (&ExamAnns,Exa_NORMAL_VIEW); /***** Mark possible notifications as seen *****/ Ntf_MarkNotifAsSeen (Ntf_EVENT_EXAM_ANNOUNCEMENT, @@ -512,36 +586,75 @@ void Exa_ListExamAnnouncementsSee (void) void Exa_ListExamAnnouncementsEdit (void) { - Exa_ListExamAnnouncements (Exa_NORMAL_VIEW); + struct Exa_ExamAnnouncements *ExamAnns = Exa_GetGlobalExamAnnouncements (); + + Exa_ListExamAnnouncements (ExamAnns,Exa_NORMAL_VIEW); + } + +/*****************************************************************************/ +/********** List exam announcement given an exam announcement code ***********/ +/*****************************************************************************/ + +void Exa_ListExamAnnouncementsCod (void) + { + struct Exa_ExamAnnouncements ExamAnns; + + /***** Reset exam announcements context *****/ + Exa_ResetExamAnnouncements (&ExamAnns); + + /***** Get exam announcement code *****/ + Exa_GetExaCodToHighlight (&ExamAnns); + + /***** List all exam announcements *****/ + Exa_ListExamAnnouncements (&ExamAnns,Exa_NORMAL_VIEW); + } + +/*****************************************************************************/ +/***************** List exam announcements on a given date *******************/ +/*****************************************************************************/ + +void Exa_ListExamAnnouncementsDay (void) + { + struct Exa_ExamAnnouncements ExamAnns; + + /***** Reset exam announcements context *****/ + Exa_ResetExamAnnouncements (&ExamAnns); + + /***** Get date *****/ + Exa_GetDateToHighlight (&ExamAnns); + + /***** List all exam announcements *****/ + Exa_ListExamAnnouncements (&ExamAnns,Exa_NORMAL_VIEW); } /*****************************************************************************/ /*********** Get date of exam announcements to show highlighted **************/ /*****************************************************************************/ -void Exa_GetExaCodToHighlight (void) +static void Exa_GetExaCodToHighlight (struct Exa_ExamAnnouncements *ExamAnns) { /***** Get the exam announcement code of the exam announcement to highlight *****/ - Gbl.ExamAnns.HighlightExaCod = Exa_GetParamExaCod (); + ExamAnns->HighlightExaCod = Exa_GetParamExaCod (); } /*****************************************************************************/ /*********** Get date of exam announcements to show highlighted **************/ /*****************************************************************************/ -void Exa_GetDateToHighlight (void) +static void Exa_GetDateToHighlight (struct Exa_ExamAnnouncements *ExamAnns) { /***** Get the date (in YYYYMMDD format) of the exam announcements to highlight *****/ - Par_GetParToText ("Date",Gbl.ExamAnns.HighlightDate,4 + 2 + 2); + Par_GetParToText ("Date",ExamAnns->HighlightDate,4 + 2 + 2); } /*****************************************************************************/ /******************** List all the exam announcements ************************/ /*****************************************************************************/ -static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement) +static void Exa_ListExamAnnouncements (struct Exa_ExamAnnouncements *ExamAnns, + Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement) { extern const char *Hlp_ASSESSMENT_Announcements; extern const char *Txt_Announcements_of_exams; @@ -601,26 +714,26 @@ static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewEx Lay_ShowErrorAndExit ("Wrong code of exam announcement."); /***** Allocate memory for the exam announcement *****/ - Exa_AllocMemExamAnnouncement (); + Exa_AllocMemExamAnnouncement (ExamAnns); /***** Read the data of the exam announcement *****/ - Exa_GetDataExamAnnouncementFromDB (ExaCod); + Exa_GetDataExamAnnouncementFromDB (ExamAnns,ExaCod); /***** Show exam announcement *****/ HighLight = false; - if (ExaCod == Gbl.ExamAnns.HighlightExaCod) + if (ExaCod == ExamAnns->HighlightExaCod) HighLight = true; - else if (Gbl.ExamAnns.HighlightDate[0]) + else if (ExamAnns->HighlightDate[0]) { - if (!strcmp (Gbl.ExamAnns.ExaDat.ExamDate.YYYYMMDD, - Gbl.ExamAnns.HighlightDate)) + if (!strcmp (ExamAnns->ExamAnn.ExamDate.YYYYMMDD, + ExamAnns->HighlightDate)) HighLight = true; } - Exa_ShowExamAnnouncement (ExaCod,TypeViewExamAnnouncement, + Exa_ShowExamAnnouncement (ExamAnns,ExaCod,TypeViewExamAnnouncement, HighLight); /***** Free memory of the exam announcement *****/ - Exa_FreeMemExamAnnouncement (); + Exa_FreeMemExamAnnouncement (ExamAnns); } /***** Free structure that stores the query result *****/ @@ -665,7 +778,7 @@ static void Exa_PutButtonToCreateNewExamAnnouncement (void) /*****************************************************************************/ // Return the code of the exam announcement just added -static long Exa_AddExamAnnouncementToDB (void) +static long Exa_AddExamAnnouncementToDB (const struct Exa_ExamAnnouncements *ExamAnns) { long ExaCod; @@ -682,23 +795,23 @@ static long Exa_AddExamAnnouncementToDB (void) "'%s','%s','%s','%s','%s','%s')", Gbl.Hierarchy.Crs.CrsCod, (unsigned) Exa_VISIBLE_EXAM_ANNOUNCEMENT, - Gbl.ExamAnns.ExaDat.CrsFullName, - Gbl.ExamAnns.ExaDat.Year, - Gbl.ExamAnns.ExaDat.Session, - Gbl.ExamAnns.ExaDat.ExamDate.Year, - Gbl.ExamAnns.ExaDat.ExamDate.Month, - Gbl.ExamAnns.ExaDat.ExamDate.Day, - Gbl.ExamAnns.ExaDat.StartTime.Hour, - Gbl.ExamAnns.ExaDat.StartTime.Minute, - Gbl.ExamAnns.ExaDat.Duration.Hour, - Gbl.ExamAnns.ExaDat.Duration.Minute, - Gbl.ExamAnns.ExaDat.Place, - Gbl.ExamAnns.ExaDat.Mode, - Gbl.ExamAnns.ExaDat.Structure, - Gbl.ExamAnns.ExaDat.DocRequired, - Gbl.ExamAnns.ExaDat.MatRequired, - Gbl.ExamAnns.ExaDat.MatAllowed, - Gbl.ExamAnns.ExaDat.OtherInfo); + ExamAnns->ExamAnn.CrsFullName, + ExamAnns->ExamAnn.Year, + ExamAnns->ExamAnn.Session, + ExamAnns->ExamAnn.ExamDate.Year, + ExamAnns->ExamAnn.ExamDate.Month, + ExamAnns->ExamAnn.ExamDate.Day, + ExamAnns->ExamAnn.StartTime.Hour, + ExamAnns->ExamAnn.StartTime.Minute, + ExamAnns->ExamAnn.Duration.Hour, + ExamAnns->ExamAnn.Duration.Minute, + ExamAnns->ExamAnn.Place, + ExamAnns->ExamAnn.Mode, + ExamAnns->ExamAnn.Structure, + ExamAnns->ExamAnn.DocRequired, + ExamAnns->ExamAnn.MatRequired, + ExamAnns->ExamAnn.MatAllowed, + ExamAnns->ExamAnn.OtherInfo); return ExaCod; } @@ -707,7 +820,8 @@ static long Exa_AddExamAnnouncementToDB (void) /*************** Modify an exam announcement in the database *****************/ /*****************************************************************************/ -static void Exa_ModifyExamAnnouncementInDB (long ExaCod) +static void Exa_ModifyExamAnnouncementInDB (const struct Exa_ExamAnnouncements *ExamAnns, + long ExaCod) { /***** Modify exam announcement *****/ DB_QueryUPDATE ("can not update an exam announcement", @@ -718,23 +832,23 @@ static void Exa_ModifyExamAnnouncementInDB (long ExaCod) "Place='%s',ExamMode='%s',Structure='%s'," "DocRequired='%s',MatRequired='%s',MatAllowed='%s',OtherInfo='%s'" " WHERE ExaCod=%ld", - Gbl.ExamAnns.ExaDat.CrsFullName, - Gbl.ExamAnns.ExaDat.Year, - Gbl.ExamAnns.ExaDat.Session, - Gbl.ExamAnns.ExaDat.ExamDate.Year, - Gbl.ExamAnns.ExaDat.ExamDate.Month, - Gbl.ExamAnns.ExaDat.ExamDate.Day, - Gbl.ExamAnns.ExaDat.StartTime.Hour, - Gbl.ExamAnns.ExaDat.StartTime.Minute, - Gbl.ExamAnns.ExaDat.Duration.Hour, - Gbl.ExamAnns.ExaDat.Duration.Minute, - Gbl.ExamAnns.ExaDat.Place, - Gbl.ExamAnns.ExaDat.Mode, - Gbl.ExamAnns.ExaDat.Structure, - Gbl.ExamAnns.ExaDat.DocRequired, - Gbl.ExamAnns.ExaDat.MatRequired, - Gbl.ExamAnns.ExaDat.MatAllowed, - Gbl.ExamAnns.ExaDat.OtherInfo, + ExamAnns->ExamAnn.CrsFullName, + ExamAnns->ExamAnn.Year, + ExamAnns->ExamAnn.Session, + ExamAnns->ExamAnn.ExamDate.Year, + ExamAnns->ExamAnn.ExamDate.Month, + ExamAnns->ExamAnn.ExamDate.Day, + ExamAnns->ExamAnn.StartTime.Hour, + ExamAnns->ExamAnn.StartTime.Minute, + ExamAnns->ExamAnn.Duration.Hour, + ExamAnns->ExamAnn.Duration.Minute, + ExamAnns->ExamAnn.Place, + ExamAnns->ExamAnn.Mode, + ExamAnns->ExamAnn.Structure, + ExamAnns->ExamAnn.DocRequired, + ExamAnns->ExamAnn.MatRequired, + ExamAnns->ExamAnn.MatAllowed, + ExamAnns->ExamAnn.OtherInfo, ExaCod); } @@ -742,7 +856,7 @@ static void Exa_ModifyExamAnnouncementInDB (long ExaCod) /******* Create a list with the dates of all the exam announcements **********/ /*****************************************************************************/ -void Exa_CreateListDatesOfExamAnnouncements (void) +void Exa_CreateListExamAnnouncements (struct Exa_ExamAnnouncements *ExamAnns) { MYSQL_RES *mysql_res; MYSQL_ROW row; @@ -764,12 +878,12 @@ void Exa_CreateListDatesOfExamAnnouncements (void) (unsigned) Exa_VISIBLE_EXAM_ANNOUNCEMENT); /***** The result of the query may be empty *****/ - Gbl.ExamAnns.Lst = NULL; - Gbl.ExamAnns.NumExaAnns = 0; + ExamAnns->Lst = NULL; + ExamAnns->NumExaAnns = 0; if (NumExaAnns) { /***** Allocate memory for the list *****/ - if ((Gbl.ExamAnns.Lst = (struct Exa_ExamCodeAndDate *) calloc (NumExaAnns,sizeof (struct Exa_ExamCodeAndDate))) == NULL) + if ((ExamAnns->Lst = (struct Exa_ExamCodeAndDate *) calloc (NumExaAnns,sizeof (struct Exa_ExamCodeAndDate))) == NULL) Lay_NotEnoughMemoryExit (); /***** Get the dates of the existing exam announcements *****/ @@ -781,17 +895,17 @@ void Exa_CreateListDatesOfExamAnnouncements (void) row = mysql_fetch_row (mysql_res); /* Get exam code (row[0]) */ - Gbl.ExamAnns.Lst[Gbl.ExamAnns.NumExaAnns].ExaCod = Str_ConvertStrCodToLongCod (row[0]); + ExamAnns->Lst[ExamAnns->NumExaAnns].ExaCod = Str_ConvertStrCodToLongCod (row[0]); /* Read the date of the exam (row[1]) */ if (sscanf (row[1],"%04u-%02u-%02u", - &Gbl.ExamAnns.Lst[Gbl.ExamAnns.NumExaAnns].ExamDate.Year, - &Gbl.ExamAnns.Lst[Gbl.ExamAnns.NumExaAnns].ExamDate.Month, - &Gbl.ExamAnns.Lst[Gbl.ExamAnns.NumExaAnns].ExamDate.Day) != 3) + &ExamAnns->Lst[ExamAnns->NumExaAnns].ExamDate.Year, + &ExamAnns->Lst[ExamAnns->NumExaAnns].ExamDate.Month, + &ExamAnns->Lst[ExamAnns->NumExaAnns].ExamDate.Day) != 3) Lay_ShowErrorAndExit ("Wrong date of exam."); /***** Increment number of elements in list *****/ - Gbl.ExamAnns.NumExaAnns++; + ExamAnns->NumExaAnns++; } } @@ -804,13 +918,13 @@ void Exa_CreateListDatesOfExamAnnouncements (void) /***************** Free list of dates of exam announcements ******************/ /*****************************************************************************/ -void Exa_FreeListExamAnnouncements (void) +void Exa_FreeListExamAnnouncements (struct Exa_ExamAnnouncements *ExamAnns) { - if (Gbl.ExamAnns.Lst) + if (ExamAnns->Lst) { - free (Gbl.ExamAnns.Lst); - Gbl.ExamAnns.Lst = NULL; - Gbl.ExamAnns.NumExaAnns = 0; + free (ExamAnns->Lst); + ExamAnns->Lst = NULL; + ExamAnns->NumExaAnns = 0; } } @@ -818,7 +932,8 @@ void Exa_FreeListExamAnnouncements (void) /******** Read the data of an exam announcement from the database ************/ /*****************************************************************************/ -static void Exa_GetDataExamAnnouncementFromDB (long ExaCod) +static void Exa_GetDataExamAnnouncementFromDB (struct Exa_ExamAnnouncements *ExamAnns, + long ExaCod) { MYSQL_RES *mysql_res; MYSQL_ROW row; @@ -845,32 +960,32 @@ static void Exa_GetDataExamAnnouncementFromDB (long ExaCod) row = mysql_fetch_row (mysql_res); /* Code of the course in which the exam announcement is inserted (row[0]) */ - Gbl.ExamAnns.ExaDat.CrsCod = Str_ConvertStrCodToLongCod (row[0]); + ExamAnns->ExamAnn.CrsCod = Str_ConvertStrCodToLongCod (row[0]); /* Status of the exam announcement (row[1]) */ if (sscanf (row[1],"%u",&UnsignedNum) != 1) Lay_ShowErrorAndExit ("Wrong status."); if (UnsignedNum >= Exa_NUM_STATUS) Lay_ShowErrorAndExit ("Wrong status."); - Gbl.ExamAnns.ExaDat.Status = (Exa_ExamAnnouncementStatus_t) UnsignedNum; + ExamAnns->ExamAnn.Status = (Exa_ExamAnnouncementStatus_t) UnsignedNum; /* Name of the course (row[2]) */ - Str_Copy (Gbl.ExamAnns.ExaDat.CrsFullName,row[2], + Str_Copy (ExamAnns->ExamAnn.CrsFullName,row[2], Hie_MAX_BYTES_FULL_NAME); /* Year (row[3]) */ - if (sscanf (row[3],"%u",&Gbl.ExamAnns.ExaDat.Year) != 1) + if (sscanf (row[3],"%u",&ExamAnns->ExamAnn.Year) != 1) Lay_ShowErrorAndExit ("Wrong year."); /* Exam session (row[4]) */ - Str_Copy (Gbl.ExamAnns.ExaDat.Session,row[4], + Str_Copy (ExamAnns->ExamAnn.Session,row[4], Exa_MAX_BYTES_SESSION); /* Date of exam announcement (row[5]) */ if (sscanf (row[5],"%04u-%02u-%02u %02u:%02u:%02u", - &Gbl.ExamAnns.ExaDat.CallDate.Year, - &Gbl.ExamAnns.ExaDat.CallDate.Month, - &Gbl.ExamAnns.ExaDat.CallDate.Day, + &ExamAnns->ExamAnn.CallDate.Year, + &ExamAnns->ExamAnn.CallDate.Month, + &ExamAnns->ExamAnn.CallDate.Day, &Hour, &Minute, &Second) != 6) @@ -878,49 +993,49 @@ static void Exa_GetDataExamAnnouncementFromDB (long ExaCod) /* Date of exam (row[6]) */ if (sscanf (row[6],"%04u-%02u-%02u %02u:%02u:%02u", - &Gbl.ExamAnns.ExaDat.ExamDate.Year, - &Gbl.ExamAnns.ExaDat.ExamDate.Month, - &Gbl.ExamAnns.ExaDat.ExamDate.Day, - &Gbl.ExamAnns.ExaDat.StartTime.Hour, - &Gbl.ExamAnns.ExaDat.StartTime.Minute, + &ExamAnns->ExamAnn.ExamDate.Year, + &ExamAnns->ExamAnn.ExamDate.Month, + &ExamAnns->ExamAnn.ExamDate.Day, + &ExamAnns->ExamAnn.StartTime.Hour, + &ExamAnns->ExamAnn.StartTime.Minute, &Second) != 6) Lay_ShowErrorAndExit ("Wrong date of exam."); - snprintf (Gbl.ExamAnns.ExaDat.ExamDate.YYYYMMDD,sizeof (Gbl.ExamAnns.ExaDat.ExamDate.YYYYMMDD), + snprintf (ExamAnns->ExamAnn.ExamDate.YYYYMMDD,sizeof (ExamAnns->ExamAnn.ExamDate.YYYYMMDD), "%04u%02u%02u", - Gbl.ExamAnns.ExaDat.ExamDate.Year, - Gbl.ExamAnns.ExaDat.ExamDate.Month, - Gbl.ExamAnns.ExaDat.ExamDate.Day); + ExamAnns->ExamAnn.ExamDate.Year, + ExamAnns->ExamAnn.ExamDate.Month, + ExamAnns->ExamAnn.ExamDate.Day); /* Approximate duration (row[7]) */ - if (sscanf (row[7],"%02u:%02u:%02u",&Gbl.ExamAnns.ExaDat.Duration.Hour,&Gbl.ExamAnns.ExaDat.Duration.Minute,&Second) != 3) + if (sscanf (row[7],"%02u:%02u:%02u",&ExamAnns->ExamAnn.Duration.Hour,&ExamAnns->ExamAnn.Duration.Minute,&Second) != 3) Lay_ShowErrorAndExit ("Wrong duration of exam."); /* Place (row[8]) */ - Str_Copy (Gbl.ExamAnns.ExaDat.Place,row[8], + Str_Copy (ExamAnns->ExamAnn.Place,row[8], Cns_MAX_BYTES_TEXT); /* Exam mode (row[9]) */ - Str_Copy (Gbl.ExamAnns.ExaDat.Mode,row[9], + Str_Copy (ExamAnns->ExamAnn.Mode,row[9], Cns_MAX_BYTES_TEXT); /* Structure (row[10]) */ - Str_Copy (Gbl.ExamAnns.ExaDat.Structure,row[10], + Str_Copy (ExamAnns->ExamAnn.Structure,row[10], Cns_MAX_BYTES_TEXT); /* Documentation required (row[11]) */ - Str_Copy (Gbl.ExamAnns.ExaDat.DocRequired,row[11], + Str_Copy (ExamAnns->ExamAnn.DocRequired,row[11], Cns_MAX_BYTES_TEXT); /* Material required (row[12]) */ - Str_Copy (Gbl.ExamAnns.ExaDat.MatRequired,row[12], + Str_Copy (ExamAnns->ExamAnn.MatRequired,row[12], Cns_MAX_BYTES_TEXT); /* Material allowed (row[13]) */ - Str_Copy (Gbl.ExamAnns.ExaDat.MatAllowed,row[13], + Str_Copy (ExamAnns->ExamAnn.MatAllowed,row[13], Cns_MAX_BYTES_TEXT); /* Other information for students (row[14]) */ - Str_Copy (Gbl.ExamAnns.ExaDat.OtherInfo,row[14], + Str_Copy (ExamAnns->ExamAnn.OtherInfo,row[14], Cns_MAX_BYTES_TEXT); /***** Free structure that stores the query result *****/ @@ -931,7 +1046,8 @@ static void Exa_GetDataExamAnnouncementFromDB (long ExaCod) /************ Show a form with the data of an exam announcement **************/ /*****************************************************************************/ -static void Exa_ShowExamAnnouncement (long ExaCod, +static void Exa_ShowExamAnnouncement (struct Exa_ExamAnnouncements *ExamAnns, + long ExaCod, Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement, bool HighLight) { @@ -995,8 +1111,8 @@ static void Exa_ShowExamAnnouncement (long ExaCod, /***** Begin box *****/ Width = "625px"; - Gbl.ExamAnns.Anchor = Anchor; // Used to put contextual icons - Gbl.ExamAnns.ExaCod = ExaCod; // Used to put contextual icons + ExamAnns->Anchor = Anchor; // Used to put contextual icons + ExamAnns->ExaCod = ExaCod; // Used to put contextual icons FunctionToDrawContextualIcons = TypeViewExamAnnouncement == Exa_NORMAL_VIEW ? Exa_PutIconsExamAnnouncement : NULL; HelpLink = TypeViewExamAnnouncement == Exa_FORM_VIEW ? ((ExaCod > 0) ? Hlp_ASSESSMENT_Announcements_edit_announcement : @@ -1009,13 +1125,13 @@ static void Exa_ShowExamAnnouncement (long ExaCod, /* Start highlighted box */ Box_BoxShadowBegin (Width,NULL, - FunctionToDrawContextualIcons,NULL, + FunctionToDrawContextualIcons,ExamAnns, HelpLink); } else // Don't highlight /* Start normal box */ Box_BoxBegin (Width,NULL, - FunctionToDrawContextualIcons,NULL, + FunctionToDrawContextualIcons,ExamAnns, HelpLink,Box_NOT_CLOSABLE); if (TypeViewExamAnnouncement == Exa_FORM_VIEW) @@ -1028,7 +1144,7 @@ static void Exa_ShowExamAnnouncement (long ExaCod, /***** Begin table *****/ HTM_TABLE_Begin ("%s CELLS_PAD_2", - ClassExaAnnouncement[TypeViewExamAnnouncement][Gbl.ExamAnns.ExaDat.Status]); + ClassExaAnnouncement[TypeViewExamAnnouncement][ExamAnns->ExamAnn.Status]); /***** Institution logo *****/ HTM_TR_Begin (NULL); @@ -1089,12 +1205,12 @@ static void Exa_ShowExamAnnouncement (long ExaCod, /* Data */ HTM_TD_Begin ("class=\"EXAM LT\""); if (TypeViewExamAnnouncement == Exa_FORM_VIEW) - HTM_INPUT_TEXT ("CrsName",Hie_MAX_CHARS_FULL_NAME,Gbl.ExamAnns.ExaDat.CrsFullName,false, + HTM_INPUT_TEXT ("CrsName",Hie_MAX_CHARS_FULL_NAME,ExamAnns->ExamAnn.CrsFullName,false, "id=\"CrsName\" size=\"30\""); else { HTM_STRONG_Begin (); - HTM_Txt (Gbl.ExamAnns.ExaDat.CrsFullName); + HTM_Txt (ExamAnns->ExamAnn.CrsFullName); HTM_STRONG_End (); } HTM_TD_End (); @@ -1120,12 +1236,12 @@ static void Exa_ShowExamAnnouncement (long ExaCod, Year <= Deg_MAX_YEARS_PER_DEGREE; Year++) HTM_OPTION (HTM_Type_UNSIGNED,&Year, - Gbl.ExamAnns.ExaDat.Year == Year,false, + ExamAnns->ExamAnn.Year == Year,false, "%s",Txt_YEAR_OF_DEGREE[Year]); HTM_SELECT_End (); } else - HTM_Txt (Txt_YEAR_OF_DEGREE[Gbl.ExamAnns.ExaDat.Year]); + HTM_Txt (Txt_YEAR_OF_DEGREE[ExamAnns->ExamAnn.Year]); HTM_TD_End (); HTM_TR_End (); @@ -1142,10 +1258,10 @@ static void Exa_ShowExamAnnouncement (long ExaCod, /* Data */ HTM_TD_Begin ("class=\"EXAM LT\""); if (TypeViewExamAnnouncement == Exa_FORM_VIEW) - HTM_INPUT_TEXT ("ExamSession",Exa_MAX_CHARS_SESSION,Gbl.ExamAnns.ExaDat.Session,false, + HTM_INPUT_TEXT ("ExamSession",Exa_MAX_CHARS_SESSION,ExamAnns->ExamAnn.Session,false, "id=\"ExamSession\" size=\"30\""); else - HTM_Txt (Gbl.ExamAnns.ExaDat.Session); + HTM_Txt (ExamAnns->ExamAnn.Session); HTM_TD_End (); HTM_TR_End (); @@ -1160,16 +1276,16 @@ static void Exa_ShowExamAnnouncement (long ExaCod, if (TypeViewExamAnnouncement == Exa_FORM_VIEW) { HTM_TD_Begin ("class=\"LT\""); - Dat_WriteFormDate (Gbl.ExamAnns.ExaDat.ExamDate.Year < Gbl.Now.Date.Year ? Gbl.ExamAnns.ExaDat.ExamDate.Year : - Gbl.Now.Date.Year, + Dat_WriteFormDate (ExamAnns->ExamAnn.ExamDate.Year < Gbl.Now.Date.Year ? ExamAnns->ExamAnn.ExamDate.Year : + Gbl.Now.Date.Year, Gbl.Now.Date.Year + 1,"Exam", - &(Gbl.ExamAnns.ExaDat.ExamDate), + &(ExamAnns->ExamAnn.ExamDate), false,false); HTM_TD_End (); } else { - Dat_ConvDateToDateStr (&Gbl.ExamAnns.ExaDat.ExamDate, + Dat_ConvDateToDateStr (&ExamAnns->ExamAnn.ExamDate, StrExamDate); HTM_TD_Begin ("class=\"EXAM LT\""); HTM_Txt (StrExamDate); @@ -1190,13 +1306,13 @@ static void Exa_ShowExamAnnouncement (long ExaCod, HTM_SELECT_Begin (false, "name=\"ExamHour\""); HTM_OPTION (HTM_Type_STRING,"0", - Gbl.ExamAnns.ExaDat.StartTime.Hour == 0,false, + ExamAnns->ExamAnn.StartTime.Hour == 0,false, "-"); for (Hour = 7; Hour <= 22; Hour++) HTM_OPTION (HTM_Type_UNSIGNED,&Hour, - Gbl.ExamAnns.ExaDat.StartTime.Hour == Hour,false, + ExamAnns->ExamAnn.StartTime.Hour == Hour,false, "%02u %s",Hour,Txt_hours_ABBREVIATION); HTM_SELECT_End (); @@ -1206,13 +1322,13 @@ static void Exa_ShowExamAnnouncement (long ExaCod, Minute <= 59; Minute++) HTM_OPTION (HTM_Type_UNSIGNED,&Minute, - Gbl.ExamAnns.ExaDat.StartTime.Minute == Minute,false, + ExamAnns->ExamAnn.StartTime.Minute == Minute,false, "%02u ′",Minute); HTM_SELECT_End (); } - else if (Gbl.ExamAnns.ExaDat.StartTime.Hour) - HTM_TxtF ("%2u:%02u",Gbl.ExamAnns.ExaDat.StartTime.Hour, - Gbl.ExamAnns.ExaDat.StartTime.Minute); + else if (ExamAnns->ExamAnn.StartTime.Hour) + HTM_TxtF ("%2u:%02u",ExamAnns->ExamAnn.StartTime.Hour, + ExamAnns->ExamAnn.StartTime.Minute); HTM_TD_End (); HTM_TR_End (); @@ -1233,7 +1349,7 @@ static void Exa_ShowExamAnnouncement (long ExaCod, Hour <= 8; Hour++) HTM_OPTION (HTM_Type_UNSIGNED,&Hour, - Gbl.ExamAnns.ExaDat.Duration.Hour == Hour,false, + ExamAnns->ExamAnn.Duration.Hour == Hour,false, "%02u %s",Hour,Txt_hours_ABBREVIATION); HTM_SELECT_End (); @@ -1243,29 +1359,29 @@ static void Exa_ShowExamAnnouncement (long ExaCod, Minute <= 59; Minute++) HTM_OPTION (HTM_Type_UNSIGNED,&Minute, - Gbl.ExamAnns.ExaDat.Duration.Minute == Minute,false, + ExamAnns->ExamAnn.Duration.Minute == Minute,false, "%02u ′",Minute); HTM_SELECT_End (); } - else if (Gbl.ExamAnns.ExaDat.Duration.Hour || - Gbl.ExamAnns.ExaDat.Duration.Minute) + else if (ExamAnns->ExamAnn.Duration.Hour || + ExamAnns->ExamAnn.Duration.Minute) { - if (Gbl.ExamAnns.ExaDat.Duration.Hour) + if (ExamAnns->ExamAnn.Duration.Hour) { - if (Gbl.ExamAnns.ExaDat.Duration.Minute) - HTM_TxtF ("%u %s %u ′",Gbl.ExamAnns.ExaDat.Duration.Hour, + if (ExamAnns->ExamAnn.Duration.Minute) + HTM_TxtF ("%u %s %u ′",ExamAnns->ExamAnn.Duration.Hour, Txt_hours_ABBREVIATION, - Gbl.ExamAnns.ExaDat.Duration.Minute); + ExamAnns->ExamAnn.Duration.Minute); else - HTM_TxtF ("%u %s",Gbl.ExamAnns.ExaDat.Duration.Hour, - Gbl.ExamAnns.ExaDat.Duration.Hour == 1 ? Txt_hour : - Txt_hours); + HTM_TxtF ("%u %s",ExamAnns->ExamAnn.Duration.Hour, + ExamAnns->ExamAnn.Duration.Hour == 1 ? Txt_hour : + Txt_hours); } - else if (Gbl.ExamAnns.ExaDat.Duration.Minute) + else if (ExamAnns->ExamAnn.Duration.Minute) { - HTM_TxtF ("%u %s",Gbl.ExamAnns.ExaDat.Duration.Minute, - Gbl.ExamAnns.ExaDat.Duration.Minute == 1 ? Txt_minute : - Txt_minutes); + HTM_TxtF ("%u %s",ExamAnns->ExamAnn.Duration.Minute, + ExamAnns->ExamAnn.Duration.Minute == 1 ? Txt_minute : + Txt_minutes); } } HTM_TD_End (); @@ -1286,15 +1402,15 @@ static void Exa_ShowExamAnnouncement (long ExaCod, if (TypeViewExamAnnouncement == Exa_FORM_VIEW) { HTM_TEXTAREA_Begin ("id=\"Place\" name=\"Place\" cols=\"40\" rows=\"4\""); - HTM_Txt (Gbl.ExamAnns.ExaDat.Place); + HTM_Txt (ExamAnns->ExamAnn.Place); HTM_TEXTAREA_End (); } else { Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, - Gbl.ExamAnns.ExaDat.Place, + ExamAnns->ExamAnn.Place, Cns_MAX_BYTES_TEXT,false); - HTM_Txt (Gbl.ExamAnns.ExaDat.Place); + HTM_Txt (ExamAnns->ExamAnn.Place); } HTM_TD_End (); @@ -1314,15 +1430,15 @@ static void Exa_ShowExamAnnouncement (long ExaCod, if (TypeViewExamAnnouncement == Exa_FORM_VIEW) { HTM_TEXTAREA_Begin ("id=\"ExamMode\" name=\"ExamMode\" cols=\"40\" rows=\"2\""); - HTM_Txt (Gbl.ExamAnns.ExaDat.Mode); + HTM_Txt (ExamAnns->ExamAnn.Mode); HTM_TEXTAREA_End (); } else { Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, - Gbl.ExamAnns.ExaDat.Mode, + ExamAnns->ExamAnn.Mode, Cns_MAX_BYTES_TEXT,false); - HTM_Txt (Gbl.ExamAnns.ExaDat.Mode); + HTM_Txt (ExamAnns->ExamAnn.Mode); } HTM_TD_End (); @@ -1342,15 +1458,15 @@ static void Exa_ShowExamAnnouncement (long ExaCod, if (TypeViewExamAnnouncement == Exa_FORM_VIEW) { HTM_TEXTAREA_Begin ("id=\"Structure\" name=\"Structure\" cols=\"40\" rows=\"8\""); - HTM_Txt (Gbl.ExamAnns.ExaDat.Structure); + HTM_Txt (ExamAnns->ExamAnn.Structure); HTM_TEXTAREA_End (); } else { Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, - Gbl.ExamAnns.ExaDat.Structure, + ExamAnns->ExamAnn.Structure, Cns_MAX_BYTES_TEXT,false); - HTM_Txt (Gbl.ExamAnns.ExaDat.Structure); + HTM_Txt (ExamAnns->ExamAnn.Structure); } HTM_TD_End (); @@ -1370,15 +1486,15 @@ static void Exa_ShowExamAnnouncement (long ExaCod, if (TypeViewExamAnnouncement == Exa_FORM_VIEW) { HTM_TEXTAREA_Begin ("id=\"DocRequired\" name=\"DocRequired\" cols=\"40\" rows=\"2\""); - HTM_Txt (Gbl.ExamAnns.ExaDat.DocRequired); + HTM_Txt (ExamAnns->ExamAnn.DocRequired); HTM_TEXTAREA_End (); } else { Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, - Gbl.ExamAnns.ExaDat.DocRequired, + ExamAnns->ExamAnn.DocRequired, Cns_MAX_BYTES_TEXT,false); - HTM_Txt (Gbl.ExamAnns.ExaDat.DocRequired); + HTM_Txt (ExamAnns->ExamAnn.DocRequired); } HTM_TD_End (); @@ -1398,15 +1514,15 @@ static void Exa_ShowExamAnnouncement (long ExaCod, if (TypeViewExamAnnouncement == Exa_FORM_VIEW) { HTM_TEXTAREA_Begin ("id=\"MatRequired\" name=\"MatRequired\" cols=\"40\" rows=\"4\""); - HTM_Txt (Gbl.ExamAnns.ExaDat.MatRequired); + HTM_Txt (ExamAnns->ExamAnn.MatRequired); HTM_TEXTAREA_End (); } else { Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, - Gbl.ExamAnns.ExaDat.MatRequired, + ExamAnns->ExamAnn.MatRequired, Cns_MAX_BYTES_TEXT,false); - HTM_Txt (Gbl.ExamAnns.ExaDat.MatRequired); + HTM_Txt (ExamAnns->ExamAnn.MatRequired); } HTM_TD_End (); @@ -1426,15 +1542,15 @@ static void Exa_ShowExamAnnouncement (long ExaCod, if (TypeViewExamAnnouncement == Exa_FORM_VIEW) { HTM_TEXTAREA_Begin ("id=\"MatAllowed\" name=\"MatAllowed\" cols=\"40\" rows=\"4\""); - HTM_Txt (Gbl.ExamAnns.ExaDat.MatAllowed); + HTM_Txt (ExamAnns->ExamAnn.MatAllowed); HTM_TEXTAREA_End (); } else { Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, - Gbl.ExamAnns.ExaDat.MatAllowed, + ExamAnns->ExamAnn.MatAllowed, Cns_MAX_BYTES_TEXT,false); - HTM_Txt (Gbl.ExamAnns.ExaDat.MatAllowed); + HTM_Txt (ExamAnns->ExamAnn.MatAllowed); } HTM_TD_End (); @@ -1454,15 +1570,15 @@ static void Exa_ShowExamAnnouncement (long ExaCod, if (TypeViewExamAnnouncement == Exa_FORM_VIEW) { HTM_TEXTAREA_Begin ("id=\"OtherInfo\" name=\"OtherInfo\" cols=\"40\" rows=\"5\""); - HTM_Txt (Gbl.ExamAnns.ExaDat.OtherInfo); + HTM_Txt (ExamAnns->ExamAnn.OtherInfo); HTM_TEXTAREA_End (); } else { Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, - Gbl.ExamAnns.ExaDat.OtherInfo, + ExamAnns->ExamAnn.OtherInfo, Cns_MAX_BYTES_TEXT,false); - HTM_Txt (Gbl.ExamAnns.ExaDat.OtherInfo); + HTM_Txt (ExamAnns->ExamAnn.OtherInfo); } HTM_TD_End (); @@ -1492,38 +1608,41 @@ static void Exa_ShowExamAnnouncement (long ExaCod, /********* Put icons to remove / edit / print an exam announcement ***********/ /*****************************************************************************/ -static void Exa_PutIconsExamAnnouncement (__attribute__((unused)) void *Args) +static void Exa_PutIconsExamAnnouncement (void *ExamAnns) { - if (Gbl.Usrs.Me.Role.Logged == Rol_TCH || - Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) + if (ExamAnns) { - /***** Link to remove this exam announcement *****/ - Ico_PutContextualIconToRemove (ActReqRemExaAnn, - Exa_PutParamExaCodToEdit,&Gbl.ExamAnns.ExaCod); - - /***** Put form to hide/show exam announement *****/ - switch (Gbl.ExamAnns.ExaDat.Status) + if (Gbl.Usrs.Me.Role.Logged == Rol_TCH || + Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) { - case Exa_VISIBLE_EXAM_ANNOUNCEMENT: - Ico_PutContextualIconToHide (ActHidExaAnn,Gbl.ExamAnns.Anchor, - Exa_PutParamExaCodToEdit,&Gbl.ExamAnns.ExaCod); - break; - case Exa_HIDDEN_EXAM_ANNOUNCEMENT: - Ico_PutContextualIconToUnhide (ActShoExaAnn,Gbl.ExamAnns.Anchor, - Exa_PutParamExaCodToEdit,&Gbl.ExamAnns.ExaCod); - break; - case Exa_DELETED_EXAM_ANNOUNCEMENT: // Not applicable here - break; + /***** Link to remove this exam announcement *****/ + Ico_PutContextualIconToRemove (ActReqRemExaAnn, + Exa_PutParamExaCodToEdit,&((struct Exa_ExamAnnouncements *) ExamAnns)->ExaCod); + + /***** Put form to hide/show exam announement *****/ + switch (((struct Exa_ExamAnnouncements *) ExamAnns)->ExamAnn.Status) + { + case Exa_VISIBLE_EXAM_ANNOUNCEMENT: + Ico_PutContextualIconToHide (ActHidExaAnn,((struct Exa_ExamAnnouncements *) ExamAnns)->Anchor, + Exa_PutParamExaCodToEdit,&((struct Exa_ExamAnnouncements *) ExamAnns)->ExaCod); + break; + case Exa_HIDDEN_EXAM_ANNOUNCEMENT: + Ico_PutContextualIconToUnhide (ActShoExaAnn,((struct Exa_ExamAnnouncements *) ExamAnns)->Anchor, + Exa_PutParamExaCodToEdit,&((struct Exa_ExamAnnouncements *) ExamAnns)->ExaCod); + break; + case Exa_DELETED_EXAM_ANNOUNCEMENT: // Not applicable here + break; + } + + /***** Link to edit this exam announcement *****/ + Ico_PutContextualIconToEdit (ActEdiExaAnn,NULL, + Exa_PutParamExaCodToEdit,&((struct Exa_ExamAnnouncements *) ExamAnns)->ExaCod); } - /***** Link to edit this exam announcement *****/ - Ico_PutContextualIconToEdit (ActEdiExaAnn,NULL, - Exa_PutParamExaCodToEdit,&Gbl.ExamAnns.ExaCod); + /***** Link to print view *****/ + Ico_PutContextualIconToPrint (ActPrnExaAnn, + Exa_PutParamExaCodToEdit,&((struct Exa_ExamAnnouncements *) ExamAnns)->ExaCod); } - - /***** Link to print view *****/ - Ico_PutContextualIconToPrint (ActPrnExaAnn, - Exa_PutParamExaCodToEdit,&Gbl.ExamAnns.ExaCod); } /*****************************************************************************/ @@ -1560,43 +1679,48 @@ void Exa_GetSummaryAndContentExamAnnouncement (char SummaryStr[Ntf_MAX_BYTES_SUM long ExaCod,bool GetContent) { extern const char *Txt_hours_ABBREVIATION; + struct Exa_ExamAnnouncements ExamAnns; char CrsNameAndDate[Hie_MAX_BYTES_FULL_NAME + (2 + Cns_MAX_BYTES_DATE + 7) + 1]; char StrExamDate[Cns_MAX_BYTES_DATE + 1]; + /***** Reset exam announcements context *****/ + Exa_ResetExamAnnouncements (&ExamAnns); + /***** Initializations *****/ SummaryStr[0] = '\0'; // Return nothing on error /***** Allocate memory for the exam announcement *****/ - Exa_AllocMemExamAnnouncement (); + Exa_AllocMemExamAnnouncement (&ExamAnns); /***** Get data of an exam announcement from database *****/ - Exa_GetDataExamAnnouncementFromDB (ExaCod); + Exa_GetDataExamAnnouncementFromDB (&ExamAnns,ExaCod); /***** Content *****/ if (GetContent) - Exa_GetNotifContentExamAnnouncement (ContentStr); + Exa_GetNotifContentExamAnnouncement (&ExamAnns,ContentStr); /***** Summary *****/ /* Name of the course and date of exam */ - Dat_ConvDateToDateStr (&Gbl.ExamAnns.ExaDat.ExamDate,StrExamDate); + Dat_ConvDateToDateStr (&ExamAnns.ExamAnn.ExamDate,StrExamDate); snprintf (CrsNameAndDate,sizeof (CrsNameAndDate), "%s, %s, %2u:%02u", - Gbl.ExamAnns.ExaDat.CrsFullName, + ExamAnns.ExamAnn.CrsFullName, StrExamDate, - Gbl.ExamAnns.ExaDat.StartTime.Hour, - Gbl.ExamAnns.ExaDat.StartTime.Minute); + ExamAnns.ExamAnn.StartTime.Hour, + ExamAnns.ExamAnn.StartTime.Minute); Str_Copy (SummaryStr,CrsNameAndDate, Ntf_MAX_BYTES_SUMMARY); /***** Free memory of the exam announcement *****/ - Exa_FreeMemExamAnnouncement (); + Exa_FreeMemExamAnnouncement (&ExamAnns); } /*****************************************************************************/ /************ Show a form with the data of an exam announcement **************/ /*****************************************************************************/ -static void Exa_GetNotifContentExamAnnouncement (char **ContentStr) +static void Exa_GetNotifContentExamAnnouncement (const struct Exa_ExamAnnouncements *ExamAnns, + char **ContentStr) { extern const char *Txt_Institution; extern const char *Txt_Degree; @@ -1621,7 +1745,7 @@ static void Exa_GetNotifContentExamAnnouncement (char **ContentStr) char StrExamDate[Cns_MAX_BYTES_DATE + 1]; /***** Get data of course *****/ - Crs.CrsCod = Gbl.ExamAnns.ExaDat.CrsCod; + Crs.CrsCod = ExamAnns->ExamAnn.CrsCod; Crs_GetDataOfCourseByCod (&Crs); /***** Get data of degree *****/ @@ -1633,7 +1757,7 @@ static void Exa_GetNotifContentExamAnnouncement (char **ContentStr) Ins_GetDataOfInstitutionByCod (&Ins); /***** Convert struct date to a date string *****/ - Dat_ConvDateToDateStr (&Gbl.ExamAnns.ExaDat.ExamDate,StrExamDate); + Dat_ConvDateToDateStr (&ExamAnns->ExamAnn.ExamDate,StrExamDate); /***** Fill content string *****/ if (asprintf (ContentStr,"%s: %s
" @@ -1653,22 +1777,22 @@ static void Exa_GetNotifContentExamAnnouncement (char **ContentStr) "%s: %s", Txt_Institution,Ins.FullName, Txt_Degree,Deg.FullName, - Txt_EXAM_ANNOUNCEMENT_Course,Gbl.ExamAnns.ExaDat.CrsFullName, - Txt_EXAM_ANNOUNCEMENT_Year_or_semester,Txt_YEAR_OF_DEGREE[Gbl.ExamAnns.ExaDat.Year], - Txt_EXAM_ANNOUNCEMENT_Session,Gbl.ExamAnns.ExaDat.Session, + Txt_EXAM_ANNOUNCEMENT_Course,ExamAnns->ExamAnn.CrsFullName, + Txt_EXAM_ANNOUNCEMENT_Year_or_semester,Txt_YEAR_OF_DEGREE[ExamAnns->ExamAnn.Year], + Txt_EXAM_ANNOUNCEMENT_Session,ExamAnns->ExamAnn.Session, Txt_EXAM_ANNOUNCEMENT_Exam_date,StrExamDate, - Txt_EXAM_ANNOUNCEMENT_Start_time,Gbl.ExamAnns.ExaDat.StartTime.Hour, - Gbl.ExamAnns.ExaDat.StartTime.Minute, + Txt_EXAM_ANNOUNCEMENT_Start_time,ExamAnns->ExamAnn.StartTime.Hour, + ExamAnns->ExamAnn.StartTime.Minute, Txt_hours_ABBREVIATION, - Txt_EXAM_ANNOUNCEMENT_Approximate_duration,Gbl.ExamAnns.ExaDat.Duration.Hour, - Gbl.ExamAnns.ExaDat.Duration.Minute, + Txt_EXAM_ANNOUNCEMENT_Approximate_duration,ExamAnns->ExamAnn.Duration.Hour, + ExamAnns->ExamAnn.Duration.Minute, Txt_hours_ABBREVIATION, - Txt_EXAM_ANNOUNCEMENT_Place_of_exam,Gbl.ExamAnns.ExaDat.Place, - Txt_EXAM_ANNOUNCEMENT_Mode,Gbl.ExamAnns.ExaDat.Mode, - Txt_EXAM_ANNOUNCEMENT_Structure_of_the_exam,Gbl.ExamAnns.ExaDat.Structure, - Txt_EXAM_ANNOUNCEMENT_Documentation_required,Gbl.ExamAnns.ExaDat.DocRequired, - Txt_EXAM_ANNOUNCEMENT_Material_required,Gbl.ExamAnns.ExaDat.MatRequired, - Txt_EXAM_ANNOUNCEMENT_Material_allowed,Gbl.ExamAnns.ExaDat.MatAllowed, - Txt_EXAM_ANNOUNCEMENT_Other_information,Gbl.ExamAnns.ExaDat.OtherInfo) < 0) + Txt_EXAM_ANNOUNCEMENT_Place_of_exam,ExamAnns->ExamAnn.Place, + Txt_EXAM_ANNOUNCEMENT_Mode,ExamAnns->ExamAnn.Mode, + Txt_EXAM_ANNOUNCEMENT_Structure_of_the_exam,ExamAnns->ExamAnn.Structure, + Txt_EXAM_ANNOUNCEMENT_Documentation_required,ExamAnns->ExamAnn.DocRequired, + Txt_EXAM_ANNOUNCEMENT_Material_required,ExamAnns->ExamAnn.MatRequired, + Txt_EXAM_ANNOUNCEMENT_Material_allowed,ExamAnns->ExamAnn.MatAllowed, + Txt_EXAM_ANNOUNCEMENT_Other_information,ExamAnns->ExamAnn.OtherInfo) < 0) Lay_NotEnoughMemoryExit (); } diff --git a/swad_exam.h b/swad_exam.h index 54eb12323..65c819c15 100644 --- a/swad_exam.h +++ b/swad_exam.h @@ -57,7 +57,7 @@ typedef enum #define Exa_MAX_CHARS_SESSION (128 - 1) // 127 #define Exa_MAX_BYTES_SESSION ((Exa_MAX_CHARS_SESSION + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047 -struct ExamData +struct Exa_ExamAnnouncement { long CrsCod; Exa_ExamAnnouncementStatus_t Status; @@ -83,10 +83,24 @@ struct Exa_ExamCodeAndDate struct Date ExamDate; }; +struct Exa_ExamAnnouncements + { + unsigned NumExaAnns; // Number of announcements of exam in the list + struct Exa_ExamCodeAndDate *Lst; // List of exam announcements + long NewExaCod; // New exam announcement just created + long HighlightExaCod; // Exam announcement to be highlighted + char HighlightDate[4 + 2 + 2 + 1]; // Date with exam announcements to be highlighted (in YYYYMMDD format) + long ExaCod; // Used to put contextual icons + const char *Anchor; // Used to put contextual icons + struct Exa_ExamAnnouncement ExamAnn; + }; + /*****************************************************************************/ /***************************** Public prototypes *****************************/ /*****************************************************************************/ +void Exa_ResetExamAnnouncements (struct Exa_ExamAnnouncements *ExamAnns); + void Exa_PutFrmEditAExamAnnouncement (void); void Exa_ReceiveExamAnnouncement1 (void); void Exa_ReceiveExamAnnouncement2 (void); @@ -97,15 +111,14 @@ void Exa_RemoveExamAnnouncement2 (void); void Exa_HideExamAnnouncement (void); void Exa_UnhideExamAnnouncement (void); -void Exa_FreeMemExamAnnouncement (void); -void Exa_FreeListExamAnnouncements (void); +void Exa_FreeListExamAnnouncements (struct Exa_ExamAnnouncements *ExamAnns); void Exa_ListExamAnnouncementsSee (void); void Exa_ListExamAnnouncementsEdit (void); -void Exa_GetExaCodToHighlight (void); -void Exa_GetDateToHighlight (void); +void Exa_ListExamAnnouncementsCod (void); +void Exa_ListExamAnnouncementsDay (void); -void Exa_CreateListDatesOfExamAnnouncements (void); +void Exa_CreateListExamAnnouncements (struct Exa_ExamAnnouncements *ExamAnns); void Exa_PutHiddenParamExaCod (long ExaCod); void Exa_GetSummaryAndContentExamAnnouncement (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], diff --git a/swad_global.c b/swad_global.c index 44d6fe72f..cbc9ba0f1 100644 --- a/swad_global.c +++ b/swad_global.c @@ -205,12 +205,6 @@ void Gbl_InitializeGlobals (void) } Gbl.Usrs.ListOtherRecipients = NULL; - Gbl.ExamAnns.NumExaAnns = 0; - Gbl.ExamAnns.Lst = NULL; - Gbl.ExamAnns.NewExaCod = -1L; - Gbl.ExamAnns.HighlightExaCod = -1L; - Gbl.ExamAnns.HighlightDate[0] = '\0'; // No exam announcements highlighted - /***** Reset current hierarchy *****/ Hie_ResetHierarchy (); @@ -415,8 +409,6 @@ void Gbl_Cleanup (void) Usr_FreeListOtherRecipients (); Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); Syl_FreeListItemsSyllabus (); - Exa_FreeMemExamAnnouncement (); - Exa_FreeListExamAnnouncements (); if (Gbl.F.Tmp) fclose (Gbl.F.Tmp); Fil_CloseXMLFile (); diff --git a/swad_global.h b/swad_global.h index 46123a78a..dcb5c1285 100644 --- a/swad_global.h +++ b/swad_global.h @@ -428,17 +428,6 @@ struct Globals long HighlightNotCod; // Notice code of a notice to be highlighted } Notices; } Crs; - struct - { - struct Exa_ExamCodeAndDate *Lst; // List of exam announcements - unsigned NumExaAnns; // Number of announcements of exam in the list - long NewExaCod; // New exam announcement just created - long HighlightExaCod; // Exam announcement to be highlighted - char HighlightDate[4 + 2 + 2 + 1]; // Date with exam announcements to be highlighted (in YYYYMMDD format) - long ExaCod; // Used to put contextual icons - const char *Anchor; // Used to put contextual icons - struct ExamData ExaDat; - } ExamAnns; struct { unsigned Id; // Each file browser in the page has a unique identifier diff --git a/swad_layout.c b/swad_layout.c index 64f2dfa28..455631310 100644 --- a/swad_layout.c +++ b/swad_layout.c @@ -488,6 +488,7 @@ static void Lay_WriteScripts (void) extern const char *Txt_DAYS_CAPS[7]; extern const char *Txt_DAYS_SMALL[7]; extern const char *Txt_Exam_of_X; + struct Exa_ExamAnnouncements ExamAnns; unsigned DayOfWeek; /* 0, 1, 2, 3, 4, 5, 6 */ unsigned NumHld; unsigned NumExamAnnouncement; // Number of exam announcement @@ -533,8 +534,11 @@ static void Lay_WriteScripts (void) Hld_GetListHolidays (); } - /***** Create list of calls for examination *****/ - Exa_CreateListDatesOfExamAnnouncements (); + /***** Reset exam announcements context *****/ + Exa_ResetExamAnnouncements (&ExamAnns); + + /***** Create list of exam announcements *****/ + Exa_CreateListExamAnnouncements (&ExamAnns); /***** Write script to initialize variables used to draw months *****/ HTM_SCRIPT_Begin (NULL,NULL); @@ -567,18 +571,18 @@ static void Lay_WriteScripts (void) HTM_TxtF ("\tvar LstExamAnnouncements = [];\n"); for (NumExamAnnouncement = 0; - NumExamAnnouncement < Gbl.ExamAnns.NumExaAnns; + NumExamAnnouncement < ExamAnns.NumExaAnns; NumExamAnnouncement++) HTM_TxtF ("LstExamAnnouncements.push({ ExaCod: %ld, Year: %u, Month: %u, Day: %u });\n", - Gbl.ExamAnns.Lst[NumExamAnnouncement].ExaCod, - Gbl.ExamAnns.Lst[NumExamAnnouncement].ExamDate.Year, - Gbl.ExamAnns.Lst[NumExamAnnouncement].ExamDate.Month, - Gbl.ExamAnns.Lst[NumExamAnnouncement].ExamDate.Day); + ExamAnns.Lst[NumExamAnnouncement].ExaCod, + ExamAnns.Lst[NumExamAnnouncement].ExamDate.Year, + ExamAnns.Lst[NumExamAnnouncement].ExamDate.Month, + ExamAnns.Lst[NumExamAnnouncement].ExamDate.Day); HTM_SCRIPT_End (); - /***** Free list of dates of exam announcements *****/ - Exa_FreeListExamAnnouncements (); + /***** Free list of exam announcements *****/ + Exa_FreeListExamAnnouncements (&ExamAnns); } /***** Scripts depending on action *****/