2014-12-01 23:55:08 +01:00
// swad_file_browser.c: file browsers
/*
SWAD ( Shared Workspace At a Distance ) ,
is a web platform developed at the University of Granada ( Spain ) ,
and used to support university teaching .
This file is part of SWAD core .
2016-01-01 20:19:43 +01:00
Copyright ( C ) 1999 - 2016 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 <dirent.h> // For scandir, etc.
# include <errno.h> // For errno
# include <linux/limits.h> // For PATH_MAX
# include <linux/stddef.h> // For NULL
# include <stdlib.h> // For exit, system, malloc, free, etc
# include <string.h> // For string functions
# include <time.h> // For time
# include <sys/types.h> // For lstat, time_t
# include <sys/stat.h> // For lstat
# include <unistd.h> // For access, lstat, getpid, chdir, symlink
# include "swad_config.h"
# include "swad_database.h"
# include "swad_file_browser.h"
# include "swad_global.h"
# include "swad_ID.h"
2015-01-17 20:06:25 +01:00
# include "swad_logo.h"
2014-12-01 23:55:08 +01:00
# include "swad_mark.h"
# include "swad_notification.h"
# include "swad_parameter.h"
# include "swad_photo.h"
2015-03-14 17:39:04 +01:00
# include "swad_profile.h"
2015-12-29 00:44:51 +01:00
# include "swad_social.h"
2014-12-01 23:55:08 +01:00
# include "swad_string.h"
# include "swad_zip.h"
/*****************************************************************************/
/******************** Global variables from other modules ********************/
/*****************************************************************************/
extern struct Globals Gbl ;
/*****************************************************************************/
/****************************** Internal types *******************************/
/*****************************************************************************/
typedef enum
{
Brw_EXPAND_TREE_NOTHING ,
Brw_EXPAND_TREE_PLUS ,
Brw_EXPAND_TREE_MINUS ,
} Brw_ExpandTree_t ;
typedef enum
{
Brw_SHOW ,
Brw_ADMIN ,
} Brw_ShowOrAdmin_t ;
2015-12-21 14:20:01 +01:00
struct Brw_NumObjects
{
unsigned NumFiles ;
unsigned NumFolds ;
unsigned NumLinks ;
} ;
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/**************************** Internal constants *****************************/
/*****************************************************************************/
const char * Brw_FileTypeParamName [ Brw_NUM_FILE_TYPES ] =
{
" BrwFFL " , // Brw_IS_UNKNOWN
" BrwFil " , // Brw_IS_FILE - Do not use Fil_NAME_OF_PARAM_FILENAME_ORG
" BrwFol " , // Brw_IS_FOLDER
" BrwLnk " , // Brw_IS_LINK
} ;
2015-01-24 19:30:44 +01:00
/*
const char * Brw_Licenses_DB [ Brw_NUM_LICENSES ] =
{
" all_rights_reserved " , // All Rights Reserved
" cc_by " , // CC Attribution License
" cc_by_sa " , // CC Attribution-ShareAlike License
" cc_by_nd " , // CC Attribution-NoDerivs License
" cc_by_nc " , // CC Attribution-NonCommercial License
" cc_by_nc_sa " , // CC Attribution-NonCommercial-ShareAlike License
" cc_by_nc_nd " , // CC Attribution-NonCommercial-NoDerivs License
} ;
*/
2015-01-25 18:50:43 +01:00
// Browsers types for database "files" and "file_browser_size" tables
2015-01-25 02:07:04 +01:00
const Brw_FileBrowser_t Brw_FileBrowserForDB_files [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-02-05 22:59:48 +01:00
Brw_UNKNOWN , // Brw_UNKNOWN = 0
Brw_ADMI_DOCUM_CRS , // Brw_SHOW_DOCUM_CRS = 1
Brw_ADMI_MARKS_CRS , // Brw_SHOW_MARKS_CRS = 2
Brw_ADMI_DOCUM_CRS , // Brw_ADMI_DOCUM_CRS = 3
Brw_ADMI_SHARE_CRS , // Brw_ADMI_SHARE_CRS = 4
Brw_ADMI_SHARE_GRP , // Brw_ADMI_SHARE_GRP = 5
Brw_ADMI_WORKS_USR , // Brw_ADMI_WORKS_USR = 6
Brw_ADMI_WORKS_USR , // Brw_ADMI_WORKS_CRS = 7
Brw_ADMI_MARKS_CRS , // Brw_ADMI_MARKS_CRS = 8
Brw_ADMI_BRIEF_USR , // Brw_ADMI_BRIEF_USR = 9
Brw_ADMI_DOCUM_GRP , // Brw_SHOW_DOCUM_GRP = 10
Brw_ADMI_DOCUM_GRP , // Brw_ADMI_DOCUM_GRP = 11
Brw_ADMI_MARKS_GRP , // Brw_SHOW_MARKS_GRP = 12
Brw_ADMI_MARKS_GRP , // Brw_ADMI_MARKS_GRP = 13
Brw_ADMI_ASSIG_USR , // Brw_ADMI_ASSIG_USR = 14
Brw_ADMI_ASSIG_USR , // Brw_ADMI_ASSIG_CRS = 15
Brw_ADMI_DOCUM_DEG , // Brw_SHOW_DOCUM_DEG = 16
Brw_ADMI_DOCUM_DEG , // Brw_ADMI_DOCUM_DEG = 17
Brw_ADMI_DOCUM_CTR , // Brw_SHOW_DOCUM_CTR = 18
Brw_ADMI_DOCUM_CTR , // Brw_ADMI_DOCUM_CTR = 19
Brw_ADMI_DOCUM_INS , // Brw_SHOW_DOCUM_INS = 20
Brw_ADMI_DOCUM_INS , // Brw_ADMI_DOCUM_INS = 21
Brw_ADMI_SHARE_DEG , // Brw_ADMI_SHARE_DEG = 22
Brw_ADMI_SHARE_CTR , // Brw_ADMI_SHARE_CTR = 23
Brw_ADMI_SHARE_INS , // Brw_ADMI_SHARE_INS = 24
2016-04-22 09:47:25 +02:00
Brw_ADMI_TEACH_CRS , // Brw_ADMI_TEACH_CRS = 25
Brw_ADMI_TEACH_GRP , // Brw_ADMI_TEACH_GRP = 26
2014-12-01 23:55:08 +01:00
} ;
2016-04-18 11:19:42 +02:00
// Browsers viewable shown in search for documents
const Brw_FileBrowser_t Brw_FileBrowserForFoundDocs [ Brw_NUM_TYPES_FILE_BROWSER ] =
{
Brw_UNKNOWN , // Brw_UNKNOWN = 0
Brw_SHOW_DOCUM_CRS , // Brw_SHOW_DOCUM_CRS = 1
Brw_SHOW_MARKS_CRS , // Brw_SHOW_MARKS_CRS = 2
Brw_SHOW_DOCUM_CRS , // Brw_ADMI_DOCUM_CRS = 3
Brw_ADMI_SHARE_CRS , // Brw_ADMI_SHARE_CRS = 4
Brw_ADMI_SHARE_GRP , // Brw_ADMI_SHARE_GRP = 5
Brw_ADMI_WORKS_USR , // Brw_ADMI_WORKS_USR = 6
Brw_ADMI_WORKS_USR , // Brw_ADMI_WORKS_CRS = 7
Brw_ADMI_MARKS_CRS , // Brw_ADMI_MARKS_CRS = 8
Brw_ADMI_BRIEF_USR , // Brw_ADMI_BRIEF_USR = 9
Brw_SHOW_DOCUM_GRP , // Brw_SHOW_DOCUM_GRP = 10
Brw_SHOW_DOCUM_GRP , // Brw_ADMI_DOCUM_GRP = 11
Brw_SHOW_MARKS_GRP , // Brw_SHOW_MARKS_GRP = 12
Brw_SHOW_MARKS_GRP , // Brw_ADMI_MARKS_GRP = 13
Brw_ADMI_ASSIG_USR , // Brw_ADMI_ASSIG_USR = 14
Brw_ADMI_ASSIG_USR , // Brw_ADMI_ASSIG_CRS = 15
Brw_SHOW_DOCUM_DEG , // Brw_SHOW_DOCUM_DEG = 16
Brw_SHOW_DOCUM_DEG , // Brw_ADMI_DOCUM_DEG = 17
Brw_SHOW_DOCUM_CTR , // Brw_SHOW_DOCUM_CTR = 18
Brw_SHOW_DOCUM_CTR , // Brw_ADMI_DOCUM_CTR = 19
Brw_SHOW_DOCUM_INS , // Brw_SHOW_DOCUM_INS = 20
Brw_SHOW_DOCUM_INS , // Brw_ADMI_DOCUM_INS = 21
Brw_ADMI_SHARE_DEG , // Brw_ADMI_SHARE_DEG = 22
Brw_ADMI_SHARE_CTR , // Brw_ADMI_SHARE_CTR = 23
Brw_ADMI_SHARE_INS , // Brw_ADMI_SHARE_INS = 24
2016-04-22 09:47:25 +02:00
Brw_ADMI_TEACH_CRS , // Brw_ADMI_TEACH_CRS = 25
Brw_ADMI_TEACH_GRP , // Brw_ADMI_TEACH_GRP = 26
2016-04-18 11:19:42 +02:00
} ;
2015-01-25 18:50:43 +01:00
// Browsers types for database "clipboard" table
2015-01-24 19:30:44 +01:00
static const Brw_FileBrowser_t Brw_FileBrowserForDB_clipboard [ Brw_NUM_TYPES_FILE_BROWSER ] =
2015-01-22 01:39:00 +01:00
{
2015-02-05 22:59:48 +01:00
Brw_UNKNOWN , // Brw_UNKNOWN = 0
Brw_ADMI_DOCUM_CRS , // Brw_SHOW_DOCUM_CRS = 1
Brw_ADMI_MARKS_CRS , // Brw_SHOW_MARKS_CRS = 2
Brw_ADMI_DOCUM_CRS , // Brw_ADMI_DOCUM_CRS = 3
Brw_ADMI_SHARE_CRS , // Brw_ADMI_SHARE_CRS = 4
Brw_ADMI_SHARE_GRP , // Brw_ADMI_SHARE_GRP = 5
Brw_ADMI_WORKS_USR , // Brw_ADMI_WORKS_USR = 6
Brw_ADMI_WORKS_CRS , // Brw_ADMI_WORKS_CRS = 7
Brw_ADMI_MARKS_CRS , // Brw_ADMI_MARKS_CRS = 8
Brw_ADMI_BRIEF_USR , // Brw_ADMI_BRIEF_USR = 9
Brw_ADMI_DOCUM_GRP , // Brw_SHOW_DOCUM_GRP = 10
Brw_ADMI_DOCUM_GRP , // Brw_ADMI_DOCUM_GRP = 11
Brw_ADMI_MARKS_GRP , // Brw_SHOW_MARKS_GRP = 12
Brw_ADMI_MARKS_GRP , // Brw_ADMI_MARKS_GRP = 13
Brw_ADMI_ASSIG_USR , // Brw_ADMI_ASSIG_USR = 14
Brw_ADMI_ASSIG_CRS , // Brw_ADMI_ASSIG_CRS = 15
Brw_ADMI_DOCUM_DEG , // Brw_SHOW_DOCUM_DEG = 16
Brw_ADMI_DOCUM_DEG , // Brw_ADMI_DOCUM_DEG = 17
Brw_ADMI_DOCUM_CTR , // Brw_SHOW_DOCUM_CTR = 18
Brw_ADMI_DOCUM_CTR , // Brw_ADMI_DOCUM_CTR = 19
Brw_ADMI_DOCUM_INS , // Brw_SHOW_DOCUM_INS = 20
Brw_ADMI_DOCUM_INS , // Brw_ADMI_DOCUM_INS = 21
Brw_ADMI_SHARE_DEG , // Brw_ADMI_SHARE_DEG = 22
Brw_ADMI_SHARE_CTR , // Brw_ADMI_SHARE_CTR = 23
Brw_ADMI_SHARE_INS , // Brw_ADMI_SHARE_INS = 24
2016-04-22 09:47:25 +02:00
Brw_ADMI_TEACH_CRS , // Brw_ADMI_TEACH_CRS = 25
Brw_ADMI_TEACH_GRP , // Brw_ADMI_TEACH_GRP = 26
2015-01-22 01:39:00 +01:00
} ;
2015-01-25 18:50:43 +01:00
// Browsers types for database "expanded_folders" table
2015-01-24 19:30:44 +01:00
static const Brw_FileBrowser_t Brw_FileBrowserForDB_expanded_folders [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-02-05 22:59:48 +01:00
Brw_UNKNOWN , // Brw_UNKNOWN = 0
Brw_ADMI_DOCUM_CRS , // Brw_SHOW_DOCUM_CRS = 1
Brw_ADMI_MARKS_CRS , // Brw_SHOW_MARKS_CRS = 2
Brw_ADMI_DOCUM_CRS , // Brw_ADMI_DOCUM_CRS = 3
Brw_ADMI_SHARE_CRS , // Brw_ADMI_SHARE_CRS = 4
Brw_ADMI_SHARE_GRP , // Brw_ADMI_SHARE_GRP = 5
Brw_ADMI_WORKS_USR , // Brw_ADMI_WORKS_USR = 6
Brw_ADMI_WORKS_CRS , // Brw_ADMI_WORKS_CRS = 7
Brw_ADMI_MARKS_CRS , // Brw_ADMI_MARKS_CRS = 8
Brw_ADMI_BRIEF_USR , // Brw_ADMI_BRIEF_USR = 9
Brw_ADMI_DOCUM_GRP , // Brw_SHOW_DOCUM_GRP = 10
Brw_ADMI_DOCUM_GRP , // Brw_ADMI_DOCUM_GRP = 11
Brw_ADMI_MARKS_GRP , // Brw_SHOW_MARKS_GRP = 12
Brw_ADMI_MARKS_GRP , // Brw_ADMI_MARKS_GRP = 13
Brw_ADMI_ASSIG_USR , // Brw_ADMI_ASSIG_USR = 14
Brw_ADMI_ASSIG_CRS , // Brw_ADMI_ASSIG_CRS = 15
Brw_ADMI_DOCUM_DEG , // Brw_SHOW_DOCUM_DEG = 16
Brw_ADMI_DOCUM_DEG , // Brw_ADMI_DOCUM_DEG = 17
Brw_ADMI_DOCUM_CTR , // Brw_SHOW_DOCUM_CTR = 18
Brw_ADMI_DOCUM_CTR , // Brw_ADMI_DOCUM_CTR = 19
Brw_ADMI_DOCUM_INS , // Brw_SHOW_DOCUM_INS = 20
Brw_ADMI_DOCUM_INS , // Brw_ADMI_DOCUM_INS = 21
Brw_ADMI_SHARE_DEG , // Brw_ADMI_SHARE_DEG = 22
Brw_ADMI_SHARE_CTR , // Brw_ADMI_SHARE_CTR = 23
Brw_ADMI_SHARE_INS , // Brw_ADMI_SHARE_INS = 24
2016-04-22 09:47:25 +02:00
Brw_ADMI_TEACH_CRS , // Brw_ADMI_TEACH_CRS = 25
Brw_ADMI_TEACH_GRP , // Brw_ADMI_TEACH_GRP = 26
2014-12-01 23:55:08 +01:00
} ;
2015-01-25 18:50:43 +01:00
// Browsers types for database "file_browser_last" table
// Assignments and works are stored as one in file_browser_last...
// ...because a user views them at the same time
2015-01-24 19:30:44 +01:00
static const Brw_FileBrowser_t Brw_FileBrowserForDB_file_browser_last [ Brw_NUM_TYPES_FILE_BROWSER ] =
{
2015-02-05 22:59:48 +01:00
Brw_UNKNOWN , // Brw_UNKNOWN = 0
Brw_ADMI_DOCUM_CRS , // Brw_SHOW_DOCUM_CRS = 1
Brw_ADMI_MARKS_CRS , // Brw_SHOW_MARKS_CRS = 2
Brw_ADMI_DOCUM_CRS , // Brw_ADMI_DOCUM_CRS = 3
Brw_ADMI_SHARE_CRS , // Brw_ADMI_SHARE_CRS = 4
Brw_ADMI_SHARE_GRP , // Brw_ADMI_SHARE_GRP = 5
Brw_ADMI_ASSIG_USR , // Brw_ADMI_WORKS_USR = 6
Brw_ADMI_ASSIG_CRS , // Brw_ADMI_WORKS_CRS = 7
Brw_ADMI_MARKS_CRS , // Brw_ADMI_MARKS_CRS = 8
Brw_ADMI_BRIEF_USR , // Brw_ADMI_BRIEF_USR = 9
Brw_ADMI_DOCUM_GRP , // Brw_SHOW_DOCUM_GRP = 10
Brw_ADMI_DOCUM_GRP , // Brw_ADMI_DOCUM_GRP = 11
Brw_ADMI_MARKS_GRP , // Brw_SHOW_MARKS_GRP = 12
Brw_ADMI_MARKS_GRP , // Brw_ADMI_MARKS_GRP = 13
Brw_ADMI_ASSIG_USR , // Brw_ADMI_ASSIG_USR = 14
Brw_ADMI_ASSIG_CRS , // Brw_ADMI_ASSIG_CRS = 15
Brw_ADMI_DOCUM_DEG , // Brw_SHOW_DOCUM_DEG = 16
Brw_ADMI_DOCUM_DEG , // Brw_ADMI_DOCUM_DEG = 17
Brw_ADMI_DOCUM_CTR , // Brw_SHOW_DOCUM_CTR = 18
Brw_ADMI_DOCUM_CTR , // Brw_ADMI_DOCUM_CTR = 19
Brw_ADMI_DOCUM_INS , // Brw_SHOW_DOCUM_INS = 20
Brw_ADMI_DOCUM_INS , // Brw_ADMI_DOCUM_INS = 21
Brw_ADMI_SHARE_DEG , // Brw_ADMI_SHARE_DEG = 22
Brw_ADMI_SHARE_CTR , // Brw_ADMI_SHARE_CTR = 23
Brw_ADMI_SHARE_INS , // Brw_ADMI_SHARE_INS = 24
2016-04-22 09:47:25 +02:00
Brw_ADMI_TEACH_CRS , // Brw_ADMI_TEACH_CRS = 25
Brw_ADMI_TEACH_GRP , // Brw_ADMI_TEACH_GRP = 26
2015-01-24 19:30:44 +01:00
} ;
2014-12-01 23:55:08 +01:00
// Internal names of root folders
const char * Brw_RootFolderInternalNames [ Brw_NUM_TYPES_FILE_BROWSER ] =
{
2015-01-26 12:39:48 +01:00
" " , // Brw_UNKNOWN
Brw_INTERNAL_NAME_ROOT_FOLDER_DOWNLOAD , // Brw_SHOW_DOCUM_CRS
Brw_INTERNAL_NAME_ROOT_FOLDER_MARKS , // Brw_SHOW_MARKS_CRS
Brw_INTERNAL_NAME_ROOT_FOLDER_DOWNLOAD , // Brw_ADMI_DOCUM_CRS
Brw_INTERNAL_NAME_ROOT_FOLDER_SHARED , // Brw_ADMI_SHARE_CRS
Brw_INTERNAL_NAME_ROOT_FOLDER_SHARED , // Brw_ADMI_SHARE_GRP
Brw_INTERNAL_NAME_ROOT_FOLDER_WORKS , // Brw_ADMI_WORKS_USR
Brw_INTERNAL_NAME_ROOT_FOLDER_WORKS , // Brw_ADMI_WORKS_CRS
Brw_INTERNAL_NAME_ROOT_FOLDER_MARKS , // Brw_ADMI_MARKS_CRS
2015-02-05 22:59:48 +01:00
Brw_INTERNAL_NAME_ROOT_FOLDER_BRIEF , // Brw_ADMI_BRIEF_USR
2015-01-26 12:39:48 +01:00
Brw_INTERNAL_NAME_ROOT_FOLDER_DOWNLOAD , // Brw_SHOW_DOCUM_GRP
Brw_INTERNAL_NAME_ROOT_FOLDER_DOWNLOAD , // Brw_ADMI_DOCUM_GRP
Brw_INTERNAL_NAME_ROOT_FOLDER_MARKS , // Brw_SHOW_MARKS_GRP
Brw_INTERNAL_NAME_ROOT_FOLDER_MARKS , // Brw_ADMI_MARKS_GRP
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS , // Brw_ADMI_ASSIG_USR
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS , // Brw_ADMI_ASSIG_CRS
Brw_INTERNAL_NAME_ROOT_FOLDER_DOCUMENTS , // Brw_SHOW_DOCUM_DEG
Brw_INTERNAL_NAME_ROOT_FOLDER_DOCUMENTS , // Brw_ADMI_DOCUM_DEG
Brw_INTERNAL_NAME_ROOT_FOLDER_DOCUMENTS , // Brw_SHOW_DOCUM_CTR
Brw_INTERNAL_NAME_ROOT_FOLDER_DOCUMENTS , // Brw_ADMI_DOCUM_CTR
Brw_INTERNAL_NAME_ROOT_FOLDER_DOCUMENTS , // Brw_SHOW_DOCUM_INS
Brw_INTERNAL_NAME_ROOT_FOLDER_DOCUMENTS , // Brw_ADMI_DOCUM_INS
2015-02-05 22:59:48 +01:00
Brw_INTERNAL_NAME_ROOT_FOLDER_SHARED_FILES , // Brw_ADMI_SHARE_DEG
Brw_INTERNAL_NAME_ROOT_FOLDER_SHARED_FILES , // Brw_ADMI_SHARE_CTR
Brw_INTERNAL_NAME_ROOT_FOLDER_SHARED_FILES , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
Brw_INTERNAL_NAME_ROOT_FOLDER_TEACHERS , // Brw_ADMI_TEACH_CRS
Brw_INTERNAL_NAME_ROOT_FOLDER_TEACHERS , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
// Number of columns of a file browser
2015-01-24 19:30:44 +01:00
static const unsigned Brw_NumColumnsInExpTree [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-10-05 00:22:16 +02:00
4 , // Brw_UNKNOWN
4 , // Brw_SHOW_DOCUM_CRS
2015-01-26 12:39:48 +01:00
4 , // Brw_SHOW_MARKS_CRS
2015-10-05 00:22:16 +02:00
7 , // Brw_ADMI_DOCUM_CRS
7 , // Brw_ADMI_SHARE_CRS
7 , // Brw_ADMI_SHARE_GRP
7 , // Brw_ADMI_WORKS_USR
7 , // Brw_ADMI_WORKS_CRS
9 , // Brw_ADMI_MARKS_CRS
7 , // Brw_ADMI_BRIEF_USR
4 , // Brw_SHOW_DOCUM_GRP
7 , // Brw_ADMI_DOCUM_GRP
2015-01-26 12:39:48 +01:00
4 , // Brw_SHOW_MARKS_GRP
2015-10-05 00:22:16 +02:00
9 , // Brw_ADMI_MARKS_GRP
7 , // Brw_ADMI_ASSIG_USR
7 , // Brw_ADMI_ASSIG_CRS
4 , // Brw_SHOW_DOCUM_DEG
7 , // Brw_ADMI_DOCUM_DEG
4 , // Brw_SHOW_DOCUM_CTR
7 , // Brw_ADMI_DOCUM_CTR
4 , // Brw_SHOW_DOCUM_INS
7 , // Brw_ADMI_DOCUM_INS
7 , // Brw_ADMI_SHARE_DEG
7 , // Brw_ADMI_SHARE_CTR
7 , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
7 , // Brw_ADMI_TEACH_CRS
7 , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const bool Brw_FileBrowserIsEditable [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
false , // Brw_UNKNOWN
false , // Brw_SHOW_DOCUM_CRS
false , // Brw_SHOW_MARKS_CRS
true , // Brw_ADMI_DOCUM_CRS
true , // Brw_ADMI_SHARE_CRS
true , // Brw_ADMI_SHARE_GRP
true , // Brw_ADMI_WORKS_USR
true , // Brw_ADMI_WORKS_CRS
true , // Brw_ADMI_MARKS_CRS
true , // Brw_ADMI_BRIEF_USR
false , // Brw_SHOW_DOCUM_GRP
true , // Brw_ADMI_DOCUM_GRP
false , // Brw_SHOW_MARKS_GRP
true , // Brw_ADMI_MARKS_GRP
true , // Brw_ADMI_ASSIG_USR
true , // Brw_ADMI_ASSIG_CRS
false , // Brw_SHOW_DOCUM_DEG
true , // Brw_ADMI_DOCUM_DEG
false , // Brw_SHOW_DOCUM_CTR
true , // Brw_ADMI_DOCUM_CTR
false , // Brw_SHOW_DOCUM_INS
true , // Brw_ADMI_DOCUM_INS
2015-02-05 22:59:48 +01:00
true , // Brw_ADMI_SHARE_DEG
true , // Brw_ADMI_SHARE_CTR
true , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
true , // Brw_ADMI_TEACH_CRS
true , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActSeeAdm [ Brw_NUM_TYPES_FILE_BROWSER ] =
2015-01-20 00:32:15 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActSeeDocCrs , // Brw_SHOW_DOCUM_CRS
ActSeeMrkCrs , // Brw_SHOW_MARKS_CRS
ActAdmDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActAdmShaCrs , // Brw_ADMI_SHARE_CRS
ActAdmShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActAdmAsgWrkUsr , // Brw_ADMI_WORKS_USR
ActAdmAsgWrkCrs , // Brw_ADMI_WORKS_CRS
ActAdmMrkCrs , // Brw_ADMI_MARKS_CRS
ActAdmBrf , // Brw_ADMI_BRIEF_USR
ActSeeDocGrp , // Brw_SHOW_DOCUM_GRP
ActAdmDocGrp , // Brw_ADMI_DOCUM_GRP
ActSeeMrkGrp , // Brw_SHOW_MARKS_GRP
ActAdmMrkGrp , // Brw_ADMI_MARKS_GRP
ActAdmAsgWrkUsr , // Brw_ADMI_ASSIG_USR
ActAdmAsgWrkCrs , // Brw_ADMI_ASSIG_CRS
ActSeeDocDeg , // Brw_SHOW_DOCUM_DEG
ActAdmDocDeg , // Brw_ADMI_DOCUM_DEG
ActSeeDocCtr , // Brw_SHOW_DOCUM_CTR
ActAdmDocCtr , // Brw_ADMI_DOCUM_CTR
ActSeeDocIns , // Brw_SHOW_DOCUM_INS
ActAdmDocIns , // Brw_ADMI_DOCUM_INS
2016-01-02 17:07:58 +01:00
ActAdmShaDeg , // Brw_ADMI_SHARE_DEG
ActAdmShaCtr , // Brw_ADMI_SHARE_CTR
ActAdmShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActAdmTchCrs , // Brw_ADMI_TEACH_CRS
ActAdmTchGrp , // Brw_ADMI_TEACH_GRP
2015-01-20 00:32:15 +01:00
} ;
2016-03-17 02:08:11 +01:00
static const Act_Action_t Brw_ActFromSeeToAdm [ Brw_NUM_TYPES_FILE_BROWSER ] =
{
ActUnk , // Brw_UNKNOWN
ActAdmDocCrs , // Brw_SHOW_DOCUM_CRS
ActAdmMrkCrs , // Brw_SHOW_MARKS_CRS
ActUnk , // Brw_ADMI_DOCUM_CRS
ActUnk , // Brw_ADMI_SHARE_CRS
ActUnk , // Brw_ADMI_SHARE_GRP
ActUnk , // Brw_ADMI_WORKS_USR
ActUnk , // Brw_ADMI_WORKS_CRS
ActUnk , // Brw_ADMI_MARKS_CRS
ActUnk , // Brw_ADMI_BRIEF_USR
ActAdmDocGrp , // Brw_SHOW_DOCUM_GRP
ActUnk , // Brw_ADMI_DOCUM_GRP
ActAdmMrkGrp , // Brw_SHOW_MARKS_GRP
ActUnk , // Brw_ADMI_MARKS_GRP
ActUnk , // Brw_ADMI_ASSIG_USR
ActUnk , // Brw_ADMI_ASSIG_CRS
ActAdmDocDeg , // Brw_SHOW_DOCUM_DEG
ActUnk , // Brw_ADMI_DOCUM_DEG
ActAdmDocCtr , // Brw_SHOW_DOCUM_CTR
ActUnk , // Brw_ADMI_DOCUM_CTR
ActAdmDocIns , // Brw_SHOW_DOCUM_INS
ActUnk , // Brw_ADMI_DOCUM_INS
ActUnk , // Brw_ADMI_SHARE_DEG
ActUnk , // Brw_ADMI_SHARE_CTR
ActUnk , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActUnk , // Brw_ADMI_TEACH_CRS
ActUnk , // Brw_ADMI_TEACH_GRP
2016-03-17 02:08:11 +01:00
} ;
static const Act_Action_t Brw_ActFromAdmToSee [ Brw_NUM_TYPES_FILE_BROWSER ] =
{
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActSeeDocCrs , // Brw_ADMI_DOCUM_CRS
ActUnk , // Brw_ADMI_SHARE_CRS
ActUnk , // Brw_ADMI_SHARE_GRP
ActUnk , // Brw_ADMI_WORKS_USR
ActUnk , // Brw_ADMI_WORKS_CRS
ActSeeMrkCrs , // Brw_ADMI_MARKS_CRS
ActUnk , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActSeeDocGrp , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActSeeMrkGrp , // Brw_ADMI_MARKS_GRP
ActUnk , // Brw_ADMI_ASSIG_USR
ActUnk , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActSeeDocDeg , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActSeeDocCtr , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActSeeDocIns , // Brw_ADMI_DOCUM_INS
ActUnk , // Brw_ADMI_SHARE_DEG
ActUnk , // Brw_ADMI_SHARE_CTR
ActUnk , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActUnk , // Brw_ADMI_TEACH_CRS
ActUnk , // Brw_ADMI_TEACH_GRP
2016-03-17 02:08:11 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActChgZone [ Brw_NUM_TYPES_FILE_BROWSER ] =
2015-01-20 00:32:15 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActChgToSeeDocCrs , // Brw_SHOW_DOCUM_CRS
ActChgToSeeMrk , // Brw_SHOW_MARKS_CRS
ActChgToAdmDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActChgToAdmSha , // Brw_ADMI_SHARE_CRS
ActChgToAdmSha , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_ADMI_WORKS_USR
ActUnk , // Brw_ADMI_WORKS_CRS
ActChgToAdmMrk , // Brw_ADMI_MARKS_CRS
ActUnk , // Brw_ADMI_BRIEF_USR
ActChgToSeeDocCrs , // Brw_SHOW_DOCUM_GRP
ActChgToAdmDocCrs , // Brw_ADMI_DOCUM_GRP
ActChgToSeeMrk , // Brw_SHOW_MARKS_GRP
ActChgToAdmMrk , // Brw_ADMI_MARKS_GRP
ActUnk , // Brw_ADMI_ASSIG_USR
ActUnk , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActUnk , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActUnk , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActUnk , // Brw_ADMI_DOCUM_INS
2015-02-05 22:59:48 +01:00
ActUnk , // Brw_ADMI_SHARE_DEG
ActUnk , // Brw_ADMI_SHARE_CTR
ActUnk , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActChgToAdmTch , // Brw_ADMI_TEACH_CRS
ActChgToAdmTch , // Brw_ADMI_TEACH_GRP
2015-01-20 00:32:15 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActShow [ Brw_NUM_TYPES_FILE_BROWSER ] =
2015-01-20 00:32:15 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActShoDocCrs , // Brw_ADMI_DOCUM_CRS
ActUnk , // Brw_ADMI_SHARE_CRS
ActUnk , // Brw_ADMI_SHARE_GRP
ActUnk , // Brw_ADMI_WORKS_USR
ActUnk , // Brw_ADMI_WORKS_CRS
ActShoMrkCrs , // Brw_ADMI_MARKS_CRS
ActUnk , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActShoDocGrp , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActShoMrkGrp , // Brw_ADMI_MARKS_GRP
ActUnk , // Brw_ADMI_ASSIG_USR
ActUnk , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActShoDocDeg , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActShoDocCtr , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActShoDocIns , // Brw_ADMI_DOCUM_INS
2015-02-05 22:59:48 +01:00
ActUnk , // Brw_ADMI_SHARE_DEG
ActUnk , // Brw_ADMI_SHARE_CTR
ActUnk , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActUnk , // Brw_ADMI_TEACH_CRS
ActUnk , // Brw_ADMI_TEACH_GRP
2015-01-20 00:32:15 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActHide [ Brw_NUM_TYPES_FILE_BROWSER ] =
2015-01-20 00:32:15 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActHidDocCrs , // Brw_ADMI_DOCUM_CRS
ActUnk , // Brw_ADMI_SHARE_CRS
ActUnk , // Brw_ADMI_SHARE_GRP
ActUnk , // Brw_ADMI_WORKS_USR
ActUnk , // Brw_ADMI_WORKS_CRS
ActHidMrkCrs , // Brw_ADMI_MARKS_CRS
ActUnk , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActHidDocGrp , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActHidMrkGrp , // Brw_ADMI_MARKS_GRP
ActUnk , // Brw_ADMI_ASSIG_USR
ActUnk , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActHidDocDeg , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActHidDocCtr , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActHidDocIns , // Brw_ADMI_DOCUM_INS
2015-02-05 22:59:48 +01:00
ActUnk , // Brw_ADMI_SHARE_DEG
ActUnk , // Brw_ADMI_SHARE_CTR
ActUnk , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActUnk , // Brw_ADMI_TEACH_CRS
ActUnk , // Brw_ADMI_TEACH_GRP
2015-01-20 00:32:15 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActReqDatFile [ Brw_NUM_TYPES_FILE_BROWSER ] =
2015-01-20 00:32:15 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActReqDatSeeDocCrs , // Brw_SHOW_DOCUM_CRS
ActReqDatSeeMrkCrs , // Brw_SHOW_MARKS_CRS
ActReqDatAdmDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActReqDatShaCrs , // Brw_ADMI_SHARE_CRS
ActReqDatShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActReqDatWrkUsr , // Brw_ADMI_WORKS_USR
ActReqDatWrkCrs , // Brw_ADMI_WORKS_CRS
ActReqDatAdmMrkCrs , // Brw_ADMI_MARKS_CRS
ActReqDatBrf , // Brw_ADMI_BRIEF_USR
ActReqDatSeeDocGrp , // Brw_SHOW_DOCUM_GRP
ActReqDatAdmDocGrp , // Brw_ADMI_DOCUM_GRP
ActReqDatSeeMrkGrp , // Brw_SHOW_MARKS_GRP
ActReqDatAdmMrkGrp , // Brw_ADMI_MARKS_GRP
ActReqDatAsgUsr , // Brw_ADMI_ASSIG_USR
ActReqDatAsgCrs , // Brw_ADMI_ASSIG_CRS
ActReqDatSeeDocDeg , // Brw_SHOW_DOCUM_DEG
ActReqDatAdmDocDeg , // Brw_ADMI_DOCUM_DEG
ActReqDatSeeDocCtr , // Brw_SHOW_DOCUM_CTR
ActReqDatAdmDocCtr , // Brw_ADMI_DOCUM_CTR
ActReqDatSeeDocIns , // Brw_SHOW_DOCUM_INS
ActReqDatAdmDocIns , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActReqDatShaDeg , // Brw_ADMI_SHARE_DEG
ActReqDatShaCtr , // Brw_ADMI_SHARE_CTR
ActReqDatShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActReqDatTchCrs , // Brw_ADMI_TEACH_CRS
ActReqDatTchGrp , // Brw_ADMI_TEACH_GRP
2015-01-20 00:32:15 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActDowFile [ Brw_NUM_TYPES_FILE_BROWSER ] =
2015-01-20 00:32:15 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActDowSeeDocCrs , // Brw_SHOW_DOCUM_CRS
ActSeeMyMrkCrs , // Brw_SHOW_MARKS_CRS
ActDowAdmDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActDowShaCrs , // Brw_ADMI_SHARE_CRS
ActDowShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActDowWrkUsr , // Brw_ADMI_WORKS_USR
ActDowWrkCrs , // Brw_ADMI_WORKS_CRS
ActDowAdmMrkCrs , // Brw_ADMI_MARKS_CRS
ActDowBrf , // Brw_ADMI_BRIEF_USR
ActDowSeeDocGrp , // Brw_SHOW_DOCUM_GRP
ActDowAdmDocGrp , // Brw_ADMI_DOCUM_GRP
ActSeeMyMrkGrp , // Brw_SHOW_MARKS_GRP
ActDowAdmMrkGrp , // Brw_ADMI_MARKS_GRP
ActDowAsgUsr , // Brw_ADMI_ASSIG_USR
ActDowAsgCrs , // Brw_ADMI_ASSIG_CRS
ActDowSeeDocDeg , // Brw_SHOW_DOCUM_DEG
ActDowAdmDocDeg , // Brw_ADMI_DOCUM_DEG
ActDowSeeDocCtr , // Brw_SHOW_DOCUM_CTR
ActDowAdmDocCtr , // Brw_ADMI_DOCUM_CTR
ActDowSeeDocIns , // Brw_SHOW_DOCUM_INS
ActDowAdmDocIns , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActDowShaDeg , // Brw_ADMI_SHARE_DEG
ActDowShaCtr , // Brw_ADMI_SHARE_CTR
ActDowShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActDowTchCrs , // Brw_ADMI_TEACH_CRS
ActDowTchGrp , // Brw_ADMI_TEACH_GRP
2015-01-20 00:32:15 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActAskRemoveFile [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActReqRemFilDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActReqRemFilShaCrs , // Brw_ADMI_SHARE_CRS
ActReqRemFilShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActReqRemFilWrkUsr , // Brw_ADMI_WORKS_USR
ActReqRemFilWrkCrs , // Brw_ADMI_WORKS_CRS
ActReqRemFilMrkCrs , // Brw_ADMI_MARKS_CRS
ActReqRemFilBrf , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActReqRemFilDocGrp , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActReqRemFilMrkGrp , // Brw_ADMI_MARKS_GRP
ActReqRemFilAsgUsr , // Brw_ADMI_ASSIG_USR
ActReqRemFilAsgCrs , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActReqRemFilDocDeg , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActReqRemFilDocCtr , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActReqRemFilDocIns , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActReqRemFilShaDeg , // Brw_ADMI_SHARE_DEG
ActReqRemFilShaCtr , // Brw_ADMI_SHARE_CTR
ActReqRemFilShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActReqRemFilTchCrs , // Brw_ADMI_TEACH_CRS
ActReqRemFilTchGrp , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActRemoveFile [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActRemFilDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActRemFilShaCrs , // Brw_ADMI_SHARE_CRS
ActRemFilShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActRemFilWrkUsr , // Brw_ADMI_WORKS_USR
ActRemFilWrkCrs , // Brw_ADMI_WORKS_CRS
ActRemFilMrkCrs , // Brw_ADMI_MARKS_CRS
ActRemFilBrf , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActRemFilDocGrp , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActRemFilMrkGrp , // Brw_ADMI_MARKS_GRP
ActRemFilAsgUsr , // Brw_ADMI_ASSIG_USR
ActRemFilAsgCrs , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActRemFilDocDeg , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActRemFilDocCtr , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActRemFilDocIns , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActRemFilShaDeg , // Brw_ADMI_SHARE_DEG
ActRemFilShaCtr , // Brw_ADMI_SHARE_CTR
ActRemFilShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActRemFilTchCrs , // Brw_ADMI_TEACH_CRS
ActRemFilTchGrp , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActRemoveFolder [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActRemFolDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActRemFolShaCrs , // Brw_ADMI_SHARE_CRS
ActRemFolShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActRemFolWrkUsr , // Brw_ADMI_WORKS_USR
ActRemFolWrkCrs , // Brw_ADMI_WORKS_CRS
ActRemFolMrkCrs , // Brw_ADMI_MARKS_CRS
ActRemFolBrf , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActRemFolDocGrp , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActRemFolMrkGrp , // Brw_ADMI_MARKS_GRP
ActRemFolAsgUsr , // Brw_ADMI_ASSIG_USR
ActRemFolAsgCrs , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActRemFolDocDeg , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActRemFolDocCtr , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActRemFolDocIns , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActRemFolShaDeg , // Brw_ADMI_SHARE_DEG
ActRemFolShaCtr , // Brw_ADMI_SHARE_CTR
ActRemFolShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActRemFolTchCrs , // Brw_ADMI_TEACH_CRS
ActRemFolTchGrp , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActRemoveFolderNotEmpty [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActRemTreDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActRemTreShaCrs , // Brw_ADMI_SHARE_CRS
ActRemTreShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActRemTreWrkUsr , // Brw_ADMI_WORKS_USR
ActRemTreWrkCrs , // Brw_ADMI_WORKS_CRS
ActRemTreMrkCrs , // Brw_ADMI_MARKS_CRS
ActRemTreBrf , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActRemTreDocGrp , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActRemTreMrkGrp , // Brw_ADMI_MARKS_GRP
ActRemTreAsgUsr , // Brw_ADMI_ASSIG_USR
ActRemTreAsgCrs , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActRemTreDocDeg , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActRemTreDocCtr , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActRemTreDocIns , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActRemTreShaDeg , // Brw_ADMI_SHARE_DEG
ActRemTreShaCtr , // Brw_ADMI_SHARE_CTR
ActRemTreShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActRemTreTchCrs , // Brw_ADMI_TEACH_CRS
ActRemTreTchGrp , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActCopy [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActCopDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActCopShaCrs , // Brw_ADMI_SHARE_CRS
ActCopShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActCopWrkUsr , // Brw_ADMI_WORKS_USR
ActCopWrkCrs , // Brw_ADMI_WORKS_CRS
ActCopMrkCrs , // Brw_ADMI_MARKS_CRS
ActCopBrf , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActCopDocGrp , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActCopMrkGrp , // Brw_ADMI_MARKS_GRP
ActCopAsgUsr , // Brw_ADMI_ASSIG_USR
ActCopAsgCrs , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActCopDocDeg , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActCopDocCtr , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActCopDocIns , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActCopShaDeg , // Brw_ADMI_SHARE_DEG
ActCopShaCtr , // Brw_ADMI_SHARE_CTR
ActCopShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActCopTchCrs , // Brw_ADMI_TEACH_CRS
ActCopTchGrp , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActPaste [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActPasDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActPasShaCrs , // Brw_ADMI_SHARE_CRS
ActPasShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActPasWrkUsr , // Brw_ADMI_WORKS_USR
ActPasWrkCrs , // Brw_ADMI_WORKS_CRS
ActPasMrkCrs , // Brw_ADMI_MARKS_CRS
ActPasBrf , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActPasDocGrp , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActPasMrkGrp , // Brw_ADMI_MARKS_GRP
ActPasAsgUsr , // Brw_ADMI_ASSIG_USR
ActPasAsgCrs , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActPasDocDeg , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActPasDocCtr , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActPasDocIns , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActPasShaDeg , // Brw_ADMI_SHARE_DEG
ActPasShaCtr , // Brw_ADMI_SHARE_CTR
ActPasShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActPasTchCrs , // Brw_ADMI_TEACH_CRS
ActPasTchGrp , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActFormCreate [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActFrmCreDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActFrmCreShaCrs , // Brw_ADMI_SHARE_CRS
ActFrmCreShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActFrmCreWrkUsr , // Brw_ADMI_WORKS_USR
ActFrmCreWrkCrs , // Brw_ADMI_WORKS_CRS
ActFrmCreMrkCrs , // Brw_ADMI_MARKS_CRS
ActFrmCreBrf , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActFrmCreDocGrp , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActFrmCreMrkGrp , // Brw_ADMI_MARKS_GRP
ActFrmCreAsgUsr , // Brw_ADMI_ASSIG_USR
ActFrmCreAsgCrs , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActFrmCreDocDeg , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActFrmCreDocCtr , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActFrmCreDocIns , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActFrmCreShaDeg , // Brw_ADMI_SHARE_DEG
ActFrmCreShaCtr , // Brw_ADMI_SHARE_CTR
ActFrmCreShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActFrmCreTchCrs , // Brw_ADMI_TEACH_CRS
ActFrmCreTchGrp , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActCreateFolder [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActCreFolDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActCreFolShaCrs , // Brw_ADMI_SHARE_CRS
ActCreFolShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActCreFolWrkUsr , // Brw_ADMI_WORKS_USR
ActCreFolWrkCrs , // Brw_ADMI_WORKS_CRS
ActCreFolMrkCrs , // Brw_ADMI_MARKS_CRS
ActCreFolBrf , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActCreFolDocGrp , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActCreFolMrkGrp , // Brw_ADMI_MARKS_GRP
ActCreFolAsgUsr , // Brw_ADMI_ASSIG_USR
ActCreFolAsgCrs , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActCreFolDocDeg , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActCreFolDocCtr , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActCreFolDocIns , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActCreFolShaDeg , // Brw_ADMI_SHARE_DEG
ActCreFolShaCtr , // Brw_ADMI_SHARE_CTR
ActCreFolShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActCreFolTchCrs , // Brw_ADMI_TEACH_CRS
ActCreFolTchGrp , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActCreateLink [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActCreLnkDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActCreLnkShaCrs , // Brw_ADMI_SHARE_CRS
ActCreLnkShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActCreLnkWrkUsr , // Brw_ADMI_WORKS_USR
ActCreLnkWrkCrs , // Brw_ADMI_WORKS_CRS
ActUnk , // Brw_ADMI_MARKS_CRS
ActCreLnkBrf , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActCreLnkDocGrp , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActUnk , // Brw_ADMI_MARKS_GRP
ActCreLnkAsgUsr , // Brw_ADMI_ASSIG_USR
ActCreLnkAsgCrs , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActCreLnkDocDeg , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActCreLnkDocCtr , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActCreLnkDocIns , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActCreLnkShaDeg , // Brw_ADMI_SHARE_DEG
ActCreLnkShaCtr , // Brw_ADMI_SHARE_CTR
ActCreLnkShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActCreLnkTchCrs , // Brw_ADMI_TEACH_CRS
ActCreLnkTchGrp , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActRenameFolder [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActRenFolDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActRenFolShaCrs , // Brw_ADMI_SHARE_CRS
ActRenFolShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActRenFolWrkUsr , // Brw_ADMI_WORKS_USR
ActRenFolWrkCrs , // Brw_ADMI_WORKS_CRS
ActRenFolMrkCrs , // Brw_ADMI_MARKS_CRS
ActRenFolBrf , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActRenFolDocGrp , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActRenFolMrkGrp , // Brw_ADMI_MARKS_GRP
ActRenFolAsgUsr , // Brw_ADMI_ASSIG_USR
ActRenFolAsgCrs , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActRenFolDocDeg , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActRenFolDocCtr , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActRenFolDocIns , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActRenFolShaDeg , // Brw_ADMI_SHARE_DEG
ActRenFolShaCtr , // Brw_ADMI_SHARE_CTR
ActRenFolShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActRenFolTchCrs , // Brw_ADMI_TEACH_CRS
ActRenFolTchGrp , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActUploadFileDropzone [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActRcvFilDocCrsDZ , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActRcvFilShaCrsDZ , // Brw_ADMI_SHARE_CRS
ActRcvFilShaGrpDZ , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActRcvFilWrkUsrDZ , // Brw_ADMI_WORKS_USR
ActRcvFilWrkCrsDZ , // Brw_ADMI_WORKS_CRS
ActRcvFilMrkCrsDZ , // Brw_ADMI_MARKS_CRS
ActRcvFilBrfDZ , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActRcvFilDocGrpDZ , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActRcvFilMrkGrpDZ , // Brw_ADMI_MARKS_GRP
ActRcvFilAsgUsrDZ , // Brw_ADMI_ASSIG_USR
ActRcvFilAsgCrsDZ , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActRcvFilDocDegDZ , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActRcvFilDocCtrDZ , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActRcvFilDocInsDZ , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActRcvFilShaDegDZ , // Brw_ADMI_SHARE_DEG
ActRcvFilShaCtrDZ , // Brw_ADMI_SHARE_CTR
ActRcvFilShaInsDZ , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActRcvFilTchCrsDZ , // Brw_ADMI_TEACH_CRS
ActRcvFilTchGrpDZ , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActUploadFileClassic [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActRcvFilDocCrsCla , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActRcvFilShaCrsCla , // Brw_ADMI_SHARE_CRS
ActRcvFilShaGrpCla , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActRcvFilWrkUsrCla , // Brw_ADMI_WORKS_USR
ActRcvFilWrkCrsCla , // Brw_ADMI_WORKS_CRS
ActRcvFilMrkCrsCla , // Brw_ADMI_MARKS_CRS
ActRcvFilBrfCla , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActRcvFilDocGrpCla , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActRcvFilMrkGrpCla , // Brw_ADMI_MARKS_GRP
ActRcvFilAsgUsrCla , // Brw_ADMI_ASSIG_USR
ActRcvFilAsgCrsCla , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActRcvFilDocDegCla , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActRcvFilDocCtrCla , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActRcvFilDocInsCla , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActRcvFilShaDegCla , // Brw_ADMI_SHARE_DEG
ActRcvFilShaCtrCla , // Brw_ADMI_SHARE_CTR
ActRcvFilShaInsCla , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActRcvFilTchCrsCla , // Brw_ADMI_TEACH_CRS
ActRcvFilTchGrpCla , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActRefreshAfterUploadFiles [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActAdmDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActAdmShaCrs , // Brw_ADMI_SHARE_CRS
ActAdmShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActAdmAsgWrkUsr , // Brw_ADMI_WORKS_USR
ActAdmAsgWrkCrs , // Brw_ADMI_WORKS_CRS
ActAdmMrkCrs , // Brw_ADMI_MARKS_CRS
ActAdmBrf , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActAdmDocGrp , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActAdmMrkGrp , // Brw_ADMI_MARKS_GRP
ActAdmAsgWrkUsr , // Brw_ADMI_ASSIG_USR
ActAdmAsgWrkCrs , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActAdmDocDeg , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActAdmDocCtr , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActAdmDocIns , // Brw_ADMI_DOCUM_INS
2016-01-02 17:07:58 +01:00
ActAdmShaDeg , // Brw_ADMI_SHARE_DEG
ActAdmShaCtr , // Brw_ADMI_SHARE_CTR
ActAdmShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActAdmTchCrs , // Brw_ADMI_TEACH_CRS
ActAdmTchGrp , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActExpandFolder [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActExpSeeDocCrs , // Brw_SHOW_DOCUM_CRS
ActExpSeeMrkCrs , // Brw_SHOW_MARKS_CRS
ActExpAdmDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActExpShaCrs , // Brw_ADMI_SHARE_CRS
ActExpShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActExpWrkUsr , // Brw_ADMI_WORKS_USR
ActExpWrkCrs , // Brw_ADMI_WORKS_CRS
ActExpAdmMrkCrs , // Brw_ADMI_MARKS_CRS
ActExpBrf , // Brw_ADMI_BRIEF_USR
ActExpSeeDocGrp , // Brw_SHOW_DOCUM_GRP
ActExpAdmDocGrp , // Brw_ADMI_DOCUM_GRP
ActExpSeeMrkGrp , // Brw_SHOW_MARKS_GRP
ActExpAdmMrkGrp , // Brw_ADMI_MARKS_GRP
ActExpAsgUsr , // Brw_ADMI_ASSIG_USR
ActExpAsgCrs , // Brw_ADMI_ASSIG_CRS
ActExpSeeDocDeg , // Brw_SHOW_DOCUM_DEG
ActExpAdmDocDeg , // Brw_ADMI_DOCUM_DEG
ActExpSeeDocCtr , // Brw_SHOW_DOCUM_CTR
ActExpAdmDocCtr , // Brw_ADMI_DOCUM_CTR
ActExpSeeDocIns , // Brw_SHOW_DOCUM_INS
ActExpAdmDocIns , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActExpShaDeg , // Brw_ADMI_SHARE_DEG
ActExpShaCtr , // Brw_ADMI_SHARE_CTR
ActExpShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActExpTchCrs , // Brw_ADMI_TEACH_CRS
ActExpTchGrp , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActContractFolder [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActConSeeDocCrs , // Brw_SHOW_DOCUM_CRS
ActConSeeMrkCrs , // Brw_SHOW_MARKS_CRS
ActConAdmDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActConShaCrs , // Brw_ADMI_SHARE_CRS
ActConShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActConWrkUsr , // Brw_ADMI_WORKS_USR
ActConWrkCrs , // Brw_ADMI_WORKS_CRS
ActConAdmMrkCrs , // Brw_ADMI_MARKS_CRS
ActConBrf , // Brw_ADMI_BRIEF_USR
ActConSeeDocGrp , // Brw_SHOW_DOCUM_GRP
ActConAdmDocGrp , // Brw_ADMI_DOCUM_GRP
ActConSeeMrkGrp , // Brw_SHOW_MARKS_GRP
ActConAdmMrkGrp , // Brw_ADMI_MARKS_GRP
ActConAsgUsr , // Brw_ADMI_ASSIG_USR
ActConAsgCrs , // Brw_ADMI_ASSIG_CRS
ActConSeeDocDeg , // Brw_SHOW_DOCUM_DEG
ActConAdmDocDeg , // Brw_ADMI_DOCUM_DEG
ActConSeeDocCtr , // Brw_SHOW_DOCUM_CTR
ActConAdmDocCtr , // Brw_ADMI_DOCUM_CTR
ActConSeeDocIns , // Brw_SHOW_DOCUM_INS
ActConAdmDocIns , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActConShaDeg , // Brw_ADMI_SHARE_DEG
ActConShaCtr , // Brw_ADMI_SHARE_CTR
ActConShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActConTchCrs , // Brw_ADMI_TEACH_CRS
ActConTchGrp , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
2015-01-24 19:30:44 +01:00
static const Act_Action_t Brw_ActRecDatFile [ Brw_NUM_TYPES_FILE_BROWSER ] =
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
ActUnk , // Brw_UNKNOWN
ActUnk , // Brw_SHOW_DOCUM_CRS
ActUnk , // Brw_SHOW_MARKS_CRS
ActChgDatAdmDocCrs , // Brw_ADMI_DOCUM_CRS
2015-12-29 13:18:25 +01:00
ActChgDatShaCrs , // Brw_ADMI_SHARE_CRS
ActChgDatShaGrp , // Brw_ADMI_SHARE_GRP
2015-01-26 12:39:48 +01:00
ActChgDatWrkUsr , // Brw_ADMI_WORKS_USR
ActChgDatWrkCrs , // Brw_ADMI_WORKS_CRS
ActChgDatAdmMrkCrs , // Brw_ADMI_MARKS_CRS
ActChgDatBrf , // Brw_ADMI_BRIEF_USR
ActUnk , // Brw_SHOW_DOCUM_GRP
ActChgDatAdmDocGrp , // Brw_ADMI_DOCUM_GRP
ActUnk , // Brw_SHOW_MARKS_GRP
ActChgDatAdmMrkGrp , // Brw_ADMI_MARKS_GRP
ActChgDatAsgUsr , // Brw_ADMI_ASSIG_USR
ActChgDatAsgCrs , // Brw_ADMI_ASSIG_CRS
ActUnk , // Brw_SHOW_DOCUM_DEG
ActChgDatAdmDocDeg , // Brw_ADMI_DOCUM_DEG
ActUnk , // Brw_SHOW_DOCUM_CTR
ActChgDatAdmDocCtr , // Brw_ADMI_DOCUM_CTR
ActUnk , // Brw_SHOW_DOCUM_INS
ActChgDatAdmDocIns , // Brw_ADMI_DOCUM_INS
2015-12-29 13:18:25 +01:00
ActChgDatShaDeg , // Brw_ADMI_SHARE_DEG
ActChgDatShaCtr , // Brw_ADMI_SHARE_CTR
ActChgDatShaIns , // Brw_ADMI_SHARE_INS
2016-04-22 09:47:25 +02:00
ActChgDatTchCrs , // Brw_ADMI_TEACH_CRS
ActChgDatTchGrp , // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
} ;
/* All quotas must be multiple of 1 GiB (Gibibyte)*/
# define Brw_GiB (1024ULL*1024ULL*1024ULL)
/* Maximum quotas for each type of file browser */
2015-01-26 12:39:48 +01:00
# define Brw_MAX_QUOTA_DOCUM_INS (64ULL*Brw_GiB)
# define Brw_MAX_FILES_DOCUM_INS 5000
# define Brw_MAX_FOLDS_DOCUM_INS 1000
2015-01-18 18:45:10 +01:00
2015-01-26 12:39:48 +01:00
# define Brw_MAX_QUOTA_DOCUM_CTR (64ULL*Brw_GiB)
# define Brw_MAX_FILES_DOCUM_CTR 5000
# define Brw_MAX_FOLDS_DOCUM_CTR 1000
2015-01-18 18:45:10 +01:00
2015-01-26 12:39:48 +01:00
# define Brw_MAX_QUOTA_DOCUM_DEG (64ULL*Brw_GiB)
# define Brw_MAX_FILES_DOCUM_DEG 5000
# define Brw_MAX_FOLDS_DOCUM_DEG 1000
2015-01-18 18:45:10 +01:00
2015-01-26 12:39:48 +01:00
# define Brw_MAX_QUOTA_DOCUM_CRS (64ULL*Brw_GiB)
# define Brw_MAX_FILES_DOCUM_CRS 5000
# define Brw_MAX_FOLDS_DOCUM_CRS 1000
2014-12-01 23:55:08 +01:00
2015-01-26 12:39:48 +01:00
# define Brw_MAX_QUOTA_DOCUM_GRP ( 1ULL*Brw_GiB)
# define Brw_MAX_FILES_DOCUM_GRP 1000
# define Brw_MAX_FOLDS_DOCUM_GRP 500
2014-12-01 23:55:08 +01:00
2016-04-22 09:47:25 +02:00
# define Brw_MAX_QUOTA_TEACH_CRS Brw_MAX_QUOTA_DOCUM_CRS
# define Brw_MAX_FILES_TEACH_CRS Brw_MAX_FILES_DOCUM_CRS
# define Brw_MAX_FOLDS_TEACH_CRS Brw_MAX_FOLDS_DOCUM_CRS
# define Brw_MAX_QUOTA_TEACH_GRP Brw_MAX_QUOTA_DOCUM_GRP
# define Brw_MAX_FILES_TEACH_GRP Brw_MAX_FILES_DOCUM_GRP
# define Brw_MAX_FOLDS_TEACH_GRP Brw_MAX_FOLDS_DOCUM_GRP
2015-02-05 22:59:48 +01:00
# define Brw_MAX_QUOTA_SHARE_INS (64ULL*Brw_GiB)
# define Brw_MAX_FILES_SHARE_INS 5000
# define Brw_MAX_FOLDS_SHARE_INS 1000 // Many, because every student can create his own directories
# define Brw_MAX_QUOTA_SHARE_CTR (64ULL*Brw_GiB)
# define Brw_MAX_FILES_SHARE_CTR 5000
# define Brw_MAX_FOLDS_SHARE_CTR 1000 // Many, because every student can create his own directories
# define Brw_MAX_QUOTA_SHARE_DEG (64ULL*Brw_GiB)
# define Brw_MAX_FILES_SHARE_DEG 5000
# define Brw_MAX_FOLDS_SHARE_DEG 1000 // Many, because every student can create his own directories
2015-01-26 12:39:48 +01:00
# define Brw_MAX_QUOTA_SHARE_CRS (64ULL*Brw_GiB)
# define Brw_MAX_FILES_SHARE_CRS 5000
# define Brw_MAX_FOLDS_SHARE_CRS 1000 // Many, because every student can create his own directories
2014-12-01 23:55:08 +01:00
2015-01-26 12:39:48 +01:00
# define Brw_MAX_QUOTA_SHARE_GRP ( 1ULL*Brw_GiB)
# define Brw_MAX_FILES_SHARE_GRP 1000
# define Brw_MAX_FOLDS_SHARE_GRP 500 // Many, because every student can create his own directories
2014-12-01 23:55:08 +01:00
2015-01-26 12:39:48 +01:00
# define Brw_MAX_QUOTA_ASSIG_PER_STD ( 2ULL*Brw_GiB)
# define Brw_MAX_FILES_ASSIG_PER_STD 500
# define Brw_MAX_FOLDS_ASSIG_PER_STD 50
2014-12-01 23:55:08 +01:00
2016-01-20 14:07:15 +01:00
# define Brw_MAX_QUOTA_WORKS_PER_STD ( 2ULL*Brw_GiB)
# define Brw_MAX_FILES_WORKS_PER_STD 500
# define Brw_MAX_FOLDS_WORKS_PER_STD 50
2014-12-01 23:55:08 +01:00
2015-01-26 12:39:48 +01:00
# define Brw_MAX_QUOTA_MARKS_CRS ( 1ULL*Brw_GiB)
# define Brw_MAX_FILES_MARKS_CRS 500
# define Brw_MAX_FOLDS_MARKS_CRS 50
2014-12-01 23:55:08 +01:00
2015-01-26 12:39:48 +01:00
# define Brw_MAX_QUOTA_MARKS_GRP ( 1ULL*Brw_GiB)
# define Brw_MAX_FILES_MARKS_GRP 200
# define Brw_MAX_FOLDS_MARKS_GRP 20
2014-12-01 23:55:08 +01:00
2015-01-26 12:39:48 +01:00
const unsigned long long Brw_MAX_QUOTA_BRIEF [ Rol_NUM_ROLES ] = // MaxRole is used
2014-12-01 23:55:08 +01:00
{
0 , // Rol_ROLE_UNKNOWN
2015-02-01 20:17:24 +01:00
0 , // Rol_ROLE_GUEST__
2014-12-01 23:55:08 +01:00
0 , // Rol_ROLE_VISITOR
32ULL * Brw_GiB , // Rol_ROLE_STUDENT
64ULL * Brw_GiB , // Rol_ROLE_TEACHER
2015-02-01 20:17:24 +01:00
0 , // Rol_ROLE_DEG_ADM
0 , // Rol_ROLE_CTR_ADM
0 , // Rol_ROLE_INS_ADM
0 , // Rol_ROLE_SYS_ADM
2014-12-01 23:55:08 +01:00
} ;
2016-01-20 14:07:15 +01:00
# define Brw_MAX_FILES_BRIEF 5000
# define Brw_MAX_FOLDS_BRIEF 1000
2014-12-01 23:55:08 +01:00
/* Extensions allowed for uploaded files */
const char * Brw_FileExtensionsAllowed [ ] =
{
" 3gp " , // Video Android mobile
" 7z " ,
" asm " ,
" avi " ,
" bas " ,
" bat " ,
" bbl " ,
" bib " ,
" bin " ,
" bmp " ,
" bz2 " ,
" c " ,
" cc " ,
" cdr " ,
" cpp " ,
" css " ,
" csv " ,
" dmg " ,
" doc " ,
" docx " ,
" dotm " ,
" dwd " ,
" eps " ,
" fdf " ,
" flv " ,
" gif " ,
" gz " ,
" h " ,
" hex " ,
" htm " ,
" html " ,
" img " ,
" java " ,
" jpg " ,
" jpeg " ,
" latex " ,
" m " ,
" mdb " ,
" mht " ,
" mhtml " ,
" mid " ,
" mov " ,
" mp3 " ,
" mp4 " ,
" mpeg " ,
" mpg " ,
" mpp " ,
" mus " ,
" nb " ,
" odb " ,
" odc " ,
" odf " ,
" odg " ,
" odi " ,
" odm " ,
" odp " ,
" ods " ,
" odt " ,
" otg " ,
" otp " ,
" ots " ,
" ott " ,
" pas " ,
" pl " ,
" pdf " ,
" png " ,
" pps " ,
" ppsx " ,
" ppt " ,
" pptx " ,
" ps " ,
" pss " ,
" qt " ,
" r " ,
" ram " ,
" rar " ,
" raw " ,
" rdata " ,
" rm " ,
" rp " , // Axure, http://www.axure.com/
" rtf " ,
" s " ,
" sav " , // SPSS Data File
" sbs " ,
" sf3 " ,
" sgp " ,
" spp " ,
" spo " ,
" sps " ,
" swf " ,
" sws " ,
" tar " ,
" tex " ,
" tgz " ,
" tif " ,
" txt " ,
" voc " ,
" vp " , // Justinmind, http://www.justinmind.com/
" wav " ,
" wma " ,
" wmv " ,
" wxm " ,
" wxmx " ,
" xls " ,
" xlsx " ,
" zip " ,
} ;
const unsigned Brw_NUM_FILE_EXT_ALLOWED = sizeof ( Brw_FileExtensionsAllowed ) / sizeof ( Brw_FileExtensionsAllowed [ 0 ] ) ;
/* MIME types allowed for uploades files */
const char * Brw_MIMETypesAllowed [ ] =
{
" application/ " , //
" application/acrobat " , // PDF
" application/arj " , // compressed archive arj
" application/binary " , //
" application/bzip2 " , // Bzip 2 UNIX Compressed File
" application/cdr " , // Corel Draw (CDR)
" application/coreldraw " , // Corel Draw (CDR)
" application/css-stylesheet " , // Hypertext Cascading Style Sheet
" application/csv " , // CSV, Comma Separated Values
" application/data " , //
" application/download " , // zip files in Firefox caused by an error?
" application/excel " , // Microsoft Excel xls
" application/finale " , // Finale .mus
2016-01-20 14:07:15 +01:00
" application/force " , // PDF uploaded from Firefox
2014-12-01 23:55:08 +01:00
" application/force-download " , // RAR uploaded from Firefox
" application/futuresplash " , // Flash
" application/gzip " , // GNU ZIP gz, gzip
" application/gzip-compressed " , // GNU ZIP gz, gzip
" application/gzipped " , // GNU ZIP gz, gzip
" application/msaccess " , // Microsoft Access mdb
" application/msexcel " , // Microsoft Excel xla, xls, xlt, xlw
" application/mspowerpoint " , // Microsoft PowerPoint pot, pps, ppt
" application/mathematica " , // Mathematica
" application/matlab " , // Matlab
" application/mfile " , // Matlab
" application/mpp " , // Microsoft Project mpp
" application/msproj " , // Microsoft Project mpp
" application/msproject " , // Microsoft Project mpp
" application/msword " , // Microsoft Word doc, word, w6w
" application/mswrite " , // Microsoft Write wri
" application/octet " , // uninterpreted binary bin
" application/octet-binary " ,
" application/octetstream " , // uninterpreted binary bin
" application/octet-stream " , // uninterpreted binary bin
" application/pdf " , // Adobe Acrobat pdf
" application/postscript " , // PostScript ai, eps, ps
" application/powerpoint " , // Microsoft PowerPoint pot, pps, ppt
" application/rar " , // RAR
" application/rtf " , // RTF
" application/self-extracting " , // Compressed file, self-extracting
" application/stream " , // PDF in Mac?
" application/unknown " ,
" application/vnd.fdf " , // Forms Data Format
" application/vnd.msexcel " , // Microsoft Excel .xls
" application/vnd.ms-excel " , // Microsoft Excel .xls
" application/vnd.ms-powerpoint " , // Microsoft PowerPoint .ppt or .pps
" application/vnd.ms-project " , // Microsoft Project .mpp
" application/vnd.ms-word " , // Microsoft Word .doc
" application/vnd.ms-word.template.macroenabled.12 " , // Microsoft Word template .dotm
" application/vnd.oasis.opendocument.text " , // OpenOffice Text .odt
" application/vnd.oasis.opendocument.spreadsheet " , // OpenOffice Hoja of c<> lculo .ods
" application/vnd.oasis.opendocument.presentation " , // OpenOffice Presentaci<63> n .odp
" application/vnd.oasis.opendocument.graphics " , // OpenOffice Dibujo .odg
" application/vnd.oasis.opendocument.chart " , // OpenOffice Gr<47> fica .odc
" application/vnd.oasis.opendocument.formula " , // OpenOffice F<> rmula matem<65> tica .odf
" application/vnd.oasis.opendocument.database " , // OpenOffice database .odb
" application/vnd.oasis.opendocument.image " , // OpenOffice Imagen .odi
" application/vnd.oasis.opendocument.text-master " , // OpenOffice Documento maestro .odm
" application/vnd.oasis.opendocument.text-template " , // OpenOffice Text .ott
" application/vnd.oasis.opendocument.spreadsheet-template " , // OpenOffice Hoja of c<> lculo .ots
" application/vnd.oasis.opendocument.presentation-template " , // OpenOffice Presentaci<63> n .otp
" application/vnd.oasis.opendocument.graphics-template " , // OpenOffice Dibujo .otg
" application/vnd.openxmlformats-officedocument.presentationml.presentation " , // Power Point Microsoft Office Open XML Format Presentation Slide Show .pptx
" application/vnd.openxmlformats-officedocument.presentationml.slideshow " , // Power Point Microsoft Office Open XML Format Presentation Slide Show .ppsx
" application/vnd.openxmlformats-officedocument.spreadsheetml.sheet " , // Excel Microsoft Office Open XML Format Spreadsheet .xlsx
" application/vnd.openxmlformats-officedocument.wordprocessingml.document " , // Word Microsoft Office Open XML Format Document .docx
" application/vnd.pdf " , // PDF
" application/x-7z-compressed " , // 7 zip compressed file
" application/x-bz2 " , // Bzip 2 UNIX Compressed File
" application/x-bzip " , // Bzip 2 UNIX Compressed File
" application/x-cdr " , // Corel Draw (CDR)
" application/x-compress " , // GNU ZIP gz, gzip
" application/x-compressed " , // GNU ZIP gz, gzip, Bzip 2 UNIX Compressed File
" application/x-compressed-tar " , // TGZ
" application/x-coreldraw " , // Corel Draw (CDR)
" application/x-dos_ms_project " , // Microsoft Project mpp
" application/x-download " , // RAR
" application/x-file-download " , // PDF
" application/x-forcedownload " , // PDF
" application/x-gtar " , // GNU tar gtar
" application/x-gunzip " , // GNU ZIP gz, gzip
" application/x-gzip " , // GNU ZIP gz, gzip
" application/x-latex " , // LateX latex (LateX)
" application/x-midi " , // MIDI mid
" application/x-msdos-program " , // MSDOS program
" application/x-msdownload " , // dll, exe
" application/x-mspowerpoint " , // Microsoft PowerPoint pot, pps, ppt
" application/x-msproject " , // Microsoft Project mpp
" application/x-ms-project " , // Microsoft Project mpp
" application/x-msword " , // PDF?
" application/x-mswrite " , // PDF
2015-04-15 19:48:33 +02:00
" application/x-octet-stream " , // PDF
2014-12-01 23:55:08 +01:00
" application/x-rar " , // .rar
" application/x-shockwave-flash " , // Flash
" application/x-shockwave-flash2-preview " , // Flash
" application/x-unknown " , // Unknown file type
" application/x-vnd.oasis.opendocument.chart " , // OpenOffice Gr<47> fica .odc
" application/x-vnd.oasis.opendocument.database " , // OpenOffice database .odb
" application/x-vnd.oasis.opendocument.formula " , // OpenOffice F<> rmula matem<65> tica .odf
" application/x-vnd.oasis.opendocument.graphics " , // OpenOffice Dibujo .odg
" application/x-vnd.oasis.opendocument.graphics-template " , // OpenOffice Dibujo .otg
" application/x-vnd.oasis.opendocument.image " , // OpenOffice Imagen .odi
" application/x-vnd.oasis.opendocument.presentation " , // OpenOffice Presentaci<63> n .odp
" application/x-vnd.oasis.opendocument.presentation-template " , // OpenOffice Presentaci<63> n .otp
" application/x-vnd.oasis.opendocument.spreadsheet " , // OpenOffice Hoja of c<> lculo .ods
" application/x-vnd.oasis.opendocument.spreadsheet-template " , // OpenOffice Hoja of c<> lculo .ots
" application/x-vnd.oasis.opendocument.text " , // OpenOffice Text .odt
" application/x-vnd.oasis.opendocument.text-master " , // OpenOffice Documento maestro .odm
" application/x-vnd.oasis.opendocument.text-template " , // OpenOffice Text .ott
" application/x-pdf " , // PDF
" application/x-shockwave-flash " , // Macromedia Shockwave swf
" application/x-spss " , // SPSS File sav spp sbs sps spo
" application/x-rar-compressed " , // RAR archive rar
" application/x-tar " , // 4.3BSD tar format tar
" application/x-tex " , // TeX tex (LateX)
" application/x-tgz " , // TGZ
" application/x-troff " , // .s assembler source file
" application/x-zip " , // ZIP archive zip
" application/x-zip-compressed " , // ZIP archive zip
" application/zip " , // ZIP archive zip
" audio/basic " , // BASIC audio (u-law) au, snd
" audio/mp4 " , // MPEG-4
" audio/mpeg " , // MP3
" audio/midi " , // MIDI mid, midi
" audio/x-aiff " , // AIFF audio aif, aifc, aiff
" audio/x-mpeg " , // MPEG audio mp3
" audio/x-ms-wma " , // WMA (Windows Media Audio File)
" audio/x-pn-realaudio " , // RealAudio ra, ram
" audio/x-pn-realaudio-plugin " , // RealAudio plug-in rpm
" audio/x-voice " , // Voice voc
" audio/x-wav " , // Microsoft Windows WAVE audio wav
" binary/octet-stream " , // uninterpreted binary bin
" document/unknown " , // Some bowsers send this (?)
" file/unknown " , // Some bowsers send this (?)
" gzip/document " , // GNU ZIP gz, gzip
" image/bmp " , // Bitmap bmp
" image/cdr " , // Corel Draw (CDR)
" image/gif " , // GIF image gif
" image/jpeg " , // JPEG image jpe, jpeg, jpg
" image/pdf " , // PDF
" image/pjpeg " , // JPEG image jpe, jpeg, jpg
" image/pict " , // Macintosh PICT pict
" image/png " , // Portable Network Graphic png
" image/tiff " , // TIFF image tif, tiff
" image/vnd.rn-realflash " , // Flash
" image/x-cdr " , // Corel Draw (CDR)
" image/x-cmu-raster " , // CMU raster ras
" image/x-eps " , // Imagen postcript
" image/x-png " , // Portable Network Graphic png
" image/x-portable-anymap " , // PBM Anymap format pnm
" image/x-portable-bitmap " , // PBM Bitmap format pbm
" image/x-portable-graymap " , // PBM Graymap format pgm
" image/x-portable-pixmap " , // PBM Pixmap format ppm
" image/x-rgb " , // RGB image rgb
" image/x-xbitmap " , // X Bitmap xbm
" image/x-xpixmap " , // X Pixmap xpm
" image/x-xwindowdump " , // X BrowserWindow System dump xwd
" message/rfc822 " , // Files .mht and .mhtml
" mime/pdf " , // Adobe Acrobat pdf
" multipart/x-gzip " , // GNU ZIP archive gzip
" multipart/x-zip " , // PKZIP archive zip
" octet/pdf " , // PDF
" text/anytext " , // CSV, Comma Separated Values?
" text/comma-separated-values " , // CSV, Comma Separated Values
" text/css " , // Hypertext Cascading Style Sheet
" text/csv " , // CSV, Comma Separated Values
" text/html " , // HTML htm, html, php
" text/pdf " , // PDF
" text/plain " , // plain text C, cc, h, txt. BAS
" text/richtext " , // RTF
" text/xml " , //
2015-10-07 19:55:13 +02:00
" text/x-c " , // Source code in C
2014-12-01 23:55:08 +01:00
" text/x-chdr " , // Source code in C
" text/x-csrc " , // Source code in C
" text/x-c++src " , // Source code in C++
" text/x-latex " , // LateX
2015-03-02 17:29:13 +01:00
" text/x-objcsrc " , // Source code
2014-12-01 23:55:08 +01:00
" text/x-pdf " , // PDF
" video/3gpp " , // Video Android mobile
" video/avi " , // AVI
" video/mp4 " , // MPEG-4
" video/mpeg " , // MPEG video mpe, mpeg, mpg
" video/msvideo " , // Microsoft Windows video avi
" video/quicktime " , // QuickTime video mov, qt
2015-01-16 18:51:45 +01:00
" video/unknown " , // ?
2014-12-01 23:55:08 +01:00
" video/x-ms-asf " , // WMA (Windows Media Audio File)
" video/x-ms-wmv " , // WMV (Windows Media File)
" video/x-msvideo " , // AVI
" x-world/x-vrml " , // VRML Worlds wrl
2014-12-12 18:50:36 +01:00
" x-java " , // Source code in Java
2014-12-01 23:55:08 +01:00
" zz-application/zz-winassoc-cdr " , // Corel Draw (CDR)
" zz-application/zz-winassoc-mpp " // Microsoft Project mpp
} ;
const unsigned Brw_NUM_MIME_TYPES_ALLOWED = sizeof ( Brw_MIMETypesAllowed ) / sizeof ( Brw_MIMETypesAllowed [ 0 ] ) ;
/*****************************************************************************/
/*************************** Internal prototypes *****************************/
/*****************************************************************************/
static long Brw_GetGrpSettings ( void ) ;
static void Brw_GetDataCurrentGrp ( void ) ;
static void Brw_GetParamsPathInTreeAndFileName ( void ) ;
static void Brw_SetPathFileBrowser ( void ) ;
2015-11-10 02:23:55 +01:00
static void Brw_CreateFoldersAssignmentsIfNotExist ( long ZoneUsrCod ) ;
2014-12-01 23:55:08 +01:00
static void Brw_SetAndCheckQuota ( void ) ;
static void Brw_SetMaxQuota ( void ) ;
static bool Brw_CheckIfQuotaExceded ( void ) ;
static void Brw_ShowFileBrowserNormal ( void ) ;
static void Brw_ShowFileBrowsersAsgWrkCrs ( void ) ;
static void Brw_ShowFileBrowsersAsgWrkUsr ( void ) ;
2015-01-20 23:33:55 +01:00
static void Brw_FormToChangeCrsGrpZone ( void ) ;
2014-12-01 23:55:08 +01:00
static void Brw_GetSelectedGroupData ( struct GroupData * GrpDat , bool AbortOnError ) ;
static void Brw_ShowDataOwnerAsgWrk ( struct UsrData * UsrDat ) ;
static void Brw_ShowFileBrowser ( void ) ;
2016-03-17 02:08:11 +01:00
static void Brw_PutIconToEditFileBrowser ( void ) ;
static void Brw_PutIconToSeeFileBrowser ( void ) ;
2014-12-01 23:55:08 +01:00
static void Brw_WriteTopBeforeShowingFileBrowser ( void ) ;
static void Brw_UpdateLastAccess ( void ) ;
static void Brw_UpdateGrpLastAccZone ( const char * FieldNameDB , long GrpCod ) ;
static void Brw_WriteSubtitleOfFileBrowser ( void ) ;
static void Brw_InitHiddenLevels ( void ) ;
static void Brw_ShowSizeOfFileTree ( void ) ;
static void Brw_StoreSizeOfFileTreeInDB ( void ) ;
2015-04-02 18:39:49 +02:00
2015-12-21 00:53:56 +01:00
static void Brw_PutParamsContextualLink ( void ) ;
2015-04-02 18:39:49 +02:00
2014-12-01 23:55:08 +01:00
static void Brw_WriteFormFullTree ( void ) ;
static bool Brw_GetFullTreeFromForm ( void ) ;
2015-01-22 01:39:00 +01:00
static void Brw_GetAndUpdateDateLastAccFileBrowser ( void ) ;
2014-12-01 23:55:08 +01:00
static long Brw_GetGrpLastAccZone ( const char * FieldNameDB ) ;
static void Brw_ResetFileBrowserSize ( void ) ;
static void Brw_CalcSizeOfDirRecursive ( unsigned Level , char * Path ) ;
static void Brw_ListDir ( unsigned Level , const char * Path , const char * PathInTree ) ;
static bool Brw_WriteRowFileBrowser ( unsigned Level ,
Brw_FileType_t FileType , Brw_ExpandTree_t ExpandTree ,
const char * PathInTree , const char * FileName ) ;
static void Brw_PutIconsRemoveCopyPaste ( unsigned Level , Brw_FileType_t FileType ,
const char * PathInTree , const char * FileName , const char * FileNameToShow ) ;
static bool Brw_CheckIfCanPasteIn ( unsigned Level ) ;
static void Brw_PutIconRemoveFile ( Brw_FileType_t FileType ,
2015-07-24 11:34:39 +02:00
const char * PathInTree , const char * FileName , const char * FileNameToShow ) ;
static void Brw_PutIconRemoveDir ( const char * PathInTree , const char * FileName , const char * FileNameToShow ) ;
2014-12-01 23:55:08 +01:00
static void Brw_PutIconCopy ( Brw_FileType_t FileType ,
const char * PathInTree , const char * FileName , const char * FileNameShow ) ;
static void Brw_PutIconPasteOn ( const char * PathInTree , const char * FileName , const char * FileNameToShow ) ;
static void Brw_PutIconPasteOff ( void ) ;
static void Brw_IndentAndWriteIconExpandContract ( unsigned Level , Brw_ExpandTree_t ExpandTree ,
const char * PathInTree , const char * FileName , const char * FileNameToShow ) ;
static void Brw_IndentDependingOnLevel ( unsigned Level ) ;
static void Brw_PutIconShow ( unsigned Level , Brw_FileType_t FileType ,
const char * PathInTree , const char * FileName , const char * FileNameToShow ) ;
static void Brw_PutIconHide ( unsigned Level , Brw_FileType_t FileType ,
const char * PathInTree , const char * FileName , const char * FileNameToShow ) ;
static bool Brw_CheckIfAnyUpperLevelIsHidden ( unsigned CurrentLevel ) ;
static void Brw_PutIconFolder ( unsigned Level , Brw_ExpandTree_t ExpandTree ,
const char * PathInTree , const char * FileName , const char * FileNameToShow ) ;
static void Brw_PutIconNewFileOrFolder ( void ) ;
2016-01-03 15:36:46 +01:00
static void Brw_PutIconFileWithLinkToViewMetadata ( unsigned Size ,
struct FileMetadata * FileMetadata ,
const char * FileNameToShow ) ;
2014-12-01 23:55:08 +01:00
static void Brw_PutIconFile ( unsigned Size , Brw_FileType_t FileType , const char * FileName ) ;
static void Brw_WriteFileName ( unsigned Level , bool IsPublic , Brw_FileType_t FileType ,
const char * PathInTree , const char * FileName , const char * FileNameToShow ) ;
static void Brw_GetFileNameToShow ( Brw_FileBrowser_t FileBrowser , unsigned Level , Brw_FileType_t FileType ,
const char * FileName , char * FileNameToShow ) ;
static void Brw_LimitLengthFileNameToShow ( Brw_FileType_t FileType , const char * FileName , char * FileNameToShow ) ;
static void Brw_WriteDatesAssignment ( void ) ;
static void Brw_WriteFileSizeAndDate ( Brw_FileType_t FileType , struct FileMetadata * FileMetadata ) ;
static void Brw_WriteFileOrFolderPublisher ( unsigned Level , unsigned long UsrCod ) ;
static void Brw_AskConfirmRemoveFolderNotEmpty ( void ) ;
2015-01-24 19:30:44 +01:00
2014-12-01 23:55:08 +01:00
static inline void Brw_GetAndWriteClipboard ( void ) ;
static void Brw_WriteCurrentClipboard ( void ) ;
static bool Brw_GetMyClipboard ( void ) ;
static bool Brw_CheckIfClipboardIsInThisTree ( void ) ;
static void Brw_AddPathToClipboards ( Brw_FileType_t FileType , const char * Path ) ;
static void Brw_UpdatePathInClipboard ( Brw_FileType_t FileType , const char * Path ) ;
2015-01-24 19:30:44 +01:00
static long Brw_GetCodForClipboard ( void ) ;
static long Brw_GetWorksUsrCodForClipboard ( void ) ;
2014-12-01 23:55:08 +01:00
static void Brw_InsFoldersInPathAndUpdOtherFoldersInExpandedFolders ( const char * Path ) ;
static void Brw_RemThisFolderAndUpdOtherFoldersFromExpandedFolders ( const char * Path ) ;
static void Brw_InsertFolderInExpandedFolders ( const char * Path ) ;
static void Brw_UpdateClickTimeOfThisFileBrowserInExpandedFolders ( void ) ;
static void Brw_RemoveFolderFromExpandedFolders ( const char * Path ) ;
static void Brw_RemoveAffectedExpandedFolders ( const char * Path ) ;
2015-01-26 12:39:48 +01:00
static void Brw_RenameAffectedExpandedFolders ( Brw_FileBrowser_t FileBrowser ,
long MyUsrCod , long WorksUsrCod ,
const char * OldPath , const char * NewPath ) ;
2015-01-24 19:30:44 +01:00
static bool Brw_GetIfExpandedTree ( const char * Path ) ;
static long Brw_GetCodForExpandedFolders ( void ) ;
static long Brw_GetWorksUsrCodForExpandedFolders ( void ) ;
static void Brw_RemoveExpiredClipboards ( void ) ;
static void Brw_RemoveAffectedClipboards ( Brw_FileBrowser_t FileBrowser , long MyUsrCod , long WorksUsrCod ) ;
2014-12-01 23:55:08 +01:00
static void Brw_PasteClipboard ( void ) ;
static unsigned Brw_NumLevelsInPath ( const char * Path ) ;
static bool Brw_PasteTreeIntoFolder ( const char * PathOrg , const char * PathDstInTree ,
2015-12-21 14:20:01 +01:00
struct Brw_NumObjects * Pasted ,
2014-12-01 23:55:08 +01:00
long * FirstFilCod ) ;
static void Brw_PutFormToCreateAFolder ( const char * FileNameToShow ) ;
static void Brw_PutFormToUploadFilesUsingDropzone ( const char * FileNameToShow ) ;
static void Brw_PutFormToUploadOneFileClassic ( const char * FileNameToShow ) ;
static void Brw_PutFormToPasteAFileOrFolder ( const char * FileNameToShow ) ;
static void Brw_PutFormToCreateALink ( const char * FileNameToShow ) ;
static bool Brw_RcvFileInFileBrw ( Brw_UploadType_t UploadType ) ;
static bool Brw_CheckIfUploadIsAllowed ( const char * FileType ) ;
static bool Brw_CheckIfICanEditFileMetadata ( long PublisherUsrCod ) ;
2016-01-03 15:36:46 +01:00
static void Brw_WriteBigLinkToDownloadFile ( const char * URL ,
struct FileMetadata * FileMetadata ,
2014-12-01 23:55:08 +01:00
const char * FileNameToShow ) ;
static void Brw_WriteSmallLinkToDownloadFile ( const char * URL , Brw_FileType_t FileType ,
const char * FileNameToShow ) ;
static bool Brw_GetParamPublicFile ( void ) ;
static Brw_License_t Brw_GetParLicense ( void ) ;
static void Brw_GetFileViewsFromLoggedUsrs ( struct FileMetadata * FileMetadata ) ;
static void Brw_GetFileViewsFromNonLoggedUsrs ( struct FileMetadata * FileMetadata ) ;
static unsigned Brw_GetFileViewsFromMe ( long FilCod ) ;
static void Brw_UpdateFileViews ( unsigned NumViews , long FilCod ) ;
static bool Brw_GetIfFolderHasPublicFiles ( const char * Path ) ;
static void Brw_ChangeFileOrFolderHiddenInDB ( const char * Path , bool IsHidden ) ;
static void Brw_ChangeFilePublicInDB ( long PublisherUsrCod , const char * Path ,
bool IsPublic , Brw_License_t License ) ;
2015-01-25 00:58:21 +01:00
static long Brw_GetZoneUsrCodForFiles ( void ) ;
2014-12-01 23:55:08 +01:00
static void Brw_RemoveOneFileOrFolderFromDB ( const char * Path ) ;
static void Brw_RemoveChildrenOfFolderFromDB ( const char * Path ) ;
static void Brw_RenameOneFolderInDB ( const char * OldPath , const char * NewPath ) ;
static void Brw_RenameChildrenFilesOrFoldersInDB ( const char * OldPath , const char * NewPath ) ;
static bool Brw_CheckIfICanEditFileOrFolder ( unsigned Level ) ;
static bool Brw_CheckIfICanCreateIntoFolder ( unsigned Level ) ;
2016-04-22 09:47:25 +02:00
static bool Brw_CheckIfICanModifySharedFileOrFolder ( void ) ;
2014-12-01 23:55:08 +01:00
static void Brw_WriteRowDocData ( unsigned * NumDocsNotHidden , MYSQL_ROW row ) ;
2015-12-21 00:53:56 +01:00
static void Brw_PutFormToAskRemOldFiles ( void ) ;
2015-12-21 11:07:54 +01:00
static void Brw_RemoveOldFilesInBrowser ( time_t TimeRemoveFilesOlder ) ;
static void Brw_ScanDirRemovingOlfFiles ( unsigned Level , const char * Path ,
2015-12-21 18:03:28 +01:00
const char * PathInTree ,
2015-12-21 14:20:01 +01:00
time_t TimeRemoveFilesOlder ,
struct Brw_NumObjects * Removed ) ;
2015-12-21 00:53:56 +01:00
2015-12-21 18:03:28 +01:00
static void Brw_RemoveFileFromDiskAndDB ( const char * Path ,
const char * FullPathInTree ) ;
static int Brw_RemoveFolderFromDiskAndDB ( const char * Path ,
const char * FullPathInTree ) ;
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/***************** Get parameters related to file browser ********************/
/*****************************************************************************/
void Brw_GetParAndInitFileBrowser ( void )
{
/***** If a group is selected, get its data *****/
if ( ( Gbl . CurrentCrs . Grps . GrpCod = Brw_GetGrpSettings ( ) ) > 0 )
Brw_GetDataCurrentGrp ( ) ;
/***** Get type of file browser *****/
2016-01-17 15:10:54 +01:00
switch ( Gbl . Action . Act )
2014-12-01 23:55:08 +01:00
{
2015-01-19 20:56:18 +01:00
/***** Documents of institution *****/
2015-01-18 18:45:10 +01:00
case ActSeeAdmDocIns : // Access to a documents zone from menu
2015-04-07 21:44:24 +02:00
if ( Gbl . Usrs . Me . LoggedRole > = Rol_INS_ADM )
2015-01-18 18:45:10 +01:00
/* These roles can edit documents of institution */
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_DOCUM_INS ;
2015-01-18 18:45:10 +01:00
else
/* The rest of roles can not edit documents of institution */
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_SHOW_DOCUM_INS ;
2015-01-18 18:45:10 +01:00
break ;
2015-01-19 20:56:18 +01:00
case ActChgToSeeDocIns : // Access to see a documents zone
case ActSeeDocIns :
case ActExpSeeDocIns :
case ActConSeeDocIns :
case ActZIPSeeDocIns :
case ActReqDatSeeDocIns :
case ActDowSeeDocIns :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_SHOW_DOCUM_INS ;
2015-01-19 20:56:18 +01:00
break ;
case ActChgToAdmDocIns : // Access to admin a documents zone
case ActAdmDocIns :
case ActReqRemFilDocIns :
case ActRemFilDocIns :
case ActRemFolDocIns :
case ActCopDocIns :
case ActPasDocIns :
case ActRemTreDocIns :
case ActFrmCreDocIns :
case ActCreFolDocIns :
case ActCreLnkDocIns :
case ActRenFolDocIns :
case ActRcvFilDocInsDZ :
case ActRcvFilDocInsCla :
case ActExpAdmDocIns :
case ActConAdmDocIns :
case ActZIPAdmDocIns :
case ActShoDocIns :
case ActHidDocIns :
case ActReqDatAdmDocIns :
case ActChgDatAdmDocIns :
case ActDowAdmDocIns :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_DOCUM_INS ;
2015-01-19 20:56:18 +01:00
break ;
2015-02-05 22:59:48 +01:00
/***** Shared files of institution *****/
2016-01-02 17:07:58 +01:00
case ActAdmShaIns :
2015-12-29 13:18:25 +01:00
case ActReqRemFilShaIns :
case ActRemFilShaIns :
case ActRemFolShaIns :
case ActCopShaIns :
case ActPasShaIns :
case ActRemTreShaIns :
case ActFrmCreShaIns :
case ActCreFolShaIns :
case ActCreLnkShaIns :
case ActRenFolShaIns :
case ActRcvFilShaInsDZ :
case ActRcvFilShaInsCla :
case ActExpShaIns :
case ActConShaIns :
case ActZIPShaIns :
case ActReqDatShaIns :
case ActChgDatShaIns :
case ActDowShaIns :
2015-02-05 22:59:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_SHARE_INS ;
break ;
2015-01-19 20:56:18 +01:00
/***** Documents of centre *****/
2015-01-18 18:45:10 +01:00
case ActSeeAdmDocCtr : // Access to a documents zone from menu
2015-04-07 21:44:24 +02:00
if ( Gbl . Usrs . Me . LoggedRole > = Rol_CTR_ADM )
2015-01-18 18:45:10 +01:00
/* These roles can edit documents of centre */
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_DOCUM_CTR ;
2015-01-18 18:45:10 +01:00
else
/* The rest of roles can not edit documents of centre */
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_SHOW_DOCUM_CTR ;
2015-01-18 18:45:10 +01:00
break ;
2015-01-19 20:56:18 +01:00
case ActChgToSeeDocCtr : // Access to see a documents zone
case ActSeeDocCtr :
case ActExpSeeDocCtr :
case ActConSeeDocCtr :
case ActZIPSeeDocCtr :
case ActReqDatSeeDocCtr :
case ActDowSeeDocCtr :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_SHOW_DOCUM_CTR ;
2015-01-19 20:56:18 +01:00
break ;
case ActChgToAdmDocCtr : // Access to admin a documents zone
case ActAdmDocCtr :
case ActReqRemFilDocCtr :
case ActRemFilDocCtr :
case ActRemFolDocCtr :
case ActCopDocCtr :
case ActPasDocCtr :
case ActRemTreDocCtr :
case ActFrmCreDocCtr :
case ActCreFolDocCtr :
case ActCreLnkDocCtr :
case ActRenFolDocCtr :
case ActRcvFilDocCtrDZ :
case ActRcvFilDocCtrCla :
case ActExpAdmDocCtr :
case ActConAdmDocCtr :
case ActZIPAdmDocCtr :
case ActShoDocCtr :
case ActHidDocCtr :
case ActReqDatAdmDocCtr :
case ActChgDatAdmDocCtr :
case ActDowAdmDocCtr :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_DOCUM_CTR ;
2015-01-19 20:56:18 +01:00
break ;
2015-02-05 22:59:48 +01:00
/***** Shared files of centre *****/
2016-01-02 17:07:58 +01:00
case ActAdmShaCtr :
2015-12-29 13:18:25 +01:00
case ActReqRemFilShaCtr :
case ActRemFilShaCtr :
case ActRemFolShaCtr :
case ActCopShaCtr :
case ActPasShaCtr :
case ActRemTreShaCtr :
case ActFrmCreShaCtr :
case ActCreFolShaCtr :
case ActCreLnkShaCtr :
case ActRenFolShaCtr :
case ActRcvFilShaCtrDZ :
case ActRcvFilShaCtrCla :
case ActExpShaCtr :
case ActConShaCtr :
case ActZIPShaCtr :
case ActReqDatShaCtr :
case ActChgDatShaCtr :
case ActDowShaCtr :
2015-02-05 22:59:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_SHARE_CTR ;
break ;
2015-01-19 20:56:18 +01:00
/***** Documents of degree *****/
2015-01-18 18:45:10 +01:00
case ActSeeAdmDocDeg : // Access to a documents zone from menu
2015-04-07 21:44:24 +02:00
if ( Gbl . Usrs . Me . LoggedRole > = Rol_DEG_ADM )
2015-01-18 18:45:10 +01:00
/* These roles can edit documents of degree */
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_DOCUM_DEG ;
2015-01-18 18:45:10 +01:00
else
/* The rest of roles can not edit documents of degree */
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_SHOW_DOCUM_DEG ;
2015-01-18 18:45:10 +01:00
break ;
2015-01-19 20:56:18 +01:00
case ActChgToSeeDocDeg : // Access to see a documents zone
case ActSeeDocDeg :
case ActExpSeeDocDeg :
case ActConSeeDocDeg :
case ActZIPSeeDocDeg :
case ActReqDatSeeDocDeg :
case ActDowSeeDocDeg :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_SHOW_DOCUM_DEG ;
2015-01-19 20:56:18 +01:00
break ;
case ActChgToAdmDocDeg : // Access to admin a documents zone
case ActAdmDocDeg :
case ActReqRemFilDocDeg :
case ActRemFilDocDeg :
case ActRemFolDocDeg :
case ActCopDocDeg :
case ActPasDocDeg :
case ActRemTreDocDeg :
case ActFrmCreDocDeg :
case ActCreFolDocDeg :
case ActCreLnkDocDeg :
case ActRenFolDocDeg :
case ActRcvFilDocDegDZ :
case ActRcvFilDocDegCla :
case ActExpAdmDocDeg :
case ActConAdmDocDeg :
case ActZIPAdmDocDeg :
case ActShoDocDeg :
case ActHidDocDeg :
case ActReqDatAdmDocDeg :
case ActChgDatAdmDocDeg :
case ActDowAdmDocDeg :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_DOCUM_DEG ;
2015-01-19 20:56:18 +01:00
break ;
2015-02-05 22:59:48 +01:00
/***** Shared files of degree *****/
2016-01-02 17:07:58 +01:00
case ActAdmShaDeg :
2015-12-29 13:18:25 +01:00
case ActReqRemFilShaDeg :
case ActRemFilShaDeg :
case ActRemFolShaDeg :
case ActCopShaDeg :
case ActPasShaDeg :
case ActRemTreShaDeg :
case ActFrmCreShaDeg :
case ActCreFolShaDeg :
case ActCreLnkShaDeg :
case ActRenFolShaDeg :
case ActRcvFilShaDegDZ :
case ActRcvFilShaDegCla :
case ActExpShaDeg :
case ActConShaDeg :
case ActZIPShaDeg :
case ActReqDatShaDeg :
case ActChgDatShaDeg :
case ActDowShaDeg :
2015-02-05 22:59:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_SHARE_DEG ;
break ;
2015-01-19 20:56:18 +01:00
/***** Documents of course/group *****/
2015-12-29 13:18:25 +01:00
case ActSeeAdmDocCrsGrp : // Access to a documents zone from menu
2014-12-01 23:55:08 +01:00
/* Set file browser type acording to last group accessed */
switch ( Gbl . Usrs . Me . LoggedRole )
{
2015-04-07 21:44:24 +02:00
case Rol_TEACHER :
case Rol_SYS_ADM :
2014-12-01 23:55:08 +01:00
/* These roles can edit documents of course/groups */
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = ( Gbl . CurrentCrs . Grps . GrpCod > 0 ) ? Brw_ADMI_DOCUM_GRP :
Brw_ADMI_DOCUM_CRS ;
2014-12-01 23:55:08 +01:00
break ;
default :
2015-01-18 18:45:10 +01:00
/* The rest of roles can not edit documents of course/groups */
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = ( Gbl . CurrentCrs . Grps . GrpCod > 0 ) ? Brw_SHOW_DOCUM_GRP :
Brw_SHOW_DOCUM_CRS ;
2014-12-01 23:55:08 +01:00
break ;
}
break ;
2015-01-19 14:04:06 +01:00
case ActChgToSeeDocCrs : // Access to see a documents zone
2014-12-01 23:55:08 +01:00
/* Set file browser type acording to last group accessed */
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = ( Gbl . CurrentCrs . Grps . GrpCod > 0 ) ? Brw_SHOW_DOCUM_GRP :
Brw_SHOW_DOCUM_CRS ;
2014-12-01 23:55:08 +01:00
break ;
case ActSeeDocCrs :
case ActExpSeeDocCrs :
case ActConSeeDocCrs :
case ActZIPSeeDocCrs :
case ActReqDatSeeDocCrs :
case ActDowSeeDocCrs :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_SHOW_DOCUM_CRS ;
2014-12-01 23:55:08 +01:00
break ;
case ActSeeDocGrp :
case ActExpSeeDocGrp :
case ActConSeeDocGrp :
case ActZIPSeeDocGrp :
case ActReqDatSeeDocGrp :
case ActDowSeeDocGrp :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_SHOW_DOCUM_GRP ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-19 14:04:06 +01:00
case ActChgToAdmDocCrs : // Access to admin a documents zone
2014-12-01 23:55:08 +01:00
/* Set file browser type acording to last group accessed */
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = ( Gbl . CurrentCrs . Grps . GrpCod > 0 ) ? Brw_ADMI_DOCUM_GRP :
Brw_ADMI_DOCUM_CRS ;
2014-12-01 23:55:08 +01:00
break ;
case ActAdmDocCrs :
case ActReqRemFilDocCrs :
case ActRemFilDocCrs :
case ActRemFolDocCrs :
case ActCopDocCrs :
case ActPasDocCrs :
case ActRemTreDocCrs :
case ActFrmCreDocCrs :
case ActCreFolDocCrs :
case ActCreLnkDocCrs :
case ActRenFolDocCrs :
2015-01-19 20:56:18 +01:00
case ActRcvFilDocCrsDZ :
case ActRcvFilDocCrsCla :
2014-12-01 23:55:08 +01:00
case ActExpAdmDocCrs :
case ActConAdmDocCrs :
case ActZIPAdmDocCrs :
case ActShoDocCrs :
case ActHidDocCrs :
case ActReqDatAdmDocCrs :
case ActChgDatAdmDocCrs :
case ActDowAdmDocCrs :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_DOCUM_CRS ;
2014-12-01 23:55:08 +01:00
break ;
case ActAdmDocGrp :
case ActReqRemFilDocGrp :
case ActRemFilDocGrp :
case ActRemFolDocGrp :
case ActCopDocGrp :
case ActPasDocGrp :
case ActRemTreDocGrp :
case ActFrmCreDocGrp :
case ActCreFolDocGrp :
case ActCreLnkDocGrp :
case ActRenFolDocGrp :
2015-01-19 20:56:18 +01:00
case ActRcvFilDocGrpDZ :
case ActRcvFilDocGrpCla :
2014-12-01 23:55:08 +01:00
case ActExpAdmDocGrp :
case ActConAdmDocGrp :
case ActZIPAdmDocGrp :
case ActShoDocGrp :
case ActHidDocGrp :
case ActReqDatAdmDocGrp :
case ActChgDatAdmDocGrp :
case ActDowAdmDocGrp :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_DOCUM_GRP ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-19 20:56:18 +01:00
2016-04-22 09:47:25 +02:00
/***** Teachers' private files of course/group *****/
case ActAdmTchCrsGrp :
case ActChgToAdmTch : // Access to a teachers zone from menu
/* Set file browser type acording to last group accessed */
Gbl . FileBrowser . Type = ( Gbl . CurrentCrs . Grps . GrpCod > 0 ) ? Brw_ADMI_TEACH_GRP :
Brw_ADMI_TEACH_CRS ;
break ;
case ActAdmTchCrs :
case ActReqRemFilTchCrs :
case ActRemFilTchCrs :
case ActRemFolTchCrs :
case ActCopTchCrs :
case ActPasTchCrs :
case ActRemTreTchCrs :
case ActFrmCreTchCrs :
case ActCreFolTchCrs :
case ActCreLnkTchCrs :
case ActRenFolTchCrs :
case ActRcvFilTchCrsDZ :
case ActRcvFilTchCrsCla :
case ActExpTchCrs :
case ActConTchCrs :
case ActZIPTchCrs :
case ActReqDatTchCrs :
case ActChgDatTchCrs :
case ActDowTchCrs :
Gbl . FileBrowser . Type = Brw_ADMI_TEACH_CRS ;
break ;
case ActAdmTchGrp :
case ActReqRemFilTchGrp :
case ActRemFilTchGrp :
case ActRemFolTchGrp :
case ActCopTchGrp :
case ActPasTchGrp :
case ActRemTreTchGrp :
case ActFrmCreTchGrp :
case ActCreFolTchGrp :
case ActCreLnkTchGrp :
case ActRenFolTchGrp :
case ActRcvFilTchGrpDZ :
case ActRcvFilTchGrpCla :
case ActExpTchGrp :
case ActConTchGrp :
case ActZIPTchGrp :
case ActReqDatTchGrp :
case ActChgDatTchGrp :
case ActDowTchGrp :
Gbl . FileBrowser . Type = Brw_ADMI_TEACH_GRP ;
break ;
2015-01-19 20:56:18 +01:00
/***** Shared files of course/group *****/
2015-12-29 13:18:25 +01:00
case ActAdmShaCrsGrp :
case ActChgToAdmSha : // Access to a shared zone from menu
2014-12-01 23:55:08 +01:00
/* Set file browser type acording to last group accessed */
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = ( Gbl . CurrentCrs . Grps . GrpCod > 0 ) ? Brw_ADMI_SHARE_GRP :
Brw_ADMI_SHARE_CRS ;
2014-12-01 23:55:08 +01:00
break ;
2015-12-29 13:18:25 +01:00
case ActAdmShaCrs :
case ActReqRemFilShaCrs :
case ActRemFilShaCrs :
case ActRemFolShaCrs :
case ActCopShaCrs :
case ActPasShaCrs :
case ActRemTreShaCrs :
case ActFrmCreShaCrs :
case ActCreFolShaCrs :
case ActCreLnkShaCrs :
case ActRenFolShaCrs :
case ActRcvFilShaCrsDZ :
case ActRcvFilShaCrsCla :
case ActExpShaCrs :
case ActConShaCrs :
case ActZIPShaCrs :
case ActReqDatShaCrs :
case ActChgDatShaCrs :
case ActDowShaCrs :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_SHARE_CRS ;
2014-12-01 23:55:08 +01:00
break ;
2015-12-29 13:18:25 +01:00
case ActAdmShaGrp :
case ActReqRemFilShaGrp :
case ActRemFilShaGrp :
case ActRemFolShaGrp :
case ActCopShaGrp :
case ActPasShaGrp :
case ActRemTreShaGrp :
case ActFrmCreShaGrp :
case ActCreFolShaGrp :
case ActCreLnkShaGrp :
case ActRenFolShaGrp :
case ActRcvFilShaGrpDZ :
case ActRcvFilShaGrpCla :
case ActExpShaGrp :
case ActConShaGrp :
case ActZIPShaGrp :
case ActReqDatShaGrp :
case ActChgDatShaGrp :
case ActDowShaGrp :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_SHARE_GRP ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-19 20:56:18 +01:00
/***** My assignments *****/
2014-12-01 23:55:08 +01:00
case ActReqRemFilAsgUsr :
case ActRemFilAsgUsr :
case ActRemFolAsgUsr :
case ActCopAsgUsr :
case ActPasAsgUsr :
case ActRemTreAsgUsr :
case ActFrmCreAsgUsr :
case ActCreFolAsgUsr :
case ActCreLnkAsgUsr :
case ActRenFolAsgUsr :
2015-01-19 20:56:18 +01:00
case ActRcvFilAsgUsrDZ :
case ActRcvFilAsgUsrCla :
2014-12-01 23:55:08 +01:00
case ActExpAsgUsr :
case ActConAsgUsr :
case ActZIPAsgUsr :
case ActReqDatAsgUsr :
case ActChgDatAsgUsr :
case ActDowAsgUsr :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_ASSIG_USR ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-19 20:56:18 +01:00
/***** Another users' assignments *****/
2014-12-01 23:55:08 +01:00
case ActAdmAsgWrkCrs :
case ActReqRemFilAsgCrs :
case ActRemFilAsgCrs :
case ActRemFolAsgCrs :
case ActCopAsgCrs :
case ActPasAsgCrs :
case ActRemTreAsgCrs :
case ActFrmCreAsgCrs :
case ActCreFolAsgCrs :
case ActCreLnkAsgCrs :
case ActRenFolAsgCrs :
2015-01-19 20:56:18 +01:00
case ActRcvFilAsgCrsDZ :
case ActRcvFilAsgCrsCla :
2014-12-01 23:55:08 +01:00
case ActExpAsgCrs :
case ActConAsgCrs :
case ActZIPAsgCrs :
case ActReqDatAsgCrs :
case ActChgDatAsgCrs :
case ActDowAsgCrs :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_ASSIG_CRS ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-19 20:56:18 +01:00
/***** My works *****/
2014-12-01 23:55:08 +01:00
case ActAdmAsgWrkUsr :
case ActReqRemFilWrkUsr :
case ActRemFilWrkUsr :
case ActRemFolWrkUsr :
case ActCopWrkUsr :
case ActPasWrkUsr :
case ActRemTreWrkUsr :
case ActFrmCreWrkUsr :
case ActCreFolWrkUsr :
case ActCreLnkWrkUsr :
case ActRenFolWrkUsr :
2015-01-19 20:56:18 +01:00
case ActRcvFilWrkUsrDZ :
case ActRcvFilWrkUsrCla :
2014-12-01 23:55:08 +01:00
case ActExpWrkUsr :
case ActConWrkUsr :
case ActZIPWrkUsr :
case ActReqDatWrkUsr :
case ActChgDatWrkUsr :
case ActDowWrkUsr :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_WORKS_USR ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-19 20:56:18 +01:00
/***** Another users' works *****/
2014-12-01 23:55:08 +01:00
case ActReqAsgWrkCrs :
case ActReqRemFilWrkCrs :
case ActRemFilWrkCrs :
case ActRemFolWrkCrs :
case ActCopWrkCrs :
case ActPasWrkCrs :
case ActRemTreWrkCrs :
case ActFrmCreWrkCrs :
case ActCreFolWrkCrs :
case ActCreLnkWrkCrs :
case ActRenFolWrkCrs :
2015-01-19 20:56:18 +01:00
case ActRcvFilWrkCrsDZ :
case ActRcvFilWrkCrsCla :
2014-12-01 23:55:08 +01:00
case ActExpWrkCrs :
case ActConWrkCrs :
case ActZIPWrkCrs :
case ActReqDatWrkCrs :
case ActChgDatWrkCrs :
case ActDowWrkCrs :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_WORKS_CRS ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-19 20:56:18 +01:00
/***** Marks *****/
2014-12-01 23:55:08 +01:00
case ActSeeAdmMrk : // Access to a marks zone from menu
/* Set file browser type acording to last group accessed */
2015-04-07 21:44:24 +02:00
Gbl . FileBrowser . Type = ( Gbl . Usrs . Me . LoggedRole = = Rol_STUDENT ) ?
2015-01-26 12:39:48 +01:00
( Gbl . CurrentCrs . Grps . GrpCod > 0 ? Brw_SHOW_MARKS_GRP :
Brw_SHOW_MARKS_CRS ) :
( Gbl . CurrentCrs . Grps . GrpCod > 0 ? Brw_ADMI_MARKS_GRP :
Brw_ADMI_MARKS_CRS ) ;
2014-12-01 23:55:08 +01:00
break ;
case ActChgToSeeMrk : // Access to see a marks zone
/* Set file browser type acording to last group accessed */
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = ( Gbl . CurrentCrs . Grps . GrpCod > 0 ) ? Brw_SHOW_MARKS_GRP :
Brw_SHOW_MARKS_CRS ;
2014-12-01 23:55:08 +01:00
break ;
case ActSeeMrkCrs :
case ActExpSeeMrkCrs :
case ActConSeeMrkCrs :
case ActReqDatSeeMrkCrs :
case ActSeeMyMrkCrs :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_SHOW_MARKS_CRS ;
2014-12-01 23:55:08 +01:00
break ;
case ActSeeMrkGrp :
case ActExpSeeMrkGrp :
case ActConSeeMrkGrp :
case ActReqDatSeeMrkGrp :
case ActSeeMyMrkGrp :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_SHOW_MARKS_GRP ;
2014-12-01 23:55:08 +01:00
break ;
case ActChgToAdmMrk : // Access to admin a marks zone
/* Set file browser type acording to last group accessed */
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = ( Gbl . CurrentCrs . Grps . GrpCod > 0 ) ? Brw_ADMI_MARKS_GRP :
Brw_ADMI_MARKS_CRS ;
2014-12-01 23:55:08 +01:00
break ;
case ActAdmMrkCrs :
case ActReqRemFilMrkCrs :
case ActRemFilMrkCrs :
case ActRemFolMrkCrs :
case ActCopMrkCrs :
case ActPasMrkCrs :
case ActRemTreMrkCrs :
case ActFrmCreMrkCrs :
case ActCreFolMrkCrs :
case ActRenFolMrkCrs :
2015-01-19 20:56:18 +01:00
case ActRcvFilMrkCrsDZ :
case ActRcvFilMrkCrsCla :
2014-12-01 23:55:08 +01:00
case ActExpAdmMrkCrs :
case ActConAdmMrkCrs :
case ActZIPAdmMrkCrs :
case ActShoMrkCrs :
case ActHidMrkCrs :
case ActReqDatAdmMrkCrs :
case ActChgDatAdmMrkCrs :
case ActDowAdmMrkCrs :
case ActChgNumRowHeaCrs :
case ActChgNumRowFooCrs :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_MARKS_CRS ;
2014-12-01 23:55:08 +01:00
break ;
case ActAdmMrkGrp :
case ActReqRemFilMrkGrp :
case ActRemFilMrkGrp :
case ActRemFolMrkGrp :
case ActCopMrkGrp :
case ActPasMrkGrp :
case ActRemTreMrkGrp :
case ActFrmCreMrkGrp :
case ActCreFolMrkGrp :
case ActRenFolMrkGrp :
2015-01-19 20:56:18 +01:00
case ActRcvFilMrkGrpDZ :
case ActRcvFilMrkGrpCla :
2014-12-01 23:55:08 +01:00
case ActExpAdmMrkGrp :
case ActConAdmMrkGrp :
case ActZIPAdmMrkGrp :
case ActShoMrkGrp :
case ActHidMrkGrp :
case ActReqDatAdmMrkGrp :
case ActChgDatAdmMrkGrp :
case ActDowAdmMrkGrp :
case ActChgNumRowHeaGrp :
case ActChgNumRowFooGrp :
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_MARKS_GRP ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-19 20:56:18 +01:00
/***** Briefcase *****/
2014-12-01 23:55:08 +01:00
case ActAdmBrf :
case ActReqRemFilBrf :
case ActRemFilBrf :
case ActRemFolBrf :
case ActCopBrf :
case ActPasBrf :
case ActRemTreBrf :
case ActFrmCreBrf :
case ActCreFolBrf :
case ActCreLnkBrf :
case ActRenFolBrf :
2015-01-19 20:56:18 +01:00
case ActRcvFilBrfDZ :
case ActRcvFilBrfCla :
2014-12-01 23:55:08 +01:00
case ActExpBrf :
case ActConBrf :
case ActZIPBrf :
case ActReqDatBrf :
case ActChgDatBrf :
case ActDowBrf :
2016-04-05 02:59:34 +02:00
case ActReqRemOldBrf : // Ask for removing old files in briefcase
2015-12-21 00:53:56 +01:00
case ActRemOldBrf : // Remove old files in briefcase
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_BRIEF_USR ;
2014-12-01 23:55:08 +01:00
break ;
default :
Lay_ShowErrorAndExit ( " The type of file browser can not be determined. " ) ;
break ;
}
/***** Get the path in the file browser and the name of the file or folder *****/
Brw_GetParamsPathInTreeAndFileName ( ) ;
2016-01-03 15:36:46 +01:00
Brw_SetFullPathInTree ( Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk ,
2014-12-01 23:55:08 +01:00
Gbl . FileBrowser . FilFolLnkName ) ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2015-09-30 23:10:15 +02:00
/* Get lists of the selected users */
Usr_GetListsSelectedUsrs ( ) ;
2014-12-01 23:55:08 +01:00
/* Get user whose folder will be used to make any operation */
2016-01-25 14:40:57 +01:00
Usr_GetParamOtherUsrCodEncryptedAndGetListIDs ( ) ;
2014-12-01 23:55:08 +01:00
/* Get whether we must create the zip file or not */
Gbl . FileBrowser . ZIP . CreateZIP = ZIP_GetCreateZIPFromForm ( ) ;
break ;
default :
break ;
}
2016-01-17 15:10:54 +01:00
switch ( Gbl . Action . Act )
2014-12-01 23:55:08 +01:00
{
2015-01-20 00:32:15 +01:00
case ActCreFolDocIns : case ActRenFolDocIns :
2015-12-29 13:18:25 +01:00
case ActCreFolShaIns : case ActRenFolShaIns :
2015-02-05 22:59:48 +01:00
2015-01-20 00:32:15 +01:00
case ActCreFolDocCtr : case ActRenFolDocCtr :
2015-12-29 13:18:25 +01:00
case ActCreFolShaCtr : case ActRenFolShaCtr :
2015-02-05 22:59:48 +01:00
2015-01-20 00:32:15 +01:00
case ActCreFolDocDeg : case ActRenFolDocDeg :
2015-12-29 13:18:25 +01:00
case ActCreFolShaDeg : case ActRenFolShaDeg :
2015-02-05 22:59:48 +01:00
2014-12-01 23:55:08 +01:00
case ActCreFolDocCrs : case ActRenFolDocCrs :
case ActCreFolDocGrp : case ActRenFolDocGrp :
2015-02-05 22:59:48 +01:00
2016-04-22 09:47:25 +02:00
case ActCreFolTchCrs : case ActRenFolTchCrs :
case ActCreFolTchGrp : case ActRenFolTchGrp :
2015-12-29 13:18:25 +01:00
case ActCreFolShaCrs : case ActRenFolShaCrs :
case ActCreFolShaGrp : case ActRenFolShaGrp :
2015-02-05 22:59:48 +01:00
2014-12-01 23:55:08 +01:00
case ActCreFolMrkCrs : case ActRenFolMrkCrs :
case ActCreFolMrkGrp : case ActRenFolMrkGrp :
2015-02-05 22:59:48 +01:00
2014-12-01 23:55:08 +01:00
case ActCreFolAsgCrs : case ActRenFolAsgCrs :
case ActCreFolWrkCrs : case ActRenFolWrkCrs :
case ActCreFolAsgUsr : case ActRenFolAsgUsr :
case ActCreFolWrkUsr : case ActRenFolWrkUsr :
2015-02-05 22:59:48 +01:00
2014-12-01 23:55:08 +01:00
case ActCreFolBrf : case ActRenFolBrf :
/* Get the name of the new folder */
Par_GetParToText ( " NewFolderName " , Gbl . FileBrowser . NewFilFolLnkName , NAME_MAX ) ;
break ;
2015-01-20 00:32:15 +01:00
case ActCreLnkDocIns :
2015-12-29 13:18:25 +01:00
case ActCreLnkShaIns :
2015-01-20 00:32:15 +01:00
case ActCreLnkDocCtr :
2015-12-29 13:18:25 +01:00
case ActCreLnkShaCtr :
2015-01-20 00:32:15 +01:00
case ActCreLnkDocDeg :
2015-12-29 13:18:25 +01:00
case ActCreLnkShaDeg :
2016-04-22 09:47:25 +02:00
case ActCreLnkDocCrs : case ActCreLnkDocGrp :
case ActCreLnkTchCrs : case ActCreLnkTchGrp :
case ActCreLnkShaCrs : case ActCreLnkShaGrp :
2014-12-01 23:55:08 +01:00
case ActCreLnkAsgCrs :
case ActCreLnkWrkCrs :
case ActCreLnkAsgUsr :
case ActCreLnkWrkUsr :
case ActCreLnkBrf :
2015-04-06 23:25:23 +02:00
/* Get the name of the new link */
Par_GetParToText ( " NewLinkName " , Gbl . FileBrowser . NewFilFolLnkName , NAME_MAX ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
/***** Get whether to show full tree *****/
// If I belong to the current course or I am superuser, or file browser is briefcase ==> get whether show full tree from form
// Else ==> show full tree (only public files)
2015-01-20 20:03:38 +01:00
Gbl . FileBrowser . ShowOnlyPublicFiles = false ;
2015-04-07 21:44:24 +02:00
if ( Gbl . Usrs . Me . LoggedRole ! = Rol_SYS_ADM )
2015-01-20 20:03:38 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_INS :
case Brw_ADMI_DOCUM_INS :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_INS :
2015-01-20 20:03:38 +01:00
Gbl . FileBrowser . ShowOnlyPublicFiles = ! Gbl . Usrs . Me . IBelongToCurrentIns ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CTR :
case Brw_ADMI_DOCUM_CTR :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_CTR :
2015-01-20 20:03:38 +01:00
Gbl . FileBrowser . ShowOnlyPublicFiles = ! Gbl . Usrs . Me . IBelongToCurrentCtr ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_DEG :
case Brw_ADMI_DOCUM_DEG :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_DEG :
2015-01-20 20:03:38 +01:00
Gbl . FileBrowser . ShowOnlyPublicFiles = ! Gbl . Usrs . Me . IBelongToCurrentDeg ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CRS :
case Brw_ADMI_DOCUM_CRS :
case Brw_ADMI_SHARE_CRS :
2015-01-20 20:03:38 +01:00
Gbl . FileBrowser . ShowOnlyPublicFiles = ! Gbl . Usrs . Me . IBelongToCurrentCrs ;
break ;
default :
break ;
}
2014-12-01 23:55:08 +01:00
Gbl . FileBrowser . FullTree = Gbl . FileBrowser . ShowOnlyPublicFiles ? true :
Brw_GetFullTreeFromForm ( ) ;
/***** Initialize file browser *****/
Brw_InitializeFileBrowser ( ) ;
}
/*****************************************************************************/
/******* Get group code from last access to current zone or from form ********/
/*****************************************************************************/
static long Brw_GetGrpSettings ( void )
{
char LongStr [ 1 + 10 + 1 ] ;
long GrpCod ;
/***** Get parameter with group code *****/
if ( Par_GetParToText ( " GrpCod " , LongStr , 1 + 10 ) )
{
if ( ( GrpCod = Str_ConvertStrCodToLongCod ( LongStr ) ) < = 0 )
GrpCod = - 1L ;
return GrpCod ;
}
else // Parameter GrpCod not found!
/***** Try to get group code from database *****/
2016-01-17 15:10:54 +01:00
switch ( Gbl . Action . Act )
2014-12-01 23:55:08 +01:00
{
2016-04-22 09:47:25 +02:00
case ActSeeAdmDocCrsGrp : // Access to a documents zone from menu
2014-12-01 23:55:08 +01:00
case ActSeeDocGrp :
2016-04-22 09:47:25 +02:00
case ActAdmDocGrp :
case ActAdmTchCrsGrp : // Access to a documents zone from menu
case ActAdmTchGrp :
2014-12-01 23:55:08 +01:00
return Brw_GetGrpLastAccZone ( " LastDowGrpCod " ) ;
2016-04-22 09:47:25 +02:00
case ActAdmShaCrsGrp : // Access to a shared documents zone from menu
case ActAdmShaGrp :
2014-12-01 23:55:08 +01:00
return Brw_GetGrpLastAccZone ( " LastComGrpCod " ) ;
2016-04-22 09:47:25 +02:00
case ActSeeAdmMrk : // Access to a marks zone from menu
2014-12-01 23:55:08 +01:00
case ActSeeMrkGrp :
2016-04-22 09:47:25 +02:00
case ActAdmMrkGrp :
2014-12-01 23:55:08 +01:00
return Brw_GetGrpLastAccZone ( " LastAssGrpCod " ) ;
default :
return - 1L ;
}
}
/*****************************************************************************/
/******************* If a group is selected, get its data ********************/
/*****************************************************************************/
static void Brw_GetDataCurrentGrp ( void )
{
struct GroupData GrpDat ;
if ( Gbl . CurrentCrs . Grps . GrpCod > 0 )
{
GrpDat . GrpCod = Gbl . CurrentCrs . Grps . GrpCod ;
Grp_GetDataOfGroupByCod ( & GrpDat ) ;
2016-01-17 15:10:54 +01:00
switch ( Gbl . Action . Act )
2014-12-01 23:55:08 +01:00
{
2016-04-22 09:47:25 +02:00
case ActSeeAdmDocCrsGrp : // Access to see/admin a documents zone from menu
case ActChgToSeeDocCrs : // Access to see a documents zone
case ActSeeDocGrp : // Access to see a documents zone
case ActChgToAdmDocCrs : // Access to admin a documents zone
case ActAdmDocGrp : // Access to admin a documents zone
2014-12-01 23:55:08 +01:00
2016-04-22 09:47:25 +02:00
case ActChgToAdmTch : // Access to admin a teachers' zone
case ActAdmTchGrp : // Access to admin a teachers' zone
2014-12-01 23:55:08 +01:00
2016-04-22 09:47:25 +02:00
case ActChgToAdmSha : // Access to admin a shared zone
case ActAdmShaGrp : // Access to admin a shared zone
2014-12-01 23:55:08 +01:00
2016-04-22 09:47:25 +02:00
case ActSeeAdmMrk : // Access to see/admin a marks zone from menu
case ActChgToSeeMrk : // Access to see a marks zone
case ActSeeMrkGrp : // Access to see a marks zone
2014-12-01 23:55:08 +01:00
2016-04-22 09:47:25 +02:00
case ActChgToAdmMrk : // Access to admin a marks zone
case ActAdmMrkGrp : // Access to admin a marks zone
2014-12-01 23:55:08 +01:00
/***** For security, check if group file zones are enabled,
and check if I belongs to the selected group * * * * */
2016-04-22 09:47:25 +02:00
if ( GrpDat . FileZones )
{
if ( ! Grp_GetIfIBelongToGrp ( Gbl . CurrentCrs . Grps . GrpCod ) )
Gbl . CurrentCrs . Grps . GrpCod = - 1L ; // Go to course zone
}
else
2014-12-01 23:55:08 +01:00
Gbl . CurrentCrs . Grps . GrpCod = - 1L ; // Go to course zone
break ;
default :
/***** For security, check if group file zones are enabled,
and check if I belongs to the selected group * * * * */
if ( ! GrpDat . FileZones )
Lay_ShowErrorAndExit ( " The group has no file zones. " ) ;
else if ( ! Grp_GetIfIBelongToGrp ( Gbl . CurrentCrs . Grps . GrpCod ) )
Lay_ShowErrorAndExit ( " You don't have access to the group. " ) ;
break ;
}
/***** Get data of the current group *****/
if ( Gbl . CurrentCrs . Grps . GrpCod > 0 )
{
Gbl . CurrentCrs . Grps . GrpTyp . GrpTypCod = GrpDat . GrpTypCod ;
strcpy ( Gbl . CurrentCrs . Grps . GrpTyp . GrpTypName , GrpDat . GrpTypName ) ;
strcpy ( Gbl . CurrentCrs . Grps . GrpName , GrpDat . GrpName ) ;
Gbl . CurrentCrs . Grps . MaxStudents = GrpDat . MaxStudents ;
Gbl . CurrentCrs . Grps . Open = GrpDat . Open ;
Gbl . CurrentCrs . Grps . FileZones = GrpDat . FileZones ;
Gbl . CurrentCrs . Grps . GrpTyp . MultipleEnrollment = GrpDat . MultipleEnrollment ;
}
}
}
2016-01-03 01:13:57 +01:00
/*****************************************************************************/
/**************** Write hidden parameter with code of file *******************/
/*****************************************************************************/
2016-01-03 03:00:43 +01:00
2016-01-03 01:13:57 +01:00
void Brw_PutHiddenParamFilCod ( long FilCod )
{
Par_PutHiddenParamLong ( " FilCod " , FilCod ) ;
}
2016-01-03 03:00:43 +01:00
2016-01-03 01:13:57 +01:00
/*****************************************************************************/
/********************* Get parameter with code of file ***********************/
/*****************************************************************************/
2016-01-03 03:00:43 +01:00
2016-01-03 01:13:57 +01:00
long Brw_GetParamFilCod ( void )
{
char LongStr [ 1 + 10 + 1 ] ;
2016-01-03 03:00:43 +01:00
/***** Get parameter with code of file *****/
2016-01-03 01:13:57 +01:00
Par_GetParToText ( " FilCod " , LongStr , 1 + 10 ) ;
return Str_ConvertStrCodToLongCod ( LongStr ) ;
}
2016-01-03 03:00:43 +01:00
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/** Put hidden params. with the path in the tree and the name of file/folder */
/*****************************************************************************/
void Brw_PutParamsPathAndFile ( Brw_FileType_t FileType , const char * PathInTree , const char * FileFolderName )
{
Par_PutHiddenParamString ( " Path " , PathInTree ) ;
Par_PutHiddenParamString ( Brw_FileTypeParamName [ FileType ] , FileFolderName ) ;
}
/*****************************************************************************/
/************** Get parameters path and file in file browser *****************/
/*****************************************************************************/
static void Brw_GetParamsPathInTreeAndFileName ( void )
{
const char * Ptr ;
unsigned i ;
Brw_FileType_t FileType ;
/***** Get the path inside the tree (this path does not include the name of the file or folder at the end) *****/
2016-01-03 15:36:46 +01:00
Par_GetParToText ( " Path " , Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk , PATH_MAX ) ;
if ( strstr ( Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk , " .. " ) ) // ".." is not allowed in the path
2014-12-01 23:55:08 +01:00
Lay_ShowErrorAndExit ( " Wrong path. " ) ;
/***** Get the name of the file, folder or link *****/
Gbl . FileBrowser . FileType = Brw_IS_UNKNOWN ;
for ( FileType = ( Brw_FileType_t ) 0 ;
FileType < Brw_NUM_FILE_TYPES ;
FileType + + )
// File names with heading and trailing spaces are allowed
if ( Par_GetParAndChangeFormat ( Brw_FileTypeParamName [ FileType ] ,
Gbl . FileBrowser . FilFolLnkName ,
NAME_MAX , Str_TO_TEXT , false ) )
{
if ( strstr ( Gbl . FileBrowser . FilFolLnkName , " .. " ) ) // ".." is not allowed in the path
Lay_ShowErrorAndExit ( " Wrong path. " ) ;
Gbl . FileBrowser . FileType = FileType ;
break ;
}
/***** Set level of this file or folder inside file browser *****/
if ( ! strcmp ( Gbl . FileBrowser . FilFolLnkName , " . " ) )
Gbl . FileBrowser . Level = 0 ;
else
{
// Level == number-of-slashes-in-path-except-file-or-folder + 1
Gbl . FileBrowser . Level = 1 ;
2016-01-03 15:36:46 +01:00
for ( Ptr = Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk ;
2014-12-01 23:55:08 +01:00
* Ptr ;
Ptr + + )
if ( * Ptr = = ' / ' )
Gbl . FileBrowser . Level + + ;
}
/***** Get data of assignment *****/
if ( Gbl . FileBrowser . Level & &
2015-01-26 12:39:48 +01:00
( Gbl . FileBrowser . Type = = Brw_ADMI_ASSIG_USR | |
Gbl . FileBrowser . Type = = Brw_ADMI_ASSIG_CRS ) )
2014-12-01 23:55:08 +01:00
{
if ( Gbl . FileBrowser . Level = = 1 )
{
// We are in this case: assignments/assignment-folder
strncpy ( Gbl . FileBrowser . Asg . Folder , Gbl . FileBrowser . FilFolLnkName , Asg_MAX_LENGTH_FOLDER ) ;
Gbl . FileBrowser . Asg . Folder [ Asg_MAX_LENGTH_FOLDER ] = ' \0 ' ;
}
else
{
// We are in this case: assignments/assignment-folder/rest-of-path
2016-01-03 15:36:46 +01:00
for ( Ptr = Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk ;
2014-12-01 23:55:08 +01:00
* Ptr & & * Ptr ! = ' / ' ;
Ptr + + ) ; // Go to first '/'
if ( * Ptr = = ' / ' )
Ptr + + ; // Skip '/'
for ( i = 0 ;
i < Asg_MAX_LENGTH_FOLDER & & * Ptr & & * Ptr ! = ' / ' ;
i + + , Ptr + + )
Gbl . FileBrowser . Asg . Folder [ i ] = * Ptr ; // Copy assignment folder
Gbl . FileBrowser . Asg . Folder [ i ] = ' \0 ' ;
}
Asg_GetDataOfAssignmentByFolder ( & Gbl . FileBrowser . Asg ) ;
}
}
/*****************************************************************************/
/************************* Initialize file browser ***************************/
/*****************************************************************************/
// Gbl.FileBrowser.Type must be set to a valid file browser
void Brw_InitializeFileBrowser ( void )
{
/***** Construct the relative path to the folder of file browser *****/
Brw_SetPathFileBrowser ( ) ;
/***** Other initializations *****/
Brw_ResetFileBrowserSize ( ) ;
}
/*****************************************************************************/
/********* Construct the paths to the top folders of file browser ************/
/*****************************************************************************/
static void Brw_SetPathFileBrowser ( void )
{
char Path [ PATH_MAX + 1 ] ;
/***** Reset paths. An empty path means that
we don ' t have to create that directory * * * * */
Gbl . FileBrowser . Priv . PathAboveRootFolder [ 0 ] = ' \0 ' ;
Gbl . FileBrowser . Priv . PathRootFolder [ 0 ] = ' \0 ' ;
/***** Set paths depending on file browser *****/
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_INS :
case Brw_ADMI_DOCUM_INS :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_INS :
2015-01-19 20:56:18 +01:00
sprintf ( Path , " %s/%s " ,
2015-01-20 02:00:42 +01:00
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_INS ) ;
2015-01-19 20:56:18 +01:00
Fil_CreateDirIfNotExists ( Path ) ;
sprintf ( Path , " %s/%s/%02u " ,
2015-01-20 02:00:42 +01:00
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_INS ,
2015-01-19 20:56:18 +01:00
( unsigned ) ( Gbl . CurrentIns . Ins . InsCod % 100 ) ) ;
Fil_CreateDirIfNotExists ( Path ) ;
sprintf ( Gbl . FileBrowser . Priv . PathAboveRootFolder , " %s/%s/%02u/%u " ,
2015-01-20 02:00:42 +01:00
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_INS ,
2015-01-19 20:56:18 +01:00
( unsigned ) ( Gbl . CurrentIns . Ins . InsCod % 100 ) ,
( unsigned ) Gbl . CurrentIns . Ins . InsCod ) ;
2015-01-18 18:45:10 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CTR :
case Brw_ADMI_DOCUM_CTR :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_CTR :
2015-01-19 20:56:18 +01:00
sprintf ( Path , " %s/%s " ,
2015-01-20 02:00:42 +01:00
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_CTR ) ;
2015-01-19 20:56:18 +01:00
Fil_CreateDirIfNotExists ( Path ) ;
sprintf ( Path , " %s/%s/%02u " ,
2015-01-20 02:00:42 +01:00
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_CTR ,
2015-01-19 20:56:18 +01:00
( unsigned ) ( Gbl . CurrentCtr . Ctr . CtrCod % 100 ) ) ;
Fil_CreateDirIfNotExists ( Path ) ;
sprintf ( Gbl . FileBrowser . Priv . PathAboveRootFolder , " %s/%s/%02u/%u " ,
2015-01-20 02:00:42 +01:00
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_CTR ,
2015-01-19 20:56:18 +01:00
( unsigned ) ( Gbl . CurrentCtr . Ctr . CtrCod % 100 ) ,
( unsigned ) Gbl . CurrentCtr . Ctr . CtrCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_DEG :
case Brw_ADMI_DOCUM_DEG :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_DEG :
2015-01-19 20:56:18 +01:00
sprintf ( Path , " %s/%s " ,
2015-01-20 02:00:42 +01:00
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_DEG ) ;
2015-01-19 20:56:18 +01:00
Fil_CreateDirIfNotExists ( Path ) ;
sprintf ( Path , " %s/%s/%02u " ,
2015-01-20 02:00:42 +01:00
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_DEG ,
2015-01-19 20:56:18 +01:00
( unsigned ) ( Gbl . CurrentDeg . Deg . DegCod % 100 ) ) ;
Fil_CreateDirIfNotExists ( Path ) ;
sprintf ( Gbl . FileBrowser . Priv . PathAboveRootFolder , " %s/%s/%02u/%u " ,
2015-01-20 02:00:42 +01:00
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_DEG ,
2015-01-19 20:56:18 +01:00
( unsigned ) ( Gbl . CurrentDeg . Deg . DegCod % 100 ) ,
( unsigned ) Gbl . CurrentDeg . Deg . DegCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CRS :
case Brw_ADMI_DOCUM_CRS :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_SHOW_MARKS_CRS :
case Brw_ADMI_MARKS_CRS :
2014-12-01 23:55:08 +01:00
strcpy ( Gbl . FileBrowser . Priv . PathAboveRootFolder ,
Gbl . CurrentCrs . PathPriv ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_GRP :
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_SHOW_MARKS_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
sprintf ( Path , " %s/grp " ,
Gbl . CurrentCrs . PathPriv ) ;
Fil_CreateDirIfNotExists ( Path ) ;
sprintf ( Gbl . FileBrowser . Priv . PathAboveRootFolder , " %s/grp/%ld " ,
Gbl . CurrentCrs . PathPriv ,
Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_USR :
case Brw_ADMI_WORKS_USR :
2014-12-01 23:55:08 +01:00
sprintf ( Path , " %s/usr " ,
Gbl . CurrentCrs . PathPriv ) ;
Fil_CreateDirIfNotExists ( Path ) ;
sprintf ( Path , " %s/usr/%02u " ,
Gbl . CurrentCrs . PathPriv ,
( unsigned ) ( Gbl . Usrs . Me . UsrDat . UsrCod % 100 ) ) ;
Fil_CreateDirIfNotExists ( Path ) ;
sprintf ( Gbl . FileBrowser . Priv . PathAboveRootFolder , " %s/usr/%02u/%ld " ,
Gbl . CurrentCrs . PathPriv ,
( unsigned ) ( Gbl . Usrs . Me . UsrDat . UsrCod % 100 ) ,
Gbl . Usrs . Me . UsrDat . UsrCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
if ( Gbl . Usrs . Other . UsrDat . UsrCod > 0 )
{
sprintf ( Path , " %s/usr " ,
Gbl . CurrentCrs . PathPriv ) ;
Fil_CreateDirIfNotExists ( Path ) ;
sprintf ( Path , " %s/usr/%02u " ,
Gbl . CurrentCrs . PathPriv ,
( unsigned ) ( Gbl . Usrs . Other . UsrDat . UsrCod % 100 ) ) ;
Fil_CreateDirIfNotExists ( Path ) ;
sprintf ( Gbl . FileBrowser . Priv . PathAboveRootFolder , " %s/usr/%02u/%ld " ,
Gbl . CurrentCrs . PathPriv ,
( unsigned ) ( Gbl . Usrs . Other . UsrDat . UsrCod % 100 ) ,
Gbl . Usrs . Other . UsrDat . UsrCod ) ;
}
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_BRIEF_USR :
2014-12-01 23:55:08 +01:00
strcpy ( Gbl . FileBrowser . Priv . PathAboveRootFolder ,
Gbl . Usrs . Me . PathDir ) ;
break ;
default :
return ;
}
/***** Create directories that not exist *****/
if ( Gbl . FileBrowser . Priv . PathAboveRootFolder [ 0 ] )
{
Fil_CreateDirIfNotExists ( Gbl . FileBrowser . Priv . PathAboveRootFolder ) ;
sprintf ( Gbl . FileBrowser . Priv . PathRootFolder , " %s/%s " ,
Gbl . FileBrowser . Priv . PathAboveRootFolder ,
Brw_RootFolderInternalNames [ Gbl . FileBrowser . Type ] ) ;
Fil_CreateDirIfNotExists ( Gbl . FileBrowser . Priv . PathRootFolder ) ;
/***** If file browser is for assignments,
create folders of assignments if not exist * * * * */
2015-11-10 02:23:55 +01:00
if ( Gbl . FileBrowser . Type = = Brw_ADMI_ASSIG_USR )
Brw_CreateFoldersAssignmentsIfNotExist ( Gbl . Usrs . Me . UsrDat . UsrCod ) ;
else if ( Gbl . FileBrowser . Type = = Brw_ADMI_ASSIG_CRS )
Brw_CreateFoldersAssignmentsIfNotExist ( Gbl . Usrs . Other . UsrDat . UsrCod ) ;
2014-12-01 23:55:08 +01:00
}
}
/*****************************************************************************/
/****** Check if exists a folder of assignments for any user in course *******/
/*****************************************************************************/
// Folders are in level 1, just under root folder
bool Brw_CheckIfExistsFolderAssigmentForAnyUsr ( const char * FolderName )
{
char Query [ 128 ] ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
unsigned NumUsrs ;
unsigned NumUsr ;
long UsrCod ;
char PathFolder [ PATH_MAX + 1 ] ;
bool FolderExists = false ;
/***** Get all the users belonging to current course from database *****/
sprintf ( Query , " SELECT UsrCod FROM crs_usr WHERE CrsCod='%ld' " ,
Gbl . CurrentCrs . Crs . CrsCod ) ;
NumUsrs = ( unsigned ) DB_QuerySELECT ( Query , & mysql_res , " can not get users from current course " ) ;
/***** Check folders *****/
for ( NumUsr = 0 ;
NumUsr < NumUsrs & & ! FolderExists ;
NumUsr + + )
{
/* Get next user */
row = mysql_fetch_row ( mysql_res ) ;
UsrCod = Str_ConvertStrCodToLongCod ( row [ 0 ] ) ;
/* Check if folder exists */
sprintf ( PathFolder , " %s/usr/%02u/%ld/%s/%s " ,
Gbl . CurrentCrs . PathPriv ,
( unsigned ) ( UsrCod % 100 ) ,
UsrCod , // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS ,
FolderName ) ;
FolderExists = Fil_CheckIfPathExists ( PathFolder ) ;
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult ( & mysql_res ) ;
return FolderExists ;
}
/*****************************************************************************/
/********* Create folders of assignments if not exist for one user ***********/
/*****************************************************************************/
// Folders are created in level 1, just under root folder
2015-11-10 02:23:55 +01:00
// Create a folder of an assignment when:
2014-12-01 23:55:08 +01:00
// 1. The assignment is visible (not hidden)
// 2. ...and the folder name is not empty (the teacher has set that the user must send work(s) for that assignment)
2015-11-10 02:23:55 +01:00
// 3. ...the assignment is not restricted to groups or (if restricted to groups), the owner of zone belong to any of the groups
2014-12-01 23:55:08 +01:00
2015-11-10 02:23:55 +01:00
static void Brw_CreateFoldersAssignmentsIfNotExist ( long ZoneUsrCod )
2014-12-01 23:55:08 +01:00
{
char Query [ 1024 ] ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
unsigned long NumRows , NumRow ;
char PathFolderAsg [ PATH_MAX + 1 ] ;
/***** Get assignment folders from database *****/
2015-11-10 02:23:55 +01:00
// Old behaviour (only create assignment folder if assignment is open) is obsolete since 2015-11-10
2014-12-01 23:55:08 +01:00
sprintf ( Query , " SELECT Folder FROM assignments "
2015-11-10 02:23:55 +01:00
" WHERE CrsCod='%ld' AND Hidden='N' AND Folder<>'' "
2014-12-01 23:55:08 +01:00
" AND (AsgCod NOT IN (SELECT AsgCod FROM asg_grp) OR "
" AsgCod IN (SELECT asg_grp.AsgCod FROM asg_grp,crs_grp_usr "
" WHERE crs_grp_usr.UsrCod='%ld' AND asg_grp.GrpCod=crs_grp_usr.GrpCod)) " ,
2015-11-10 02:23:55 +01:00
Gbl . CurrentCrs . Crs . CrsCod , ZoneUsrCod ) ;
2014-12-01 23:55:08 +01:00
NumRows = DB_QuerySELECT ( Query , & mysql_res , " can not get folders of assignments " ) ;
/***** Create one folder for each assignment *****/
for ( NumRow = 0 ;
NumRow < NumRows ;
NumRow + + )
{
/* Get next assignment with folder */
row = mysql_fetch_row ( mysql_res ) ;
/* Create folder if not exists */
sprintf ( PathFolderAsg , " %s/%s " , Gbl . FileBrowser . Priv . PathRootFolder , row [ 0 ] ) ;
Fil_CreateDirIfNotExists ( PathFolderAsg ) ;
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult ( & mysql_res ) ;
}
/*****************************************************************************/
/**** Update folders of assignments if exist for all the users in course *****/
/*****************************************************************************/
// Folders are in level 1, just under root folder
bool Brw_UpdateFoldersAssigmentsIfExistForAllUsrs ( const char * OldFolderName , const char * NewFolderName )
{
extern const char * Txt_Can_not_rename_a_folder_of_assignment ;
extern const char * Txt_Users ;
extern const char * Txt_Folders_renamed ;
extern const char * Txt_Folders_not_renamed ;
char Query [ 128 ] ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
unsigned NumUsrs ;
unsigned NumUsr ;
long UsrCod ;
char OldPath [ PATH_MAX + 1 ] ;
char NewPath [ PATH_MAX + 1 ] ;
char PathOldFolder [ PATH_MAX + 1 ] ;
char PathNewFolder [ PATH_MAX + 1 ] ;
bool RenamingIsPossible = true ;
unsigned NumUsrsError = 0 ;
unsigned NumUsrsSuccess = 0 ;
/***** Get all the users belonging to current course from database *****/
sprintf ( Query , " SELECT UsrCod FROM crs_usr WHERE CrsCod='%ld' " ,
Gbl . CurrentCrs . Crs . CrsCod ) ;
NumUsrs = ( unsigned ) DB_QuerySELECT ( Query , & mysql_res , " can not get users from current course " ) ;
/***** Check if there exist folders with the new name *****/
for ( NumUsr = 0 ;
NumUsr < NumUsrs & & RenamingIsPossible ;
NumUsr + + )
{
/* Get next user */
row = mysql_fetch_row ( mysql_res ) ;
UsrCod = Str_ConvertStrCodToLongCod ( row [ 0 ] ) ;
/* Rename folder if exists */
sprintf ( PathOldFolder , " %s/usr/%02u/%ld/%s/%s " ,
Gbl . CurrentCrs . PathPriv ,
( unsigned ) ( UsrCod % 100 ) ,
UsrCod , // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS ,
OldFolderName ) ;
sprintf ( PathNewFolder , " %s/usr/%02u/%ld/%s/%s " ,
Gbl . CurrentCrs . PathPriv ,
( unsigned ) ( UsrCod % 100 ) ,
UsrCod , // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS ,
NewFolderName ) ;
if ( Fil_CheckIfPathExists ( PathOldFolder ) & &
Fil_CheckIfPathExists ( PathNewFolder ) )
RenamingIsPossible = false ;
}
/***** Rename folder for each user *****/
if ( RenamingIsPossible )
{
mysql_data_seek ( mysql_res , 0 ) ;
for ( NumUsr = 0 ;
NumUsr < NumUsrs ;
NumUsr + + )
{
/* Get next user */
row = mysql_fetch_row ( mysql_res ) ;
UsrCod = Str_ConvertStrCodToLongCod ( row [ 0 ] ) ;
/* Rename folder if exists */
sprintf ( PathOldFolder , " %s/usr/%02u/%ld/%s/%s " ,
Gbl . CurrentCrs . PathPriv ,
( unsigned ) ( UsrCod % 100 ) ,
UsrCod , // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS ,
OldFolderName ) ;
if ( Fil_CheckIfPathExists ( PathOldFolder ) )
{
sprintf ( PathNewFolder , " %s/usr/%02u/%ld/%s/%s " ,
Gbl . CurrentCrs . PathPriv ,
( unsigned ) ( UsrCod % 100 ) ,
UsrCod , // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS ,
NewFolderName ) ;
2016-04-03 01:24:20 +02:00
if ( rename ( PathOldFolder , PathNewFolder ) ) // Fail
2014-12-01 23:55:08 +01:00
{
Lay_ShowAlert ( Lay_ERROR , Txt_Can_not_rename_a_folder_of_assignment ) ;
NumUsrsError + + ;
}
2016-04-03 01:24:20 +02:00
else // Success
2014-12-01 23:55:08 +01:00
{
/* Remove affected clipboards */
2015-01-26 12:39:48 +01:00
Brw_RemoveAffectedClipboards ( Brw_ADMI_ASSIG_USR , UsrCod , - 1L ) ;
Brw_RemoveAffectedClipboards ( Brw_ADMI_ASSIG_CRS , - 1L , UsrCod ) ;
2014-12-01 23:55:08 +01:00
/* Rename affected expanded folders */
sprintf ( OldPath , " %s/%s " , Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS , OldFolderName ) ;
sprintf ( NewPath , " %s/%s " , Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS , NewFolderName ) ;
2015-01-26 12:39:48 +01:00
Brw_RenameAffectedExpandedFolders ( Brw_ADMI_ASSIG_USR , UsrCod , - 1L , OldPath , NewPath ) ;
Brw_RenameAffectedExpandedFolders ( Brw_ADMI_ASSIG_CRS , - 1L , UsrCod , OldPath , NewPath ) ;
2014-12-01 23:55:08 +01:00
NumUsrsSuccess + + ;
}
}
}
/***** Summary message *****/
sprintf ( Gbl . Message , " %s: %u<br /> "
" %s: %u<br /> "
" %s: %u. " ,
Txt_Users , NumUsrs ,
Txt_Folders_renamed , NumUsrsSuccess ,
Txt_Folders_not_renamed , NumUsrsError ) ;
Lay_ShowAlert ( Lay_INFO , Gbl . Message ) ;
}
else
/***** Warning message *****/
Lay_ShowAlert ( Lay_WARNING , Txt_Can_not_rename_a_folder_of_assignment ) ;
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult ( & mysql_res ) ;
return RenamingIsPossible ;
}
/*****************************************************************************/
/**** Remove folders of assignments if exist for all the users in course *****/
/*****************************************************************************/
// Folders are in level 1, just under root folder
void Brw_RemoveFoldersAssignmentsIfExistForAllUsrs ( const char * FolderName )
{
char Query [ 128 ] ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
unsigned NumUsrs ;
unsigned NumUsr ;
long UsrCod ;
char PathFolder [ PATH_MAX + 1 ] ;
/***** Get all the users belonging to current course from database *****/
sprintf ( Query , " SELECT UsrCod FROM crs_usr WHERE CrsCod='%ld' " ,
Gbl . CurrentCrs . Crs . CrsCod ) ;
NumUsrs = ( unsigned ) DB_QuerySELECT ( Query , & mysql_res , " can not get users from current course " ) ;
/***** Remove folders *****/
for ( NumUsr = 0 ;
NumUsr < NumUsrs ;
NumUsr + + )
{
/* Get next user */
row = mysql_fetch_row ( mysql_res ) ;
UsrCod = Str_ConvertStrCodToLongCod ( row [ 0 ] ) ;
/* Remove tree if exists */
sprintf ( PathFolder , " %s/usr/%02u/%ld/%s/%s " ,
Gbl . CurrentCrs . PathPriv ,
( unsigned ) ( UsrCod % 100 ) ,
UsrCod , // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS ,
FolderName ) ;
Brw_RemoveTree ( PathFolder ) ;
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult ( & mysql_res ) ;
}
/*****************************************************************************/
/*** Initialize maximum quota of current file browser and check if exceded ***/
/*****************************************************************************/
static void Brw_SetAndCheckQuota ( void )
{
extern const char * Txt_Quota_exceeded ;
/***** Check the quota *****/
Brw_SetMaxQuota ( ) ;
Brw_CalcSizeOfDir ( Gbl . FileBrowser . Priv . PathRootFolder ) ;
if ( Brw_CheckIfQuotaExceded ( ) )
Lay_ShowAlert ( Lay_WARNING , Txt_Quota_exceeded ) ;
}
/*****************************************************************************/
/************ Initialize maximum quota of current file browser ***************/
/*****************************************************************************/
static void Brw_SetMaxQuota ( void )
{
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_INS :
case Brw_ADMI_DOCUM_INS :
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_DOCUM_INS ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_DOCUM_INS ;
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_DOCUM_INS ;
2015-01-18 18:45:10 +01:00
break ;
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_INS :
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_SHARE_INS ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_SHARE_INS ;
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_SHARE_INS ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CTR :
case Brw_ADMI_DOCUM_CTR :
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_DOCUM_CTR ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_DOCUM_CTR ;
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_DOCUM_CTR ;
2015-01-18 18:45:10 +01:00
break ;
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_CTR :
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_SHARE_CTR ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_SHARE_CTR ;
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_SHARE_CTR ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_DEG :
case Brw_ADMI_DOCUM_DEG :
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_DOCUM_DEG ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_DOCUM_DEG ;
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_DOCUM_DEG ;
2015-01-18 18:45:10 +01:00
break ;
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_DEG :
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_SHARE_DEG ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_SHARE_DEG ;
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_SHARE_DEG ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CRS :
case Brw_ADMI_DOCUM_CRS :
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_DOCUM_CRS ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_DOCUM_CRS ;
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_DOCUM_CRS ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_GRP :
case Brw_ADMI_DOCUM_GRP :
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_DOCUM_GRP ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_DOCUM_GRP ;
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_DOCUM_GRP ;
2014-12-01 23:55:08 +01:00
break ;
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_TEACH_CRS ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_TEACH_CRS ;
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_TEACH_CRS ;
break ;
case Brw_ADMI_TEACH_GRP :
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_TEACH_GRP ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_TEACH_GRP ;
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_TEACH_GRP ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_SHARE_CRS ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_SHARE_CRS ;
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_SHARE_CRS ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_SHARE_GRP ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_SHARE_GRP ;
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_SHARE_GRP ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_MARKS_CRS :
case Brw_ADMI_MARKS_CRS :
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_MARKS_CRS ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_MARKS_CRS ;
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_MARKS_CRS ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_MARKS_GRP :
case Brw_ADMI_MARKS_GRP :
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_MARKS_GRP ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_MARKS_GRP ;
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_MARKS_GRP ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_USR :
case Brw_ADMI_ASSIG_CRS :
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_ASSIG_PER_STD ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_ASSIG_PER_STD ;
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_ASSIG_PER_STD ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_WORKS_USR :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_WORKS_PER_STD ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_WORKS_PER_STD ;
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_WORKS_PER_STD ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_BRIEF_USR :
Gbl . FileBrowser . Size . MaxQuota = Brw_MAX_QUOTA_BRIEF [ Gbl . Usrs . Me . MaxRole ] ;
Gbl . FileBrowser . Size . MaxFiles = Brw_MAX_FILES_BRIEF ;
Gbl . FileBrowser . Size . MaxFolds = Brw_MAX_FOLDS_BRIEF ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
}
/*****************************************************************************/
/********************** Check if quota has been exceeded *********************/
/*****************************************************************************/
static bool Brw_CheckIfQuotaExceded ( void )
{
return ( Gbl . FileBrowser . Size . NumLevls > Brw_MAX_DIR_LEVELS | |
Gbl . FileBrowser . Size . NumFolds > Gbl . FileBrowser . Size . MaxFolds | |
Gbl . FileBrowser . Size . NumFiles > Gbl . FileBrowser . Size . MaxFiles | |
Gbl . FileBrowser . Size . TotalSiz > Gbl . FileBrowser . Size . MaxQuota ) ;
}
/*****************************************************************************/
/************** Request edition of works of users of the course **************/
/*****************************************************************************/
void Brw_AskEditWorksCrs ( void )
{
2015-04-11 16:42:07 +02:00
extern const char * Txt_Users ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_View_works ;
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
2015-10-19 21:49:45 +02:00
/***** Get and update type of list,
number of columns in class photo
2014-12-01 23:55:08 +01:00
and preference about view photos * * * * */
Usr_GetAndUpdatePrefsAboutUsrList ( ) ;
/***** Show form to select the groups *****/
Grp_ShowFormToSelectSeveralGroups ( ActReqAsgWrkCrs ) ;
/***** Get and order lists of users from this course *****/
2015-04-07 21:44:24 +02:00
Usr_GetUsrsLst ( Rol_TEACHER , Sco_SCOPE_CRS , NULL , false ) ;
Usr_GetUsrsLst ( Rol_STUDENT , Sco_SCOPE_CRS , NULL , false ) ;
2014-12-01 23:55:08 +01:00
if ( Gbl . Usrs . LstTchs . NumUsrs | |
Gbl . Usrs . LstStds . NumUsrs )
{
if ( Usr_GetIfShowBigList ( Gbl . Usrs . LstTchs . NumUsrs +
Gbl . Usrs . LstStds . NumUsrs ) )
{
/***** Draw class photos to select users *****/
2016-03-16 11:15:25 +01:00
Lay_StartRoundFrame ( NULL , Txt_Users , NULL ) ;
2015-10-02 01:04:28 +02:00
/* Form to select type of list used for select several users */
Usr_ShowFormsToSelectUsrListType ( ActReqAsgWrkCrs ) ;
2015-04-11 17:33:14 +02:00
/* Start form */
2014-12-01 23:55:08 +01:00
Act_FormStart ( ActAdmAsgWrkCrs ) ;
Grp_PutParamsCodGrps ( ) ;
Par_PutHiddenParamChar ( " FullTree " , ' Y ' ) ; // By default, show all files
/* Put list of users to select some of them */
2015-10-02 01:04:28 +02:00
fprintf ( Gbl . F . Out , " <table style= \" margin:0 auto; \" > " ) ;
2015-04-07 21:44:24 +02:00
Usr_ListUsersToSelect ( Rol_TEACHER ) ;
Usr_ListUsersToSelect ( Rol_STUDENT ) ;
2015-10-02 01:04:28 +02:00
fprintf ( Gbl . F . Out , " </table> " ) ;
/* Send button */
Lay_PutConfirmButton ( Txt_View_works ) ;
2015-04-11 16:42:07 +02:00
2015-04-11 17:33:14 +02:00
/* End form */
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
2015-10-02 01:04:28 +02:00
/* End frame */
Lay_EndRoundFrame ( ) ;
2014-12-01 23:55:08 +01:00
}
}
else
2015-04-07 21:44:24 +02:00
Usr_ShowWarningNoUsersFound ( Rol_UNKNOWN ) ;
2014-12-01 23:55:08 +01:00
/***** Free memory for users' list *****/
Usr_FreeUsrsList ( & Gbl . Usrs . LstTchs ) ;
Usr_FreeUsrsList ( & Gbl . Usrs . LstStds ) ;
/***** Free the memory used by the list of users *****/
2015-09-30 23:10:15 +02:00
Usr_FreeListsSelectedUsrCods ( ) ;
2014-12-01 23:55:08 +01:00
/***** Free memory for list of selected groups *****/
Grp_FreeListCodSelectedGrps ( ) ;
}
/*****************************************************************************/
/*********** Show normal file browser (not for assignments-works) ************/
/*****************************************************************************/
static void Brw_ShowFileBrowserNormal ( void )
{
/***** Write top before showing file browser *****/
Brw_WriteTopBeforeShowingFileBrowser ( ) ;
/****** Show the file browser *****/
Brw_ShowFileBrowser ( ) ;
}
/*****************************************************************************/
/*** Show file browsers with works files of several users of current course **/
/*****************************************************************************/
static void Brw_ShowFileBrowsersAsgWrkCrs ( void )
{
2015-10-03 21:56:40 +02:00
extern const char * Txt_Assignments_and_other_works ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_You_must_select_one_ore_more_users ;
const char * Ptr ;
struct UsrData UsrDat ;
/***** Check the number of users whose works will be shown *****/
2015-09-30 23:10:15 +02:00
if ( Usr_CountNumUsrsInListOfSelectedUsrs ( ) ) // If some users are selected...
2014-12-01 23:55:08 +01:00
{
if ( Gbl . FileBrowser . ZIP . CreateZIP )
{
2015-04-14 19:38:00 +02:00
/***** Create zip file
with the assignments and works
of the selected users * * * * */
/* Create temporary directory
for the compression of assignments and works */
2014-12-01 23:55:08 +01:00
ZIP_CreateTmpDirForCompression ( ) ;
/* Initialize structure with user's data */
Usr_UsrDataConstructor ( & UsrDat ) ;
2015-04-14 19:38:00 +02:00
/* Create temporary directory for each selected user
inside the directory used for compression */
2014-12-01 23:55:08 +01:00
Ptr = Gbl . Usrs . Select . All ;
while ( * Ptr )
{
2015-04-14 19:38:00 +02:00
Par_GetNextStrUntilSeparParamMult ( & Ptr , UsrDat . EncryptedUsrCod ,
Cry_LENGTH_ENCRYPTED_STR_SHA256_BASE64 ) ;
2014-12-01 23:55:08 +01:00
Usr_GetUsrCodFromEncryptedUsrCod ( & UsrDat ) ;
2015-04-14 19:38:00 +02:00
if ( Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod ( & UsrDat ) ) // Get user's data from database
2015-09-17 11:21:49 +02:00
if ( Usr_CheckIfUsrBelongsToCrs ( UsrDat . UsrCod ,
Gbl . CurrentCrs . Crs . CrsCod ,
false ) )
2014-12-01 23:55:08 +01:00
ZIP_CreateDirCompressionUsr ( & UsrDat ) ;
}
/* Free memory used for user's data */
Usr_UsrDataDestructor ( & UsrDat ) ;
/* Create the zip file and put a link to download it */
ZIP_CreateZIPAsgWrk ( ) ;
}
else
2015-04-14 19:38:00 +02:00
/***** Button to create a zip file
with all the works of the selected users * * * * */
2014-12-01 23:55:08 +01:00
ZIP_PutButtonToCreateZIPAsgWrk ( ) ;
/***** Write top before showing file browser *****/
Brw_WriteTopBeforeShowingFileBrowser ( ) ;
/***** Header of the table with the list of users *****/
2015-12-01 18:25:44 +01:00
Lay_StartRoundFrameTable ( " 100% " , 0 , Txt_Assignments_and_other_works ) ;
2014-12-01 23:55:08 +01:00
/***** List the assignments and works of the selected users *****/
Ptr = Gbl . Usrs . Select . All ;
while ( * Ptr )
{
2015-04-14 19:38:00 +02:00
Par_GetNextStrUntilSeparParamMult ( & Ptr , Gbl . Usrs . Other . UsrDat . EncryptedUsrCod ,
Cry_LENGTH_ENCRYPTED_STR_SHA256_BASE64 ) ;
2014-12-01 23:55:08 +01:00
Usr_GetUsrCodFromEncryptedUsrCod ( & Gbl . Usrs . Other . UsrDat ) ;
2015-04-14 19:38:00 +02:00
if ( Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod ( & Gbl . Usrs . Other . UsrDat ) ) // Get of the database the data of the user
2015-09-17 11:21:49 +02:00
if ( Usr_CheckIfUsrBelongsToCrs ( Gbl . Usrs . Other . UsrDat . UsrCod ,
Gbl . CurrentCrs . Crs . CrsCod ,
false ) )
2014-12-01 23:55:08 +01:00
{
/***** Show a row with the data of the owner of the works *****/
fprintf ( Gbl . F . Out , " <tr> " ) ;
Brw_ShowDataOwnerAsgWrk ( & Gbl . Usrs . Other . UsrDat ) ;
2015-08-01 10:43:33 +02:00
fprintf ( Gbl . F . Out , " <td class= \" LEFT_TOP \" > " ) ;
2014-12-01 23:55:08 +01:00
/***** Show the tree with the assignments *****/
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_ASSIG_CRS ;
2014-12-01 23:55:08 +01:00
Brw_InitializeFileBrowser ( ) ;
Brw_ShowFileBrowser ( ) ;
/***** Show the tree with the works *****/
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_WORKS_CRS ;
2014-12-01 23:55:08 +01:00
Brw_InitializeFileBrowser ( ) ;
Brw_ShowFileBrowser ( ) ;
fprintf ( Gbl . F . Out , " </td> "
" </tr> " ) ;
}
}
/***** End of the table *****/
2015-04-12 18:01:06 +02:00
Lay_EndRoundFrameTable ( ) ;
2014-12-01 23:55:08 +01:00
}
else // If no users are selected...
{
// ...write warning alert
Lay_ShowAlert ( Lay_WARNING , Txt_You_must_select_one_ore_more_users ) ;
// ...and show again the form
Brw_AskEditWorksCrs ( ) ;
}
/***** Free the memory used for the list of users *****/
2015-09-30 23:10:15 +02:00
Usr_FreeListsSelectedUsrCods ( ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/************ Show file browsers with works files of one user ****************/
/*****************************************************************************/
static void Brw_ShowFileBrowsersAsgWrkUsr ( void )
{
/***** Write top before showing file browser *****/
Brw_WriteTopBeforeShowingFileBrowser ( ) ;
/***** Show the tree with the assignments *****/
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_ASSIG_USR ;
2014-12-01 23:55:08 +01:00
Brw_InitializeFileBrowser ( ) ;
Brw_ShowFileBrowser ( ) ;
/***** Show the tree with the works *****/
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = Brw_ADMI_WORKS_USR ;
2014-12-01 23:55:08 +01:00
Brw_InitializeFileBrowser ( ) ;
Brw_ShowFileBrowser ( ) ;
}
/*****************************************************************************/
2015-01-20 23:33:55 +01:00
/**************** Form to change file zone (course or group) *****************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2015-01-20 23:33:55 +01:00
static void Brw_FormToChangeCrsGrpZone ( void )
2014-12-01 23:55:08 +01:00
{
struct ListCodGrps LstMyGrps ;
unsigned NumGrp ;
struct GroupData GrpDat ;
2015-01-26 12:39:48 +01:00
bool IsCourseZone = Gbl . FileBrowser . Type = = Brw_SHOW_DOCUM_CRS | |
Gbl . FileBrowser . Type = = Brw_ADMI_DOCUM_CRS | |
2016-04-22 09:47:25 +02:00
Gbl . FileBrowser . Type = = Brw_ADMI_TEACH_CRS | |
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = = Brw_ADMI_SHARE_CRS | |
Gbl . FileBrowser . Type = = Brw_SHOW_MARKS_CRS | |
Gbl . FileBrowser . Type = = Brw_ADMI_MARKS_CRS ;
bool IsGroupZone = Gbl . FileBrowser . Type = = Brw_SHOW_DOCUM_GRP | |
Gbl . FileBrowser . Type = = Brw_ADMI_DOCUM_GRP | |
2016-04-22 09:47:25 +02:00
Gbl . FileBrowser . Type = = Brw_ADMI_TEACH_GRP | |
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = = Brw_ADMI_SHARE_GRP | |
Gbl . FileBrowser . Type = = Brw_SHOW_MARKS_GRP | |
Gbl . FileBrowser . Type = = Brw_ADMI_MARKS_GRP ;
2014-12-01 23:55:08 +01:00
/***** Get list of groups to show *****/
if ( Gbl . CurrentCrs . Grps . NumGrps ) // This course has groups?
/* Get list of group with file zones which I belong to */
Grp_GetLstCodGrpsWithFileZonesIBelong ( & LstMyGrps ) ;
2015-04-11 17:33:14 +02:00
/***** Start form *****/
2015-01-20 00:32:15 +01:00
Act_FormStart ( Brw_ActChgZone [ Gbl . FileBrowser . Type ] ) ;
2014-12-01 23:55:08 +01:00
/***** List start *****/
2015-07-24 13:51:29 +02:00
fprintf ( Gbl . F . Out , " <ul class= \" LIST_LEFT \" > " ) ;
2014-12-01 23:55:08 +01:00
/***** Select the complete course, not a group *****/
fprintf ( Gbl . F . Out , " <li class= \" %s \" > "
" <input type= \" radio \" name= \" GrpCod \" value= \" -1 \" " ,
IsCourseZone ? " BROWSER_TITLE " :
" BROWSER_TITLE_LIGHT " ) ;
if ( IsCourseZone )
fprintf ( Gbl . F . Out , " checked= \" checked \" " ) ;
2015-10-22 14:49:48 +02:00
fprintf ( Gbl . F . Out , " onclick= \" document.getElementById('%s').submit(); \" /> "
2014-12-20 12:18:54 +01:00
" %s "
2014-12-01 23:55:08 +01:00
" </li> " ,
2016-01-14 10:31:09 +01:00
Gbl . Form . Id ,
2014-12-20 12:18:54 +01:00
Gbl . CurrentCrs . Crs . FullName ) ;
2014-12-01 23:55:08 +01:00
/***** List my groups for unique selection *****/
if ( Gbl . CurrentCrs . Grps . NumGrps ) // This course has groups?
{
for ( NumGrp = 0 ;
NumGrp < LstMyGrps . NumGrps ;
NumGrp + + )
{
/* Get next group */
GrpDat . GrpCod = LstMyGrps . GrpCod [ NumGrp ] ;
Grp_GetDataOfGroupByCod ( & GrpDat ) ;
/* Select this group */
fprintf ( Gbl . F . Out , " <li class= \" %s \" > "
" <img src= \" %s/%s20x20.gif \" "
2015-07-21 20:07:46 +02:00
" alt= \" \" title= \" \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON25x25 \" "
2015-09-28 18:28:29 +02:00
" style= \" margin-left:6px; \" /> "
2014-12-01 23:55:08 +01:00
" <input type= \" radio \" name= \" GrpCod \" value= \" %ld \" " ,
( IsGroupZone & &
GrpDat . GrpCod = = Gbl . CurrentCrs . Grps . GrpCod ) ? " BROWSER_TITLE " :
" BROWSER_TITLE_LIGHT " ,
Gbl . Prefs . IconsURL ,
NumGrp < LstMyGrps . NumGrps - 1 ? " submid " :
" subend " ,
GrpDat . GrpCod ) ;
if ( IsGroupZone & & GrpDat . GrpCod = = Gbl . CurrentCrs . Grps . GrpCod )
fprintf ( Gbl . F . Out , " checked= \" checked \" " ) ;
2015-10-22 14:49:48 +02:00
fprintf ( Gbl . F . Out , " onclick= \" document.getElementById('%s').submit(); \" /> "
2014-12-20 12:18:54 +01:00
" %s %s "
2014-12-01 23:55:08 +01:00
" </li> " ,
2016-01-14 10:31:09 +01:00
Gbl . Form . Id ,
2014-12-20 12:18:54 +01:00
GrpDat . GrpTypName , GrpDat . GrpName ) ;
2014-12-01 23:55:08 +01:00
}
/***** Free memory with the list of groups I belong to *****/
Grp_FreeListCodGrp ( & LstMyGrps ) ;
}
/***** End list and form *****/
2015-03-13 00:16:02 +01:00
fprintf ( Gbl . F . Out , " </ul> " ) ;
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/*** Get the data of the selected group in order to enter its common zone ****/
/*****************************************************************************/
static void Brw_GetSelectedGroupData ( struct GroupData * GrpDat , bool AbortOnError )
{
if ( GrpDat - > GrpCod > 0 )
{
/***** Get the data of the selected group *****/
Grp_GetDataOfGroupByCod ( GrpDat ) ;
/***** For security, check if group file zones are enabled,
and check if I belongs to the selected group * * * * */
if ( ! GrpDat - > FileZones )
{
if ( AbortOnError )
Lay_ShowErrorAndExit ( " The file browser is disabled. " ) ;
GrpDat - > GrpCod = - 1L ;
}
else if ( ! Grp_GetIfIBelongToGrp ( GrpDat - > GrpCod ) )
{
if ( AbortOnError )
Lay_ShowErrorAndExit ( " You don't have permission to access this group. " ) ;
GrpDat - > GrpCod = - 1L ;
}
}
}
/*****************************************************************************/
/******** Show a row with the data of the owner of assignments/works *********/
/*****************************************************************************/
static void Brw_ShowDataOwnerAsgWrk ( struct UsrData * UsrDat )
{
extern const char * Txt_Write_a_message_to_X ;
bool ShowPhoto ;
char PhotoURL [ PATH_MAX + 1 ] ;
/***** Show user's photo *****/
2015-09-28 18:28:29 +02:00
fprintf ( Gbl . F . Out , " <td class= \" LEFT_TOP \" style= \" width:100px; \" > " ) ;
2014-12-01 23:55:08 +01:00
ShowPhoto = Pho_ShowUsrPhotoIsAllowed ( UsrDat , PhotoURL ) ;
2014-12-30 15:14:43 +01:00
Pho_ShowUsrPhoto ( UsrDat , ShowPhoto ? PhotoURL :
NULL ,
2016-01-14 10:31:09 +01:00
" PHOTO93x124 " , Pho_ZOOM , false ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " </td> " ) ;
/***** Start form to send a message to this user *****/
2015-09-28 18:28:29 +02:00
fprintf ( Gbl . F . Out , " <td class= \" MSG_AUT LEFT_TOP \" style= \" width:200px; \" > " ) ;
2015-04-07 21:44:24 +02:00
Act_FormStart ( UsrDat - > RoleInCurrentCrsDB = = Rol_STUDENT ? ActSeeRecOneStd :
2014-12-01 23:55:08 +01:00
ActSeeRecOneTch ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamUsrCodEncrypted ( UsrDat - > EncryptedUsrCod ) ;
2014-12-01 23:55:08 +01:00
/***** Show user's ID *****/
ID_WriteUsrIDs ( UsrDat ,
2015-12-23 13:20:58 +01:00
UsrDat - > RoleInCurrentCrsDB = = Rol_TEACHER ? ID_ICanSeeUsrID ( UsrDat ) :
2015-04-07 21:44:24 +02:00
( Gbl . Usrs . Me . LoggedRole > = Rol_TEACHER ) ) ;
2014-12-01 23:55:08 +01:00
/***** Show user's name *****/
fprintf ( Gbl . F . Out , " <br /> " ) ;
sprintf ( Gbl . Title , Txt_Write_a_message_to_X ,
UsrDat - > FullName ) ;
Act_LinkFormSubmit ( Gbl . Title , " MSG_AUT " ) ;
fprintf ( Gbl . F . Out , " %s " , UsrDat - > Surname1 ) ;
if ( UsrDat - > Surname2 [ 0 ] )
fprintf ( Gbl . F . Out , " %s " , UsrDat - > Surname2 ) ;
if ( UsrDat - > FirstName [ 0 ] )
fprintf ( Gbl . F . Out , " , %s " , UsrDat - > FirstName ) ;
fprintf ( Gbl . F . Out , " </a> " ) ;
/***** Show user's e-mail *****/
if ( UsrDat - > Email [ 0 ] )
{
fprintf ( Gbl . F . Out , " <br /> "
" <a href= \" mailto:%s \" target= \" _blank \" class= \" MSG_AUT \" > " ,
UsrDat - > Email ) ;
Str_LimitLengthHTMLStr ( UsrDat - > Email , 25 ) ;
fprintf ( Gbl . F . Out , " %s</a> " , UsrDat - > Email ) ;
}
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
fprintf ( Gbl . F . Out , " </td> " ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/******************* Show a file browser or students' works *****************/
/*****************************************************************************/
void Brw_ShowFileBrowserOrWorks ( void )
{
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
/***** Show the file browser or works *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/******************* Show a file browser or users' works ********************/
/*****************************************************************************/
void Brw_ShowAgainFileBrowserOrWorks ( void )
{
extern const char * Txt_Files_of_marks_must_contain_a_table_in_HTML_format_ ;
extern const char * Txt_Disclaimer_the_files_hosted_here_ ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_USR :
case Brw_ADMI_WORKS_USR :
2014-12-01 23:55:08 +01:00
Brw_ShowFileBrowsersAsgWrkUsr ( ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Brw_ShowFileBrowsersAsgWrkCrs ( ) ;
break ;
default :
Brw_ShowFileBrowserNormal ( ) ;
break ;
}
/***** Help *****/
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_MARKS_CRS :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Lay_ShowAlert ( Lay_INFO , Txt_Files_of_marks_must_contain_a_table_in_HTML_format_ ) ;
break ;
default :
break ;
}
/***** Legal notice *****/
sprintf ( Gbl . Message , Txt_Disclaimer_the_files_hosted_here_ ,
Cfg_PLATFORM_SHORT_NAME ,
Cfg_PLATFORM_RESPONSIBLE_E_MAIL ) ;
Lay_ShowAlert ( Lay_INFO , Gbl . Message ) ;
}
/*****************************************************************************/
/**************************** Show a file browser ****************************/
/*****************************************************************************/
static void Brw_ShowFileBrowser ( void )
{
2015-01-26 12:39:48 +01:00
extern const char * Txt_Documents_area ;
extern const char * Txt_Documents_management_area ;
2016-04-22 09:47:25 +02:00
extern const char * Txt_Teachers_files_area ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_Shared_files_area ;
2015-01-26 12:39:48 +01:00
extern const char * Txt_Marks_area ;
extern const char * Txt_Marks_management_area ;
extern const char * Txt_Assignments_area ;
extern const char * Txt_Works_area ;
2015-12-21 00:53:56 +01:00
extern const char * Txt_Temporary_private_storage_area ;
2014-12-01 23:55:08 +01:00
const char * Brw_TitleOfFileBrowser [ Brw_NUM_TYPES_FILE_BROWSER ] ;
2016-03-17 02:08:11 +01:00
void ( * FunctionToDrawContextualIcons ) ( void ) ;
bool IAmTeacherOrSysAdm = Gbl . Usrs . Me . LoggedRole = = Rol_TEACHER | |
Gbl . Usrs . Me . LoggedRole = = Rol_SYS_ADM ;
2014-12-01 23:55:08 +01:00
2015-01-18 18:45:10 +01:00
/***** Set title of file browser *****/
2016-04-22 09:47:25 +02:00
Brw_TitleOfFileBrowser [ Brw_UNKNOWN ] = NULL ; // Brw_UNKNOWN
Brw_TitleOfFileBrowser [ Brw_SHOW_DOCUM_CRS ] = Txt_Documents_area ; // Brw_SHOW_DOCUM_CRS
Brw_TitleOfFileBrowser [ Brw_SHOW_MARKS_CRS ] = Txt_Marks_area ; // Brw_SHOW_MARKS_CRS
Brw_TitleOfFileBrowser [ Brw_ADMI_DOCUM_CRS ] = Txt_Documents_management_area ; // Brw_ADMI_DOCUM_CRS
Brw_TitleOfFileBrowser [ Brw_ADMI_SHARE_CRS ] = Txt_Shared_files_area ; // Brw_ADMI_SHARE_CRS
Brw_TitleOfFileBrowser [ Brw_ADMI_SHARE_GRP ] = Txt_Shared_files_area ; // Brw_ADMI_SHARE_GRP
Brw_TitleOfFileBrowser [ Brw_ADMI_WORKS_USR ] = Txt_Works_area ; // Brw_ADMI_WORKS_USR
Brw_TitleOfFileBrowser [ Brw_ADMI_WORKS_CRS ] = Txt_Works_area ; // Brw_ADMI_WORKS_CRS
Brw_TitleOfFileBrowser [ Brw_ADMI_MARKS_CRS ] = Txt_Marks_management_area ; // Brw_ADMI_MARKS_CRS
2015-12-21 00:53:56 +01:00
Brw_TitleOfFileBrowser [ Brw_ADMI_BRIEF_USR ] = Txt_Temporary_private_storage_area ; // Brw_ADMI_BRIEF_USR
2016-04-22 09:47:25 +02:00
Brw_TitleOfFileBrowser [ Brw_SHOW_DOCUM_GRP ] = Txt_Documents_area ; // Brw_SHOW_DOCUM_GRP
Brw_TitleOfFileBrowser [ Brw_ADMI_DOCUM_GRP ] = Txt_Documents_management_area ; // Brw_ADMI_DOCUM_GRP
Brw_TitleOfFileBrowser [ Brw_SHOW_MARKS_GRP ] = Txt_Marks_area ; // Brw_SHOW_MARKS_GRP
Brw_TitleOfFileBrowser [ Brw_ADMI_MARKS_GRP ] = Txt_Marks_management_area ; // Brw_ADMI_MARKS_GRP
Brw_TitleOfFileBrowser [ Brw_ADMI_ASSIG_USR ] = Txt_Assignments_area ; // Brw_ADMI_ASSIG_USR
Brw_TitleOfFileBrowser [ Brw_ADMI_ASSIG_CRS ] = Txt_Assignments_area ; // Brw_ADMI_ASSIG_CRS
Brw_TitleOfFileBrowser [ Brw_SHOW_DOCUM_DEG ] = Txt_Documents_area ; // Brw_SHOW_DOCUM_DEG
Brw_TitleOfFileBrowser [ Brw_ADMI_DOCUM_DEG ] = Txt_Documents_management_area ; // Brw_ADMI_DOCUM_DEG
Brw_TitleOfFileBrowser [ Brw_SHOW_DOCUM_CTR ] = Txt_Documents_area ; // Brw_SHOW_DOCUM_CTR
Brw_TitleOfFileBrowser [ Brw_ADMI_DOCUM_CTR ] = Txt_Documents_management_area ; // Brw_ADMI_DOCUM_CTR
Brw_TitleOfFileBrowser [ Brw_SHOW_DOCUM_INS ] = Txt_Documents_area ; // Brw_SHOW_DOCUM_INS
Brw_TitleOfFileBrowser [ Brw_ADMI_DOCUM_INS ] = Txt_Documents_management_area ; // Brw_ADMI_DOCUM_INS
Brw_TitleOfFileBrowser [ Brw_ADMI_SHARE_DEG ] = Txt_Shared_files_area ; // Brw_ADMI_SHARE_DEG
Brw_TitleOfFileBrowser [ Brw_ADMI_SHARE_CTR ] = Txt_Shared_files_area ; // Brw_ADMI_SHARE_CTR
Brw_TitleOfFileBrowser [ Brw_ADMI_SHARE_INS ] = Txt_Shared_files_area ; // Brw_ADMI_SHARE_INS
Brw_TitleOfFileBrowser [ Brw_ADMI_TEACH_CRS ] = Txt_Teachers_files_area ; // Brw_ADMI_TEACH_CRS
Brw_TitleOfFileBrowser [ Brw_ADMI_TEACH_GRP ] = Txt_Teachers_files_area ; // Brw_ADMI_TEACH_GRP
2014-12-01 23:55:08 +01:00
2016-03-17 02:08:11 +01:00
/***** Set function to write contextual icons in frame *****/
FunctionToDrawContextualIcons = NULL ;
switch ( Gbl . FileBrowser . Type )
{
case Brw_SHOW_DOCUM_INS :
if ( Gbl . Usrs . Me . LoggedRole > = Rol_INS_ADM )
FunctionToDrawContextualIcons = Brw_PutIconToEditFileBrowser ;
break ;
case Brw_ADMI_DOCUM_INS :
if ( Gbl . Usrs . Me . LoggedRole > = Rol_INS_ADM )
FunctionToDrawContextualIcons = Brw_PutIconToSeeFileBrowser ;
break ;
case Brw_SHOW_DOCUM_CTR :
if ( Gbl . Usrs . Me . LoggedRole > = Rol_CTR_ADM )
FunctionToDrawContextualIcons = Brw_PutIconToEditFileBrowser ;
break ;
case Brw_ADMI_DOCUM_CTR :
if ( Gbl . Usrs . Me . LoggedRole > = Rol_CTR_ADM )
FunctionToDrawContextualIcons = Brw_PutIconToSeeFileBrowser ;
break ;
case Brw_SHOW_DOCUM_DEG :
if ( Gbl . Usrs . Me . LoggedRole > = Rol_DEG_ADM )
FunctionToDrawContextualIcons = Brw_PutIconToEditFileBrowser ;
break ;
case Brw_ADMI_DOCUM_DEG :
if ( Gbl . Usrs . Me . LoggedRole > = Rol_DEG_ADM )
FunctionToDrawContextualIcons = Brw_PutIconToSeeFileBrowser ;
break ;
case Brw_SHOW_DOCUM_CRS :
case Brw_SHOW_DOCUM_GRP :
if ( IAmTeacherOrSysAdm )
FunctionToDrawContextualIcons = Brw_PutIconToEditFileBrowser ;
break ;
case Brw_ADMI_DOCUM_CRS :
case Brw_ADMI_DOCUM_GRP :
if ( IAmTeacherOrSysAdm )
FunctionToDrawContextualIcons = Brw_PutIconToSeeFileBrowser ;
break ;
case Brw_SHOW_MARKS_CRS :
case Brw_SHOW_MARKS_GRP :
if ( IAmTeacherOrSysAdm )
FunctionToDrawContextualIcons = Brw_PutIconToEditFileBrowser ;
break ;
case Brw_ADMI_MARKS_CRS :
case Brw_ADMI_MARKS_GRP :
if ( IAmTeacherOrSysAdm )
FunctionToDrawContextualIcons = Brw_PutIconToSeeFileBrowser ;
break ;
default :
break ;
}
2014-12-01 23:55:08 +01:00
/***** Check if the maximum quota has been exceeded *****/
if ( Brw_FileBrowserIsEditable [ Gbl . FileBrowser . Type ] )
Brw_SetAndCheckQuota ( ) ;
/***** Check if the clipboard is in this tree *****/
Gbl . FileBrowser . Clipboard . IsThisTree = Brw_CheckIfClipboardIsInThisTree ( ) ;
2015-10-03 00:04:02 +02:00
/***** Start frame *****/
2015-10-03 00:38:01 +02:00
Gbl . FileBrowser . Id + + ;
fprintf ( Gbl . F . Out , " <section id= \" file_browser_%u \" > " , Gbl . FileBrowser . Id ) ;
2016-03-17 02:08:11 +01:00
Lay_StartRoundFrame ( " 100% " , Brw_TitleOfFileBrowser [ Gbl . FileBrowser . Type ] ,
FunctionToDrawContextualIcons ) ;
2014-12-01 23:55:08 +01:00
/***** Title *****/
2016-03-21 18:37:28 +01:00
fprintf ( Gbl . F . Out , " <table class= \" BROWSER_TABLE \" > "
2016-03-17 02:08:11 +01:00
" <tr> "
2015-08-01 10:43:33 +02:00
" <td class= \" CENTER_MIDDLE \" colspan= \" %u \" > " ,
2014-12-01 23:55:08 +01:00
Brw_NumColumnsInExpTree [ Gbl . FileBrowser . Type ] ) ;
Brw_WriteSubtitleOfFileBrowser ( ) ;
fprintf ( Gbl . F . Out , " </td> "
" </tr> " ) ;
/***** Show and store number of documents found *****/
if ( Brw_FileBrowserIsEditable [ Gbl . FileBrowser . Type ] )
{
Brw_ShowSizeOfFileTree ( ) ;
Brw_StoreSizeOfFileTreeInDB ( ) ;
}
/***** List recursively the directory *****/
Brw_SetFullPathInTree ( Brw_RootFolderInternalNames [ Gbl . FileBrowser . Type ] , " . " ) ;
if ( Brw_WriteRowFileBrowser ( 0 , Brw_IS_FOLDER , Brw_EXPAND_TREE_NOTHING , Brw_RootFolderInternalNames [ Gbl . FileBrowser . Type ] , " . " ) )
Brw_ListDir ( 1 , Gbl . FileBrowser . Priv . PathRootFolder , Brw_RootFolderInternalNames [ Gbl . FileBrowser . Type ] ) ;
/***** End of table *****/
2016-03-17 02:08:11 +01:00
fprintf ( Gbl . F . Out , " </table> " ) ;
Lay_EndRoundFrame ( ) ;
2015-10-03 00:04:02 +02:00
fprintf ( Gbl . F . Out , " </section> " ) ;
2014-12-01 23:55:08 +01:00
}
2016-03-17 02:08:11 +01:00
/*****************************************************************************/
/************************ Put icon to edit file browser **********************/
/*****************************************************************************/
static void Brw_PutIconToEditFileBrowser ( void )
{
extern const char * Txt_Edit ;
if ( Brw_ActFromSeeToAdm [ Gbl . FileBrowser . Type ] ! = ActUnk )
Lay_PutContextualLink ( Brw_ActFromSeeToAdm [ Gbl . FileBrowser . Type ] ,
Brw_PutParamsContextualLink ,
" edit64x64.png " , Txt_Edit , NULL ) ;
}
/*****************************************************************************/
/************************ Put icon to see file browser ***********************/
/*****************************************************************************/
static void Brw_PutIconToSeeFileBrowser ( void )
{
extern const char * Txt_View ;
if ( Brw_ActFromAdmToSee [ Gbl . FileBrowser . Type ] ! = ActUnk )
Lay_PutContextualLink ( Brw_ActFromAdmToSee [ Gbl . FileBrowser . Type ] ,
Brw_PutParamsContextualLink ,
" eye-on64x64.png " , Txt_View , NULL ) ;
}
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/********************** Write title of a file browser ************************/
/*****************************************************************************/
static void Brw_WriteTopBeforeShowingFileBrowser ( void )
{
/***** Update last access to this file browser *****/
Brw_UpdateLastAccess ( ) ;
2015-12-21 00:53:56 +01:00
/***** Write contextual links *****/
2016-03-17 02:08:11 +01:00
if ( Gbl . FileBrowser . Type = = Brw_ADMI_BRIEF_USR & &
2016-04-05 02:59:34 +02:00
Gbl . Action . Act ! = ActReqRemOldBrf )
2015-01-19 14:04:06 +01:00
{
2016-03-17 02:08:11 +01:00
fprintf ( Gbl . F . Out , " <div class= \" CONTEXT_MENU \" > " ) ;
Brw_PutFormToAskRemOldFiles ( ) ;
fprintf ( Gbl . F . Out , " </div> " ) ;
2015-01-19 14:04:06 +01:00
}
2014-12-01 23:55:08 +01:00
/***** Initialize hidden levels *****/
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_INS :
case Brw_ADMI_DOCUM_INS :
case Brw_SHOW_DOCUM_CTR :
case Brw_ADMI_DOCUM_CTR :
case Brw_SHOW_DOCUM_DEG :
case Brw_ADMI_DOCUM_DEG :
case Brw_SHOW_DOCUM_CRS :
case Brw_ADMI_DOCUM_CRS :
case Brw_SHOW_DOCUM_GRP :
case Brw_ADMI_DOCUM_GRP :
case Brw_SHOW_MARKS_CRS :
case Brw_ADMI_MARKS_CRS :
case Brw_SHOW_MARKS_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Brw_InitHiddenLevels ( ) ;
break ;
default :
break ;
}
/***** Write form to show the full tree *****/
Brw_WriteFormFullTree ( ) ;
/***** If browser is editable, get and write current clipboard *****/
if ( Brw_FileBrowserIsEditable [ Gbl . FileBrowser . Type ] )
Brw_GetAndWriteClipboard ( ) ;
}
/*****************************************************************************/
/******************* Update last access to a file browser ********************/
/*****************************************************************************/
static void Brw_UpdateLastAccess ( void )
{
2015-01-20 23:33:55 +01:00
/***** Get and update date and hour of last access to file browser *****/
2015-01-22 01:39:00 +01:00
Brw_GetAndUpdateDateLastAccFileBrowser ( ) ;
2014-12-01 23:55:08 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CRS :
case Brw_ADMI_DOCUM_CRS :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
2016-01-17 15:10:54 +01:00
if ( Gbl . Action . Act = = ActChgToSeeDocCrs | |
2016-04-22 09:47:25 +02:00
Gbl . Action . Act = = ActChgToAdmDocCrs | |
Gbl . Action . Act = = ActChgToAdmTch ) // Update group of last access to a documents/teachers zone only when user changes zone
2014-12-01 23:55:08 +01:00
Brw_UpdateGrpLastAccZone ( " LastDowGrpCod " , - 1L ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_GRP :
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2016-01-17 15:10:54 +01:00
if ( Gbl . Action . Act = = ActChgToSeeDocCrs | |
2016-04-22 09:47:25 +02:00
Gbl . Action . Act = = ActChgToAdmDocCrs | |
Gbl . Action . Act = = ActChgToAdmTch ) // Update group of last access to a documents/teachers zone only when user changes zone
2014-12-01 23:55:08 +01:00
Brw_UpdateGrpLastAccZone ( " LastDowGrpCod " , Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
2016-01-17 15:10:54 +01:00
if ( Gbl . Action . Act = = ActChgToAdmSha ) // Update group of last access to a shared files zone only when user changes zone
2014-12-01 23:55:08 +01:00
Brw_UpdateGrpLastAccZone ( " LastComGrpCod " , - 1L ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
2016-01-17 15:10:54 +01:00
if ( Gbl . Action . Act = = ActChgToAdmSha ) // Update group of last access to a shared files zone only when user changes zone
2014-12-01 23:55:08 +01:00
Brw_UpdateGrpLastAccZone ( " LastComGrpCod " , Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_MARKS_CRS :
case Brw_ADMI_MARKS_CRS :
2016-01-17 15:10:54 +01:00
if ( Gbl . Action . Act = = ActChgToSeeMrk | |
Gbl . Action . Act = = ActChgToAdmMrk ) // Update group of last access to a marks zone only when user changes zone
2014-12-01 23:55:08 +01:00
Brw_UpdateGrpLastAccZone ( " LastAssGrpCod " , - 1L ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_MARKS_GRP :
case Brw_ADMI_MARKS_GRP :
2016-01-17 15:10:54 +01:00
if ( Gbl . Action . Act = = ActChgToSeeMrk | |
Gbl . Action . Act = = ActChgToAdmMrk ) // Update group of last access to a marks zone only when user changes zone
2014-12-01 23:55:08 +01:00
Brw_UpdateGrpLastAccZone ( " LastAssGrpCod " , Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
default :
break ;
}
}
/*****************************************************************************/
/*********** Update the group of my last access to a common zone *************/
/*****************************************************************************/
static void Brw_UpdateGrpLastAccZone ( const char * FieldNameDB , long GrpCod )
{
char Query [ 512 ] ;
/***** Update the group of my last access to a common zone *****/
sprintf ( Query , " UPDATE crs_usr SET %s='%ld' "
" WHERE CrsCod='%ld' AND UsrCod='%ld' " ,
FieldNameDB , GrpCod ,
Gbl . CurrentCrs . Crs . CrsCod , Gbl . Usrs . Me . UsrDat . UsrCod ) ;
DB_QueryUPDATE ( Query , " can not update the group of the last access to a file browser " ) ;
}
/*****************************************************************************/
/*********************** Write title of a file browser ***********************/
/*****************************************************************************/
static void Brw_WriteSubtitleOfFileBrowser ( void )
{
2015-01-19 21:43:30 +01:00
extern const char * Txt_accessible_only_for_reading_by_students_and_teachers_of_the_institution ;
extern const char * Txt_accessible_for_reading_and_writing_by_administrators_of_the_institution ;
2015-02-05 22:59:48 +01:00
extern const char * Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_institution ;
2015-01-19 21:43:30 +01:00
extern const char * Txt_accessible_only_for_reading_by_students_and_teachers_of_the_centre ;
extern const char * Txt_accessible_for_reading_and_writing_by_administrators_of_the_centre ;
2015-02-05 22:59:48 +01:00
extern const char * Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_centre ;
2015-01-19 21:43:30 +01:00
extern const char * Txt_accessible_only_for_reading_by_students_and_teachers_of_the_degree ;
extern const char * Txt_accessible_for_reading_and_writing_by_administrators_of_the_degree ;
2015-02-05 22:59:48 +01:00
extern const char * Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_degree ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_accessible_only_for_reading_by_students_and_teachers_of_the_course ;
extern const char * Txt_accessible_only_for_reading_by_students_of_the_group_and_teachers_of_the_course ;
extern const char * Txt_accessible_for_reading_and_writing_by_teachers_of_the_course ;
extern const char * Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_course ;
extern const char * Txt_accessible_for_reading_and_writing_by_students_of_the_group_and_teachers_of_the_course ;
extern const char * Txt_accessible_for_reading_and_writing_by_you_and_the_teachers_of_the_course ;
extern const char * Txt_accessible_only_for_reading_by_you_and_the_teachers_of_the_course ;
extern const char * Txt_the_marks_of_a_student_chosen_at_random_ ;
extern const char * Txt_nobody_else_can_access_this_content ;
char Subtitle [ 1024 ] ;
2015-12-01 19:38:01 +01:00
/***** Container start *****/
fprintf ( Gbl . F . Out , " <div style= \" margin:0 auto; \" > " ) ;
2015-01-20 23:33:55 +01:00
/***** Form to change zone (course and group browsers) *****/
2014-12-01 23:55:08 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CRS :
case Brw_ADMI_DOCUM_CRS :
case Brw_SHOW_DOCUM_GRP :
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_SHARE_GRP :
case Brw_SHOW_MARKS_CRS :
case Brw_ADMI_MARKS_CRS :
case Brw_SHOW_MARKS_GRP :
case Brw_ADMI_MARKS_GRP :
2015-01-20 23:33:55 +01:00
Brw_FormToChangeCrsGrpZone ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
/***** Write subtitle *****/
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_INS :
2015-01-19 21:43:30 +01:00
sprintf ( Subtitle , " (%s) " ,
Txt_accessible_only_for_reading_by_students_and_teachers_of_the_institution ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_INS :
2015-01-18 18:45:10 +01:00
sprintf ( Subtitle , " (%s) " ,
2015-01-19 21:43:30 +01:00
Txt_accessible_for_reading_and_writing_by_administrators_of_the_institution ) ;
break ;
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_INS :
sprintf ( Subtitle , " (%s) " ,
Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_institution ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CTR :
2015-01-19 21:43:30 +01:00
sprintf ( Subtitle , " (%s) " ,
Txt_accessible_only_for_reading_by_students_and_teachers_of_the_centre ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CTR :
2015-01-19 21:43:30 +01:00
sprintf ( Subtitle , " (%s) " ,
Txt_accessible_for_reading_and_writing_by_administrators_of_the_centre ) ;
break ;
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_CTR :
sprintf ( Subtitle , " (%s) " ,
Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_centre ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_DEG :
2015-01-19 21:43:30 +01:00
sprintf ( Subtitle , " (%s) " ,
Txt_accessible_only_for_reading_by_students_and_teachers_of_the_degree ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_DEG :
2015-01-19 21:43:30 +01:00
sprintf ( Subtitle , " (%s) " ,
Txt_accessible_for_reading_and_writing_by_administrators_of_the_degree ) ;
2015-01-18 18:45:10 +01:00
break ;
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_DEG :
sprintf ( Subtitle , " (%s) " ,
Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_degree ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CRS :
2014-12-01 23:55:08 +01:00
sprintf ( Subtitle , " (%s) " ,
Txt_accessible_only_for_reading_by_students_and_teachers_of_the_course ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_GRP :
2014-12-01 23:55:08 +01:00
sprintf ( Subtitle , " (%s) " ,
Txt_accessible_only_for_reading_by_students_of_the_group_and_teachers_of_the_course ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS :
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
case Brw_ADMI_TEACH_GRP :
2014-12-01 23:55:08 +01:00
sprintf ( Subtitle , " (%s) " ,
Txt_accessible_for_reading_and_writing_by_teachers_of_the_course ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
2014-12-01 23:55:08 +01:00
sprintf ( Subtitle , " (%s) " ,
Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_course ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
2014-12-01 23:55:08 +01:00
sprintf ( Subtitle , " (%s) " ,
Txt_accessible_for_reading_and_writing_by_students_of_the_group_and_teachers_of_the_course ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_MARKS_CRS :
case Brw_SHOW_MARKS_GRP :
2015-04-07 21:44:24 +02:00
if ( Gbl . Usrs . Me . LoggedRole = = Rol_STUDENT )
2014-12-01 23:55:08 +01:00
sprintf ( Subtitle , " (%s) " ,
Txt_accessible_only_for_reading_by_you_and_the_teachers_of_the_course ) ;
else
sprintf ( Subtitle , " (%s) " ,
Txt_the_marks_of_a_student_chosen_at_random_ ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_MARKS_CRS :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
sprintf ( Subtitle , " (%s) " ,
Txt_accessible_for_reading_and_writing_by_teachers_of_the_course ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_USR :
case Brw_ADMI_WORKS_USR :
2014-12-01 23:55:08 +01:00
sprintf ( Subtitle , " %s<br />(%s) " ,
Gbl . Usrs . Me . UsrDat . FullName ,
Txt_accessible_for_reading_and_writing_by_you_and_the_teachers_of_the_course ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
sprintf ( Subtitle , " %s " ,
Gbl . Usrs . Other . UsrDat . FullName ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_BRIEF_USR :
2014-12-01 23:55:08 +01:00
sprintf ( Subtitle , " %s<br />(%s) " ,
Gbl . Usrs . Me . UsrDat . FullName ,
Txt_nobody_else_can_access_this_content ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_UNKNOWN :
2014-12-01 23:55:08 +01:00
return ;
}
if ( Subtitle [ 0 ] )
2015-12-01 19:38:01 +01:00
fprintf ( Gbl . F . Out , " <span class= \" BROWSER_SUBTITLE \" >%s</span> " ,
Subtitle ) ;
/***** Container end *****/
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " </div> " ) ;
}
/*****************************************************************************/
/************ Initialize hidden levels of download tree to false *************/
/*****************************************************************************/
static void Brw_InitHiddenLevels ( void )
{
unsigned Level ;
for ( Level = 0 ;
Level < = Brw_MAX_DIR_LEVELS ;
Level + + )
Gbl . FileBrowser . HiddenLevels [ Level ] = false ;
}
/*****************************************************************************/
/************************* Show size of a file browser ***********************/
/*****************************************************************************/
static void Brw_ShowSizeOfFileTree ( void )
{
extern const char * Txt_level ;
extern const char * Txt_levels ;
extern const char * Txt_folder ;
extern const char * Txt_folders ;
extern const char * Txt_file ;
extern const char * Txt_files ;
extern const char * Txt_of_PART_OF_A_TOTAL ;
fprintf ( Gbl . F . Out , " <tr> "
2015-08-01 10:43:33 +02:00
" <td colspan= \" %u \" class= \" DAT CENTER_MIDDLE \" > "
2014-12-01 23:55:08 +01:00
" %u %s; %lu %s; %lu %s; " ,
Brw_NumColumnsInExpTree [ Gbl . FileBrowser . Type ] ,
Gbl . FileBrowser . Size . NumLevls ,
Gbl . FileBrowser . Size . NumLevls = = 1 ? Txt_level :
Txt_levels ,
Gbl . FileBrowser . Size . NumFolds ,
Gbl . FileBrowser . Size . NumFolds = = 1 ? Txt_folder :
Txt_folders ,
Gbl . FileBrowser . Size . NumFiles ,
Gbl . FileBrowser . Size . NumFiles = = 1 ? Txt_file :
Txt_files ) ;
Str_WriteSizeInBytesFull ( ( double ) Gbl . FileBrowser . Size . TotalSiz ) ;
if ( Gbl . FileBrowser . Size . MaxQuota )
{
fprintf ( Gbl . F . Out , " (%.1f%% %s " ,
100.0 * ( ( double ) Gbl . FileBrowser . Size . TotalSiz / ( double ) Gbl . FileBrowser . Size . MaxQuota ) ,
Txt_of_PART_OF_A_TOTAL ) ;
Str_WriteSizeInBytesBrief ( ( double ) Gbl . FileBrowser . Size . MaxQuota ) ;
fprintf ( Gbl . F . Out , " ) " ) ;
}
fprintf ( Gbl . F . Out , " </td> "
" </tr> " ) ;
}
/*****************************************************************************/
/****************** Store size of a file browser in database *****************/
/*****************************************************************************/
static void Brw_StoreSizeOfFileTreeInDB ( void )
{
2015-01-25 18:50:43 +01:00
long Cod = Brw_GetCodForFiles ( ) ;
long ZoneUsrCod = Brw_GetZoneUsrCodForFiles ( ) ;
2014-12-01 23:55:08 +01:00
char Query [ 512 ] ;
/***** Update size of the file browser in database *****/
2015-01-25 18:50:43 +01:00
sprintf ( Query , " REPLACE INTO file_browser_size (FileBrowser,Cod,ZoneUsrCod, "
" NumLevels,NumFolders,NumFiles,TotalSize) "
" VALUES ('%u','%ld','%ld', "
" '%u','%lu','%lu','%llu') " ,
( unsigned ) Brw_FileBrowserForDB_files [ Gbl . FileBrowser . Type ] , Cod , ZoneUsrCod ,
Gbl . FileBrowser . Size . NumLevls ,
Gbl . FileBrowser . Size . NumFolds ,
Gbl . FileBrowser . Size . NumFiles ,
Gbl . FileBrowser . Size . TotalSiz ) ;
2014-12-01 23:55:08 +01:00
DB_QueryREPLACE ( Query , " can not store the size of a file browser " ) ;
}
/*****************************************************************************/
2015-01-25 18:50:43 +01:00
/******** Remove files related to an institution from the database ***********/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2015-01-25 18:50:43 +01:00
void Brw_RemoveInsFilesFromDB ( long InsCod )
2014-12-01 23:55:08 +01:00
{
char Query [ 512 ] ;
2015-01-25 18:50:43 +01:00
/***** Remove from database the entries that store the file views *****/
sprintf ( Query , " DELETE FROM file_view USING file_view,files "
2015-02-05 22:59:48 +01:00
" WHERE files.FileBrowser IN ('%u','%u') AND files.Cod='%ld' "
2015-01-25 18:50:43 +01:00
" AND files.FilCod=file_view.FilCod " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_INS ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_INS ,
2015-01-25 18:50:43 +01:00
InsCod ) ;
DB_QueryDELETE ( Query , " can not remove file views to files of an institution " ) ;
/***** Remove from database expanded folders *****/
sprintf ( Query , " DELETE LOW_PRIORITY FROM expanded_folders "
2015-02-05 22:59:48 +01:00
" WHERE FileBrowser IN ('%u','%u') AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_INS ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_INS ,
2015-01-25 18:50:43 +01:00
InsCod ) ;
DB_QueryDELETE ( Query , " can not remove expanded folders of an institution " ) ;
/***** Remove from database the entries that store clipboards *****/
sprintf ( Query , " DELETE FROM clipboard "
2015-02-05 22:59:48 +01:00
" WHERE FileBrowser IN ('%u','%u') AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_INS ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_INS ,
2015-01-25 18:50:43 +01:00
InsCod ) ;
DB_QueryDELETE ( Query , " can not remove clipboards related to files of an institution " ) ;
2015-02-05 22:59:48 +01:00
/***** Remove from database the entries that store
the last time users visited file zones * * * * */
2015-01-25 18:50:43 +01:00
sprintf ( Query , " DELETE FROM file_browser_last "
2015-02-05 22:59:48 +01:00
" WHERE FileBrowser IN ('%u','%u') AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_INS ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_INS ,
2015-01-25 18:50:43 +01:00
InsCod ) ;
DB_QueryDELETE ( Query , " can not remove file last visits to files of an institution " ) ;
2015-02-05 22:59:48 +01:00
/***** Remove from database the entries that store
the sizes of the file zones * * * * */
2015-01-25 18:50:43 +01:00
sprintf ( Query , " DELETE FROM file_browser_size "
2015-02-05 22:59:48 +01:00
" WHERE FileBrowser IN ('%u','%u') AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_INS ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_INS ,
2015-01-25 18:50:43 +01:00
InsCod ) ;
DB_QueryDELETE ( Query , " can not remove sizes of file zones of an institution " ) ;
/***** Remove from database the entries that store the data files *****/
sprintf ( Query , " DELETE FROM files "
2015-02-05 22:59:48 +01:00
" WHERE FileBrowser IN ('%u','%u') AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_INS ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_INS ,
2015-01-25 18:50:43 +01:00
InsCod ) ;
DB_QueryDELETE ( Query , " can not remove files of an institution " ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
2015-01-25 18:50:43 +01:00
/************ Remove files related to a centre from the database *************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2015-01-25 18:50:43 +01:00
void Brw_RemoveCtrFilesFromDB ( long CtrCod )
2014-12-01 23:55:08 +01:00
{
2015-01-25 18:50:43 +01:00
char Query [ 512 ] ;
2014-12-01 23:55:08 +01:00
2015-01-25 18:50:43 +01:00
/***** Remove from database the entries that store the file views *****/
sprintf ( Query , " DELETE FROM file_view USING file_view,files "
2015-02-05 22:59:48 +01:00
" WHERE files.FileBrowser IN ('%u','%u') AND files.Cod='%ld' "
2015-01-25 18:50:43 +01:00
" AND files.FilCod=file_view.FilCod " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_CTR ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_CTR ,
2015-01-25 18:50:43 +01:00
CtrCod ) ;
DB_QueryDELETE ( Query , " can not remove file views to files of a centre " ) ;
/***** Remove from database expanded folders *****/
sprintf ( Query , " DELETE LOW_PRIORITY FROM expanded_folders "
2015-02-05 22:59:48 +01:00
" WHERE FileBrowser IN ('%u','%u') AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_CTR ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_CTR ,
2015-01-25 18:50:43 +01:00
CtrCod ) ;
DB_QueryDELETE ( Query , " can not remove expanded folders of a centre " ) ;
/***** Remove from database the entries that store clipboards *****/
sprintf ( Query , " DELETE FROM clipboard "
2015-02-05 22:59:48 +01:00
" WHERE FileBrowser IN ('%u','%u') AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_CTR ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_CTR ,
2015-01-25 18:50:43 +01:00
CtrCod ) ;
DB_QueryDELETE ( Query , " can not remove clipboards related to files of a centre " ) ;
/***** Remove from database the entries that store the last time users visited file zones *****/
sprintf ( Query , " DELETE FROM file_browser_last "
2015-02-05 22:59:48 +01:00
" WHERE FileBrowser IN ('%u','%u') AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_CTR ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_CTR ,
2015-01-25 18:50:43 +01:00
CtrCod ) ;
DB_QueryDELETE ( Query , " can not remove file last visits to files of a centre " ) ;
/***** Remove from database the entries that store the sizes of the file zones *****/
sprintf ( Query , " DELETE FROM file_browser_size "
2015-02-05 22:59:48 +01:00
" WHERE FileBrowser IN ('%u','%u') AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_CTR ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_CTR ,
2015-01-25 18:50:43 +01:00
CtrCod ) ;
DB_QueryDELETE ( Query , " can not remove sizes of file zones of a centre " ) ;
/***** Remove from database the entries that store the data files *****/
sprintf ( Query , " DELETE FROM files "
2015-02-05 22:59:48 +01:00
" WHERE FileBrowser IN ('%u','%u') AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_CTR ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_CTR ,
2015-01-25 18:50:43 +01:00
CtrCod ) ;
DB_QueryDELETE ( Query , " can not remove files of a centre " ) ;
}
/*****************************************************************************/
/************ Remove files related to a degree from the database *************/
/*****************************************************************************/
void Brw_RemoveDegFilesFromDB ( long DegCod )
{
char Query [ 512 ] ;
2014-12-01 23:55:08 +01:00
/***** Remove from database the entries that store the file views *****/
2015-01-25 18:50:43 +01:00
sprintf ( Query , " DELETE FROM file_view USING file_view,files "
2015-02-05 22:59:48 +01:00
" WHERE files.FileBrowser IN ('%u','%u') AND files.Cod='%ld' "
2015-01-25 18:50:43 +01:00
" AND files.FilCod=file_view.FilCod " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_DEG ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_DEG ,
2015-01-25 18:50:43 +01:00
DegCod ) ;
DB_QueryDELETE ( Query , " can not remove file views to files of a degree " ) ;
2014-12-01 23:55:08 +01:00
2015-01-25 18:50:43 +01:00
/***** Remove from database expanded folders *****/
sprintf ( Query , " DELETE LOW_PRIORITY FROM expanded_folders "
2015-02-05 22:59:48 +01:00
" WHERE FileBrowser IN ('%u','%u') AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_DEG ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_DEG ,
2015-01-25 18:50:43 +01:00
DegCod ) ;
DB_QueryDELETE ( Query , " can not remove expanded folders of a degree " ) ;
/***** Remove from database the entries that store clipboards *****/
sprintf ( Query , " DELETE FROM clipboard "
2015-02-05 22:59:48 +01:00
" WHERE FileBrowser IN ('%u','%u') AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_DEG ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_DEG ,
2015-01-25 18:50:43 +01:00
DegCod ) ;
DB_QueryDELETE ( Query , " can not remove clipboards related to files of a degree " ) ;
/***** Remove from database the entries that store the last time users visited file zones *****/
sprintf ( Query , " DELETE FROM file_browser_last "
2015-02-05 22:59:48 +01:00
" WHERE FileBrowser IN ('%u','%u') AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_DEG ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_DEG ,
2015-01-25 18:50:43 +01:00
DegCod ) ;
DB_QueryDELETE ( Query , " can not remove file last visits to files of a degree " ) ;
/***** Remove from database the entries that store the sizes of the file zones *****/
sprintf ( Query , " DELETE FROM file_browser_size "
2015-02-05 22:59:48 +01:00
" WHERE FileBrowser IN ('%u','%u') AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_DEG ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_DEG ,
2015-01-25 18:50:43 +01:00
DegCod ) ;
DB_QueryDELETE ( Query , " can not remove sizes of file zones of a degree " ) ;
/***** Remove from database the entries that store the data files *****/
sprintf ( Query , " DELETE FROM files "
2015-02-05 22:59:48 +01:00
" WHERE FileBrowser IN ('%u','%u') AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_DEG ,
2015-02-05 22:59:48 +01:00
( unsigned ) Brw_ADMI_SHARE_DEG ,
2015-01-25 18:50:43 +01:00
DegCod ) ;
DB_QueryDELETE ( Query , " can not remove files of a degree " ) ;
}
/*****************************************************************************/
/************ Remove files related to a course from the database *************/
/*****************************************************************************/
// This function assumes that all the groups in the course have been removed before
void Brw_RemoveCrsFilesFromDB ( long CrsCod )
{
char Query [ 512 ] ;
/***** Remove format of files of marks *****/
sprintf ( Query , " DELETE FROM marks_properties USING files,marks_properties "
" WHERE files.FileBrowser='%u' "
" AND files.Cod='%ld' "
" AND files.FilCod=marks_properties.FilCod " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_MARKS_CRS ,
2015-01-25 18:50:43 +01:00
CrsCod ) ;
DB_QueryDELETE ( Query , " can not remove the properties of marks associated to a course " ) ;
/***** Remove from database the entries that store the file views *****/
sprintf ( Query , " DELETE FROM file_view USING file_view,files "
2016-04-22 09:47:25 +02:00
" WHERE files.FileBrowser IN ('%u','%u','%u','%u','%u','%u') "
2015-01-25 18:50:43 +01:00
" AND files.Cod='%ld' "
" AND files.FilCod=file_view.FilCod " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_CRS ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_CRS ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_CRS ,
( unsigned ) Brw_ADMI_ASSIG_USR ,
( unsigned ) Brw_ADMI_WORKS_USR ,
( unsigned ) Brw_ADMI_MARKS_CRS ,
2015-01-25 18:50:43 +01:00
CrsCod ) ;
DB_QueryDELETE ( Query , " can not remove file views to files of a course " ) ;
/***** Remove from database expanded folders *****/
sprintf ( Query , " DELETE LOW_PRIORITY FROM expanded_folders "
2016-04-22 09:47:25 +02:00
" WHERE FileBrowser IN ('%u','%u','%u','%u','%u','%u','%u','%u') "
2015-01-25 18:50:43 +01:00
" AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_CRS ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_CRS ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_CRS ,
( unsigned ) Brw_ADMI_ASSIG_USR ,
( unsigned ) Brw_ADMI_ASSIG_CRS ,
( unsigned ) Brw_ADMI_WORKS_USR ,
( unsigned ) Brw_ADMI_WORKS_CRS ,
( unsigned ) Brw_ADMI_MARKS_CRS ,
2015-01-25 18:50:43 +01:00
CrsCod ) ;
DB_QueryDELETE ( Query , " can not remove expanded folders of a course " ) ;
/***** Remove from database the entries that store clipboards *****/
sprintf ( Query , " DELETE FROM clipboard "
2016-04-22 09:47:25 +02:00
" WHERE FileBrowser IN ('%u','%u','%u','%u','%u','%u','%u','%u') "
2015-01-25 18:50:43 +01:00
" AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_CRS ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_CRS ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_CRS ,
( unsigned ) Brw_ADMI_ASSIG_USR ,
( unsigned ) Brw_ADMI_ASSIG_CRS ,
( unsigned ) Brw_ADMI_WORKS_USR ,
( unsigned ) Brw_ADMI_WORKS_CRS ,
( unsigned ) Brw_ADMI_MARKS_CRS ,
2015-01-25 18:50:43 +01:00
CrsCod ) ;
DB_QueryDELETE ( Query , " can not remove clipboards related to files of a course " ) ;
/***** Remove from database the entries that store the last time users visited file zones *****/
// Assignments and works are stored as one in file_browser_last...
// ...because a user views them at the same time
sprintf ( Query , " DELETE FROM file_browser_last "
2016-04-22 09:47:25 +02:00
" WHERE FileBrowser IN ('%u','%u','%u','%u','%u') "
2015-01-25 18:50:43 +01:00
" AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_CRS ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_CRS ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_CRS ,
( unsigned ) Brw_ADMI_ASSIG_USR ,
( unsigned ) Brw_ADMI_MARKS_CRS ,
2015-01-25 18:50:43 +01:00
CrsCod ) ;
DB_QueryDELETE ( Query , " can not remove file last visits to files of a course " ) ;
/***** Remove from database the entries that store the sizes of the file zones *****/
sprintf ( Query , " DELETE FROM file_browser_size "
2016-04-22 09:47:25 +02:00
" WHERE FileBrowser IN ('%u','%u','%u','%u','%u','%u') "
2015-01-25 18:50:43 +01:00
" AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_CRS ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_CRS ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_CRS ,
( unsigned ) Brw_ADMI_ASSIG_USR ,
( unsigned ) Brw_ADMI_WORKS_USR ,
( unsigned ) Brw_ADMI_MARKS_CRS ,
2015-01-25 18:50:43 +01:00
CrsCod ) ;
DB_QueryDELETE ( Query , " can not remove sizes of file zones of a course " ) ;
/***** Remove from database the entries that store the data files *****/
sprintf ( Query , " DELETE FROM files "
2016-04-22 09:47:25 +02:00
" WHERE FileBrowser IN ('%u','%u','%u','%u','%u','%u') "
2015-01-25 18:50:43 +01:00
" AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_CRS ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_CRS ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_CRS ,
( unsigned ) Brw_ADMI_ASSIG_USR ,
( unsigned ) Brw_ADMI_WORKS_USR ,
( unsigned ) Brw_ADMI_MARKS_CRS ,
2015-01-25 18:50:43 +01:00
CrsCod ) ;
DB_QueryDELETE ( Query , " can not remove files of a course " ) ;
}
/*****************************************************************************/
/************ Remove files related to a group from the database **************/
/*****************************************************************************/
void Brw_RemoveGrpFilesFromDB ( long GrpCod )
{
char Query [ 512 ] ;
/***** Remove format of files of marks *****/
sprintf ( Query , " DELETE FROM marks_properties USING files,marks_properties "
" WHERE files.FileBrowser='%u' "
" AND files.Cod='%ld' "
" AND files.FilCod=marks_properties.FilCod " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_MARKS_GRP ,
2015-01-25 18:50:43 +01:00
GrpCod ) ;
DB_QueryDELETE ( Query , " can not remove the properties of marks associated to a group " ) ;
/***** Remove from database the entries that store the file views *****/
sprintf ( Query , " DELETE FROM file_view USING file_view,files "
2016-04-22 09:47:25 +02:00
" WHERE files.FileBrowser IN ('%u','%u','%u','%u') "
2015-01-25 18:50:43 +01:00
" AND files.Cod='%ld' "
" AND files.FilCod=file_view.FilCod " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_GRP ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_GRP ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_GRP ,
( unsigned ) Brw_ADMI_MARKS_GRP ,
2015-01-25 18:50:43 +01:00
GrpCod ) ;
DB_QueryDELETE ( Query , " can not remove file views to files of a group " ) ;
/***** Remove from database expanded folders *****/
sprintf ( Query , " DELETE LOW_PRIORITY FROM expanded_folders "
2016-04-22 09:47:25 +02:00
" WHERE FileBrowser IN ('%u','%u','%u','%u') "
2015-01-25 18:50:43 +01:00
" AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_GRP ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_GRP ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_GRP ,
( unsigned ) Brw_ADMI_MARKS_GRP ,
2015-01-25 18:50:43 +01:00
GrpCod ) ;
DB_QueryDELETE ( Query , " can not remove expanded folders of a group " ) ;
/***** Remove from database the entries that store clipboards *****/
sprintf ( Query , " DELETE FROM clipboard "
2016-04-22 09:47:25 +02:00
" WHERE FileBrowser IN ('%u','%u','%u','%u') "
2015-01-25 18:50:43 +01:00
" AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_GRP ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_GRP ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_GRP ,
( unsigned ) Brw_ADMI_MARKS_GRP ,
2015-01-25 18:50:43 +01:00
GrpCod ) ;
DB_QueryDELETE ( Query , " can not remove clipboards related to files of a group " ) ;
/***** Remove from database the entries that store the last time users visited file zones *****/
sprintf ( Query , " DELETE FROM file_browser_last "
2016-04-22 09:47:25 +02:00
" WHERE FileBrowser IN ('%u','%u','%u','%u') "
2015-01-25 18:50:43 +01:00
" AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_GRP ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_GRP ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_GRP ,
( unsigned ) Brw_ADMI_MARKS_GRP ,
2015-01-25 18:50:43 +01:00
GrpCod ) ;
DB_QueryDELETE ( Query , " can not remove file last visits to files of a group " ) ;
/***** Remove from database the entries that store the sizes of the file zones *****/
sprintf ( Query , " DELETE FROM file_browser_size "
2016-04-22 09:47:25 +02:00
" WHERE FileBrowser IN ('%u','%u','%u','%u') "
2015-01-25 18:50:43 +01:00
" AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_GRP ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_GRP ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_GRP ,
( unsigned ) Brw_ADMI_MARKS_GRP ,
2015-01-25 18:50:43 +01:00
GrpCod ) ;
DB_QueryDELETE ( Query , " can not remove sizes of file zones of a group " ) ;
/***** Remove from database the entries that store the data files *****/
sprintf ( Query , " DELETE FROM files "
2016-04-22 09:47:25 +02:00
" WHERE FileBrowser IN ('%u','%u','%u','%u') "
2015-01-25 18:50:43 +01:00
" AND Cod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_GRP ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_GRP ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_GRP ,
( unsigned ) Brw_ADMI_MARKS_GRP ,
2015-01-25 18:50:43 +01:00
GrpCod ) ;
DB_QueryDELETE ( Query , " can not remove files of a group " ) ;
}
/*****************************************************************************/
/* Remove some info about files related to a course and a user from database */
/*****************************************************************************/
void Brw_RemoveSomeInfoAboutCrsUsrFilesFromDB ( long CrsCod , long UsrCod )
{
char Query [ 512 ] ;
/***** Remove from database expanded folders *****/
sprintf ( Query , " DELETE LOW_PRIORITY FROM expanded_folders "
" WHERE UsrCod='%ld' AND ( "
2016-04-22 09:47:25 +02:00
" (FileBrowser IN ('%u','%u','%u','%u','%u','%u','%u','%u') "
2015-01-25 18:50:43 +01:00
" AND Cod='%ld') "
" OR "
2016-04-22 09:47:25 +02:00
" (FileBrowser IN ('%u','%u','%u','%u') "
2015-01-27 20:50:44 +01:00
" AND Cod IN "
" (SELECT crs_grp.GrpCod FROM crs_grp_types,crs_grp "
" WHERE crs_grp_types.CrsCod='%ld' "
" AND crs_grp_types.GrpTypCod=crs_grp.GrpTypCod)) "
2015-01-25 18:50:43 +01:00
" ) " ,
UsrCod ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_CRS ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_CRS ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_CRS ,
( unsigned ) Brw_ADMI_ASSIG_USR ,
( unsigned ) Brw_ADMI_ASSIG_CRS ,
( unsigned ) Brw_ADMI_WORKS_USR ,
( unsigned ) Brw_ADMI_WORKS_CRS ,
( unsigned ) Brw_ADMI_MARKS_CRS ,
2015-01-25 18:50:43 +01:00
CrsCod ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_GRP ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_GRP ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_GRP ,
( unsigned ) Brw_ADMI_MARKS_GRP ,
2015-01-25 18:50:43 +01:00
CrsCod ) ;
DB_QueryDELETE ( Query , " can not remove expanded folders for a user in a course " ) ;
/***** Remove from database the entries that store clipboards *****/
sprintf ( Query , " DELETE FROM clipboard "
" WHERE UsrCod='%ld' AND ( "
2016-04-22 09:47:25 +02:00
" (FileBrowser IN ('%u','%u','%u','%u','%u','%u','%u','%u') "
2015-01-25 18:50:43 +01:00
" AND Cod='%ld') "
" OR "
2016-04-22 09:47:25 +02:00
" (FileBrowser IN ('%u','%u','%u','%u') "
2015-01-27 20:50:44 +01:00
" AND Cod IN "
" (SELECT crs_grp.GrpCod FROM crs_grp_types,crs_grp "
" WHERE crs_grp_types.CrsCod='%ld' "
" AND crs_grp_types.GrpTypCod=crs_grp.GrpTypCod)) "
2015-01-25 18:50:43 +01:00
" ) " ,
UsrCod ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_CRS ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_CRS ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_CRS ,
( unsigned ) Brw_ADMI_ASSIG_USR ,
( unsigned ) Brw_ADMI_ASSIG_CRS ,
( unsigned ) Brw_ADMI_WORKS_USR ,
( unsigned ) Brw_ADMI_WORKS_CRS ,
( unsigned ) Brw_ADMI_MARKS_CRS ,
2015-01-25 18:50:43 +01:00
CrsCod ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_GRP ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_GRP ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_GRP ,
( unsigned ) Brw_ADMI_MARKS_GRP ,
2015-01-25 18:50:43 +01:00
CrsCod ) ;
DB_QueryDELETE ( Query , " can not remove source of copy for a user in a course " ) ;
/***** Remove from database the entries that store the last time user visited file zones *****/
// Assignments and works are stored as one in file_browser_last...
// ...because a user views them at the same time
sprintf ( Query , " DELETE FROM file_browser_last "
" WHERE UsrCod='%ld' AND ( "
2016-04-22 09:47:25 +02:00
" (FileBrowser IN ('%u','%u','%u','%u','%u') "
2015-01-25 18:50:43 +01:00
" AND Cod='%ld') "
" OR "
2016-04-22 09:47:25 +02:00
" (FileBrowser IN ('%u','%u','%u','%u') "
2015-01-27 20:50:44 +01:00
" AND Cod IN "
" (SELECT crs_grp.GrpCod FROM crs_grp_types,crs_grp "
" WHERE crs_grp_types.CrsCod='%ld' "
" AND crs_grp_types.GrpTypCod=crs_grp.GrpTypCod)) "
2015-01-25 18:50:43 +01:00
" ) " ,
UsrCod ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_CRS ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_CRS ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_CRS ,
( unsigned ) Brw_ADMI_ASSIG_USR ,
( unsigned ) Brw_ADMI_MARKS_CRS ,
2015-01-25 18:50:43 +01:00
CrsCod ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_DOCUM_GRP ,
2016-04-22 09:47:25 +02:00
( unsigned ) Brw_ADMI_TEACH_GRP ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_SHARE_GRP ,
( unsigned ) Brw_ADMI_MARKS_GRP ,
2015-01-25 18:50:43 +01:00
CrsCod ) ;
DB_QueryDELETE ( Query , " can not remove file last visits to files of a course from a user " ) ;
}
/*****************************************************************************/
/*************** Remove user's works in a course from database ***************/
/*****************************************************************************/
void Brw_RemoveWrkFilesFromDB ( long CrsCod , long UsrCod )
{
char Query [ 512 ] ;
/***** Remove from database the entries that store the file views *****/
sprintf ( Query , " DELETE FROM file_view USING file_view,files "
" WHERE files.FileBrowser IN ('%u','%u') "
" AND files.Cod='%ld' AND files.ZoneUsrCod='%ld' "
" AND files.FilCod=file_view.FilCod " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_ASSIG_USR ,
( unsigned ) Brw_ADMI_WORKS_USR ,
2015-01-25 18:50:43 +01:00
CrsCod , UsrCod ) ;
DB_QueryDELETE ( Query , " can not remove file views " ) ;
/***** Remove from database expanded folders *****/
sprintf ( Query , " DELETE LOW_PRIORITY FROM expanded_folders "
" WHERE FileBrowser IN ('%u','%u') "
" AND Cod='%ld' AND WorksUsrCod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_ASSIG_CRS ,
( unsigned ) Brw_ADMI_WORKS_CRS ,
2015-01-25 18:50:43 +01:00
CrsCod , UsrCod ) ;
DB_QueryDELETE ( Query , " can not remove expanded folders of a group " ) ;
/***** Remove from database the entries that store clipboards *****/
sprintf ( Query , " DELETE FROM clipboard "
" WHERE FileBrowser IN ('%u','%u') "
" AND Cod='%ld' AND WorksUsrCod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_ASSIG_CRS ,
( unsigned ) Brw_ADMI_WORKS_CRS ,
2015-01-25 18:50:43 +01:00
CrsCod , UsrCod ) ;
DB_QueryDELETE ( Query , " can not remove clipboards " ) ;
/***** Remove from database the entries that store the sizes of the file zones *****/
sprintf ( Query , " DELETE FROM file_browser_size "
" WHERE FileBrowser IN ('%u','%u') "
" AND Cod='%ld' AND ZoneUsrCod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_ASSIG_USR ,
( unsigned ) Brw_ADMI_WORKS_USR ,
2015-01-25 18:50:43 +01:00
CrsCod , UsrCod ) ;
DB_QueryDELETE ( Query , " can not remove file browser sizes " ) ;
/***** Remove from database the entries that store the data files *****/
sprintf ( Query , " DELETE FROM files "
" WHERE FileBrowser IN ('%u','%u') "
" AND Cod='%ld' AND ZoneUsrCod='%ld' " ,
2015-01-26 12:39:48 +01:00
( unsigned ) Brw_ADMI_ASSIG_USR ,
( unsigned ) Brw_ADMI_WORKS_USR ,
2015-01-25 18:50:43 +01:00
CrsCod , UsrCod ) ;
DB_QueryDELETE ( Query , " can not remove files " ) ;
}
/*****************************************************************************/
/************* Remove files related to a user from the database **************/
/*****************************************************************************/
void Brw_RemoveUsrFilesFromDB ( long UsrCod )
{
char Query [ 512 ] ;
/***** Remove from database the entries that store the file views *****/
// User is not removed from file_view table,
// in order to take into account his/her views
sprintf ( Query , " DELETE FROM file_view USING file_view,files "
" WHERE files.ZoneUsrCod='%ld' "
" AND files.FilCod=file_view.FilCod " ,
UsrCod ) ;
DB_QueryDELETE ( Query , " can not remove file views to files of a user " ) ;
/***** Remove from database expanded folders *****/
sprintf ( Query , " DELETE LOW_PRIORITY FROM expanded_folders "
" WHERE UsrCod='%ld' " ,
UsrCod ) ;
DB_QueryDELETE ( Query , " can not remove expanded folders for a user " ) ;
/***** Remove from database the entries that store clipboards *****/
sprintf ( Query , " DELETE FROM clipboard "
" WHERE UsrCod='%ld' " , // User's clipboard
UsrCod ) ;
DB_QueryDELETE ( Query , " can not remove user's clipboards " ) ;
/***** Remove from database the entries that store the last time users visited file zones *****/
sprintf ( Query , " DELETE FROM file_browser_last "
" WHERE UsrCod='%ld' " , // User's last visits to all zones
UsrCod ) ;
DB_QueryDELETE ( Query , " can not remove user's last visits to file zones " ) ;
/***** Remove from database the entries that store the sizes of the file zones *****/
sprintf ( Query , " DELETE FROM file_browser_size "
" WHERE ZoneUsrCod='%ld' " ,
UsrCod ) ;
DB_QueryDELETE ( Query , " can not remove sizes of user's file zones " ) ;
/***** Remove from database the entries that store the data files *****/
sprintf ( Query , " DELETE FROM files "
" WHERE ZoneUsrCod='%ld' " ,
UsrCod ) ;
DB_QueryDELETE ( Query , " can not remove files in user's file zones " ) ;
2014-12-01 23:55:08 +01:00
}
2015-12-21 00:53:56 +01:00
/*****************************************************************************/
/************** Put parameters necessary in a contextual link ****************/
/*****************************************************************************/
static void Brw_PutParamsContextualLink ( void )
2015-04-02 18:39:49 +02:00
{
if ( Gbl . FileBrowser . FullTree )
Par_PutHiddenParamChar ( " FullTree " , ' Y ' ) ;
// It's not necessary to put a parameter with the group code...
// ...because it is stored in database
}
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/************** Write a form to select whether show full tree ****************/
/*****************************************************************************/
static void Brw_WriteFormFullTree ( void )
{
2015-07-27 21:25:45 +02:00
extern const char * The_ClassForm [ The_NUM_THEMES ] ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_Show_all_files ;
/***** Start form depending on type of tree *****/
2015-07-27 21:25:45 +02:00
fprintf ( Gbl . F . Out , " <div class= \" %s CENTER_MIDDLE \" > " ,
The_ClassForm [ Gbl . Prefs . Theme ] ) ;
2015-01-20 00:32:15 +01:00
Act_FormStart ( Brw_ActSeeAdm [ Gbl . FileBrowser . Type ] ) ;
2014-12-01 23:55:08 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_INS :
case Brw_ADMI_DOCUM_INS :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_INS :
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CTR :
case Brw_ADMI_DOCUM_CTR :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_CTR :
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_DEG :
case Brw_ADMI_DOCUM_DEG :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_DEG :
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CRS :
case Brw_ADMI_DOCUM_CRS :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_SHOW_MARKS_CRS :
case Brw_ADMI_MARKS_CRS :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( - 1L ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_GRP :
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_SHOW_MARKS_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2015-01-20 00:32:15 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActSeeAdm [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
/***** End form *****/
fprintf ( Gbl . F . Out , " <input type= \" checkbox \" name= \" FullTree \" value= \" Y \" " ) ;
if ( Gbl . FileBrowser . FullTree )
fprintf ( Gbl . F . Out , " checked= \" checked \" " ) ;
2015-10-22 14:49:48 +02:00
fprintf ( Gbl . F . Out , " onclick= \" document.getElementById('%s').submit(); \" /> "
2015-03-13 00:16:02 +01:00
" %s " ,
2016-01-14 10:31:09 +01:00
Gbl . Form . Id ,
2014-12-01 23:55:08 +01:00
Txt_Show_all_files ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
fprintf ( Gbl . F . Out , " </div> " ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/******************* Get whether to show full tree from form *****************/
/*****************************************************************************/
static bool Brw_GetFullTreeFromForm ( void )
{
char YN [ 1 + 1 ] ;
Par_GetParToText ( " FullTree " , YN , 1 ) ;
return ( Str_ConvertToUpperLetter ( YN [ 0 ] ) = = ' Y ' ) ;
}
/*****************************************************************************/
/******** Create a temporary public directory used to download files *********/
/*****************************************************************************/
void Brw_CreateDirDownloadTmp ( void )
{
static unsigned NumDir = 0 ; // When this function is called several times in the same execution of the program, each time a new directory is created
// This happens when the trees of assignments and works of several users are being listed
char PathFileBrowserTmpPubl [ PATH_MAX + 1 ] ;
char PathPubDirTmp [ PATH_MAX + 1 ] ;
/* Example: /var/www/html/swad/tmp/SSujCNWsy4ZOdmgMKYBe0sKPAJu6szaZOQlIlJs_QIY */
/***** If the public directory does not exist, create it *****/
sprintf ( PathFileBrowserTmpPubl , " %s/%s " ,
Cfg_PATH_SWAD_PUBLIC , Cfg_FOLDER_FILE_BROWSER_TMP ) ;
Fil_CreateDirIfNotExists ( PathFileBrowserTmpPubl ) ;
/***** First of all, we remove the oldest temporary directories.
Such temporary directories have been created by me or by other users .
This is a bit sloppy , but they must be removed by someone .
Here " oldest " means more than x time from their creation * * * * */
if ( NumDir = = 0 ) // Only in the first call to this function
Fil_RemoveOldTmpFiles ( PathFileBrowserTmpPubl , Cfg_TIME_TO_DELETE_BROWSER_TMP_FILES , false ) ;
/***** Create a new temporary directory.
Important : number of directories inside a directory is limited to 32 K in Linux * * * * */
if ( NumDir )
sprintf ( Gbl . FileBrowser . TmpPubDir , " %s_%u " , Gbl . UniqueNameEncrypted , NumDir ) ;
else
strcpy ( Gbl . FileBrowser . TmpPubDir , Gbl . UniqueNameEncrypted ) ;
sprintf ( PathPubDirTmp , " %s/%s " , PathFileBrowserTmpPubl , Gbl . FileBrowser . TmpPubDir ) ;
if ( mkdir ( PathPubDirTmp , ( mode_t ) 0xFFF ) )
Lay_ShowErrorAndExit ( " Can not create a temporary folder for download. " ) ;
NumDir + + ;
}
/*****************************************************************************/
/* Get and update the date of my last access to file browser in this course **/
/*****************************************************************************/
2015-01-22 01:39:00 +01:00
static void Brw_GetAndUpdateDateLastAccFileBrowser ( void )
2014-12-01 23:55:08 +01:00
{
2015-01-22 01:39:00 +01:00
long Cod ;
char Query [ 256 ] ;
2014-12-01 23:55:08 +01:00
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
unsigned long NumRows ;
/***** Get date of last accesss to a file browser from database *****/
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_INS :
case Brw_ADMI_DOCUM_INS :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_INS :
2015-01-22 01:39:00 +01:00
Cod = Gbl . CurrentIns . Ins . InsCod ;
2015-01-21 01:34:38 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CTR :
case Brw_ADMI_DOCUM_CTR :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_CTR :
2015-01-22 01:39:00 +01:00
Cod = Gbl . CurrentCtr . Ctr . CtrCod ;
2015-01-21 01:34:38 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_DEG :
case Brw_ADMI_DOCUM_DEG :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_DEG :
2015-01-22 01:39:00 +01:00
Cod = Gbl . CurrentDeg . Deg . DegCod ;
2015-01-21 01:34:38 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CRS :
case Brw_ADMI_DOCUM_CRS :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_SHOW_MARKS_CRS :
case Brw_ADMI_MARKS_CRS :
case Brw_ADMI_ASSIG_USR :
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_USR :
case Brw_ADMI_WORKS_CRS :
2015-01-22 01:39:00 +01:00
Cod = Gbl . CurrentCrs . Crs . CrsCod ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_GRP :
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_SHOW_MARKS_GRP :
case Brw_ADMI_MARKS_GRP :
2015-01-22 01:39:00 +01:00
Cod = Gbl . CurrentCrs . Grps . GrpCod ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_BRIEF_USR :
2015-01-22 01:39:00 +01:00
Cod = - 1L ;
2014-12-01 23:55:08 +01:00
break ;
default :
return ;
}
2015-01-22 01:39:00 +01:00
sprintf ( Query , " SELECT UNIX_TIMESTAMP(LastClick) FROM file_browser_last "
" WHERE UsrCod='%ld' AND FileBrowser='%u' AND Cod='%ld' " ,
Gbl . Usrs . Me . UsrDat . UsrCod ,
2015-01-24 19:30:44 +01:00
( unsigned ) Brw_FileBrowserForDB_file_browser_last [ Gbl . FileBrowser . Type ] ,
2015-01-22 01:39:00 +01:00
Cod ) ;
NumRows = DB_QuerySELECT ( Query , & mysql_res , " can not get date-time of last access to a file browser " ) ;
2014-12-01 23:55:08 +01:00
if ( NumRows = = 0 ) // May be an administrator not belonging to this course
Gbl . Usrs . Me . TimeLastAccToThisFileBrowser = LONG_MAX ; // Initialize to a big value in order to show files as old
else if ( NumRows = = 1 )
{
/* Get the date of the last access to file browser (row[0]) */
row = mysql_fetch_row ( mysql_res ) ;
if ( row [ 0 ] = = NULL )
Gbl . Usrs . Me . TimeLastAccToThisFileBrowser = 0 ;
else if ( sscanf ( row [ 0 ] , " %lu " , & Gbl . Usrs . Me . TimeLastAccToThisFileBrowser ) ! = 1 )
Lay_ShowErrorAndExit ( " Error when reading date-time of last access to a file browser. " ) ;
}
else
Lay_ShowErrorAndExit ( " Error when getting date-time of last access to a file browser. " ) ;
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult ( & mysql_res ) ;
/***** Update date of my last access to file browser in this course *****/
2015-01-22 01:39:00 +01:00
sprintf ( Query , " REPLACE INTO file_browser_last (UsrCod,FileBrowser,Cod,LastClick) "
" VALUES ('%ld','%u','%ld',NOW()) " ,
Gbl . Usrs . Me . UsrDat . UsrCod ,
2015-01-24 19:30:44 +01:00
( unsigned ) Brw_FileBrowserForDB_file_browser_last [ Gbl . FileBrowser . Type ] ,
2015-01-22 01:39:00 +01:00
Cod ) ;
2015-02-23 23:45:32 +01:00
DB_QueryREPLACE ( Query , " can not update date of last access to a file browser " ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/************* Get the group of my last access to a common zone **************/
/*****************************************************************************/
static long Brw_GetGrpLastAccZone ( const char * FieldNameDB )
{
char Query [ 512 ] ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
unsigned long NumRows ;
long GrpCod = - 1L ;
/***** Get the group of my last access to a common zone from database *****/
sprintf ( Query , " SELECT %s FROM crs_usr "
" WHERE CrsCod='%ld' AND UsrCod='%ld' " ,
FieldNameDB ,
Gbl . CurrentCrs . Crs . CrsCod ,
Gbl . Usrs . Me . UsrDat . UsrCod ) ;
NumRows = DB_QuerySELECT ( Query , & mysql_res , " can not get the group of your last access to a file browser " ) ;
if ( NumRows = = 0 ) // May be an administrator not belonging to this course
GrpCod = - 1L ;
else if ( NumRows = = 1 )
{
/* Get the group code (row[0]) */
row = mysql_fetch_row ( mysql_res ) ;
if ( row [ 0 ] )
{
if ( sscanf ( row [ 0 ] , " %ld " , & GrpCod ) ! = 1 )
Lay_ShowErrorAndExit ( " Error when reading the group of your last access to a file browser. " ) ;
}
else
GrpCod = - 1L ;
}
else
Lay_ShowErrorAndExit ( " Error when getting the group of your last access to a file browser. " ) ;
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult ( & mysql_res ) ;
/***** Check if group exists (it's possible that this group has been removed after my last access to it) *****/
if ( GrpCod > = 0 )
if ( Grp_CheckIfGroupExists ( GrpCod ) )
/* Check if I belong to this group (it's possible that I have been removed from this group after my last access to it) */
if ( Grp_GetIfIBelongToGrp ( GrpCod ) )
return GrpCod ;
return - 1L ; // To indicate course zone
}
/*****************************************************************************/
/********************* Reset the size of a file browser **********************/
/*****************************************************************************/
static void Brw_ResetFileBrowserSize ( void )
{
Gbl . FileBrowser . Size . NumLevls = 0 ;
Gbl . FileBrowser . Size . NumFolds =
Gbl . FileBrowser . Size . NumFiles = 0L ;
Gbl . FileBrowser . Size . TotalSiz = 0ULL ;
}
/*****************************************************************************/
/********************** Compute the size of a directory **********************/
/*****************************************************************************/
void Brw_CalcSizeOfDir ( char * Path )
{
Brw_ResetFileBrowserSize ( ) ;
Brw_CalcSizeOfDirRecursive ( 1 , Path ) ;
}
/*****************************************************************************/
/**************** Compute the size of a directory recursively ****************/
/*****************************************************************************/
static void Brw_CalcSizeOfDirRecursive ( unsigned Level , char * Path )
{
struct dirent * * FileList ;
2015-12-21 13:36:39 +01:00
int NumFile ;
int NumFiles ;
2014-12-01 23:55:08 +01:00
char PathFileRel [ PATH_MAX + 1 ] ;
struct stat FileStatus ;
/***** Scan the directory *****/
2015-12-21 13:36:39 +01:00
if ( ( NumFiles = scandir ( Path , & FileList , NULL , NULL ) ) > = 0 ) // No error
2015-12-21 12:30:07 +01:00
{
2015-12-21 13:36:39 +01:00
/***** Compute recursively the total number and size of the files and folders *****/
for ( NumFile = 0 ;
NumFile < NumFiles ;
NumFile + + )
2014-12-01 23:55:08 +01:00
{
2015-12-21 13:36:39 +01:00
if ( strcmp ( FileList [ NumFile ] - > d_name , " . " ) & &
strcmp ( FileList [ NumFile ] - > d_name , " .. " ) ) // Skip directories "." and ".."
2014-12-01 23:55:08 +01:00
{
2015-12-21 13:36:39 +01:00
/* There are files in this directory ==> update level */
if ( Level > Gbl . FileBrowser . Size . NumLevls )
Gbl . FileBrowser . Size . NumLevls + + ;
/* Update counters depending on whether it's a directory or a regular file */
sprintf ( PathFileRel , " %s/%s " , Path , FileList [ NumFile ] - > d_name ) ;
lstat ( PathFileRel , & FileStatus ) ;
if ( S_ISDIR ( FileStatus . st_mode ) ) // It's a directory
{
Gbl . FileBrowser . Size . NumFolds + + ;
Gbl . FileBrowser . Size . TotalSiz + = ( unsigned long long ) FileStatus . st_size ;
Brw_CalcSizeOfDirRecursive ( Level + 1 , PathFileRel ) ;
}
else if ( S_ISREG ( FileStatus . st_mode ) ) // It's a regular file
{
Gbl . FileBrowser . Size . NumFiles + + ;
Gbl . FileBrowser . Size . TotalSiz + = ( unsigned long long ) FileStatus . st_size ;
}
2014-12-01 23:55:08 +01:00
}
2015-12-21 13:36:39 +01:00
free ( ( void * ) FileList [ NumFile ] ) ;
2014-12-01 23:55:08 +01:00
}
2015-12-21 13:36:39 +01:00
free ( ( void * ) FileList ) ;
2015-12-21 12:30:07 +01:00
}
2015-12-21 13:36:39 +01:00
else
Lay_ShowErrorAndExit ( " Error while scanning directory. " ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/************************ List a directory recursively ***********************/
/*****************************************************************************/
static void Brw_ListDir ( unsigned Level , const char * Path , const char * PathInTree )
{
2015-12-21 13:36:39 +01:00
struct dirent * * FileList ;
2014-12-01 23:55:08 +01:00
struct dirent * * SubdirFileList ;
2015-12-21 13:36:39 +01:00
int NumFile ;
int NumFiles ;
int NumFileInSubdir ;
int NumFilesInSubdir ;
2014-12-01 23:55:08 +01:00
char PathFileRel [ PATH_MAX + 1 ] ;
char PathFileInExplTree [ PATH_MAX + 1 ] ;
struct stat FileStatus ;
2015-12-21 13:36:39 +01:00
Brw_ExpandTree_t ExpandTree = Brw_EXPAND_TREE_NOTHING ; // Initialized to avoid warning
2014-12-01 23:55:08 +01:00
/***** Scan directory *****/
2015-12-21 13:36:39 +01:00
if ( ( NumFiles = scandir ( Path , & FileList , NULL , alphasort ) ) > = 0 ) // No error
{
/***** List files *****/
for ( NumFile = 0 ;
NumFile < NumFiles ;
NumFile + + )
{
if ( strcmp ( FileList [ NumFile ] - > d_name , " . " ) & &
strcmp ( FileList [ NumFile ] - > d_name , " .. " ) ) // Skip directories "." and ".."
{
2015-12-21 18:03:28 +01:00
/***** Construct the full path of the file or folder *****/
2015-12-21 13:36:39 +01:00
sprintf ( PathFileRel , " %s/%s " , Path , FileList [ NumFile ] - > d_name ) ;
sprintf ( PathFileInExplTree , " %s/%s " , PathInTree , FileList [ NumFile ] - > d_name ) ;
Brw_SetFullPathInTree ( PathInTree , FileList [ NumFile ] - > d_name ) ;
2014-12-01 23:55:08 +01:00
2015-12-21 18:03:28 +01:00
/***** Get file or folder status *****/
lstat ( PathFileRel , & FileStatus ) ;
2015-12-21 13:36:39 +01:00
if ( S_ISDIR ( FileStatus . st_mode ) ) // It's a directory
{
if ( Gbl . FileBrowser . FullTree )
ExpandTree = Brw_EXPAND_TREE_NOTHING ;
else
{
/***** Check if this subdirectory has files or folders in it *****/
if ( ( NumFilesInSubdir = scandir ( PathFileRel , & SubdirFileList , NULL , NULL ) ) > = 0 ) // No error
{
if ( NumFilesInSubdir < = 2 )
ExpandTree = Brw_EXPAND_TREE_NOTHING ;
else
/***** Check if the tree starting at this subdirectory must be expanded *****/
ExpandTree = Brw_GetIfExpandedTree ( Gbl . FileBrowser . Priv . FullPathInTree ) ? Brw_EXPAND_TREE_MINUS :
Brw_EXPAND_TREE_PLUS ;
for ( NumFileInSubdir = 0 ;
NumFileInSubdir < NumFilesInSubdir ;
NumFileInSubdir + + )
free ( ( void * ) SubdirFileList [ NumFileInSubdir ] ) ;
free ( ( void * ) SubdirFileList ) ;
}
else
Lay_ShowErrorAndExit ( " Error while scanning directory. " ) ;
}
2014-12-01 23:55:08 +01:00
2015-12-21 13:36:39 +01:00
/***** Write a row for the subdirectory *****/
if ( Brw_WriteRowFileBrowser ( Level , Brw_IS_FOLDER , ExpandTree , PathInTree , FileList [ NumFile ] - > d_name ) )
if ( ExpandTree = = Brw_EXPAND_TREE_MINUS | |
ExpandTree = = Brw_EXPAND_TREE_NOTHING )
if ( Level < Brw_MAX_DIR_LEVELS )
/* List subtree starting at this this directory */
Brw_ListDir ( Level + 1 , PathFileRel , PathFileInExplTree ) ;
}
else if ( S_ISREG ( FileStatus . st_mode ) ) // It's a regular file
Brw_WriteRowFileBrowser ( Level ,
Str_FileIs ( FileList [ NumFile ] - > d_name , " url " ) ? Brw_IS_LINK :
Brw_IS_FILE ,
Brw_EXPAND_TREE_NOTHING , PathInTree , FileList [ NumFile ] - > d_name ) ;
2014-12-01 23:55:08 +01:00
}
2015-12-21 13:36:39 +01:00
free ( ( void * ) FileList [ NumFile ] ) ;
2014-12-01 23:55:08 +01:00
}
2015-12-21 13:36:39 +01:00
free ( ( void * ) FileList ) ;
}
else
Lay_ShowErrorAndExit ( " Error while scanning directory. " ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/*********************** Write a row of a file browser ***********************/
/*****************************************************************************/
// If it is the first row (root folder), always show it
// If it is not the first row, it is shown or not depending on whether it is hidden or not
// If the row is visible, return true. If it is hidden, return false
static bool Brw_WriteRowFileBrowser ( unsigned Level ,
Brw_FileType_t FileType , Brw_ExpandTree_t ExpandTree ,
const char * PathInTree , const char * FileName )
{
bool RowSetAsHidden = false ;
bool RowSetAsPublic = false ;
bool LightStyle = false ;
bool IsRecent = false ;
struct FileMetadata FileMetadata ;
char FileNameToShow [ NAME_MAX + 1 ] ;
2015-01-26 12:39:48 +01:00
bool SeeDocsZone = Gbl . FileBrowser . Type = = Brw_SHOW_DOCUM_INS | |
Gbl . FileBrowser . Type = = Brw_SHOW_DOCUM_CTR | |
Gbl . FileBrowser . Type = = Brw_SHOW_DOCUM_DEG | |
Gbl . FileBrowser . Type = = Brw_SHOW_DOCUM_CRS | |
Gbl . FileBrowser . Type = = Brw_SHOW_DOCUM_GRP ;
bool AdminDocsZone = Gbl . FileBrowser . Type = = Brw_ADMI_DOCUM_INS | |
Gbl . FileBrowser . Type = = Brw_ADMI_DOCUM_CTR | |
Gbl . FileBrowser . Type = = Brw_ADMI_DOCUM_DEG | |
Gbl . FileBrowser . Type = = Brw_ADMI_DOCUM_CRS | |
Gbl . FileBrowser . Type = = Brw_ADMI_DOCUM_GRP ;
2016-04-22 09:47:25 +02:00
bool SharedZone = Gbl . FileBrowser . Type = = Brw_ADMI_SHARE_INS | |
2015-02-05 22:59:48 +01:00
Gbl . FileBrowser . Type = = Brw_ADMI_SHARE_CTR | |
Gbl . FileBrowser . Type = = Brw_ADMI_SHARE_DEG | |
Gbl . FileBrowser . Type = = Brw_ADMI_SHARE_CRS | |
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Type = = Brw_ADMI_SHARE_GRP ;
bool AssignmentsZone = Gbl . FileBrowser . Type = = Brw_ADMI_ASSIG_USR | |
Gbl . FileBrowser . Type = = Brw_ADMI_ASSIG_CRS ;
bool SeeMarks = Gbl . FileBrowser . Type = = Brw_SHOW_MARKS_CRS | |
Gbl . FileBrowser . Type = = Brw_SHOW_MARKS_GRP ;
bool AdminMarks = Gbl . FileBrowser . Type = = Brw_ADMI_MARKS_CRS | |
Gbl . FileBrowser . Type = = Brw_ADMI_MARKS_GRP ;
2014-12-01 23:55:08 +01:00
Gbl . FileBrowser . Clipboard . IsThisFile = false ;
/***** Is this row hidden or visible? *****/
if ( SeeDocsZone | | AdminDocsZone | |
SeeMarks | | AdminMarks )
{
RowSetAsHidden = Brw_CheckIfFileOrFolderIsSetAsHiddenInDB ( FileType ,
Gbl . FileBrowser . Priv . FullPathInTree ) ;
if ( RowSetAsHidden & & Level & & ( SeeDocsZone | | SeeMarks ) )
return false ;
if ( AdminDocsZone | | AdminMarks )
{
if ( RowSetAsHidden ) // this row is marked as hidden
{
if ( FileType = = Brw_IS_FOLDER )
Gbl . FileBrowser . HiddenLevels [ Level ] = true ;
LightStyle = true ;
}
else // this row is not marked as hidden
{
if ( FileType = = Brw_IS_FOLDER )
Gbl . FileBrowser . HiddenLevels [ Level ] = false ;
LightStyle = Brw_CheckIfAnyUpperLevelIsHidden ( Level ) ;
}
}
}
/***** Get file metadata *****/
Brw_GetFileMetadataByPath ( & FileMetadata ) ;
2015-02-23 23:45:32 +01:00
Brw_GetFileTypeSizeAndDate ( & FileMetadata ) ;
2014-12-01 23:55:08 +01:00
if ( FileMetadata . FilCod < = 0 ) // No entry for this file in database table of files
/* Add entry to the table of files/folders */
FileMetadata . FilCod = Brw_AddPathToDB ( - 1L , FileMetadata . FileType ,
Gbl . FileBrowser . Priv . FullPathInTree , false , Brw_LICENSE_DEFAULT ) ;
/***** Is this row public or private? *****/
2016-04-22 09:47:25 +02:00
if ( SeeDocsZone | | AdminDocsZone | | SharedZone )
2014-12-01 23:55:08 +01:00
{
RowSetAsPublic = ( FileType = = Brw_IS_FOLDER ) ? Brw_GetIfFolderHasPublicFiles ( Gbl . FileBrowser . Priv . FullPathInTree ) :
FileMetadata . IsPublic ;
if ( Gbl . FileBrowser . ShowOnlyPublicFiles & & ! RowSetAsPublic )
return false ;
}
/***** Check if is a recent file or folder *****/
// If less than a week since last modify ==> indicate the file is recent by writting its name in green
2015-10-27 19:00:21 +01:00
if ( Gbl . StartExecutionTimeUTC < FileMetadata . Time + ( 7L * 24L * 60L * 60L ) )
2014-12-01 23:55:08 +01:00
IsRecent = true ;
/* Style of the text in this row */
Gbl . FileBrowser . TxtStyle = ( LightStyle ? ( FileType = = Brw_IS_FOLDER | | ! IsRecent ? " LST_HID " :
" LST_REC_HID " ) :
( FileType = = Brw_IS_FOLDER | | ! IsRecent ? " LST " :
" LST_REC " ) ) ;
Gbl . FileBrowser . InputStyle = ( LightStyle ? ( FileType = = Brw_IS_FOLDER | | ! IsRecent ? " LST_EDIT_HID " :
" LST_EDIT_REC_HID " ) :
( FileType = = Brw_IS_FOLDER | | ! IsRecent ? " LST_EDIT " :
" LST_EDIT_REC " ) ) ;
/***** Get data of assignment using the name of the folder *****/
if ( AssignmentsZone & & Level = = 1 )
{
strncpy ( Gbl . FileBrowser . Asg . Folder , FileName , Asg_MAX_LENGTH_FOLDER ) ;
Gbl . FileBrowser . Asg . Folder [ Asg_MAX_LENGTH_FOLDER ] = ' \0 ' ;
Asg_GetDataOfAssignmentByFolder ( & Gbl . FileBrowser . Asg ) ;
// The data of this assignment remains in Gbl.FileBrowser.Asg
// for all subsequent rows with Level > 1 (files or folders inside this folder),
// and they are overwritten on the next row with level == 1 (next assignment)
}
/***** Get the name of the file to show *****/
Brw_GetFileNameToShow ( Gbl . FileBrowser . Type , Level , FileType ,
FileName , FileNameToShow ) ;
/***** Start this row *****/
fprintf ( Gbl . F . Out , " <tr> " ) ;
/****** If current action allows file administration... ******/
Gbl . FileBrowser . ICanRemoveFileOrFolder =
Gbl . FileBrowser . ICanEditFileOrFolder = false ;
if ( Brw_FileBrowserIsEditable [ Gbl . FileBrowser . Type ] & &
! Gbl . FileBrowser . ShowOnlyPublicFiles )
{
if ( Gbl . FileBrowser . Clipboard . IsThisTree )
// If path in the clipboard is equal to complete path in tree...
// ...or is the start of complete path in tree...
if ( Str_Path1BeginsByPath2 ( Gbl . FileBrowser . Priv . FullPathInTree , Gbl . FileBrowser . Clipboard . Path ) )
Gbl . FileBrowser . Clipboard . IsThisFile = true ;
/* Check if I can modify (remove, rename, etc.) this file or folder */
Gbl . FileBrowser . ICanEditFileOrFolder = Brw_CheckIfICanEditFileOrFolder ( Level ) ;
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . ICanRemoveFileOrFolder = ( Gbl . FileBrowser . Type = = Brw_ADMI_BRIEF_USR & &
2014-12-01 23:55:08 +01:00
Level ! = 0 ) ? true :
Gbl . FileBrowser . ICanEditFileOrFolder ;
/* Put icons to remove, copy and paste */
Brw_PutIconsRemoveCopyPaste ( Level , FileType , PathInTree , FileName , FileNameToShow ) ;
}
/***** Indentation depending on level, icon, and file/folder name *****/
/* Start of the column */
2015-09-03 00:59:03 +02:00
fprintf ( Gbl . F . Out , " <td class= \" NO_BR LEFT_TOP COLOR%u \" "
" style= \" width:99%%; \" > "
2014-12-21 19:43:39 +01:00
" <table> "
" <tr> " ,
2015-09-03 00:59:03 +02:00
Gbl . RowEvenOdd ) ;
2014-12-01 23:55:08 +01:00
/* Indent depending on level */
if ( Level )
Brw_IndentAndWriteIconExpandContract ( Level , ExpandTree ,
PathInTree , FileName , FileNameToShow ) ;
/* Put icon to show/hide file or folder */
if ( AdminDocsZone | | AdminMarks )
{
if ( RowSetAsHidden ) // this row is marked as hidden
Brw_PutIconShow ( Level , FileType ,
PathInTree , FileName , FileNameToShow ) ;
else // this row is not marked as hidden
Brw_PutIconHide ( Level , FileType ,
PathInTree , FileName , FileNameToShow ) ;
}
/***** File or folder icon *****/
if ( FileType = = Brw_IS_FOLDER )
/* Icon with folder */
Brw_PutIconFolder ( Level , ExpandTree ,
PathInTree , FileName , FileNameToShow ) ;
2015-10-05 00:22:16 +02:00
else // File or link
2014-12-01 23:55:08 +01:00
{
/* Icon with file type or link */
2015-09-03 00:59:03 +02:00
fprintf ( Gbl . F . Out , " <td class= \" BM%u \" > " , Gbl . RowEvenOdd ) ;
2016-01-03 15:36:46 +01:00
Brw_PutIconFileWithLinkToViewMetadata ( 16 , & FileMetadata , FileNameToShow ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " </td> " ) ;
}
/* Check if is a new file or folder */
// If our last access was before the last modify ==> indicate the file is new by putting a blinking star
if ( Gbl . Usrs . Me . TimeLastAccToThisFileBrowser < FileMetadata . Time )
Brw_PutIconNewFileOrFolder ( ) ;
/* File or folder name */
Brw_WriteFileName ( Level , FileMetadata . IsPublic , FileType ,
PathInTree , FileName , FileNameToShow ) ;
/* End of the column */
fprintf ( Gbl . F . Out , " </tr> "
" </table> "
" </td> " ) ;
2015-10-05 00:22:16 +02:00
if ( AdminMarks )
/***** Header and footer rows *****/
Mrk_GetAndWriteNumRowsHeaderAndFooter ( FileType , PathInTree , FileName ) ;
2014-12-01 23:55:08 +01:00
if ( AssignmentsZone & & Level = = 1 )
/***** Start and end dates of assignment *****/
Brw_WriteDatesAssignment ( ) ;
else
/***** File date and size *****/
Brw_WriteFileSizeAndDate ( FileType , & FileMetadata ) ;
2015-10-05 00:22:16 +02:00
if ( FileType = = Brw_IS_FOLDER )
{
/***** Put icon to download ZIP of folder *****/
fprintf ( Gbl . F . Out , " <td class= \" BM%u \" > " , Gbl . RowEvenOdd ) ;
if ( Gbl . Usrs . Me . LoggedRole > = Rol_STUDENT & & // Only ZIP folders if I am student, teacher...
! SeeMarks & & // Do not ZIP folders when seeing marks
! ( SeeDocsZone & & RowSetAsHidden ) ) // When seeing docs, if folder is not hidden (this could happen for Level == 0)
ZIP_PutButtonToDownloadZIPOfAFolder ( PathInTree , FileName ) ;
fprintf ( Gbl . F . Out , " </td> " ) ;
2014-12-01 23:55:08 +01:00
}
2015-10-05 00:22:16 +02:00
else // File or link
/***** User who created the file or folder *****/
Brw_WriteFileOrFolderPublisher ( Level , FileMetadata . PublisherUsrCod ) ;
2014-12-01 23:55:08 +01:00
/***** End this row *****/
fprintf ( Gbl . F . Out , " </tr> " ) ;
Gbl . RowEvenOdd = 1 - Gbl . RowEvenOdd ;
if ( RowSetAsHidden & & ( SeeDocsZone | | SeeMarks ) )
return false ;
return true ;
}
/*****************************************************************************/
/*************** Construct full path in tree of file browser *****************/
/*****************************************************************************/
// If, for example, PathInTreeUntilFileOrFolder is "descarga/teoria" and FilFolLnkName is "tema1.pdf"
// then Gbl.FileBrowser.Priv.FullPathInTree will be "descarga/teoria/tema1.pdf"
// If FilFolLnkName is ".", then Gbl.FileBrowser.Priv.FullPathInTree will be equal to PathInTreeUntilFileOrFolder
void Brw_SetFullPathInTree ( const char * PathInTreeUntilFileOrFolder , const char * FilFolLnkName )
{
if ( ! PathInTreeUntilFileOrFolder [ 0 ] )
Gbl . FileBrowser . Priv . FullPathInTree [ 0 ] = ' \0 ' ;
else if ( strcmp ( FilFolLnkName , " . " ) )
sprintf ( Gbl . FileBrowser . Priv . FullPathInTree , " %s/%s " ,
PathInTreeUntilFileOrFolder , FilFolLnkName ) ;
else // It's the root folder
strcpy ( Gbl . FileBrowser . Priv . FullPathInTree ,
PathInTreeUntilFileOrFolder ) ;
}
/*****************************************************************************/
/****************** Put icons to remove, copy and paste **********************/
/*****************************************************************************/
static void Brw_PutIconsRemoveCopyPaste ( unsigned Level , Brw_FileType_t FileType ,
const char * PathInTree , const char * FileName , const char * FileNameToShow )
{
/***** Icon to remove folder, file or link *****/
if ( FileType = = Brw_IS_FOLDER )
/* Icon to remove a folder */
2015-07-24 11:34:39 +02:00
Brw_PutIconRemoveDir ( PathInTree , FileName , FileNameToShow ) ;
2014-12-01 23:55:08 +01:00
else // File or link
/* Icon to remove a file or link */
2015-07-24 11:34:39 +02:00
Brw_PutIconRemoveFile ( FileType , PathInTree , FileName , FileNameToShow ) ;
2014-12-01 23:55:08 +01:00
/***** Icon to copy *****/
Brw_PutIconCopy ( FileType , PathInTree , FileName , FileNameToShow ) ;
/***** Icon to paste *****/
if ( FileType = = Brw_IS_FOLDER )
{
if ( Brw_CheckIfCanPasteIn ( Level ) )
/* Icon to paste active */
Brw_PutIconPasteOn ( PathInTree , FileName , FileNameToShow ) ;
else
/* Icon to paste inactive */
Brw_PutIconPasteOff ( ) ;
}
2014-12-22 21:52:37 +01:00
else // File or link. Can't paste in a file or link.
2015-09-03 00:59:03 +02:00
fprintf ( Gbl . F . Out , " <td class= \" BM%u \" ></td> " , Gbl . RowEvenOdd ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/******* Check if the clipboard can be pasted into the current folder ********/
/*****************************************************************************/
// Return true if Gbl.FileBrowser.Clipboard.Path can be pasted into Gbl.FileBrowser.Priv.FullPathInTree
static bool Brw_CheckIfCanPasteIn ( unsigned Level )
{
char PathDstWithFile [ PATH_MAX + 1 ] ;
/* If there is nothing in clipboard... */
2015-01-26 12:39:48 +01:00
if ( Gbl . FileBrowser . Clipboard . FileBrowser = = Brw_UNKNOWN )
2014-12-01 23:55:08 +01:00
return false ;
/* Do not paste a link in marks... */
if ( Gbl . FileBrowser . Clipboard . FileType = = Brw_IS_LINK & &
2015-01-26 12:39:48 +01:00
( Gbl . FileBrowser . Type = = Brw_ADMI_MARKS_CRS | |
Gbl . FileBrowser . Type = = Brw_ADMI_MARKS_GRP ) )
2014-12-01 23:55:08 +01:00
return false ;
if ( ! Brw_CheckIfICanCreateIntoFolder ( Level ) )
return false ; // Pasting into top level of assignments is forbidden
if ( Gbl . FileBrowser . Clipboard . IsThisTree ) // We are in the same tree of the clipboard ==> we can paste or not depending on the subtree
{
/***** Construct the name of the file or folder destination *****/
sprintf ( PathDstWithFile , " %s/%s " , Gbl . FileBrowser . Priv . FullPathInTree , Gbl . FileBrowser . Clipboard . FileName ) ;
return ! Str_Path1BeginsByPath2 ( PathDstWithFile , Gbl . FileBrowser . Clipboard . Path ) ;
}
return true ; // I can paste
}
/*****************************************************************************/
/******************* Write link e icon to remove a file **********************/
/*****************************************************************************/
// FileType can be Brw_IS_FILE or Brw_IS_LINK
static void Brw_PutIconRemoveFile ( Brw_FileType_t FileType ,
2015-07-24 11:34:39 +02:00
const char * PathInTree , const char * FileName , const char * FileNameToShow )
2014-12-01 23:55:08 +01:00
{
2015-07-24 11:34:39 +02:00
extern const char * Txt_Remove_FILE_OR_LINK_X ;
2015-09-03 00:59:03 +02:00
fprintf ( Gbl . F . Out , " <td class= \" BM%u \" > " , Gbl . RowEvenOdd ) ;
2014-12-01 23:55:08 +01:00
if ( Gbl . FileBrowser . ICanRemoveFileOrFolder ) // Can I remove this file?
{
/***** Form to remove a file *****/
Act_FormStart ( Brw_ActAskRemoveFile [ Gbl . FileBrowser . Type ] ) ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActAskRemoveFile [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
Brw_ParamListFiles ( FileType , PathInTree , FileName ) ;
2015-07-24 11:34:39 +02:00
sprintf ( Gbl . Title , Txt_Remove_FILE_OR_LINK_X , FileNameToShow ) ;
2015-12-08 22:20:44 +01:00
fprintf ( Gbl . F . Out , " <input type= \" image \" src= \" %s/remove-on64x64.png \" "
2015-07-24 11:34:39 +02:00
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x20B \" /> " ,
2015-07-24 11:34:39 +02:00
Gbl . Prefs . IconsURL ,
Gbl . Title ,
Gbl . Title ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
}
else
2015-07-27 21:25:45 +02:00
Lay_PutIconBRemovalNotAllowed ( ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " </td> " ) ;
}
/*****************************************************************************/
/****************** Write link and icon to remove a folder *******************/
/*****************************************************************************/
2015-07-24 11:34:39 +02:00
static void Brw_PutIconRemoveDir ( const char * PathInTree , const char * FileName , const char * FileNameToShow )
2014-12-01 23:55:08 +01:00
{
2015-07-24 11:34:39 +02:00
extern const char * Txt_Remove_folder_X ;
2015-09-03 00:59:03 +02:00
fprintf ( Gbl . F . Out , " <td class= \" BM%u \" > " , Gbl . RowEvenOdd ) ;
2014-12-01 23:55:08 +01:00
if ( Gbl . FileBrowser . ICanRemoveFileOrFolder ) // Can I remove this folder?
{
/***** Form to remove a folder *****/
Act_FormStart ( Brw_ActRemoveFolder [ Gbl . FileBrowser . Type ] ) ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActRemoveFolder [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
Brw_ParamListFiles ( Brw_IS_FOLDER , PathInTree , FileName ) ;
2015-07-24 11:34:39 +02:00
sprintf ( Gbl . Title , Txt_Remove_folder_X , FileNameToShow ) ;
2015-12-08 22:20:44 +01:00
fprintf ( Gbl . F . Out , " <input type= \" image \" src= \" %s/remove-on64x64.png \" "
2015-07-24 11:34:39 +02:00
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x20B \" /> " ,
2015-07-24 11:34:39 +02:00
Gbl . Prefs . IconsURL ,
Gbl . Title ,
Gbl . Title ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
}
else
2015-07-27 21:25:45 +02:00
Lay_PutIconBRemovalNotAllowed ( ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " </td> " ) ;
}
/*****************************************************************************/
/************** Write link e icon to copy a file o a folder ******************/
/*****************************************************************************/
static void Brw_PutIconCopy ( Brw_FileType_t FileType ,
const char * PathInTree , const char * FileName , const char * FileNameToShow )
{
extern const char * Txt_Copy_FOLDER_FILE_OR_LINK_X ;
2015-07-21 20:07:46 +02:00
extern const char * Txt_Copy_not_allowed ;
2014-12-01 23:55:08 +01:00
2015-09-03 00:59:03 +02:00
fprintf ( Gbl . F . Out , " <td class= \" BM%u \" > " , Gbl . RowEvenOdd ) ;
2014-12-01 23:55:08 +01:00
if ( Gbl . FileBrowser . ICanEditFileOrFolder )
{
/***** Form to copy into the clipboard *****/
Act_FormStart ( Brw_ActCopy [ Gbl . FileBrowser . Type ] ) ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActCopy [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
Brw_ParamListFiles ( FileType , PathInTree , FileName ) ;
sprintf ( Gbl . Title , Txt_Copy_FOLDER_FILE_OR_LINK_X , FileNameToShow ) ;
fprintf ( Gbl . F . Out , " <input type= \" image \" src= \" %s/copy_on16x16.gif \" "
2015-09-05 12:04:30 +02:00
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x20B \" /> " ,
2014-12-01 23:55:08 +01:00
Gbl . Prefs . IconsURL ,
Gbl . Title ,
Gbl . Title ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
}
else
2015-07-21 20:07:46 +02:00
fprintf ( Gbl . F . Out , " <img src= \" %s/copy_off16x16.gif \" "
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x20B \" /> " ,
2015-07-21 20:07:46 +02:00
Gbl . Prefs . IconsURL ,
Txt_Copy_not_allowed ,
Txt_Copy_not_allowed ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " </td> " ) ;
}
/*****************************************************************************/
/************** Write link e icon to paste a file or a folder ****************/
/*****************************************************************************/
static void Brw_PutIconPasteOn ( const char * PathInTree , const char * FileName , const char * FileNameToShow )
{
extern const char * Txt_Paste_in_X ;
2015-09-03 00:59:03 +02:00
fprintf ( Gbl . F . Out , " <td class= \" BM%u \" > " , Gbl . RowEvenOdd ) ;
2014-12-01 23:55:08 +01:00
/***** Form to paste the content of the clipboard *****/
Act_FormStart ( Brw_ActPaste [ Gbl . FileBrowser . Type ] ) ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActPaste [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
Brw_ParamListFiles ( Brw_IS_FOLDER , PathInTree , FileName ) ;
sprintf ( Gbl . Title , Txt_Paste_in_X , FileNameToShow ) ;
fprintf ( Gbl . F . Out , " <input type= \" image \" src= \" %s/paste_on16x16.gif \" "
2015-09-05 12:04:30 +02:00
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x20B \" /> " ,
2014-12-01 23:55:08 +01:00
Gbl . Prefs . IconsURL ,
Gbl . Title ,
Gbl . Title ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
fprintf ( Gbl . F . Out , " </td> " ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/**************** Write link e icon to paste a file o a folder ***************/
/*****************************************************************************/
static void Brw_PutIconPasteOff ( void )
{
2015-07-21 20:07:46 +02:00
extern const char * Txt_Copy_not_allowed ;
2015-09-03 00:59:03 +02:00
fprintf ( Gbl . F . Out , " <td class= \" BM%u \" > "
2014-12-01 23:55:08 +01:00
" <img src= \" %s/paste_off16x16.gif \" "
2015-09-05 12:04:30 +02:00
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x20B \" /> "
2014-12-01 23:55:08 +01:00
" </td> " ,
2015-07-21 20:07:46 +02:00
Gbl . RowEvenOdd , Gbl . Prefs . IconsURL ,
Txt_Copy_not_allowed ,
Txt_Copy_not_allowed ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/*************** Indent and write icon to expand/contract folder *************/
/*****************************************************************************/
static void Brw_IndentAndWriteIconExpandContract ( unsigned Level , Brw_ExpandTree_t ExpandTree ,
const char * PathInTree , const char * FileName , const char * FileNameToShow )
{
2016-04-07 14:40:50 +02:00
extern const char * Txt_Expand ;
extern const char * Txt_Contract ;
2015-10-03 00:38:01 +02:00
char Anchor [ 32 ] ;
2014-12-01 23:55:08 +01:00
2015-08-01 10:43:33 +02:00
fprintf ( Gbl . F . Out , " <td class= \" LEFT_MIDDLE \" > "
2014-12-21 19:43:39 +01:00
" <table> "
2014-12-01 23:55:08 +01:00
" <tr> " ) ;
Brw_IndentDependingOnLevel ( Level ) ;
2015-09-03 00:59:03 +02:00
fprintf ( Gbl . F . Out , " <td class= \" BM%u \" > " , Gbl . RowEvenOdd ) ;
2014-12-01 23:55:08 +01:00
switch ( ExpandTree )
{
case Brw_EXPAND_TREE_NOTHING :
2015-07-21 20:07:46 +02:00
fprintf ( Gbl . F . Out , " <img src= \" %s/tr16x16.gif \" "
" alt= \" \" title= \" \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x20B \" /> " ,
2014-12-01 23:55:08 +01:00
Gbl . Prefs . IconsURL ) ;
break ;
case Brw_EXPAND_TREE_PLUS :
/***** Form to expand folder *****/
2015-10-03 00:38:01 +02:00
sprintf ( Anchor , " file_browser_%u " , Gbl . FileBrowser . Id ) ;
Act_FormStartAnchor ( Brw_ActExpandFolder [ Gbl . FileBrowser . Type ] , Anchor ) ;
2014-12-01 23:55:08 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_GRP :
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_SHOW_MARKS_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActExpandFolder [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
Brw_ParamListFiles ( Brw_IS_FOLDER , PathInTree , FileName ) ;
2016-04-07 14:40:50 +02:00
sprintf ( Gbl . Title , " %s %s " , Txt_Expand , FileNameToShow ) ;
fprintf ( Gbl . F . Out , " <input type= \" image \" src= \" %s/expand64x64.png \" "
2015-09-05 12:04:30 +02:00
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x20B \" /> " ,
2014-12-01 23:55:08 +01:00
Gbl . Prefs . IconsURL ,
Gbl . Title ,
Gbl . Title ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
2015-10-02 14:30:04 +02:00
fprintf ( Gbl . F . Out , " </section> " ) ;
2014-12-01 23:55:08 +01:00
break ;
case Brw_EXPAND_TREE_MINUS :
/***** Form to contract folder *****/
2015-10-03 00:38:01 +02:00
sprintf ( Anchor , " file_browser_%u " , Gbl . FileBrowser . Id ) ;
Act_FormStartAnchor ( Brw_ActContractFolder [ Gbl . FileBrowser . Type ] , Anchor ) ;
2014-12-01 23:55:08 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_GRP :
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_SHOW_MARKS_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActContractFolder [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
Brw_ParamListFiles ( Brw_IS_FOLDER , PathInTree , FileName ) ;
2016-04-07 14:40:50 +02:00
sprintf ( Gbl . Title , " %s %s " , Txt_Contract , FileNameToShow ) ;
fprintf ( Gbl . F . Out , " <input type= \" image \" src= \" %s/contract64x64.png \" "
2015-09-05 12:04:30 +02:00
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x20B \" /> " ,
2014-12-01 23:55:08 +01:00
Gbl . Prefs . IconsURL ,
Gbl . Title ,
Gbl . Title ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
2015-10-02 14:30:04 +02:00
fprintf ( Gbl . F . Out , " </section> " ) ;
2014-12-01 23:55:08 +01:00
break ;
}
fprintf ( Gbl . F . Out , " </td> "
" </tr> "
" </table> "
" </td> " ) ;
}
/*****************************************************************************/
/************************* Indent depending on level *************************/
/*****************************************************************************/
static void Brw_IndentDependingOnLevel ( unsigned Level )
{
unsigned i ;
for ( i = 1 ;
i < Level ;
i + + )
2015-09-28 18:28:29 +02:00
fprintf ( Gbl . F . Out , " <td style= \" width:20px; \" > "
2015-07-21 20:07:46 +02:00
" <img src= \" %s/tr16x16.gif \" "
" alt= \" \" title= \" \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x20B \" /> "
2014-12-01 23:55:08 +01:00
" </td> " ,
Gbl . Prefs . IconsURL ) ;
}
/*****************************************************************************/
/****************** Put link and icon to show file or folder *****************/
/*****************************************************************************/
static void Brw_PutIconShow ( unsigned Level , Brw_FileType_t FileType ,
const char * PathInTree , const char * FileName , const char * FileNameToShow )
{
extern const char * Txt_Show_FOLDER_FILE_OR_LINK_X ;
2015-09-03 00:59:03 +02:00
fprintf ( Gbl . F . Out , " <td class= \" BM%u \" > " , Gbl . RowEvenOdd ) ;
2015-01-20 00:32:15 +01:00
Act_FormStart ( Brw_ActShow [ Gbl . FileBrowser . Type ] ) ;
2014-12-01 23:55:08 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
default :
break ;
}
Brw_ParamListFiles ( FileType , PathInTree , FileName ) ;
sprintf ( Gbl . Title , Txt_Show_FOLDER_FILE_OR_LINK_X , FileNameToShow ) ;
2015-12-08 22:20:44 +01:00
fprintf ( Gbl . F . Out , " <input type= \" image \" src= \" %s/eye-slash-%s64x64.png \" "
2015-09-05 12:04:30 +02:00
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x20B \" /> " ,
2014-12-01 23:55:08 +01:00
Gbl . Prefs . IconsURL ,
Brw_CheckIfAnyUpperLevelIsHidden ( Level ) ? " off " :
" on " ,
Gbl . Title ,
Gbl . Title ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
fprintf ( Gbl . F . Out , " </td> " ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/****************** Put link and icon to hide file or folder *****************/
/*****************************************************************************/
static void Brw_PutIconHide ( unsigned Level , Brw_FileType_t FileType ,
const char * PathInTree , const char * FileName , const char * FileNameToShow )
{
extern const char * Txt_Hide_FOLDER_FILE_OR_LINK_X ;
2015-09-03 00:59:03 +02:00
fprintf ( Gbl . F . Out , " <td class= \" BM%u \" > " , Gbl . RowEvenOdd ) ;
2015-01-20 00:32:15 +01:00
Act_FormStart ( Brw_ActHide [ Gbl . FileBrowser . Type ] ) ;
2014-12-01 23:55:08 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
default :
break ;
}
Brw_ParamListFiles ( FileType , PathInTree , FileName ) ;
sprintf ( Gbl . Title , Txt_Hide_FOLDER_FILE_OR_LINK_X , FileNameToShow ) ;
2015-12-08 22:20:44 +01:00
fprintf ( Gbl . F . Out , " <input type= \" image \" src= \" %s/eye-%s64x64.png \" "
2015-09-05 12:04:30 +02:00
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x20B \" /> " ,
2014-12-01 23:55:08 +01:00
Gbl . Prefs . IconsURL ,
Brw_CheckIfAnyUpperLevelIsHidden ( Level ) ? " off " :
" on " ,
Gbl . Title ,
Gbl . Title ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
fprintf ( Gbl . F . Out , " </td> " ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/**** Check if any level of folders superior to the current one is hidden ****/
/*****************************************************************************/
static bool Brw_CheckIfAnyUpperLevelIsHidden ( unsigned CurrentLevel )
{
unsigned N ;
for ( N = 0 ;
N < CurrentLevel ;
N + + )
if ( Gbl . FileBrowser . HiddenLevels [ N ] )
return true ;
return false ;
}
/*****************************************************************************/
/** Write link e icon to upload or paste files, or to create folder or link **/
/*****************************************************************************/
static void Brw_PutIconFolder ( unsigned Level , Brw_ExpandTree_t ExpandTree ,
const char * PathInTree , const char * FileName , const char * FileNameToShow )
{
extern const char * Txt_Upload_file_or_create_folder_in_FOLDER ;
2015-07-21 20:07:46 +02:00
extern const char * Txt_Folder ;
2014-12-01 23:55:08 +01:00
bool ICanCreate ;
/***** Start cell *****/
2015-09-24 18:02:21 +02:00
fprintf ( Gbl . F . Out , " <td class= \" LEFT_MIDDLE \" style= \" width:%upx; \" > " ,
2015-09-28 18:28:29 +02:00
Level * 20 ) ;
2014-12-01 23:55:08 +01:00
/***** Put icon *****/
if ( ( ICanCreate = Brw_CheckIfICanCreateIntoFolder ( Level ) ) ) // I can create a new file or folder
{
/***** Form to create a new file or folder *****/
Act_FormStart ( Brw_ActFormCreate [ Gbl . FileBrowser . Type ] ) ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActFormCreate [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
Brw_ParamListFiles ( Brw_IS_FOLDER , PathInTree , FileName ) ;
sprintf ( Gbl . Title , Txt_Upload_file_or_create_folder_in_FOLDER , FileNameToShow ) ;
2015-01-04 01:51:07 +01:00
fprintf ( Gbl . F . Out , " <input type= \" image \" "
2015-09-05 12:04:30 +02:00
" src= \" %s/folder-%s-plus16x16.gif \" "
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x20B \" /> " ,
2014-12-01 23:55:08 +01:00
Gbl . Prefs . IconsURL ,
( ExpandTree = = Brw_EXPAND_TREE_PLUS ) ? " closed " :
" open " ,
Gbl . Title ,
Gbl . Title ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
}
else // I can't create a new file or folder
2015-07-21 20:07:46 +02:00
fprintf ( Gbl . F . Out , " <img src= \" %s/folder-%s16x16.gif \" "
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x20B \" /> " ,
2014-12-01 23:55:08 +01:00
Gbl . Prefs . IconsURL ,
( ExpandTree = = Brw_EXPAND_TREE_PLUS ) ? " closed " :
2015-07-21 20:07:46 +02:00
" open " ,
Txt_Folder ,
Txt_Folder ) ;
2014-12-01 23:55:08 +01:00
/***** End cell *****/
fprintf ( Gbl . F . Out , " </td> " ) ;
}
/*****************************************************************************/
/**************** Write icon to indicate that the file is new ****************/
/*****************************************************************************/
static void Brw_PutIconNewFileOrFolder ( void )
{
extern const char * Txt_New_FILE_OR_FOLDER ;
/***** Icon that indicates new file *****/
2015-09-03 00:59:03 +02:00
fprintf ( Gbl . F . Out , " <td class= \" BM%u \" > "
2014-12-01 23:55:08 +01:00
" <img src= \" %s/star16x16.gif \" "
2015-09-05 12:04:30 +02:00
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x20B \" /> "
2014-12-01 23:55:08 +01:00
" </td> " ,
Gbl . RowEvenOdd , Gbl . Prefs . IconsURL ,
2015-07-21 20:07:46 +02:00
Txt_New_FILE_OR_FOLDER ,
Txt_New_FILE_OR_FOLDER ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/***************************** Put icon of a file ****************************/
/*****************************************************************************/
// FileType can be Brw_IS_FILE or Brw_IS_LINK
2016-01-03 15:36:46 +01:00
static void Brw_PutIconFileWithLinkToViewMetadata ( unsigned Size ,
struct FileMetadata * FileMetadata ,
const char * FileNameToShow )
2014-12-01 23:55:08 +01:00
{
extern const char * Txt_View_data_of_FILE_OR_LINK_X ;
2015-01-20 00:32:15 +01:00
Act_FormStart ( Brw_ActReqDatFile [ Gbl . FileBrowser . Type ] ) ;
2014-12-01 23:55:08 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_GRP :
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_SHOW_MARKS_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2015-01-20 00:32:15 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActReqDatFile [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
2016-01-03 15:36:46 +01:00
Brw_PutHiddenParamFilCod ( FileMetadata - > FilCod ) ;
2014-12-01 23:55:08 +01:00
/***** Name and link of the file or folder *****/
sprintf ( Gbl . Title , Txt_View_data_of_FILE_OR_LINK_X ,
FileNameToShow ) ;
/* Link to the form and to the file */
2015-10-31 02:11:38 +01:00
Act_LinkFormSubmit ( Gbl . Title , Gbl . FileBrowser . TxtStyle ) ;
2014-12-01 23:55:08 +01:00
/***** Icon depending on the file extension *****/
2016-01-03 15:36:46 +01:00
Brw_PutIconFile ( Size , FileMetadata - > FileType , FileMetadata - > FilFolLnkName ) ;
2014-12-01 23:55:08 +01:00
/* End of the link and of the form */
2015-03-13 00:16:02 +01:00
fprintf ( Gbl . F . Out , " </a> " ) ;
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/***************************** Put icon of a file ****************************/
/*****************************************************************************/
static void Brw_PutIconFile ( unsigned Size , Brw_FileType_t FileType , const char * FileName )
{
extern const char * Txt_Link ;
extern const char * Txt_X_file ;
unsigned DocType ;
bool NotFound ;
/***** Icon depending on the file extension *****/
fprintf ( Gbl . F . Out , " <img src= \" %s/%s%ux%u/ " ,
Gbl . Prefs . IconsURL , Cfg_ICON_FOLDER_FILEXT ,
Size , Size ) ;
if ( FileType = = Brw_IS_LINK )
2015-07-21 20:07:46 +02:00
fprintf ( Gbl . F . Out , " url%ux%u.gif \" alt= \" %s \" title= \" %s \" " ,
Size , Size ,
Txt_Link , Txt_Link ) ;
2014-12-01 23:55:08 +01:00
else // FileType == Brw_IS_FILE
{
for ( DocType = 0 , NotFound = true ;
DocType < Brw_NUM_FILE_EXT_ALLOWED & & NotFound ;
DocType + + )
if ( Str_FileIs ( FileName , Brw_FileExtensionsAllowed [ DocType ] ) )
{
fprintf ( Gbl . F . Out , " %s%ux%u.gif \" alt= \" " ,
Brw_FileExtensionsAllowed [ DocType ] ,
Size , Size ) ;
fprintf ( Gbl . F . Out , Txt_X_file , Brw_FileExtensionsAllowed [ DocType ] ) ;
fprintf ( Gbl . F . Out , " \" " ) ;
NotFound = false ;
}
if ( NotFound )
fprintf ( Gbl . F . Out , " xxx%ux%u.gif \" alt= \" \" " ,
Size , Size ) ;
}
2016-04-18 10:50:12 +02:00
fprintf ( Gbl . F . Out , ( Size = = 16 ) ? " class= \" ICON20x20 \" /> " :
2015-12-13 12:51:41 +01:00
" class= \" ICON40x40 \" /> " ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/********** Write central part with the name of a file or folder *************/
/*****************************************************************************/
static void Brw_WriteFileName ( unsigned Level , bool IsPublic , Brw_FileType_t FileType ,
const char * PathInTree , const char * FileName , const char * FileNameToShow )
{
extern const char * Txt_Check_marks_in_file_X ;
extern const char * Txt_Download_FILE_OR_LINK_X ;
extern const char * Txt_Public_open_educational_resource_OER_for_everyone ;
/***** Name and link of the folder, file or link *****/
if ( FileType = = Brw_IS_FOLDER )
{
/***** Start of cell *****/
2015-09-04 19:26:08 +02:00
fprintf ( Gbl . F . Out , " <td class= \" %s LEFT_MIDDLE " ,
2014-12-01 23:55:08 +01:00
Gbl . FileBrowser . TxtStyle ) ;
2014-12-22 21:52:37 +01:00
if ( Gbl . FileBrowser . Clipboard . IsThisFile )
2015-09-04 19:26:08 +02:00
fprintf ( Gbl . F . Out , " LIGHT_GREEN " ) ;
fprintf ( Gbl . F . Out , " \" style= \" width:99%%; \" > " ) ;
2014-12-01 23:55:08 +01:00
/***** Form to rename folder *****/
if ( Gbl . FileBrowser . ICanEditFileOrFolder ) // Can I rename this folder?
{
Act_FormStart ( Brw_ActRenameFolder [ Gbl . FileBrowser . Type ] ) ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActRenameFolder [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
Brw_ParamListFiles ( Brw_IS_FOLDER , PathInTree , FileName ) ;
}
/***** Write name of the folder *****/
fprintf ( Gbl . F . Out , " " ) ;
if ( Gbl . FileBrowser . ICanEditFileOrFolder ) // Can I rename this folder?
2015-03-13 00:16:02 +01:00
{
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " <input type= \" text \" name= \" NewFolderName \" "
2015-11-27 22:58:11 +01:00
" size= \" 30 \" maxlength= \" 40 \" value= \" %s \" "
2015-09-04 17:43:18 +02:00
" class= \" %s %s \" "
2015-10-22 14:49:48 +02:00
" onchange= \" document.getElementById('%s').submit(); \" /> " ,
2014-12-01 23:55:08 +01:00
FileName , Gbl . FileBrowser . InputStyle ,
2015-09-04 17:43:18 +02:00
Gbl . FileBrowser . Clipboard . IsThisFile ? " LIGHT_GREEN " :
2014-12-01 23:55:08 +01:00
Gbl . ColorRows [ Gbl . RowEvenOdd ] ,
2016-01-14 10:31:09 +01:00
Gbl . Form . Id ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
}
2014-12-01 23:55:08 +01:00
else
{
if ( ( Level = = 1 ) & &
2015-01-26 12:39:48 +01:00
( Gbl . FileBrowser . Type = = Brw_ADMI_ASSIG_USR | |
Gbl . FileBrowser . Type = = Brw_ADMI_ASSIG_CRS ) )
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " <span title= \" %s \" > " ,
Gbl . FileBrowser . Asg . Title ) ;
fprintf ( Gbl . F . Out , " <strong>%s</strong> " , FileNameToShow ) ;
if ( ( Level = = 1 ) & &
2015-01-26 12:39:48 +01:00
( Gbl . FileBrowser . Type = = Brw_ADMI_ASSIG_USR | |
Gbl . FileBrowser . Type = = Brw_ADMI_ASSIG_CRS ) )
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " </span> " ) ;
}
/***** End of cell *****/
fprintf ( Gbl . F . Out , " </td> " ) ;
}
else // File or link
{
2015-09-04 19:26:08 +02:00
fprintf ( Gbl . F . Out , " <td class= \" %s LEFT_MIDDLE " ,
2014-12-01 23:55:08 +01:00
Gbl . FileBrowser . TxtStyle ) ;
if ( Gbl . FileBrowser . Clipboard . IsThisFile )
2015-09-04 19:26:08 +02:00
fprintf ( Gbl . F . Out , " LIGHT_GREEN " ) ;
fprintf ( Gbl . F . Out , " \" style= \" width:99%%; \" > " ) ;
2014-12-01 23:55:08 +01:00
2015-01-20 00:32:15 +01:00
Act_FormStart ( Brw_ActDowFile [ Gbl . FileBrowser . Type ] ) ;
2014-12-01 23:55:08 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_GRP :
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_SHOW_MARKS_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2015-01-20 00:32:15 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActDowFile [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
Brw_ParamListFiles ( FileType , PathInTree , FileName ) ;
/* Link to the form and to the file */
2015-01-26 12:39:48 +01:00
sprintf ( Gbl . Title , ( Gbl . FileBrowser . Type = = Brw_SHOW_MARKS_CRS | |
Gbl . FileBrowser . Type = = Brw_SHOW_MARKS_GRP ) ? Txt_Check_marks_in_file_X :
2015-10-31 02:11:38 +01:00
Txt_Download_FILE_OR_LINK_X ,
2014-12-01 23:55:08 +01:00
FileNameToShow ) ;
2015-10-31 02:11:38 +01:00
Act_LinkFormSubmit ( Gbl . Title , Gbl . FileBrowser . TxtStyle ) ;
fprintf ( Gbl . F . Out , " %s</a> " ,
2014-12-01 23:55:08 +01:00
FileNameToShow ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
/* Put icon to make public/private file */
if ( IsPublic )
fprintf ( Gbl . F . Out , " <img src= \" %s/open_on16x16.gif \" "
2015-07-21 20:07:46 +02:00
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x20 \" /> " ,
2014-12-01 23:55:08 +01:00
Gbl . Prefs . IconsURL ,
Txt_Public_open_educational_resource_OER_for_everyone ,
Txt_Public_open_educational_resource_OER_for_everyone ) ;
fprintf ( Gbl . F . Out , " </td> " ) ;
}
}
/*****************************************************************************/
/*********************** Which filename must be shown? ***********************/
/*****************************************************************************/
static void Brw_GetFileNameToShow ( Brw_FileBrowser_t FileBrowser , unsigned Level , Brw_FileType_t FileType ,
const char * FileName , char * FileNameToShow )
{
extern const char * Txt_ROOT_FOLDER_EXTERNAL_NAMES [ Brw_NUM_TYPES_FILE_BROWSER ] ;
Brw_LimitLengthFileNameToShow ( FileType ,
Level ? FileName :
Txt_ROOT_FOLDER_EXTERNAL_NAMES [ FileBrowser ] ,
FileNameToShow ) ;
}
/*****************************************************************************/
/*************** Limit the length of the filename to be shown ****************/
/*****************************************************************************/
// FileNameToShow must have at least NAME_MAX+1 bytes
static void Brw_LimitLengthFileNameToShow ( Brw_FileType_t FileType , const char * FileName , char * FileNameToShow )
{
size_t NumCharsToCopy ;
/***** Limit length of the name of the file *****/
NumCharsToCopy = strlen ( FileName ) ;
if ( FileType = = Brw_IS_LINK ) // It's a link (URL inside a .url file)
NumCharsToCopy - = 4 ; // Remove .url
if ( NumCharsToCopy > NAME_MAX )
NumCharsToCopy = NAME_MAX ;
strncpy ( FileNameToShow , FileName , NumCharsToCopy ) ;
FileNameToShow [ NumCharsToCopy ] = ' \0 ' ;
Str_LimitLengthHTMLStr ( FileNameToShow , 60 ) ;
}
/*****************************************************************************/
2016-04-01 14:44:55 +02:00
/****** Create a link in public temporary directory to a private file ********/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2016-04-01 14:44:55 +02:00
void Brw_CreateTmpPublicLinkToPrivateFile ( const char * FullPathIncludingFile ,
const char * FileName )
2014-12-01 23:55:08 +01:00
{
char Link [ PATH_MAX + 1 ] ;
2016-04-01 14:44:55 +02:00
/***** Create, into temporary public directory, a symbolic link to file *****/
2014-12-01 23:55:08 +01:00
sprintf ( Link , " %s/%s/%s/%s " ,
Cfg_PATH_SWAD_PUBLIC , Cfg_FOLDER_FILE_BROWSER_TMP ,
Gbl . FileBrowser . TmpPubDir , FileName ) ;
if ( symlink ( FullPathIncludingFile , Link ) ! = 0 )
2016-04-01 14:44:55 +02:00
Lay_ShowErrorAndExit ( " Can not create temporary link. " ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/***************** Write parameters of a row of file list ********************/
/*****************************************************************************/
void Brw_ParamListFiles ( Brw_FileType_t FileType , const char * PathInTree , const char * FileName )
{
Brw_PutParamsPathAndFile ( FileType , PathInTree , FileName ) ;
if ( Gbl . FileBrowser . FullTree )
Par_PutHiddenParamChar ( " FullTree " , ' Y ' ) ;
}
/*****************************************************************************/
/************ Write start and end dates of a folder of assignment ************/
/*****************************************************************************/
static void Brw_WriteDatesAssignment ( void )
{
2015-12-29 11:35:01 +01:00
extern const char * Txt_Today ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_unknown_assignment ;
2015-10-24 20:12:03 +02:00
static unsigned UniqueId = 0 ;
2014-12-01 23:55:08 +01:00
2015-10-05 00:22:16 +02:00
fprintf ( Gbl . F . Out , " <td colspan= \" 2 \" "
2015-09-03 00:59:03 +02:00
" class= \" ASG_LST_DATE_GREEN RIGHT_MIDDLE COLOR%u \" > " ,
Gbl . RowEvenOdd ) ;
2014-12-01 23:55:08 +01:00
if ( Gbl . FileBrowser . Asg . AsgCod > 0 )
{
2015-10-22 01:24:43 +02:00
UniqueId + + ;
2014-12-01 23:55:08 +01:00
/***** Write start date *****/
2015-10-22 01:24:43 +02:00
fprintf ( Gbl . F . Out , " <table> "
" <tr> "
2015-10-24 20:12:03 +02:00
" <td id= \" asg_start_date_%u \" class= \" %s RIGHT_MIDDLE \" > " ,
2015-10-22 01:24:43 +02:00
UniqueId ,
2014-12-01 23:55:08 +01:00
Gbl . FileBrowser . Asg . Open ? " ASG_LST_DATE_GREEN " :
2015-10-22 01:24:43 +02:00
" ASG_LST_DATE_RED " ) ;
fprintf ( Gbl . F . Out , " <script type= \" text/javascript \" > "
2016-01-13 02:03:56 +01:00
" writeLocalDateHMSFromUTC('asg_start_date_%u',%ld,' ','%s'); "
2015-10-22 01:24:43 +02:00
" </script> " ,
UniqueId ,
2015-12-29 11:35:01 +01:00
( long ) Gbl . FileBrowser . Asg . TimeUTC [ Asg_START_TIME ] , Txt_Today ) ;
2015-10-22 01:24:43 +02:00
fprintf ( Gbl . F . Out , " </td> " ) ;
2014-12-01 23:55:08 +01:00
/***** Arrow *****/
2015-09-28 18:28:29 +02:00
fprintf ( Gbl . F . Out , " <td class= \" RIGHT_MIDDLE \" style= \" width:20px; \" > "
2015-07-21 20:07:46 +02:00
" <img src= \" %s/arrow%s16x12.gif \" "
" alt= \" \" title= \" \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON20x15B \" /> "
2014-12-01 23:55:08 +01:00
" </td> " ,
Gbl . Prefs . IconsURL ,
Gbl . FileBrowser . Asg . Open ? " green " :
" red " ) ;
2015-10-22 01:24:43 +02:00
/***** Write end date *****/
2015-10-24 20:12:03 +02:00
fprintf ( Gbl . F . Out , " <td id= \" asg_end_date_%u \" class= \" %s RIGHT_MIDDLE \" > " ,
2015-10-22 01:24:43 +02:00
UniqueId ,
2014-12-01 23:55:08 +01:00
Gbl . FileBrowser . Asg . Open ? " ASG_LST_DATE_GREEN " :
2015-10-22 01:24:43 +02:00
" ASG_LST_DATE_RED " ) ;
fprintf ( Gbl . F . Out , " <script type= \" text/javascript \" > "
2016-01-13 02:03:56 +01:00
" writeLocalDateHMSFromUTC('asg_end_date_%u',%ld,' ','%s'); "
2015-10-22 01:24:43 +02:00
" </script> " ,
UniqueId ,
2015-12-29 11:35:01 +01:00
( long ) Gbl . FileBrowser . Asg . TimeUTC [ Asg_END_TIME ] , Txt_Today ) ;
2015-10-22 01:24:43 +02:00
fprintf ( Gbl . F . Out , " </td> "
" </tr> "
2014-12-30 15:14:43 +01:00
" </table> " ) ;
2014-12-01 23:55:08 +01:00
}
else
fprintf ( Gbl . F . Out , " (%s) " ,
Txt_unknown_assignment ) ;
fprintf ( Gbl . F . Out , " </td> " ) ;
}
/*****************************************************************************/
/****************** Write size and date of a file or folder ******************/
/*****************************************************************************/
static void Brw_WriteFileSizeAndDate ( Brw_FileType_t FileType , struct FileMetadata * FileMetadata )
{
2016-01-18 14:05:44 +01:00
extern const char * Txt_Today ;
2015-10-21 22:31:46 +02:00
static unsigned UniqueId = 0 ;
2014-12-01 23:55:08 +01:00
/***** Write the file size *****/
2015-09-03 00:59:03 +02:00
fprintf ( Gbl . F . Out , " <td class= \" %s RIGHT_MIDDLE COLOR%u \" > "
2014-12-22 21:52:37 +01:00
" " ,
2015-09-03 00:59:03 +02:00
Gbl . FileBrowser . TxtStyle , Gbl . RowEvenOdd ) ;
2014-12-01 23:55:08 +01:00
if ( FileType = = Brw_IS_FILE )
Str_WriteSizeInBytesBrief ( ( double ) FileMetadata - > Size ) ;
fprintf ( Gbl . F . Out , " </td> " ) ;
/***** Write the date *****/
2015-09-03 00:59:03 +02:00
fprintf ( Gbl . F . Out , " <td class= \" %s RIGHT_MIDDLE COLOR%u \" > "
2014-12-22 21:52:37 +01:00
" " ,
2015-09-03 00:59:03 +02:00
Gbl . FileBrowser . TxtStyle , Gbl . RowEvenOdd ) ;
2014-12-01 23:55:08 +01:00
if ( FileType = = Brw_IS_FILE | |
FileType = = Brw_IS_LINK )
{
2015-10-21 22:31:46 +02:00
UniqueId + + ;
fprintf ( Gbl . F . Out , " <span id= \" filedate%u \" ></span> "
" <script type= \" text/javascript \" > "
2016-01-18 14:05:44 +01:00
" writeLocalDateHMSFromUTC('filedate%u',%ld,' ','%s'); "
2015-10-21 22:31:46 +02:00
" </script> " ,
UniqueId ,
2016-01-18 14:05:44 +01:00
UniqueId , ( long ) FileMetadata - > Time , Txt_Today ) ;
2014-12-01 23:55:08 +01:00
}
fprintf ( Gbl . F . Out , " </td> " ) ;
}
/*****************************************************************************/
/************** Write the user who published the file or folder **************/
/*****************************************************************************/
static void Brw_WriteFileOrFolderPublisher ( unsigned Level , unsigned long UsrCod )
{
2015-07-21 20:07:46 +02:00
extern const char * Txt_Unknown_or_without_photo ;
2014-12-01 23:55:08 +01:00
bool ShowUsr = false ;
bool ShowPhoto ;
char PhotoURL [ PATH_MAX + 1 ] ;
struct UsrData UsrDat ;
if ( Level & & UsrCod > 0 )
{
/***** Initialize structure with user's data *****/
Usr_UsrDataConstructor ( & UsrDat ) ;
/***** Get data of file/folder publisher *****/
UsrDat . UsrCod = UsrCod ;
ShowUsr = Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod ( & UsrDat ) ; // Get user's data from database
}
2015-09-03 00:59:03 +02:00
fprintf ( Gbl . F . Out , " <td class= \" BM%u \" > " , Gbl . RowEvenOdd ) ;
2014-12-01 23:55:08 +01:00
if ( ShowUsr )
{
/***** Show photo *****/
ShowPhoto = Pho_ShowUsrPhotoIsAllowed ( & UsrDat , PhotoURL ) ;
2014-12-30 15:14:43 +01:00
Pho_ShowUsrPhoto ( & UsrDat , ShowPhoto ? PhotoURL :
NULL ,
2016-01-14 10:31:09 +01:00
" PHOTO15x20B " , Pho_ZOOM , false ) ;
2014-12-01 23:55:08 +01:00
}
else
2015-07-21 20:07:46 +02:00
fprintf ( Gbl . F . Out , " <img src= \" %s/usr_bl.jpg \" "
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" PHOTO15x20B \" /> " ,
2015-07-21 20:07:46 +02:00
Gbl . Prefs . IconsURL ,
Txt_Unknown_or_without_photo ,
Txt_Unknown_or_without_photo ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " </td> " ) ;
if ( Level & & UsrCod > 0 )
/***** Free memory used for user's data *****/
Usr_UsrDataDestructor ( & UsrDat ) ;
}
/*****************************************************************************/
/************** Ask for confirmation of removing a file or link **************/
/*****************************************************************************/
void Brw_AskRemFileFromTree ( void )
{
extern const char * Txt_Do_you_really_want_to_remove_FILE_OR_LINK_X ;
extern const char * Txt_Remove_file ;
extern const char * Txt_Remove_link ;
extern const char * Txt_You_can_not_remove_this_file_or_link ;
char FileNameToShow [ NAME_MAX + 1 ] ;
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
/***** Button of confirmation of removing *****/
if ( Brw_CheckIfICanEditFileOrFolder ( Gbl . FileBrowser . Level ) ) // Can I remove this file?
{
/***** Form to ask for confirmation to remove a file *****/
Act_FormStart ( Brw_ActRemoveFile [ Gbl . FileBrowser . Type ] ) ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActRemoveFile [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
2016-01-03 15:36:46 +01:00
Brw_ParamListFiles ( Gbl . FileBrowser . FileType , Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk , Gbl . FileBrowser . FilFolLnkName ) ;
2014-12-01 23:55:08 +01:00
/* Show question */
Brw_GetFileNameToShow ( Gbl . FileBrowser . FileType , Gbl . FileBrowser . Level , Gbl . FileBrowser . FileType ,
Gbl . FileBrowser . FilFolLnkName , FileNameToShow ) ;
sprintf ( Gbl . Message , Txt_Do_you_really_want_to_remove_FILE_OR_LINK_X ,
FileNameToShow ) ;
Lay_ShowAlert ( Lay_WARNING , Gbl . Message ) ;
2015-03-24 17:47:26 +01:00
Lay_PutRemoveButton ( Gbl . FileBrowser . FileType = = Brw_IS_FILE ? Txt_Remove_file :
Txt_Remove_link ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
}
else
Lay_ShowErrorAndExit ( Txt_You_can_not_remove_this_file_or_link ) ;
/***** Show again file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/************************ Remove a file of a file browser ********************/
/*****************************************************************************/
void Brw_RemFileFromTree ( void )
{
extern const char * Txt_FILE_X_removed ;
extern const char * Txt_You_can_not_remove_this_file_or_link ;
char Path [ PATH_MAX + 1 ] ;
struct stat FileStatus ;
char FileNameToShow [ NAME_MAX + 1 ] ;
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
if ( Brw_CheckIfICanEditFileOrFolder ( Gbl . FileBrowser . Level ) ) // Can I remove this file?
{
sprintf ( Path , " %s/%s " , Gbl . FileBrowser . Priv . PathAboveRootFolder , Gbl . FileBrowser . Priv . FullPathInTree ) ;
/***** Check if is a file/link or a folder *****/
lstat ( Path , & FileStatus ) ;
if ( S_ISREG ( FileStatus . st_mode ) ) // It's a file or a link
{
2015-12-21 18:03:28 +01:00
/* Name of the file/link to be shown */
2014-12-01 23:55:08 +01:00
Brw_LimitLengthFileNameToShow ( Str_FileIs ( Gbl . FileBrowser . FilFolLnkName , " url " ) ? Brw_IS_LINK :
Brw_IS_FILE ,
Gbl . FileBrowser . FilFolLnkName , FileNameToShow ) ;
2015-12-21 18:03:28 +01:00
/* Remove file/link from disk and database */
Brw_RemoveFileFromDiskAndDB ( Path ,
Gbl . FileBrowser . Priv . FullPathInTree ) ;
2014-12-01 23:55:08 +01:00
2015-12-21 18:03:28 +01:00
/* Remove affected clipboards */
Brw_RemoveAffectedClipboards ( Gbl . FileBrowser . Type ,
Gbl . Usrs . Me . UsrDat . UsrCod ,
Gbl . Usrs . Other . UsrDat . UsrCod ) ;
2014-12-01 23:55:08 +01:00
/* Message of confirmation of removing */
sprintf ( Gbl . Message , Txt_FILE_X_removed , FileNameToShow ) ;
Lay_ShowAlert ( Lay_SUCCESS , Gbl . Message ) ;
}
else // File / link not found
Lay_ShowErrorAndExit ( " File / link not found. " ) ;
}
else
Lay_ShowErrorAndExit ( Txt_You_can_not_remove_this_file_or_link ) ;
/***** Show again file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/******************* Remove a folder of a file browser ***********************/
/*****************************************************************************/
void Brw_RemFolderFromTree ( void )
{
extern const char * Txt_Folder_X_removed ;
extern const char * Txt_You_can_not_remove_this_folder ;
char Path [ PATH_MAX + 1 ] ;
struct stat FileStatus ;
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
if ( Brw_CheckIfICanEditFileOrFolder ( Gbl . FileBrowser . Level ) ) // Can I remove this folder?
{
sprintf ( Path , " %s/%s " , Gbl . FileBrowser . Priv . PathAboveRootFolder , Gbl . FileBrowser . Priv . FullPathInTree ) ;
/***** Check if it's a file or a folder *****/
lstat ( Path , & FileStatus ) ;
if ( S_ISDIR ( FileStatus . st_mode ) ) // It's a directory
2015-12-21 18:03:28 +01:00
if ( Brw_RemoveFolderFromDiskAndDB ( Path ,
Gbl . FileBrowser . Priv . FullPathInTree ) )
2014-12-01 23:55:08 +01:00
{
if ( errno = = ENOTEMPTY ) // The directory is not empty
{
Brw_AskConfirmRemoveFolderNotEmpty ( ) ;
Gbl . Message [ 0 ] = ' \0 ' ;
}
else // The directory is empty
Lay_ShowErrorAndExit ( " Can not remove folder. " ) ;
}
else
{
/* Remove affected clipboards */
2015-12-21 18:03:28 +01:00
Brw_RemoveAffectedClipboards ( Gbl . FileBrowser . Type ,
Gbl . Usrs . Me . UsrDat . UsrCod ,
Gbl . Usrs . Other . UsrDat . UsrCod ) ;
2014-12-01 23:55:08 +01:00
/* Message of confirmation of successfull removing */
sprintf ( Gbl . Message , Txt_Folder_X_removed ,
Gbl . FileBrowser . FilFolLnkName ) ;
Lay_ShowAlert ( Lay_SUCCESS , Gbl . Message ) ;
}
else // Folder not found
Lay_ShowErrorAndExit ( " Folder not found. " ) ;
}
else
Lay_ShowErrorAndExit ( Txt_You_can_not_remove_this_folder ) ;
/***** Show again file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/*********** Ask for confirmation of removing of a folder no empty ***********/
/*****************************************************************************/
static void Brw_AskConfirmRemoveFolderNotEmpty ( void )
{
extern const char * Txt_Do_you_really_want_to_remove_the_folder_X ;
extern const char * Txt_Remove_folder ;
/***** Form to remove a not empty folder *****/
Act_FormStart ( Brw_ActRemoveFolderNotEmpty [ Gbl . FileBrowser . Type ] ) ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActRemoveFolderNotEmpty [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
2016-01-03 15:36:46 +01:00
Brw_ParamListFiles ( Brw_IS_FOLDER , Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk , Gbl . FileBrowser . FilFolLnkName ) ;
2014-12-01 23:55:08 +01:00
sprintf ( Gbl . Message , Txt_Do_you_really_want_to_remove_the_folder_X ,
Gbl . FileBrowser . FilFolLnkName ) ;
Lay_ShowAlert ( Lay_WARNING , Gbl . Message ) ;
2015-03-24 17:47:26 +01:00
Lay_PutRemoveButton ( Txt_Remove_folder ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/********* Complete removing of a not empty folder in a file browser *********/
/*****************************************************************************/
void Brw_RemSubtreeInFileBrowser ( void )
{
extern const char * Txt_Folder_X_and_all_its_contents_removed ;
char Path [ PATH_MAX + 1 ] ;
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
if ( Brw_CheckIfICanEditFileOrFolder ( Gbl . FileBrowser . Level ) ) // Can I remove this subtree?
{
sprintf ( Path , " %s/%s " , Gbl . FileBrowser . Priv . PathAboveRootFolder , Gbl . FileBrowser . Priv . FullPathInTree ) ;
/***** Remove the whole tree *****/
Brw_RemoveTree ( Path ) ;
/* If a folder is removed,
it is necessary to remove it from the database and all the files o folders under that folder */
Brw_RemoveOneFileOrFolderFromDB ( Gbl . FileBrowser . Priv . FullPathInTree ) ;
Brw_RemoveChildrenOfFolderFromDB ( Gbl . FileBrowser . Priv . FullPathInTree ) ;
/* Remove affected clipboards */
Brw_RemoveAffectedClipboards ( Gbl . FileBrowser . Type , Gbl . Usrs . Me . UsrDat . UsrCod , Gbl . Usrs . Other . UsrDat . UsrCod ) ;
/* Remove affected expanded folders */
Brw_RemoveAffectedExpandedFolders ( Gbl . FileBrowser . Priv . FullPathInTree ) ;
/***** Write message of confirmation *****/
sprintf ( Gbl . Message , Txt_Folder_X_and_all_its_contents_removed ,
Gbl . FileBrowser . FilFolLnkName ) ;
Lay_ShowAlert ( Lay_SUCCESS , Gbl . Message ) ;
}
/***** Show again file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/************************* Remove a folder recursively ***********************/
/*****************************************************************************/
// If the tree of directories and files exists, remove it
void Brw_RemoveTree ( const char * Path )
{
struct stat FileStatus ;
struct dirent * * FileList ;
int NumFile , NumFiles ;
char PathFileRel [ PATH_MAX + 1 ] ;
bool Error ;
if ( Fil_CheckIfPathExists ( Path ) )
{
lstat ( Path , & FileStatus ) ;
if ( S_ISDIR ( FileStatus . st_mode ) ) // It's a directory
{
if ( rmdir ( Path ) )
{
Error = false ;
if ( errno = = ENOTEMPTY )
{
/***** Remove each directory and file under this directory *****/
/* Scan the directory */
2015-12-21 13:36:39 +01:00
if ( ( NumFiles = scandir ( Path , & FileList , NULL , NULL ) ) > = 0 )
{
/* Remove recursively all the directories and files */
for ( NumFile = 0 ;
NumFile < NumFiles ;
NumFile + + )
2014-12-01 23:55:08 +01:00
{
2015-12-21 13:36:39 +01:00
if ( strcmp ( FileList [ NumFile ] - > d_name , " . " ) & &
strcmp ( FileList [ NumFile ] - > d_name , " .. " ) ) // Skip directories "." and ".."
{
sprintf ( PathFileRel , " %s/%s " , Path , FileList [ NumFile ] - > d_name ) ;
Brw_RemoveTree ( PathFileRel ) ;
}
free ( ( void * ) FileList [ NumFile ] ) ;
2014-12-01 23:55:08 +01:00
}
2015-12-21 13:36:39 +01:00
free ( ( void * ) FileList ) ;
}
else
Lay_ShowErrorAndExit ( " Error while scanning directory. " ) ;
2014-12-01 23:55:08 +01:00
/***** Remove of new the directory, now empty *****/
if ( rmdir ( Path ) )
Error = true ;
}
else
Error = true ;
if ( Error )
{
sprintf ( Gbl . Message , " Can not remove folder %s. " , Path ) ;
Lay_ShowErrorAndExit ( Gbl . Message ) ;
}
}
}
else // It's a file
if ( unlink ( Path ) )
Lay_ShowErrorAndExit ( " Can not remove file. " ) ;
}
}
/*****************************************************************************/
/********************* Expand a folder in a file browser *********************/
/*****************************************************************************/
void Brw_ExpandFileTree ( void )
{
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
/***** Add path to table of expanded folders *****/
Brw_InsFoldersInPathAndUpdOtherFoldersInExpandedFolders ( Gbl . FileBrowser . Priv . FullPathInTree ) ;
/***** Show again file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/******************* Contract a folder in a file browser *********************/
/*****************************************************************************/
void Brw_ContractFileTree ( void )
{
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
/***** Remove path where the user has clicked from table of expanded folders *****/
Brw_RemThisFolderAndUpdOtherFoldersFromExpandedFolders ( Gbl . FileBrowser . Priv . FullPathInTree ) ;
/***** Show again file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/****** Copy the path of a file/folder of a file browser in clipboard ********/
/*****************************************************************************/
void Brw_CopyFromFileBrowser ( void )
{
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
/***** Remove old clipboards (from all users) *****/
Brw_RemoveExpiredClipboards ( ) ; // Someone must do this work. Let's do it whenever a user click in a copy button
/***** Put the path in the clipboard *****/
if ( Brw_GetMyClipboard ( ) )
Brw_UpdatePathInClipboard ( Gbl . FileBrowser . FileType ,
Gbl . FileBrowser . Priv . FullPathInTree ) ;
else
Brw_AddPathToClipboards ( Gbl . FileBrowser . FileType ,
Gbl . FileBrowser . Priv . FullPathInTree ) ;
/***** Show again file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/**************** Get the path of my clipboard and write it ******************/
/*****************************************************************************/
static inline void Brw_GetAndWriteClipboard ( void )
{
if ( Brw_GetMyClipboard ( ) )
Brw_WriteCurrentClipboard ( ) ;
}
/*****************************************************************************/
/********* Write a title with the content of the current clipboard ***********/
/*****************************************************************************/
static void Brw_WriteCurrentClipboard ( void )
{
extern const char * Txt_Copy_source ;
2015-01-26 12:39:48 +01:00
extern const char * Txt_documents_management_area ;
2016-04-22 09:47:25 +02:00
extern const char * Txt_teachers_files_area ;
2015-01-26 12:39:48 +01:00
extern const char * Txt_shared_files_area ;
extern const char * Txt_assignments_area ;
extern const char * Txt_works_area ;
extern const char * Txt_marks_management_area ;
2015-12-21 00:53:56 +01:00
extern const char * Txt_temporary_private_storage_area ;
2015-01-20 02:00:42 +01:00
extern const char * Txt_institution ;
extern const char * Txt_centre ;
extern const char * Txt_degree ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_course ;
extern const char * Txt_group ;
extern const char * Txt_user [ Usr_NUM_SEXS ] ;
extern const char * Txt_all_files ;
extern const char * Txt_file_folder ;
extern const char * Txt_file ;
extern const char * Txt_folder ;
extern const char * Txt_link ;
2015-01-20 02:00:42 +01:00
struct Institution Ins ;
struct Centre Ctr ;
struct Degree Deg ;
2014-12-01 23:55:08 +01:00
struct Course Crs ;
struct GroupData GrpDat ;
struct UsrData UsrDat ;
unsigned LevelClipboard ;
const char * Ptr ;
char FileNameToShow [ NAME_MAX + 1 ] ;
2015-08-01 10:43:33 +02:00
fprintf ( Gbl . F . Out , " <div class= \" DAT CENTER_MIDDLE \" > "
2014-12-26 17:55:42 +01:00
" %s: " ,
2014-12-01 23:55:08 +01:00
Txt_Copy_source ) ;
switch ( Gbl . FileBrowser . Clipboard . FileBrowser )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_INS :
2015-01-24 19:30:44 +01:00
Ins . InsCod = Gbl . FileBrowser . Clipboard . Cod ;
Ins_GetDataOfInstitutionByCod ( & Ins , false ) ;
2015-01-20 02:00:42 +01:00
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong> " ,
2015-01-26 12:39:48 +01:00
Txt_documents_management_area ,
2015-01-20 02:00:42 +01:00
Txt_institution , Ins . ShortName ) ;
break ;
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_INS :
Ins . InsCod = Gbl . FileBrowser . Clipboard . Cod ;
Ins_GetDataOfInstitutionByCod ( & Ins , false ) ;
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong> " ,
Txt_shared_files_area ,
Txt_institution , Ins . ShortName ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CTR :
2015-01-24 19:30:44 +01:00
Ctr . CtrCod = Gbl . FileBrowser . Clipboard . Cod ;
Ctr_GetDataOfCentreByCod ( & Ctr ) ;
2015-01-20 02:00:42 +01:00
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong> " ,
2015-01-26 12:39:48 +01:00
Txt_documents_management_area ,
2015-01-20 02:00:42 +01:00
Txt_centre , Ctr . ShortName ) ;
break ;
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_CTR :
Ctr . CtrCod = Gbl . FileBrowser . Clipboard . Cod ;
Ctr_GetDataOfCentreByCod ( & Ctr ) ;
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong> " ,
Txt_shared_files_area ,
Txt_centre , Ctr . ShortName ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_DEG :
2015-01-24 19:30:44 +01:00
Deg . DegCod = Gbl . FileBrowser . Clipboard . Cod ;
Deg_GetDataOfDegreeByCod ( & Deg ) ;
2015-01-20 02:00:42 +01:00
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong> " ,
2015-01-26 12:39:48 +01:00
Txt_documents_management_area ,
2015-01-20 02:00:42 +01:00
Txt_degree , Deg . ShortName ) ;
break ;
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_DEG :
Deg . DegCod = Gbl . FileBrowser . Clipboard . Cod ;
Deg_GetDataOfDegreeByCod ( & Deg ) ;
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong> " ,
Txt_shared_files_area ,
Txt_degree , Deg . ShortName ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS :
2015-01-24 19:30:44 +01:00
Crs . CrsCod = Gbl . FileBrowser . Clipboard . Cod ;
Crs_GetDataOfCourseByCod ( & Crs ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong> " ,
2015-01-26 12:39:48 +01:00
Txt_documents_management_area ,
2014-12-01 23:55:08 +01:00
Txt_course , Crs . ShortName ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2015-01-24 19:30:44 +01:00
GrpDat . GrpCod = Gbl . FileBrowser . Clipboard . Cod ;
2014-12-01 23:55:08 +01:00
Grp_GetDataOfGroupByCod ( & GrpDat ) ;
2015-01-24 19:30:44 +01:00
Crs . CrsCod = GrpDat . CrsCod ;
Crs_GetDataOfCourseByCod ( & Crs ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong>, %s <strong>%s %s</strong> " ,
2015-01-26 12:39:48 +01:00
Txt_documents_management_area ,
2014-12-01 23:55:08 +01:00
Txt_course , Crs . ShortName ,
Txt_group , GrpDat . GrpTypName , GrpDat . GrpName ) ;
break ;
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
Crs . CrsCod = Gbl . FileBrowser . Clipboard . Cod ;
Crs_GetDataOfCourseByCod ( & Crs ) ;
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong> " ,
Txt_teachers_files_area ,
Txt_course , Crs . ShortName ) ;
break ;
case Brw_ADMI_TEACH_GRP :
GrpDat . GrpCod = Gbl . FileBrowser . Clipboard . Cod ;
Grp_GetDataOfGroupByCod ( & GrpDat ) ;
Crs . CrsCod = GrpDat . CrsCod ;
Crs_GetDataOfCourseByCod ( & Crs ) ;
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong>, %s <strong>%s %s</strong> " ,
Txt_teachers_files_area ,
Txt_course , Crs . ShortName ,
Txt_group , GrpDat . GrpTypName , GrpDat . GrpName ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
2015-01-24 19:30:44 +01:00
Crs . CrsCod = Gbl . FileBrowser . Clipboard . Cod ;
Crs_GetDataOfCourseByCod ( & Crs ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong> " ,
2015-01-26 12:39:48 +01:00
Txt_shared_files_area ,
2014-12-01 23:55:08 +01:00
Txt_course , Crs . ShortName ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
2015-01-24 19:30:44 +01:00
GrpDat . GrpCod = Gbl . FileBrowser . Clipboard . Cod ;
2014-12-01 23:55:08 +01:00
Grp_GetDataOfGroupByCod ( & GrpDat ) ;
2015-01-24 19:30:44 +01:00
Crs . CrsCod = GrpDat . CrsCod ;
Crs_GetDataOfCourseByCod ( & Crs ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong>, %s <strong>%s %s</strong> " ,
2015-01-26 12:39:48 +01:00
Txt_shared_files_area ,
2014-12-01 23:55:08 +01:00
Txt_course , Crs . ShortName ,
Txt_group , GrpDat . GrpTypName , GrpDat . GrpName ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_USR :
2015-01-24 19:30:44 +01:00
Crs . CrsCod = Gbl . FileBrowser . Clipboard . Cod ;
Crs_GetDataOfCourseByCod ( & Crs ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong>, %s <strong>%s</strong> " ,
2015-01-26 12:39:48 +01:00
Txt_assignments_area ,
2014-12-01 23:55:08 +01:00
Txt_course , Crs . ShortName ,
Txt_user [ Gbl . Usrs . Me . UsrDat . Sex ] , Gbl . Usrs . Me . UsrDat . FullName ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_WORKS_USR :
2015-01-24 19:30:44 +01:00
Crs . CrsCod = Gbl . FileBrowser . Clipboard . Cod ;
Crs_GetDataOfCourseByCod ( & Crs ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong>, %s <strong>%s</strong> " ,
2015-01-26 12:39:48 +01:00
Txt_works_area ,
2014-12-01 23:55:08 +01:00
Txt_course , Crs . ShortName ,
Txt_user [ Gbl . Usrs . Me . UsrDat . Sex ] , Gbl . Usrs . Me . UsrDat . FullName ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
2015-01-24 19:30:44 +01:00
Crs . CrsCod = Gbl . FileBrowser . Clipboard . Cod ;
Crs_GetDataOfCourseByCod ( & Crs ) ;
2014-12-01 23:55:08 +01:00
Usr_UsrDataConstructor ( & UsrDat ) ;
UsrDat . UsrCod = Gbl . FileBrowser . Clipboard . WorksUsrCod ;
Usr_GetAllUsrDataFromUsrCod ( & UsrDat ) ;
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong>, %s <strong>%s</strong> " ,
2015-01-26 12:39:48 +01:00
Txt_assignments_area ,
2014-12-01 23:55:08 +01:00
Txt_course , Crs . ShortName ,
Txt_user [ UsrDat . Sex ] , UsrDat . FullName ) ;
Usr_UsrDataDestructor ( & UsrDat ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_WORKS_CRS :
2015-01-24 19:30:44 +01:00
Crs . CrsCod = Gbl . FileBrowser . Clipboard . Cod ;
Crs_GetDataOfCourseByCod ( & Crs ) ;
2014-12-01 23:55:08 +01:00
Usr_UsrDataConstructor ( & UsrDat ) ;
UsrDat . UsrCod = Gbl . FileBrowser . Clipboard . WorksUsrCod ;
Usr_GetAllUsrDataFromUsrCod ( & UsrDat ) ;
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong>, %s <strong>%s</strong> " ,
2015-01-26 12:39:48 +01:00
Txt_works_area ,
2014-12-01 23:55:08 +01:00
Txt_course , Crs . ShortName ,
Txt_user [ UsrDat . Sex ] , UsrDat . FullName ) ;
Usr_UsrDataDestructor ( & UsrDat ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_MARKS_CRS :
2015-01-24 19:30:44 +01:00
Crs . CrsCod = Gbl . FileBrowser . Clipboard . Cod ;
Crs_GetDataOfCourseByCod ( & Crs ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong> " ,
2015-01-26 12:39:48 +01:00
Txt_marks_management_area ,
2014-12-01 23:55:08 +01:00
Txt_course , Crs . ShortName ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_MARKS_GRP :
2015-01-24 19:30:44 +01:00
GrpDat . GrpCod = Gbl . FileBrowser . Clipboard . Cod ;
2014-12-01 23:55:08 +01:00
Grp_GetDataOfGroupByCod ( & GrpDat ) ;
2015-01-24 19:30:44 +01:00
Crs . CrsCod = GrpDat . CrsCod ;
Crs_GetDataOfCourseByCod ( & Crs ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong>, %s <strong>%s %s</strong> " ,
2015-01-26 12:39:48 +01:00
Txt_marks_management_area ,
2014-12-01 23:55:08 +01:00
Txt_course , Crs . ShortName ,
Txt_group , GrpDat . GrpTypName , GrpDat . GrpName ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_BRIEF_USR :
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " %s, %s <strong>%s</strong> " ,
2015-12-21 00:53:56 +01:00
Txt_temporary_private_storage_area ,
2014-12-01 23:55:08 +01:00
Txt_user [ Gbl . Usrs . Me . UsrDat . Sex ] , Gbl . Usrs . Me . UsrDat . FullName ) ;
break ;
default :
break ;
}
fprintf ( Gbl . F . Out , " , " ) ;
// LevelClipboard == number-of-slashes-in-full-path-including-file-or-folder
for ( LevelClipboard = 0 , Ptr = Gbl . FileBrowser . Clipboard . Path ;
* Ptr ;
Ptr + + )
if ( * Ptr = = ' / ' )
LevelClipboard + + ;
if ( LevelClipboard ) // Is not the root folder?
{
Brw_GetFileNameToShow ( Gbl . FileBrowser . Clipboard . FileBrowser , LevelClipboard , Gbl . FileBrowser . Clipboard . FileType ,
Gbl . FileBrowser . Clipboard . FileName , FileNameToShow ) ;
switch ( Gbl . FileBrowser . Clipboard . FileType )
{
case Brw_IS_UNKNOWN :
fprintf ( Gbl . F . Out , " %s " , Txt_file_folder ) ;
break ;
case Brw_IS_FILE :
fprintf ( Gbl . F . Out , " %s " , Txt_file ) ;
break ;
case Brw_IS_FOLDER :
fprintf ( Gbl . F . Out , " %s " , Txt_folder ) ;
break ;
case Brw_IS_LINK :
fprintf ( Gbl . F . Out , " %s " , Txt_link ) ;
break ;
}
fprintf ( Gbl . F . Out , " <strong>%s</strong> " ,
FileNameToShow ) ; // It's not the root folder
}
else
fprintf ( Gbl . F . Out , " %s " , Txt_all_files ) ; // It's the root folder
fprintf ( Gbl . F . Out , " .</div> " ) ;
}
/*****************************************************************************/
/********************** Get data of my current clipboard *********************/
/*****************************************************************************/
// Returns true if something found
// Returns false and void data if nothing found
static bool Brw_GetMyClipboard ( void )
{
char Query [ 256 ] ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
char PathUntilFileName [ PATH_MAX + 1 ] ;
unsigned NumRows ;
unsigned UnsignedNum ;
/***** Get my current clipboard from database *****/
2015-01-24 19:30:44 +01:00
sprintf ( Query , " SELECT FileBrowser,Cod,WorksUsrCod,FileType,Path "
2014-12-01 23:55:08 +01:00
" FROM clipboard WHERE UsrCod='%ld' " ,
Gbl . Usrs . Me . UsrDat . UsrCod ) ;
NumRows = DB_QuerySELECT ( Query , & mysql_res , " can not get source of copy from clipboard " ) ;
/***** Depending on the number of rows of the result... *****/
if ( NumRows = = 0 )
{
/***** Clear clipboard data *****/
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Clipboard . FileBrowser = Brw_UNKNOWN ;
2015-01-24 19:30:44 +01:00
Gbl . FileBrowser . Clipboard . Cod = - 1L ;
2014-12-01 23:55:08 +01:00
Gbl . FileBrowser . Clipboard . WorksUsrCod = - 1L ;
Gbl . FileBrowser . Clipboard . FileType = Brw_IS_UNKNOWN ;
Gbl . FileBrowser . Clipboard . Path [ 0 ] = ' \0 ' ;
Gbl . FileBrowser . Clipboard . FileName [ 0 ] = ' \0 ' ;
}
else if ( NumRows = = 1 )
{
/***** Get clipboard data *****/
row = mysql_fetch_row ( mysql_res ) ;
/* Get file browser type (row[0]) */
if ( sscanf ( row [ 0 ] , " %u " , & UnsignedNum ) = = 1 )
{
Gbl . FileBrowser . Clipboard . FileBrowser = ( Brw_FileBrowser_t ) UnsignedNum ;
2015-01-24 19:30:44 +01:00
/* Get institution/centre/degree/course/group code (row[1]) */
Gbl . FileBrowser . Clipboard . Cod = Str_ConvertStrCodToLongCod ( row [ 1 ] ) ;
2015-01-20 02:00:42 +01:00
2015-01-24 19:30:44 +01:00
/* Get works user's code (row[2]) */
Gbl . FileBrowser . Clipboard . WorksUsrCod = Str_ConvertStrCodToLongCod ( row [ 2 ] ) ;
2015-01-20 02:00:42 +01:00
2015-01-24 19:30:44 +01:00
/* Get file type (row[3]) */
2014-12-01 23:55:08 +01:00
Gbl . FileBrowser . Clipboard . FileType = Brw_IS_UNKNOWN ; // default
2015-01-24 19:30:44 +01:00
if ( sscanf ( row [ 3 ] , " %u " , & UnsignedNum ) = = 1 )
2014-12-01 23:55:08 +01:00
if ( UnsignedNum < Brw_NUM_FILE_TYPES )
Gbl . FileBrowser . Clipboard . FileType = ( Brw_FileType_t ) UnsignedNum ;
2015-01-24 19:30:44 +01:00
/* Get file path (row[4]) */
strcpy ( Gbl . FileBrowser . Clipboard . Path , row [ 4 ] ) ;
2014-12-01 23:55:08 +01:00
Str_SplitFullPathIntoPathAndFileName ( Gbl . FileBrowser . Clipboard . Path ,
PathUntilFileName ,
Gbl . FileBrowser . Clipboard . FileName ) ;
}
else
{
2015-01-26 12:39:48 +01:00
Gbl . FileBrowser . Clipboard . FileBrowser = Brw_UNKNOWN ;
2015-01-24 19:30:44 +01:00
Gbl . FileBrowser . Clipboard . Cod = - 1L ;
2014-12-01 23:55:08 +01:00
Gbl . FileBrowser . Clipboard . WorksUsrCod = - 1L ;
Gbl . FileBrowser . Clipboard . FileType = Brw_IS_UNKNOWN ;
Gbl . FileBrowser . Clipboard . Path [ 0 ] = ' \0 ' ;
Gbl . FileBrowser . Clipboard . FileName [ 0 ] = ' \0 ' ;
}
}
else
Lay_ShowErrorAndExit ( " Error when getting source of copy. " ) ;
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult ( & mysql_res ) ;
return ( bool ) ( NumRows ! = 0 ) ;
}
/*****************************************************************************/
/********* Check if the clipboard is in the current file browser *************/
/*****************************************************************************/
static bool Brw_CheckIfClipboardIsInThisTree ( void )
{
2015-01-24 19:30:44 +01:00
if ( Gbl . FileBrowser . Clipboard . FileBrowser = = Brw_FileBrowserForDB_clipboard [ Gbl . FileBrowser . Type ] )
2014-12-01 23:55:08 +01:00
{
2015-01-24 19:30:44 +01:00
switch ( Gbl . FileBrowser . Clipboard . FileBrowser )
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_INS :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_INS :
2015-01-24 19:30:44 +01:00
if ( Gbl . FileBrowser . Clipboard . Cod = = Gbl . CurrentIns . Ins . InsCod )
return true ; // I am in the institution of the clipboard
2015-01-20 02:00:42 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CTR :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_CTR :
2015-01-24 19:30:44 +01:00
if ( Gbl . FileBrowser . Clipboard . Cod = = Gbl . CurrentCtr . Ctr . CtrCod )
return true ; // I am in the centre of the clipboard
2015-01-20 02:00:42 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_DEG :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_DEG :
2015-01-24 19:30:44 +01:00
if ( Gbl . FileBrowser . Clipboard . Cod = = Gbl . CurrentDeg . Deg . DegCod )
return true ; // I am in the degree of the clipboard
2015-01-20 02:00:42 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_MARKS_CRS :
case Brw_ADMI_ASSIG_USR :
case Brw_ADMI_WORKS_USR :
2015-01-24 19:30:44 +01:00
if ( Gbl . FileBrowser . Clipboard . Cod = = Gbl . CurrentCrs . Crs . CrsCod )
return true ; // I am in the course of the clipboard
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2015-01-24 19:30:44 +01:00
if ( Gbl . FileBrowser . Clipboard . Cod = = Gbl . CurrentCrs . Crs . CrsCod & &
Gbl . FileBrowser . Clipboard . WorksUsrCod = = Gbl . Usrs . Other . UsrDat . UsrCod )
return true ; // I am in the course of the clipboard
// I am in the student's works of the clipboard
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2015-01-24 19:30:44 +01:00
if ( Gbl . FileBrowser . Clipboard . Cod = = Gbl . CurrentCrs . Grps . GrpCod )
return true ; // I am in the group of the clipboard
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_BRIEF_USR :
2015-01-24 20:04:45 +01:00
return true ;
2015-01-24 19:30:44 +01:00
default :
break ;
}
2015-01-20 02:00:42 +01:00
}
2015-01-24 19:30:44 +01:00
return false ;
2015-01-20 18:55:59 +01:00
}
/*****************************************************************************/
/***************************** Add path to clipboards ************************/
/*****************************************************************************/
static void Brw_AddPathToClipboards ( Brw_FileType_t FileType , const char * Path )
{
2015-01-24 19:30:44 +01:00
long Cod = Brw_GetCodForClipboard ( ) ;
long WorksUsrCod = Brw_GetWorksUsrCodForClipboard ( ) ;
2015-01-20 18:55:59 +01:00
char Query [ 512 + PATH_MAX ] ;
2014-12-01 23:55:08 +01:00
/***** Add path to clipboards *****/
2015-01-20 18:55:59 +01:00
sprintf ( Query , " INSERT INTO clipboard (UsrCod,FileBrowser, "
2015-01-24 19:30:44 +01:00
" Cod,WorksUsrCod, "
2015-01-20 18:55:59 +01:00
" FileType,Path) "
" VALUES ('%ld','%u', "
2015-01-24 19:30:44 +01:00
" '%ld','%ld', "
2015-01-20 18:55:59 +01:00
" '%u','%s') " ,
2015-01-24 19:30:44 +01:00
Gbl . Usrs . Me . UsrDat . UsrCod , ( unsigned ) Gbl . FileBrowser . Type ,
Cod , WorksUsrCod ,
( unsigned ) FileType , Path ) ;
2014-12-01 23:55:08 +01:00
DB_QueryINSERT ( Query , " can not add source of copy to clipboard " ) ;
}
/*****************************************************************************/
/************************** Update path in my clipboard **********************/
/*****************************************************************************/
static void Brw_UpdatePathInClipboard ( Brw_FileType_t FileType , const char * Path )
{
2015-01-24 19:30:44 +01:00
long Cod = Brw_GetCodForClipboard ( ) ;
long WorksUsrCod = Brw_GetWorksUsrCodForClipboard ( ) ;
2014-12-01 23:55:08 +01:00
char Query [ 512 + PATH_MAX ] ;
/***** Update path in my clipboard *****/
2015-01-20 18:55:59 +01:00
sprintf ( Query , " UPDATE clipboard SET FileBrowser='%u', "
2015-01-24 19:30:44 +01:00
" Cod='%ld',WorksUsrCod='%ld', "
" FileType='%u',Path='%s' "
2014-12-01 23:55:08 +01:00
" WHERE UsrCod='%ld' " ,
( unsigned ) Gbl . FileBrowser . Type ,
2015-01-24 19:30:44 +01:00
Cod , WorksUsrCod , ( unsigned ) FileType , Path ,
2014-12-01 23:55:08 +01:00
Gbl . Usrs . Me . UsrDat . UsrCod ) ;
DB_QueryUPDATE ( Query , " can not update source of copy in clipboard " ) ;
}
2015-01-24 19:30:44 +01:00
/*****************************************************************************/
/**** Get code of institution, degree, course, group for expanded folders ****/
/*****************************************************************************/
static long Brw_GetCodForClipboard ( void )
{
switch ( Brw_FileBrowserForDB_clipboard [ Gbl . FileBrowser . Type ] )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_INS :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_INS :
2015-01-24 19:30:44 +01:00
return Gbl . CurrentIns . Ins . InsCod ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CTR :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_CTR :
2015-01-24 19:30:44 +01:00
return Gbl . CurrentCtr . Ctr . CtrCod ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_DEG :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_DEG :
2015-01-24 19:30:44 +01:00
return Gbl . CurrentDeg . Deg . DegCod ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_ASSIG_USR :
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_USR :
case Brw_ADMI_WORKS_CRS :
case Brw_ADMI_MARKS_CRS :
2015-01-24 19:30:44 +01:00
return Gbl . CurrentCrs . Crs . CrsCod ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2015-01-24 19:30:44 +01:00
return Gbl . CurrentCrs . Grps . GrpCod ;
default :
return - 1L ;
}
}
/*****************************************************************************/
/******** Get code of user in assignment / works for expanded folders ********/
/*****************************************************************************/
static long Brw_GetWorksUsrCodForClipboard ( void )
{
switch ( Brw_FileBrowserForDB_clipboard [ Gbl . FileBrowser . Type ] )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2015-01-24 19:30:44 +01:00
return Gbl . Usrs . Other . UsrDat . UsrCod ;
default :
return - 1L ;
}
}
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/***** Insert folders until specified folder to table of expanded folders ****/
/***** and update click time of the other folders in the expl. tree ****/
/*****************************************************************************/
// Important: parameter Path must end in a folder, not in a file
static void Brw_InsFoldersInPathAndUpdOtherFoldersInExpandedFolders ( const char * Path )
{
char * Ptr ;
char CopyOfPath [ PATH_MAX + 1 ] ;
/* Example:
Path = root_folder / folder1 / folder2 / folder3
1. Try to insert CopyOfPath = " root_folder/folder1/folder2/folder3 "
2. Try to insert CopyOfPath = " root_folder/folder1/folder2 "
3. Try to insert CopyOfPath = " root_folder/folder1 "
Only insert paths with ' / ' , so " root_folder " is not inserted
*/
// if (strcmp (Path,Brw_RootFolderInternalNames[Gbl.FileBrowser.Type])) // Don't insert root folder
/***** Make a copy to keep Path unchanged *****/
strcpy ( CopyOfPath , Path ) ;
/***** Insert paths in table of expanded folders if they are not yet there *****/
do
{
if ( ( Ptr = strrchr ( CopyOfPath , ' / ' ) ) ) // If '/' found (backwards from the end)
{
if ( ! Brw_GetIfExpandedTree ( CopyOfPath ) )
Brw_InsertFolderInExpandedFolders ( CopyOfPath ) ;
// Now Ptr points to the last '/' in SubPath
* Ptr = ' \0 ' ; // Substitute '/' for '\0' to shorten CopyOfPath
}
}
while ( Ptr ) ;
/***** Update paths of the current file browser in table of expanded folders *****/
Brw_UpdateClickTimeOfThisFileBrowserInExpandedFolders ( ) ;
}
/*****************************************************************************/
/******* Remove specified folder from table of expanded folders ********/
/******* and update click time of the other folders in the expl. tree ********/
/*****************************************************************************/
static void Brw_RemThisFolderAndUpdOtherFoldersFromExpandedFolders ( const char * Path )
{
/***** Remove Path from expanded folders table *****/
Brw_RemoveFolderFromExpandedFolders ( Path ) ;
/***** Update paths of the current file browser in table of expanded folders *****/
Brw_UpdateClickTimeOfThisFileBrowserInExpandedFolders ( ) ;
}
/*****************************************************************************/
/************************* Insert path in expanded folders *******************/
/*****************************************************************************/
static void Brw_InsertFolderInExpandedFolders ( const char * Path )
{
2015-01-24 19:30:44 +01:00
long Cod = Brw_GetCodForExpandedFolders ( ) ;
long WorksUsrCod = Brw_GetWorksUsrCodForExpandedFolders ( ) ;
2014-12-01 23:55:08 +01:00
char Query [ 512 + PATH_MAX ] ;
2015-01-20 18:55:59 +01:00
2015-01-24 19:30:44 +01:00
/***** Update path time in table of expanded folders *****/
2014-12-01 23:55:08 +01:00
// Path must be stored with final '/'
2015-01-24 19:30:44 +01:00
sprintf ( Query , " INSERT INTO expanded_folders "
" (UsrCod,FileBrowser,Cod,WorksUsrCod,Path,ClickTime) "
" VALUES ('%ld','%u','%ld','%ld','%s/',NOW()) " ,
2014-12-01 23:55:08 +01:00
Gbl . Usrs . Me . UsrDat . UsrCod ,
2015-01-24 19:30:44 +01:00
( unsigned ) Brw_FileBrowserForDB_expanded_folders [ Gbl . FileBrowser . Type ] ,
Cod , WorksUsrCod ,
2014-12-01 23:55:08 +01:00
Path ) ;
DB_QueryINSERT ( Query , " can not expand the content of a folder " ) ;
}
/*****************************************************************************/
/******* Update paths of the current file browser in expanded folders ********/
/*****************************************************************************/
static void Brw_UpdateClickTimeOfThisFileBrowserInExpandedFolders ( void )
{
2015-01-24 19:30:44 +01:00
long Cod = Brw_GetCodForExpandedFolders ( ) ;
long WorksUsrCod = Brw_GetWorksUsrCodForExpandedFolders ( ) ;
char Query [ 512 ] ;
Brw_FileBrowser_t FileBrowserForExpandedFolders = Brw_FileBrowserForDB_expanded_folders [ Gbl . FileBrowser . Type ] ;
/***** Update click time in table of expanded folders *****/
if ( Cod > 0 )
{
if ( WorksUsrCod > 0 )
sprintf ( Query , " UPDATE expanded_folders SET ClickTime=NOW() "
" WHERE UsrCod='%ld' AND FileBrowser='%u' "
" AND Cod='%ld' AND WorksUsrCod='%ld' " ,
Gbl . Usrs . Me . UsrDat . UsrCod ,
( unsigned ) FileBrowserForExpandedFolders ,
Cod ,
WorksUsrCod ) ;
else
sprintf ( Query , " UPDATE expanded_folders SET ClickTime=NOW() "
" WHERE UsrCod='%ld' AND FileBrowser='%u' "
" AND Cod='%ld' " ,
Gbl . Usrs . Me . UsrDat . UsrCod ,
( unsigned ) FileBrowserForExpandedFolders ,
Cod ) ;
}
else // Briefcase
sprintf ( Query , " UPDATE expanded_folders SET ClickTime=NOW() "
" WHERE UsrCod='%ld' AND FileBrowser='%u' " ,
Gbl . Usrs . Me . UsrDat . UsrCod ,
( unsigned ) FileBrowserForExpandedFolders ) ;
2014-12-01 23:55:08 +01:00
DB_QueryUPDATE ( Query , " can not update expanded folder " ) ;
}
/*****************************************************************************/
/********************** Remove path from expanded folders ********************/
/*****************************************************************************/
static void Brw_RemoveFolderFromExpandedFolders ( const char * Path )
{
2015-01-24 19:30:44 +01:00
long Cod = Brw_GetCodForExpandedFolders ( ) ;
long WorksUsrCod = Brw_GetWorksUsrCodForExpandedFolders ( ) ;
2014-12-01 23:55:08 +01:00
char Query [ 512 + PATH_MAX ] ;
2015-01-24 19:30:44 +01:00
Brw_FileBrowser_t FileBrowserForExpandedFolders = Brw_FileBrowserForDB_expanded_folders [ Gbl . FileBrowser . Type ] ;
2014-12-01 23:55:08 +01:00
2015-01-24 19:30:44 +01:00
/***** Remove expanded folders associated to a file browser *****/
if ( Cod > 0 )
2014-12-01 23:55:08 +01:00
{
2015-01-24 19:30:44 +01:00
if ( WorksUsrCod > 0 )
2015-01-20 18:55:59 +01:00
sprintf ( Query , " DELETE FROM expanded_folders "
" WHERE UsrCod='%ld' AND FileBrowser='%u' "
2015-01-24 19:30:44 +01:00
" AND Cod='%ld' AND WorksUsrCod='%ld' AND Path='%s/' " ,
Gbl . Usrs . Me . UsrDat . UsrCod , ( unsigned ) FileBrowserForExpandedFolders ,
Cod , WorksUsrCod , Path ) ;
else
2015-01-20 18:55:59 +01:00
sprintf ( Query , " DELETE FROM expanded_folders "
" WHERE UsrCod='%ld' AND FileBrowser='%u' "
2015-01-24 19:30:44 +01:00
" AND Cod='%ld' AND Path='%s/' " ,
2015-01-20 18:55:59 +01:00
Gbl . Usrs . Me . UsrDat . UsrCod ,
( unsigned ) FileBrowserForExpandedFolders ,
2015-01-24 19:30:44 +01:00
Cod , Path ) ;
}
else // Briefcase
sprintf ( Query , " DELETE FROM expanded_folders "
" WHERE UsrCod='%ld' AND FileBrowser='%u' "
" AND Path='%s/' " ,
Gbl . Usrs . Me . UsrDat . UsrCod , ( unsigned ) FileBrowserForExpandedFolders ,
Path ) ;
DB_QueryDELETE ( Query , " can not contract the content of a folder " ) ;
}
/*****************************************************************************/
/***** Remove expanded folders with paths from a course or from a user *******/
/*****************************************************************************/
static void Brw_RemoveAffectedExpandedFolders ( const char * Path )
{
long Cod = Brw_GetCodForExpandedFolders ( ) ;
long WorksUsrCod = Brw_GetWorksUsrCodForExpandedFolders ( ) ;
char Query [ 512 + PATH_MAX ] ;
Brw_FileBrowser_t FileBrowserForExpandedFolders = Brw_FileBrowserForDB_expanded_folders [ Gbl . FileBrowser . Type ] ;
/***** Remove expanded folders associated to a file browser from a course or from a user *****/
if ( Cod > 0 )
{
if ( WorksUsrCod > 0 )
2014-12-01 23:55:08 +01:00
sprintf ( Query , " DELETE FROM expanded_folders "
" WHERE UsrCod='%ld' AND FileBrowser='%u' "
2015-01-24 19:30:44 +01:00
" AND Cod='%ld' AND WorksUsrCod='%ld' AND Path LIKE '%s/%%' " ,
Gbl . Usrs . Me . UsrDat . UsrCod , ( unsigned ) FileBrowserForExpandedFolders ,
Cod , WorksUsrCod , Path ) ;
else
2014-12-01 23:55:08 +01:00
sprintf ( Query , " DELETE FROM expanded_folders "
" WHERE UsrCod='%ld' AND FileBrowser='%u' "
2015-01-24 19:30:44 +01:00
" AND Cod='%ld' AND Path LIKE '%s/%%' " ,
2014-12-01 23:55:08 +01:00
Gbl . Usrs . Me . UsrDat . UsrCod ,
( unsigned ) FileBrowserForExpandedFolders ,
2015-01-24 19:30:44 +01:00
Cod , Path ) ;
}
else // Briefcase
2014-12-01 23:55:08 +01:00
sprintf ( Query , " DELETE FROM expanded_folders "
" WHERE UsrCod='%ld' AND FileBrowser='%u' "
2015-01-24 19:30:44 +01:00
" AND Path LIKE '%s/%%' " ,
2014-12-01 23:55:08 +01:00
Gbl . Usrs . Me . UsrDat . UsrCod , ( unsigned ) FileBrowserForExpandedFolders ,
Path ) ;
2015-01-24 19:30:44 +01:00
DB_QueryDELETE ( Query , " can not remove expanded folders " ) ;
}
/*****************************************************************************/
/***** Remove expanded folders with paths from a course or from a user *******/
/*****************************************************************************/
2015-01-26 12:39:48 +01:00
static void Brw_RenameAffectedExpandedFolders ( Brw_FileBrowser_t FileBrowser ,
long MyUsrCod , long WorksUsrCod ,
const char * OldPath , const char * NewPath )
2015-01-24 19:30:44 +01:00
{
long Cod = Brw_GetCodForExpandedFolders ( ) ;
char Query [ 512 + PATH_MAX * 2 ] ;
Brw_FileBrowser_t FileBrowserForExpandedFolders = Brw_FileBrowserForDB_expanded_folders [ FileBrowser ] ;
unsigned StartFinalSubpathNotChanged = strlen ( OldPath ) + 2 ;
/***** Update expanded folders associated to a file browser from a course or from a user *****/
if ( Cod > 0 )
{
if ( MyUsrCod > 0 )
{
if ( WorksUsrCod > 0 )
sprintf ( Query , " UPDATE expanded_folders SET Path=CONCAT('%s','/',SUBSTRING(Path,%u)) "
" WHERE UsrCod='%ld' AND FileBrowser='%u' "
" AND Cod='%ld' AND WorksUsrCod='%ld' "
" AND Path LIKE '%s/%%' " ,
NewPath , StartFinalSubpathNotChanged ,
MyUsrCod , ( unsigned ) FileBrowserForExpandedFolders ,
Cod , WorksUsrCod ,
OldPath ) ;
else
sprintf ( Query , " UPDATE expanded_folders SET Path=CONCAT('%s','/',SUBSTRING(Path,%u)) "
" WHERE UsrCod='%ld' AND FileBrowser='%u' "
" AND Cod='%ld' "
" AND Path LIKE '%s/%%' " ,
NewPath , StartFinalSubpathNotChanged ,
MyUsrCod , ( unsigned ) FileBrowserForExpandedFolders ,
Cod ,
OldPath ) ;
}
else // MyUsrCod <= 0 means expanded folders for any user
{
if ( WorksUsrCod > 0 )
sprintf ( Query , " UPDATE expanded_folders SET Path=CONCAT('%s','/',SUBSTRING(Path,%u)) "
" WHERE FileBrowser='%u' AND Cod='%ld' "
" AND WorksUsrCod='%ld' "
" AND Path LIKE '%s/%%' " ,
NewPath , StartFinalSubpathNotChanged ,
( unsigned ) FileBrowserForExpandedFolders , Cod ,
WorksUsrCod ,
OldPath ) ;
else
sprintf ( Query , " UPDATE expanded_folders SET Path=CONCAT('%s','/',SUBSTRING(Path,%u)) "
" WHERE FileBrowser='%u' AND Cod='%ld' "
" AND Path LIKE '%s/%%' " ,
NewPath , StartFinalSubpathNotChanged ,
( unsigned ) FileBrowserForExpandedFolders , Cod ,
OldPath ) ;
}
2014-12-01 23:55:08 +01:00
}
2015-01-24 19:30:44 +01:00
else // Briefcase
sprintf ( Query , " UPDATE expanded_folders SET Path=CONCAT('%s','/',SUBSTRING(Path,%u)) "
" WHERE UsrCod='%ld' AND FileBrowser='%u' "
" AND Path LIKE '%s/%%' " ,
NewPath , StartFinalSubpathNotChanged ,
MyUsrCod ,
( unsigned ) FileBrowserForExpandedFolders ,
OldPath ) ;
DB_QueryUPDATE ( Query , " can not update expanded folders " ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
2015-01-24 19:30:44 +01:00
/************* Check if a folder from a file browser is expanded *************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2015-01-24 19:30:44 +01:00
static bool Brw_GetIfExpandedTree ( const char * Path )
2014-12-01 23:55:08 +01:00
{
2015-01-24 19:30:44 +01:00
long Cod = Brw_GetCodForExpandedFolders ( ) ;
long WorksUsrCod = Brw_GetWorksUsrCodForExpandedFolders ( ) ;
char Query [ 512 + PATH_MAX ] ;
Brw_FileBrowser_t FileBrowserForExpandedFolders = Brw_FileBrowserForDB_expanded_folders [ Gbl . FileBrowser . Type ] ;
2014-12-01 23:55:08 +01:00
2015-01-24 19:30:44 +01:00
/***** Get if a folder is expanded from database *****/
if ( Cod > 0 )
{
if ( WorksUsrCod > 0 )
sprintf ( Query , " SELECT COUNT(*) FROM expanded_folders "
" WHERE UsrCod='%ld' AND FileBrowser='%u' "
" AND Cod='%ld' AND WorksUsrCod='%ld' "
" AND Path='%s/' " ,
Gbl . Usrs . Me . UsrDat . UsrCod ,
( unsigned ) FileBrowserForExpandedFolders ,
Cod , WorksUsrCod ,
Path ) ;
else
sprintf ( Query , " SELECT COUNT(*) FROM expanded_folders "
" WHERE UsrCod='%ld' AND FileBrowser='%u' "
" AND Cod='%ld' "
" AND Path='%s/' " ,
Gbl . Usrs . Me . UsrDat . UsrCod ,
( unsigned ) FileBrowserForExpandedFolders ,
Cod ,
Path ) ;
}
else // Briefcase
sprintf ( Query , " SELECT COUNT(*) FROM expanded_folders "
" WHERE UsrCod='%ld' AND FileBrowser='%u' "
" AND Path='%s/' " ,
Gbl . Usrs . Me . UsrDat . UsrCod ,
( unsigned ) FileBrowserForExpandedFolders ,
Path ) ;
return ( DB_QueryCOUNT ( Query , " can not get check if a folder is expanded " ) ! = 0 ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
2015-01-24 19:30:44 +01:00
/**** Get code of institution, degree, course, group for expanded folders ****/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2015-01-24 19:30:44 +01:00
static long Brw_GetCodForExpandedFolders ( void )
2014-12-01 23:55:08 +01:00
{
2015-01-24 19:30:44 +01:00
switch ( Brw_FileBrowserForDB_expanded_folders [ Gbl . FileBrowser . Type ] )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_INS :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_INS :
2015-01-24 19:30:44 +01:00
return Gbl . CurrentIns . Ins . InsCod ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CTR :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_CTR :
2015-01-24 19:30:44 +01:00
return Gbl . CurrentCtr . Ctr . CtrCod ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_DEG :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_DEG :
2015-01-24 19:30:44 +01:00
return Gbl . CurrentDeg . Deg . DegCod ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_ASSIG_USR :
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_USR :
case Brw_ADMI_WORKS_CRS :
case Brw_ADMI_MARKS_CRS :
2015-01-24 19:30:44 +01:00
return Gbl . CurrentCrs . Crs . CrsCod ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2015-01-24 19:30:44 +01:00
return Gbl . CurrentCrs . Grps . GrpCod ;
default :
return - 1L ;
}
}
2014-12-01 23:55:08 +01:00
2015-01-24 19:30:44 +01:00
/*****************************************************************************/
/******** Get code of user in assignment / works for expanded folders ********/
/*****************************************************************************/
static long Brw_GetWorksUsrCodForExpandedFolders ( void )
{
switch ( Brw_FileBrowserForDB_expanded_folders [ Gbl . FileBrowser . Type ] )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2015-01-24 19:30:44 +01:00
return Gbl . Usrs . Other . UsrDat . UsrCod ;
default :
return - 1L ;
}
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
2015-01-24 19:30:44 +01:00
/************* Remove expired expanded folders (from all users) **************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2015-01-24 19:30:44 +01:00
void Brw_RemoveExpiredExpandedFolders ( void )
2014-12-01 23:55:08 +01:00
{
char Query [ 512 ] ;
/***** Remove all expired clipboards *****/
2015-01-24 19:30:44 +01:00
sprintf ( Query , " DELETE LOW_PRIORITY FROM expanded_folders "
2015-11-11 03:00:22 +01:00
" WHERE ClickTime<FROM_UNIXTIME(UNIX_TIMESTAMP()-'%lu') " ,
2015-01-24 19:30:44 +01:00
Cfg_TIME_TO_DELETE_BROWSER_EXPANDED_FOLDERS ) ;
DB_QueryDELETE ( Query , " can not remove old expanded folders " ) ;
2014-12-01 23:55:08 +01:00
}
2015-01-24 19:30:44 +01:00
/*****************************************************************************/
/****************** Remove expired clipboards (from all users) ***************/
/*****************************************************************************/
static void Brw_RemoveExpiredClipboards ( void )
2014-12-01 23:55:08 +01:00
{
char Query [ 512 ] ;
/***** Remove all expired clipboards *****/
2015-01-24 19:30:44 +01:00
sprintf ( Query , " DELETE LOW_PRIORITY FROM clipboard "
2015-11-11 03:00:22 +01:00
" WHERE CopyTime<FROM_UNIXTIME(UNIX_TIMESTAMP()-'%lu') " ,
2015-01-24 19:30:44 +01:00
Cfg_TIME_TO_DELETE_BROWSER_CLIPBOARD ) ;
DB_QueryDELETE ( Query , " can not remove old paths from clipboard " ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/********* Remove clipboards with paths from a course or from a user *********/
/*****************************************************************************/
static void Brw_RemoveAffectedClipboards ( Brw_FileBrowser_t FileBrowser , long MyUsrCod , long WorksUsrCod )
{
char Query [ 512 ] ;
/***** Remove clipboards associated to a file browser
from a course or from a user * * * * */
switch ( FileBrowser )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_INS :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_INS :
2015-01-20 02:00:42 +01:00
sprintf ( Query , " DELETE FROM clipboard "
2015-01-24 19:30:44 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' " ,
2015-01-20 02:00:42 +01:00
( unsigned ) FileBrowser , Gbl . CurrentIns . Ins . InsCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CTR :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_CTR :
2015-01-20 02:00:42 +01:00
sprintf ( Query , " DELETE FROM clipboard "
2015-01-24 19:30:44 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' " ,
2015-01-20 02:00:42 +01:00
( unsigned ) FileBrowser , Gbl . CurrentCtr . Ctr . CtrCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_DEG :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_DEG :
2015-01-20 02:00:42 +01:00
sprintf ( Query , " DELETE FROM clipboard "
2015-01-24 19:30:44 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' " ,
2015-01-20 02:00:42 +01:00
( unsigned ) FileBrowser , Gbl . CurrentDeg . Deg . DegCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_MARKS_CRS :
2014-12-01 23:55:08 +01:00
sprintf ( Query , " DELETE FROM clipboard "
2015-01-24 19:30:44 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' " ,
2014-12-01 23:55:08 +01:00
( unsigned ) FileBrowser , Gbl . CurrentCrs . Crs . CrsCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
sprintf ( Query , " DELETE FROM clipboard "
2015-01-24 19:30:44 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' " ,
( unsigned ) FileBrowser , Gbl . CurrentCrs . Grps . GrpCod ) ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_USR :
case Brw_ADMI_WORKS_USR :
2014-12-01 23:55:08 +01:00
sprintf ( Query , " DELETE FROM clipboard "
2015-01-24 19:30:44 +01:00
" WHERE UsrCod='%ld' AND FileBrowser='%u' AND Cod='%ld' " ,
2014-12-01 23:55:08 +01:00
MyUsrCod , ( unsigned ) FileBrowser , Gbl . CurrentCrs . Crs . CrsCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
sprintf ( Query , " DELETE FROM clipboard "
2015-01-24 19:30:44 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' AND WorksUsrCod='%ld' " ,
2014-12-01 23:55:08 +01:00
( unsigned ) FileBrowser , Gbl . CurrentCrs . Crs . CrsCod , WorksUsrCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_BRIEF_USR :
2014-12-01 23:55:08 +01:00
sprintf ( Query , " DELETE FROM clipboard "
" WHERE UsrCod='%ld' AND FileBrowser='%u' " ,
MyUsrCod , ( unsigned ) FileBrowser ) ;
break ;
default :
break ;
}
DB_QueryDELETE ( Query , " can not remove source of copy " ) ;
}
/*****************************************************************************/
/**** Paste the arch/carp indicado in the portapapelesde in file browser *****/
/*****************************************************************************/
void Brw_PasteIntoFileBrowser ( void )
{
extern const char * Txt_Nothing_has_been_pasted_because_the_clipboard_is_empty_ ;
struct GroupData GrpDat ;
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
if ( Brw_GetMyClipboard ( ) )
{
2015-01-24 19:30:44 +01:00
switch ( Gbl . FileBrowser . Clipboard . FileBrowser )
2014-12-01 23:55:08 +01:00
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP : // Clipboard in a group zone
2015-01-24 19:30:44 +01:00
GrpDat . GrpCod = Gbl . FileBrowser . Clipboard . Cod ;
Brw_GetSelectedGroupData ( & GrpDat , true ) ;
break ;
default :
break ;
2014-12-01 23:55:08 +01:00
}
/***** Write the origin of the copy *****/
Brw_WriteCurrentClipboard ( ) ;
/***** Copy files recursively *****/
Brw_PasteClipboard ( ) ;
/***** Remove the affected clipboards *****/
Brw_RemoveAffectedClipboards ( Gbl . FileBrowser . Type , Gbl . Usrs . Me . UsrDat . UsrCod , Gbl . Usrs . Other . UsrDat . UsrCod ) ;
}
else
/***** Write message ******/
Lay_ShowAlert ( Lay_WARNING , Txt_Nothing_has_been_pasted_because_the_clipboard_is_empty_ ) ;
/***** Show again file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/****** Paste all the content of the clipboard in the current location *******/
/*****************************************************************************/
// Source:
// Type of file browser: Gbl.FileBrowser.Clipboard.FileBrowser
2015-01-20 02:00:42 +01:00
// Possible institution: Gbl.FileBrowser.Clipboard.InsCod
// Possible centre: Gbl.FileBrowser.Clipboard.CtrCod
// Possible degree: Gbl.FileBrowser.Clipboard.DegCod
2014-12-01 23:55:08 +01:00
// Possible course: Gbl.FileBrowser.Clipboard.CrsCod
// Possible student in works: Gbl.FileBrowser.Clipboard.WorksUsrCod
// Path (file or folder): Gbl.FileBrowser.Clipboard.Path
// Destination:
// Type of file browser: Gbl.FileBrowser.Type
2015-01-20 02:00:42 +01:00
// Possible institution: Gbl.CurrentIns.Ins.InsCod
// Possible centre: Gbl.CurrentCtr.Ctr.CtrCod
// Possible degree: Gbl.CurrentDeg.Deg.DegCod
2014-12-01 23:55:08 +01:00
// Possible course: Gbl.CurrentCrs.Crs.CrsCod
// Possible student in works: Gbl.Usrs.Other.UsrDat.UsrCod
// Path (should be a folder): Gbl.FileBrowser.Priv.FullPathInTree
// Returns the number of files pasted
static void Brw_PasteClipboard ( void )
{
extern const char * Txt_The_copy_has_been_successful ;
extern const char * Txt_Files_copied ;
extern const char * Txt_Links_copied ;
2015-12-21 14:20:01 +01:00
extern const char * Txt_Folders_copied ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_You_can_not_paste_file_or_folder_here ;
2015-01-20 02:00:42 +01:00
struct Institution Ins ;
struct Centre Ctr ;
struct Degree Deg ;
2014-12-01 23:55:08 +01:00
struct Course Crs ;
2015-01-24 19:30:44 +01:00
struct GroupData GrpDat ;
2014-12-01 23:55:08 +01:00
char PathOrg [ PATH_MAX + 1 ] ;
2015-12-21 14:20:01 +01:00
struct Brw_NumObjects Pasted ;
2014-12-01 23:55:08 +01:00
long FirstFilCod = - 1L ; // First file code of the first file or link pasted. Important: initialize here to -1L
struct FileMetadata FileMetadata ;
unsigned NumUsrsToBeNotifiedByEMail ;
2015-12-21 14:20:01 +01:00
Pasted . NumFiles =
Pasted . NumLinks =
Pasted . NumFolds = 0 ;
2014-12-01 23:55:08 +01:00
Gbl . FileBrowser . Clipboard . IsThisTree = Brw_CheckIfClipboardIsInThisTree ( ) ;
if ( Brw_CheckIfCanPasteIn ( Gbl . FileBrowser . Level ) )
{
/***** Construct the relative path of the origin file or folder *****/
switch ( Gbl . FileBrowser . Clipboard . FileBrowser )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_INS :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_INS :
2015-01-24 19:30:44 +01:00
Ins . InsCod = Gbl . FileBrowser . Clipboard . Cod ;
2015-01-20 02:00:42 +01:00
if ( Ins_GetDataOfInstitutionByCod ( & Ins , false ) )
2015-01-24 19:30:44 +01:00
sprintf ( PathOrg , " %s/%s/%02u/%u/%s " ,
2015-01-20 02:00:42 +01:00
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_INS ,
( unsigned ) ( Ins . InsCod % 100 ) ,
2015-01-24 19:30:44 +01:00
( unsigned ) Ins . InsCod ,
Gbl . FileBrowser . Clipboard . Path ) ;
2015-01-20 02:00:42 +01:00
else
Lay_ShowErrorAndExit ( " The institution of copy source does not exist. " ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CTR :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_CTR :
2015-01-24 19:30:44 +01:00
Ctr . CtrCod = Gbl . FileBrowser . Clipboard . Cod ;
2015-01-20 02:00:42 +01:00
if ( Ctr_GetDataOfCentreByCod ( & Ctr ) )
2015-01-24 19:30:44 +01:00
sprintf ( PathOrg , " %s/%s/%02u/%u/%s " ,
2015-01-20 02:00:42 +01:00
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_CTR ,
( unsigned ) ( Ctr . CtrCod % 100 ) ,
2015-01-24 19:30:44 +01:00
( unsigned ) Ctr . CtrCod ,
Gbl . FileBrowser . Clipboard . Path ) ;
2015-01-20 02:00:42 +01:00
else
Lay_ShowErrorAndExit ( " The centre of copy source does not exist. " ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_DEG :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_DEG :
2015-01-24 19:30:44 +01:00
Deg . DegCod = Gbl . FileBrowser . Clipboard . Cod ;
2015-01-20 02:00:42 +01:00
if ( Deg_GetDataOfDegreeByCod ( & Deg ) )
2015-01-24 19:30:44 +01:00
sprintf ( PathOrg , " %s/%s/%02u/%u/%s " ,
2015-01-20 02:00:42 +01:00
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_DEG ,
( unsigned ) ( Deg . DegCod % 100 ) ,
2015-01-24 19:30:44 +01:00
( unsigned ) Deg . DegCod ,
Gbl . FileBrowser . Clipboard . Path ) ;
2015-01-20 02:00:42 +01:00
else
Lay_ShowErrorAndExit ( " The degree of copy source does not exist. " ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_MARKS_CRS :
2015-01-24 19:30:44 +01:00
Crs . CrsCod = Gbl . FileBrowser . Clipboard . Cod ;
2014-12-01 23:55:08 +01:00
if ( Crs_GetDataOfCourseByCod ( & Crs ) )
2015-01-24 19:30:44 +01:00
sprintf ( PathOrg , " %s/%s/%ld/%s " ,
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_CRS , Crs . CrsCod ,
Gbl . FileBrowser . Clipboard . Path ) ;
2014-12-01 23:55:08 +01:00
else
Lay_ShowErrorAndExit ( " The course of copy source does not exist. " ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2015-01-24 19:30:44 +01:00
GrpDat . GrpCod = Gbl . FileBrowser . Clipboard . Cod ;
Grp_GetDataOfGroupByCod ( & GrpDat ) ;
Crs . CrsCod = GrpDat . CrsCod ;
if ( Crs_GetDataOfCourseByCod ( & Crs ) )
sprintf ( PathOrg , " %s/%s/%ld/grp/%ld/%s " ,
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_CRS , Crs . CrsCod ,
Gbl . FileBrowser . Clipboard . Cod ,
Gbl . FileBrowser . Clipboard . Path ) ;
else
Lay_ShowErrorAndExit ( " The course of copy source does not exist. " ) ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_USR :
case Brw_ADMI_WORKS_USR :
2015-01-24 19:30:44 +01:00
Crs . CrsCod = Gbl . FileBrowser . Clipboard . Cod ;
if ( Crs_GetDataOfCourseByCod ( & Crs ) )
sprintf ( PathOrg , " %s/%s/%ld/usr/%02u/%ld/%s " ,
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_CRS , Crs . CrsCod ,
( unsigned ) ( Gbl . Usrs . Me . UsrDat . UsrCod % 100 ) ,
Gbl . Usrs . Me . UsrDat . UsrCod ,
Gbl . FileBrowser . Clipboard . Path ) ;
else
Lay_ShowErrorAndExit ( " The course of copy source does not exist. " ) ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2015-01-24 19:30:44 +01:00
Crs . CrsCod = Gbl . FileBrowser . Clipboard . Cod ;
if ( Crs_GetDataOfCourseByCod ( & Crs ) )
sprintf ( PathOrg , " %s/%s/%ld/usr/%02u/%ld/%s " ,
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_CRS , Crs . CrsCod ,
( unsigned ) ( Gbl . FileBrowser . Clipboard . WorksUsrCod % 100 ) ,
Gbl . FileBrowser . Clipboard . WorksUsrCod ,
Gbl . FileBrowser . Clipboard . Path ) ;
else
Lay_ShowErrorAndExit ( " The course of copy source does not exist. " ) ;
break ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_BRIEF_USR :
2014-12-01 23:55:08 +01:00
sprintf ( PathOrg , " %s/%s " ,
Gbl . Usrs . Me . PathDir ,
Gbl . FileBrowser . Clipboard . Path ) ;
break ;
default :
break ;
}
/***** Paste tree (path in clipboard) into folder *****/
Brw_CalcSizeOfDir ( Gbl . FileBrowser . Priv . PathRootFolder ) ;
Brw_SetMaxQuota ( ) ;
if ( Brw_PasteTreeIntoFolder ( PathOrg , Gbl . FileBrowser . Priv . FullPathInTree ,
2015-12-21 14:20:01 +01:00
& Pasted ,
2014-12-01 23:55:08 +01:00
& FirstFilCod ) )
{
/***** Write message of success *****/
sprintf ( Gbl . Message , " %s<br /> "
" %s: %u<br /> "
" %s: %u<br /> "
" %s: %u " ,
Txt_The_copy_has_been_successful ,
2015-12-21 14:20:01 +01:00
Txt_Files_copied , Pasted . NumFiles ,
Txt_Links_copied , Pasted . NumLinks ,
Txt_Folders_copied , Pasted . NumFolds ) ;
2014-12-01 23:55:08 +01:00
Lay_ShowAlert ( Lay_SUCCESS , Gbl . Message ) ;
/***** Notify new files *****/
2015-12-21 14:20:01 +01:00
if ( Pasted . NumFiles | |
Pasted . NumLinks )
2014-12-01 23:55:08 +01:00
{
FileMetadata . FilCod = FirstFilCod ;
Brw_GetFileMetadataByCod ( & FileMetadata ) ;
/* Notify only is destination folder is visible */
if ( ! Brw_CheckIfFileOrFolderIsHidden ( & FileMetadata ) )
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS :
case Brw_ADMI_DOCUM_GRP :
2014-12-01 23:55:08 +01:00
NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs ( Ntf_EVENT_DOCUMENT_FILE , FirstFilCod ) ;
Ntf_ShowAlertNumUsrsToBeNotifiedByEMail ( NumUsrsToBeNotifiedByEMail ) ;
break ;
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
case Brw_ADMI_TEACH_GRP :
NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs ( Ntf_EVENT_TEACHERS_FILE , FirstFilCod ) ;
Ntf_ShowAlertNumUsrsToBeNotifiedByEMail ( NumUsrsToBeNotifiedByEMail ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_SHARE_GRP :
2014-12-01 23:55:08 +01:00
NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs ( Ntf_EVENT_SHARED_FILE , FirstFilCod ) ;
Ntf_ShowAlertNumUsrsToBeNotifiedByEMail ( NumUsrsToBeNotifiedByEMail ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_MARKS_CRS :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs ( Ntf_EVENT_MARKS_FILE , FirstFilCod ) ;
Ntf_ShowAlertNumUsrsToBeNotifiedByEMail ( NumUsrsToBeNotifiedByEMail ) ;
break ;
default :
break ;
}
}
}
/***** Add path where new tree is pasted to table of expanded folders *****/
Brw_InsFoldersInPathAndUpdOtherFoldersInExpandedFolders ( Gbl . FileBrowser . Priv . FullPathInTree ) ;
}
else
Lay_ShowErrorAndExit ( Txt_You_can_not_paste_file_or_folder_here ) ; // It's difficult, but not impossible that a user sees this message
}
/*****************************************************************************/
/****************** Compute number of levels in a path ***********************/
/*****************************************************************************/
static unsigned Brw_NumLevelsInPath ( const char * Path )
{
unsigned NumLevls = 0 ;
while ( * Path )
if ( * Path + + = = ' / ' )
NumLevls + + ;
return NumLevls ;
}
/*****************************************************************************/
/*********** Copy a source file o tree in the destination folder *************/
/*****************************************************************************/
// Return true if the copy has been made successfully, and false if not
static bool Brw_PasteTreeIntoFolder ( const char * PathOrg , const char * PathDstInTree ,
2015-12-21 14:20:01 +01:00
struct Brw_NumObjects * Pasted ,
2014-12-01 23:55:08 +01:00
long * FirstFilCod )
{
extern const char * Txt_The_copy_has_stopped_when_trying_to_paste_the_file_X_because_it_would_exceed_the_disk_quota ;
extern const char * Txt_The_copy_has_stopped_when_trying_to_paste_the_folder_X_because_it_would_exceed_the_disk_quota ;
extern const char * Txt_The_copy_has_stopped_when_trying_to_paste_the_link_X_because_it_would_exceed_the_disk_quota ;
extern const char * Txt_The_copy_has_stopped_when_trying_to_paste_the_file_X_because_it_would_exceed_the_maximum_allowed_number_of_levels ;
extern const char * Txt_The_copy_has_stopped_when_trying_to_paste_the_folder_X_because_it_would_exceed_the_maximum_allowed_number_of_levels ;
extern const char * Txt_The_copy_has_stopped_when_trying_to_paste_the_link_X_because_it_would_exceed_the_maximum_allowed_number_of_levels ;
extern const char * Txt_The_copy_has_stopped_when_trying_to_paste_the_file_X_because_there_is_already_an_object_with_that_name ;
extern const char * Txt_The_copy_has_stopped_when_trying_to_paste_the_link_X_because_there_is_already_an_object_with_that_name ;
extern const char * Txt_The_copy_has_stopped_when_trying_to_paste_the_file_X_because_you_can_not_paste_a_file_here_of_a_type_other_than_HTML ;
Brw_FileType_t FileType ;
char PathUntilFileNameOrg [ PATH_MAX + 1 ] ;
char FileNameOrg [ NAME_MAX + 1 ] ;
char FileNameToShow [ NAME_MAX + 1 ] ;
char PathInFolderOrg [ PATH_MAX + 1 ] ;
char PathDstInTreeWithFile [ PATH_MAX + 1 ] ;
char PathDstWithFile [ PATH_MAX + 1 ] ;
struct stat FileStatus ;
struct dirent * * FileList ;
2015-01-25 02:07:04 +01:00
bool AdminMarks ;
struct MarksProperties Marks ;
2015-12-21 13:36:39 +01:00
int NumFile ;
int NumFiles ;
2014-12-01 23:55:08 +01:00
unsigned NumLevls ;
long FilCod ; // File code of the file pasted
2015-12-21 13:36:39 +01:00
bool CopyIsGoingSuccessful = true ;
2014-12-01 23:55:08 +01:00
/***** Get the name (only the name) of the origin file or folder *****/
Str_SplitFullPathIntoPathAndFileName ( PathOrg ,
PathUntilFileNameOrg ,
FileNameOrg ) ;
/***** Is it a file or a folder? *****/
lstat ( PathOrg , & FileStatus ) ;
if ( S_ISDIR ( FileStatus . st_mode ) ) // It's a directory
FileType = Brw_IS_FOLDER ;
else if ( S_ISREG ( FileStatus . st_mode ) ) // It's a regular file
FileType = Str_FileIs ( FileNameOrg , " url " ) ? Brw_IS_LINK : // It's a link (URL inside a .url file)
Brw_IS_FILE ; // It's a file
else
FileType = Brw_IS_UNKNOWN ;
/***** Name of the file/folder/link to be shown ****/
Brw_LimitLengthFileNameToShow ( FileType , FileNameOrg , FileNameToShow ) ;
/***** Construct the name of the destination file or folder *****/
sprintf ( PathDstInTreeWithFile , " %s/%s " , PathDstInTree , FileNameOrg ) ;
/***** Construct the relative path of the destination file or folder *****/
sprintf ( PathDstWithFile , " %s/%s " , Gbl . FileBrowser . Priv . PathAboveRootFolder , PathDstInTreeWithFile ) ;
/***** Update and check number of levels *****/
// The number of levels is counted starting on the root folder ra<72> z, not included.
// Example: If PathDstInTreeWithFile is "maletin/1/2/3/4/FileNameOrg", then NumLevls=5
if ( ( NumLevls = Brw_NumLevelsInPath ( PathDstInTreeWithFile ) ) > Gbl . FileBrowser . Size . NumLevls )
Gbl . FileBrowser . Size . NumLevls = NumLevls ;
if ( Brw_CheckIfQuotaExceded ( ) )
{
switch ( FileType )
{
case Brw_IS_FILE :
sprintf ( Gbl . Message , Txt_The_copy_has_stopped_when_trying_to_paste_the_file_X_because_it_would_exceed_the_maximum_allowed_number_of_levels ,
FileNameToShow ) ;
break ;
case Brw_IS_FOLDER :
sprintf ( Gbl . Message , Txt_The_copy_has_stopped_when_trying_to_paste_the_folder_X_because_it_would_exceed_the_maximum_allowed_number_of_levels ,
FileNameToShow ) ;
break ;
case Brw_IS_LINK :
sprintf ( Gbl . Message , Txt_The_copy_has_stopped_when_trying_to_paste_the_link_X_because_it_would_exceed_the_maximum_allowed_number_of_levels ,
FileNameToShow ) ;
break ;
default :
Lay_ShowErrorAndExit ( " Can not paste unknown file type. " ) ;
}
Lay_ShowAlert ( Lay_WARNING , Gbl . Message ) ;
2015-12-21 13:36:39 +01:00
CopyIsGoingSuccessful = false ;
2014-12-01 23:55:08 +01:00
}
2015-12-21 13:36:39 +01:00
else // Quota not exceeded
2014-12-01 23:55:08 +01:00
{
2015-12-21 13:36:39 +01:00
/***** Copy file or folder *****/
if ( FileType = = Brw_IS_FILE | |
FileType = = Brw_IS_LINK ) // It's a regular file
2015-01-25 02:07:04 +01:00
{
2015-12-21 13:36:39 +01:00
/***** Check if exists the destination file */
if ( Fil_CheckIfPathExists ( PathDstWithFile ) )
{
sprintf ( Gbl . Message ,
FileType = = Brw_IS_FILE ? Txt_The_copy_has_stopped_when_trying_to_paste_the_file_X_because_there_is_already_an_object_with_that_name :
Txt_The_copy_has_stopped_when_trying_to_paste_the_link_X_because_there_is_already_an_object_with_that_name ,
FileNameToShow ) ;
Lay_ShowAlert ( Lay_WARNING , Gbl . Message ) ;
CopyIsGoingSuccessful = false ;
}
else // Destination file does not exist
{
/***** If the target file browser is that of marks, only HTML files are allowed *****/
AdminMarks = Gbl . FileBrowser . Type = = Brw_ADMI_MARKS_CRS | |
Gbl . FileBrowser . Type = = Brw_ADMI_MARKS_GRP ;
if ( AdminMarks )
{
/* Check extension of the file */
if ( Str_FileIsHTML ( FileNameOrg ) )
Mrk_CheckFileOfMarks ( PathOrg , & Marks ) ; // Gbl.Message contains feedback text
else
{
sprintf ( Gbl . Message , Txt_The_copy_has_stopped_when_trying_to_paste_the_file_X_because_you_can_not_paste_a_file_here_of_a_type_other_than_HTML ,
FileNameToShow ) ;
Lay_ShowAlert ( Lay_WARNING , Gbl . Message ) ;
CopyIsGoingSuccessful = false ;
}
}
2014-12-01 23:55:08 +01:00
2015-12-21 13:36:39 +01:00
if ( CopyIsGoingSuccessful )
{
/***** Update and check the quota before copying the file *****/
Gbl . FileBrowser . Size . NumFiles + + ;
Gbl . FileBrowser . Size . TotalSiz + = ( unsigned long long ) FileStatus . st_size ;
if ( Brw_CheckIfQuotaExceded ( ) )
{
sprintf ( Gbl . Message , FileType = = Brw_IS_FILE ? Txt_The_copy_has_stopped_when_trying_to_paste_the_file_X_because_it_would_exceed_the_disk_quota :
Txt_The_copy_has_stopped_when_trying_to_paste_the_link_X_because_it_would_exceed_the_disk_quota ,
FileNameToShow ) ;
Lay_ShowAlert ( Lay_WARNING , Gbl . Message ) ;
CopyIsGoingSuccessful = false ;
}
else // Quota not exceeded
{
/***** Quota will not be exceeded ==> copy the origin file to the destination file *****/
Fil_FastCopyOfFiles ( PathOrg , PathDstWithFile ) ;
/***** Add entry to the table of files/folders *****/
FilCod = Brw_AddPathToDB ( Gbl . Usrs . Me . UsrDat . UsrCod , FileType ,
PathDstInTreeWithFile , false , Brw_LICENSE_DEFAULT ) ;
if ( * FirstFilCod < = 0 )
* FirstFilCod = FilCod ;
/* Add a new entry of marks into database */
if ( AdminMarks )
Mrk_AddMarksToDB ( FilCod , & Marks ) ;
if ( FileType = = Brw_IS_FILE )
2015-12-21 14:20:01 +01:00
( Pasted - > NumFiles ) + + ;
2015-12-21 13:36:39 +01:00
else // FileType == Brw_IS_LINK
2015-12-21 14:20:01 +01:00
( Pasted - > NumLinks ) + + ;
2015-12-21 13:36:39 +01:00
}
}
}
}
else if ( FileType = = Brw_IS_FOLDER ) // It's a directory
{
/***** Scan the source directory *****/
if ( ( NumFiles = scandir ( PathOrg , & FileList , NULL , alphasort ) ) > = 0 ) // No error
{
/***** Create the folder in the destination *****/
if ( ! Fil_CheckIfPathExists ( PathDstWithFile ) ) // If already exists, don't overwrite
{
/* The directory does not exist ==> create it.
First , update and check the quota */
Gbl . FileBrowser . Size . NumFolds + + ;
Gbl . FileBrowser . Size . TotalSiz + = ( unsigned long long ) FileStatus . st_size ;
if ( Brw_CheckIfQuotaExceded ( ) )
{
sprintf ( Gbl . Message , Txt_The_copy_has_stopped_when_trying_to_paste_the_folder_X_because_it_would_exceed_the_disk_quota ,
FileNameToShow ) ;
Lay_ShowAlert ( Lay_WARNING , Gbl . Message ) ;
CopyIsGoingSuccessful = false ;
}
else // Quota not exceded
{
/* Create directory */
if ( mkdir ( PathDstWithFile , ( mode_t ) 0xFFF ) ! = 0 )
Lay_ShowErrorAndExit ( " Can not create folder. " ) ;
2014-12-01 23:55:08 +01:00
2015-12-21 13:36:39 +01:00
/* Add entry to the table of files/folders */
Brw_AddPathToDB ( Gbl . Usrs . Me . UsrDat . UsrCod , FileType ,
PathDstInTreeWithFile , false , Brw_LICENSE_DEFAULT ) ;
}
}
2014-12-01 23:55:08 +01:00
2015-12-21 13:36:39 +01:00
/***** Copy each of the files and folders from the origin to the destination *****/
for ( NumFile = 0 ;
NumFile < NumFiles ;
NumFile + + )
{
if ( CopyIsGoingSuccessful & &
strcmp ( FileList [ NumFile ] - > d_name , " . " ) & &
strcmp ( FileList [ NumFile ] - > d_name , " .. " ) ) // Skip directories "." and ".."
{
sprintf ( PathInFolderOrg , " %s/%s " , PathOrg , FileList [ NumFile ] - > d_name ) ;
if ( ! Brw_PasteTreeIntoFolder ( PathInFolderOrg , PathDstInTreeWithFile ,
2015-12-21 14:20:01 +01:00
Pasted ,
2015-12-21 13:36:39 +01:00
FirstFilCod ) )
CopyIsGoingSuccessful = false ;
}
free ( ( void * ) FileList [ NumFile ] ) ;
}
free ( ( void * ) FileList ) ;
2014-12-01 23:55:08 +01:00
}
2015-12-21 13:36:39 +01:00
else
Lay_ShowErrorAndExit ( " Error while scanning directory. " ) ;
2014-12-01 23:55:08 +01:00
2015-12-21 13:36:39 +01:00
if ( CopyIsGoingSuccessful )
2015-12-21 14:20:01 +01:00
( Pasted - > NumFolds ) + + ;
2015-12-21 13:36:39 +01:00
}
2014-12-01 23:55:08 +01:00
}
2015-12-21 13:36:39 +01:00
return CopyIsGoingSuccessful ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/************** Form to add a file or folder to a file browser ***************/
/*****************************************************************************/
void Brw_ShowFormFileBrowser ( void )
{
extern const char * Txt_You_can_not_create_folders_files_or_links_here ;
char FileNameToShow [ NAME_MAX + 1 ] ;
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
/***** Check if creating a new folder or file is allowed *****/
if ( Brw_CheckIfICanCreateIntoFolder ( Gbl . FileBrowser . Level ) )
{
/***** Name of the folder to be shown ****/
Brw_GetFileNameToShow ( Gbl . FileBrowser . Type , Gbl . FileBrowser . Level , Gbl . FileBrowser . FileType ,
Gbl . FileBrowser . FilFolLnkName , FileNameToShow ) ;
/***** 1. Form to create a new folder *****/
Brw_PutFormToCreateAFolder ( FileNameToShow ) ;
/***** 2. Form to send a file *****/
Brw_PutFormToUploadFilesUsingDropzone ( FileNameToShow ) ;
/***** 3. Form to send a file *****/
Brw_PutFormToUploadOneFileClassic ( FileNameToShow ) ;
/***** 4. Form to paste the content of the clipboard *****/
if ( Brw_GetMyClipboard ( ) )
{
/***** Check if we can paste in this folder *****/
Gbl . FileBrowser . Clipboard . IsThisTree = Brw_CheckIfClipboardIsInThisTree ( ) ;
if ( Brw_CheckIfCanPasteIn ( Gbl . FileBrowser . Level ) )
Brw_PutFormToPasteAFileOrFolder ( FileNameToShow ) ;
}
/***** 5. Form to create a link *****/
2015-01-26 12:39:48 +01:00
if ( Gbl . FileBrowser . Type ! = Brw_ADMI_MARKS_CRS & &
Gbl . FileBrowser . Type ! = Brw_ADMI_MARKS_GRP ) // Do not create links in marks
2014-12-01 23:55:08 +01:00
Brw_PutFormToCreateALink ( FileNameToShow ) ;
}
else
{
Lay_ShowErrorAndExit ( Txt_You_can_not_create_folders_files_or_links_here ) ; // It's difficult, but not impossible that a user sees this message
/***** Show again file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
}
/*****************************************************************************/
/************* Put form to create a new folder in a file browser *************/
/*****************************************************************************/
static void Brw_PutFormToCreateAFolder ( const char * FileNameToShow )
{
2015-07-27 21:25:45 +02:00
extern const char * The_ClassForm [ The_NUM_THEMES ] ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_Create_folder ;
extern const char * Txt_You_can_create_a_new_folder_inside_the_folder_X ;
extern const char * Txt_Folder ;
2015-04-11 23:46:21 +02:00
/***** Start form *****/
2014-12-01 23:55:08 +01:00
Act_FormStart ( Brw_ActCreateFolder [ Gbl . FileBrowser . Type ] ) ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActCreateFolder [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
2016-01-03 15:36:46 +01:00
Brw_ParamListFiles ( Brw_IS_FOLDER , Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk , Gbl . FileBrowser . FilFolLnkName ) ;
2014-12-01 23:55:08 +01:00
2015-04-11 23:46:21 +02:00
/***** Start frame *****/
2016-03-16 11:15:25 +01:00
Lay_StartRoundFrame ( NULL , Txt_Create_folder , NULL ) ;
2015-04-11 23:46:21 +02:00
sprintf ( Gbl . Message , Txt_You_can_create_a_new_folder_inside_the_folder_X ,
FileNameToShow ) ;
Lay_ShowAlert ( Lay_INFO , Gbl . Message ) ;
/***** Folder *****/
2015-04-12 18:01:06 +02:00
fprintf ( Gbl . F . Out , " <label class= \" %s \" > "
2016-03-29 01:12:43 +02:00
" %s: "
2015-04-12 18:01:06 +02:00
" </label> "
2015-04-07 21:44:24 +02:00
" <input type= \" text \" name= \" NewFolderName \" "
2015-04-12 18:01:06 +02:00
" size= \" 32 \" maxlength= \" 40 \" value= \" \" /> " ,
2015-07-27 21:25:45 +02:00
The_ClassForm [ Gbl . Prefs . Theme ] , Txt_Folder ) ;
2014-12-01 23:55:08 +01:00
2015-04-11 23:46:21 +02:00
/* Button to send and end frame *****/
2015-04-12 18:01:06 +02:00
Lay_EndRoundFrameWithButton ( Lay_CREATE_BUTTON , Txt_Create_folder ) ;
2014-12-01 23:55:08 +01:00
2015-04-11 23:46:21 +02:00
/***** End form *****/
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/*** Put form to upload several files to a file browser using Dropzone.js ****/
/*****************************************************************************/
static void Brw_PutFormToUploadFilesUsingDropzone ( const char * FileNameToShow )
{
extern const char * Txt_Upload_files ;
extern const char * Txt_or_you_can_upload_new_files_to_the_folder_X ;
extern const char * Txt_Select_one_or_more_files_from_your_computer_or_drag_and_drop_here ;
2015-12-07 23:13:08 +01:00
extern const char * Txt_STR_LANG_ID [ 1 + Txt_NUM_LANGUAGES ] ;
2016-03-18 10:32:13 +01:00
extern const char * Txt_Done ;
2014-12-01 23:55:08 +01:00
extern struct Act_Actions Act_Actions [ Act_NUM_ACTIONS ] ;
/***** Start frame *****/
fprintf ( Gbl . F . Out , " <div id= \" dropzone-upload \" > " ) ;
2016-03-16 11:15:25 +01:00
Lay_StartRoundFrame ( " 95% " , Txt_Upload_files , NULL ) ;
2015-04-11 23:46:21 +02:00
2015-04-12 18:01:06 +02:00
/***** Help message *****/
2014-12-01 23:55:08 +01:00
sprintf ( Gbl . Message , Txt_or_you_can_upload_new_files_to_the_folder_X ,
FileNameToShow ) ;
Lay_ShowAlert ( Lay_INFO , Gbl . Message ) ;
/***** Form to upload files using the library Dropzone.js *****/
2015-09-28 18:28:29 +02:00
// Use min-height:125px; or other number to stablish the height?
2016-01-14 10:31:09 +01:00
Gbl . Form . Num + + ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " <form method= \" post \" action= \" %s/%s \" "
" class= \" dropzone \" "
" enctype= \" multipart/form-data \" "
" id= \" my-awesome-dropzone \" "
2015-01-13 14:19:08 +01:00
" style= \" display:inline-block; width:100%%; "
" background:url('%s/upload320x320.gif') no-repeat center; \" > " ,
2014-12-01 23:55:08 +01:00
Cfg_HTTPS_URL_SWAD_CGI ,
Txt_STR_LANG_ID [ Gbl . Prefs . Language ] ,
Gbl . Prefs . IconsURL ) ;
2015-03-07 21:08:44 +01:00
Par_PutHiddenParamLong ( " act " , Act_Actions [ Brw_ActUploadFileDropzone [ Gbl . FileBrowser . Type ] ] . ActCod ) ;
Par_PutHiddenParamString ( " ses " , Gbl . Session . Id ) ;
2014-12-01 23:55:08 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActUploadFileDropzone [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
2016-01-03 15:36:46 +01:00
Brw_ParamListFiles ( Brw_IS_FOLDER , Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk , Gbl . FileBrowser . FilFolLnkName ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " <div class= \" dz-message \" > "
2015-04-12 18:01:06 +02:00
" <span class= \" DAT_LIGHT \" >%s</span> "
2015-03-13 14:19:18 +01:00
" </div> "
" </form> " ,
2014-12-01 23:55:08 +01:00
Txt_Select_one_or_more_files_from_your_computer_or_drag_and_drop_here ) ;
/***** Put button to refresh file browser after upload *****/
Act_FormStart ( Brw_ActRefreshAfterUploadFiles [ Gbl . FileBrowser . Type ] ) ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActRefreshAfterUploadFiles [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
if ( Gbl . FileBrowser . FullTree )
Par_PutHiddenParamChar ( " FullTree " , ' Y ' ) ;
2015-04-12 18:01:06 +02:00
/***** Button to send *****/
2016-03-18 10:32:13 +01:00
Lay_PutConfirmButton ( Txt_Done ) ;
2015-04-12 18:01:06 +02:00
/***** End form *****/
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
/***** End frame *****/
2015-04-12 18:01:06 +02:00
Lay_EndRoundFrame ( ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " </div> " ) ;
}
/*****************************************************************************/
/*** Put form to upload several files to a file browser using Dropzone.js ****/
/*****************************************************************************/
static void Brw_PutFormToUploadOneFileClassic ( const char * FileNameToShow )
{
extern const char * Txt_Upload_file ;
extern const char * Txt_or_you_can_upload_a_new_file_to_the_folder_X ;
/***** Start frame *****/
2015-04-12 18:01:06 +02:00
fprintf ( Gbl . F . Out , " <div id= \" classic-upload \" style= \" display:none; \" > " ) ;
2016-03-16 11:15:25 +01:00
Lay_StartRoundFrame ( NULL , Txt_Upload_file , NULL ) ;
2015-04-11 23:46:21 +02:00
2015-04-12 18:01:06 +02:00
/***** Help message *****/
2014-12-01 23:55:08 +01:00
sprintf ( Gbl . Message , Txt_or_you_can_upload_a_new_file_to_the_folder_X ,
FileNameToShow ) ;
Lay_ShowAlert ( Lay_INFO , Gbl . Message ) ;
/***** Form to upload one files using the classic way *****/
Act_FormStart ( Brw_ActUploadFileClassic [ Gbl . FileBrowser . Type ] ) ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActUploadFileClassic [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
2016-01-03 15:36:46 +01:00
Brw_ParamListFiles ( Brw_IS_FOLDER , Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk , Gbl . FileBrowser . FilFolLnkName ) ;
2016-04-11 15:32:59 +02:00
fprintf ( Gbl . F . Out , " <input type= \" file \" name= \" %s \" /> " ,
2014-12-01 23:55:08 +01:00
Fil_NAME_OF_PARAM_FILENAME_ORG ) ;
/* Button to send */
2015-03-24 17:47:26 +01:00
Lay_PutCreateButton ( Txt_Upload_file ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
/***** End frame *****/
2015-04-12 18:01:06 +02:00
Lay_EndRoundFrame ( ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " </div> " ) ;
}
/*****************************************************************************/
/********* Put form to paste a file or a folder into a file browser **********/
/*****************************************************************************/
static void Brw_PutFormToPasteAFileOrFolder ( const char * FileNameToShow )
{
extern const char * Txt_Paste ;
extern const char * Txt_or_you_can_make_a_file_copy_to_the_folder_X ;
2015-04-11 23:46:21 +02:00
/***** Start form *****/
2014-12-01 23:55:08 +01:00
Act_FormStart ( Brw_ActPaste [ Gbl . FileBrowser . Type ] ) ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActPaste [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
2016-01-03 15:36:46 +01:00
Brw_ParamListFiles ( Brw_IS_FOLDER , Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk , Gbl . FileBrowser . FilFolLnkName ) ;
2014-12-01 23:55:08 +01:00
2015-04-11 23:46:21 +02:00
/***** Start frame *****/
2016-03-16 11:15:25 +01:00
Lay_StartRoundFrame ( NULL , Txt_Paste , NULL ) ;
2015-04-12 18:01:06 +02:00
/***** Help message *****/
2015-04-11 23:46:21 +02:00
sprintf ( Gbl . Message , Txt_or_you_can_make_a_file_copy_to_the_folder_X ,
FileNameToShow ) ;
Lay_ShowAlert ( Lay_INFO , Gbl . Message ) ;
/***** Send button and end frame *****/
2015-04-12 18:01:06 +02:00
Lay_EndRoundFrameWithButton ( Lay_CREATE_BUTTON , Txt_Paste ) ;
2015-04-11 23:46:21 +02:00
/***** End form *****/
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/************** Put form to create a new link in a file browser **************/
/*****************************************************************************/
static void Brw_PutFormToCreateALink ( const char * FileNameToShow )
{
2015-07-27 21:25:45 +02:00
extern const char * The_ClassForm [ The_NUM_THEMES ] ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_Create_link ;
extern const char * Txt_or_you_can_create_a_new_link_inside_the_folder_X ;
extern const char * Txt_URL ;
2015-04-06 23:25:23 +02:00
extern const char * Txt_Save_as ;
2015-04-06 23:38:35 +02:00
extern const char * Txt_optional ;
2014-12-01 23:55:08 +01:00
2015-04-11 23:46:21 +02:00
/***** Start form *****/
2014-12-01 23:55:08 +01:00
Act_FormStart ( Brw_ActCreateLink [ Gbl . FileBrowser . Type ] ) ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActCreateLink [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
2016-01-03 15:36:46 +01:00
Brw_ParamListFiles ( Brw_IS_FOLDER , Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk , Gbl . FileBrowser . FilFolLnkName ) ;
2014-12-01 23:55:08 +01:00
2015-04-11 23:46:21 +02:00
/***** Start frame *****/
2016-03-16 11:15:25 +01:00
Lay_StartRoundFrame ( NULL , Txt_Create_link , NULL ) ;
2015-04-12 18:01:06 +02:00
/***** Help message *****/
2015-04-11 23:46:21 +02:00
sprintf ( Gbl . Message , Txt_or_you_can_create_a_new_link_inside_the_folder_X ,
FileNameToShow ) ;
Lay_ShowAlert ( Lay_INFO , Gbl . Message ) ;
2015-04-12 18:01:06 +02:00
/***** URL *****/
2015-04-06 23:25:23 +02:00
fprintf ( Gbl . F . Out , " <table> "
" <tr> "
2015-08-01 10:43:33 +02:00
" <td class= \" RIGHT_MIDDLE \" > "
2016-03-29 01:12:43 +02:00
" <label class= \" %s \" > "
" %s: "
" </label> "
2015-04-06 23:25:23 +02:00
" </td> "
2015-08-01 10:43:33 +02:00
" <td class= \" LEFT_MIDDLE \" > "
2015-04-06 23:25:23 +02:00
" <input type= \" text \" name= \" NewLinkURL \" "
" size= \" 40 \" maxlength= \" %u \" value= \" \" /> "
2014-12-22 21:52:37 +01:00
" </td> "
2015-04-06 23:25:23 +02:00
" </tr> " ,
2015-07-27 21:25:45 +02:00
The_ClassForm [ Gbl . Prefs . Theme ] , Txt_URL ,
2015-04-06 23:25:23 +02:00
PATH_MAX ) ;
2015-04-12 18:01:06 +02:00
/***** Link name *****/
2015-04-06 23:25:23 +02:00
fprintf ( Gbl . F . Out , " <tr> "
2015-08-01 10:43:33 +02:00
" <td class= \" RIGHT_MIDDLE \" > "
2015-07-25 20:51:17 +02:00
" <label class= \" %s \" >%s (%s): </label> "
2015-04-06 23:25:23 +02:00
" </td> "
2015-08-01 10:43:33 +02:00
" <td class= \" LEFT_MIDDLE \" > "
2015-04-06 23:25:23 +02:00
" <input type= \" text \" name= \" NewLinkName \" "
" size= \" 40 \" maxlength= \" 100 \" value= \" \" /> "
2014-12-01 23:55:08 +01:00
" </td> "
" </tr> "
2015-04-12 18:01:06 +02:00
" </table> " ,
2015-07-27 21:25:45 +02:00
The_ClassForm [ Gbl . Prefs . Theme ] , Txt_Save_as , Txt_optional ) ;
2014-12-01 23:55:08 +01:00
2015-04-11 23:46:21 +02:00
/***** Send button and end frame *****/
2015-04-12 18:01:06 +02:00
Lay_EndRoundFrameWithButton ( Lay_CREATE_BUTTON , Txt_Create_link ) ;
2014-12-01 23:55:08 +01:00
2015-04-11 23:46:21 +02:00
/***** End form *****/
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/*********** Receive the name of a new folder in a file browser **************/
/*****************************************************************************/
void Brw_RecFolderFileBrowser ( void )
{
extern const char * Txt_Can_not_create_the_folder_X_because_it_would_exceed_the_disk_quota ;
extern const char * Txt_Can_not_create_the_folder_X_because_there_is_already_a_folder_or_a_file_with_that_name ;
extern const char * Txt_The_folder_X_has_been_created_inside_the_folder_Y ;
extern const char * Txt_You_can_not_create_folders_here ;
char Path [ PATH_MAX + 1 ] ;
char PathCompleteInTreeIncludingFolder [ PATH_MAX + 1 ] ;
char FileNameToShow [ NAME_MAX + 1 ] ;
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
/***** Check if creating a new folder is allowed *****/
if ( Brw_CheckIfICanCreateIntoFolder ( Gbl . FileBrowser . Level ) )
{
if ( Str_ConvertFilFolLnkNameToValid ( Gbl . FileBrowser . NewFilFolLnkName ) )
{
/* In Gbl.FileBrowser.NewFilFolLnkName is the name of the new folder */
sprintf ( Path , " %s/%s " , Gbl . FileBrowser . Priv . PathAboveRootFolder , Gbl . FileBrowser . Priv . FullPathInTree ) ;
if ( strlen ( Path ) + 1 + strlen ( Gbl . FileBrowser . NewFilFolLnkName ) > PATH_MAX )
Lay_ShowErrorAndExit ( " Path is too long. " ) ;
strcat ( Path , " / " ) ;
strcat ( Path , Gbl . FileBrowser . NewFilFolLnkName ) ;
/* Create the new directory */
if ( mkdir ( Path , ( mode_t ) 0xFFF ) = = 0 )
{
/* Check if quota has been exceeded */
Brw_CalcSizeOfDir ( Gbl . FileBrowser . Priv . PathRootFolder ) ;
Brw_SetMaxQuota ( ) ;
if ( Brw_CheckIfQuotaExceded ( ) )
{
Brw_RemoveTree ( Path ) ;
sprintf ( Gbl . Message , Txt_Can_not_create_the_folder_X_because_it_would_exceed_the_disk_quota ,
Gbl . FileBrowser . NewFilFolLnkName ) ;
Lay_ShowAlert ( Lay_WARNING , Gbl . Message ) ;
}
else
{
/* Remove affected clipboards */
Brw_RemoveAffectedClipboards ( Gbl . FileBrowser . Type , Gbl . Usrs . Me . UsrDat . UsrCod , Gbl . Usrs . Other . UsrDat . UsrCod ) ;
/* Add path where new file is created to table of expanded folders */
Brw_InsFoldersInPathAndUpdOtherFoldersInExpandedFolders ( Gbl . FileBrowser . Priv . FullPathInTree ) ;
/* Add entry to the table of files/folders */
sprintf ( PathCompleteInTreeIncludingFolder , " %s/%s " , Gbl . FileBrowser . Priv . FullPathInTree , Gbl . FileBrowser . NewFilFolLnkName ) ;
Brw_AddPathToDB ( Gbl . Usrs . Me . UsrDat . UsrCod , Brw_IS_FOLDER ,
PathCompleteInTreeIncludingFolder , false , Brw_LICENSE_DEFAULT ) ;
/* The folder has been created sucessfully */
Brw_GetFileNameToShow ( Gbl . FileBrowser . Type , Gbl . FileBrowser . Level , Brw_IS_FOLDER ,
Gbl . FileBrowser . FilFolLnkName , FileNameToShow ) ;
sprintf ( Gbl . Message , Txt_The_folder_X_has_been_created_inside_the_folder_Y ,
Gbl . FileBrowser . NewFilFolLnkName , FileNameToShow ) ;
Lay_ShowAlert ( Lay_SUCCESS , Gbl . Message ) ;
}
}
else
{
switch ( errno )
{
case EEXIST :
sprintf ( Gbl . Message , Txt_Can_not_create_the_folder_X_because_there_is_already_a_folder_or_a_file_with_that_name ,
Gbl . FileBrowser . NewFilFolLnkName ) ;
Lay_ShowAlert ( Lay_WARNING , Gbl . Message ) ;
break ;
case EACCES :
Lay_ShowErrorAndExit ( " Write forbidden. " ) ;
break ;
default :
Lay_ShowErrorAndExit ( " Can not create folder. " ) ;
break ;
}
}
}
else // Folder name not valid
Lay_ShowAlert ( Lay_WARNING , Gbl . Message ) ;
}
else
Lay_ShowErrorAndExit ( Txt_You_can_not_create_folders_here ) ; // It's difficult, but not impossible that a user sees this message
/***** Show again the file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/**************** Rename an existing folder in a file browser ****************/
/*****************************************************************************/
void Brw_RenFolderFileBrowser ( void )
{
extern const char * Txt_The_folder_name_X_has_changed_to_Y ;
extern const char * Txt_The_folder_name_X_has_not_changed ;
extern const char * Txt_The_folder_name_X_has_not_changed_because_there_is_already_a_folder_or_a_file_with_the_name_Y ;
extern const char * Txt_You_can_not_rename_this_folder ;
char OldPathInTree [ PATH_MAX + 1 ] ;
char NewPathInTree [ PATH_MAX + 1 ] ;
char OldPath [ PATH_MAX + 1 ] ;
char NewPath [ PATH_MAX + 1 ] ;
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
if ( Brw_CheckIfICanEditFileOrFolder ( Gbl . FileBrowser . Level ) ) // Can I rename this folder?
{
if ( Str_ConvertFilFolLnkNameToValid ( Gbl . FileBrowser . NewFilFolLnkName ) )
{
if ( strcmp ( Gbl . FileBrowser . FilFolLnkName , Gbl . FileBrowser . NewFilFolLnkName ) ) // The name has changed
{
/* Gbl.FileBrowser.FilFolLnkName holds the new name of the folder */
2016-01-03 15:36:46 +01:00
sprintf ( OldPathInTree , " %s/%s " , Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk , Gbl . FileBrowser . FilFolLnkName ) ;
2014-12-01 23:55:08 +01:00
sprintf ( OldPath , " %s/%s " , Gbl . FileBrowser . Priv . PathAboveRootFolder , OldPathInTree ) ;
/* Gbl.FileBrowser.NewFilFolLnkName holds the new name of the folder */
if ( strlen ( Gbl . FileBrowser . Priv . PathAboveRootFolder ) + 1 +
2016-01-03 15:36:46 +01:00
strlen ( Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk ) + 1 +
2014-12-01 23:55:08 +01:00
strlen ( Gbl . FileBrowser . NewFilFolLnkName ) > PATH_MAX )
Lay_ShowErrorAndExit ( " Path is too long. " ) ;
2016-01-03 15:36:46 +01:00
sprintf ( NewPathInTree , " %s/%s " , Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk , Gbl . FileBrowser . NewFilFolLnkName ) ;
2014-12-01 23:55:08 +01:00
sprintf ( NewPath , " %s/%s " , Gbl . FileBrowser . Priv . PathAboveRootFolder , NewPathInTree ) ;
/* We should check here that a folder with the same name does not exist.
but we leave this work to the system */
/* Rename the directory. If a empty folder existed with the name new, overwrite it! */
2016-04-03 01:24:20 +02:00
if ( rename ( OldPath , NewPath ) ) // Fail
{
switch ( errno )
{
case ENOTEMPTY :
case EEXIST :
case ENOTDIR :
sprintf ( Gbl . Message , Txt_The_folder_name_X_has_not_changed_because_there_is_already_a_folder_or_a_file_with_the_name_Y ,
Gbl . FileBrowser . FilFolLnkName , Gbl . FileBrowser . NewFilFolLnkName ) ;
break ;
case EACCES :
Lay_ShowErrorAndExit ( " Write forbidden. " ) ;
break ;
default :
Lay_ShowErrorAndExit ( " Can not rename folder. " ) ;
break ;
}
Lay_ShowAlert ( Lay_WARNING , Gbl . Message ) ;
}
else // Success
2014-12-01 23:55:08 +01:00
{
/* If a folder is renamed,
it is necessary to rename all the entries in the tables of files
that belong to the subtree starting at that folder */
Brw_RenameOneFolderInDB ( OldPathInTree ,
NewPathInTree ) ;
Brw_RenameChildrenFilesOrFoldersInDB ( OldPathInTree ,
NewPathInTree ) ;
/* Remove affected clipboards */
Brw_RemoveAffectedClipboards ( Gbl . FileBrowser . Type ,
Gbl . Usrs . Me . UsrDat . UsrCod ,
Gbl . Usrs . Other . UsrDat . UsrCod ) ;
/* Remove affected expanded folders */
Brw_RenameAffectedExpandedFolders ( Gbl . FileBrowser . Type ,
Gbl . Usrs . Me . UsrDat . UsrCod ,
Gbl . Usrs . Other . UsrDat . UsrCod ,
OldPathInTree ,
NewPathInTree ) ;
/* Write message of confirmation */
sprintf ( Gbl . Message , Txt_The_folder_name_X_has_changed_to_Y ,
Gbl . FileBrowser . FilFolLnkName ,
Gbl . FileBrowser . NewFilFolLnkName ) ;
Lay_ShowAlert ( Lay_SUCCESS , Gbl . Message ) ;
}
2016-04-03 01:24:20 +02:00
2014-12-01 23:55:08 +01:00
}
else // Names are equal. This may happens if we have press INTRO without changing the name
{
sprintf ( Gbl . Message , Txt_The_folder_name_X_has_not_changed ,
Gbl . FileBrowser . FilFolLnkName ) ;
Lay_ShowAlert ( Lay_INFO , Gbl . Message ) ;
}
}
else // Folder name not valid
Lay_ShowAlert ( Lay_WARNING , Gbl . Message ) ;
}
else
Lay_ShowErrorAndExit ( Txt_You_can_not_rename_this_folder ) ;
/***** Show again file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/****** Receive a new file in a file browser unsigned Dropzone.js ************/
/*****************************************************************************/
void Brw_RcvFileInFileBrwDropzone ( void )
{
bool UploadSucessful ;
/***** Receive file *****/
UploadSucessful = Brw_RcvFileInFileBrw ( Brw_DROPZONE_UPLOAD ) ;
/***** When a file is uploaded, the HTTP response
is a code status and a message for Dropzone . js * * * * */
/* Don't write HTML at all */
Gbl . Layout . HTMLStartWritten =
2015-11-27 21:24:24 +01:00
Gbl . Layout . DivsEndWritten =
2014-12-01 23:55:08 +01:00
Gbl . Layout . HTMLEndWritten = true ;
/* Start HTTP response */
2014-12-21 14:47:04 +01:00
fprintf ( stdout , " Content-type: text/plain; charset=windows-1252 \n " ) ;
2014-12-01 23:55:08 +01:00
/* Status code and message */
if ( UploadSucessful )
fprintf ( stdout , " Status: 200 \r \n \r \n " ) ;
else
fprintf ( stdout , " Status: 501 Not Implemented \r \n \r \n "
" %s \n " ,
Gbl . Message ) ;
}
/*****************************************************************************/
/******** Receive a new file in a file browser using the classic way *********/
/*****************************************************************************/
void Brw_RcvFileInFileBrwClassic ( void )
{
/***** Receive file and show feedback message *****/
if ( ! Brw_RcvFileInFileBrw ( Brw_CLASSIC_UPLOAD ) )
Lay_ShowAlert ( Lay_WARNING , Gbl . Message ) ;
/***** Show again file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/****************** Receive a new file in a file browser *********************/
/*****************************************************************************/
static bool Brw_RcvFileInFileBrw ( Brw_UploadType_t UploadType )
{
extern const char * Txt_UPLOAD_FILE_X_file_already_exists_NO_HTML ;
extern const char * Txt_UPLOAD_FILE_could_not_create_file_NO_HTML ;
extern const char * Txt_UPLOAD_FILE_X_quota_exceeded_NO_HTML ;
extern const char * Txt_The_file_X_has_been_placed_inside_the_folder_Y ;
extern const char * Txt_UPLOAD_FILE_You_must_specify_the_file_NO_HTML ;
extern const char * Txt_UPLOAD_FILE_Forbidden_NO_HTML ;
2016-04-01 01:59:27 +02:00
struct Param * Param ;
2014-12-01 23:55:08 +01:00
char SrcFileName [ PATH_MAX + 1 ] ;
char PathUntilFileName [ PATH_MAX + 1 ] ;
char Path [ PATH_MAX + 1 ] ;
char PathTmp [ PATH_MAX + 1 ] ;
char PathCompleteInTreeIncludingFile [ PATH_MAX + 1 ] ;
char MIMEType [ Brw_MAX_BYTES_MIME_TYPE + 1 ] ;
bool AdminMarks ;
bool FileIsValid = true ;
long FilCod = - 1L ; // Code of new file in database
struct FileMetadata FileMetadata ;
struct MarksProperties Marks ;
unsigned NumUsrsToBeNotifiedByEMail ;
char FileNameToShow [ NAME_MAX + 1 ] ;
bool UploadSucessful = false ;
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
2015-01-26 12:39:48 +01:00
AdminMarks = Gbl . FileBrowser . Type = = Brw_ADMI_MARKS_CRS | |
Gbl . FileBrowser . Type = = Brw_ADMI_MARKS_GRP ;
2014-12-01 23:55:08 +01:00
/***** Check if creating a new file is allowed *****/
if ( Brw_CheckIfICanCreateIntoFolder ( Gbl . FileBrowser . Level ) )
{
/***** First, we save in disk the file from stdin (really from Gbl.F.Tmp) *****/
2016-04-04 12:13:37 +02:00
Param = Fil_StartReceptionOfFile ( Fil_NAME_OF_PARAM_FILENAME_ORG ,
SrcFileName , MIMEType ) ;
2014-12-01 23:55:08 +01:00
/***** Get filename from path *****/
// Spaces at start or end are allowed
Str_SplitFullPathIntoPathAndFileName ( SrcFileName ,
PathUntilFileName ,
Gbl . FileBrowser . NewFilFolLnkName ) ;
if ( Gbl . FileBrowser . NewFilFolLnkName [ 0 ] )
{
/***** Check if uploading this kind of file is allowed *****/
if ( Brw_CheckIfUploadIsAllowed ( MIMEType ) ) // Gbl.Message contains feedback text
{
if ( Str_ConvertFilFolLnkNameToValid ( Gbl . FileBrowser . NewFilFolLnkName ) ) // Gbl.Message contains feedback text
{
/* Gbl.FileBrowser.NewFilFolLnkName holds the name of the new file */
2016-03-28 19:30:37 +02:00
sprintf ( Path , " %s/%s " ,
Gbl . FileBrowser . Priv . PathAboveRootFolder ,
Gbl . FileBrowser . Priv . FullPathInTree ) ;
2014-12-01 23:55:08 +01:00
if ( strlen ( Path ) + 1 + strlen ( Gbl . FileBrowser . NewFilFolLnkName ) + strlen ( " .tmp " ) > PATH_MAX )
Lay_ShowErrorAndExit ( " Path is too long. " ) ;
strcat ( Path , " / " ) ;
strcat ( Path , Gbl . FileBrowser . NewFilFolLnkName ) ;
/* Check if the destination file exists */
if ( Fil_CheckIfPathExists ( Path ) )
{
sprintf ( Gbl . Message , Txt_UPLOAD_FILE_X_file_already_exists_NO_HTML ,
Gbl . FileBrowser . NewFilFolLnkName ) ;
}
else // Destination file does not exist
{
/* End receiving the file */
sprintf ( PathTmp , " %s.tmp " , Path ) ;
2016-04-01 01:59:27 +02:00
FileIsValid = Fil_EndReceptionOfFile ( PathTmp , Param ) ; // Gbl.Message contains feedback text
2014-12-01 23:55:08 +01:00
/* Check if the content of the file of marks is valid */
if ( FileIsValid )
if ( AdminMarks )
if ( ! Mrk_CheckFileOfMarks ( PathTmp , & Marks ) ) // Gbl.Message contains feedback text
FileIsValid = false ;
if ( FileIsValid )
{
/* Rename the temporary */
2016-04-03 01:24:20 +02:00
if ( rename ( PathTmp , Path ) ) // Fail
2014-12-01 23:55:08 +01:00
{
Brw_RemoveTree ( PathTmp ) ;
sprintf ( Gbl . Message , Txt_UPLOAD_FILE_could_not_create_file_NO_HTML ,
Gbl . FileBrowser . NewFilFolLnkName ) ;
}
2016-04-03 01:24:20 +02:00
else // Success
2014-12-01 23:55:08 +01:00
{
/* Check if quota has been exceeded */
Brw_CalcSizeOfDir ( Gbl . FileBrowser . Priv . PathRootFolder ) ;
Brw_SetMaxQuota ( ) ;
if ( Brw_CheckIfQuotaExceded ( ) )
{
Brw_RemoveTree ( Path ) ;
sprintf ( Gbl . Message , Txt_UPLOAD_FILE_X_quota_exceeded_NO_HTML ,
Gbl . FileBrowser . NewFilFolLnkName ) ;
}
else
{
/* Remove affected clipboards */
Brw_RemoveAffectedClipboards ( Gbl . FileBrowser . Type , Gbl . Usrs . Me . UsrDat . UsrCod , Gbl . Usrs . Other . UsrDat . UsrCod ) ;
/* Add path where new file is created to table of expanded folders */
Brw_InsFoldersInPathAndUpdOtherFoldersInExpandedFolders ( Gbl . FileBrowser . Priv . FullPathInTree ) ;
/* Add entry to the table of files/folders */
sprintf ( PathCompleteInTreeIncludingFile , " %s/%s " , Gbl . FileBrowser . Priv . FullPathInTree , Gbl . FileBrowser . NewFilFolLnkName ) ;
FilCod = Brw_AddPathToDB ( Gbl . Usrs . Me . UsrDat . UsrCod , Brw_IS_FILE ,
PathCompleteInTreeIncludingFile , false , Brw_LICENSE_DEFAULT ) ;
/* Show message of confirmation */
if ( UploadType = = Brw_CLASSIC_UPLOAD )
{
Brw_GetFileNameToShow ( Gbl . FileBrowser . Type , Gbl . FileBrowser . Level , Brw_IS_FOLDER ,
Gbl . FileBrowser . FilFolLnkName , FileNameToShow ) ;
sprintf ( Gbl . Message , Txt_The_file_X_has_been_placed_inside_the_folder_Y ,
Gbl . FileBrowser . NewFilFolLnkName ,
FileNameToShow ) ;
Lay_ShowAlert ( Lay_SUCCESS , Gbl . Message ) ;
}
UploadSucessful = true ;
FileMetadata . FilCod = FilCod ;
Brw_GetFileMetadataByCod ( & FileMetadata ) ;
/* Add a new entry of marks into database */
if ( AdminMarks )
Mrk_AddMarksToDB ( FileMetadata . FilCod , & Marks ) ;
/* Notify new file */
if ( ! Brw_CheckIfFileOrFolderIsHidden ( & FileMetadata ) )
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS :
case Brw_ADMI_DOCUM_GRP :
2014-12-01 23:55:08 +01:00
NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs ( Ntf_EVENT_DOCUMENT_FILE , FilCod ) ;
if ( UploadType = = Brw_CLASSIC_UPLOAD )
Ntf_ShowAlertNumUsrsToBeNotifiedByEMail ( NumUsrsToBeNotifiedByEMail ) ;
break ;
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
case Brw_ADMI_TEACH_GRP :
NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs ( Ntf_EVENT_TEACHERS_FILE , FilCod ) ;
if ( UploadType = = Brw_CLASSIC_UPLOAD )
Ntf_ShowAlertNumUsrsToBeNotifiedByEMail ( NumUsrsToBeNotifiedByEMail ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_SHARE_GRP :
2014-12-01 23:55:08 +01:00
NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs ( Ntf_EVENT_SHARED_FILE , FilCod ) ;
if ( UploadType = = Brw_CLASSIC_UPLOAD )
Ntf_ShowAlertNumUsrsToBeNotifiedByEMail ( NumUsrsToBeNotifiedByEMail ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_MARKS_CRS :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs ( Ntf_EVENT_MARKS_FILE , FilCod ) ;
if ( UploadType = = Brw_CLASSIC_UPLOAD )
Ntf_ShowAlertNumUsrsToBeNotifiedByEMail ( NumUsrsToBeNotifiedByEMail ) ;
break ;
default :
break ;
}
}
}
}
else // Error in file reception. File probably too big
Brw_RemoveTree ( PathTmp ) ;
}
}
}
}
else // Empty filename
strcpy ( Gbl . Message , Txt_UPLOAD_FILE_You_must_specify_the_file_NO_HTML ) ;
}
else // I do not have permission to create files here
strcpy ( Gbl . Message , Txt_UPLOAD_FILE_Forbidden_NO_HTML ) ;
return UploadSucessful ;
}
/*****************************************************************************/
/******************* Receive a new link in a file browser ********************/
/*****************************************************************************/
void Brw_RecLinkFileBrowser ( void )
{
extern const char * Txt_Can_not_create_the_link_X_because_there_is_already_a_folder_or_a_link_with_that_name ;
extern const char * Txt_Can_not_create_the_link_X_because_it_would_exceed_the_disk_quota ;
extern const char * Txt_The_link_X_has_been_placed_inside_the_folder_Y ;
2015-04-06 23:25:23 +02:00
extern const char * Txt_UPLOAD_FILE_Invalid_link ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_You_can_not_create_links_here ;
2015-04-06 23:25:23 +02:00
char URL [ PATH_MAX + 1 ] ;
char URLWithoutEndingSlash [ PATH_MAX + 1 ] ;
2014-12-01 23:55:08 +01:00
size_t LengthURL ;
char URLUntilLastFilename [ PATH_MAX + 1 ] ;
2015-04-06 23:25:23 +02:00
char FileName [ NAME_MAX + 1 ] ;
2014-12-01 23:55:08 +01:00
char Path [ PATH_MAX + 1 ] ;
FILE * FileURL ;
char PathCompleteInTreeIncludingFile [ PATH_MAX + 1 ] ;
long FilCod = - 1L ; // Code of new file in database
char FileNameToShow [ NAME_MAX + 1 ] ;
struct FileMetadata FileMetadata ;
unsigned NumUsrsToBeNotifiedByEMail ;
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
/***** Check if creating a new link is allowed *****/
if ( Brw_CheckIfICanCreateIntoFolder ( Gbl . FileBrowser . Level ) )
{
/***** Create a new file to store URL ****/
2015-04-06 23:25:23 +02:00
Par_GetParToText ( " NewLinkURL " , URL , PATH_MAX ) ;
if ( ( LengthURL = strlen ( URL ) ) )
2014-12-01 23:55:08 +01:00
{
2015-04-06 23:25:23 +02:00
if ( Gbl . FileBrowser . NewFilFolLnkName [ 0 ] )
/*
Gbl . FileBrowser . NewFilFolLnkName holds the name given by me in the form
Example :
Name given by me : intel - architectures . pdf
File in swad : intel - architectures . pdf . url
*/
strncpy ( URLWithoutEndingSlash , Gbl . FileBrowser . NewFilFolLnkName , PATH_MAX ) ;
else
/*
Gbl . FileBrowser . NewFilFolLnkName is empty
URL holds the URL given by me in the form
Example :
URL : http : //www.intel.es/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf
File in swad : 64 - ia - 32 - architectures - software - developer - manual - 325462. pdf . url
*/
strncpy ( URLWithoutEndingSlash , URL , PATH_MAX ) ;
URLWithoutEndingSlash [ PATH_MAX ] = ' \0 ' ;
/* Remove possible final '/' from URL */
2014-12-01 23:55:08 +01:00
if ( URLWithoutEndingSlash [ LengthURL - 1 ] = = ' / ' )
2015-04-06 23:25:23 +02:00
URLWithoutEndingSlash [ LengthURL - 1 ] = ' \0 ' ;
2014-12-01 23:55:08 +01:00
2015-04-06 23:25:23 +02:00
/* Get the last name in URL-without-ending-slash */
2014-12-01 23:55:08 +01:00
Str_SplitFullPathIntoPathAndFileName ( URLWithoutEndingSlash ,
URLUntilLastFilename ,
2015-04-06 23:25:23 +02:00
FileName ) ;
2014-12-01 23:55:08 +01:00
/* Convert the last name in URL to a valid filename */
2015-04-06 23:25:23 +02:00
if ( Str_ConvertFilFolLnkNameToValid ( FileName ) ) // Gbl.Message contains feedback text
2014-12-01 23:55:08 +01:00
{
2015-04-06 23:25:23 +02:00
/* The name of the file with the link will be the FileName.url */
2014-12-01 23:55:08 +01:00
sprintf ( Path , " %s/%s " , Gbl . FileBrowser . Priv . PathAboveRootFolder , Gbl . FileBrowser . Priv . FullPathInTree ) ;
2015-04-06 23:25:23 +02:00
if ( strlen ( Path ) + 1 + strlen ( FileName ) + strlen ( " .url " ) > PATH_MAX )
2014-12-01 23:55:08 +01:00
Lay_ShowErrorAndExit ( " Path is too long. " ) ;
strcat ( Path , " / " ) ;
2015-04-06 23:25:23 +02:00
strcat ( Path , FileName ) ;
2014-12-01 23:55:08 +01:00
strcat ( Path , " .url " ) ;
/* Check if the URL file exists */
if ( Fil_CheckIfPathExists ( Path ) )
{
sprintf ( Gbl . Message , Txt_Can_not_create_the_link_X_because_there_is_already_a_folder_or_a_link_with_that_name ,
2015-04-06 23:25:23 +02:00
FileName ) ;
2014-12-01 23:55:08 +01:00
Lay_ShowAlert ( Lay_WARNING , Gbl . Message ) ;
}
else // URL file does not exist
{
/***** Create the new file with the URL *****/
if ( ( FileURL = fopen ( Path , " wb " ) ) ! = NULL )
{
/* Write URL */
2015-04-06 23:25:23 +02:00
fprintf ( FileURL , " %s " , URL ) ;
2014-12-01 23:55:08 +01:00
/* Close file */
fclose ( FileURL ) ;
/* Check if quota has been exceeded */
Brw_CalcSizeOfDir ( Gbl . FileBrowser . Priv . PathRootFolder ) ;
Brw_SetMaxQuota ( ) ;
if ( Brw_CheckIfQuotaExceded ( ) )
{
Brw_RemoveTree ( Path ) ;
sprintf ( Gbl . Message , Txt_Can_not_create_the_link_X_because_it_would_exceed_the_disk_quota ,
2015-04-06 23:25:23 +02:00
FileName ) ;
2014-12-01 23:55:08 +01:00
Lay_ShowAlert ( Lay_WARNING , Gbl . Message ) ;
}
else
{
/* Remove affected clipboards */
Brw_RemoveAffectedClipboards ( Gbl . FileBrowser . Type , Gbl . Usrs . Me . UsrDat . UsrCod , Gbl . Usrs . Other . UsrDat . UsrCod ) ;
/* Add path where new file is created to table of expanded folders */
Brw_InsFoldersInPathAndUpdOtherFoldersInExpandedFolders ( Gbl . FileBrowser . Priv . FullPathInTree ) ;
/* Add entry to the table of files/folders */
2015-04-06 23:25:23 +02:00
sprintf ( PathCompleteInTreeIncludingFile , " %s/%s.url " , Gbl . FileBrowser . Priv . FullPathInTree , FileName ) ;
2014-12-01 23:55:08 +01:00
FilCod = Brw_AddPathToDB ( Gbl . Usrs . Me . UsrDat . UsrCod , Brw_IS_LINK ,
PathCompleteInTreeIncludingFile , false , Brw_LICENSE_DEFAULT ) ;
/* Show message of confirmation */
Brw_GetFileNameToShow ( Gbl . FileBrowser . Type , Gbl . FileBrowser . Level , Brw_IS_FOLDER ,
Gbl . FileBrowser . FilFolLnkName , FileNameToShow ) ;
sprintf ( Gbl . Message , Txt_The_link_X_has_been_placed_inside_the_folder_Y ,
2015-04-06 23:25:23 +02:00
FileName , FileNameToShow ) ;
2014-12-01 23:55:08 +01:00
Lay_ShowAlert ( Lay_SUCCESS , Gbl . Message ) ;
FileMetadata . FilCod = FilCod ;
Brw_GetFileMetadataByCod ( & FileMetadata ) ;
/* Notify new file */
if ( ! Brw_CheckIfFileOrFolderIsHidden ( & FileMetadata ) )
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS :
case Brw_ADMI_DOCUM_GRP :
2014-12-01 23:55:08 +01:00
NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs ( Ntf_EVENT_DOCUMENT_FILE , FilCod ) ;
Ntf_ShowAlertNumUsrsToBeNotifiedByEMail ( NumUsrsToBeNotifiedByEMail ) ;
break ;
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
case Brw_ADMI_TEACH_GRP :
NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs ( Ntf_EVENT_TEACHERS_FILE , FilCod ) ;
Ntf_ShowAlertNumUsrsToBeNotifiedByEMail ( NumUsrsToBeNotifiedByEMail ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_SHARE_GRP :
2014-12-01 23:55:08 +01:00
NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs ( Ntf_EVENT_SHARED_FILE , FilCod ) ;
Ntf_ShowAlertNumUsrsToBeNotifiedByEMail ( NumUsrsToBeNotifiedByEMail ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_MARKS_CRS :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs ( Ntf_EVENT_MARKS_FILE , FilCod ) ;
Ntf_ShowAlertNumUsrsToBeNotifiedByEMail ( NumUsrsToBeNotifiedByEMail ) ;
break ;
default :
break ;
}
}
}
}
}
}
2015-04-06 23:25:23 +02:00
else // Link URL not valid
Lay_ShowAlert ( Lay_WARNING , Txt_UPLOAD_FILE_Invalid_link ) ;
2014-12-01 23:55:08 +01:00
}
else
Lay_ShowErrorAndExit ( Txt_You_can_not_create_links_here ) ; // It's difficult, but not impossible that a user sees this message
/***** Show again the file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/****************** Check if it is allowed to upload a file ******************/
/*****************************************************************************/
// Returns true if file type is allowed
// Returns false if MIME type or extension are not allowed
// On error, Gbl.Message will contain feedback text
static bool Brw_CheckIfUploadIsAllowed ( const char * MIMEType )
{
extern const char * Txt_UPLOAD_FILE_X_MIME_type_Y_not_allowed_NO_HTML ;
extern const char * Txt_UPLOAD_FILE_X_not_HTML_NO_HTML ;
extern const char * Txt_UPLOAD_FILE_X_extension_not_allowed_NO_HTML ;
unsigned Type ;
bool MIMETypeIsAllowed = false ;
bool ExtensionIsAllowed = false ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_MARKS_CRS :
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
/* Check file extension */
if ( ( ExtensionIsAllowed = Str_FileIsHTML ( Gbl . FileBrowser . NewFilFolLnkName ) ) )
{
/* Check MIME type*/
2016-03-28 19:30:37 +02:00
if ( strcmp ( MIMEType , " text/html " ) )
if ( strcmp ( MIMEType , " text/plain " ) )
if ( strcmp ( MIMEType , " application/octet-stream " ) )
if ( strcmp ( MIMEType , " application/octetstream " ) )
if ( strcmp ( MIMEType , " application/octet " ) )
{ // MIME type forbidden
sprintf ( Gbl . Message , Txt_UPLOAD_FILE_X_MIME_type_Y_not_allowed_NO_HTML ,
Gbl . FileBrowser . NewFilFolLnkName , MIMEType ) ;
return false ;
}
2014-12-01 23:55:08 +01:00
}
else
{
sprintf ( Gbl . Message , Txt_UPLOAD_FILE_X_not_HTML_NO_HTML ,
Gbl . FileBrowser . NewFilFolLnkName ) ;
return false ;
}
break ;
default :
/* Check the file extension */
for ( Type = 0 ;
Type < Brw_NUM_FILE_EXT_ALLOWED ;
Type + + )
if ( Str_FileIs ( Gbl . FileBrowser . NewFilFolLnkName , Brw_FileExtensionsAllowed [ Type ] ) )
{
ExtensionIsAllowed = true ;
break ;
}
if ( ExtensionIsAllowed )
{
/* Check type MIME */
for ( Type = 0 ;
Type < Brw_NUM_MIME_TYPES_ALLOWED ;
Type + + )
if ( ! strcmp ( MIMEType , Brw_MIMETypesAllowed [ Type ] ) )
{
MIMETypeIsAllowed = true ;
break ;
}
if ( ! MIMETypeIsAllowed )
{
sprintf ( Gbl . Message , Txt_UPLOAD_FILE_X_MIME_type_Y_not_allowed_NO_HTML ,
Gbl . FileBrowser . NewFilFolLnkName , MIMEType ) ;
return false ;
}
}
else
{
sprintf ( Gbl . Message , Txt_UPLOAD_FILE_X_extension_not_allowed_NO_HTML ,
Gbl . FileBrowser . NewFilFolLnkName ) ;
return false ;
}
break ;
}
return true ;
}
/*****************************************************************************/
/******************* Show file or folder in a file browser *******************/
/*****************************************************************************/
void Brw_SetDocumentAsVisible ( void )
{
extern const char * Txt_FILE_FOLDER_OR_LINK_X_is_now_visible ;
char FileNameToShow [ NAME_MAX + 1 ] ;
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
/***** Change file to visible *****/
if ( Brw_CheckIfFileOrFolderIsSetAsHiddenInDB ( Gbl . FileBrowser . FileType ,
Gbl . FileBrowser . Priv . FullPathInTree ) )
Brw_ChangeFileOrFolderHiddenInDB ( Gbl . FileBrowser . Priv . FullPathInTree , false ) ;
/***** Remove the affected clipboards *****/
Brw_RemoveAffectedClipboards ( Gbl . FileBrowser . Type , Gbl . Usrs . Me . UsrDat . UsrCod , Gbl . Usrs . Other . UsrDat . UsrCod ) ;
/***** Write message of confirmation *****/
Brw_GetFileNameToShow ( Gbl . FileBrowser . Type , Gbl . FileBrowser . Level , Gbl . FileBrowser . FileType ,
Gbl . FileBrowser . FilFolLnkName , FileNameToShow ) ;
sprintf ( Gbl . Message , Txt_FILE_FOLDER_OR_LINK_X_is_now_visible ,
FileNameToShow ) ;
Lay_ShowAlert ( Lay_SUCCESS , Gbl . Message ) ;
/***** Show again the file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/***************** Hide file or folder in a file browser *********************/
/*****************************************************************************/
void Brw_SetDocumentAsHidden ( void )
{
extern const char * Txt_FILE_FOLDER_OR_LINK_X_is_now_hidden ;
char FileNameToShow [ NAME_MAX + 1 ] ;
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
/***** If the file or folder is not already set as hidden in database,
set it as hidden * * * * */
if ( ! Brw_CheckIfFileOrFolderIsSetAsHiddenInDB ( Gbl . FileBrowser . FileType ,
Gbl . FileBrowser . Priv . FullPathInTree ) )
Brw_ChangeFileOrFolderHiddenInDB ( Gbl . FileBrowser . Priv . FullPathInTree , true ) ;
/***** Remove the affected clipboards *****/
Brw_RemoveAffectedClipboards ( Gbl . FileBrowser . Type , Gbl . Usrs . Me . UsrDat . UsrCod , Gbl . Usrs . Other . UsrDat . UsrCod ) ;
/***** Write confirmation message *****/
Brw_GetFileNameToShow ( Gbl . FileBrowser . Type , Gbl . FileBrowser . Level , Gbl . FileBrowser . FileType ,
Gbl . FileBrowser . FilFolLnkName , FileNameToShow ) ;
sprintf ( Gbl . Message , Txt_FILE_FOLDER_OR_LINK_X_is_now_hidden , FileNameToShow ) ;
Lay_ShowAlert ( Lay_SUCCESS , Gbl . Message ) ;
/***** Show again the file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/** Check if a file / folder from the documents zone is set as hidden in DB **/
/*****************************************************************************/
bool Brw_CheckIfFileOrFolderIsSetAsHiddenInDB ( Brw_FileType_t FileType , const char * Path )
{
2015-01-25 00:58:21 +01:00
long Cod = Brw_GetCodForFiles ( ) ;
long ZoneUsrCod = Brw_GetZoneUsrCodForFiles ( ) ;
2014-12-01 23:55:08 +01:00
char Query [ 512 + PATH_MAX ] ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
bool IsHidden = false ;
/***** Get if a file or folder is hidden from database *****/
sprintf ( Query , " SELECT Hidden FROM files "
2015-01-25 00:58:21 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' AND ZoneUsrCod='%ld' "
2014-12-01 23:55:08 +01:00
" AND Path='%s' " ,
2015-01-24 19:30:44 +01:00
( unsigned ) Brw_FileBrowserForDB_files [ Gbl . FileBrowser . Type ] ,
2015-01-25 00:58:21 +01:00
Cod , ZoneUsrCod ,
2014-12-01 23:55:08 +01:00
Path ) ;
if ( DB_QuerySELECT ( Query , & mysql_res , " can not check if a file is hidden " ) )
{
/* Get row */
row = mysql_fetch_row ( mysql_res ) ;
/* File is hidden? (row[0]) */
IsHidden = ( Str_ConvertToUpperLetter ( row [ 0 ] [ 0 ] ) = = ' Y ' ) ;
}
else
Brw_AddPathToDB ( - 1L , FileType ,
Gbl . FileBrowser . Priv . FullPathInTree , false , Brw_LICENSE_DEFAULT ) ;
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult ( & mysql_res ) ;
return IsHidden ;
}
/*****************************************************************************/
/******** Check if a file / folder from the documents zone is hidden *********/
/*****************************************************************************/
bool Brw_CheckIfFileOrFolderIsHidden ( struct FileMetadata * FileMetadata )
{
2015-01-25 00:58:21 +01:00
char Query [ 512 + PATH_MAX * 2 ] ;
2014-12-01 23:55:08 +01:00
/***** Get if a file or folder is under a hidden folder from database *****/
/*
The argument Path passed to this function is hidden if :
1 ) the argument Path is exactly the same as a path stored in database
or
2 ) the argument Path begins by ' x / ' , where x is a path stored in database
*/
sprintf ( Query , " SELECT COUNT(*) FROM files "
2015-01-25 00:58:21 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' AND ZoneUsrCod='%ld' "
" AND Hidden='Y' "
2014-12-01 23:55:08 +01:00
" AND (Path='%s' OR LOCATE(CONCAT(Path,'/'),'%s')=1) " ,
FileMetadata - > FileBrowser ,
2015-01-25 00:58:21 +01:00
FileMetadata - > Cod ,
FileMetadata - > ZoneUsrCod ,
2016-01-03 15:36:46 +01:00
FileMetadata - > FullPathInTree ,
FileMetadata - > FullPathInTree ) ;
2014-12-01 23:55:08 +01:00
return ( DB_QueryCOUNT ( Query , " can not check if a file or folder is hidden " ) ! = 0 ) ;
}
/*****************************************************************************/
/***************** Show metadata of a file in a file browser *****************/
/*****************************************************************************/
void Brw_ShowFileMetadata ( void )
{
2015-07-27 21:25:45 +02:00
extern const char * The_ClassForm [ The_NUM_THEMES ] ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_The_file_of_folder_no_longer_exists_or_is_now_hidden ;
extern const char * Txt_Filename ;
extern const char * Txt_File_size ;
extern const char * Txt_Uploaded_by ;
2015-03-12 14:45:40 +01:00
extern const char * Txt_ROLES_SINGUL_Abc [ Rol_NUM_ROLES ] [ Usr_NUM_SEXS ] ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_Date_of_creation ;
2015-12-29 11:35:01 +01:00
extern const char * Txt_Today ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_Availability ;
extern const char * Txt_Private_available_to_certain_users_identified ;
extern const char * Txt_Public_open_educational_resource_OER_for_everyone ;
extern const char * Txt_License ;
extern const char * Txt_LICENSES [ Brw_NUM_LICENSES ] ;
extern const char * Txt_My_views ;
extern const char * Txt_Identified_views ;
extern const char * Txt_Public_views ;
extern const char * Txt_user [ Usr_NUM_SEXS ] ;
extern const char * Txt_users ;
extern const char * Txt_Save_file_properties ;
struct FileMetadata FileMetadata ;
struct UsrData PublisherUsrDat ;
char FileNameToShow [ NAME_MAX + 1 ] ;
char URL [ PATH_MAX + 1 ] ;
bool Found ;
2015-01-20 20:35:33 +01:00
bool ICanView = false ;
2014-12-01 23:55:08 +01:00
bool ICanEdit ;
bool ICanChangePublic = false ;
bool ICanChangeLicense = false ;
bool FileHasPublisher ;
bool ShowPhoto ;
char PhotoURL [ PATH_MAX + 1 ] ;
Brw_License_t License ;
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
/***** Get file metadata *****/
2016-01-03 03:00:43 +01:00
FileMetadata . FilCod = Brw_GetParamFilCod ( ) ;
Brw_GetFileMetadataByCod ( & FileMetadata ) ;
2015-02-23 23:45:32 +01:00
Found = Brw_GetFileTypeSizeAndDate ( & FileMetadata ) ;
2014-12-01 23:55:08 +01:00
if ( Found )
{
if ( FileMetadata . FilCod < = 0 ) // No entry for this file in database table of files
2015-01-20 15:03:02 +01:00
/* Add entry to the table of files/folders */
2014-12-01 23:55:08 +01:00
FileMetadata . FilCod = Brw_AddPathToDB ( - 1L , FileMetadata . FileType ,
2016-01-03 15:36:46 +01:00
FileMetadata . FullPathInTree ,
false , Brw_LICENSE_DEFAULT ) ;
2014-12-01 23:55:08 +01:00
/***** Check if I can view this file.
2015-01-20 20:35:33 +01:00
It could be marked as hidden or in a hidden folder * * * * */
ICanView = true ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_INS :
2015-04-07 21:44:24 +02:00
if ( Gbl . Usrs . Me . LoggedRole < Rol_INS_ADM )
2015-01-20 20:35:33 +01:00
ICanView = ! Brw_CheckIfFileOrFolderIsHidden ( & FileMetadata ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CTR :
2015-04-07 21:44:24 +02:00
if ( Gbl . Usrs . Me . LoggedRole < Rol_CTR_ADM )
2015-01-20 20:35:33 +01:00
ICanView = ! Brw_CheckIfFileOrFolderIsHidden ( & FileMetadata ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_DEG :
2015-04-07 21:44:24 +02:00
if ( Gbl . Usrs . Me . LoggedRole < Rol_DEG_ADM )
2015-01-20 20:35:33 +01:00
ICanView = ! Brw_CheckIfFileOrFolderIsHidden ( & FileMetadata ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CRS :
case Brw_SHOW_DOCUM_GRP :
2015-04-07 21:44:24 +02:00
if ( Gbl . Usrs . Me . LoggedRole < Rol_TEACHER )
2015-01-20 20:35:33 +01:00
ICanView = ! Brw_CheckIfFileOrFolderIsHidden ( & FileMetadata ) ;
break ;
default :
break ;
}
2014-12-01 23:55:08 +01:00
}
if ( ICanView )
{
if ( FileMetadata . FileType = = Brw_IS_FILE | |
FileMetadata . FileType = = Brw_IS_LINK )
{
/***** Update number of views *****/
Brw_GetAndUpdateFileViews ( & FileMetadata ) ;
/***** Get data of file/folder publisher *****/
if ( FileMetadata . PublisherUsrCod > 0 )
{
/***** Initialize structure with publisher's data *****/
Usr_UsrDataConstructor ( & PublisherUsrDat ) ;
PublisherUsrDat . UsrCod = FileMetadata . PublisherUsrCod ;
FileHasPublisher = Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod ( & PublisherUsrDat ) ;
}
else
FileHasPublisher = false ; // Get user's data from database
/***** Get link to download the file *****/
2015-01-26 12:39:48 +01:00
if ( Gbl . FileBrowser . Type = = Brw_SHOW_MARKS_CRS | |
Gbl . FileBrowser . Type = = Brw_SHOW_MARKS_GRP )
2014-12-01 23:55:08 +01:00
URL [ 0 ] = ' \0 ' ;
else
2016-01-03 15:36:46 +01:00
Brw_GetLinkToDownloadFile ( FileMetadata . PathInTreeUntilFilFolLnk ,
FileMetadata . FilFolLnkName ,
2014-12-01 23:55:08 +01:00
URL ) ;
/***** Can I edit the properties of the file? *****/
ICanEdit = Brw_CheckIfICanEditFileMetadata ( FileMetadata . PublisherUsrCod ) ;
/***** Name of the file/link to be shown *****/
Brw_LimitLengthFileNameToShow ( FileMetadata . FileType ,
2016-01-03 15:36:46 +01:00
FileMetadata . FilFolLnkName ,
FileNameToShow ) ;
2014-12-01 23:55:08 +01:00
/***** Start form to update the metadata of a file *****/
if ( ICanEdit ) // I can edit file properties
{
Act_FormStart ( Brw_ActRecDatFile [ Gbl . FileBrowser . Type ] ) ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_INS :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_INS :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CTR :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_CTR :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_DEG :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_DEG :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS :
case Brw_ADMI_SHARE_CRS :
2014-12-01 23:55:08 +01:00
ICanChangePublic = true ;
ICanChangeLicense = true ;
break ;
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
ICanChangePublic = false ; // A file in teachers' zones can not be public...
ICanChangeLicense = true ; // ...but I can change its license
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
ICanChangePublic = false ; // A file in group zones can not be public...
ICanChangeLicense = true ; // ...but I can change its license
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_USR :
case Brw_ADMI_WORKS_USR :
2014-12-01 23:55:08 +01:00
ICanChangePublic = false ; // A file in assignments or works zones can not be public...
ICanChangeLicense = true ; // ...but I can change its license
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_CRS :
2014-12-01 23:55:08 +01:00
Usr_PutHiddenParUsrCodAll ( Brw_ActRecDatFile [ Gbl . FileBrowser . Type ] , Gbl . Usrs . Select . All ) ;
2015-04-02 18:39:49 +02:00
Usr_PutParamOtherUsrCodEncrypted ( ) ;
2014-12-01 23:55:08 +01:00
ICanChangePublic = false ; // A file in assignments or works zones can not be public...
ICanChangeLicense = true ; // ...but I can change its license
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
ICanChangePublic = false ;
ICanChangeLicense = false ;
break ;
default :
ICanChangePublic = false ;
ICanChangeLicense = false ;
break ;
}
Brw_ParamListFiles ( FileMetadata . FileType ,
2016-01-03 15:36:46 +01:00
FileMetadata . PathInTreeUntilFilFolLnk ,
FileMetadata . FilFolLnkName ) ;
2014-12-01 23:55:08 +01:00
}
2015-04-11 23:46:21 +02:00
/***** Start frame *****/
2015-04-12 18:01:06 +02:00
Lay_StartRoundFrameTableShadow ( NULL , 2 ) ;
2014-12-01 23:55:08 +01:00
/***** Link to download the file *****/
fprintf ( Gbl . F . Out , " <tr> "
2015-08-01 10:43:33 +02:00
" <td colspan= \" 2 \" "
" class= \" FILENAME CENTER_MIDDLE \" > " ) ;
2016-01-03 15:36:46 +01:00
Brw_WriteBigLinkToDownloadFile ( URL , & FileMetadata , FileNameToShow ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " </td> "
" </tr> " ) ;
/***** Filename *****/
fprintf ( Gbl . F . Out , " <tr> "
2015-07-27 21:25:45 +02:00
" <td class= \" %s RIGHT_MIDDLE \" > "
2014-12-22 21:52:37 +01:00
" %s: "
" </td> "
2015-08-01 10:43:33 +02:00
" <td class= \" DAT LEFT_MIDDLE \" > " ,
2015-07-27 21:25:45 +02:00
The_ClassForm [ Gbl . Prefs . Theme ] , Txt_Filename ) ;
2014-12-01 23:55:08 +01:00
Brw_WriteSmallLinkToDownloadFile ( URL , FileMetadata . FileType , FileNameToShow ) ;
fprintf ( Gbl . F . Out , " </td> "
" </tr> " ) ;
/***** Publisher's data *****/
fprintf ( Gbl . F . Out , " <tr> "
2015-07-27 21:25:45 +02:00
" <td class= \" %s RIGHT_MIDDLE \" > "
2014-12-22 21:52:37 +01:00
" %s: "
" </td> "
2015-08-01 10:43:33 +02:00
" <td class= \" DAT LEFT_MIDDLE \" > " ,
2015-07-27 21:25:45 +02:00
The_ClassForm [ Gbl . Prefs . Theme ] , Txt_Uploaded_by ) ;
2014-12-01 23:55:08 +01:00
if ( FileHasPublisher )
{
/* Show photo */
ShowPhoto = Pho_ShowUsrPhotoIsAllowed ( & PublisherUsrDat , PhotoURL ) ;
2014-12-30 15:14:43 +01:00
Pho_ShowUsrPhoto ( & PublisherUsrDat , ShowPhoto ? PhotoURL :
NULL ,
2016-01-14 10:31:09 +01:00
" PHOTO15x20 " , Pho_ZOOM , false ) ;
2014-12-01 23:55:08 +01:00
/* Write name */
fprintf ( Gbl . F . Out , " %s " ,
PublisherUsrDat . FullName ) ;
}
else
/* Unknown publisher */
2015-04-07 21:44:24 +02:00
fprintf ( Gbl . F . Out , " %s " , Txt_ROLES_SINGUL_Abc [ Rol_UNKNOWN ] [ Usr_SEX_UNKNOWN ] ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " </td> "
" </tr> " ) ;
/***** Free memory used for publisher's data *****/
if ( FileMetadata . PublisherUsrCod > 0 )
Usr_UsrDataDestructor ( & PublisherUsrDat ) ;
/***** Write the file size *****/
fprintf ( Gbl . F . Out , " <tr> "
2015-07-27 21:25:45 +02:00
" <td class= \" %s RIGHT_MIDDLE \" > "
2014-12-22 21:52:37 +01:00
" %s: "
" </td> "
2015-08-01 10:43:33 +02:00
" <td class= \" DAT LEFT_MIDDLE \" > " ,
2015-07-27 21:25:45 +02:00
The_ClassForm [ Gbl . Prefs . Theme ] , Txt_File_size ) ;
2014-12-01 23:55:08 +01:00
Str_WriteSizeInBytesFull ( ( double ) FileMetadata . Size ) ;
fprintf ( Gbl . F . Out , " </td> "
" </tr> " ) ;
/***** Write the date *****/
fprintf ( Gbl . F . Out , " <tr> "
2015-07-27 21:25:45 +02:00
" <td class= \" %s RIGHT_MIDDLE \" > "
2014-12-22 21:52:37 +01:00
" %s: "
" </td> "
2015-10-21 22:31:46 +02:00
" <td id= \" filedate \" class= \" DAT LEFT_MIDDLE \" > " ,
2015-07-27 21:25:45 +02:00
The_ClassForm [ Gbl . Prefs . Theme ] , Txt_Date_of_creation ) ;
2015-10-21 22:31:46 +02:00
fprintf ( Gbl . F . Out , " <script type= \" text/javascript \" > "
2016-01-13 02:03:56 +01:00
" writeLocalDateHMSFromUTC('filedate',%ld,' ','%s'); "
2015-10-21 22:31:46 +02:00
" </script> " ,
2015-12-29 11:35:01 +01:00
( long ) FileMetadata . Time , Txt_Today ) ;
2015-10-21 22:31:46 +02:00
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " </td> "
" </tr> " ) ;
/***** Private or public? *****/
fprintf ( Gbl . F . Out , " <tr> "
2015-07-27 21:25:45 +02:00
" <td class= \" %s RIGHT_MIDDLE \" > "
2014-12-22 21:52:37 +01:00
" %s: "
" </td> "
2015-08-01 10:43:33 +02:00
" <td class= \" DAT LEFT_MIDDLE \" > " ,
2015-07-27 21:25:45 +02:00
The_ClassForm [ Gbl . Prefs . Theme ] , Txt_Availability ) ;
2014-12-01 23:55:08 +01:00
if ( ICanChangePublic ) // I can change file to public
{
fprintf ( Gbl . F . Out , " <select name= \" PublicFile \" > " ) ;
fprintf ( Gbl . F . Out , " <option value= \" N \" " ) ;
if ( ! FileMetadata . IsPublic )
fprintf ( Gbl . F . Out , " selected= \" selected \" " ) ;
fprintf ( Gbl . F . Out , " >%s</option> " , Txt_Private_available_to_certain_users_identified ) ;
fprintf ( Gbl . F . Out , " <option value= \" Y \" " ) ;
if ( FileMetadata . IsPublic )
fprintf ( Gbl . F . Out , " selected= \" selected \" " ) ;
fprintf ( Gbl . F . Out , " >%s</option> " , Txt_Public_open_educational_resource_OER_for_everyone ) ;
fprintf ( Gbl . F . Out , " </select> " ) ;
}
else // I can not edit file properties
fprintf ( Gbl . F . Out , " %s " ,
FileMetadata . IsPublic ? Txt_Public_open_educational_resource_OER_for_everyone :
Txt_Private_available_to_certain_users_identified ) ;
fprintf ( Gbl . F . Out , " </td> "
" </tr> " ) ;
/***** License *****/
fprintf ( Gbl . F . Out , " <tr> "
2015-07-27 21:25:45 +02:00
" <td class= \" %s RIGHT_MIDDLE \" > "
2014-12-22 21:52:37 +01:00
" %s: "
" </td> "
2015-08-01 10:43:33 +02:00
" <td class= \" DAT LEFT_MIDDLE \" > " ,
2015-07-27 21:25:45 +02:00
The_ClassForm [ Gbl . Prefs . Theme ] , Txt_License ) ;
2014-12-01 23:55:08 +01:00
if ( ICanChangeLicense ) // I can edit file properties
{
fprintf ( Gbl . F . Out , " <select name= \" License \" > " ) ;
for ( License = 0 ;
License < Brw_NUM_LICENSES ;
License + + )
{
fprintf ( Gbl . F . Out , " <option value= \" %u \" " , ( unsigned ) License ) ;
if ( License = = FileMetadata . License )
fprintf ( Gbl . F . Out , " selected= \" selected \" " ) ;
fprintf ( Gbl . F . Out , " >%s</option> " , Txt_LICENSES [ License ] ) ;
}
fprintf ( Gbl . F . Out , " </select> " ) ;
}
else // I can not edit file properties
fprintf ( Gbl . F . Out , " %s " , Txt_LICENSES [ FileMetadata . License ] ) ;
fprintf ( Gbl . F . Out , " </td> "
" </tr> " ) ;
/***** Write my number of views *****/
if ( Gbl . Usrs . Me . Logged )
fprintf ( Gbl . F . Out , " <tr> "
2015-07-27 21:25:45 +02:00
" <td class= \" %s RIGHT_MIDDLE \" > "
2014-12-22 21:52:37 +01:00
" %s: "
" </td> "
2015-08-01 10:43:33 +02:00
" <td class= \" DAT LEFT_MIDDLE \" > "
2014-12-22 21:52:37 +01:00
" %u "
" </td> "
2014-12-01 23:55:08 +01:00
" </tr> " ,
2015-07-27 21:25:45 +02:00
The_ClassForm [ Gbl . Prefs . Theme ] , Txt_My_views ,
2014-12-01 23:55:08 +01:00
FileMetadata . NumMyViews ) ;
/***** Write number of identificated views *****/
fprintf ( Gbl . F . Out , " <tr> "
2015-07-27 21:25:45 +02:00
" <td class= \" %s RIGHT_MIDDLE \" > "
2014-12-22 21:52:37 +01:00
" %s: "
" </td> "
2015-08-01 10:43:33 +02:00
" <td class= \" DAT LEFT_MIDDLE \" > "
2014-12-22 21:52:37 +01:00
" %u (%u %s) "
" </td> "
2014-12-01 23:55:08 +01:00
" </tr> " ,
2015-07-27 21:25:45 +02:00
The_ClassForm [ Gbl . Prefs . Theme ] , Txt_Identified_views ,
2014-12-01 23:55:08 +01:00
FileMetadata . NumViewsFromLoggedUsrs ,
FileMetadata . NumLoggedUsrs ,
( FileMetadata . NumLoggedUsrs = = 1 ) ? Txt_user [ Usr_SEX_UNKNOWN ] :
Txt_users ) ;
/***** Write number of public views *****/
fprintf ( Gbl . F . Out , " <tr> "
2015-07-27 21:25:45 +02:00
" <td class= \" %s RIGHT_MIDDLE \" > "
2014-12-22 21:52:37 +01:00
" %s: "
" </td> "
2015-08-01 10:43:33 +02:00
" <td class= \" DAT LEFT_MIDDLE \" > "
2014-12-22 21:52:37 +01:00
" %u "
" </td> "
2014-12-01 23:55:08 +01:00
" </tr> " ,
2015-07-27 21:25:45 +02:00
The_ClassForm [ Gbl . Prefs . Theme ] , Txt_Public_views ,
2014-12-01 23:55:08 +01:00
FileMetadata . NumPublicViews ) ;
2015-04-11 23:46:21 +02:00
/***** End frame *****/
2014-12-01 23:55:08 +01:00
if ( ICanEdit ) // I can edit file properties
{
2015-04-12 18:01:06 +02:00
Lay_EndRoundFrameTableWithButton ( Lay_CONFIRM_BUTTON , Txt_Save_file_properties ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
}
2015-04-11 23:46:21 +02:00
else
2015-04-12 18:01:06 +02:00
Lay_EndRoundFrameTable ( ) ;
2014-12-01 23:55:08 +01:00
/***** Mark possible notifications as seen *****/
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CRS :
case Brw_SHOW_DOCUM_GRP :
case Brw_ADMI_DOCUM_CRS :
case Brw_ADMI_DOCUM_GRP :
2016-01-04 01:56:28 +01:00
Ntf_MarkNotifAsSeen ( Ntf_EVENT_DOCUMENT_FILE ,
2016-01-20 21:18:38 +01:00
FileMetadata . FilCod , Gbl . CurrentCrs . Crs . CrsCod ,
2014-12-01 23:55:08 +01:00
Gbl . Usrs . Me . UsrDat . UsrCod ) ;
break ;
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
case Brw_ADMI_TEACH_GRP :
Ntf_MarkNotifAsSeen ( Ntf_EVENT_TEACHERS_FILE ,
FileMetadata . FilCod , Gbl . CurrentCrs . Crs . CrsCod ,
Gbl . Usrs . Me . UsrDat . UsrCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_SHARE_GRP :
2016-01-04 01:56:28 +01:00
Ntf_MarkNotifAsSeen ( Ntf_EVENT_SHARED_FILE ,
2016-01-20 21:18:38 +01:00
FileMetadata . FilCod , Gbl . CurrentCrs . Crs . CrsCod ,
2014-12-01 23:55:08 +01:00
Gbl . Usrs . Me . UsrDat . UsrCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_MARKS_CRS :
case Brw_SHOW_MARKS_GRP :
case Brw_ADMI_MARKS_CRS :
case Brw_ADMI_MARKS_GRP :
2016-01-04 01:56:28 +01:00
Ntf_MarkNotifAsSeen ( Ntf_EVENT_MARKS_FILE ,
2016-01-20 21:18:38 +01:00
FileMetadata . FilCod , Gbl . CurrentCrs . Crs . CrsCod ,
2014-12-01 23:55:08 +01:00
Gbl . Usrs . Me . UsrDat . UsrCod ) ;
break ;
default :
break ;
}
}
/***** Add paths until file to table of expanded folders *****/
2016-01-03 15:36:46 +01:00
Brw_InsFoldersInPathAndUpdOtherFoldersInExpandedFolders ( Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk ) ;
2014-12-01 23:55:08 +01:00
}
else // !ICanView
{
/***** Mark possible notifications about non visible file as removed *****/
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CRS :
case Brw_SHOW_DOCUM_GRP :
case Brw_ADMI_DOCUM_CRS :
case Brw_ADMI_DOCUM_GRP :
2016-01-04 01:56:28 +01:00
Ntf_MarkNotifAsRemoved ( Ntf_EVENT_DOCUMENT_FILE ,
2014-12-01 23:55:08 +01:00
FileMetadata . FilCod ) ;
break ;
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
case Brw_ADMI_TEACH_GRP :
Ntf_MarkNotifAsRemoved ( Ntf_EVENT_TEACHERS_FILE ,
FileMetadata . FilCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_SHARE_GRP :
2016-01-04 01:56:28 +01:00
Ntf_MarkNotifAsRemoved ( Ntf_EVENT_SHARED_FILE ,
2014-12-01 23:55:08 +01:00
FileMetadata . FilCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_MARKS_CRS :
case Brw_SHOW_MARKS_GRP :
case Brw_ADMI_MARKS_CRS :
case Brw_ADMI_MARKS_GRP :
2016-01-04 01:56:28 +01:00
Ntf_MarkNotifAsRemoved ( Ntf_EVENT_MARKS_FILE ,
2014-12-01 23:55:08 +01:00
FileMetadata . FilCod ) ;
break ;
default :
break ;
}
Lay_ShowAlert ( Lay_WARNING , Txt_The_file_of_folder_no_longer_exists_or_is_now_hidden ) ;
}
/***** Show again the file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/******************* Download a file from a file browser *********************/
/*****************************************************************************/
void Brw_DownloadFile ( void )
{
extern const char * Txt_The_file_of_folder_no_longer_exists_or_is_now_hidden ;
struct FileMetadata FileMetadata ;
char URL [ PATH_MAX + 1 ] ;
bool Found ;
2015-01-20 20:35:33 +01:00
bool ICanView = false ;
2014-12-01 23:55:08 +01:00
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
/***** Get file metadata *****/
Brw_GetFileMetadataByPath ( & FileMetadata ) ;
2015-02-23 23:45:32 +01:00
Found = Brw_GetFileTypeSizeAndDate ( & FileMetadata ) ;
2014-12-01 23:55:08 +01:00
if ( Found )
{
if ( FileMetadata . FilCod < = 0 ) // No entry for this file in database table of files
/* Add entry to the table of files/folders */
FileMetadata . FilCod = Brw_AddPathToDB ( - 1L , FileMetadata . FileType ,
2016-01-03 15:36:46 +01:00
Gbl . FileBrowser . Priv . FullPathInTree ,
false , Brw_LICENSE_DEFAULT ) ;
2014-12-01 23:55:08 +01:00
/***** Check if I can view this file.
2015-01-20 20:35:33 +01:00
It could be marked as hidden or in a hidden folder * * * * */
ICanView = true ;
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_INS :
2015-04-07 21:44:24 +02:00
if ( Gbl . Usrs . Me . LoggedRole < Rol_INS_ADM )
2015-01-20 20:35:33 +01:00
ICanView = ! Brw_CheckIfFileOrFolderIsHidden ( & FileMetadata ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CTR :
2015-04-07 21:44:24 +02:00
if ( Gbl . Usrs . Me . LoggedRole < Rol_CTR_ADM )
2015-01-20 20:35:33 +01:00
ICanView = ! Brw_CheckIfFileOrFolderIsHidden ( & FileMetadata ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_DEG :
2015-04-07 21:44:24 +02:00
if ( Gbl . Usrs . Me . LoggedRole < Rol_DEG_ADM )
2015-01-20 20:35:33 +01:00
ICanView = ! Brw_CheckIfFileOrFolderIsHidden ( & FileMetadata ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CRS :
case Brw_SHOW_DOCUM_GRP :
2015-04-07 21:44:24 +02:00
if ( Gbl . Usrs . Me . LoggedRole < Rol_TEACHER )
2015-01-20 20:35:33 +01:00
ICanView = ! Brw_CheckIfFileOrFolderIsHidden ( & FileMetadata ) ;
break ;
default :
break ;
}
2014-12-01 23:55:08 +01:00
}
if ( ICanView )
{
if ( FileMetadata . FileType = = Brw_IS_FILE | |
FileMetadata . FileType = = Brw_IS_LINK )
{
/***** Update number of views *****/
Brw_GetAndUpdateFileViews ( & FileMetadata ) ;
/***** Get link to download the file *****/
2015-01-26 12:39:48 +01:00
if ( Gbl . FileBrowser . Type = = Brw_SHOW_MARKS_CRS | |
Gbl . FileBrowser . Type = = Brw_SHOW_MARKS_GRP )
2014-12-01 23:55:08 +01:00
URL [ 0 ] = ' \0 ' ;
else
2016-01-03 15:36:46 +01:00
Brw_GetLinkToDownloadFile ( Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk ,
2014-12-01 23:55:08 +01:00
Gbl . FileBrowser . FilFolLnkName ,
URL ) ;
/***** Mark possible notifications as seen *****/
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CRS :
case Brw_SHOW_DOCUM_GRP :
case Brw_ADMI_DOCUM_CRS :
case Brw_ADMI_DOCUM_GRP :
2016-01-04 01:56:28 +01:00
Ntf_MarkNotifAsSeen ( Ntf_EVENT_DOCUMENT_FILE ,
2016-01-20 21:18:38 +01:00
FileMetadata . FilCod , Gbl . CurrentCrs . Crs . CrsCod ,
2014-12-01 23:55:08 +01:00
Gbl . Usrs . Me . UsrDat . UsrCod ) ;
break ;
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
case Brw_ADMI_TEACH_GRP :
Ntf_MarkNotifAsSeen ( Ntf_EVENT_TEACHERS_FILE ,
FileMetadata . FilCod , Gbl . CurrentCrs . Crs . CrsCod ,
Gbl . Usrs . Me . UsrDat . UsrCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_SHARE_GRP :
2016-01-04 01:56:28 +01:00
Ntf_MarkNotifAsSeen ( Ntf_EVENT_SHARED_FILE ,
2016-01-20 21:18:38 +01:00
FileMetadata . FilCod , Gbl . CurrentCrs . Crs . CrsCod ,
2014-12-01 23:55:08 +01:00
Gbl . Usrs . Me . UsrDat . UsrCod ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_MARKS_CRS :
case Brw_SHOW_MARKS_GRP :
case Brw_ADMI_MARKS_CRS :
case Brw_ADMI_MARKS_GRP :
2016-01-04 01:56:28 +01:00
Ntf_MarkNotifAsSeen ( Ntf_EVENT_MARKS_FILE ,
2016-01-20 21:18:38 +01:00
FileMetadata . FilCod , Gbl . CurrentCrs . Crs . CrsCod ,
2014-12-01 23:55:08 +01:00
Gbl . Usrs . Me . UsrDat . UsrCod ) ;
break ;
default :
break ;
}
}
/***** Add paths until file to table of expanded folders *****/
2016-01-03 15:36:46 +01:00
Brw_InsFoldersInPathAndUpdOtherFoldersInExpandedFolders ( Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk ) ;
2014-12-01 23:55:08 +01:00
/***** Download the file *****/
fprintf ( stdout , " Location: %s \n \n " , URL ) ;
2015-10-16 02:24:29 +02:00
// TODO: Put headers Content-type and Content-disposition:
// See: http://stackoverflow.com/questions/381954/how-do-i-fix-firefox-trying-to-save-image-as-htm
// http://elouai.com/force-download.php
2014-12-01 23:55:08 +01:00
Gbl . Layout . HTMLStartWritten =
2015-11-27 21:24:24 +01:00
Gbl . Layout . DivsEndWritten =
2014-12-01 23:55:08 +01:00
Gbl . Layout . HTMLEndWritten = true ; // Don't write HTML at all
}
else // !ICanView
{
/***** Mark possible notifications about non visible file as removed *****/
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_DOCUM_CRS :
case Brw_SHOW_DOCUM_GRP :
case Brw_ADMI_DOCUM_CRS :
case Brw_ADMI_DOCUM_GRP :
2016-01-04 01:56:28 +01:00
Ntf_MarkNotifAsRemoved ( Ntf_EVENT_DOCUMENT_FILE ,
2016-04-22 09:47:25 +02:00
FileMetadata . FilCod ) ;
break ;
case Brw_ADMI_TEACH_CRS :
case Brw_ADMI_TEACH_GRP :
Ntf_MarkNotifAsRemoved ( Ntf_EVENT_TEACHERS_FILE ,
FileMetadata . FilCod ) ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_SHARE_GRP :
2016-01-04 01:56:28 +01:00
Ntf_MarkNotifAsRemoved ( Ntf_EVENT_SHARED_FILE ,
2016-04-22 09:47:25 +02:00
FileMetadata . FilCod ) ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_MARKS_CRS :
case Brw_SHOW_MARKS_GRP :
case Brw_ADMI_MARKS_CRS :
case Brw_ADMI_MARKS_GRP :
2016-01-04 01:56:28 +01:00
Ntf_MarkNotifAsRemoved ( Ntf_EVENT_MARKS_FILE ,
2016-04-22 09:47:25 +02:00
FileMetadata . FilCod ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
break ;
}
Lay_ShowAlert ( Lay_WARNING , Txt_The_file_of_folder_no_longer_exists_or_is_now_hidden ) ;
/***** Show again the file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
}
/*****************************************************************************/
/*********** Check if I have permission to change file metadata **************/
/*****************************************************************************/
static bool Brw_CheckIfICanEditFileMetadata ( long PublisherUsrCod )
{
long ZoneUsrCod ;
2016-01-17 15:10:54 +01:00
switch ( Gbl . Action . Act ) // Only in actions where edition is allowed
2014-12-01 23:55:08 +01:00
{
2015-01-20 00:32:15 +01:00
case ActReqDatAdmDocIns : case ActChgDatAdmDocIns :
2015-12-29 13:18:25 +01:00
case ActReqDatShaIns : case ActChgDatShaIns :
2015-02-06 00:40:03 +01:00
2015-01-20 00:32:15 +01:00
case ActReqDatAdmDocCtr : case ActChgDatAdmDocCtr :
2015-12-29 13:18:25 +01:00
case ActReqDatShaCtr : case ActChgDatShaCtr :
2015-02-06 00:40:03 +01:00
2015-01-20 00:32:15 +01:00
case ActReqDatAdmDocDeg : case ActChgDatAdmDocDeg :
2015-12-29 13:18:25 +01:00
case ActReqDatShaDeg : case ActChgDatShaDeg :
2015-02-06 00:40:03 +01:00
2014-12-01 23:55:08 +01:00
case ActReqDatAdmDocCrs : case ActChgDatAdmDocCrs :
case ActReqDatAdmDocGrp : case ActChgDatAdmDocGrp :
2016-04-22 09:47:25 +02:00
case ActReqDatTchCrs : case ActChgDatTchCrs :
case ActReqDatTchGrp : case ActChgDatTchGrp :
2015-12-29 13:18:25 +01:00
case ActReqDatShaCrs : case ActChgDatShaCrs :
case ActReqDatShaGrp : case ActChgDatShaGrp :
2015-02-06 00:40:03 +01:00
2014-12-01 23:55:08 +01:00
case ActReqDatAsgUsr : case ActChgDatAsgUsr :
case ActReqDatAsgCrs : case ActChgDatAsgCrs :
2016-04-22 09:47:25 +02:00
2014-12-01 23:55:08 +01:00
case ActReqDatWrkCrs : case ActChgDatWrkCrs :
case ActReqDatWrkUsr : case ActChgDatWrkUsr :
2015-02-06 00:40:03 +01:00
2014-12-01 23:55:08 +01:00
case ActReqDatAdmMrkCrs : case ActChgDatAdmMrkCrs :
case ActReqDatAdmMrkGrp : case ActChgDatAdmMrkGrp :
2015-02-06 00:40:03 +01:00
2014-12-01 23:55:08 +01:00
case ActReqDatBrf : case ActChgDatBrf :
2015-01-20 00:32:15 +01:00
if ( Gbl . Usrs . Me . Logged ) // I am logged
2014-12-01 23:55:08 +01:00
{
if ( PublisherUsrCod > 0 ) // The file has publisher
{
if ( PublisherUsrCod = = Gbl . Usrs . Me . UsrDat . UsrCod ) // I am the publisher
return true ;
}
else // The file has no publisher
{
2015-01-25 00:58:21 +01:00
ZoneUsrCod = Brw_GetZoneUsrCodForFiles ( ) ;
2015-04-07 21:44:24 +02:00
if ( ( ZoneUsrCod < = 0 & & Gbl . Usrs . Me . LoggedRole = = Rol_SYS_ADM ) | | // It's a zone without owner and I am a superuser (I may be the future owner)
2014-12-01 23:55:08 +01:00
ZoneUsrCod = = Gbl . Usrs . Me . UsrDat . UsrCod ) // I am the owner
return true ;
}
}
break ;
default :
break ;
}
return false ;
}
/*****************************************************************************/
/****************** Write link to download a file or link ********************/
/*****************************************************************************/
// FileType can be Brw_IS_FILE or Brw_IS_LINK
2016-01-03 15:36:46 +01:00
static void Brw_WriteBigLinkToDownloadFile ( const char * URL ,
struct FileMetadata * FileMetadata ,
2014-12-01 23:55:08 +01:00
const char * FileNameToShow )
{
extern const char * Txt_Check_marks_in_file_X ;
extern const char * Txt_Download ;
/***** On the screen a link will be shown to download the file *****/
2015-01-26 12:39:48 +01:00
if ( Gbl . FileBrowser . Type = = Brw_SHOW_MARKS_CRS | |
Gbl . FileBrowser . Type = = Brw_SHOW_MARKS_GRP )
2014-12-01 23:55:08 +01:00
{
/* Form to see marks */
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_MARKS_CRS :
2014-12-01 23:55:08 +01:00
Act_FormStart ( ActSeeMyMrkCrs ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Act_FormStart ( ActSeeMyMrkGrp ) ;
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
default : // Not aplicable here
break ;
}
2016-01-03 15:36:46 +01:00
Brw_ParamListFiles ( FileMetadata - > FileType ,
FileMetadata - > PathInTreeUntilFilFolLnk ,
FileMetadata - > FilFolLnkName ) ;
2014-12-01 23:55:08 +01:00
/* Link begin */
sprintf ( Gbl . Title , Txt_Check_marks_in_file_X , FileNameToShow ) ;
Act_LinkFormSubmit ( Gbl . Title , " FILENAME " ) ;
2016-01-03 15:36:46 +01:00
Brw_PutIconFile ( 32 , FileMetadata - > FileType , FileMetadata - > FilFolLnkName ) ;
2014-12-01 23:55:08 +01:00
/* Name of the file of marks, link end and form end */
fprintf ( Gbl . F . Out , " %s "
2015-07-21 20:07:46 +02:00
" <img src= \" %s/grades32x32.gif \" "
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON40x40 \" /> "
2015-03-13 00:16:02 +01:00
" </a> " ,
2015-07-21 20:07:46 +02:00
FileNameToShow , Gbl . Prefs . IconsURL ,
Gbl . Title , Gbl . Title ) ;
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
}
else
{
/* Put anchor and filename */
fprintf ( Gbl . F . Out , " <a href= \" %s \" class= \" FILENAME \" "
" title= \" %s \" target= \" _blank \" > " ,
URL ,
2016-01-03 15:36:46 +01:00
( FileMetadata - > FileType = = Brw_IS_LINK ) ? URL : // If it's a link, show full URL in title
FileNameToShow ) ;
Brw_PutIconFile ( 32 , FileMetadata - > FileType , FileMetadata - > FilFolLnkName ) ;
2014-12-01 23:55:08 +01:00
fprintf ( Gbl . F . Out , " %s "
2015-01-13 14:19:08 +01:00
" <img src= \" %s/%s/download64x64.gif \" "
2014-12-01 23:55:08 +01:00
" alt= \" %s \" title= \" %s \" "
2015-12-13 12:51:41 +01:00
" class= \" ICON40x40 \" > "
2014-12-01 23:55:08 +01:00
" </a> " ,
FileNameToShow ,
2015-01-13 14:19:08 +01:00
Gbl . Prefs . PathIconSet , Cfg_ICON_ACTION ,
2014-12-01 23:55:08 +01:00
Txt_Download , Txt_Download ) ;
}
}
/*****************************************************************************/
/*********************** Write link to download a file ***********************/
/*****************************************************************************/
static void Brw_WriteSmallLinkToDownloadFile ( const char * URL , Brw_FileType_t FileType ,
const char * FileNameToShow )
{
extern const char * Txt_Check_marks_in_file_X ;
/***** On the screen a link will be shown to download the file *****/
2015-01-26 12:39:48 +01:00
if ( Gbl . FileBrowser . Type = = Brw_SHOW_MARKS_CRS | |
Gbl . FileBrowser . Type = = Brw_SHOW_MARKS_GRP )
2014-12-01 23:55:08 +01:00
{
/* Form to see marks */
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_SHOW_MARKS_CRS :
2014-12-01 23:55:08 +01:00
Act_FormStart ( ActSeeMyMrkCrs ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_SHOW_MARKS_GRP :
2014-12-01 23:55:08 +01:00
Act_FormStart ( ActSeeMyMrkGrp ) ;
Grp_PutParamGrpCod ( Gbl . CurrentCrs . Grps . GrpCod ) ;
break ;
default : // Not aplicable here
break ;
}
Brw_ParamListFiles ( FileType ,
2016-01-03 15:36:46 +01:00
Gbl . FileBrowser . Priv . PathInTreeUntilFilFolLnk ,
2014-12-01 23:55:08 +01:00
Gbl . FileBrowser . FilFolLnkName ) ;
/* Link begin */
sprintf ( Gbl . Title , Txt_Check_marks_in_file_X , FileNameToShow ) ;
Act_LinkFormSubmit ( Gbl . Title , " DAT " ) ;
/* Name of the file of marks, link end and form end */
2015-03-13 00:16:02 +01:00
fprintf ( Gbl . F . Out , " %s</a> " , FileNameToShow ) ;
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
}
else
/* Put anchor and filename */
fprintf ( Gbl . F . Out , " <a href= \" %s \" class= \" DAT \" title= \" %s \" target= \" _blank \" >%s</a> " ,
URL , FileNameToShow , FileNameToShow ) ;
}
/*****************************************************************************/
/************************ Get link to download a file ************************/
/*****************************************************************************/
void Brw_GetLinkToDownloadFile ( const char * PathInTree , const char * FileName , char * URL )
{
char FullPathIncludingFile [ PATH_MAX + 1 ] ;
FILE * FileURL ;
char URLWithSpaces [ PATH_MAX + 1 ] ;
/***** Construct absolute path to file in the private directory *****/
sprintf ( FullPathIncludingFile , " %s/%s/%s " ,
Gbl . FileBrowser . Priv . PathAboveRootFolder ,
PathInTree , FileName ) ;
if ( Str_FileIs ( FileName , " url " ) ) // It's a link (URL inside a .url file)
{
/***** Open .url file *****/
if ( ( FileURL = fopen ( FullPathIncludingFile , " rb " ) ) )
{
if ( fgets ( URLWithSpaces , PATH_MAX , FileURL ) = = NULL )
URLWithSpaces [ 0 ] = ' \0 ' ;
/* File is not longer needed ==> close it */
fclose ( FileURL ) ;
}
}
else
{
/***** Create a temporary public directory used to download files *****/
Brw_CreateDirDownloadTmp ( ) ;
/***** Create symbolic link from temporary public directory to private file in order to gain access to it for downloading *****/
2016-04-01 14:44:55 +02:00
Brw_CreateTmpPublicLinkToPrivateFile ( FullPathIncludingFile , FileName ) ;
2014-12-01 23:55:08 +01:00
/***** Create URL pointing to symbolic link *****/
sprintf ( URLWithSpaces , " %s/%s/%s/%s " ,
Cfg_HTTPS_URL_SWAD_PUBLIC , Cfg_FOLDER_FILE_BROWSER_TMP ,
Gbl . FileBrowser . TmpPubDir ,
FileName ) ;
}
2014-12-21 14:47:04 +01:00
Str_CopyStrChangingSpaces ( URLWithSpaces , URL , PATH_MAX ) ; // In HTML, URL must have no spaces
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/**************** Change metadata of a file in a file browser ****************/
/*****************************************************************************/
void Brw_ChgFileMetadata ( void )
{
extern const char * Txt_The_properties_of_file_X_have_been_saved ;
extern const char * Txt_You_dont_have_permission_to_change_the_properties_of_file_X ;
struct FileMetadata FileMetadata ;
2015-12-29 00:44:51 +01:00
bool PublicFileBeforeEdition ;
bool PublicFileAfterEdition ;
2014-12-01 23:55:08 +01:00
Brw_License_t License ;
2016-01-25 11:43:14 +01:00
struct SocialPublishing SocPub ;
2014-12-01 23:55:08 +01:00
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
/***** Get file metadata from database *****/
Brw_GetFileMetadataByPath ( & FileMetadata ) ;
2015-02-23 23:45:32 +01:00
Brw_GetFileTypeSizeAndDate ( & FileMetadata ) ;
2014-12-01 23:55:08 +01:00
/***** Check if I can change file metadata *****/
if ( Brw_CheckIfICanEditFileMetadata ( FileMetadata . PublisherUsrCod ) )
{
2015-12-29 00:44:51 +01:00
/* Check if the file was public before the edition */
PublicFileBeforeEdition = FileMetadata . IsPublic ;
2015-03-06 20:50:25 +01:00
/***** Get the new file privacy and license from form *****/
2014-12-01 23:55:08 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_INS :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_INS :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CTR :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_CTR :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_DEG :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_DEG :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS :
case Brw_ADMI_SHARE_CRS :
2015-12-29 00:44:51 +01:00
PublicFileAfterEdition = Brw_GetParamPublicFile ( ) ;
2014-12-01 23:55:08 +01:00
License = Brw_GetParLicense ( ) ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_ASSIG_USR :
case Brw_ADMI_ASSIG_CRS :
case Brw_ADMI_WORKS_USR :
case Brw_ADMI_WORKS_CRS :
case Brw_ADMI_BRIEF_USR :
2015-12-29 00:44:51 +01:00
PublicFileAfterEdition = false ; // Files in these zones can not be public
2014-12-01 23:55:08 +01:00
License = Brw_GetParLicense ( ) ;
break ;
default :
2015-12-29 00:44:51 +01:00
PublicFileAfterEdition = false ; // Files in other zones can not be public
2014-12-01 23:55:08 +01:00
License = Brw_LICENSE_DEFAULT ;
break ;
}
/***** Change file metadata *****/
if ( FileMetadata . FilCod > 0 ) // Entry exists in database
Brw_ChangeFilePublicInDB ( Gbl . Usrs . Me . UsrDat . UsrCod ,
Gbl . FileBrowser . Priv . FullPathInTree ,
2015-12-29 00:44:51 +01:00
PublicFileAfterEdition , License ) ;
2014-12-01 23:55:08 +01:00
else // No entry in database
2015-12-29 00:44:51 +01:00
FileMetadata . FilCod = Brw_AddPathToDB ( Gbl . Usrs . Me . UsrDat . UsrCod , FileMetadata . FileType ,
Gbl . FileBrowser . Priv . FullPathInTree ,
PublicFileAfterEdition , License ) ;
2014-12-01 23:55:08 +01:00
/***** Remove the affected clipboards *****/
Brw_RemoveAffectedClipboards ( Gbl . FileBrowser . Type ,
Gbl . Usrs . Me . UsrDat . UsrCod ,
Gbl . Usrs . Other . UsrDat . UsrCod ) ;
2015-12-29 00:44:51 +01:00
/***** Insert file into public social activity *****/
if ( ! PublicFileBeforeEdition & &
PublicFileAfterEdition ) // Only if file has changed from private to public
switch ( Gbl . FileBrowser . Type )
{
case Brw_ADMI_DOCUM_INS :
2016-01-25 11:43:14 +01:00
Soc_StoreAndPublishSocialNote ( Soc_NOTE_INS_DOC_PUB_FILE , FileMetadata . FilCod , & SocPub ) ;
2015-12-29 00:44:51 +01:00
break ;
case Brw_ADMI_SHARE_INS :
2016-01-25 11:43:14 +01:00
Soc_StoreAndPublishSocialNote ( Soc_NOTE_INS_SHA_PUB_FILE , FileMetadata . FilCod , & SocPub ) ;
2015-12-29 00:44:51 +01:00
break ;
case Brw_ADMI_DOCUM_CTR :
2016-01-25 11:43:14 +01:00
Soc_StoreAndPublishSocialNote ( Soc_NOTE_CTR_DOC_PUB_FILE , FileMetadata . FilCod , & SocPub ) ;
2015-12-29 00:44:51 +01:00
break ;
case Brw_ADMI_SHARE_CTR :
2016-01-25 11:43:14 +01:00
Soc_StoreAndPublishSocialNote ( Soc_NOTE_CTR_SHA_PUB_FILE , FileMetadata . FilCod , & SocPub ) ;
2015-12-29 00:44:51 +01:00
break ;
case Brw_ADMI_DOCUM_DEG :
2016-01-25 11:43:14 +01:00
Soc_StoreAndPublishSocialNote ( Soc_NOTE_DEG_DOC_PUB_FILE , FileMetadata . FilCod , & SocPub ) ;
2015-12-29 00:44:51 +01:00
break ;
case Brw_ADMI_SHARE_DEG :
2016-01-25 11:43:14 +01:00
Soc_StoreAndPublishSocialNote ( Soc_NOTE_DEG_SHA_PUB_FILE , FileMetadata . FilCod , & SocPub ) ;
2015-12-29 00:44:51 +01:00
break ;
case Brw_ADMI_DOCUM_CRS :
2016-01-25 11:43:14 +01:00
Soc_StoreAndPublishSocialNote ( Soc_NOTE_CRS_DOC_PUB_FILE , FileMetadata . FilCod , & SocPub ) ;
2015-12-29 00:44:51 +01:00
break ;
case Brw_ADMI_SHARE_CRS :
2016-01-25 11:43:14 +01:00
Soc_StoreAndPublishSocialNote ( Soc_NOTE_CRS_SHA_PUB_FILE , FileMetadata . FilCod , & SocPub ) ;
2015-12-29 00:44:51 +01:00
break ;
default :
break ;
}
2014-12-01 23:55:08 +01:00
/***** Write message of confirmation *****/
sprintf ( Gbl . Message , Txt_The_properties_of_file_X_have_been_saved ,
Gbl . FileBrowser . FilFolLnkName ) ;
Lay_ShowAlert ( Lay_SUCCESS , Gbl . Message ) ;
}
else
{
/***** Write message of error *****/
sprintf ( Gbl . Message , Txt_You_dont_have_permission_to_change_the_properties_of_file_X ,
Gbl . FileBrowser . FilFolLnkName ) ;
Lay_ShowAlert ( Lay_ERROR , Gbl . Message ) ;
}
/***** Show again the file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/*********** Get parameter with public / private file from form *************/
/*****************************************************************************/
static bool Brw_GetParamPublicFile ( void )
{
char YN [ 1 + 1 ] ;
Par_GetParToText ( " PublicFile " , YN , 1 ) ;
return ( Str_ConvertToUpperLetter ( YN [ 0 ] ) = = ' Y ' ) ;
}
/*****************************************************************************/
/******************** Get parameter with file license ***********************/
/*****************************************************************************/
static Brw_License_t Brw_GetParLicense ( void )
{
char UnsignedStr [ 10 + 1 ] ;
unsigned UnsignedNum ;
/* Get file license from form */
Par_GetParToText ( " License " , UnsignedStr , 10 ) ;
if ( sscanf ( UnsignedStr , " %u " , & UnsignedNum ) ! = 1 )
return Brw_LICENSE_UNKNOWN ;
if ( UnsignedNum < Brw_NUM_LICENSES )
return ( Brw_License_t ) UnsignedNum ;
return Brw_LICENSE_UNKNOWN ;
}
/*****************************************************************************/
/*********************** Get file code using its path ************************/
/*****************************************************************************/
2016-01-04 01:02:07 +01:00
// Path is the full path in tree
2014-12-01 23:55:08 +01:00
// Example: descarga/folder/file.pdf
2016-01-04 01:02:07 +01:00
long Brw_GetFilCodByPath ( const char * Path , bool OnlyIfPublic )
2014-12-01 23:55:08 +01:00
{
2015-01-25 00:58:21 +01:00
long Cod = Brw_GetCodForFiles ( ) ;
long ZoneUsrCod = Brw_GetZoneUsrCodForFiles ( ) ;
2014-12-01 23:55:08 +01:00
char Query [ 256 + PATH_MAX ] ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
long FilCod ;
2016-01-04 01:02:07 +01:00
/***** Get code of a file from database *****/
2014-12-01 23:55:08 +01:00
sprintf ( Query , " SELECT FilCod FROM files "
2015-01-25 00:58:21 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' AND ZoneUsrCod='%ld' "
2016-01-04 01:02:07 +01:00
" AND Path='%s'%s " ,
2015-01-24 19:30:44 +01:00
( unsigned ) Brw_FileBrowserForDB_files [ Gbl . FileBrowser . Type ] ,
2015-01-25 00:58:21 +01:00
Cod , ZoneUsrCod ,
2016-01-04 01:02:07 +01:00
Path ,
OnlyIfPublic ? " AND Public='Y' " :
" " ) ;
2014-12-01 23:55:08 +01:00
if ( DB_QuerySELECT ( Query , & mysql_res , " can not get file code " ) )
{
/* Get row */
row = mysql_fetch_row ( mysql_res ) ;
/* Get file code (row[0]) */
FilCod = Str_ConvertStrCodToLongCod ( row [ 0 ] ) ;
}
else
FilCod = - 1L ;
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult ( & mysql_res ) ;
return FilCod ;
}
/*****************************************************************************/
/********************* Get file metadata using its path **********************/
/*****************************************************************************/
// This function only gets metadata stored in table files,
// does not get size, time, numviews...
void Brw_GetFileMetadataByPath ( struct FileMetadata * FileMetadata )
{
2015-01-25 00:58:21 +01:00
long Cod = Brw_GetCodForFiles ( ) ;
long ZoneUsrCod = Brw_GetZoneUsrCodForFiles ( ) ;
2014-12-01 23:55:08 +01:00
char Query [ 512 + PATH_MAX ] ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
unsigned UnsignedNum ;
/***** Get metadata of a file from database *****/
2015-01-25 00:58:21 +01:00
sprintf ( Query , " SELECT FilCod,FileBrowser,Cod,ZoneUsrCod, "
" PublisherUsrCod,FileType,Path,Hidden,Public,License "
2014-12-01 23:55:08 +01:00
" FROM files "
2015-01-25 00:58:21 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' AND ZoneUsrCod='%ld' "
" AND Path='%s' " ,
2015-01-24 19:30:44 +01:00
( unsigned ) Brw_FileBrowserForDB_files [ Gbl . FileBrowser . Type ] ,
2015-01-25 00:58:21 +01:00
Cod , ZoneUsrCod ,
2014-12-01 23:55:08 +01:00
Gbl . FileBrowser . Priv . FullPathInTree ) ;
if ( DB_QuerySELECT ( Query , & mysql_res , " can not get file metadata " ) )
{
/* Get row */
row = mysql_fetch_row ( mysql_res ) ;
/* Get file code (row[0]) */
FileMetadata - > FilCod = Str_ConvertStrCodToLongCod ( row [ 0 ] ) ;
2015-01-25 00:58:21 +01:00
/* Get file browser type in database (row[1]) */
2015-01-26 12:39:48 +01:00
FileMetadata - > FileBrowser = Brw_UNKNOWN ;
2015-01-25 00:58:21 +01:00
if ( sscanf ( row [ 1 ] , " %u " , & UnsignedNum ) = = 1 )
2014-12-01 23:55:08 +01:00
if ( UnsignedNum < Brw_NUM_TYPES_FILE_BROWSER )
FileMetadata - > FileBrowser = ( Brw_FileBrowser_t ) UnsignedNum ;
2015-01-25 00:58:21 +01:00
/* Get institution/centre/degree/course/group code (row[2]) */
FileMetadata - > Cod = Str_ConvertStrCodToLongCod ( row [ 2 ] ) ;
/* Get the user's code of the owner of a zone of files (row[3]) */
FileMetadata - > ZoneUsrCod = Str_ConvertStrCodToLongCod ( row [ 3 ] ) ;
2014-12-01 23:55:08 +01:00
2015-01-25 00:58:21 +01:00
/* Get publisher's code (row[4]) */
FileMetadata - > PublisherUsrCod = Str_ConvertStrCodToLongCod ( row [ 4 ] ) ;
/* Get file type (row[5]) */
2014-12-01 23:55:08 +01:00
FileMetadata - > FileType = Brw_IS_UNKNOWN ; // default
2015-01-25 00:58:21 +01:00
if ( sscanf ( row [ 5 ] , " %u " , & UnsignedNum ) = = 1 )
2014-12-01 23:55:08 +01:00
if ( UnsignedNum < Brw_NUM_FILE_TYPES )
FileMetadata - > FileType = ( Brw_FileType_t ) UnsignedNum ;
2015-01-25 00:58:21 +01:00
/* Get path (row[6]) */
2016-01-03 15:36:46 +01:00
strncpy ( FileMetadata - > FullPathInTree , row [ 6 ] , PATH_MAX ) ;
FileMetadata - > FullPathInTree [ PATH_MAX ] = ' \0 ' ;
Str_SplitFullPathIntoPathAndFileName ( FileMetadata - > FullPathInTree ,
FileMetadata - > PathInTreeUntilFilFolLnk ,
FileMetadata - > FilFolLnkName ) ;
2014-12-01 23:55:08 +01:00
2015-01-25 00:58:21 +01:00
/* File is hidden? (row[7]) */
2014-12-01 23:55:08 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-02-05 22:59:48 +01:00
case Brw_SHOW_DOCUM_INS :
case Brw_ADMI_DOCUM_INS :
case Brw_SHOW_DOCUM_CTR :
case Brw_ADMI_DOCUM_CTR :
case Brw_SHOW_DOCUM_DEG :
case Brw_ADMI_DOCUM_DEG :
case Brw_SHOW_DOCUM_CRS :
case Brw_ADMI_DOCUM_CRS :
2015-01-25 00:58:21 +01:00
FileMetadata - > IsHidden = ( Str_ConvertToUpperLetter ( row [ 7 ] [ 0 ] ) = = ' Y ' ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
FileMetadata - > IsHidden = false ;
break ;
}
2015-01-25 00:58:21 +01:00
/* Is a public file? (row[8]) */
2014-12-01 23:55:08 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-02-05 22:59:48 +01:00
case Brw_SHOW_DOCUM_INS :
case Brw_ADMI_DOCUM_INS :
case Brw_ADMI_SHARE_INS :
case Brw_SHOW_DOCUM_CTR :
case Brw_ADMI_DOCUM_CTR :
case Brw_ADMI_SHARE_CTR :
case Brw_SHOW_DOCUM_DEG :
case Brw_ADMI_DOCUM_DEG :
case Brw_ADMI_SHARE_DEG :
case Brw_SHOW_DOCUM_CRS :
case Brw_ADMI_DOCUM_CRS :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
2015-01-25 00:58:21 +01:00
FileMetadata - > IsPublic = ( Str_ConvertToUpperLetter ( row [ 8 ] [ 0 ] ) = = ' Y ' ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
FileMetadata - > IsPublic = false ;
break ;
}
2015-01-25 00:58:21 +01:00
/* Get license (row[9]) */
2014-12-01 23:55:08 +01:00
FileMetadata - > License = Brw_LICENSE_UNKNOWN ;
2015-01-25 00:58:21 +01:00
if ( sscanf ( row [ 9 ] , " %u " , & UnsignedNum ) = = 1 )
2014-12-01 23:55:08 +01:00
if ( UnsignedNum < Brw_NUM_LICENSES )
FileMetadata - > License = ( Brw_License_t ) UnsignedNum ;
}
else
{
2016-01-03 15:36:46 +01:00
FileMetadata - > FilCod = - 1L ;
FileMetadata - > FileBrowser = Brw_UNKNOWN ;
FileMetadata - > Cod = - 1L ;
FileMetadata - > ZoneUsrCod = - 1L ;
FileMetadata - > PublisherUsrCod = - 1L ;
FileMetadata - > FileType = Brw_IS_UNKNOWN ;
FileMetadata - > FullPathInTree [ 0 ] = ' \0 ' ;
FileMetadata - > PathInTreeUntilFilFolLnk [ 0 ] = ' \0 ' ;
FileMetadata - > FilFolLnkName [ 0 ] = ' \0 ' ;
FileMetadata - > IsHidden = false ;
FileMetadata - > IsPublic = false ;
FileMetadata - > License = Brw_LICENSE_DEFAULT ;
2014-12-01 23:55:08 +01:00
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult ( & mysql_res ) ;
/***** Fill some values with 0 (unused at this moment) *****/
FileMetadata - > Size = ( off_t ) 0 ;
FileMetadata - > Time = ( time_t ) 0 ;
FileMetadata - > NumMyViews =
FileMetadata - > NumPublicViews =
FileMetadata - > NumViewsFromLoggedUsrs =
FileMetadata - > NumLoggedUsrs = 0 ;
}
/*****************************************************************************/
/********************* Get file metadata using its code **********************/
/*****************************************************************************/
// FileMetadata.FilCod must be filled
// This function only gets metadata stored in table files,
// does not get size, time, numviews...
void Brw_GetFileMetadataByCod ( struct FileMetadata * FileMetadata )
{
char Query [ 512 ] ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
unsigned UnsignedNum ;
/***** Get metadata of a file from database *****/
2015-01-25 00:58:21 +01:00
sprintf ( Query , " SELECT FilCod,FileBrowser,Cod,ZoneUsrCod, "
2015-01-25 02:07:04 +01:00
" PublisherUsrCod,FileType,Path,Hidden,Public,License "
2014-12-01 23:55:08 +01:00
" FROM files "
" WHERE FilCod='%ld' " ,
FileMetadata - > FilCod ) ;
if ( DB_QuerySELECT ( Query , & mysql_res , " can not get file metadata " ) )
{
/* Get row */
row = mysql_fetch_row ( mysql_res ) ;
/* Get file code (row[0]) */
FileMetadata - > FilCod = Str_ConvertStrCodToLongCod ( row [ 0 ] ) ;
2015-01-25 00:58:21 +01:00
/* Get file browser type in database (row[1]) */
2015-01-26 12:39:48 +01:00
FileMetadata - > FileBrowser = Brw_UNKNOWN ;
2015-01-25 00:58:21 +01:00
if ( sscanf ( row [ 1 ] , " %u " , & UnsignedNum ) = = 1 )
2014-12-01 23:55:08 +01:00
if ( UnsignedNum < Brw_NUM_TYPES_FILE_BROWSER )
FileMetadata - > FileBrowser = ( Brw_FileBrowser_t ) UnsignedNum ;
2015-01-25 00:58:21 +01:00
/* Get institution/centre/degree/course/group code (row[2]) */
FileMetadata - > Cod = Str_ConvertStrCodToLongCod ( row [ 2 ] ) ;
/* Get the user's code of the owner of a zone of files (row[3]) */
FileMetadata - > ZoneUsrCod = Str_ConvertStrCodToLongCod ( row [ 3 ] ) ;
2014-12-01 23:55:08 +01:00
2015-01-25 00:58:21 +01:00
/* Get publisher's code (row[4]) */
FileMetadata - > PublisherUsrCod = Str_ConvertStrCodToLongCod ( row [ 4 ] ) ;
/* Get file type (row[5]) */
2014-12-01 23:55:08 +01:00
FileMetadata - > FileType = Brw_IS_UNKNOWN ; // default
2015-01-25 00:58:21 +01:00
if ( sscanf ( row [ 5 ] , " %u " , & UnsignedNum ) = = 1 )
2014-12-01 23:55:08 +01:00
if ( UnsignedNum < Brw_NUM_FILE_TYPES )
FileMetadata - > FileType = ( Brw_FileType_t ) UnsignedNum ;
2015-01-25 00:58:21 +01:00
/* Get path (row[6]) */
2016-01-03 15:36:46 +01:00
strncpy ( FileMetadata - > FullPathInTree , row [ 6 ] , PATH_MAX ) ;
FileMetadata - > FullPathInTree [ PATH_MAX ] = ' \0 ' ;
Str_SplitFullPathIntoPathAndFileName ( FileMetadata - > FullPathInTree ,
FileMetadata - > PathInTreeUntilFilFolLnk ,
FileMetadata - > FilFolLnkName ) ;
2014-12-01 23:55:08 +01:00
2015-01-25 00:58:21 +01:00
/* Is a hidden file? (row[7]) */
2014-12-01 23:55:08 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-02-05 22:59:48 +01:00
case Brw_SHOW_DOCUM_INS :
case Brw_ADMI_DOCUM_INS :
case Brw_SHOW_DOCUM_CTR :
case Brw_ADMI_DOCUM_CTR :
case Brw_SHOW_DOCUM_DEG :
case Brw_ADMI_DOCUM_DEG :
case Brw_SHOW_DOCUM_CRS :
case Brw_ADMI_DOCUM_CRS :
2015-01-25 00:58:21 +01:00
FileMetadata - > IsHidden = ( Str_ConvertToUpperLetter ( row [ 7 ] [ 0 ] ) = = ' Y ' ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
FileMetadata - > IsHidden = false ;
break ;
}
2015-01-25 00:58:21 +01:00
/* Is a public file? (row[8]) */
2014-12-01 23:55:08 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-02-05 22:59:48 +01:00
case Brw_SHOW_DOCUM_INS :
case Brw_ADMI_DOCUM_INS :
case Brw_ADMI_SHARE_INS :
case Brw_SHOW_DOCUM_CTR :
case Brw_ADMI_DOCUM_CTR :
case Brw_ADMI_SHARE_CTR :
case Brw_SHOW_DOCUM_DEG :
case Brw_ADMI_DOCUM_DEG :
case Brw_ADMI_SHARE_DEG :
case Brw_SHOW_DOCUM_CRS :
case Brw_ADMI_DOCUM_CRS :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
2015-01-25 00:58:21 +01:00
FileMetadata - > IsPublic = ( Str_ConvertToUpperLetter ( row [ 8 ] [ 0 ] ) = = ' Y ' ) ;
2014-12-01 23:55:08 +01:00
break ;
default :
FileMetadata - > IsPublic = false ;
break ;
}
2015-01-25 00:58:21 +01:00
/* Get license (row[9]) */
2014-12-01 23:55:08 +01:00
FileMetadata - > License = Brw_LICENSE_UNKNOWN ;
2015-01-25 00:58:21 +01:00
if ( sscanf ( row [ 9 ] , " %u " , & UnsignedNum ) = = 1 )
2014-12-01 23:55:08 +01:00
if ( UnsignedNum < Brw_NUM_LICENSES )
FileMetadata - > License = ( Brw_License_t ) UnsignedNum ;
}
else
{
2016-01-03 15:36:46 +01:00
FileMetadata - > FilCod = - 1L ;
FileMetadata - > FileBrowser = Brw_UNKNOWN ;
FileMetadata - > Cod = - 1L ;
FileMetadata - > ZoneUsrCod = - 1L ;
FileMetadata - > PublisherUsrCod = - 1L ;
FileMetadata - > FileType = Brw_IS_UNKNOWN ;
FileMetadata - > FullPathInTree [ 0 ] = ' \0 ' ;
FileMetadata - > PathInTreeUntilFilFolLnk [ 0 ] = ' \0 ' ;
FileMetadata - > FilFolLnkName [ 0 ] = ' \0 ' ;
FileMetadata - > IsHidden = false ;
FileMetadata - > IsPublic = false ;
FileMetadata - > License = Brw_LICENSE_DEFAULT ;
2014-12-01 23:55:08 +01:00
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult ( & mysql_res ) ;
/***** Fill some values with 0 (unused at this moment) *****/
FileMetadata - > Size = ( off_t ) 0 ;
FileMetadata - > Time = ( time_t ) 0 ;
FileMetadata - > NumMyViews =
FileMetadata - > NumPublicViews =
FileMetadata - > NumViewsFromLoggedUsrs =
FileMetadata - > NumLoggedUsrs = 0 ;
}
/*****************************************************************************/
/*************************** Get file size and date **************************/
/*****************************************************************************/
// Return true if file exists
2015-02-23 23:45:32 +01:00
bool Brw_GetFileTypeSizeAndDate ( struct FileMetadata * FileMetadata )
2014-12-01 23:55:08 +01:00
{
char Path [ PATH_MAX + 1 ] ;
struct stat FileStatus ;
sprintf ( Path , " %s/%s " , Gbl . FileBrowser . Priv . PathAboveRootFolder ,
2016-01-03 15:36:46 +01:00
FileMetadata - > FullPathInTree ) ;
2014-12-01 23:55:08 +01:00
if ( lstat ( Path , & FileStatus ) )
{
// Error on lstat
FileMetadata - > FileType = Brw_IS_UNKNOWN ;
FileMetadata - > Size = ( off_t ) 0 ;
FileMetadata - > Time = ( time_t ) 0 ;
return false ;
}
else
{
if ( S_ISDIR ( FileStatus . st_mode ) )
FileMetadata - > FileType = Brw_IS_FOLDER ;
else if ( S_ISREG ( FileStatus . st_mode ) )
2016-01-03 15:36:46 +01:00
FileMetadata - > FileType = Str_FileIs ( FileMetadata - > FullPathInTree , " url " ) ? Brw_IS_LINK :
Brw_IS_FILE ;
2014-12-01 23:55:08 +01:00
else
FileMetadata - > FileType = Brw_IS_UNKNOWN ;
FileMetadata - > Size = FileStatus . st_size ;
FileMetadata - > Time = FileStatus . st_mtime ;
return true ;
}
}
/*****************************************************************************/
/*********************** Get and update views of a file **********************/
/*****************************************************************************/
/*
Input : FileMetadata - > FilCod
Output : FileMetadata - > NumMyViews
FileMetadata - > NumPublicViews
FileMetadata - > NumViewsFromLoggedUsrs
FileMetadata - > NumLoggedUsrs
*/
void Brw_GetAndUpdateFileViews ( struct FileMetadata * FileMetadata )
{
if ( FileMetadata - > FilCod > 0 )
{
/***** Get file views from logged users *****/
Brw_GetFileViewsFromLoggedUsrs ( FileMetadata ) ;
/***** Get file views from non logged users *****/
Brw_GetFileViewsFromNonLoggedUsrs ( FileMetadata ) ;
/***** Get number of my views *****/
if ( Gbl . Usrs . Me . Logged )
{
if ( FileMetadata - > NumViewsFromLoggedUsrs )
FileMetadata - > NumMyViews = Brw_GetFileViewsFromMe ( FileMetadata - > FilCod ) ;
else
FileMetadata - > NumMyViews = 0 ;
}
else
FileMetadata - > NumMyViews = FileMetadata - > NumPublicViews ;
/***** Update number of my views (if I am not logged, UsrCod == -1L) *****/
Brw_UpdateFileViews ( FileMetadata - > NumMyViews , FileMetadata - > FilCod ) ;
2015-03-14 02:26:59 +01:00
/***** Increment number of file views in my user's figures *****/
if ( Gbl . Usrs . Me . Logged )
2015-03-14 17:39:04 +01:00
Prf_IncrementNumFileViewsUsr ( Gbl . Usrs . Me . UsrDat . UsrCod ) ;
2014-12-01 23:55:08 +01:00
}
else
FileMetadata - > NumMyViews =
FileMetadata - > NumPublicViews =
FileMetadata - > NumViewsFromLoggedUsrs =
FileMetadata - > NumLoggedUsrs = 0 ;
}
/*****************************************************************************/
/************************** Update my views of a file ************************/
/*****************************************************************************/
void Brw_UpdateMyFileViews ( long FilCod )
{
/***** Update number of my views *****/
Brw_UpdateFileViews ( Brw_GetFileViewsFromMe ( FilCod ) , FilCod ) ;
}
2015-03-14 02:26:59 +01:00
/*****************************************************************************/
/******************** Get number of file views from a user *******************/
/*****************************************************************************/
unsigned long Brw_GetNumFileViewsUsr ( long UsrCod )
{
char Query [ 128 ] ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
unsigned long FileViews ;
/***** Get number of filw views *****/
sprintf ( Query , " SELECT SUM(NumViews) FROM file_view WHERE UsrCod='%ld' " ,
UsrCod ) ;
if ( DB_QuerySELECT ( Query , & mysql_res , " can not get number of file views " ) )
{
/* Get number of file views */
row = mysql_fetch_row ( mysql_res ) ;
if ( row [ 0 ] )
{
if ( sscanf ( row [ 0 ] , " %lu " , & FileViews ) ! = 1 )
FileViews = 0 ;
}
else
FileViews = 0 ;
}
else
FileViews = 0 ;
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult ( & mysql_res ) ;
return FileViews ;
}
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/******************** Get file views from logged users ***********************/
/*****************************************************************************/
/*
Input : FileMetadata - > FilCod
Output : FileMetadata - > NumViewsFromLoggedUsrs
FileMetadata - > NumLoggedUsrs
*/
static void Brw_GetFileViewsFromLoggedUsrs ( struct FileMetadata * FileMetadata )
{
char Query [ 256 ] ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
/***** Get number total of views from logged users *****/
sprintf ( Query , " SELECT COUNT(DISTINCT UsrCod),SUM(NumViews) "
" FROM file_view "
" WHERE FilCod='%ld' AND UsrCod>'0' " ,
FileMetadata - > FilCod ) ;
if ( DB_QuerySELECT ( Query , & mysql_res , " can not get number of views of a file from logged users " ) )
{
row = mysql_fetch_row ( mysql_res ) ;
/* Get number of distinct users (row[0]) */
if ( sscanf ( row [ 0 ] , " %u " , & ( FileMetadata - > NumLoggedUsrs ) ) ! = 1 )
FileMetadata - > NumLoggedUsrs = 0 ;
/* Get number of views (row[1]) */
if ( row [ 1 ] )
{
if ( sscanf ( row [ 1 ] , " %u " , & ( FileMetadata - > NumViewsFromLoggedUsrs ) ) ! = 1 )
FileMetadata - > NumViewsFromLoggedUsrs = 0 ;
}
else
FileMetadata - > NumViewsFromLoggedUsrs = 0 ;
}
else
FileMetadata - > NumViewsFromLoggedUsrs = FileMetadata - > NumLoggedUsrs = 0 ;
/* Free structure that stores the query result */
DB_FreeMySQLResult ( & mysql_res ) ;
}
/*****************************************************************************/
/****************** Get file views from non logged users *********************/
/*****************************************************************************/
/*
Input : FileMetadata - > FilCod
Output : FileMetadata - > NumPublicViews
*/
static void Brw_GetFileViewsFromNonLoggedUsrs ( struct FileMetadata * FileMetadata )
{
char Query [ 256 ] ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
/***** Get number of public views *****/
sprintf ( Query , " SELECT SUM(NumViews) FROM file_view "
" WHERE FilCod='%ld' AND UsrCod<='0' " ,
FileMetadata - > FilCod ) ;
if ( DB_QuerySELECT ( Query , & mysql_res , " can not get number of public views of a file " ) )
{
/* Get number of public views */
row = mysql_fetch_row ( mysql_res ) ;
if ( row [ 0 ] )
{
if ( sscanf ( row [ 0 ] , " %u " , & ( FileMetadata - > NumPublicViews ) ) ! = 1 )
FileMetadata - > NumPublicViews = 0 ;
}
else
FileMetadata - > NumPublicViews = 0 ;
}
else
FileMetadata - > NumPublicViews = 0 ;
2015-03-14 02:26:59 +01:00
/***** Free structure that stores the query result *****/
2014-12-01 23:55:08 +01:00
DB_FreeMySQLResult ( & mysql_res ) ;
}
/*****************************************************************************/
/************************** Get file views from me ***************************/
/*****************************************************************************/
static unsigned Brw_GetFileViewsFromMe ( long FilCod )
{
char Query [ 256 ] ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
unsigned NumMyViews ;
/***** Get number of my views *****/
sprintf ( Query , " SELECT NumViews FROM file_view "
" WHERE FilCod='%ld' AND UsrCod='%ld' " ,
FilCod , Gbl . Usrs . Me . UsrDat . UsrCod ) ;
if ( DB_QuerySELECT ( Query , & mysql_res , " can not get my number of views of a file " ) )
{
/* Get number of my views */
row = mysql_fetch_row ( mysql_res ) ;
if ( sscanf ( row [ 0 ] , " %u " , & NumMyViews ) ! = 1 )
NumMyViews = 0 ;
}
else
NumMyViews = 0 ;
/* Free structure that stores the query result */
DB_FreeMySQLResult ( & mysql_res ) ;
return NumMyViews ;
}
/*****************************************************************************/
/*************************** Update file views *******************************/
/*****************************************************************************/
static void Brw_UpdateFileViews ( unsigned NumViews , long FilCod )
{
char Query [ 256 ] ;
if ( NumViews )
{
/* Update number of views in database */
sprintf ( Query , " UPDATE file_view SET NumViews=NumViews+1 "
" WHERE FilCod='%ld' AND UsrCod='%ld' " ,
FilCod , Gbl . Usrs . Me . UsrDat . UsrCod ) ;
DB_QueryUPDATE ( Query , " can not update number of views of a file " ) ;
}
else // NumViews == 0
{
/* Insert number of views in database */
sprintf ( Query , " INSERT INTO file_view "
" (FilCod,UsrCod,NumViews) "
" VALUES ('%ld','%ld','1') " ,
FilCod , Gbl . Usrs . Me . UsrDat . UsrCod ) ;
DB_QueryINSERT ( Query , " can not insert number of views of a file " ) ;
}
}
/*****************************************************************************/
/*********** Check if a folder contains file(s) marked as public *************/
/*****************************************************************************/
static bool Brw_GetIfFolderHasPublicFiles ( const char * Path )
{
2015-01-25 00:58:21 +01:00
long Cod = Brw_GetCodForFiles ( ) ;
long ZoneUsrCod = Brw_GetZoneUsrCodForFiles ( ) ;
2014-12-01 23:55:08 +01:00
char Query [ 512 + PATH_MAX ] ;
/***** Get if a file or folder is public from database *****/
sprintf ( Query , " SELECT COUNT(*) FROM files "
2015-01-25 00:58:21 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' AND ZoneUsrCod='%ld' "
" AND Path LIKE '%s/%%' AND Public='Y' " ,
2015-01-24 19:30:44 +01:00
( unsigned ) Brw_FileBrowserForDB_files [ Gbl . FileBrowser . Type ] ,
2015-01-25 00:58:21 +01:00
Cod , ZoneUsrCod ,
2014-12-01 23:55:08 +01:00
Path ) ;
return ( DB_QueryCOUNT ( Query , " can not check if a folder contains public files " ) ! = 0 ) ;
}
2015-03-09 19:26:58 +01:00
/*****************************************************************************/
/*********************** Get number of files from a user *********************/
/*****************************************************************************/
unsigned Brw_GetNumFilesUsr ( long UsrCod )
{
2015-03-14 12:13:12 +01:00
char Query [ 256 ] ;
2015-03-09 19:26:58 +01:00
2015-03-14 12:13:12 +01:00
/***** Get current number of files published by a user from database *****/
sprintf ( Query , " SELECT COUNT(*) FROM files "
" WHERE PublisherUsrCod='%ld' AND FileType IN ('%u','%u') " ,
UsrCod ,
( unsigned ) Brw_IS_FILE ,
( unsigned ) Brw_IS_UNKNOWN ) ; // Unknown entries are counted as files
return ( unsigned ) DB_QueryCOUNT ( Query , " can not get number of files from a user " ) ;
2015-03-09 19:26:58 +01:00
}
2015-03-09 19:48:11 +01:00
/*****************************************************************************/
/******************* Get number of public files from a user ******************/
/*****************************************************************************/
unsigned Brw_GetNumPublicFilesUsr ( long UsrCod )
{
2015-03-14 12:13:12 +01:00
char Query [ 256 ] ;
2015-03-09 19:48:11 +01:00
2015-03-14 12:13:12 +01:00
/***** Get current number of public files published by a user from database *****/
2015-03-09 19:48:11 +01:00
sprintf ( Query , " SELECT COUNT(*) FROM files "
2015-03-14 12:13:12 +01:00
" WHERE PublisherUsrCod='%ld' AND FileType IN ('%u','%u') "
" AND Public='Y' " ,
UsrCod ,
( unsigned ) Brw_IS_FILE ,
( unsigned ) Brw_IS_UNKNOWN ) ; // Unknown entries are counted as files
return ( unsigned ) DB_QueryCOUNT ( Query , " can not get number of public files from a user " ) ;
2015-03-09 19:48:11 +01:00
}
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/***************** Change hiddeness of file in the database ******************/
/*****************************************************************************/
static void Brw_ChangeFileOrFolderHiddenInDB ( const char * Path , bool IsHidden )
{
2015-01-25 00:58:21 +01:00
long Cod = Brw_GetCodForFiles ( ) ;
long ZoneUsrCod = Brw_GetZoneUsrCodForFiles ( ) ;
char Query [ 512 + PATH_MAX ] ;
2014-12-01 23:55:08 +01:00
/***** Mark file as hidden in database *****/
sprintf ( Query , " UPDATE files SET Hidden='%c' "
2015-01-25 00:58:21 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' AND ZoneUsrCod='%ld' "
" AND Path='%s' " ,
2014-12-01 23:55:08 +01:00
IsHidden ? ' Y ' :
' N ' ,
2015-01-24 19:30:44 +01:00
( unsigned ) Brw_FileBrowserForDB_files [ Gbl . FileBrowser . Type ] ,
2015-01-25 00:58:21 +01:00
Cod , ZoneUsrCod ,
2014-12-01 23:55:08 +01:00
Path ) ;
DB_QueryUPDATE ( Query , " can not change status of a file in database " ) ;
}
/*****************************************************************************/
/******* Change publisher, public and license of file in the database ********/
/*****************************************************************************/
static void Brw_ChangeFilePublicInDB ( long PublisherUsrCod , const char * Path ,
bool IsPublic , Brw_License_t License )
{
2015-01-25 00:58:21 +01:00
long Cod = Brw_GetCodForFiles ( ) ;
long ZoneUsrCod = Brw_GetZoneUsrCodForFiles ( ) ;
char Query [ 512 + PATH_MAX ] ;
2014-12-01 23:55:08 +01:00
/***** Change publisher, public and license of file in database *****/
sprintf ( Query , " UPDATE files SET PublisherUsrCod='%ld',Public='%c',License='%u' "
2015-01-25 00:58:21 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' AND ZoneUsrCod='%ld' "
" AND Path='%s' " ,
2014-12-01 23:55:08 +01:00
PublisherUsrCod ,
IsPublic ? ' Y ' :
' N ' ,
( unsigned ) License ,
2015-01-24 19:30:44 +01:00
( unsigned ) Brw_FileBrowserForDB_files [ Gbl . FileBrowser . Type ] ,
2015-01-25 00:58:21 +01:00
Cod , ZoneUsrCod ,
2014-12-01 23:55:08 +01:00
Path ) ;
DB_QueryUPDATE ( Query , " can not change metadata of a file in database " ) ;
}
2015-01-20 15:03:02 +01:00
/*****************************************************************************/
2015-01-25 00:58:21 +01:00
/**** Get code of institution, degree, course, group for expanded folders ****/
2015-01-20 15:03:02 +01:00
/*****************************************************************************/
2015-01-25 02:07:04 +01:00
long Brw_GetCodForFiles ( void )
2015-01-20 15:03:02 +01:00
{
2015-01-25 00:58:21 +01:00
switch ( Brw_FileBrowserForDB_files [ Gbl . FileBrowser . Type ] )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_INS :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_INS :
2015-01-25 00:58:21 +01:00
return Gbl . CurrentIns . Ins . InsCod ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CTR :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_CTR :
2015-01-25 00:58:21 +01:00
return Gbl . CurrentCtr . Ctr . CtrCod ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_DEG :
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_DEG :
2015-01-25 00:58:21 +01:00
return Gbl . CurrentDeg . Deg . DegCod ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_ASSIG_USR :
case Brw_ADMI_WORKS_USR :
case Brw_ADMI_MARKS_CRS :
2015-01-25 00:58:21 +01:00
return Gbl . CurrentCrs . Crs . CrsCod ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2015-01-25 00:58:21 +01:00
return Gbl . CurrentCrs . Grps . GrpCod ;
default :
return - 1L ;
}
2015-01-20 15:03:02 +01:00
}
/*****************************************************************************/
2015-01-25 00:58:21 +01:00
/******** Get code of user in assignment / works for expanded folders ********/
2015-01-20 15:03:02 +01:00
/*****************************************************************************/
2015-01-25 00:58:21 +01:00
static long Brw_GetZoneUsrCodForFiles ( void )
2015-01-20 15:03:02 +01:00
{
2015-03-02 12:17:16 +01:00
switch ( Gbl . FileBrowser . Type )
2015-01-25 00:58:21 +01:00
{
2015-03-02 12:17:16 +01:00
case Brw_ADMI_WORKS_USR : // My works
case Brw_ADMI_ASSIG_USR : // My assignments
case Brw_ADMI_BRIEF_USR : // My briefcase
2015-01-25 00:58:21 +01:00
return Gbl . Usrs . Me . UsrDat . UsrCod ;
2015-03-02 12:17:16 +01:00
case Brw_ADMI_WORKS_CRS : // Course works
case Brw_ADMI_ASSIG_CRS : // Course assignments
return Gbl . Usrs . Other . UsrDat . UsrCod ;
2015-01-25 00:58:21 +01:00
default :
2015-03-02 12:17:16 +01:00
return - 1L ;
2015-01-25 00:58:21 +01:00
}
2015-01-20 15:03:02 +01:00
}
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2015-01-25 00:58:21 +01:00
/******** Get code of user in assignment / works for expanded folders ********/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2015-01-25 02:07:04 +01:00
void Brw_GetCrsGrpFromFileMetadata ( Brw_FileBrowser_t FileBrowser , long Cod ,
2016-01-02 17:07:58 +01:00
long * InsCod ,
long * CtrCod ,
long * DegCod ,
long * CrsCod ,
long * GrpCod )
2014-12-01 23:55:08 +01:00
{
2016-01-02 17:07:58 +01:00
struct Centre Ctr ;
struct Degree Deg ;
struct Course Crs ;
2015-01-25 00:58:21 +01:00
struct GroupData GrpDat ;
2014-12-01 23:55:08 +01:00
2015-01-25 02:07:04 +01:00
switch ( FileBrowser )
2014-12-01 23:55:08 +01:00
{
2016-01-02 17:07:58 +01:00
case Brw_ADMI_DOCUM_INS :
case Brw_ADMI_SHARE_INS :
* GrpCod = - 1L ;
* CrsCod = - 1L ;
* DegCod = - 1L ;
* CtrCod = - 1L ;
* InsCod = Cod ;
break ;
case Brw_ADMI_DOCUM_CTR :
case Brw_ADMI_SHARE_CTR :
* GrpCod = - 1L ;
* CrsCod = - 1L ;
* DegCod = - 1L ;
* CtrCod = Ctr . CtrCod = Cod ;
Ctr_GetDataOfCentreByCod ( & Ctr ) ;
* InsCod = Ctr . InsCod ;
break ;
case Brw_ADMI_DOCUM_DEG :
case Brw_ADMI_SHARE_DEG :
* GrpCod = - 1L ;
* CrsCod = - 1L ;
* DegCod = Deg . DegCod = Cod ;
Deg_GetDataOfDegreeByCod ( & Deg ) ;
* CtrCod = Ctr . CtrCod = Deg . CtrCod ;
Ctr_GetDataOfCentreByCod ( & Ctr ) ;
* InsCod = Ctr . InsCod ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_ASSIG_USR :
case Brw_ADMI_WORKS_USR :
case Brw_ADMI_MARKS_CRS :
2015-01-25 00:58:21 +01:00
* GrpCod = - 1L ;
2016-01-02 17:07:58 +01:00
* CrsCod = Crs . CrsCod = Cod ;
Crs_GetDataOfCourseByCod ( & Crs ) ;
* DegCod = Deg . DegCod = Crs . DegCod ;
Deg_GetDataOfDegreeByCod ( & Deg ) ;
* CtrCod = Ctr . CtrCod = Deg . CtrCod ;
Ctr_GetDataOfCentreByCod ( & Ctr ) ;
* InsCod = Ctr . InsCod ;
2015-01-25 00:58:21 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP :
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_GRP :
case Brw_ADMI_MARKS_GRP :
2015-01-25 02:07:04 +01:00
* GrpCod = GrpDat . GrpCod = Cod ;
2015-01-25 00:58:21 +01:00
Grp_GetDataOfGroupByCod ( & GrpDat ) ;
2016-01-02 17:07:58 +01:00
* CrsCod = Crs . CrsCod = GrpDat . CrsCod ;
Crs_GetDataOfCourseByCod ( & Crs ) ;
* DegCod = Deg . DegCod = Crs . DegCod ;
Deg_GetDataOfDegreeByCod ( & Deg ) ;
* CtrCod = Ctr . CtrCod = Deg . CtrCod ;
Ctr_GetDataOfCentreByCod ( & Ctr ) ;
* InsCod = Ctr . InsCod ;
2015-01-25 00:58:21 +01:00
break ;
2014-12-01 23:55:08 +01:00
default :
2015-01-25 00:58:21 +01:00
* GrpCod = - 1L ;
2016-01-02 17:07:58 +01:00
* CrsCod = - 1L ;
* DegCod = - 1L ;
* CtrCod = - 1L ;
* InsCod = - 1L ;
2015-01-25 00:58:21 +01:00
break ;
2014-12-01 23:55:08 +01:00
}
}
/*****************************************************************************/
/**************** Add a path of file/folder to the database ******************/
/*****************************************************************************/
long Brw_AddPathToDB ( long PublisherUsrCod , Brw_FileType_t FileType ,
2016-01-03 15:36:46 +01:00
const char * FullPathInTree , bool IsPublic , Brw_License_t License )
2014-12-01 23:55:08 +01:00
{
2015-01-25 00:58:21 +01:00
long Cod = Brw_GetCodForFiles ( ) ;
long ZoneUsrCod = Brw_GetZoneUsrCodForFiles ( ) ;
2014-12-01 23:55:08 +01:00
char Query [ 512 + PATH_MAX ] ;
/***** Add path to the database *****/
2015-01-25 00:58:21 +01:00
sprintf ( Query , " INSERT INTO files (FileBrowser,Cod,ZoneUsrCod, "
2014-12-01 23:55:08 +01:00
" PublisherUsrCod,FileType,Path,Hidden,Public,License) "
2015-01-25 00:58:21 +01:00
" VALUES ('%u','%ld','%ld', "
2014-12-01 23:55:08 +01:00
" '%ld','%u','%s','N','%c','%u') " ,
2015-01-24 19:30:44 +01:00
( unsigned ) Brw_FileBrowserForDB_files [ Gbl . FileBrowser . Type ] ,
2015-01-25 00:58:21 +01:00
Cod , ZoneUsrCod ,
2014-12-01 23:55:08 +01:00
PublisherUsrCod ,
( unsigned ) FileType ,
2016-01-03 15:36:46 +01:00
FullPathInTree ,
2014-12-01 23:55:08 +01:00
IsPublic ? ' Y ' :
' N ' ,
( unsigned ) License ) ;
return DB_QueryINSERTandReturnCode ( Query , " can not add path to database " ) ;
}
/*****************************************************************************/
/**************** Remove a file or folder from the database ******************/
/*****************************************************************************/
static void Brw_RemoveOneFileOrFolderFromDB ( const char * Path )
{
2015-01-25 00:58:21 +01:00
long Cod = Brw_GetCodForFiles ( ) ;
long ZoneUsrCod = Brw_GetZoneUsrCodForFiles ( ) ;
2014-12-01 23:55:08 +01:00
char Query [ 512 + PATH_MAX ] ;
2015-01-24 19:30:44 +01:00
Brw_FileBrowser_t FileBrowser = Brw_FileBrowserForDB_files [ Gbl . FileBrowser . Type ] ;
2014-12-01 23:55:08 +01:00
/***** Set possible notifications as removed.
2016-01-22 12:05:25 +01:00
Set possible social note as unavailable .
2014-12-01 23:55:08 +01:00
Important : do this before removing from files * * * * */
2016-01-04 01:56:28 +01:00
Ntf_MarkNotifOneFileAsRemoved ( Path ) ;
2016-01-22 12:05:25 +01:00
Soc_MarkSocialNoteOneFileAsUnavailable ( Path ) ;
2014-12-01 23:55:08 +01:00
/***** Remove from database the entries that store the marks properties *****/
2015-01-26 12:39:48 +01:00
if ( FileBrowser = = Brw_ADMI_MARKS_CRS | |
FileBrowser = = Brw_ADMI_MARKS_GRP )
2014-12-01 23:55:08 +01:00
{
sprintf ( Query , " DELETE FROM marks_properties USING files,marks_properties "
2015-01-25 00:58:21 +01:00
" WHERE files.FileBrowser='%u' AND files.Cod='%ld' "
" AND files.Path='%s' "
2014-12-01 23:55:08 +01:00
" AND files.FilCod=marks_properties.FilCod " ,
2015-01-25 00:58:21 +01:00
( unsigned ) FileBrowser , Cod , Path ) ;
2014-12-01 23:55:08 +01:00
DB_QueryDELETE ( Query , " can not remove properties of marks from database " ) ;
}
/***** Remove from database the entries that store the file views *****/
sprintf ( Query , " DELETE FROM file_view USING file_view,files "
2015-01-25 00:58:21 +01:00
" WHERE files.FileBrowser='%u' AND files.Cod='%ld' AND files.ZoneUsrCod='%ld' "
" AND files.Path='%s' "
2014-12-01 23:55:08 +01:00
" AND files.FilCod=file_view.FilCod " ,
2015-01-25 00:58:21 +01:00
( unsigned ) FileBrowser , Cod , ZoneUsrCod , Path ) ;
2014-12-01 23:55:08 +01:00
DB_QueryDELETE ( Query , " can not remove file views from database " ) ;
/***** Remove from database the entry that stores the data of a file *****/
sprintf ( Query , " DELETE FROM files "
2015-01-25 00:58:21 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' AND ZoneUsrCod='%ld' "
" AND Path='%s' " ,
( unsigned ) FileBrowser , Cod , ZoneUsrCod , Path ) ;
DB_QueryDELETE ( Query , " can not remove path from database " ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/************** Remove children of a folder from the database ****************/
/*****************************************************************************/
static void Brw_RemoveChildrenOfFolderFromDB ( const char * Path )
{
2015-01-25 00:58:21 +01:00
long Cod = Brw_GetCodForFiles ( ) ;
long ZoneUsrCod = Brw_GetZoneUsrCodForFiles ( ) ;
2014-12-01 23:55:08 +01:00
char Query [ 512 + PATH_MAX ] ;
2015-01-24 19:30:44 +01:00
Brw_FileBrowser_t FileBrowser = Brw_FileBrowserForDB_files [ Gbl . FileBrowser . Type ] ;
2014-12-01 23:55:08 +01:00
/***** Set possible notifications as removed.
2016-01-04 01:56:28 +01:00
Set possible social notes as unavailable .
2014-12-01 23:55:08 +01:00
Important : do this before removing from files * * * * */
2016-01-04 01:56:28 +01:00
Ntf_MarkNotifChildrenOfFolderAsRemoved ( Path ) ;
Soc_MarkSocialNotesChildrenOfFolderAsUnavailable ( Path ) ;
2014-12-01 23:55:08 +01:00
/***** Remove from database the entries that store the marks properties *****/
2015-01-26 12:39:48 +01:00
if ( FileBrowser = = Brw_ADMI_MARKS_CRS | |
FileBrowser = = Brw_ADMI_MARKS_GRP )
2014-12-01 23:55:08 +01:00
{
sprintf ( Query , " DELETE FROM marks_properties USING files,marks_properties "
2015-01-25 00:58:21 +01:00
" WHERE files.FileBrowser='%u' AND files.Cod='%ld' "
" AND files.Path LIKE '%s/%%' "
2014-12-01 23:55:08 +01:00
" AND files.FilCod=marks_properties.FilCod " ,
2015-01-25 18:50:43 +01:00
( unsigned ) FileBrowser , Cod , Path ) ;
2014-12-01 23:55:08 +01:00
DB_QueryDELETE ( Query , " can not remove properties of marks from database " ) ;
}
/***** Remove from database the entries that store the file views *****/
sprintf ( Query , " DELETE FROM file_view USING file_view,files "
2015-01-25 00:58:21 +01:00
" WHERE files.FileBrowser='%u' AND files.Cod='%ld' AND files.ZoneUsrCod='%ld' "
" AND files.Path LIKE '%s/%%' "
2014-12-01 23:55:08 +01:00
" AND files.FilCod=file_view.FilCod " ,
2015-01-25 18:50:43 +01:00
( unsigned ) FileBrowser , Cod , ZoneUsrCod , Path ) ;
2014-12-01 23:55:08 +01:00
DB_QueryDELETE ( Query , " can not remove file views from database " ) ;
/***** Remove from database the entries that store the data of files *****/
sprintf ( Query , " DELETE FROM files "
2015-01-25 00:58:21 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' AND ZoneUsrCod='%ld' "
" AND Path LIKE '%s/%%' " ,
2015-01-25 18:50:43 +01:00
( unsigned ) FileBrowser , Cod , ZoneUsrCod , Path ) ;
2014-12-01 23:55:08 +01:00
DB_QueryDELETE ( Query , " can not remove paths from database " ) ;
}
/*****************************************************************************/
/*************** Rename a file or folder in table of files *******************/
/*****************************************************************************/
static void Brw_RenameOneFolderInDB ( const char * OldPath , const char * NewPath )
{
2015-01-25 00:58:21 +01:00
long Cod = Brw_GetCodForFiles ( ) ;
long ZoneUsrCod = Brw_GetZoneUsrCodForFiles ( ) ;
2014-12-01 23:55:08 +01:00
char Query [ 512 + PATH_MAX * 2 ] ;
/***** Update file or folder in table of common files *****/
sprintf ( Query , " UPDATE files SET Path='%s' "
2015-01-25 00:58:21 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' AND ZoneUsrCod='%ld' AND Path='%s' " ,
2014-12-01 23:55:08 +01:00
NewPath ,
2015-01-24 19:30:44 +01:00
( unsigned ) Brw_FileBrowserForDB_files [ Gbl . FileBrowser . Type ] ,
2015-01-25 00:58:21 +01:00
Cod , ZoneUsrCod ,
2014-12-01 23:55:08 +01:00
OldPath ) ;
DB_QueryUPDATE ( Query , " can not update folder name in a common zone " ) ;
}
/*****************************************************************************/
/************** Rename children of a folder in table of files ****************/
/*****************************************************************************/
static void Brw_RenameChildrenFilesOrFoldersInDB ( const char * OldPath , const char * NewPath )
{
2015-01-25 00:58:21 +01:00
long Cod = Brw_GetCodForFiles ( ) ;
long ZoneUsrCod = Brw_GetZoneUsrCodForFiles ( ) ;
2014-12-01 23:55:08 +01:00
char Query [ 512 + PATH_MAX * 2 ] ;
unsigned StartFinalSubpathNotChanged = strlen ( OldPath ) + 2 ;
/***** Update children of a folder in table of files *****/
sprintf ( Query , " UPDATE files SET Path=CONCAT('%s','/',SUBSTRING(Path,%u)) "
2015-01-25 00:58:21 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' AND ZoneUsrCod='%ld' "
" AND Path LIKE '%s/%%' " ,
2014-12-01 23:55:08 +01:00
NewPath , StartFinalSubpathNotChanged ,
2015-01-24 19:30:44 +01:00
( unsigned ) Brw_FileBrowserForDB_files [ Gbl . FileBrowser . Type ] ,
2015-01-25 00:58:21 +01:00
Cod , ZoneUsrCod ,
2014-12-01 23:55:08 +01:00
OldPath ) ;
DB_QueryUPDATE ( Query , " can not rename file or folder names in a common zone " ) ;
}
/*****************************************************************************/
/********** Check if I have permission to modify a file or folder ************/
/*****************************************************************************/
static bool Brw_CheckIfICanEditFileOrFolder ( unsigned Level )
{
2016-04-22 09:47:25 +02:00
/***** Level 0 (root folder) can not be removed/renamed *****/
if ( Level = = 0 )
return false ;
2014-12-01 23:55:08 +01:00
/***** I must be student, teacher, admin or superuser to edit *****/
2015-04-07 21:44:24 +02:00
if ( Gbl . Usrs . Me . MaxRole < Rol_STUDENT )
2014-12-01 23:55:08 +01:00
return false ;
/***** Set depending on browser, level, logged role... *****/
switch ( Gbl . FileBrowser . Type )
{
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
return ( Gbl . Usrs . Me . LoggedRole > = Rol_TEACHER ) ;
case Brw_ADMI_TEACH_GRP :
if ( Gbl . Usrs . Me . LoggedRole = = Rol_TEACHER )
return Grp_GetIfIBelongToGrp ( Gbl . CurrentCrs . Grps . GrpCod ) ; // A teacher can edit only if hr/she belongs to group
return ( Gbl . Usrs . Me . LoggedRole > Rol_TEACHER ) ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_SHARE_GRP :
2014-12-01 23:55:08 +01:00
// Check if I am the publisher of the folder
2016-04-22 09:47:25 +02:00
return Brw_CheckIfICanModifySharedFileOrFolder ( ) ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_USR :
case Brw_ADMI_ASSIG_CRS :
2016-04-22 09:47:25 +02:00
return ( Gbl . FileBrowser . Asg . AsgCod < 0 | | // If folder does not correspond to any assignment
( ! Gbl . FileBrowser . Asg . Hidden & & // If assignment is visible (not hidden)
Gbl . FileBrowser . Asg . IBelongToCrsOrGrps & & // If I can do this assignment
( ( Gbl . Usrs . Me . LoggedRole = = Rol_STUDENT & & Gbl . FileBrowser . Asg . Open ) | |
Gbl . Usrs . Me . LoggedRole > = Rol_TEACHER ) ) ) ;
2014-12-01 23:55:08 +01:00
default :
2016-04-22 09:47:25 +02:00
return Brw_FileBrowserIsEditable [ Gbl . FileBrowser . Type ] ;
2014-12-01 23:55:08 +01:00
}
}
/*****************************************************************************/
/**** Check if I have permission to create a file or folder into a folder ****/
/*****************************************************************************/
static bool Brw_CheckIfICanCreateIntoFolder ( unsigned Level )
{
/***** I must be student, teacher, admin or superuser to edit *****/
2015-04-07 21:44:24 +02:00
if ( Gbl . Usrs . Me . MaxRole < Rol_STUDENT )
2014-12-01 23:55:08 +01:00
return false ;
2015-07-21 20:07:46 +02:00
/***** If maximum level is reached, I can not create/paste *****/
if ( Level > = Brw_MAX_DIR_LEVELS )
return false ;
/***** Have I permission to create/paste a new file or folder into the folder? *****/
2014-12-01 23:55:08 +01:00
switch ( Gbl . FileBrowser . Type )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_USR :
case Brw_ADMI_ASSIG_CRS :
2014-12-01 23:55:08 +01:00
return ( Level ! = 0 & &
( Gbl . FileBrowser . Asg . AsgCod < 0 | | // If folder does not correspond to any assignment
( ! Gbl . FileBrowser . Asg . Hidden & & // If assignment is visible (not hidden)
2015-11-10 02:23:55 +01:00
Gbl . FileBrowser . Asg . IBelongToCrsOrGrps & & // If I can do this assignment
( ( Gbl . Usrs . Me . LoggedRole = = Rol_STUDENT & & Gbl . FileBrowser . Asg . Open ) | |
Gbl . Usrs . Me . LoggedRole > = Rol_TEACHER ) ) ) ) ;
2014-12-01 23:55:08 +01:00
default :
return Brw_FileBrowserIsEditable [ Gbl . FileBrowser . Type ] ;
}
}
/*****************************************************************************/
/********** Check if I have permission to modify a file or folder ************/
/********** in the current common zone ************/
/*****************************************************************************/
// Returns true if the current user can remove or rename Gbl.FileBrowser.Priv.FullPathInTree, and false if he have not permission
// A user can remove or rename a file if he's the publisher
// A user can remove or rename a folder if he's the unique publisher of all the files and folders in the subtree starting there
2016-04-22 09:47:25 +02:00
static bool Brw_CheckIfICanModifySharedFileOrFolder ( void )
2014-12-01 23:55:08 +01:00
{
2015-01-25 00:58:21 +01:00
long Cod = Brw_GetCodForFiles ( ) ;
2014-12-01 23:55:08 +01:00
char Query [ 512 + PATH_MAX * 2 ] ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
unsigned long NumRows ;
long PublisherUsrCod = - 1L ;
switch ( Gbl . Usrs . Me . LoggedRole )
{
2015-04-07 21:44:24 +02:00
case Rol_STUDENT : // If I am a student, I can modify the file/folder if I am the publisher
2014-12-01 23:55:08 +01:00
/***** Get all the distinct publishers of files starting by Gbl.FileBrowser.Priv.FullPathInTree from database *****/
sprintf ( Query , " SELECT DISTINCT(PublisherUsrCod) FROM files "
2015-01-25 00:58:21 +01:00
" WHERE FileBrowser='%u' AND Cod='%ld' "
2014-12-01 23:55:08 +01:00
" AND (Path='%s' OR Path LIKE '%s/%%') " ,
2015-01-25 00:58:21 +01:00
( unsigned ) Brw_FileBrowserForDB_files [ Gbl . FileBrowser . Type ] ,
Cod ,
2014-12-01 23:55:08 +01:00
Gbl . FileBrowser . Priv . FullPathInTree ,
Gbl . FileBrowser . Priv . FullPathInTree ) ;
NumRows = DB_QuerySELECT ( Query , & mysql_res , " can not get publishers of files " ) ;
/***** Check all common files that are equal to Gbl.FileBrowser.Priv.FullPathInTree
or that are under the folder Gbl . FileBrowser . Priv . FullPathInTree * * * * */
if ( NumRows = = 1 ) // Get the publisher of the file(s)
{
row = mysql_fetch_row ( mysql_res ) ;
PublisherUsrCod = Str_ConvertStrCodToLongCod ( row [ 0 ] ) ;
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult ( & mysql_res ) ;
return ( Gbl . Usrs . Me . UsrDat . UsrCod = = PublisherUsrCod ) ; // Am I the publisher of subtree?
2015-04-07 21:44:24 +02:00
case Rol_TEACHER :
case Rol_DEG_ADM :
2015-10-05 00:22:16 +02:00
case Rol_CTR_ADM :
case Rol_INS_ADM :
2015-04-07 21:44:24 +02:00
case Rol_SYS_ADM :
2014-12-01 23:55:08 +01:00
return true ;
default :
return false ;
}
}
/*****************************************************************************/
2015-01-25 18:50:43 +01:00
/************* Remove common zones of all the groups of a type ***************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
void Brw_RemoveZonesOfGroupsOfType ( long GrpTypCod )
{
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
unsigned long NumRow , NumRows ;
struct GroupData GrpDat ;
/***** Query database *****/
if ( ( NumRows = Grp_GetGrpsOfType ( GrpTypCod , & mysql_res ) ) ) // If there exists groups...
for ( NumRow = 0 ;
NumRow < NumRows ;
NumRow + + )
{
/* Get next group */
row = mysql_fetch_row ( mysql_res ) ;
/* Group code is in row[0] */
if ( sscanf ( row [ 0 ] , " %ld " , & ( GrpDat . GrpCod ) ) ! = 1 )
Lay_ShowErrorAndExit ( " Wrong group code. " ) ;
/* Get name and type of the group from database */
Grp_GetDataOfGroupByCod ( & GrpDat ) ;
/* Remove file zones of this group */
Brw_RemoveGrpZonesVerbose ( & GrpDat ) ;
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult ( & mysql_res ) ;
}
/*****************************************************************************/
2015-01-25 18:50:43 +01:00
/************** Remove file zones of a group and show message ****************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
void Brw_RemoveGrpZonesVerbose ( struct GroupData * GrpDat )
{
extern const char * Txt_File_zones_of_the_group_X_Y_removed ;
/***** Remove group zones and clipboards *****/
Brw_RemoveGrpZones ( Gbl . CurrentCrs . Crs . CrsCod , GrpDat - > GrpCod ) ;
/***** Print message *****/
sprintf ( Gbl . Message , Txt_File_zones_of_the_group_X_Y_removed ,
GrpDat - > GrpTypName , GrpDat - > GrpName ) ;
Lay_ShowAlert ( Lay_SUCCESS , Gbl . Message ) ;
}
/*****************************************************************************/
2015-01-25 18:50:43 +01:00
/*********************** Remove file zones of a group ************************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
void Brw_RemoveGrpZones ( long CrsCod , long GrpCod )
{
char PathGrpFileZones [ PATH_MAX + 1 ] ;
/***** Set notifications about files in this group zone as removed *****/
2016-01-04 01:56:28 +01:00
Ntf_MarkNotifFilesInGroupAsRemoved ( GrpCod ) ;
2014-12-01 23:55:08 +01:00
2015-01-25 00:58:21 +01:00
/***** Remove files in the group from database *****/
2015-01-25 18:50:43 +01:00
Brw_RemoveGrpFilesFromDB ( GrpCod ) ;
2014-12-01 23:55:08 +01:00
2015-01-25 18:50:43 +01:00
/***** Remove group zones *****/
sprintf ( PathGrpFileZones , " %s/%s/%ld/grp/%ld " ,
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_CRS , CrsCod , GrpCod ) ;
Brw_RemoveTree ( PathGrpFileZones ) ;
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
2015-01-25 18:50:43 +01:00
/***************** Remove the works of a user in a course ********************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
void Brw_RemoveUsrWorksInCrs ( struct UsrData * UsrDat , struct Course * Crs , Cns_QuietOrVerbose_t QuietOrVerbose )
{
extern const char * Txt_Works_of_X_in_Y_removed ;
char PathUsrInCrs [ PATH_MAX + 1 ] ;
2015-01-25 18:50:43 +01:00
/***** Remove user's works in the course from database *****/
Brw_RemoveWrkFilesFromDB ( Crs - > CrsCod , UsrDat - > UsrCod ) ;
2014-12-01 23:55:08 +01:00
/***** Remove the folder for this user inside the course *****/
sprintf ( PathUsrInCrs , " %s/%s/%ld/usr/%02u/%ld " ,
Cfg_PATH_SWAD_PRIVATE , Cfg_FOLDER_CRS , Crs - > CrsCod ,
( unsigned ) ( UsrDat - > UsrCod % 100 ) , UsrDat - > UsrCod ) ;
Brw_RemoveTree ( PathUsrInCrs ) ;
// If this was the last user in his/her subfolder ==> the subfolder will be empty
/***** Write message *****/
if ( QuietOrVerbose = = Cns_VERBOSE )
{
sprintf ( Gbl . Message , Txt_Works_of_X_in_Y_removed ,
UsrDat - > FullName , Crs - > FullName ) ;
Lay_ShowAlert ( Lay_SUCCESS , Gbl . Message ) ;
}
}
/*****************************************************************************/
2015-01-25 18:50:43 +01:00
/************* Remove the works of a user in all of his courses **************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
void Brw_RemoveUsrWorksInAllCrss ( struct UsrData * UsrDat , Cns_QuietOrVerbose_t QuietOrVerbose )
{
extern const char * Txt_The_works_of_X_have_been_removed_in_a_total_of_Y_of_his_her_Z_courses ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
unsigned long NumRow , NumRows ;
unsigned NumCrssWorksRemoved = 0 ;
struct Course Crs ;
/***** Query database *****/
if ( ( NumRows = Usr_GetCrssFromUsr ( UsrDat - > UsrCod , - 1L , & mysql_res ) ) > 0 ) // If courses found
{
/***** Remove the zone of works of the user in the courses he/she belongs to *****/
for ( NumRow = 0 ;
NumRow < NumRows ;
NumRow + + )
{
/* Get the next course */
row = mysql_fetch_row ( mysql_res ) ;
Crs . CrsCod = Str_ConvertStrCodToLongCod ( row [ 0 ] ) ;
/* Get data of course */
Crs_GetDataOfCourseByCod ( & Crs ) ;
Brw_RemoveUsrWorksInCrs ( UsrDat , & Crs , QuietOrVerbose ) ;
NumCrssWorksRemoved + + ;
}
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult ( & mysql_res ) ;
/***** Write message *****/
if ( QuietOrVerbose = = Cns_VERBOSE )
{
sprintf ( Gbl . Message , Txt_The_works_of_X_have_been_removed_in_a_total_of_Y_of_his_her_Z_courses ,
UsrDat - > FullName , NumCrssWorksRemoved , ( unsigned ) NumRows ) ;
Lay_ShowAlert ( Lay_SUCCESS , Gbl . Message ) ;
}
}
/*****************************************************************************/
2016-04-22 09:47:25 +02:00
/******************** Get summary and content of a file **********************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
// This function may be called inside a web service, so don't report error
2016-04-22 09:47:25 +02:00
void Brw_GetSummaryAndContentOfFile ( char * SummaryStr , char * * ContentStr ,
long FilCod , unsigned MaxChars , bool GetContent )
2014-12-01 23:55:08 +01:00
{
char Query [ 256 ] ;
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
char FullPathInTreeFromDB [ PATH_MAX + 1 ] ;
char PathUntilFileName [ PATH_MAX + 1 ] ;
2015-12-29 00:44:51 +01:00
char FileName [ NAME_MAX + 1 ] ;
2014-12-01 23:55:08 +01:00
SummaryStr [ 0 ] = ' \0 ' ; // Return nothing on error
/***** Get subject of message from database *****/
2015-12-29 00:44:51 +01:00
sprintf ( Query , " SELECT Path FROM files WHERE FilCod='%ld' " ,
FilCod ) ;
2014-12-01 23:55:08 +01:00
if ( ! mysql_query ( & Gbl . mysql , Query ) )
if ( ( mysql_res = mysql_store_result ( & Gbl . mysql ) ) ! = NULL )
{
/***** Result should have a unique row *****/
if ( mysql_num_rows ( mysql_res ) = = 1 )
{
/***** Get data of this file *****/
row = mysql_fetch_row ( mysql_res ) ;
/* Path (row[0]) */
strncpy ( FullPathInTreeFromDB , row [ 0 ] , PATH_MAX ) ;
FullPathInTreeFromDB [ PATH_MAX ] = ' \0 ' ;
Str_SplitFullPathIntoPathAndFileName ( FullPathInTreeFromDB ,
PathUntilFileName ,
2015-12-29 00:44:51 +01:00
FileName ) ;
strcpy ( SummaryStr , FileName ) ;
2014-12-01 23:55:08 +01:00
if ( MaxChars )
Str_LimitLengthHTMLStr ( SummaryStr , MaxChars ) ;
if ( GetContent )
{ // TODO: Put file metadata into content string
if ( ( * ContentStr = ( char * ) malloc ( strlen ( FullPathInTreeFromDB ) + 1 ) ) )
strcpy ( * ContentStr , FullPathInTreeFromDB ) ;
}
}
mysql_free_result ( mysql_res ) ;
}
}
/*****************************************************************************/
/**************************** List documents found ***************************/
/*****************************************************************************/
// Returns the number of documents found
2016-04-18 09:46:16 +02:00
unsigned Brw_ListDocsFound ( const char * Query ,
const char * TitleSingular , const char * TitlePlural )
2014-12-01 23:55:08 +01:00
{
2015-01-26 01:58:40 +01:00
extern const char * Txt_Institution ;
extern const char * Txt_Centre ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_Degree ;
extern const char * Txt_Course ;
extern const char * Txt_File_zone ;
extern const char * Txt_Document ;
2016-04-18 10:22:56 +02:00
extern const char * Txt_hidden_document ;
extern const char * Txt_hidden_documents ;
2014-12-01 23:55:08 +01:00
MYSQL_RES * mysql_res ;
MYSQL_ROW row ;
unsigned NumDocs ;
unsigned NumDoc ;
unsigned NumDocsNotHidden = 0 ;
unsigned NumDocsHidden ;
/***** Query database *****/
if ( ( NumDocs = ( unsigned ) DB_QuerySELECT ( Query , & mysql_res , " can not get files " ) ) )
{
/***** Write heading *****/
/* Write header with number of documents found */
2016-04-18 09:46:16 +02:00
sprintf ( Gbl . Title , " %u %s " ,
NumDocs , ( NumDocs = = 1 ) ? TitleSingular :
TitlePlural ) ;
Lay_StartRoundFrameTable ( NULL , 2 , Gbl . Title ) ;
2014-12-01 23:55:08 +01:00
/* Heading row */
fprintf ( Gbl . F . Out , " <tr> "
" <th class= \" BM \" ></th> "
2015-09-06 20:02:14 +02:00
" <th class= \" LEFT_MIDDLE \" > "
2014-12-26 22:11:03 +01:00
" %s "
" </th> "
2015-09-06 20:02:14 +02:00
" <th class= \" LEFT_MIDDLE \" > "
2014-12-26 22:11:03 +01:00
" %s "
" </th> "
2015-09-06 20:02:14 +02:00
" <th class= \" LEFT_MIDDLE \" > "
2015-01-26 01:58:40 +01:00
" %s "
" </th> "
2015-09-06 20:02:14 +02:00
" <th class= \" LEFT_MIDDLE \" > "
2015-01-26 01:58:40 +01:00
" %s "
" </th> "
2015-09-06 20:02:14 +02:00
" <th class= \" LEFT_MIDDLE \" > "
2014-12-26 22:11:03 +01:00
" %s "
" </th> "
2015-09-06 20:02:14 +02:00
" <th class= \" LEFT_MIDDLE \" > "
2014-12-26 22:11:03 +01:00
" %s "
" </th> "
2014-12-01 23:55:08 +01:00
" </tr> " ,
2015-01-26 01:58:40 +01:00
Txt_Institution ,
Txt_Centre ,
2014-12-01 23:55:08 +01:00
Txt_Degree ,
Txt_Course ,
Txt_File_zone ,
Txt_Document ) ;
/***** List documents found *****/
for ( NumDoc = 1 ;
NumDoc < = NumDocs ;
NumDoc + + )
{
/* Get next course */
row = mysql_fetch_row ( mysql_res ) ;
/* Write data of this course */
Brw_WriteRowDocData ( & NumDocsNotHidden , row ) ;
}
/***** Write footer *****/
/* Number of documents not hidden found */
fprintf ( Gbl . F . Out , " <tr> "
2015-09-06 20:02:14 +02:00
" <th colspan= \" 7 \" class= \" CENTER_MIDDLE \" > "
2014-12-22 21:52:37 +01:00
" ( " ) ;
2014-12-01 23:55:08 +01:00
NumDocsHidden = NumDocs - NumDocsNotHidden ;
if ( NumDocsHidden = = 1 )
2016-04-18 10:22:56 +02:00
fprintf ( Gbl . F . Out , " 1 %s " , Txt_hidden_document ) ;
2014-12-01 23:55:08 +01:00
else
2016-04-18 10:22:56 +02:00
fprintf ( Gbl . F . Out , " %u %s " , NumDocsHidden , Txt_hidden_documents ) ;
2014-12-22 21:52:37 +01:00
fprintf ( Gbl . F . Out , " ) "
2015-09-05 19:19:39 +02:00
" </th> "
2014-12-01 23:55:08 +01:00
" </tr> " ) ;
2016-03-20 13:47:46 +01:00
/* End table */
2015-04-12 18:01:06 +02:00
Lay_EndRoundFrameTable ( ) ;
2014-12-01 23:55:08 +01:00
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult ( & mysql_res ) ;
return NumDocs ;
}
/*****************************************************************************/
/************ Write the data of a document (result of a query) ***************/
/*****************************************************************************/
static void Brw_WriteRowDocData ( unsigned * NumDocsNotHidden , MYSQL_ROW row )
{
2015-01-26 12:39:48 +01:00
extern const char * Txt_Documents_area ;
2016-04-22 09:47:25 +02:00
extern const char * Txt_Teachers_files_area ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_Shared_files_area ;
2015-01-26 12:39:48 +01:00
extern const char * Txt_Assignments_area ;
extern const char * Txt_Works_area ;
extern const char * Txt_Marks_area ;
2015-12-21 00:53:56 +01:00
extern const char * Txt_Temporary_private_storage_area ;
2014-12-01 23:55:08 +01:00
extern const char * Txt_Go_to_X ;
2015-07-21 20:07:46 +02:00
extern const char * Txt_Folder ;
2014-12-01 23:55:08 +01:00
struct FileMetadata FileMetadata ;
2015-01-26 01:58:40 +01:00
long InsCod ;
long CtrCod ;
2014-12-01 23:55:08 +01:00
long DegCod ;
2015-01-25 00:58:21 +01:00
long CrsCod ;
long GrpCod ;
2016-04-18 11:19:42 +02:00
Act_Action_t Action ;
2015-01-26 01:58:40 +01:00
const char * InsShortName ;
const char * CtrShortName ;
const char * DegShortName ;
const char * CrsShortName ;
2015-09-04 19:26:08 +02:00
const char * BgColor ;
2014-12-01 23:55:08 +01:00
const char * Title ;
char FileNameToShow [ NAME_MAX + 1 ] ;
2015-01-26 01:58:40 +01:00
/*
row [ 0 ] = FilCod
row [ 1 ] = PathFromRoot
row [ 2 ] = InsCod
row [ 3 ] = InsShortName
row [ 4 ] = CtrCod
row [ 5 ] = CtrShortName
row [ 6 ] = DegCod
row [ 7 ] = DegShortName
row [ 8 ] = CrsCod
row [ 9 ] = CrsShortName
row [ 10 ] = GrpCod
*/
2014-12-01 23:55:08 +01:00
/***** Get file code (row[0]) and metadata *****/
FileMetadata . FilCod = Str_ConvertStrCodToLongCod ( row [ 0 ] ) ;
Brw_GetFileMetadataByCod ( & FileMetadata ) ;
if ( ! Brw_CheckIfFileOrFolderIsHidden ( & FileMetadata ) )
{
2015-01-26 01:58:40 +01:00
/***** Get institution code (row[2]) *****/
InsCod = Str_ConvertStrCodToLongCod ( row [ 2 ] ) ;
InsShortName = row [ 3 ] ;
/***** Get centre code (row[4]) *****/
CtrCod = Str_ConvertStrCodToLongCod ( row [ 4 ] ) ;
CtrShortName = row [ 5 ] ;
/***** Get degree code (row[6]) *****/
DegCod = Str_ConvertStrCodToLongCod ( row [ 6 ] ) ;
DegShortName = row [ 7 ] ;
/***** Get course code (row[8]) *****/
CrsCod = Str_ConvertStrCodToLongCod ( row [ 8 ] ) ;
CrsShortName = row [ 9 ] ;
/***** Get group code (row[8]) *****/
GrpCod = Str_ConvertStrCodToLongCod ( row [ 10 ] ) ;
/***** Set row color *****/
2015-09-04 19:26:08 +02:00
BgColor = ( CrsCod > 0 & &
CrsCod = = Gbl . CurrentCrs . Crs . CrsCod ) ? " LIGHT_BLUE " :
Gbl . ColorRows [ Gbl . RowEvenOdd ] ;
2014-12-01 23:55:08 +01:00
/***** Write number of document in this search *****/
fprintf ( Gbl . F . Out , " <tr> "
2015-09-04 17:10:27 +02:00
" <td class= \" DAT RIGHT_TOP %s \" > "
2014-12-22 21:52:37 +01:00
" %u "
" </td> " ,
2014-12-01 23:55:08 +01:00
BgColor , + + ( * NumDocsNotHidden ) ) ;
2015-01-26 01:58:40 +01:00
/***** Write institution logo, institution short name *****/
2015-09-04 17:10:27 +02:00
fprintf ( Gbl . F . Out , " <td class= \" DAT LEFT_TOP %s \" > " ,
2015-01-26 01:58:40 +01:00
BgColor ) ;
if ( InsCod > 0 )
{
Act_FormGoToStart ( ActSeeInsInf ) ;
Deg_PutParamDegCod ( InsCod ) ;
sprintf ( Gbl . Title , Txt_Go_to_X , InsShortName ) ;
Act_LinkFormSubmit ( Gbl . Title , " DAT " ) ;
2015-12-13 13:53:00 +01:00
Log_DrawLogo ( Sco_SCOPE_INS , InsCod , InsShortName , 20 , " CENTER_TOP " , true ) ;
2015-03-13 00:16:02 +01:00
fprintf ( Gbl . F . Out , " %s</a> " , InsShortName ) ;
Act_FormEnd ( ) ;
2015-01-26 01:58:40 +01:00
}
fprintf ( Gbl . F . Out , " </td> " ) ;
/***** Write centre logo, centre short name *****/
2015-09-04 17:10:27 +02:00
fprintf ( Gbl . F . Out , " <td class= \" DAT LEFT_TOP %s \" > " ,
2015-01-26 01:58:40 +01:00
BgColor ) ;
if ( CtrCod > 0 )
{
Act_FormGoToStart ( ActSeeCtrInf ) ;
Deg_PutParamDegCod ( CtrCod ) ;
sprintf ( Gbl . Title , Txt_Go_to_X , CtrShortName ) ;
Act_LinkFormSubmit ( Gbl . Title , " DAT " ) ;
2015-12-13 13:53:00 +01:00
Log_DrawLogo ( Sco_SCOPE_CTR , CtrCod , CtrShortName , 20 , " CENTER_TOP " , true ) ;
2015-03-13 00:16:02 +01:00
fprintf ( Gbl . F . Out , " %s</a> " , CtrShortName ) ;
Act_FormEnd ( ) ;
2015-01-26 01:58:40 +01:00
}
fprintf ( Gbl . F . Out , " </td> " ) ;
/***** Write degree logo, degree short name *****/
2015-09-04 17:10:27 +02:00
fprintf ( Gbl . F . Out , " <td class= \" DAT LEFT_TOP %s \" > " ,
2014-12-01 23:55:08 +01:00
BgColor ) ;
if ( DegCod > 0 )
{
Act_FormGoToStart ( ActSeeDegInf ) ;
Deg_PutParamDegCod ( DegCod ) ;
2015-01-26 01:58:40 +01:00
sprintf ( Gbl . Title , Txt_Go_to_X , DegShortName ) ;
2014-12-01 23:55:08 +01:00
Act_LinkFormSubmit ( Gbl . Title , " DAT " ) ;
2015-12-13 13:53:00 +01:00
Log_DrawLogo ( Sco_SCOPE_DEG , DegCod , DegShortName , 20 , " CENTER_TOP " , true ) ;
2015-03-13 00:16:02 +01:00
fprintf ( Gbl . F . Out , " %s</a> " , DegShortName ) ;
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
}
fprintf ( Gbl . F . Out , " </td> " ) ;
2015-01-26 01:58:40 +01:00
/***** Write course short name *****/
2015-09-04 17:10:27 +02:00
fprintf ( Gbl . F . Out , " <td class= \" DAT LEFT_TOP %s \" > " ,
2014-12-01 23:55:08 +01:00
BgColor ) ;
2015-01-25 00:58:21 +01:00
if ( CrsCod > 0 )
2014-12-01 23:55:08 +01:00
{
Act_FormGoToStart ( ActSeeCrsInf ) ;
2015-01-25 00:58:21 +01:00
Crs_PutParamCrsCod ( CrsCod ) ;
2015-01-26 01:58:40 +01:00
sprintf ( Gbl . Title , Txt_Go_to_X , CrsShortName ) ;
2014-12-01 23:55:08 +01:00
Act_LinkFormSubmit ( Gbl . Title , " DAT " ) ;
2015-03-13 00:16:02 +01:00
fprintf ( Gbl . F . Out , " %s</a> " , CrsShortName ) ;
Act_FormEnd ( ) ;
2014-12-01 23:55:08 +01:00
}
fprintf ( Gbl . F . Out , " </td> " ) ;
/***** Write file zone *****/
switch ( FileMetadata . FileBrowser )
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_INS :
case Brw_ADMI_DOCUM_CTR :
case Brw_ADMI_DOCUM_DEG :
case Brw_ADMI_DOCUM_CRS :
case Brw_ADMI_DOCUM_GRP :
Title = Txt_Documents_area ;
2014-12-01 23:55:08 +01:00
break ;
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS :
case Brw_ADMI_TEACH_GRP :
Title = Txt_Teachers_files_area ;
break ;
2015-02-05 22:59:48 +01:00
case Brw_ADMI_SHARE_INS :
case Brw_ADMI_SHARE_CTR :
case Brw_ADMI_SHARE_DEG :
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS :
case Brw_ADMI_SHARE_GRP :
2014-12-01 23:55:08 +01:00
Title = Txt_Shared_files_area ;
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_ASSIG_USR :
Title = Txt_Assignments_area ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_WORKS_USR :
Title = Txt_Works_area ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_MARKS_CRS :
case Brw_ADMI_MARKS_GRP :
Title = Txt_Marks_area ;
2014-12-01 23:55:08 +01:00
break ;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_BRIEF_USR :
2015-12-21 00:53:56 +01:00
Title = Txt_Temporary_private_storage_area ;
2014-12-01 23:55:08 +01:00
break ;
default :
Title = " " ;
break ;
}
2015-09-04 17:10:27 +02:00
fprintf ( Gbl . F . Out , " <td class= \" DAT LEFT_TOP %s \" > "
2014-12-22 21:52:37 +01:00
" %s "
" </td> " ,
2014-12-01 23:55:08 +01:00
BgColor , Title ) ;
/***** Get the name of the file to show *****/
2016-01-03 15:36:46 +01:00
Brw_LimitLengthFileNameToShow ( FileMetadata . FileType ,
FileMetadata . FilFolLnkName ,
FileNameToShow ) ;
2014-12-01 23:55:08 +01:00
/***** Write file name using path (row[1]) *****/
2015-09-04 17:10:27 +02:00
fprintf ( Gbl . F . Out , " <td class= \" DAT_N LEFT_TOP %s \" > " ,
2014-12-01 23:55:08 +01:00
BgColor ) ;
2015-04-11 17:33:14 +02:00
/* Start form */
2016-04-18 11:19:42 +02:00
Action = Brw_ActReqDatFile [ Brw_FileBrowserForFoundDocs [ FileMetadata . FileBrowser ] ] ;
if ( CrsCod > 0 & & CrsCod ! = Gbl . CurrentCrs . Crs . CrsCod ) // Not the current course
2014-12-01 23:55:08 +01:00
{
2016-04-18 11:19:42 +02:00
Act_FormGoToStart ( Action ) ;
Crs_PutParamCrsCod ( CrsCod ) ; // Go to another course
}
else if ( DegCod > 0 & & DegCod ! = Gbl . CurrentDeg . Deg . DegCod ) // Not the current degree
{
Act_FormGoToStart ( Action ) ;
Deg_PutParamDegCod ( DegCod ) ; // Go to another degree
}
else if ( CtrCod > 0 & & CtrCod ! = Gbl . CurrentCtr . Ctr . CtrCod ) // Not the current centre
{
Act_FormGoToStart ( Action ) ;
Ctr_PutParamCtrCod ( CtrCod ) ; // Go to another centre
}
else if ( InsCod > 0 & & InsCod ! = Gbl . CurrentIns . Ins . InsCod ) // Not the current institution
{
Act_FormGoToStart ( Action ) ;
Ins_PutParamInsCod ( InsCod ) ; // Go to another institution
2014-12-01 23:55:08 +01:00
}
else
2016-04-18 11:19:42 +02:00
Act_FormStart ( Action ) ;
2015-01-25 00:58:21 +01:00
if ( GrpCod > 0 )
Grp_PutParamGrpCod ( GrpCod ) ;
2014-12-01 23:55:08 +01:00
2016-04-18 10:50:12 +02:00
/* Parameters to go to file / folder */
if ( FileMetadata . FileType = = Brw_IS_FOLDER )
/* Params path and folder */
Brw_PutParamsPathAndFile ( FileMetadata . FileType ,
FileMetadata . PathInTreeUntilFilFolLnk ,
FileMetadata . FilFolLnkName ) ;
else
/* Param with file code */
Brw_PutHiddenParamFilCod ( FileMetadata . FilCod ) ;
2014-12-01 23:55:08 +01:00
/* File or folder icon */
2016-04-18 10:50:12 +02:00
Act_LinkFormSubmit ( FileNameToShow , " DAT_N " ) ;
2014-12-01 23:55:08 +01:00
if ( FileMetadata . FileType = = Brw_IS_FOLDER )
/* Icon with folder */
fprintf ( Gbl . F . Out , " <img src= \" %s/folder-closed16x16.gif \" "
2015-07-21 20:07:46 +02:00
" alt= \" %s \" title= \" %s \" "
2016-04-18 10:50:12 +02:00
" class= \" ICON20x20 \" /> " ,
2015-07-21 20:07:46 +02:00
Gbl . Prefs . IconsURL ,
Txt_Folder , Txt_Folder ) ;
2014-12-01 23:55:08 +01:00
else
/* Icon with file type or link */
2016-01-03 15:36:46 +01:00
Brw_PutIconFile ( 16 , FileMetadata . FileType , FileMetadata . FilFolLnkName ) ;
2016-04-18 10:50:12 +02:00
fprintf ( Gbl . F . Out , " %s "
2015-03-13 00:16:02 +01:00
" </a> " ,
2014-12-01 23:55:08 +01:00
FileNameToShow ) ;
2016-04-18 10:50:12 +02:00
/* End form */
2015-03-13 00:16:02 +01:00
Act_FormEnd ( ) ;
2016-04-18 10:50:12 +02:00
2015-03-13 00:16:02 +01:00
fprintf ( Gbl . F . Out , " </td> "
" </tr> " ) ;
2014-12-01 23:55:08 +01:00
Gbl . RowEvenOdd = 1 - Gbl . RowEvenOdd ;
}
}
2015-12-21 00:53:56 +01:00
/*****************************************************************************/
/***************** Write a form (link) to remove old files *******************/
/*****************************************************************************/
static void Brw_PutFormToAskRemOldFiles ( void )
{
extern const char * Txt_Remove_old_files ;
2016-04-05 02:59:34 +02:00
Lay_PutContextualLink ( ActReqRemOldBrf , Brw_PutParamsContextualLink ,
2015-12-21 00:53:56 +01:00
" remove-on64x64.png " ,
Txt_Remove_old_files , Txt_Remove_old_files ) ;
}
/*****************************************************************************/
/************** Write a form fo confirm removing of old files ****************/
/*****************************************************************************/
2015-12-21 14:49:53 +01:00
# define Brw_MIN_MONTHS_TO_REMOVE_OLD_FILES 6 // 6 months
2015-12-21 18:03:28 +01:00
# define Brw_DEF_MONTHS_TO_REMOVE_OLD_FILES 24 // 2 years
2015-12-21 11:07:54 +01:00
# define Brw_MAX_MONTHS_TO_REMOVE_OLD_FILES (10*12) // 10 years
void Brw_AskRemoveOldFiles ( void )
2015-12-21 00:53:56 +01:00
{
2015-12-21 11:07:54 +01:00
extern const char * The_ClassForm [ The_NUM_THEMES ] ;
extern const char * Txt_Remove_old_files ;
extern const char * Txt_Remove_files_older_than_PART_1_OF_2 ;
extern const char * Txt_Remove_files_older_than_PART_2_OF_2 ;
2015-12-21 00:53:56 +01:00
extern const char * Txt_Remove ;
2015-12-21 11:07:54 +01:00
unsigned Months ;
2015-12-21 00:53:56 +01:00
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
2015-12-21 11:07:54 +01:00
/***** Start form *****/
2015-12-21 00:53:56 +01:00
Act_FormStart ( ActRemOldBrf ) ;
Brw_PutParamsContextualLink ( ) ;
2015-12-21 11:07:54 +01:00
/***** Start frame *****/
2016-03-16 11:15:25 +01:00
Lay_StartRoundFrame ( NULL , Txt_Remove_old_files , NULL ) ;
2015-12-21 11:07:54 +01:00
/***** Form to request number of months (to remove files older) *****/
fprintf ( Gbl . F . Out , " <span class= \" %s \" >%s </span> " ,
The_ClassForm [ Gbl . Prefs . Theme ] ,
Txt_Remove_files_older_than_PART_1_OF_2 ) ;
fprintf ( Gbl . F . Out , " <select name= \" Months \" > " ) ;
for ( Months = Brw_MIN_MONTHS_TO_REMOVE_OLD_FILES ;
Months < = Brw_MAX_MONTHS_TO_REMOVE_OLD_FILES ;
Months + + )
{
fprintf ( Gbl . F . Out , " <option " ) ;
if ( Months = = Brw_DEF_MONTHS_TO_REMOVE_OLD_FILES )
fprintf ( Gbl . F . Out , " selected= \" selected \" " ) ;
fprintf ( Gbl . F . Out , " >%u</option> " , Months ) ;
}
fprintf ( Gbl . F . Out , " </select> "
" <span class= \" %s \" > " ,
The_ClassForm [ Gbl . Prefs . Theme ] ) ;
fprintf ( Gbl . F . Out , Txt_Remove_files_older_than_PART_2_OF_2 ,
Cfg_PLATFORM_SHORT_NAME ) ;
fprintf ( Gbl . F . Out , " </span> " ) ;
2015-12-21 00:53:56 +01:00
2015-12-21 11:07:54 +01:00
/***** End frame *****/
Lay_EndRoundFrameWithButton ( Lay_REMOVE_BUTTON , Txt_Remove ) ;
2015-12-21 00:53:56 +01:00
2015-12-21 11:07:54 +01:00
/***** End form *****/
2015-12-21 00:53:56 +01:00
Act_FormEnd ( ) ;
/***** Show again the file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/******************************* Remove old files ****************************/
/*****************************************************************************/
void Brw_RemoveOldFiles ( void )
{
2015-12-21 11:07:54 +01:00
char UnsignedStr [ 10 + 1 ] ;
unsigned Months ;
time_t TimeRemoveFilesOlder ;
2015-12-21 00:53:56 +01:00
/***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser ( ) ;
2015-12-21 11:07:54 +01:00
/***** Get parameter with number of months without access *****/
Par_GetParToText ( " Months " , UnsignedStr , 10 ) ;
if ( sscanf ( UnsignedStr , " %u " , & Months ) ! = 1 )
Lay_ShowErrorAndExit ( " Number of months is missing. " ) ;
if ( Months < Brw_MIN_MONTHS_TO_REMOVE_OLD_FILES | |
Months > Brw_MAX_MONTHS_TO_REMOVE_OLD_FILES )
Lay_ShowErrorAndExit ( " Wrong number of months. " ) ;
TimeRemoveFilesOlder = Gbl . StartExecutionTimeUTC -
( time_t ) Months * Dat_SECONDS_IN_ONE_MONTH ;
2015-12-21 00:53:56 +01:00
/***** Remove old files *****/
if ( Gbl . FileBrowser . Type = = Brw_ADMI_BRIEF_USR )
2015-12-21 11:07:54 +01:00
Brw_RemoveOldFilesInBrowser ( TimeRemoveFilesOlder ) ;
2015-12-21 00:53:56 +01:00
/***** Show again the file browser *****/
Brw_ShowAgainFileBrowserOrWorks ( ) ;
}
/*****************************************************************************/
/******************************* Remove old files ****************************/
/*****************************************************************************/
2015-12-21 11:07:54 +01:00
static void Brw_RemoveOldFilesInBrowser ( time_t TimeRemoveFilesOlder )
2015-12-21 00:53:56 +01:00
{
2015-12-21 10:32:20 +01:00
extern const char * Txt_Files_removed ;
2015-12-21 14:20:01 +01:00
extern const char * Txt_Links_removed ;
2015-12-21 13:36:39 +01:00
extern const char * Txt_Folders_removed ;
2015-12-21 14:20:01 +01:00
struct Brw_NumObjects Removed ;
2015-12-21 10:32:20 +01:00
/***** Remove old files recursively *****/
2015-12-21 14:20:01 +01:00
Removed . NumFiles =
Removed . NumLinks =
Removed . NumFolds = 0 ;
2015-12-21 18:03:28 +01:00
Brw_ScanDirRemovingOlfFiles ( 1 , Gbl . FileBrowser . Priv . PathRootFolder ,
Brw_RootFolderInternalNames [ Gbl . FileBrowser . Type ] ,
TimeRemoveFilesOlder , & Removed ) ;
/***** Remove affected clipboards *****/
Brw_RemoveAffectedClipboards ( Gbl . FileBrowser . Type ,
Gbl . Usrs . Me . UsrDat . UsrCod ,
Gbl . Usrs . Other . UsrDat . UsrCod ) ;
2015-12-21 10:32:20 +01:00
/***** Success message *****/
2015-12-21 14:20:01 +01:00
sprintf ( Gbl . Message , " %s: %u<br /> "
" %s: %u<br /> "
" %s: %u " ,
Txt_Files_removed , Removed . NumFiles ,
Txt_Links_removed , Removed . NumLinks ,
Txt_Folders_removed , Removed . NumFolds ) ;
2015-12-21 10:32:20 +01:00
Lay_ShowAlert ( Lay_SUCCESS , Gbl . Message ) ;
2015-12-21 00:53:56 +01:00
}
/*****************************************************************************/
/************* Scan a directory recursively removing old files ***************/
/*****************************************************************************/
2015-12-21 11:07:54 +01:00
static void Brw_ScanDirRemovingOlfFiles ( unsigned Level , const char * Path ,
2015-12-21 18:03:28 +01:00
const char * PathInTree ,
2015-12-21 14:20:01 +01:00
time_t TimeRemoveFilesOlder ,
struct Brw_NumObjects * Removed )
2015-12-21 00:53:56 +01:00
{
2015-12-21 12:30:07 +01:00
struct dirent * * FileList ;
2015-12-21 13:36:39 +01:00
int NumFile ;
int NumFiles ;
2015-12-21 00:53:56 +01:00
char PathFileRel [ PATH_MAX + 1 ] ;
2015-12-21 18:03:28 +01:00
char PathFileInExplTree [ PATH_MAX + 1 ] ;
2015-12-21 19:05:48 +01:00
struct stat FolderStatus ;
2015-12-21 00:53:56 +01:00
struct stat FileStatus ;
2015-12-21 19:05:48 +01:00
/***** Save folder status *****/
// Folder st_mtime must be saved before remove files inside it
// because st_mtime is updated by the deletion
lstat ( Path , & FolderStatus ) ;
2015-12-21 00:53:56 +01:00
/***** Scan directory *****/
2015-12-21 13:36:39 +01:00
if ( ( NumFiles = scandir ( Path , & FileList , NULL , alphasort ) ) > = 0 ) // No error
2015-12-21 12:30:07 +01:00
{
2015-12-21 19:05:48 +01:00
/***** Check file by file removing old files *****/
for ( NumFile = 0 ;
NumFile < NumFiles ;
NumFile + + )
2015-12-21 12:30:07 +01:00
{
2015-12-21 19:05:48 +01:00
if ( strcmp ( FileList [ NumFile ] - > d_name , " . " ) & &
strcmp ( FileList [ NumFile ] - > d_name , " .. " ) ) // Skip directories "." and ".."
2015-12-21 00:53:56 +01:00
{
2015-12-21 19:05:48 +01:00
/***** Construct the full path of the file or folder *****/
sprintf ( PathFileRel , " %s/%s " , Path , FileList [ NumFile ] - > d_name ) ;
sprintf ( PathFileInExplTree , " %s/%s " , PathInTree , FileList [ NumFile ] - > d_name ) ;
/***** Get file or folder status *****/
lstat ( PathFileRel , & FileStatus ) ;
if ( S_ISDIR ( FileStatus . st_mode ) ) // It's a folder
/* Scan subtree starting at this this directory recursively */
Brw_ScanDirRemovingOlfFiles ( Level + 1 , PathFileRel ,
PathFileInExplTree ,
TimeRemoveFilesOlder , Removed ) ;
else if ( S_ISREG ( FileStatus . st_mode ) & & // It's a regular file
FileStatus . st_mtime < TimeRemoveFilesOlder ) // ..and it's old
2015-12-21 13:36:39 +01:00
{
2015-12-21 19:05:48 +01:00
/* Remove file/link from disk and database */
Brw_RemoveFileFromDiskAndDB ( PathFileRel ,
PathFileInExplTree ) ;
2015-12-21 14:20:01 +01:00
2015-12-21 19:05:48 +01:00
/* Update number of files/links removed */
if ( Str_FileIs ( PathFileRel , " url " ) )
( Removed - > NumLinks ) + + ; // It's a link (URL inside a .url file)
else
( Removed - > NumFiles ) + + ; // It's a file
2015-12-21 00:53:56 +01:00
}
}
2015-12-21 19:05:48 +01:00
free ( ( void * ) FileList [ NumFile ] ) ;
}
free ( ( void * ) FileList ) ;
2015-12-21 12:30:07 +01:00
2015-12-21 19:05:48 +01:00
if ( Level > 1 ) // If not root folder
{
if ( NumFiles > 2 )
2015-12-21 13:36:39 +01:00
{
2015-12-21 19:05:48 +01:00
/***** Rescan folder in order to count
the new number of files after deletion * * * * */
2015-12-21 14:43:52 +01:00
if ( ( NumFiles = scandir ( Path , & FileList , NULL , alphasort ) ) > = 0 ) // No error
2015-12-21 19:05:48 +01:00
{
2015-12-21 14:43:52 +01:00
/* Free list of files */
for ( NumFile = 0 ;
NumFile < NumFiles ;
NumFile + + )
free ( ( void * ) FileList [ NumFile ] ) ;
free ( ( void * ) FileList ) ;
2015-12-21 19:05:48 +01:00
}
2015-12-21 14:43:52 +01:00
else
Lay_ShowErrorAndExit ( " Error while scanning directory. " ) ;
2015-12-21 13:36:39 +01:00
}
2015-12-21 19:05:48 +01:00
if ( NumFiles < = 2 & & // It's an empty folder
FolderStatus . st_mtime < TimeRemoveFilesOlder ) // ..and it was old before deletion
2015-12-21 13:36:39 +01:00
{
2015-12-21 18:03:28 +01:00
/* Remove folder from disk and database */
if ( Brw_RemoveFolderFromDiskAndDB ( Path , PathInTree ) )
2015-12-21 14:49:53 +01:00
Lay_ShowErrorAndExit ( " Can not remove folder. " ) ;
2015-12-21 18:03:28 +01:00
2015-12-21 19:05:48 +01:00
/* Update number of files/links removed */
2015-12-21 14:20:01 +01:00
( Removed - > NumFolds ) + + ;
2015-12-21 13:36:39 +01:00
}
2015-12-21 00:53:56 +01:00
}
2015-12-21 12:30:07 +01:00
}
2015-12-21 13:36:39 +01:00
else
Lay_ShowErrorAndExit ( " Error while scanning directory. " ) ;
2015-12-21 00:53:56 +01:00
}
2015-12-21 18:03:28 +01:00
/*****************************************************************************/
/******************* Remove file/link from disk and database *****************/
/*****************************************************************************/
static void Brw_RemoveFileFromDiskAndDB ( const char * Path ,
const char * FullPathInTree )
{
/***** Remove file from disk *****/
if ( unlink ( Path ) )
Lay_ShowErrorAndExit ( " Can not remove file / link. " ) ;
/***** If a file is removed,
it is necessary to remove it from the database * * * * */
Brw_RemoveOneFileOrFolderFromDB ( FullPathInTree ) ;
}
/*****************************************************************************/
/******************** Remove folder from disk and database *******************/
/*****************************************************************************/
// Return the returned value of rmdir
static int Brw_RemoveFolderFromDiskAndDB ( const char * Path ,
const char * FullPathInTree )
{
int Result ;
/***** Remove folder from disk *****/
Result = rmdir ( Path ) ; // On success, zero is returned.
// On error, -1 is returned, and errno is set appropriately.
if ( ! Result ) // Success
{
/***** If a folder is removed,
it is necessary to remove it from the database * * * * */
Brw_RemoveOneFileOrFolderFromDB ( FullPathInTree ) ;
/***** Remove affected expanded folders *****/
Brw_RemoveAffectedExpandedFolders ( FullPathInTree ) ;
}
return Result ;
}