// swad_global.h: global variables #ifndef _SWAD_GBL #define _SWAD_GBL /* SWAD (Shared Workspace At a Distance in Spanish), is a web platform developed at the University of Granada (Spain), and used to support university teaching. This file is part of SWAD core. Copyright (C) 1999-2017 Antonio Caņas Vargas This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ /*****************************************************************************/ /********************************* Headers ***********************************/ /*****************************************************************************/ #include // For maximum values #include // For FILE #include // For tz #include // To access MySQL databases #include "swad_alert.h" #include "swad_agenda.h" #include "swad_assignment.h" #include "swad_attendance.h" #include "swad_banner.h" #include "swad_centre.h" #include "swad_connected.h" #include "swad_config.h" #include "swad_country.h" #include "swad_course.h" #include "swad_cryptography.h" #include "swad_department.h" #include "swad_degree_type.h" #include "swad_enrolment.h" #include "swad_exam.h" #include "swad_file.h" #include "swad_file_browser.h" #include "swad_forum.h" #include "swad_holiday.h" #include "swad_image.h" #include "swad_icon.h" #include "swad_indicator.h" #include "swad_institution.h" #include "swad_layout.h" #include "swad_link.h" #include "swad_mail.h" #include "swad_mark.h" #include "swad_message.h" #include "swad_menu.h" #include "swad_parameter.h" #include "swad_password.h" #include "swad_photo.h" #include "swad_place.h" #include "swad_plugin.h" #include "swad_record.h" #include "swad_search.h" #include "swad_session.h" #include "swad_social.h" #include "swad_survey.h" #include "swad_syllabus.h" #include "swad_test.h" #include "swad_timetable.h" #include "swad_web_service.h" /*****************************************************************************/ /***************************** Public constants ******************************/ /*****************************************************************************/ /*****************************************************************************/ /******************************* Public types ********************************/ /*****************************************************************************/ struct Globals { struct { char DatabasePassword[Cfg_MAX_BYTES_DATABASE_PASSWORD + 1]; char SMTPPassword[Cfg_MAX_BYTES_SMTP_PASSWORD + 1]; } Config; struct Files F; MYSQL mysql; pid_t PID; // PID of current process struct { int Num; // Number of form, used in form submit links char Id[32]; // Identifier string used in forms char UniqueId[32 + Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 10 + 1]; // Unique identifier string used in forms bool Inside; // Set to true inside a form to avoid nested forms } Form; struct { Ale_AlertType_t Type; char Txt[Ale_MAX_BYTES_ALERT + 1]; } Alert; // Used in a posteriori function to write success / warning message struct { size_t ContentLength; char *QueryString; // String allocated dynamically with the arguments sent to the CGI struct Param *List; // Linked list of parameters bool GetMethod; // Am I accessing using GET method? } Params; Act_Content_t ContentReceivedByCGI; /* Content send by the form and received by the CGI: Act_CONTENT_NORM (if CONTENT_TYPE==text/plain) or Act_CONT_DATA (if CONTENT_TYPE==multipart/form-data) */ struct { char StrWithoutCRLF[Par_MAX_BYTES_BOUNDARY_WITH_CR_LF + 1]; char StrWithCRLF [Par_MAX_BYTES_BOUNDARY_WITH_CR_LF + 1]; size_t LengthWithoutCRLF; size_t LengthWithCRLF; } Boundary; struct soap *soap; // gSOAP runtime environment struct { bool WritingHTMLStart; // Used to avoid writing the HTML head when aborting program on error bool HTMLStartWritten; // Used to avoid writing more than once the HTML head bool DivsEndWritten; // Used to avoid writing more than once the HTML end bool HTMLEndWritten; // Used to avoid writing more than once the HTML end unsigned FrameNested; } Layout; struct { bool DatabaseIsOpen; bool LockedTables; } DB; bool HiddenParamsInsertedIntoDB; // If parameters are inserted in the database in this execution /* To compute execution time of the program */ struct timeval tvStart,tvPageCreated,tvPageSent; struct timezone tz; long TimeGenerationInMicroseconds; long TimeSendInMicroseconds; char IP[Cns_MAX_BYTES_IP + 1]; char UniqueNameEncrypted[Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 1]; // Used for session id, temporary directory names, etc. struct { Txt_Language_t Language; unsigned FirstDayOfWeek; Dat_Format_t DateFormat; Mnu_Menu_t Menu; unsigned SideCols; The_Theme_t Theme; char PathTheme[PATH_MAX + 1]; Ico_IconSet_t IconSet; char PathIconSet[PATH_MAX + 1]; char IconsURL[PATH_MAX + 1]; } Prefs; struct { unsigned NumSessions; bool IsOpen; bool HasBeenDisconnected; char Id[Ses_BYTES_SESSION_ID + 1]; long UsrCod; } Session; struct { Tab_Tab_t Tab; Act_Action_t Act; Act_Action_t Original; // Used in some actions to know what action gave rise to the current action bool UsesAJAX; // Do not generate full HTML page, only the content of a div bool IsAJAXAutoRefresh; // It's an automatic refresh drom time to time } Action; time_t StartExecutionTimeUTC; struct DateTime Now; struct Date Yesterday; char Title[Lay_MAX_BYTES_TITLE + 1]; // String for the help message in a link unsigned RowEvenOdd; // To alternate row colors in listings char *ColorRows[2]; const char *XMLPtr; struct { char FileName[PATH_MAX + 1]; } HTMLOutput; struct { unsigned Num; // Number of institutions struct Instit *Lst; // List of institutions struct Instit EditingIns; Ins_Order_t SelectedOrder; } Inss; struct { unsigned Num; // Number of centres struct Centre *Lst; // List of centres struct Centre EditingCtr; Ctr_Order_t SelectedOrder; } Ctrs; struct { unsigned Num; // Number of countries struct Country *Lst; // List of countries struct Country EditingCty; Cty_Order_t SelectedOrder; } Ctys; struct { unsigned Num; // Number of departments struct Department *Lst; // List of departments struct Department EditingDpt; Dpt_Order_t SelectedOrder; } Dpts; struct { unsigned Num; // Number of places struct Place *Lst; // List of places struct Place EditingPlc; Plc_Order_t SelectedOrder; } Plcs; struct { bool LstIsRead; // Is the list already read from database, or it needs to be read? unsigned Num; // Number of holidays struct Holiday *Lst; // List of holidays struct Holiday EditingHld; Hld_Order_t SelectedOrder; } Hlds; struct { unsigned Num; // Number of mail domains struct Mail *Lst; // List of mail domains struct Mail EditingMai; Mai_DomainsOrder_t SelectedOrder; } Mails; struct { unsigned Num; // Number of banners struct Banner *Lst; // List of banners struct Banner EditingBan; long BanCodClicked; } Banners; struct { unsigned Num; // Number of institutional links struct Link *Lst; // List of institutional links struct Link EditingLnk; } Links; struct { struct { unsigned Num; // Number of degree types struct DegreeType *Lst; // List of degree types } DegTypes; struct DegreeType EditingDegTyp; struct Degree EditingDeg; struct Course EditingCrs; } Degs; struct { Sch_WhatToSearch_t WhatToSearch; char Str[Sch_MAX_BYTES_STRING_TO_FIND + 1]; bool LogSearch; } Search; struct { unsigned Num; // Number of plugins struct Plugin *Lst; // List of plugins struct Plugin EditingPlg; } Plugins; struct { bool IsWebService; // Must generate HTML output (IsWebService==false) or SOAP-XML output (IsWebService==true)? long PlgCod; Svc_Function_t Function; } WebService; struct { struct { struct UsrData UsrDat; struct UsrLast UsrLast; unsigned AvailableRoles; Rol_Role_t RoleFromSession; Rol_Role_t LoggedRole; Rol_Role_t LoggedRoleBeforeCloseSession; Rol_Role_t MaxRole; bool RoleHasChanged; // Set when I have changed my role char UsrIdLogin[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]; // String to store the ID, nickname or email entered in the user's login char LoginPlainPassword[Pwd_MAX_BYTES_PLAIN_PASSWORD + 1]; char LoginEncryptedPassword[Pwd_BYTES_ENCRYPTED_PASSWORD + 1]; char PendingPassword[Pwd_BYTES_ENCRYPTED_PASSWORD + 1]; char PathDir[PATH_MAX + 1]; bool Logged; bool IBelongToCurrentIns; bool IBelongToCurrentCtr; bool IBelongToCurrentDeg; bool IBelongToCurrentCrs; bool MyPhotoExists; unsigned NumAccWithoutPhoto; char PhotoURL[PATH_MAX + 1]; time_t TimeLastAccToThisFileBrowser; bool ConfirmEmailJustSent; // An email to confirm my email address has just been sent struct { bool Filled; // My institutions are already filled? unsigned Num; struct { long CtyCod; Rol_Role_t MaxRole; } Ctys[Cty_MAX_COUNTRS_PER_USR]; } MyCtys; struct { bool Filled; // My institutions are already filled? unsigned Num; struct { long InsCod; Rol_Role_t MaxRole; } Inss[Ins_MAX_INSTITS_PER_USR]; } MyInss; struct { bool Filled; // My centres are already filled? unsigned Num; struct { long CtrCod; Rol_Role_t MaxRole; } Ctrs[Ctr_MAX_CENTRES_PER_USR]; } MyCtrs; struct { bool Filled; // My degrees are already filled? unsigned Num; struct { long DegCod; Rol_Role_t MaxRole; } Degs[Deg_MAX_DEGREES_PER_USR]; } MyDegs; struct { bool Filled; // My courses are already filled? unsigned Num; struct { long CrsCod; Rol_Role_t Role; long DegCod; } Crss[Crs_MAX_COURSES_PER_USR]; } MyCrss; Usr_ShowUsrsType_t ListType; // My preference about user's list type unsigned NumFollowers; // Number of users who follow me unsigned NumFollowing; // Number of users I follow } Me; // The user logged struct { struct UsrData UsrDat; unsigned NumIDToConfirm; // Used as hidden parameter to confirm a user's ID } Other; // Another user, used for example to register in / remove from a course struct ListUsrs LstUsrs[Rol_NUM_ROLES]; struct { char *All; char *Std; char *Tch; } Select; // Lists of ID of users from a form char *ListOtherRecipients; // List of ID or nicks of users written explicitely on a form struct { Rec_UsrsType_t RecsUsrs; // Students' records or teachers' records unsigned RecsPerPag; // Number of rows of records in a row (only for printing) bool WithPhotos; } Listing; struct { unsigned Cols; bool AllGroups; } ClassPhoto; struct { unsigned long TimeToRefreshInMs; unsigned NumUsr; unsigned NumUsrs; unsigned NumUsrsToList; struct ConnectedUsrs Usrs[Rol_NUM_ROLES]; struct { long UsrCod; bool ThisCrs; time_t TimeDiff; } Lst[Cfg_MAX_CONNECTED_SHOWN]; } Connected; char FileNamePhoto[NAME_MAX + 1]; // File name (with no path and no .jpg) of the temporary file with the selected face bool Error; // To signal that an error has happened Enr_RegRemOneUsrAction_t RegRemAction; // Enrolment action } Usrs; struct { struct UsrData *UsrDat; Rec_SharedRecordViewType_t TypeOfView; } Record; struct { bool LstIsRead; // Is the list already read from database, or it needs to be read? unsigned Num; // Number of events long *LstAgdCods; // List of agenda codes unsigned Past__FutureEvents; unsigned PrivatPublicEvents; unsigned HiddenVisiblEvents; Agd_Order_t SelectedOrder; long AgdCodToEdit; // Used as parameter in contextual links unsigned CurrentPage; } Agenda; struct { Sco_Scope_t Current; Sco_Scope_t Default; unsigned Allowed; } Scope; struct { struct Country Cty; } CurrentCty; struct { struct Instit Ins; } CurrentIns; struct { struct DegreeType DegTyp; } CurrentDegTyp; struct { struct Centre Ctr; } CurrentCtr; struct { struct Degree Deg; unsigned NumCrss; } CurrentDeg; struct { struct Course Crs; char PathPriv[PATH_MAX + 1]; // Absolute path to the private directory of the course 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 { unsigned NumGrps; struct GroupTypes GrpTypes; struct GroupType GrpTyp; long GrpCod; // Group to be edited, removed... char GrpName[Grp_MAX_BYTES_GROUP_NAME + 1]; unsigned MaxStudents; bool Open; bool FileZones; struct ListCodGrps LstGrpsSel; Grp_WhichGroups_t WhichGrps; // Show my groups or all 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 { struct RecordField Field; struct LstRecordFields LstFields; } Records; struct { long NotCod; // Notice to be edited, removed... long HighlightNotCod; // Notice code of a notice to be highlighted } Notices; } CurrentCrs; struct { char PathDir[PATH_MAX + 1]; unsigned NumItem; bool EditionIsActive; Syl_WhichSyllabus_t WhichSyllabus; } Syllabus; struct { struct Date *Lst; // List of dates of exam announcements unsigned NumExaAnns; // Number of announcements of exam in the list long HighlightExaCod; // Exam announcement to be highlighted char HighlightDate[4 + 1 + 2 + 1 + 2 + 1]; // Date with exam announcements to be highlighted (in YYYY-MM-DD format) struct ExamData ExaDat; bool NewExamAnnouncement; } ExamAnns; struct { unsigned Id; // Each file browser in the page has a unique identifier Brw_FileBrowser_t Type; bool FullTree; // Show full tree? bool ShowOnlyPublicFiles; // Show only public files? bool UploadingWithDropzone; struct { unsigned long MaxFiles; unsigned long MaxFolds; unsigned long long int MaxQuota; unsigned NumLevls; unsigned long NumFolds; unsigned long NumFiles; unsigned long long int TotalSiz; } Size; struct { char PathAboveRootFolder[PATH_MAX + 1]; char PathRootFolder[PATH_MAX + 1]; char PathInTreeUntilFilFolLnk[PATH_MAX + 1]; char FullPathInTree[PATH_MAX + 1]; } Priv; char NewFilFolLnkName[NAME_MAX + 1]; char FilFolLnkName[NAME_MAX + 1]; Brw_FileType_t FileType; unsigned Level; bool ICanEditFileOrFolder; // Can I modify (remove, rename, create inside, etc.) a file or folder? Brw_IconViewEdit_t IconViewEdit; struct { Brw_FileBrowser_t FileBrowser; // Type of the file browser long Cod; // Code of the institution/centre/degree/course/group related to the file browser with the clipboard long WorksUsrCod; // User code of the user related to the works file browser with the clipboard char Path[PATH_MAX + 1]; // Complete path in the file browser char FileName[NAME_MAX + 1]; // File name, last part of complete path in the file browser unsigned Level; Brw_FileType_t FileType; // Folder, file or link bool IsThisTree; // When showing a file browser, is it that corresponding to the clipboard? bool IsThisFile; // When showing a row of a file browser, are we in the path of the clipboard? } Clipboard; char TmpPubDir[NAME_MAX + 1]; bool HiddenLevels[1 + Brw_MAX_DIR_LEVELS]; const char *TxtStyle; const char *InputStyle; struct Assignment Asg; // Data of assignment when browsing level 1 or an assignment zone struct { bool CreateZIP; char TmpDir[NAME_MAX + 1]; } ZIP; } FileBrowser; // Struct used for a file browser struct { bool LstIsRead; // Is the list already read from database, or it needs to be read? unsigned Num; // Number of assignments long *LstAsgCods; // List of assigment codes Dat_StartEndTime_t SelectedOrder; long AsgCodToEdit; // Used as parameter in contextual links unsigned CurrentPage; } Asgs; struct { bool LstIsRead; // Is the list already read from database, or it needs to be read? unsigned Num; // Number of attendance events struct AttendanceEvent *Lst; // List of attendance events Dat_StartEndTime_t SelectedOrder; long AttCod; bool ShowDetails; char *StrAttCodsSelected; long AttCodToEdit; // Used as parameter in contextual links unsigned CurrentPage; } AttEvents; struct { Soc_WhichUsrs_t WhichUsrs; long NotCod; // Used as parameter about social note to be edited, removed... long PubCod; // Used as parameter about social publishing to be edited, removed... } Social; struct { For_ForumSet_t ForumSet; For_Order_t ThreadsOrder; unsigned CurrentPageThrs; unsigned CurrentPagePsts; struct Forum ForumSelected; // Forum type, location, thread and post long ThreadToMove; } Forum; struct { long AnnCod; } Announcements; struct { Msg_TypeOfMessages_t TypeOfMessages; unsigned NumMsgs; int MsgId; char Subject[Cns_MAX_BYTES_SUBJECT + 1]; unsigned NumCourses; struct { long CrsCod; char ShrtName[Hie_MAX_BYTES_SHRT_NAME + 1]; } Courses[Crs_MAX_COURSES_PER_USR]; // Distinct courses in my messages sent or received long FilterCrsCod; // Show only messages sent from this course code char FilterCrsShrtName[Hie_MAX_BYTES_SHRT_NAME + 1]; char FilterFromTo[Usr_MAX_BYTES_FULL_NAME + 1]; // Show only messages from/to these users char FilterContent[Msg_MAX_BYTES_FILTER_CONTENT + 1]; // Show only messages that match this content bool ShowOnlyUnreadMsgs; // Show only unread messages (this option is applicable only for received messages) long ExpandedMsgCod; // The current expanded message code struct { bool IsReply; // Is the message I am editing a reply? 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 } Msg; struct { struct { struct TT_Range Range; unsigned HoursPerDay; // From start hour to end hour unsigned SecondsPerInterval; unsigned IntervalsPerHour; unsigned IntervalsPerDay; unsigned IntervalsBeforeStartHour; } Config; TT_TimeTableType_t Type; TT_TimeTableView_t View; // bool Editing; unsigned Weekday; unsigned Interval; unsigned Column; TT_ClassType_t ClassType; unsigned DurationIntervals; char Place[TT_MAX_BYTES_PLACE + 1]; char Group[Grp_MAX_BYTES_GROUP_NAME + 1]; long GrpCod; // Group code (-1 if no group selected) struct { bool PutIconEditCrsTT; bool PutIconEditOfficeHours; bool PutIconPrint; } ContextualIcons; } TimeTable; struct { struct Tst_Config Config; long QstCod; struct { unsigned Num; bool All; char *List; char Txt[Tst_MAX_TAGS_PER_QUESTION][Tst_MAX_BYTES_TAG + 1]; } Tags; Tst_AnswerType_t AnswerType; unsigned NumQsts; long QstCodes[Tst_MAX_QUESTIONS_PER_TEST]; // Codes of the sent/received questions in a test char StrIndexesOneQst[Tst_MAX_QUESTIONS_PER_TEST][Tst_MAX_BYTES_INDEXES_ONE_QST + 1]; // 0 1 2 3, 3 0 2 1, etc. char StrAnswersOneQst[Tst_MAX_QUESTIONS_PER_TEST][Tst_MAX_BYTES_ANSWERS_ONE_QST + 1]; // Answers selected by user bool AllowTeachers; // Can teachers of this course see the test result? bool AllAnsTypes; struct { char *Text; size_t Length; } Stem, Feedback; struct Image Image; bool Shuffle; struct { unsigned NumOptions; char TF; struct { bool Correct; char *Text; char *Feedback; struct Image Image; } Options[Tst_MAX_OPTIONS_PER_QUESTION]; long Integer; double FloatingPoint[2]; } Answer; char ListAnsTypes[Tst_MAX_BYTES_LIST_ANSWER_TYPES + 1]; Tst_QuestionsOrder_t SelectedOrder; struct { bool CreateXML; // Create an XML file and Export questions into it? FILE *FileXML; } XML; } Test; struct { struct DateTime DateIni; // TODO: Remove in future versions struct DateTime DateEnd; // TODO: Remove in future versions time_t TimeUTC[2]; } DateRange; struct { bool LstIsRead; // Is the list already read from database, or it needs to be read? unsigned Num; // Number of surveys long *LstSvyCods; // List of survey codes Svy_Order_t SelectedOrder; long SvyCodToEdit; // Used as parameter in contextual links long SvyQstCodToEdit; // Used as parameter in contextual links unsigned CurrentPage; } Svys; struct { Sta_ClicksGroupedBy_t ClicksGroupedBy; Sta_FigureType_t FigureType; Sta_Role_t Role; Sta_CountType_t CountType; Act_Action_t NumAction; unsigned long FirstRow; unsigned long LastRow; unsigned long RowsPerPage; long DegTypCod; long DptCod; char StrIndicatorsSelected[Ind_MAX_SIZE_INDICATORS_SELECTED + 1]; bool IndicatorsSelected[1 + Ind_NUM_INDICATORS]; struct { Pho_AvgPhotoTypeOfAverage_t TypeOfAverage; Pho_HowComputePhotoSize_t HowComputePhotoSize; Pho_HowOrderDegrees_t HowOrderDegrees; int MaxStds; int MaxStdsWithPhoto; float MaxPercent; } DegPhotos; } Stat; struct { char *Str; } QR; }; /*****************************************************************************/ /****************************** Public prototypes ****************************/ /*****************************************************************************/ void Gbl_InitializeGlobals (void); void Gbl_Cleanup (void); #endif