14f94c520f8d699a5973956a1716272146be17128Zonr Chang/* 24f94c520f8d699a5973956a1716272146be17128Zonr Chang * Copyright 2012, The Android Open Source Project 34f94c520f8d699a5973956a1716272146be17128Zonr Chang * 44f94c520f8d699a5973956a1716272146be17128Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License"); 54f94c520f8d699a5973956a1716272146be17128Zonr Chang * you may not use this file except in compliance with the License. 64f94c520f8d699a5973956a1716272146be17128Zonr Chang * You may obtain a copy of the License at 74f94c520f8d699a5973956a1716272146be17128Zonr Chang * 84f94c520f8d699a5973956a1716272146be17128Zonr Chang * http://www.apache.org/licenses/LICENSE-2.0 94f94c520f8d699a5973956a1716272146be17128Zonr Chang * 104f94c520f8d699a5973956a1716272146be17128Zonr Chang * Unless required by applicable law or agreed to in writing, software 114f94c520f8d699a5973956a1716272146be17128Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS, 124f94c520f8d699a5973956a1716272146be17128Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134f94c520f8d699a5973956a1716272146be17128Zonr Chang * See the License for the specific language governing permissions and 144f94c520f8d699a5973956a1716272146be17128Zonr Chang * limitations under the License. 154f94c520f8d699a5973956a1716272146be17128Zonr Chang */ 164f94c520f8d699a5973956a1716272146be17128Zonr Chang 17c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#ifndef BCC_SUPPORT_FILE_H 18c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#define BCC_SUPPORT_FILE_H 194f94c520f8d699a5973956a1716272146be17128Zonr Chang 20c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/Support/FileBase.h" 214f94c520f8d699a5973956a1716272146be17128Zonr Chang 224f94c520f8d699a5973956a1716272146be17128Zonr Changnamespace bcc { 234f94c520f8d699a5973956a1716272146be17128Zonr Chang 244f94c520f8d699a5973956a1716272146be17128Zonr Changtemplate<enum FileBase::OpenModeEnum OpenMode> 254f94c520f8d699a5973956a1716272146be17128Zonr Changstruct FileAttribute { 264f94c520f8d699a5973956a1716272146be17128Zonr Chang // The flags to the 2nd argument in ::open(). 274f94c520f8d699a5973956a1716272146be17128Zonr Chang enum { kOpenFlags }; 284f94c520f8d699a5973956a1716272146be17128Zonr Chang 294f94c520f8d699a5973956a1716272146be17128Zonr Chang // Default value of LockMode. 304f94c520f8d699a5973956a1716272146be17128Zonr Chang enum { kDefaultLockMode }; 314f94c520f8d699a5973956a1716272146be17128Zonr Chang}; 324f94c520f8d699a5973956a1716272146be17128Zonr Chang 334f94c520f8d699a5973956a1716272146be17128Zonr Chang// FileAttribute for accessing read-only file 344f94c520f8d699a5973956a1716272146be17128Zonr Changtemplate<> 354f94c520f8d699a5973956a1716272146be17128Zonr Changstruct FileAttribute<FileBase::kReadMode> { 364f94c520f8d699a5973956a1716272146be17128Zonr Chang enum { kOpenFlags = O_RDONLY }; 374f94c520f8d699a5973956a1716272146be17128Zonr Chang enum { kDefaultLockMode = FileBase::kReadLock }; 384f94c520f8d699a5973956a1716272146be17128Zonr Chang}; 394f94c520f8d699a5973956a1716272146be17128Zonr Chang 404f94c520f8d699a5973956a1716272146be17128Zonr Chang// FileAttribute for accessing writable file 414f94c520f8d699a5973956a1716272146be17128Zonr Changtemplate<> 424f94c520f8d699a5973956a1716272146be17128Zonr Changstruct FileAttribute<FileBase::kWriteMode> { 43c02eae6f35de7dfd92233d591b27c05f15c2a6a1Shih-wei Liao enum { kOpenFlags = O_RDWR | O_CREAT }; 444f94c520f8d699a5973956a1716272146be17128Zonr Chang enum { kDefaultLockMode = FileBase::kWriteLock }; 454f94c520f8d699a5973956a1716272146be17128Zonr Chang}; 464f94c520f8d699a5973956a1716272146be17128Zonr Chang 474f94c520f8d699a5973956a1716272146be17128Zonr Changtemplate<enum FileBase::OpenModeEnum OpenMode> 484f94c520f8d699a5973956a1716272146be17128Zonr Changclass File : public FileBase { 494f94c520f8d699a5973956a1716272146be17128Zonr Changpublic: 504f94c520f8d699a5973956a1716272146be17128Zonr Chang File(const std::string &pFilename, unsigned pFlags) 514f94c520f8d699a5973956a1716272146be17128Zonr Chang : FileBase(pFilename, FileAttribute<OpenMode>::kOpenFlags, pFlags) { } 524f94c520f8d699a5973956a1716272146be17128Zonr Chang 534f94c520f8d699a5973956a1716272146be17128Zonr Chang inline bool lock(enum LockModeEnum pMode = static_cast<enum LockModeEnum>( 544f94c520f8d699a5973956a1716272146be17128Zonr Chang FileAttribute<OpenMode>::kDefaultLockMode), 554f94c520f8d699a5973956a1716272146be17128Zonr Chang bool pNonblocking = true, 564f94c520f8d699a5973956a1716272146be17128Zonr Chang unsigned pMaxRetry = FileBase::kDefaultMaxRetryLock, 574f94c520f8d699a5973956a1716272146be17128Zonr Chang useconds_t pRetryInterval = 584f94c520f8d699a5973956a1716272146be17128Zonr Chang FileBase::kDefaultRetryLockInterval) { 594f94c520f8d699a5973956a1716272146be17128Zonr Chang return FileBase::lock(pMode, pNonblocking, pMaxRetry, pRetryInterval); 604f94c520f8d699a5973956a1716272146be17128Zonr Chang } 614f94c520f8d699a5973956a1716272146be17128Zonr Chang 624f94c520f8d699a5973956a1716272146be17128Zonr Chang inline android::FileMap *createMap(off_t pOffset, size_t pLength, 634f94c520f8d699a5973956a1716272146be17128Zonr Chang bool pIsReadOnly = 644f94c520f8d699a5973956a1716272146be17128Zonr Chang (OpenMode == FileBase::kReadMode)) { 654f94c520f8d699a5973956a1716272146be17128Zonr Chang return FileBase::createMap(pOffset, pLength, pIsReadOnly); 664f94c520f8d699a5973956a1716272146be17128Zonr Chang } 674f94c520f8d699a5973956a1716272146be17128Zonr Chang}; 684f94c520f8d699a5973956a1716272146be17128Zonr Chang 694f94c520f8d699a5973956a1716272146be17128Zonr Chang 704f94c520f8d699a5973956a1716272146be17128Zonr Chang} // end namespace bcc 714f94c520f8d699a5973956a1716272146be17128Zonr Chang 72c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#endif // BCC_SUPPORT_FILE_H 73