/*
* Copyright 2012, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef BCC_SUPPORT_FILE_H
#define BCC_SUPPORT_FILE_H
#include "bcc/Support/FileBase.h"
namespace bcc {
template<enum FileBase::OpenModeEnum OpenMode>
struct FileAttribute {
// The flags to the 2nd argument in ::open().
enum { kOpenFlags };
// Default value of LockMode.
enum { kDefaultLockMode };
};
// FileAttribute for accessing read-only file
template<>
struct FileAttribute<FileBase::kReadMode> {
enum { kOpenFlags = O_RDONLY };
enum { kDefaultLockMode = FileBase::kReadLock };
};
// FileAttribute for accessing writable file
template<>
struct FileAttribute<FileBase::kWriteMode> {
enum { kOpenFlags = O_RDWR | O_CREAT };
enum { kDefaultLockMode = FileBase::kWriteLock };
};
template<enum FileBase::OpenModeEnum OpenMode>
class File : public FileBase {
public:
File(const std::string &pFilename, unsigned pFlags)
: FileBase(pFilename, FileAttribute<OpenMode>::kOpenFlags, pFlags) { }
inline bool lock(enum LockModeEnum pMode = static_cast<enum LockModeEnum>(
FileAttribute<OpenMode>::kDefaultLockMode),
bool pNonblocking = true,
unsigned pMaxRetry = FileBase::kDefaultMaxRetryLock,
useconds_t pRetryInterval =
FileBase::kDefaultRetryLockInterval) {
return FileBase::lock(pMode, pNonblocking, pMaxRetry, pRetryInterval);
}
inline android::FileMap *createMap(off_t pOffset, size_t pLength,
bool pIsReadOnly =
(OpenMode == FileBase::kReadMode)) {
return FileBase::createMap(pOffset, pLength, pIsReadOnly);
}
};
} // end namespace bcc
#endif // BCC_SUPPORT_FILE_H