Browse Source

httpd: retire this server

this never panned out and there are enough mistakes in
the code that probably nobody used this.

Use the tcl server and implement a standalone http
app instead works fine.

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
tags/v0.5.0-rc1
Øyvind Harboe 11 years ago
parent
commit
fdae51287c
56 changed files with 3 additions and 10051 deletions
  1. +0
    -2
      README
  2. +0
    -5
      configure.in
  3. +0
    -14
      doc/manual/server.txt
  4. +0
    -4
      src/Makefile.am
  5. +0
    -6
      src/openocd.c
  6. +1
    -23
      src/server/Makefile.am
  7. +0
    -506
      src/server/httpd.c
  8. +0
    -28
      src/server/httpd.h
  9. BIN
      src/server/httpd/Stylizer.class
  10. +0
    -114
      src/server/httpd/Stylizer.java
  11. +0
    -454
      src/server/httpd/browsemem.tcl
  12. +0
    -5
      src/server/httpd/build.sh
  13. +0
    -366
      src/server/httpd/downloadmem.tcl
  14. +0
    -462
      src/server/httpd/editconfigs.tcl
  15. +0
    -436
      src/server/httpd/editfile.tcl
  16. +0
    -387
      src/server/httpd/erase.tcl
  17. +0
    -459
      src/server/httpd/flash.tcl
  18. +0
    -382
      src/server/httpd/flashinfo.tcl
  19. +0
    -336
      src/server/httpd/guiupload.tcl
  20. +0
    -128
      src/server/httpd/html2tcl.sh
  21. +0
    -100
      src/server/httpd/httpd.tcl
  22. +0
    -376
      src/server/httpd/index.tcl
  23. +0
    -343
      src/server/httpd/log.tcl
  24. +0
    -973
      src/server/httpd/menu.xml
  25. +0
    -298
      src/server/httpd/menu.xsl
  26. BIN
      src/server/httpd/menu_cuts/center_bottom.png
  27. BIN
      src/server/httpd/menu_cuts/center_top.png
  28. BIN
      src/server/httpd/menu_cuts/h_tab1.png
  29. BIN
      src/server/httpd/menu_cuts/h_tab1_selected.png
  30. BIN
      src/server/httpd/menu_cuts/h_tab2.png
  31. BIN
      src/server/httpd/menu_cuts/h_tab2_selected.png
  32. BIN
      src/server/httpd/menu_cuts/h_tab_free.png
  33. BIN
      src/server/httpd/menu_cuts/logo_bottom.png
  34. BIN
      src/server/httpd/menu_cuts/logo_top.png
  35. BIN
      src/server/httpd/menu_cuts/right_bottom.png
  36. BIN
      src/server/httpd/menu_cuts/right_top.png
  37. BIN
      src/server/httpd/menu_cuts/right_top_small.png
  38. BIN
      src/server/httpd/menu_cuts/top_right.png
  39. BIN
      src/server/httpd/menu_cuts/v_1.png
  40. BIN
      src/server/httpd/menu_cuts/v_2_tile.png
  41. BIN
      src/server/httpd/menu_cuts/v_3.png
  42. BIN
      src/server/httpd/menu_cuts/v_tab.png
  43. BIN
      src/server/httpd/menu_cuts/v_tab_selected.png
  44. +0
    -132
      src/server/httpd/menuweb.css
  45. +0
    -355
      src/server/httpd/openocd.tcl
  46. +0
    -429
      src/server/httpd/preconfig.tcl
  47. +0
    -392
      src/server/httpd/production.tcl
  48. +0
    -24
      src/server/httpd/readme.txt
  49. +0
    -322
      src/server/httpd/reload.tcl
  50. +0
    -382
      src/server/httpd/run.tcl
  51. +0
    -431
      src/server/httpd/support.tcl
  52. +0
    -560
      src/server/httpd/targets.tcl
  53. +0
    -364
      src/server/httpd/terminal.tcl
  54. +0
    -418
      src/server/httpd/upgrade.tcl
  55. +0
    -33
      src/server/httpd_stubs.c
  56. +2
    -2
      src/server/server.h

+ 0
- 2
README View File

@@ -255,8 +255,6 @@ options may be available there:

--enable-ioutil Enable ioutil functions - useful for standalone
OpenOCD implementations
--enable-httpd Enable builtin httpd server - useful for standalone
OpenOCD implementations

--disable-doxygen-html Disable building Doxygen manual as HTML.
--enable-doxygen-pdf Enable building Doxygen manual as PDF.


+ 0
- 5
configure.in View File

@@ -420,10 +420,6 @@ AC_ARG_ENABLE(ioutil,
AS_HELP_STRING([--enable-ioutil], [Enable ioutil functions - useful for standalone OpenOCD implementations]),
[build_ioutil=$enableval], [build_ioutil=no])

AC_ARG_ENABLE(httpd,
AS_HELP_STRING([--enable-httpd], [Enable builtin httpd server - useful for standalone OpenOCD implementations]),
[build_httpd=$enableval], [build_httpd=no])

