// swad_form.c: forms to go to actions
/*
SWAD (Shared Workspace At a Distance),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
Copyright (C) 1999-2019 Antonio Caņas Vargas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
/*****************************************************************************/
/*********************************** Headers *********************************/
/*****************************************************************************/
#define _GNU_SOURCE // For asprintf
#include // For asprintf
#include // For free
#include "swad_form.h"
#include "swad_global.h"
/*****************************************************************************/
/************** External global variables from others modules ****************/
/*****************************************************************************/
extern struct Globals Gbl;
/*****************************************************************************/
/************************ Internal global variables **************************/
/*****************************************************************************/
/*****************************************************************************/
/**************************** Private prototypes *****************************/
/*****************************************************************************/
static void Frm_StartFormInternal (Act_Action_t NextAction,bool PutParameterLocationIfNoSesion,
const char *Id,const char *Anchor,const char *OnSubmit);
/*****************************************************************************/
/******************************** Start a form *******************************/
/*****************************************************************************/
void Frm_StartFormGoTo (Act_Action_t NextAction)
{
Gbl.Form.Num++; // Initialized to -1. The first time it is incremented, it will be equal to 0
snprintf (Gbl.Form.Id,sizeof (Gbl.Form.Id),
"form_%d",
Gbl.Form.Num);
Frm_StartFormInternal (NextAction,false,Gbl.Form.Id,NULL,NULL); // Do not put now parameter location
}
void Frm_StartForm (Act_Action_t NextAction)
{
Frm_StartFormAnchorOnSubmit (NextAction,NULL,NULL);
}
void Frm_StartFormAnchor (Act_Action_t NextAction,const char *Anchor)
{
Frm_StartFormAnchorOnSubmit (NextAction,Anchor,NULL);
}
void Frm_StartFormOnSubmit (Act_Action_t NextAction,const char *OnSubmit)
{
Frm_StartFormAnchorOnSubmit (NextAction,NULL,OnSubmit);
}
void Frm_StartFormAnchorOnSubmit (Act_Action_t NextAction,const char *Anchor,const char *OnSubmit)
{
Gbl.Form.Num++; // Initialized to -1. The first time it is incremented, it will be equal to 0
snprintf (Gbl.Form.Id,sizeof (Gbl.Form.Id),
"form_%d",
Gbl.Form.Num);
Frm_StartFormInternal (NextAction,true,Gbl.Form.Id,Anchor,OnSubmit); // Do put now parameter location (if no open session)
}
void Frm_StartFormUnique (Act_Action_t NextAction)
{
Frm_StartFormUniqueAnchor (NextAction,NULL);
}
void Frm_StartFormUniqueAnchor (Act_Action_t NextAction,const char *Anchor)
{
Gbl.Form.Num++; // Initialized to -1. The first time it is incremented, it will be equal to 0
snprintf (Gbl.Form.UniqueId,sizeof (Gbl.Form.UniqueId),
"form_%s_%d",
Gbl.UniqueNameEncrypted,Gbl.Form.Num);
Frm_StartFormInternal (NextAction,true,Gbl.Form.UniqueId,Anchor,NULL); // Do put now parameter location (if no open session)
}
void Frm_StartFormUniqueAnchorOnSubmit (Act_Action_t NextAction,const char *Anchor,const char *OnSubmit)
{
Gbl.Form.Num++; // Initialized to -1. The first time it is incremented, it will be equal to 0
snprintf (Gbl.Form.UniqueId,sizeof (Gbl.Form.UniqueId),
"form_%s_%d",
Gbl.UniqueNameEncrypted,Gbl.Form.Num);
Frm_StartFormInternal (NextAction,true,Gbl.Form.UniqueId,Anchor,OnSubmit); // Do put now parameter location (if no open session)
}
void Frm_StartFormId (Act_Action_t NextAction,const char *Id)
{
Gbl.Form.Num++; // Initialized to -1. The first time it is incremented, it will be equal to 0
Frm_StartFormInternal (NextAction,true,Id,NULL,NULL); // Do put now parameter location (if no open session)
}
// Id can not be NULL
static void Frm_StartFormInternal (Act_Action_t NextAction,bool PutParameterLocationIfNoSesion,
const char *Id,const char *Anchor,const char *OnSubmit)
{
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
char ParamsStr[Frm_MAX_BYTES_PARAMS_STR + 1];
if (!Gbl.Form.Inside)
{
/* Start form */
fprintf (Gbl.F.Out,"");
Gbl.Form.Inside = false;
}
}
/*****************************************************************************/
/******************* Anchor directive used to send a form ********************/
/*****************************************************************************/
// Requires an extern
void Frm_LinkFormSubmit (const char *Title,const char *LinkClass,
const char *OnSubmit)
{
Frm_LinkFormSubmitId (Title,LinkClass,Gbl.Form.Id,OnSubmit);
}
void Frm_LinkFormSubmitUnique (const char *Title,const char *LinkClass)
{
Frm_LinkFormSubmitId (Title,LinkClass,Gbl.Form.UniqueId,NULL);
}
// Title can be NULL
// LinkClass can be NULL
// Id can not be NULL
// OnSubmit can be NULL
void Frm_LinkFormSubmitId (const char *Title,const char *LinkClass,
const char *Id,const char *OnSubmit)
{
fprintf (Gbl.F.Out,"",
Id);
}
void Frm_LinkFormSubmitAnimated (const char *Title,const char *LinkClass,
const char *OnSubmit)
{
fprintf (Gbl.F.Out,"",
Gbl.Form.Num,
Gbl.Form.Id);
}
/*****************************************************************************/
/***************************** Get unique Id *********************************/
/*****************************************************************************/
void Frm_SetUniqueId (char UniqueId[Frm_MAX_BYTES_ID + 1])
{
static unsigned CountForThisExecution = 0;
/***** Create Id. The id must be unique,
the page content may be updated via AJAX.
So, Id uses:
- a name for this execution (Gbl.UniqueNameEncrypted)
- a number for each element in this execution (CountForThisExecution) *****/
snprintf (UniqueId,Frm_MAX_BYTES_ID + 1,
"id_%s_%u",
Gbl.UniqueNameEncrypted,
++CountForThisExecution);
}
/*****************************************************************************/
/****************** Build/free anchor string given a code ********************/
/*****************************************************************************/
void Frm_SetAnchorStr (long Cod,char **Anchor)
{
if (Cod > 0)
{
if (asprintf (Anchor,"cod_%ld",
Cod) < 0)
Lay_NotEnoughMemoryExit ();
}
else
*Anchor = NULL;
}
void Frm_FreeAnchorStr (char *Anchor)
{
if (Anchor)
{
free ((void *) Anchor);
Anchor = NULL;
}
}