Hans Leidekker : setupapi: Implement SetupGetSourceInfo{A,W}.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Nov 15 05:37:46 CST 2006
Module: wine
Branch: master
Commit: ae64a62241ce8868c5cd0420792217549e2f2145
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ae64a62241ce8868c5cd0420792217549e2f2145
Author: Hans Leidekker <hans at it.vu.nl>
Date: Tue Nov 14 15:16:04 2006 +0100
setupapi: Implement SetupGetSourceInfo{A,W}.
---
dlls/setupapi/query.c | 91 +++++++++++++++++++++++++++++++++++++++++++
dlls/setupapi/setupapi.spec | 4 +-
dlls/setupapi/stubs.c | 22 ----------
include/setupapi.h | 7 +++
4 files changed, 100 insertions(+), 24 deletions(-)
diff --git a/dlls/setupapi/query.c b/dlls/setupapi/query.c
index e11ea59..bda2f3a 100644
--- a/dlls/setupapi/query.c
+++ b/dlls/setupapi/query.c
@@ -425,3 +425,94 @@ BOOL WINAPI SetupGetSourceFileLocationW(
}
return TRUE;
}
+
+/***********************************************************************
+ * SetupGetSourceInfoA (SETUPAPI.@)
+ */
+
+BOOL WINAPI SetupGetSourceInfoA( HINF hinf, UINT source_id, UINT info,
+ PSTR buffer, DWORD buffer_size, LPDWORD required_size )
+{
+ BOOL ret = FALSE;
+ WCHAR *bufferW = NULL;
+ DWORD required;
+ INT size;
+
+ TRACE("%p, %d, %d, %p, %d, %p\n", hinf, source_id, info, buffer, buffer_size,
+ required_size);
+
+ if (!SetupGetSourceInfoW( hinf, source_id, info, NULL, 0, &required ))
+ return FALSE;
+
+ if (!(bufferW = HeapAlloc( GetProcessHeap(), 0, required * sizeof(WCHAR) )))
+ return FALSE;
+
+ if (!SetupGetSourceInfoW( hinf, source_id, info, bufferW, required, NULL ))
+ goto done;
+
+ size = WideCharToMultiByte( CP_ACP, 0, bufferW, -1, NULL, 0, NULL, NULL );
+ if (required_size) *required_size = size;
+
+ if (buffer)
+ {
+ if (buffer_size >= size)
+ WideCharToMultiByte( CP_ACP, 0, bufferW, -1, buffer, buffer_size, NULL, NULL );
+ else
+ {
+ SetLastError( ERROR_INSUFFICIENT_BUFFER );
+ goto done;
+ }
+ }
+ ret = TRUE;
+
+ done:
+ HeapFree( GetProcessHeap(), 0, bufferW );
+ return ret;
+}
+
+/***********************************************************************
+ * SetupGetSourceInfoW (SETUPAPI.@)
+ */
+
+BOOL WINAPI SetupGetSourceInfoW( HINF hinf, UINT source_id, UINT info,
+ PWSTR buffer, DWORD buffer_size, LPDWORD required_size )
+{
+ INFCONTEXT ctx;
+ WCHAR source_id_str[11];
+ static const WCHAR fmt[] = {'%','d',0};
+ DWORD index;
+
+ TRACE("%p, %d, %d, %p, %d, %p\n", hinf, source_id, info, buffer, buffer_size,
+ required_size);
+
+ sprintfW( source_id_str, fmt, source_id );
+
+ if (!SetupFindFirstLineW( hinf, source_disks_names_platform, source_id_str, &ctx ) &&
+ !SetupFindFirstLineW( hinf, source_disks_names, source_id_str, &ctx ))
+ return FALSE;
+
+ switch (info)
+ {
+ case SRCINFO_PATH: index = 4; break;
+ case SRCINFO_TAGFILE: index = 2; break;
+ case SRCINFO_DESCRIPTION: index = 1; break;
+ default:
+ WARN("unknown info level: %d\n", info);
+ return FALSE;
+ }
+
+ if (SetupGetStringFieldW( &ctx, index, buffer, buffer_size, required_size ))
+ return TRUE;
+
+ if (required_size) *required_size = 1;
+ if (buffer)
+ {
+ if (buffer_size >= 1) buffer[0] = 0;
+ else
+ {
+ SetLastError( ERROR_INSUFFICIENT_BUFFER );
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
diff --git a/dlls/setupapi/setupapi.spec b/dlls/setupapi/setupapi.spec
index 4ea80f5..0575339 100644
--- a/dlls/setupapi/setupapi.spec
+++ b/dlls/setupapi/setupapi.spec
@@ -417,8 +417,8 @@ # Yes, Microsoft really misspelled this
@ stdcall SetupGetSourceFileLocationW(ptr ptr wstr ptr ptr long ptr)
@ stub SetupGetSourceFileSizeA
@ stub SetupGetSourceFileSizeW
-@ stdcall SetupGetSourceInfoA(ptr long long str long ptr)
-@ stdcall SetupGetSourceInfoW(ptr long long wstr long ptr)
+@ stdcall SetupGetSourceInfoA(ptr long long ptr long ptr)
+@ stdcall SetupGetSourceInfoW(ptr long long ptr long ptr)
@ stdcall SetupGetStringFieldA(ptr long ptr long ptr)
@ stdcall SetupGetStringFieldW(ptr long ptr long ptr)
@ stub SetupGetTargetPathA
diff --git a/dlls/setupapi/stubs.c b/dlls/setupapi/stubs.c
index a250924..faf6a1f 100644
--- a/dlls/setupapi/stubs.c
+++ b/dlls/setupapi/stubs.c
@@ -140,28 +140,6 @@ BOOL WINAPI SetupCopyOEMInfW(PCWSTR sour
}
/***********************************************************************
- * SetupGetSourceInfoA (SETUPAPI.@)
- */
-BOOL WINAPI SetupGetSourceInfoA(HINF InfHandle, UINT SourceId, UINT InfoDesired,
- PSTR ReturnBuffer, DWORD ReturnBufferSize, LPDWORD RequiredSize)
-{
- FIXME("(%p, %d, %d, %p, %d, %p): stub\n", InfHandle, SourceId, InfoDesired,
- ReturnBuffer, ReturnBufferSize, RequiredSize);
- return FALSE;
-}
-
-/***********************************************************************
- * SetupGetSourceInfoW (SETUPAPI.@)
- */
-BOOL WINAPI SetupGetSourceInfoW(HINF InfHandle, UINT SourceId, UINT InfoDesired,
- PWSTR ReturnBuffer, DWORD ReturnBufferSize, LPDWORD RequiredSize)
-{
- FIXME("(%p, %d, %d, %p, %d, %p): stub\n", InfHandle, SourceId, InfoDesired,
- ReturnBuffer, ReturnBufferSize, RequiredSize);
- return FALSE;
-}
-
-/***********************************************************************
* SetupInitializeFileLogW(SETUPAPI.@)
*/
HANDLE WINAPI SetupInitializeFileLogW(LPWSTR LogFileName, DWORD Flags)
diff --git a/include/setupapi.h b/include/setupapi.h
index f74bd5b..74faf64 100644
--- a/include/setupapi.h
+++ b/include/setupapi.h
@@ -692,6 +692,10 @@ #define LogSevError 0x00000002
#define LogSevFatalError 0x00000003
#define LogSevMaximum 0x00000004
+#define SRCINFO_PATH 1
+#define SRCINFO_TAGFILE 2
+#define SRCINFO_DESCRIPTION 3
+
LONG WINAPI AddTagToGroupOrderList(PCWSTR lpGroupName, DWORD dwUnknown2, DWORD dwUnknown3);
DWORD WINAPI CaptureAndConvertAnsiArg(PCSTR lpSrc, PWSTR *lpDst);
DWORD WINAPI CaptureStringArg(PCWSTR lpSrc, PWSTR *lpDst);
@@ -817,6 +821,9 @@ #define SetupGetMultiSzField WIN
BOOL WINAPI SetupGetSourceFileLocationA( HINF hinf, PINFCONTEXT context, PCSTR filename, PUINT source_id, PSTR buffer, DWORD buffer_size, PDWORD required_size );
BOOL WINAPI SetupGetSourceFileLocationW( HINF hinf, PINFCONTEXT context, PCWSTR filename, PUINT source_id, PWSTR buffer, DWORD buffer_size, PDWORD required_size );
#define SetupGetSourceFileLocation WINELIB_NAME_AW(SetupGetSourceFileLocation)
+BOOL WINAPI SetupGetSourceInfoA( HINF hinf, UINT source_id, UINT info, PSTR buffer, DWORD buffer_size, LPDWORD required_size );
+BOOL WINAPI SetupGetSourceInfoW( HINF hinf, UINT source_id, UINT info, PWSTR buffer, DWORD buffer_size, LPDWORD required_size );
+#define SetupGetSourceInfo WINELIB_NAME_AW(SetupGetSourceInfo)
BOOL WINAPI SetupGetStringFieldA( PINFCONTEXT context, DWORD index, PSTR buffer, DWORD size, PDWORD required );
BOOL WINAPI SetupGetStringFieldW( PINFCONTEXT context, DWORD index, PWSTR buffer, DWORD size, PDWORD required );
#define SetupGetStringField WINELIB_NAME_AW(SetupGetStringField)
More information about the wine-cvs
mailing list