#include "gui.h"
#include <herr.h>
#include <dlproc.h>
#ifndef WIN32
#include <unistd.h>
#define CALL_LOGIN_DIALBOX(path) \
if ((handle = DLL_OPEN(path)) != NULL) \
{ \
if ((pLogin = (pLoginFunc)DLL_PROC(handle, "_iodbcdm_loginbox")) != NULL) \
{ \
if (pLogin (hwnd, szInOutConnStr, cbInOutConnStr, sqlStat) == SQL_SUCCESS) \
{ \
DLL_CLOSE(handle); \
goto done; \
} \
} \
DLL_CLOSE(handle); \
}
#endif
SQLRETURN SQL_API
iodbcdm_loginbox (
HWND hwnd,
LPSTR szInOutConnStr,
DWORD cbInOutConnStr,
int FAR * sqlStat)
{
RETCODE retcode = SQL_ERROR;
char *szUID = NULL, *szPWD = NULL, *szDSN = NULL, *curr, *szDriver = NULL;
char tokenstr[4096], drvbuf[4096];
HDLL handle;
pLoginFunc pLogin;
#ifdef _MACX
CFStringRef libname;
CFBundleRef bundle;
CFURLRef liburl;
char name[1024] = { 0 };
#endif
if (!hwnd || !szInOutConnStr || cbInOutConnStr < 1)
goto quit;
for (curr = szInOutConnStr; *curr; curr += (STRLEN (curr) + 1))
{
if (!strncasecmp (curr, "DSN=", STRLEN ("DSN=")))
szDSN = curr + STRLEN ("DSN=");
if (!strncasecmp (curr, "UID=", STRLEN ("UID=")))
szUID = curr + STRLEN ("UID=");
if (!strncasecmp (curr, "Username=", STRLEN ("Username=")))
szUID = curr + STRLEN ("Username=");
if (!strncasecmp (curr, "LastUser=", STRLEN ("LastUser=")))
szUID = curr + STRLEN ("LastUser=");
if (!strncasecmp (curr, "PWD=", STRLEN ("PWD=")))
szPWD = curr + STRLEN ("PWD=");
if (!strncasecmp (curr, "Password=", STRLEN ("Password=")))
szPWD = curr + STRLEN ("Password=");
if (!strncasecmp (curr, "DRIVER=", STRLEN ("DRIVER=")))
szDriver = curr + STRLEN ("DRIVER=");
}
#ifdef WIN32
if (SQLGetPrivateProfileString ("ODBC 32 bit Data Sources", szDSN, "",
tokenstr, sizeof (tokenstr), NULL))
#else
if (SQLGetPrivateProfileString ("ODBC Data Sources", szDSN, "", tokenstr,
sizeof (tokenstr), NULL))
#endif
szDriver = tokenstr;
if (!szUID || !szPWD)
{
SQLSetConfigMode (ODBC_USER_DSN);
if (SQLGetPrivateProfileString (szDriver, "Driver", "", drvbuf,
sizeof (drvbuf), "odbcinst.ini"))
CALL_LOGIN_DIALBOX (drvbuf);
if (SQLGetPrivateProfileString (szDriver, "Setup", "", drvbuf,
sizeof (drvbuf), "odbcinst.ini"))
CALL_LOGIN_DIALBOX (drvbuf);
if (szDriver && !access (szDriver, X_OK))
CALL_LOGIN_DIALBOX (szDriver);
if (SQLGetPrivateProfileString ("Default", "Driver", "", drvbuf,
sizeof (drvbuf), "odbcinst.ini"))
CALL_LOGIN_DIALBOX (drvbuf);
if (SQLGetPrivateProfileString ("Default", "Setup", "", drvbuf,
sizeof (drvbuf), "odbcinst.ini"))
CALL_LOGIN_DIALBOX (drvbuf);
SQLSetConfigMode (ODBC_SYSTEM_DSN);
if (SQLGetPrivateProfileString (szDriver, "Driver", "", drvbuf,
sizeof (drvbuf), "odbcinst.ini"))
CALL_LOGIN_DIALBOX (drvbuf);
if (SQLGetPrivateProfileString (szDriver, "Setup", "", drvbuf,
sizeof (drvbuf), "odbcinst.ini"))
CALL_LOGIN_DIALBOX (drvbuf);
if (szDriver && !access (szDriver, X_OK))
CALL_LOGIN_DIALBOX (szDriver);
if (SQLGetPrivateProfileString ("Default", "Driver", "", drvbuf,
sizeof (drvbuf), "odbcinst.ini"))
CALL_LOGIN_DIALBOX (drvbuf);
if (SQLGetPrivateProfileString ("Default", "Setup", "", drvbuf,
sizeof (drvbuf), "odbcinst.ini"))
CALL_LOGIN_DIALBOX (drvbuf);
#ifdef _MACX
bundle = CFBundleGetBundleWithIdentifier (CFSTR ("org.iodbc.core"));
if (bundle)
{
liburl =
CFBundleCopyResourceURL (bundle, CFSTR ("iODBCdrvproxy.bundle"),
NULL, NULL);
if (liburl
&& (libname =
CFURLCopyFileSystemPath (liburl, kCFURLPOSIXPathStyle)))
{
CFStringGetCString (libname, name, sizeof (name),
kCFStringEncodingASCII);
strcat (name, "/Contents/MacOS/iODBCdrvproxy");
CALL_LOGIN_DIALBOX (name);
}
if (liburl)
CFRelease (liburl);
if (libname)
CFRelease (libname);
CFRelease (bundle);
}
#else
CALL_LOGIN_DIALBOX ("libdrvproxy.so");
#endif
if (sqlStat)
*sqlStat = en_IM003;
goto quit;
}
done:
retcode = SQL_SUCCESS;
quit:
return retcode;
}