//------------------------------------------------------------------------------
void FatFile::ls(print_t* pr, uint8_t flags, uint8_t indent) {
  FatFile file;
  rewind();
  while (file.openNext(this, O_READ)) {
    // indent for dir level
    if (!file.isHidden() || (flags & LS_A)) {
      for (uint8_t i = 0; i < indent; i++) {
        pr->write(' ');
      }
      if (flags & LS_DATE) {
        file.printModifyDateTime(pr);
        pr->write(' ');
      }
      if (flags & LS_SIZE) {
        file.printFileSize(pr);
        pr->write(' ');
      }
      file.printName(pr);
      if (file.isDir()) {
        pr->write('/');
      }
      pr->write('\r');
      pr->write('\n');
      if ((flags & LS_R) && file.isDir()) {
        file.ls(pr, flags, indent + 2);
      }
    }
    file.close();
  }
}
Example #2
0
static void webApiFileSystem(MyHeaterUI &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) {
    char value[MY_HEATER_UI_VALUE_LEN];
    char *p;

    DEBUG("webApiFileSystem");

    if (server.authCredentials != NULL && !server.checkCredentials(server.authCredentials)) {
        server.httpUnauthorized();
        return;
    }

    // root
    if (!server.sd->chdir()) {
        server.httpServerError();
        server.print("<h1>SD card failed</h1>");
        return;
    }

    if (type == WebServer::GET) {
        DEBUG("GET");
        FatFile dir;
        if (!getNextStrParam(server, &url_tail, "dir", value)) {
            strcpy(value, "/");
        }
        DEBUG("dir: %s", value);
        if (!dir.open(server.sd->vwd(), value, O_READ)) {
            DEBUG("ERROR - Can't open file!");
            server.httpServerError();
            return;
        }

        server.httpSuccess("application/json; charset=utf-8");
        server.print("{\"files\":[");
        FatFile file;
        bool isFirst = true;
        while (file.openNext(&dir, O_READ)) {
            if (!isFirst) {
                server.print(",");
            }
            else {
                isFirst = false;
            }

            server.print("{\"name\":\"");
            file.printName(&server);
            server.print("\"");

            server.print(",\"modifyDateTime\":\"");
            file.printModifyDateTime(&server);
            server.print("\"");

            server.print(",\"fileSize\":");
            file.printFileSize(&server);

            if (file.isDir()) {
                server.print(",\"isDir\":true");
            }
            else {
                server.print(",\"isDir\":false");
            }

            server.print("}");

            file.close();
        }
        server.print("]}");
        dir.close();
    }
    else if (type == WebServer::PUT) {
        if ((p = url_tail) && getNextStrParam(server, &p, "file", value)) {
            DEBUG("PUT file: %s", value);

            FatFile file;
            if (!file.open(value, O_WRITE | O_CREAT | O_TRUNC)) {
                server.httpServerError();
                return;
            }

            int ch;
            while ((ch = server.read()) != -1) {
                file.write(ch);
            }

            file.close();
        }
        else if ((p = url_tail) && getNextStrParam(server, &p, "dir", value)) {
            DEBUG("MKDIR dir: %s", value);

            if (!server.sd->mkdir(value)) {
                server.httpServerError();
                return;
            }
        }
        else {
            server.httpServerError();
            return;
        }
        server.httpSuccess();
    }
    else if (type == WebServer::DELETE) {
        FatFile file;
        while (getNextStrParam(server, &url_tail, "file", value)) {
            DEBUG("DELETE file: %s", value);
            if (file.open(value, O_READ)) {
                DEBUG("opened");
                if (file.isDir()) {
                    file.rmRfStar() && file.rmdir();
                    file.close();
                }
                else {
                    DEBUG("try to remove");
                    file.close();
                    if (file.open(value, O_READ | O_WRITE)) {
                        if (!file.remove()) {
                            DEBUG("Cannot remove file");
                        }
                        file.close();
                    }
                }
            }
            else {
                DEBUG("Cannot open file");
            }
        }
        server.httpSuccess();
    }
}