",ClassContainer);
+ fprintf (Gbl.F.Out,"
Type == Med_YOUTUBE)
+ fprintf (Gbl.F.Out," MED_VIDEO_CONT");
+ fprintf (Gbl.F.Out,"\">");
- /***** Start optional link to external URL *****/
- PutLink = false;
- if (Media->URL)
- if (Media->URL[0])
- PutLink = true;
- if (PutLink)
- fprintf (Gbl.F.Out,"
",Media->URL);
-
- /***** Create a temporary public directory used to show the media *****/
- Brw_CreateDirDownloadTmp ();
-
- /***** Build path to private directory with the media *****/
- snprintf (PathMedPriv,sizeof (PathMedPriv),
- "%s/%s/%c%c",
- Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,
- Media->Name[0],
- Media->Name[1]);
-
- /***** Show media *****/
- switch (Media->Type)
+ if (Media->Type == Med_YOUTUBE)
+ /***** Show media *****/
+ Med_ShowYoutube (Media,ClassMedia);
+ else // Uploaded file
{
- case Med_JPG:
- Med_ShowJPG (Media,PathMedPriv,ClassMedia);
- break;
- case Med_GIF:
- Med_ShowGIF (Media,PathMedPriv,ClassMedia);
- break;
- case Med_MP4:
- case Med_WEBM:
- case Med_OGG:
- Med_ShowVideo (Media,PathMedPriv,ClassMedia);
- break;
- default:
- break;
- }
+ /***** If no media to show ==> nothing to do *****/
+ if (!Media->Name)
+ return;
+ if (!Media->Name[0])
+ return;
- /***** End optional link to external URL *****/
- if (PutLink)
- fprintf (Gbl.F.Out,"");
+ /***** Start optional link to external URL *****/
+ PutLink = false;
+ if (Media->URL)
+ if (Media->URL[0])
+ PutLink = true;
+ if (PutLink)
+ fprintf (Gbl.F.Out,"
",Media->URL);
+
+ /***** Create a temporary public directory used to show the media *****/
+ Brw_CreateDirDownloadTmp ();
+
+ /***** Build path to private directory with the media *****/
+ snprintf (PathMedPriv,sizeof (PathMedPriv),
+ "%s/%s/%c%c",
+ Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,
+ Media->Name[0],
+ Media->Name[1]);
+
+ /***** Show media *****/
+ switch (Media->Type)
+ {
+ case Med_JPG:
+ Med_ShowJPG (Media,PathMedPriv,ClassMedia);
+ break;
+ case Med_GIF:
+ Med_ShowGIF (Media,PathMedPriv,ClassMedia);
+ break;
+ case Med_MP4:
+ case Med_WEBM:
+ case Med_OGG:
+ Med_ShowVideo (Media,PathMedPriv,ClassMedia);
+ break;
+ default:
+ break;
+ }
+
+ /***** End optional link to external URL *****/
+ if (PutLink)
+ fprintf (Gbl.F.Out,"");
+ }
/***** End media container *****/
fprintf (Gbl.F.Out,"
");
@@ -1107,7 +1433,7 @@ static void Med_ShowGIF (struct Media *Media,
}
/*****************************************************************************/
-/************************** Show a user uploaded MP4 *************************/
+/************************ Show a user uploaded video *************************/
/*****************************************************************************/
static void Med_ShowVideo (struct Media *Media,
@@ -1162,6 +1488,39 @@ static void Med_ShowVideo (struct Media *Media,
fprintf (Gbl.F.Out,"%s",Txt_File_not_found);
}
+/*****************************************************************************/
+/*************************** Show an embed media *****************************/
+/*****************************************************************************/
+
+static void Med_ShowYoutube (struct Media *Media,
+ const char *ClassMedia)
+ {
+ /***** Check if embed URL exists *****/
+ if (Media->URL[0]) // Embed URL
+ {
+ /***** Show linked external media *****/
+ // Example of code give by YouTube:
+ //
+ fprintf (Gbl.F.Out,"
");
+ }
+ }
+
/*****************************************************************************/
/*** Remove private files with an image/video, given the image/video name ****/
/*****************************************************************************/
@@ -1193,6 +1552,12 @@ void Med_RemoveMediaFiles (const char *Name,Med_Type_t Type)
char PathMedPriv[PATH_MAX + 1];
char FullPathMediaPriv[PATH_MAX + 1];
+ /***** Trivial cases *****/
+ if (Type == Med_TYPE_NONE)
+ Lay_ShowErrorAndExit ("Wrong media type.");
+ if (Type == Med_YOUTUBE)
+ return;
+
/***** Build path to private directory with the media *****/
snprintf (PathMedPriv,sizeof (PathMedPriv),
"%s/%s/%c%c",
@@ -1236,8 +1601,7 @@ void Med_RemoveMediaFiles (const char *Name,Med_Type_t Type)
unlink (FullPathMediaPriv);
break;
- case Med_NONE:
- Lay_ShowErrorAndExit ("Wrong media type.");
+ default:
break;
}
@@ -1259,7 +1623,7 @@ Med_Type_t Med_GetTypeFromStrInDB (const char *Str)
if (!strcasecmp (Str,Med_StringsTypeDB[Type]))
return Type;
- return Med_NONE;
+ return Med_TYPE_NONE;
}
/*****************************************************************************/
@@ -1317,7 +1681,7 @@ static Med_Type_t Med_GetTypeFromExtAndMIME (const char *Extension,
!strcmp (MIMEType,"application/octet" ))
return Med_OGG;
- return Med_NONE;
+ return Med_TYPE_NONE;
}
/*****************************************************************************/
@@ -1328,7 +1692,7 @@ const char *Med_GetStringTypeForDB (Med_Type_t Type)
{
/***** Check if type is out of valid range *****/
if (Type > (Med_Type_t) (Med_NUM_TYPES - 1))
- return Med_StringsTypeDB[Med_NONE];
+ return Med_StringsTypeDB[Med_TYPE_NONE];
/***** Get string from type *****/
return Med_StringsTypeDB[Type];
diff --git a/swad_media.h b/swad_media.h
index beefb8b8..d59d3b72 100644
--- a/swad_media.h
+++ b/swad_media.h
@@ -47,10 +47,10 @@
#define Med_NUM_ACTIONS 4
typedef enum
{
- Med_ACTION_NEW_MEDIA, // Upload new image/video
- Med_ACTION_KEEP_MEDIA, // Keep current image/video unchanged
- Med_ACTION_CHANGE_MEDIA, // Change existing image/video by a new one
- Med_ACTION_NO_MEDIA, // Do not use image/video (remove current image/video if exists)
+ Med_ACTION_NEW_MEDIA, // Upload new media
+ Med_ACTION_KEEP_MEDIA, // Keep current media unchanged
+ Med_ACTION_CHANGE_MEDIA, // Change existing media by a new one
+ Med_ACTION_NO_MEDIA, // Do not use media (remove current media if exists)
} Med_Action_t;
#define Med_ACTION_DEFAULT Med_ACTION_NO_MEDIA
@@ -81,29 +81,30 @@ xx-unique-name: a unique name encrypted starting by two random chars xx
*/
typedef enum
{
- Med_FILE_NONE,
- Med_FILE_RECEIVED,
- Med_FILE_PROCESSED,
+ Med_STATUS_NONE,
+ Med_RECEIVED,
+ Med_PROCESSED,
Med_FILE_MOVED,
- Med_NAME_STORED_IN_DB,
- } Med_FileStatus_t;
+ Med_STORED_IN_DB,
+ } Med_Status_t;
-#define Med_NUM_TYPES 6
+#define Med_NUM_TYPES 7
typedef enum
{
- Med_NONE,
+ Med_TYPE_NONE,
Med_JPG,
Med_GIF,
Med_MP4,
Med_WEBM,
Med_OGG,
+ Med_YOUTUBE,
} Med_Type_t;
/***** Struct used to get images/videos from forms *****/
struct Media
{
Med_Action_t Action;
- Med_FileStatus_t Status;
+ Med_Status_t Status;
char Name[Med_BYTES_NAME + 1];
Med_Type_t Type;
char *Title; // Title/attribution (it must be initialized to NULL
@@ -120,10 +121,10 @@ struct Media
#define Med_MAX_BYTES_PARAM_UPLOAD_MEDIA (16 - 1)
struct ParamUploadMedia
{
- char Action[Med_MAX_BYTES_PARAM_UPLOAD_MEDIA + 1];
- char File [Med_MAX_BYTES_PARAM_UPLOAD_MEDIA + 1];
- char Title [Med_MAX_BYTES_PARAM_UPLOAD_MEDIA + 1];
- char URL [Med_MAX_BYTES_PARAM_UPLOAD_MEDIA + 1];
+ char Action [Med_MAX_BYTES_PARAM_UPLOAD_MEDIA + 1];
+ char File [Med_MAX_BYTES_PARAM_UPLOAD_MEDIA + 1];
+ char Title [Med_MAX_BYTES_PARAM_UPLOAD_MEDIA + 1];
+ char URL [Med_MAX_BYTES_PARAM_UPLOAD_MEDIA + 1];
};
/*****************************************************************************/
diff --git a/swad_message.c b/swad_message.c
index 3c67eca6..ef511417 100644
--- a/swad_message.c
+++ b/swad_message.c
@@ -1282,7 +1282,7 @@ static long Msg_InsertNewMsg (const char *Subject,const char *Content,
/***** Check if image is received and processed *****/
if (Media->Action == Med_ACTION_NEW_MEDIA && // Upload new image
- Media->Status == Med_FILE_PROCESSED) // The new image received has been processed
+ Media->Status == Med_PROCESSED) // The new image received has been processed
/* Move processed image to definitive directory */
Med_MoveMediaToDefinitiveDir (Media);
diff --git a/swad_string.c b/swad_string.c
index 4f0984d0..fbfc7a4d 100644
--- a/swad_string.c
+++ b/swad_string.c
@@ -67,10 +67,11 @@ static int Str_ReadCharAndSkipCommentsBackward (FILE *FileSrc,Str_SkipHTMLCommen
/***** Conversion to Base64URL *****/
// base64url is described in document http://tools.ietf.org/html/rfc4648.
// It uses '-' and '_' because they are safe for URL/parameters (without enconding) and for filenames.
-const char Str_BIN_TO_BASE64URL[64] =
+const char Str_BIN_TO_BASE64URL[64 + 1] =
{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
- '0','1','2','3','4','5','6','7','8','9','-','_'};
+ '0','1','2','3','4','5','6','7','8','9','-','_',
+ '\0'}; // NULL-terminated string
static const char Str_LF[2] = {10,0};
static const char Str_CR[2] = {13,0};
diff --git a/swad_test.c b/swad_test.c
index 9b533b05..424006f7 100644
--- a/swad_test.c
+++ b/swad_test.c
@@ -6005,7 +6005,7 @@ bool Tst_CheckIfQstFormatIsCorrectAndCountNumOptions (void)
if ((Gbl.Test.Media.Action == Med_ACTION_NEW_MEDIA || // Upload new image
Gbl.Test.Media.Action == Med_ACTION_CHANGE_MEDIA) && // Replace existing image by new image
- Gbl.Test.Media.Status != Med_FILE_PROCESSED)
+ Gbl.Test.Media.Status != Med_PROCESSED)
{
Ale_ShowAlert (Ale_WARNING,Txt_Error_receiving_or_processing_image);
return false;
@@ -6187,7 +6187,7 @@ static void Tst_MoveMediaToDefinitiveDirectories (void)
if ((Gbl.Test.Media.Action == Med_ACTION_NEW_MEDIA || // Upload new image
Gbl.Test.Media.Action == Med_ACTION_CHANGE_MEDIA) && // Replace existing image by new image
- Gbl.Test.Media.Status == Med_FILE_PROCESSED) // The new image received has been processed
+ Gbl.Test.Media.Status == Med_PROCESSED) // The new image received has been processed
/* Move processed image to definitive directory */
Med_MoveMediaToDefinitiveDir (&Gbl.Test.Media);
@@ -6207,7 +6207,7 @@ static void Tst_MoveMediaToDefinitiveDirectories (void)
if ((Gbl.Test.Answer.Options[NumOpt].Media.Action == Med_ACTION_NEW_MEDIA || // Upload new image
Gbl.Test.Answer.Options[NumOpt].Media.Action == Med_ACTION_CHANGE_MEDIA) && // Replace existing image by new image
- Gbl.Test.Answer.Options[NumOpt].Media.Status == Med_FILE_PROCESSED) // The new image received has been processed
+ Gbl.Test.Answer.Options[NumOpt].Media.Status == Med_PROCESSED) // The new image received has been processed
/* Move processed image to definitive directory */
Med_MoveMediaToDefinitiveDir (&Gbl.Test.Answer.Options[NumOpt].Media);
}
@@ -6560,10 +6560,9 @@ static void Tst_InsertOrUpdateQstIntoDB (void)
Gbl.Test.Media.Title ? Gbl.Test.Media.Title : "",
Gbl.Test.Media.URL ? Gbl.Test.Media.URL : "");
- /* Update image status */
- if (Gbl.Test.Media.Name[0] &&
- Gbl.Test.Media.Type != Med_NONE)
- Gbl.Test.Media.Status = Med_NAME_STORED_IN_DB;
+ /* Update media status */
+ if (Gbl.Test.Media.Type != Med_TYPE_NONE)
+ Gbl.Test.Media.Status = Med_STORED_IN_DB;
}
else // It's an existing question
{
@@ -6586,10 +6585,9 @@ static void Tst_InsertOrUpdateQstIntoDB (void)
Gbl.Test.Media.URL ? Gbl.Test.Media.URL : "",
Gbl.Test.QstCod,Gbl.CurrentCrs.Crs.CrsCod);
- /* Update image status */
- if (Gbl.Test.Media.Name[0] &&
- Gbl.Test.Media.Type != Med_NONE)
- Gbl.Test.Media.Status = Med_NAME_STORED_IN_DB;
+ /* Update media status */
+ if (Gbl.Test.Media.Type != Med_TYPE_NONE)
+ Gbl.Test.Media.Status = Med_STORED_IN_DB;
/* Remove answers and tags from this test question */
Tst_RemAnsFromQst ();
@@ -6661,7 +6659,7 @@ static void Tst_InsertAnswersIntoDB (void)
"'','%s','','','Y')",
Gbl.Test.QstCod,
Gbl.Test.Answer.Integer,
- Med_GetStringTypeForDB (Med_NONE));
+ Med_GetStringTypeForDB (Med_TYPE_NONE));
break;
case Tst_ANS_FLOAT:
Str_SetDecimalPointToUS (); // To print the floating point as a dot
@@ -6677,7 +6675,7 @@ static void Tst_InsertAnswersIntoDB (void)
"'','%s','','','Y')",
Gbl.Test.QstCod,i,
Gbl.Test.Answer.FloatingPoint[i],
- Med_GetStringTypeForDB (Med_NONE));
+ Med_GetStringTypeForDB (Med_TYPE_NONE));
Str_SetDecimalPointToLocal (); // Return to local system
break;
case Tst_ANS_TRUE_FALSE:
@@ -6690,7 +6688,7 @@ static void Tst_InsertAnswersIntoDB (void)
"'','%s','','','Y')",
Gbl.Test.QstCod,
Gbl.Test.Answer.TF,
- Med_GetStringTypeForDB (Med_NONE));
+ Med_GetStringTypeForDB (Med_TYPE_NONE));
break;
case Tst_ANS_UNIQUE_CHOICE:
case Tst_ANS_MULTIPLE_CHOICE:
@@ -6718,9 +6716,8 @@ static void Tst_InsertAnswersIntoDB (void)
'N');
/* Update image status */
- if (Gbl.Test.Answer.Options[NumOpt].Media.Name[0] &&
- Gbl.Test.Answer.Options[NumOpt].Media.Type != Med_NONE)
- Gbl.Test.Answer.Options[NumOpt].Media.Status = Med_NAME_STORED_IN_DB;
+ if (Gbl.Test.Answer.Options[NumOpt].Media.Type != Med_TYPE_NONE)
+ Gbl.Test.Answer.Options[NumOpt].Media.Status = Med_STORED_IN_DB;
}
break;
default:
diff --git a/swad_text.c b/swad_text.c
index 9935e3d0..f84ce81e 100644
--- a/swad_text.c
+++ b/swad_text.c
@@ -3569,23 +3569,23 @@ const char *Txt_Change_IDs =
const char *Txt_Change_image =
#if L==1 // ca
- "Canviar imatge";
+ "Canviar imatge / vídeo";
#elif L==2 // de
- "Abbild ändern";
+ "Abbild / Video ändern";
#elif L==3 // en
- "Change image";
+ "Change image / video";
#elif L==4 // es
- "Cambiar imagen";
+ "Cambiar imagen / vídeo";
#elif L==5 // fr
- "Changer image";
+ "Changer image / vidéo";
#elif L==6 // gn
- "Moambue ta'ãnga";
+ "Moambue ta'ãnga / video";
#elif L==7 // it
- "Cambiare immagine";
+ "Cambiare immagine / video";
#elif L==8 // pl
- "Zmień obraz";
+ "Zmień obraz / wideo";
#elif L==9 // pt
- "Alterar imagem";
+ "Alterar imagem / vídeo";
#endif
const char *Txt_Change_logo =
@@ -6616,23 +6616,23 @@ const char *Txt_Current_email =
const char *Txt_Current_image =
#if L==1 // ca
- "Imatge actual";
+ "Imatge / vídeo actual";
#elif L==2 // de
- "Aktuelles Abbild";
+ "Aktuelles Abbild / Video";
#elif L==3 // en
- "Current image";
+ "Current image / video";
#elif L==4 // es
- "Imagen actual";
+ "Imagen / vídeo actual";
#elif L==5 // fr
- "Image actuelle";
+ "Image / vidéo actuelle";
#elif L==6 // gn
- "Imagen actual"; // Okoteve traducción
+ "Imagen / vídeo actual"; // Okoteve traducción
#elif L==7 // it
- "Immagine corrente";
+ "Immagine / video corrente";
#elif L==8 // pl
- "Bieżący obraz";
+ "Bieżący obraz / wideo";
#elif L==9 // pt
- "Imagem atual";
+ "Imagem / vídeo atual";
#endif
const char *Txt_Current_nickname =
@@ -24650,23 +24650,23 @@ const char *Txt_No_holidays =
const char *Txt_No_image = // Without any image
#if L==1 // ca
- "Sense imatge";
+ "Sense imatge / vídeo";
#elif L==2 // de
- "Ohne Abbild";
+ "Ohne Abbild / Video";
#elif L==3 // en
- "No image";
+ "No image / video";
#elif L==4 // es
- "Sin imagen";
+ "Sin imagen / vídeo";
#elif L==5 // fr
- "Pas d'image";
+ "Pas d'image / vidéo";
#elif L==6 // gn
- "Sin imagen"; // Okoteve traducción
+ "Sin imagen / vídeo"; // Okoteve traducción
#elif L==7 // it
- "Nessuna immagine";
+ "Nessuna immagine / video";
#elif L==8 // pl
- "Brak obrazka";
+ "Brak obrazka / wideo";
#elif L==9 // pt
- "Sem imagem";
+ "Sem imagem / vídeo";
#endif
const char *Txt_No_INDEX = // Short version of "Number" (as an index)...
diff --git a/swad_timeline.c b/swad_timeline.c
index f9cda4cb..48acc108 100644
--- a/swad_timeline.c
+++ b/swad_timeline.c
@@ -2472,12 +2472,12 @@ static long TL_ReceivePost (void)
Media.Quality = TL_IMAGE_SAVED_QUALITY;
Med_GetMediaFromForm (-1,&Media,NULL);
- if (Content[0] || // Text not empty
- (Media.Name[0] && Media.Type != Med_NONE)) // A media is attached
+ if (Content[0] || // Text not empty
+ Media.Status == Med_PROCESSED) // A media is attached
{
/***** Check if image is received and processed *****/
if (Media.Action == Med_ACTION_NEW_MEDIA && // Upload new image
- Media.Status == Med_FILE_PROCESSED) // The new image received has been processed
+ Media.Status == Med_PROCESSED) // The new image received has been processed
/* Move processed image to definitive directory */
Med_MoveMediaToDefinitiveDir (&Media);
@@ -2494,10 +2494,8 @@ static long TL_ReceivePost (void)
Content,
Media.Name,
Med_GetStringTypeForDB (Media.Type),
- (Media.Name[0] && // Save image title only if image attached
- Media.Title) ? Media.Title : "",
- (Media.Name[0] && // Save image URL only if image attached
- Media.URL ) ? Media.URL : "");
+ Media.Title ? Media.Title : "",
+ Media.URL ? Media.URL : "");
/* Insert post in notes */
TL_StoreAndPublishNote (TL_NOTE_POST,PstCod,&SocPub);
@@ -2655,7 +2653,7 @@ static void TL_WriteCommentsInNote (const struct TL_Note *SocNot)
// Never hide only one comment
// So, the number of comments initially hidden must be 0 or >= 2
NumCommentsInitiallyHidden = (NumComments <= TL_NUM_VISIBLE_COMMENTS + 1) ? 0 : // Show all
- NumComments - TL_NUM_VISIBLE_COMMENTS;
+ NumComments - TL_NUM_VISIBLE_COMMENTS;
if (NumCommentsInitiallyHidden)
{
/***** Create unique id for list of hidden comments *****/
@@ -3200,12 +3198,12 @@ static long TL_ReceiveComment (void)
Media.Quality = TL_IMAGE_SAVED_QUALITY;
Med_GetMediaFromForm (-1,&Media,NULL);
- if (Content[0] || // Text not empty
- (Media.Name[0] && Media.Type != Med_NONE)) // A media is attached
+ if (Content[0] || // Text not empty
+ Media.Status == Med_PROCESSED) // A media is attached
{
/***** Check if image is received and processed *****/
if (Media.Action == Med_ACTION_NEW_MEDIA && // Upload new image
- Media.Status == Med_FILE_PROCESSED) // The new image received has been processed
+ Media.Status == Med_PROCESSED) // The new image received has been processed
/* Move processed image to definitive directory */
Med_MoveMediaToDefinitiveDir (&Media);
@@ -3228,10 +3226,8 @@ static long TL_ReceiveComment (void)
Content,
Media.Name,
Med_GetStringTypeForDB (Media.Type),
- (Media.Name[0] && // Save image title only if image attached
- Media.Title) ? Media.Title : "",
- (Media.Name[0] && // Save image URL only if image attached
- Media.URL ) ? Media.URL : "");
+ Media.Title ? Media.Title : "",
+ Media.URL ? Media.URL : "");
/***** Store notifications about the new comment *****/
Ntf_StoreNotifyEventsToAllUsrs (Ntf_EVENT_TIMELINE_COMMENT,SocPub.PubCod);
@@ -5118,6 +5114,7 @@ static void Str_AnalyzeTxtAndStoreNotifyEventToMentionedUsrs (long PubCod,const
{
/* Copy nickname */
strncpy (UsrDat.Nickname,Nickname.PtrStart,Nickname.Length);
+ UsrDat.Nickname[Nickname.Length] = '\0';
if ((UsrDat.UsrCod = Nck_GetUsrCodFromNickname (UsrDat.Nickname)) > 0)
{
diff --git a/swad_web_service.c b/swad_web_service.c
index 5efc9bd4..ad18f837 100644
--- a/swad_web_service.c
+++ b/swad_web_service.c
@@ -120,7 +120,7 @@ cp -f /home/acanas/swad/swad/swad /var/www/cgi-bin/
/*****************************************************************************/
extern struct Globals Gbl;
-extern const char Str_BIN_TO_BASE64URL[64];
+extern const char Str_BIN_TO_BASE64URL[64 + 1];
/*****************************************************************************/
/***************************** Private constants *****************************/
@@ -3452,7 +3452,7 @@ static int Svc_SendMessageToUsr (long OriginalMsgCod,
" ('%s','%s',"
"'','%s','','')",
Subject,Content,
- Med_GetStringTypeForDB (Med_NONE));
+ Med_GetStringTypeForDB (Med_TYPE_NONE));
/* Insert message in sent messages */
DB_QueryINSERT ("can not create message",