case "${host_cpu}" in
arm*)
AC_ARG_ENABLE(ep93xx,
@@ -1039,7 +1035,6 @@ AM_CONDITIONAL(ECOSBOARD, test $build_ecosboard = yes)
AM_CONDITIONAL(ZY1000, test $build_zy1000 = yes)
AM_CONDITIONAL(ZY1000_MASTER, test $build_zy1000_master = yes)
AM_CONDITIONAL(IOUTIL, test $build_ioutil = yes)
AM_CONDITIONAL(HTTPD, test $build_httpd = yes)
AM_CONDITIONAL(AT91RM9200, test $build_at91rm9200 = yes)
AM_CONDITIONAL(BITBANG, test $build_bitbang = yes)
AM_CONDITIONAL(FT2232_LIBFTDI, test $build_ft2232_libftdi = yes)


+ 0
- 14
doc/manual/server.txt View File

@@ -309,17 +309,3 @@ This section needs to be expanded.

*/

/** @page serverhttp OpenOCD HTTP Server API


Smoketest:

configure --enable-httpd --enable-dummy --enable-ioutil

openocd -s /usr/local/share/openocd -f httpd/httpd.tcl -f interface/dummy.cfg -f target/lpc2148.cfg

Navigate to: http://localhost:8888/



*/

+ 0
- 4
src/Makefile.am View File

@@ -101,10 +101,6 @@ libopenocd_la_LIBADD = \
$(top_builddir)/src/helper/libhelper.la \
$(FTDI2232LIB) $(MINGWLDADD) $(LIBUSB)

if HTTPD
libopenocd_la_LIBADD += -lmicrohttpd
endif

STARTUP_TCL_SRCS = \
$(srcdir)/helper/startup.tcl \
$(srcdir)/jtag/startup.tcl \


+ 0
- 6
src/openocd.c View File

@@ -42,7 +42,6 @@

#include <server/server.h>
#include <server/gdb_server.h>
#include <server/httpd.h>

#ifdef HAVE_STRINGS_H
#include <strings.h>
@@ -337,9 +336,6 @@ int openocd_main(int argc, char *argv[])
if (ret != ERROR_OK)
return EXIT_FAILURE;

if (httpd_start(cmd_ctx) != ERROR_OK)
return EXIT_FAILURE;

ret = server_init(cmd_ctx);
if (ERROR_OK != ret)
return EXIT_FAILURE;
@@ -357,8 +353,6 @@ int openocd_main(int argc, char *argv[])

server_quit();

httpd_stop();

unregister_all_commands(cmd_ctx, NULL);

/* free commandline interface */


+ 1
- 23
src/server/Makefile.am View File

@@ -8,15 +8,9 @@ noinst_LTLIBRARIES = libserver.la
noinst_HEADERS = server.h telnet_server.h gdb_server.h
libserver_la_SOURCES = server.c telnet_server.c gdb_server.c

if HTTPD
libserver_la_SOURCES += httpd.c
else
libserver_la_SOURCES += httpd_stubs.c
if !ECOSBOARD
libserver_la_SOURCES += server_stubs.c
endif
endif
noinst_HEADERS += httpd.h

libserver_la_CFLAGS =
if IS_MINGW
@@ -28,23 +22,7 @@ endif
noinst_HEADERS += tcl_server.h
libserver_la_SOURCES += tcl_server.c

if HTTPD
nobase_dist_pkgdata_DATA = \
$(wildcard \
$(srcdir)/httpd/*.tcl \
$(srcdir)/httpd/*.css \
$(srcdir)/httpd/menu_cuts/*.png \
)
endif

EXTRA_DIST = \
startup.tcl \
httpd/readme.txt \
httpd/menu.xml \
httpd/menu.xsl \
httpd/build.sh \
httpd/html2tcl.sh \
httpd/Stylizer.java \
httpd/Stylizer.class
startup.tcl

MAINTAINERCLEANFILES = $(srcdir)/Makefile.in

+ 0
- 506
src/server/httpd.c View File

@@ -1,506 +0,0 @@
/***************************************************************************
* Copyright (C) 2007,2008,2009 Øyvind Harboe *
* oyvind.harboe@zylin.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/

/* some bits were copied from ahttpd which is under eCos license and
* copyright to FSF
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "telnet_server.h"
#include <target/target.h>

#include <microhttpd.h>
#include <pthread.h>
#include <signal.h>

#define PAGE_NOT_FOUND "<html><head><title > File not found</title></head><body > File not found</body></html>"

static pthread_mutex_t mutex;

void openocd_sleep_prelude(void)
{
pthread_mutex_unlock(&mutex);
}

void openocd_sleep_postlude(void)
{
pthread_mutex_lock(&mutex);
}



int loadFile(const char *name, void **data, size_t *len);

static const char *appendf(const char *prev, const char *format, ...)
{
va_list ap;
va_start(ap, format);
char *string = alloc_vprintf(format, ap);
va_end(ap);
char *string2 = NULL;

if (string != NULL)
{
string2 = alloc_printf("%s%s", (prev == NULL) ? "" : prev, string);
}

if (prev != NULL)
{
free((void *)prev);
}

if (string == NULL)
free(string);

return string2;
}

static const char *httpd_exec_cgi_tcl_error(Jim_Interp *interp)
{
int len, i;

const char *t = NULL;
t = appendf(t, "<html><body>\n");

t = appendf(t, "Runtime error, file \"%s\", line %d:<br>",
interp->errorFileName, interp->errorLine);
t = appendf(t, " %s < br>", Jim_GetString(interp->result, NULL));
Jim_ListLength(interp, interp->stackTrace, &len);
for (i = 0; i < len; i += 3)
{
Jim_Obj *objPtr;
const char *proc, *file, *line;

Jim_ListIndex(interp, interp->stackTrace, i, &objPtr, JIM_NONE);
proc = Jim_GetString(objPtr, NULL);
Jim_ListIndex(interp, interp->stackTrace, i + 1, &objPtr, JIM_NONE);
file = Jim_GetString(objPtr, NULL);
Jim_ListIndex(interp, interp->stackTrace, i + 2, &objPtr, JIM_NONE);
line = Jim_GetString(objPtr, NULL);
t = appendf(t, "In procedure '%s' called at file \"%s\", line %s < br>",
proc, file, line);
}
t = appendf(t, "</html></body>\n");

return t;
}

static int httpd_Jim_Command_writeform(Jim_Interp *interp, int argc,
Jim_Obj * const *argv)
{
if (argc != 3)
{
Jim_WrongNumArgs(interp, 1, argv, "method ?CMD_ARGV ...?");
return JIM_ERR;
}
char *name = (char*) Jim_GetString(argv[1], NULL);
char *file = (char*) Jim_GetString(argv[2], NULL);

// Find length
const char *data;
int actual;
int retcode;
const char *script = alloc_printf(
"set dummy_val $httppostdata(%s); set dummy_val",
name);

retcode = Jim_Eval_Named(interp, script, __FILE__, __LINE__);
free((void *) script);
if (retcode != JIM_OK)
return retcode;

data = Jim_GetString(Jim_GetResult(interp), &actual);

FILE *f = fopen(file, "wb");
if (NULL == f)
{
Jim_SetResultString(interp, "Could not create file", -1);
return JIM_ERR;
}

int result = fwrite(data, 1, actual, f);
fclose(f);

if (result != actual)
{
Jim_SetResultString(interp, "Could not write to file", -1);
return JIM_ERR;
}
return JIM_OK;
}


int
httpd_Jim_Command_formfetch(Jim_Interp *interp,
int argc,
Jim_Obj *const *argv)
{
if (argc != 2)
{
Jim_WrongNumArgs(interp, 1, argv, "method ?CMD_ARGV ...?");
return JIM_ERR;
}

char *name = (char*)Jim_GetString(argv[1], NULL);
const char *script = alloc_printf(
"set dummy_val $httppostdata(%s); set dummy_val",
name);
int retcode = Jim_Eval_Named(interp, script, __FILE__, __LINE__);

free((void *) script);
if (retcode != JIM_OK)
Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
else
Jim_SetResult(interp, Jim_GetResult(interp));

return JIM_OK;
}

struct httpd_request
{
int post;
Jim_Interp *interp;
struct MHD_PostProcessor *postprocessor;

//Jim_Obj *dict;

int complete; /* did we receive the entire post ? */

};

static void request_completed(void *cls, struct MHD_Connection *connection,
void **con_cls, enum MHD_RequestTerminationCode toe)
{
struct httpd_request *r = (struct httpd_request*) *con_cls;

if (NULL == r)
return;

if (r->postprocessor)
{
openocd_sleep_postlude();
MHD_destroy_post_processor(r->postprocessor);
openocd_sleep_prelude();
}

free(r);
*con_cls = NULL;
}

/* append to said key in dictionary */
static void append_key(Jim_Interp *interp,
struct httpd_request *r, const char *key,
const char *data, size_t off, size_t size)
{
Jim_Obj *keyObj = Jim_NewStringObj(interp, key, -1);
Jim_IncrRefCount(keyObj);
Jim_Obj *value = NULL;

Jim_Obj *dict = Jim_GetVariableStr(interp, "httppostdata", 0);

if (dict != NULL)
{
if (Jim_DictKey(interp, dict, keyObj, &value, 0) != JIM_OK)
{
value = NULL;
}
else
{
Jim_IncrRefCount(value);
}
}

if (value == NULL)
{
value = Jim_NewStringObj(interp, "", -1);
Jim_IncrRefCount(value);

}

/* create a new object we append to and insert into this location */
Jim_Obj *newObj = Jim_NewStringObj(interp, "", -1);
Jim_IncrRefCount(newObj);
Jim_AppendObj(interp, newObj, value);
Jim_AppendString(interp, newObj, data, size);
/* uhh... use name here of dictionary */
dict = Jim_NewStringObj(interp, "httppostdata", -1);
Jim_IncrRefCount(dict);
Jim_SetDictKeysVector(interp, dict, &keyObj, 1, newObj);
Jim_DecrRefCount(interp, dict);
Jim_DecrRefCount(interp, value);
Jim_DecrRefCount(interp, newObj);
Jim_DecrRefCount(interp, keyObj);
}

/* append data to each key */
static int iterate_post(void *con_cls, enum MHD_ValueKind kind,
const char *key, const char *filename, const char *content_type,
const char *transfer_encoding, const char *data, uint64_t off,
size_t size)
{
struct httpd_request *r = (struct httpd_request*) con_cls;

append_key(r->interp, r, key, data, off, size);

return MHD_YES;
}

static int record_arg(void *cls, enum MHD_ValueKind kind, const char *key,
const char *value)
{
struct httpd_request *r = (struct httpd_request*) cls;
append_key(r->interp, r, key, value, 0, strlen(value));
return MHD_YES;
}


static int handle_request(Jim_Interp *interp,
struct MHD_Connection * connection, const char * url)
{
struct MHD_Response * response;

int ret;
const char *suffix;
suffix = strrchr(url, '.');
if ((suffix != NULL) && (strcmp(suffix, ".tcl") == 0))
{
printf("Run tcl %s\n", url);

int retcode;

const char *script = alloc_printf(
"global httpdata; source {%s}; set httpdata", url);
retcode = Jim_Eval_Named(interp, script, __FILE__, __LINE__);
free((void *) script);

if (retcode != JIM_OK)
{
printf("Tcl failed\n");
const char *t = httpd_exec_cgi_tcl_error(interp);
if (t == NULL)
return MHD_NO;

response = MHD_create_response_from_data(strlen(t), (void *) t,
MHD_YES, MHD_NO);
ret = MHD_queue_response(connection,
MHD_HTTP_INTERNAL_SERVER_ERROR, response);
MHD_destroy_response(response);
return ret;
}
else
{
LOG_DEBUG("Tcl OK");
/* FIX!!! how to handle mime types??? */
const char *result;
int reslen;
result = Jim_GetString(Jim_GetResult(interp), &reslen);

response = MHD_create_response_from_data(reslen, (void *) result,
MHD_NO, MHD_YES);
ret = MHD_queue_response(connection,
MHD_HTTP_INTERNAL_SERVER_ERROR, response);
MHD_destroy_response(response);
return ret;
}
}
else
{
void *data;
size_t len;

int retval = loadFile(url, &data, &len);
if (retval != ERROR_OK)
{
printf("Did not find %s\n", url);

response = MHD_create_response_from_data(strlen(PAGE_NOT_FOUND),
(void *) PAGE_NOT_FOUND, MHD_NO, MHD_NO);
ret = MHD_queue_response(connection, MHD_HTTP_NOT_FOUND, response);
MHD_destroy_response(response);
return ret;
}

LOG_DEBUG("Serving %s length=%zu", url, len);
/* serve file directly */
response = MHD_create_response_from_data(len, data, MHD_YES, MHD_NO);
/* Should we expose mimetype via tcl here or just let the browser
guess?
MHD_add_response_header(response, "Content-Type", "image/png");
*/

ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
MHD_destroy_response(response);

//free(data);
return ret;
}
}

static int ahc_echo_inner(void * cls, struct MHD_Connection * connection,
const char * url, const char * method, const char * version,
const char * upload_data, size_t * upload_data_size, void ** ptr)
{
Jim_Interp *interp = (Jim_Interp *)cls;
int post = 0;

if (0 == strcmp(method, "POST"))
{
post = 1;
}
else if (0 == strcmp(method, "GET"))
{
}
else
{
return MHD_NO; /* unexpected method */
}

struct httpd_request *r;
if (*ptr == NULL)
{
/* The first time only the headers are valid,
do not respond in the first round... */

*ptr = malloc(sizeof(struct httpd_request));
if (*ptr == NULL)
return MHD_NO;
memset(*ptr, 0, sizeof(struct httpd_request));

r = (struct httpd_request *) *ptr;
r->interp = interp;
r->post = post;
Jim_SetVariableStr(interp, "httppostdata", Jim_NewDictObj(interp, NULL, 0));

/* fill in url query strings in dictionary */
MHD_get_connection_values(connection, MHD_GET_ARGUMENT_KIND,
record_arg, r);

if (r->post)
{
r->postprocessor = MHD_create_post_processor(connection, 2048
* 1024, &iterate_post, r);
}

return MHD_YES;
}

r = (struct httpd_request *) *ptr;

if (r->post)
{
/* consume post data */
if (*upload_data_size)
{
MHD_post_process(r->postprocessor, upload_data, *upload_data_size);
*upload_data_size = 0;
return MHD_YES;
}
else
{
}
} else
{
}

/* hand over to request who will be using it. */
// r->dict = NULL;


/* FIX!!!! we need more advanced handling of url's to avoid them
* being subverted to evil purposes
*/

const char *httpd_dir = PKGDATADIR "/httpd";

if (*url=='/')
{
url++; /* skip '/' */
}
if (!*url)
url="index.tcl";

const char *file_name = alloc_printf("%s/%s", httpd_dir, url);
int result = handle_request(interp, connection, file_name);
free((void *)file_name);
return result;
}


static int ahc_echo(void * cls, struct MHD_Connection * connection,
const char * url, const char * method, const char * version,
const char * upload_data, size_t * upload_data_size, void ** ptr)
{
int result;

openocd_sleep_postlude();

result = ahc_echo_inner(cls, connection, url, method, version, upload_data, upload_data_size, ptr);

openocd_sleep_prelude();

return result;
}

static struct MHD_Daemon * d;

static const struct command_registration httpd_command_handlers[] = {
{
.name = "formfetch",
.jim_handler = httpd_Jim_Command_formfetch,
.mode = COMMAND_EXEC,
.usage = "parameter_name",
.help = "Reads a posted form value.",
},
{
.name = "writeform",
.jim_handler = httpd_Jim_Command_writeform,
.mode = COMMAND_EXEC,
.usage = "parameter_name filename",
.help = "Writes a form value to a file.",
},
COMMAND_REGISTRATION_DONE
};

int httpd_start(struct command_context *cmd_ctx)
{
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutex_init(&mutex, &attr);

int port = 8888;
LOG_USER("Launching httpd server on port %d", port);
d = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, port, NULL, NULL,
&ahc_echo, cmd_ctx->interp,
MHD_OPTION_NOTIFY_COMPLETED, request_completed, NULL, /* Closure... what's that??? */
MHD_OPTION_END);
if (d == NULL)
return ERROR_FAIL;

return register_commands(cmd_ctx, NULL, httpd_command_handlers);
}

