mshtml: Added IPersistStream::LoadHistory implementation.
[wine] / dlls / mshtml / htmlscreen.c
1 /*
2  * Copyright 2009 Jacek Caban for CodeWeavers
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
21 #define COBJMACROS
22
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winuser.h"
26 #include "ole2.h"
27
28 #include "wine/debug.h"
29
30 #include "mshtml_private.h"
31
32 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
33
34 typedef struct {
35     DispatchEx dispex;
36     IHTMLScreen IHTMLScreen_iface;
37
38     LONG ref;
39 } HTMLScreen;
40
41 static inline HTMLScreen *impl_from_IHTMLScreen(IHTMLScreen *iface)
42 {
43     return CONTAINING_RECORD(iface, HTMLScreen, IHTMLScreen_iface);
44 }
45
46 static HRESULT WINAPI HTMLScreen_QueryInterface(IHTMLScreen *iface, REFIID riid, void **ppv)
47 {
48     HTMLScreen *This = impl_from_IHTMLScreen(iface);
49
50     *ppv = NULL;
51
52     if(IsEqualGUID(&IID_IUnknown, riid)) {
53         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
54         *ppv = &This->IHTMLScreen_iface;
55     }else if(IsEqualGUID(&IID_IHTMLScreen, riid)) {
56         TRACE("(%p)->(IID_IHTMLScreen %p)\n", This, ppv);
57         *ppv = &This->IHTMLScreen_iface;
58     }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
59         return *ppv ? S_OK : E_NOINTERFACE;
60     }
61
62     if(*ppv) {
63         IUnknown_AddRef((IUnknown*)*ppv);
64         return S_OK;
65     }
66
67     WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
68     return E_NOINTERFACE;
69 }
70
71 static ULONG WINAPI HTMLScreen_AddRef(IHTMLScreen *iface)
72 {
73     HTMLScreen *This = impl_from_IHTMLScreen(iface);
74     LONG ref = InterlockedIncrement(&This->ref);
75
76     TRACE("(%p) ref=%d\n", This, ref);
77
78     return ref;
79 }
80
81 static ULONG WINAPI HTMLScreen_Release(IHTMLScreen *iface)
82 {
83     HTMLScreen *This = impl_from_IHTMLScreen(iface);
84     LONG ref = InterlockedDecrement(&This->ref);
85
86     TRACE("(%p) ref=%d\n", This, ref);
87
88     if(!ref) {
89         release_dispex(&This->dispex);
90         heap_free(This);
91     }
92
93     return ref;
94 }
95
96 static HRESULT WINAPI HTMLScreen_GetTypeInfoCount(IHTMLScreen *iface, UINT *pctinfo)
97 {
98     HTMLScreen *This = impl_from_IHTMLScreen(iface);
99     FIXME("(%p)\n", This);
100     return E_NOTIMPL;
101 }
102
103 static HRESULT WINAPI HTMLScreen_GetTypeInfo(IHTMLScreen *iface, UINT iTInfo,
104         LCID lcid, ITypeInfo **ppTInfo)
105 {
106     HTMLScreen *This = impl_from_IHTMLScreen(iface);
107     FIXME("(%p)\n", This);
108     return E_NOTIMPL;
109 }
110
111 static HRESULT WINAPI HTMLScreen_GetIDsOfNames(IHTMLScreen *iface, REFIID riid,
112         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
113 {
114     HTMLScreen *This = impl_from_IHTMLScreen(iface);
115     FIXME("(%p)\n", This);
116     return E_NOTIMPL;
117 }
118
119 static HRESULT WINAPI HTMLScreen_Invoke(IHTMLScreen *iface, DISPID dispIdMember,
120         REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
121         VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
122 {
123     HTMLScreen *This = impl_from_IHTMLScreen(iface);
124     FIXME("(%p)\n", This);
125     return E_NOTIMPL;
126 }
127
128 static HRESULT WINAPI HTMLScreen_get_colorDepth(IHTMLScreen *iface, LONG *p)
129 {
130     HTMLScreen *This = impl_from_IHTMLScreen(iface);
131
132     TRACE("(%p)->(%p)\n", This, p);
133
134     *p = GetDeviceCaps(get_display_dc(), BITSPIXEL);
135     return S_OK;
136 }
137
138 static HRESULT WINAPI HTMLScreen_put_bufferDepth(IHTMLScreen *iface, LONG v)
139 {
140     HTMLScreen *This = impl_from_IHTMLScreen(iface);
141     FIXME("(%p)->(%d)\n", This, v);
142     return E_NOTIMPL;
143 }
144
145 static HRESULT WINAPI HTMLScreen_get_bufferDepth(IHTMLScreen *iface, LONG *p)
146 {
147     HTMLScreen *This = impl_from_IHTMLScreen(iface);
148     FIXME("(%p)->(%p)\n", This, p);
149     return E_NOTIMPL;
150 }
151
152 static HRESULT WINAPI HTMLScreen_get_width(IHTMLScreen *iface, LONG *p)
153 {
154     HTMLScreen *This = impl_from_IHTMLScreen(iface);
155
156     TRACE("(%p)->(%p)\n", This, p);
157
158     *p = GetDeviceCaps(get_display_dc(), HORZRES);
159     return S_OK;
160 }
161
162 static HRESULT WINAPI HTMLScreen_get_height(IHTMLScreen *iface, LONG *p)
163 {
164     HTMLScreen *This = impl_from_IHTMLScreen(iface);
165
166     TRACE("(%p)->(%p)\n", This, p);
167
168     *p = GetDeviceCaps(get_display_dc(), VERTRES);
169     return S_OK;
170 }
171
172 static HRESULT WINAPI HTMLScreen_put_updateInterval(IHTMLScreen *iface, LONG v)
173 {
174     HTMLScreen *This = impl_from_IHTMLScreen(iface);
175     FIXME("(%p)->(%d)\n", This, v);
176     return E_NOTIMPL;
177 }
178
179 static HRESULT WINAPI HTMLScreen_get_updateInterval(IHTMLScreen *iface, LONG *p)
180 {
181     HTMLScreen *This = impl_from_IHTMLScreen(iface);
182     FIXME("(%p)->(%p)\n", This, p);
183     return E_NOTIMPL;
184 }
185
186 static HRESULT WINAPI HTMLScreen_get_availHeight(IHTMLScreen *iface, LONG *p)
187 {
188     HTMLScreen *This = impl_from_IHTMLScreen(iface);
189     RECT work_area;
190
191     TRACE("(%p)->(%p)\n", This, p);
192
193     if(!SystemParametersInfoW(SPI_GETWORKAREA, 0, &work_area, 0))
194         return E_FAIL;
195
196     *p = work_area.bottom-work_area.top;
197     return S_OK;
198 }
199
200 static HRESULT WINAPI HTMLScreen_get_availWidth(IHTMLScreen *iface, LONG *p)
201 {
202     HTMLScreen *This = impl_from_IHTMLScreen(iface);
203     RECT work_area;
204
205     TRACE("(%p)->(%p)\n", This, p);
206
207     if(!SystemParametersInfoW(SPI_GETWORKAREA, 0, &work_area, 0))
208         return E_FAIL;
209
210     *p = work_area.right-work_area.left;
211     return S_OK;
212 }
213
214 static HRESULT WINAPI HTMLScreen_get_fontSmoothingEnabled(IHTMLScreen *iface, VARIANT_BOOL *p)
215 {
216     HTMLScreen *This = impl_from_IHTMLScreen(iface);
217     FIXME("(%p)->(%p)\n", This, p);
218     return E_NOTIMPL;
219 }
220
221 static const IHTMLScreenVtbl HTMLSreenVtbl = {
222     HTMLScreen_QueryInterface,
223     HTMLScreen_AddRef,
224     HTMLScreen_Release,
225     HTMLScreen_GetTypeInfoCount,
226     HTMLScreen_GetTypeInfo,
227     HTMLScreen_GetIDsOfNames,
228     HTMLScreen_Invoke,
229     HTMLScreen_get_colorDepth,
230     HTMLScreen_put_bufferDepth,
231     HTMLScreen_get_bufferDepth,
232     HTMLScreen_get_width,
233     HTMLScreen_get_height,
234     HTMLScreen_put_updateInterval,
235     HTMLScreen_get_updateInterval,
236     HTMLScreen_get_availHeight,
237     HTMLScreen_get_availWidth,
238     HTMLScreen_get_fontSmoothingEnabled
239 };
240
241 static const tid_t HTMLScreen_iface_tids[] = {
242     IHTMLScreen_tid,
243     0
244 };
245 static dispex_static_data_t HTMLScreen_dispex = {
246     NULL,
247     DispHTMLScreen_tid,
248     NULL,
249     HTMLScreen_iface_tids
250 };
251
252 HRESULT HTMLScreen_Create(IHTMLScreen **ret)
253 {
254     HTMLScreen *screen;
255
256     screen = heap_alloc_zero(sizeof(HTMLScreen));
257     if(!screen)
258         return E_OUTOFMEMORY;
259
260     screen->IHTMLScreen_iface.lpVtbl = &HTMLSreenVtbl;
261     screen->ref = 1;
262
263     init_dispex(&screen->dispex, (IUnknown*)&screen->IHTMLScreen_iface, &HTMLScreen_dispex);
264
265     *ret = &screen->IHTMLScreen_iface;
266     return S_OK;
267 }