From dfe60372a5f5c84e319a5c560b6bc48f99ce258d Mon Sep 17 00:00:00 2001 From: Karai Csaba Date: Sat, 21 May 2016 11:14:04 +0200 Subject: [PATCH] Prepend header to HTML --- esp-link/cgiwebserver.c | 84 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 78 insertions(+), 6 deletions(-) diff --git a/esp-link/cgiwebserver.c b/esp-link/cgiwebserver.c index 58dc544..cd3a61d 100644 --- a/esp-link/cgiwebserver.c +++ b/esp-link/cgiwebserver.c @@ -9,15 +9,57 @@ #include "config.h" #include "web-server.h" +int html_offset = 0; +int html_header_len = 0; +const char * HTML_HEADER = "esp-link" + "" + "
"; + int ICACHE_FLASH_ATTR webServerMultipartCallback(MultipartCmd cmd, char *data, int dataLen, int position) { switch(cmd) { case FILE_START: - // do nothing + html_offset = 0; + html_header_len = 0; + // simple HTML file + if( ( dataLen > 5 ) && ( os_strcmp(data + dataLen - 5, ".html") == 0 ) ) + { + // 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.flags = 0; + hdr.compression = 0; + + int len = dataLen + 1; + while(( len & 3 ) != 0 ) + len++; + + 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); + + 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; + + 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; + } break; case FILE_DATA: - if( position < 4 ) + if(( position < 4 ) && (html_offset == 0)) { for(int p = position; p < 4; p++ ) { @@ -30,7 +72,7 @@ int ICACHE_FLASH_ATTR webServerMultipartCallback(MultipartCmd cmd, char *data, i } } - int spi_flash_addr = getUserPageSectionStart() + position; + int spi_flash_addr = getUserPageSectionStart() + html_offset + position; int spi_flash_end_addr = spi_flash_addr + dataLen; if( spi_flash_end_addr + dataLen >= getUserPageSectionEnd() ) { @@ -58,9 +100,39 @@ int ICACHE_FLASH_ATTR webServerMultipartCallback(MultipartCmd cmd, char *data, i break; case FILE_DONE: { - uint32_t magic = ESPFS_MAGIC; - spi_flash_write( (int)getUserPageSectionStart(), (uint32_t *)&magic, sizeof(uint32_t) ); - WEB_Init(); + if( html_offset != 0 ) + { + // write the terminating block on esp-fs + int spi_flash_addr = getUserPageSectionStart() + html_offset + position; + + uint32_t pad = 0; + uint8_t pad_cnt = (4 - position) & 3; + if( pad_cnt ) + spi_flash_write( spi_flash_addr, &pad, pad_cnt ); + + spi_flash_addr += pad_cnt; + + EspFsHeader hdr; + hdr.magic = ESPFS_MAGIC; + hdr.flags = 1; + hdr.compression = 0; + hdr.nameLen = 0; + hdr.fileLenComp = hdr.fileLenDecomp = 0; + + spi_flash_write( spi_flash_addr, (uint32_t *)(&hdr), sizeof(EspFsHeader) ); + + uint32_t totallen = html_header_len + position; + + spi_flash_write( (int)getUserPageSectionStart(), (uint32_t *)&hdr.magic, sizeof(uint32_t) ); + spi_flash_write( (int)getUserPageSectionStart() + 8, &totallen, sizeof(uint32_t) ); + spi_flash_write( (int)getUserPageSectionStart() + 12, &totallen, sizeof(uint32_t) ); + } + else + { + uint32_t magic = ESPFS_MAGIC; + spi_flash_write( (int)getUserPageSectionStart(), (uint32_t *)&magic, sizeof(uint32_t) ); + } + WEB_Init(); } break; }