diff options
author | allen <allen@1faa4e14-9dd3-4be0-9f0e-ffe519881164> | 2000-09-21 21:23:46 +0000 |
---|---|---|
committer | allen <allen@1faa4e14-9dd3-4be0-9f0e-ffe519881164> | 2000-09-21 21:23:46 +0000 |
commit | 905d577778cfa9cfbe3bc8edb99640245e639d8f (patch) | |
tree | d44d658cef9259686c1ab92081721fb718cc1d79 /src | |
parent | 9315ef0ed2bf451757ce32a9959c6a0f0aa3ed7e (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.c | 14 | ||||
-rw-r--r-- | src/Parameters.c | 388 |
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,¶m_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\">" - " 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\">" + " " + "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,¶m_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; + } +} |