Release 1.5.29.
[wine] / dlls / atl80 / atl80.c
1 /*
2  * Copyright 2012 Stefan Leichter
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include <stdarg.h>
20 #include <stdio.h>
21
22 #define COBJMACROS
23
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winerror.h"
27 #include "winuser.h"
28 #include "atlbase.h"
29
30 #include "wine/debug.h"
31 #include "wine/unicode.h"
32
33 WINE_DEFAULT_DEBUG_CHANNEL(atl);
34
35 /***********************************************************************
36  *           AtlRegisterTypeLib         [atl80.18]
37  */
38 HRESULT WINAPI AtlComModuleRegisterServer(_ATL_COM_MODULE *mod, BOOL bRegTypeLib, const CLSID *clsid)
39 {
40     const struct _ATL_CATMAP_ENTRY *catmap;
41     _ATL_OBJMAP_ENTRY **iter;
42     HRESULT hres;
43
44     TRACE("(%p %x %s)\n", mod, bRegTypeLib, debugstr_guid(clsid));
45
46     for(iter = mod->m_ppAutoObjMapFirst; iter < mod->m_ppAutoObjMapLast; iter++) {
47         if(!*iter || (clsid && !IsEqualCLSID((*iter)->pclsid, clsid)))
48             continue;
49
50         TRACE("Registering clsid %s\n", debugstr_guid((*iter)->pclsid));
51         hres = (*iter)->pfnUpdateRegistry(TRUE);
52         if(FAILED(hres))
53             return hres;
54
55         catmap = (*iter)->pfnGetCategoryMap();
56         if(catmap) {
57             hres = AtlRegisterClassCategoriesHelper((*iter)->pclsid, catmap, TRUE);
58             if(FAILED(hres))
59                 return hres;
60         }
61     }
62
63     if(bRegTypeLib) {
64         hres = AtlRegisterTypeLib(mod->m_hInstTypeLib, NULL);
65         if(FAILED(hres))
66             return hres;
67     }
68
69     return S_OK;
70 }
71
72 /***********************************************************************
73  *           AtlRegisterTypeLib         [atl80.19]
74  */
75 HRESULT WINAPI AtlRegisterTypeLib(HINSTANCE inst, const WCHAR *index)
76 {
77     ITypeLib *typelib;
78     BSTR path;
79     HRESULT hres;
80
81     TRACE("(%p %s)\n", inst, debugstr_w(index));
82
83     hres = AtlLoadTypeLib(inst, index, &path, &typelib);
84     if(FAILED(hres))
85         return hres;
86
87     hres = RegisterTypeLib(typelib, path, NULL); /* FIXME: pass help directory */
88     ITypeLib_Release(typelib);
89     SysFreeString(path);
90     return hres;
91 }
92
93 /***********************************************************************
94  *           AtlGetVersion              [atl80.@]
95  */
96 DWORD WINAPI AtlGetVersion(void *pReserved)
97 {
98    return _ATL_VER;
99 }
100
101 /**********************************************************************
102  * AtlAxWin class window procedure
103  */
104 static LRESULT CALLBACK AtlAxWin_wndproc( HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam )
105 {
106     if ( wMsg == WM_CREATE )
107     {
108             DWORD len = GetWindowTextLengthW( hWnd ) + 1;
109             WCHAR *ptr = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
110             if (!ptr)
111                 return 1;
112             GetWindowTextW( hWnd, ptr, len );
113             AtlAxCreateControlEx( ptr, hWnd, NULL, NULL, NULL, NULL, NULL );
114             HeapFree( GetProcessHeap(), 0, ptr );
115             return 0;
116     }
117     return DefWindowProcW( hWnd, wMsg, wParam, lParam );
118 }
119
120 BOOL WINAPI AtlAxWinInit(void)
121 {
122     WNDCLASSEXW wcex;
123     const WCHAR AtlAxWin80[] = {'A','t','l','A','x','W','i','n','8','0',0};
124     const WCHAR AtlAxWinLic80[] = {'A','t','l','A','x','W','i','n','L','i','c','8','0',0};
125
126     FIXME("semi-stub\n");
127
128     if ( FAILED( OleInitialize(NULL) ) )
129         return FALSE;
130
131     wcex.cbSize        = sizeof(wcex);
132     wcex.style         = CS_GLOBALCLASS | CS_DBLCLKS;
133     wcex.cbClsExtra    = 0;
134     wcex.cbWndExtra    = 0;
135     wcex.hInstance     = GetModuleHandleW( NULL );
136     wcex.hIcon         = NULL;
137     wcex.hCursor       = NULL;
138     wcex.hbrBackground = NULL;
139     wcex.lpszMenuName  = NULL;
140     wcex.hIconSm       = 0;
141
142     wcex.lpfnWndProc   = AtlAxWin_wndproc;
143     wcex.lpszClassName = AtlAxWin80;
144     if ( !RegisterClassExW( &wcex ) )
145         return FALSE;
146
147     wcex.lpszClassName = AtlAxWinLic80;
148     if ( !RegisterClassExW( &wcex ) )
149         return FALSE;
150
151     return TRUE;
152 }