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