1ef9e4f7b23f110093bce85b92d8522d496676098Logan/*
2ef9e4f7b23f110093bce85b92d8522d496676098Logan * Copyright 2010, The Android Open Source Project
3ef9e4f7b23f110093bce85b92d8522d496676098Logan *
4ef9e4f7b23f110093bce85b92d8522d496676098Logan * Licensed under the Apache License, Version 2.0 (the "License");
5ef9e4f7b23f110093bce85b92d8522d496676098Logan * you may not use this file except in compliance with the License.
6ef9e4f7b23f110093bce85b92d8522d496676098Logan * You may obtain a copy of the License at
7ef9e4f7b23f110093bce85b92d8522d496676098Logan *
8ef9e4f7b23f110093bce85b92d8522d496676098Logan *     http://www.apache.org/licenses/LICENSE-2.0
9ef9e4f7b23f110093bce85b92d8522d496676098Logan *
10ef9e4f7b23f110093bce85b92d8522d496676098Logan * Unless required by applicable law or agreed to in writing, software
11ef9e4f7b23f110093bce85b92d8522d496676098Logan * distributed under the License is distributed on an "AS IS" BASIS,
12ef9e4f7b23f110093bce85b92d8522d496676098Logan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ef9e4f7b23f110093bce85b92d8522d496676098Logan * See the License for the specific language governing permissions and
14ef9e4f7b23f110093bce85b92d8522d496676098Logan * limitations under the License.
15ef9e4f7b23f110093bce85b92d8522d496676098Logan */
16ef9e4f7b23f110093bce85b92d8522d496676098Logan
17ef9e4f7b23f110093bce85b92d8522d496676098Logan#ifndef BCC_FILEHANDLE_H
18ef9e4f7b23f110093bce85b92d8522d496676098Logan#define BCC_FILEHANDLE_H
19ef9e4f7b23f110093bce85b92d8522d496676098Logan
20ef9e4f7b23f110093bce85b92d8522d496676098Logan#include <sys/types.h>
21ef9e4f7b23f110093bce85b92d8522d496676098Logan
22ef9e4f7b23f110093bce85b92d8522d496676098Logan#include <stddef.h>
23ef9e4f7b23f110093bce85b92d8522d496676098Logan#include <stdint.h>
24ef9e4f7b23f110093bce85b92d8522d496676098Logan
25ef9e4f7b23f110093bce85b92d8522d496676098Logannamespace bcc {
26ef9e4f7b23f110093bce85b92d8522d496676098Logan  namespace OpenMode {
27ef9e4f7b23f110093bce85b92d8522d496676098Logan    enum ModeType {
2877124dfc0db4005d37dbd9d7e5e114dda4e3e430Logan      Read = 0,
2977124dfc0db4005d37dbd9d7e5e114dda4e3e430Logan      Write = 1,
30ef9e4f7b23f110093bce85b92d8522d496676098Logan    };
31ef9e4f7b23f110093bce85b92d8522d496676098Logan  }
32ef9e4f7b23f110093bce85b92d8522d496676098Logan
33ef9e4f7b23f110093bce85b92d8522d496676098Logan  class FileHandle {
34ef9e4f7b23f110093bce85b92d8522d496676098Logan  private:
35ef9e4f7b23f110093bce85b92d8522d496676098Logan    int mFD;
36ef9e4f7b23f110093bce85b92d8522d496676098Logan
37ef9e4f7b23f110093bce85b92d8522d496676098Logan  public:
38ef9e4f7b23f110093bce85b92d8522d496676098Logan    FileHandle() : mFD(-1) {
39ef9e4f7b23f110093bce85b92d8522d496676098Logan    }
40ef9e4f7b23f110093bce85b92d8522d496676098Logan
41ef9e4f7b23f110093bce85b92d8522d496676098Logan    ~FileHandle() {
42ef9e4f7b23f110093bce85b92d8522d496676098Logan      if (mFD >= 0) {
43ef9e4f7b23f110093bce85b92d8522d496676098Logan        close();
44ef9e4f7b23f110093bce85b92d8522d496676098Logan      }
45ef9e4f7b23f110093bce85b92d8522d496676098Logan    }
46ef9e4f7b23f110093bce85b92d8522d496676098Logan
47ef9e4f7b23f110093bce85b92d8522d496676098Logan    int open(char const *filename, OpenMode::ModeType mode);
48ef9e4f7b23f110093bce85b92d8522d496676098Logan
49ef9e4f7b23f110093bce85b92d8522d496676098Logan    void close();
50ef9e4f7b23f110093bce85b92d8522d496676098Logan
51ef9e4f7b23f110093bce85b92d8522d496676098Logan    int getFD() {
52ef9e4f7b23f110093bce85b92d8522d496676098Logan      // Note: This function is designed not being qualified by const.
53ef9e4f7b23f110093bce85b92d8522d496676098Logan      // Because once the file descriptor is given, the user can do every
54ef9e4f7b23f110093bce85b92d8522d496676098Logan      // thing on file descriptor.
55ef9e4f7b23f110093bce85b92d8522d496676098Logan
56ef9e4f7b23f110093bce85b92d8522d496676098Logan      return mFD;
57ef9e4f7b23f110093bce85b92d8522d496676098Logan    }
58ef9e4f7b23f110093bce85b92d8522d496676098Logan
59ef9e4f7b23f110093bce85b92d8522d496676098Logan    off_t seek(off_t offset, int whence);
60ef9e4f7b23f110093bce85b92d8522d496676098Logan
61ef9e4f7b23f110093bce85b92d8522d496676098Logan    ssize_t read(char *buf, size_t count);
62ef9e4f7b23f110093bce85b92d8522d496676098Logan
63ef9e4f7b23f110093bce85b92d8522d496676098Logan    ssize_t write(char const *buf, size_t count);
64ef9e4f7b23f110093bce85b92d8522d496676098Logan
65ef9e4f7b23f110093bce85b92d8522d496676098Logan    void truncate();
66ef9e4f7b23f110093bce85b92d8522d496676098Logan
67ef9e4f7b23f110093bce85b92d8522d496676098Logan  };
68ef9e4f7b23f110093bce85b92d8522d496676098Logan
69ef9e4f7b23f110093bce85b92d8522d496676098Logan} // namespace bcc
70ef9e4f7b23f110093bce85b92d8522d496676098Logan
71ef9e4f7b23f110093bce85b92d8522d496676098Logan#endif // BCC_FILEHANDLE_H
72