aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorallen <allen@1faa4e14-9dd3-4be0-9f0e-ffe519881164>2000-09-21 21:23:46 +0000
committerallen <allen@1faa4e14-9dd3-4be0-9f0e-ffe519881164>2000-09-21 21:23:46 +0000
commit905d577778cfa9cfbe3bc8edb99640245e639d8f (patch)
treed44d658cef9259686c1ab92081721fb718cc1d79 /src
parent9315ef0ed2bf451757ce32a9959c6a0f0aa3ed7e (diff)
Enhancements to the parameter pages
git-svn-id: http://svn.cactuscode.org/arrangements/CactusConnect/HTTPD/trunk@80 1faa4e14-9dd3-4be0-9f0e-ffe519881164
Diffstat (limited to 'src')
-rw-r--r--src/Headers.c14
-rw-r--r--src/Parameters.c388
2 files changed, 371 insertions, 31 deletions
diff --git a/src/Headers.c b/src/Headers.c
index d85bc36..a88b87c 100644
--- a/src/Headers.c
+++ b/src/Headers.c
@@ -152,22 +152,22 @@ int HTTP_ContentHeader(cGH *GH, int choice, int len, char *header, char *menu)
if (menu)
{
- strcat(header,"<dt><small>");
+ strcat(header,"<dl><small>");
strcat(header,menu);
- strcat(header,"</dt></small>");
+ strcat(header,"</dl></small>");
}
/* Online links */
sprintf(header,"%s\n"
"<small><dl>"
- "<dt><b>On-Line:</b>"
- "<dt><A HREF=\"http://www.cactuscode.org\">Cactus Homepage</A>"
- "<dt><A HREF=\"http://www.cactuscode.org/Documentation/UsersGuide/\">Users Guide</A>"
+ "<dt><b>On-Line:</b>\n"
+ "<dt><A HREF=\"http://www.cactuscode.org\">Cactus Homepage</A>\n"
+ "<dt><A HREF=\"http://www.cactuscode.org/Documentation/UsersGuide/\">Users Guide</A>\n"
"<dt><A HREF=\"mailto:cactusmaint@cactuscode.org\">Cactus Helpdesk</A>\n"
- "</dl></small>",
+ "</dl></small>\n",
header,currenttime,currentdate);
- strcat(header,"</td><td valign=top>\n");
+ strcat(header,"</td>\n<td valign=top>\n");
}
else
{
diff --git a/src/Parameters.c b/src/Parameters.c
index 261641b..69137a5 100644
--- a/src/Parameters.c
+++ b/src/Parameters.c
@@ -48,6 +48,7 @@ CCTK_FILEVERSION(DevThorns_httpd_Parameters_c)
static int MainParameterPage(cGH *cctkGH, httpRequest *request, void *data);
static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data);
+static int ParameterPage(cGH *cctkGH, httpRequest *request, void *data);
/********************************************************************
@@ -88,9 +89,14 @@ int HTTPi_RegisterParameterPages(void)
DECLARE_CCTK_PARAMETERS
int i;
+ int first;
const char *thorn;
- char pagename[27+20]; /* Thorns have maximum length */
+ char pagename[27+20+100]; /* Thorns have maximum length
+ then added 100 for parameters */
char *namecopy;
+ const cParamData *pData;
+ cParamData *datacopy;
+ char *value;
/* Two ways to do this - can either just have one function
* registered as /Parameters which then checks request->residual,
@@ -115,6 +121,16 @@ int HTTPi_RegisterParameterPages(void)
namecopy = Util_Strdup(thorn);
HTTP_RegisterPage(pagename, ThornParameterPage, namecopy);
+
+ /* Walk through all parameters of given implementation. */
+ first = 1;
+ while(CCTK_ParameterWalk(first, thorn, NULL, &pData) == 0)
+ {
+ first = 0;
+ sprintf(pagename,"/Parameters/%s/%s",thorn,pData->name);
+ datacopy = (cParamData *)pData;
+ HTTP_RegisterPage(pagename, ParameterPage, datacopy);
+ }
}
return 0;
@@ -191,7 +207,7 @@ static int MainParameterPage(cGH *cctkGH, httpRequest *request, void *data)
"to change the value of a parameter, simply edit the value in the box and press \n"
" the submit button to register the new values.</p><center>\n"
"<table cellspacing=5 border=0\n>"
- "<tr><td><b>Thorn Name</b></td><td><b>Implementation</b></td></tr>\n");
+ "<tr><td><b>Thorn Name</b></td><td><b>Implementation</b></td></TR>\n");
HTTP_Write(request, message, strlen(message));
@@ -202,8 +218,10 @@ static int MainParameterPage(cGH *cctkGH, httpRequest *request, void *data)
if (CCTK_IsThornActive (thorn))
{
sprintf(message,
- "<tr><td valign=top><A HREF=\"/Parameters/%s/\">%s</A></td>\n"
- "<td valign=top>%s</td></tr>",
+ "<TR>\n"
+ "<td valign=top><A HREF=\"/Parameters/%s/\">%s</A></td>\n"
+ "<td valign=top>%s</td>\n"
+ "</TR>\n",
thorn, thorn,CCTK_ThornImplementation(thorn));
HTTP_Write(request, message, strlen(message));
@@ -252,6 +270,7 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
const char *thorn, *menuthorn;
int first;
const cParamData *pData;
+ t_range *range;
char *value;
const httpArg *argument;
char user[USER_LENGTH+1];
@@ -261,6 +280,7 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
int param_type;
int param_bool;
+ char *param_keyword;
int nsteerable=0;
int nfixed=0;
@@ -363,7 +383,7 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
if (CCTK_NumCompiledThorns()>0)
{
- strcpy(menu,"<dt><b>Parameters:</b>\n");
+ strcpy(menu,"<DT><B>Parameters:</B>\n");
}
/* Menu for this page */
for (i = 0; i < CCTK_NumCompiledThorns (); i++)
@@ -372,7 +392,7 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
if (CCTK_IsThornActive (menuthorn))
{
sprintf(menu,
- "%s <dt> <A HREF=\"/Parameters/%s/\">%s</A>\n",
+ "%s<DT> <A HREF=\"/Parameters/%s/\">%s</A>\n",
menu,menuthorn, menuthorn);
}
}
@@ -404,7 +424,7 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
" is currently no log of parameters which have been modified.</p>\n"
"<p>The tables below show the parameter name, current value and description."
"The default value of each parameter is shown in brackets at the end of the description.</p>"
- "<center><p><a href=\"../\">View parameters from another thorn</a></p>\n");
+ "<center>\n");
HTTP_Write(request, message, strlen(message));
@@ -451,24 +471,65 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
param_bool =
*((CCTK_INT *)CCTK_ParameterGet(pData->name,thorn,&param_type));
sprintf(message,
- "%s<TR><TD align=left valign=center>%s</TD>"
- "<TD align=left valign=center>"
- "Yes <INPUT type=\"radio\" name=\"%s\" %s value=\"1\">"
- "&nbsp; No <INPUT type=\"radio\" name=\"%s\" %s value=\"0\">"
- "</TD><TD><SMALL>%s (%s)</SMALL></TR>\n",
- message,pData->name,pData->name,
+ "%s<TR>\n"
+ "<TD ALIGN=LEFT VALIGN=CENTER>"
+ "<A HREF=\"/Parameters/%s/%s\">%s</A></TD>\n"
+ "<TD ALIGN=LEFT VALIGN=CENTER>"
+ "Yes <INPUT TYPE=\"RADIO\" NAME=\"%s\" %s VALUE=\"1\">"
+ "&nbsp;"
+ "No <INPUT type=\"RADIO\" name=\"%s\" %s VALUE=\"0\">"
+ "</TD>\n"
+ "<TD><SMALL>%s (%s)</SMALL></TD>\n"
+ "</TR>\n",
+ message,pData->thorn,pData->name,
+ pData->name,pData->name,
param_bool ? "checked" : "", pData->name,
param_bool ? "" : "checked",pData->description,pData->defval);
}
+ else if (pData->type == PARAMETER_KEYWORD)
+ {
+ /* Steerable keyword */
+ param_keyword =
+ ((char *)CCTK_ParameterGet(pData->name,thorn,&param_type));
+
+ sprintf(message,"%s<TR>\n"
+ "<TD ALIGN=LEFT VALIGN=CENTER>"
+ "<A HREF=\"/Parameters/%s/%s\">%s</A></TD>\n"
+ "<TD ALIGN=LEFT VALIGN=CENTER>\n",
+ message,pData->thorn,pData->name,pData->name);
+ sprintf(message,"%s <SELECT name=%s size=1>\n",
+ message,pData->name);
+ for(range = pData->range; range ; range = range->next)
+ {
+ if (CCTK_Equals(value,range->range))
+ {
+ sprintf(message,"%s<OPTION SELECTED>%s\n",
+ message, range->range);
+ }
+ else
+ {
+ sprintf(message,"%s<OPTION>%s\n",
+ message,range->range);
+ }
+ }
+ strcat(message,"</SELECT>\n");
+ sprintf(message,"%s</TD>\n"
+ "<TD><SMALL>%s (%s)</SMALL></TD>\n"
+ "</TR>\n",
+ message,pData->description,pData->defval);
+ }
else
{
/* Steerable nonboolean */
sprintf(message,
- "%s<TR><TD align=left valign=center>%s</TD>"
+ "%s<TR>\n"
"<TD align=left valign=center>"
- "<INPUT TYPE=TEXT NAME=\"%s\" VALUE=\"%s\">"
- "</TD><TD><SMALL>%s (%s)</SMALL></TR>\n",
- message, pData->name, pData->name,
+ "<A HREF=\"/Parameters/%s/%s\">%s</A></TD>\n"
+ "<TD align=left valign=center>"
+ "<INPUT TYPE=TEXT NAME=\"%s\" VALUE=\"%s\"></TD>\n"
+ "<TD><SMALL>%s (%s)</SMALL></TD>\n</TR>\n",
+ message, pData->thorn, pData->name,
+ pData->name, pData->name,
value, pData->description,pData->defval);
}
}
@@ -476,10 +537,12 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
{
/* Steerable but no authority */
sprintf(message,
- "%s<TR><TD align=left valign=center>%s</TD>"
+ "%s<TR><TD align=left valign=center>"
+ "<A HREF=\"/Parameters/%s/%s\">%s</A></TD>\n"
"<TD align=left valign=center>%s</TD><TD>"
- "<SMALL>%s (%s)</SMALL></TR>\n",
- message, pData->name, value, pData->description,pData->defval);
+ "<SMALL>%s (%s)</SMALL></TD></TR>\n",
+ message, pData->thorn, pData->name,
+ pData->name, value, pData->description,pData->defval);
}
}
free (value);
@@ -494,7 +557,7 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
}
else
{
- strcpy(message, "<p>This thorn has no steerable parameters.</p>\n");
+ strcpy(message, "<P>This thorn has no steerable parameters.</P>\n");
}
HTTP_Write(request, message, strlen(message));
@@ -535,9 +598,14 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
strcmp(pData->name,"encryption_scheme")))
{
sprintf(message,
- "%s<TR><TD align=left valign=center>%s</TD>"
- "<TD>%s</TD><TD><SMALL>%s (%s)</SMALL></TD></TR>\n",
- message,pData->name, value, pData->description,pData->defval);
+ "%s<TR>\n"
+ "<TD align=left valign=center>"
+ "<A HREF=\"/Parameters/%s/%s\">%s</A></TD>\n"
+ "<TD>%s</TD>\n"
+ "<TD><SMALL>%s (%s)</SMALL></TD>\n"
+ "</TR>\n",
+ message, pData->thorn, pData->name,
+ pData->name, value, pData->description,pData->defval);
}
}
free(value);
@@ -571,3 +639,275 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
return retval;
}
+
+
+
+ /*@@
+ @routine ParameterPage
+ @date Thu Sep 21 15:13:55 2000
+ @author Gabrielle Allen
+ @desc
+ Page for an individual parameter
+ Lots copied from ThornParameterPage
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+static int ParameterPage(cGH *cctkGH, httpRequest *request, void *data)
+{
+ int retval=0;
+ int i;
+ char message[4098];
+ char menu[4098];
+ const char *thorn, *menuthorn;
+ int first;
+ const cParamData *pData;
+ const cParamData *pDataWalk;
+ t_range *range;
+ char *value;
+ const httpArg *argument;
+ char user[USER_LENGTH+1];
+
+ int notauthorised;
+ int readonly;
+
+ int param_type;
+ int param_bool;
+ char *param_keyword;
+ int nsteerable=0;
+ int nfixed=0;
+
+ pData = (cParamData *)data;
+
+ notauthorised = HTTP_AuthenticateBasic(request, "user", user, USER_LENGTH);
+
+ readonly = notauthorised;
+
+ if(request->n_arguments > 0)
+ {
+ /* This is a parameter set request */
+
+ if(!notauthorised)
+ {
+ if(!readonly)
+ {
+ /* Queue parameters for steering */
+ first = 1;
+ while(argument = HTTP_ArgumentWalk(request, first))
+ {
+ first = 0;
+ fprintf(stderr, "Setting %s::%s to %s\n", pData->thorn, argument->arg, argument->value);
+ HTTP_SteerQueue(pData->thorn, argument->arg, argument->value);
+ }
+
+ /* Now redirect the browser to the normal page */
+ /* Status message */
+ if(request->http_major_version < 1 ||
+ (request->http_major_version == 1 && request->http_minor_version < 1))
+ {
+ /* Older browsers don't understand 303 */
+ strcpy(message,"HTTP/1.0 302 Found\r\n");
+ }
+ else
+ {
+ strcpy(message,"HTTP/1.0 303 See Other\r\n");
+ }
+
+ sprintf(message, "%sLocation: /Parameters/%s/\r\n\r\n", message, pData->thorn);
+
+ HTTP_Write(request, message, strlen(message));
+ }
+ else
+ {
+ /* Redirect the browser to the normal page */
+ /* Status message */
+ if(request->http_major_version < 1 ||
+ (request->http_major_version == 1 && request->http_minor_version < 1))
+ {
+ /* Older browsers don't understand 303 */
+ strcpy(message,"HTTP/1.0 302 Found\r\n");
+ }
+ else
+ {
+ strcpy(message,"HTTP/1.0 303 See Other\r\n");
+ }
+
+ sprintf(message, "%sLocation: /Parameters/%s/\r\n\r\n", message, pData->thorn);
+
+ HTTP_Write(request, message, strlen(message));
+ }
+ }
+ else
+ {
+ strcpy(message,"HTTP/1.0 401 Unauthorized\r\n");
+
+ HTTP_Write(request, message, strlen(message));
+
+ strcpy(message,"WWW-Authenticate: Basic realm=\"foo\"\r\n");
+
+ HTTP_Write(request, message, strlen(message));
+
+ strcpy(message,"Content-Type: text/html\r\n\r\n");
+
+ HTTP_Write(request, message, strlen(message));
+
+ HTTP_Write(request, notauthorized_page, strlen(notauthorized_page));
+ }
+
+ }
+ else
+ {
+ /* Display the page. */
+ /* Status message */
+ strcpy(message,"HTTP/1.0 200 OK\r\n");
+
+ HTTP_Write(request, message, strlen(message));
+
+ /* Content-Type */
+ strcpy(message,"Content-Type: text/html\r\n\r\n");
+
+ HTTP_Write(request, message, strlen(message));
+
+ /* Start the page */
+ sprintf(message,
+ "<HTML><HEAD><TITLE>Cactus Parameter Request : %s</TITLE>"
+ "</HEAD>\n", pData->name);
+
+ HTTP_Write(request, message, strlen(message));
+
+
+ /* Menu for this page */
+ first = 1;
+ while(CCTK_ParameterWalk(first, pData->thorn, NULL, &pDataWalk) == 0)
+ {
+ if (first==1)
+ {
+ sprintf(menu,"%s<DT><B>%s:</B>\n",menu,pDataWalk->thorn);
+ }
+ first = 0;
+ sprintf(menu,
+ "%s<DT> <A HREF=\"/Parameters/%s/%s\">%s</A>\n",
+ menu,pDataWalk->thorn,pDataWalk->name,pDataWalk->name);
+ }
+
+ HTTP_ContentHeader(cctkGH,0,4098,message,menu);
+ HTTP_Write(request, message, strlen(message));
+
+ sprintf(message,"<CENTER><H1>%s: %s</H1></CENTER>\n",pData->thorn,pData->name);
+ HTTP_Write(request, message, strlen(message));
+
+ sprintf(message,"<p>Complete information about parameter <b>%s</b> "
+ "defined in thorn <b>%s</b>, implementation <b>%s</b>.</p>"
+ "<P>Return to all parameters for this "
+ "<A HREF=\"Parameters/%s\">thorn</A>.</P> ",
+ pData->name, pData->thorn, CCTK_ThornImplementation(pData->thorn));
+
+ HTTP_Write(request, message, strlen(message));
+
+ value = CCTK_ParameterValString (pData->name, pData->thorn);
+
+ sprintf(message,"<CENTER><TABLE CELLPADDING=5 CELLSPACING=5>\n"
+ "<TR>\n"
+ "<TD><B>Current value</B></TD>\n"
+ "<TD>%s</TD>\n"
+ "</TR>"
+ "<TR>\n"
+ "<TD><B>Description</B></TD>\n"
+ "<TD>%s</TD>\n"
+ "</TR>"
+ "<TR>"
+ "<TD><B>Default</B></TD>\n"
+ "<TD>%s</TD>\n"
+ "</TR>",
+ value,pData->description,pData->defval);
+ HTTP_Write(request, message, strlen(message));
+
+ switch(pData->steerable)
+ {
+ case CCTK_STEERABLE_ALWAYS :
+ strcat(message,"<TR><TD><B>Steerable</B></TD><TD>Always</TD></TR>");
+ break;
+ case CCTK_STEERABLE_NEVER :
+ strcat(message,"<TR><TD><B>Steerable</B></TD><TD>Never</TD></TR>");
+ break;
+ case CCTK_STEERABLE_RECOVER :
+ strcat(message,"<TR><TD><B>Steerable</B></TD><TD>Recovery</TD></TR>");
+ break;
+ default :
+ strcat(message,"<TR><TD><B>Steerable</B></TD><TD>Not matched</TD></TR>");
+ }
+
+ HTTP_Write(request, message, strlen(message));
+
+ switch(pData->type)
+ {
+ case PARAMETER_BOOLEAN :
+ strcat(message,"<TR><TD><B>Type</B></TD><TD>Boolean</TD></TR>");
+ break;
+ case PARAMETER_REAL :
+ strcat(message,"<TR><TD><B>Type</B></TD><TD>Real</TD></TR>");
+ break;
+ case PARAMETER_INTEGER :
+ strcat(message,"<TR><TD><B>Type</B></TD><TD>Integer</TD></TR>");
+ break;
+ case PARAMETER_SENTENCE :
+ strcat(message,"<TR><TD><B>Type</B></TD><TD>Sentence</TD></TR>");
+ break;
+ case PARAMETER_STRING :
+ strcat(message,"<TR><TD><B>Type</B></TD><TD>String</TD></TR>");
+ break;
+ case PARAMETER_KEYWORD :
+ strcat(message,"<TR><TD><B>Type</B></TD><TD>Keyword</TD></TR>");
+ break;
+ default :
+ strcat(message,"<TR><TD><B>Type</B></TD><TD>Not matched</TD></TR>");
+ }
+
+ HTTP_Write(request, message, strlen(message));
+
+ switch(pData->scope)
+ {
+ case SCOPE_GLOBAL :
+ strcat(message,"<TR><TD><B>Scope</B></TD><TD>Global</TD></TR>");
+ break;
+ case SCOPE_RESTRICTED :
+ strcat(message,"<TR><TD><B>Scope</B></TD><TD>Restricted</TD></TR>");
+ break;
+ case SCOPE_PRIVATE :
+ strcat(message,"<TR><TD><B>Scope</B></TD><TD>Private</TD></TR>");
+ break;
+ default :
+ strcat(message,"<TR><TD><B>Scope</B></TD><TD>Not matched</TD></TR>");
+ }
+
+ HTTP_Write(request, message, strlen(message));
+
+ for(range = pData->range; range ; range = range->next)
+ {
+ sprintf(message,"<TR><TD><B>Range</B></TD><TD>%s</TD></TR>",
+ range->range);
+ }
+
+ HTTP_Write(request, message, strlen(message));
+
+ sprintf(message,
+ "<TR>"
+ "<TD><B># Set</B></TD>\n"
+ "<TD>%d</TD>"
+ "</TR>"
+ "</TABLE></CENTER>",
+ pData->n_set);
+ HTTP_Write(request, message, strlen(message));
+
+ /* Write out the footer part. */
+
+ HTTP_ContentFooter(cctkGH, 0, 4098, message);
+ retval = HTTP_Write(request, message, strlen(message));
+
+ return retval;
+ }
+}