#include <windows.h>

void wtoa(TCHAR *loveW, char *love, int lenw);


static char sDhcp[]="EnableDHCP";
static char sIp[]="IpAddress";
static char sGw[]="DefaultGateway";
static char sSm[]="Subnetmask";
static char sDns[]="DNS";
static char sWins[]="WINS";

typedef struct _smsc9xconfigW
{
	TCHAR Dhcp[10];
	TCHAR Ip[40];
	TCHAR Gw[40];
	TCHAR Sm[40];
	TCHAR Dns[40];
	TCHAR Wins[40];
}SMSC9XCONFIGW;

extern SMSC9XCONFIGW Smsc9xW;

typedef struct _smsc9xconfig
{
	char Dhcp[10];
	char Ip[40];
	char Gw[40];
	char Sm[40];
	char Dns[40];
	char Wins[40];
}SMSC9XCONFIG;

extern SMSC9XCONFIG Smsc9x;


extern TCHAR Flash[];
extern TCHAR FlashFx[];
extern char fLoadReg[];
extern TCHAR fLoadRegW[];

char fxLoadReg[]="\\Temp\\load.reg";
TCHAR fxLoadRegW[]=(TEXT("\\Temp\\load.reg"));

/*
[HKEY_LOCAL_MACHINE\Comm\SMC90001\Parms\TcpIp]
;
; When you're going to use DHCP, You can set 1
;
    "EnableDHCP"=dword:0
;
; When you're going to use Static IP Address,
; You have to change the following values for your IP address.
;
    "IpAddress"="207.196.69.92"				;John's IP
    "DefaultGateway"="207.196.69.65"
    "Subnetmask"="255.255.255.192"
    "DNS"="168.143.0.7"
    "WINS"="0.0.0.0"
*/

static char SmscRegKey[] = "[HKEY_LOCAL_MACHINE\\Comm\\SMC90001\\Parms\\TcpIp]";
static TCHAR SmscRegKeyW[] = TEXT("[HKEY_LOCAL_MACHINE\\Comm\\SMC90001\\Parms\\TcpIp]");

BOOL ReadSmscRegistry()
{
	ULONG lRet;
	DWORD dwType;
	DWORD dwSize;
	DWORD dwDhcp=0;

	dwSize=0;
	dwSize = sizeof(DWORD);

	lRet = RegQueryValueEx(HKEY_LOCAL_MACHINE,
						TEXT("EnableDHCP"),
						(LPDWORD)TEXT("Comm\\SMC90001\\Parms\\TcpIp"),
						NULL,
						(BYTE*)&dwDhcp,
						&dwSize);

	if (lRet == ERROR_SUCCESS)
	{
		//RETAILMSG(1,(L" DHCP = %d \r\n",dwDhcp));

		if(dwDhcp)
			Smsc9xW.Dhcp[0] = 1+ 0x30;	// char '1'
		else
			Smsc9xW.Dhcp[0] = 0x30;	// char '0'

		//RETAILMSG(1,(L" Smsc9xW.Dhcp = %s \r\n",Smsc9xW.Dhcp));
	}
	else
	{
		return FALSE;
	}


	dwSize=0;
	dwSize = sizeof(Smsc9xW.Ip);

	lRet = RegQueryValueEx(HKEY_LOCAL_MACHINE,
						TEXT("IpAddress"),
						(LPDWORD)TEXT("Comm\\SMC90001\\Parms\\TcpIp"),
						&dwType,
						(BYTE *)Smsc9xW.Ip,
						&dwSize);

	if (lRet == ERROR_SUCCESS)
	{
		//RETAILMSG(1,(L" Smsc9xW.Ip = %s \r\n",Smsc9xW.Ip));
	}
	else
	{
		return FALSE;
	}

	dwSize=0;
	dwSize = sizeof(Smsc9xW.Gw);

	lRet = RegQueryValueEx(HKEY_LOCAL_MACHINE,
						TEXT("DefaultGateway"),
						(LPDWORD)TEXT("Comm\\SMC90001\\Parms\\TcpIp"),
						&dwType,
						(BYTE *)Smsc9xW.Gw,
						&dwSize);

	if (lRet == ERROR_SUCCESS)
	{
		//RETAILMSG(1,(L" Smsc9xW.Gw = %s \r\n",Smsc9xW.Gw));
	}
	else
	{
		return FALSE;
	}

	dwSize=0;
	dwSize = sizeof(Smsc9xW.Sm);

	lRet = RegQueryValueEx(HKEY_LOCAL_MACHINE,
						TEXT("Subnetmask"),
						(LPDWORD)TEXT("Comm\\SMC90001\\Parms\\TcpIp"),
						&dwType,
						(BYTE *)Smsc9xW.Sm,
						&dwSize);

	if (lRet == ERROR_SUCCESS)
	{
		//RETAILMSG(1,(L" Smsc9xW.Sm = %s \r\n",Smsc9xW.Sm));
	}
	else
	{
		return FALSE;
	}

	dwSize=0;
	dwSize = sizeof(Smsc9xW.Dns);

	lRet = RegQueryValueEx(HKEY_LOCAL_MACHINE,
						TEXT("DNS"),
						(LPDWORD)TEXT("Comm\\SMC90001\\Parms\\TcpIp"),
						&dwType,
						(BYTE *)Smsc9xW.Dns,
						&dwSize);

	if (lRet == ERROR_SUCCESS)
	{
		//RETAILMSG(1,(L" Smsc9xW.Dns = %s \r\n",Smsc9xW.Dns));
	}
	else
	{
		return FALSE;
	}

	dwSize=0;
	dwSize = sizeof(Smsc9xW.Wins);

	lRet = RegQueryValueEx(HKEY_LOCAL_MACHINE,
						TEXT("WINS"),
						(LPDWORD)TEXT("Comm\\SMC90001\\Parms\\TcpIp"),
						&dwType,
						(BYTE *)Smsc9xW.Wins,
						&dwSize);

	if (lRet == ERROR_SUCCESS)
	{
		//RETAILMSG(1,(L" Smsc9xW.Dns = %s \r\n",Smsc9xW.Wins));
	}
	else
	{
		return FALSE;
	}

	return TRUE;

}


