Author: winesync
Date: Wed Mar 14 15:48:32 2007
New Revision: 26076
URL:
http://svn.reactos.org/svn/reactos?rev=26076&view=rev
Log:
Autosyncing with Wine HEAD
Added:
trunk/reactos/dll/win32/odbccp32/odbccp32.c (with props)
trunk/reactos/dll/win32/odbccp32/odbccp32.rbuild (with props)
trunk/reactos/dll/win32/odbccp32/odbccp32.spec (with props)
Modified:
trunk/reactos/baseaddress.rbuild
Modified: trunk/reactos/baseaddress.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/baseaddress.rbuild?rev=260…
==============================================================================
--- trunk/reactos/baseaddress.rbuild (original)
+++ trunk/reactos/baseaddress.rbuild Wed Mar 14 15:48:32 2007
@@ -94,6 +94,7 @@
<property name="BASEADDRESS_LSASRV" value="0x76540000" />
<property name="BASEADDRESS_MIDIMAP" value="0x76600000" />
<property name="BASEADDRESS_ODBC32" value="0x76660000" />
+ <property name="BASEADDRESS_ODBCCP32" value="0x76380000" />
<property name="BASEADDRESS_WAVEMAP" value="0x76610000" />
<property name="BASEADDRESS_MPR" value="0x76620000" />
<property name="BASEADDRESS_SETUPAPI" value="0x76660000" />
Added: trunk/reactos/dll/win32/odbccp32/odbccp32.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/odbccp32/odbccp3…
==============================================================================
--- trunk/reactos/dll/win32/odbccp32/odbccp32.c (added)
+++ trunk/reactos/dll/win32/odbccp32/odbccp32.c Wed Mar 14 15:48:32 2007
@@ -1,0 +1,974 @@
+/*
+ * Implementation of the ODBC driver installer
+ *
+ * Copyright 2005 Mike McCormack for CodeWeavers
+ * Copyright 2005 Hans Leidekker
+ * Copyright 2007 Bill Medland
+ *
+ * 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 <assert.h>
+#include <stdarg.h>
+
+#define COBJMACROS
+#define NONAMELESSUNION
+
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "winnls.h"
+#include "wine/debug.h"
+
+#include "odbcinst.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(odbc);
+
+/* Registry key names */
+static const WCHAR drivers_key[] =
{'S','o','f','t','w','a','r','e','\\','O','D','B','C','\\','O','D','B','C','I','N','S','T','.','I','N','I','\\','O','D','B','C','
','D','r','i','v','e','r','s',0};
+
+/* This config mode is known to be process-wide.
+ * MSDN documentation suggests that the value is hidden somewhere in the registry but I
haven't found it yet.
+ * Although both the registry and the ODBC.ini files appear to be maintained together
they are not maintained automatically through the registry's IniFileMapping.
+ */
+static UWORD config_mode = ODBC_BOTH_DSN;
+
+/* MSDN documentation suggests that the error subsystem handles errors 1 to 8
+ * only and experimentation (Windows 2000) shows that the errors are process-
+ * wide so go for the simple solution; static arrays.
+ */
+static int num_errors;
+static int error_code[8];
+static const WCHAR *error_msg[8];
+static const WCHAR odbc_error_general_err[] =
{'G','e','n','e','r','a','l','
','e','r','r','o','r',0};
+static const WCHAR odbc_error_invalid_buff_len[] =
{'I','n','v','a','l','i','d','
','b','u','f','f','e','r','
','l','e','n','g','t','h',0};
+static const WCHAR odbc_error_component_not_found[] =
{'C','o','m','p','o','n','e','n','t','
','n','o','t','
','f','o','u','n','d',0};
+static const WCHAR odbc_error_out_of_mem[] = {'O','u','t','
','o','f','
','m','e','m','o','r','y',0};
+static const WCHAR odbc_error_invalid_param_sequence[] =
{'I','n','v','a','l','i','d','
','p','a','r','a','m','e','t','e','r','
','s','e','q','u','e','n','c','e',0};
+
+/* Push an error onto the error stack, taking care of ranges etc. */
+static void push_error(int code, LPCWSTR msg)
+{
+ if (num_errors < sizeof error_code/sizeof error_code[0])
+ {
+ error_code[num_errors] = code;
+ error_msg[num_errors] = msg;
+ num_errors++;
+ }
+}
+
+/* Clear the error stack */
+static void clear_errors(void)
+{
+ num_errors = 0;
+}
+
+BOOL WINAPI ODBCCPlApplet( LONG i, LONG j, LONG * p1, LONG * p2)
+{
+ clear_errors();
+ FIXME( "( %d %d %p %p) : stub!\n", i, j, p1, p2);
+ return FALSE;
+}
+
+static LPWSTR SQLInstall_strdup_multi(LPCSTR str)
+{
+ LPCSTR p;
+ LPWSTR ret = NULL;
+ DWORD len;
+
+ if (!str)
+ return ret;
+
+ for (p = str; *p; p += lstrlenA(p) + 1)
+ ;
+
+ len = MultiByteToWideChar(CP_ACP, 0, str, p - str, NULL, 0 );
+ ret = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, str, p - str, ret, len );
+ ret[len] = 0;
+
+ return ret;
+}
+
+static LPWSTR SQLInstall_strdup(LPCSTR str)
+{
+ DWORD len;
+ LPWSTR ret = NULL;
+
+ if (!str)
+ return ret;
+
+ len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0 );
+ ret = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len );
+
+ return ret;
+}
+
+/* Convert the wide string or zero-length-terminated list of wide strings to a
+ * narrow string or zero-length-terminated list of narrow strings.
+ * Do not try to emulate windows undocumented excesses (e.g. adding a third \0
+ * to a list)
+ * Arguments
+ * mode Indicates the sort of string.
+ * 1 denotes that the buffers contain strings terminated by a single nul
+ * character
+ * 2 denotes that the buffers contain zero-length-terminated lists
+ * (frequently erroneously referred to as double-null-terminated)
+ * buffer The narrow-character buffer into which to place the result. This
+ * must be a non-null pointer to the first element of a buffer whose
+ * length is passed in buffer_length.
+ * str The wide-character buffer containing the string or list of strings to
+ * be converted. str_length defines how many wide characters in the
+ * buffer are to be converted, including all desired terminating nul
+ * characters.
+ * str_length Effective length of str
+ * buffer_length Length of buffer
+ * returned_length A pointer to a variable that will receive the number of
+ * narrow characters placed into the buffer. This pointer
+ * may be NULL.
+ */
+static BOOL SQLInstall_narrow(int mode, LPSTR buffer, LPCWSTR str, WORD str_length, WORD
buffer_length, WORD *returned_length)
+{
+ LPSTR pbuf; /* allows us to allocate a temporary buffer only if needed */
+ int len; /* Length of the converted list */
+ BOOL success = FALSE;
+ assert(mode == 1 || mode == 2);
+ assert(buffer_length);
+ len = WideCharToMultiByte(CP_ACP, 0, str, str_length, 0, 0, NULL, NULL);
+ if (len > 0)
+ {
+ if (len > buffer_length)
+ {
+ pbuf = HeapAlloc(GetProcessHeap(), 0, len);
+ }
+ else
+ {
+ pbuf = buffer;
+ }
+ len = WideCharToMultiByte(CP_ACP, 0, str, str_length, pbuf, len, NULL, NULL);
+ if (len > 0)
+ {
+ if (pbuf != buffer)
+ {
+ if (buffer_length > (mode - 1))
+ {
+ memcpy (buffer, pbuf, buffer_length-mode);
+ *(buffer+buffer_length-mode) = '\0';
+ }
+ *(buffer+buffer_length-1) = '\0';
+ }
+ if (returned_length)
+ {
+ *returned_length = pbuf == buffer ? len : buffer_length;
+ }
+ success = TRUE;
+ }
+ else
+ {
+ ERR("transferring wide to narrow\n");
+ }
+ if (pbuf != buffer)
+ {
+ HeapFree(GetProcessHeap(), 0, pbuf);
+ }
+ }
+ else
+ {
+ ERR("measuring wide to narrow\n");
+ }
+ return success;
+}
+
+BOOL WINAPI SQLConfigDataSourceW(HWND hwndParent, WORD fRequest,
+ LPCWSTR lpszDriver, LPCWSTR lpszAttributes)
+{
+ LPCWSTR p;
+
+ clear_errors();
+ FIXME("%p %d %s %s\n", hwndParent, fRequest, debugstr_w(lpszDriver),
+ debugstr_w(lpszAttributes));
+
+ for (p = lpszAttributes; *p; p += lstrlenW(p) + 1)
+ FIXME("%s\n", debugstr_w(p));
+
+ return TRUE;
+}
+
+BOOL WINAPI SQLConfigDataSource(HWND hwndParent, WORD fRequest,
+ LPCSTR lpszDriver, LPCSTR lpszAttributes)
+{
+ FIXME("%p %d %s %s\n", hwndParent, fRequest, debugstr_a(lpszDriver),
+ debugstr_a(lpszAttributes));
+ clear_errors();
+ return TRUE;
+}
+
+BOOL WINAPI SQLConfigDriverW(HWND hwndParent, WORD fRequest, LPCWSTR lpszDriver,
+ LPCWSTR lpszArgs, LPWSTR lpszMsg, WORD cbMsgMax, WORD *pcbMsgOut)
+{
+ clear_errors();
+ FIXME("(%p %d %s %s %p %d %p)\n", hwndParent, fRequest,
debugstr_w(lpszDriver),
+ debugstr_w(lpszArgs), lpszMsg, cbMsgMax, pcbMsgOut);
+ return TRUE;
+}
+
+BOOL WINAPI SQLConfigDriver(HWND hwndParent, WORD fRequest, LPCSTR lpszDriver,
+ LPCSTR lpszArgs, LPSTR lpszMsg, WORD cbMsgMax, WORD *pcbMsgOut)
+{
+ clear_errors();
+ FIXME("(%p %d %s %s %p %d %p)\n", hwndParent, fRequest,
debugstr_a(lpszDriver),
+ debugstr_a(lpszArgs), lpszMsg, cbMsgMax, pcbMsgOut);
+ return TRUE;
+}
+
+BOOL WINAPI SQLCreateDataSourceW(HWND hwnd, LPCWSTR lpszDS)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLCreateDataSource(HWND hwnd, LPCSTR lpszDS)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLGetAvailableDriversW(LPCWSTR lpszInfFile, LPWSTR lpszBuf,
+ WORD cbBufMax, WORD *pcbBufOut)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLGetAvailableDrivers(LPCSTR lpszInfFile, LPSTR lpszBuf,
+ WORD cbBufMax, WORD *pcbBufOut)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLGetConfigMode(UWORD *pwConfigMode)
+{
+ clear_errors();
+ if (pwConfigMode)
+ *pwConfigMode = config_mode;
+ return TRUE;
+}
+
+/* This is implemented sensibly rather than according to exact conformance to
Microsoft's buggy implementations
+ * e.g. The Microsoft one occasionally actually adds a third nul character (possibly
beyond the buffer).
+ * e.g. If the key has no drivers then version 3.525.1117.0 does not modify the buffer at
all, not even a nul character.
+ */
+BOOL WINAPI SQLGetInstalledDriversW(LPWSTR lpszBuf, WORD cbBufMax,
+ WORD *pcbBufOut)
+{
+ HKEY hDrivers; /* Registry handle to the Drivers key */
+ LONG reg_ret; /* Return code from registry functions */
+ BOOL success = FALSE; /* The value we will return */
+
+ clear_errors();
+ if (!lpszBuf || cbBufMax == 0)
+ {
+ push_error(ODBC_ERROR_INVALID_BUFF_LEN, odbc_error_invalid_buff_len);
+ }
+ else if ((reg_ret = RegOpenKeyExW (HKEY_LOCAL_MACHINE /* The drivers does not depend
on the config mode */,
+ drivers_key, 0, KEY_READ /* Maybe overkill */,
+ &hDrivers)) == ERROR_SUCCESS)
+ {
+ DWORD index = 0;
+ cbBufMax--;
+ success = TRUE;
+ while (cbBufMax > 0)
+ {
+ DWORD size_name;
+ size_name = cbBufMax;
+ if ((reg_ret = RegEnumValueW(hDrivers, index, lpszBuf, &size_name, NULL,
NULL, NULL, NULL)) == ERROR_SUCCESS)
+ {
+ index++;
+ assert (size_name < cbBufMax && *(lpszBuf + size_name) == 0);
+ size_name++;
+ cbBufMax-= size_name;
+ lpszBuf+=size_name;
+ }
+ else
+ {
+ if (reg_ret != ERROR_NO_MORE_ITEMS)
+ {
+ success = FALSE;
+ push_error(ODBC_ERROR_GENERAL_ERR, odbc_error_general_err);
+ }
+ break;
+ }
+ }
+ *lpszBuf = 0;
+ if ((reg_ret = RegCloseKey (hDrivers)) != ERROR_SUCCESS)
+ TRACE ("Error %d closing ODBC Drivers key\n", reg_ret);
+ }
+ else
+ {
+ /* MSDN states that it returns failure with COMPONENT_NOT_FOUND in this case.
+ * Version 3.525.1117.0 (Windows 2000) does not; it actually returns success.
+ * I doubt if it will actually be an issue.
+ */
+ push_error(ODBC_ERROR_COMPONENT_NOT_FOUND, odbc_error_component_not_found);
+ }
+ return success;
+}
+
+BOOL WINAPI SQLGetInstalledDrivers(LPSTR lpszBuf, WORD cbBufMax,
+ WORD *pcbBufOut)
+{
+ BOOL ret;
+ int size_wbuf = cbBufMax;
+ LPWSTR wbuf;
+ WORD size_used;
+ wbuf = HeapAlloc(GetProcessHeap(), 0, size_wbuf*sizeof(WCHAR));
+ if (wbuf)
+ {
+ ret = SQLGetInstalledDriversW(wbuf, size_wbuf, &size_used);
+ if (ret)
+ {
+ if (!(ret = SQLInstall_narrow(2, lpszBuf, wbuf, size_used, cbBufMax,
pcbBufOut)))
+ {
+ push_error(ODBC_ERROR_GENERAL_ERR, odbc_error_general_err);
+ }
+ }
+ HeapFree(GetProcessHeap(), 0, wbuf);
+ /* ignore failure; we have achieved the aim */
+ }
+ else
+ {
+ push_error(ODBC_ERROR_OUT_OF_MEM, odbc_error_out_of_mem);
+ ret = FALSE;
+ }
+ return ret;
+}
+
+int WINAPI SQLGetPrivateProfileStringW(LPCWSTR lpszSection, LPCWSTR lpszEntry,
+ LPCWSTR lpszDefault, LPCWSTR RetBuffer, int cbRetBuffer,
+ LPCWSTR lpszFilename)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+int WINAPI SQLGetPrivateProfileString(LPCSTR lpszSection, LPCSTR lpszEntry,
+ LPCSTR lpszDefault, LPCSTR RetBuffer, int cbRetBuffer,
+ LPCSTR lpszFilename)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLGetTranslatorW(HWND hwndParent, LPWSTR lpszName, WORD cbNameMax,
+ WORD *pcbNameOut, LPWSTR lpszPath, WORD cbPathMax,
+ WORD *pcbPathOut, DWORD *pvOption)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLGetTranslator(HWND hwndParent, LPSTR lpszName, WORD cbNameMax,
+ WORD *pcbNameOut, LPSTR lpszPath, WORD cbPathMax,
+ WORD *pcbPathOut, DWORD *pvOption)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLInstallDriverW(LPCWSTR lpszInfFile, LPCWSTR lpszDriver,
+ LPWSTR lpszPath, WORD cbPathMax, WORD * pcbPathOut)
+{
+ DWORD usage;
+
+ clear_errors();
+ TRACE("%s %s %p %d %p\n", debugstr_w(lpszInfFile),
+ debugstr_w(lpszDriver), lpszPath, cbPathMax, pcbPathOut);
+
+ if (lpszInfFile)
+ return FALSE;
+
+ return SQLInstallDriverExW(lpszDriver, NULL, lpszPath, cbPathMax,
+ pcbPathOut, ODBC_INSTALL_COMPLETE, &usage);
+}
+
+BOOL WINAPI SQLInstallDriver(LPCSTR lpszInfFile, LPCSTR lpszDriver,
+ LPSTR lpszPath, WORD cbPathMax, WORD * pcbPathOut)
+{
+ DWORD usage;
+
+ clear_errors();
+ TRACE("%s %s %p %d %p\n", debugstr_a(lpszInfFile),
+ debugstr_a(lpszDriver), lpszPath, cbPathMax, pcbPathOut);
+
+ if (lpszInfFile)
+ return FALSE;
+
+ return SQLInstallDriverEx(lpszDriver, NULL, lpszPath, cbPathMax,
+ pcbPathOut, ODBC_INSTALL_COMPLETE, &usage);
+}
+
+BOOL WINAPI SQLInstallDriverExW(LPCWSTR lpszDriver, LPCWSTR lpszPathIn,
+ LPWSTR lpszPathOut, WORD cbPathOutMax, WORD *pcbPathOut,
+ WORD fRequest, LPDWORD lpdwUsageCount)
+{
+ UINT len;
+ LPCWSTR p;
+ WCHAR path[MAX_PATH];
+
+ clear_errors();
+ TRACE("%s %s %p %d %p %d %p\n", debugstr_w(lpszDriver),
+ debugstr_w(lpszPathIn), lpszPathOut, cbPathOutMax, pcbPathOut,
+ fRequest, lpdwUsageCount);
+
+ for (p = lpszDriver; *p; p += lstrlenW(p) + 1)
+ TRACE("%s\n", debugstr_w(p));
+
+ len = GetSystemDirectoryW(path, MAX_PATH);
+
+ if (pcbPathOut)
+ *pcbPathOut = len;
+
+ len = GetSystemDirectoryW(path, MAX_PATH);
+
+ if (lpszPathOut && cbPathOutMax > len)
+ {
+ lstrcpyW(lpszPathOut, path);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+BOOL WINAPI SQLInstallDriverEx(LPCSTR lpszDriver, LPCSTR lpszPathIn,
+ LPSTR lpszPathOut, WORD cbPathOutMax, WORD *pcbPathOut,
+ WORD fRequest, LPDWORD lpdwUsageCount)
+{
+ LPCSTR p;
+ LPWSTR driver, pathin;
+ WCHAR pathout[MAX_PATH];
+ BOOL ret;
+ WORD cbOut = 0;
+
+ clear_errors();
+ TRACE("%s %s %p %d %p %d %p\n", debugstr_a(lpszDriver),
+ debugstr_a(lpszPathIn), lpszPathOut, cbPathOutMax, pcbPathOut,
+ fRequest, lpdwUsageCount);
+
+ for (p = lpszDriver; *p; p += lstrlenA(p) + 1)
+ TRACE("%s\n", debugstr_a(p));
+
+ driver = SQLInstall_strdup_multi(lpszDriver);
+ pathin = SQLInstall_strdup(lpszPathIn);
+
+ ret = SQLInstallDriverExW(driver, pathin, pathout, MAX_PATH, &cbOut,
+ fRequest, lpdwUsageCount);
+ if (ret)
+ {
+ int len = WideCharToMultiByte(CP_ACP, 0, pathout, -1, lpszPathOut,
+ 0, NULL, NULL);
+ if (len)
+ {
+ if (pcbPathOut)
+ *pcbPathOut = len - 1;
+
+ if (!lpszPathOut || cbPathOutMax < len)
+ {
+ ret = FALSE;
+ goto out;
+ }
+ len = WideCharToMultiByte(CP_ACP, 0, pathout, -1, lpszPathOut,
+ cbPathOutMax, NULL, NULL);
+ }
+ }
+
+out:
+ HeapFree(GetProcessHeap(), 0, driver);
+ HeapFree(GetProcessHeap(), 0, pathin);
+ return ret;
+}
+
+BOOL WINAPI SQLInstallDriverManagerW(LPWSTR lpszPath, WORD cbPathMax,
+ WORD *pcbPathOut)
+{
+ UINT len;
+ WCHAR path[MAX_PATH];
+
+ clear_errors();
+ TRACE("(%p %d %d)\n", lpszPath, cbPathMax, *pcbPathOut);
+
+ len = GetSystemDirectoryW(path, MAX_PATH);
+
+ if (pcbPathOut)
+ *pcbPathOut = len;
+
+ if (lpszPath && cbPathMax > len)
+ {
+ lstrcpyW(lpszPath, path);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+BOOL WINAPI SQLInstallDriverManager(LPSTR lpszPath, WORD cbPathMax,
+ WORD *pcbPathOut)
+{
+ BOOL ret;
+ WORD len, cbOut = 0;
+ WCHAR path[MAX_PATH];
+
+ clear_errors();
+ TRACE("(%p %d %d)\n", lpszPath, cbPathMax, *pcbPathOut);
+
+ ret = SQLInstallDriverManagerW(path, MAX_PATH, &cbOut);
+ if (ret)
+ {
+ len = WideCharToMultiByte(CP_ACP, 0, path, -1, lpszPath, 0,
+ NULL, NULL);
+ if (len)
+ {
+ if (pcbPathOut)
+ *pcbPathOut = len - 1;
+
+ if (!lpszPath || cbPathMax < len)
+ return FALSE;
+
+ len = WideCharToMultiByte(CP_ACP, 0, path, -1, lpszPath,
+ cbPathMax, NULL, NULL);
+ }
+ }
+ return ret;
+}
+
+BOOL WINAPI SQLInstallODBCW(HWND hwndParent, LPCWSTR lpszInfFile,
+ LPCWSTR lpszSrcPath, LPCWSTR lpszDrivers)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLInstallODBC(HWND hwndParent, LPCSTR lpszInfFile,
+ LPCSTR lpszSrcPath, LPCSTR lpszDrivers)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+SQLRETURN WINAPI SQLInstallerErrorW(WORD iError, DWORD *pfErrorCode,
+ LPWSTR lpszErrorMsg, WORD cbErrorMsgMax, WORD *pcbErrorMsg)
+{
+ TRACE("%d %p %p %d %p\n", iError, pfErrorCode, lpszErrorMsg,
+ cbErrorMsgMax, pcbErrorMsg);
+
+ if (iError == 0)
+ {
+ return SQL_ERROR;
+ }
+ else if (iError <= num_errors)
+ {
+ BOOL truncated = FALSE;
+ WORD len;
+ LPCWSTR msg;
+ iError--;
+ if (pfErrorCode)
+ *pfErrorCode = error_code[iError];
+ msg = error_msg[iError];
+ len = msg ? lstrlenW(msg) : 0;
+ if (pcbErrorMsg)
+ *pcbErrorMsg = len;
+ len++;
+ if (cbErrorMsgMax < len)
+ {
+ len = cbErrorMsgMax;
+ truncated = TRUE;
+ }
+ if (lpszErrorMsg && len)
+ {
+ if (msg)
+ {
+ memcpy (lpszErrorMsg, msg, len * sizeof(WCHAR));
+ }
+ else
+ {
+ assert(len==1);
+ *lpszErrorMsg = 0;
+ }
+ }
+ else
+ {
+ /* Yes. If you pass a null pointer and a large length it is not an error!
*/
+ truncated = TRUE;
+ }
+
+ return truncated ? SQL_SUCCESS_WITH_INFO : SQL_SUCCESS;
+ }
+
+ /* At least on Windows 2000 , the buffers are not altered in this case. However that
is a little too dangerous a test for just now */
+ if (pcbErrorMsg)
+ *pcbErrorMsg = 0;
+
+ if (lpszErrorMsg && cbErrorMsgMax > 0)
+ *lpszErrorMsg = '\0';
+
+ return SQL_NO_DATA;
+}
+
+SQLRETURN WINAPI SQLInstallerError(WORD iError, DWORD *pfErrorCode,
+ LPSTR lpszErrorMsg, WORD cbErrorMsgMax, WORD *pcbErrorMsg)
+{
+ SQLRETURN ret;
+ LPWSTR wbuf;
+ WORD cbwbuf;
+ TRACE("%d %p %p %d %p\n", iError, pfErrorCode, lpszErrorMsg,
+ cbErrorMsgMax, pcbErrorMsg);
+
+ wbuf = 0;
+ if (lpszErrorMsg && cbErrorMsgMax)
+ {
+ wbuf = HeapAlloc(GetProcessHeap(), 0, cbErrorMsgMax*sizeof(WCHAR));
+ if (!wbuf)
+ return SQL_ERROR;
+ }
+ ret = SQLInstallerErrorW(iError, pfErrorCode, wbuf, cbErrorMsgMax, &cbwbuf);
+ if (wbuf)
+ {
+ WORD cbBuf = 0;
+ SQLInstall_narrow(1, lpszErrorMsg, wbuf, cbwbuf+1, cbErrorMsgMax, &cbBuf);
+ HeapFree(GetProcessHeap(), 0, wbuf);
+ if (pcbErrorMsg)
+ *pcbErrorMsg = cbBuf-1;
+ }
+ return ret;
+}
+
+BOOL WINAPI SQLInstallTranslatorExW(LPCWSTR lpszTranslator, LPCWSTR lpszPathIn,
+ LPWSTR lpszPathOut, WORD cbPathOutMax, WORD *pcbPathOut,
+ WORD fRequest, LPDWORD lpdwUsageCount)
+{
+ UINT len;
+ LPCWSTR p;
+ WCHAR path[MAX_PATH];
+
+ clear_errors();
+ TRACE("%s %s %p %d %p %d %p\n", debugstr_w(lpszTranslator),
+ debugstr_w(lpszPathIn), lpszPathOut, cbPathOutMax, pcbPathOut,
+ fRequest, lpdwUsageCount);
+
+ for (p = lpszTranslator; *p; p += lstrlenW(p) + 1)
+ TRACE("%s\n", debugstr_w(p));
+
+ len = GetSystemDirectoryW(path, MAX_PATH);
+
+ if (pcbPathOut)
+ *pcbPathOut = len;
+
+ if (lpszPathOut && cbPathOutMax > len)
+ {
+ lstrcpyW(lpszPathOut, path);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+BOOL WINAPI SQLInstallTranslatorEx(LPCSTR lpszTranslator, LPCSTR lpszPathIn,
+ LPSTR lpszPathOut, WORD cbPathOutMax, WORD *pcbPathOut,
+ WORD fRequest, LPDWORD lpdwUsageCount)
+{
+ LPCSTR p;
+ LPWSTR translator, pathin;
+ WCHAR pathout[MAX_PATH];
+ BOOL ret;
+ WORD cbOut = 0;
+
+ clear_errors();
+ TRACE("%s %s %p %d %p %d %p\n", debugstr_a(lpszTranslator),
+ debugstr_a(lpszPathIn), lpszPathOut, cbPathOutMax, pcbPathOut,
+ fRequest, lpdwUsageCount);
+
+ for (p = lpszTranslator; *p; p += lstrlenA(p) + 1)
+ TRACE("%s\n", debugstr_a(p));
+
+ translator = SQLInstall_strdup_multi(lpszTranslator);
+ pathin = SQLInstall_strdup(lpszPathIn);
+
+ ret = SQLInstallTranslatorExW(translator, pathin, pathout, MAX_PATH,
+ &cbOut, fRequest, lpdwUsageCount);
+ if (ret)
+ {
+ int len = WideCharToMultiByte(CP_ACP, 0, pathout, -1, lpszPathOut,
+ 0, NULL, NULL);
+ if (len)
+ {
+ if (pcbPathOut)
+ *pcbPathOut = len - 1;
+
+ if (!lpszPathOut || cbPathOutMax < len)
+ {
+ ret = FALSE;
+ goto out;
+ }
+ len = WideCharToMultiByte(CP_ACP, 0, pathout, -1, lpszPathOut,
+ cbPathOutMax, NULL, NULL);
+ }
+ }
+
+out:
+ HeapFree(GetProcessHeap(), 0, translator);
+ HeapFree(GetProcessHeap(), 0, pathin);
+ return ret;
+}
+
+BOOL WINAPI SQLInstallTranslator(LPCSTR lpszInfFile, LPCSTR lpszTranslator,
+ LPCSTR lpszPathIn, LPSTR lpszPathOut, WORD cbPathOutMax,
+ WORD *pcbPathOut, WORD fRequest, LPDWORD lpdwUsageCount)
+{
+ clear_errors();
+ TRACE("%s %s %s %p %d %p %d %p\n", debugstr_a(lpszInfFile),
+ debugstr_a(lpszTranslator), debugstr_a(lpszPathIn), lpszPathOut,
+ cbPathOutMax, pcbPathOut, fRequest, lpdwUsageCount);
+
+ if (lpszInfFile)
+ return FALSE;
+
+ return SQLInstallTranslatorEx(lpszTranslator, lpszPathIn, lpszPathOut,
+ cbPathOutMax, pcbPathOut, fRequest, lpdwUsageCount);
+}
+
+BOOL WINAPI SQLInstallTranslatorW(LPCWSTR lpszInfFile, LPCWSTR lpszTranslator,
+ LPCWSTR lpszPathIn, LPWSTR lpszPathOut, WORD cbPathOutMax,
+ WORD *pcbPathOut, WORD fRequest, LPDWORD lpdwUsageCount)
+{
+ clear_errors();
+ TRACE("%s %s %s %p %d %p %d %p\n", debugstr_w(lpszInfFile),
+ debugstr_w(lpszTranslator), debugstr_w(lpszPathIn), lpszPathOut,
+ cbPathOutMax, pcbPathOut, fRequest, lpdwUsageCount);
+
+ if (lpszInfFile)
+ return FALSE;
+
+ return SQLInstallTranslatorExW(lpszTranslator, lpszPathIn, lpszPathOut,
+ cbPathOutMax, pcbPathOut, fRequest, lpdwUsageCount);
+}
+
+BOOL WINAPI SQLManageDataSources(HWND hwnd)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+SQLRETURN WINAPI SQLPostInstallerErrorW(DWORD fErrorCode, LPCWSTR szErrorMsg)
+{
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+SQLRETURN WINAPI SQLPostInstallerError(DWORD fErrorCode, LPCSTR szErrorMsg)
+{
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLReadFileDSNW(LPCWSTR lpszFileName, LPCWSTR lpszAppName,
+ LPCWSTR lpszKeyName, LPWSTR lpszString, WORD cbString,
+ WORD *pcbString)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLReadFileDSN(LPCSTR lpszFileName, LPCSTR lpszAppName,
+ LPCSTR lpszKeyName, LPSTR lpszString, WORD cbString,
+ WORD *pcbString)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLRemoveDefaultDataSource(void)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLRemoveDriverW(LPCWSTR lpszDriver, BOOL fRemoveDSN,
+ LPDWORD lpdwUsageCount)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLRemoveDriver(LPCSTR lpszDriver, BOOL fRemoveDSN,
+ LPDWORD lpdwUsageCount)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLRemoveDriverManager(LPDWORD pdwUsageCount)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLRemoveDSNFromIniW(LPCWSTR lpszDSN)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLRemoveDSNFromIni(LPCSTR lpszDSN)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLRemoveTranslatorW(LPCWSTR lpszTranslator, LPDWORD lpdwUsageCount)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLRemoveTranslator(LPCSTR lpszTranslator, LPDWORD lpdwUsageCount)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLSetConfigMode(UWORD wConfigMode)
+{
+ clear_errors();
+ if (wConfigMode > ODBC_SYSTEM_DSN)
+ {
+ push_error(ODBC_ERROR_INVALID_PARAM_SEQUENCE,
odbc_error_invalid_param_sequence);
+ return FALSE;
+ }
+ else
+ {
+ config_mode = wConfigMode;
+ return TRUE;
+ }
+}
+
+BOOL WINAPI SQLValidDSNW(LPCWSTR lpszDSN)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLValidDSN(LPCSTR lpszDSN)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLWriteDSNToIniW(LPCWSTR lpszDSN, LPCWSTR lpszDriver)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLWriteDSNToIni(LPCSTR lpszDSN, LPCSTR lpszDriver)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLWriteFileDSNW(LPCWSTR lpszFileName, LPCWSTR lpszAppName,
+ LPCWSTR lpszKeyName, LPCWSTR lpszString)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLWriteFileDSN(LPCSTR lpszFileName, LPCSTR lpszAppName,
+ LPCSTR lpszKeyName, LPCSTR lpszString)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLWritePrivateProfileStringW(LPCWSTR lpszSection, LPCWSTR lpszEntry,
+ LPCWSTR lpszString, LPCWSTR lpszFilename)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+BOOL WINAPI SQLWritePrivateProfileString(LPCSTR lpszSection, LPCSTR lpszEntry,
+ LPCSTR lpszString, LPCSTR lpszFilename)
+{
+ clear_errors();
+ FIXME("\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
Propchange: trunk/reactos/dll/win32/odbccp32/odbccp32.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/dll/win32/odbccp32/odbccp32.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/odbccp32/odbccp3…
==============================================================================
--- trunk/reactos/dll/win32/odbccp32/odbccp32.rbuild (added)
+++ trunk/reactos/dll/win32/odbccp32/odbccp32.rbuild Wed Mar 14 15:48:32 2007
@@ -1,0 +1,19 @@
+<module name="odbccp32" type="win32dll"
baseaddress="${BASEADDRESS_ODBCCP32}" installbase="system32"
installname="odbccp32.dll" allowwarnings="true">
+ <importlibrary definition="odbccp32.spec.def" />
+ <include base="odbccp32">.</include>
+ <include base="ReactOS">include/reactos/wine</include>
+ <define name="__REACTOS__" />
+ <define name="__WINESRC__" />
+ <define name="__USE_W32API" />
+ <define name="_WIN32_IE">0x600</define>
+ <define name="_WIN32_WINNT">0x501</define>
+ <define name="WINVER">0x501</define>
+ <library>wine</library>
+ <library>ole32</library>
+ <library>advapi32</library>
+ <library>kernel32</library>
+ <library>uuid</library>
+ <library>ntdll</library>
+ <file>odbccp32.c</file>
+ <file>odbccp32.spec</file>
+</module>
Propchange: trunk/reactos/dll/win32/odbccp32/odbccp32.rbuild
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/dll/win32/odbccp32/odbccp32.spec
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/odbccp32/odbccp3…
==============================================================================
--- trunk/reactos/dll/win32/odbccp32/odbccp32.spec (added)
+++ trunk/reactos/dll/win32/odbccp32/odbccp32.spec Wed Mar 14 15:48:32 2007
@@ -1,0 +1,57 @@
+@ stdcall ODBCCPlApplet( long long ptr ptr)
+@ stdcall SQLConfigDataSource(ptr long wstr wstr)
+@ stdcall SQLConfigDataSourceW(ptr long str str)
+@ stdcall SQLConfigDriver(ptr long str str ptr long ptr)
+@ stdcall SQLConfigDriverW(ptr long wstr wstr ptr long ptr)
+@ stdcall SQLCreateDataSource(ptr str)
+@ stub SQLCreateDataSourceEx
+@ stub SQLCreateDataSourceExW
+@ stdcall SQLCreateDataSourceW(ptr wstr)
+@ stdcall SQLGetAvailableDrivers(str ptr long ptr)
+@ stdcall SQLGetAvailableDriversW(wstr ptr long ptr)
+@ stdcall SQLGetConfigMode(ptr)
+@ stdcall SQLGetInstalledDrivers(str long ptr)
+@ stdcall SQLGetInstalledDriversW(wstr long ptr)
+@ stdcall SQLGetPrivateProfileString(str str str str long str)
+@ stdcall SQLGetPrivateProfileStringW(wstr wstr wstr wstr long wstr)
+@ stdcall SQLGetTranslator(ptr str long ptr ptr long ptr ptr)
+@ stdcall SQLGetTranslatorW(ptr wstr long ptr ptr long ptr ptr)
+@ stdcall SQLInstallDriver(str str str long ptr)
+@ stdcall SQLInstallDriverEx(str str str long ptr long ptr)
+@ stdcall SQLInstallDriverExW(wstr wstr wstr long ptr long ptr)
+@ stdcall SQLInstallDriverManager(ptr long ptr)
+@ stdcall SQLInstallDriverManagerW(ptr long ptr)
+@ stdcall SQLInstallDriverW(wstr wstr wstr long ptr)
+@ stdcall SQLInstallODBC(ptr str str str)
+@ stdcall SQLInstallODBCW(ptr wstr wstr wstr)
+@ stdcall SQLInstallTranslator(str str str ptr long ptr long ptr)
+@ stdcall SQLInstallTranslatorEx(str str ptr long ptr long ptr)
+@ stdcall SQLInstallTranslatorExW(wstr wstr ptr long ptr long ptr)
+@ stdcall SQLInstallTranslatorW(wstr wstr wstr ptr long ptr long ptr)
+@ stdcall SQLInstallerError(long ptr ptr long ptr)
+@ stdcall SQLInstallerErrorW(long ptr ptr long ptr)
+@ stub SQLLoadDataSourcesListBox
+@ stub SQLLoadDriverListBox
+@ stdcall SQLManageDataSources(ptr)
+@ stdcall SQLPostInstallerError(long ptr)
+@ stdcall SQLPostInstallerErrorW(long ptr)
+@ stdcall SQLReadFileDSN(str str str ptr long ptr)
+@ stdcall SQLReadFileDSNW(wstr wstr wstr ptr long ptr)
+@ stdcall SQLRemoveDSNFromIni(str)
+@ stdcall SQLRemoveDSNFromIniW(wstr)
+@ stdcall SQLRemoveDefaultDataSource()
+@ stdcall SQLRemoveDriver(str long ptr)
+@ stdcall SQLRemoveDriverManager(ptr)
+@ stdcall SQLRemoveDriverW(wstr long ptr)
+@ stdcall SQLRemoveTranslator(str ptr)
+@ stdcall SQLRemoveTranslatorW(wstr ptr)
+@ stdcall SQLSetConfigMode(long)
+@ stdcall SQLValidDSN(str)
+@ stdcall SQLValidDSNW(wstr)
+@ stdcall SQLWriteDSNToIni(str str)
+@ stdcall SQLWriteDSNToIniW(wstr wstr)
+@ stdcall SQLWriteFileDSN(str str str str)
+@ stdcall SQLWriteFileDSNW(wstr wstr wstr wstr)
+@ stdcall SQLWritePrivateProfileString(str str str str)
+@ stdcall SQLWritePrivateProfileStringW(wstr wstr wstr wstr)
+@ stub SelectTransDlg
Propchange: trunk/reactos/dll/win32/odbccp32/odbccp32.spec
------------------------------------------------------------------------------
svn:eol-style = native