2 * Copyright 2013 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
10 #include "SkTFitsIn.h"
16 bool sk_exists(const char *path, SkFILE_Flags flags) {
17 int mode = 0; // existence
18 if (flags & kRead_SkFILE_Flag) {
21 if (flags & kWrite_SkFILE_Flag) {
24 return (0 == _access(path, mode));
33 static bool sk_ino(SkFILE* f, SkFILEID* id) {
34 int fileno = _fileno((FILE*)f);
39 HANDLE file = (HANDLE)_get_osfhandle(fileno);
40 if (INVALID_HANDLE_VALUE == file) {
44 //TODO: call GetFileInformationByHandleEx on Vista and later with FileIdInfo.
45 BY_HANDLE_FILE_INFORMATION info;
46 if (0 == GetFileInformationByHandle(file, &info)) {
49 id->fVolume = info.dwVolumeSerialNumber;
50 id->fLsbSize = info.nFileIndexLow + (((ULONGLONG)info.nFileIndexHigh) << 32);
56 bool sk_fidentical(SkFILE* a, SkFILE* b) {
58 return sk_ino(a, &aID) && sk_ino(b, &bID)
59 && aID.fLsbSize == bID.fLsbSize
60 && aID.fMsbSize == bID.fMsbSize
61 && aID.fVolume == bID.fVolume;
64 class SkAutoNullKernelHandle : SkNoncopyable {
66 SkAutoNullKernelHandle(const HANDLE handle) : fHandle(handle) { }
67 ~SkAutoNullKernelHandle() { CloseHandle(fHandle); }
68 operator HANDLE() const { return fHandle; }
69 bool isValid() const { return SkToBool(fHandle); }
73 typedef SkAutoNullKernelHandle SkAutoWinMMap;
75 void sk_fmunmap(const void* addr, size_t) {
76 UnmapViewOfFile(addr);
79 void* sk_fdmmap(int fileno, size_t* length) {
80 HANDLE file = (HANDLE)_get_osfhandle(fileno);
81 if (INVALID_HANDLE_VALUE == file) {
85 LARGE_INTEGER fileSize;
86 if (0 == GetFileSizeEx(file, &fileSize)) {
87 //TODO: use SK_TRACEHR(GetLastError(), "Could not get file size.") to report.
90 if (!SkTFitsIn<size_t>(fileSize.QuadPart)) {
94 SkAutoWinMMap mmap(CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL));
95 if (!mmap.isValid()) {
96 //TODO: use SK_TRACEHR(GetLastError(), "Could not create file mapping.") to report.
100 // Eventually call UnmapViewOfFile
101 void* addr = MapViewOfFile(mmap, FILE_MAP_READ, 0, 0, 0);
103 //TODO: use SK_TRACEHR(GetLastError(), "Could not map view of file.") to report.
107 *length = static_cast<size_t>(fileSize.QuadPart);
111 int sk_fileno(SkFILE* f) {
112 return _fileno((FILE*)f);
115 void* sk_fmmap(SkFILE* f, size_t* length) {
116 int fileno = sk_fileno(f);
121 return sk_fdmmap(fileno, length);