BOOL UpdateSmscRegistry()
{
	int i=0;
	FILE *hFFX;
	FILE *hFFX1;

	DWORD temp=0;
	DWORD FileSize=0;
	DWORD dwBytesRead=0;

	char  fgetData[257];
	DWORD dwBytesWritten=0;
	char  *pSrch=NULL;

	BOOL  KeyFound = FALSE;
	BOOL  KeyExist = FALSE;

#ifdef DEV_STATUS
	TCHAR TempNameW[256];
#endif
	DWORD TempLen;


	DEBUGMSG(1,(L" UpdateAdsLoadRegistry : Entry \r\n"));

	hFFX = fopen(fLoadReg,"r+t");

	if (hFFX == NULL) 
	{
		RETAILMSG(1,(L" Could not open File %s.\r\n",fLoadRegW));
		return FALSE;
	} 

	hFFX1 = fopen(fxLoadReg,"w+t");

	if (hFFX1 == NULL) 
	{
		RETAILMSG(1,(L" Could not open Flash FFX1.\r\n"));
		return FALSE;
	} 

	
	while( !feof( hFFX ) )
	{
		if( fgets(fgetData,256,hFFX) == NULL)
		{
			break;
			DEBUGMSG(1,(L"fgets error \r\n" ));
		}
		else
		{
			TempLen=strlen(fgetData);

			if(fgetData[0] == ';')
			{
				//dwBytesWritten = fwrite( fgetData, sizeof( char ), TempLen, hFFX1 );			
				fprintf( hFFX1, "%s",fgetData);

#ifdef DEV_STATUS
				atow(fgetData,TempNameW,TempLen);
				RETAILMSG(1,(L"%s\r\n", TempNameW));
#endif

				continue;
			}

			pSrch = strstr( fgetData, SmscRegKey);

			if( pSrch != NULL)	// if it is Registry Key
			{
				fprintf( hFFX1, "%s",fgetData);
				KeyFound = TRUE;
				KeyExist = TRUE;

				continue;
			}

			if(fgetData[0] == '[')	// if start Another Key, stop
				KeyFound = FALSE;

			if(KeyFound)
			{
				// 1. Find "EnableDHCP"
				pSrch = strstr( fgetData, sDhcp);
				if( pSrch != NULL)	// if it is calibration data
				{
					fprintf( hFFX1, "\"%s\"=dword:%s\n",sDhcp,Smsc9x.Dhcp);
					continue;
				}
				// 2. find "IpAddress"
				pSrch = strstr( fgetData, sIp);
				if( pSrch != NULL)	// if it is calibration data
				{
					fprintf( hFFX1, "\"%s\"=\"%s\"\n",sIp,Smsc9x.Ip);
					continue;
				}

				// 3. find "DefaultGateway"
				pSrch = strstr( fgetData, sGw);
				if( pSrch != NULL)	// if it is calibration data
				{
					fprintf( hFFX1, "\"%s\"=\"%s\"\n",sGw,Smsc9x.Gw);
					continue;
				}

				// 4. find "Subnetmask"
				pSrch = strstr( fgetData, sSm);
				if( pSrch != NULL)	// if it is calibration data
				{
					fprintf( hFFX1, "\"%s\"=\"%s\"\n",sSm,Smsc9x.Sm);
					continue;
				}

				// 5. find "DNS"
				pSrch = strstr( fgetData, sDns);
				if( pSrch != NULL)	// if it is calibration data
				{
					fprintf( hFFX1, "\"%s\"=\"%s\"\n",sDns,Smsc9x.Dns);
					continue;
				}

				// 6. find "WINS"
				pSrch = strstr( fgetData, sWins);
				if( pSrch != NULL)	// if it is calibration data
				{
					fprintf( hFFX1, "\"%s\"=\"%s\"\n",sWins,Smsc9x.Wins);
					continue;
				}

			}

			//dwBytesWritten = fwrite( fgetData, sizeof( char ), TempLen, hFFX1 );					
			fprintf( hFFX1, "%s",fgetData);


#ifdef DEV_STATUS
			atow(fgetData,TempNameW,TempLen);
			RETAILMSG(1,(L"%s\r\n", TempNameW));
#endif

		}
	}

	if( !KeyExist)	// if key doesn't exist, create keys
	{
		fprintf( hFFX1, "\n%s\n",SmscRegKey);
		// 1. Find "EnableDHCP"
		fprintf( hFFX1, "\"%s\"=dword:%s\n",sDhcp,Smsc9x.Dhcp);
		// 2. find "IpAddress"
		fprintf( hFFX1, "\"%s\"=\"%s\"\n",sIp,Smsc9x.Ip);
		// 3. find "DefaultGateway"
		fprintf( hFFX1, "\"%s\"=\"%s\"\n",sGw,Smsc9x.Gw);
		// 4. find "Subnetmask"
		fprintf( hFFX1, "\"%s\"=\"%s\"\n",sSm,Smsc9x.Sm);
		// 5. find "DNS"
		fprintf( hFFX1, "\"%s\"=\"%s\"\n",sDns,Smsc9x.Dns);
		// 6. find "WINS"
		fprintf( hFFX1, "\"%s\"=\"%s\"\n",sWins,Smsc9x.Wins);
	}

	fclose(hFFX);
	fclose(hFFX1);

	DEBUGMSG(1,(L" UpdateAdsLoadRegistry : End \r\n"));

	return TRUE;
}

