diff --git a/swad_changelog.h b/swad_changelog.h
index 8046dcb6d..868fa45af 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -431,10 +431,12 @@ En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
-#define Log_PLATFORM_VERSION "SWAD 18.52 (2019-02-20)"
+#define Log_PLATFORM_VERSION "SWAD 18.52.2 (2019-02-21)"
#define CSS_FILE "swad18.52.css"
#define JS_FILE "swad18.51.js"
/*
+ Version 18.52.2: Feb 20, 2019 Fixed bug in reception of images. (237458 lines)
+ Version 18.52.1: Feb 20, 2019 Messages to debug problem with files. (237425 lines)
Version 18.52: Feb 20, 2019 Two new color themes: purple and pink. (237424 lines)
Copy the following icons to icon public directory:
sudo mkdir /var/www/html/swad/icon/theme/purple
diff --git a/swad_file.c b/swad_file.c
index 11f626473..29962b38f 100644
--- a/swad_file.c
+++ b/swad_file.c
@@ -431,7 +431,7 @@ void Fil_RemoveTree (const char Path[PATH_MAX + 1])
if (Fil_CheckIfPathExists (Path))
{
if (lstat (Path,&FileStatus)) // On success ==> 0 is returned
- Lay_ShowErrorAndExit ("Can not get information about a file or folder.");
+ Lay_ShowErrorAndExit ("Can not get information about a file or folder in Fil_RemoveTree.");
else if (S_ISDIR (FileStatus.st_mode)) // It's a directory
{
if (rmdir (Path))
@@ -497,7 +497,10 @@ void Fil_RemoveOldTmpFiles (const char *Path,time_t TimeToRemove,bool RemoveDire
struct stat FileStatus;
if (lstat (Path,&FileStatus)) // On success ==> 0 is returned
- Lay_ShowErrorAndExit ("Can not get information about a file or folder.");
+ {
+ Ale_ShowAlert (Ale_ERROR,"Error while trying to remove old temporary files in directory "%s"",Path);
+ Lay_ShowErrorAndExit ("Can not get information about a file or folder in Fil_RemoveOldTmpFiles.");
+ }
else if (S_ISDIR (FileStatus.st_mode)) // It's a directory
{
/***** Scan the directory *****/
diff --git a/swad_file_browser.c b/swad_file_browser.c
index fb7edcac5..b3cff439b 100644
--- a/swad_file_browser.c
+++ b/swad_file_browser.c
@@ -5352,7 +5352,7 @@ static void Brw_CalcSizeOfDirRecursive (unsigned Level,char *Path)
"%s/%s",
Path,FileList[NumFile]->d_name);
if (lstat (PathFileRel,&FileStatus)) // On success ==> 0 is returned
- Lay_ShowErrorAndExit ("Can not get information about a file or folder.");
+ Lay_ShowErrorAndExit ("Can not get information about a file or folder in Brw_CalcSizeOfDirRecursive.");
else if (S_ISDIR (FileStatus.st_mode)) // It's a directory
{
Gbl.FileBrowser.Size.NumFolds++;
@@ -5423,7 +5423,7 @@ static void Brw_ListDir (unsigned Level,const char *ParentRowId,
/***** Get file or folder status *****/
if (lstat (PathFileRel,&FileStatus)) // On success ==> 0 is returned
- Lay_ShowErrorAndExit ("Can not get information about a file or folder.");
+ Lay_ShowErrorAndExit ("Can not get information about a file or folder in Brw_ListDir.");
else if (S_ISDIR (FileStatus.st_mode)) // It's a directory
{
if (Gbl.FileBrowser.FullTree)
@@ -6764,7 +6764,7 @@ void Brw_RemFileFromTree (void)
/***** Check if is a file/link or a folder *****/
if (lstat (Path,&FileStatus)) // On success ==> 0 is returned
- Lay_ShowErrorAndExit ("Can not get information about a file or folder.");
+ Lay_ShowErrorAndExit ("Can not get information about a file or folder in Brw_RemFileFromTree.");
else if (S_ISREG (FileStatus.st_mode)) // It's a file or a link
{
/* Name of the file/link to be shown */
@@ -6818,7 +6818,7 @@ void Brw_RemFolderFromTree (void)
/***** Check if it's a file or a folder *****/
if (lstat (Path,&FileStatus)) // On success ==> 0 is returned
- Lay_ShowErrorAndExit ("Can not get information about a file or folder.");
+ Lay_ShowErrorAndExit ("Can not get information about a file or folder in Brw_RemFolderFromTree.");
else if (S_ISDIR (FileStatus.st_mode)) // It's a directory
if (Brw_RemoveFolderFromDiskAndDB (Path,
Gbl.FileBrowser.Priv.FullPathInTree))
@@ -8288,7 +8288,7 @@ static bool Brw_PasteTreeIntoFolder (unsigned LevelOrg,
/***** Is it a file or a folder? *****/
FileType = Brw_IS_UNKNOWN;
if (lstat (PathOrg,&FileStatus)) // On success ==> 0 is returned
- Lay_ShowErrorAndExit ("Can not get information about a file or folder.");
+ Lay_ShowErrorAndExit ("Can not get information about a file or folder in Brw_PasteTreeIntoFolder.");
else 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
@@ -12558,7 +12558,7 @@ static void Brw_ScanDirRemovingOldFiles (unsigned Level,
// Folder st_mtime must be saved before remove files inside it
// because st_mtime is updated by the deletion
if (lstat (Path,&FolderStatus)) // On success ==> 0 is returned
- Lay_ShowErrorAndExit ("Can not get information about a file or folder.");
+ Lay_ShowErrorAndExit ("Can not get information about a file or folder in Brw_ScanDirRemovingOldFiles.");
/***** Scan directory *****/
else if ((NumFiles = scandir (Path,&FileList,NULL,alphasort)) >= 0) // No error
{
@@ -12580,7 +12580,7 @@ static void Brw_ScanDirRemovingOldFiles (unsigned Level,
/***** Get file or folder status *****/
if (lstat (PathFileRel,&FileStatus)) // On success ==> 0 is returned
- Lay_ShowErrorAndExit ("Can not get information about a file or folder.");
+ Lay_ShowErrorAndExit ("Can not get information about a file or folder in Brw_ScanDirRemovingOldFiles.");
else if (S_ISDIR (FileStatus.st_mode)) // It's a folder
/* Scan subtree starting at this this directory recursively */
Brw_ScanDirRemovingOldFiles (Level + 1,PathFileRel,
diff --git a/swad_image.c b/swad_image.c
index a7747480b..563916cf1 100644
--- a/swad_image.c
+++ b/swad_image.c
@@ -65,9 +65,13 @@ extern struct Globals Gbl;
/***************************** Internal prototypes ***************************/
/*****************************************************************************/
-static void Img_ProcessImage (struct Image *Image,
- const char *FileNameImgOriginal,
- const char *FileNameImgProcessed);
+static Img_Action_t Img_GetImageActionFromForm (const char *ParamAction);
+static void Img_GetAndProcessImageFileFromForm (struct Image *Image,
+ const char *ParamFile);
+
+static int Img_ProcessImage (struct Image *Image,
+ const char *FileNameImgOriginal,
+ const char *FileNameImgProcessed);
/*****************************************************************************/
/*************************** Reset image fields ******************************/
@@ -381,7 +385,7 @@ void Img_SetParamNames (struct ParamUploadImg *ParamUploadImg,int NumImgInForm)
/************************* Get image action from form ************************/
/*****************************************************************************/
-Img_Action_t Img_GetImageActionFromForm (const char *ParamAction)
+static Img_Action_t Img_GetImageActionFromForm (const char *ParamAction)
{
/***** Get parameter with the action to perform on image *****/
return (Img_Action_t)
@@ -395,8 +399,10 @@ Img_Action_t Img_GetImageActionFromForm (const char *ParamAction)
/**************************** Get image from form ****************************/
/*****************************************************************************/
-void Img_GetAndProcessImageFileFromForm (struct Image *Image,const char *ParamFile)
+static void Img_GetAndProcessImageFileFromForm (struct Image *Image,
+ const char *ParamFile)
{
+ extern const char *Txt_The_image_could_not_be_processed_successfully;
struct Param *Param;
char FileNameImgSrc[PATH_MAX + 1];
char *PtrExtension;
@@ -407,7 +413,7 @@ void Img_GetAndProcessImageFileFromForm (struct Image *Image,const char *ParamFi
char FileNameImgTmp[PATH_MAX + 1]; // Full name of temporary processed file
bool WrongType = false;
- /***** Rest image file status *****/
+ /***** Set image file status *****/
Image->Status = Img_FILE_NONE;
/***** Get filename and MIME type *****/
@@ -418,6 +424,10 @@ void Img_GetAndProcessImageFileFromForm (struct Image *Image,const char *ParamFi
/* Get filename extension */
if ((PtrExtension = strrchr (FileNameImgSrc,(int) '.')) == NULL)
return;
+ // PtrExtension now points to last '.' in file
+
+ PtrExtension++;
+ // PtrExtension now points to first char in extension
LengthExtension = strlen (PtrExtension);
if (LengthExtension < Fil_MIN_BYTES_FILE_EXTENSION ||
@@ -453,7 +463,7 @@ void Img_GetAndProcessImageFileFromForm (struct Image *Image,const char *ParamFi
Fil_RemoveOldTmpFiles (PathImgPriv,Cfg_TIME_TO_DELETE_IMAGES_TMP_FILES,false);
/***** End the reception of original not processed image
- (it can be very big) into a temporary file *****/
+ (it may be very big) into a temporary file *****/
Image->Status = Img_FILE_NONE;
snprintf (FileNameImgOrig,sizeof (FileNameImgOrig),
"%s/%s/%s/%s_original.%s",
@@ -469,8 +479,18 @@ void Img_GetAndProcessImageFileFromForm (struct Image *Image,const char *ParamFi
"%s/%s/%s/%s.jpg",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG,Cfg_FOLDER_IMG_TMP,
Image->Name);
- Img_ProcessImage (Image,FileNameImgOrig,FileNameImgTmp);
- Image->Status = Img_FILE_PROCESSED;
+ if (Img_ProcessImage (Image,FileNameImgOrig,FileNameImgTmp) == 0) // Return 0 on success
+ /* Success */
+ Image->Status = Img_FILE_PROCESSED;
+ else // Error processing image
+ {
+ /* Error ==> remove temporary destination image file */
+ if (Fil_CheckIfPathExists (FileNameImgTmp))
+ unlink (FileNameImgTmp);
+
+ /* Show error alert */
+ Ale_ShowAlert (Ale_ERROR,Txt_The_image_could_not_be_processed_successfully);
+ }
/***** Remove temporary original file *****/
unlink (FileNameImgOrig);
@@ -480,14 +500,16 @@ void Img_GetAndProcessImageFileFromForm (struct Image *Image,const char *ParamFi
/*****************************************************************************/
/************ Process original image generating processed image **************/
/*****************************************************************************/
+// Return 0 on success
+// Return != 0 on error
-static void Img_ProcessImage (struct Image *Image,
- const char *FileNameImgOriginal,
- const char *FileNameImgProcessed)
+static int Img_ProcessImage (struct Image *Image,
+ const char *FileNameImgOriginal,
+ const char *FileNameImgProcessed)
{
char Command[1024 + PATH_MAX * 2];
int ReturnCode;
- char ErrorMsg[256];
+ // char ErrorMsg[256];
snprintf (Command,sizeof (Command),
"convert %s -resize '%ux%u>' -quality %u %s",
@@ -500,16 +522,9 @@ static void Img_ProcessImage (struct Image *Image,
if (ReturnCode == -1)
Lay_ShowErrorAndExit ("Error when running command to process image.");
- /***** Write message depending on return code *****/
ReturnCode = WEXITSTATUS(ReturnCode);
- if (ReturnCode != 0)
- {
- snprintf (ErrorMsg,sizeof (ErrorMsg),
- "Image could not be processed successfully.
"
- "Error code returned by the program of processing: %d",
- ReturnCode);
- Lay_ShowErrorAndExit (ErrorMsg);
- }
+
+ return ReturnCode;
}
/*****************************************************************************/
diff --git a/swad_image.h b/swad_image.h
index 41e0b0c2f..1e57e40c6 100644
--- a/swad_image.h
+++ b/swad_image.h
@@ -133,8 +133,6 @@ void Img_PutImageUploader (int NumImgInForm,const char *ClassImgTitURL);
void Img_GetImageFromForm (int NumImgInForm,struct Image *Image,
void (*GetImageFromDB) (int NumImgInForm,struct Image *Image));
void Img_SetParamNames (struct ParamUploadImg *ParamUploadImg,int NumImgInForm);
-Img_Action_t Img_GetImageActionFromForm (const char *ParamAction);
-void Img_GetAndProcessImageFileFromForm (struct Image *Image,const char *ParamFile);
void Img_MoveImageToDefinitiveDirectory (struct Image *Image);
void Img_ShowImage (struct Image *Image,
diff --git a/swad_text.c b/swad_text.c
index 248f71113..c87167586 100644
--- a/swad_text.c
+++ b/swad_text.c
@@ -44888,6 +44888,27 @@ const char *Txt_The_ID_X_matches_one_of_the_existing = // Warning: it is very im
" corresponde a um dos existentes.";
#endif
+const char *Txt_The_image_could_not_be_processed_successfully =
+#if L==1 // ca
+ "La imatge no s'ha pogut processar correctament.";
+#elif L==2 // de
+ "Das Bild konnte nicht erfolgreich verarbeitet werden.";
+#elif L==3 // en
+ "The image could not be processed successfully.";
+#elif L==4 // es
+ "La imagen no ha podido procesarse correctamente.";
+#elif L==5 // fr
+ "L'image n'a pas pu être traitée avec succès.";
+#elif L==6 // gn
+ "La imagen no ha podido procesarse correctamente."; // Okoteve traducción
+#elif L==7 // it
+ "L'immagine non può essere elaborata con successo.";
+#elif L==8 // pl
+ "Obraz nie mógł zostać pomyślnie przetworzony.";
+#elif L==9 // pt
+ "A imagem não pôde ser processada com sucesso.";
+#endif
+
const char *Txt_The_institution_X_already_exists = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"La institución %s ya existe."; // Necessita traduccio
diff --git a/swad_zip.c b/swad_zip.c
index 31cb01af1..c6915859c 100644
--- a/swad_zip.c
+++ b/swad_zip.c
@@ -236,7 +236,7 @@ void ZIP_CreateZIPAsgWrk (void)
{
/***** Get file size *****/
if (lstat (PathFileZIP,&FileStatus)) // On success ==> 0 is returned
- Lay_ShowErrorAndExit ("Can not get information about a file or folder.");
+ Lay_ShowErrorAndExit ("Can not get information about a file or folder in ZIP_CreateZIPAsgWrk.");
else
{
/***** Create URL pointing to ZIP file *****/
@@ -489,7 +489,7 @@ static void ZIP_CompressFolderIntoZIP (void)
{
/***** Get file size *****/
if (lstat (PathFileZIP,&FileStatus)) // On success ==> 0 is returned
- Lay_ShowErrorAndExit ("Can not get information about a file or folder.");
+ Lay_ShowErrorAndExit ("Can not get information about a file or folder in ZIP_CompressFolderIntoZIP.");
else
{
/***** Create URL pointing to ZIP file *****/
@@ -574,7 +574,7 @@ static unsigned long long ZIP_CloneDir (const char *Path,const char *PathClone,c
FileType = Brw_IS_UNKNOWN;
if (lstat (PathFile,&FileStatus)) // On success ==> 0 is returned
- Lay_ShowErrorAndExit ("Can not get information about a file or folder.");
+ Lay_ShowErrorAndExit ("Can not get information about a file or folder in ZIP_CloneDir.");
else 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