diff --git a/swad_action.h b/swad_action.h index 2ea5bc50..09c622f4 100644 --- a/swad_action.h +++ b/swad_action.h @@ -42,6 +42,7 @@ #define Act_MAX_CHARS_ACTION_TXT (256 - 1) // 255 #define Act_MAX_BYTES_ACTION_TXT Act_MAX_CHARS_ACTION_TXT // 255 +#define Act_NUM_CONTENTS 2 typedef enum { Act_CONT_NORM, diff --git a/swad_changelog.h b/swad_changelog.h index 10a8b214..82215cb4 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -602,13 +602,14 @@ TODO: FIX BUG, URGENT! En las fechas como par TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo. */ -#define Log_PLATFORM_VERSION "SWAD 21.56.4 (2021-11-10)" +#define Log_PLATFORM_VERSION "SWAD 21.56.5 (2021-11-10)" #define CSS_FILE "swad20.45.css" #define JS_FILE "swad20.69.1.js" /* TODO: Rename CENTRE to CENTER in help wiki. TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams + Version 21.56.5: Nov 10, 2021 Code refactoring in switch statements. (319181 lines) Version 21.56.4: Nov 10, 2021 Code refactoring in switch statements (until swad_network_database.c). (319362 lines) Version 21.56.3: Nov 10, 2021 Code refactoring in switch statements (until swad_logo.c). (319403 lines) Version 21.56.2: Nov 10, 2021 Code refactoring in pointers to text. (319501 lines) diff --git a/swad_nickname.c b/swad_nickname.c index bb368922..91a7eb55 100644 --- a/swad_nickname.c +++ b/swad_nickname.c @@ -161,12 +161,28 @@ static void Nck_ShowFormChangeUsrNickname (bool ItsMe, extern const char *Txt_New_nickname; extern const char *Txt_Change_nickname; extern const char *Txt_Save_changes; + static const struct + { + Act_Action_t Remove; + Act_Action_t Change; + } NextAction[Rol_NUM_ROLES] = + { + [Rol_UNK ] = {ActRemOldNicOth,ActChgNicOth}, + [Rol_GST ] = {ActRemOldNicOth,ActChgNicOth}, + [Rol_USR ] = {ActRemOldNicOth,ActChgNicOth}, + [Rol_STD ] = {ActRemOldNicStd,ActChgNicStd}, + [Rol_NET ] = {ActRemOldNicTch,ActChgNicTch}, + [Rol_TCH ] = {ActRemOldNicTch,ActChgNicTch}, + [Rol_DEG_ADM] = {ActRemOldNicOth,ActChgNicOth}, + [Rol_CTR_ADM] = {ActRemOldNicOth,ActChgNicOth}, + [Rol_INS_ADM] = {ActRemOldNicOth,ActChgNicOth}, + [Rol_SYS_ADM] = {ActRemOldNicOth,ActChgNicOth}, + }; MYSQL_RES *mysql_res; MYSQL_ROW row; char StrRecordWidth[Cns_MAX_DECIMAL_DIGITS_UINT + 2 + 1]; unsigned NumNicks; unsigned NumNick; - Act_Action_t NextAction; char NickWithArr[Nck_MAX_BYTES_NICK_WITH_ARROBA + 1]; const struct UsrData *UsrDat = (ItsMe ? &Gbl.Usrs.Me.UsrDat : &Gbl.Usrs.Other.UsrDat); @@ -206,11 +222,11 @@ static void Nck_ShowFormChangeUsrNickname (bool ItsMe, /* The first nickname is the current one */ HTM_TR_Begin (NULL); - /* Label */ - Frm_LabelColumn ("REC_C1_BOT RT",NULL,Txt_Current_nickname); + /* Label */ + Frm_LabelColumn ("REC_C1_BOT RT",NULL,Txt_Current_nickname); - /* Data */ - HTM_TD_Begin ("class=\"REC_C2_BOT LT USR_ID\""); + /* Data */ + HTM_TD_Begin ("class=\"REC_C2_BOT LT USR_ID\""); } else // NumNick >= 2 { @@ -218,11 +234,11 @@ static void Nck_ShowFormChangeUsrNickname (bool ItsMe, { HTM_TR_Begin (NULL); - /* Label */ - Frm_LabelColumn ("REC_C1_BOT RT",NULL,Txt_Other_nicknames); + /* Label */ + Frm_LabelColumn ("REC_C1_BOT RT",NULL,Txt_Other_nicknames); - /* Data */ - HTM_TD_Begin ("class=\"REC_C2_BOT LT DAT\""); + /* Data */ + HTM_TD_Begin ("class=\"REC_C2_BOT LT DAT\""); } /* Form to remove old nickname */ @@ -230,23 +246,8 @@ static void Nck_ShowFormChangeUsrNickname (bool ItsMe, Ico_PutContextualIconToRemove (ActRemMyNck,Nck_NICKNAME_SECTION_ID, Nck_PutParamsRemoveMyNick,row[0]); else - { - switch (UsrDat->Roles.InCurrentCrs) - { - case Rol_STD: - NextAction = ActRemOldNicStd; - break; - case Rol_NET: - case Rol_TCH: - NextAction = ActRemOldNicTch; - break; - default: // Guest, user or admin - NextAction = ActRemOldNicOth; - break; - } - Ico_PutContextualIconToRemove (NextAction,Nck_NICKNAME_SECTION_ID, + Ico_PutContextualIconToRemove (NextAction[UsrDat->Roles.InCurrentCrs].Remove,Nck_NICKNAME_SECTION_ID, Nck_PutParamsRemoveOtherNick,row[0]); - } } /* Nickname */ @@ -265,33 +266,20 @@ static void Nck_ShowFormChangeUsrNickname (bool ItsMe, Frm_BeginFormAnchor (ActChgMyNck,Nck_NICKNAME_SECTION_ID); else { - switch (UsrDat->Roles.InCurrentCrs) - { - case Rol_STD: - NextAction = ActChgNicStd; - break; - case Rol_NET: - case Rol_TCH: - NextAction = ActChgNicTch; - break; - default: // Guest, user or admin - NextAction = ActChgNicOth; - break; - } - Frm_BeginFormAnchor (NextAction,Nck_NICKNAME_SECTION_ID); + Frm_BeginFormAnchor (NextAction[UsrDat->Roles.InCurrentCrs].Change,Nck_NICKNAME_SECTION_ID); Usr_PutParamUsrCodEncrypted (UsrDat->EnUsrCod); } snprintf (NickWithArr,sizeof (NickWithArr),"@%s",row[0]); Par_PutHiddenParamString (NULL,"NewNick",NickWithArr); // Nickname - Btn_PutConfirmButtonInline (Txt_Use_this_nickname); + Btn_PutConfirmButtonInline (Txt_Use_this_nickname); Frm_EndForm (); } if (NumNick == 1 || NumNick == NumNicks) { - HTM_TD_End (); + HTM_TD_End (); HTM_TR_End (); } else @@ -304,7 +292,7 @@ static void Nck_ShowFormChangeUsrNickname (bool ItsMe, /* Label */ Frm_LabelColumn ("REC_C1_BOT RT","NewNick", NumNicks ? Txt_New_nickname : // A new nickname - Txt_Nickname); // The first nickname + Txt_Nickname); // The first nickname /* Data */ HTM_TD_Begin ("class=\"REC_C2_BOT LT DAT\""); @@ -312,20 +300,7 @@ static void Nck_ShowFormChangeUsrNickname (bool ItsMe, Frm_BeginFormAnchor (ActChgMyNck,Nck_NICKNAME_SECTION_ID); else { - switch (UsrDat->Roles.InCurrentCrs) - { - case Rol_STD: - NextAction = ActChgNicStd; - break; - case Rol_NET: - case Rol_TCH: - NextAction = ActChgNicTch; - break; - default: // Guest, user or admin - NextAction = ActChgNicOth; - break; - } - Frm_BeginFormAnchor (NextAction,Nck_NICKNAME_SECTION_ID); + Frm_BeginFormAnchor (NextAction[UsrDat->Roles.InCurrentCrs].Change,Nck_NICKNAME_SECTION_ID); Usr_PutParamUsrCodEncrypted (UsrDat->EnUsrCod); } snprintf (NickWithArr,sizeof (NickWithArr),"@%s", diff --git a/swad_notification.c b/swad_notification.c index 68d37521..e8d0e458 100644 --- a/swad_notification.c +++ b/swad_notification.c @@ -909,51 +909,27 @@ void Ntf_GetNotifSummaryAndContent (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], void Ntf_MarkNotifOneFileAsRemoved (const char *Path) { extern const Brw_FileBrowser_t Brw_DB_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER]; + static const Ntf_NotifyEvent_t NotifyEvent[Brw_NUM_TYPES_FILE_BROWSER] = + { + [Brw_ADMI_DOC_CRS] = Ntf_EVENT_DOCUMENT_FILE, + [Brw_ADMI_DOC_GRP] = Ntf_EVENT_DOCUMENT_FILE, + [Brw_ADMI_TCH_CRS] = Ntf_EVENT_TEACHERS_FILE, + [Brw_ADMI_TCH_GRP] = Ntf_EVENT_TEACHERS_FILE, + [Brw_ADMI_SHR_CRS] = Ntf_EVENT_SHARED_FILE, + [Brw_ADMI_SHR_GRP] = Ntf_EVENT_SHARED_FILE, + [Brw_ADMI_MRK_CRS] = Ntf_EVENT_MARKS_FILE, + [Brw_ADMI_MRK_GRP] = Ntf_EVENT_MARKS_FILE, + }; Brw_FileBrowser_t FileBrowser = Brw_DB_FileBrowserForDB_files[Gbl.FileBrowser.Type]; long FilCod; - Ntf_NotifyEvent_t NotifyEvent; - switch (FileBrowser) + if (NotifyEvent[FileBrowser]) { - case Brw_ADMI_DOC_CRS: - case Brw_ADMI_DOC_GRP: - case Brw_ADMI_TCH_CRS: - case Brw_ADMI_TCH_GRP: - case Brw_ADMI_SHR_CRS: - case Brw_ADMI_SHR_GRP: - case Brw_ADMI_MRK_CRS: - case Brw_ADMI_MRK_GRP: - /***** Get file code *****/ - FilCod = Brw_DB_GetFilCodByPath (Path,false); // Any file, public or not - if (FilCod > 0) - { - /***** Set notification as removed *****/ - switch (FileBrowser) - { - case Brw_ADMI_DOC_CRS: - case Brw_ADMI_DOC_GRP: - NotifyEvent = Ntf_EVENT_DOCUMENT_FILE; - break; - case Brw_ADMI_TCH_CRS: - case Brw_ADMI_TCH_GRP: - NotifyEvent = Ntf_EVENT_TEACHERS_FILE; - break; - case Brw_ADMI_SHR_CRS: - case Brw_ADMI_SHR_GRP: - NotifyEvent = Ntf_EVENT_SHARED_FILE; - break; - case Brw_ADMI_MRK_CRS: - case Brw_ADMI_MRK_GRP: - NotifyEvent = Ntf_EVENT_MARKS_FILE; - break; - default: - return; - } - Ntf_DB_MarkNotifAsRemoved (NotifyEvent,FilCod); - } - break; - default: - break; + /***** Get file code *****/ + FilCod = Brw_DB_GetFilCodByPath (Path,false); // Any file, public or not + if (FilCod > 0) + /***** Set notification as removed *****/ + Ntf_DB_MarkNotifAsRemoved (NotifyEvent[FileBrowser],FilCod); } } @@ -964,48 +940,24 @@ void Ntf_MarkNotifOneFileAsRemoved (const char *Path) void Ntf_MarkNotifChildrenOfFolderAsRemoved (const char *Path) { extern const Brw_FileBrowser_t Brw_DB_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER]; - Brw_FileBrowser_t FileBrowser = Brw_DB_FileBrowserForDB_files[Gbl.FileBrowser.Type]; - Ntf_NotifyEvent_t NotifyEvent; - - switch (FileBrowser) + static const Ntf_NotifyEvent_t NotifyEvent[Brw_NUM_TYPES_FILE_BROWSER] = { - case Brw_ADMI_DOC_CRS: - case Brw_ADMI_DOC_GRP: - case Brw_ADMI_TCH_CRS: - case Brw_ADMI_TCH_GRP: - case Brw_ADMI_SHR_CRS: - case Brw_ADMI_SHR_GRP: - case Brw_ADMI_MRK_CRS: - case Brw_ADMI_MRK_GRP: - /***** Set notification as removed *****/ - switch (FileBrowser) - { - case Brw_ADMI_DOC_CRS: - case Brw_ADMI_DOC_GRP: - NotifyEvent = Ntf_EVENT_DOCUMENT_FILE; - break; - case Brw_ADMI_TCH_CRS: - case Brw_ADMI_TCH_GRP: - NotifyEvent = Ntf_EVENT_TEACHERS_FILE; - break; - case Brw_ADMI_SHR_CRS: - case Brw_ADMI_SHR_GRP: - NotifyEvent = Ntf_EVENT_SHARED_FILE; - break; - case Brw_ADMI_MRK_CRS: - case Brw_ADMI_MRK_GRP: - NotifyEvent = Ntf_EVENT_MARKS_FILE; - break; - default: - return; - } - Ntf_DB_MarkNotifChildrenOfFolderAsRemoved (NotifyEvent,FileBrowser, - Brw_GetCodForFileBrowser (), - Path); - break; - default: - break; - } + [Brw_ADMI_DOC_CRS] = Ntf_EVENT_DOCUMENT_FILE, + [Brw_ADMI_DOC_GRP] = Ntf_EVENT_DOCUMENT_FILE, + [Brw_ADMI_TCH_CRS] = Ntf_EVENT_TEACHERS_FILE, + [Brw_ADMI_TCH_GRP] = Ntf_EVENT_TEACHERS_FILE, + [Brw_ADMI_SHR_CRS] = Ntf_EVENT_SHARED_FILE, + [Brw_ADMI_SHR_GRP] = Ntf_EVENT_SHARED_FILE, + [Brw_ADMI_MRK_CRS] = Ntf_EVENT_MARKS_FILE, + [Brw_ADMI_MRK_GRP] = Ntf_EVENT_MARKS_FILE, + }; + Brw_FileBrowser_t FileBrowser = Brw_DB_FileBrowserForDB_files[Gbl.FileBrowser.Type]; + + if (NotifyEvent[FileBrowser]) + /***** Set notification as removed *****/ + Ntf_DB_MarkNotifChildrenOfFolderAsRemoved (NotifyEvent[FileBrowser],FileBrowser, + Brw_GetCodForFileBrowser (), + Path); } /*****************************************************************************/ @@ -1016,6 +968,29 @@ void Ntf_MarkNotifChildrenOfFolderAsRemoved (const char *Path) unsigned Ntf_StoreNotifyEventsToAllUsrs (Ntf_NotifyEvent_t NotifyEvent,long Cod) { + static unsigned (*GetUsrsBrowser[Brw_NUM_TYPES_FILE_BROWSER]) (MYSQL_RES **mysql_res) = + { + // Notify all users in course except me + [Brw_ADMI_DOC_CRS] = Enr_DB_GetUsrsFromCurrentCrsExceptMe, + [Brw_ADMI_SHR_CRS] = Enr_DB_GetUsrsFromCurrentCrsExceptMe, + [Brw_ADMI_MRK_CRS] = Enr_DB_GetUsrsFromCurrentCrsExceptMe, + + // Notify all teachers in course except me + [Brw_ADMI_TCH_CRS] = Enr_DB_GetTchsFromCurrentCrsExceptMe, + + // Notify all users in group except me + [Brw_ADMI_DOC_GRP] = Grp_DB_GetUsrsFromCurrentGrpExceptMe, + [Brw_ADMI_SHR_GRP] = Grp_DB_GetUsrsFromCurrentGrpExceptMe, + [Brw_ADMI_MRK_GRP] = Grp_DB_GetUsrsFromCurrentGrpExceptMe, + + // Notify all teachers in group except me + [Brw_ADMI_TCH_GRP] = Grp_DB_GetTchsFromCurrentGrpExceptMe, + }; + static unsigned (*GetUsrsForum[For_NUM_TYPES_FORUM]) (MYSQL_RES **mysql_res) = + { + [For_FORUM_COURSE_USRS] = Enr_DB_GetUsrsFromCurrentCrsExceptMe, + [For_FORUM_COURSE_TCHS] = Enr_DB_GetTchsFromCurrentCrsExceptMe, + }; MYSQL_RES *mysql_res; unsigned NumUsrs = 0; // Initialized to avoid warning unsigned NumUsr; @@ -1037,27 +1012,10 @@ unsigned Ntf_StoreNotifyEventsToAllUsrs (Ntf_NotifyEvent_t NotifyEvent,long Cod) case Ntf_EVENT_TEACHERS_FILE: case Ntf_EVENT_SHARED_FILE: case Ntf_EVENT_MARKS_FILE: - switch (Gbl.FileBrowser.Type) - { - case Brw_ADMI_DOC_CRS: - case Brw_ADMI_SHR_CRS: - case Brw_ADMI_MRK_CRS: // Notify all users in course except me - NumUsrs = Enr_DB_GetUsrsFromCurrentCrsExceptMe (&mysql_res); - break; - case Brw_ADMI_TCH_CRS: // Notify all teachers in course except me - NumUsrs = Enr_DB_GetTchsFromCurrentCrsExceptMe (&mysql_res); - break; - case Brw_ADMI_DOC_GRP: - case Brw_ADMI_SHR_GRP: - case Brw_ADMI_MRK_GRP: // Notify all users in group except me - NumUsrs = Grp_DB_GetUsrsFromCurrentGrpExceptMe (&mysql_res); - break; - case Brw_ADMI_TCH_GRP: // Notify all teachers in group except me - NumUsrs = Grp_DB_GetTchsFromCurrentGrpExceptMe (&mysql_res); - break; - default: // This function should not be called in other cases - return 0; - } + if (GetUsrsBrowser[Gbl.FileBrowser.Type]) + NumUsrs = GetUsrsBrowser[Gbl.FileBrowser.Type] (&mysql_res); + else + return 0; break; case Ntf_EVENT_ASSIGNMENT: NumUsrs = Asg_DB_GetUsrsFromAssignmentExceptMe (&mysql_res,Cod); @@ -1096,17 +1054,10 @@ unsigned Ntf_StoreNotifyEventsToAllUsrs (Ntf_NotifyEvent_t NotifyEvent,long Cod) // Check if forum is for users or for all users in the course For_GetForumTypeAndLocationOfAPost (Cod,&ForumSelected); - switch (ForumSelected.Type) - { - case For_FORUM_COURSE_USRS: - NumUsrs = Enr_DB_GetUsrsFromCurrentCrsExceptMe (&mysql_res); - break; - case For_FORUM_COURSE_TCHS: - NumUsrs = Enr_DB_GetTchsFromCurrentCrsExceptMe (&mysql_res); - break; - default: - return 0; - } + if (GetUsrsForum[ForumSelected.Type]) + NumUsrs = GetUsrsForum[ForumSelected.Type] (&mysql_res); + else + return 0; break; case Ntf_EVENT_FORUM_REPLY: // Cod is the code of the post diff --git a/swad_parameter.c b/swad_parameter.c index 48dcadc6..067d37a2 100644 --- a/swad_parameter.c +++ b/swad_parameter.c @@ -214,20 +214,18 @@ List --> |Name.Start | -> |Name.Start | void Par_CreateListOfParams (void) { + static void (*CreateListOfParams[Act_NUM_CONTENTS]) (void) = + { + [Act_CONT_NORM] = Par_CreateListOfParamsFromQueryString, + [Act_CONT_DATA] = Par_CreateListOfParamsFromTmpFile, + }; + /***** Initialize empty list of parameters *****/ Gbl.Params.List = NULL; /***** Get list *****/ if (Gbl.Params.ContentLength) - switch (Gbl.ContentReceivedByCGI) - { - case Act_CONT_NORM: - Par_CreateListOfParamsFromQueryString (); - break; - case Act_CONT_DATA: - Par_CreateListOfParamsFromTmpFile (); - break; - } + CreateListOfParams[Gbl.ContentReceivedByCGI] (); } /*****************************************************************************/ diff --git a/swad_password.c b/swad_password.c index 7f520d77..7e102ab9 100644 --- a/swad_password.c +++ b/swad_password.c @@ -730,7 +730,19 @@ void Pwd_ShowFormChgOtherUsrPwd (void) { extern const char *Txt_Password; extern const char *Txt_Change_password; - Act_Action_t NextAction; + static const Act_Action_t NextAction[Rol_NUM_ROLES] = + { + [Rol_UNK ] = ActChgPwdOth, + [Rol_GST ] = ActChgPwdOth, + [Rol_USR ] = ActChgPwdOth, + [Rol_STD ] = ActChgPwdStd, + [Rol_NET ] = ActChgPwdTch, + [Rol_TCH ] = ActChgPwdTch, + [Rol_DEG_ADM] = ActChgPwdOth, + [Rol_CTR_ADM] = ActChgPwdOth, + [Rol_INS_ADM] = ActChgPwdOth, + [Rol_SYS_ADM] = ActChgPwdOth, + }; /***** Begin section *****/ HTM_SECTION_Begin (Pwd_PASSWORD_SECTION_ID); @@ -745,20 +757,7 @@ void Pwd_ShowFormChgOtherUsrPwd (void) /***** Form to change password *****/ /* Begin form */ - switch (Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs) - { - case Rol_STD: - NextAction = ActChgPwdStd; - break; - case Rol_NET: - case Rol_TCH: - NextAction = ActChgPwdTch; - break; - default: // Guest, user or admin - NextAction = ActChgPwdOth; - break; - } - Frm_BeginFormAnchor (NextAction,Pwd_PASSWORD_SECTION_ID); + Frm_BeginFormAnchor (NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs],Pwd_PASSWORD_SECTION_ID); Usr_PutParamOtherUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EnUsrCod); /* New password */ diff --git a/swad_photo.c b/swad_photo.c index 1aec6b21..81263ddc 100644 --- a/swad_photo.c +++ b/swad_photo.c @@ -177,7 +177,19 @@ void Pho_PutIconToChangeUsrPhoto (void) bool PhotoExists; char PhotoURL[PATH_MAX + 1]; const char *TitleText; - Act_Action_t NextAction; + static const Act_Action_t NextAction[Rol_NUM_ROLES] = + { + [Rol_UNK ] = ActReqOthPho, + [Rol_GST ] = ActReqOthPho, + [Rol_USR ] = ActReqOthPho, + [Rol_STD ] = ActReqStdPho, + [Rol_NET ] = ActReqTchPho, + [Rol_TCH ] = ActReqTchPho, + [Rol_DEG_ADM] = ActReqOthPho, + [Rol_CTR_ADM] = ActReqOthPho, + [Rol_INS_ADM] = ActReqOthPho, + [Rol_SYS_ADM] = ActReqOthPho, + }; bool ItsMe = Usr_ItsMe (Gbl.Record.UsrDat->UsrCod); /***** Link for changing / uploading the photo *****/ @@ -196,20 +208,7 @@ void Pho_PutIconToChangeUsrPhoto (void) PhotoExists = Pho_BuildLinkToPhoto (Gbl.Record.UsrDat,PhotoURL); TitleText = PhotoExists ? Txt_Change_photo : Txt_Upload_photo; - switch (Gbl.Record.UsrDat->Roles.InCurrentCrs) - { - case Rol_STD: - NextAction = ActReqStdPho; - break; - case Rol_NET: - case Rol_TCH: - NextAction = ActReqTchPho; - break; - default: // Guest, user or admin - NextAction = ActReqOthPho; - break; - } - Lay_PutContextualLinkOnlyIcon (NextAction,NULL, + Lay_PutContextualLinkOnlyIcon (NextAction[Gbl.Record.UsrDat->Roles.InCurrentCrs],NULL, Rec_PutParamUsrCodEncrypted,NULL, "camera.svg", TitleText); @@ -241,30 +240,27 @@ static void Pho_PutIconToRequestRemoveOtherUsrPhoto (__attribute__((unused)) voi extern const char *Txt_Remove_photo; char PhotoURL[PATH_MAX + 1]; bool PhotoExists; - Act_Action_t NextAction; + static const Act_Action_t NextAction[Rol_NUM_ROLES] = + { + [Rol_UNK ] = ActReqRemOthPho, + [Rol_GST ] = ActReqRemOthPho, + [Rol_USR ] = ActReqRemOthPho, + [Rol_STD ] = ActReqRemStdPho, + [Rol_NET ] = ActReqRemTchPho, + [Rol_TCH ] = ActReqRemTchPho, + [Rol_DEG_ADM] = ActReqRemOthPho, + [Rol_CTR_ADM] = ActReqRemOthPho, + [Rol_INS_ADM] = ActReqRemOthPho, + [Rol_SYS_ADM] = ActReqRemOthPho, + }; /***** Link to request the removal of another user's photo *****/ PhotoExists = Pho_BuildLinkToPhoto (&Gbl.Usrs.Other.UsrDat,PhotoURL); if (PhotoExists) - { - switch (Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs) - { - case Rol_STD: - NextAction = ActReqRemStdPho; - break; - case Rol_NET: - case Rol_TCH: - NextAction = ActReqRemTchPho; - break; - default: // Guest, user or admin - NextAction = ActReqRemOthPho; - break; - } - Lay_PutContextualLinkOnlyIcon (NextAction,NULL, + Lay_PutContextualLinkOnlyIcon (NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs],NULL, Usr_PutParamOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod, "trash.svg", Txt_Remove_photo); - } } /*****************************************************************************/ @@ -306,7 +302,19 @@ static void Pho_ReqPhoto (const struct UsrData *UsrDat) extern const char *Txt_File_with_the_photo; extern const char *Txt_Upload_photo; bool ItsMe = Usr_ItsMe (UsrDat->UsrCod); - Act_Action_t NextAction; + static const Act_Action_t NextAction[Rol_NUM_ROLES] = + { + [Rol_UNK ] = ActDetOthPho, + [Rol_GST ] = ActDetOthPho, + [Rol_USR ] = ActDetOthPho, + [Rol_STD ] = ActDetStdPho, + [Rol_NET ] = ActDetTchPho, + [Rol_TCH ] = ActDetTchPho, + [Rol_DEG_ADM] = ActDetOthPho, + [Rol_CTR_ADM] = ActDetOthPho, + [Rol_INS_ADM] = ActDetOthPho, + [Rol_SYS_ADM] = ActDetOthPho, + }; /***** Begin box *****/ Box_BoxBegin (NULL,Txt_Photo, @@ -319,20 +327,7 @@ static void Pho_ReqPhoto (const struct UsrData *UsrDat) Frm_BeginForm (ActDetMyPho); else { - switch (Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs) - { - case Rol_STD: - NextAction = ActDetStdPho; - break; - case Rol_NET: - case Rol_TCH: - NextAction = ActDetTchPho; - break; - default: // Guest, user or admin - NextAction = ActDetOthPho; - break; - } - Frm_BeginForm (NextAction); + Frm_BeginForm (NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs]); Usr_PutParamUsrCodEncrypted (UsrDat->EnUsrCod); } @@ -486,7 +481,19 @@ void Pho_ReqRemoveUsrPhoto (void) extern const char *Txt_Remove_photo; extern const char *Txt_The_photo_no_longer_exists; char PhotoURL[PATH_MAX + 1]; - Act_Action_t NextAction; + static const Act_Action_t NextAction[Rol_NUM_ROLES] = + { + [Rol_UNK ] = ActRemOthPho, + [Rol_GST ] = ActRemOthPho, + [Rol_USR ] = ActRemOthPho, + [Rol_STD ] = ActRemStdPho, + [Rol_NET ] = ActRemTchPho, + [Rol_TCH ] = ActRemTchPho, + [Rol_DEG_ADM] = ActRemOthPho, + [Rol_CTR_ADM] = ActRemOthPho, + [Rol_INS_ADM] = ActRemOthPho, + [Rol_SYS_ADM] = ActRemOthPho, + }; /***** Get user's code from form *****/ Usr_GetParamOtherUsrCodEncryptedAndGetListIDs (); @@ -511,20 +518,7 @@ void Pho_ReqRemoveUsrPhoto (void) "PHOTO186x248",Pho_NO_ZOOM,false); /* End alert */ - switch (Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs) - { - case Rol_STD: - NextAction = ActRemStdPho; - break; - case Rol_NET: - case Rol_TCH: - NextAction = ActRemTchPho; - break; - default: // Guest, user or admin - NextAction = ActRemOthPho; - break; - } - Ale_ShowAlertAndButton2 (NextAction,NULL,NULL, + Ale_ShowAlertAndButton2 (NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs],NULL,NULL, Usr_PutParamOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod, Btn_REMOVE_BUTTON,Txt_Remove_photo); } @@ -605,7 +599,19 @@ static bool Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct UsrData *Usr unsigned Radius; unsigned BackgroundCode; char StrFileName[NAME_MAX + 1]; - Act_Action_t NextAction; + static const Act_Action_t NextAction[Rol_NUM_ROLES] = + { + [Rol_UNK ] = ActUpdOthPho, + [Rol_GST ] = ActUpdOthPho, + [Rol_USR ] = ActUpdOthPho, + [Rol_STD ] = ActUpdStdPho, + [Rol_NET ] = ActUpdTchPho, + [Rol_TCH ] = ActUpdTchPho, + [Rol_DEG_ADM] = ActUpdOthPho, + [Rol_CTR_ADM] = ActUpdOthPho, + [Rol_INS_ADM] = ActUpdOthPho, + [Rol_SYS_ADM] = ActUpdOthPho, + }; char ErrorTxt[256]; /***** Creates directories if not exist *****/ @@ -688,20 +694,7 @@ static bool Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct UsrData *Usr Frm_BeginForm (ActUpdMyPho); else { - switch (Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs) - { - case Rol_STD: - NextAction = ActUpdStdPho; - break; - case Rol_NET: - case Rol_TCH: - NextAction = ActUpdTchPho; - break; - default: // Guest, user or admin - NextAction = ActUpdOthPho; - break; - } - Frm_BeginForm (NextAction); + Frm_BeginForm (NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs]); Usr_PutParamUsrCodEncrypted (UsrDat->EnUsrCod); } Par_PutHiddenParamString (NULL,"FileName",StrFileName); @@ -1582,6 +1575,12 @@ static void Pho_ShowOrPrintPhotoDegree (Pho_AvgPhotoSeeOrPrint_t SeeOrPrint) { extern const char *Hlp_ANALYTICS_Degrees; extern const char *Txt_Degrees; + static void (*ShowOrPrintDegrees[Set_NUM_USR_LIST_TYPES]) (struct Pho_DegPhotos *DegPhotos, + Pho_AvgPhotoSeeOrPrint_t SeeOrPrint) = + { + [Set_USR_LIST_AS_CLASS_PHOTO] = Pho_ShowOrPrintClassPhotoDegrees, + [Set_USR_LIST_AS_LISTING ] = Pho_ShowOrPrintListDegrees, + }; struct Pho_DegPhotos DegPhotos; /***** Get parameters from form *****/ @@ -1633,17 +1632,8 @@ static void Pho_ShowOrPrintPhotoDegree (Pho_AvgPhotoSeeOrPrint_t SeeOrPrint) Pho_GetMaxStdsPerDegree (&DegPhotos); /***** Draw the classphoto/list *****/ - switch (Gbl.Usrs.Me.ListType) - { - case Set_USR_LIST_AS_CLASS_PHOTO: - Pho_ShowOrPrintClassPhotoDegrees (&DegPhotos,SeeOrPrint); - break; - case Set_USR_LIST_AS_LISTING: - Pho_ShowOrPrintListDegrees (&DegPhotos,SeeOrPrint); - break; - default: - break; - } + if (ShowOrPrintDegrees[Gbl.Usrs.Me.ListType]) + ShowOrPrintDegrees[Gbl.Usrs.Me.ListType] (&DegPhotos,SeeOrPrint); /***** End box *****/ Box_BoxEnd (); diff --git a/swad_project.c b/swad_project.c index 5908118c..d9afbebd 100644 --- a/swad_project.c +++ b/swad_project.c @@ -3655,14 +3655,13 @@ static void Prj_UpdateProject (struct Prj_Project *Prj) static bool Prj_CheckIfICanConfigAllProjects (void) { - switch (Gbl.Usrs.Me.Role.Logged) + static const bool ICanConfigAllProjects[Rol_NUM_ROLES] = { - case Rol_TCH: - case Rol_SYS_ADM: - return true; - default: - return false; - } + [Rol_TCH ] = true, + [Rol_SYS_ADM] = true, + }; + + return ICanConfigAllProjects[Gbl.Usrs.Me.Role.Logged]; } /*****************************************************************************/ diff --git a/swad_record.c b/swad_record.c index cfc1649f..7082fee8 100644 --- a/swad_record.c +++ b/swad_record.c @@ -2322,7 +2322,19 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args) bool ItsMe = Usr_ItsMe (Gbl.Record.UsrDat->UsrCod); bool ICanViewUsrProfile; bool RecipientHasBannedMe; - Act_Action_t NextAction; + static const Act_Action_t NextAction[Rol_NUM_ROLES] = + { + [Rol_UNK ] = ActReqMdfOth, + [Rol_GST ] = ActReqMdfOth, + [Rol_USR ] = ActReqMdfOth, + [Rol_STD ] = ActReqMdfStd, + [Rol_NET ] = ActReqMdfNET, + [Rol_TCH ] = ActReqMdfTch, + [Rol_DEG_ADM] = ActReqMdfOth, + [Rol_CTR_ADM] = ActReqMdfOth, + [Rol_INS_ADM] = ActReqMdfOth, + [Rol_SYS_ADM] = ActReqMdfOth, + }; if (!Gbl.Form.Inside && // Only if not inside another form Act_GetBrowserTab (Gbl.Action.Act) == Act_BRW_1ST_TAB && // Only in main browser tab @@ -2380,27 +2392,10 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args) Gbl.Usrs.Me.Role.Logged == Rol_CTR_ADM || Gbl.Usrs.Me.Role.Logged == Rol_INS_ADM || Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) - { - switch (Gbl.Record.UsrDat->Roles.InCurrentCrs) - { - case Rol_STD: - NextAction = ActReqMdfStd; - break; - case Rol_NET: - NextAction = ActReqMdfNET; - break; - case Rol_TCH: - NextAction = ActReqMdfTch; - break; - default: // Guest, user or admin - NextAction = ActReqMdfOth; - break; - } - Lay_PutContextualLinkOnlyIcon (NextAction,NULL, + Lay_PutContextualLinkOnlyIcon (NextAction[Gbl.Record.UsrDat->Roles.InCurrentCrs],NULL, Rec_PutParamUsrCodEncrypted,NULL, "user-cog.svg", Txt_Administer_user); - } if (Gbl.Hierarchy.Level == HieLvl_CRS) // Course selected { diff --git a/swad_survey.c b/swad_survey.c index d4a27e4d..fd3f884a 100644 --- a/swad_survey.c +++ b/swad_survey.c @@ -307,18 +307,16 @@ static void Svy_ListAllSurveys (struct Svy_Surveys *Surveys) static bool Svy_CheckIfICanCreateSvy (void) { - switch (Gbl.Usrs.Me.Role.Logged) + static const bool ICanCreateSvy[Rol_NUM_ROLES] = { - case Rol_TCH: - case Rol_DEG_ADM: - case Rol_CTR_ADM: - case Rol_INS_ADM: - case Rol_SYS_ADM: - return true; - default: - return false; - } - return false; + [Rol_TCH ] = true, + [Rol_DEG_ADM] = true, + [Rol_CTR_ADM] = true, + [Rol_INS_ADM] = true, + [Rol_SYS_ADM] = true, + }; + + return ICanCreateSvy[Gbl.Usrs.Me.Role.Logged]; } /*****************************************************************************/ diff --git a/swad_syllabus.c b/swad_syllabus.c index 08d32120..76ae0828 100644 --- a/swad_syllabus.c +++ b/swad_syllabus.c @@ -997,6 +997,11 @@ static void Syl_ChangePlaceItemSyllabus (Syl_ChangePosItem_t UpOrDownPos) FILE *NewFile; unsigned NumItem; struct MoveSubtrees Subtree; + static void (*CalculateSubtreeSyllabus[Syl_NUM_CHANGE_POS_ITEM]) (struct MoveSubtrees *Subtree,unsigned NumItem) = + { + [Syl_GET_UP ] = Syl_CalculateUpSubtreeSyllabus, + [Syl_GET_DOWN] = Syl_CalculateDownSubtreeSyllabus, + }; /***** Reset syllabus context *****/ Syl_ResetSyllabus (&Syllabus); @@ -1023,15 +1028,7 @@ static void Syl_ChangePlaceItemSyllabus (Syl_ChangePosItem_t UpOrDownPos) Fil_CreateUpdateFile (PathFile,".old",PathOldFile,PathNewFile,&NewFile); /***** Get up or get down position *****/ - switch (UpOrDownPos) - { - case Syl_GET_UP: - Syl_CalculateUpSubtreeSyllabus (&Subtree,Syllabus.NumItem); - break; - case Syl_GET_DOWN: - Syl_CalculateDownSubtreeSyllabus (&Subtree,Syllabus.NumItem); - break; - } + CalculateSubtreeSyllabus[UpOrDownPos] (&Subtree,Syllabus.NumItem); /***** Create the new XML file *****/ Syl_WriteStartFileSyllabus (NewFile); diff --git a/swad_syllabus.h b/swad_syllabus.h index 95b46cd8..b64e0f0f 100644 --- a/swad_syllabus.h +++ b/swad_syllabus.h @@ -35,6 +35,7 @@ typedef enum } Syl_WhichSyllabus_t; // Which syllabus I want to see #define Syl_DEFAULT_WHICH_SYLLABUS Syl_LECTURES +#define Syl_NUM_CHANGE_POS_ITEM 2 typedef enum { Syl_GET_UP, diff --git a/swad_timeline_note.c b/swad_timeline_note.c index f60782db..5f18135b 100644 --- a/swad_timeline_note.c +++ b/swad_timeline_note.c @@ -53,6 +53,22 @@ extern struct Globals Gbl; +/*****************************************************************************/ +/**************************** Private constants ******************************/ +/*****************************************************************************/ + +static const Tml_Not_Type_t Tml_Not_NoteType[Brw_NUM_TYPES_FILE_BROWSER] = + { + [Brw_ADMI_DOC_INS] = TL_NOTE_INS_DOC_PUB_FILE, + [Brw_ADMI_SHR_INS] = TL_NOTE_INS_SHA_PUB_FILE, + [Brw_ADMI_DOC_CTR] = TL_NOTE_CTR_DOC_PUB_FILE, + [Brw_ADMI_SHR_CTR] = TL_NOTE_CTR_SHA_PUB_FILE, + [Brw_ADMI_DOC_DEG] = TL_NOTE_DEG_DOC_PUB_FILE, + [Brw_ADMI_SHR_DEG] = TL_NOTE_DEG_SHA_PUB_FILE, + [Brw_ADMI_DOC_CRS] = TL_NOTE_CRS_DOC_PUB_FILE, + [Brw_ADMI_SHR_CRS] = TL_NOTE_CRS_SHA_PUB_FILE, + }; + /*****************************************************************************/ /***************************** Private prototypes ****************************/ /*****************************************************************************/ @@ -931,57 +947,14 @@ void Tml_Not_MarkNoteOneFileAsUnavailable (const char *Path) extern const Brw_FileBrowser_t Brw_DB_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER]; Brw_FileBrowser_t FileBrowser = Brw_DB_FileBrowserForDB_files[Gbl.FileBrowser.Type]; long FilCod; - Tml_Not_Type_t NoteType; - switch (FileBrowser) + if (Tml_Not_NoteType[FileBrowser]) { - case Brw_ADMI_DOC_INS: - case Brw_ADMI_SHR_INS: - case Brw_ADMI_DOC_CTR: - case Brw_ADMI_SHR_CTR: - case Brw_ADMI_DOC_DEG: - case Brw_ADMI_SHR_DEG: - case Brw_ADMI_DOC_CRS: - case Brw_ADMI_SHR_CRS: - /***** Get file code *****/ - FilCod = Brw_DB_GetFilCodByPath (Path,true); // Only if file is public - if (FilCod > 0) - { - /***** Mark possible note as unavailable *****/ - switch (FileBrowser) - { - case Brw_ADMI_DOC_INS: - NoteType = TL_NOTE_INS_DOC_PUB_FILE; - break; - case Brw_ADMI_SHR_INS: - NoteType = TL_NOTE_INS_SHA_PUB_FILE; - break; - case Brw_ADMI_DOC_CTR: - NoteType = TL_NOTE_CTR_DOC_PUB_FILE; - break; - case Brw_ADMI_SHR_CTR: - NoteType = TL_NOTE_CTR_SHA_PUB_FILE; - break; - case Brw_ADMI_DOC_DEG: - NoteType = TL_NOTE_DEG_DOC_PUB_FILE; - break; - case Brw_ADMI_SHR_DEG: - NoteType = TL_NOTE_DEG_SHA_PUB_FILE; - break; - case Brw_ADMI_DOC_CRS: - NoteType = TL_NOTE_CRS_DOC_PUB_FILE; - break; - case Brw_ADMI_SHR_CRS: - NoteType = TL_NOTE_CRS_SHA_PUB_FILE; - break; - default: - return; - } - Tml_DB_MarkNoteAsUnavailable (NoteType,FilCod); - } - break; - default: - break; + /***** Get file code *****/ + FilCod = Brw_DB_GetFilCodByPath (Path,true); // Only if file is public + if (FilCod > 0) + /***** Mark possible note as unavailable *****/ + Tml_DB_MarkNoteAsUnavailable (Tml_Not_NoteType[FileBrowser],FilCod); } } @@ -993,55 +966,11 @@ void Tml_Not_MarkNotesChildrenOfFolderAsUnavailable (const char *Path) { extern const Brw_FileBrowser_t Brw_DB_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER]; Brw_FileBrowser_t FileBrowser = Brw_DB_FileBrowserForDB_files[Gbl.FileBrowser.Type]; - Tml_Not_Type_t NoteType; - switch (FileBrowser) - { - case Brw_ADMI_DOC_INS: - case Brw_ADMI_SHR_INS: - case Brw_ADMI_DOC_CTR: - case Brw_ADMI_SHR_CTR: - case Brw_ADMI_DOC_DEG: - case Brw_ADMI_SHR_DEG: - case Brw_ADMI_DOC_CRS: - case Brw_ADMI_SHR_CRS: - /***** Mark possible note as unavailable *****/ - switch (FileBrowser) - { - case Brw_ADMI_DOC_INS: - NoteType = TL_NOTE_INS_DOC_PUB_FILE; - break; - case Brw_ADMI_SHR_INS: - NoteType = TL_NOTE_INS_SHA_PUB_FILE; - break; - case Brw_ADMI_DOC_CTR: - NoteType = TL_NOTE_CTR_DOC_PUB_FILE; - break; - case Brw_ADMI_SHR_CTR: - NoteType = TL_NOTE_CTR_SHA_PUB_FILE; - break; - case Brw_ADMI_DOC_DEG: - NoteType = TL_NOTE_DEG_DOC_PUB_FILE; - break; - case Brw_ADMI_SHR_DEG: - NoteType = TL_NOTE_DEG_SHA_PUB_FILE; - break; - case Brw_ADMI_DOC_CRS: - NoteType = TL_NOTE_CRS_DOC_PUB_FILE; - break; - case Brw_ADMI_SHR_CRS: - NoteType = TL_NOTE_CRS_SHA_PUB_FILE; - break; - default: - return; - } - Tml_DB_MarkNotesChildrenOfFolderAsUnavailable (NoteType,FileBrowser, - Brw_GetCodForFileBrowser (), - Path); - break; - default: - break; - } + if (Tml_Not_NoteType[FileBrowser]) + Tml_DB_MarkNotesChildrenOfFolderAsUnavailable (Tml_Not_NoteType[FileBrowser],FileBrowser, + Brw_GetCodForFileBrowser (), + Path); } /*****************************************************************************/ diff --git a/swad_user.c b/swad_user.c index 3f1b78c9..b3d67bcf 100644 --- a/swad_user.c +++ b/swad_user.c @@ -6098,25 +6098,16 @@ static void Usr_DrawClassPhoto (Usr_ClassPhotoType_t ClassPhotoType, unsigned NumUsr; bool TRIsOpen = false; bool UsrIsTheMsgSender; - const char *ClassPhoto = "PHOTO21x28"; // Default photo size struct UsrData UsrDat; + static const char *ClassPhoto[Usr_NUM_CLASS_PHOTO_TYPE] = + { + [Usr_CLASS_PHOTO_SEL ] = "PHOTO21x28", + [Usr_CLASS_PHOTO_SEL_SEE] = "PHOTO45x60", + [Usr_CLASS_PHOTO_PRN ] = "PHOTO45x60", + }; if (Gbl.Usrs.LstUsrs[Role].NumUsrs) { - /***** Set width and height of photos *****/ - switch (ClassPhotoType) - { - case Usr_CLASS_PHOTO_SEL: - ClassPhoto = "PHOTO21x28"; - break; - case Usr_CLASS_PHOTO_SEL_SEE: - ClassPhoto = "PHOTO45x60"; - break; - case Usr_CLASS_PHOTO_PRN: - ClassPhoto = "PHOTO45x60"; - break; - } - /***** Put a row to select all users *****/ if (PutCheckBoxToSelectUsr) Usr_PutCheckboxToSelectAllUsers (Role,SelectedUsrs); @@ -6159,26 +6150,26 @@ static void Usr_DrawClassPhoto (Usr_ClassPhotoType_t ClassPhotoType, SelectedUsrs); /***** Show photo *****/ - Pho_ShowUsrPhotoIfAllowed (&UsrDat,ClassPhoto,Pho_ZOOM,false); + Pho_ShowUsrPhotoIfAllowed (&UsrDat,ClassPhoto[ClassPhotoType],Pho_ZOOM,false); /***** Photo foot *****/ HTM_DIV_Begin ("class=\"CLASSPHOTO_CAPTION\""); - /* Name */ - if (UsrDat.FrstName[0]) - HTM_Txt (UsrDat.FrstName); - else - HTM_NBSP (); - HTM_BR (); - if (UsrDat.Surname1[0]) - HTM_Txt (UsrDat.Surname1); - else - HTM_NBSP (); - HTM_BR (); - if (UsrDat.Surname2[0]) - HTM_Txt (UsrDat.Surname2); - else - HTM_NBSP (); + /* Name */ + if (UsrDat.FrstName[0]) + HTM_Txt (UsrDat.FrstName); + else + HTM_NBSP (); + HTM_BR (); + if (UsrDat.Surname1[0]) + HTM_Txt (UsrDat.Surname1); + else + HTM_NBSP (); + HTM_BR (); + if (UsrDat.Surname2[0]) + HTM_Txt (UsrDat.Surname2); + else + HTM_NBSP (); HTM_DIV_End (); diff --git a/swad_user.h b/swad_user.h index 0e117352..f5ba8f02 100644 --- a/swad_user.h +++ b/swad_user.h @@ -113,6 +113,7 @@ typedef enum // Don't change these numbers! They are used for user's sex in database // Related with class photograph +#define Usr_NUM_CLASS_PHOTO_TYPE 3 typedef enum { Usr_CLASS_PHOTO_SEL, // Only for selection of users