Add File::Open / Create functions to take an rtc::Pathname
When implementing ISOLATED_OUTDIR feature in WebRTC, I found two issues, 1. pathutils and flags are not accessible in testsupport. But both of them are useful for the feature. Pathname can help to combine path with filename, while a flag is needed to handle command line parameter. 2. rtc::File cannot accept an rtc::Pathname, which is a little bit inconvenient. After investigating bug webrtc:3806, flags, pathutils and urlencode are removed from rtc_base_approved because of the including of common.h. So I replaced common.h with checks.h, and ASSERT with RTC_DCHECK. flags, pathutils and urlencode pairs now can be placed into rtc_base_approved to unblock file.h to include pathutils.h. Please kindly let me know if you have other concerns about this change. BUG=webrtc:3806, webrtc:6732 CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:linux_chromium_rel_ng;master.tryserver.chromium.mac:mac_chromium_rel_ng;master.tryserver.chromium.win:win_chromium_rel_ng;master.tryserver.chromium.android:linux_android_rel_ng Review-Url: https://codereview.webrtc.org/2533213005 Cr-Commit-Position: refs/heads/master@{#15451}
This commit is contained in:
@ -126,6 +126,8 @@ rtc_static_library("rtc_base_approved") {
|
|||||||
"event_tracer.h",
|
"event_tracer.h",
|
||||||
"file.cc",
|
"file.cc",
|
||||||
"file.h",
|
"file.h",
|
||||||
|
"flags.cc",
|
||||||
|
"flags.h",
|
||||||
"format_macros.h",
|
"format_macros.h",
|
||||||
"function_view.h",
|
"function_view.h",
|
||||||
"ignore_wundef.h",
|
"ignore_wundef.h",
|
||||||
@ -139,6 +141,8 @@ rtc_static_library("rtc_base_approved") {
|
|||||||
"onetimeevent.h",
|
"onetimeevent.h",
|
||||||
"optional.cc",
|
"optional.cc",
|
||||||
"optional.h",
|
"optional.h",
|
||||||
|
"pathutils.cc",
|
||||||
|
"pathutils.h",
|
||||||
"platform_file.cc",
|
"platform_file.cc",
|
||||||
"platform_file.h",
|
"platform_file.h",
|
||||||
"platform_thread.cc",
|
"platform_thread.cc",
|
||||||
@ -179,6 +183,8 @@ rtc_static_library("rtc_base_approved") {
|
|||||||
"timeutils.h",
|
"timeutils.h",
|
||||||
"trace_event.h",
|
"trace_event.h",
|
||||||
"type_traits.h",
|
"type_traits.h",
|
||||||
|
"urlencode.cc",
|
||||||
|
"urlencode.h",
|
||||||
]
|
]
|
||||||
|
|
||||||
if (is_android) {
|
if (is_android) {
|
||||||
@ -413,8 +419,6 @@ rtc_static_library("rtc_base") {
|
|||||||
"filerotatingstream.h",
|
"filerotatingstream.h",
|
||||||
"fileutils.cc",
|
"fileutils.cc",
|
||||||
"fileutils.h",
|
"fileutils.h",
|
||||||
"flags.cc",
|
|
||||||
"flags.h",
|
|
||||||
"gunit_prod.h",
|
"gunit_prod.h",
|
||||||
"helpers.cc",
|
"helpers.cc",
|
||||||
"helpers.h",
|
"helpers.h",
|
||||||
@ -451,8 +455,6 @@ rtc_static_library("rtc_base") {
|
|||||||
"opensslidentity.h",
|
"opensslidentity.h",
|
||||||
"opensslstreamadapter.cc",
|
"opensslstreamadapter.cc",
|
||||||
"opensslstreamadapter.h",
|
"opensslstreamadapter.h",
|
||||||
"pathutils.cc",
|
|
||||||
"pathutils.h",
|
|
||||||
"physicalsocketserver.cc",
|
"physicalsocketserver.cc",
|
||||||
"physicalsocketserver.h",
|
"physicalsocketserver.h",
|
||||||
"proxydetect.cc",
|
"proxydetect.cc",
|
||||||
@ -509,8 +511,6 @@ rtc_static_library("rtc_base") {
|
|||||||
"taskrunner.h",
|
"taskrunner.h",
|
||||||
"thread.cc",
|
"thread.cc",
|
||||||
"thread.h",
|
"thread.h",
|
||||||
"urlencode.cc",
|
|
||||||
"urlencode.h",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# TODO(henrike): issue 3307, make rtc_base build with the Chromium default
|
# TODO(henrike): issue 3307, make rtc_base build with the Chromium default
|
||||||
|
|||||||
@ -10,8 +10,19 @@
|
|||||||
|
|
||||||
#include "webrtc/base/file.h"
|
#include "webrtc/base/file.h"
|
||||||
|
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
namespace rtc {
|
namespace rtc {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
std::string NormalizePathname(Pathname&& path) {
|
||||||
|
path.Normalize();
|
||||||
|
return path.pathname();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
File::File(PlatformFile file) : file_(file) {}
|
File::File(PlatformFile file) : file_(file) {}
|
||||||
|
|
||||||
File::File() : file_(kInvalidPlatformFileValue) {}
|
File::File() : file_(kInvalidPlatformFileValue) {}
|
||||||
@ -20,14 +31,36 @@ File::~File() {
|
|||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
File File::Open(const std::string& path) {
|
File File::Open(const std::string& path) {
|
||||||
return File(OpenPlatformFile(path));
|
return File(OpenPlatformFile(path));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
File File::Open(Pathname&& path) {
|
||||||
|
return Open(NormalizePathname(std::move(path)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
File File::Open(const Pathname& path) {
|
||||||
|
return Open(Pathname(path));
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
File File::Create(const std::string& path) {
|
File File::Create(const std::string& path) {
|
||||||
return File(CreatePlatformFile(path));
|
return File(CreatePlatformFile(path));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
File File::Create(Pathname&& path) {
|
||||||
|
return Create(NormalizePathname(std::move(path)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
File File::Create(const Pathname& path) {
|
||||||
|
return Create(Pathname(path));
|
||||||
|
}
|
||||||
|
|
||||||
File::File(File&& other) : file_(other.file_) {
|
File::File(File&& other) : file_(other.file_) {
|
||||||
other.file_ = kInvalidPlatformFileValue;
|
other.file_ = kInvalidPlatformFileValue;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,8 +15,9 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "webrtc/base/platform_file.h"
|
|
||||||
#include "webrtc/base/constructormagic.h"
|
#include "webrtc/base/constructormagic.h"
|
||||||
|
#include "webrtc/base/pathutils.h"
|
||||||
|
#include "webrtc/base/platform_file.h"
|
||||||
|
|
||||||
namespace rtc {
|
namespace rtc {
|
||||||
|
|
||||||
@ -39,8 +40,12 @@ class File {
|
|||||||
|
|
||||||
// Open and Create give files with both reading and writing enabled.
|
// Open and Create give files with both reading and writing enabled.
|
||||||
static File Open(const std::string& path);
|
static File Open(const std::string& path);
|
||||||
|
static File Open(Pathname&& path);
|
||||||
|
static File Open(const Pathname& path);
|
||||||
// If the file already exists it will be overwritten.
|
// If the file already exists it will be overwritten.
|
||||||
static File Create(const std::string& path);
|
static File Create(const std::string& path);
|
||||||
|
static File Create(Pathname&& path);
|
||||||
|
static File Create(const Pathname& path);
|
||||||
|
|
||||||
size_t Write(const uint8_t* data, size_t length);
|
size_t Write(const uint8_t* data, size_t length);
|
||||||
size_t Read(uint8_t* buffer, size_t length);
|
size_t Read(uint8_t* buffer, size_t length);
|
||||||
|
|||||||
@ -163,4 +163,30 @@ TEST_F(FileTest, RandomAccessReadWrite) {
|
|||||||
EXPECT_TRUE(VerifyBuffer(out, 2, 0));
|
EXPECT_TRUE(VerifyBuffer(out, 2, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(FileTest, OpenFromPathname) {
|
||||||
|
{
|
||||||
|
File file = File::Open(Pathname(path_));
|
||||||
|
ASSERT_TRUE(file.IsOpen()) << "Error: " << LastError();
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
Pathname path(path_);
|
||||||
|
File file = File::Open(path);
|
||||||
|
ASSERT_TRUE(file.IsOpen()) << "Error: " << LastError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(FileTest, CreateFromPathname) {
|
||||||
|
{
|
||||||
|
File file = File::Create(Pathname(path_));
|
||||||
|
ASSERT_TRUE(file.IsOpen()) << "Error: " << LastError();
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
Pathname path(path_);
|
||||||
|
File file = File::Create(path);
|
||||||
|
ASSERT_TRUE(file.IsOpen()) << "Error: " << LastError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace rtc
|
} // namespace rtc
|
||||||
|
|||||||
@ -21,8 +21,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "webrtc/base/basictypes.h"
|
#include "webrtc/base/checks.h"
|
||||||
#include "webrtc/base/common.h"
|
|
||||||
#include "webrtc/base/constructormagic.h"
|
#include "webrtc/base/constructormagic.h"
|
||||||
#include "webrtc/base/platform_file.h"
|
#include "webrtc/base/platform_file.h"
|
||||||
|
|
||||||
@ -175,14 +174,14 @@ class FilesystemInterface {
|
|||||||
organization_name_ = organization;
|
organization_name_ = organization;
|
||||||
}
|
}
|
||||||
void GetOrganizationName(std::string* organization) {
|
void GetOrganizationName(std::string* organization) {
|
||||||
ASSERT(NULL != organization);
|
RTC_DCHECK(organization);
|
||||||
*organization = organization_name_;
|
*organization = organization_name_;
|
||||||
}
|
}
|
||||||
void SetApplicationName(const std::string& application) {
|
void SetApplicationName(const std::string& application) {
|
||||||
application_name_ = application;
|
application_name_ = application;
|
||||||
}
|
}
|
||||||
void GetApplicationName(std::string* application) {
|
void GetApplicationName(std::string* application) {
|
||||||
ASSERT(NULL != application);
|
RTC_DCHECK(application);
|
||||||
*application = application_name_;
|
*application = application_name_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,7 +193,7 @@ class FilesystemInterface {
|
|||||||
class Filesystem {
|
class Filesystem {
|
||||||
public:
|
public:
|
||||||
static FilesystemInterface *default_filesystem() {
|
static FilesystemInterface *default_filesystem() {
|
||||||
ASSERT(default_filesystem_ != NULL);
|
RTC_DCHECK(default_filesystem_);
|
||||||
return default_filesystem_;
|
return default_filesystem_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -24,7 +24,6 @@
|
|||||||
#define WEBRTC_BASE_FLAGS_H__
|
#define WEBRTC_BASE_FLAGS_H__
|
||||||
|
|
||||||
#include "webrtc/base/checks.h"
|
#include "webrtc/base/checks.h"
|
||||||
#include "webrtc/base/common.h"
|
|
||||||
#include "webrtc/base/constructormagic.h"
|
#include "webrtc/base/constructormagic.h"
|
||||||
|
|
||||||
namespace rtc {
|
namespace rtc {
|
||||||
|
|||||||
@ -15,7 +15,7 @@
|
|||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
#endif // WEBRTC_WIN
|
#endif // WEBRTC_WIN
|
||||||
|
|
||||||
#include "webrtc/base/common.h"
|
#include "webrtc/base/checks.h"
|
||||||
#include "webrtc/base/fileutils.h"
|
#include "webrtc/base/fileutils.h"
|
||||||
#include "webrtc/base/logging.h"
|
#include "webrtc/base/logging.h"
|
||||||
#include "webrtc/base/pathutils.h"
|
#include "webrtc/base/pathutils.h"
|
||||||
@ -72,7 +72,7 @@ Pathname& Pathname::operator=(const Pathname&) = default;
|
|||||||
Pathname& Pathname::operator=(Pathname&&) = default;
|
Pathname& Pathname::operator=(Pathname&&) = default;
|
||||||
|
|
||||||
void Pathname::SetFolderDelimiter(char delimiter) {
|
void Pathname::SetFolderDelimiter(char delimiter) {
|
||||||
ASSERT(IsFolderDelimiter(delimiter));
|
RTC_DCHECK(IsFolderDelimiter(delimiter));
|
||||||
folder_delimiter_ = delimiter;
|
folder_delimiter_ = delimiter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -12,8 +12,8 @@
|
|||||||
#define WEBRTC_BASE_PATHUTILS_H__
|
#define WEBRTC_BASE_PATHUTILS_H__
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
// Temporary, until deprecated helpers are removed.
|
|
||||||
#include "webrtc/base/fileutils.h"
|
#include "webrtc/base/checks.h"
|
||||||
|
|
||||||
namespace rtc {
|
namespace rtc {
|
||||||
|
|
||||||
@ -108,63 +108,6 @@ private:
|
|||||||
char folder_delimiter_;
|
char folder_delimiter_;
|
||||||
};
|
};
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Global Helpers (deprecated)
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
inline void SetOrganizationName(const std::string& organization) {
|
|
||||||
Filesystem::SetOrganizationName(organization);
|
|
||||||
}
|
|
||||||
inline void SetApplicationName(const std::string& application) {
|
|
||||||
Filesystem::SetApplicationName(application);
|
|
||||||
}
|
|
||||||
inline void GetOrganizationName(std::string* organization) {
|
|
||||||
Filesystem::GetOrganizationName(organization);
|
|
||||||
}
|
|
||||||
inline void GetApplicationName(std::string* application) {
|
|
||||||
Filesystem::GetApplicationName(application);
|
|
||||||
}
|
|
||||||
inline bool CreateFolder(const Pathname& path) {
|
|
||||||
return Filesystem::CreateFolder(path);
|
|
||||||
}
|
|
||||||
inline bool FinishPath(Pathname& path, bool create, const std::string& append) {
|
|
||||||
if (!append.empty())
|
|
||||||
path.AppendFolder(append);
|
|
||||||
return !create || CreateFolder(path);
|
|
||||||
}
|
|
||||||
// Note: this method uses the convention of <temp>/<appname> for the temporary
|
|
||||||
// folder. Filesystem uses <temp>/<exename>. We will be migrating exclusively
|
|
||||||
// to <temp>/<orgname>/<appname> eventually. Since these are temp folders,
|
|
||||||
// it's probably ok to orphan them during the transition.
|
|
||||||
inline bool GetTemporaryFolder(Pathname& path, bool create,
|
|
||||||
const std::string& append) {
|
|
||||||
std::string application_name;
|
|
||||||
Filesystem::GetApplicationName(&application_name);
|
|
||||||
ASSERT(!application_name.empty());
|
|
||||||
return Filesystem::GetTemporaryFolder(path, create, &application_name)
|
|
||||||
&& FinishPath(path, create, append);
|
|
||||||
}
|
|
||||||
inline bool GetAppDataFolder(Pathname& path, bool create,
|
|
||||||
const std::string& append) {
|
|
||||||
ASSERT(!create); // TODO: Support create flag on Filesystem::GetAppDataFolder.
|
|
||||||
return Filesystem::GetAppDataFolder(&path, true)
|
|
||||||
&& FinishPath(path, create, append);
|
|
||||||
}
|
|
||||||
inline bool CleanupTemporaryFolder() {
|
|
||||||
Pathname path;
|
|
||||||
if (!GetTemporaryFolder(path, false, ""))
|
|
||||||
return false;
|
|
||||||
if (Filesystem::IsAbsent(path))
|
|
||||||
return true;
|
|
||||||
if (!Filesystem::IsTemporaryPath(path)) {
|
|
||||||
ASSERT(false);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return Filesystem::DeleteFolderContents(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
} // namespace rtc
|
} // namespace rtc
|
||||||
|
|
||||||
#endif // WEBRTC_BASE_PATHUTILS_H__
|
#endif // WEBRTC_BASE_PATHUTILS_H__
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
#include "webrtc/base/urlencode.h"
|
#include "webrtc/base/urlencode.h"
|
||||||
|
|
||||||
#include "webrtc/base/common.h"
|
#include "webrtc/base/checks.h"
|
||||||
#include "webrtc/base/stringutils.h"
|
#include "webrtc/base/stringutils.h"
|
||||||
|
|
||||||
static int HexPairValue(const char * code) {
|
static int HexPairValue(const char * code) {
|
||||||
@ -114,7 +114,7 @@ int InternalUrlEncode(const char *source, char *dest, unsigned int max,
|
|||||||
}
|
}
|
||||||
source++;
|
source++;
|
||||||
}
|
}
|
||||||
ASSERT(static_cast<unsigned int>(dest - start) < max);
|
RTC_DCHECK_LT(static_cast<unsigned int>(dest - start), max);
|
||||||
*dest = 0;
|
*dest = 0;
|
||||||
|
|
||||||
return static_cast<int>(dest - start);
|
return static_cast<int>(dest - start);
|
||||||
|
|||||||
Reference in New Issue
Block a user