void httpd_stop(void)
{
MHD_stop_daemon(d);
pthread_mutex_destroy(&mutex);
}


+ 0
- 28
src/server/httpd.h View File

@@ -1,28 +0,0 @@
/***************************************************************************
* Copyright (C) 2009 Zachary T Welch <zw@superlucidity.net> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/

#ifndef OPENOCD_SERVER_HTTPD_H
#define OPENOCD_SERVER_HTTPD_H

struct command_context;

int httpd_start(struct command_context *cmd_ctx);
void httpd_stop(void);

#endif // OPENOCD_SERVER_HTTPD_H

BIN
src/server/httpd/Stylizer.class View File


+ 0
- 114
src/server/httpd/Stylizer.java View File

@@ -1,114 +0,0 @@
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/** used to generate .tcl files from */
public class Stylizer
{
// Global value so it can be ref'd by the tree-adapter
static Document document;
public static void main(String argv[])
{
if (argv.length != 3)
{
System.err.println("Usage: java Stylizer stylesheet xmlfile outputdir");
System.exit(1);
}
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try
{
System.err.println("Starting conversion...");
File stylesheet = new File(argv[0]);
File datafile = new File(argv[1]);
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(datafile);
NodeList list = XPathAPI.selectNodeList(document, "website/language/page");

for (int i=0; i<list.getLength(); i++)
{
Node node=list.item(i);
// Use a Transformer for output
TransformerFactory tFactory = TransformerFactory.newInstance();
StreamSource stylesource = new StreamSource(stylesheet);
Transformer transformer = tFactory.newTransformer(stylesource);
Node fileName = XPathAPI.selectSingleNode(node, "outfile/text()");
System.err.println("Converting " + fileName.getNodeValue());
DOMSource source = new DOMSource(document);
OutputStream output=new FileOutputStream(new File(argv[2], fileName.getNodeValue()));
try
{
StreamResult result = new StreamResult(output);
transformer.setParameter("pagetogenerate", fileName.getNodeValue());
transformer.transform(source, result);
}
finally
{
output.close();
}
}
} catch (TransformerConfigurationException tce)
{
// Error generated by the parser
System.out.println("\n** Transformer Factory error");
System.out.println(" " + tce.getMessage());
// Use the contained exception, if any
Throwable x = tce;
if (tce.getException() != null)
x = tce.getException();
x.printStackTrace();
} catch (TransformerException te)
{
// Error generated by the parser
System.out.println("\n** Transformation error");
System.out.println(" " + te.getMessage());
// Use the contained exception, if any
Throwable x = te;
if (te.getException() != null)
x = te.getException();
x.printStackTrace();
} catch (SAXException sxe)
{
// Error generated by this application
// (or a parser-initialization error)
Exception x = sxe;
if (sxe.getException() != null)
x = sxe.getException();
x.printStackTrace();
} catch (ParserConfigurationException pce)
{
// Parser with specified options can't be built
pce.printStackTrace();
} catch (IOException ioe)
{
// I/O error
ioe.printStackTrace();
}
} // main
}

