Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #4
0
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);
    }
  }
}
Пример #5
0
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;
}
Пример #6
0
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);
  }
}
Пример #7
0
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);
}
Пример #8
0
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);
  }
}
Пример #9
0
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);
  }
}
Пример #10
0
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);
  }
}
Пример #11
0
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);
    }
  }
}
Пример #12
0
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);
  }
}
Пример #13
0
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;
}
Пример #14
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;
}
Пример #15
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);
}
Пример #16
0
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);
  }
}
Пример #17
0
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);
  }
}
Пример #18
0
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);
}
Пример #19
0
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);
}
Пример #20
0
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);
}
Пример #21
0
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);
}
Пример #22
0
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);
    }
  }
}
Пример #23
0
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);
  }
}
Пример #24
0
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);
    }
  }
}
Пример #25
0
/// 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);
}