diff --git a/swad_centre.c b/swad_centre.c index 9124d1650..5b419248f 100644 --- a/swad_centre.c +++ b/swad_centre.c @@ -2067,7 +2067,8 @@ void Ctr_ReceivePhoto (void) int ReturnCode; /***** Copy in disk the file received *****/ - Param = Fil_StartReceptionOfFile (FileNameImgSrc,MIMEType); + Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG, + FileNameImgSrc,MIMEType); /* Check if the file type is image/ or application/octet-stream */ if (strncmp (MIMEType,"image/",strlen ("image/"))) diff --git a/swad_changelog.h b/swad_changelog.h index 23723fe9b..64cd45efe 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -139,13 +139,14 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 15.175.11 (2016-04-04)" +#define Log_PLATFORM_VERSION "SWAD 15.176 (2016-04-04)" #define CSS_FILE "swad15.175.10.css" #define JS_FILE "swad15.131.3.js" // Number of lines (includes comments but not blank lines) has been got with the following command: // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1 /* + Version 15.176: Apr 04, 2016 Code refactoring related to images. (198019 lines) Version 15.175.11:Apr 04, 2016 Code refactoring related to image associated to a test question. Forms to edit image in every unique/multiple answer. (197968 lines) Version 15.175.10:Apr 04, 2016 Changes in CSS. (197955 lines) diff --git a/swad_file.c b/swad_file.c index 9ac5d2524..3d6b88009 100644 --- a/swad_file.c +++ b/swad_file.c @@ -220,7 +220,8 @@ Content-Type: image/pjpeg 000020 03030304 03030405 08050504 04050A07 ················ etc, etc. */ -struct Param *Fil_StartReceptionOfFile (char *FileName,char *MIMEType) +struct Param *Fil_StartReceptionOfFile (const char *ParamFile, + char *FileName,char *MIMEType) { struct Param *Param; @@ -228,8 +229,7 @@ struct Param *Fil_StartReceptionOfFile (char *FileName,char *MIMEType) FileName[0] = 0; /***** Get parameter *****/ - Par_GetParameter (Par_PARAM_SINGLE,Fil_NAME_OF_PARAM_FILENAME_ORG,NULL, - Fil_MAX_FILE_SIZE,&Param); + Par_GetParameter (Par_PARAM_SINGLE,ParamFile,NULL,Fil_MAX_FILE_SIZE,&Param); /***** Get filename *****/ /* Check if filename exists */ diff --git a/swad_file.h b/swad_file.h index 25063471a..5e4d30da2 100644 --- a/swad_file.h +++ b/swad_file.h @@ -60,7 +60,8 @@ void Fil_CreateFileForHTMLOutput (void); void Fil_CloseAndRemoveFileForHTMLOutput (void); bool Fil_ReadStdinIntoTmpFile (void); void Fil_EndOfReadingStdin (void); -struct Param *Fil_StartReceptionOfFile (char *FileName,char *MIMEType); +struct Param *Fil_StartReceptionOfFile (const char *ParamFile, + char *FileName,char *MIMEType); bool Fil_EndReceptionOfFile (char *FileNameDataTmp,struct Param *Param); void Fil_CreateUpdateFile (const char *CurrentName,const char *ExtensionOldName,char *OldName,char *NewName,FILE **NewFile); void Fil_CloseUpdateFile (const char *CurrentName,const char *OldName,const char *NewName,FILE *NewFile); diff --git a/swad_file_browser.c b/swad_file_browser.c index 2ba9535a1..c7aa2ebb4 100644 --- a/swad_file_browser.c +++ b/swad_file_browser.c @@ -8406,7 +8406,8 @@ static bool Brw_RcvFileInFileBrw (Brw_UploadType_t UploadType) if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level)) { /***** First, we save in disk the file from stdin (really from Gbl.F.Tmp) *****/ - Param = Fil_StartReceptionOfFile (SrcFileName,MIMEType); + Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG, + SrcFileName,MIMEType); /***** Get filename from path *****/ // Spaces at start or end are allowed diff --git a/swad_image.c b/swad_image.c index 41fa4fb66..30e06bb3c 100644 --- a/swad_image.c +++ b/swad_image.c @@ -67,6 +67,52 @@ static void Img_ProcessImage (const char *FileNameImgOriginal, const char *FileNameImgProcessed, unsigned Width,unsigned Height,unsigned Quality); +/*****************************************************************************/ +/***************************** Get image from form ***************************/ +/*****************************************************************************/ + +void Img_GetImageFromForm (char *ImageName,void (*GetImageName) (void), + const char *ParamFile, + unsigned Width,unsigned Height,unsigned Quality) + { + Gbl.Image.Action = Img_GetImageActionFromForm ("ImgAct"); + switch (Gbl.Image.Action) + { + case Img_ACTION_NO_IMAGE: // Do not use image (remove current image if exists) + /***** Reset image name *****/ + ImageName[0] = '\0'; + Gbl.Image.Status = Img_FILE_NONE; + break; + case Img_ACTION_KEEP_IMAGE: // Keep current image unchanged + /***** Get image name *****/ + GetImageName (); + Gbl.Image.Status = (ImageName[0] ? Img_NAME_STORED_IN_DB : + Img_FILE_NONE); + break; + case Img_ACTION_NEW_IMAGE: // Upload new image + /***** Get new image (if present ==> process and create temporary file) *****/ + Img_GetAndProcessImageFileFromForm (ParamFile,Width,Height,Quality); + if (Gbl.Image.Status != Img_FILE_PROCESSED) // No new image received-processed successfully + { + /* Reset image name */ + ImageName[0] = '\0'; + Gbl.Image.Status = Img_FILE_NONE; + } + break; + case Img_ACTION_CHANGE_IMAGE: // Replace old image by new image + /***** Get new image (if present ==> process and create temporary file) *****/ + Img_GetAndProcessImageFileFromForm (ParamFile,Width,Height,Quality); + if (Gbl.Image.Status != Img_FILE_PROCESSED) // No new image received-processed successfully + { + /* Get image name */ + GetImageName (); + Gbl.Image.Status = (ImageName[0] ? Img_NAME_STORED_IN_DB : + Img_FILE_NONE); + } + break; + } + } + /*****************************************************************************/ /************************* Get image action from form ************************/ /*****************************************************************************/ @@ -89,7 +135,9 @@ Img_Action_t Img_GetImageActionFromForm (const char *ParamRadio) /*****************************************************************************/ // Return true if image is created -void Img_GetAndProcessImageFromForm (unsigned Width,unsigned Height,unsigned Quality) +void Img_GetAndProcessImageFileFromForm (const char *ParamFile, + unsigned Width,unsigned Height, + unsigned Quality) { struct Param *Param; char FileNameImgSrc[PATH_MAX+1]; @@ -105,7 +153,7 @@ void Img_GetAndProcessImageFromForm (unsigned Width,unsigned Height,unsigned Qua Gbl.Image.Status = Img_FILE_NONE; /***** Get filename and MIME type *****/ - Param = Fil_StartReceptionOfFile (FileNameImgSrc,MIMEType); + Param = Fil_StartReceptionOfFile (ParamFile,FileNameImgSrc,MIMEType); if (!FileNameImgSrc[0]) // No file present return; @@ -234,16 +282,16 @@ void Img_MoveImageToDefinitiveDirectory (void) /******************** Write the image of a test question *********************/ /*****************************************************************************/ -void Img_ShowImage (const char *Image,const char *ClassImg) +void Img_ShowImage (const char *ImageName,const char *ClassImg) { char FileNameImgPriv[PATH_MAX+1]; char FullPathImgPriv[PATH_MAX+1]; char URL[PATH_MAX+1]; /***** If no image to show ==> nothing to do *****/ - if (!Image) + if (!ImageName) return; - if (!Image[0]) + if (!ImageName[0]) return; if (Gbl.Image.Status != Img_NAME_STORED_IN_DB) return; @@ -253,11 +301,11 @@ void Img_ShowImage (const char *Image,const char *ClassImg) Brw_CreateDirDownloadTmp (); /***** Build private path to image *****/ - sprintf (FileNameImgPriv,"%s.jpg",Image); + sprintf (FileNameImgPriv,"%s.jpg",ImageName); sprintf (FullPathImgPriv,"%s/%s/%c%c/%s", Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG, - Image[0], - Image[1], + ImageName[0], + ImageName[1], FileNameImgPriv); /***** Create symbolic link from temporary public directory to private file diff --git a/swad_image.h b/swad_image.h index 1070bdadc..4a91bb4e0 100644 --- a/swad_image.h +++ b/swad_image.h @@ -68,23 +68,29 @@ typedef enum } Img_FileStatus_t; /***** Action to perform when editing a form with an image *****/ -#define Img_NUM_ACTIONS 3 +#define Img_NUM_ACTIONS 4 typedef enum { Img_ACTION_NO_IMAGE, // Do not use image (remove current image if exists) Img_ACTION_KEEP_IMAGE, // Keep current image unchanged - Img_ACTION_CHANGE_IMAGE, // Upload new image (remove current image if exists) + Img_ACTION_NEW_IMAGE, // Upload new image + Img_ACTION_CHANGE_IMAGE, // Change existing image by a new image } Img_Action_t; /*****************************************************************************/ /***************************** Public prototypes *****************************/ /*****************************************************************************/ +void Img_GetImageFromForm (char *ImageName,void (*GetImageName) (void), + const char *ParamFile, + unsigned Width,unsigned Height,unsigned Quality); Img_Action_t Img_GetImageActionFromForm (const char *ParamRadio); -void Img_GetAndProcessImageFromForm (unsigned Width,unsigned Height,unsigned Quality); +void Img_GetAndProcessImageFileFromForm (const char *ParamFile, + unsigned Width,unsigned Height, + unsigned Quality); void Img_MoveImageToDefinitiveDirectory (void); -void Img_ShowImage (const char *Image,const char *ClassImg); +void Img_ShowImage (const char *ImageName,const char *ClassImg); void Img_RemoveImageFile (const char *ImageName); #endif diff --git a/swad_info.c b/swad_info.c index e61514d72..dd95eaa0f 100644 --- a/swad_info.c +++ b/swad_info.c @@ -2021,7 +2021,8 @@ void Inf_ReceivePagInfo (void) Gbl.CurrentCrs.Info.Type = Inf_AsignInfoType (); /***** First of all, store in disk the file from stdin (really from Gbl.F.Tmp) *****/ - Param = Fil_StartReceptionOfFile (SourceFileName,MIMEType); + Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG, + SourceFileName,MIMEType); /***** Check that MIME type is HTML or ZIP *****/ if (strcmp (MIMEType,"text/html")) diff --git a/swad_logo.c b/swad_logo.c index f29e6ae61..aaccb13b4 100644 --- a/swad_logo.c +++ b/swad_logo.c @@ -366,7 +366,8 @@ void Log_ReceiveLogo (Sco_Scope_t Scope) Fil_CreateDirIfNotExists (Path); /***** Copy in disk the file received from stdin (really from Gbl.F.Tmp) *****/ - Param = Fil_StartReceptionOfFile (FileNameLogoSrc,MIMEType); + Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG, + FileNameLogoSrc,MIMEType); /* Check if the file type is image/jpeg or image/pjpeg or application/octet-stream */ if (strcmp (MIMEType,"image/png")) diff --git a/swad_photo.c b/swad_photo.c index c85789593..18a35b619 100644 --- a/swad_photo.c +++ b/swad_photo.c @@ -498,7 +498,8 @@ void Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct UsrData *UsrDat) Fil_RemoveOldTmpFiles (PathPhotosPubl,Cfg_TIME_TO_DELETE_PHOTOS_TMP_FILES,false); /***** First of all, copy in disk the file received from stdin (really from Gbl.F.Tmp) *****/ - Param = Fil_StartReceptionOfFile (FileNamePhotoSrc,MIMEType); + Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG, + FileNamePhotoSrc,MIMEType); /* Check if the file type is image/jpeg or image/pjpeg or application/octet-stream */ if (strcmp (MIMEType,"image/jpeg")) diff --git a/swad_test.c b/swad_test.c index 0f8aa9c1e..af96603f8 100644 --- a/swad_test.c +++ b/swad_test.c @@ -1065,22 +1065,36 @@ static void Tst_PutFormToEditQstImage (const char *ImageName, Img_ShowImage (ImageName,"TEST_IMG_EDIT_ONE"); } - /***** New image *****/ + /***** Change/new image *****/ UniqueId++; - fprintf (Gbl.F.Out,"", - UniqueId,ParamRadio,Img_ACTION_CHANGE_IMAGE); - fprintf (Gbl.F.Out,"", - The_ClassForm[Gbl.Prefs.Theme], - ImageName[0] ? Txt_Change_image : - Txt_New_image); + if (ImageName[0]) // Image exists + { + /***** Change image *****/ + fprintf (Gbl.F.Out,"", + UniqueId,ParamRadio,Img_ACTION_CHANGE_IMAGE); // Replace existing image by new image + fprintf (Gbl.F.Out,"", + The_ClassForm[Gbl.Prefs.Theme],Txt_Change_image); + + } + else // Image does not exist + { + /***** New image *****/ + fprintf (Gbl.F.Out,"", + UniqueId,ParamRadio,Img_ACTION_NEW_IMAGE); // Upload new image + fprintf (Gbl.F.Out,"", + The_ClassForm[Gbl.Prefs.Theme],Txt_New_image); + } fprintf (Gbl.F.Out,"", - ParamFile, - UniqueId); + " size=\"40\" maxlength=\"100\" value=\"\"" + " onchange=\"document.getElementById('chg_img_%u').checked = true;\" />", + ParamFile, + UniqueId); } /*****************************************************************************/ @@ -4820,7 +4834,8 @@ void Tst_ReceiveQst (void) and moved to the definitive directory) */ Tst_RemoveImageFilesFromQstsInCrs (Gbl.CurrentCrs.Crs.CrsCod,Gbl.Test.QstCod); - if (Gbl.Image.Action == Img_ACTION_CHANGE_IMAGE && // Upload new image (remove current image if exists) + if ((Gbl.Image.Action == Img_ACTION_NEW_IMAGE || // Upload new image + Gbl.Image.Action == Img_ACTION_CHANGE_IMAGE) && // Replace existing image by new image Gbl.Image.Status == Img_FILE_PROCESSED) // The new image received has been processed /* Move processed image to definitive directory */ Img_MoveImageToDefinitiveDirectory (); @@ -4899,40 +4914,16 @@ static void Tst_GetQstFromForm (char *Stem,char *Feedback) /***** Get question stem *****/ Par_GetParToHTML ("Stem",Stem,Cns_MAX_BYTES_TEXT); + /***** Get image associated to stem *****/ + Img_GetImageFromForm (Gbl.Test.Image,Tst_GetImageNameFromDB, + Fil_NAME_OF_PARAM_FILENAME_ORG, + Tst_PHOTO_SAVED_MAX_WIDTH, + Tst_PHOTO_SAVED_MAX_HEIGHT, + Tst_PHOTO_SAVED_QUALITY); + /***** Get question feedback *****/ Par_GetParToHTML ("Feedback",Feedback,Cns_MAX_BYTES_TEXT); - /***** Get type of image *****/ - Gbl.Image.Action = Img_GetImageActionFromForm ("ImgAct"); - switch (Gbl.Image.Action) - { - case Img_ACTION_NO_IMAGE: // Do not use image (remove current image if exists) - /***** Reset image name *****/ - Gbl.Test.Image[0] = '\0'; - Gbl.Image.Status = Img_FILE_NONE; - break; - case Img_ACTION_KEEP_IMAGE: // Keep current image unchanged - /***** Get image from database *****/ - Tst_GetImageNameFromDB (); - Gbl.Image.Status = (Gbl.Test.Image[0] ? Img_NAME_STORED_IN_DB : - Img_FILE_NONE); - break; - case Img_ACTION_CHANGE_IMAGE: // Upload new image (remove current image if exists) - /***** Get new image (if present ==> process and create temporary file) *****/ - Img_GetAndProcessImageFromForm (Tst_PHOTO_SAVED_MAX_WIDTH, - Tst_PHOTO_SAVED_MAX_HEIGHT, - Tst_PHOTO_SAVED_QUALITY); - if (Gbl.Image.Status != Img_FILE_PROCESSED && // No new image received-processed successfully - Gbl.Test.QstCod > 0) // Question exists - { - /* Get possible image from database */ - Tst_GetImageNameFromDB (); - Gbl.Image.Status = (Gbl.Test.Image[0] ? Img_NAME_STORED_IN_DB : - Img_FILE_NONE); - } - break; - } - /***** Get answers *****/ Gbl.Test.Shuffle = false; switch (Gbl.Test.AnswerType) @@ -5056,7 +5047,8 @@ bool Tst_CheckIfQstFormatIsCorrectAndCountNumOptions (void) bool ThereIsEndOfAnswers; unsigned i; - if (Gbl.Image.Action == Img_ACTION_CHANGE_IMAGE && + if ((Gbl.Image.Action == Img_ACTION_NEW_IMAGE || // Upload new image + Gbl.Image.Action == Img_ACTION_CHANGE_IMAGE) && // Replace existing image by new image Gbl.Image.Status != Img_FILE_PROCESSED) { Lay_ShowAlert (Lay_WARNING,Txt_Error_receiving_or_processing_image); diff --git a/swad_test_import.c b/swad_test_import.c index 09e106598..6f1938781 100644 --- a/swad_test_import.c +++ b/swad_test_import.c @@ -399,7 +399,8 @@ void TsI_ImportQstsFromXML (void) Fil_RemoveOldTmpFiles (PathTestPriv,Cfg_TIME_TO_DELETE_TEST_TMP_FILES,false); /***** First of all, copy in disk the file received from stdin (really from Gbl.F.Tmp) *****/ - Param = Fil_StartReceptionOfFile (FileNameXMLSrc,MIMEType); + Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG, + FileNameXMLSrc,MIMEType); /* Check if the file type is image/jpeg or image/pjpeg or application/octet-stream */ if (strcmp (MIMEType,"text/xml"))