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.
|
2021-02-09 12:43:45 +01:00
|
|
|
|
Copyright (C) 1999-2021 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
|
|
|
|
|
|
2017-05-11 23:45:46 +02:00
|
|
|
|
#include "swad_alert.h"
|
2019-05-16 14:02:06 +02:00
|
|
|
|
#include "swad_API.h"
|
2014-12-01 23:55:08 +01:00
|
|
|
|
#include "swad_assignment.h"
|
2019-07-04 10:13:51 +02:00
|
|
|
|
#include "swad_box.h"
|
2014-12-01 23:55:08 +01:00
|
|
|
|
#include "swad_centre.h"
|
|
|
|
|
#include "swad_connected.h"
|
|
|
|
|
#include "swad_config.h"
|
|
|
|
|
#include "swad_country.h"
|
|
|
|
|
#include "swad_course.h"
|
|
|
|
|
#include "swad_cryptography.h"
|
2016-03-20 16:30:52 +01:00
|
|
|
|
#include "swad_degree_type.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_file_browser.h"
|
2016-04-03 01:24:20 +02:00
|
|
|
|
#include "swad_icon.h"
|
2014-12-01 23:55:08 +01:00
|
|
|
|
#include "swad_institution.h"
|
|
|
|
|
#include "swad_layout.h"
|
|
|
|
|
#include "swad_mail.h"
|
|
|
|
|
#include "swad_mark.h"
|
2019-03-02 21:49:11 +01:00
|
|
|
|
#include "swad_media.h"
|
2015-01-02 01:19:27 +01:00
|
|
|
|
#include "swad_menu.h"
|
2016-03-31 15:03:00 +02:00
|
|
|
|
#include "swad_parameter.h"
|
2014-12-01 23:55:08 +01:00
|
|
|
|
#include "swad_password.h"
|
|
|
|
|
#include "swad_plugin.h"
|
|
|
|
|
#include "swad_record.h"
|
|
|
|
|
#include "swad_search.h"
|
|
|
|
|
#include "swad_session.h"
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/***************************** Public constants ******************************/
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/******************************* Public types ********************************/
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
struct Globals
|
|
|
|
|
{
|
|
|
|
|
struct
|
|
|
|
|
{
|
2017-01-28 15:58:46 +01:00
|
|
|
|
char DatabasePassword[Cfg_MAX_BYTES_DATABASE_PASSWORD + 1];
|
|
|
|
|
char SMTPPassword[Cfg_MAX_BYTES_SMTP_PASSWORD + 1];
|
2014-12-01 23:55:08 +01:00
|
|
|
|
} Config;
|
|
|
|
|
struct Files F;
|
|
|
|
|
MYSQL mysql;
|
|
|
|
|
pid_t PID; // PID of current process
|
2016-01-14 10:31:09 +01:00
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
int Num; // Number of form, used in form submit links
|
|
|
|
|
char Id[32]; // Identifier string used in forms
|
2017-03-07 01:56:41 +01:00
|
|
|
|
char UniqueId[32 + Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 10 + 1]; // Unique identifier string used in forms
|
2016-01-14 10:31:09 +01:00
|
|
|
|
bool Inside; // Set to true inside a form to avoid nested forms
|
|
|
|
|
} Form;
|
2019-07-04 10:13:51 +02:00
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
int Nested; // Index of top open box
|
|
|
|
|
char *Ids[Box_MAX_NESTED]; // 0 <= box index < Box_MAX_NESTED
|
|
|
|
|
} Box;
|
2017-05-10 10:25:01 +02:00
|
|
|
|
struct
|
|
|
|
|
{
|
2019-03-25 19:05:10 +01:00
|
|
|
|
size_t Num; // Number of alert
|
2019-03-09 20:12:44 +01:00
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
Ale_AlertType_t Type;
|
2019-03-25 19:05:10 +01:00
|
|
|
|
char *Text; // Message to be displayed
|
|
|
|
|
char *Section; // Where to display the alert
|
2019-03-09 20:12:44 +01:00
|
|
|
|
} List[Ale_MAX_ALERTS];
|
|
|
|
|
} Alerts; // Alert message created in a function and printed in a subsequent function.
|
2016-03-30 14:25:04 +02:00
|
|
|
|
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;
|
|
|
|
|
|
2014-12-01 23:55:08 +01:00
|
|
|
|
Act_Content_t ContentReceivedByCGI; /* Content send by the form and received by the CGI:
|
2016-03-30 14:25:04 +02:00
|
|
|
|
Act_CONTENT_NORM (if CONTENT_TYPE==text/plain) or
|
2016-10-21 00:38:34 +02:00
|
|
|
|
Act_CONT_DATA (if CONTENT_TYPE==multipart/form-data) */
|
2016-03-31 15:03:00 +02:00
|
|
|
|
struct
|
|
|
|
|
{
|
2018-10-04 21:57:25 +02:00
|
|
|
|
char StrWithoutCRLF[Par_MAX_BYTES_BOUNDARY_WITHOUT_CR_LF + 1];
|
|
|
|
|
char StrWithCRLF [Par_MAX_BYTES_BOUNDARY_WITH_CR_LF + 1];
|
2016-03-31 15:03:00 +02:00
|
|
|
|
size_t LengthWithoutCRLF;
|
|
|
|
|
size_t LengthWithCRLF;
|
|
|
|
|
} Boundary;
|
2016-03-30 14:25:04 +02:00
|
|
|
|
|
2014-12-01 23:55:08 +01:00
|
|
|
|
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
|
|
|
|
|
{
|
|
|
|
|
bool DatabaseIsOpen;
|
|
|
|
|
bool LockedTables;
|
|
|
|
|
} DB;
|
|
|
|
|
|
2016-03-30 14:25:04 +02:00
|
|
|
|
bool HiddenParamsInsertedIntoDB; // If parameters are inserted in the database in this execution
|
2014-12-01 23:55:08 +01:00
|
|
|
|
|
|
|
|
|
/* To compute execution time of the program */
|
2019-04-09 20:05:16 +02:00
|
|
|
|
struct timeval tvStart;
|
|
|
|
|
struct timeval tvPageCreated;
|
|
|
|
|
struct timeval tvPageSent;
|
2014-12-01 23:55:08 +01:00
|
|
|
|
struct timezone tz;
|
|
|
|
|
long TimeGenerationInMicroseconds;
|
|
|
|
|
long TimeSendInMicroseconds;
|
|
|
|
|
|
2017-03-07 11:03:05 +01:00
|
|
|
|
char IP[Cns_MAX_BYTES_IP + 1];
|
2017-03-07 01:56:41 +01:00
|
|
|
|
char UniqueNameEncrypted[Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 1]; // Used for session id, temporary directory names, etc.
|
2014-12-01 23:55:08 +01:00
|
|
|
|
|
|
|
|
|
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;
|
2015-11-21 20:23:28 +01:00
|
|
|
|
Mnu_Menu_t Menu;
|
|
|
|
|
unsigned SideCols;
|
2014-12-01 23:55:08 +01:00
|
|
|
|
The_Theme_t Theme;
|
|
|
|
|
Ico_IconSet_t IconSet;
|
2019-01-09 01:41:54 +01:00
|
|
|
|
char URLTheme[PATH_MAX + 1];
|
|
|
|
|
char URLIconSet[PATH_MAX + 1];
|
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;
|
|
|
|
|
} 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;
|
2015-10-27 19:00:21 +01:00
|
|
|
|
time_t StartExecutionTimeUTC;
|
2014-12-01 23:55:08 +01:00
|
|
|
|
struct DateTime Now;
|
|
|
|
|
struct Date Yesterday;
|
2015-09-03 00:59:03 +02:00
|
|
|
|
unsigned RowEvenOdd; // To alternate row colors in listings
|
2014-12-01 23:55:08 +01:00
|
|
|
|
char *ColorRows[2];
|
|
|
|
|
const char *XMLPtr;
|
|
|
|
|
struct
|
|
|
|
|
{
|
2017-01-28 15:58:46 +01:00
|
|
|
|
char FileName[PATH_MAX + 1];
|
2014-12-21 14:47:04 +01:00
|
|
|
|
} HTMLOutput;
|
2014-12-01 23:55:08 +01:00
|
|
|
|
struct
|
|
|
|
|
{
|
2021-02-11 22:57:09 +01:00
|
|
|
|
Hie_Lvl_Level_t Level; // Current level in the hierarchy: system, country, institution, centre, degree or course
|
2019-04-04 11:22:08 +02:00
|
|
|
|
long Cod; // Code of the current country, institution, centre, 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
|
2020-01-08 14:04:25 +01:00
|
|
|
|
struct ListCentres Ctrs; // List of centres in current institution
|
2021-02-11 00:58:53 +01:00
|
|
|
|
struct Ctr_Centre Ctr; // Current centre
|
2020-01-08 14:04:25 +01:00
|
|
|
|
struct ListDegrees Degs; // List of degrees in current centre
|
2021-02-11 00:58:53 +01:00
|
|
|
|
struct Deg_Degree Deg; // Current degree
|
2020-01-08 14:04:25 +01:00
|
|
|
|
struct 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;
|
2019-04-04 10:45:15 +02:00
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
unsigned Num; // Number of degree types
|
|
|
|
|
struct DegreeType *Lst; // List of degree types
|
|
|
|
|
} DegTypes;
|
2014-12-01 23:55:08 +01:00
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
unsigned Num; // Number of mail domains
|
|
|
|
|
struct Mail *Lst; // List of mail domains
|
2017-01-29 12:42:19 +01:00
|
|
|
|
Mai_DomainsOrder_t SelectedOrder;
|
2014-12-01 23:55:08 +01:00
|
|
|
|
} Mails;
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
unsigned Num; // Number of institutional links
|
|
|
|
|
struct Link *Lst; // List of institutional links
|
|
|
|
|
} Links;
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
Sch_WhatToSearch_t WhatToSearch;
|
2017-03-07 11:03:05 +01:00
|
|
|
|
char Str[Sch_MAX_BYTES_STRING_TO_FIND + 1];
|
2017-02-27 01:41:46 +01:00
|
|
|
|
bool LogSearch;
|
2014-12-01 23:55:08 +01:00
|
|
|
|
} Search;
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
unsigned Num; // Number of plugins
|
|
|
|
|
struct Plugin *Lst; // List of plugins
|
|
|
|
|
} Plugins;
|
|
|
|
|
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 UsrData UsrDat;
|
|
|
|
|
struct UsrLast 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;
|
2017-03-13 13:17:53 +01:00
|
|
|
|
char UsrIdLogin[Cns_MAX_BYTES_EMAIL_ADDRESS + 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;
|
2017-01-15 22:58:26 +01:00
|
|
|
|
char PhotoURL[PATH_MAX + 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 centres are already filled?
|
|
|
|
|
unsigned Num;
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
long CtrCod;
|
|
|
|
|
Rol_Role_t MaxRole;
|
|
|
|
|
} Ctrs[Ctr_MAX_CENTRES_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;
|
2014-12-01 23:55:08 +01:00
|
|
|
|
Usr_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 UsrData 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
|
2016-06-23 13:10:43 +02:00
|
|
|
|
struct ListUsrs LstUsrs[Rol_NUM_ROLES];
|
2019-11-15 03:34:48 +01:00
|
|
|
|
struct 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;
|
2015-12-20 01:41:07 +01:00
|
|
|
|
struct 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;
|
2016-05-05 14:20:38 +02:00
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
struct UsrData *UsrDat;
|
2016-11-18 00:17:53 +01:00
|
|
|
|
Rec_SharedRecordViewType_t TypeOfView;
|
2016-05-05 14:20:38 +02:00
|
|
|
|
} Record;
|
2014-12-01 23:55:08 +01:00
|
|
|
|
struct
|
|
|
|
|
{
|
2021-02-11 22:57:09 +01:00
|
|
|
|
Hie_Lvl_Level_t Current;
|
|
|
|
|
Hie_Lvl_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
|
|
|
|
|
{
|
|
|
|
|
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
|
|
|
|
|
{
|
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];
|
2019-04-25 15:31:42 +02:00
|
|
|
|
struct 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
|
2015-01-24 19:30:44 +01:00
|
|
|
|
long Cod; // Code of the institution/centre/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;
|
2019-04-25 15:31:42 +02:00
|
|
|
|
struct 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;
|
2017-01-13 01:51:23 +01:00
|
|
|
|
bool HiddenLevels[1 + Brw_MAX_DIR_LEVELS];
|
2014-12-01 23:55:08 +01:00
|
|
|
|
const char *TxtStyle;
|
|
|
|
|
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
|
|
|
|
|
struct
|
|
|
|
|
{
|
2015-10-27 19:00:21 +01:00
|
|
|
|
struct DateTime DateIni; // TODO: Remove in future versions
|
|
|
|
|
struct DateTime DateEnd; // TODO: Remove in future versions
|
2020-02-14 10:02:58 +01:00
|
|
|
|
time_t TimeUTC[Dat_NUM_START_END_TIME];
|
2014-12-01 23:55:08 +01:00
|
|
|
|
} DateRange;
|
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];
|
2017-06-20 14:43:26 +02:00
|
|
|
|
} InstitutionShrtName;
|
|
|
|
|
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;
|
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
|