Home | History | Annotate | Download | only in files
      1 // Copyright 2014 The Android Open Source Project
      2 //
      3 // This software is licensed under the terms of the GNU General Public
      4 // License version 2, as published by the Free Software Foundation, and
      5 // may be copied, distributed, and modified under those terms.
      6 //
      7 // This program is distributed in the hope that it will be useful,
      8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
      9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     10 // GNU General Public License for more details.
     11 
     12 #ifndef ANDROID_BASE_SCOPED_STDIO_FILE_H
     13 #define ANDROID_BASE_SCOPED_STDIO_FILE_H
     14 
     15 #include <stdio.h>
     16 
     17 namespace android {
     18 namespace base {
     19 
     20 // Helper class used to implement a scoped stdio FILE* pointer.
     21 // I.e. guarantees that the file is closed on scope exit, unless
     22 // the release() method is called. It is also possible to close
     23 // the file explicitly with close().
     24 class ScopedStdioFile {
     25 public:
     26     // Default constructor, uses an empty file.
     27     ScopedStdioFile() : mFile(NULL) {}
     28 
     29     // Regular constructor, takes owneship of |file|.
     30     explicit ScopedStdioFile(FILE* file) : mFile(file) {}
     31 
     32     // Destructor always calls close().
     33     ~ScopedStdioFile() { close(); }
     34 
     35     // Returns FILE* pointer directly.
     36     FILE* get() const { return mFile; }
     37 
     38     // Release the FILE* handle and return it to the caller, which becomes
     39     // its owner. Returns NULL if the instance was already closed or empty.
     40     FILE* release() {
     41         FILE* file = mFile;
     42         mFile = NULL;
     43         return file;
     44     }
     45 
     46     // Swap two scoped FILE* pointers.
     47     void swap(ScopedStdioFile* other) {
     48         FILE* tmp = other->mFile;
     49         other->mFile = mFile;
     50         mFile = tmp;
     51     }
     52 
     53     // Explicit close of a scoped FILE*.
     54     void close() {
     55         if (mFile) {
     56             ::fclose(mFile);
     57             mFile = NULL;
     58         }
     59     }
     60 private:
     61     FILE* mFile;
     62 };
     63 
     64 }  // namespace base
     65 }  // namespace android
     66 
     67 #endif  // ANDROID_BASE_SCOPED_STDIO_FILE_H
     68