blob: 34106c50092f03a1610a97435223781ab68312bb [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PACKAGES_FILE_SELECTOR_FILE_SELECTOR_WINDOWS_WINDOWS_TEST_TEST_UTILS_H_
#define PACKAGES_FILE_SELECTOR_FILE_SELECTOR_WINDOWS_WINDOWS_TEST_TEST_UTILS_H_
#include <comdef.h>
#include <comip.h>
#include <shlobj.h>
#include <shobjidl.h>
#include <windows.h>
#include <memory>
#include <string>
#include <type_traits>
#include <variant>
#include "file_dialog_controller.h"
_COM_SMARTPTR_TYPEDEF(IShellItem, IID_IShellItem);
_COM_SMARTPTR_TYPEDEF(IShellItemArray, IID_IShellItemArray);
namespace file_selector_windows {
namespace test {
// Creates a temp file, managed as an IShellItem, which will be deleted when
// the instance goes out of scope.
//
// This creates a file on the filesystem since creating IShellItem instances for
// files that don't exist is non-trivial.
class ScopedTestShellItem {
public:
ScopedTestShellItem();
~ScopedTestShellItem();
// Disallow copy and assign.
ScopedTestShellItem(const ScopedTestShellItem&) = delete;
ScopedTestShellItem& operator=(const ScopedTestShellItem&) = delete;
// Returns the file's IShellItem reference.
IShellItemPtr file() { return item_; }
// Returns the file's path.
const std::wstring& path() { return path_; }
private:
IShellItemPtr item_;
std::wstring path_;
};
// Creates a temp file, managed as an ITEMIDLIST, which will be deleted when
// the instance goes out of scope.
//
// This creates a file on the filesystem since creating IShellItem instances for
// files that don't exist is non-trivial, and this is intended for use in
// creating IShellItemArray instances.
class ScopedTestFileIdList {
public:
ScopedTestFileIdList();
~ScopedTestFileIdList();
// Disallow copy and assign.
ScopedTestFileIdList(const ScopedTestFileIdList&) = delete;
ScopedTestFileIdList& operator=(const ScopedTestFileIdList&) = delete;
// Returns the file's ITEMIDLIST reference.
PIDLIST_ABSOLUTE file() { return item_.get(); }
// Returns the file's path.
const std::wstring& path() { return path_; }
private:
// Smart pointer for managing ITEMIDLIST instances.
struct ItemIdListDeleter {
void operator()(LPITEMIDLIST item) {
if (item) {
::ILFree(item);
}
}
};
using ItemIdListPtr = std::unique_ptr<std::remove_pointer_t<PIDLIST_ABSOLUTE>,
ItemIdListDeleter>;
ItemIdListPtr item_;
std::wstring path_;
};
} // namespace test
} // namespace file_selector_windows
#endif // PACKAGES_FILE_SELECTOR_FILE_SELECTOR_WINDOWS_WINDOWS_TEST_TEST_UTILS_H_