Sweden-Number/dlls/shcore/main.c

237 lines
5.8 KiB
C
Raw Normal View History

/*
* Copyright 2016 Sebastian Lackner
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "config.h"
#include <stdarg.h>
#define COBJMACROS
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "winuser.h"
#include "initguid.h"
#include "ocidl.h"
#include "shellscalingapi.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(shcore);
BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void *reserved)
{
TRACE("(%p, %u, %p)\n", instance, reason, reserved);
switch (reason)
{
case DLL_WINE_PREATTACH:
return FALSE; /* prefer native version */
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(instance);
break;
}
return TRUE;
}
HRESULT WINAPI GetProcessDpiAwareness(HANDLE process, PROCESS_DPI_AWARENESS *value)
{
if (GetProcessDpiAwarenessInternal( process, (DPI_AWARENESS *)value )) return S_OK;
return HRESULT_FROM_WIN32( GetLastError() );
}
HRESULT WINAPI SetProcessDpiAwareness(PROCESS_DPI_AWARENESS value)
{
if (SetProcessDpiAwarenessInternal( value )) return S_OK;
return HRESULT_FROM_WIN32( GetLastError() );
}
HRESULT WINAPI GetDpiForMonitor(HMONITOR monitor, MONITOR_DPI_TYPE type, UINT *x, UINT *y)
{
if (GetDpiForMonitorInternal( monitor, type, x, y )) return S_OK;
return HRESULT_FROM_WIN32( GetLastError() );
}
HRESULT WINAPI _IStream_Read(IStream *stream, void *dest, ULONG size)
{
ULONG read;
HRESULT hr;
TRACE("(%p, %p, %u)\n", stream, dest, size);
hr = IStream_Read(stream, dest, size, &read);
if (SUCCEEDED(hr) && read != size)
hr = E_FAIL;
return hr;
}
HRESULT WINAPI IStream_Reset(IStream *stream)
{
static const LARGE_INTEGER zero;
TRACE("(%p)\n", stream);
return IStream_Seek(stream, zero, 0, NULL);
}
HRESULT WINAPI IStream_Size(IStream *stream, ULARGE_INTEGER *size)
{
STATSTG statstg;
HRESULT hr;
TRACE("(%p, %p)\n", stream, size);
memset(&statstg, 0, sizeof(statstg));
hr = IStream_Stat(stream, &statstg, STATFLAG_NONAME);
if (SUCCEEDED(hr) && size)
*size = statstg.cbSize;
return hr;
}
HRESULT WINAPI _IStream_Write(IStream *stream, const void *src, ULONG size)
{
ULONG written;
HRESULT hr;
TRACE("(%p, %p, %u)\n", stream, src, size);
hr = IStream_Write(stream, src, size, &written);
if (SUCCEEDED(hr) && written != size)
hr = E_FAIL;
return hr;
}
void WINAPI IUnknown_AtomicRelease(IUnknown **obj)
{
TRACE("(%p)\n", obj);
if (!obj || !*obj)
return;
IUnknown_Release(*obj);
*obj = NULL;
}
HRESULT WINAPI IUnknown_GetSite(IUnknown *unk, REFIID iid, void **site)
{
IObjectWithSite *obj = NULL;
HRESULT hr = E_INVALIDARG;
TRACE("(%p, %s, %p)\n", unk, debugstr_guid(iid), site);
if (unk && iid && site)
{
hr = IUnknown_QueryInterface(unk, &IID_IObjectWithSite, (void **)&obj);
if (SUCCEEDED(hr) && obj)
{
hr = IObjectWithSite_GetSite(obj, iid, site);
IObjectWithSite_Release(obj);
}
}
return hr;
}
HRESULT WINAPI IUnknown_QueryService(IUnknown *obj, REFGUID sid, REFIID iid, void **out)
{
IServiceProvider *provider = NULL;
HRESULT hr;
if (!out)
return E_FAIL;
*out = NULL;
if (!obj)
return E_FAIL;
hr = IUnknown_QueryInterface(obj, &IID_IServiceProvider, (void **)&provider);
if (hr == S_OK && provider)
{
TRACE("Using provider %p.\n", provider);
hr = IServiceProvider_QueryService(provider, sid, iid, out);
TRACE("Provider %p returned %p.\n", provider, *out);
IServiceProvider_Release(provider);
}
return hr;
}
void WINAPI IUnknown_Set(IUnknown **dest, IUnknown *src)
{
TRACE("(%p, %p)\n", dest, src);
IUnknown_AtomicRelease(dest);
if (src)
{
IUnknown_AddRef(src);
*dest = src;
}
}
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
{
IInternetSecurityManager *sec_manager;
IObjectWithSite *objwithsite;
HRESULT hr;
if (!obj)
return E_FAIL;
hr = IUnknown_QueryInterface(obj, &IID_IObjectWithSite, (void **)&objwithsite);
TRACE("ObjectWithSite %p, hr %#x.\n", objwithsite, hr);
if (SUCCEEDED(hr))
{
hr = IObjectWithSite_SetSite(objwithsite, site);
TRACE("SetSite() hr %#x.\n", hr);
IObjectWithSite_Release(objwithsite);
}
else
{
hr = IUnknown_QueryInterface(obj, &IID_IInternetSecurityManager, (void **)&sec_manager);
TRACE("InternetSecurityManager %p, hr %#x.\n", sec_manager, hr);
if (FAILED(hr))
return hr;
hr = IInternetSecurityManager_SetSecuritySite(sec_manager, (IInternetSecurityMgrSite *)site);
TRACE("SetSecuritySite() hr %#x.\n", hr);
IInternetSecurityManager_Release(sec_manager);
}
return hr;
}
HRESULT WINAPI SetCurrentProcessExplicitAppUserModelID(const WCHAR *appid)
{
FIXME("%s: stub\n", debugstr_w(appid));
return E_NOTIMPL;
}
HRESULT WINAPI GetCurrentProcessExplicitAppUserModelID(const WCHAR **appid)
{
FIXME("%p: stub\n", appid);
*appid = NULL;
return E_NOTIMPL;
}