Add our own (mojo::util::)ScopedFILE and replace uses of base::ScopedFILE with it.

It's entirely equivalent to base::ScopedFILE. For now, we continue to
use base's scoped_ptr, but we could use std::unique_ptr instead in the
future.

R=vardhan@google.com

Review URL: https://codereview.chromium.org/1347783002 .
diff --git a/mojo/edk/embedder/BUILD.gn b/mojo/edk/embedder/BUILD.gn
index 08a42fa..1cc513c 100644
--- a/mojo/edk/embedder/BUILD.gn
+++ b/mojo/edk/embedder/BUILD.gn
@@ -95,6 +95,8 @@
   if (is_android) {
     deps += [ "//third_party/ashmem" ]
   }
+
+  mojo_edk_deps = [ "mojo/edk/util" ]
 }
 
 mojo_edk_source_set("delegates") {
@@ -139,5 +141,6 @@
     "mojo/edk/test:test_support",
     "mojo/edk/system",
     "mojo/edk/system:test_utils",
+    "mojo/edk/util",
   ]
 }
diff --git a/mojo/edk/embedder/platform_channel_pair_posix_unittest.cc b/mojo/edk/embedder/platform_channel_pair_posix_unittest.cc
index 0b20f4b..8857ecc 100644
--- a/mojo/edk/embedder/platform_channel_pair_posix_unittest.cc
+++ b/mojo/edk/embedder/platform_channel_pair_posix_unittest.cc
@@ -15,7 +15,6 @@
 
 #include <deque>
 
-#include "base/files/scoped_file.h"
 #include "base/logging.h"
 #include "build/build_config.h"
 #include "mojo/edk/embedder/platform_channel_utils_posix.h"
@@ -23,6 +22,7 @@
 #include "mojo/edk/embedder/platform_handle_vector.h"
 #include "mojo/edk/embedder/scoped_platform_handle.h"
 #include "mojo/edk/test/test_utils.h"