+ 0
- 454
src/server/httpd/browsemem.tcl View File

@@ -1,454 +0,0 @@
# converted to .tcl by html2tcl.tcl
set buffer ""
append buffer {


















<html xmlns="http://www.w3.org/TR/REC-html40">
<head>
<title>OpenOCD debugger</title>
<meta charset="utf-8" content="text/html" http-equiv="Content-Type"/>
<link type="text/css" rel="stylesheet" href="menuweb.css"/>
</head>
}

set console ""
set upload_filename /ram/upload
append buffer {
<body style="margin:0px;">
<div style="width:974px;height:85px;">
<div style="float:left;position:relative;left:32px;width:478px;">
<a href="/">
OpenOCD
</a>
</div>
<div style="float:left;position:relative;height:26px; width:278px;left:122px;background-image:url('menu_cuts/top_right.png');">
<div style="position:relative;left:15px;top:4px;" class="textlight">
}
append buffer [capture version]
append buffer {
</div>
</div>
</div>
<table style="padding:0px;border-collapse:collapse;">
<tr>
<td style="width:33px;">
<div style="width:20px;height:510px;">
&nbsp;
</div>
</td>
<td style="vertical-align:top;height:100%;width:140px;padding:0px;">
<table style="padding:0px;border-collapse:collapse;height:100%;width:140px;">
<tr style="height:59px;">
<td/>
</tr>
<tr>
<td style="width:140px;height:38px;background-image:url('menu_cuts/v_tab_selected.png');background-repeat: no-repeat;">
<div style="position:relative;left:10px;top:10px;font-weight:bold;">
<a href="browsemem.tcl" style="font-weight: bold;">Browse / Edit</a>
</div>
</td>
</tr>
<tr>
<td style="width:140px;height:38px;background-image:url('menu_cuts/v_tab.png');background-repeat: no-repeat;">
<div style="position:relative;left:10px;top:10px;font-weight:bold;">
<a href="downloadmem.tcl" style="">Download</a>
</div>
</td>
</tr>
<tr>
<td style="width:140px;height:35px;background-image:url('menu_cuts/v_1.png')"/>
</tr>
<tr>
<td style="width:140px;background-image:url('menu_cuts/v_2_tile.png')"/>
</tr>
<tr>
<td style="width:140px;height:140px;background-image:url('menu_cuts/v_3.png')"/>
</tr>
</table>
</td>
<td style="vertical-align:top;padding:0px;height:100%">
<table style="padding:0px;border-collapse:collapse;height:100%;">
<tr>
<td>
<table style="padding:0px;border-collapse:collapse;">
<tr>
<td style="width:103px;height:29px;background-image:url('menu_cuts/h_tab1.png');background-repeat: no-repeat;">
<div style="position:relative;top:7px;font-weight:bold;text-align:center;width:100px;">
<a href="index.tcl">Config Target</a>
</div>
</td>
<td style="width:103px;height:29px;background-image:url('menu_cuts/h_tab1.png');background-repeat: no-repeat;">
<div style="position:relative;top:7px;font-weight:bold;text-align:center;width:100px;">
<a href="flashinfo.tcl">Flash</a>
</div>
</td>
<td style="width:103px;height:29px;background-image:url('menu_cuts/h_tab1_selected.png');background-repeat: no-repeat;">
<div style="position:relative;top:7px;font-weight:bold;text-align:center;width:100px;">
<a href="browsemem.tcl" style="font-weight: bold;">Memory</a>
</div>
</td>
<td style="width:103px;height:29px;background-image:url('menu_cuts/h_tab1.png');background-repeat: no-repeat;">
<div style="position:relative;top:7px;font-weight:bold;text-align:center;width:100px;">
<a href="openocd.tcl">OpenOCD</a>
</div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td style="height:30px;width:535px;background-image:url('menu_cuts/center_top.png');background-repeat: no-repeat;background-position:top right;" colspan="6">
<div style="width:500px;background-color:#ffffff;height:100%;">
&nbsp;
</div>
</td>
</tr>
<tr>
<td style="background-color:#ffffff;text-indent:30px;height:40px;" colspan="6">
<H1>Browse / Edit Memory</H1>
</td>
</tr>
<tr style="height:100%;">
<td style="background-color:#ffffff;padding-left:30px;padding-right:30px;width=535px;height:100%;" colspan="6">


}