void DeleteTempRegistryFile()
{
	DeleteFile(fxLoadRegW);
	DeleteFile(fLoadRegW);
}

void WideToCharRegistry()
{
	int LenW;

	LenW = wcslen(Smsc9xW.Dhcp);
	wtoa(Smsc9xW.Dhcp,Smsc9x.Dhcp,LenW);

	LenW = wcslen(Smsc9xW.Ip);
	wtoa(Smsc9xW.Ip,Smsc9x.Ip,LenW);

	LenW = wcslen(Smsc9xW.Gw);
	wtoa(Smsc9xW.Gw,Smsc9x.Gw,LenW);

	LenW = wcslen(Smsc9xW.Sm);
	wtoa(Smsc9xW.Sm,Smsc9x.Sm,LenW);

	LenW = wcslen(Smsc9xW.Dns);
	wtoa(Smsc9xW.Dns,Smsc9x.Dns,LenW);

	LenW = wcslen(Smsc9xW.Wins);
	wtoa(Smsc9xW.Wins,Smsc9x.Wins,LenW);

}

void wtoa(TCHAR *loveW, char *love, int lenw)
{
	char *temp =(char *)loveW ;
	char *pTarget=love;
/*
	while(*temp)
	{
		*pTarget++ = *temp++;
		temp ++;
	}
*/
	for(int i=0;i<lenw;i++)
	{
		if(*temp)
		{
			*pTarget++ = *temp++;
			temp ++;
		}
	}
}