Version 15.176

This commit is contained in:
Antonio Cañas Vargas 2016-04-04 12:13:37 +02:00
parent 4354030acb
commit 4c2189921f
12 changed files with 124 additions and 70 deletions

View File

@ -2067,7 +2067,8 @@ void Ctr_ReceivePhoto (void)
int ReturnCode; int ReturnCode;
/***** Copy in disk the file received *****/ /***** 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 */ /* Check if the file type is image/ or application/octet-stream */
if (strncmp (MIMEType,"image/",strlen ("image/"))) if (strncmp (MIMEType,"image/",strlen ("image/")))

View File

@ -139,13 +139,14 @@
/****************************** Public constants *****************************/ /****************************** 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 CSS_FILE "swad15.175.10.css"
#define JS_FILE "swad15.131.3.js" #define JS_FILE "swad15.131.3.js"
// Number of lines (includes comments but not blank lines) has been got with the following command: // 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 // 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. 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) Forms to edit image in every unique/multiple answer. (197968 lines)
Version 15.175.10:Apr 04, 2016 Changes in CSS. (197955 lines) Version 15.175.10:Apr 04, 2016 Changes in CSS. (197955 lines)

View File

@ -220,7 +220,8 @@ Content-Type: image/pjpeg
000020 03030304 03030405 08050504 04050A07 ················ 000020 03030304 03030405 08050504 04050A07 ················
etc, etc. etc, etc.
*/ */
struct Param *Fil_StartReceptionOfFile (char *FileName,char *MIMEType) struct Param *Fil_StartReceptionOfFile (const char *ParamFile,
char *FileName,char *MIMEType)
{ {
struct Param *Param; struct Param *Param;
@ -228,8 +229,7 @@ struct Param *Fil_StartReceptionOfFile (char *FileName,char *MIMEType)
FileName[0] = 0; FileName[0] = 0;
/***** Get parameter *****/ /***** Get parameter *****/
Par_GetParameter (Par_PARAM_SINGLE,Fil_NAME_OF_PARAM_FILENAME_ORG,NULL, Par_GetParameter (Par_PARAM_SINGLE,ParamFile,NULL,Fil_MAX_FILE_SIZE,&Param);
Fil_MAX_FILE_SIZE,&Param);
/***** Get filename *****/ /***** Get filename *****/
/* Check if filename exists */ /* Check if filename exists */

View File

@ -60,7 +60,8 @@ void Fil_CreateFileForHTMLOutput (void);
void Fil_CloseAndRemoveFileForHTMLOutput (void); void Fil_CloseAndRemoveFileForHTMLOutput (void);
bool Fil_ReadStdinIntoTmpFile (void); bool Fil_ReadStdinIntoTmpFile (void);
void Fil_EndOfReadingStdin (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); 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_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); void Fil_CloseUpdateFile (const char *CurrentName,const char *OldName,const char *NewName,FILE *NewFile);

View File

@ -8406,7 +8406,8 @@ static bool Brw_RcvFileInFileBrw (Brw_UploadType_t UploadType)
if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level)) if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level))
{ {
/***** First, we save in disk the file from stdin (really from Gbl.F.Tmp) *****/ /***** 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 *****/ /***** Get filename from path *****/
// Spaces at start or end are allowed // Spaces at start or end are allowed

View File

@ -67,6 +67,52 @@ static void Img_ProcessImage (const char *FileNameImgOriginal,
const char *FileNameImgProcessed, const char *FileNameImgProcessed,
unsigned Width,unsigned Height,unsigned Quality); 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 ************************/ /************************* Get image action from form ************************/
/*****************************************************************************/ /*****************************************************************************/
@ -89,7 +135,9 @@ Img_Action_t Img_GetImageActionFromForm (const char *ParamRadio)
/*****************************************************************************/ /*****************************************************************************/
// Return true if image is created // 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; struct Param *Param;
char FileNameImgSrc[PATH_MAX+1]; char FileNameImgSrc[PATH_MAX+1];
@ -105,7 +153,7 @@ void Img_GetAndProcessImageFromForm (unsigned Width,unsigned Height,unsigned Qua
Gbl.Image.Status = Img_FILE_NONE; Gbl.Image.Status = Img_FILE_NONE;
/***** Get filename and MIME type *****/ /***** Get filename and MIME type *****/
Param = Fil_StartReceptionOfFile (FileNameImgSrc,MIMEType); Param = Fil_StartReceptionOfFile (ParamFile,FileNameImgSrc,MIMEType);
if (!FileNameImgSrc[0]) // No file present if (!FileNameImgSrc[0]) // No file present
return; return;
@ -234,16 +282,16 @@ void Img_MoveImageToDefinitiveDirectory (void)
/******************** Write the image of a test question *********************/ /******************** 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 FileNameImgPriv[PATH_MAX+1];
char FullPathImgPriv[PATH_MAX+1]; char FullPathImgPriv[PATH_MAX+1];
char URL[PATH_MAX+1]; char URL[PATH_MAX+1];
/***** If no image to show ==> nothing to do *****/ /***** If no image to show ==> nothing to do *****/
if (!Image) if (!ImageName)
return; return;
if (!Image[0]) if (!ImageName[0])
return; return;
if (Gbl.Image.Status != Img_NAME_STORED_IN_DB) if (Gbl.Image.Status != Img_NAME_STORED_IN_DB)
return; return;
@ -253,11 +301,11 @@ void Img_ShowImage (const char *Image,const char *ClassImg)
Brw_CreateDirDownloadTmp (); Brw_CreateDirDownloadTmp ();
/***** Build private path to image *****/ /***** Build private path to image *****/
sprintf (FileNameImgPriv,"%s.jpg",Image); sprintf (FileNameImgPriv,"%s.jpg",ImageName);
sprintf (FullPathImgPriv,"%s/%s/%c%c/%s", sprintf (FullPathImgPriv,"%s/%s/%c%c/%s",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG, Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG,
Image[0], ImageName[0],
Image[1], ImageName[1],
FileNameImgPriv); FileNameImgPriv);
/***** Create symbolic link from temporary public directory to private file /***** Create symbolic link from temporary public directory to private file

View File

@ -68,23 +68,29 @@ typedef enum
} Img_FileStatus_t; } Img_FileStatus_t;
/***** Action to perform when editing a form with an image *****/ /***** Action to perform when editing a form with an image *****/
#define Img_NUM_ACTIONS 3 #define Img_NUM_ACTIONS 4
typedef enum typedef enum
{ {
Img_ACTION_NO_IMAGE, // Do not use image (remove current image if exists) Img_ACTION_NO_IMAGE, // Do not use image (remove current image if exists)
Img_ACTION_KEEP_IMAGE, // Keep current image unchanged 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; } Img_Action_t;
/*****************************************************************************/ /*****************************************************************************/
/***************************** Public prototypes *****************************/ /***************************** 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); 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_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); void Img_RemoveImageFile (const char *ImageName);
#endif #endif

View File

@ -2021,7 +2021,8 @@ void Inf_ReceivePagInfo (void)
Gbl.CurrentCrs.Info.Type = Inf_AsignInfoType (); Gbl.CurrentCrs.Info.Type = Inf_AsignInfoType ();
/***** First of all, store in disk the file from stdin (really from Gbl.F.Tmp) *****/ /***** 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 *****/ /***** Check that MIME type is HTML or ZIP *****/
if (strcmp (MIMEType,"text/html")) if (strcmp (MIMEType,"text/html"))

View File

@ -366,7 +366,8 @@ void Log_ReceiveLogo (Sco_Scope_t Scope)
Fil_CreateDirIfNotExists (Path); Fil_CreateDirIfNotExists (Path);
/***** Copy in disk the file received from stdin (really from Gbl.F.Tmp) *****/ /***** 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 */ /* Check if the file type is image/jpeg or image/pjpeg or application/octet-stream */
if (strcmp (MIMEType,"image/png")) if (strcmp (MIMEType,"image/png"))

View File

@ -498,7 +498,8 @@ void Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct UsrData *UsrDat)
Fil_RemoveOldTmpFiles (PathPhotosPubl,Cfg_TIME_TO_DELETE_PHOTOS_TMP_FILES,false); 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) *****/ /***** 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 */ /* Check if the file type is image/jpeg or image/pjpeg or application/octet-stream */
if (strcmp (MIMEType,"image/jpeg")) if (strcmp (MIMEType,"image/jpeg"))

View File

@ -1065,22 +1065,36 @@ static void Tst_PutFormToEditQstImage (const char *ImageName,
Img_ShowImage (ImageName,"TEST_IMG_EDIT_ONE"); Img_ShowImage (ImageName,"TEST_IMG_EDIT_ONE");
} }
/***** New image *****/ /***** Change/new image *****/
UniqueId++; UniqueId++;
fprintf (Gbl.F.Out,"<input type=\"radio\" id=\"chg_img_%u\" name=\"%s\"" if (ImageName[0]) // Image exists
" value=\"%u\">", {
UniqueId,ParamRadio,Img_ACTION_CHANGE_IMAGE); /***** Change image *****/
fprintf (Gbl.F.Out,"<label class=\"%s\">" fprintf (Gbl.F.Out,"<input type=\"radio\" id=\"chg_img_%u\" name=\"%s\""
"%s: " " value=\"%u\">",
"</label>", UniqueId,ParamRadio,Img_ACTION_CHANGE_IMAGE); // Replace existing image by new image
The_ClassForm[Gbl.Prefs.Theme], fprintf (Gbl.F.Out,"<label class=\"%s\">"
ImageName[0] ? Txt_Change_image : "%s: "
Txt_New_image); "</label>",
The_ClassForm[Gbl.Prefs.Theme],Txt_Change_image);
}
else // Image does not exist
{
/***** New image *****/
fprintf (Gbl.F.Out,"<input type=\"radio\" id=\"chg_img_%u\" name=\"%s\""
" value=\"%u\">",
UniqueId,ParamRadio,Img_ACTION_NEW_IMAGE); // Upload new image
fprintf (Gbl.F.Out,"<label class=\"%s\">"
"%s: "
"</label>",
The_ClassForm[Gbl.Prefs.Theme],Txt_New_image);
}
fprintf (Gbl.F.Out,"<input type=\"file\" name=\"%s\"" fprintf (Gbl.F.Out,"<input type=\"file\" name=\"%s\""
" size=\"40\" maxlength=\"100\" value=\"\"" " size=\"40\" maxlength=\"100\" value=\"\""
" onchange=\"document.getElementById('chg_img_%u').checked = true;\" />", " onchange=\"document.getElementById('chg_img_%u').checked = true;\" />",
ParamFile, ParamFile,
UniqueId); UniqueId);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -4820,7 +4834,8 @@ void Tst_ReceiveQst (void)
and moved to the definitive directory) */ and moved to the definitive directory) */
Tst_RemoveImageFilesFromQstsInCrs (Gbl.CurrentCrs.Crs.CrsCod,Gbl.Test.QstCod); 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 Gbl.Image.Status == Img_FILE_PROCESSED) // The new image received has been processed
/* Move processed image to definitive directory */ /* Move processed image to definitive directory */
Img_MoveImageToDefinitiveDirectory (); Img_MoveImageToDefinitiveDirectory ();
@ -4899,40 +4914,16 @@ static void Tst_GetQstFromForm (char *Stem,char *Feedback)
/***** Get question stem *****/ /***** Get question stem *****/
Par_GetParToHTML ("Stem",Stem,Cns_MAX_BYTES_TEXT); 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 *****/ /***** Get question feedback *****/
Par_GetParToHTML ("Feedback",Feedback,Cns_MAX_BYTES_TEXT); 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 *****/ /***** Get answers *****/
Gbl.Test.Shuffle = false; Gbl.Test.Shuffle = false;
switch (Gbl.Test.AnswerType) switch (Gbl.Test.AnswerType)
@ -5056,7 +5047,8 @@ bool Tst_CheckIfQstFormatIsCorrectAndCountNumOptions (void)
bool ThereIsEndOfAnswers; bool ThereIsEndOfAnswers;
unsigned i; 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) Gbl.Image.Status != Img_FILE_PROCESSED)
{ {
Lay_ShowAlert (Lay_WARNING,Txt_Error_receiving_or_processing_image); Lay_ShowAlert (Lay_WARNING,Txt_Error_receiving_or_processing_image);

View File

@ -399,7 +399,8 @@ void TsI_ImportQstsFromXML (void)
Fil_RemoveOldTmpFiles (PathTestPriv,Cfg_TIME_TO_DELETE_TEST_TMP_FILES,false); 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) *****/ /***** 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 */ /* Check if the file type is image/jpeg or image/pjpeg or application/octet-stream */
if (strcmp (MIMEType,"text/xml")) if (strcmp (MIMEType,"text/xml"))