GCC Code Coverage Report


Directory: ./
File: Os/Directory.cpp
Date: 2026-11-03 22:10:14
Exec Total Coverage
Lines: 54 91 59.3%
Functions: 8 12 66.7%
Branches: 19 41 46.3%

Line Branch Exec Source
1 // ======================================================================
2 // \title Os/Directory.cpp
3 // \brief common function implementation for Os::Directory
4 // ======================================================================
5 #include <Fw/Types/Assert.hpp>
6 #include <Os/Directory.hpp>
7
8 namespace Os {
9
10 4 Directory::Directory()
11
3/3
✓ Branch 1 taken 64 times.
✓ Branch 2 taken 4 times.
✓ Branch 4 taken 4 times.
68 : m_is_open(false), m_handle_storage(), m_delegate(*DirectoryInterface::getDelegate(m_handle_storage)) {
12 4 FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
13 4 }
14
15 8 Directory::~Directory() {
16 8 FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
17
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
8 if (this->m_is_open) {
18 4 this->close();
19 }
20 8 this->m_delegate.~DirectoryInterface();
21 8 }
22
23 // ------------------------------------------------------------
24 // Directory operations delegating to implementation
25 // ------------------------------------------------------------
26 ✗ DirectoryHandle* Directory::getHandle() {
27 ✗ FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
28 ✗ return this->m_delegate.getHandle();
29 }
30
31 3 Directory::Status Directory::open(const char* path, OpenMode mode) {
32 3 FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
33 3 FW_ASSERT(path != nullptr);
34 3 FW_ASSERT(mode >= 0 and mode < OpenMode::MAX_OPEN_MODE);
35 3 Status status = this->m_delegate.open(path, mode);
36
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 if (status == Status::OP_OK) {
37 3 this->m_is_open = true;
38 }
39 3 return status;
40 }
41
42 ✗ bool Directory::isOpen() {
43 ✗ FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
44 ✗ return this->m_is_open;
45 }
46 4 Directory::Status Directory::rewind() {
47 4 FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
48
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (not this->m_is_open) {
49 ✗ return Status::NOT_OPENED;
50 }
51 4 return this->m_delegate.rewind();
52 }
53
54 10 Directory::Status Directory::read(char* fileNameBuffer, FwSizeType bufSize) {
55 10 FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
56
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (not this->m_is_open) {
57 ✗ return Status::NOT_OPENED;
58 }
59 10 FW_ASSERT(fileNameBuffer != nullptr);
60 10 FW_ASSERT(bufSize > 0);
61 10 Status status = this->m_delegate.read(fileNameBuffer, bufSize);
62 10 fileNameBuffer[bufSize - 1] = '\0'; // Guarantee null-termination
63 10 return status;
64 }
65
66 8 Directory::Status Directory::read(Fw::StringBase& filename) {
67 8 FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
68
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (not this->m_is_open) {
69 ✗ return Status::NOT_OPENED;
70 }
71 8 return this->m_delegate.read(const_cast<char*>(filename.toChar()), filename.getCapacity());
72 }
73
74 3 void Directory::close() {
75 3 FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
76 3 this->m_is_open = false;
77 3 return this->m_delegate.close();
78 }
79
80 // ------------------------------------------------------------
81 // Common functions built on top of OS-specific functions
82 // ------------------------------------------------------------
83
84 2 Directory::Status Directory::getFileCount(FwSizeType& fileCount) {
85
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (not this->m_is_open) {
86 ✗ return Status::NOT_OPENED;
87 }
88 // Rewind to ensure we start from the beginning of the stream
89
2/3
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
2 if (this->rewind() != Status::OP_OK) {
90 ✗ return Status::OTHER_ERROR;
91 }
92 2 const FwSizeType loopLimit = std::numeric_limits<FwSizeType>::max();
93 2 FwSizeType count = 0;
94 char unusedBuffer[1]; // buffer must have size but is unused
95 2 Status readStatus = Status::OP_OK;
96 2 fileCount = 0;
97 // Count files by reading each file entry until there is NO_MORE_FILES
98
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 for (FwSizeType iter = 0; iter < loopLimit; ++iter) {
99
1/1
✓ Branch 1 taken 10 times.
10 readStatus = this->read(unusedBuffer, sizeof(unusedBuffer));
100
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
10 if (readStatus == Status::NO_MORE_FILES) {
101 2 break;
102
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 } else if (readStatus != Status::OP_OK) {
103 ✗ return Status::OTHER_ERROR;
104 }
105 8 count++;
106 }
107 2 fileCount = count;
108
2/3
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
2 if (this->rewind() != Status::OP_OK) {
109 ✗ return Status::OTHER_ERROR;
110 }
111 2 return Status::OP_OK;
112 }
113
114 ✗ Directory::Status Directory::readDirectory(Fw::ExternalArray<Fw::String>& filenameArray, FwSizeType& filenameCount) {
115 ✗ FW_ASSERT(filenameArray.getElements() != nullptr);
116 ✗ FW_ASSERT(filenameArray.getSize() > 0);
117 ✗ if (not this->m_is_open) {
118 ✗ return Status::NOT_OPENED;
119 }
120 // Rewind to ensure we start reading from the beginning of the stream
121 ✗ if (this->rewind() != Status::OP_OK) {
122 ✗ return Status::OTHER_ERROR;
123 }
124
125 ✗ Status readStatus = Status::OP_OK;
126 ✗ Status returnStatus = Status::OP_OK;
127 FwSizeType index;
128 ✗ filenameCount = 0;
129 // Iterate through the directory and read the filenames into the array
130 ✗ for (index = 0; index < filenameArray.getSize(); index++) {
131 ✗ readStatus = this->read(filenameArray[index]);
132 ✗ if (readStatus == Status::NO_MORE_FILES) {
133 ✗ break;
134 ✗ } else if (readStatus != Status::OP_OK) {
135 ✗ return Status::OTHER_ERROR;
136 }
137 }
138 ✗ filenameCount = index;
139
140 ✗ if (this->rewind() != Status::OP_OK) {
141 ✗ return Status::OTHER_ERROR;
142 }
143
144 ✗ return returnStatus;
145 }
146
147 ✗ Directory::Status Directory::readDirectory(Fw::String filenameArray[],
148 const FwSizeType filenameArraySize,
149 FwSizeType& filenameCount) {
150 ✗ Fw::ExternalArray<Fw::String> array(filenameArray, filenameArraySize);
151 ✗ return this->readDirectory(array, filenameCount);
152 ✗ }
153
154 } // namespace Os
155