diff --git a/swad_API.c b/swad_API.c index 93d7f3c2..08dfb4e2 100644 --- a/swad_API.c +++ b/swad_API.c @@ -231,6 +231,7 @@ static int API_CheckParamsNewAccount (char *NewNicknameWithArroba, // Input char *NewEncryptedPassword); // Output static int API_WriteSyllabusIntoHTMLBuffer (struct soap *soap, + struct Syl_Syllabus *Syllabus, char **HTMLBuffer); static int API_WritePlainTextIntoHTMLBuffer (struct soap *soap, char **HTMLBuffer); @@ -1369,6 +1370,7 @@ int swad__getCourseInfo (struct soap *soap, struct swad__getCourseInfoOutput *getCourseInfo) // output { int ReturnCode; + struct Syl_Syllabus Syllabus; Inf_InfoType_t InfoType; size_t Length; Inf_InfoSrc_t InfoSrc; @@ -1430,6 +1432,9 @@ int swad__getCourseInfo (struct soap *soap, "Request forbidden", "Requester must belong to course"); + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Get info source *****/ for (InfoType = (Inf_InfoType_t) 0; InfoType <= (Inf_InfoType_t) (Inf_NUM_INFO_TYPES - 1); @@ -1441,7 +1446,10 @@ int swad__getCourseInfo (struct soap *soap, "Bad info type", "Unknown requested info type"); Gbl.Crs.Info.Type = InfoType; - Inf_GetAndCheckInfoSrcFromDB (Gbl.Hierarchy.Crs.CrsCod,Gbl.Crs.Info.Type,&InfoSrc,&MustBeRead); + Inf_GetAndCheckInfoSrcFromDB (&Syllabus, + Gbl.Hierarchy.Crs.CrsCod, + Gbl.Crs.Info.Type, + &InfoSrc,&MustBeRead); Length = strlen (NamesInWSForInfoSrc[InfoSrc]); getCourseInfo->infoSrc = (char *) soap_malloc (soap,Length + 1); Str_Copy (getCourseInfo->infoSrc,NamesInWSForInfoSrc[InfoSrc], @@ -1461,7 +1469,7 @@ int swad__getCourseInfo (struct soap *soap, { case Inf_LECTURES: // Syllabus (lectures) case Inf_PRACTICALS: // Syllabys (practicals) - Result = API_WriteSyllabusIntoHTMLBuffer (soap,&(getCourseInfo->infoTxt)); + Result = API_WriteSyllabusIntoHTMLBuffer (soap,&Syllabus,&(getCourseInfo->infoTxt)); break; default: break; @@ -1495,6 +1503,7 @@ int swad__getCourseInfo (struct soap *soap, /*****************************************************************************/ static int API_WriteSyllabusIntoHTMLBuffer (struct soap *soap, + struct Syl_Syllabus *Syllabus, char **HTMLBuffer) { extern struct LstItemsSyllabus Syl_LstItemsSyllabus; @@ -1506,7 +1515,7 @@ static int API_WriteSyllabusIntoHTMLBuffer (struct soap *soap, *HTMLBuffer = NULL; /***** Load syllabus from XML file to list of items in memory *****/ - Syl_LoadListItemsSyllabusIntoMemory (Gbl.Hierarchy.Crs.CrsCod); + Syl_LoadListItemsSyllabusIntoMemory (Syllabus,Gbl.Hierarchy.Crs.CrsCod); if (Syl_LstItemsSyllabus.NumItems) { diff --git a/swad_changelog.h b/swad_changelog.h index 983c3776..4c34121a 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.174 (2020-04-11)" +#define Log_PLATFORM_VERSION "SWAD 19.175 (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.175: Apr 12, 2020 Code refactoring in syllabus. (285345 lines) Version 19.174: Apr 11, 2020 Code refactoring in messages. (285250 lines) Version 19.173: Apr 11, 2020 Code refactoring in timetables. (285165 lines) Version 19.172.1: Apr 11, 2020 Fix bug in MathJax. (285144 lines) diff --git a/swad_global.c b/swad_global.c index e9d75b3e..fbb4a016 100644 --- a/swad_global.c +++ b/swad_global.c @@ -259,7 +259,9 @@ void Gbl_InitializeGlobals (void) Gbl.DegTypes.Lst = NULL; Gbl.Crs.Info.ShowMsgMustBeRead = 0; + Gbl.Crs.Notices.HighlightNotCod = -1L; // No notice highlighted + Gbl.Crs.Grps.NumGrps = 0; Gbl.Crs.Grps.WhichGrps = Grp_WHICH_GROUPS_DEFAULT; Gbl.Crs.Grps.GrpTypes.LstGrpTypes = NULL; @@ -278,6 +280,7 @@ void Gbl_InitializeGlobals (void) Gbl.Crs.Grps.LstGrpsSel.GrpCods = NULL; Gbl.Crs.Grps.LstGrpsSel.NumGrps = 0; Gbl.Crs.Grps.LstGrpsSel.NestedCalls = 0; + Gbl.Crs.Records.Field.Name[0] = '\0'; Gbl.Crs.Records.Field.NumLines = Rec_MIN_LINES_IN_EDITION_FIELD; Gbl.Crs.Records.Field.Visibility = Rec_HIDDEN_FIELD; @@ -285,9 +288,6 @@ void Gbl_InitializeGlobals (void) Gbl.Crs.Records.LstFields.Num = 0; Gbl.Crs.Records.LstFields.NestedCalls = 0; - Gbl.Syllabus.EditionIsActive = false; - Gbl.Syllabus.WhichSyllabus = Syl_DEFAULT_WHICH_SYLLABUS; - Gbl.Search.WhatToSearch = Sch_WHAT_TO_SEARCH_DEFAULT; Gbl.Search.Str[0] = '\0'; Gbl.Search.LogSearch = false; diff --git a/swad_global.h b/swad_global.h index fd0f78d8..19f66662 100644 --- a/swad_global.h +++ b/swad_global.h @@ -418,13 +418,7 @@ struct Globals char PathRelPubl[PATH_MAX + 1]; // Relative path to the public directory of the course char PathURLPubl[PATH_MAX + 1]; // Abolute URL to the public part of the course struct Grp_Groups Grps; - struct - { - Inf_InfoType_t Type; - char URL[Cns_MAX_BYTES_WWW + 1]; - bool MustBeRead[Inf_NUM_INFO_TYPES]; // Students must read info? - bool ShowMsgMustBeRead; - } Info; + struct Inf_Info Info; struct { struct RecordField Field; @@ -435,14 +429,6 @@ struct Globals long HighlightNotCod; // Notice code of a notice to be highlighted } Notices; } Crs; - struct - { - char PathDir[PATH_MAX + 1]; - unsigned NumItem; // Item being edited - unsigned ParamNumItem; // Used as parameter in forms - bool EditionIsActive; - Syl_WhichSyllabus_t WhichSyllabus; - } Syllabus; struct { struct Exa_ExamCodeAndDate *Lst; // List of exam announcements diff --git a/swad_info.c b/swad_info.c index bcd26050..4a2f7746 100644 --- a/swad_info.c +++ b/swad_info.c @@ -288,8 +288,10 @@ static void Inf_BuildPathURL (long CrsCod,Inf_InfoType_t InfoType, static void Inf_ShowPage (const char *URL); -static bool Inf_CheckIfInfoAvailable (Inf_InfoSrc_t InfoSrc); -static Inf_InfoType_t Inf_AsignInfoType (void); +static bool Inf_CheckIfInfoAvailable (struct Syl_Syllabus *Syllabus, + Inf_InfoSrc_t InfoSrc); +static void Inf_AsignInfoType (struct Inf_Info *Info, + struct Syl_Syllabus *Syllabus); static void Inf_SetInfoTxtIntoDB (const char *InfoTxtHTML,const char *InfoTxtMD); static bool Inf_CheckPlainTxt (long CrsCod,Inf_InfoType_t InfoType); @@ -306,6 +308,7 @@ void Inf_ShowInfo (void) { extern const char *Txt_INFO_TITLE[Inf_NUM_INFO_TYPES]; extern const char *Txt_No_information; + struct Syl_Syllabus Syllabus; Inf_InfoSrc_t InfoSrc; bool MustBeRead; bool Disabled; @@ -324,11 +327,15 @@ void Inf_ShowInfo (void) [Inf_ASSESSMENT ] = Hlp_ASSESSMENT_System, }; + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Set info type *****/ - Gbl.Crs.Info.Type = Inf_AsignInfoType (); + Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus); /***** Get info source from database *****/ - Inf_GetAndCheckInfoSrcFromDB (Gbl.Hierarchy.Crs.CrsCod, + Inf_GetAndCheckInfoSrcFromDB (&Syllabus, + Gbl.Hierarchy.Crs.CrsCod, Gbl.Crs.Info.Type, &InfoSrc,&MustBeRead); @@ -336,7 +343,7 @@ void Inf_ShowInfo (void) { case Inf_LECTURES: case Inf_PRACTICALS: - Syl_PutFormWhichSyllabus (); + Syl_PutFormWhichSyllabus (Syllabus.WhichSyllabus); break; default: break; @@ -382,7 +389,7 @@ void Inf_ShowInfo (void) { case Inf_LECTURES: case Inf_PRACTICALS: - ShowWarningNoInfo = !Syl_CheckAndEditSyllabus (); + ShowWarningNoInfo = !Syl_CheckAndEditSyllabus (&Syllabus); break; case Inf_INTRODUCTION: case Inf_TEACHING_GUIDE: @@ -606,10 +613,14 @@ void Inf_ChangeForceReadInfo (void) { extern const char *Txt_Students_now_are_required_to_read_this_information; extern const char *Txt_Students_are_no_longer_obliged_to_read_this_information; + struct Syl_Syllabus Syllabus; bool MustBeRead = Inf_GetMustBeReadFromForm (); + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Set info type *****/ - Gbl.Crs.Info.Type = Inf_AsignInfoType (); + Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus); /***** Set status (if info must be read or not) into database *****/ Inf_SetForceReadIntoDB (MustBeRead); @@ -631,10 +642,14 @@ void Inf_ChangeIHaveReadInfo (void) { extern const char *Txt_You_have_confirmed_that_you_have_read_this_information; extern const char *Txt_You_have_eliminated_the_confirmation_that_you_have_read_this_information; + struct Syl_Syllabus Syllabus; bool IHaveRead = Inf_GetIfIHaveReadFromForm (); + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Set info type *****/ - Gbl.Crs.Info.Type = Inf_AsignInfoType (); + Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus); /***** Set status (if I have read or not a information) into database *****/ Inf_SetIHaveReadIntoDB (IHaveRead); @@ -966,10 +981,14 @@ static void Inf_ShowPage (const char *URL) void Inf_SetInfoSrc (void) { + struct Syl_Syllabus Syllabus; Inf_InfoSrc_t InfoSrcSelected = Inf_GetInfoSrcFromForm (); + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Set info type *****/ - Gbl.Crs.Info.Type = Inf_AsignInfoType (); + Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus); /***** Set info source into database *****/ Inf_SetInfoSrcIntoDB (InfoSrcSelected); @@ -988,6 +1007,7 @@ void Inf_FormsToSelSendInfo (void) extern const char *Txt_Source_of_information; extern const char *Txt_INFO_SRC_FULL_TEXT[Inf_NUM_INFO_SOURCES]; extern const char *Txt_INFO_SRC_HELP[Inf_NUM_INFO_SOURCES]; + struct Syl_Syllabus Syllabus; Inf_InfoSrc_t InfoSrc; Inf_InfoSrc_t InfoSrcSelected; bool InfoAvailable[Inf_NUM_INFO_SOURCES]; @@ -1004,11 +1024,15 @@ void Inf_FormsToSelSendInfo (void) [Inf_ASSESSMENT ] = Hlp_ASSESSMENT_System_edit, }; + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Set info type *****/ - Gbl.Crs.Info.Type = Inf_AsignInfoType (); + Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus); /***** Get current info source from database *****/ - Inf_GetAndCheckInfoSrcFromDB (Gbl.Hierarchy.Crs.CrsCod, + Inf_GetAndCheckInfoSrcFromDB (&Syllabus, + Gbl.Hierarchy.Crs.CrsCod, Gbl.Crs.Info.Type, &InfoSrcSelected,&MustBeRead); @@ -1016,7 +1040,7 @@ void Inf_FormsToSelSendInfo (void) for (InfoSrc = (Inf_InfoSrc_t) 0; InfoSrc <= (Inf_InfoSrc_t) (Inf_NUM_INFO_SOURCES - 1); InfoSrc++) - InfoAvailable[InfoSrc] = Inf_CheckIfInfoAvailable (InfoSrc); + InfoAvailable[InfoSrc] = Inf_CheckIfInfoAvailable (&Syllabus,InfoSrc); /***** Set info source to none when no info available for the current source *****/ @@ -1090,7 +1114,8 @@ void Inf_FormsToSelSendInfo (void) /* Check if there is info available for current info type and a given source */ /*****************************************************************************/ -static bool Inf_CheckIfInfoAvailable (Inf_InfoSrc_t InfoSrc) +static bool Inf_CheckIfInfoAvailable (struct Syl_Syllabus *Syllabus, + Inf_InfoSrc_t InfoSrc) { switch (InfoSrc) { @@ -1100,8 +1125,11 @@ static bool Inf_CheckIfInfoAvailable (Inf_InfoSrc_t InfoSrc) switch (Gbl.Crs.Info.Type) { case Inf_LECTURES: + Syllabus->WhichSyllabus = Syl_LECTURES; + return Syl_CheckSyllabus (Syllabus,Gbl.Hierarchy.Crs.CrsCod); case Inf_PRACTICALS: - return Syl_CheckSyllabus (Gbl.Hierarchy.Crs.CrsCod,Gbl.Crs.Info.Type); + Syllabus->WhichSyllabus = Syl_PRACTICALS; + return Syl_CheckSyllabus (Syllabus,Gbl.Hierarchy.Crs.CrsCod); default: return false; } @@ -1238,7 +1266,8 @@ void Inf_FormToSendURL (Inf_InfoSrc_t InfoSrc) /******** Returns bibliography, assessment, etc. from Gbl.Action.Act *********/ /*****************************************************************************/ -static Inf_InfoType_t Inf_AsignInfoType (void) +static void Inf_AsignInfoType (struct Inf_Info *Info, + struct Syl_Syllabus *Syllabus) { switch (Gbl.Action.Act) { @@ -1254,7 +1283,8 @@ static Inf_InfoType_t Inf_AsignInfoType (void) case ActRchTxtEdiCrsInf: case ActRcvPlaTxtCrsInf: case ActRcvRchTxtCrsInf: - return Inf_INTRODUCTION; + Info->Type = Inf_INTRODUCTION; + break; case ActSeeTchGui: case ActEdiTchGui: case ActChgFrcReaTchGui: @@ -1267,11 +1297,13 @@ static Inf_InfoType_t Inf_AsignInfoType (void) case ActRchTxtEdiTchGui: case ActRcvPlaTxtTchGui: case ActRcvRchTxtTchGui: - return Inf_TEACHING_GUIDE; + Info->Type = Inf_TEACHING_GUIDE; + break; case ActSeeSyl: - Syl_GetParamWhichSyllabus (); - return (Gbl.Syllabus.WhichSyllabus == Syl_LECTURES ? Inf_LECTURES : - Inf_PRACTICALS); + Syllabus->WhichSyllabus = Syl_GetParamWhichSyllabus (); + Info->Type = (Syllabus->WhichSyllabus == Syl_LECTURES ? Inf_LECTURES : + Inf_PRACTICALS); + break; case ActSeeSylLec: case ActEdiSylLec: case ActChgFrcReaSylLec: @@ -1284,8 +1316,9 @@ static Inf_InfoType_t Inf_AsignInfoType (void) case ActRchTxtEdiSylLec: case ActRcvPlaTxtSylLec: case ActRcvRchTxtSylLec: - Gbl.Syllabus.WhichSyllabus = Syl_LECTURES; - return Inf_LECTURES; + Syllabus->WhichSyllabus = Syl_LECTURES; + Info->Type = Inf_LECTURES; + break; case ActSeeSylPra: case ActEdiSylPra: case ActChgFrcReaSylPra: @@ -1298,8 +1331,9 @@ static Inf_InfoType_t Inf_AsignInfoType (void) case ActRchTxtEdiSylPra: case ActRcvPlaTxtSylPra: case ActRcvRchTxtSylPra: - Gbl.Syllabus.WhichSyllabus = Syl_PRACTICALS; - return Inf_PRACTICALS; + Syllabus->WhichSyllabus = Syl_PRACTICALS; + Info->Type = Inf_PRACTICALS; + break; case ActSeeBib: case ActEdiBib: case ActChgFrcReaBib: @@ -1312,7 +1346,8 @@ static Inf_InfoType_t Inf_AsignInfoType (void) case ActRchTxtEdiBib: case ActRcvPlaTxtBib: case ActRcvRchTxtBib: - return Inf_BIBLIOGRAPHY; + Info->Type = Inf_BIBLIOGRAPHY; + break; case ActSeeFAQ: case ActEdiFAQ: case ActChgFrcReaFAQ: @@ -1325,7 +1360,8 @@ static Inf_InfoType_t Inf_AsignInfoType (void) case ActRchTxtEdiFAQ: case ActRcvPlaTxtFAQ: case ActRcvRchTxtFAQ: - return Inf_FAQ; + Info->Type = Inf_FAQ; + break; case ActSeeCrsLnk: case ActEdiCrsLnk: case ActChgFrcReaCrsLnk: @@ -1338,7 +1374,8 @@ static Inf_InfoType_t Inf_AsignInfoType (void) case ActRchTxtEdiCrsLnk: case ActRcvPlaTxtCrsLnk: case ActRcvRchTxtCrsLnk: - return Inf_LINKS; + Info->Type = Inf_LINKS; + break; case ActSeeAss: case ActEdiAss: case ActChgFrcReaAss: @@ -1351,9 +1388,9 @@ static Inf_InfoType_t Inf_AsignInfoType (void) case ActRchTxtEdiAss: case ActRcvPlaTxtAss: case ActRcvRchTxtAss: - return Inf_ASSESSMENT; + Info->Type = Inf_ASSESSMENT; + break; } - return (Inf_InfoType_t) 0; // If action is not one of the former ones, the returned value is not important } /*****************************************************************************/ @@ -1447,7 +1484,8 @@ Inf_InfoSrc_t Inf_GetInfoSrcFromDB (long CrsCod,Inf_InfoType_t InfoType) /***** Get and check info source for a type of course info from database *****/ /*****************************************************************************/ -void Inf_GetAndCheckInfoSrcFromDB (long CrsCod, +void Inf_GetAndCheckInfoSrcFromDB (struct Syl_Syllabus *Syllabus, + long CrsCod, Inf_InfoType_t InfoType, Inf_InfoSrc_t *InfoSrc,bool *MustBeRead) { @@ -1494,8 +1532,16 @@ void Inf_GetAndCheckInfoSrcFromDB (long CrsCod, switch (InfoType) { case Inf_LECTURES: + Syllabus->WhichSyllabus = Syl_LECTURES; + if (!Syl_CheckSyllabus (Syllabus,CrsCod)) + { + *InfoSrc = Inf_INFO_SRC_NONE; + *MustBeRead = false; + } + break; case Inf_PRACTICALS: - if (!Syl_CheckSyllabus (CrsCod,InfoType)) + Syllabus->WhichSyllabus = Syl_PRACTICALS; + if (!Syl_CheckSyllabus (Syllabus,CrsCod)) { *InfoSrc = Inf_INFO_SRC_NONE; *MustBeRead = false; @@ -1883,6 +1929,7 @@ void Inf_EditPlainTxtInfo (void) { extern const char *Txt_INFO_TITLE[Inf_NUM_INFO_TYPES]; extern const char *Txt_Save_changes; + struct Syl_Syllabus Syllabus; char TxtHTML[Cns_MAX_BYTES_LONG_TEXT + 1]; const char *HelpEdit[Inf_NUM_INFO_TYPES] = { @@ -1896,8 +1943,11 @@ void Inf_EditPlainTxtInfo (void) [Inf_ASSESSMENT ] = Hlp_ASSESSMENT_System_edit, }; + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Set info type *****/ - Gbl.Crs.Info.Type = Inf_AsignInfoType (); + Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus); /***** Begin form and box *****/ Frm_StartForm (Inf_ActionsRcvPlaTxtInfo[Gbl.Crs.Info.Type]); @@ -1934,6 +1984,7 @@ void Inf_EditRichTxtInfo (void) { extern const char *Txt_INFO_TITLE[Inf_NUM_INFO_TYPES]; extern const char *Txt_Save_changes; + struct Syl_Syllabus Syllabus; char TxtHTML[Cns_MAX_BYTES_LONG_TEXT + 1]; const char *HelpEdit[Inf_NUM_INFO_TYPES] = { @@ -1947,8 +1998,11 @@ void Inf_EditRichTxtInfo (void) [Inf_ASSESSMENT ] = Hlp_ASSESSMENT_System_edit, }; + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Set info type *****/ - Gbl.Crs.Info.Type = Inf_AsignInfoType (); + Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus); /***** Begin form and box *****/ Frm_StartForm (Inf_ActionsRcvRchTxtInfo[Gbl.Crs.Info.Type]); @@ -1983,11 +2037,15 @@ void Inf_EditRichTxtInfo (void) void Inf_RecAndChangePlainTxtInfo (void) { + struct Syl_Syllabus Syllabus; char Txt_HTMLFormat [Cns_MAX_BYTES_LONG_TEXT + 1]; char Txt_MarkdownFormat[Cns_MAX_BYTES_LONG_TEXT + 1]; + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Set info type *****/ - Gbl.Crs.Info.Type = Inf_AsignInfoType (); + Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus); /***** Get text with course information from form *****/ Par_GetParameter (Par_PARAM_SINGLE,"Txt",Txt_HTMLFormat, @@ -2019,11 +2077,15 @@ void Inf_RecAndChangePlainTxtInfo (void) void Inf_RecAndChangeRichTxtInfo (void) { + struct Syl_Syllabus Syllabus; char Txt_HTMLFormat [Cns_MAX_BYTES_LONG_TEXT + 1]; char Txt_MarkdownFormat[Cns_MAX_BYTES_LONG_TEXT + 1]; + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Set info type *****/ - Gbl.Crs.Info.Type = Inf_AsignInfoType (); + Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus); /***** Get text with course information from form *****/ Par_GetParameter (Par_PARAM_SINGLE,"Txt",Txt_HTMLFormat, @@ -2056,12 +2118,16 @@ void Inf_RecAndChangeRichTxtInfo (void) void Inf_ReceiveURLInfo (void) { extern const char *Txt_The_URL_X_has_been_updated; + struct Syl_Syllabus Syllabus; char PathFile[PATH_MAX + 1]; FILE *FileURL; bool URLIsOK = false; + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Set info type *****/ - Gbl.Crs.Info.Type = Inf_AsignInfoType (); + Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus); /***** Get parameter with URL *****/ Par_GetParToText ("InfoSrcURL",Gbl.Crs.Info.URL,Cns_MAX_BYTES_WWW); @@ -2118,6 +2184,7 @@ void Inf_ReceivePagInfo (void) extern const char *Txt_Found_an_index_htm_file; extern const char *Txt_No_file_index_html_index_htm_found_within_the_ZIP_file; extern const char *Txt_The_file_type_should_be_HTML_or_ZIP; + struct Syl_Syllabus Syllabus; struct Param *Param; char SourceFileName[PATH_MAX + 1]; char PathRelDirHTML[PATH_MAX + 1]; @@ -2128,8 +2195,11 @@ void Inf_ReceivePagInfo (void) bool WrongType = false; bool FileIsOK = false; + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Set info type *****/ - Gbl.Crs.Info.Type = Inf_AsignInfoType (); + Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus); /***** First of all, store in disk the file from stdin (really from Gbl.F.Tmp) *****/ Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG, diff --git a/swad_info.h b/swad_info.h index dcc560b2..f2f9205c 100644 --- a/swad_info.h +++ b/swad_info.h @@ -30,6 +30,7 @@ #include // For boolean type #include "swad_constant.h" +#include "swad_syllabus.h" /*****************************************************************************/ /***************************** Public constants ******************************/ @@ -63,6 +64,14 @@ typedef enum Inf_INFO_SRC_URL = 5, } Inf_InfoSrc_t; +struct Inf_Info + { + Inf_InfoType_t Type; + char URL[Cns_MAX_BYTES_WWW + 1]; + bool MustBeRead[Inf_NUM_INFO_TYPES]; // Students must read info? + bool ShowMsgMustBeRead; + }; + /*****************************************************************************/ /***************************** Public prototypes *****************************/ /*****************************************************************************/ @@ -86,7 +95,8 @@ void Inf_FormToSendURL (Inf_InfoSrc_t InfoSrc); Inf_InfoSrc_t Inf_GetInfoSrcFromForm (void); void Inf_SetInfoSrcIntoDB (Inf_InfoSrc_t InfoSrc); Inf_InfoSrc_t Inf_GetInfoSrcFromDB (long CrsCod,Inf_InfoType_t InfoType); -void Inf_GetAndCheckInfoSrcFromDB (long CrsCod, +void Inf_GetAndCheckInfoSrcFromDB (struct Syl_Syllabus *Syllabus, + long CrsCod, Inf_InfoType_t InfoType, Inf_InfoSrc_t *InfoSrc,bool *MustBeRead); Inf_InfoType_t Inf_ConvertFromStrDBToInfoType (const char *StrInfoTypeDB); diff --git a/swad_message.c b/swad_message.c index 7cd7ea35..9122519e 100644 --- a/swad_message.c +++ b/swad_message.c @@ -203,8 +203,6 @@ static void Msg_ResetMessages (struct Msg_Messages *Messages) Messages->Reply.IsReply = false; Messages->Reply.OriginalMsgCod = -1L; Messages->ShowOnlyOneRecipient = false; - Messages->FileNameMail[0] = '\0'; - Messages->FileMail = NULL; Messages->CurrentPage = 0; Messages->MsgCod = -1L; } diff --git a/swad_message.h b/swad_message.h index 54494043..31796247 100644 --- a/swad_message.h +++ b/swad_message.h @@ -77,8 +77,6 @@ struct Msg_Messages long OriginalMsgCod; // Original message code when I am editing a reply } Reply; bool ShowOnlyOneRecipient; // Shown only a selected recipient or also other potential recipients? - char FileNameMail[PATH_MAX + 1]; - FILE *FileMail; unsigned CurrentPage; long MsgCod; // Used as parameter with message to be removed }; diff --git a/swad_syllabus.c b/swad_syllabus.c index c68e6fe4..5799104b 100644 --- a/swad_syllabus.c +++ b/swad_syllabus.c @@ -100,54 +100,77 @@ struct LstItemsSyllabus Syl_LstItemsSyllabus; /***************************** Private prototypes ****************************/ /*****************************************************************************/ -static void Syl_SetSyllabusTypeFromAction (void); -static void Syl_ShowSyllabus (bool PutIconToEdit); -static void Syl_ShowRowSyllabus (unsigned NumItem, +static unsigned Syl_GetParamItemNumber (void); + +static void Syl_SetSyllabusTypeFromAction (struct Syl_Syllabus *Syllabus); +static void Syl_ShowSyllabus (struct Syl_Syllabus *Syllabus, + bool PutIconToEdit); +static void Syl_ShowRowSyllabus (struct Syl_Syllabus *Syllabus,unsigned NumItem, int Level,int *CodItem,const char *Text,bool NewItem); -static void Syl_PutFormItemSyllabus (bool NewItem,unsigned NumItem,int Level,int *CodItem,const char *Text); +static void Syl_PutFormItemSyllabus (struct Syl_Syllabus *Syllabus, + bool NewItem,unsigned NumItem,int Level,int *CodItem,const char *Text); static void Syl_PutParamNumItem (void *ParamNumItem); static void Syl_WriteNumItem (char *StrDst,FILE *FileTgt,int Level,int *CodItem); +static void Syl_ChangePlaceItemSyllabus (Syl_ChangePosItem_t UpOrDownPos); +static void Syl_ChangeLevelItemSyllabus (Syl_ChangeLevelItem_t IncreaseOrDecreaseLevel); + +static void Syl_OpenSyllabusFile (const struct Syl_Syllabus *Syllabus, + char *PathFile); + +/*****************************************************************************/ +/************************** Reset syllabus context ***************************/ +/*****************************************************************************/ + +void Syl_ResetSyllabus (struct Syl_Syllabus *Syllabus) + { + Syllabus->PathDir[0] = '\0'; + Syllabus->NumItem = 0; + Syllabus->EditionIsActive = false; + Syllabus->WhichSyllabus = Syl_DEFAULT_WHICH_SYLLABUS; + } + /*****************************************************************************/ /************* Get parameter about which syllabus I want to see **************/ /*****************************************************************************/ -void Syl_GetParamWhichSyllabus (void) +Syl_WhichSyllabus_t Syl_GetParamWhichSyllabus (void) { /***** Get which syllabus I want to see *****/ - Gbl.Syllabus.WhichSyllabus = (Syl_WhichSyllabus_t) - Par_GetParToUnsignedLong ("WhichSyllabus", - 0, - Syl_NUM_WHICH_SYLLABUS - 1, - (unsigned long) Syl_DEFAULT_WHICH_SYLLABUS); + return (Syl_WhichSyllabus_t) + Par_GetParToUnsignedLong ("WhichSyllabus", + 0, + Syl_NUM_WHICH_SYLLABUS - 1, + (unsigned long) Syl_DEFAULT_WHICH_SYLLABUS); } /*****************************************************************************/ /************************ Write form to select syllabus **********************/ /*****************************************************************************/ -void Syl_PutFormWhichSyllabus (void) +void Syl_PutFormWhichSyllabus (Syl_WhichSyllabus_t SyllabusSelected) { extern const char *Txt_SYLLABUS_WHICH_SYLLABUS[Syl_NUM_WHICH_SYLLABUS]; - Syl_WhichSyllabus_t WhichSyllabus; + Syl_WhichSyllabus_t WhichSyl; /***** Form to select which syllabus I want to see (lectures/practicals) *****/ Frm_StartForm (ActSeeSyl); HTM_DIV_Begin ("class=\"CM\""); HTM_UL_Begin ("class=\"LIST_LEFT\""); - for (WhichSyllabus = (Syl_WhichSyllabus_t) 0; - WhichSyllabus <= (Syl_WhichSyllabus_t) (For_NUM_FORUM_SETS - 1); - WhichSyllabus++) + for (WhichSyl = (Syl_WhichSyllabus_t) 0; + WhichSyl <= (Syl_WhichSyllabus_t) (For_NUM_FORUM_SETS - 1); + WhichSyl++) { HTM_LI_Begin ("class=\"DAT LM\""); HTM_LABEL_Begin (NULL); HTM_INPUT_RADIO ("WhichSyllabus",true, "value=\"%u\"%s", - (unsigned) WhichSyllabus, - WhichSyllabus == Gbl.Syllabus.WhichSyllabus ? " checked=\"checked\"" : ""); - HTM_Txt (Txt_SYLLABUS_WHICH_SYLLABUS[WhichSyllabus]); + (unsigned) WhichSyl, + WhichSyl == SyllabusSelected ? " checked=\"checked\"" : + ""); + HTM_Txt (Txt_SYLLABUS_WHICH_SYLLABUS[WhichSyl]); HTM_LABEL_End (); HTM_LI_End (); } @@ -160,13 +183,12 @@ void Syl_PutFormWhichSyllabus (void) /************ Get parameter item number in edition of syllabus ***************/ /*****************************************************************************/ -void Syl_GetParamItemNumber (void) +static unsigned Syl_GetParamItemNumber (void) { - Gbl.Syllabus.NumItem = (unsigned) - Par_GetParToUnsignedLong ("NumI", - 0, - UINT_MAX, - 0); + return (unsigned) Par_GetParToUnsignedLong ("NumI", + 0, + UINT_MAX, + 0); } /*****************************************************************************/ @@ -174,25 +196,12 @@ void Syl_GetParamItemNumber (void) /*****************************************************************************/ // Return true if info available -bool Syl_CheckSyllabus (long CrsCod,Inf_InfoType_t InfoType) +bool Syl_CheckSyllabus (struct Syl_Syllabus *Syllabus,long CrsCod) { bool InfoAvailable; - /***** Set syllabus type *****/ - switch (InfoType) - { - case Inf_LECTURES: - Gbl.Syllabus.WhichSyllabus = Syl_LECTURES; - break; - case Inf_PRACTICALS: - Gbl.Syllabus.WhichSyllabus = Syl_PRACTICALS; - break; - default: - return false; - } - /***** Load syllabus from XML file to memory *****/ - Syl_LoadListItemsSyllabusIntoMemory (CrsCod); + Syl_LoadListItemsSyllabusIntoMemory (Syllabus,CrsCod); /***** Number of items > 0 ==> info available *****/ InfoAvailable = (Syl_LstItemsSyllabus.NumItems != 0); @@ -208,7 +217,7 @@ bool Syl_CheckSyllabus (long CrsCod,Inf_InfoType_t InfoType) /*****************************************************************************/ // Return true if info available -bool Syl_CheckAndEditSyllabus (void) +bool Syl_CheckAndEditSyllabus (struct Syl_Syllabus *Syllabus) { extern const Act_Action_t Inf_ActionsSeeInfo[Inf_NUM_INFO_TYPES]; extern const char *Txt_Done; @@ -216,25 +225,25 @@ bool Syl_CheckAndEditSyllabus (void) bool PutIconToEdit; /***** Set syllabus type depending on current action *****/ - Syl_SetSyllabusTypeFromAction (); + Syl_SetSyllabusTypeFromAction (Syllabus); /***** Load syllabus from XML file to memory *****/ - Syl_LoadListItemsSyllabusIntoMemory (Gbl.Hierarchy.Crs.CrsCod); + Syl_LoadListItemsSyllabusIntoMemory (Syllabus,Gbl.Hierarchy.Crs.CrsCod); if (Gbl.Action.Act == ActEditorSylLec || Gbl.Action.Act == ActEditorSylPra) - Gbl.Syllabus.EditionIsActive = true; + Syllabus->EditionIsActive = true; - if (Gbl.Syllabus.EditionIsActive || Syl_LstItemsSyllabus.NumItems) + if (Syllabus->EditionIsActive || Syl_LstItemsSyllabus.NumItems) { ICanEdit = Gbl.Usrs.Me.Role.Logged == Rol_TCH || Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM; - PutIconToEdit = ICanEdit && !Gbl.Syllabus.EditionIsActive; + PutIconToEdit = ICanEdit && !Syllabus->EditionIsActive; /***** Write the current syllabus *****/ - Syl_ShowSyllabus (PutIconToEdit); + Syl_ShowSyllabus (Syllabus,PutIconToEdit); - if (Gbl.Syllabus.EditionIsActive) + if (Syllabus->EditionIsActive) { /***** Button to view *****/ Frm_StartForm (Inf_ActionsSeeInfo[Gbl.Crs.Info.Type]); @@ -258,14 +267,20 @@ bool Syl_CheckAndEditSyllabus (void) void Syl_EditSyllabus (void) { - (void) Syl_CheckAndEditSyllabus (); + struct Syl_Syllabus Syllabus; + + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + + /***** Edit syllabus *****/ + (void) Syl_CheckAndEditSyllabus (&Syllabus); } /*****************************************************************************/ /************* Set syllabus type depending on the current action *************/ /*****************************************************************************/ -static void Syl_SetSyllabusTypeFromAction (void) +static void Syl_SetSyllabusTypeFromAction (struct Syl_Syllabus *Syllabus) { Gbl.Crs.Info.Type = Inf_LECTURES; @@ -273,8 +288,8 @@ static void Syl_SetSyllabusTypeFromAction (void) switch (Gbl.Action.Act) { case ActSeeSyl: - Gbl.Crs.Info.Type = (Gbl.Syllabus.WhichSyllabus == Syl_LECTURES ? Inf_LECTURES : - Inf_PRACTICALS); + Gbl.Crs.Info.Type = (Syllabus->WhichSyllabus == Syl_LECTURES ? Inf_LECTURES : + Inf_PRACTICALS); break; case ActSeeSylLec: case ActEdiSylLec: @@ -295,7 +310,7 @@ static void Syl_SetSyllabusTypeFromAction (void) case ActRchTxtEdiSylLec: case ActRcvPlaTxtSylLec: case ActRcvRchTxtSylLec: - Gbl.Syllabus.WhichSyllabus = Syl_LECTURES; + Syllabus->WhichSyllabus = Syl_LECTURES; Gbl.Crs.Info.Type = Inf_LECTURES; break; case ActSeeSylPra: @@ -317,7 +332,7 @@ static void Syl_SetSyllabusTypeFromAction (void) case ActRchTxtEdiSylPra: case ActRcvPlaTxtSylPra: case ActRcvRchTxtSylPra: - Gbl.Syllabus.WhichSyllabus = Syl_PRACTICALS; + Syllabus->WhichSyllabus = Syl_PRACTICALS; Gbl.Crs.Info.Type = Inf_PRACTICALS; break; default: @@ -330,7 +345,8 @@ static void Syl_SetSyllabusTypeFromAction (void) /*** Read from XML and load in memory a syllabus of lectures or practicals ***/ /*****************************************************************************/ -void Syl_LoadListItemsSyllabusIntoMemory (long CrsCod) +void Syl_LoadListItemsSyllabusIntoMemory (struct Syl_Syllabus *Syllabus, + long CrsCod) { char PathFile[PATH_MAX + 1]; long PostBeginList; @@ -341,14 +357,14 @@ void Syl_LoadListItemsSyllabusIntoMemory (long CrsCod) unsigned NumItemsWithChildren = 0; /* Path of the private directory for the XML file with the syllabus */ - snprintf (Gbl.Syllabus.PathDir,sizeof (Gbl.Syllabus.PathDir), + snprintf (Syllabus->PathDir,sizeof (Syllabus->PathDir), "%s/%ld/%s", Cfg_PATH_CRS_PRIVATE,CrsCod, - Gbl.Syllabus.WhichSyllabus == Syl_LECTURES ? Cfg_SYLLABUS_FOLDER_LECTURES : - Cfg_SYLLABUS_FOLDER_PRACTICALS); + Syllabus->WhichSyllabus == Syl_LECTURES ? Cfg_SYLLABUS_FOLDER_LECTURES : + Cfg_SYLLABUS_FOLDER_PRACTICALS); /***** Open the file with the syllabus *****/ - Syl_OpenSyllabusFile (Gbl.Syllabus.PathDir,PathFile); + Syl_OpenSyllabusFile (Syllabus,PathFile); /***** Go to the start of the list of items *****/ if (!Str_FindStrInFile (Gbl.F.XML,"",Str_NO_SKIP_HTML_COMMENTS)) @@ -363,7 +379,8 @@ void Syl_LoadListItemsSyllabusIntoMemory (long CrsCod) Syl_LstItemsSyllabus.NumItems++); /***** Allocate memory for the list of items *****/ - if ((Syl_LstItemsSyllabus.Lst = (struct ItemSyllabus *) calloc (Syl_LstItemsSyllabus.NumItems + 1,sizeof (struct ItemSyllabus))) == NULL) + if ((Syl_LstItemsSyllabus.Lst = (struct ItemSyllabus *) calloc (Syl_LstItemsSyllabus.NumItems + 1, + sizeof (struct ItemSyllabus))) == NULL) Lay_NotEnoughMemoryExit (); /***** Return to the start of the list *****/ @@ -495,15 +512,16 @@ int Syl_ReadLevelItemSyllabus (void) /***************** Show a syllabus of lectures or practicals *****************/ /*****************************************************************************/ -static void Syl_ShowSyllabus (bool PutIconToEdit) +static void Syl_ShowSyllabus (struct Syl_Syllabus *Syllabus, + bool PutIconToEdit) { extern const char *Txt_INFO_TITLE[Inf_NUM_INFO_TYPES]; extern const char *Hlp_COURSE_Syllabus_edit; extern const char *Hlp_COURSE_Syllabus; unsigned NumItem; int i; - int NumButtons = Gbl.Syllabus.EditionIsActive ? 5 : - 0; + int NumButtons = Syllabus->EditionIsActive ? 5 : + 0; bool ShowRowInsertNewItem = (Gbl.Action.Act == ActInsIteSylLec || Gbl.Action.Act == ActInsIteSylPra || Gbl.Action.Act == ActModIteSylLec || Gbl.Action.Act == ActModIteSylPra || Gbl.Action.Act == ActRgtIteSylLec || Gbl.Action.Act == ActRgtIteSylPra || @@ -513,14 +531,14 @@ static void Syl_ShowSyllabus (bool PutIconToEdit) if (PutIconToEdit) Box_BoxTableBegin (NULL,Txt_INFO_TITLE[Gbl.Crs.Info.Type], Inf_PutIconToEditInfo,&Gbl.Crs.Info.Type, - Gbl.Syllabus.EditionIsActive ? Hlp_COURSE_Syllabus_edit : - Hlp_COURSE_Syllabus, + Syllabus->EditionIsActive ? Hlp_COURSE_Syllabus_edit : + Hlp_COURSE_Syllabus, Box_NOT_CLOSABLE,0); else Box_BoxTableBegin (NULL,Txt_INFO_TITLE[Gbl.Crs.Info.Type], NULL,NULL, - Gbl.Syllabus.EditionIsActive ? Hlp_COURSE_Syllabus_edit : - Hlp_COURSE_Syllabus, + Syllabus->EditionIsActive ? Hlp_COURSE_Syllabus_edit : + Hlp_COURSE_Syllabus, Box_NOT_CLOSABLE,0); /***** Set width of columns of the table *****/ @@ -542,20 +560,21 @@ static void Syl_ShowSyllabus (bool PutIconToEdit) NumItem < Syl_LstItemsSyllabus.NumItems; NumItem++) { - Syl_ShowRowSyllabus (NumItem, + Syl_ShowRowSyllabus (Syllabus,NumItem, Syl_LstItemsSyllabus.Lst[NumItem].Level, Syl_LstItemsSyllabus.Lst[NumItem].CodItem, Syl_LstItemsSyllabus.Lst[NumItem].Text,false); - if (ShowRowInsertNewItem && NumItem == Gbl.Syllabus.NumItem) + if (ShowRowInsertNewItem && NumItem == Syllabus->NumItem) // Mostrar a new row where se puede insert a new item - Syl_ShowRowSyllabus (NumItem + 1, + Syl_ShowRowSyllabus (Syllabus,NumItem + 1, Syl_LstItemsSyllabus.Lst[NumItem].Level,NULL, "",true); } - else if (Gbl.Syllabus.EditionIsActive) + else if (Syllabus->EditionIsActive) /***** If the syllabus is empty ==> show form to add a iten to the end *****/ - Syl_ShowRowSyllabus (0,1,Syl_LstItemsSyllabus.Lst[0].CodItem,"",true); + Syl_ShowRowSyllabus (Syllabus,0, + 1,Syl_LstItemsSyllabus.Lst[0].CodItem,"",true); /***** End table *****/ HTM_TABLE_End (); @@ -565,7 +584,7 @@ static void Syl_ShowSyllabus (bool PutIconToEdit) /******** Write a row (item) of a syllabus of lectures or practicals *********/ /*****************************************************************************/ -static void Syl_ShowRowSyllabus (unsigned NumItem, +static void Syl_ShowRowSyllabus (struct Syl_Syllabus *Syllabus,unsigned NumItem, int Level,int *CodItem,const char *Text,bool NewItem) { extern const char *Txt_Move_up_X_and_its_subsections; @@ -583,7 +602,7 @@ static void Syl_ShowRowSyllabus (unsigned NumItem, Subtree.ToGetDown.Ini = Subtree.ToGetDown.End = 0; Subtree.MovAllowed = false; - Gbl.Syllabus.ParamNumItem = NumItem; // Used as parameter in forms + Syllabus->ParamNumItem = NumItem; // Used as parameter in forms if (!NewItem) // If the item is new (not stored in file), it has no number Syl_WriteNumItem (StrItemCod,NULL,Level,CodItem); @@ -591,7 +610,7 @@ static void Syl_ShowRowSyllabus (unsigned NumItem, /***** Start the row *****/ HTM_TR_Begin (NULL); - if (Gbl.Syllabus.EditionIsActive) + if (Syllabus->EditionIsActive) { if (NewItem) { @@ -608,7 +627,7 @@ static void Syl_ShowRowSyllabus (unsigned NumItem, { Frm_StartForm (Gbl.Crs.Info.Type == Inf_LECTURES ? ActDelItmSylLec : ActDelItmSylPra); - Syl_PutParamNumItem (&Gbl.Syllabus.ParamNumItem); + Syl_PutParamNumItem (&Syllabus->ParamNumItem); Ico_PutIconRemove (); Frm_EndForm (); } @@ -622,7 +641,7 @@ static void Syl_ShowRowSyllabus (unsigned NumItem, Lay_PutContextualLinkOnlyIcon (Gbl.Crs.Info.Type == Inf_LECTURES ? ActUp_IteSylLec : ActUp_IteSylPra, NULL, - Syl_PutParamNumItem,&Gbl.Syllabus.ParamNumItem, + Syl_PutParamNumItem,&Syllabus->ParamNumItem, "arrow-up.svg", Str_BuildStringStr (Syl_LstItemsSyllabus.Lst[NumItem].HasChildren ? Txt_Move_up_X_and_its_subsections : Txt_Move_up_X, @@ -641,7 +660,7 @@ static void Syl_ShowRowSyllabus (unsigned NumItem, Lay_PutContextualLinkOnlyIcon (Gbl.Crs.Info.Type == Inf_LECTURES ? ActDwnIteSylLec : ActDwnIteSylPra, NULL, - Syl_PutParamNumItem,&Gbl.Syllabus.ParamNumItem, + Syl_PutParamNumItem,&Syllabus->ParamNumItem, "arrow-down.svg", Str_BuildStringStr (Syl_LstItemsSyllabus.Lst[NumItem].HasChildren ? Txt_Move_down_X_and_its_subsections : Txt_Move_down_X, @@ -659,7 +678,7 @@ static void Syl_ShowRowSyllabus (unsigned NumItem, Lay_PutContextualLinkOnlyIcon (Gbl.Crs.Info.Type == Inf_LECTURES ? ActRgtIteSylLec : ActRgtIteSylPra, NULL, - Syl_PutParamNumItem,&Gbl.Syllabus.ParamNumItem, + Syl_PutParamNumItem,&Syllabus->ParamNumItem, "arrow-left.svg", Str_BuildStringStr (Txt_Increase_level_of_X, StrItemCod)); @@ -677,7 +696,7 @@ static void Syl_ShowRowSyllabus (unsigned NumItem, Lay_PutContextualLinkOnlyIcon (Gbl.Crs.Info.Type == Inf_LECTURES ? ActLftIteSylLec : ActLftIteSylPra, NULL, - Syl_PutParamNumItem,&Gbl.Syllabus.ParamNumItem, + Syl_PutParamNumItem,&Syllabus->ParamNumItem, "arrow-right.svg", Str_BuildStringStr (Txt_Decrease_level_of_X, StrItemCod)); @@ -691,8 +710,8 @@ static void Syl_ShowRowSyllabus (unsigned NumItem, } } - if (Gbl.Syllabus.EditionIsActive) - Syl_PutFormItemSyllabus (NewItem,NumItem,Level,CodItem,Text); + if (Syllabus->EditionIsActive) + Syl_PutFormItemSyllabus (Syllabus,NewItem,NumItem,Level,CodItem,Text); else { /***** Indent depending on the level *****/ @@ -796,7 +815,8 @@ void Syl_WriteSyllabusIntoHTMLTmpFile (FILE *FileHTMLTmp) /*************** Show a form to modify an item of the syllabus ***************/ /*****************************************************************************/ -static void Syl_PutFormItemSyllabus (bool NewItem,unsigned NumItem,int Level,int *CodItem,const char *Text) +static void Syl_PutFormItemSyllabus (struct Syl_Syllabus *Syllabus, + bool NewItem,unsigned NumItem,int Level,int *CodItem,const char *Text) { extern const char *Txt_Enter_a_new_item_here; @@ -836,8 +856,8 @@ static void Syl_PutFormItemSyllabus (bool NewItem,unsigned NumItem,int Level,int ActInsIteSylPra) : (Gbl.Crs.Info.Type == Inf_LECTURES ? ActModIteSylLec : ActModIteSylPra)); - Gbl.Syllabus.ParamNumItem = NumItem; - Syl_PutParamNumItem (&Gbl.Syllabus.ParamNumItem); + Syllabus->ParamNumItem = NumItem; + Syl_PutParamNumItem (&Syllabus->ParamNumItem); HTM_INPUT_TEXT ("Txt",Syl_MAX_CHARS_TEXT_ITEM,Text,true, "size=\"60\" placeholder=\"%s\"%s", Txt_Enter_a_new_item_here, @@ -898,25 +918,29 @@ static void Syl_WriteNumItem (char *StrDst,FILE *FileTgt,int Level,int *CodItem) void Syl_RemoveItemSyllabus (void) { + struct Syl_Syllabus Syllabus; char PathFile[PATH_MAX + 1]; char PathOldFile[PATH_MAX + 1]; char PathNewFile[PATH_MAX + 1]; FILE *NewFile; unsigned NumItem; + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Set syllabus type depending on current action *****/ - Syl_SetSyllabusTypeFromAction (); + Syl_SetSyllabusTypeFromAction (&Syllabus); /***** Load syllabus from XML file to memory *****/ - Syl_LoadListItemsSyllabusIntoMemory (Gbl.Hierarchy.Crs.CrsCod); + Syl_LoadListItemsSyllabusIntoMemory (&Syllabus,Gbl.Hierarchy.Crs.CrsCod); - Gbl.Syllabus.EditionIsActive = true; + Syllabus.EditionIsActive = true; /***** Get item number *****/ - Syl_GetParamItemNumber (); + Syllabus.NumItem = Syl_GetParamItemNumber (); /***** Create a new file to make the update *****/ - Syl_BuildPathFileSyllabus (PathFile); + Syl_BuildPathFileSyllabus (&Syllabus,PathFile); Fil_CreateUpdateFile (PathFile,".old",PathOldFile,PathNewFile,&NewFile); /***** Create the new XML file *****/ @@ -924,7 +948,7 @@ void Syl_RemoveItemSyllabus (void) for (NumItem = 0; NumItem < Syl_LstItemsSyllabus.NumItems; NumItem++) - if (NumItem != Gbl.Syllabus.NumItem) + if (NumItem != Syllabus.NumItem) Syl_WriteItemFileSyllabus (NewFile,Syl_LstItemsSyllabus.Lst[NumItem].Level,Syl_LstItemsSyllabus.Lst[NumItem].Text); Syl_WriteEndFileSyllabus (NewFile); @@ -934,7 +958,7 @@ void Syl_RemoveItemSyllabus (void) /***** We are editing a syllabus with the internal editor, so change info source to internal editor in database *****/ Inf_SetInfoSrcIntoDB (Syl_LstItemsSyllabus.NumItems ? Inf_INFO_SRC_EDITOR : - Inf_INFO_SRC_NONE); + Inf_INFO_SRC_NONE); /***** Show the updated syllabus to continue editing it *****/ Syl_FreeListItemsSyllabus (); @@ -963,8 +987,9 @@ void Syl_DownItemSyllabus (void) /*************** Get up or get down a subtree of a syllabus ******************/ /*****************************************************************************/ -void Syl_ChangePlaceItemSyllabus (Syl_ChangePosItem_t UpOrDownPos) +static void Syl_ChangePlaceItemSyllabus (Syl_ChangePosItem_t UpOrDownPos) { + struct Syl_Syllabus Syllabus; char PathFile[PATH_MAX + 1]; char PathOldFile[PATH_MAX + 1]; char PathNewFile[PATH_MAX + 1]; @@ -972,35 +997,38 @@ void Syl_ChangePlaceItemSyllabus (Syl_ChangePosItem_t UpOrDownPos) unsigned NumItem; struct MoveSubtrees Subtree; + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Set syllabus type depending on current action *****/ - Syl_SetSyllabusTypeFromAction (); + Syl_SetSyllabusTypeFromAction (&Syllabus); /***** Load syllabus from XML file to memory *****/ - Syl_LoadListItemsSyllabusIntoMemory (Gbl.Hierarchy.Crs.CrsCod); + Syl_LoadListItemsSyllabusIntoMemory (&Syllabus,Gbl.Hierarchy.Crs.CrsCod); - Gbl.Syllabus.EditionIsActive = true; + Syllabus.EditionIsActive = true; /***** Get item number *****/ - Syl_GetParamItemNumber (); + Syllabus.NumItem = Syl_GetParamItemNumber (); Subtree.ToGetUp.Ini = Subtree.ToGetUp.End = 0; Subtree.ToGetDown.Ini = Subtree.ToGetDown.End = 0; Subtree.MovAllowed = false; - if (Gbl.Syllabus.NumItem < Syl_LstItemsSyllabus.NumItems) + if (Syllabus.NumItem < Syl_LstItemsSyllabus.NumItems) { /***** Create a new file where make the update *****/ - Syl_BuildPathFileSyllabus (PathFile); + Syl_BuildPathFileSyllabus (&Syllabus,PathFile); Fil_CreateUpdateFile (PathFile,".old",PathOldFile,PathNewFile,&NewFile); /***** Get up or get down position *****/ switch (UpOrDownPos) { case Syl_GET_UP: - Syl_CalculateUpSubtreeSyllabus (&Subtree,Gbl.Syllabus.NumItem); + Syl_CalculateUpSubtreeSyllabus (&Subtree,Syllabus.NumItem); break; case Syl_GET_DOWN: - Syl_CalculateDownSubtreeSyllabus (&Subtree,Gbl.Syllabus.NumItem); + Syl_CalculateDownSubtreeSyllabus (&Subtree,Syllabus.NumItem); break; } @@ -1036,7 +1064,7 @@ void Syl_ChangePlaceItemSyllabus (Syl_ChangePosItem_t UpOrDownPos) /***** We are editing a syllabus with the internal editor, so change info source to internal editor in database *****/ Inf_SetInfoSrcIntoDB (Syl_LstItemsSyllabus.NumItems ? Inf_INFO_SRC_EDITOR : - Inf_INFO_SRC_NONE); + Inf_INFO_SRC_NONE); /***** Show the updated syllabus to continue editing it *****/ Syl_FreeListItemsSyllabus (); @@ -1155,38 +1183,42 @@ void Syl_LeftItemSyllabus (void) /********* Increase or decrease the level of an item of a syllabus ***********/ /*****************************************************************************/ -void Syl_ChangeLevelItemSyllabus (Syl_ChangeLevelItem_t IncreaseOrDecreaseLevel) +static void Syl_ChangeLevelItemSyllabus (Syl_ChangeLevelItem_t IncreaseOrDecreaseLevel) { + struct Syl_Syllabus Syllabus; char PathFile[PATH_MAX + 1]; char PathOldFile[PATH_MAX + 1]; char PathNewFile[PATH_MAX + 1]; FILE *NewFile; + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Set syllabus type depending on current action *****/ - Syl_SetSyllabusTypeFromAction (); + Syl_SetSyllabusTypeFromAction (&Syllabus); /***** Load syllabus from XML file to memory *****/ - Syl_LoadListItemsSyllabusIntoMemory (Gbl.Hierarchy.Crs.CrsCod); + Syl_LoadListItemsSyllabusIntoMemory (&Syllabus,Gbl.Hierarchy.Crs.CrsCod); - Gbl.Syllabus.EditionIsActive = true; + Syllabus.EditionIsActive = true; /***** Get item number *****/ - Syl_GetParamItemNumber (); + Syllabus.NumItem = Syl_GetParamItemNumber (); /***** Create a new file to do the update *****/ - Syl_BuildPathFileSyllabus (PathFile); + Syl_BuildPathFileSyllabus (&Syllabus,PathFile); Fil_CreateUpdateFile (PathFile,".old",PathOldFile,PathNewFile,&NewFile); /***** Increase or decrease level *****/ switch (IncreaseOrDecreaseLevel) { case Syl_INCREASE_LEVEL: - if (Syl_LstItemsSyllabus.Lst[Gbl.Syllabus.NumItem].Level > 1) - Syl_LstItemsSyllabus.Lst[Gbl.Syllabus.NumItem].Level--; + if (Syl_LstItemsSyllabus.Lst[Syllabus.NumItem].Level > 1) + Syl_LstItemsSyllabus.Lst[Syllabus.NumItem].Level--; break; case Syl_DECREASE_LEVEL: - if (Syl_LstItemsSyllabus.Lst[Gbl.Syllabus.NumItem].Level < Syl_MAX_LEVELS_SYLLABUS) - Syl_LstItemsSyllabus.Lst[Gbl.Syllabus.NumItem].Level++; + if (Syl_LstItemsSyllabus.Lst[Syllabus.NumItem].Level < Syl_MAX_LEVELS_SYLLABUS) + Syl_LstItemsSyllabus.Lst[Syllabus.NumItem].Level++; break; } @@ -1201,7 +1233,7 @@ void Syl_ChangeLevelItemSyllabus (Syl_ChangeLevelItem_t IncreaseOrDecreaseLevel) /***** We are editing a syllabus with the internal editor, so change info source to internal editor in database *****/ Inf_SetInfoSrcIntoDB (Syl_LstItemsSyllabus.NumItems ? Inf_INFO_SRC_EDITOR : - Inf_INFO_SRC_NONE); + Inf_INFO_SRC_NONE); /***** Show the updated syllabus to continue editing it *****/ Syl_FreeListItemsSyllabus (); @@ -1214,6 +1246,7 @@ void Syl_ChangeLevelItemSyllabus (Syl_ChangeLevelItem_t IncreaseOrDecreaseLevel) void Syl_InsertItemSyllabus (void) { + struct Syl_Syllabus Syllabus; char PathFile[PATH_MAX + 1]; char PathOldFile[PATH_MAX + 1]; char PathNewFile[PATH_MAX + 1]; @@ -1221,22 +1254,25 @@ void Syl_InsertItemSyllabus (void) unsigned NumItem; char Txt[Syl_MAX_BYTES_TEXT_ITEM + 1]; + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Set syllabus type depending on current action *****/ - Syl_SetSyllabusTypeFromAction (); + Syl_SetSyllabusTypeFromAction (&Syllabus); /***** Load syllabus from XML file to memory *****/ - Syl_LoadListItemsSyllabusIntoMemory (Gbl.Hierarchy.Crs.CrsCod); + Syl_LoadListItemsSyllabusIntoMemory (&Syllabus,Gbl.Hierarchy.Crs.CrsCod); - Gbl.Syllabus.EditionIsActive = true; + Syllabus.EditionIsActive = true; /***** Get item number *****/ - Syl_GetParamItemNumber (); + Syllabus.NumItem = Syl_GetParamItemNumber (); /***** Get item body *****/ Par_GetParToHTML ("Txt",Txt,Syl_MAX_BYTES_TEXT_ITEM); /***** Create a new file to do the update *****/ - Syl_BuildPathFileSyllabus (PathFile); + Syl_BuildPathFileSyllabus (&Syllabus,PathFile); Fil_CreateUpdateFile (PathFile,".old",PathOldFile,PathNewFile,&NewFile); /***** Create the new XML file *****/ @@ -1244,7 +1280,7 @@ void Syl_InsertItemSyllabus (void) /* Write items before the one to be inserted */ for (NumItem = 0; - NumItem < Gbl.Syllabus.NumItem; + NumItem < Syllabus.NumItem; NumItem++) Syl_WriteItemFileSyllabus (NewFile,Syl_LstItemsSyllabus.Lst[NumItem].Level,Syl_LstItemsSyllabus.Lst[NumItem].Text); @@ -1268,7 +1304,7 @@ void Syl_InsertItemSyllabus (void) /***** We are editing a syllabus with the internal editor, so change info source to internal editor in database *****/ Inf_SetInfoSrcIntoDB (Syl_LstItemsSyllabus.NumItems ? Inf_INFO_SRC_EDITOR : - Inf_INFO_SRC_NONE); + Inf_INFO_SRC_NONE); /***** Show the updated syllabus to continue editing it *****/ Syl_FreeListItemsSyllabus (); @@ -1281,28 +1317,32 @@ void Syl_InsertItemSyllabus (void) void Syl_ModifyItemSyllabus (void) { + struct Syl_Syllabus Syllabus; char PathFile[PATH_MAX + 1]; char PathOldFile[PATH_MAX + 1]; char PathNewFile[PATH_MAX + 1]; FILE *NewFile; + /***** Reset syllabus context *****/ + Syl_ResetSyllabus (&Syllabus); + /***** Set syllabus type depending on current action *****/ - Syl_SetSyllabusTypeFromAction (); + Syl_SetSyllabusTypeFromAction (&Syllabus); /***** Load syllabus from XML file to memory *****/ - Syl_LoadListItemsSyllabusIntoMemory (Gbl.Hierarchy.Crs.CrsCod); + Syl_LoadListItemsSyllabusIntoMemory (&Syllabus,Gbl.Hierarchy.Crs.CrsCod); - Gbl.Syllabus.EditionIsActive = true; + Syllabus.EditionIsActive = true; /***** Get item number *****/ - Syl_GetParamItemNumber (); + Syllabus.NumItem = Syl_GetParamItemNumber (); /***** Get item body *****/ - Par_GetParToHTML ("Txt",Syl_LstItemsSyllabus.Lst[Gbl.Syllabus.NumItem].Text, + Par_GetParToHTML ("Txt",Syl_LstItemsSyllabus.Lst[Syllabus.NumItem].Text, Syl_MAX_BYTES_TEXT_ITEM); /***** Create a new file where make the update *****/ - Syl_BuildPathFileSyllabus (PathFile); + Syl_BuildPathFileSyllabus (&Syllabus,PathFile); Fil_CreateUpdateFile (PathFile,".old",PathOldFile,PathNewFile,&NewFile); /***** Create the new XML file *****/ @@ -1316,7 +1356,7 @@ void Syl_ModifyItemSyllabus (void) /***** We are editing a syllabus with the internal editor, so change info source to internal editor in database *****/ Inf_SetInfoSrcIntoDB (Syl_LstItemsSyllabus.NumItems ? Inf_INFO_SRC_EDITOR : - Inf_INFO_SRC_NONE); + Inf_INFO_SRC_NONE); /***** Show the updated syllabus to continue editing it *****/ Syl_FreeListItemsSyllabus (); @@ -1327,13 +1367,14 @@ void Syl_ModifyItemSyllabus (void) /************ Build the path of the file XML with the syllabus ***************/ /*****************************************************************************/ -void Syl_BuildPathFileSyllabus (char *PathFile) +void Syl_BuildPathFileSyllabus (const struct Syl_Syllabus *Syllabus, + char *PathFile) { char Path[PATH_MAX + 1 + NAME_MAX + 1]; snprintf (Path,sizeof (Path), "%s/%s", - Gbl.Syllabus.PathDir,Cfg_SYLLABUS_FILENAME); + Syllabus->PathDir,Cfg_SYLLABUS_FILENAME); Str_Copy (PathFile,Path, PATH_MAX); } @@ -1342,19 +1383,20 @@ void Syl_BuildPathFileSyllabus (char *PathFile) /*********************** Open file with the syllabus *************************/ /*****************************************************************************/ -void Syl_OpenSyllabusFile (const char *PathDir,char *PathFile) +static void Syl_OpenSyllabusFile (const struct Syl_Syllabus *Syllabus, + char *PathFile) { if (Gbl.F.XML == NULL) // If it's not open in this moment... { /* If the directory does not exist, create it */ - Fil_CreateDirIfNotExists (PathDir); + Fil_CreateDirIfNotExists (Syllabus->PathDir); /* Open the file for reading */ - Syl_BuildPathFileSyllabus (PathFile); + Syl_BuildPathFileSyllabus (Syllabus,PathFile); if ((Gbl.F.XML = fopen (PathFile,"rb")) == NULL) { /* Can't open the file */ - if (!Fil_CheckIfPathExists (PathDir)) // Strange error, since it is just created + if (!Fil_CheckIfPathExists (Syllabus->PathDir)) // Strange error, since it is just created Lay_ShowErrorAndExit ("Can not open syllabus file."); else { diff --git a/swad_syllabus.h b/swad_syllabus.h index 74db9743..1c452335 100644 --- a/swad_syllabus.h +++ b/swad_syllabus.h @@ -69,20 +69,30 @@ struct MoveSubtrees bool MovAllowed; }; +struct Syl_Syllabus + { + char PathDir[PATH_MAX + 1]; + unsigned NumItem; // Item being edited + unsigned ParamNumItem; // Used as parameter in forms + bool EditionIsActive; + Syl_WhichSyllabus_t WhichSyllabus; + }; + /*****************************************************************************/ /***************************** Public prototypes *****************************/ /*****************************************************************************/ -void Syl_GetParamWhichSyllabus (void); -void Syl_PutFormWhichSyllabus (void); +void Syl_ResetSyllabus (struct Syl_Syllabus *Syllabus); -void Syl_GetParamItemNumber (void); +Syl_WhichSyllabus_t Syl_GetParamWhichSyllabus (void); +void Syl_PutFormWhichSyllabus (Syl_WhichSyllabus_t SyllabusSelected); -bool Syl_CheckSyllabus (long CrsCod,Inf_InfoType_t InfoType); -bool Syl_CheckAndEditSyllabus (void); +bool Syl_CheckSyllabus (struct Syl_Syllabus *Syllabus,long CrsCod); +bool Syl_CheckAndEditSyllabus (struct Syl_Syllabus *Syllabus); void Syl_EditSyllabus (void); -void Syl_LoadListItemsSyllabusIntoMemory (long CrsCod); +void Syl_LoadListItemsSyllabusIntoMemory (struct Syl_Syllabus *Syllabus, + long CrsCod); void Syl_FreeListItemsSyllabus (void); int Syl_ReadLevelItemSyllabus (void); @@ -92,16 +102,16 @@ void Syl_WriteSyllabusIntoHTMLTmpFile (FILE *FileHTMLTmp); void Syl_RemoveItemSyllabus (void); void Syl_UpItemSyllabus (void); void Syl_DownItemSyllabus (void); -void Syl_ChangePlaceItemSyllabus (Syl_ChangePosItem_t UpOrDownPos); + void Syl_CalculateUpSubtreeSyllabus (struct MoveSubtrees *Subtree,unsigned NumItem); void Syl_CalculateDownSubtreeSyllabus (struct MoveSubtrees *Subtree,unsigned NumItem); void Syl_RightItemSyllabus (void); void Syl_LeftItemSyllabus (void); -void Syl_ChangeLevelItemSyllabus (Syl_ChangeLevelItem_t IncreaseOrDecreaseLevel); + void Syl_InsertItemSyllabus (void); void Syl_ModifyItemSyllabus (void); -void Syl_BuildPathFileSyllabus (char *PathFile); -void Syl_OpenSyllabusFile (const char *PathDir,char *PathFile); +void Syl_BuildPathFileSyllabus (const struct Syl_Syllabus *Syllabus, + char *PathFile); void Syl_WriteStartFileSyllabus (FILE *FileSyllabus); void Syl_WriteAllItemsFileSyllabus (FILE *FileSyllabus); void Syl_WriteItemFileSyllabus (FILE *FileSyllabus,int Level,const char *Text);