147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2006 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/win32.h" 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <shellapi.h> 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <shlobj.h> 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <tchar.h> 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <time.h> 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/common.h" 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/diskcache.h" 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/pathutils.h" 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/stream.h" 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/stringencode.h" 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/stringutils.h" 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/diskcache_win32.h" 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool DiskCacheWin32::InitializeEntries() { 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Note: We could store the cache information in a separate file, for faster 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // initialization. Figuring it out empirically works, too. 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::wstring path16 = ToUtf16(folder_); 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org path16.append(1, '*'); 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org WIN32_FIND_DATA find_data; 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org HANDLE find_handle = FindFirstFile(path16.c_str(), &find_data); 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (find_handle != INVALID_HANDLE_VALUE) { 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org do { 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t index; 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string id; 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!FilenameToId(ToUtf8(find_data.cFileName), &id, &index)) 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org continue; 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Entry* entry = GetOrCreateEntry(id, true); 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org entry->size += find_data.nFileSizeLow; 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org total_size_ += find_data.nFileSizeLow; 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org entry->streams = _max(entry->streams, index + 1); 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org FileTimeToUnixTime(find_data.ftLastWriteTime, &entry->last_modified); 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } while (FindNextFile(find_handle, &find_data)); 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org FindClose(find_handle); 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return true; 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool DiskCacheWin32::PurgeFiles() { 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::wstring path16 = ToUtf16(folder_); 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org path16.append(1, '*'); 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org path16.append(1, '\0'); 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SHFILEOPSTRUCT file_op = { 0 }; 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org file_op.wFunc = FO_DELETE; 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org file_op.pFrom = path16.c_str(); 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org file_op.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org | FOF_NORECURSION | FOF_FILESONLY; 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (0 != SHFileOperation(&file_op)) { 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG_F(LS_ERROR) << "Couldn't delete cache files"; 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return false; 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return true; 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool DiskCacheWin32::FileExists(const std::string& filename) const { 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DWORD result = ::GetFileAttributes(ToUtf16(filename).c_str()); 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return (INVALID_FILE_ATTRIBUTES != result); 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool DiskCacheWin32::DeleteFile(const std::string& filename) const { 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return ::DeleteFile(ToUtf16(filename).c_str()) != 0; 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 87