Version 23.25.4: Oct 03, 2023 Code refactoring.

This commit is contained in:
acanas 2023-10-03 23:18:13 +02:00
parent 5015773a40
commit 7d7a5ce980
11 changed files with 153 additions and 347 deletions

View File

@ -4679,7 +4679,7 @@ int swad__getDirectoryTree (struct soap *soap,
Gbl.Crs.Grps.GrpCod = (groupCode > 0) ? (long) groupCode : Gbl.Crs.Grps.GrpCod = (groupCode > 0) ? (long) groupCode :
-1L; -1L;
snprintf (Gbl.Crs.PathPriv,sizeof (Gbl.Crs.PathPriv),"%s/%ld", snprintf (Gbl.Crs.Path.AbsPriv,sizeof (Gbl.Crs.Path.AbsPriv),"%s/%ld",
Cfg_PATH_CRS_PRIVATE,Gbl.Hierarchy.Node[Hie_CRS].HieCod); Cfg_PATH_CRS_PRIVATE,Gbl.Hierarchy.Node[Hie_CRS].HieCod);
Brw_InitializeFileBrowser (); Brw_InitializeFileBrowser ();
Str_Copy (Gbl.FileBrowser.FilFolLnk.Path,Brw_RootFolderInternalNames[Gbl.FileBrowser.Type], Str_Copy (Gbl.FileBrowser.FilFolLnk.Path,Brw_RootFolderInternalNames[Gbl.FileBrowser.Type],
@ -4706,7 +4706,7 @@ int swad__getDirectoryTree (struct soap *soap,
if (Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Brw_IS_FOLDER, if (Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Brw_IS_FOLDER,
Gbl.FileBrowser.FilFolLnk.Full) == HidVis_VISIBLE) Gbl.FileBrowser.FilFolLnk.Full) == HidVis_VISIBLE)
API_ListDir (XML,1, API_ListDir (XML,1,
Gbl.FileBrowser.Priv.PathRootFolder, Gbl.FileBrowser.Path.RootFolder,
Brw_RootFolderInternalNames[Gbl.FileBrowser.Type]); Brw_RootFolderInternalNames[Gbl.FileBrowser.Type]);
XML_WriteEndFile (XML,"tree"); XML_WriteEndFile (XML,"tree");

View File

@ -72,6 +72,7 @@ extern struct Globals Gbl;
/******************************** Private types ******************************/ /******************************** Private types ******************************/
/*****************************************************************************/ /*****************************************************************************/
#define Att_TYPES_OF_VIEW 4
typedef enum typedef enum
{ {
Att_VIEW_ONLY_ME, // View only me Att_VIEW_ONLY_ME, // View only me
@ -2619,6 +2620,13 @@ static void Att_ListEventsToSelect (struct Att_Events *Events,
extern const char *Txt_Event; extern const char *Txt_Event;
extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
extern const char *Txt_Update_attendance; extern const char *Txt_Update_attendance;
static void (*FunctionToDrawContextualIcons[Att_TYPES_OF_VIEW]) (void *Args) =
{
[Att_VIEW_ONLY_ME] = Att_PutIconToViewAttEvents,
[Att_VIEW_SEL_USR] = Att_PutIconToEditAttEvents,
[Att_PRNT_ONLY_ME] = NULL,
[Att_PRNT_SEL_USR] = NULL,
};
unsigned UniqueId; unsigned UniqueId;
char *Id; char *Id;
unsigned NumAttEvent; unsigned NumAttEvent;
@ -2626,25 +2634,9 @@ static void Att_ListEventsToSelect (struct Att_Events *Events,
TypeOfView == Att_VIEW_SEL_USR); TypeOfView == Att_VIEW_SEL_USR);
/***** Begin box *****/ /***** Begin box *****/
switch (TypeOfView) Box_BoxBegin (NULL,Txt_Events,
{ FunctionToDrawContextualIcons[TypeOfView],NULL,
case Att_VIEW_ONLY_ME: NULL,Box_NOT_CLOSABLE);
Box_BoxBegin (NULL,Txt_Events,
Att_PutIconToViewAttEvents,NULL,
NULL,Box_NOT_CLOSABLE);
break;
case Att_VIEW_SEL_USR:
Box_BoxBegin (NULL,Txt_Events,
Att_PutIconToEditAttEvents,NULL,
NULL,Box_NOT_CLOSABLE);
break;
case Att_PRNT_ONLY_ME:
case Att_PRNT_SEL_USR:
Box_BoxBegin (NULL,Txt_Events,
NULL,NULL,
NULL,Box_NOT_CLOSABLE);
break;
}
/***** Begin form to update the attendance /***** Begin form to update the attendance
depending on the events selected *****/ depending on the events selected *****/

View File

@ -2250,8 +2250,8 @@ static void Brw_SetPathFileBrowser (void)
/***** Reset paths. An empty path means that /***** Reset paths. An empty path means that
we don't have to create that directory *****/ we don't have to create that directory *****/
Gbl.FileBrowser.Priv.PathAboveRootFolder[0] = '\0'; Gbl.FileBrowser.Path.AboveRootFolder[0] = '\0';
Gbl.FileBrowser.Priv.PathRootFolder[0] = '\0'; Gbl.FileBrowser.Path.RootFolder[0] = '\0';
/***** Set paths depending on file browser *****/ /***** Set paths depending on file browser *****/
switch (Gbl.FileBrowser.Type) switch (Gbl.FileBrowser.Type)
@ -2270,8 +2270,8 @@ static void Brw_SetPathFileBrowser (void)
Fil_CreateDirIfNotExists (Path); Fil_CreateDirIfNotExists (Path);
/* Create path to the current institution */ /* Create path to the current institution */
snprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder, snprintf (Gbl.FileBrowser.Path.AboveRootFolder,
sizeof (Gbl.FileBrowser.Priv.PathAboveRootFolder), sizeof (Gbl.FileBrowser.Path.AboveRootFolder),
"%s/%02u/%u", "%s/%02u/%u",
Cfg_PATH_INS_PRIVATE, Cfg_PATH_INS_PRIVATE,
(unsigned) (Gbl.Hierarchy.Node[Hie_INS].HieCod % 100), (unsigned) (Gbl.Hierarchy.Node[Hie_INS].HieCod % 100),
@ -2291,8 +2291,8 @@ static void Brw_SetPathFileBrowser (void)
Fil_CreateDirIfNotExists (Path); Fil_CreateDirIfNotExists (Path);
/* Create path to the current center */ /* Create path to the current center */
snprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder, snprintf (Gbl.FileBrowser.Path.AboveRootFolder,
sizeof (Gbl.FileBrowser.Priv.PathAboveRootFolder), sizeof (Gbl.FileBrowser.Path.AboveRootFolder),
"%s/%02u/%u", "%s/%02u/%u",
Cfg_PATH_CTR_PRIVATE, Cfg_PATH_CTR_PRIVATE,
(unsigned) (Gbl.Hierarchy.Node[Hie_CTR].HieCod % 100), (unsigned) (Gbl.Hierarchy.Node[Hie_CTR].HieCod % 100),
@ -2312,8 +2312,8 @@ static void Brw_SetPathFileBrowser (void)
Fil_CreateDirIfNotExists (Path); Fil_CreateDirIfNotExists (Path);
/* Create path to the current degree */ /* Create path to the current degree */
snprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder, snprintf (Gbl.FileBrowser.Path.AboveRootFolder,
sizeof (Gbl.FileBrowser.Priv.PathAboveRootFolder), sizeof (Gbl.FileBrowser.Path.AboveRootFolder),
"%s/%02u/%u", "%s/%02u/%u",
Cfg_PATH_DEG_PRIVATE, Cfg_PATH_DEG_PRIVATE,
(unsigned) (Gbl.Hierarchy.Node[Hie_DEG].HieCod % 100), (unsigned) (Gbl.Hierarchy.Node[Hie_DEG].HieCod % 100),
@ -2326,8 +2326,8 @@ static void Brw_SetPathFileBrowser (void)
case Brw_SHOW_MRK_CRS: case Brw_SHOW_MRK_CRS:
case Brw_ADMI_MRK_CRS: case Brw_ADMI_MRK_CRS:
/* Create path to the current course */ /* Create path to the current course */
Str_Copy (Gbl.FileBrowser.Priv.PathAboveRootFolder,Gbl.Crs.PathPriv, Str_Copy (Gbl.FileBrowser.Path.AboveRootFolder,Gbl.Crs.Path.AbsPriv,
sizeof (Gbl.FileBrowser.Priv.PathAboveRootFolder) - 1); sizeof (Gbl.FileBrowser.Path.AboveRootFolder) - 1);
break; break;
case Brw_SHOW_DOC_GRP: case Brw_SHOW_DOC_GRP:
case Brw_ADMI_DOC_GRP: case Brw_ADMI_DOC_GRP:
@ -2337,37 +2337,37 @@ static void Brw_SetPathFileBrowser (void)
case Brw_ADMI_MRK_GRP: case Brw_ADMI_MRK_GRP:
/* Create a directory for groups inside the current course */ /* Create a directory for groups inside the current course */
snprintf (Path,sizeof (Path),"%s/%s", snprintf (Path,sizeof (Path),"%s/%s",
Gbl.Crs.PathPriv,Cfg_FOLDER_GRP); Gbl.Crs.Path.AbsPriv,Cfg_FOLDER_GRP);
Fil_CreateDirIfNotExists (Path); Fil_CreateDirIfNotExists (Path);
/* Create path to this group */ /* Create path to this group */
snprintf (Path,sizeof (Path),"%s/%s/%ld", snprintf (Path,sizeof (Path),"%s/%s/%ld",
Gbl.Crs.PathPriv,Cfg_FOLDER_GRP, Gbl.Crs.Path.AbsPriv,Cfg_FOLDER_GRP,
Gbl.Crs.Grps.GrpCod); Gbl.Crs.Grps.GrpCod);
Str_Copy (Gbl.FileBrowser.Priv.PathAboveRootFolder,Path, Str_Copy (Gbl.FileBrowser.Path.AboveRootFolder,Path,
sizeof (Gbl.FileBrowser.Priv.PathAboveRootFolder) - 1); sizeof (Gbl.FileBrowser.Path.AboveRootFolder) - 1);
break; break;
case Brw_ADMI_ASG_USR: case Brw_ADMI_ASG_USR:
case Brw_ADMI_WRK_USR: case Brw_ADMI_WRK_USR:
/* Create a directory for me inside the current course */ /* Create a directory for me inside the current course */
snprintf (Path,sizeof (Path),"%s/%s", snprintf (Path,sizeof (Path),"%s/%s",
Gbl.Crs.PathPriv,Cfg_FOLDER_USR); Gbl.Crs.Path.AbsPriv,Cfg_FOLDER_USR);
Fil_CreateDirIfNotExists (Path); Fil_CreateDirIfNotExists (Path);
/* Create a directory for all users whose codes end in /* Create a directory for all users whose codes end in
my-user-code mod 100 */ my-user-code mod 100 */
snprintf (Path,sizeof (Path),"%s/%s/%02u", snprintf (Path,sizeof (Path),"%s/%s/%02u",
Gbl.Crs.PathPriv,Cfg_FOLDER_USR, Gbl.Crs.Path.AbsPriv,Cfg_FOLDER_USR,
(unsigned) (Gbl.Usrs.Me.UsrDat.UsrCod % 100)); (unsigned) (Gbl.Usrs.Me.UsrDat.UsrCod % 100));
Fil_CreateDirIfNotExists (Path); Fil_CreateDirIfNotExists (Path);
/* Create path to me */ /* Create path to me */
snprintf (Path,sizeof (Path),"%s/%s/%02u/%ld", snprintf (Path,sizeof (Path),"%s/%s/%02u/%ld",
Gbl.Crs.PathPriv,Cfg_FOLDER_USR, Gbl.Crs.Path.AbsPriv,Cfg_FOLDER_USR,
(unsigned) (Gbl.Usrs.Me.UsrDat.UsrCod % 100), (unsigned) (Gbl.Usrs.Me.UsrDat.UsrCod % 100),
Gbl.Usrs.Me.UsrDat.UsrCod); Gbl.Usrs.Me.UsrDat.UsrCod);
Str_Copy (Gbl.FileBrowser.Priv.PathAboveRootFolder,Path, Str_Copy (Gbl.FileBrowser.Path.AboveRootFolder,Path,
sizeof (Gbl.FileBrowser.Priv.PathAboveRootFolder) - 1); sizeof (Gbl.FileBrowser.Path.AboveRootFolder) - 1);
break; break;
case Brw_ADMI_ASG_CRS: case Brw_ADMI_ASG_CRS:
case Brw_ADMI_WRK_CRS: case Brw_ADMI_WRK_CRS:
@ -2375,23 +2375,23 @@ static void Brw_SetPathFileBrowser (void)
{ {
/* Create a directory for this user inside the current course */ /* Create a directory for this user inside the current course */
snprintf (Path,sizeof (Path),"%s/%s", snprintf (Path,sizeof (Path),"%s/%s",
Gbl.Crs.PathPriv,Cfg_FOLDER_USR); Gbl.Crs.Path.AbsPriv,Cfg_FOLDER_USR);
Fil_CreateDirIfNotExists (Path); Fil_CreateDirIfNotExists (Path);
/* Create a directory for all users whose codes end in /* Create a directory for all users whose codes end in
user-code mod 100 */ user-code mod 100 */
snprintf (Path,sizeof (Path),"%s/%s/%02u", snprintf (Path,sizeof (Path),"%s/%s/%02u",
Gbl.Crs.PathPriv,Cfg_FOLDER_USR, Gbl.Crs.Path.AbsPriv,Cfg_FOLDER_USR,
(unsigned) (Gbl.Usrs.Other.UsrDat.UsrCod % 100)); (unsigned) (Gbl.Usrs.Other.UsrDat.UsrCod % 100));
Fil_CreateDirIfNotExists (Path); Fil_CreateDirIfNotExists (Path);
/* Create path to user */ /* Create path to user */
snprintf (Path,sizeof (Path),"%s/%s/%02u/%ld", snprintf (Path,sizeof (Path),"%s/%s/%02u/%ld",
Gbl.Crs.PathPriv,Cfg_FOLDER_USR, Gbl.Crs.Path.AbsPriv,Cfg_FOLDER_USR,
(unsigned) (Gbl.Usrs.Other.UsrDat.UsrCod % 100), (unsigned) (Gbl.Usrs.Other.UsrDat.UsrCod % 100),
Gbl.Usrs.Other.UsrDat.UsrCod); Gbl.Usrs.Other.UsrDat.UsrCod);
Str_Copy (Gbl.FileBrowser.Priv.PathAboveRootFolder,Path, Str_Copy (Gbl.FileBrowser.Path.AboveRootFolder,Path,
sizeof (Gbl.FileBrowser.Priv.PathAboveRootFolder) - 1); sizeof (Gbl.FileBrowser.Path.AboveRootFolder) - 1);
} }
break; break;
case Brw_ADMI_DOC_PRJ: case Brw_ADMI_DOC_PRJ:
@ -2400,42 +2400,42 @@ static void Brw_SetPathFileBrowser (void)
/* Create a directory for projects inside the current course */ /* Create a directory for projects inside the current course */
snprintf (Path,sizeof (Path),"%s/%s", snprintf (Path,sizeof (Path),"%s/%s",
Gbl.Crs.PathPriv,Cfg_FOLDER_PRJ); Gbl.Crs.Path.AbsPriv,Cfg_FOLDER_PRJ);
Fil_CreateDirIfNotExists (Path); Fil_CreateDirIfNotExists (Path);
/* Create a directory for all projects which codes end in /* Create a directory for all projects which codes end in
project-code mod 100 */ project-code mod 100 */
snprintf (Path,sizeof (Path),"%s/%s/%02u", snprintf (Path,sizeof (Path),"%s/%s/%02u",
Gbl.Crs.PathPriv,Cfg_FOLDER_PRJ, Gbl.Crs.Path.AbsPriv,Cfg_FOLDER_PRJ,
(unsigned) (PrjCod % 100)); (unsigned) (PrjCod % 100));
Fil_CreateDirIfNotExists (Path); Fil_CreateDirIfNotExists (Path);
/* Create path to the current project */ /* Create path to the current project */
snprintf (Path,sizeof (Path),"%s/%s/%02u/%ld", snprintf (Path,sizeof (Path),"%s/%s/%02u/%ld",
Gbl.Crs.PathPriv,Cfg_FOLDER_PRJ, Gbl.Crs.Path.AbsPriv,Cfg_FOLDER_PRJ,
(unsigned) (PrjCod % 100), (unsigned) (PrjCod % 100),
PrjCod); PrjCod);
Str_Copy (Gbl.FileBrowser.Priv.PathAboveRootFolder,Path, Str_Copy (Gbl.FileBrowser.Path.AboveRootFolder,Path,
sizeof (Gbl.FileBrowser.Priv.PathAboveRootFolder) - 1); sizeof (Gbl.FileBrowser.Path.AboveRootFolder) - 1);
break; break;
case Brw_ADMI_BRF_USR: case Brw_ADMI_BRF_USR:
Str_Copy (Gbl.FileBrowser.Priv.PathAboveRootFolder,Gbl.Usrs.Me.PathDir, Str_Copy (Gbl.FileBrowser.Path.AboveRootFolder,Gbl.Usrs.Me.PathDir,
sizeof (Gbl.FileBrowser.Priv.PathAboveRootFolder) - 1); sizeof (Gbl.FileBrowser.Path.AboveRootFolder) - 1);
break; break;
default: default:
return; return;
} }
/***** Create directories that not exist *****/ /***** Create directories that not exist *****/
if (Gbl.FileBrowser.Priv.PathAboveRootFolder[0]) if (Gbl.FileBrowser.Path.AboveRootFolder[0])
{ {
Fil_CreateDirIfNotExists (Gbl.FileBrowser.Priv.PathAboveRootFolder); Fil_CreateDirIfNotExists (Gbl.FileBrowser.Path.AboveRootFolder);
snprintf (Path,sizeof (Path),"%s/%s", snprintf (Path,sizeof (Path),"%s/%s",
Gbl.FileBrowser.Priv.PathAboveRootFolder, Gbl.FileBrowser.Path.AboveRootFolder,
Brw_RootFolderInternalNames[Gbl.FileBrowser.Type]); Brw_RootFolderInternalNames[Gbl.FileBrowser.Type]);
Str_Copy (Gbl.FileBrowser.Priv.PathRootFolder,Path, Str_Copy (Gbl.FileBrowser.Path.RootFolder,Path,
sizeof (Gbl.FileBrowser.Priv.PathRootFolder) - 1); sizeof (Gbl.FileBrowser.Path.RootFolder) - 1);
Fil_CreateDirIfNotExists (Gbl.FileBrowser.Priv.PathRootFolder); Fil_CreateDirIfNotExists (Gbl.FileBrowser.Path.RootFolder);
/***** If file browser is for assignments, /***** If file browser is for assignments,
create folders of assignments if not exist *****/ create folders of assignments if not exist *****/
@ -2473,7 +2473,7 @@ bool Brw_CheckIfExistsFolderAssigmentForAnyUsr (const char *FolderName)
/* Check if folder exists */ /* Check if folder exists */
snprintf (PathFolder,sizeof (PathFolder),"%s/usr/%02u/%ld/%s/%s", snprintf (PathFolder,sizeof (PathFolder),"%s/usr/%02u/%ld/%s/%s",
Gbl.Crs.PathPriv, Gbl.Crs.Path.AbsPriv,
(unsigned) (UsrCod % 100), (unsigned) (UsrCod % 100),
UsrCod, // User's code UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS, Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
@ -2519,7 +2519,7 @@ static void Brw_CreateFoldersAssignmentsIfNotExist (long ZoneUsrCod)
{ {
/* Create folder if not exists */ /* Create folder if not exists */
snprintf (PathFolderAsg,sizeof (PathFolderAsg),"%s/%s", snprintf (PathFolderAsg,sizeof (PathFolderAsg),"%s/%s",
Gbl.FileBrowser.Priv.PathRootFolder,row[0]); Gbl.FileBrowser.Path.RootFolder,row[0]);
Fil_CreateDirIfNotExists (PathFolderAsg); Fil_CreateDirIfNotExists (PathFolderAsg);
} }
} }
@ -2565,13 +2565,13 @@ bool Brw_UpdateFoldersAssigmentsIfExistForAllUsrs (const char *OldFolderName,
/* Rename folder if exists */ /* Rename folder if exists */
snprintf (PathOldFolder,sizeof (PathOldFolder),"%s/usr/%02u/%ld/%s/%s", snprintf (PathOldFolder,sizeof (PathOldFolder),"%s/usr/%02u/%ld/%s/%s",
Gbl.Crs.PathPriv, Gbl.Crs.Path.AbsPriv,
(unsigned) (UsrCod % 100), (unsigned) (UsrCod % 100),
UsrCod, // User's code UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS, Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
OldFolderName); OldFolderName);
snprintf (PathNewFolder,sizeof (PathNewFolder),"%s/usr/%02u/%ld/%s/%s", snprintf (PathNewFolder,sizeof (PathNewFolder),"%s/usr/%02u/%ld/%s/%s",
Gbl.Crs.PathPriv, Gbl.Crs.Path.AbsPriv,
(unsigned) (UsrCod % 100), (unsigned) (UsrCod % 100),
UsrCod, // User's code UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS, Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
@ -2594,7 +2594,7 @@ bool Brw_UpdateFoldersAssigmentsIfExistForAllUsrs (const char *OldFolderName,
/* Rename folder if exists */ /* Rename folder if exists */
snprintf (PathOldFolder,sizeof (PathOldFolder),"%s/usr/%02u/%ld/%s/%s", snprintf (PathOldFolder,sizeof (PathOldFolder),"%s/usr/%02u/%ld/%s/%s",
Gbl.Crs.PathPriv, Gbl.Crs.Path.AbsPriv,
(unsigned) (UsrCod % 100), (unsigned) (UsrCod % 100),
UsrCod, // User's code UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS, Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
@ -2602,7 +2602,7 @@ bool Brw_UpdateFoldersAssigmentsIfExistForAllUsrs (const char *OldFolderName,
if (Fil_CheckIfPathExists (PathOldFolder)) if (Fil_CheckIfPathExists (PathOldFolder))
{ {
snprintf (PathNewFolder,sizeof (PathNewFolder),"%s/usr/%02u/%ld/%s/%s", snprintf (PathNewFolder,sizeof (PathNewFolder),"%s/usr/%02u/%ld/%s/%s",
Gbl.Crs.PathPriv, Gbl.Crs.Path.AbsPriv,
(unsigned) (UsrCod % 100), (unsigned) (UsrCod % 100),
UsrCod, // User's code UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS, Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
@ -2677,7 +2677,7 @@ void Brw_RemoveFoldersAssignmentsIfExistForAllUsrs (const char *FolderName)
/* Remove tree if exists */ /* Remove tree if exists */
snprintf (PathFolder,sizeof (PathFolder),"%s/usr/%02u/%ld/%s/%s", snprintf (PathFolder,sizeof (PathFolder),"%s/usr/%02u/%ld/%s/%s",
Gbl.Crs.PathPriv, Gbl.Crs.Path.AbsPriv,
(unsigned) (UsrCod % 100), (unsigned) (UsrCod % 100),
UsrCod, // User's code UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS, Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
@ -3240,7 +3240,7 @@ static void Brw_ShowFileBrowser (void)
Brw_ICON_TREE_NOTHING)) Brw_ICON_TREE_NOTHING))
Brw_ListDir (1,"1", Brw_ListDir (1,"1",
false, // Tree not contracted false, // Tree not contracted
Gbl.FileBrowser.Priv.PathRootFolder, Gbl.FileBrowser.Path.RootFolder,
Brw_RootFolderInternalNames[Gbl.FileBrowser.Type]); Brw_RootFolderInternalNames[Gbl.FileBrowser.Type]);
HTM_TABLE_End (); HTM_TABLE_End ();
@ -5051,7 +5051,7 @@ void Brw_RemFileFromTree (void)
if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I remove this file? if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I remove this file?
{ {
snprintf (Path,sizeof (Path),"%s/%s", snprintf (Path,sizeof (Path),"%s/%s",
Gbl.FileBrowser.Priv.PathAboveRootFolder, Gbl.FileBrowser.Path.AboveRootFolder,
Gbl.FileBrowser.FilFolLnk.Full); Gbl.FileBrowser.FilFolLnk.Full);
/***** Check if is a file/link or a folder *****/ /***** Check if is a file/link or a folder *****/
@ -5104,7 +5104,7 @@ void Brw_RemFolderFromTree (void)
if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I remove this folder? if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I remove this folder?
{ {
snprintf (Path,sizeof (Path),"%s/%s", snprintf (Path,sizeof (Path),"%s/%s",
Gbl.FileBrowser.Priv.PathAboveRootFolder, Gbl.FileBrowser.Path.AboveRootFolder,
Gbl.FileBrowser.FilFolLnk.Full); Gbl.FileBrowser.FilFolLnk.Full);
/***** Check if it's a file or a folder *****/ /***** Check if it's a file or a folder *****/
@ -5170,7 +5170,7 @@ void Brw_RemSubtreeInFileBrowser (void)
if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I remove this subtree? if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I remove this subtree?
{ {
snprintf (Path,sizeof (Path),"%s/%s", snprintf (Path,sizeof (Path),"%s/%s",
Gbl.FileBrowser.Priv.PathAboveRootFolder, Gbl.FileBrowser.Path.AboveRootFolder,
Gbl.FileBrowser.FilFolLnk.Full); Gbl.FileBrowser.FilFolLnk.Full);
/***** Remove the whole tree *****/ /***** Remove the whole tree *****/
@ -5975,7 +5975,7 @@ static void Brw_PasteClipboard (struct BrwSiz_BrowserSize *Size)
} }
/***** Paste tree (path in clipboard) into folder *****/ /***** Paste tree (path in clipboard) into folder *****/
BrwSiz_CalcSizeOfDir (Size,Gbl.FileBrowser.Priv.PathRootFolder); BrwSiz_CalcSizeOfDir (Size,Gbl.FileBrowser.Path.RootFolder);
BrwSiz_SetMaxQuota (Size); BrwSiz_SetMaxQuota (Size);
if (Brw_PasteTreeIntoFolder (Size, if (Brw_PasteTreeIntoFolder (Size,
Gbl.FileBrowser.Clipboard.Level, Gbl.FileBrowser.Clipboard.Level,
@ -6061,18 +6061,10 @@ static bool Brw_PasteTreeIntoFolder (struct BrwSiz_BrowserSize *Size,
struct Brw_NumObjects *Pasted, struct Brw_NumObjects *Pasted,
long *FirstFilCod) 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_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_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_disk_quota; extern const char *Txt_The_copy_has_stopped_when_trying_to_paste_X_because_there_is_already_an_object_with_that_name;
extern const char *Txt_The_copy_has_stopped_when_trying_to_paste_X_because_you_can_not_paste_a_file_here_of_a_type_other_than_HTML;
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; Brw_FileType_t FileType;
char PathUntilFileNameOrg[PATH_MAX + 1]; char PathUntilFileNameOrg[PATH_MAX + 1];
char FileNameOrg[NAME_MAX + 1]; char FileNameOrg[NAME_MAX + 1];
@ -6120,7 +6112,7 @@ static bool Brw_PasteTreeIntoFolder (struct BrwSiz_BrowserSize *Size,
/***** Construct the relative path of the destination file or folder *****/ /***** Construct the relative path of the destination file or folder *****/
snprintf (PathDstWithFile,sizeof (PathDstWithFile),"%s/%s", snprintf (PathDstWithFile,sizeof (PathDstWithFile),"%s/%s",
Gbl.FileBrowser.Priv.PathAboveRootFolder, Gbl.FileBrowser.Path.AboveRootFolder,
PathDstInTreeWithFile); PathDstInTreeWithFile);
/***** Update and check number of levels *****/ /***** Update and check number of levels *****/
@ -6131,23 +6123,8 @@ static bool Brw_PasteTreeIntoFolder (struct BrwSiz_BrowserSize *Size,
if (BrwSiz_CheckIfQuotaExceded (Size)) if (BrwSiz_CheckIfQuotaExceded (Size))
{ {
switch (FileType) Ale_ShowAlert (Ale_WARNING,Txt_The_copy_has_stopped_when_trying_to_paste_X_because_it_would_exceed_the_maximum_allowed_number_of_levels,
{ FileNameToShow);
case Brw_IS_FILE:
Ale_ShowAlert (Ale_WARNING,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:
Ale_ShowAlert (Ale_WARNING,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:
Ale_ShowAlert (Ale_WARNING,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:
Err_ShowErrorAndExit ("Can not paste unknown file type.");
}
CopyIsGoingSuccessful = false; CopyIsGoingSuccessful = false;
} }
else // Quota not exceeded else // Quota not exceeded
@ -6159,8 +6136,7 @@ static bool Brw_PasteTreeIntoFolder (struct BrwSiz_BrowserSize *Size,
/***** Check if exists the destination file */ /***** Check if exists the destination file */
if (Fil_CheckIfPathExists (PathDstWithFile)) if (Fil_CheckIfPathExists (PathDstWithFile))
{ {
Ale_ShowAlert (Ale_WARNING,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 : Ale_ShowAlert (Ale_WARNING,Txt_The_copy_has_stopped_when_trying_to_paste_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); FileNameToShow);
CopyIsGoingSuccessful = false; CopyIsGoingSuccessful = false;
} }
@ -6174,7 +6150,7 @@ static bool Brw_PasteTreeIntoFolder (struct BrwSiz_BrowserSize *Size,
Mrk_CheckFileOfMarks (PathOrg,&Marks); Mrk_CheckFileOfMarks (PathOrg,&Marks);
else else
{ {
Ale_ShowAlert (Ale_WARNING,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, Ale_ShowAlert (Ale_WARNING,Txt_The_copy_has_stopped_when_trying_to_paste_X_because_you_can_not_paste_a_file_here_of_a_type_other_than_HTML,
FileNameToShow); FileNameToShow);
CopyIsGoingSuccessful = false; CopyIsGoingSuccessful = false;
} }
@ -6187,8 +6163,7 @@ static bool Brw_PasteTreeIntoFolder (struct BrwSiz_BrowserSize *Size,
Size->TotalSiz += (unsigned long long) FileStatus.st_size; Size->TotalSiz += (unsigned long long) FileStatus.st_size;
if (BrwSiz_CheckIfQuotaExceded (Size)) if (BrwSiz_CheckIfQuotaExceded (Size))
{ {
Ale_ShowAlert (Ale_WARNING,FileType == Brw_IS_FILE ? Txt_The_copy_has_stopped_when_trying_to_paste_the_file_X_because_it_would_exceed_the_disk_quota : Ale_ShowAlert (Ale_WARNING,Txt_The_copy_has_stopped_when_trying_to_paste_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); FileNameToShow);
CopyIsGoingSuccessful = false; CopyIsGoingSuccessful = false;
} }
@ -6229,7 +6204,7 @@ static bool Brw_PasteTreeIntoFolder (struct BrwSiz_BrowserSize *Size,
Size->TotalSiz += (unsigned long long) FileStatus.st_size; Size->TotalSiz += (unsigned long long) FileStatus.st_size;
if (BrwSiz_CheckIfQuotaExceded (Size)) if (BrwSiz_CheckIfQuotaExceded (Size))
{ {
Ale_ShowAlert (Ale_WARNING,Txt_The_copy_has_stopped_when_trying_to_paste_the_folder_X_because_it_would_exceed_the_disk_quota, Ale_ShowAlert (Ale_WARNING,Txt_The_copy_has_stopped_when_trying_to_paste_X_because_it_would_exceed_the_disk_quota,
FileNameToShow); FileNameToShow);
CopyIsGoingSuccessful = false; CopyIsGoingSuccessful = false;
} }
@ -6607,7 +6582,7 @@ void Brw_RecFolderFileBrowser (void)
{ {
/* In Gbl.FileBrowser.NewFilFolLnkName is the name of the new folder */ /* In Gbl.FileBrowser.NewFilFolLnkName is the name of the new folder */
snprintf (Path,sizeof (Path),"%s/%s", snprintf (Path,sizeof (Path),"%s/%s",
Gbl.FileBrowser.Priv.PathAboveRootFolder, Gbl.FileBrowser.Path.AboveRootFolder,
Gbl.FileBrowser.FilFolLnk.Full); Gbl.FileBrowser.FilFolLnk.Full);
if (strlen (Path) + 1 + strlen (Gbl.FileBrowser.NewFilFolLnkName) > PATH_MAX) if (strlen (Path) + 1 + strlen (Gbl.FileBrowser.NewFilFolLnkName) > PATH_MAX)
@ -6619,7 +6594,7 @@ void Brw_RecFolderFileBrowser (void)
if (mkdir (Path,(mode_t) 0xFFF) == 0) if (mkdir (Path,(mode_t) 0xFFF) == 0)
{ {
/* Check if quota has been exceeded */ /* Check if quota has been exceeded */
BrwSiz_CalcSizeOfDir (Size,Gbl.FileBrowser.Priv.PathRootFolder); BrwSiz_CalcSizeOfDir (Size,Gbl.FileBrowser.Path.RootFolder);
BrwSiz_SetMaxQuota (Size); BrwSiz_SetMaxQuota (Size);
if (BrwSiz_CheckIfQuotaExceded (Size)) if (BrwSiz_CheckIfQuotaExceded (Size))
{ {
@ -6712,10 +6687,10 @@ void Brw_RenFolderFileBrowser (void)
Gbl.FileBrowser.FilFolLnk.Path, Gbl.FileBrowser.FilFolLnk.Path,
Gbl.FileBrowser.FilFolLnk.Name); Gbl.FileBrowser.FilFolLnk.Name);
snprintf (OldPath,sizeof (OldPath),"%s/%s", snprintf (OldPath,sizeof (OldPath),"%s/%s",
Gbl.FileBrowser.Priv.PathAboveRootFolder,OldPathInTree); Gbl.FileBrowser.Path.AboveRootFolder,OldPathInTree);
/* Gbl.FileBrowser.NewFilFolLnkName holds the new name of the folder */ /* Gbl.FileBrowser.NewFilFolLnkName holds the new name of the folder */
if (strlen (Gbl.FileBrowser.Priv.PathAboveRootFolder) + 1 + if (strlen (Gbl.FileBrowser.Path.AboveRootFolder) + 1 +
strlen (Gbl.FileBrowser.FilFolLnk.Path) + 1 + strlen (Gbl.FileBrowser.FilFolLnk.Path) + 1 +
strlen (Gbl.FileBrowser.NewFilFolLnkName) > PATH_MAX) strlen (Gbl.FileBrowser.NewFilFolLnkName) > PATH_MAX)
Err_ShowErrorAndExit ("Path is too long."); Err_ShowErrorAndExit ("Path is too long.");
@ -6723,7 +6698,7 @@ void Brw_RenFolderFileBrowser (void)
Gbl.FileBrowser.FilFolLnk.Path, Gbl.FileBrowser.FilFolLnk.Path,
Gbl.FileBrowser.NewFilFolLnkName); Gbl.FileBrowser.NewFilFolLnkName);
snprintf (NewPath,sizeof (NewPath),"%s/%s", snprintf (NewPath,sizeof (NewPath),"%s/%s",
Gbl.FileBrowser.Priv.PathAboveRootFolder,NewPathInTree); Gbl.FileBrowser.Path.AboveRootFolder,NewPathInTree);
/* We should check here that a folder with the same name does not exist. /* We should check here that a folder with the same name does not exist.
but we leave this work to the system */ but we leave this work to the system */
@ -6892,7 +6867,7 @@ static bool Brw_RcvFileInFileBrw (struct BrwSiz_BrowserSize *Size,
{ {
/* Gbl.FileBrowser.NewFilFolLnkName holds the name of the new file */ /* Gbl.FileBrowser.NewFilFolLnkName holds the name of the new file */
snprintf (Path,sizeof (Path),"%s/%s", snprintf (Path,sizeof (Path),"%s/%s",
Gbl.FileBrowser.Priv.PathAboveRootFolder, Gbl.FileBrowser.Path.AboveRootFolder,
Gbl.FileBrowser.FilFolLnk.Full); Gbl.FileBrowser.FilFolLnk.Full);
if (strlen (Path) + 1 + if (strlen (Path) + 1 +
strlen (Gbl.FileBrowser.NewFilFolLnkName) + strlen (Gbl.FileBrowser.NewFilFolLnkName) +
@ -6931,7 +6906,7 @@ static bool Brw_RcvFileInFileBrw (struct BrwSiz_BrowserSize *Size,
else // Success else // Success
{ {
/* Check if quota has been exceeded */ /* Check if quota has been exceeded */
BrwSiz_CalcSizeOfDir (Size,Gbl.FileBrowser.Priv.PathRootFolder); BrwSiz_CalcSizeOfDir (Size,Gbl.FileBrowser.Path.RootFolder);
BrwSiz_SetMaxQuota (Size); BrwSiz_SetMaxQuota (Size);
if (BrwSiz_CheckIfQuotaExceded (Size)) if (BrwSiz_CheckIfQuotaExceded (Size))
{ {
@ -7092,7 +7067,7 @@ void Brw_RecLinkFileBrowser (void)
{ {
/* The name of the file with the link will be the FileName.url */ /* The name of the file with the link will be the FileName.url */
snprintf (Path,sizeof (Path),"%s/%s", snprintf (Path,sizeof (Path),"%s/%s",
Gbl.FileBrowser.Priv.PathAboveRootFolder, Gbl.FileBrowser.Path.AboveRootFolder,
Gbl.FileBrowser.FilFolLnk.Full); Gbl.FileBrowser.FilFolLnk.Full);
if (strlen (Path) + 1 + strlen (FileName) + strlen (".url") > PATH_MAX) if (strlen (Path) + 1 + strlen (FileName) + strlen (".url") > PATH_MAX)
Err_ShowErrorAndExit ("Path is too long."); Err_ShowErrorAndExit ("Path is too long.");
@ -7116,7 +7091,7 @@ void Brw_RecLinkFileBrowser (void)
fclose (FileURL); fclose (FileURL);
/* Check if quota has been exceeded */ /* Check if quota has been exceeded */
BrwSiz_CalcSizeOfDir (Size,Gbl.FileBrowser.Priv.PathRootFolder); BrwSiz_CalcSizeOfDir (Size,Gbl.FileBrowser.Path.RootFolder);
BrwSiz_SetMaxQuota (Size); BrwSiz_SetMaxQuota (Size);
if (BrwSiz_CheckIfQuotaExceded (Size)) if (BrwSiz_CheckIfQuotaExceded (Size))
{ {
@ -7815,7 +7790,7 @@ void Brw_GetLinkToDownloadFile (const char *PathInTree,const char *FileName,char
/***** Construct absolute path to file in the private directory *****/ /***** Construct absolute path to file in the private directory *****/
snprintf (FullPathIncludingFile,sizeof (FullPathIncludingFile),"%s/%s/%s", snprintf (FullPathIncludingFile,sizeof (FullPathIncludingFile),"%s/%s/%s",
Gbl.FileBrowser.Priv.PathAboveRootFolder,PathInTree,FileName); Gbl.FileBrowser.Path.AboveRootFolder,PathInTree,FileName);
if (Str_FileIs (FileName,"url")) // It's a link (URL inside a .url file) if (Str_FileIs (FileName,"url")) // It's a link (URL inside a .url file)
{ {
@ -8489,7 +8464,7 @@ bool Brw_GetFileTypeSizeAndDate (struct Brw_FileMetadata *FileMetadata)
struct stat FileStatus; struct stat FileStatus;
snprintf (Path,sizeof (Path),"%s/%s", snprintf (Path,sizeof (Path),"%s/%s",
Gbl.FileBrowser.Priv.PathAboveRootFolder, Gbl.FileBrowser.Path.AboveRootFolder,
FileMetadata->FilFolLnk.Full); FileMetadata->FilFolLnk.Full);
if (lstat (Path,&FileStatus)) // On success ==> 0 is returned if (lstat (Path,&FileStatus)) // On success ==> 0 is returned
{ {
@ -9681,7 +9656,7 @@ static void Brw_RemoveOldFilesInBrowser (unsigned Months,struct Brw_NumObjects *
Removed->NumFiles = Removed->NumFiles =
Removed->NumLinks = Removed->NumLinks =
Removed->NumFolds = 0; Removed->NumFolds = 0;
Brw_ScanDirRemovingOldFiles (1,Gbl.FileBrowser.Priv.PathRootFolder, Brw_ScanDirRemovingOldFiles (1,Gbl.FileBrowser.Path.RootFolder,
Brw_RootFolderInternalNames[Gbl.FileBrowser.Type], Brw_RootFolderInternalNames[Gbl.FileBrowser.Type],
TimeRemoveFilesOlder,Removed); TimeRemoveFilesOlder,Removed);

View File

@ -164,7 +164,7 @@ void BrwSiz_SetAndCheckQuota (struct BrwSiz_BrowserSize *Size)
/***** Check the quota *****/ /***** Check the quota *****/
BrwSiz_SetMaxQuota (Size); BrwSiz_SetMaxQuota (Size);
BrwSiz_CalcSizeOfDir (Size,Gbl.FileBrowser.Priv.PathRootFolder); BrwSiz_CalcSizeOfDir (Size,Gbl.FileBrowser.Path.RootFolder);
if (BrwSiz_CheckIfQuotaExceded (Size)) if (BrwSiz_CheckIfQuotaExceded (Size))
Ale_ShowAlert (Ale_WARNING,Txt_Quota_exceeded); Ale_ShowAlert (Ale_WARNING,Txt_Quota_exceeded);
} }

View File

@ -632,10 +632,11 @@ TODO: Francisco Javier Fern
Me sale este error, no si por no recordar yo la sintaxis apropiada para mandar a varios destinatarios. ¿No era así? Me sale este error, no si por no recordar yo la sintaxis apropiada para mandar a varios destinatarios. ¿No era así?
"can npt create received message (duplicated entry '243218-2160773' for key 'UsrCod_MsgCod') "can npt create received message (duplicated entry '243218-2160773' for key 'UsrCod_MsgCod')
*/ */
#define Log_PLATFORM_VERSION "SWAD 23.25.3 (2023-10-03)" #define Log_PLATFORM_VERSION "SWAD 23.25.4 (2023-10-03)"
#define CSS_FILE "swad23.25.2.css" #define CSS_FILE "swad23.25.2.css"
#define JS_FILE "swad22.49.js" #define JS_FILE "swad22.49.js"
/* /*
Version 23.25.4: Oct 03, 2023 Code refactoring. (336222 lines)
Version 23.25.3: Oct 03, 2023 Code refactoring in user's hierarchy. (336222 lines) Version 23.25.3: Oct 03, 2023 Code refactoring in user's hierarchy. (336222 lines)
Version 23.25.2: Oct 03, 2023 Changes in my courses. (336230 lines) Version 23.25.2: Oct 03, 2023 Changes in my courses. (336230 lines)
Version 23.25.1: Oct 03, 2023 Fixed recent bug in user's roles. (336225 lines) Version 23.25.1: Oct 03, 2023 Fixed recent bug in user's roles. (336225 lines)

View File

@ -124,7 +124,6 @@ struct Globals
char PendingPassword[Pwd_BYTES_ENCRYPTED_PASSWORD + 1]; char PendingPassword[Pwd_BYTES_ENCRYPTED_PASSWORD + 1];
char PathDir[PATH_MAX + 1]; char PathDir[PATH_MAX + 1];
bool Logged; bool Logged;
bool IBelongToCurrent[Hie_NUM_LEVELS];
bool MyPhotoExists; bool MyPhotoExists;
unsigned NumAccWithoutPhoto; unsigned NumAccWithoutPhoto;
char PhotoURL[Cns_MAX_BYTES_WWW + 1]; char PhotoURL[Cns_MAX_BYTES_WWW + 1];
@ -136,6 +135,7 @@ struct Globals
unsigned Num; // Number of courses/degrees/centers/institutions/countries unsigned Num; // Number of courses/degrees/centers/institutions/countries
bool Filled; // List is already filled? bool Filled; // List is already filled?
} Hierarchy[Hie_NUM_LEVELS]; // My hierarchy } Hierarchy[Hie_NUM_LEVELS]; // My hierarchy
bool IBelongToCurrent[Hie_NUM_LEVELS];
Set_ShowUsrsType_t ListType; // My preference about user's list type Set_ShowUsrsType_t ListType; // My preference about user's list type
unsigned NumFollowers; // Number of users who follow me unsigned NumFollowers; // Number of users who follow me
unsigned NumFollowing; // Number of users I follow unsigned NumFollowing; // Number of users I follow
@ -178,9 +178,12 @@ struct Globals
} Usrs; } Usrs;
struct struct
{ {
char PathPriv[PATH_MAX + 1]; // Absolute path to the private directory of the course struct
char PathRelPubl[PATH_MAX + 1]; // Relative path to the public directory of the course {
char PathURLPubl[PATH_MAX + 1]; // Abolute URL to the public part of the course char AbsPriv[PATH_MAX + 1]; // Absolute path to the private directory of the course
char RelPubl[PATH_MAX + 1]; // Relative path to the public directory of the course
char URLPubl[PATH_MAX + 1]; // Abolute URL to the public part of the course
} Path;
struct Grp_Groups Grps; struct Grp_Groups Grps;
struct Inf_Info Info; struct Inf_Info Info;
struct struct
@ -202,9 +205,9 @@ struct Globals
bool UploadingWithDropzone; bool UploadingWithDropzone;
struct struct
{ {
char PathAboveRootFolder[PATH_MAX + 1]; char AboveRootFolder[PATH_MAX + 1];
char PathRootFolder[PATH_MAX + 1]; char RootFolder[PATH_MAX + 1];
} Priv; } Path;
char NewFilFolLnkName[NAME_MAX + 1]; char NewFilFolLnkName[NAME_MAX + 1];
struct Brw_FilFolLnk FilFolLnk; struct Brw_FilFolLnk FilFolLnk;
unsigned Level; unsigned Level;

View File

@ -594,18 +594,18 @@ void Hie_InitHierarchy (void)
if (Gbl.Hierarchy.Level == Hie_CRS) // Course selected if (Gbl.Hierarchy.Level == Hie_CRS) // Course selected
{ {
/***** Paths of course directories *****/ /***** Paths of course directories *****/
snprintf (Gbl.Crs.PathPriv ,sizeof (Gbl.Crs.PathPriv ),"%s/%ld", snprintf (Gbl.Crs.Path.AbsPriv,sizeof (Gbl.Crs.Path.AbsPriv),"%s/%ld",
Cfg_PATH_CRS_PRIVATE,Gbl.Hierarchy.Node[Hie_CRS].HieCod); Cfg_PATH_CRS_PRIVATE,Gbl.Hierarchy.Node[Hie_CRS].HieCod);
snprintf (Gbl.Crs.PathRelPubl,sizeof (Gbl.Crs.PathRelPubl),"%s/%ld", snprintf (Gbl.Crs.Path.RelPubl,sizeof (Gbl.Crs.Path.RelPubl),"%s/%ld",
Cfg_PATH_CRS_PUBLIC ,Gbl.Hierarchy.Node[Hie_CRS].HieCod); Cfg_PATH_CRS_PUBLIC ,Gbl.Hierarchy.Node[Hie_CRS].HieCod);
snprintf (Gbl.Crs.PathURLPubl,sizeof (Gbl.Crs.PathURLPubl),"%s/%ld", snprintf (Gbl.Crs.Path.URLPubl,sizeof (Gbl.Crs.Path.URLPubl),"%s/%ld",
Cfg_URL_CRS_PUBLIC ,Gbl.Hierarchy.Node[Hie_CRS].HieCod); Cfg_URL_CRS_PUBLIC ,Gbl.Hierarchy.Node[Hie_CRS].HieCod);
/***** If any of the course directories does not exist, create it *****/ /***** If any of the course directories does not exist, create it *****/
if (!Fil_CheckIfPathExists (Gbl.Crs.PathPriv)) if (!Fil_CheckIfPathExists (Gbl.Crs.Path.AbsPriv))
Fil_CreateDirIfNotExists (Gbl.Crs.PathPriv); Fil_CreateDirIfNotExists (Gbl.Crs.Path.AbsPriv);
if (!Fil_CheckIfPathExists (Gbl.Crs.PathRelPubl)) if (!Fil_CheckIfPathExists (Gbl.Crs.Path.RelPubl))
Fil_CreateDirIfNotExists (Gbl.Crs.PathRelPubl); Fil_CreateDirIfNotExists (Gbl.Crs.Path.RelPubl);
/***** Count number of groups in current course /***** Count number of groups in current course
(used in some actions) *****/ (used in some actions) *****/

View File

@ -1965,7 +1965,7 @@ void Inf_ReceivePagInfo (void)
Fil_RemoveTree (PathRelDirHTML); Fil_RemoveTree (PathRelDirHTML);
Fil_CreateDirIfNotExists (PathRelDirHTML); Fil_CreateDirIfNotExists (PathRelDirHTML);
snprintf (PathRelFileZIP,sizeof (PathRelFileZIP),"%s/%s.zip", snprintf (PathRelFileZIP,sizeof (PathRelFileZIP),"%s/%s.zip",
Gbl.Crs.PathPriv, Gbl.Crs.Path.AbsPriv,
Inf_FileNamesForInfoType[Gbl.Crs.Info.Type]); Inf_FileNamesForInfoType[Gbl.Crs.Info.Type]);
if (Fil_EndReceptionOfFile (PathRelFileZIP,Par)) if (Fil_EndReceptionOfFile (PathRelFileZIP,Par))

View File

@ -542,7 +542,7 @@ void Mrk_ShowMyMarks (void)
/***** Get the path of the file of marks *****/ /***** Get the path of the file of marks *****/
Brw_SetFullPathInTree (); Brw_SetFullPathInTree ();
snprintf (PathPrivate,sizeof (PathPrivate),"%s/%s", snprintf (PathPrivate,sizeof (PathPrivate),"%s/%s",
Gbl.FileBrowser.Priv.PathAboveRootFolder, Gbl.FileBrowser.Path.AboveRootFolder,
Gbl.FileBrowser.FilFolLnk.Full); Gbl.FileBrowser.FilFolLnk.Full);
/***** Get number of rows of header or footer *****/ /***** Get number of rows of header or footer *****/

View File

@ -47149,300 +47149,135 @@ const char *Txt_The_copy_has_been_successful =
"The copy has been successful."; // Çeviri lazim! "The copy has been successful."; // Çeviri lazim!
#endif #endif
const char *Txt_The_copy_has_stopped_when_trying_to_paste_the_file_X_because_it_would_exceed_the_disk_quota = // Warning: it is very important to include %s in the following sentences const char *Txt_The_copy_has_stopped_when_trying_to_paste_X_because_it_would_exceed_the_disk_quota = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca #if L==1 // ca
"La copia se ha detenido al intentar pegar el archivo <strong>%s</strong>" "La copia se ha detenido al intentar pegar <strong>%s</strong>"
" porque se exceder&iacute;a la cuota de disco."; // Necessita traducció " porque se exceder&iacute;a la cuota de disco."; // Necessita traducció
#elif L==2 // de #elif L==2 // de
"Der Kopiervorgang wurde aus Platzgr&uuml;nden abgebrochen, als versucht wurde," "Der Kopiervorgang wurde aus Platzgr&uuml;nden abgebrochen, als versucht wurde,"
" die Datei <strong>%s</strong> einzuf&uuml;gen."; " <strong>%s</strong> einzuf&uuml;gen.";
#elif L==3 // en #elif L==3 // en
"The copy has stopped when trying to paste the file <strong>%s</strong>" "The copy has stopped when trying to paste <strong>%s</strong>"
" because it would exceed the disk quota."; " because it would exceed the disk quota.";
#elif L==4 // es #elif L==4 // es
"La copia se ha detenido al intentar pegar el archivo <strong>%s</strong>" "La copia se ha detenido al intentar pegar <strong>%s</strong>"
" porque se exceder&iacute;a la cuota de disco."; " porque se exceder&iacute;a la cuota de disco.";
#elif L==5 // fr #elif L==5 // fr
"The copy has stopped when trying to paste the file <strong>%s</strong>" "The copy has stopped when trying to paste <strong>%s</strong>"
" because it would exceed the disk quota."; // Besoin de traduction " because it would exceed the disk quota."; // Besoin de traduction
#elif L==6 // gn #elif L==6 // gn
"La copia se ha detenido al intentar pegar el archivo <strong>%s</strong>" "La copia se ha detenido al intentar pegar <strong>%s</strong>"
" porque se exceder&iacute;a la cuota de disco."; // Okoteve traducción " porque se exceder&iacute;a la cuota de disco."; // Okoteve traducción
#elif L==7 // it #elif L==7 // it
"La copia &egrave; terminata quando si &egrave; provato a incollare il file <strong>%s</strong>" "La copia &egrave; terminata quando si &egrave; provato a incollare <strong>%s</strong>"
" perch&egrave; esso superava la quota di gestione del disco."; " perch&egrave; esso superava la quota di gestione del disco.";
#elif L==8 // pl #elif L==8 // pl
"The copy has stopped when trying to paste the file <strong>%s</strong>" "The copy has stopped when trying to paste <strong>%s</strong>"
" because it would exceed the disk quota."; // Potrzebujesz tlumaczenie " because it would exceed the disk quota."; // Potrzebujesz tlumaczenie
#elif L==9 // pt #elif L==9 // pt
"A c&oacute;pia parou ao tentar colar o arquivo <strong>%s</strong>" "A c&oacute;pia parou ao tentar colar <strong>%s</strong>"
" porque ele excederia a cota de disco."; " porque ele excederia a cota de disco.";
#elif L==10 // tr #elif L==10 // tr
"The copy has stopped when trying to paste the file <strong>%s</strong>" "The copy has stopped when trying to paste <strong>%s</strong>"
" because it would exceed the disk quota."; // Çeviri lazim! " because it would exceed the disk quota."; // Çeviri lazim!
#endif #endif
const char *Txt_The_copy_has_stopped_when_trying_to_paste_the_folder_X_because_it_would_exceed_the_disk_quota = // Warning: it is very important to include %s in the following sentences const char *Txt_The_copy_has_stopped_when_trying_to_paste_X_because_it_would_exceed_the_maximum_allowed_number_of_levels = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca #if L==1 // ca
"La copia se ha detenido al intentar pegar la carpeta <strong>%s</strong>" "La copia se ha detenido al intentar pegar <strong>%s</strong>"
" porque se exceder&iacute;a la cuota de disco."; // Necessita traducció
#elif L==2 // de
"Der Kopiervorgang wurde aus Platzgr&uuml;nden abgebrochen, als versucht wurde,"
" das Verzeichnis <strong>%s</strong> einzuf&uuml;gen.";
#elif L==3 // en
"The copy has stopped when trying to paste the folder <strong>%s</strong>"
" because it would exceed the disk quota.";
#elif L==4 // es
"La copia se ha detenido al intentar pegar la carpeta <strong>%s</strong>"
" porque se exceder&iacute;a la cuota de disco.";
#elif L==5 // fr
"The copy has stopped when trying to paste the folder <strong>%s</strong>"
" because it would exceed the disk quota."; // Besoin de traduction
#elif L==6 // gn
"La copia se ha detenido al intentar pegar la carpeta <strong>%s</strong>"
" porque se exceder&iacute;a la cuota de disco."; // Okoteve traducción
#elif L==7 // it
"La copia &egrave; terminata quando si &egrave; provato a incollare la cartella<strong>%s</strong>"
" perch&egrave; essa superava la quota di gestione del disco.";
#elif L==8 // pl
"The copy has stopped when trying to paste the folder <strong>%s</strong>"
" because it would exceed the disk quota."; // Potrzebujesz tlumaczenie
#elif L==9 // pt
"A c&oacute;pia parou ao tentar colar a pasta <strong>%s</strong>"
" porque ele excederia a cota de disco.";
#elif L==10 // tr
"The copy has stopped when trying to paste the folder <strong>%s</strong>"
" because it would exceed the disk quota."; // Çeviri lazim!
#endif
const char *Txt_The_copy_has_stopped_when_trying_to_paste_the_link_X_because_it_would_exceed_the_disk_quota = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"La copia se ha detenido al intentar pegar el enlace <strong>%s</strong>"
" porque se exceder&iacute;a la cuota de disco."; // Necessita traducció
#elif L==2 // de
"Der Kopiervorgang wurde aus Platzgr&uuml;nden abgebrochen, als versucht wurde,"
" das Link <strong>%s</strong> einzuf&uuml;gen.";
#elif L==3 // en
"The copy has stopped when trying to paste the link <strong>%s</strong>"
" because it would exceed the disk quota.";
#elif L==4 // es
"La copia se ha detenido al intentar pegar el enlace <strong>%s</strong>"
" porque se exceder&iacute;a la cuota de disco.";
#elif L==5 // fr
"The copy has stopped when trying to paste the link <strong>%s</strong>"
" because it would exceed the disk quota."; // Besoin de traduction
#elif L==6 // gn
"La copia se ha detenido al intentar pegar el enlace <strong>%s</strong>"
" porque se exceder&iacute;a la cuota de disco."; // Okoteve traducción
#elif L==7 // it
"La copia &egrave; terminata quando si &egrave; provato a incollare il link<strong>%s</strong>"
" perch&egrave; essa superava la quota di gestione del disco.";
#elif L==8 // pl
"The copy has stopped when trying to paste the link <strong>%s</strong>"
" because it would exceed the disk quota."; // Potrzebujesz tlumaczenie
#elif L==9 // pt
"A c&oacute;pia parou ao tentar colar o link <strong>%s</strong>"
" porque ele excederia a cota de disco.";
#elif L==10 // tr
"The copy has stopped when trying to paste the link <strong>%s</strong>"
" because it would exceed the disk quota."; // Çeviri lazim!
#endif
const char *Txt_The_copy_has_stopped_when_trying_to_paste_the_file_X_because_it_would_exceed_the_maximum_allowed_number_of_levels = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"La copia se ha detenido al intentar pegar el archivo <strong>%s</strong>"
" porque se exceder&iacute;a el n&uacute;mero m&aacute;ximo de niveles permitido."; // Necessita traducció " porque se exceder&iacute;a el n&uacute;mero m&aacute;ximo de niveles permitido."; // Necessita traducció
#elif L==2 // de #elif L==2 // de
"Zu viele Ebenen. Der Kopiervorgang wurde abgebrochen, als versucht wurde," "Zu viele Ebenen. Der Kopiervorgang wurde abgebrochen, als versucht wurde,"
" die Datei <strong>%s</strong> einzuf&uuml;gen."; " <strong>%s</strong> einzuf&uuml;gen.";
#elif L==3 // en #elif L==3 // en
"The copy has stopped when trying to paste the file <strong>%s</strong>" "The copy has stopped when trying to paste <strong>%s</strong>"
" because it would exceed the maximum allowed number of levels."; " because it would exceed the maximum allowed number of levels.";
#elif L==4 // es #elif L==4 // es
"La copia se ha detenido al intentar pegar el archivo <strong>%s</strong>" "La copia se ha detenido al intentar pegar <strong>%s</strong>"
" porque se exceder&iacute;a el n&uacute;mero m&aacute;ximo de niveles permitido."; " porque se exceder&iacute;a el n&uacute;mero m&aacute;ximo de niveles permitido.";
#elif L==5 // fr #elif L==5 // fr
"The copy has stopped when trying to paste the file <strong>%s</strong>" "The copy has stopped when trying to paste <strong>%s</strong>"
" because it would exceed the maximum allowed number of levels."; // Besoin de traduction " because it would exceed the maximum allowed number of levels."; // Besoin de traduction
#elif L==6 // gn #elif L==6 // gn
"La copia se ha detenido al intentar pegar el archivo <strong>%s</strong>" "La copia se ha detenido al intentar pegar <strong>%s</strong>"
" porque se exceder&iacute;a el n&uacute;mero m&aacute;ximo de niveles permitido."; // Okoteve traducción " porque se exceder&iacute;a el n&uacute;mero m&aacute;ximo de niveles permitido."; // Okoteve traducción
#elif L==7 // it #elif L==7 // it
"La copia &egrave; terminata quando si &egrave; provato a incollare il file <strong>%s</strong>" "La copia &egrave; terminata quando si &egrave; provato a incollare <strong>%s</strong>"
" perch&egrave; esso superava il massimo numero di livelli permesso."; " perch&egrave; esso superava il massimo numero di livelli permesso.";
#elif L==8 // pl #elif L==8 // pl
"The copy has stopped when trying to paste the file <strong>%s</strong>" "The copy has stopped when trying to paste <strong>%s</strong>"
" because it would exceed the maximum allowed number of levels."; // Potrzebujesz tlumaczenie " because it would exceed the maximum allowed number of levels."; // Potrzebujesz tlumaczenie
#elif L==9 // pt #elif L==9 // pt
"A c&oacute;pia parou ao tentar colar o arquivo <strong>%s</strong>" "A c&oacute;pia parou ao tentar colar <strong>%s</strong>"
" porque ele excederia o n&uacute;mero m&aacute;ximo permitido de n&iacute;veis."; " porque ele excederia o n&uacute;mero m&aacute;ximo permitido de n&iacute;veis.";
#elif L==10 // tr #elif L==10 // tr
"The copy has stopped when trying to paste the file <strong>%s</strong>" "The copy has stopped when trying to paste <strong>%s</strong>"
" because it would exceed the maximum allowed number of levels."; // Çeviri lazim! " because it would exceed the maximum allowed number of levels."; // Çeviri lazim!
#endif #endif
const char *Txt_The_copy_has_stopped_when_trying_to_paste_the_folder_X_because_it_would_exceed_the_maximum_allowed_number_of_levels = // Warning: it is very important to include %s in the following sentences const char *Txt_The_copy_has_stopped_when_trying_to_paste_X_because_there_is_already_an_object_with_that_name = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca #if L==1 // ca
"La copia se ha detenido al intentar pegar el archivo <strong>%s</strong>" "La copia se ha detenido al intentar pegar <strong>%s</strong>"
" porque se exceder&iacute;a el n&uacute;mero m&aacute;ximo de niveles permitido."; // Necessita traducció
#elif L==2 // de
"Zu viele Ebenen. Der Kopiervorgang wurde abgebrochen, als versucht wurde,"
" die Datei <strong>%s</strong> einzuf&uuml;gen.";
#elif L==3 // en
"The copy has stopped when trying to paste the file <strong>%s</strong>"
" because it would exceed the maximum allowed number of levels.";
#elif L==4 // es
"La copia se ha detenido al intentar pegar el archivo <strong>%s</strong>"
" porque se exceder&iacute;a el n&uacute;mero m&aacute;ximo de niveles permitido.";
#elif L==5 // fr
"The copy has stopped when trying to paste the file <strong>%s</strong>"
" because it would exceed the maximum allowed number of levels."; // Besoin de traduction
#elif L==6 // gn
"La copia se ha detenido al intentar pegar el archivo <strong>%s</strong>"
" porque se exceder&iacute;a el n&uacute;mero m&aacute;ximo de niveles permitido."; // Okoteve traducción
#elif L==7 // it
"La copia &egrave; terminata quando si &egrave; provato a incollare il file <strong>%s</strong>"
" perch&egrave; superava il massimo numero di livelli permessi.";
#elif L==8 // pl
"The copy has stopped when trying to paste the file <strong>%s</strong>"
" because it would exceed the maximum allowed number of levels."; // Potrzebujesz tlumaczenie
#elif L==9 // pt
"A c&oacute;pia parou ao tentar colar o arquivo <strong>%s</strong>"
" porque ele excederia o n&uacute;mero m&aacute;ximo permitido de n&iacute;veis.";
#elif L==10 // tr
"The copy has stopped when trying to paste the file <strong>%s</strong>"
" because it would exceed the maximum allowed number of levels."; // Çeviri lazim!
#endif
const char *Txt_The_copy_has_stopped_when_trying_to_paste_the_link_X_because_it_would_exceed_the_maximum_allowed_number_of_levels = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"La copia se ha detenido al intentar pegar el enlace <strong>%s</strong>"
" porque se exceder&iacute;a el n&uacute;mero m&aacute;ximo de niveles permitido."; // Necessita traducció
#elif L==2 // de
"Zu viele Ebenen. Der Kopiervorgang wurde abgebrochen, als versucht wurde,"
" die Link <strong>%s</strong> einzuf&uuml;gen.";
#elif L==3 // en
"The copy has stopped when trying to paste the link <strong>%s</strong>"
" because it would exceed the maximum allowed number of levels.";
#elif L==4 // es
"La copia se ha detenido al intentar pegar el enlace <strong>%s</strong>"
" porque se exceder&iacute;a el n&uacute;mero m&aacute;ximo de niveles permitido.";
#elif L==5 // fr
"The copy has stopped when trying to paste the link <strong>%s</strong>"
" because it would exceed the maximum allowed number of levels."; // Besoin de traduction
#elif L==6 // gn
"La copia se ha detenido al intentar pegar el enlace <strong>%s</strong>"
" porque se exceder&iacute;a el n&uacute;mero m&aacute;ximo de niveles permitido."; // Okoteve traducción
#elif L==7 // it
"La copia &egrave; terminata quando si &egrave; provato a incollare il link <strong>%s</strong>"
" perch&egrave; superava il massimo numero di livelli permessi.";
#elif L==8 // pl
"The copy has stopped when trying to paste the link <strong>%s</strong>"
" because it would exceed the maximum allowed number of levels."; // Potrzebujesz tlumaczenie
#elif L==9 // pt
"A c&oacute;pia parou ao tentar colar o link <strong>%s</strong>"
" porque ele excederia o n&uacute;mero m&aaxute;ximo permitido de n&iacute;veis.";
#elif L==10 // tr
"The copy has stopped when trying to paste the link <strong>%s</strong>"
" because it would exceed the maximum allowed number of levels."; // Çeviri lazim!
#endif
const char *Txt_The_copy_has_stopped_when_trying_to_paste_the_file_X_because_there_is_already_an_object_with_that_name = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"La copia se ha detenido al intentar pegar el archivo <strong>%s</strong>"
" porque ya existe otro objeto con ese nombre."; // Necessita traducció " porque ya existe otro objeto con ese nombre."; // Necessita traducció
#elif L==2 // de #elif L==2 // de
"Der Kopiervorgang wurde abgebrochen, als versucht wurde, die Datei <strong>%s</strong>" "Der Kopiervorgang wurde abgebrochen, als versucht wurde, <strong>%s</strong>"
" einzuf&uuml;gen. Der Objektname wird bereits verwendet."; " einzuf&uuml;gen. Der Objektname wird bereits verwendet.";
#elif L==3 // en #elif L==3 // en
"The copy has stopped when trying to paste the file <strong>%s</strong>" "The copy has stopped when trying to paste <strong>%s</strong>"
" because there is already an object with that name."; " because there is already an object with that name.";
#elif L==4 // es #elif L==4 // es
"La copia se ha detenido al intentar pegar el archivo <strong>%s</strong>" "La copia se ha detenido al intentar pegar <strong>%s</strong>"
" porque ya existe otro objeto con ese nombre."; " porque ya existe otro objeto con ese nombre.";
#elif L==5 // fr #elif L==5 // fr
"The copy has stopped when trying to paste the file <strong>%s</strong>" "The copy has stopped when trying to paste <strong>%s</strong>"
" because there is already an object with that name."; // Besoin de traduction " because there is already an object with that name."; // Besoin de traduction
#elif L==6 // gn #elif L==6 // gn
"La copia se ha detenido al intentar pegar el archivo <strong>%s</strong>" "La copia se ha detenido al intentar pegar <strong>%s</strong>"
" porque ya existe otro objecto con ese nombre."; // Okoteve traducción " porque ya existe otro objecto con ese nombre."; // Okoteve traducción
#elif L==7 // it #elif L==7 // it
"La copia &egrave; terminata quando si &egrave; provato a incollare il file <strong>%s</strong>" "La copia &egrave; terminata quando si &egrave; provato a incollare <strong>%s</strong>"
" perch&egrave; c'era gi&agrave; un oggetto con quel nome."; " perch&egrave; c'era gi&agrave; un oggetto con quel nome.";
#elif L==8 // pl #elif L==8 // pl
"The copy has stopped when trying to paste the file <strong>%s</strong>" "The copy has stopped when trying to paste <strong>%s</strong>"
" because there is already an object with that name."; // Potrzebujesz tlumaczenie " because there is already an object with that name."; // Potrzebujesz tlumaczenie
#elif L==9 // pt #elif L==9 // pt
"A c&oacute;pia parou ao tentar colar o arquivo <strong>%s</strong>" "A c&oacute;pia parou ao tentar colar <strong>%s</strong>"
" porque j&aacute; existe um objeto com esse nome."; " porque j&aacute; existe um objeto com esse nome.";
#elif L==10 // tr #elif L==10 // tr
"The copy has stopped when trying to paste the file <strong>%s</strong>" "The copy has stopped when trying to paste <strong>%s</strong>"
" because there is already an object with that name."; // Çeviri lazim! " because there is already an object with that name."; // Çeviri lazim!
#endif #endif
const char *Txt_The_copy_has_stopped_when_trying_to_paste_the_link_X_because_there_is_already_an_object_with_that_name = // Warning: it is very important to include %s in the following sentences const char *Txt_The_copy_has_stopped_when_trying_to_paste_X_because_you_can_not_paste_a_file_here_of_a_type_other_than_HTML = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca #if L==1 // ca
"La copia se ha detenido al intentar pegar el enlace <strong>%s</strong>" "La copia se ha detenido al intentar pegar <strong>%s</strong>"
" porque ya existe otro objeto con ese nombre."; // Necessita traducció
#elif L==2 // de
"Der Kopiervorgang wurde abgebrochen, als versucht wurde, die Link <strong>%s</strong>"
" einzuf&uuml;gen. Der Objektname wird bereits verwendet.";
#elif L==3 // en
"The copy has stopped when trying to paste the link <strong>%s</strong>"
" because there is already an object with that name.";
#elif L==4 // es
"La copia se ha detenido al intentar pegar el enlace <strong>%s</strong>"
" porque ya existe otro objeto con ese nombre.";
#elif L==5 // fr
"The copy has stopped when trying to paste the link <strong>%s</strong>"
" because there is already an object with that name."; // Besoin de traduction
#elif L==6 // gn
"La copia se ha detenido al intentar pegar el enlace <strong>%s</strong>"
" porque ya existe otro objecto con ese nombre."; // Okoteve traducción
#elif L==7 // it
"La copia &egrave; terminata quando si &egrave; provato a incollare il link <strong>%s</strong>"
" perch&egrave; c'era gi&agrave; un oggetto con quel nome.";
#elif L==8 // pl
"The copy has stopped when trying to paste the link <strong>%s</strong>"
" because there is already an object with that name."; // Potrzebujesz tlumaczenie
#elif L==9 // pt
"A c&oacute;pia parou ao tentar colar o link <strong>%s</strong>"
" porque j&aacute; existe um objeto com esse nome.";
#elif L==10 // tr
"The copy has stopped when trying to paste the link <strong>%s</strong>"
" because there is already an object with that name."; // Çeviri lazim!
#endif
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 = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"La copia se ha detenido al intentar pegar el archivo <strong>%s</strong>"
" porque no se puede pegar aqu&iacute; un archivo de un tipo distinto a HTML."; // Necessita traducció " porque no se puede pegar aqu&iacute; un archivo de un tipo distinto a HTML."; // Necessita traducció
#elif L==2 // de #elif L==2 // de
"Der Kopiervorgang wurde abgebrochen, als versucht wurde, die Datei <strong>%s</strong>" "Der Kopiervorgang wurde abgebrochen, als versucht wurde, <strong>%s</strong>"
" einzuf&uuml;gen. Es d&uuml;rfen nur HTML-Daten eingef&uumlgt werden."; " einzuf&uuml;gen. Es d&uuml;rfen nur HTML-Daten eingef&uumlgt werden.";
#elif L==3 // en #elif L==3 // en
"The copy has stopped when trying to paste the file <strong>%s</strong>" "The copy has stopped when trying to paste <strong>%s</strong>"
" because you can not paste a file here of a type other than HTML."; " because you can not paste a file here of a type other than HTML.";
#elif L==4 // es #elif L==4 // es
"La copia se ha detenido al intentar pegar el archivo <strong>%s</strong>" "La copia se ha detenido al intentar pegar <strong>%s</strong>"
" porque no se puede pegar aqu&iacute; un archivo de un tipo distinto a HTML."; " porque no se puede pegar aqu&iacute; un archivo de un tipo distinto a HTML.";
#elif L==5 // fr #elif L==5 // fr
"The copy has stopped when trying to paste the file <strong>%s</strong>" "The copy has stopped when trying to paste <strong>%s</strong>"
" because you can not paste a file here of a type other than HTML."; // Besoin de traduction " because you can not paste a file here of a type other than HTML."; // Besoin de traduction
#elif L==6 // gn #elif L==6 // gn
"La copia se ha detenido al intentar pegar el archivo <strong>%s</strong>" "La copia se ha detenido al intentar pegar <strong>%s</strong>"
" porque no se puede pegar aqu&iacute; un archivo de un tipo distinto a HTML."; // Okoteve traducción " porque no se puede pegar aqu&iacute; un archivo de un tipo distinto a HTML."; // Okoteve traducción
#elif L==7 // it #elif L==7 // it
"La copia &egrave; terminata quando si &egrave; provato a incollare il file <strong>%s</strong>" "La copia &egrave; terminata quando si &egrave; provato a incollare <strong>%s</strong>"
" perch&egrave; non puoi incollare qui un file di un tipo diverso da HTML."; " perch&egrave; non puoi incollare qui un file di un tipo diverso da HTML.";
#elif L==8 // pl #elif L==8 // pl
"The copy has stopped when trying to paste the file <strong>%s</strong>" "The copy has stopped when trying to paste <strong>%s</strong>"
" because you can not paste a file here of a type other than HTML."; // Potrzebujesz tlumaczenie " because you can not paste a file here of a type other than HTML."; // Potrzebujesz tlumaczenie
#elif L==9 // pt #elif L==9 // pt
"A c&oacute;pia parou ao tentar colar o arquivo <strong>%s</strong>" "A c&oacute;pia parou ao tentar colar <strong>%s</strong>"
" porque voc&ecirc; n&atilde;o pode colar um arquivo aqui de um tipo diferente de HTML."; " porque voc&ecirc; n&atilde;o pode colar um arquivo aqui de um tipo diferente de HTML.";
#elif L==10 // tr #elif L==10 // tr
"The copy has stopped when trying to paste the file <strong>%s</strong>" "The copy has stopped when trying to paste <strong>%s</strong>"
" because you can not paste a file here of a type other than HTML."; // Çeviri lazim! " because you can not paste a file here of a type other than HTML."; // Çeviri lazim!
#endif #endif

View File

@ -275,7 +275,7 @@ static void ZIP_CreateDirCompressionUsr (struct Usr_Data *UsrDat)
/* Create path to folder and link */ /* Create path to folder and link */
snprintf (PathFolderUsrInsideCrs,sizeof (PathFolderUsrInsideCrs), snprintf (PathFolderUsrInsideCrs,sizeof (PathFolderUsrInsideCrs),
"%s/usr/%02u/%ld", "%s/usr/%02u/%ld",
Gbl.Crs.PathPriv,(unsigned) (UsrDat->UsrCod % 100),UsrDat->UsrCod); Gbl.Crs.Path.AbsPriv,(unsigned) (UsrDat->UsrCod % 100),UsrDat->UsrCod);
snprintf (LinkTmpUsr,sizeof (LinkTmpUsr),"%s/%s/%s", snprintf (LinkTmpUsr,sizeof (LinkTmpUsr),"%s/%s/%s",
Cfg_PATH_ZIP_PRIVATE,Gbl.FileBrowser.ZIP.TmpDir,FullNameAndUsrID); Cfg_PATH_ZIP_PRIVATE,Gbl.FileBrowser.ZIP.TmpDir,FullNameAndUsrID);
@ -348,7 +348,7 @@ static void ZIP_CompressFolderIntoZIP (void)
/***** Create a copy of the directory to compress *****/ /***** Create a copy of the directory to compress *****/
snprintf (Path,sizeof (Path),"%s/%s", snprintf (Path,sizeof (Path),"%s/%s",
Gbl.FileBrowser.Priv.PathAboveRootFolder, Gbl.FileBrowser.Path.AboveRootFolder,
Gbl.FileBrowser.FilFolLnk.Full); Gbl.FileBrowser.FilFolLnk.Full);
snprintf (PathCompression,sizeof (PathCompression),"%s/%s", snprintf (PathCompression,sizeof (PathCompression),"%s/%s",
Cfg_PATH_ZIP_PRIVATE, Cfg_PATH_ZIP_PRIVATE,