mirror of
https://github.com/reactos/reactos.git
synced 2024-07-03 03:04:22 +00:00
[SHDOCVW]
sync shdocvw to wine 1.1.39 svn path=/trunk/; revision=45764
This commit is contained in:
parent
6ce96bebac
commit
72a689d62e
|
@ -362,6 +362,29 @@ void deactivate_document(DocHost *This)
|
|||
This->document = NULL;
|
||||
}
|
||||
|
||||
void release_dochost_client(DocHost *This)
|
||||
{
|
||||
if(This->hwnd) {
|
||||
DestroyWindow(This->hwnd);
|
||||
This->hwnd = NULL;
|
||||
}
|
||||
|
||||
if(This->hostui) {
|
||||
IDocHostUIHandler_Release(This->hostui);
|
||||
This->hostui = NULL;
|
||||
}
|
||||
|
||||
if(This->client_disp) {
|
||||
IDispatch_Release(This->client_disp);
|
||||
This->client_disp = NULL;
|
||||
}
|
||||
|
||||
if(This->frame) {
|
||||
IOleInPlaceFrame_Release(This->frame);
|
||||
This->frame = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#define OLECMD_THIS(iface) DEFINE_THIS(DocHost, OleCommandTarget, iface)
|
||||
|
||||
static HRESULT WINAPI ClOleCommandTarget_QueryInterface(IOleCommandTarget *iface,
|
||||
|
@ -387,8 +410,13 @@ static HRESULT WINAPI ClOleCommandTarget_QueryStatus(IOleCommandTarget *iface,
|
|||
const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
|
||||
{
|
||||
DocHost *This = OLECMD_THIS(iface);
|
||||
ULONG i= 0;
|
||||
FIXME("(%p)->(%s %u %p %p)\n", This, debugstr_guid(pguidCmdGroup), cCmds, prgCmds,
|
||||
pCmdText);
|
||||
while (prgCmds && (cCmds > i)) {
|
||||
FIXME("command_%u: %u, 0x%x\n", i, prgCmds[i].cmdID, prgCmds[i].cmdf);
|
||||
i++;
|
||||
}
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
@ -744,14 +772,10 @@ void DocHost_Init(DocHost *This, IDispatch *disp)
|
|||
|
||||
void DocHost_Release(DocHost *This)
|
||||
{
|
||||
if(This->client_disp)
|
||||
IDispatch_Release(This->client_disp);
|
||||
if(This->frame)
|
||||
IOleInPlaceFrame_Release(This->frame);
|
||||
|
||||
release_dochost_client(This);
|
||||
DocHost_ClientSite_Release(This);
|
||||
|
||||
ConnectionPointContainer_Destroy(&This->cps);
|
||||
|
||||
SysFreeString(This->url);
|
||||
CoTaskMemFree(This->url);
|
||||
}
|
||||
|
|
|
@ -65,16 +65,51 @@ static inline InternetShortcut* impl_from_IPersistFile(IPersistFile *iface)
|
|||
return (InternetShortcut*)((char*)iface - FIELD_OFFSET(InternetShortcut, persistFile));
|
||||
}
|
||||
|
||||
static BOOL StartLinkProcessor(LPCOLESTR szLink)
|
||||
static BOOL run_winemenubuilder( const WCHAR *args )
|
||||
{
|
||||
static const WCHAR szFormat[] = {
|
||||
'w','i','n','e','m','e','n','u','b','u','i','l','d','e','r','.','e','x','e',
|
||||
' ','-','w',' ','-','u',' ','"','%','s','"',0 };
|
||||
static const WCHAR menubuilder[] = {'\\','w','i','n','e','m','e','n','u','b','u','i','l','d','e','r','.','e','x','e',0};
|
||||
LONG len;
|
||||
LPWSTR buffer;
|
||||
STARTUPINFOW si;
|
||||
PROCESS_INFORMATION pi;
|
||||
BOOL ret;
|
||||
WCHAR app[MAX_PATH];
|
||||
|
||||
GetSystemDirectoryW( app, MAX_PATH - sizeof(menubuilder)/sizeof(WCHAR) );
|
||||
strcatW( app, menubuilder );
|
||||
|
||||
len = (strlenW( app ) + strlenW( args ) + 1) * sizeof(WCHAR);
|
||||
buffer = heap_alloc( len );
|
||||
if( !buffer )
|
||||
return FALSE;
|
||||
|
||||
strcpyW( buffer, app );
|
||||
strcatW( buffer, args );
|
||||
|
||||
TRACE("starting %s\n",debugstr_w(buffer));
|
||||
|
||||
memset(&si, 0, sizeof(si));
|
||||
si.cb = sizeof(si);
|
||||
|
||||
ret = CreateProcessW( app, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
|
||||
|
||||
heap_free( buffer );
|
||||
|
||||
if (ret)
|
||||
{
|
||||
CloseHandle( pi.hProcess );
|
||||
CloseHandle( pi.hThread );
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static BOOL StartLinkProcessor( LPCOLESTR szLink )
|
||||
{
|
||||
static const WCHAR szFormat[] = { ' ','-','w',' ','-','u',' ','"','%','s','"',0 };
|
||||
LONG len;
|
||||
LPWSTR buffer;
|
||||
BOOL ret;
|
||||
|
||||
len = sizeof(szFormat) + lstrlenW( szLink ) * sizeof(WCHAR);
|
||||
buffer = heap_alloc( len );
|
||||
|
@ -82,22 +117,8 @@ static BOOL StartLinkProcessor(LPCOLESTR szLink)
|
|||
return FALSE;
|
||||
|
||||
wsprintfW( buffer, szFormat, szLink );
|
||||
|
||||
TRACE("starting %s\n",debugstr_w(buffer));
|
||||
|
||||
memset(&si, 0, sizeof(si));
|
||||
si.cb = sizeof(si);
|
||||
|
||||
ret = CreateProcessW( NULL, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
|
||||
|
||||
HeapFree( GetProcessHeap(), 0, buffer );
|
||||
|
||||
if (ret)
|
||||
{
|
||||
CloseHandle( pi.hProcess );
|
||||
CloseHandle( pi.hThread );
|
||||
}
|
||||
|
||||
ret = run_winemenubuilder( buffer );
|
||||
heap_free( buffer );
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -255,6 +255,36 @@ static HRESULT on_silent_change(WebBrowser *This)
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
static void release_client_site(WebBrowser *This)
|
||||
{
|
||||
release_dochost_client(&This->doc_host);
|
||||
|
||||
if(This->shell_embedding_hwnd) {
|
||||
DestroyWindow(This->shell_embedding_hwnd);
|
||||
This->shell_embedding_hwnd = NULL;
|
||||
}
|
||||
|
||||
if(This->inplace) {
|
||||
IOleInPlaceSite_Release(This->inplace);
|
||||
This->inplace = NULL;
|
||||
}
|
||||
|
||||
if(This->container) {
|
||||
IOleContainer_Release(This->container);
|
||||
This->container = NULL;
|
||||
}
|
||||
|
||||
if(This->uiwindow) {
|
||||
IOleInPlaceUIWindow_Release(This->uiwindow);
|
||||
This->uiwindow = NULL;
|
||||
}
|
||||
|
||||
if(This->client) {
|
||||
IOleClientSite_Release(This->client);
|
||||
This->client = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* Implement the IOleObject interface for the WebBrowser control
|
||||
*/
|
||||
|
@ -282,7 +312,9 @@ static ULONG WINAPI OleObject_Release(IOleObject *iface)
|
|||
static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE pClientSite)
|
||||
{
|
||||
WebBrowser *This = OLEOBJ_THIS(iface);
|
||||
IDocHostUIHandler *hostui;
|
||||
IOleContainer *container;
|
||||
IDispatch *disp;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("(%p)->(%p)\n", This, pClientSite);
|
||||
|
@ -290,29 +322,7 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE
|
|||
if(This->client == pClientSite)
|
||||
return S_OK;
|
||||
|
||||
if(This->doc_host.hwnd) {
|
||||
DestroyWindow(This->doc_host.hwnd);
|
||||
This->doc_host.hwnd = NULL;
|
||||
}
|
||||
if(This->shell_embedding_hwnd) {
|
||||
DestroyWindow(This->shell_embedding_hwnd);
|
||||
This->shell_embedding_hwnd = NULL;
|
||||
}
|
||||
|
||||
if(This->inplace) {
|
||||
IOleInPlaceSite_Release(This->inplace);
|
||||
This->inplace = NULL;
|
||||
}
|
||||
|
||||
if(This->doc_host.hostui) {
|
||||
IDocHostUIHandler_Release(This->doc_host.hostui);
|
||||
This->doc_host.hostui = NULL;
|
||||
}
|
||||
|
||||
if(This->client)
|
||||
IOleClientSite_Release(This->client);
|
||||
|
||||
This->client = pClientSite;
|
||||
release_client_site(This);
|
||||
|
||||
if(!pClientSite) {
|
||||
if(This->doc_host.document)
|
||||
|
@ -321,12 +331,17 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE
|
|||
}
|
||||
|
||||
IOleClientSite_AddRef(pClientSite);
|
||||
This->client = pClientSite;
|
||||
|
||||
IOleClientSite_QueryInterface(This->client, &IID_IDispatch,
|
||||
(void**)&This->doc_host.client_disp);
|
||||
hres = IOleClientSite_QueryInterface(This->client, &IID_IDispatch,
|
||||
(void**)&disp);
|
||||
if(SUCCEEDED(hres))
|
||||
This->doc_host.client_disp = disp;
|
||||
|
||||
IOleClientSite_QueryInterface(This->client, &IID_IDocHostUIHandler,
|
||||
(void**)&This->doc_host.hostui);
|
||||
hres = IOleClientSite_QueryInterface(This->client, &IID_IDocHostUIHandler,
|
||||
(void**)&hostui);
|
||||
if(SUCCEEDED(hres))
|
||||
This->doc_host.hostui = hostui;
|
||||
|
||||
hres = IOleClientSite_GetContainer(This->client, &container);
|
||||
if(SUCCEEDED(hres)) {
|
||||
|
@ -963,10 +978,5 @@ void WebBrowser_OleObject_Init(WebBrowser *This)
|
|||
|
||||
void WebBrowser_OleObject_Destroy(WebBrowser *This)
|
||||
{
|
||||
if(This->client)
|
||||
IOleObject_SetClientSite(OLEOBJ(This), NULL);
|
||||
if(This->container)
|
||||
IOleContainer_Release(This->container);
|
||||
if(This->uiwindow)
|
||||
IOleInPlaceUIWindow_Release(This->uiwindow);
|
||||
release_client_site(This);
|
||||
}
|
||||
|
|
|
@ -205,6 +205,7 @@ void WebBrowser_OleObject_Destroy(WebBrowser*);
|
|||
void DocHost_Init(DocHost*,IDispatch*);
|
||||
void DocHost_ClientSite_Init(DocHost*);
|
||||
void DocHost_Frame_Init(DocHost*);
|
||||
void release_dochost_client(DocHost*);
|
||||
|
||||
void DocHost_Release(DocHost*);
|
||||
void DocHost_ClientSite_Release(DocHost*);
|
||||
|
@ -252,6 +253,8 @@ HRESULT register_class_object(BOOL);
|
|||
HRESULT get_typeinfo(ITypeInfo**);
|
||||
DWORD register_iexplore(BOOL);
|
||||
|
||||
const char *debugstr_variant(const VARIANT*);
|
||||
|
||||
/* memory allocation functions */
|
||||
|
||||
static inline void *heap_alloc(size_t len)
|
||||
|
|
|
@ -34,10 +34,10 @@ HKCR,"CLSID\%CLSID_SearchAssistantOC%\InProcServer32",,,"%MODULE%"
|
|||
HKCR,"CLSID\%CLSID_SearchAssistantOC%\InProcServer32","ThreadingModel",,"Apartment"
|
||||
HKCR,"CLSID\%CLSID_SearchAssistantOC%\ProgID",,,"SearchAssistantOC.SearchAssistantOC.1"
|
||||
HKCR,"CLSID\%CLSID_SearchAssistantOC%\VersionIndependentProgID",,,"SearchAssistantOC.SearchAssistantOC"
|
||||
HKCR,"SearchAssistantOC.SearchAssistantOC",,,""
|
||||
HKCR,"SearchAssistantOC.SearchAssistantOC",,,"SearchAssistantOC"
|
||||
HKCR,"SearchAssistantOC.SearchAssistantOC\CLSID",,,"%CLSID_SearchAssistantOC%"
|
||||
HKCR,"SearchAssistantOC.SearchAssistantOC\CurVer",,,"SearchAssistantOC.SearchAssistantOC.1"
|
||||
HKCR,"SearchAssistantOC.SearchAssistantOC.1",,,""
|
||||
HKCR,"SearchAssistantOC.SearchAssistantOC.1",,,"SearchAssistantOC"
|
||||
HKCR,"SearchAssistantOC.SearchAssistantOC.1\CLSID",,,"%CLSID_SearchAssistantOC%"
|
||||
|
||||
HKCR,"CLSID\%CLSID_ShellNameSpace%",,,"Shell Name Space"
|
||||
|
@ -67,7 +67,7 @@ HKCR,"CLSID\%CLSID_ShellUIHelper%\ProgID",,,"Shell.UIHelper.1"
|
|||
HKCR,"Shell.UIHelper",,,"Microsoft Shell UI Helper"
|
||||
HKCR,"Shell.UIHelper\CLSID",,,"%CLSID_ShellUIHelper%"
|
||||
HKCR,"Shell.UIHelper\CurVer",,,"Shell.UIHelper.2"
|
||||
HKCR,"Shell.UIHelper.1",,,""
|
||||
HKCR,"Shell.UIHelper.1",,,"Microsoft Shell UI Helper"
|
||||
HKCR,"Shell.UIHelper.1\CLSID",,,"%CLSID_ShellUIHelper%"
|
||||
|
||||
HKCR,"CLSID\%CLSID_Internet%\DefaultIcon",,,"shdoclc.dll,-190"
|
||||
|
@ -86,7 +86,7 @@ HKCR,"CLSID\%CLSID_WebBrowser%\VersionIndependentProgID",,,"Shell.Explorer"
|
|||
HKCR,"Shell.Explorer",,,"Microsoft Web Browser"
|
||||
HKCR,"Shell.Explorer\CLSID",,,"%CLSID_WebBrowser%"
|
||||
HKCR,"Shell.Explorer\CurVer",,,"Shell.Explorer.2"
|
||||
HKCR,"Shell.Explorer.2",,,""
|
||||
HKCR,"Shell.Explorer.2",,,"Microsoft Web Browser"
|
||||
HKCR,"Shell.Explorer.2\CLSID",,,"%CLSID_WebBrowser%"
|
||||
|
||||
HKCR,"CLSID\%CLSID_ShellWindows%",,,"ShellWindows"
|
||||
|
@ -108,14 +108,14 @@ HKCR,"CLSID\%CLSID_WebBrowser_V1%\InProcServer32",,,"%MODULE%"
|
|||
HKCR,"CLSID\%CLSID_WebBrowser_V1%\InProcServer32","ThreadingModel",,"Apartment"
|
||||
HKCR,"CLSID\%CLSID_WebBrowser_V1%\ProgID",,,"Shell.Explorer.1"
|
||||
HKCR,"CLSID\%CLSID_WebBrowser_V1%\VersionIndependentProgID",,,"Shell.Explorer"
|
||||
HKCR,"Shell.Explorer.1",,,""
|
||||
HKCR,"Shell.Explorer.1",,,"Microsoft Web Browser"
|
||||
HKCR,"Shell.Explorer.1\CLSID",,,"%CLSID_WebBrowser_V1%"
|
||||
|
||||
HKCR,"CLSID\%CLSID_InternetShortcut%",,,"Internet Shortcut"
|
||||
HKCR,"CLSID\%CLSID_InternetShortcut%\InProcServer32",,,"%MODULE%"
|
||||
HKCR,"CLSID\%CLSID_InternetShortcut%\InProcServer32","ThreadingModel",,"Apartment"
|
||||
HKCR,"CLSID\%CLSID_InternetShortcut%\ProgID",,,"InternetShortcut"
|
||||
HKCR,"CLSID\%CLSID_InternetShortcut%\shellex\MayChangeDefaultMenu",,,
|
||||
HKCR,"CLSID\%CLSID_InternetShortcut%\shellex\MayChangeDefaultMenu",,16
|
||||
HKCR,"InternetShortcut",,,"Internet Shortcut"
|
||||
HKCR,"InternetShortcut","EditFlags",2,"2"
|
||||
HKCR,"InternetShortcut","IsShortcut",,
|
||||
|
|
|
@ -67,6 +67,31 @@ HRESULT get_typeinfo(ITypeInfo **typeinfo)
|
|||
return hres;
|
||||
}
|
||||
|
||||
const char *debugstr_variant(const VARIANT *v)
|
||||
{
|
||||
if(!v)
|
||||
return "(null)";
|
||||
|
||||
switch(V_VT(v)) {
|
||||
case VT_EMPTY:
|
||||
return "{VT_EMPTY}";
|
||||
case VT_NULL:
|
||||
return "{VT_NULL}";
|
||||
case VT_I4:
|
||||
return wine_dbg_sprintf("{VT_I4: %d}", V_I4(v));
|
||||
case VT_R8:
|
||||
return wine_dbg_sprintf("{VT_R8: %lf}", V_R8(v));
|
||||
case VT_BSTR:
|
||||
return wine_dbg_sprintf("{VT_BSTR: %s}", debugstr_w(V_BSTR(v)));
|
||||
case VT_DISPATCH:
|
||||
return wine_dbg_sprintf("{VT_DISPATCH: %p}", V_DISPATCH(v));
|
||||
case VT_BOOL:
|
||||
return wine_dbg_sprintf("{VT_BOOL: %x}", V_BOOL(v));
|
||||
default:
|
||||
return wine_dbg_sprintf("{vt %d}", V_VT(v));
|
||||
}
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHDOCVW DllMain
|
||||
*/
|
||||
|
|
|
@ -269,8 +269,9 @@ static HRESULT WINAPI WebBrowser_Navigate(IWebBrowser2 *iface, BSTR szUrl,
|
|||
{
|
||||
WebBrowser *This = WEBBROWSER_THIS(iface);
|
||||
|
||||
TRACE("(%p)->(%s %p %p %p %p)\n", This, debugstr_w(szUrl), Flags, TargetFrameName,
|
||||
PostData, Headers);
|
||||
TRACE("(%p)->(%s %s %s %s %s)\n", This, debugstr_w(szUrl), debugstr_variant(Flags),
|
||||
debugstr_variant(TargetFrameName), debugstr_variant(PostData),
|
||||
debugstr_variant(Headers));
|
||||
|
||||
return navigate_url(&This->doc_host, szUrl, Flags, TargetFrameName, PostData, Headers);
|
||||
}
|
||||
|
@ -285,7 +286,7 @@ static HRESULT WINAPI WebBrowser_Refresh(IWebBrowser2 *iface)
|
|||
static HRESULT WINAPI WebBrowser_Refresh2(IWebBrowser2 *iface, VARIANT *Level)
|
||||
{
|
||||
WebBrowser *This = WEBBROWSER_THIS(iface);
|
||||
FIXME("(%p)->(%p)\n", This, Level);
|
||||
FIXME("(%p)->(%s)\n", This, debugstr_variant(Level));
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
@ -516,22 +517,28 @@ static HRESULT WINAPI WebBrowser_ClientToWindow(IWebBrowser2 *iface, int *pcx, i
|
|||
static HRESULT WINAPI WebBrowser_PutProperty(IWebBrowser2 *iface, BSTR szProperty, VARIANT vtValue)
|
||||
{
|
||||
WebBrowser *This = WEBBROWSER_THIS(iface);
|
||||
FIXME("(%p)->(%s)\n", This, debugstr_w(szProperty));
|
||||
FIXME("(%p)->(%s %s)\n", This, debugstr_w(szProperty), debugstr_variant(&vtValue));
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI WebBrowser_GetProperty(IWebBrowser2 *iface, BSTR szProperty, VARIANT *pvtValue)
|
||||
{
|
||||
WebBrowser *This = WEBBROWSER_THIS(iface);
|
||||
FIXME("(%p)->(%s %p)\n", This, debugstr_w(szProperty), pvtValue);
|
||||
FIXME("(%p)->(%s %s)\n", This, debugstr_w(szProperty), debugstr_variant(pvtValue));
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI WebBrowser_get_Name(IWebBrowser2 *iface, BSTR *Name)
|
||||
{
|
||||
static const WCHAR sName[] = {'M','i','c','r','o','s','o','f','t',' ','W','e','b',
|
||||
' ','B','r','o','w','s','e','r',' ','C','o','n','t','r','o','l',0};
|
||||
WebBrowser *This = WEBBROWSER_THIS(iface);
|
||||
FIXME("(%p)->(%p)\n", This, Name);
|
||||
return E_NOTIMPL;
|
||||
|
||||
TRACE("(%p)->(%p)\n", This, Name);
|
||||
|
||||
*Name = SysAllocString(sName);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI WebBrowser_get_HWND(IWebBrowser2 *iface, LONG *pHWND)
|
||||
|
@ -726,7 +733,8 @@ static HRESULT WINAPI WebBrowser_Navigate2(IWebBrowser2 *iface, VARIANT *URL, VA
|
|||
WebBrowser *This = WEBBROWSER_THIS(iface);
|
||||
LPCWSTR url;
|
||||
|
||||
TRACE("(%p)->(%p %p %p %p %p)\n", This, URL, Flags, TargetFrameName, PostData, Headers);
|
||||
TRACE("(%p)->(%s %s %s %s %s)\n", This, debugstr_variant(URL), debugstr_variant(Flags),
|
||||
debugstr_variant(TargetFrameName), debugstr_variant(PostData), debugstr_variant(Headers));
|
||||
|
||||
if(!This->client)
|
||||
return E_FAIL;
|
||||
|
@ -761,7 +769,7 @@ static HRESULT WINAPI WebBrowser_ExecWB(IWebBrowser2 *iface, OLECMDID cmdID,
|
|||
OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
|
||||
{
|
||||
WebBrowser *This = WEBBROWSER_THIS(iface);
|
||||
FIXME("(%p)->(%d %d %p %p)\n", This, cmdID, cmdexecopt, pvaIn, pvaOut);
|
||||
FIXME("(%p)->(%d %d %s %p)\n", This, cmdID, cmdexecopt, debugstr_variant(pvaIn), pvaOut);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
@ -769,7 +777,8 @@ static HRESULT WINAPI WebBrowser_ShowBrowserBar(IWebBrowser2 *iface, VARIANT *pv
|
|||
VARIANT *pvarShow, VARIANT *pvarSize)
|
||||
{
|
||||
WebBrowser *This = WEBBROWSER_THIS(iface);
|
||||
FIXME("(%p)->(%p %p %p)\n", This, pvaClsid, pvarShow, pvarSize);
|
||||
FIXME("(%p)->(%s %s %s)\n", This, debugstr_variant(pvaClsid), debugstr_variant(pvarShow),
|
||||
debugstr_variant(pvarSize));
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue