swad-core/swad_global.h

480 lines
14 KiB
C
Raw Normal View History

2014-12-01 23:55:08 +01:00
// 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-2023 Antonio Ca<EFBFBD>as Vargas
2014-12-01 23:55:08 +01:00
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 <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
#include <limits.h> // For maximum values
#include <stdio.h> // For FILE
#include <sys/time.h> // For tz
#include <mysql/mysql.h> // To access MySQL databases
2019-05-16 14:02:06 +02:00
#include "swad_API.h"
2014-12-01 23:55:08 +01:00
#include "swad_assignment.h"
#include "swad_browser.h"
2014-12-01 23:55:08 +01:00
#include "swad_connected.h"
#include "swad_config.h"
#include "swad_course.h"
2017-03-30 11:20:06 +02:00
#include "swad_enrolment.h"
2014-12-01 23:55:08 +01:00
#include "swad_file.h"
#include "swad_group.h"
2014-12-01 23:55:08 +01:00
#include "swad_mail.h"
#include "swad_record.h"
/*****************************************************************************/
/******************************* Public types ********************************/
/*****************************************************************************/
struct Globals
{
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
2015-11-27 21:24:24 +01:00
bool DivsEndWritten; // Used to avoid writing more than once the HTML end
2014-12-01 23:55:08 +01:00
bool HTMLEndWritten; // Used to avoid writing more than once the HTML end
} Layout;
struct
{
2018-12-08 16:43:13 +01:00
Lan_Language_t Language;
2015-11-21 20:23:28 +01:00
unsigned FirstDayOfWeek;
2017-05-04 02:19:23 +02:00
Dat_Format_t DateFormat;
Ico_IconSet_t IconSet;
2015-11-21 20:23:28 +01:00
Mnu_Menu_t Menu;
2014-12-01 23:55:08 +01:00
The_Theme_t Theme;
unsigned SideCols;
PhoSha_Shape_t PhotoShape;
2014-12-01 23:55:08 +01:00
} Prefs;
struct
{
unsigned NumSessions;
bool IsOpen;
bool HasBeenDisconnected;
2018-10-17 01:08:42 +02:00
char Id[Cns_BYTES_SESSION_ID + 1];
2014-12-01 23:55:08 +01:00
long UsrCod;
bool ParsInsertedIntoDB; // If parameters are inserted in the database in this session
2014-12-01 23:55:08 +01:00
} Session;
2016-01-17 15:10:54 +01:00
struct
{
2016-10-12 14:02:56 +02:00
Tab_Tab_t Tab;
2016-01-17 15:10:54 +01:00
Act_Action_t Act;
2017-05-09 20:56:02 +02:00
Act_Action_t Original; // Used in some actions to know what action gave rise to the current action
2017-02-05 22:23:41 +01:00
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
2016-01-17 15:10:54 +01:00
} Action;
2014-12-01 23:55:08 +01:00
struct
{
HieLvl_Level_t Level; // Current level in the hierarchy: system, country, institution, center, degree or course
long Cod; // Code of the current country, institution, center, degree or course
2020-01-08 14:04:25 +01:00
struct ListCountries Ctys;// List of countries
2021-02-11 22:57:09 +01:00
struct Cty_Countr Cty; // Current country
2020-01-08 14:04:25 +01:00
struct ListInstits Inss; // List of institutions in current country
2021-02-11 00:58:53 +01:00
struct Ins_Instit Ins; // Current institution
struct ListCenters Ctrs; // List of centers in current institution
struct Ctr_Center Ctr; // Current center
struct ListDegrees Degs; // List of degrees in current center
2021-02-11 00:58:53 +01:00
struct Deg_Degree Deg; // Current degree
struct Crs_ListCourses Crss; // List of courses in current degree
2021-02-11 00:58:53 +01:00
struct Crs_Course Crs; // Current course. Aditional info about course is stored in Gbl.Crs.
2019-04-04 11:22:08 +02:00
} Hierarchy;
2014-12-01 23:55:08 +01:00
struct
{
bool IsWebService; // Must generate HTML output (IsWebService==false) or SOAP-XML output (IsWebService==true)?
long PlgCod;
2019-05-16 14:02:06 +02:00
API_Function_t Function;
2014-12-01 23:55:08 +01:00
} WebService;
struct
{
struct
{
struct Usr_Data UsrDat;
struct Usr_Last UsrLast;
2017-06-04 14:22:04 +02:00
struct
{
unsigned Available;
2017-06-04 18:18:54 +02:00
Rol_Role_t FromSession;
Rol_Role_t Logged;
Rol_Role_t LoggedBeforeCloseSession;
2017-06-04 14:22:04 +02:00
Rol_Role_t Max;
2017-06-04 18:18:54 +02:00
bool HasChanged; // Set when I have changed my role
} Role;
char UsrIdLogin[Cns_MAX_BYTES_USR_LOGIN + 1]; // String to store the ID, nickname or email entered in the user's login
2017-03-07 01:56:41 +01:00
char LoginPlainPassword[Pwd_MAX_BYTES_PLAIN_PASSWORD + 1];
2017-03-13 14:22:36 +01:00
char LoginEncryptedPassword[Pwd_BYTES_ENCRYPTED_PASSWORD + 1];
char PendingPassword[Pwd_BYTES_ENCRYPTED_PASSWORD + 1];
2017-01-15 22:58:26 +01:00
char PathDir[PATH_MAX + 1];
2014-12-01 23:55:08 +01:00
bool Logged;
2015-01-20 20:03:38 +01:00
bool IBelongToCurrentIns;
bool IBelongToCurrentCtr;
bool IBelongToCurrentDeg;
2014-12-01 23:55:08 +01:00
bool IBelongToCurrentCrs;
bool MyPhotoExists;
unsigned NumAccWithoutPhoto;
char PhotoURL[Cns_MAX_BYTES_WWW + 1];
2014-12-01 23:55:08 +01:00
time_t TimeLastAccToThisFileBrowser;
2016-11-16 23:19:52 +01:00
bool ConfirmEmailJustSent; // An email to confirm my email address has just been sent
2016-10-27 01:30:14 +02:00
struct
{
bool Filled; // My institutions are already filled?
unsigned Num;
struct
{
long CtyCod;
Rol_Role_t MaxRole;
2016-10-28 10:03:37 +02:00
} Ctys[Cty_MAX_COUNTRS_PER_USR];
} MyCtys;
2014-12-01 23:55:08 +01:00
struct
{
bool Filled; // My institutions are already filled?
unsigned Num;
struct
{
long InsCod;
Rol_Role_t MaxRole;
2016-10-28 10:03:37 +02:00
} Inss[Ins_MAX_INSTITS_PER_USR];
} MyInss;
2014-12-01 23:55:08 +01:00
struct
{
bool Filled; // My centers are already filled?
2014-12-01 23:55:08 +01:00
unsigned Num;
struct
{
long CtrCod;
Rol_Role_t MaxRole;
} Ctrs[Ctr_MAX_CENTERS_PER_USR];
2016-10-28 10:03:37 +02:00
} MyCtrs;
2014-12-01 23:55:08 +01:00
struct
{
bool Filled; // My degrees are already filled?
unsigned Num;
struct
{
long DegCod;
Rol_Role_t MaxRole;
} Degs[Deg_MAX_DEGREES_PER_USR];
2016-10-28 10:03:37 +02:00
} MyDegs;
2014-12-01 23:55:08 +01:00
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];
2016-10-28 10:03:37 +02:00
} MyCrss;
Set_ShowUsrsType_t ListType; // My preference about user's list type
2015-12-29 14:24:37 +01:00
unsigned NumFollowers; // Number of users who follow me
unsigned NumFollowing; // Number of users I follow
2014-12-01 23:55:08 +01:00
} Me; // The user logged
struct
{
struct Usr_Data UsrDat;
2017-05-08 19:54:05 +02:00
unsigned NumIDToConfirm; // Used as hidden parameter to confirm a user's ID
2014-12-01 23:55:08 +01:00
} Other; // Another user, used for example to register in / remove from a course
struct Usr_ListUsrs LstUsrs[Rol_NUM_ROLES];
struct Usr_SelectedUsrs Selected;
2014-12-01 23:55:08 +01:00
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 Con_ConnectedUsrs Usrs[Rol_NUM_ROLES];
2014-12-01 23:55:08 +01:00
struct
{
long UsrCod;
bool ThisCrs;
2015-10-26 22:34:29 +01:00
time_t TimeDiff;
2014-12-01 23:55:08 +01:00
} Lst[Cfg_MAX_CONNECTED_SHOWN];
} Connected;
2017-01-28 15:58:46 +01:00
char FileNamePhoto[NAME_MAX + 1]; // File name (with no path and no .jpg) of the temporary file with the selected face
2017-03-30 11:20:06 +02:00
Enr_RegRemOneUsrAction_t RegRemAction; // Enrolment action
2014-12-01 23:55:08 +01:00
} Usrs;
struct
{
HieLvl_Level_t Current;
HieLvl_Level_t Default;
2014-12-01 23:55:08 +01:00
unsigned Allowed;
} Scope;
2019-04-04 10:45:15 +02:00
struct
{
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
2020-04-10 19:14:08 +02:00
struct Grp_Groups Grps;
2020-04-12 02:47:32 +02:00
struct Inf_Info Info;
2019-04-04 10:45:15 +02:00
struct
{
struct RecordField Field;
struct LstRecordFields LstFields;
} Records;
struct
{
long HighlightNotCod; // Notice code of a notice to be highlighted
} Notices;
} Crs;
2014-12-01 23:55:08 +01:00
struct
{
2015-10-03 00:38:01 +02:00
unsigned Id; // Each file browser in the page has a unique identifier
2014-12-01 23:55:08 +01:00
Brw_FileBrowser_t Type;
bool FullTree; // Show full tree?
bool ShowOnlyPublicFiles; // Show only public files?
bool UploadingWithDropzone;
struct
{
2017-01-13 01:51:23 +01:00
char PathAboveRootFolder[PATH_MAX + 1];
char PathRootFolder[PATH_MAX + 1];
2014-12-01 23:55:08 +01:00
} Priv;
2017-01-13 01:51:23 +01:00
char NewFilFolLnkName[NAME_MAX + 1];
struct Brw_FilFolLnk FilFolLnk;
2014-12-01 23:55:08 +01:00
unsigned Level;
2016-11-07 10:22:17 +01:00
Brw_IconViewEdit_t IconViewEdit;
2014-12-01 23:55:08 +01:00
struct
{
Brw_FileBrowser_t FileBrowser; // Type of the file browser
long Cod; // Code of the institution/center/degree/course/group related to the file browser with the clipboard
2014-12-01 23:55:08 +01:00
long WorksUsrCod; // User code of the user related to the works file browser with the clipboard
2016-11-14 19:18:34 +01:00
unsigned Level;
struct Brw_FilFolLnk FilFolLnk;
2014-12-01 23:55:08 +01:00
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;
2019-03-20 14:36:26 +01:00
struct
{
char L[2 + 1]; // Left directory: 2 first chars
char R[NAME_MAX + 1]; // Right directory: rest of chars
} TmpPubDir;
bool HiddenLevels[1 + BrwSiz_MAX_DIR_LEVELS];
char TxtStyle[64];
2014-12-01 23:55:08 +01:00
const char *InputStyle;
2020-04-14 17:15:17 +02:00
struct Asg_Assignment Asg; // Data of assignment when browsing level 1 or an assignment zone.
// TODO: Remove from global?
2014-12-01 23:55:08 +01:00
struct
{
bool CreateZIP;
2017-01-13 01:51:23 +01:00
char TmpDir[NAME_MAX + 1];
2014-12-01 23:55:08 +01:00
} ZIP;
} FileBrowser; // Struct used for a file browser
2017-06-20 14:43:26 +02:00
/* Cache */
struct
{
struct
{
long CtyCod;
2020-01-07 22:07:06 +01:00
Lan_Language_t Language;
2017-06-20 14:43:26 +02:00
char CtyName[Cty_MAX_BYTES_NAME + 1];
} CountryName;
struct
{
long InsCod;
2021-02-11 22:57:09 +01:00
char ShrtName[Cns_HIERARCHY_MAX_BYTES_SHRT_NAME + 1];
char CtyName[Cns_HIERARCHY_MAX_BYTES_FULL_NAME + 1];
2019-03-07 13:00:18 +01:00
} InstitutionShrtNameAndCty;
2020-01-06 18:27:43 +01:00
struct
{
long InsCod;
unsigned NumDpts;
} NumDptsInIns;
2020-01-07 00:42:24 +01:00
struct
{
bool Valid;
long CtyCod;
unsigned NumInss;
} NumInssInCty;
2020-01-07 00:09:30 +01:00
struct
2020-01-07 16:37:46 +01:00
{
long CtyCod;
unsigned NumCtrs;
} NumCtrsInCty;
struct
2020-01-07 00:09:30 +01:00
{
long InsCod;
unsigned NumCtrs;
} NumCtrsInIns;
2020-01-07 16:08:13 +01:00
struct
{
long CtyCod;
unsigned NumDegs;
} NumDegsInCty;
2020-01-06 18:43:48 +01:00
struct
{
long InsCod;
unsigned NumDegs;
} NumDegsInIns;
2020-01-05 02:18:20 +01:00
struct
{
long CtrCod;
unsigned NumDegs;
} NumDegsInCtr;
2020-01-07 15:11:48 +01:00
struct
{
long CtyCod;
unsigned NumCrss;
} NumCrssInCty;
2020-01-06 18:43:48 +01:00
struct
{
long InsCod;
unsigned NumCrss;
} NumCrssInIns;
2020-01-05 01:46:45 +01:00
struct
{
long CtrCod;
unsigned NumCrss;
} NumCrssInCtr;
2020-01-05 12:52:03 +01:00
struct
{
long DegCod;
unsigned NumCrss;
} NumCrssInDeg;
2020-01-07 13:14:42 +01:00
struct
{
bool Valid;
unsigned NumUsrs;
} NumUsrsWhoDontClaimToBelongToAnyCty;
struct
{
bool Valid;
unsigned NumUsrs;
} NumUsrsWhoClaimToBelongToAnotherCty;
struct
{
long CtyCod;
unsigned NumUsrs;
} NumUsrsWhoClaimToBelongToCty;
2020-01-06 18:00:23 +01:00
struct
{
long InsCod;
unsigned NumUsrs;
} NumUsrsWhoClaimToBelongToIns;
2020-01-05 01:46:45 +01:00
struct
{
long CtrCod;
unsigned NumUsrs;
} NumUsrsWhoClaimToBelongToCtr;
2017-06-20 14:43:26 +02:00
struct
{
long UsrCod;
bool IsSuperuser;
} UsrIsSuperuser;
struct
{
long UsrCod;
long InsCod;
bool Belongs;
} UsrBelongsToIns;
struct
{
long UsrCod;
long CtrCod;
bool Belongs;
} UsrBelongsToCtr;
struct
{
long UsrCod;
long DegCod;
bool Belongs;
} UsrBelongsToDeg;
struct
{
long UsrCod;
long CrsCod;
bool CountOnlyAcceptedCourses;
bool Belongs;
} UsrBelongsToCrs;
struct
{
long UsrCod;
bool Belongs;
} UsrBelongsToCurrentCrs;
struct
{
long UsrCod;
bool Accepted;
} UsrHasAcceptedInCurrentCrs;
struct
{
long UsrCod;
bool SharesAnyOfMyCrs;
} UsrSharesAnyOfMyCrs;
struct
{
long GrpCod;
bool IBelong;
} IBelongToGrp;
struct
{
long UsrCod;
bool Shares;
} UsrSharesAnyOfMyGrpsInCurrentCrs;
struct
{
long UsrCod;
long CrsCod;
Rol_Role_t Role;
} RoleUsrInCrs;
struct
{
bool Cached;
Rol_Role_t Role;
} MyRoleInCurrentCrs;
2017-10-08 16:12:58 +02:00
struct
{
long PrjCod;
2019-04-11 15:24:05 +02:00
unsigned RolesInProject;
} MyRolesInProject;
2019-02-22 14:04:54 +01:00
struct
{
long UsrCod;
unsigned NumFollowing;
unsigned NumFollowers;
} Follow;
2017-06-20 14:43:26 +02:00
} Cache;
2014-12-01 23:55:08 +01:00
};
/*****************************************************************************/
/****************************** Public prototypes ****************************/
/*****************************************************************************/
void Gbl_InitializeGlobals (void);
void Gbl_Cleanup (void);
#endif