Wine-devel
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
August 2018
- 62 participants
- 701 discussions
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
v2: Rebased
dlls/msi/action.c | 12 ++++++------
dlls/msi/appsearch.c | 3 +--
dlls/msi/assembly.c | 2 +-
dlls/msi/automation.c | 2 +-
dlls/msi/custom.c | 8 ++++----
dlls/msi/database.c | 2 +-
dlls/msi/dialog.c | 2 +-
dlls/msi/msi.c | 4 ++--
dlls/msi/package.c | 2 +-
dlls/msi/patch.c | 2 +-
dlls/msi/registry.c | 38 +++++++++++++++++++-------------------
dlls/msi/source.c | 2 +-
dlls/msi/upgrade.c | 2 +-
13 files changed, 40 insertions(+), 41 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 03fab71588..af867618c6 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -2152,7 +2152,7 @@ static WCHAR *create_temp_dir( MSIDATABASE *db )
if (!db->tempfolder)
{
WCHAR tmp[MAX_PATH];
- UINT len = sizeof(tmp)/sizeof(tmp[0]);
+ UINT len = ARRAY_SIZE( tmp );
if (msi_get_property( db, szTempFolder, tmp, &len ) ||
GetFileAttributesW( tmp ) != FILE_ATTRIBUTE_DIRECTORY)
@@ -5546,9 +5546,9 @@ UINT ACTION_ForceReboot(MSIPACKAGE *package)
squash_guid( package->ProductCode, squashed_pc );
- GetSystemDirectoryW(sysdir, sizeof(sysdir)/sizeof(sysdir[0]));
+ GetSystemDirectoryW(sysdir, ARRAY_SIZE(sysdir));
RegCreateKeyW(HKEY_LOCAL_MACHINE,RunOnce,&hkey);
- snprintfW( buffer, sizeof(buffer)/sizeof(buffer[0]), msiexec_fmt, sysdir, squashed_pc );
+ snprintfW(buffer, ARRAY_SIZE(buffer), msiexec_fmt, sysdir, squashed_pc);
msi_reg_set_val_str( hkey, squashed_pc, buffer );
RegCloseKey(hkey);
@@ -6214,7 +6214,7 @@ static LPCWSTR *msi_service_args_to_vector(LPWSTR args, DWORD *numargs)
static const WCHAR separator[] = {'[','~',']',0};
*numargs = 0;
- sep_len = sizeof(separator) / sizeof(WCHAR) - 1;
+ sep_len = ARRAY_SIZE(separator) - 1;
if (!args)
return NULL;
@@ -7686,7 +7686,7 @@ static UINT ITERATE_RemoveExistingProducts( MSIRECORD *rec, LPVOID param )
MSIPACKAGE *package = param;
const WCHAR *property = MSI_RecordGetString( rec, 7 );
int attrs = MSI_RecordGetInteger( rec, 5 );
- UINT len = sizeof(fmtW)/sizeof(fmtW[0]);
+ UINT len = ARRAY_SIZE( fmtW );
WCHAR *product, *features, *cmd;
STARTUPINFOW si;
PROCESS_INFORMATION info;
@@ -7701,7 +7701,7 @@ static UINT ITERATE_RemoveExistingProducts( MSIRECORD *rec, LPVOID param )
if (features)
len += strlenW( features );
else
- len += sizeof(szAll) / sizeof(szAll[0]);
+ len += ARRAY_SIZE( szAll );
if (!(cmd = msi_alloc( len * sizeof(WCHAR) )))
{
diff --git a/dlls/msi/appsearch.c b/dlls/msi/appsearch.c
index 693da18355..fbed073bd4 100644
--- a/dlls/msi/appsearch.c
+++ b/dlls/msi/appsearch.c
@@ -949,8 +949,7 @@ static UINT ACTION_SearchDirectory(MSIPACKAGE *package, MSISIGNATURE *sig,
if (GetDriveTypeW(pathWithDrive) != DRIVE_FIXED)
continue;
- lstrcpynW(pathWithDrive + 3, path,
- sizeof(pathWithDrive) / sizeof(pathWithDrive[0]) - 3);
+ lstrcpynW(pathWithDrive + 3, path, ARRAY_SIZE(pathWithDrive) - 3);
if (sig->File)
rc = ACTION_RecurseSearchDirectory(package, &val, sig,
diff --git a/dlls/msi/assembly.c b/dlls/msi/assembly.c
index 59fd332d25..e3bd965150 100644
--- a/dlls/msi/assembly.c
+++ b/dlls/msi/assembly.c
@@ -344,7 +344,7 @@ static const WCHAR *clr_version[] =
static const WCHAR *get_clr_version_str( enum clr_version version )
{
- if (version >= sizeof(clr_version)/sizeof(clr_version[0])) return clr_version_unknown;
+ if (version >= ARRAY_SIZE( clr_version )) return clr_version_unknown;
return clr_version[version];
}
diff --git a/dlls/msi/automation.c b/dlls/msi/automation.c
index 06ad2f90a4..80254e6df4 100644
--- a/dlls/msi/automation.c
+++ b/dlls/msi/automation.c
@@ -130,7 +130,7 @@ void release_typelib(void)
{
unsigned i;
- for (i = 0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++)
+ for (i = 0; i < ARRAY_SIZE(typeinfos); i++)
if (typeinfos[i])
ITypeInfo_Release(typeinfos[i]);
diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c
index ee259e8ba3..436a096f37 100644
--- a/dlls/msi/custom.c
+++ b/dlls/msi/custom.c
@@ -213,7 +213,7 @@ WCHAR *msi_create_temp_file( MSIDATABASE *db )
if (!db->tempfolder)
{
WCHAR tmp[MAX_PATH];
- UINT len = sizeof(tmp)/sizeof(tmp[0]);
+ UINT len = ARRAY_SIZE( tmp );
if (msi_get_property( db, szTempFolder, tmp, &len ) ||
GetFileAttributesW( tmp ) != FILE_ATTRIBUTE_DIRECTORY)
@@ -605,9 +605,9 @@ static DWORD custom_start_server(MSIPACKAGE *package, DWORD arch)
wow64 = FALSE;
if ((sizeof(void *) == 8 || wow64) && arch == SCS_32BIT_BINARY)
- GetSystemWow64DirectoryW(path, MAX_PATH - sizeof(msiexecW)/sizeof(WCHAR));
+ GetSystemWow64DirectoryW(path, MAX_PATH - ARRAY_SIZE(msiexecW));
else
- GetSystemDirectoryW(path, MAX_PATH - sizeof(msiexecW)/sizeof(WCHAR));
+ GetSystemDirectoryW(path, MAX_PATH - ARRAY_SIZE(msiexecW));
strcatW(path, msiexecW);
sprintfW(cmdline, argsW, path, GetCurrentProcessId());
@@ -943,7 +943,7 @@ static UINT HANDLE_CustomType23( MSIPACKAGE *package, const WCHAR *source, const
static const WCHAR msiexecW[] = {'m','s','i','e','x','e','c',0};
static const WCHAR paramsW[] = {'/','q','b',' ','/','i',' '};
WCHAR *dir, *arg, *p;
- UINT len_src, len_dir, len_tgt, len = sizeof(paramsW)/sizeof(paramsW[0]);
+ UINT len_src, len_dir, len_tgt, len = ARRAY_SIZE( paramsW );
HANDLE handle;
if (!(dir = msi_dup_property( package->db, szOriginalDatabase ))) return ERROR_OUTOFMEMORY;
diff --git a/dlls/msi/database.c b/dlls/msi/database.c
index ef0221d2b8..c1fb37b583 100644
--- a/dlls/msi/database.c
+++ b/dlls/msi/database.c
@@ -451,7 +451,7 @@ static LPWSTR msi_build_createsql_prelude(LPWSTR table)
static const WCHAR create_fmt[] = {'C','R','E','A','T','E',' ','T','A','B','L','E',' ','`','%','s','`',' ','(',' ',0};
- size = sizeof(create_fmt)/sizeof(create_fmt[0]) + lstrlenW(table) - 2;
+ size = ARRAY_SIZE(create_fmt) + lstrlenW(table) - 2;
prelude = msi_alloc(size * sizeof(WCHAR));
if (!prelude)
return NULL;
diff --git a/dlls/msi/dialog.c b/dlls/msi/dialog.c
index b96c44be44..68e8ab2258 100644
--- a/dlls/msi/dialog.c
+++ b/dlls/msi/dialog.c
@@ -3377,7 +3377,7 @@ static UINT msi_dialog_hyperlink_handler( msi_dialog *dialog, msi_control *contr
{
static const WCHAR hrefW[] = {'h','r','e','f'};
static const WCHAR openW[] = {'o','p','e','n',0};
- int len, len_href = sizeof(hrefW) / sizeof(hrefW[0]);
+ int len, len_href = ARRAY_SIZE( hrefW );
const WCHAR *p, *q;
WCHAR quote = 0;
LITEM item;
diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c
index 7d805afeda..ae146e626f 100644
--- a/dlls/msi/msi.c
+++ b/dlls/msi/msi.c
@@ -1028,7 +1028,7 @@ UINT WINAPI MsiGetProductCodeW(LPCWSTR szComponent, LPWSTR szBuffer)
UINT rc, index;
HKEY compkey, prodkey;
WCHAR squashed_comp[SQUASHED_GUID_SIZE], squashed_prod[SQUASHED_GUID_SIZE];
- DWORD sz = sizeof(squashed_prod)/sizeof(squashed_prod[0]);
+ DWORD sz = ARRAY_SIZE(squashed_prod);
TRACE("%s %p\n", debugstr_w(szComponent), szBuffer);
@@ -3482,7 +3482,7 @@ static UINT MSI_ProvideQualifiedComponentEx(LPCWSTR szComponent,
return ERROR_FILE_NOT_FOUND;
}
msi_free( components );
- StringFromGUID2( &guid, comp, sizeof(comp)/sizeof(comp[0]) );
+ StringFromGUID2( &guid, comp, ARRAY_SIZE( comp ));
}
state = MSI_GetComponentPath( szProduct, comp, szAllSid, MSIINSTALLCONTEXT_ALL, lpPathBuf, pcchPathBuf );
diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index 0d937d609d..273ca71418 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -559,7 +559,7 @@ static LPWSTR get_fusion_filename(MSIPACKAGE *package)
if (!RegCreateKeyExW(netsetup, v4client, 0, NULL, 0, KEY_QUERY_VALUE, NULL, &hkey, NULL))
{
- size = sizeof(path)/sizeof(path[0]);
+ size = ARRAY_SIZE(path);
if (!RegQueryValueExW(hkey, installpath, NULL, &type, (BYTE *)path, &size))
{
len = strlenW(path) + strlenW(fusion) + 2;
diff --git a/dlls/msi/patch.c b/dlls/msi/patch.c
index f6ed3c1f1a..bd9b7b87df 100644
--- a/dlls/msi/patch.c
+++ b/dlls/msi/patch.c
@@ -1037,7 +1037,7 @@ UINT msi_apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code )
TRACE("%p, %s\n", package, debugstr_w(patch_code));
- len = sizeof(patch_file) / sizeof(WCHAR);
+ len = ARRAY_SIZE( patch_file );
r = MsiGetPatchInfoExW( patch_code, package->ProductCode, NULL, package->Context,
INSTALLPROPERTY_LOCALPACKAGEW, patch_file, &len );
if (r != ERROR_SUCCESS)
diff --git a/dlls/msi/registry.c b/dlls/msi/registry.c
index cbc8d8d6f0..efc72725ce 100644
--- a/dlls/msi/registry.c
+++ b/dlls/msi/registry.c
@@ -1297,12 +1297,12 @@ static UINT fetch_machine_component( DWORD ctx, DWORD index, DWORD *idx, WCHAR g
if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, componentsW, 0, access, &key_components ))
return ERROR_NO_MORE_ITEMS;
- len_component = sizeof(component)/sizeof(component[0]);
+ len_component = ARRAY_SIZE( component );
while (!RegEnumKeyExW( key_components, i, component, &len_component, NULL, NULL, NULL, NULL ))
{
if (*idx == index) goto found;
(*idx)++;
- len_component = sizeof(component)/sizeof(component[0]);
+ len_component = ARRAY_SIZE( component );
i++;
}
RegCloseKey( key_components );
@@ -1349,14 +1349,14 @@ static UINT fetch_user_component( const WCHAR *usersid, DWORD ctx, DWORD index,
if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, userdataW, 0, access, &key_users ))
return ERROR_NO_MORE_ITEMS;
- len_user = sizeof(user)/sizeof(user[0]);
+ len_user = ARRAY_SIZE( user );
while (!RegEnumKeyExW( key_users, i, user, &len_user, NULL, NULL, NULL, NULL ))
{
if ((strcmpW( usersid, szAllSid ) && strcmpW( usersid, user )) ||
!strcmpW( szLocalSid, user ))
{
i++;
- len_user = sizeof(user)/sizeof(user[0]);
+ len_user = ARRAY_SIZE( user );
continue;
}
strcpyW( path, user );
@@ -1364,19 +1364,19 @@ static UINT fetch_user_component( const WCHAR *usersid, DWORD ctx, DWORD index,
if (RegOpenKeyExW( key_users, path, 0, access, &key_components ))
{
i++;
- len_user = sizeof(user)/sizeof(user[0]);
+ len_user = ARRAY_SIZE( user );
continue;
}
- len_component = sizeof(component)/sizeof(component[0]);
+ len_component = ARRAY_SIZE( component );
while (!RegEnumKeyExW( key_components, j, component, &len_component, NULL, NULL, NULL, NULL ))
{
if (*idx == index) goto found;
(*idx)++;
- len_component = sizeof(component)/sizeof(component[0]);
+ len_component = ARRAY_SIZE( component );
j++;
}
RegCloseKey( key_components );
- len_user = sizeof(user)/sizeof(user[0]);
+ len_user = ARRAY_SIZE( user );
i++;
}
RegCloseKey( key_users );
@@ -1709,7 +1709,7 @@ UINT WINAPI MsiEnumRelatedProductsW(LPCWSTR szUpgradeCode, DWORD dwReserved,
UINT r;
HKEY hkey;
WCHAR szKeyName[SQUASHED_GUID_SIZE];
- DWORD dwSize = sizeof(szKeyName)/sizeof(szKeyName[0]);
+ DWORD dwSize = ARRAY_SIZE(szKeyName);
TRACE("%s %u %u %p\n", debugstr_w(szUpgradeCode), dwReserved,
iProductIndex, lpProductBuf);
@@ -2324,18 +2324,18 @@ static UINT fetch_machine_product( const WCHAR *match, DWORD index, DWORD *idx,
if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, productsW, 0, access, &key ))
return ERROR_NO_MORE_ITEMS;
- len = sizeof(product)/sizeof(product[0]);
+ len = ARRAY_SIZE( product );
while (!RegEnumKeyExW( key, i, product, &len, NULL, NULL, NULL, NULL ))
{
if (match && strcmpW( match, product ))
{
i++;
- len = sizeof(product)/sizeof(product[0]);
+ len = ARRAY_SIZE( product );
continue;
}
if (*idx == index) goto found;
(*idx)++;
- len = sizeof(product)/sizeof(product[0]);
+ len = ARRAY_SIZE( product );
i++;
}
RegCloseKey( key );
@@ -2396,13 +2396,13 @@ static UINT fetch_user_product( const WCHAR *match, const WCHAR *usersid, DWORD
}
else return ERROR_INVALID_PARAMETER;
- len_user = sizeof(user)/sizeof(user[0]);
+ len_user = ARRAY_SIZE( user );
while (!RegEnumKeyExW( key_users, i, user, &len_user, NULL, NULL, NULL, NULL ))
{
if (strcmpW( usersid, user ) && strcmpW( usersid, szAllSid ))
{
i++;
- len_user = sizeof(user)/sizeof(user[0]);
+ len_user = ARRAY_SIZE( user );
continue;
}
strcpyW( path, user );
@@ -2410,25 +2410,25 @@ static UINT fetch_user_product( const WCHAR *match, const WCHAR *usersid, DWORD
if (RegOpenKeyExW( key_users, path, 0, access, &key_products ))
{
i++;
- len_user = sizeof(user)/sizeof(user[0]);
+ len_user = ARRAY_SIZE( user );
continue;
}
- len_product = sizeof(product)/sizeof(product[0]);
+ len_product = ARRAY_SIZE( product );
while (!RegEnumKeyExW( key_products, j, product, &len_product, NULL, NULL, NULL, NULL ))
{
if (match && strcmpW( match, product ))
{
j++;
- len_product = sizeof(product)/sizeof(product[0]);
+ len_product = ARRAY_SIZE( product );
continue;
}
if (*idx == index) goto found;
(*idx)++;
- len_product = sizeof(product)/sizeof(product[0]);
+ len_product = ARRAY_SIZE( product );
j++;
}
RegCloseKey( key_products );
- len_user = sizeof(user)/sizeof(user[0]);
+ len_user = ARRAY_SIZE( user );
i++;
}
RegCloseKey( key_users );
diff --git a/dlls/msi/source.c b/dlls/msi/source.c
index 68bf9d0a22..904589e947 100644
--- a/dlls/msi/source.c
+++ b/dlls/msi/source.c
@@ -1006,7 +1006,7 @@ static UINT fill_source_list(struct list *sourcelist, HKEY sourcekey, DWORD *cou
while (r == ERROR_SUCCESS)
{
- size = sizeof(name) / sizeof(name[0]);
+ size = ARRAY_SIZE(name);
r = RegEnumValueW(sourcekey, index, name, &size, NULL, NULL, NULL, &val_size);
if (r != ERROR_SUCCESS)
return r;
diff --git a/dlls/msi/upgrade.c b/dlls/msi/upgrade.c
index ac58d909e0..bbc7df6eec 100644
--- a/dlls/msi/upgrade.c
+++ b/dlls/msi/upgrade.c
@@ -103,7 +103,7 @@ static UINT ITERATE_FindRelatedProducts(MSIRECORD *rec, LPVOID param)
{
MSIPACKAGE *package = param;
WCHAR product[SQUASHED_GUID_SIZE];
- DWORD index = 0, attributes = 0, sz = sizeof(product)/sizeof(product[0]);
+ DWORD index = 0, attributes = 0, sz = ARRAY_SIZE(product);
LPCWSTR upgrade_code;
HKEY hkey = 0;
UINT rc = ERROR_SUCCESS;
--
2.14.4
2
1
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
v2: removed failing test
dlls/wmp/oleobj.c | 11 +++++--
dlls/wmp/tests/oleobj.c | 10 +++++++
dlls/wmp/wmp_main.c | 66 +++++++++++++++++++++++++++++++++++++++++
dlls/wmp/wmp_private.h | 15 ++++++++++
4 files changed, 99 insertions(+), 3 deletions(-)
diff --git a/dlls/wmp/oleobj.c b/dlls/wmp/oleobj.c
index a90a0c2c6c..cbbd965c38 100644
--- a/dlls/wmp/oleobj.c
+++ b/dlls/wmp/oleobj.c
@@ -760,11 +760,16 @@ static ULONG WINAPI ProvideClassInfo2_Release(IProvideClassInfo2 *iface)
return IOleObject_Release(&This->IOleObject_iface);
}
-static HRESULT WINAPI ProvideClassInfo2_GetClassInfo(IProvideClassInfo2 *iface, ITypeInfo **ppTI)
+static HRESULT WINAPI ProvideClassInfo2_GetClassInfo(IProvideClassInfo2 *iface, ITypeInfo **ti)
{
WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface);
- FIXME("(%p)->(%p)\n", This, ppTI);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, ti);
+
+ if (!ti)
+ return E_POINTER;
+
+ return get_typeinfo(WindowsMediaPlayer_tid, ti);
}
static HRESULT WINAPI ProvideClassInfo2_GetGUID(IProvideClassInfo2 *iface, DWORD dwGuidKind, GUID *pGUID)
diff --git a/dlls/wmp/tests/oleobj.c b/dlls/wmp/tests/oleobj.c
index 472b985244..2250b75aa9 100644
--- a/dlls/wmp/tests/oleobj.c
+++ b/dlls/wmp/tests/oleobj.c
@@ -1199,6 +1199,8 @@ static void test_wmp(void)
IOleObject *oleobj;
IWMPCore *wmpcore;
DWORD misc_status;
+ TYPEATTR *attr;
+ ITypeInfo *ti;
RECT pos = {0,0,100,100};
HWND hwnd;
GUID guid;
@@ -1232,6 +1234,14 @@ static void test_wmp(void)
ok(hres == S_OK, "GetGUID failed: %08x\n", hres);
ok(IsEqualGUID(&guid, &IID__WMPOCXEvents), "guid = %s\n", wine_dbgstr_guid(&guid));
+ hres = IProvideClassInfo2_GetClassInfo(class_info, &ti);
+ ok(hres == S_OK, "Failed to get class info, hr %#x.\n", hres);
+ hres = ITypeInfo_GetTypeAttr(ti, &attr);
+ ok(hres == S_OK, "Failed to get type attributes, hr %#x.\n", hres);
+ ok(IsEqualGUID(&CLSID_WindowsMediaPlayer, &attr->guid), "Unexpected typeinfo guid %s\n", wine_dbgstr_guid(&attr->guid));
+ ITypeInfo_ReleaseTypeAttr(ti, attr);
+ ITypeInfo_Release(ti);
+
IProvideClassInfo2_Release(class_info);
test_QI((IUnknown*)oleobj);
diff --git a/dlls/wmp/wmp_main.c b/dlls/wmp/wmp_main.c
index 273d193e58..2541fc54ff 100644
--- a/dlls/wmp/wmp_main.c
+++ b/dlls/wmp/wmp_main.c
@@ -27,6 +27,71 @@ WINE_DEFAULT_DEBUG_CHANNEL(wmp);
HINSTANCE wmp_instance;
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
+static REFIID tid_ids[] = {
+#define XIID(iface) &IID_ ## iface,
+#define CTID(name) &CLSID_ ## name,
+TID_LIST
+#undef XIID
+#undef CTID
+};
+
+static ITypeLib *typelib;
+static ITypeInfo *typeinfos[LAST_tid];
+
+static HRESULT load_typelib(void)
+{
+ ITypeLib *tl;
+ HRESULT hr;
+
+ hr = LoadRegTypeLib(&LIBID_WMPLib, 1, 0, LOCALE_SYSTEM_DEFAULT, &tl);
+ if (FAILED(hr)) {
+ ERR("LoadRegTypeLib failed: %08x\n", hr);
+ return hr;
+ }
+
+ if (InterlockedCompareExchangePointer((void **)&typelib, tl, NULL))
+ ITypeLib_Release(tl);
+ return hr;
+}
+
+HRESULT get_typeinfo(typeinfo_id tid, ITypeInfo **typeinfo)
+{
+ HRESULT hr;
+
+ if (!typelib)
+ hr = load_typelib();
+ if (!typelib)
+ return hr;
+
+ if (!typeinfos[tid]) {
+ ITypeInfo *ti;
+
+ hr = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &ti);
+ if (FAILED(hr)) {
+ ERR("GetTypeInfoOfGuid (%s) failed: %08x\n", debugstr_guid(tid_ids[tid]), hr);
+ return hr;
+ }
+
+ if (InterlockedCompareExchangePointer((void **)(typeinfos + tid), ti, NULL))
+ ITypeInfo_Release(ti);
+ }
+
+ *typeinfo = typeinfos[tid];
+ ITypeInfo_AddRef(*typeinfo);
+ return S_OK;
+}
+
+static void release_typelib(void)
+{
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(typeinfos); i++)
+ if (typeinfos[i])
+ ITypeInfo_Release(typeinfos[i]);
+
+ ITypeLib_Release(typelib);
+}
+
static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
{
*ppv = NULL;
@@ -93,6 +158,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
case DLL_PROCESS_DETACH:
unregister_wmp_class();
unregister_player_msg_class();
+ release_typelib();
break;
}
diff --git a/dlls/wmp/wmp_private.h b/dlls/wmp/wmp_private.h
index 9617be0c7f..ab9c6d098c 100644
--- a/dlls/wmp/wmp_private.h
+++ b/dlls/wmp/wmp_private.h
@@ -25,6 +25,21 @@
#include "dshow.h"
#include "wmp.h"
+#define TID_LIST \
+ XIID(NULL) \
+ CTID(WindowsMediaPlayer)
+
+typedef enum {
+#define XIID(iface) iface ## _tid,
+#define CTID(name) name ## _tid,
+TID_LIST
+#undef XIID
+#undef CTID
+ LAST_tid
+} typeinfo_id;
+
+HRESULT get_typeinfo(typeinfo_id tid, ITypeInfo **typeinfo) DECLSPEC_HIDDEN;
+
typedef struct {
IConnectionPoint IConnectionPoint_iface;
--
2.18.0
1
0
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/wmp/oleobj.c | 11 +++++--
dlls/wmp/tests/oleobj.c | 12 ++++++++
dlls/wmp/wmp_main.c | 66 +++++++++++++++++++++++++++++++++++++++++
dlls/wmp/wmp_private.h | 15 ++++++++++
4 files changed, 101 insertions(+), 3 deletions(-)
diff --git a/dlls/wmp/oleobj.c b/dlls/wmp/oleobj.c
index a90a0c2c6c..cbbd965c38 100644
--- a/dlls/wmp/oleobj.c
+++ b/dlls/wmp/oleobj.c
@@ -760,11 +760,16 @@ static ULONG WINAPI ProvideClassInfo2_Release(IProvideClassInfo2 *iface)
return IOleObject_Release(&This->IOleObject_iface);
}
-static HRESULT WINAPI ProvideClassInfo2_GetClassInfo(IProvideClassInfo2 *iface, ITypeInfo **ppTI)
+static HRESULT WINAPI ProvideClassInfo2_GetClassInfo(IProvideClassInfo2 *iface, ITypeInfo **ti)
{
WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface);
- FIXME("(%p)->(%p)\n", This, ppTI);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, ti);
+
+ if (!ti)
+ return E_POINTER;
+
+ return get_typeinfo(WindowsMediaPlayer_tid, ti);
}
static HRESULT WINAPI ProvideClassInfo2_GetGUID(IProvideClassInfo2 *iface, DWORD dwGuidKind, GUID *pGUID)
diff --git a/dlls/wmp/tests/oleobj.c b/dlls/wmp/tests/oleobj.c
index 472b985244..2a69a102de 100644
--- a/dlls/wmp/tests/oleobj.c
+++ b/dlls/wmp/tests/oleobj.c
@@ -1199,6 +1199,8 @@ static void test_wmp(void)
IOleObject *oleobj;
IWMPCore *wmpcore;
DWORD misc_status;
+ TYPEATTR *attr;
+ ITypeInfo *ti;
RECT pos = {0,0,100,100};
HWND hwnd;
GUID guid;
@@ -1232,6 +1234,16 @@ static void test_wmp(void)
ok(hres == S_OK, "GetGUID failed: %08x\n", hres);
ok(IsEqualGUID(&guid, &IID__WMPOCXEvents), "guid = %s\n", wine_dbgstr_guid(&guid));
+ hres = IProvideClassInfo2_GetClassInfo(class_info, NULL);
+ ok(hres == E_POINTER, "Unexpected hr %#x.\n", hres);
+ hres = IProvideClassInfo2_GetClassInfo(class_info, &ti);
+ ok(hres == S_OK, "Failed to get class info, hr %#x.\n", hres);
+ hres = ITypeInfo_GetTypeAttr(ti, &attr);
+ ok(hres == S_OK, "Failed to get type attributes, hr %#x.\n", hres);
+ ok(IsEqualGUID(&CLSID_WindowsMediaPlayer, &attr->guid), "Unexpected typeinfo guid %s\n", wine_dbgstr_guid(&attr->guid));
+ ITypeInfo_ReleaseTypeAttr(ti, attr);
+ ITypeInfo_Release(ti);
+
IProvideClassInfo2_Release(class_info);
test_QI((IUnknown*)oleobj);
diff --git a/dlls/wmp/wmp_main.c b/dlls/wmp/wmp_main.c
index 273d193e58..2541fc54ff 100644
--- a/dlls/wmp/wmp_main.c
+++ b/dlls/wmp/wmp_main.c
@@ -27,6 +27,71 @@ WINE_DEFAULT_DEBUG_CHANNEL(wmp);
HINSTANCE wmp_instance;
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
+static REFIID tid_ids[] = {
+#define XIID(iface) &IID_ ## iface,
+#define CTID(name) &CLSID_ ## name,
+TID_LIST
+#undef XIID
+#undef CTID
+};
+
+static ITypeLib *typelib;
+static ITypeInfo *typeinfos[LAST_tid];
+
+static HRESULT load_typelib(void)
+{
+ ITypeLib *tl;
+ HRESULT hr;
+
+ hr = LoadRegTypeLib(&LIBID_WMPLib, 1, 0, LOCALE_SYSTEM_DEFAULT, &tl);
+ if (FAILED(hr)) {
+ ERR("LoadRegTypeLib failed: %08x\n", hr);
+ return hr;
+ }
+
+ if (InterlockedCompareExchangePointer((void **)&typelib, tl, NULL))
+ ITypeLib_Release(tl);
+ return hr;
+}
+
+HRESULT get_typeinfo(typeinfo_id tid, ITypeInfo **typeinfo)
+{
+ HRESULT hr;
+
+ if (!typelib)
+ hr = load_typelib();
+ if (!typelib)
+ return hr;
+
+ if (!typeinfos[tid]) {
+ ITypeInfo *ti;
+
+ hr = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &ti);
+ if (FAILED(hr)) {
+ ERR("GetTypeInfoOfGuid (%s) failed: %08x\n", debugstr_guid(tid_ids[tid]), hr);
+ return hr;
+ }
+
+ if (InterlockedCompareExchangePointer((void **)(typeinfos + tid), ti, NULL))
+ ITypeInfo_Release(ti);
+ }
+
+ *typeinfo = typeinfos[tid];
+ ITypeInfo_AddRef(*typeinfo);
+ return S_OK;
+}
+
+static void release_typelib(void)
+{
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(typeinfos); i++)
+ if (typeinfos[i])
+ ITypeInfo_Release(typeinfos[i]);
+
+ ITypeLib_Release(typelib);
+}
+
static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
{
*ppv = NULL;
@@ -93,6 +158,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
case DLL_PROCESS_DETACH:
unregister_wmp_class();
unregister_player_msg_class();
+ release_typelib();
break;
}
diff --git a/dlls/wmp/wmp_private.h b/dlls/wmp/wmp_private.h
index 9617be0c7f..ab9c6d098c 100644
--- a/dlls/wmp/wmp_private.h
+++ b/dlls/wmp/wmp_private.h
@@ -25,6 +25,21 @@
#include "dshow.h"
#include "wmp.h"
+#define TID_LIST \
+ XIID(NULL) \
+ CTID(WindowsMediaPlayer)
+
+typedef enum {
+#define XIID(iface) iface ## _tid,
+#define CTID(name) name ## _tid,
+TID_LIST
+#undef XIID
+#undef CTID
+ LAST_tid
+} typeinfo_id;
+
+HRESULT get_typeinfo(typeinfo_id tid, ITypeInfo **typeinfo) DECLSPEC_HIDDEN;
+
typedef struct {
IConnectionPoint IConnectionPoint_iface;
--
2.18.0
2
1
21 Aug '18
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineRunBuild.pl | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/testbot/bin/WineRunBuild.pl b/testbot/bin/WineRunBuild.pl
index c681d2e14..32369b191 100755
--- a/testbot/bin/WineRunBuild.pl
+++ b/testbot/bin/WineRunBuild.pl
@@ -363,7 +363,7 @@ if (!$TA->SendFile($FileName, "staging/patch.diff", 0))
}
my $Script = "#!/bin/sh\n".
"( set -x\n".
- " ../bin/build/Build.pl patch.diff ". join(",", sort keys %Bitnesses) ."\n".
+ " ../bin/build/Build.pl patch.diff ". join(":", sort keys %Bitnesses) ."\n".
") >Build.log 2>&1\n";
Debug(Elapsed($Start), " Sending the script: [$Script]\n");
if (!$TA->SendFileFromString($Script, "task", $TestAgent::SENDFILE_EXE))
--
2.18.0
1
0
[PATCH] testbot/WineRunWineTest: Use the new WineTest command line options.
by Francois Gouget 21 Aug '18
by Francois Gouget 21 Aug '18
21 Aug '18
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineRunWineTest.pl | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/testbot/bin/WineRunWineTest.pl b/testbot/bin/WineRunWineTest.pl
index 6c0c923c9..ac5594654 100755
--- a/testbot/bin/WineRunWineTest.pl
+++ b/testbot/bin/WineRunWineTest.pl
@@ -428,7 +428,7 @@ if ($Step->Type eq "suite")
my $Tag = lc($VM->Name);
$Tag =~ s/^$TagPrefix//;
$Tag =~ s/[^a-zA-Z0-9]/-/g;
- $Script .= $Task->CmdLineArg .",submit winetest $TagPrefix-$Tag ";
+ $Script .= "--winetest ". $Task->CmdLineArg ." $TagPrefix-$Tag ";
if (defined $WebHostName)
{
my $StepTask = 100 * $StepNo + $TaskNo;
@@ -444,7 +444,7 @@ if ($Step->Type eq "suite")
}
else
{
- $Script .= $Task->CmdLineArg ." build patch.diff";
+ $Script .= "--testpatch ". $Task->CmdLineArg ." patch.diff";
}
$Script .= "\n) >Task.log 2>&1\n";
Debug(Elapsed($Start), " Sending the script: [$Script]\n");
--
2.18.0
1
0
21 Aug '18
That directory is created by Reconfig.pl which must be run before
Build.pl.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/build/Build.pl | 2 --
1 file changed, 2 deletions(-)
diff --git a/testbot/bin/build/Build.pl b/testbot/bin/build/Build.pl
index b729d95f4..e1133aaee 100755
--- a/testbot/bin/build/Build.pl
+++ b/testbot/bin/build/Build.pl
@@ -132,8 +132,6 @@ sub ApplyPatch($)
sub BuildNative()
{
- mkdir "$DataDir/build-native" if (! -d "$DataDir/build-native");
-
InfoMsg "\nRebuilding native tools\n";
system("cd '$DataDir/build-native' && set -x && ".
"time make -j$ncpus __tooldeps__");
--
2.18.0
1
0
This can help avoid errors when testing the script manually.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineRunBuild.pl | 6 +++++-
testbot/bin/WineRunReconfig.pl | 6 +++++-
testbot/bin/WineRunTask.pl | 6 +++++-
testbot/bin/WineRunWineTest.pl | 6 +++++-
4 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/testbot/bin/WineRunBuild.pl b/testbot/bin/WineRunBuild.pl
index 47e4b3bbd..c681d2e14 100755
--- a/testbot/bin/WineRunBuild.pl
+++ b/testbot/bin/WineRunBuild.pl
@@ -325,9 +325,13 @@ if (!$VM->GetDomain()->IsPoweredOn())
FatalError("The VM is not powered on\n");
}
+if ($Step->Type ne "build")
+{
+ FatalError("Unexpected step type '". $Step->Type ."' found\n");
+}
if ($Step->FileType ne "patch")
{
- FatalError("Unexpected file type '". $Step->FileType ."' found\n");
+ FatalError("Unexpected file type '". $Step->FileType ."' found for ". $Step->Type ." step\n");
}
diff --git a/testbot/bin/WineRunReconfig.pl b/testbot/bin/WineRunReconfig.pl
index 24a24d067..b45dba5c7 100755
--- a/testbot/bin/WineRunReconfig.pl
+++ b/testbot/bin/WineRunReconfig.pl
@@ -325,9 +325,13 @@ if (!$VM->GetDomain()->IsPoweredOn())
FatalError("The VM is not powered on\n");
}
+if ($Step->Type ne "reconfig")
+{
+ FatalError("Unexpected step type '". $Step->Type ."' found\n");
+}
if ($Step->FileType ne "none")
{
- FatalError("Unexpected file type '". $Step->FileType ."' found\n");
+ FatalError("Unexpected file type '". $Step->FileType ."' found for ". $Step->Type ." step\n");
}
diff --git a/testbot/bin/WineRunTask.pl b/testbot/bin/WineRunTask.pl
index 204f86305..27dd8e7b3 100755
--- a/testbot/bin/WineRunTask.pl
+++ b/testbot/bin/WineRunTask.pl
@@ -381,9 +381,13 @@ if (!$VM->GetDomain()->IsPoweredOn())
FatalError("The VM is not powered on\n");
}
+if ($Step->Type ne "single" and $Step->Type ne "suite")
+{
+ FatalError("Unexpected step type '". $Step->Type ."' found\n");
+}
if ($Step->FileType ne "exe32" and $Step->FileType ne "exe64")
{
- FatalError("Unexpected file type '". $Step->FileType ."' found\n");
+ FatalError("Unexpected file type '". $Step->FileType ."' found for ". $Step->Type ." step\n");
}
diff --git a/testbot/bin/WineRunWineTest.pl b/testbot/bin/WineRunWineTest.pl
index ee4c8537a..6c0c923c9 100755
--- a/testbot/bin/WineRunWineTest.pl
+++ b/testbot/bin/WineRunWineTest.pl
@@ -382,10 +382,14 @@ if (!$VM->GetDomain()->IsPoweredOn())
FatalError("The VM is not powered on\n");
}
+if ($Step->Type ne "build" and $Step->Type ne "suite")
+{
+ FatalError("Unexpected step type '". $Step->Type ."' found\n");
+}
if (($Step->Type eq "suite" and $Step->FileType ne "none") or
($Step->Type ne "suite" and $Step->FileType ne "patch"))
{
- FatalError("Unexpected file type '". $Step->FileType ."' found\n");
+ FatalError("Unexpected file type '". $Step->FileType ."' found for ". $Step->Type ." step\n");
}
--
2.18.0
1
0
21 Aug '18
This opens the door to standardizing the format of the status lines.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/lib/WineTestBot/LogUtils.pm | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/testbot/lib/WineTestBot/LogUtils.pm b/testbot/lib/WineTestBot/LogUtils.pm
index e6f9a27af..d39c81b38 100644
--- a/testbot/lib/WineTestBot/LogUtils.pm
+++ b/testbot/lib/WineTestBot/LogUtils.pm
@@ -60,16 +60,16 @@ sub ParseTaskLog($$)
foreach my $Line (<$LogFile>)
{
chomp $Line;
- if ($Line =~ /^$ResultPrefix: ok$/)
+ if ($Line =~ /^(?:$ResultPrefix|Task): ok$/)
{
$Result ||= "ok";
}
- elsif ($Line =~ /^$ResultPrefix: Patch failed to apply$/)
+ elsif ($Line =~ /^(?:$ResultPrefix|Task): Patch failed to apply$/)
{
$Result = "badpatch";
last; # Should be the last and most specific message
}
- elsif ($Line =~ /^$ResultPrefix: /)
+ elsif ($Line =~ /^(?:$ResultPrefix|Task): /)
{
$Result = "failed";
}
--
2.18.0
1
0
[PATCH 1/6] shell32: Remove alpha channel from 4-bit and 8-bit Internet icons
by Alex Henrie 21 Aug '18
by Alex Henrie 21 Aug '18
21 Aug '18
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
I used Tango's raster icons for these bit depths, but forgot that they
are only supposed to have a 1-bit transparency mask.
Also, it turns out that it looks much better to take Tango's 32x32
Internet icon, scale it up, and then reduce the color depth, rather than
taking the 48x48 icon, scaling it down, and reducing the color depth.
This commit also includes that change.
---
dlls/shell32/resources/internet.ico | Bin 78510 -> 76974 bytes
dlls/shell32/resources/internet.svg | 373 ++++++++++++++++++++--------
2 files changed, 274 insertions(+), 99 deletions(-)
diff --git a/dlls/shell32/resources/internet.ico b/dlls/shell32/resources/internet.ico
index cf326639b8a38894eab41af159f94ca982451589..7145da1423908508661725b37ae0d396cb54e899 100644
GIT binary patch
delta 14870
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
OWRFYs`2WTpxBfR5+&M`A
delta 14884
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
diff --git a/dlls/shell32/resources/internet.svg b/dlls/shell32/resources/internet.svg
index 07b6e67e98..3d926f1d30 100644
--- a/dlls/shell32/resources/internet.svg
+++ b/dlls/shell32/resources/internet.svg
@@ -2120,7 +2120,86 @@
y="220"
x="328"
id="icon:48-8"
- xlink:href="data:image/png;base64,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 ZWk+nudlRcARCkdo1lYX03uiD/FhXym7ur5HPO7y1n8eZfu6EnxfMecqfnTMo/O901nCk8kkyWQS E6j5IpZLhS+2+Vna6ADP83BdNwORTKV4/uV2zo6GaKkr40rfFeIzSW62d7ryxlYgxOHXO/Fm4zRV F6TFSEPXZZklPJVKEY/HOXxu5EYrnY/CwvViCN9XxBM+w9fGl0BMTk4x4hVRW1NJQczh/eOX0YG4 6e7JigBdXX+D9KR46bmXqC+NUVEYxfXSk8wHI3Co410e/+7rJPOb5+cAmf70bnSiBQjpS7T0CPwU 710Yzoh3XZeLlweJ2IKWujKOvX0Go1fegr/l1mJ39/eZm42LF/7+JVobiqkoinJpQjI7G894P5lM MjAygVNQi6/MkggsTiMpJYH00NLFSA8jPfomwHXdjF0Zn+PO1o2c6DjL3MwcHR0rnx/ccmcOYGjw XYqKNx8YujDA3fu2grBoKJTo+dWjUoofv3kOL1R6Y0MrCNJvZSogUAqjJEZJCHyM8kH5GCWRUrGp ymFg6Crn+4apadzOqc6zTIxN09VZJqB9RW0fane6bc+T5K6Kmt9+6AHaNhQwOTlJIpHk737SxWS0 GSccw6QXRPOmMVqD0aADjA4gUBidPgBZaJU5apTGpo3kR8Oc6DhLfCZBV1eZgAO31PShzwfa2h7D DtnmM59t5vP33cGh7lO80R8j5Qfc2ARKi8cYzGLxmU+FCQJCQlNXWURteSGDF69y6cwAgTGi653b P635SCc0O3Y8QjgWMTkxh5adG2jcvInxmSSD16YZvR7HdWV62WsWvK8xJg3g2FCaH6W8JJ+ywlxG BkbpOz1AMuFitC0OH/7Oh9LyS52RtbU9hrEsE3YcappqqG6oprS8iMDAbCKF70t8X2JbAscS5EQc HEswMXqd8SvjDPePoZQkUFp0d//gI2n4WE4pd+x4hHA4Cnb6rT4nN4e8gjzCsRC2baGkwvckiZkE yYQHlkFohJQBR458NOEfK8AHx86dX8VxbIRIb9EZk952sayAysoJnn/++V/FYz8Zn4z/l+O/AUIp xNBeLkr4AAAAFHRFWHRBdXRob3IASmFrdWIgU3RlaW5lcub79y8AAABYdEVYdENvcHlyaWdodABD QzAgUHVibGljIERvbWFpbiBEZWRpY2F0aW9uIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1 YmxpY2RvbWFpbi96ZXJvLzEuMC/G4735AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE4LTA4LTE3VDIx OjU2OjA4LTA2OjAwMKhk9wAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxOC0wOC0xN1QyMTo1NjowOC0w NjowMEH13EsAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAIXRFWHRTb3Vy Y2UAaHR0cDovL2ppbW1hYy5tdXNpY2hhbGwuY3ppZuNeAAAAAElFTkSuQmCC "
+ xlink:href="data:image/png;base64,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
+"
preserveAspectRatio="none"
height="48"
width="48" />
@@ -2128,7 +2207,86 @@
y="220"
x="384"
id="icon:48-4"
- xlink:href="data:image/png;base64,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 JHhXMzW15djsNpJyVcjN4zQBKAoYcYPhwetc6LzM6ZfbMU2T8PKK6Ox8alsc3pVbyv37P4fDYcfu tMuYbuD3uymvLiEnz4vD7kDXdRYXlrg+OsHczDJ2p5WVFV0YMYOuru0Rf1cF3IoDBx5E01SEkIBE SoEQoChJSkpmOXny5O+j2ffwHv5f4r8AcHf64g75RHYAAAAUdEVYdEF1dGhvcgBKYWt1YiBTdGVp bmVy5vv3LwAAAFh0RVh0Q29weXJpZ2h0AENDMCBQdWJsaWMgRG9tYWluIERlZGljYXRpb24gaHR0 cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wL8bjvfkAAAAldEVY dGRhdGU6Y3JlYXRlADIwMTgtMDgtMTdUMjE6NTY6MDktMDY6MDCW329DAAAAJXRFWHRkYXRlOm1v ZGlmeQAyMDE4LTA4LTE3VDIxOjU2OjA5LTA2OjAw54LX/wAAABl0RVh0U29mdHdhcmUAd3d3Lmlu a3NjYXBlLm9yZ5vuPBoAAAAhdEVYdFNvdXJjZQBodHRwOi8vamltbWFjLm11c2ljaGFsbC5jemlm 414AAAAASUVORK5CYII= "
+ xlink:href="data:image/png;base64,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
+"
preserveAspectRatio="none"
height="48"
width="48" />
@@ -2459,47 +2617,43 @@
preserveAspectRatio="none"
xlink:href="data:image/png;base64,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
-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
-Mzk6MjYtMDY6MDB7C1PbAAAAAElFTkSuQmCC
+B3RJTUUH1gYMFyca8+vhYAAAB3xJREFUWMPtl2lsXUcVx39z71v8VsdrnCbeE5O4TVLskDR100Rp
+C2nVAiofiPhUKhWkikotAgkJgVqkCr61gUqIiraAKsRStoougS4pceJsTmiSJk7qOE5sP7+82H62
+33t3mTv3Dh/svNbBjRpA4gMcaXSlmdE5v/nPmXNn4H/dxPVM7u7+CpFImHBFTAshCJTC9z0MM4xh
+mARa40tHSOnR3//sfw5g27ZH8XyhK6Ihtt/Zxa23rWdlewPpRJRwOEQub5GZKDE0fIm+d45y4sgp
+PBUQDQuxZ8/T/x5AT88jhCJh/eWHPss9O7qYyBcw8VnVuqI858fPvUjn5h0IHRAJGRD4/PlPvex9
+fR8qCERf7w//NYAtWx7TK5rq2LXrYQIdcHFkDEdBQ1M77XVRDhw6zL6D/bR2bqCqoRXHVTiuR1dr
+kqpEmNODGZ783otMTRbo27dLXBfAlq1fZ9Mtnfo7397J3oPHiKeriYQMhkfG6P7URt47+DZBrI6O
+znWMDZ9FxKoxwzE6loaYymXITs5y85p2TDPEN7/1U4YGs2Lf3qc/HsCWLY/Q2LJc//z5b7D/2ACx
++ja6GqNkMlmsUCUVFXGmpyaJpyrxPB/HUwRBgD2dYzx7idzYMPd/7h6qUzFs28Z1PR766i6mJgpi
+//4fXRtg8+bHSKYi+qWXvksqGQOgUCzhScnpgTNMzNh092wHwPd9XM/HkYr8RI6QN83m7rUYhgFA
+EAQUCgWklORyeR7+2k9QEtHX91Q5nnE1QKQCHnjwbtKpeLkvlUyQGc+SKyiaVq1BAxowTBPDMBCG
+oLKqlrWrV+K4LtLz5pwbBqZpopSipibNtu1rwPA/WoHNmx8jlgjp3a99H9OcY9Na88tf/xYVTrPx
+1ttJxBMLHHjKx3I9lsUkQ+cG+f0bh+i+sZ1ltUtobV5O1ZJKCoUClmWhNTzw4C58zyyrsEABrT3u
+vKuLUMgs9721Zy9VzevYesfdxGOJ8uqvtEBrtNYcP3OBQIR4YOfnMVI30DswyfOvn+R3r+5BCEEQ
+BIRCJh0dy9DaK/sPLZA/FtWfuasb3/f5+/GTCCE4en6aOz7dQ6DBEPNRy8Aa5c91dN/URmVybttu
+qEmwY1Mb47k8sWgIrQMcx8WVkls2rWTgTFZfUX8BgGmatLUu48mnniW6dDWJiMHaDT04nqLoClIV
+5oLgnucjlU9tRFKZTJfH0qkkACubl/Hya29QU11FMhbmN68eobOpHl+pxZMwUIpYLEptUyedHW3U
+N69GaQPb9Zi1JPmixJEKRypsV2FLhSsVtZUVi51mgiDgtk3dHDs7TjQS4f7t67lcUhiGuTiAJxXZ
+y1N88c711IVmKJZsHFdhOR6WLZkuSi7PuEwXXYq2xHI9hNZEI5FFATzPQ+uAUGAzeCHDD575BUE4
+BcEH+7hgCwzTYMIyeO61Q6yq1sQSkk0tq8hNTOIQZ9IOYwgxl3xBgO9rPKVIqBydHW3/tHopJVJK
+errWMDyaRSxpR/nGfDItAoBhMpkvUtPQxKjrE708SmN9N431aUoli32nskx68fkAGuUHSOXzZq5A
+JrOPs4NDJJJJvvSFe1FK4bourutiGAIDxdRMgeJsEf2hRL6qEAWcO58lFTVxpGLDzTeVRxKJOHd0
+NZPSU1iOpGi7FG0Xy5Y4Osrb5w3GIjdy0mpktljCtm0cxylDPPOzP7KipYOJ7BSG0IsDKNcTRw+c
+oLYyiuV41C2sOZimyb09ndy3LoVwpinZcyAlW6LNChzpYzkevUdOY9t2uZ06M8hlo4mGqjiZoREC
+X4tFAYQIM3BsABEEmELT9+4g6kNH5orVVFdy8vDfKFpzwUu2pOTIuWR1PYayc5XPsixs22ZmZpbq
+qhoiImAyM4EQ4cUV6Ot7CiECsfuV/XxiRSWHRw32HzpGsVjEcRw8z0MpxYmTp3FTrRRtSXEewCpD
+SMKRCKVSqQzgK4/VK9KcOjIA2r/2z0hJg3d7+/Edm4aqOC/0TjI4NMzs7Gy5ZbJZPCLzCnyggnVF
+hcJMGWBwaJg3jgwTFTB+bpQgWHhkzasBRkcPUFuz5okLZ0Yev337J5myNHVRm3Q8gpSSv7zdywuv
+9BOpbcf1fNz5wuR4av5GpChZNp0NIWzbZixzicqlHRz862HyEyPi6NEXrg0AMD5+jGS65fHMhQlu
+37oeoSySEZBS8vKbh7BrNyK9uSrozn8dqZDSI/AcZosunXUKwzS4MF7kSO/75DIXee/kS09cHeua
+d8J1N+/U9cuaefTR+2hrrGb3W738an+W5Ip1aK0JtCYIAvB9tO/NNSVJVxhsWB4wPV3i+OERLmeH
+OfXeH67vTnjFWlq26RuWr2XDxlYaOprxYksZyRXI5Us4rsRxJRETKkxBdSrM0soYsZBgoP80F98f
+ZWy0n5GRAx8Z52O9C+LxKlpat+olSxqpb2qgsaOVqtolVFSECUVMHMvBLllMXppibPAi+VyefP4i
+54feEY4ze03f1/UyCocTNDTcpKtrWohE0wgjhInADwICrZDuLJMT57l06YRQyrke1/+3/579A/fy
+DZl77UZQAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTEwLTE5VDAwOjE0OjA5LTA2OjAwjtUZ/AAA
+ACV0RVh0ZGF0ZTptb2RpZnkAMjAwNi0wNi0xM1QwNTozOToyNi0wNjowMHsLU9sAAAAASUVORK5C
+YII=
"
id="icon:32-8"
x="480"
@@ -2508,29 +2662,45 @@ Mzk6MjYtMDY6MDB7C1PbAAAAAElFTkSuQmCC
width="32"
height="32"
preserveAspectRatio="none"
- xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
-AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABelBMVEUAAAAzM2YzM2ZERHdE
-RHdERHdERHczRHdmd5kzM3czRGZERHdERHczRHdERGYzM2YzM3czM2ZERGYzRHczM2YzM2YzM2ZV
-VYgzRGZVZogzM1UAAAAAAAAzM2YzM1UAAAAzM1UiM1UAAAAiIkQiIjMAAAAREREiM1UiIlUAABEA
-AAAzM1UiIjMAAAAzM2ZERHeIiKq7zN3d7u7u7u7u///MzN2qqsyZqrvd3d3///+Zmaq7zO7M3e53
-iKpVVYjMzMy7zMyIiJmqu8yqzN3d3e5EVXd3d5m7u7uqqruqqqq7u8xVZojd7v/d3f+qu7t3iJnM
-3f+ImbtmZoiImarM3d2IqrvM7v+qzO673e6Zu91VZmZ3mbtVd4iIqt2Iqsyqu92ZqsyZmZmZqqpE
-Zoh3qsx3mcxEVWZmiKpmd5lmmcwzVYhmd4hmiLtEZpl3mapmd6pmmbtViLuImZlEd7tEZndEd6pV
-d6qIiIiZu8xVd7tEZqozZpmImcxEd5kn8GoFAAAALnRSTlMAEVWq3e4RiO6IVYh3d0REEXfuqt3u
-qu7u7mYRIpmZM6qqRIiZVWa7zHdm3ap3hPx+dwAAAAFiS0dEOdcAlUAAAAAHdElNRQfWBgwXJxrz
-6+FgAAACRUlEQVQ4y62S7UPSQBzHEZhpWdkDPWFRJJVYw+1a3NjBzQGNIQELdSyCwFyIgISKPf/v
-3W2wIHvZ993u89n3frubx/M/M+f1+RmW8fu8c//C8xdiGxwPXvLCqwVmcf4c9zJxAKEoiglJQijJ
-XPyLX0oBgGVexJuKJKUzQMguzvCl10DlhFxGU1Cek3ic58HW5Sl+JSXKSIR8ARXeIMQpCV4EIHvV
-5csMEMmKXCyQIE4mk5BHgVl2N8jRJaGIbAEBQAUIStfcAsq1eIbyQhngUk6GgHzT9XGFd4NwlSs4
-QTLOKLpOP/qt1xF8gohxpTwR7HkgD/B24oYj+MHmTlwq7zo78KKdooxL2k1HYMR42jCqVdKxW0YO
-F0EC4krAEdgMwKZhSNUqInGF4judHTegWk7hBcmws+1wiIvv9XGDn6s3dsgaZxgfTLOptvbolFj9
-mBzP4Gua+xx9TTFNs163LIseAv7UPrg1PoeFtAWd4ma9sW9ZHYVw7bB22zs5ybQVd0brUtzp6RDj
-Vv/ozuQylgbmZ5neAG5TPBzGMVaP23cnd0Eqmo0eBgCovR7Bw5OKqrZOkwH3Nsn/ZnZUCPdOhxSP
-Rmeq9iXJ3AtOeHDlfuprEePu8NsJwaPvfU0rxR6EVoKuEHoYy8Pjw9HIxj/6pW7sUXhGCD9mu5Wf
-vbNRv/9rkDzaYlcjU4KHCJEnT9nUoKbrevIgyz5bi1LB45mqCEfWVtcDLMsG1p+/iEZmuKtEonYI
-ne6fKMQJEYskdJ7+sUhmVn4DYn6kFqJ4JssAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTctMTAtMTlU
-MDA6MTQ6MDktMDY6MDCO1Rn8AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDA2LTA2LTEzVDA1OjM5OjI2
-LTA2OjAwewtT2wAAAABJRU5ErkJggg==
+ xlink:href="data:image/png;base64,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
+YII=
"
id="icon:32-4"
x="520"
@@ -2565,26 +2735,25 @@ MdodlQAAAABJRU5ErkJggg==
height="16"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
-AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACFlBMVEUAAABYdqBYdqBbeqRa
-eqRZeKJYd6JaeqRYd6FeeqNZeaNaeqRWcZ1hf6ZaeaNphKlaeqRie6Nwiq1aeqRjgKhaeqRaeqRe
-faZjf6hifKVhf6hRaZRZeaNLYYlpg6ZZd6AQEiFXb5Vadp9aeaNZeKJYdJ1XdZ+Dm7u7ydrc5O3m
-6/TV3+uxwtZ+l7mxwNXg5evP2eK6v8S+y9q+1Ou+ytbZ4emjts6vv9Te4ufO0dPi7/7e7fvU5fa8
-yNTAxs7b3uDm6/CgtM2Bmrrw9Pjj5OXK1d/i8f/j8f/a6vrGz9jX2dv09PX7+/vV3+l5lLa1xdjg
-4+TM3e/g7//h8P/a6/zHzdK+x9Cktcm1vsjk5uijuNDU3emqvtPM4/re7v/f7//O2+r9/f3+/v7i
-5Obc3d+8zd9beqTb5O+syum81/LJ4fnV6PzS5fnIz9X5+fmutbzD0uPM2ee3ws3IztSzzOi10e6x
-zuypvNH4+fnx8vPv7+/O0NG4yd2rvdPc4eXf4eOivdqcveCTttyEpsqLp8f19fXi4uKdpq6ds816
-lbfW3+nt7u+Dp86Ap9F1n8tslsXg4ODT09Olt8l1kbWcssvc4+n29va4v8Zxm8lrlsZij8FZiLzR
-0dG8xMyUrMhdfaaasMvM1+JtkLdcir1WhrpPgLZWhbezwdCTq8d3kraftM63yNy+z+G0x9ybssx1
-kbRaeaT///97RkPcAAAAJ3RSTlMAZ833/vO9YTDoyi41/uzxx4Totv3q/P3lk/NQ7ln51gam7v77
-2WeTE3hRAAAAAWJLR0SxNGOeUgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9UKCAYiLJDE
-QQMAAADrSURBVBjTY2AAAkYmZhZWNnYGKODgVNfQ1NLW0eXiBvN5ePX0DQyNjE1MzfjAIvzmFpZW
-1ja2dvYOjgJAvqCTs4urm7uHp5e3j68f0Bwh/4DAoODgkNCw8IjIKGEGBpHomNi4+PiExKTE5JRU
-UQaGtPSMzKzsnNykpKS8/AIxBgbxwqLiktKy8orKpKrqGqAKidq6pPqGxqbmlta29g6gGZKdXUlJ
-3T29ff0TJk6aDHKt1JSp06bPmDlr9py580DuYJCev2DhosVLli5bvkIG4nZZuZWrVq9Zu269PDfU
-dwqKSsobVFTVGLACAPRHQQF1AQg/AAAANXRFWHRDb21tZW50AChjKSAyMDA0IEpha3ViIFN0ZWlu
-ZXIKCkNyZWF0ZWQgd2l0aCBUaGUgR0lNUJDZi28AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTctMTAt
-MTlUMDA6MTQ6MDktMDY6MDCO1Rn8AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDA1LTEwLTA4VDEyOjM0
-OjQ0LTA2OjAwI8daAAAAAABJRU5ErkJggg==
+AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAB+1BMVEUAAABYdqBaeqRYd6FW
+cZ1RaZRLYYkQEiFXdZ9YdqBbeqRaeqRZeKJYd6JeeqODm7u7ydrc5O3m6/TV3+uxwtZ+l7lZeaNh
+f6axwNXg5evP2eK6v8S+y9q+1Ou+ytbZ4emjts5aeaNphKmvv9Te4ufO0dPi7/7e7fvU5fa8yNTA
+xs7b3uDm6/CgtM1ie6OBmrrw9Pjj5OXK1d/i8f/j8f/a6vrGz9jX2dv09PX7+/vV3+l5lLZwiq21
+xdjg4+TM3e/g7//h8P/a6/zHzdK+x9Cktcm1vsjk5uijuNBjgKjU3emqvtPM4/re7v/f7//O2+r9
+/f3+/v7i5Obc3d+8zd/b5O+syum81/LJ4fnV6PzS5fnIz9X5+fmutbzD0uNefabM2ee3ws3IztSz
+zOi10e6xzuypvNH4+fnx8vPv7+/O0NG4yd1jf6irvdPc4eXf4eOivdqcveCTttyEpsqLp8f19fXi
+4uKdpq6ds81ifKV6lbfW3+nt7u+Dp86Ap9F1n8tslsXg4ODT09Olt8l1kbVhf6icssvc4+n29va4
+v8Zxm8lrlsZij8FZiLzR0dG8xMyUrMhdfaaasMvM1+JtkLdcir1WhrpPgLZWhbezwdCTq8dpg6Z3
+kraftM63yNy+z+G0x9ybssx1kbRZd6BXb5Vadp9aeaRYdJ3///8MrB2GAAAACXRSTlMAAAAAAAAA
+AABzZJuhAAAAAWJLR0SoUAg2kgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9UKCAYiLJDE
+QQMAAADjSURBVBjTY2AAAkZOLm4eXiYGKGDm4xcQFBIWERWDCLGIS0hKScvIyskrKIJFlJRVVNXU
+NTS1tHV0uYF8PX0DQyNjE1MzcwtLK2ugEhtbO3sHR0cnZxdXN3cPoBJPL28fXz8//4DAgKDgEKAA
+V2hYeERkVHRgYGBMbBxQID4hMSk5JTUtPSMwMysbKJCTmxeYX1BYVFxSWlZeARSorKoODKypratv
+aGxqbgE5pLWtvaOzq7unt69/AsgdDKwTJ02eMnXa9BkzZ0HdzjZ7ztx58xcsXLQY5j32JUsVl/Es
+52DACgAVCzqJEii+ZQAAADV0RVh0Q29tbWVudAAoYykgMjAwNCBKYWt1YiBTdGVpbmVyCgpDcmVh
+dGVkIHdpdGggVGhlIEdJTVCQ2YtvAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTEwLTE5VDAwOjE0
+OjA5LTA2OjAwjtUZ/AAAACV0RVh0ZGF0ZTptb2RpZnkAMjAwNS0xMC0wOFQxMjozNDo0NC0wNjow
+MCPHWgAAAAAASUVORK5CYII=
"
id="icon:16-8"
x="584"
@@ -2594,19 +2763,25 @@ OjQ0LTA2OjAwI8daAAAAAABJRU5ErkJggg==
height="16"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
-AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAqFBMVEUAAAARESJVd5lVd5lV
-d6pVd6pVd6pVd5lmd6pVd6pVd6pmiKpmd6p3iKpmd6pmd6pVZplEZohVd5lVd5lVd5lVd6qImbu7
-zN3d3e7u7u6qu913mbtmd6rM3d27u8y7zO6qu8zMzMzd7v/M3e67zMzd3d2Zu8zu7v/MzN3////d
-7u5miKrM3f+qzO673e6qu7uZu92IqsyZqqp3mcxmmcyZqsxmiLtViLtAZtkKAAAAFXRSTlMAAGbM
-7rtmM+7MM+6I7t2ZVVXdqu79Lj6bAAAAAWJLR0QpyreFJAAAAAlwSFlzAAALEwAACxMBAJqcGAAA
-AAd0SU1FB9UKCAYiLJDEQQMAAADFSURBVBjTbY/bVsJADEUjFgW8oOCQTIdO59IUIkWpMPD/f+ZU
-eHS/7bOyThKAzOheqWL8ADceJyskTaWZzq6+LqmyWCO54i95cuRDiE3Dup1mf15tuAohbFkLmdzz
-ghyzB984++nGALvouuxRRIixAFC0/+pCt82BfKMCWEfr63rvRIv2w8SrY+HycOh7zT9t7pgbEtF9
-fzyxd8MWmCTS9ng6X3yThjvgTaXqfMnYdL0U3nemRcRkFrPbd3fLD6XUYgT/8gsgyBahFA1FIAAA
-ADV0RVh0Q29tbWVudAAoYykgMjAwNCBKYWt1YiBTdGVpbmVyCgpDcmVhdGVkIHdpdGggVGhlIEdJ
-TVCQ2YtvAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTEwLTE5VDAwOjE0OjA5LTA2OjAwjtUZ/AAA
-ACV0RVh0ZGF0ZTptb2RpZnkAMjAwNS0xMC0wOFQxMjozNDo0NC0wNjowMCPHWgAAAAAASUVORK5C
-YII=
+AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAB+1BMVEUAAABYdqBaeqRYd6FW
+cZ1RaZRLYYkQEiFXdZ9YdqBbeqRaeqRZeKJYd6JeeqODm7u7ydrc5O3m6/TV3+uxwtZ+l7lZeaNh
+f6axwNXg5evP2eK6v8S+y9q+1Ou+ytbZ4emjts5aeaNphKmvv9Te4ufO0dPi7/7e7fvU5fa8yNTA
+xs7b3uDm6/CgtM1ie6OBmrrw9Pjj5OXK1d/i8f/j8f/a6vrGz9jX2dv09PX7+/vV3+l5lLZwiq21
+xdjg4+TM3e/g7//h8P/a6/zHzdK+x9Cktcm1vsjk5uijuNBjgKjU3emqvtPM4/re7v/f7//O2+r9
+/f3+/v7i5Obc3d+8zd/b5O+syum81/LJ4fnV6PzS5fnIz9X5+fmutbzD0uNefabM2ee3ws3IztSz
+zOi10e6xzuypvNH4+fnx8vPv7+/O0NG4yd1jf6irvdPc4eXf4eOivdqcveCTttyEpsqLp8f19fXi
+4uKdpq6ds81ifKV6lbfW3+nt7u+Dp86Ap9F1n8tslsXg4ODT09Olt8l1kbVhf6icssvc4+n29va4
+v8Zxm8lrlsZij8FZiLzR0dG8xMyUrMhdfaaasMvM1+JtkLdcir1WhrpPgLZWhbezwdCTq8dpg6Z3
+kraftM63yNy+z+G0x9ybssx1kbRZd6BXb5Vadp9aeaRYdJ3///8MrB2GAAAACXRSTlMAAAAAAAAA
+AABzZJuhAAAAAWJLR0SoUAg2kgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9UKCAYiLJDE
+QQMAAADjSURBVBjTY2AAAkZOLm4eXiYGKGDm4xcQFBIWERWDCLGIS0hKScvIyskrKIJFlJRVVNXU
+NTS1tHV0uYF8PX0DQyNjE1MzcwtLK2ugEhtbO3sHR0cnZxdXN3cPoBJPL28fXz8//4DAgKDgEKAA
+V2hYeERkVHRgYGBMbBxQID4hMSk5JTUtPSMwMysbKJCTmxeYX1BYVFxSWlZeARSorKoODKypratv
+aGxqbgE5pLWtvaOzq7unt69/AsgdDKwTJ02eMnXa9BkzZ0HdzjZ7ztx58xcsXLQY5j32JUsVl/Es
+52DACgAVCzqJEii+ZQAAADV0RVh0Q29tbWVudAAoYykgMjAwNCBKYWt1YiBTdGVpbmVyCgpDcmVh
+dGVkIHdpdGggVGhlIEdJTVCQ2YtvAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTEwLTE5VDAwOjE0
+OjA5LTA2OjAwjtUZ/AAAACV0RVh0ZGF0ZTptb2RpZnkAMjAwNS0xMC0wOFQxMjozNDo0NC0wNjow
+MCPHWgAAAAAASUVORK5CYII=
"
id="icon:16-4"
x="608"
--
2.18.0
1
5
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/odbccp32/odbccp32.c | 25 ++++++++++++++-----
dlls/odbccp32/tests/misc.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 80 insertions(+), 6 deletions(-)
diff --git a/dlls/odbccp32/odbccp32.c b/dlls/odbccp32/odbccp32.c
index c2342e6..5ef8336 100644
--- a/dlls/odbccp32/odbccp32.c
+++ b/dlls/odbccp32/odbccp32.c
@@ -29,6 +29,7 @@
#include "winbase.h"
#include "winreg.h"
#include "winnls.h"
+#include "sqlext.h"
#include "wine/unicode.h"
#include "wine/debug.h"
#include "wine/heap.h"
@@ -1553,18 +1554,30 @@ BOOL WINAPI SQLSetConfigMode(UWORD wConfigMode)
BOOL WINAPI SQLValidDSNW(LPCWSTR lpszDSN)
{
+ static const WCHAR invalid[] = {'[',']','{','}','(',')',',',';','?','*','=','!','@','\\',0};
clear_errors();
- FIXME("%s\n", debugstr_w(lpszDSN));
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ TRACE("%s\n", debugstr_w(lpszDSN));
+
+ if(strlenW(lpszDSN) > SQL_MAX_DSN_LENGTH || strpbrkW(lpszDSN, invalid) != NULL)
+ {
+ return FALSE;
+ }
+
+ return TRUE;
}
BOOL WINAPI SQLValidDSN(LPCSTR lpszDSN)
{
+ static const char *invalid = "[]{}(),;?*=!@\\";
clear_errors();
- FIXME("%s\n", debugstr_a(lpszDSN));
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ TRACE("%s\n", debugstr_a(lpszDSN));
+
+ if(strlen(lpszDSN) > SQL_MAX_DSN_LENGTH || strpbrk(lpszDSN, invalid) != NULL)
+ {
+ return FALSE;
+ }
+
+ return TRUE;
}
BOOL WINAPI SQLWriteDSNToIniW(LPCWSTR lpszDSN, LPCWSTR lpszDriver)
diff --git a/dlls/odbccp32/tests/misc.c b/dlls/odbccp32/tests/misc.c
index be3873ac..dc65bdf 100644
--- a/dlls/odbccp32/tests/misc.c
+++ b/dlls/odbccp32/tests/misc.c
@@ -682,6 +682,65 @@ static void test_SQLGetInstalledDrivers(void)
SQLRemoveDriver("Wine test", TRUE, NULL);
}
+static void test_SQLValidDSN(void)
+{
+ static const char *invalid = "[]{}(),;?*=!@\\";
+ char str[10];
+ int i;
+ BOOL ret;
+
+ strcpy(str, "wine10");
+ for(i = 0; i < strlen(invalid); i++)
+ {
+ str[4] = invalid[i];
+ ret = SQLValidDSN(str);
+ ok(!ret, "got %d\n", ret);
+ }
+
+ /* Too large */
+ ret = SQLValidDSN("Wine123456789012345678901234567890");
+ ok(!ret, "got %d\n", ret);
+
+ /* Valid with a space */
+ ret = SQLValidDSN("Wine Vinegar");
+ ok(ret, "got %d\n", ret);
+
+ /* Max DSN name value */
+ ret = SQLValidDSN("12345678901234567890123456789012");
+ ok(ret, "got %d\n", ret);
+}
+
+static void test_SQLValidDSNW(void)
+{
+ static const WCHAR invalid[] = {'[',']','{','}','(',')',',',';','?','*','=','!','@','\\',0};
+ static const WCHAR value[] = { 'w','i','n','e','1','0',0};
+ static const WCHAR too_large[] = { 'W','i','n','e','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5',
+ '6','7','8','9','0','1','2','3','4','5','6','7','8','9','0', 0};
+ static const WCHAR with_space[] = { 'W','i','n','e',' ','V','i','n','e','g','a','r', 0};
+ static const WCHAR max_dsn[] = { '1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0',
+ '1','2','3','4','5','6','7','8','9','0','1','2', 0};
+ WCHAR str[10];
+ int i;
+ BOOL ret;
+
+ lstrcpyW(str, value);
+ for(i = 0; i < lstrlenW(invalid); i++)
+ {
+ str[4] = invalid[i];
+ ret = SQLValidDSNW(str);
+ ok(!ret, "got %d\n", ret);
+ }
+
+ ret = SQLValidDSNW(too_large);
+ ok(!ret, "got %d\n", ret);
+
+ ret = SQLValidDSNW(with_space);
+ ok(ret, "got %d\n", ret);
+
+ ret = SQLValidDSNW(max_dsn);
+ ok(ret, "got %d\n", ret);
+}
+
START_TEST(misc)
{
test_SQLConfigMode();
@@ -693,4 +752,6 @@ START_TEST(misc)
test_SQLInstallDriverEx();
test_SQLInstallTranslatorEx();
test_SQLGetInstalledDrivers();
+ test_SQLValidDSN();
+ test_SQLValidDSNW();
}
--
1.9.1
1
0