diff --git a/esp-link/cgiwebserversetup.c b/esp-link/cgiwebserversetup.c
index 19bc1c5..2a25950 100644
--- a/esp-link/cgiwebserversetup.c
+++ b/esp-link/cgiwebserversetup.c
@@ -9,28 +9,31 @@
#include "config.h"
#include "web-server.h"
-int html_offset = 0;
-int html_header_len = 0;
+int upload_offset = 0; // flash offset where to store page upload
+int html_header_len = 0; // HTML header length (for uploading HTML files)
+
+// this is the header to add if user uploads HTML file
const char * HTML_HEADER = "
esp-link"
""
" ";
+// multipart callback for uploading user defined pages
int ICACHE_FLASH_ATTR webServerSetupMultipartCallback(MultipartCmd cmd, char *data, int dataLen, int position)
{
switch(cmd)
{
case FILE_START:
- html_offset = 0;
+ upload_offset = 0;
html_header_len = 0;
// simple HTML file
- if( ( dataLen > 5 ) && ( os_strcmp(data + dataLen - 5, ".html") == 0 ) )
+ if( ( dataLen > 5 ) && ( os_strcmp(data + dataLen - 5, ".html") == 0 ) ) // if the file ends with .html, wrap into an espfs image
{
// write the start block on esp-fs
int spi_flash_addr = getUserPageSectionStart();
spi_flash_erase_sector(spi_flash_addr/SPI_FLASH_SEC_SIZE);
EspFsHeader hdr;
- hdr.magic = 0xFFFFFFFF;
+ hdr.magic = 0xFFFFFFFF; // espfs magic is invalid during upload
hdr.flags = 0;
hdr.compression = 0;
@@ -41,25 +44,25 @@ int ICACHE_FLASH_ATTR webServerSetupMultipartCallback(MultipartCmd cmd, char *da
hdr.nameLen = len;
hdr.fileLenComp = hdr.fileLenDecomp = 0xFFFFFFFF;
- spi_flash_write( spi_flash_addr + html_offset, (uint32_t *)(&hdr), sizeof(EspFsHeader) );
- html_offset += sizeof(EspFsHeader);
+ spi_flash_write( spi_flash_addr + upload_offset, (uint32_t *)(&hdr), sizeof(EspFsHeader) );
+ upload_offset += sizeof(EspFsHeader);
char nameBuf[len];
os_memset(nameBuf, 0, len);
os_memcpy(nameBuf, data, dataLen);
- spi_flash_write( spi_flash_addr + html_offset, (uint32_t *)(nameBuf), len );
- html_offset += len;
+ spi_flash_write( spi_flash_addr + upload_offset, (uint32_t *)(nameBuf), len );
+ upload_offset += len;
html_header_len = os_strlen(HTML_HEADER) & ~3; // upload only 4 byte aligned part
char buf[html_header_len];
os_memcpy(buf, HTML_HEADER, html_header_len);
- spi_flash_write( spi_flash_addr + html_offset, (uint32_t *)(buf), html_header_len );
- html_offset += html_header_len;
+ spi_flash_write( spi_flash_addr + upload_offset, (uint32_t *)(buf), html_header_len );
+ upload_offset += html_header_len;
}
break;
case FILE_DATA:
- if(( position < 4 ) && (html_offset == 0))
+ if(( position < 4 ) && (upload_offset == 0)) // for espfs images check the magic number
{
for(int p = position; p < 4; p++ )
{
@@ -68,11 +71,11 @@ int ICACHE_FLASH_ATTR webServerSetupMultipartCallback(MultipartCmd cmd, char *da
os_printf("Not an espfs image!\n");
return 1;
}
- data[p - position] = 0xFF; // clean espfs magic to mark as invalid
+ data[p - position] = 0xFF; // espfs magic is invalid during upload
}
}
- int spi_flash_addr = getUserPageSectionStart() + html_offset + position;
+ int spi_flash_addr = getUserPageSectionStart() + upload_offset + position;
int spi_flash_end_addr = spi_flash_addr + dataLen;
if( spi_flash_end_addr + dataLen >= getUserPageSectionEnd() )
{
@@ -100,10 +103,10 @@ int ICACHE_FLASH_ATTR webServerSetupMultipartCallback(MultipartCmd cmd, char *da
break;
case FILE_DONE:
{
- if( html_offset != 0 )
+ if( html_header_len != 0 )
{
// write the terminating block on esp-fs
- int spi_flash_addr = getUserPageSectionStart() + html_offset + position;
+ int spi_flash_addr = getUserPageSectionStart() + upload_offset + position;
uint32_t pad = 0;
uint8_t pad_cnt = (4 - position) & 3;
@@ -112,8 +115,9 @@ int ICACHE_FLASH_ATTR webServerSetupMultipartCallback(MultipartCmd cmd, char *da
spi_flash_addr += pad_cnt;
+ // create ESPFS image
EspFsHeader hdr;
- hdr.magic = ESPFS_MAGIC;
+ hdr.magic = ESPFS_MAGIC;
hdr.flags = 1;
hdr.compression = 0;
hdr.nameLen = 0;
@@ -123,24 +127,28 @@ int ICACHE_FLASH_ATTR webServerSetupMultipartCallback(MultipartCmd cmd, char *da
uint32_t totallen = html_header_len + position;
+ // restore ESPFS magic
spi_flash_write( (int)getUserPageSectionStart(), (uint32_t *)&hdr.magic, sizeof(uint32_t) );
+ // set file size
spi_flash_write( (int)getUserPageSectionStart() + 8, &totallen, sizeof(uint32_t) );
spi_flash_write( (int)getUserPageSectionStart() + 12, &totallen, sizeof(uint32_t) );
}
else
{
+ // set espfs magic (set it valid)
uint32_t magic = ESPFS_MAGIC;
spi_flash_write( (int)getUserPageSectionStart(), (uint32_t *)&magic, sizeof(uint32_t) );
}
- WEB_Init();
+ WEB_Init(); // reload the content
}
break;
}
return 0;
}
-MultipartCtx * webServerContext = NULL;
+MultipartCtx * webServerContext = NULL; // multipart upload context for web server
+// this callback is called when user uploads the web-page
int ICACHE_FLASH_ATTR cgiWebServerSetupUpload(HttpdConnData *connData)
{
if( webServerContext == NULL )