void OnChangeTime(nwazetMessageContext_t* nmc){ FILINFO fileInfo; uint8_t res = (uint8_t) FR_OK; uint8_t isTextASCII = 0; uint16_t year = 0; uint16_t month = 0; uint16_t day = 0; uint16_t hour = 0; uint16_t min = 0; uint16_t sec = 0; uint16_t textLength = 0; const char* objName = (const char*)GetStringReference(nmc->cmdContext, &textLength, &isTextASCII); Get(nmc->cmdContext, (void*)&year, sizeof(year)); Get(nmc->cmdContext, (void*)&month, sizeof(month)); Get(nmc->cmdContext, (void*)&day, sizeof(day)); Get(nmc->cmdContext, (void*)&hour, sizeof(hour)); Get(nmc->cmdContext, (void*)&min, sizeof(min)); Get(nmc->cmdContext, (void*)&sec, sizeof(sec)); fileInfo.fdate = (uint16_t)(((year - 1980) * 512U) | month * 32U | day); fileInfo.ftime = (uint16_t)(hour * 2048U | min * 32U | sec / 2U); if(objName && isTextASCII){ res = fsCheckSuccess(__func__, "f_utime", f_utime(objName, &fileInfo), objName); StartResponse(nmc, res, true); return; } res = FR_INVALID_NAME; fsCheckSuccess(__func__, "objName", res, objName); StartResponse(nmc, res, true); }
void OnChangeDir(nwazetMessageContext_t* nmc){ uint8_t res = (uint8_t) FR_OK; uint8_t isTextASCII = 0; uint16_t textLength = 0; const char* dirname = (const char*)GetStringReference(nmc->cmdContext, &textLength, &isTextASCII); if(dirname && isTextASCII){ res = fsCheckSuccess(__func__, "f_chdir", f_chdir(dirname), dirname); StartResponse(nmc, res, true); return; } res = FR_INVALID_NAME; fsCheckSuccess(__func__, "dirname", res, dirname); StartResponse(nmc, res, true); }
void OnUnlink(nwazetMessageContext_t* nmc){ uint8_t res = (uint8_t) FR_OK; uint8_t isTextASCII = 0; uint16_t textLength = 0; const char* objName = (const char*)GetStringReference(nmc->cmdContext, &textLength, &isTextASCII); if(objName && isTextASCII){ res = fsCheckSuccess(__func__, "f_unlink", f_unlink(objName), objName); StartResponse(nmc, res, true); return; } res = FR_INVALID_NAME; fsCheckSuccess(__func__, "objName", res, objName); StartResponse(nmc, res, true); }
void OnReadFile(nwazetMessageContext_t* nmc){ SerializerContext snapshot; uint16_t bytesToRead = 0; uint16_t bytesRead = 0; uint8_t res = (uint8_t) FR_OK; fileObjectMap_t* fileObj = GetFileObjectById(nmc); if(fileObj){ Get(nmc->cmdContext, (void*)&bytesToRead, sizeof(bytesToRead)); if(bytesToRead > nmc->responseBufferSize){ fsCheckSuccess(__func__, "bytesToRead", FR_INVALID_PARAMETER, 0); StartResponse(nmc, FR_INVALID_PARAMETER, true); }else{ InitializeSendBuffer(nmc->respContext, nmc->responseBuffer, nmc->responseBufferSize); TakeContextSnapshot(&snapshot, nmc->respContext); Put(nmc->respContext, (void*)&res, sizeof(res), 1); Put(nmc->respContext, (void*)&bytesRead, sizeof(bytesRead), 1); UINT bytesReadTemp = 0; res = (uint8_t) f_read(fileObj->file, (void*)(nmc->respContext->Buffer + nmc->respContext->CurrentIndex), bytesToRead, &bytesReadTemp); fsCheckSuccess(__func__, "f_read", res, 0); bytesRead = (uint16_t)bytesReadTemp; RestoreContextFromSnapshot(&snapshot, nmc->respContext); Put(nmc->respContext, (void*)&res, sizeof(res), 1); Put(nmc->respContext, (void*)&bytesRead, sizeof(bytesRead), 1); FinalizeSendBuffer(nmc->respContext); } } }
static int JK_METHOD Write(jk_ws_service_t *s, const void *bytes, unsigned len) { DEBUG(("Write(%p, %p, %u)\n", s, bytes, len)); jk_log(logger, JK_LOG_DEBUG, "Into jk_ws_service_t::Write\n"); if (s && s->ws_private && bytes) { private_ws_t *p = s->ws_private; int errID, rc; /* Make sure the response has really started. I'm almost certain * this isn't necessary, but it was in the ISAPI code, so it's in * here too. */ if (!p->responseStarted) StartResponse(s, 200, NULL, NULL, NULL, 0); DEBUG(("Writing %d bytes of content\n", len)); /* Send the data */ if (len > 0) rc = p->context->WriteClient(p->context, (char *) bytes, len, 0, &errID); return JK_TRUE; } jk_log(logger, JK_LOG_ERROR, "jk_ws_service_t::Write, NULL parameters\n"); return JK_FALSE; }
void OnCloseFile(nwazetMessageContext_t* nmc){ fileObjectMap_t* fileObj = GetFileObjectById(nmc); if(fileObj){ fileObj->filenameHash = 0; fileObj->id = INVALID_OBJECT_ID; StartResponse(nmc, fsCheckSuccess(__func__, "f_close", f_close(fileObj->file), 0), true); } }
void OnMount(nwazetMessageContext_t* nmc){ uint8_t res = fsCheckSuccess(__func__, "f_mount(root)", f_mount(0, &fs), 0); if(res == FR_OK){ // Attempt to initialize the file system by mounting the root of the drive res = fsCheckSuccess(__func__, "f_opendir(root)", f_opendir(&rootDir, ""), 0); } StartResponse(nmc, res, true); }
void OnCloseDir(nwazetMessageContext_t* nmc){ dirObjectMap_t* dirObj = GetDirectoryObjectById(nmc); if(dirObj){ dirObj->dirnameHash = 0; dirObj->id = INVALID_OBJECT_ID; StartResponse(nmc, FR_OK, true); } }
void OnGetFilePosition(nwazetMessageContext_t* nmc){ fileObjectMap_t* fileObj = GetFileObjectById(nmc); if(fileObj){ uint32_t position = f_tell(fileObj->file); StartResponse(nmc, FR_OK, false); Put(nmc->respContext, (void*)&position, sizeof(position), 1); EndResponse(nmc); } }
void OnSyncFile(nwazetMessageContext_t* nmc){ uint8_t res = (uint8_t) FR_OK; fileObjectMap_t* fileObj = GetFileObjectById(nmc); if(fileObj){ res = (uint8_t) f_sync(fileObj->file); fsCheckSuccess(__func__, "f_sync", res, 0); StartResponse(nmc, res, true); } }
void OnReadDir(nwazetMessageContext_t* nmc){ dirObjectMap_t* dirObj = GetDirectoryObjectById(nmc); if(dirObj){ FILINFO fileInfo; uint8_t res = fsCheckSuccess(__func__, "f_readdir", f_readdir(dirObj->dir, &fileInfo), 0); if(res == FR_OK){ StartResponse(nmc, res, false); Put(nmc->respContext, (void*)&fileInfo.fsize, sizeof(uint32_t), 1); Put(nmc->respContext, (void*)&fileInfo.fdate, sizeof(uint16_t), 1); Put(nmc->respContext, (void*)&fileInfo.ftime, sizeof(uint16_t), 1); Put(nmc->respContext, (void*)&fileInfo.fattrib, sizeof(uint8_t), 1); PutStringReference(nmc->respContext, (unsigned char*)&fileInfo.fname[0], 13, 1); EndResponse(nmc); }else{ StartResponse(nmc, res, true); } } }
void OnGetFileSize(nwazetMessageContext_t* nmc){ fileObjectMap_t* fileObj = GetFileObjectById(nmc); if(fileObj){ uint32_t size = f_size(fileObj->file); StartResponse(nmc, FR_OK, false); Put(nmc->respContext, (void*)&size, sizeof(size), 1); EndResponse(nmc); } }
fileObjectMap_t* GetFileObjectById(nwazetMessageContext_t* nmc){ uint16_t fileId = 0; Get(nmc->cmdContext, (void*)&fileId, sizeof(fileId)); if(fileId < _FS_SHARE){ return fileObjectMap[fileId]; } StartResponse(nmc, FR_INVALID_OBJECT, true); return 0; }
dirObjectMap_t* GetDirectoryObjectById(nwazetMessageContext_t* nmc){ uint16_t dirId = 0; Get(nmc->cmdContext, (void*)&dirId, sizeof(dirId)); if(dirId < _FS_SHARE){ return dirObjectMap[dirId]; } StartResponse(nmc, FR_INVALID_OBJECT, true); return 0; }
void OnChangeAttribute(nwazetMessageContext_t* nmc){ uint8_t res = (uint8_t) FR_OK; uint8_t attribute = 0; uint8_t attributeMask = 0; uint8_t isTextASCII = 0; uint16_t textLength = 0; const char* objName = (const char*)GetStringReference(nmc->cmdContext, &textLength, &isTextASCII); Get(nmc->cmdContext, (void*)&attribute, sizeof(attribute)); Get(nmc->cmdContext, (void*)&attributeMask, sizeof(attributeMask)); if(objName && isTextASCII){ res = fsCheckSuccess(__func__, "f_chmod", f_chmod(objName, attribute, attributeMask), objName); StartResponse(nmc, res, true); return; } res = FR_INVALID_NAME; fsCheckSuccess(__func__, "objName", res, objName); StartResponse(nmc, res, true); }
void OnGetFileError(nwazetMessageContext_t* nmc){ fileObjectMap_t* fileObj = GetFileObjectById(nmc); if(fileObj){ uint8_t error = f_error(fileObj->file); StartResponse(nmc, FR_OK, false); Put(nmc->respContext, (void*)&error, sizeof(error), 1); EndResponse(nmc); } }
void OnSeekFile(nwazetMessageContext_t* nmc){ uint8_t res = (uint8_t) FR_OK; uint32_t bytesToSeek = 0; fileObjectMap_t* fileObj = GetFileObjectById(nmc); if(fileObj){ Get(nmc->cmdContext, (void*)&bytesToSeek, sizeof(bytesToSeek)); res = (uint8_t) f_lseek(fileObj->file, bytesToSeek); fsCheckSuccess(__func__, "f_lseek", res, 0); StartResponse(nmc, res, true); } }
void OnOpenDir(nwazetMessageContext_t* nmc){ uint8_t res = (uint8_t) FR_OK; uint8_t isTextASCII = 0; uint16_t textLength = 0; dirObjectMap_t* dirObj = 0; const char* dirname = (const char*)GetStringReference(nmc->cmdContext, &textLength, &isTextASCII); if(dirname && isTextASCII){ dirObj = MapDirectoryNameToDirectoryObject(dirname, textLength); if(dirObj){ res = fsCheckSuccess(__func__, "f_opendir", f_opendir(dirObj->dir, dirname), dirname); StartResponse(nmc, res, false); Put(nmc->respContext, (void*)&dirObj->id, sizeof(dirObj->id), 1); EndResponse(nmc); return; } } res = FR_INVALID_NAME; fsCheckSuccess(__func__, "dirname", res, dirname); StartResponse(nmc, res, true); }
void OnRename(nwazetMessageContext_t* nmc){ uint8_t res = (uint8_t) FR_OK; uint8_t isTextASCII = 0; uint16_t textLength = 0; const char* oldObjName = (const char*)GetStringReference(nmc->cmdContext, &textLength, &isTextASCII); if(!oldObjName || !isTextASCII){ res = FR_INVALID_NAME; fsCheckSuccess(__func__, "oldObjName", res, oldObjName); StartResponse(nmc, res, true); return; } const char* newObjName = (const char*)GetStringReference(nmc->cmdContext, &textLength, &isTextASCII); if(!newObjName || !isTextASCII){ res = FR_INVALID_NAME; fsCheckSuccess(__func__, "newObjName", res, newObjName); StartResponse(nmc, res, true); return; } res = fsCheckSuccess(__func__, "f_rename", f_rename(oldObjName, newObjName), oldObjName); StartResponse(nmc, res, true); }
void OnUnMount(nwazetMessageContext_t* nmc){ // Ensure that all files are closed before unmounting the file system CloseAllOpenFiles(); // Unmount the file system uint8_t res = fsCheckSuccess(__func__, "f_mount(null)", f_mount(0, 0), 0); // low-level disk reset disk_reset(); // Reset file object mappings fsCommandHandlerReset(); // return a response to the caller StartResponse(nmc, res, true); }
void OnOpenFile(nwazetMessageContext_t* nmc){ uint8_t res = (uint8_t) FR_OK; uint8_t isTextASCII = 0; uint16_t textLength = 0; uint8_t modeMask = 0; fileObjectMap_t* fileObj = 0; const char* filename = (const char*)GetStringReference(nmc->cmdContext, &textLength, &isTextASCII); Get(nmc->cmdContext, (void*)&modeMask, sizeof(modeMask)); if(filename && isTextASCII){ fileObj = MapFilenameToFileObject(filename, textLength); if(fileObj){ res = fsCheckSuccess(__func__, "f_open", f_open(fileObj->file, filename, modeMask), filename); StartResponse(nmc, res, false); Put(nmc->respContext, (void*)&fileObj->id, sizeof(fileObj->id), 1); EndResponse(nmc); return; } } res = FR_INVALID_NAME; fsCheckSuccess(__func__, "filename", res, filename); StartResponse(nmc, res, true); }
void OnWriteString(nwazetMessageContext_t* nmc){ fileObjectMap_t* fileObj = GetFileObjectById(nmc); if(fileObj){ uint8_t isTextASCII = 0; uint16_t textLength = 0; void* text = GetStringReference(nmc->cmdContext, &textLength, &isTextASCII); if(text && textLength){ int32_t charactersWritten = f_puts((const TCHAR*) text, fileObj->file); StartResponse(nmc, FR_OK, false); Put(nmc->respContext, (void*)&charactersWritten, sizeof(charactersWritten), 1); EndResponse(nmc); } } }
void OnGetFreeSpace(nwazetMessageContext_t* nmc){ DWORD clusters = 0; FATFS* tempFs = &fs; uint8_t res = fsCheckSuccess(__func__, "f_getfree", f_getfree("", &clusters, &tempFs), 0); if(res == FR_OK){ DWORD totalSectors = (fs.n_fatent - 2) * fs.csize; DWORD freeSectors = clusters * fs.csize; uint32_t totalDiskSpaceKB = totalSectors / 2; // 1024 / 2 = 512 bytes / sector with SD card uint32_t totalFreeSpaceKB = freeSectors / 2; // same as above InitializeSendBuffer(nmc->respContext, nmc->responseBuffer, nmc->responseBufferSize); Put(nmc->respContext, (void*)&res, sizeof(res), 1); Put(nmc->respContext, (void*)&totalDiskSpaceKB, sizeof(totalDiskSpaceKB), 1); Put(nmc->respContext, (void*)&totalFreeSpaceKB, sizeof(totalFreeSpaceKB), 1); FinalizeSendBuffer(nmc->respContext); }else{ StartResponse(nmc, res, true); } }
void OnWriteFile(nwazetMessageContext_t* nmc){ uint8_t res = (uint8_t) FR_OK; uint16_t bytesToWrite = 0; uint16_t bytesWrittenTemp = 0; UINT bytesWritten = 0; fileObjectMap_t* fileObj = GetFileObjectById(nmc); if(fileObj){ Get(nmc->cmdContext, (void*)&bytesToWrite, sizeof(bytesToWrite)); if(bytesToWrite > _MAX_SS){ fsCheckSuccess(__func__, "bytesToWrite", FR_INVALID_PARAMETER, 0); StartResponse(nmc, FR_INVALID_PARAMETER, true); }else{ res = (uint8_t) f_write(fileObj->file, (void*)(nmc->cmdContext->Buffer + nmc->cmdContext->CurrentIndex), (UINT)bytesToWrite, &bytesWritten); fsCheckSuccess(__func__, "f_write", res, 0); bytesWrittenTemp = (uint16_t)bytesWritten; InitializeSendBuffer(nmc->respContext, nmc->responseBuffer, nmc->responseBufferSize); Put(nmc->respContext, (void*)&res, sizeof(res), 1); Put(nmc->respContext, (void*)&bytesWrittenTemp, sizeof(bytesWrittenTemp), 1); FinalizeSendBuffer(nmc->respContext); } } }
/// Creates and sends a valid HTTP 1.0 or 1.1 response, based on the given request. /// The headers must be set before this call is made. /// This call sets up chunked transfer encoding if the request was protocol HTTP/1.1, otherwise uses a zero-content-length HTTP/1.0 response. /// This call simply calls StartResponse("200", "OK", request, conn) /// \param request The HTTP request to respond to. /// \param conn The connection to send over. void HTTP::Parser::StartResponse(HTTP::Parser & request, Socket::Connection & conn, bool bufferAllChunks) { StartResponse("200", "OK", request, conn, bufferAllChunks); }