[Release] Webkit2-efl-123997_0.11.86
[framework/web/webkit-efl.git] / Source / WebKit / win / WebKitDLL.cpp
1 /*
2  * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "WebKitDLL.h"
28
29 #include "ForEachCoClass.h"
30 #include "resource.h"
31 #include "WebKit.h"
32 #include "WebKitClassFactory.h"
33 #include <WebCore/COMPtr.h>
34 #include <WebCore/IconDatabase.h>
35 #include <WebCore/Page.h>
36 #include <WebCore/PageGroup.h>
37 #include <WebCore/RenderThemeWin.h>
38 #include <WebCore/SharedBuffer.h>
39 #include <WebCore/WebCoreInstanceHandle.h>
40 #include <WebCore/Widget.h>
41 #include <olectl.h>
42 #include <wchar.h>
43 #include <wtf/Vector.h>
44
45 using namespace WebCore;
46
47 ULONG gLockCount;
48 ULONG gClassCount;
49 HashCountedSet<String> gClassNameCount;
50 HINSTANCE gInstance;
51
52 #define CLSID_FOR_CLASS(cls) CLSID_##cls,
53 CLSID gRegCLSIDs[] = {
54     FOR_EACH_COCLASS(CLSID_FOR_CLASS)
55 };
56 #undef CLSID_FOR_CLASS
57
58 STDAPI_(BOOL) DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID /*lpReserved*/)
59 {
60     switch (ul_reason_for_call) {
61         case DLL_PROCESS_ATTACH:
62             gLockCount = gClassCount = 0;
63             gInstance = hModule;
64             WebCore::setInstanceHandle(hModule);
65             return TRUE;
66
67         case DLL_PROCESS_DETACH:
68             WebCore::RenderThemeWin::setWebKitIsBeingUnloaded();
69             break;
70
71         case DLL_THREAD_ATTACH:
72         case DLL_THREAD_DETACH:
73             break;
74     }
75     return FALSE;
76 }
77
78 STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
79 {
80     bool found = false;
81     for (size_t i = 0; i < WTF_ARRAY_LENGTH(gRegCLSIDs); ++i) {
82         if (IsEqualGUID(rclsid, gRegCLSIDs[i])) {
83             found = true;
84             break;
85         }
86     }
87     if (!found)
88         return E_FAIL;
89
90     if (!IsEqualGUID(riid, IID_IUnknown) && !IsEqualGUID(riid, IID_IClassFactory))
91         return E_NOINTERFACE;
92
93     WebKitClassFactory* factory = new WebKitClassFactory(rclsid);
94     *ppv = reinterpret_cast<LPVOID>(factory);
95     if (!factory)
96         return E_OUTOFMEMORY;
97
98     factory->AddRef();
99     return S_OK;
100 }
101
102 STDAPI DllCanUnloadNow(void)
103 {
104     if (!gClassCount && !gLockCount)
105         return S_OK;
106     
107     return S_FALSE;
108 }
109
110 // deprecated - do not use
111 STDAPI DllUnregisterServer(void)
112 {
113     return 0;
114 }
115
116 // deprecated - do not use
117 STDAPI DllRegisterServer(void)
118 {
119     return 0;
120 }
121
122 // deprecated - do not use
123 STDAPI RunAsLocalServer()
124 {
125     return 0;
126 }
127
128 // deprecated - do not use
129 STDAPI LocalServerDidDie()
130 {
131     return 0;
132 }
133
134 void shutDownWebKit()
135 {
136     WebCore::iconDatabase().close();
137     WebCore::PageGroup::closeLocalStorage();
138 }
139
140 //FIXME: We should consider moving this to a new file for cross-project functionality
141 PassRefPtr<WebCore::SharedBuffer> loadResourceIntoBuffer(const char* name)
142 {
143     int idr;
144     // temporary hack to get resource id
145     if (!strcmp(name, "textAreaResizeCorner"))
146         idr = IDR_RESIZE_CORNER;
147     else if (!strcmp(name, "missingImage"))
148         idr = IDR_MISSING_IMAGE;
149     else if (!strcmp(name, "nullPlugin"))
150         idr = IDR_NULL_PLUGIN;
151     else if (!strcmp(name, "panIcon"))
152         idr = IDR_PAN_SCROLL_ICON;
153     else if (!strcmp(name, "panSouthCursor"))
154         idr = IDR_PAN_SOUTH_CURSOR;
155     else if (!strcmp(name, "panNorthCursor"))
156         idr = IDR_PAN_NORTH_CURSOR;
157     else if (!strcmp(name, "panEastCursor"))
158         idr = IDR_PAN_EAST_CURSOR;
159     else if (!strcmp(name, "panWestCursor"))
160         idr = IDR_PAN_WEST_CURSOR;
161     else if (!strcmp(name, "panSouthEastCursor"))
162         idr = IDR_PAN_SOUTH_EAST_CURSOR;
163     else if (!strcmp(name, "panSouthWestCursor"))
164         idr = IDR_PAN_SOUTH_WEST_CURSOR;
165     else if (!strcmp(name, "panNorthEastCursor"))
166         idr = IDR_PAN_NORTH_EAST_CURSOR;
167     else if (!strcmp(name, "panNorthWestCursor"))
168         idr = IDR_PAN_NORTH_WEST_CURSOR;
169     else if (!strcmp(name, "searchMagnifier"))
170         idr = IDR_SEARCH_MAGNIFIER;
171     else if (!strcmp(name, "searchMagnifierResults"))
172         idr = IDR_SEARCH_MAGNIFIER_RESULTS;
173     else if (!strcmp(name, "searchCancel"))
174         idr = IDR_SEARCH_CANCEL;
175     else if (!strcmp(name, "searchCancelPressed"))
176         idr = IDR_SEARCH_CANCEL_PRESSED;
177     else if (!strcmp(name, "zoomInCursor"))
178         idr = IDR_ZOOM_IN_CURSOR;
179     else if (!strcmp(name, "zoomOutCursor"))
180         idr = IDR_ZOOM_OUT_CURSOR;
181     else if (!strcmp(name, "verticalTextCursor"))
182         idr = IDR_VERTICAL_TEXT_CURSOR;
183     else if (!strcmp(name, "fsVideoAudioVolumeHigh"))
184         idr = IDR_FS_VIDEO_AUDIO_VOLUME_HIGH;
185     else if (!strcmp(name, "fsVideoAudioVolumeLow"))
186         idr = IDR_FS_VIDEO_AUDIO_VOLUME_LOW;
187     else if (!strcmp(name, "fsVideoExitFullscreen"))
188         idr = IDR_FS_VIDEO_EXIT_FULLSCREEN;
189     else if (!strcmp(name, "fsVideoPause"))
190         idr = IDR_FS_VIDEO_PAUSE;
191     else if (!strcmp(name, "fsVideoPlay"))
192         idr = IDR_FS_VIDEO_PLAY;
193     else
194         return 0;
195
196     HRSRC resInfo = FindResource(gInstance, MAKEINTRESOURCE(idr), L"PNG");
197     if (!resInfo)
198         return 0;
199     HANDLE res = LoadResource(gInstance, resInfo);
200     if (!res)
201         return 0;
202     void* resource = LockResource(res);
203     if (!resource)
204         return 0;
205     int size = SizeofResource(gInstance, resInfo);
206
207     return WebCore::SharedBuffer::create(reinterpret_cast<const char*>(resource), size);
208 }