Commit 4bd374fa authored by Aric Stewart's avatar Aric Stewart Committed by Alexandre Julliard

First implementation of the Advanced Template Library, with just a few

functions implemented.
parent 680e200c
......@@ -1508,6 +1508,7 @@ dlls/Makefile
dlls/advapi32/Makefile
dlls/advapi32/tests/Makefile
dlls/amstream/Makefile
dlls/atl/Makefile
dlls/avicap32/Makefile
dlls/avifil32/Makefile
dlls/cabinet/Makefile
......
......@@ -18,6 +18,7 @@ EXTRADIRS = @GLU32FILES@ @GLUT32FILES@ @OPENGLFILES@ @XFILES@
BASEDIRS = \
advapi32 \
amstream \
atl \
avicap32 \
avifil32 \
cabinet \
......@@ -237,6 +238,7 @@ SYMLINKS_SO = \
@WIN16_FILES@ \
advapi32.dll.so \
amstream.dll.so \
atl.dll.so \
avicap32.dll.so \
avifil32.dll.so \
cabinet.dll.so \
......@@ -400,6 +402,9 @@ advapi32.dll.so: advapi32/advapi32.dll.so
amstream.dll.so: amstream/amstream.dll.so
$(RM) $@ && $(LN_S) amstream/amstream.dll.so $@
atl.dll.so: atl/atl.dll.so
$(RM) $@ && $(LN_S) atl/atl.dll.so $@
avicap32.dll.so: avicap32/avicap32.dll.so
$(RM) $@ && $(LN_S) avicap32/avicap32.dll.so $@
......@@ -945,6 +950,7 @@ libuuid.a: uuid/libuuid.a
IMPORT_LIBS = \
libadvapi32 \
libamstream \
libatl \
libavicap32 \
libavifil32 \
libcabinet \
......@@ -1084,6 +1090,11 @@ libamstream.def: amstream/amstream.spec.def
libamstream.a: amstream/amstream.spec.def
$(DLLTOOL) -k -l $@ -d amstream/amstream.spec.def
libatl.def: atl/atl.spec.def
$(RM) $@ && $(LN_S) atl/atl.spec.def $@
libatl.a: atl/atl.spec.def
$(DLLTOOL) -k -l $@ -d atl/atl.spec.def
libavicap32.def: avicap32/avicap32.spec.def
$(RM) $@ && $(LN_S) avicap32/avicap32.spec.def $@
libavicap32.a: avicap32/avicap32.spec.def
......@@ -1681,6 +1692,7 @@ libx11drv.a: x11drv/x11drv.spec.def
advapi32/advapi32.spec.def: $(WINEBUILD)
amstream/amstream.spec.def: $(WINEBUILD)
atl/atl.spec.def: $(WINEBUILD)
avicap32/avicap32.spec.def: $(WINEBUILD)
avifil32/avifil32.spec.def: $(WINEBUILD)
cabinet/cabinet.spec.def: $(WINEBUILD)
......@@ -1808,6 +1820,7 @@ $(INSTALLSUBDIRS:%=%/__install__): $(ALL_IMPORT_LIBS)
advapi32/advapi32.dll.so: advapi32
amstream/amstream.dll.so: amstream
atl/atl.dll.so: atl
avicap32/avicap32.dll.so: avicap32
avifil32/avifil32.dll.so: avifil32
cabinet/cabinet.dll.so: cabinet
......
Makefile
atl.dll.dbg.c
atl.spec.def
TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = atl.dll
IMPORTS = ole32 kernel32
EXTRALIBS = -luuid
C_SRCS = \
atl_main.c
@MAKE_DLL_RULES@
### Dependencies:
1 stub DllCanUnloadNow
2 stub DllGetClassObject
3 stub DllRegisterServer
4 stub DllUnregisterServer
10 stub AtlAdvise
11 stub AtlUnadvise
12 stub AtlFreeMarshalStream
13 stub AtlMarshalPtrInProc
14 stub AtlUnmarshalPtr
15 stub AtlModuleGetClassObject
16 stdcall AtlModuleInit(ptr long long)
17 stdcall AtlModuleRegisterClassObjects(ptr long long)
18 stub AtlModuleRegisterServer
19 stub AtlModuleRegisterTypeLib
20 stub AtlModuleRevokeClassObjects
21 stub AtlModuleTerm
22 stub AtlModuleUnregisterServer
23 stub AtlModuleUpdateRegistryFromResourceD
24 stub AtlWaitWithMessageLoop
25 stub AtlSetErrorInfo
26 stub AtlCreateTargetDC
27 stub AtlHiMetricToPixel
28 stub AtlPixelToHiMetric
29 stub AtlDevModeW2A
30 stub AtlComPtrAssign
31 stub AtlComQIPtrAssign
32 stdcall AtlInternalQueryInterface(ptr ptr ptr ptr)
34 stub AtlGetVersion
35 stub AtlAxDialogBoxW
36 stub AtlAxDialogBoxA
37 stub AtlAxCreateDialogW
38 stub AtlAxCreateDialogA
39 stub AtlAxCreateControl
40 stub AtlAxCreateControlEx
41 stub AtlAxAttachControl
42 stub AtlAxWinInit
43 stub AtlModuleAddCreateWndData
44 stub AtlModuleExtractCreateWndData
45 stub AtlModuleRegisterWndClassInfoW
46 stub AtlModuleRegisterWndClassInfoA
47 stub AtlAxGetControl
48 stub AtlAxGetHost
49 stub AtlRegisterClassCategoriesHelper
50 stub AtlIPersistStreamInit_Load
51 stub AtlIPersistStreamInit_Save
52 stub AtlIPersistPropertyBag_Load
53 stub AtlIPersistPropertyBag_Save
54 stub AtlGetObjectSourceInterface
55 stub AtlModuleUnRegisterTypeLib
56 stub AtlModuleLoadTypeLib
57 stub AtlModuleUnregisterServerEx
58 stub AtlModuleAddTermFunc
/*
* Implementation of Active Template Library (atl.dll)
*
* Copyright 2004 Aric Stewart for CodeWeavers
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdarg.h>
#include <stdio.h>
#include "windef.h"
#include "winbase.h"
#include "winerror.h"
#include "winuser.h"
#include "wine/debug.h"
#include "objbase.h"
#include "objidl.h"
#include "ole2.h"
#include "atlbase.h"
WINE_DEFAULT_DEBUG_CHANNEL(atl);
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
TRACE("(0x%p, %ld, %p)\n",hinstDLL,fdwReason,lpvReserved);
if (fdwReason == DLL_PROCESS_ATTACH) DisableThreadLibraryCalls(hinstDLL);
return TRUE;
}
HRESULT WINAPI AtlModuleInit(_ATL_MODULEA* pM, _ATL_OBJMAP_ENTRYA* p, HINSTANCE h)
{
INT i;
FIXME("SEMI-STUB (%p %p %p)\n",pM,p,h);
memset(pM,0,sizeof(_ATL_MODULEA));
pM->cbSize = sizeof(_ATL_MODULEA);
pM->m_hInst = h;
pM->m_hInstResource = h;
pM->m_hInstTypeLib = h;
pM->m_pObjMap = p;
pM->m_hHeap = GetProcessHeap();
/* call mains */
i = 0;
while (pM->m_pObjMap[i].pclsid != NULL)
{
TRACE("Initializing object %i\n",i);
p[i].pfnObjectMain(TRUE);
i++;
}
return S_OK;
}
HRESULT WINAPI AtlModuleRegisterClassObjects(_ATL_MODULEA *pM, DWORD dwClsContext,
DWORD dwFlags)
{
HRESULT hRes = S_OK;
int i=0;
TRACE("(%p %li %li)\n",pM, dwClsContext, dwFlags);
if (pM == NULL)
return E_INVALIDARG;
while(pM->m_pObjMap[i].pclsid != NULL)
{
IUnknown* pUnknown;
_ATL_OBJMAP_ENTRYA *obj = &(pM->m_pObjMap[i]);
HRESULT rc;
TRACE("Registering object %i\n",i);
if (obj->pfnGetClassObject)
{
rc = obj->pfnGetClassObject(obj->pfnCreateInstance, &IID_IUnknown,
(LPVOID*)&pUnknown);
if (SUCCEEDED (rc) )
{
CoRegisterClassObject(obj->pclsid, pUnknown, dwClsContext,
dwFlags, &obj->dwRegister);
if (pUnknown)
IUnknown_Release(pUnknown);
}
}
i++;
}
return hRes;
}
HRESULT WINAPI AtlInternalQueryInterface(LPVOID this, const _ATL_INTMAP_ENTRY* pEntries, REFIID iid, LPVOID* ppvObject)
{
int i = 0;
HRESULT rc = E_NOINTERFACE;
TRACE("(%p, %p, %p, %p)\n",this, pEntries, iid, ppvObject);
if (IsEqualGUID(iid,&IID_IUnknown))
{
TRACE("Returning IUnknown\n");
*ppvObject = this;
IUnknown_AddRef((IUnknown*)this);
return S_OK;
}
while (pEntries[i].pFunc != 0)
{
TRACE("Trying entry %i (%p %li %p)\n",i,pEntries[i].piid,
pEntries[i].dw, pEntries[i].pFunc);
if (IsEqualGUID(iid,pEntries[i].piid))
{
TRACE("MATCH\n");
if (pEntries[i].pFunc == (_ATL_CREATORARGFUNC*)1)
{
TRACE("Offset\n");
*ppvObject = ((LPSTR)this+pEntries[i].dw);
IUnknown_AddRef((IUnknown*)this);
rc = S_OK;
}
else
{
TRACE("Function\n");
rc = pEntries[i].pFunc(this, iid, ppvObject,0);
}
break;
}
i++;
}
TRACE("Done returning (0x%lx)\n",rc);
return rc;
}
/*
* Implementation of the Active Template Library (atl.dll)
*
* Copyright 2004 Aric Stewart for CodeWeavers
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
typedef HRESULT (WINAPI _ATL_CREATORFUNC)(void* pv, REFIID riid, LPVOID* ppv);
typedef HRESULT (WINAPI _ATL_CREATORARGFUNC)(void* pv, REFIID riid, LPVOID* ppv, DWORD dw);
typedef HRESULT (WINAPI _ATL_MODULEFUNC)(DWORD dw);
typedef LPCSTR (WINAPI _ATL_DESCRIPTIONFUNCA)();
typedef LPCWSTR (WINAPI _ATL_DESCRIPTIONFUNCW)();
typedef const struct _ATL_CATMAP_ENTRY* (_ATL_CATMAPFUNC)();
typedef void (WINAPI _ATL_TERMFUNC)(DWORD dw);
typedef struct _ATL_OBJMAP_ENTRYA_TAG
{
const CLSID* pclsid;
HRESULT (WINAPI *pfnUpdateRegistry)(BOOL bRegister);
_ATL_CREATORFUNC* pfnGetClassObject;
_ATL_CREATORFUNC* pfnCreateInstance;
IUnknown* pCF;
DWORD dwRegister;
_ATL_DESCRIPTIONFUNCA* pfnGetObjectDescription;
_ATL_CATMAPFUNC* pfnGetCategoryMap;
void (WINAPI *pfnObjectMain)(BOOL bStarting);
}_ATL_OBJMAP_ENTRYA;
typedef struct _ATL_OBJMAP_ENTRYW_TAG
{
const CLSID* pclsid;
HRESULT (WINAPI *pfnUpdateRegistry)(BOOL bRegister);
_ATL_CREATORFUNC* pfnGetClassObject;
_ATL_CREATORFUNC* pfnCreateInstance;
IUnknown* pCF;
DWORD dwRegister;
_ATL_DESCRIPTIONFUNCW* pfnGetObjectDescription;
_ATL_CATMAPFUNC* pfnGetCategoryMap;
void (WINAPI *pfnObjectMain)(BOOL bStarting);
} _ATL_OBJMAP_ENTRYW;
typedef struct _ATL_TERMFUNC_ELEM_TAG
{
_ATL_TERMFUNC* pFunc;
DWORD dw;
struct _ATL_TERMFUNC_ELEM_TAG* pNext;
} _ATL_TERMFUNC_ELEM;
typedef struct _AtlCreateWndData_TAG
{
void* m_pThis;
DWORD m_dwThreadID;
struct _AtlCreateWndData_TAG* m_pNext;
} _AtlCreateWndData;
typedef struct _ATL_MODULEA_TAG
{
UINT cbSize;
HINSTANCE m_hInst;
HINSTANCE m_hInstResource;
HINSTANCE m_hInstTypeLib;
_ATL_OBJMAP_ENTRYA* m_pObjMap;
LONG m_nLockCnt;
HANDLE m_hHeap;
union
{
CRITICAL_SECTION m_csTypeInfoHolder;
CRITICAL_SECTION m_csStaticDataInit;
} u;
CRITICAL_SECTION m_csWindowCreate;
CRITICAL_SECTION m_csObjMap;
DWORD dwAtlBuildVer;
_AtlCreateWndData* m_pCreateWndList;
BOOL m_bDestroyHeap;
GUID* pguidVer;
DWORD m_dwHeaps;
HANDLE* m_phHeaps;
int m_nHeap;
_ATL_TERMFUNC_ELEM* m_pTermFuncs;
} _ATL_MODULEA;
typedef struct _ATL_MODULEW_TAG
{
UINT cbSize;
HINSTANCE m_hInst;
HINSTANCE m_hInstResource;
HINSTANCE m_hInstTypeLib;
_ATL_OBJMAP_ENTRYW* m_pObjMap;
LONG m_nLockCnt;
HANDLE m_hHeap;
union
{
CRITICAL_SECTION m_csTypeInfoHolder;
CRITICAL_SECTION m_csStaticDataInit;
} u;
CRITICAL_SECTION m_csWindowCreate;
CRITICAL_SECTION m_csObjMap;
DWORD dwAtlBuildVer;
_AtlCreateWndData* m_pCreateWndList;
BOOL m_bDestroyHeap;
GUID* pguidVer;
DWORD m_dwHeaps;
HANDLE* m_phHeaps;
int m_nHeap;
_ATL_TERMFUNC_ELEM* m_pTermFuncs;
} _ATL_MODULEW;
typedef struct _ATL_INTMAP_ENTRY_TAG
{
const IID* piid;
DWORD dw;
_ATL_CREATORARGFUNC* pFunc;
} _ATL_INTMAP_ENTRY;
HRESULT WINAPI AtlModuleInit(_ATL_MODULEA* pM, _ATL_OBJMAP_ENTRYA* p, HINSTANCE h);
HRESULT WINAPI AtlModuleRegisterClassObjects(_ATL_MODULEA* pM, DWORD dwClsContext, DWORD dwFlags);
HRESULT WINAPI AtlModuleTerm(_ATL_MODULEA* pM);
HRESULT WINAPI AtlInternalQueryInterface(LPVOID pThis,
const _ATL_INTMAP_ENTRY* pEntries, REFIID iid, LPVOID* ppvObject);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment