/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
********************************************************************/
// Drvr35Adm.h : main header file for the DRVR35ADM DLL
//

#if !defined(AFX_DRVR35ADM_H__E21E4AF0_D9A1_11D3_ABEF_080009DC95E5__INCLUDED_)
#define AFX_DRVR35ADM_H__E21E4AF0_D9A1_11D3_ABEF_080009DC95E5__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#ifndef __AFXWIN_H__
	#error include 'stdafx.h' before including this file for PCH
#endif

#include "resource.h"				// main symbols
#define MAXPATHLEN      (260+1)		// Max path length
#define MAX_INI_VAL		261
#define MAXIPLEN        (90+1)		// Max length for IP Address
#define MAXPORTLEN      (5+1)		// Max length for port number
#define MAXDSNAME       (32+1)		// Max data source name length
#define MAXKEYLEN       (32+1)		// Max keyword length
#define MAXDESC         (255+1)		// Max description length
#define MAXCATLEN       (128+1)		// Max length for catalog (or schema)
#define MAXSN			(20+1)

// Attribute key indexes (into an array of Attr structs, see below)
#define KEY_DSN					0
#define KEY_DESC				1
#define KEY_CATALOG				2
#define KEY_SCHEMA				3
#define KEY_LOCATION			4
#define KEY_LOGIN				5
#define KEY_CONNECTION			6
#define KEY_QUERY				7
#define KEY_IPADDRESS			8
#define KEY_PORTNUM				9
#define KEY_ERRORLANG			10
#define KEY_DATALANG			11
#define KEY_TRACE_FLAGS			12
#define KEY_TRACE_FILE			13
#define KEY_TRANSLATION_DLL		14
#define KEY_TRANSLATION_OPTION	15
#define KEY_FETCH_BUFFER_SIZE	16
#define KEY_SERVICE_NAME		17
#define KEY_REPLACEMENT_CHAR	18
#define KEY_COMPRESSION			19
#define NUMOFKEYS				20	// Number of keys supported


// ODBC.INI keywords
const char ODBC_INI[]				= "ODBC.INI";		// ODBC initialization file
const char INI_KDESC[]				= "Description";	// Data source description
const char INI_KSN[]				= "ServiceName";	// Service Name
const char INI_CATALOG[]			= "Catalog";		// Second option
const char INI_SCHEMA[]				= "Schema";		    // Schema string
const char INI_LOCATION[]			= "Location";		// Location string
const char INI_NETWORK[]			= "Server";
const char INI_LOGIN[]				= "SQL_LOGIN_TIMEOUT";
const char INI_CONNECTION[]			= "SQL_ATTR_CONNECTION_TIMEOUT";
const char INI_QUERY[]				= "SQL_QUERY_TIMEOUT";
const char INI_SDEFAULT[]			= "Default";		// Default data source name
const char TCP_STR[]				= "TCP:";           // For Association Server
const char INI_ERRORLANG[]			= "ErrorMsgLang";	// Language ID (LCID) for error messages
const char INI_DATALANG[]			= "DataLang";		// Language ID (LCID) for SQL data
const char INI_TRACE_FLAGS[]		= "TraceFlags";
const char INI_TRACE_FILE[]			= "TraceFile";
const char INI_TRANSLATION_DLL[]	= "TranslationDLL";
const char INI_TRANSLATION_OPTION[] = "TranslationOption";
const char INI_FETCH_BUFFER_SIZE[]  = "FetchBufferSize";
const char INI_REPLACEMENT_CHAR[]	= "ReplacementCharacter";
const char INI_COMPRESSION[]		= "Compression";

const char TRACE_PATH[] = "Software\\ODBC\\ODBC.INI\\ODBC";
const char DRIVER_NAME[] = "TRAF ODBC 2.2";
const char CREATE_NEW_DSN[] = "Create a New Trafodion ODBC Data Source to Trafodion Database";
const char CONFIGURE_DSN1[] = "Trafodion ODBC Data Source '";
const char DRVR_MSG_DLL[] = "traf_odbcDrvMsg_intl0100.dll";
const char CONFIGURE_DSN2[] = "' Configuration";

const char	szDefaultTraceFlags[]=  		"0";
const char	szDefaultTraceFile[]=			"C:\\ODBC.LOG";
const char	szODBC[]=						"ODBC";
const char	szODBCIni[]=					"ODBC.INI";


struct ATTR
{
	BOOL	fSupplied;
	char	szAttr[ MAXPATHLEN];
};
	
typedef struct ATTR			Attr;
typedef Attr FAR *			LPAttr;

extern char szDSN[];
extern HWND hwndParent;
extern LPCSTR lpszDrvr;
extern BOOL bNewDSN;
extern LPAttr  aAttr;
/////////////////////////////////////////////////////////////////////////////
// CDrvr35AdmApp
// See Drvr35Adm.cpp for the implementation of this class
//

class CDrvr35AdmApp : public CWinApp
{
public:
	CDrvr35AdmApp();

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CDrvr35AdmApp)
	//}}AFX_VIRTUAL

	//{{AFX_MSG(CDrvr35AdmApp)
		// NOTE - the ClassWizard will add and remove member functions here.
		//    DO NOT EDIT what you see in these blocks of generated code !
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

// Function Prototypes
void WriteTraceRegistry( const char szName[],char* szData);
void ReadTraceRegistry( const char szName[],char* szData,long size);
BOOL SetDSNAttributes(HWND    hwnd, LPCSTR  lpszDrvr, BOOL  bNewDSN);
void DeleteFileDSN( LPCSTR lpDSName );

#define IDL_PTR_SIZE 4
#define IDL_PTR_PAD(name, count)  char name##pad_[8 - IDL_PTR_SIZE] [count];

typedef char IDL_char;
typedef short IDL_short;
typedef long IDL_long;
typedef unsigned long IDL_unsigned_long;
typedef IDL_long IDL_enum;
typedef IDL_char SQL_IDENTIFIER_def[129];
typedef IDL_enum DS_AUTOMATION_t;
typedef DS_AUTOMATION_t DS_AUTOMATION_def;
typedef IDL_long TIME_def;

struct DATASOURCE_STATUS_t {
  SQL_IDENTIFIER_def DSName;
  char pad_to_offset_132_[3];
  DS_AUTOMATION_def DSAutomation;
  IDL_short defaultFlag;
  char pad_to_offset_140_[2];
  IDL_long DSState;
  IDL_long MaxSrvrCnt;
  IDL_long InitSrvrCnt;
  IDL_long AvailSrvrCnt;
  IDL_long StartAheadCnt;
  IDL_long CurrentSrvrRegistered;
  IDL_long CurrentSrvrConnected;
  TIME_def StateChangeTime;
};
typedef struct DATASOURCE_STATUS_t DATASOURCE_STATUS_def;
typedef struct DATASOURCE_STATUS_LIST_def_seq_ {
  IDL_unsigned_long _length;
  char pad_to_offset_8_[4];
  DATASOURCE_STATUS_def *_buffer;
  IDL_PTR_PAD(_buffer, 1)
} DATASOURCE_STATUS_LIST_def;

void getDSInfo(char* Ip, char* port);
void freeDSInfo();
char* getFirstDSName();
char* getNextDSName();
DATASOURCE_STATUS_def *getDSNameDetails(char* sDSName);

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_DRVR35ADM_H__E21E4AF0_D9A1_11D3_ABEF_080009DC95E5__INCLUDED_)
