WebKit/win/WebKitDLL.cpp
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     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 <wtf/Vector.h>
       
    42 #include <tchar.h>
       
    43 #include <olectl.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 (int i = 0; i < ARRAYSIZE(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 }