+#include "mojo/edk/util/scoped_file.h"
 #include "mojo/public/cpp/system/macros.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -166,7 +166,7 @@
     const char c = '0' + (i % 10);
     ScopedPlatformHandleVectorPtr platform_handles(new PlatformHandleVector);
     for (size_t j = 1; j <= i; j++) {
-      base::ScopedFILE fp(NewTmpFile());
+      util::ScopedFILE fp(NewTmpFile());
       ASSERT_TRUE(fp);
       ASSERT_EQ(j, fwrite(std::string(j, c).data(), 1, j, fp.get()));
       platform_handles->push_back(
@@ -194,7 +194,7 @@
     EXPECT_EQ(i, received_handles.size());
 
     for (size_t j = 0; !received_handles.empty(); j++) {
-      base::ScopedFILE fp(test::FILEFromPlatformHandle(
+      util::ScopedFILE fp(test::FILEFromPlatformHandle(
           ScopedPlatformHandle(received_handles.front()), "rb"));
       received_handles.pop_front();
       ASSERT_TRUE(fp);
@@ -217,7 +217,7 @@
   const std::string file_contents("hello world");
 
   {
-    base::ScopedFILE fp(NewTmpFile());
+    util::ScopedFILE fp(NewTmpFile());
     ASSERT_TRUE(fp);
     ASSERT_EQ(file_contents.size(),
               fwrite(file_contents.data(), 1, file_contents.size(), fp.get()));
@@ -252,7 +252,7 @@
   EXPECT_TRUE(received_handles[1].is_valid());
 
   {
-    base::ScopedFILE fp(test::FILEFromPlatformHandle(
+    util::ScopedFILE fp(test::FILEFromPlatformHandle(
         ScopedPlatformHandle(received_handles[1]), "rb"));
     received_handles[1] = PlatformHandle();
     ASSERT_TRUE(fp);
diff --git a/mojo/edk/embedder/simple_platform_shared_buffer_posix.cc b/mojo/edk/embedder/simple_platform_shared_buffer_posix.cc
index 5e09e7d..613919d 100644
--- a/mojo/edk/embedder/simple_platform_shared_buffer_posix.cc
+++ b/mojo/edk/embedder/simple_platform_shared_buffer_posix.cc
@@ -15,11 +15,11 @@
 
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
 #include "base/logging.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/sys_info.h"
 #include "base/threading/thread_restrictions.h"
+#include "mojo/edk/util/scoped_file.h"
 
 // We assume that |size_t| and |off_t| (type for |ftruncate()|) fits in a
 // |uint64_t|.
@@ -56,7 +56,7 @@
     return false;
   }
   base::FilePath shared_buffer_file;
-  base::ScopedFILE fp(base::CreateAndOpenTemporaryFileInDir(
+  util::ScopedFILE fp(base::CreateAndOpenTemporaryFileInDir(
       shared_buffer_dir, &shared_buffer_file));
   if (!fp) {
     LOG(ERROR) << "Failed to create/open temporary file for shared memory";
diff --git a/mojo/edk/system/BUILD.gn b/mojo/edk/system/BUILD.gn
index 7323026..b8a1d18 100644
--- a/mojo/edk/system/BUILD.gn
+++ b/mojo/edk/system/BUILD.gn
@@ -219,6 +219,7 @@
     ":test_utils",
     "../embedder:embedder_unittests",
     "../test:test_support",
+    "../util",
     "//base",
     "//base/test:test_support",
     "//testing/gtest",
diff --git a/mojo/edk/system/multiprocess_message_pipe_unittest.cc b/mojo/edk/system/multiprocess_message_pipe_unittest.cc
index 4f28bc5..d67c1b7 100644
--- a/mojo/edk/system/multiprocess_message_pipe_unittest.cc
+++ b/mojo/edk/system/multiprocess_message_pipe_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/location.h"
 #include "base/logging.h"
@@ -28,6 +27,7 @@
 #include "mojo/edk/system/shared_buffer_dispatcher.h"
 #include "mojo/edk/system/test_utils.h"
 #include "mojo/edk/test/test_utils.h"
+#include "mojo/edk/util/scoped_file.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
@@ -431,7 +431,7 @@
     CHECK(h.is_valid());
     dispatcher->Close();
 
-    base::ScopedFILE fp(mojo::test::FILEFromPlatformHandle(h.Pass(), "r"));
+    util::ScopedFILE fp(mojo::test::FILEFromPlatformHandle(h.Pass(), "r"));
     CHECK(fp);
     std::string fread_buffer(100, '\0');
     size_t bytes_read =
@@ -463,7 +463,7 @@
   size_t pipe_count = GetParam();
   for (size_t i = 0; i < pipe_count; ++i) {
     base::FilePath unused;
-    base::ScopedFILE fp(
+    util::ScopedFILE fp(
         CreateAndOpenTemporaryFileInDir(temp_dir.path(), &unused));
     const std::string world("world");
     CHECK_EQ(fwrite(&world[0], 1, world.size(), fp.get()), world.size());
diff --git a/mojo/edk/system/platform_handle_dispatcher_unittest.cc b/mojo/edk/system/platform_handle_dispatcher_unittest.cc
index 55887a7..f3426a2 100644
--- a/mojo/edk/system/platform_handle_dispatcher_unittest.cc
+++ b/mojo/edk/system/platform_handle_dispatcher_unittest.cc
@@ -8,10 +8,10 @@
 
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/memory/ref_counted.h"
 #include "mojo/edk/test/test_utils.h"
+#include "mojo/edk/util/scoped_file.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
@@ -25,7 +25,7 @@
   static const char kHelloWorld[] = "hello world";
 
   base::FilePath unused;
-  base::ScopedFILE fp(
+  util::ScopedFILE fp(
       CreateAndOpenTemporaryFileInDir(temp_dir.path(), &unused));
   ASSERT_TRUE(fp);
   EXPECT_EQ(sizeof(kHelloWorld),
@@ -68,7 +68,7 @@
   static const char kFooBar[] = "foo bar";
 
   base::FilePath unused;
-  base::ScopedFILE fp(
+  util::ScopedFILE fp(
       CreateAndOpenTemporaryFileInDir(temp_dir.path(), &unused));
   EXPECT_EQ(sizeof(kFooBar), fwrite(kFooBar, 1, sizeof(kFooBar), fp.get()));
 
diff --git a/mojo/edk/system/raw_channel_unittest.cc b/mojo/edk/system/raw_channel_unittest.cc
index 9f7838c..db11b5b 100644
--- a/mojo/edk/system/raw_channel_unittest.cc
+++ b/mojo/edk/system/raw_channel_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/location.h"
 #include "base/logging.h"
@@ -30,6 +29,7 @@
 #include "mojo/edk/system/transport_data.h"
 #include "mojo/edk/test/test_io_thread.h"
 #include "mojo/edk/test/test_utils.h"
+#include "mojo/edk/util/scoped_file.h"
 #include "mojo/public/cpp/system/macros.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -763,7 +763,7 @@
     {
       char buffer[100] = {};
 
-      base::ScopedFILE fp(mojo::test::FILEFromPlatformHandle(h1.Pass(), "rb"));
+      util::ScopedFILE fp(mojo::test::FILEFromPlatformHandle(h1.Pass(), "rb"));
       EXPECT_TRUE(fp);
       rewind(fp.get());
       EXPECT_EQ(1u, fread(buffer, 1, sizeof(buffer), fp.get()));
@@ -772,7 +772,7 @@
 
     {
       char buffer[100] = {};
-      base::ScopedFILE fp(mojo::test::FILEFromPlatformHandle(h2.Pass(), "rb"));
+      util::ScopedFILE fp(mojo::test::FILEFromPlatformHandle(h2.Pass(), "rb"));
       EXPECT_TRUE(fp);
       rewind(fp.get());
       EXPECT_EQ(1u, fread(buffer, 1, sizeof(buffer), fp.get()));
@@ -817,10 +817,10 @@
                                           base::Unretained(&read_delegate)));
 
   base::FilePath unused;
-  base::ScopedFILE fp1(
+  util::ScopedFILE fp1(
       base::CreateAndOpenTemporaryFileInDir(temp_dir.path(), &unused));
   EXPECT_EQ(1u, fwrite("1", 1, 1, fp1.get()));
-  base::ScopedFILE fp2(
+  util::ScopedFILE fp2(
       base::CreateAndOpenTemporaryFileInDir(temp_dir.path(), &unused));
   EXPECT_EQ(1u, fwrite("2", 1, 1, fp2.get()));
 
diff --git a/mojo/edk/system/remote_message_pipe_unittest.cc b/mojo/edk/system/remote_message_pipe_unittest.cc
index 70d0960..25b91c0 100644
--- a/mojo/edk/system/remote_message_pipe_unittest.cc
+++ b/mojo/edk/system/remote_message_pipe_unittest.cc
@@ -11,7 +11,6 @@
 #include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/location.h"
 #include "base/logging.h"
@@ -34,6 +33,7 @@
 #include "mojo/edk/system/waiter.h"
 #include "mojo/edk/test/test_io_thread.h"
 #include "mojo/edk/test/test_utils.h"
+#include "mojo/edk/util/scoped_file.h"
 #include "mojo/public/cpp/system/macros.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -1040,7 +1040,7 @@
   BootstrapChannelEndpoints(ep0, ep1);
 
   base::FilePath unused;
-  base::ScopedFILE fp(
+  util::ScopedFILE fp(
       base::CreateAndOpenTemporaryFileInDir(temp_dir.path(), &unused));
   EXPECT_EQ(sizeof(kHello), fwrite(kHello, 1, sizeof(kHello), fp.get()));
   // We'll try to pass this dispatcher, which will cause a |PlatformHandle| to
diff --git a/mojo/edk/test/BUILD.gn b/mojo/edk/test/BUILD.gn
index e07bbae..225fc6b 100644
--- a/mojo/edk/test/BUILD.gn
+++ b/mojo/edk/test/BUILD.gn
@@ -26,7 +26,10 @@
     "//testing/gtest",
   ]
 
-  mojo_edk_deps = [ "mojo/edk/system" ]
+  mojo_edk_deps = [
+    "mojo/edk/system",
+    "mojo/edk/util",
+  ]
 
   mojo_sdk_public_deps = [ "mojo/public/cpp/system" ]
 }
diff --git a/mojo/edk/test/test_utils.h b/mojo/edk/test/test_utils.h
index 9c21a1a..fad57ba 100644
--- a/mojo/edk/test/test_utils.h
+++ b/mojo/edk/test/test_utils.h
@@ -10,9 +10,9 @@
 
 #include <string>
 
-#include "base/files/scoped_file.h"
 #include "mojo/edk/embedder/platform_handle.h"
 #include "mojo/edk/embedder/scoped_platform_handle.h"
+#include "mojo/edk/util/scoped_file.h"
 
 namespace mojo {
 namespace test {
@@ -41,10 +41,10 @@
                      size_t* bytes_read);
 
 // Gets a (scoped) |PlatformHandle| from the given (scoped) |FILE|.
-embedder::ScopedPlatformHandle PlatformHandleFromFILE(base::ScopedFILE fp);
+embedder::ScopedPlatformHandle PlatformHandleFromFILE(util::ScopedFILE fp);
 
 // Gets a (scoped) |FILE| from a (scoped) |PlatformHandle|.
-base::ScopedFILE FILEFromPlatformHandle(embedder::ScopedPlatformHandle h,
+util::ScopedFILE FILEFromPlatformHandle(embedder::ScopedPlatformHandle h,
                                         const char* mode);
 
 }  // namespace test
diff --git a/mojo/edk/test/test_utils_posix.cc b/mojo/edk/test/test_utils_posix.cc
index 182aa33..46f50e2 100644
--- a/mojo/edk/test/test_utils_posix.cc
+++ b/mojo/edk/test/test_utils_posix.cc
@@ -7,6 +7,7 @@
 #include <fcntl.h>
 #include <unistd.h>
 
+#include "base/logging.h"
 #include "base/posix/eintr_wrapper.h"
 
 namespace mojo {
@@ -72,17 +73,17 @@
   return true;
 }
 
-embedder::ScopedPlatformHandle PlatformHandleFromFILE(base::ScopedFILE fp) {
+embedder::ScopedPlatformHandle PlatformHandleFromFILE(util::ScopedFILE fp) {
   CHECK(fp);
   int rv = dup(fileno(fp.get()));
   PCHECK(rv != -1) << "dup";
   return embedder::ScopedPlatformHandle(embedder::PlatformHandle(rv));
 }
 
-base::ScopedFILE FILEFromPlatformHandle(embedder::ScopedPlatformHandle h,
+util::ScopedFILE FILEFromPlatformHandle(embedder::ScopedPlatformHandle h,
                                         const char* mode) {
   CHECK(h.is_valid());
-  base::ScopedFILE rv(fdopen(h.release().fd, mode));
+  util::ScopedFILE rv(fdopen(h.release().fd, mode));
   PCHECK(rv) << "fdopen";
   return rv.Pass();
 }
diff --git a/mojo/edk/test/test_utils_win.cc b/mojo/edk/test/test_utils_win.cc
index c74f009..0750cba 100644
--- a/mojo/edk/test/test_utils_win.cc
+++ b/mojo/edk/test/test_utils_win.cc
@@ -77,7 +77,7 @@
   return true;
 }
 
-embedder::ScopedPlatformHandle PlatformHandleFromFILE(base::ScopedFILE fp) {
+embedder::ScopedPlatformHandle PlatformHandleFromFILE(util::ScopedFILE fp) {
   CHECK(fp);
 
   HANDLE rv = INVALID_HANDLE_VALUE;
@@ -89,7 +89,7 @@
   return embedder::ScopedPlatformHandle(embedder::PlatformHandle(rv));
 }
 
-base::ScopedFILE FILEFromPlatformHandle(embedder::ScopedPlatformHandle h,
+util::ScopedFILE FILEFromPlatformHandle(embedder::ScopedPlatformHandle h,
                                         const char* mode) {
   CHECK(h.is_valid());
   // Microsoft's documentation for |_open_osfhandle()| only discusses these
@@ -101,7 +101,7 @@
     flags |= _O_RDONLY;
   if (strchr(mode, 't'))
     flags |= _O_TEXT;
-  base::ScopedFILE rv(_fdopen(
+  util::ScopedFILE rv(_fdopen(
       _open_osfhandle(reinterpret_cast<intptr_t>(h.release().handle), flags),
       mode));
   PCHECK(rv) << "_fdopen";
diff --git a/mojo/edk/util/BUILD.gn b/mojo/edk/util/BUILD.gn
new file mode 100644
index 0000000..455a6c6
--- /dev/null
+++ b/mojo/edk/util/BUILD.gn
@@ -0,0 +1,22 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("../mojo_edk.gni")
+
+mojo_edk_source_set("util") {
+  sources = [
+    "scoped_file.h",
+  ]
+
+  defines = [
+    "MOJO_SYSTEM_IMPL_IMPLEMENTATION",
+    "MOJO_SYSTEM_IMPLEMENTATION",
+  ]
+
+  mojo_edk_configs = [ "mojo/edk/system:system_config" ]
+
+  deps = [
+    "//base",
+  ]
+}
diff --git a/mojo/edk/util/scoped_file.h b/mojo/edk/util/scoped_file.h
new file mode 100644
index 0000000..7aeb868
--- /dev/null
+++ b/mojo/edk/util/scoped_file.h
@@ -0,0 +1,32 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MOJO_EDK_UTIL_SCOPED_FILE_H_
+#define MOJO_EDK_UTIL_SCOPED_FILE_H_
+
+#include <stdio.h>
+
+#include "base/memory/scoped_ptr.h"
+
+namespace mojo {
+namespace util {
+namespace internal {
+
+// Functor for |ScopedFILE| (below).
+struct ScopedFILECloser {
+  inline void operator()(FILE* x) const {
+    if (x)
+      fclose(x);
+  }
+};
+
+}  // namespace internal
+
+// Automatically closes |FILE*|s.
+using ScopedFILE = scoped_ptr<FILE, internal::ScopedFILECloser>;
+
+}  // namespace util
+}  // namespace mojo
+
+#endif  // MOJO_EDK_UTIL_SCOPED_FILE_H_