embkernel
 All Classes Functions Variables Typedefs Groups Pages
Fs.hpp
1 //------------------------------------------------------------------------------
2 //This file is part of embKernel.
3 //See license.txt for the full license governing this code.
4 //------------------------------------------------------------------------------
5 
6 #ifndef FS_HPP_
7 #define FS_HPP_
8 
9 #include "FsDefs.hpp"
10 #include "FsDrive.hpp"
11 #include "FsDir.hpp"
12 #include "FsPartition.hpp"
13 #include "RtosInclude.hpp"
14 
15 class FsFormatCallback {
16 public:
17  virtual void formatStatusUpdate(uint32_t current, uint32_t total) {
18  }
19 };
20 
21 class Fs {
22  friend class FsEntry;
23  friend class FsFile;
24  friend class FsDir;
25 private:
26  static RtosSemaphore sSema;
27 
28  static FsPartition** sPartitions;
29  static size_t sPartitionsCount;
30 
31  typedef enum {
32  FT_INVALID,
33  FT_SHORT_FILENAME,
34  FT_LONG_FILENAME
35  } FILENAME_TYPE;
36 
37  typedef enum {
38  CT_INVALID,
39  CT_SHORT_ALLOWED,
40  CT_LONG_ALLOWED,
41  CT_DOT
42  } CHAR_TYPE;
43 
44 public:
45  static void init(FsPartition* partitions[], size_t partitionsCount);
46  static FsDefs::RESULT format(FsDrive* drive, FsFormatCallback* listener);
47 
48 private:
49  static FsDefs::RESULT open(const char* path, class FsEntry* file);
50  static FsDefs::RESULT read(void* buffer, size_t len, size_t* transfered, class FsFile* file);
51  static FsDefs::RESULT write(const void* buffer, size_t len, size_t* transfered, class FsFile* file);
52  static FsDefs::RESULT seek(class FsFile* file, size_t position);
53  static FsDefs::RESULT flush(class FsFile* file);
54  static FsDefs::RESULT del(class FsEntry* file);
55  static FsDefs::RESULT getNextEntry(class FsEntry* file, FsDir::ENTRY_INFO* info);
56 
57  static FsDefs::RESULT internalOpen(const char* path, class FsEntry* file);
58  static FsDefs::RESULT internalInitPartition(FsPartition* partition, FsDefs::SECTOR* sector);
59  static FsDefs::RESULT internalRead(void* buffer, size_t len, size_t* transfered, class FsFile* file);
60  static FsDefs::RESULT internalWrite(const void* buffer, size_t len, size_t* transfered, class FsFile* file);
61  static FsDefs::RESULT internalSeek(class FsFile* file, size_t position);
62  static FsDefs::RESULT internalFlush(class FsFile* file, FsDefs::SECTOR* sector);
63  static FsDefs::RESULT internalDel(class FsEntry* file);
64  static FsDefs::RESULT internalFormat(FsDrive* drive, FsDefs::SECTOR* sector, FsFormatCallback* listener);
65  static FsDefs::RESULT internalGetNextEntry(class FsEntry* file, FsDir::ENTRY_INFO* info);
66 
67  static FsDefs::RESULT createShortFilenameEntry(const char** name, class FsEntry* file, bool writeEntry);
68  static FsDefs::RESULT createLongFilenameEntry(const char** name, class FsEntry* file, int len);
69 
70  static FsDefs::RESULT checkShortFilename(const char** name, FsDefs::DIRECTORY_ENTRY* entry);
71  static FsDefs::RESULT checkLongFilename(const char** name, class FsEntry* dirEntryInfo);
72  static FILENAME_TYPE getFilenameType(const char* name, int& len);
73  static bool isLongFilenameEntry(FsDefs::DIRECTORY_ENTRY* entry);
74  static CHAR_TYPE getCharType(const char c);
75  static uint8_t calcSfnChecksum(const char* name);
76  static void setWideCharFromAscii(uint8_t*p, char value);
77  static char getAsciiFromWideChar(uint16_t value);
78  static void initEntryInfoFromShortEntry(FsDefs::SHORT_DIRECTORY_ENTRY* entry, FsDir::ENTRY_INFO* info);
79  static void getLongNameLenAndOrder(FsDefs::LONG_DIRECTORY_ENTRY* entry, int* lastOnEntry, int* order, int* nameLen);
80  static uint32_t getCurrentTime();
81 };
82 
83 #endif /* FS_HPP_ */