set form_address [formfetch form_address]
set form_length [formfetch form_length]
set form_type [formfetch form_type]
set form_action [formfetch form_action]
set form_value [formfetch form_value]
if {[string compare $form_length ""]==0} {
set form_length 0
}
if {$form_length<=0} {
set form_length 0x80
}
if {$form_length>0x1000} {
set form_length 0x1000
}
if {[string compare $form_type ""]==0} {
set form_type mdw
}
if {[string compare $form_type "mdw"]==0} {
set wordsize 4
set modify_cmd mww
}
if {[string compare $form_type "mdh"]==0} {
set wordsize 2
set modify_cmd mwh
}
if {[string compare $form_type "mdb"]==0} {
set wordsize 1
set modify_cmd mwb
}
if {[string compare $form_address ""]!=0} {
if {[string compare $form_action "Previous"]==0} {
# Kludge! Work around problems parsing hex in Jim Tcl expressions
incr form_address ; set form_address [expr $form_address-1]
if {$form_address-$form_length>0} {
set form_address "0x[tohex [expr $form_address-$form_length]]"
} else {
set form_address "0x0"
}
}
if {[string compare $form_action "Next"]==0} {
# Kludge! Work around problems parsing hex in Jim Tcl expressions
incr form_address ; set form_address [expr $form_address-1]
set form_address "0x[tohex [expr $form_address+$form_length]]"
}
if {[string compare $form_action "Modify"]==0} {
append console [capture_catch "$modify_cmd $form_address $form_value"]
}
if {[string compare $form_action "Fill"]==0} {
append console [capture_catch "$modify_cmd $form_address $form_value $form_length"]
}
}
append buffer {
<form action="browsemem.tcl" method="post">
<table>
<tr><td class="formtext">Address</td><td><input type="text" name="form_address" value="}
append buffer $form_address
append buffer {"></td></tr>
<tr><td class="formtext">Length</td><td><input type="text" name="form_length" value="}
append buffer "0x[tohex $form_length]"
append buffer {"></td></tr>
<tr><td class="formtext">Value</td><td><input type="text" name="form_value" value="}
append buffer $form_value
append buffer {"></td>
<td class="buttonspacesmall">&nbsp</td><td><input type="submit" name="form_action" value="Modify"></td>
<td class="buttonspacesmall">&nbsp</td><td><input type="submit" name="form_action" value="Fill"></td></tr>
<tr><td class="formtext">Type</td><td style="padding-top:1px;">
<select name="form_type">
<option
}
if {[string compare $form_type "mdb"]==0} { append buffer {selected="selected"} }
append buffer { value ="mdb">8 bit
</option>
<option
}
if {[string compare $form_type "mdh"]==0} { append buffer {selected="selected"} }
append buffer { value ="mdh">16 bit
</option>
<option
}
if {[string compare $form_type "mdw"]==0} { append buffer {selected="selected"} }
append buffer {value ="mdw">32 bit
</option>
</select>
</td></tr>
</table>
<table>
<tr><td style="height:15px;width:535px;">&nbsp</td></tr>
<tr><td style="height:1px;width:535px;background-color:#a2c5d1;"></td></tr>
<tr><td style="height:15px;width:535px;">&nbsp</td></tr>
</table>
<table><tr>
<td><input type="submit" name="form_action" value="Refresh"></td>
<td class="buttonspacesmall">&nbsp</td><td><input type="submit" name="form_action" value="Previous" ></td>
<td class="buttonspacesmall">&nbsp</td><td><input type="submit" name="form_action" value="Next" ></td>
</tr></table>
<br>
</form>
<p>
<div class="fontbigger">Memory:</div><p>
<code style="white-space: nowrap; font-size:11px;font:courier new;">
}

if {[string compare $form_address ""]!=0} {
append console [encode [capture_catch halt]]
append buffer [encode [capture_catch "$form_type $form_address [expr $form_length]"]]
}
append buffer {
</code>



</td>
</tr>
}

set toggle_details [formfetch toggle_details]
if {[string length $toggle_details]==0} {
set toggle_details 0
}
set show_details [load_var show_details]
if {[string length $show_details]==0} {
set show_details 0
}
if {$toggle_details==1} {
set show_details [expr 1-$show_details]
save_var show_details $show_details
}
if {[string length $console]!=0} {
append buffer {
<tr style="height:100%;">
<td style="height:100%;background-color:red;" colspan="6">
<table style="padding:0px;border-collapse:collapse;background-color:#ffffff;width:100%" class="textgray">
<td style="width:25px;">&nbsp;</td>
}

if {$show_details==1} {
append buffer <
append buffer {td style="background-color:#dddddd;padding-left:5px;padding-right:5px;padding-top:3px;padding-bottom:3px;"}
append buffer >
} else {
append buffer <
append buffer {td style="background-image:url('menu_cuts/h_tab_free.png');width:110px;height:29px;background-repeat: no-repeat;background-position:top left;"}
append buffer >
}
append buffer {
<a class="openocd" href="browsemem.tcl?toggle_details=1">
}

if {$show_details==1} {
append buffer "Hide details"
append buffer <br/>
} else {
append buffer {<div style="position:relative;top:7px;text-align:center;">}
append buffer "Show details"
append buffer {</div>}
}
append buffer {
</a>
}

if {$show_details==1} {
append buffer $console
}
append buffer {</td>}

if {$show_details!=1} {
append buffer {<td>&nbsp;</td>}
}
append buffer {
<td style="width:25px;">&nbsp;</td>
</table>
</td>
</tr>
}

}
append buffer {
<tr>
<td style="height:30px;background-image:url('menu_cuts/center_bottom.png');background-repeat: no-repeat;background-position:top right;" colspan="6">
<div style="width:500px;background-color:#ffffff;height:100%;">
&nbsp;
</div>
</td>
</tr>
</table>
</td>
<td style="width:6px;"/>
<td style="width:245px;height:100%">
<table style="padding:0px;border-collapse:collapse;height:100%;">
<tr>
<td style="width:103px;height:29px;background-image:url('menu_cuts/h_tab2_selected.png');background-repeat: no-repeat;">
<div style="position:relative;top:7px;;font-weight:bold;text-align:center;width:100px;" class="textgray">
Documentation
</div>
</td>
<td width="40px">
&nbsp;
</td>
<td/>
</tr>
<tr>
<td style="height:10px;width:245px;background-image:url('menu_cuts/right_top_small.png');" colspan="3"/>
</tr>
<tr>
<td style="background-color:#d8d7d7;width:245px;padding-left:10px;padding-buttom:10px;line-height:17px;" colspan="3">
<a target="_blank" href="http://openocd.berlios.de/doc/openocd.pdf">OpenOCD Manual</a>
<br/>
</td>
</tr>
<tr>
<td style="background-color:#d8d7d7;height:15px;" colspan="3"/>
</tr>
<tr>
<td colspan="3">
<table style="padding:0px;border-collapse:collapse;">
<td style="background-color:#d8d7d7;width:10px;height:1px"/>
<td style="background-color:#999999;width:225px; height:1px;"/>
<td style="background-color:#d8d7d7;width:10px;height:1px"/>
</table>
</td>
</tr>
<tr>
<td style="background-color:#d8d7d7;height:15px;" colspan="3"/>
</tr>
<tr style="height:100%;">
<td style="height:100%;background-color:#d8d7d7;padding-left:10px;padding-right:10px;" colspan="3" class="textgray">
<p>Browse and edit target memory.<br>
Length is in bytes, maximum 4096 bytes.</p>
<p>An error message is shown when trying to browse or edit memory which cases a CPU fault.</p>
<p>CPU will be halted if required.</p>
<p><b>Modify</b> - Will modify only one byte, half-word or word starting at Address.</p>
<p><b>Fill</b> - Will fill the specified region with the specified value.</p>
<p><b>Refresh</b> - Display the content of the specified memory area.</p>
</td>
</tr>
<tr>
<td style="height:30px;background-image:url('menu_cuts/right_bottom.png');" colspan="3">
&nbsp;
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>















}

start_chunked "html"
write_chunked $buffer
end_chunked


+ 0
- 5
src/server/httpd/build.sh View File

@@ -1,5 +0,0 @@
set e
java -classpath ../../../../zy1000/build/xalan.jar\;. Stylizer menu.xsl menu.xml .
find . -regex ".*\.tcl" -type f -exec sh html2tcl.sh {} {} \;
echo "Copy .tcl files to /usr/local/lib/openocd/httpd/"
cp *.tcl /usr/local/lib/openocd/httpd/

+ 0
- 366
src/server/httpd/downloadmem.tcl View File

@@ -1,366 +0,0 @@
# converted to .tcl by html2tcl.tcl
set buffer ""
append buffer {





















<html xmlns="http://www.w3.org/TR/REC-html40">
<head>
<title>OpenOCD debugger</title>
<meta charset="utf-8" content="text/html" http-equiv="Content-Type"/>
<link type="text/css" rel="stylesheet" href="menuweb.css"/>
</head>
}

set console ""
set upload_filename /ram/upload
append buffer {
<body style="margin:0px;">
<div style="width:974px;height:85px;">
<div style="float:left;position:relative;left:32px;width:478px;">
<a href="/">
OpenOCD
</a>
</div>
<div style="float:left;position:relative;height:26px; width:278px;left:122px;background-image:url('menu_cuts/top_right.png');">
<div style="position:relative;left:15px;top:4px;" class="textlight">
}
append buffer [capture version]
append buffer {
</div>
</div>
</div>
<table style="padding:0px;border-collapse:collapse;">
<tr>
<td style="width:33px;">
<div style="width:20px;height:510px;">
&nbsp;
</div>
</td>
<td style="vertical-align:top;height:100%;width:140px;padding:0px;">
<table style="padding:0px;border-collapse:collapse;height:100%;width:140px;">
<tr style="height:59px;">
<td/>
</tr>
<tr>
<td style="width:140px;height:38px;background-image:url('menu_cuts/v_tab.png');background-repeat: no-repeat;">
<div style="position:relative;left:10px;top:10px;font-weight:bold;">
<a href="browsemem.tcl" style="">Browse / Edit</a>
</div>
</td>
</tr>
<tr>
<td style="width:140px;height:38px;background-image:url('menu_cuts/v_tab_selected.png');background-repeat: no-repeat;">
<div style="position:relative;left:10px;top:10px;font-weight:bold;">
<a href="downloadmem.tcl" style="font-weight: bold;">Download</a>
</div>
</td>
</tr>
<tr>
<td style="width:140px;height:35px;background-image:url('menu_cuts/v_1.png')"/>
</tr>
<tr>
<td style="width:140px;background-image:url('menu_cuts/v_2_tile.png')"/>
</tr>
<tr>
<td style="width:140px;height:140px;background-image:url('menu_cuts/v_3.png')"/>
</tr>
</table>
</td>
<td style="vertical-align:top;padding:0px;height:100%">
<table style="padding:0px;border-collapse:collapse;height:100%;">
<tr>
<td>
<table style="padding:0px;border-collapse:collapse;">
<tr>
<td style="width:103px;height:29px;background-image:url('menu_cuts/h_tab1.png');background-repeat: no-repeat;">
<div style="position:relative;top:7px;font-weight:bold;text-align:center;width:100px;">
<a href="index.tcl">Config Target</a>
</div>
</td>
<td style="width:103px;height:29px;background-image:url('menu_cuts/h_tab1.png');background-repeat: no-repeat;">
<div style="position:relative;top:7px;font-weight:bold;text-align:center;width:100px;">
<a href="flashinfo.tcl">Flash</a>
</div>
</td>
<td style="width:103px;height:29px;background-image:url('menu_cuts/h_tab1_selected.png');background-repeat: no-repeat;">
<div style="position:relative;top:7px;font-weight:bold;text-align:center;width:100px;">
<a href="browsemem.tcl" style="font-weight: bold;">Memory</a>
</div>
</td>
<td style="width:103px;height:29px;background-image:url('menu_cuts/h_tab1.png');background-repeat: no-repeat;">
<div style="position:relative;top:7px;font-weight:bold;text-align:center;width:100px;">
<a href="openocd.tcl">OpenOCD</a>
</div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td style="height:30px;width:535px;background-image:url('menu_cuts/center_top.png');background-repeat: no-repeat;background-position:top right;" colspan="6">
<div style="width:500px;background-color:#ffffff;height:100%;">
&nbsp;
</div>
</td>
</tr>
<tr>
<td style="background-color:#ffffff;text-indent:30px;height:40px;" colspan="6">
<H1>Download Memory Range</H1>
</td>
</tr>
<tr style="height:100%;">
<td style="background-color:#ffffff;padding-left:30px;padding-right:30px;width=535px;height:100%;" colspan="6">
}

set form_address [formfetch form_address]
set form_length [formfetch form_length]
set form_action [formfetch form_action]
append buffer {
<form action="downloadmem.tcl" method="post">
<table>
<tr><td class="formtext">Address</td><td><input type="text" name="form_address" value="}
append buffer $form_address
append buffer {"></td></tr>
<tr><td class="formtext">Length</td><td><input type="text" name="form_length" value="}
append buffer $form_length
append buffer {"></td></tr>
</td></tr>
</table>

<table>
<tr><td style="height:15px;width:535px;">&nbsp</td></tr>
<tr><td style="height:1px;width:535px;background-color:#a2c5d1;"></td></tr>
<tr><td style="height:15px;width:535px;">&nbsp</td></tr>
</table>
<input type="submit" value="Download" name="form_action">
</form>
}

if {[string compare $form_action "Download"]==0} {
append console [encode [capture_catch "reset init"]]
append console [encode [capture_catch "dump_image /tmp/dump.bin $form_address $form_length"]]
append buffer {
<form action="../dump.bin" target="_blank">
<input type="submit" name="form_action" value="Save downloaded memory">
</form>
}
}
append buffer {


</td>
</tr>
}

set toggle_details [formfetch toggle_details]
if {[string length $toggle_details]==0} {
set toggle_details 0
}
set show_details [load_var show_details]
if {[string length $show_details]==0} {
set show_details 0
}
if {$toggle_details==1} {
set show_details [expr 1-$show_details]
save_var show_details $show_details
}
if {[string length $console]!=0} {
append buffer {
<tr style="height:100%;">
<td style="height:100%;background-color:red;" colspan="6">
<table style="padding:0px;border-collapse:collapse;background-color:#ffffff;width:100%" class="textgray">
<td style="width:25px;">&nbsp;</td>
}

if {$show_details==1} {
append buffer <
append buffer {td style="background-color:#dddddd;padding-left:5px;padding-right:5px;padding-top:3px;padding-bottom:3px;"}
append buffer >
} else {
append buffer <
append buffer {td style="background-image:url('menu_cuts/h_tab_free.png');width:110px;height:29px;background-repeat: no-repeat;background-position:top left;"}
append buffer >
}
append buffer {
<a class="openocd" href="downloadmem.tcl?toggle_details=1">
}

if {$show_details==1} {
append buffer "Hide details"
append buffer <br/>
} else {
append buffer {<div style="position:relative;top:7px;text-align:center;">}
append buffer "Show details"
append buffer {</div>}
}
append buffer {
</a>
}

if {$show_details==1} {
append buffer $console
}
append buffer {</td>}

if {$show_details!=1} {
append buffer {<td>&nbsp;</td>}
}
append buffer {
<td style="width:25px;">&nbsp;</td>
</table>
</td>
</tr>
}

}
append buffer {
<tr>
<td style="height:30px;background-image:url('menu_cuts/center_bottom.png');background-repeat: no-repeat;background-position:top right;" colspan="6">
<div style="width:500px;background-color:#ffffff;height:100%;">
&nbsp;
</div>
</td>
</tr>
</table>
</td>
<td style="width:6px;"/>
<td style="width:245px;height:100%">
<table style="padding:0px;border-collapse:collapse;height:100%;">
<tr>
<td style="width:103px;height:29px;background-image:url('menu_cuts/h_tab2_selected.png');background-repeat: no-repeat;">
<div style="position:relative;top:7px;;font-weight:bold;text-align:center;width:100px;" class="textgray">
Documentation
</div>
</td>
<td width="40px">
&nbsp;
</td>
<td/>
</tr>
<tr>
<td style="height:10px;width:245px;background-image:url('menu_cuts/right_top_small.png');" colspan="3"/>
</tr>
<tr>
<td style="background-color:#d8d7d7;width:245px;padding-left:10px;padding-buttom:10px;line-height:17px;" colspan="3">
<a target="_blank" href="http://openocd.berlios.de/doc/openocd.pdf">OpenOCD Manual</a>
<br/>
</td>
</tr>
<tr>
<td style="background-color:#d8d7d7;height:15px;" colspan="3"/>
</tr>
<tr>
<td colspan="3">
<table style="padding:0px;border-collapse:collapse;">
<td style="background-color:#d8d7d7;width:10px;height:1px"/>
<td style="background-color:#999999;width:225px; height:1px;"/>
<td style="background-color:#d8d7d7;width:10px;height:1px"/>
</table>
</td>
</tr>
<tr>
<td style="background-color:#d8d7d7;height:15px;" colspan="3"/>
</tr>
<tr style="height:100%;">
<td style="height:100%;background-color:#d8d7d7;padding-left:10px;padding-right:10px;" colspan="3" class="textgray">
Download memory from target. <br>
<b>Note</b> that download memory can take
a long time(potentially minutes for megabytes at low JTAG clk speeds).
<p/>
Once the memory is downloaded a link is available on the page to download
the file to your PC.
</td>
</tr>
<tr>
<td style="height:30px;background-image:url('menu_cuts/right_bottom.png');" colspan="3">
&nbsp;
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>












}

start_chunked "html"
write_chunked $buffer
end_chunked


+ 0
- 462
src/server/httpd/editconfigs.tcl View File

@@ -1,462 +0,0 @@
# converted to .tcl by html2tcl.tcl
set buffer ""
append buffer {



<html xmlns="http://www.w3.org/TR/REC-html40">
<head>
<title>Zylin ZY1000 JTAG debugger</title>
<meta charset="utf-8" content="text/html" http-equiv="Content-Type"/>
<link type="text/css" rel="stylesheet" href="menuweb.css"/>
</head>
}

set console ""
set upload_filename /ram/upload
append buffer {
<body style="margin:0px;">
<div style="width:974px;height:85px;">
<div style="float:left;position:relative;left:32px;width:478px;">
<a href="/">
<img src="menu_cuts/logo_top.png" style="border:0px;"/>
</a>
</div>
<div style="float:left;position:relative;height:26px; width:278px;left:122px;background-image:url('menu_cuts/top_right.png');">
<div style="position:relative;left:15px;top:4px;" class="textlight">
}
append buffer [capture version]
append buffer {
</div>
</div>
</div>
<table style="padding:0px;border-collapse:collapse;">
<tr>
<td style="width:33px;">
<div style="width:20px;height:510px;">
&nbsp;
</div>
</td>
<td style="vertical-align:top;height:100%;width:140px;padding:0px;">
<table style="padding:0px;border-collapse:collapse;height:100%;width:140px;">
<tr style="height:59px;">
<td/>
</tr>
<tr>
<td style="width:140px;height:38px;background-image:url('menu_cuts/v_tab.png');background-repeat: no-repeat;">
<div style="position:relative;left:10px;top:10px;font-weight:bold;">
<a href="index.tcl" style="">Target Status</a>
</div>
</td>
</tr>
<tr>
<td style="width:140px;height:38px;background-image:url('menu_cuts/v_tab.png');background-repeat: no-repeat;">
<div style="position:relative;left:10px;top:10px;font-weight:bold;">
<a href="preconfig.tcl" style="">Select Target Config</a>
</div>
</td>
</tr>
<tr>
<td style="width:140px;height:38px;background-image:url('menu_cuts/v_tab_selected.png');background-repeat: no-repeat;">
<div style="position:relative;left:10px;top:10px;font-weight:bold;">
<a href="editconfigs.tcl" style="font-weight: bold;">Edit Configurations</a>
</div>
</td>
</tr>
<tr>
<td style="width:140px;height:38px;background-image:url('menu_cuts/v_tab.png');background-repeat: no-repeat;">
<div style="position:relative;left:10px;top:10px;font-weight:bold;">
<a href="reload.tcl" style="">Reload Config Scripts</a>
</div>
</td>
</tr>
<tr>
<td style="width:140px;height:35px;background-image:url('menu_cuts/v_1.png')"/>
</tr>
<tr>
<td style="width:140px;background-image:url('menu_cuts/v_2_tile.png')"/>
</tr>
<tr>
<td style="width:140px;height:140px;background-image:url('menu_cuts/v_3.png')"/>
</tr>
</table>
</td>
<td style="vertical-align:top;padding:0px;height:100%">
<table style="padding:0px;border-collapse:collapse;height:100%;">
<tr>
<td>
<table style="padding:0px;border-collapse:collapse;">
<tr>
<td style="width:103px;height:29px;background-image:url('menu_cuts/h_tab1_selected.png');background-repeat: no-repeat;">
<div style="position:relative;top:7px;font-weight:bold;text-align:center;width:100px;">
<a href="index.tcl" style="font-weight: bold;">Config Target</a>
</div>
</td>
<td style="width:103px;height:29px;background-image:url('menu_cuts/h_tab1.png');background-repeat: no-repeat;">
<div style="position:relative;top:7px;font-weight:bold;text-align:center;width:100px;">
<a href="flashinfo.tcl">Flash</a>
</div>
</td>
<td style="width:103px;height:29px;background-image:url('menu_cuts/h_tab1.png');background-repeat: no-repeat;">
<div style="position:relative;top:7px;font-weight:bold;text-align:center;width:100px;">
<a href="browsemem.tcl">Memory</a>
</div>
</td>
<td style="width:103px;height:29px;background-image:url('menu_cuts/h_tab1.png');background-repeat: no-repeat;">
<div style="position:relative;top:7px;font-weight:bold;text-align:center;width:100px;">
<a href="openocd.tcl">OpenOCD</a>
</div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td style="height:30px;width:535px;background-image:url('menu_cuts/center_top.png');background-repeat: no-repeat;background-position:top right;" colspan="6">
<div style="width:500px;background-color:#ffffff;height:100%;">
&nbsp;
</div>
</td>
</tr>
<tr>
<td style="background-color:#ffffff;text-indent:30px;height:40px;" colspan="6">
<H1>Edit Target Configurations</H1>
</td>
</tr>
<tr style="height:100%;">
<td style="background-color:#ffffff;padding-left:30px;padding-right:30px;width=535px;height:100%;" colspan="6">
<form action="editconfigs.tcl" method="post">
}

set form_edittext [formfetch form_edittext]
set form_action [formfetch form_action]
set form_filename [formfetch form_filename]
set form_selected [formfetch form_selected]
if {[string compare $form_action "Load"]==0} {
set form_filename $form_selected
}
if {[string compare $form_action "Delete"]==0} {
capture_catch "rm /config/settings/$form_selected"
}
if {[string compare $form_action "Save"]==0} {
save_var $form_filename [from_textarea $form_edittext]
append buffer "Wrote file $form_filename<br>"
}
set form_edittext ""
# load original or script saved on disk.
if {[string compare $form_action "Show default"]==0} {
set form_edittext [load_file "/rom/$form_selected"]
set form_filename $form_selected
} else {
set form_edittext [load_config $form_filename]
}
set form_edittext_subst [to_textarea $form_edittext]
proc prepend { val list } {
set res ""
foreach value $list {
set t $val
append t $value
lappend res $t
}
return $res
}
set files [prepend target/ [ls /rom/target]]
set files [lunion $files [prepend event/ [ls /config/settings/event]]]
set files [lunion $files [prepend target/ [ls /config/settings/target]]]
set files [lsort $files]
append buffer {
<table style="padding:0px;border-collapse:collapse;"><tr>
<td style="padding-top:1px;"><select name="form_selected">
}

set foundTarget 0
foreach i $files {
append buffer {
<option
}

if {[string compare $form_filename $i]==0} {
set foundTarget 1
append buffer {selected="selected"}
}
append buffer {
value="}
append buffer $i
append buffer {">}
append buffer $i
append buffer {</option>
}

}
if {$foundTarget==0} {
append buffer {
<option selected="selected" value="">Select target config</option>
}

}
append buffer {
</select></td>
<td class="buttonspacesmall">&nbsp</td>
<td><input type="submit" value="Load" name="form_action"></td>
<td class="buttonspacesmall">&nbsp</td>
<td><input type="submit" value="Show default" name="form_action"></td>
<td class="buttonspacesmall">&nbsp</td>
<td><input type="submit" value="Delete" name="form_action"></td>
</tr></table>
<textarea style="overflow:auto;" rows="21" cols="65" name="form_edittext" wrap="off">}
append buffer $form_edittext_subst
append buffer {</textarea>
<table style="padding:0px;border-collapse:collapse;"><tr>
}

append buffer {<td class="formtext">File</td><td><input type="text" name="form_filename" } "\n"
append buffer "value=\"$form_filename\" ></td>\n"
append buffer {<td class="buttonspacesmall">&nbsp</td><td><input type="submit" value="Save" name="form_action"></td><br>} "\n"
append buffer {</tr></table>} "\n"
append buffer {
</form>
</td>
</tr>
}

set toggle_details [formfetch toggle_details]
if {[string length $toggle_details]==0} {
set toggle_details 0
}
set show_details [load_var show_details]
if {[string length $show_details]==0} {
set show_details 0
}
if {$toggle_details==1} {
set show_details [expr 1-$show_details]
save_var show_details $show_details
}
if {[string length $console]!=0} {
append buffer {
<tr style="height:100%;">
<td style="height:100%;background-color:red;" colspan="6">
<table style="padding:0px;border-collapse:collapse;background-color:#ffffff;width:100%" class="textgray">
<td style="width:25px;">&nbsp;</td>
}

if {$show_details==1} {
append buffer <
append buffer {td style="background-color:#dddddd;padding-left:5px;padding-right:5px;padding-top:3px;padding-bottom:3px;"}
append buffer >
} else {
append buffer <
append buffer {td style="background-image:url('menu_cuts/h_tab_free.png');width:110px;height:29px;background-repeat: no-repeat;background-position:top left;"}
append buffer >
}
append buffer {
<a class="openocd" href="editconfigs.tcl?toggle_details=1">
}

if {$show_details==1} {
append buffer "Hide details"
append buffer <br/>
} else {
append buffer {<div style="position:relative;top:7px;text-align:center;">}
append buffer "Show details"
append buffer {</div>}
}
append buffer {
</a>
}

if {$show_details==1} {
append buffer $console
}
append buffer {</td>}

if {$show_details!=1} {
append buffer {<td>&nbsp;</td>}
}
append buffer {
<td style="width:25px;">&nbsp;</td>
</table>
</td>
</tr>
}

}
append buffer {
<tr>
<td style="height:30px;background-image:url('menu_cuts/center_bottom.png');background-repeat: no-repeat;background-position:top right;" colspan="6">
<div style="width:500px;background-color:#ffffff;height:100%;">
&nbsp;
</div>
</td>
</tr>
</table>
</td>
<td style="width:6px;"/>
<td style="width:245px;height:100%">
<table style="padding:0px;border-collapse:collapse;height:100%;">
<tr>
<td style="width:103px;height:29px;background-image:url('menu_cuts/h_tab2_selected.png');background-repeat: no-repeat;">
<div style="position:relative;top:7px;;font-weight:bold;text-align:center;width:100px;" class="textgray">
Documentation
</div>
</td>
<td width="40px">
&nbsp;
</td>
<td/>
</tr>
<tr>
<td style="height:10px;width:245px;background-image:url('menu_cuts/right_top_small.png');" colspan="3"/>
</tr>
<tr>
<td style="background-color:#d8d7d7;width:245px;padding-left:10px;padding-buttom:10px;line-height:17px;" colspan="3">
<a target="_blank" href="http://www.zylin.com/zy1000/ZY1000_Quick_Start_Guide.pdf">Quick Start Manual</a>
<br/>
<a target="_blank" href="http://www.zylin.com/zy1000/openocd.pdf">OpenOCD Manual</a>
<br/>
<a target="_blank" href="http://www.zylin.com/zy1000_contact.html">Contact Zylin AS</a>
</td>
</tr>
<tr>
<td style="background-color:#d8d7d7;height:15px;" colspan="3"/>
</tr>
<tr>
<td colspan="3">
<table style="padding:0px;border-collapse:collapse;">
<td style="background-color:#d8d7d7;width:10px;height:1px"/>
<td style="background-color:#999999;width:225px; height:1px;"/>
<td style="background-color:#d8d7d7;width:10px;height:1px"/>
</table>
</td>
</tr>
<tr>
<td style="background-color:#d8d7d7;height:15px;" colspan="3"/>
</tr>
<tr style="height:100%;">
<td style="height:100%;background-color:#d8d7d7;padding-left:10px;padding-right:10px;" colspan="3" class="textgray">
<p>Here you can edit predefined target configurations, restore predefined configurations to
default state and create new target configurations.<p/>
<p>Typically when creating a new target configuration, you would take an existing
configuration that resembles the most your needs and modify it for your
purposes and save it under a different name.</p>
<p><b>Load</b> - Loads a configuration file into the editor.</p>
<p><b>Show default</b> - Loads the firmware included version of the
configuration file (if any), into the editor.<br>
<b>Note</b> that the editor content is not saved.</p>
<p><b>Delete</b> - Deletes a custom created configuration file.<br>
<b>Note</b> that firmware included configuration files can not be deleted.</p>
<p><b>Save</b> - Save the edited file under the a new or the same name.</p>
</td>
</tr>
<tr>
<td style="height:30px;background-image:url('menu_cuts/right_bottom.png');" colspan="3">
&nbsp;
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td/>
<td>
<img border="0" src="menu_cuts/logo_bottom.png"/>
</td>
</tr>
</table>
</body>
</html>