TUKS MCU Introductory course / TUKS-COURSE-TIMER
Committer:
elmot
Date:
Fri Feb 24 21:13:56 2017 +0000
Revision:
1:d0dfbce63a89
Ready-to-copy

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elmot 1:d0dfbce63a89 1 /* mbed Microcontroller Library
elmot 1:d0dfbce63a89 2 * Copyright (c) 2006-2013 ARM Limited
elmot 1:d0dfbce63a89 3 *
elmot 1:d0dfbce63a89 4 * Licensed under the Apache License, Version 2.0 (the "License");
elmot 1:d0dfbce63a89 5 * you may not use this file except in compliance with the License.
elmot 1:d0dfbce63a89 6 * You may obtain a copy of the License at
elmot 1:d0dfbce63a89 7 *
elmot 1:d0dfbce63a89 8 * http://www.apache.org/licenses/LICENSE-2.0
elmot 1:d0dfbce63a89 9 *
elmot 1:d0dfbce63a89 10 * Unless required by applicable law or agreed to in writing, software
elmot 1:d0dfbce63a89 11 * distributed under the License is distributed on an "AS IS" BASIS,
elmot 1:d0dfbce63a89 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
elmot 1:d0dfbce63a89 13 * See the License for the specific language governing permissions and
elmot 1:d0dfbce63a89 14 * limitations under the License.
elmot 1:d0dfbce63a89 15 */
elmot 1:d0dfbce63a89 16 #include "drivers/FileSystemLike.h"
elmot 1:d0dfbce63a89 17
elmot 1:d0dfbce63a89 18 namespace mbed {
elmot 1:d0dfbce63a89 19
elmot 1:d0dfbce63a89 20 class BaseDirHandle : public DirHandle {
elmot 1:d0dfbce63a89 21 public:
elmot 1:d0dfbce63a89 22 /*
elmot 1:d0dfbce63a89 23 We keep track of our current location as the n'th object in the
elmot 1:d0dfbce63a89 24 FileSystemLike list. Using a Base* instead would cause problems if that
elmot 1:d0dfbce63a89 25 object were to be destroyed between readdirs.
elmot 1:d0dfbce63a89 26 Using this method does mean though that destroying/creating objects can
elmot 1:d0dfbce63a89 27 give unusual results from readdir.
elmot 1:d0dfbce63a89 28 */
elmot 1:d0dfbce63a89 29 off_t n;
elmot 1:d0dfbce63a89 30 struct dirent cur_entry;
elmot 1:d0dfbce63a89 31
elmot 1:d0dfbce63a89 32 BaseDirHandle() : n(0), cur_entry() {
elmot 1:d0dfbce63a89 33 }
elmot 1:d0dfbce63a89 34
elmot 1:d0dfbce63a89 35 virtual int closedir() {
elmot 1:d0dfbce63a89 36 // No lock can be used in destructor
elmot 1:d0dfbce63a89 37 delete this;
elmot 1:d0dfbce63a89 38 return 0;
elmot 1:d0dfbce63a89 39 }
elmot 1:d0dfbce63a89 40
elmot 1:d0dfbce63a89 41 virtual struct dirent *readdir() {
elmot 1:d0dfbce63a89 42 lock();
elmot 1:d0dfbce63a89 43 FileBase *ptr = FileBase::get(n);
elmot 1:d0dfbce63a89 44 if (ptr == NULL) {
elmot 1:d0dfbce63a89 45 unlock();
elmot 1:d0dfbce63a89 46 return NULL;
elmot 1:d0dfbce63a89 47 }
elmot 1:d0dfbce63a89 48
elmot 1:d0dfbce63a89 49 /* Increment n, so next readdir gets the next item */
elmot 1:d0dfbce63a89 50 n++;
elmot 1:d0dfbce63a89 51
elmot 1:d0dfbce63a89 52 /* Setup cur entry and return a pointer to it */
elmot 1:d0dfbce63a89 53 std::strncpy(cur_entry.d_name, ptr->getName(), NAME_MAX);
elmot 1:d0dfbce63a89 54 unlock();
elmot 1:d0dfbce63a89 55 return &cur_entry;
elmot 1:d0dfbce63a89 56 }
elmot 1:d0dfbce63a89 57
elmot 1:d0dfbce63a89 58 virtual off_t telldir() {
elmot 1:d0dfbce63a89 59 lock();
elmot 1:d0dfbce63a89 60 off_t offset = n;
elmot 1:d0dfbce63a89 61 unlock();
elmot 1:d0dfbce63a89 62 return offset;
elmot 1:d0dfbce63a89 63 }
elmot 1:d0dfbce63a89 64
elmot 1:d0dfbce63a89 65 virtual void seekdir(off_t offset) {
elmot 1:d0dfbce63a89 66 lock();
elmot 1:d0dfbce63a89 67 n = offset;
elmot 1:d0dfbce63a89 68 unlock();
elmot 1:d0dfbce63a89 69 }
elmot 1:d0dfbce63a89 70
elmot 1:d0dfbce63a89 71 virtual void rewinddir() {
elmot 1:d0dfbce63a89 72 lock();
elmot 1:d0dfbce63a89 73 n = 0;
elmot 1:d0dfbce63a89 74 unlock();
elmot 1:d0dfbce63a89 75 }
elmot 1:d0dfbce63a89 76
elmot 1:d0dfbce63a89 77 protected:
elmot 1:d0dfbce63a89 78 PlatformMutex _mutex;
elmot 1:d0dfbce63a89 79
elmot 1:d0dfbce63a89 80 virtual void lock() {
elmot 1:d0dfbce63a89 81 _mutex.lock();
elmot 1:d0dfbce63a89 82 }
elmot 1:d0dfbce63a89 83
elmot 1:d0dfbce63a89 84 virtual void unlock() {
elmot 1:d0dfbce63a89 85 _mutex.unlock();
elmot 1:d0dfbce63a89 86 }
elmot 1:d0dfbce63a89 87 };
elmot 1:d0dfbce63a89 88
elmot 1:d0dfbce63a89 89 FileSystemLike::FileSystemLike(const char *name) : FileBase(name, FileSystemPathType) {
elmot 1:d0dfbce63a89 90
elmot 1:d0dfbce63a89 91 }
elmot 1:d0dfbce63a89 92
elmot 1:d0dfbce63a89 93 FileSystemLike::~FileSystemLike() {
elmot 1:d0dfbce63a89 94
elmot 1:d0dfbce63a89 95 }
elmot 1:d0dfbce63a89 96
elmot 1:d0dfbce63a89 97 DirHandle *FileSystemLike::opendir() {
elmot 1:d0dfbce63a89 98 return new BaseDirHandle();
elmot 1:d0dfbce63a89 99 }
elmot 1:d0dfbce63a89 100
elmot 1:d0dfbce63a89 101 } // namespace mbed