[Win] Remove -DUCHAR_TYPE=wchar_t stopgap and learn to live with char16_t.
[WebKit-https.git] / Source / WebCore / platform / graphics / win / IconWin.cpp
1 /*
2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
3 * Copyright (C) 2007-2009 Torch Mobile, Inc.
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 * Library General Public License for more details.
14 *
15 * You should have received a copy of the GNU Library General Public License
16 * along with this library; see the file COPYING.LIB.  If not, write to
17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
19 *
20 */
21
22 #include "config.h"
23 #include "Icon.h"
24
25 #include "GraphicsContext.h"
26 #include "LocalWindowsContext.h"
27 #include <windows.h>
28 #include <wtf/text/WTFString.h>
29
30 namespace WebCore {
31
32 static const int shell32MultipleFileIconIndex = 54;
33
34 Icon::Icon(HICON icon)
35     : m_hIcon(icon)
36 {
37     ASSERT(icon);
38 }
39
40 Icon::~Icon()
41 {
42     DestroyIcon(m_hIcon);
43 }
44
45 // FIXME: Move the code to ChromeClient::iconForFiles().
46 RefPtr<Icon> Icon::createIconForFiles(const Vector<String>& filenames)
47 {
48     if (filenames.isEmpty())
49         return 0;
50
51     if (filenames.size() == 1) {
52         SHFILEINFO sfi;
53         memset(&sfi, 0, sizeof(sfi));
54
55         String tmpFilename = filenames[0];
56         if (!SHGetFileInfo(tmpFilename.wideCharacters().data(), 0, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_SHELLICONSIZE | SHGFI_SMALLICON))
57             return 0;
58
59         return adoptRef(new Icon(sfi.hIcon));
60     }
61
62     WCHAR buffer[MAX_PATH];
63     UINT length = ::GetSystemDirectoryW(buffer, WTF_ARRAY_LENGTH(buffer));
64     if (!length)
65         return 0;
66
67     if (wcscat_s(buffer, L"\\shell32.dll"))
68         return 0;
69
70     HICON hIcon;
71     if (!::ExtractIconExW(buffer, shell32MultipleFileIconIndex, 0, &hIcon, 1))
72         return 0;
73     return adoptRef(new Icon(hIcon));
74 }
75
76 void Icon::paint(GraphicsContext& context, const FloatRect& r)
77 {
78     if (context.paintingDisabled())
79         return;
80
81     LocalWindowsContext windowContext(context, enclosingIntRect(r));
82     DrawIconEx(windowContext.hdc(), r.x(), r.y(), m_hIcon, r.width(), r.height(), 0, 0, DI_NORMAL);
83 }
84
85 }