blob: 9f60f69fd2c1af8161287bca2cb069954a6651a2 [file] [log] [blame]
// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef STARBOARD_SHARED_WIN32_FILE_INTERNAL_H_
#define STARBOARD_SHARED_WIN32_FILE_INTERNAL_H_
#include <wtypes.h>
#include <cwchar> // This file included for std::wcslen.
#include <string>
#include "starboard/file.h"
#include "starboard/shared/internal_only.h"
namespace starboard {
namespace shared {
namespace win32 {
inline bool IsValidHandle(HANDLE handle) {
return handle != INVALID_HANDLE_VALUE;
}
} // namespace win32
} // namespace shared
} // namespace starboard
#pragma warning(push)
// SbFilePrivate is defined as a struct, but for windows implementation
// enough functionality has been added so that it warrants being a class
// per Google's C++ style guide. This mismatch causes the Microsoft's compiler
// to generate a warning.
#pragma warning(disable : 4099)
class SbFilePrivate {
public:
explicit SbFilePrivate(HANDLE handle) : file_handle(handle) {}
bool HasValidHandle() const {
return starboard::shared::win32::IsValidHandle(file_handle);
}
HANDLE file_handle;
// SbFilePrivate is neither copyable nor movable.
SbFilePrivate(const SbFilePrivate&) = delete;
SbFilePrivate& operator=(const SbFilePrivate&) = delete;
};
#pragma warning(pop)
namespace starboard {
namespace shared {
namespace win32 {
inline bool HasValidHandle(SbFile file) {
if (!SbFileIsValid(file)) {
return false;
}
return file->HasValidHandle();
}
inline bool PathEndsWith(const std::wstring& path, const wchar_t* filename) {
size_t filename_length = std::wcslen(filename);
if (filename_length > path.size()) {
return false;
}
size_t path_offset = path.size() - filename_length;
return _wcsicmp(path.c_str() + path_offset, filename) == 0;
}
// Path's from cobalt use "/" as a path separator. This function will
// replace all of the "/" with "\".
std::wstring NormalizeWin32Path(std::string str);
std::wstring NormalizeWin32Path(std::wstring str);
HANDLE OpenFileOrDirectory(const char* path,
int flags,
bool* out_created,
SbFileError* out_error);
} // namespace win32
} // namespace shared
} // namespace starboard
#endif // STARBOARD_SHARED_WIN32_FILE_INTERNAL_H_