configure.cpp 4.9 KB
/*
 * Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
 */

#include "h2odbc.h"

typedef struct {
    char name[MAX_STRING_LEN+1];
    char url[MAX_STRING_LEN+1];
    char user[MAX_STRING_LEN+1];
    char password[MAX_STRING_LEN+1];
} DNSConfiguration;

BOOL INSTAPI ConfigDriver(HWND hwndParent, 
             WORD fRequest, LPCSTR lpszDriver,
             LPCSTR lpszArgs, LPSTR lpszMsg,
             WORD cbMsgMax, WORD *pcbMsgOut) {
    trace("ConfigDriver");
    switch(fRequest) {
    case ODBC_INSTALL_DRIVER:
    case ODBC_CONFIG_DRIVER:
    case ODBC_REMOVE_DRIVER:
        return TRUE;
    }
    return FALSE;
}

LONG CALLBACK ConfigDlgProc(HWND hdlg,WORD wMsg,WPARAM wParam,LPARAM lParam) {
    DNSConfiguration* config;
    switch (wMsg) {
    case WM_INITDIALOG:
        config=(DNSConfiguration*)lParam;
        SetDlgItemText(hdlg,IDC_NAME,config->name);
        SetDlgItemText(hdlg,IDC_URL,config->url);
        SetDlgItemText(hdlg,IDC_USER,config->user);
        SetDlgItemText(hdlg,IDC_PASSWORD,config->password);
        SetWindowLong(hdlg, GWL_USERDATA, (LONG) lParam );
        return TRUE;
    case WM_COMMAND:
        switch (LOWORD(wParam)) {
        case IDOK:
            config=(DNSConfiguration*)GetWindowLong(hdlg,GWL_USERDATA);
            GetDlgItemText(hdlg,IDC_NAME,config->name,MAX_STRING_LEN);
            GetDlgItemText(hdlg,IDC_URL,config->url,MAX_STRING_LEN);
            GetDlgItemText(hdlg,IDC_USER,config->user,MAX_STRING_LEN);
            GetDlgItemText(hdlg,IDC_PASSWORD,config->password,MAX_STRING_LEN);
            EndDialog(hdlg, wParam);
            return TRUE;
        case IDCANCEL:
            EndDialog(hdlg, wParam);
            return TRUE;
        }
        break;
    }
    return FALSE;
}

BOOL INSTAPI ConfigDSN(HWND    hwndParent,
             WORD fRequest, LPCSTR    lpszDriver,
             LPCSTR lpszAttributes) {
    trace("ConfigDSN");
    char* begin=strstr(lpszAttributes,"DSN=");
    int len=0;
    char name[MAX_STRING_LEN+1];
    name[0]=0;
    DNSConfiguration configuration;
    configuration.name[0]=0;
    configuration.url[0]=0;
    configuration.user[0]=0;
    configuration.password[0]=0;
    if(begin) {
        trace(" begin");              
        begin+=4; 
        char* end=strstr(begin,";");
        int len;
        if(end==NULL) {
            len=strlen(begin);
        } else {
            len=end-begin;
        }
        if(len>MAX_STRING_LEN) {
            len=MAX_STRING_LEN;
        }
        strncpy(name, begin, len+1);
        strncpy(configuration.name, begin, len+1);
    }
    if(fRequest==ODBC_REMOVE_DSN) {
        trace(" ODBC_REMOVE_DSN");              
        return SQLRemoveDSNFromIni(name);
    }
    if(fRequest==ODBC_CONFIG_DSN) {
        trace(" ODBC_CONFIG_DSN");  
        SQLGetPrivateProfileString(
            name, 
            "URL", "", configuration.url, MAX_STRING_LEN,
            "ODBC.INI");
        SQLGetPrivateProfileString(
            name, 
            "User", "", configuration.user, MAX_STRING_LEN,
            "ODBC.INI");
        SQLGetPrivateProfileString(
            name, 
            "Password", "", configuration.password, MAX_STRING_LEN,
            "ODBC.INI");
    } else if(fRequest==ODBC_ADD_DSN) {
        // ok
        trace(" ODBC_ADD_DSN");  
    } else {
        // error
        trace(" ?");  
        return FALSE;
    }
    HMODULE module = GetModuleHandle("h2odbc");
    if(hwndParent) {
        int result=DialogBoxParam(module, 
                MAKEINTRESOURCE(IDD_CONFIG), 
                hwndParent, 
                (DLGPROC)ConfigDlgProc, 
                (LPARAM)&configuration);
        if(result != IDOK) {
            trace(" result != IDOK, %d lastError=%d", result, GetLastError());
            return TRUE;
        }
    }
    
    trace(" SQLRemoveDSNFromIni...");
    SQLRemoveDSNFromIni(name);
    SQLWriteDSNToIni(configuration.name,lpszDriver);
    SQLWritePrivateProfileString(
        configuration.name, "URL", configuration.url,
        "ODBC.INI");
    SQLWritePrivateProfileString(
        configuration.name, "User", configuration.user,
        "ODBC.INI");
    SQLWritePrivateProfileString(
        configuration.name, "Password", configuration.password,
        "ODBC.INI");
    

    // TODO: temp hack (because m_dll is 0?)
    // SQLRemoveDSNFromIni(name);
    // SQLWriteDSNToIni("Test",lpszDriver);
    // SQLWritePrivateProfileString(
    //     configuration.name, "URL", "jdbc:h2:localhost:9082",
    //     "ODBC.INI");
    // SQLWritePrivateProfileString(
    //     configuration.name, "User", "sa",
    //     "ODBC.INI");
    // SQLWritePrivateProfileString(
    //     configuration.name, "Password", "123",
    //     "ODBC.INI");

    trace(" return TRUE");
    return TRUE;
}