mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1347 lines
41 KiB
1347 lines
41 KiB
// Import.cpp: implementation of the CISPImport class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
//#include "stdafx.h"
|
|
//#include "appdefs.h"
|
|
//#include "icwhelp.h"
|
|
#include "import.h"
|
|
#include "rnaapi.h"
|
|
|
|
#ifdef DBG
|
|
#undef THIS_FILE
|
|
static CHAR THIS_FILE[]=__FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
#pragma data_seg(".rdata")
|
|
|
|
WCHAR cszEntrySection[] = L"Entry";
|
|
WCHAR cszAlias[] = L"Import_Name";
|
|
WCHAR cszML[] = L"Multilink";
|
|
|
|
WCHAR cszPhoneSection[] = L"Phone";
|
|
WCHAR cszDialAsIs[] = L"Dial_As_Is";
|
|
WCHAR cszPhone[] = L"Phone_Number";
|
|
WCHAR cszISDN[] = L"ISDN_Number";
|
|
WCHAR cszAreaCode[] = L"Area_Code";
|
|
WCHAR cszCountryCode[] = L"Country_Code";
|
|
WCHAR cszCountryID[] = L"Country_ID";
|
|
|
|
WCHAR cszDeviceSection[] = L"Device";
|
|
WCHAR cszDeviceType[] = L"Type";
|
|
WCHAR cszDeviceName[] = L"Name";
|
|
WCHAR cszDevCfgSize[] = L"Settings_Size";
|
|
WCHAR cszDevCfg[] = L"Settings";
|
|
|
|
WCHAR cszServerSection[] = L"Server";
|
|
WCHAR cszServerType[] = L"Type";
|
|
WCHAR cszSWCompress[] = L"SW_Compress";
|
|
WCHAR cszPWEncrypt[] = L"PW_Encrypt";
|
|
WCHAR cszNetLogon[] = L"Network_Logon";
|
|
WCHAR cszSWEncrypt[] = L"SW_Encrypt";
|
|
WCHAR cszNetBEUI[] = L"Negotiate_NetBEUI";
|
|
WCHAR cszIPX[] = L"Negotiate_IPX/SPX";
|
|
WCHAR cszIP[] = L"Negotiate_TCP/IP";
|
|
WCHAR cszDisableLcp[] = L"Disable_LCP";
|
|
|
|
WCHAR cszIPSection[] = L"TCP/IP";
|
|
WCHAR cszIPSpec[] = L"Specify_IP_Address";
|
|
WCHAR cszIPAddress[] = L"IP_address";
|
|
WCHAR cszServerSpec[] = L"Specify_Server_Address";
|
|
WCHAR cszDNSAddress[] = L"DNS_address";
|
|
WCHAR cszDNSAltAddress[] = L"DNS_Alt_address";
|
|
WCHAR cszWINSAddress[] = L"WINS_address";
|
|
WCHAR cszWINSAltAddress[] = L"WINS_Alt_address";
|
|
WCHAR cszIPCompress[] = L"IP_Header_Compress";
|
|
WCHAR cszWanPri[] = L"Gateway_On_Remote";
|
|
|
|
WCHAR cszMLSection[] = L"Multilink";
|
|
WCHAR cszLinkIndex[] = L"Line_%s";
|
|
|
|
WCHAR cszScriptingSection[] = L"Scripting";
|
|
WCHAR cszScriptName[] = L"Name";
|
|
|
|
WCHAR cszScriptSection[] = L"Script_File";
|
|
|
|
WCHAR cszYes[] = L"yes";
|
|
WCHAR cszNo[] = L"no";
|
|
|
|
WCHAR cszUserSection[] = L"User";
|
|
WCHAR cszUserName[] = L"Name";
|
|
WCHAR cszPassword[] = L"Password";
|
|
|
|
WCHAR szNull[] = L"";
|
|
|
|
WCHAR cszSupport[] = L"Support";
|
|
WCHAR cszSupportNumber[] = L"SupportPhoneNumber";
|
|
|
|
SERVER_TYPES aServerTypes[] =
|
|
{
|
|
{L"PPP", RASFP_Ppp, 0 },
|
|
{L"SLIP", RASFP_Slip, 0 },
|
|
{L"CSLIP", RASFP_Slip, RASEO_IpHeaderCompression },
|
|
{L"RAS", RASFP_Ras, 0 }
|
|
};
|
|
|
|
|
|
#pragma data_seg()
|
|
|
|
|
|
WCHAR g_szDeviceName[RAS_MaxDeviceName + 1] = L"\0"; //holds the user's modem choice when multiple
|
|
WCHAR g_szDeviceType[RAS_MaxDeviceType + 1] = L"\0"; // modems are installed
|
|
#define ISIGNUP_KEY L"Software\\Microsoft\\ISIGNUP"
|
|
#define DEVICENAMEKEY L"DeviceName"
|
|
#define DEVICETYPEKEY L"DeviceType"
|
|
|
|
static const WCHAR cszInetcfg[] = L"Inetcfg.dll";
|
|
static const CHAR cszSetAutoProxyConnectoid[] = "SetAutoProxyConnectoid";
|
|
typedef HRESULT (WINAPI * SETAUTOPROXYCONNECTOID) (IN BOOL bEnable);
|
|
extern int FIsDigit( int c );
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CISPImport::CISPImport()
|
|
{
|
|
|
|
m_szDeviceName[0] = L'\0';
|
|
m_szDeviceType[0] = L'\0';
|
|
m_szConnectoidName[0] = L'\0';
|
|
m_bIsISDNDevice = FALSE;
|
|
}
|
|
|
|
CISPImport::~CISPImport()
|
|
{
|
|
// Clean up the registry
|
|
DeleteUserDeviceSelection(DEVICENAMEKEY);
|
|
DeleteUserDeviceSelection(DEVICETYPEKEY);
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
// DWORD NEAR PASCAL StrToip (LPWSTR szIPAddress, LPDWORD lpdwAddr)
|
|
//
|
|
// This function converts a IP address string to an IP address structure.
|
|
//
|
|
// History:
|
|
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
|
|
// Cloned from SMMSCRPT.
|
|
// 1/9/98 DONALDM adapted from ICWCONN1
|
|
//+----------------------------------------------------------------------------
|
|
LPCWSTR NEAR PASCAL StrToSubip (LPCWSTR szIPAddress, LPBYTE pVal)
|
|
{
|
|
LPCWSTR pszIP = szIPAddress;
|
|
|
|
*pVal = (BYTE)Sz2W(pszIP);
|
|
// skip over digits
|
|
while (FIsDigit(*pszIP))
|
|
{
|
|
++pszIP;
|
|
}
|
|
|
|
// skip over one or more separators
|
|
while (*pszIP && !FIsDigit(*pszIP))
|
|
{
|
|
++pszIP;
|
|
}
|
|
|
|
return pszIP;
|
|
}
|
|
|
|
|
|
DWORD NEAR PASCAL StrToip (LPCWSTR szIPAddress, RASIPADDR FAR *ipAddr)
|
|
{
|
|
LPCWSTR pszIP = szIPAddress;
|
|
|
|
pszIP = StrToSubip(pszIP, &ipAddr->a);
|
|
pszIP = StrToSubip(pszIP, &ipAddr->b);
|
|
pszIP = StrToSubip(pszIP, &ipAddr->c);
|
|
pszIP = StrToSubip(pszIP, &ipAddr->d);
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
|
|
//****************************************************************************
|
|
// DWORD NEAR PASCAL ImportPhoneInfo(PPHONENUM ppn, LPCWSTR szFileName)
|
|
//
|
|
// This function imports the phone number.
|
|
//
|
|
// History:
|
|
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
DWORD NEAR PASCAL ImportPhoneInfo(LPRASENTRY lpRasEntry, LPCWSTR szFileName, BOOL bISDN)
|
|
{
|
|
WCHAR szYesNo[MAXNAME];
|
|
|
|
if (!GetPrivateProfileString(cszPhoneSection,
|
|
(bISDN ? cszISDN : cszPhone),
|
|
szNull,
|
|
lpRasEntry->szLocalPhoneNumber,
|
|
MAX_CHARS_IN_BUFFER(lpRasEntry->szLocalPhoneNumber),
|
|
szFileName))
|
|
{
|
|
// If the ISDN_Number is empty, we read from the Phone_Number
|
|
GetPrivateProfileString(cszPhoneSection,
|
|
cszPhone,
|
|
DUN_NOPHONENUMBER,
|
|
lpRasEntry->szLocalPhoneNumber,
|
|
MAX_CHARS_IN_BUFFER(lpRasEntry->szLocalPhoneNumber),
|
|
szFileName);
|
|
}
|
|
|
|
lpRasEntry->dwfOptions &= ~RASEO_UseCountryAndAreaCodes;
|
|
|
|
GetPrivateProfileString(cszPhoneSection,
|
|
cszDialAsIs,
|
|
cszYes,
|
|
szYesNo,
|
|
MAX_CHARS_IN_BUFFER(szYesNo),
|
|
szFileName);
|
|
|
|
// Do we have to get country code and area code?
|
|
//
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
|
|
// If we cannot get the country ID or it is zero, default to dial as is
|
|
//
|
|
if ((lpRasEntry->dwCountryID = GetPrivateProfileInt(cszPhoneSection,
|
|
cszCountryID,
|
|
0,
|
|
szFileName)) != 0)
|
|
{
|
|
lpRasEntry->dwCountryCode = GetPrivateProfileInt(cszPhoneSection,
|
|
cszCountryCode,
|
|
1,
|
|
szFileName);
|
|
|
|
if (GetPrivateProfileString(cszPhoneSection,
|
|
cszAreaCode,
|
|
szNull,
|
|
lpRasEntry->szAreaCode,
|
|
MAX_CHARS_IN_BUFFER(lpRasEntry->szAreaCode),
|
|
szFileName) != 0)
|
|
{
|
|
lpRasEntry->dwfOptions |= RASEO_UseCountryAndAreaCodes;
|
|
}
|
|
}
|
|
}
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// DWORD NEAR PASCAL ImportServerInfo(PSMMINFO psmmi, LPWSTR szFileName)
|
|
//
|
|
// This function imports the server type name and settings.
|
|
//
|
|
// History:
|
|
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
DWORD NEAR PASCAL ImportServerInfo(LPRASENTRY lpRasEntry, LPCWSTR szFileName)
|
|
{
|
|
WCHAR szYesNo[MAXNAME];
|
|
WCHAR szType[MAXNAME];
|
|
DWORD i;
|
|
|
|
// Get the server type name
|
|
//
|
|
GetPrivateProfileString(cszServerSection,
|
|
cszServerType,
|
|
szNull,
|
|
szType,
|
|
MAX_CHARS_IN_BUFFER(szType),
|
|
szFileName);
|
|
|
|
// need to convert the string into
|
|
// one of the following values
|
|
// RASFP_Ppp
|
|
// RASFP_Slip Note CSLIP is SLIP with IP compression on
|
|
// RASFP_Ras
|
|
|
|
for (i = 0; i < NUM_SERVER_TYPES; ++i)
|
|
{
|
|
if (!lstrcmpi(aServerTypes[i].szType, szType))
|
|
{
|
|
lpRasEntry->dwFramingProtocol = aServerTypes[i].dwType;
|
|
lpRasEntry->dwfOptions |= aServerTypes[i].dwfOptions;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Get the server type settings
|
|
//
|
|
if (GetPrivateProfileString(cszServerSection,
|
|
cszSWCompress,
|
|
szNull,
|
|
szYesNo,
|
|
MAX_CHARS_IN_BUFFER(szYesNo),
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_SwCompression;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions |= RASEO_SwCompression;
|
|
};
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszServerSection,
|
|
cszPWEncrypt,
|
|
szNull,
|
|
szYesNo,
|
|
MAX_CHARS_IN_BUFFER(szYesNo),
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_RequireEncryptedPw;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions |= RASEO_RequireEncryptedPw;
|
|
};
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszServerSection,
|
|
cszNetLogon,
|
|
szNull,
|
|
szYesNo,
|
|
MAX_CHARS_IN_BUFFER(szYesNo),
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_NetworkLogon;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions |= RASEO_NetworkLogon;
|
|
};
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszServerSection,
|
|
cszSWEncrypt,
|
|
szNull,
|
|
szYesNo,
|
|
MAX_CHARS_IN_BUFFER(szYesNo),
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_RequireDataEncryption;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions |= RASEO_RequireDataEncryption;
|
|
};
|
|
};
|
|
|
|
// Get the protocol settings
|
|
//
|
|
if (GetPrivateProfileString(cszServerSection,
|
|
cszNetBEUI,
|
|
szNull,
|
|
szYesNo,
|
|
MAX_CHARS_IN_BUFFER(szYesNo),
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfNetProtocols &= ~RASNP_NetBEUI;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfNetProtocols |= RASNP_NetBEUI;
|
|
};
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszServerSection,
|
|
cszIPX,
|
|
szNull,
|
|
szYesNo,
|
|
MAX_CHARS_IN_BUFFER(szYesNo),
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfNetProtocols &= ~RASNP_Ipx;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfNetProtocols |= RASNP_Ipx;
|
|
};
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszServerSection,
|
|
cszIP,
|
|
szNull,
|
|
szYesNo,
|
|
MAX_CHARS_IN_BUFFER(szYesNo),
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfNetProtocols &= ~RASNP_Ip;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfNetProtocols |= RASNP_Ip;
|
|
};
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszServerSection,
|
|
cszDisableLcp,
|
|
szNull,
|
|
szYesNo,
|
|
MAX_CHARS_IN_BUFFER(szYesNo),
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszYes))
|
|
{
|
|
lpRasEntry->dwfOptions |= RASEO_DisableLcpExtensions;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_DisableLcpExtensions;
|
|
}
|
|
};
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// DWORD NEAR PASCAL ImportIPInfo(LPWSTR szEntryName, LPWSTR szFileName)
|
|
//
|
|
// This function imports the TCP/IP information
|
|
//
|
|
// History:
|
|
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
DWORD NEAR PASCAL ImportIPInfo(LPRASENTRY lpRasEntry, LPCWSTR szFileName)
|
|
{
|
|
WCHAR szIPAddr[MAXIPADDRLEN];
|
|
WCHAR szYesNo[MAXNAME];
|
|
|
|
// Import IP address information
|
|
//
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszIPSpec,
|
|
szNull,
|
|
szYesNo,
|
|
MAX_CHARS_IN_BUFFER(szYesNo),
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszYes))
|
|
{
|
|
// The import file has IP address specified, get the IP address
|
|
//
|
|
lpRasEntry->dwfOptions |= RASEO_SpecificIpAddr;
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszIPAddress,
|
|
szNull,
|
|
szIPAddr,
|
|
MAX_CHARS_IN_BUFFER(szIPAddr),
|
|
szFileName))
|
|
{
|
|
StrToip (szIPAddr, &lpRasEntry->ipaddr);
|
|
};
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_SpecificIpAddr;
|
|
};
|
|
};
|
|
|
|
// Import Server address information
|
|
//
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszServerSpec,
|
|
szNull,
|
|
szYesNo,
|
|
MAX_CHARS_IN_BUFFER(szYesNo),
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszYes))
|
|
{
|
|
// The import file has server address specified, get the server address
|
|
//
|
|
lpRasEntry->dwfOptions |= RASEO_SpecificNameServers;
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszDNSAddress,
|
|
szNull,
|
|
szIPAddr,
|
|
MAX_CHARS_IN_BUFFER(szIPAddr),
|
|
szFileName))
|
|
{
|
|
StrToip (szIPAddr, &lpRasEntry->ipaddrDns);
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszDNSAltAddress,
|
|
szNull,
|
|
szIPAddr,
|
|
MAX_CHARS_IN_BUFFER(szIPAddr),
|
|
szFileName))
|
|
{
|
|
StrToip (szIPAddr, &lpRasEntry->ipaddrDnsAlt);
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszWINSAddress,
|
|
szNull,
|
|
szIPAddr,
|
|
MAX_CHARS_IN_BUFFER(szIPAddr),
|
|
szFileName))
|
|
{
|
|
StrToip (szIPAddr, &lpRasEntry->ipaddrWins);
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszWINSAltAddress,
|
|
szNull,
|
|
szIPAddr,
|
|
MAX_CHARS_IN_BUFFER(szIPAddr),
|
|
szFileName))
|
|
{
|
|
StrToip (szIPAddr, &lpRasEntry->ipaddrWinsAlt);
|
|
};
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_SpecificNameServers;
|
|
};
|
|
};
|
|
|
|
// Header compression and the gateway settings
|
|
//
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszIPCompress,
|
|
szNull,
|
|
szYesNo,
|
|
MAX_CHARS_IN_BUFFER(szYesNo),
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_IpHeaderCompression;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions |= RASEO_IpHeaderCompression;
|
|
};
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszWanPri,
|
|
szNull,
|
|
szYesNo,
|
|
MAX_CHARS_IN_BUFFER(szYesNo),
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_RemoteDefaultGateway;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions |= RASEO_RemoteDefaultGateway;
|
|
};
|
|
};
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// HANDLE NEAR PASCAL CreateUniqueFile(LPWSTR szPath, LPWSTR szFile)
|
|
//
|
|
// This function creates a unique file. If the file already exists, it will
|
|
// try to create a file with similar name and return the name.
|
|
//
|
|
// History:
|
|
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
HANDLE NEAR PASCAL CreateUniqueFile(LPWSTR szPath, LPWSTR szScript)
|
|
{
|
|
HANDLE hFile;
|
|
|
|
LPWSTR pszSuffix, lpsz;
|
|
UINT uSuffix;
|
|
|
|
pszSuffix = szPath + lstrlen(szPath);
|
|
|
|
lpsz = CharPrev(szPath, pszSuffix);
|
|
|
|
if (*lpsz != L'\\')
|
|
{
|
|
*pszSuffix = L'\\';
|
|
pszSuffix++;
|
|
};
|
|
lstrcpy(pszSuffix, szScript);
|
|
|
|
// Try the specified filename
|
|
//
|
|
hFile = CreateFile(szPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
|
|
FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
|
|
// If the file exists
|
|
//
|
|
if ((hFile == INVALID_HANDLE_VALUE) && (GetLastError() == ERROR_FILE_EXISTS))
|
|
{
|
|
WCHAR szNewName[MAX_PATH];
|
|
|
|
// Need to copy it to another name in the same directory
|
|
//
|
|
if (LoadString(NULL, IDS_DEFAULT_SCP, szNewName, MAX_CHARS_IN_BUFFER(szNewName)))
|
|
{
|
|
// Increment the file index until a non-duplicated file can be created
|
|
//
|
|
uSuffix = 0;
|
|
do
|
|
{
|
|
wsprintf(pszSuffix, szNewName, uSuffix);
|
|
uSuffix++;
|
|
hFile = CreateFile(szPath, GENERIC_WRITE, 0, NULL, CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
}
|
|
while ((hFile == INVALID_HANDLE_VALUE) &&
|
|
(GetLastError() == ERROR_FILE_EXISTS) &&
|
|
(uSuffix < 0x0000FFFF));
|
|
};
|
|
};
|
|
|
|
// If we do not have the file, reserve the pathname
|
|
//
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
*pszSuffix = L'\0';
|
|
};
|
|
return hFile;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// HANDLE NEAR PASCAL CreateScriptFile(LPWSTR szScript, LPWSTR szImportFile)
|
|
//
|
|
// This function creates the script file
|
|
//
|
|
// History:
|
|
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
HANDLE NEAR PASCAL CreateScriptFile(LPWSTR szScript, LPCWSTR szImportFile)
|
|
{
|
|
LPWSTR pszPath, pszShortName;
|
|
LPWSTR pszDir;
|
|
DWORD cb;
|
|
HANDLE hFile;
|
|
|
|
// Assume failure
|
|
//
|
|
hFile = INVALID_HANDLE_VALUE;
|
|
|
|
// Allocate a buffer for pathname
|
|
//
|
|
if ((pszPath = (LPWSTR)GlobalAlloc(GPTR, (2*MAX_PATH)*sizeof(WCHAR))) == NULL)
|
|
{
|
|
////TraceMsg(TF_GENERAL, L"CONNECT:CreateScriptFile(): Local Alloc failed\n");
|
|
return hFile;
|
|
}
|
|
pszShortName = pszPath+MAX_PATH;
|
|
|
|
// Get the default directory
|
|
//
|
|
if (GetWindowsDirectory(pszPath, MAX_PATH) != 0)
|
|
{
|
|
// Get the Windows drive
|
|
//
|
|
pszDir = pszPath;
|
|
while((*pszDir != L'\\') && (*pszDir != L'\0'))
|
|
{
|
|
pszDir = CharNext(pszDir);
|
|
};
|
|
|
|
// Did we find Windows drive?
|
|
//
|
|
if (*pszDir != L'\0')
|
|
{
|
|
// Prepare the drive
|
|
//
|
|
cb = (DWORD)(pszDir - pszPath);
|
|
MyMemCpy((LPBYTE) szScript, (const LPBYTE) pszPath, (size_t) cb);
|
|
pszDir = szScript + cb;
|
|
|
|
// Get the script filename
|
|
//
|
|
if (GetPrivateProfileString(cszScriptingSection,
|
|
cszScriptName,
|
|
szNull,
|
|
pszShortName,
|
|
MAX_PATH,
|
|
szImportFile) != 0)
|
|
{
|
|
// Try the favorite script directory
|
|
//
|
|
if (LoadString(NULL, IDS_INI_SCRIPT_DIR, pszDir,
|
|
(MAX_PATH - cb)) != 0)
|
|
{
|
|
// Try creating the file
|
|
//
|
|
hFile = CreateUniqueFile(szScript, pszShortName);
|
|
};
|
|
|
|
// If we do not have the file yet, try the second favorite
|
|
//
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
if (LoadString(NULL/*_Module.GetModuleInstance()*/, IDS_INI_SCRIPT_SHORTDIR, pszDir,
|
|
(MAX_PATH - cb)))
|
|
{
|
|
// Try creating the file
|
|
//
|
|
hFile = CreateUniqueFile(szScript, pszShortName);
|
|
};
|
|
};
|
|
|
|
// If we do not have the file yet, try Windows directory
|
|
//
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
// Get original Windows directory
|
|
//
|
|
lstrcpy(szScript, pszPath);
|
|
|
|
// Try one more time
|
|
//
|
|
hFile = CreateUniqueFile(szScript, pszShortName);
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
GlobalFree(pszPath);
|
|
return hFile;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// DWORD NEAR PASCAL ImportScriptFile(LPWSTR szEntryName, LPWSTR szImportFile)
|
|
//
|
|
// This function imports the script file
|
|
//
|
|
// History:
|
|
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
DWORD NEAR PASCAL ImportScriptFile(LPRASENTRY lpRasEntry, LPCWSTR szImportFile)
|
|
{
|
|
HANDLE hfScript;
|
|
LPWSTR pszLine;
|
|
LPWSTR pszFile;
|
|
int i, iMaxLine = 0;
|
|
UINT cbSize, cbRet;
|
|
WCHAR szTmp[4];
|
|
DWORD dwRet;
|
|
|
|
dwRet=ERROR_SUCCESS;
|
|
|
|
// If a script section does not exist, do nothing
|
|
//
|
|
if (GetPrivateProfileString(cszScriptingSection,
|
|
cszScriptName,
|
|
szNull,
|
|
szTmp,
|
|
MAX_CHARS_IN_BUFFER(szTmp),
|
|
szImportFile) == 0)
|
|
{
|
|
return ERROR_SUCCESS;
|
|
};
|
|
|
|
// Allocate a buffer for the script lines
|
|
//
|
|
if ((pszLine = (LPWSTR)GlobalAlloc(LMEM_FIXED, (SIZE_ReadBuf+MAX_PATH)*sizeof(WCHAR)))
|
|
== NULL)
|
|
{
|
|
//TraceMsg(TF_GENERAL, L"CONNECT:ImportScriptFile(): Local Alloc failed\n");
|
|
return ERROR_OUTOFMEMORY;
|
|
}
|
|
|
|
// Look for script
|
|
//
|
|
if (GetPrivateProfileString(cszScriptSection,
|
|
NULL,
|
|
szNull,
|
|
pszLine,
|
|
SIZE_ReadBuf,
|
|
szImportFile) != 0)
|
|
{
|
|
// Get the maximum line number
|
|
//
|
|
pszFile = pszLine;
|
|
iMaxLine = -1;
|
|
while (*pszFile)
|
|
{
|
|
i = Sz2W(pszFile);
|
|
iMaxLine = max(iMaxLine, i);
|
|
pszFile += lstrlen(pszFile)+1;
|
|
};
|
|
|
|
// If we have at least one line, we will import the script file
|
|
//
|
|
if (iMaxLine >= 0)
|
|
{
|
|
pszFile = pszLine+SIZE_ReadBuf;
|
|
|
|
// Create the script file
|
|
//
|
|
//DebugBreak();
|
|
hfScript = CreateScriptFile(pszFile, szImportFile);
|
|
//TraceMsg(TF_GENERAL, "CONNECT:ImportScriptFile(): CreateScriptFile hfScript %d, %s, %s\n", hfScript, pszFile,szImportFile);
|
|
|
|
if (hfScript != INVALID_HANDLE_VALUE)
|
|
{
|
|
WCHAR szLineNum[MAXLONGLEN+1];
|
|
|
|
// From The first line to the last line
|
|
//
|
|
for (i = 0; i <= iMaxLine; i++)
|
|
{
|
|
// Read the script line
|
|
//
|
|
wsprintf(szLineNum, L"%d", i);
|
|
if ((cbSize = GetPrivateProfileString(cszScriptSection,
|
|
szLineNum,
|
|
szNull,
|
|
pszLine,
|
|
SIZE_ReadBuf,
|
|
szImportFile)) != 0)
|
|
{
|
|
// Write to the script file
|
|
//
|
|
lstrcat(pszLine, L"\x0d\x0a");
|
|
WriteFile(hfScript, pszLine, cbSize+2, (LPDWORD)&cbRet, NULL);
|
|
};
|
|
};
|
|
|
|
CloseHandle(hfScript);
|
|
|
|
// Associate it with the phonebook entry
|
|
//
|
|
lstrcpyn(lpRasEntry->szScript, pszFile, RAS_MaxEntryName);
|
|
}
|
|
else
|
|
{
|
|
dwRet = GetLastError();
|
|
};
|
|
}
|
|
else
|
|
{
|
|
dwRet = ERROR_PATH_NOT_FOUND;
|
|
};
|
|
}
|
|
else
|
|
{
|
|
dwRet = ERROR_PATH_NOT_FOUND;
|
|
};
|
|
GlobalFree(pszLine);
|
|
|
|
return dwRet;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// DWORD WINAPI RnaValidateImportEntry (LPWSTR)
|
|
//
|
|
// This function is called to validate an importable file
|
|
//
|
|
// History:
|
|
// Wed 03-Jan-1996 09:45:01 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
DWORD CISPImport::RnaValidateImportEntry (LPCWSTR szFileName)
|
|
{
|
|
WCHAR szTmp[4];
|
|
|
|
// Get the alias entry name
|
|
//
|
|
return (GetPrivateProfileString(cszEntrySection,
|
|
cszEntry_Name,
|
|
szNull,
|
|
szTmp,
|
|
MAX_CHARS_IN_BUFFER(szTmp),
|
|
szFileName) > 0 ?
|
|
ERROR_SUCCESS : ERROR_CORRUPT_PHONEBOOK);
|
|
}
|
|
|
|
//****************************************************************************
|
|
// HRESULT ImportConnection (LPCWSTR szFileName, LPWSTR pszEntryName, LPWSTR pszUserName, LPWSTR pszPassword)
|
|
//
|
|
// This function is called to import an entry from a specified file
|
|
//
|
|
// History:
|
|
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
// Sat 16-Mar-1996 10:01:00 -by- Chris Kauffman [chrisk]
|
|
// Modified to return HRESULT and load DLL dynamically
|
|
//****************************************************************************
|
|
|
|
HRESULT CISPImport::ImportConnection (LPCWSTR szFileName, LPWSTR pszSupportNumber, LPWSTR pszEntryName, LPWSTR pszUserName, LPWSTR pszPassword, LPBOOL pfNeedsRestart)
|
|
{
|
|
LPRASENTRY lpRasEntry;
|
|
DWORD dwRet;
|
|
DWORD dwOptions;
|
|
//HINSTANCE hinetcfg;
|
|
//FARPROC fp, fpSetAutoProxy;
|
|
RNAAPI Rnaapi;
|
|
|
|
// Get the size of device configuration
|
|
// This also validates an exported file
|
|
//
|
|
if ((dwRet = RnaValidateImportEntry(szFileName)) != ERROR_SUCCESS)
|
|
{
|
|
return dwRet;
|
|
};
|
|
|
|
// Allocate a buffer for entry and device config
|
|
//
|
|
if ((lpRasEntry = (LPRASENTRY)GlobalAlloc(GPTR, sizeof(RASENTRY))) == NULL)
|
|
{
|
|
return ERROR_OUTOFMEMORY;
|
|
};
|
|
|
|
// Get the entry name
|
|
// Need to find a good name for it and remember it as an alias
|
|
//
|
|
GetPrivateProfileString(cszEntrySection,
|
|
cszEntry_Name,
|
|
szNull,
|
|
pszEntryName,
|
|
RAS_MaxEntryName+1,
|
|
szFileName);
|
|
|
|
GetPrivateProfileString(cszUserSection,
|
|
cszUserName,
|
|
szNull,
|
|
pszUserName,
|
|
UNLEN+1,
|
|
szFileName);
|
|
|
|
GetPrivateProfileString(cszUserSection,
|
|
cszPassword,
|
|
szNull,
|
|
pszPassword,
|
|
PWLEN+1,
|
|
szFileName);
|
|
|
|
// Get ISP support number
|
|
//
|
|
GetPrivateProfileString(cszSupport,
|
|
cszSupportNumber,
|
|
szNull,
|
|
pszSupportNumber,
|
|
RAS_MaxAreaCode + RAS_MaxPhoneNumber +1,
|
|
szFileName);
|
|
|
|
// Get device name, type and config
|
|
//
|
|
GetPrivateProfileString(cszDeviceSection,
|
|
cszDeviceType,
|
|
szNull,
|
|
lpRasEntry->szDeviceType,
|
|
MAX_CHARS_IN_BUFFER(lpRasEntry->szDeviceType),
|
|
szFileName);
|
|
|
|
// Get Server Type settings
|
|
//
|
|
ImportServerInfo(lpRasEntry, szFileName);
|
|
|
|
// Get IP address
|
|
//
|
|
ImportIPInfo(lpRasEntry, szFileName);
|
|
|
|
// Import the script file
|
|
//
|
|
if ((dwRet = ImportScriptFile(lpRasEntry, szFileName)) != ERROR_SUCCESS)
|
|
{
|
|
//TraceMsg(TF_GENERAL, L"CONNECT:ImportScriptFile Failed with the error %d, %s,%s",dwRet,szFileName,lpRasEntry->szScript);
|
|
}
|
|
|
|
lpRasEntry->dwSize = sizeof(RASENTRY);
|
|
|
|
// Load and Locate AutoRunSignUpWizard entry point
|
|
//
|
|
|
|
//hinetcfg = LoadLibrary(L"INETCFG.DLL");
|
|
/*
|
|
//AssertMsg(hinetcfg != NULL, L"Cannot find INETCFG.DLL");
|
|
if (!hinetcfg)
|
|
{
|
|
dwRet = GetLastError();
|
|
goto ImportConnectionExit;
|
|
}
|
|
|
|
fpSetAutoProxy = GetProcAddress(hinetcfg, cszSetAutoProxyConnectoid);
|
|
if (fpSetAutoProxy)
|
|
{
|
|
((SETAUTOPROXYCONNECTOID)fpSetAutoProxy) (FALSE);
|
|
}
|
|
|
|
fp = GetProcAddress(hinetcfg, AUTORUNSIGNUPWIZARDAPI);
|
|
//AssertMsg(fp != NULL, L"Cannot find AutoRunSignupWizard entry point");
|
|
if (!fp)
|
|
{
|
|
dwRet = GetLastError();
|
|
goto ImportConnectionExit;
|
|
}*/
|
|
|
|
// 10/19/96 jmazner Normandy #8462 -- multiple modems
|
|
dwRet = ConfigRasEntryDevice(lpRasEntry);
|
|
switch( dwRet )
|
|
{
|
|
case ERROR_SUCCESS:
|
|
break;
|
|
case ERROR_CANCELLED:
|
|
/*
|
|
if( IDYES != MessageBox(GetActiveWindow(), GetSz(IDS_WANTTOEXIT), GetSz(IDS_TITLE),
|
|
MB_APPLMODAL | MB_ICONQUESTION |
|
|
MB_YESNO | MB_DEFBUTTON2) )
|
|
{
|
|
dwRet = ERROR_RETRY;
|
|
}*/
|
|
goto ImportConnectionExit;
|
|
|
|
default:
|
|
goto ImportConnectionExit;
|
|
}
|
|
|
|
if (lpRasEntry->szDeviceType[0] == TEXT('\0') &&
|
|
lpRasEntry->szDeviceName[0] == TEXT('\0'))
|
|
{
|
|
lstrcpyn(lpRasEntry->szDeviceType, m_szDeviceType, RAS_MaxDeviceType);
|
|
lstrcpyn(lpRasEntry->szDeviceName, m_szDeviceName, RAS_MaxDeviceName);
|
|
}
|
|
|
|
// See if this is a ISDN type device, and if so, then set the CFGFLAG_ISDN_OFFER
|
|
if (lstrcmpi(g_szDeviceType, RASDT_Isdn) == 0)
|
|
m_bIsISDNDevice = TRUE;
|
|
|
|
ImportPhoneInfo(lpRasEntry, szFileName, m_bIsISDNDevice);
|
|
|
|
//
|
|
// ChrisK Olympus 4756 5/25/97
|
|
// Do not display busy animation on Win95
|
|
//
|
|
dwOptions = INETCFG_INSTALLRNA |
|
|
INETCFG_INSTALLTCP |
|
|
INETCFG_OVERWRITEENTRY;
|
|
|
|
dwRet = Rnaapi.InetConfigClientEx(
|
|
NULL,
|
|
NULL,
|
|
pszEntryName,
|
|
lpRasEntry,
|
|
pszUserName,
|
|
pszPassword,
|
|
NULL,
|
|
NULL,
|
|
dwOptions,
|
|
pfNeedsRestart,
|
|
m_szConnectoidName,
|
|
RAS_MaxEntryName+1);
|
|
|
|
//if (fpSetAutoProxy)
|
|
//{
|
|
// ((SETAUTOPROXYCONNECTOID)fpSetAutoProxy) (TRUE);
|
|
//}
|
|
|
|
LclSetEntryScriptPatch(lpRasEntry->szScript, m_szConnectoidName);
|
|
|
|
// now that we've made the connectoid in InetConfigClient (PFNAUTORUNSIGNUPWIZARD),
|
|
// store its name in psheet's global so that we can delete it if user cancels
|
|
//lstrcpyn( m_szConnectoidName, pszEntryName, lstrlen(pszEntryName) + 1);
|
|
lstrcpyn( pszEntryName, m_szConnectoidName, lstrlen(pszEntryName) + 1);
|
|
|
|
//TraceMsg(TF_GENERAL, "CONNECT:EntryName %s, User %s, Password (not shown), Number %s\n", pszEntryName,pszUserName,lpRasEntry->szLocalPhoneNumber);
|
|
//AssertMsg(!fNeedsRestart, L"We have to reboot AGAIN!!");
|
|
|
|
// Exit and cleanup
|
|
//
|
|
|
|
ImportConnectionExit:
|
|
//if (hinetcfg)
|
|
// FreeLibrary(hinetcfg);
|
|
GlobalFree(lpRasEntry);
|
|
return dwRet;
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function GetDeviceSelectedByUser
|
|
//
|
|
// Synopsis Get the name of the RAS device that the user had already picked
|
|
//
|
|
// Arguements szKey - name of sub key
|
|
// szBuf - pointer to buffer
|
|
// dwSize - size of buffer
|
|
//
|
|
// Return TRUE - success
|
|
//
|
|
// History 10/24/96 ChrisK Created
|
|
//-----------------------------------------------------------------------------
|
|
BOOL CISPImport::GetDeviceSelectedByUser (LPWSTR szKey, LPWSTR szBuf, DWORD dwSize)
|
|
{
|
|
BOOL bRC = FALSE;
|
|
HKEY hkey = NULL;
|
|
DWORD dwType = 0;
|
|
|
|
if (ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE, ISIGNUP_KEY, &hkey))
|
|
{
|
|
if (ERROR_SUCCESS == RegQueryValueEx(hkey, szKey, 0,&dwType,
|
|
(LPBYTE)szBuf, &dwSize))
|
|
bRC = TRUE;
|
|
}
|
|
|
|
if (hkey)
|
|
RegCloseKey(hkey);
|
|
return bRC;
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
// Function SetDeviceSelectedByUser
|
|
//
|
|
// Synopsis Write user's device selection to registry
|
|
//
|
|
// Arguments szKey - name of key
|
|
// szBuf - data to write to key
|
|
//
|
|
// Returns TRUE - success
|
|
//
|
|
// History 10/24/96 ChrisK Created
|
|
//-----------------------------------------------------------------------------
|
|
BOOL CISPImport::SetDeviceSelectedByUser (LPWSTR szKey, LPWSTR szBuf)
|
|
{
|
|
BOOL bRC = FALSE;
|
|
HKEY hkey = 0;
|
|
|
|
if (ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE,
|
|
ISIGNUP_KEY, &hkey))
|
|
{
|
|
if (ERROR_SUCCESS == RegSetValueEx(hkey, szKey, 0,REG_SZ,
|
|
(LPBYTE)szBuf, BYTES_REQUIRED_BY_SZ(szBuf)))
|
|
bRC = TRUE;
|
|
}
|
|
|
|
if (hkey)
|
|
RegCloseKey(hkey);
|
|
return bRC;
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
// Funciton DeleteUserDeviceSelection
|
|
//
|
|
// Synopsis Remove registry keys with device selection
|
|
//
|
|
// Arguments szKey - name of value to remove
|
|
//
|
|
// Returns TRUE - success
|
|
//
|
|
// History 10/24/96 ChrisK Created
|
|
//-----------------------------------------------------------------------------
|
|
BOOL CISPImport::DeleteUserDeviceSelection(LPWSTR szKey)
|
|
{
|
|
BOOL bRC = FALSE;
|
|
HKEY hkey = NULL;
|
|
if (ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE, ISIGNUP_KEY, &hkey))
|
|
{
|
|
bRC = (ERROR_SUCCESS == RegDeleteValue(hkey, szKey));
|
|
RegCloseKey(hkey);
|
|
}
|
|
return bRC;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: ConfigRasEntryDevice()
|
|
//
|
|
// Synopsis: Checks whether user has already specified a modem to use;
|
|
// If so, verifies that modem is valid.
|
|
// If not, or if modem is invalid, presents user a dialog
|
|
// to choose which modem to use (if only one modem is installed,
|
|
// it automaticaly selects that device and bypasses the dialog)
|
|
//
|
|
// Arguments: lpRasEntry - Pointer to the RasEntry whose szDeviceName and
|
|
// szDeviceType members you wish to verify/configure
|
|
//
|
|
// Returns: ERROR_CANCELLED - Had to bring up "Choose Modem" dialog, and
|
|
// and user hit its "Cancel" button
|
|
// Otherwise returns any error code encountered.
|
|
// ERROR_SUCCESS indicates success.
|
|
//
|
|
// History: 5/18/96 VetriV Created
|
|
// 3/7/98 DonSc Added the process-wide tracking of the previously
|
|
// selected device.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
DWORD CISPImport::ConfigRasEntryDevice( LPRASENTRY lpRasEntry )
|
|
{
|
|
DWORD dwRet = ERROR_SUCCESS;
|
|
#if 0
|
|
|
|
CEnumModem EnumModem;
|
|
|
|
GetDeviceSelectedByUser(DEVICENAMEKEY, g_szDeviceName, sizeof(g_szDeviceName));
|
|
GetDeviceSelectedByUser(DEVICETYPEKEY, g_szDeviceType, sizeof(g_szDeviceType));
|
|
|
|
ASSERT(lpRasEntry);
|
|
|
|
dwRet = EnumModem.GetError();
|
|
if (ERROR_SUCCESS != dwRet)
|
|
{
|
|
return dwRet;
|
|
}
|
|
|
|
// If there are no modems, we're horked
|
|
if (0 == EnumModem.GetNumDevices())
|
|
{
|
|
//TraceMsg(TF_GENERAL, L"ICWHELP: import.cpp: ConfigRasEntryDevice: ERROR: No modems installed!\n");
|
|
return ERROR_CANCELLED;
|
|
}
|
|
|
|
|
|
// Validate the device if possible
|
|
if ( lpRasEntry->szDeviceName[0] && lpRasEntry->szDeviceType[0] )
|
|
{
|
|
// Verify that there is a device with the given name and type
|
|
if (!EnumModem.VerifyDeviceNameAndType(lpRasEntry->szDeviceName,
|
|
lpRasEntry->szDeviceType))
|
|
{
|
|
// There was no device that matched both name and type,
|
|
// so reset the strings and bring up the choose modem UI.
|
|
lpRasEntry->szDeviceName[0] = L'\0';
|
|
lpRasEntry->szDeviceType[0] = L'\0';
|
|
}
|
|
}
|
|
else if ( lpRasEntry->szDeviceName[0] )
|
|
{
|
|
// Only the name was given. Try to find a matching type.
|
|
// If this fails, fall through to recovery case below.
|
|
LPWSTR szDeviceType =
|
|
EnumModem.GetDeviceTypeFromName(lpRasEntry->szDeviceName);
|
|
if (szDeviceType)
|
|
{
|
|
lstrcpy (lpRasEntry->szDeviceType, szDeviceType);
|
|
}
|
|
}
|
|
else if ( lpRasEntry->szDeviceType[0] )
|
|
{
|
|
// Only the type was given. Try to find a matching name.
|
|
// If this fails, fall through to recovery case below.
|
|
LPWSTR szDeviceName =
|
|
EnumModem.GetDeviceNameFromType(lpRasEntry->szDeviceType);
|
|
if (szDeviceName)
|
|
{
|
|
lstrcpy (lpRasEntry->szDeviceName, szDeviceName);
|
|
}
|
|
}
|
|
|
|
|
|
// If either name or type is missing, check whether the user has already made a choice.
|
|
// if not, bring up choose modem UI if there
|
|
// are multiple devices, else just get first device.
|
|
// Since we already verified that there was at least one device,
|
|
// we can assume that this will succeed.
|
|
|
|
if( !(lpRasEntry->szDeviceName[0]) ||
|
|
!(lpRasEntry->szDeviceType[0]) )
|
|
{
|
|
//TraceMsg(TF_GENERAL, L"ICWHELP: ConfigRasEntryDevice: no valid device passed in\n");
|
|
|
|
if( g_szDeviceName[0] )
|
|
{
|
|
// it looks like we have already stored the user's choice.
|
|
// store the DeviceName in lpRasEntry, then call GetDeviceTypeFromName
|
|
// to confirm that the deviceName we saved actually exists on the system
|
|
lstrcpy(lpRasEntry->szDeviceName, g_szDeviceName);
|
|
|
|
if( 0 == lstrcmp(EnumModem.GetDeviceTypeFromName(lpRasEntry->szDeviceName),
|
|
g_szDeviceType) )
|
|
{
|
|
lstrcpy(lpRasEntry->szDeviceType, g_szDeviceType);
|
|
return ERROR_SUCCESS;
|
|
}
|
|
}
|
|
|
|
|
|
if (1 == EnumModem.GetNumDevices())
|
|
{
|
|
// There is just one device installed, so copy the name
|
|
//TraceMsg(TF_GENERAL, L"ICWHELP: import.cpp: ConfigRasEntryDevice: only one modem installed, using it\n");
|
|
lstrcpy (lpRasEntry->szDeviceName, EnumModem.Next());
|
|
}
|
|
else
|
|
{
|
|
//TraceMsg(TF_GENERAL, L"ICWHELP: import.cpp: ConfigRasEntryDevice: multiple modems detected\n");
|
|
|
|
if (IsNT4SP3Lower())
|
|
{
|
|
lstrcpy (lpRasEntry->szDeviceName, EnumModem.Next() );
|
|
}
|
|
else
|
|
{
|
|
// structure to pass to dialog to fill out
|
|
CHOOSEMODEMDLGINFO ChooseModemDlgInfo;
|
|
|
|
// Display a dialog and allow the user to select modem
|
|
// TODO: is g_hWndMain the right thing to use for parent?
|
|
BOOL fRet=DialogBoxParam(GetModuleHandle(L"ICWHELP.DLL"), MAKEINTRESOURCE(IDD_CHOOSEMODEMNAME), GetActiveWindow(),
|
|
ChooseModemDlgProc, (LPARAM) &ChooseModemDlgInfo);
|
|
if (TRUE != fRet)
|
|
{
|
|
// user cancelled or an error occurred.
|
|
dwRet = ChooseModemDlgInfo.hr;
|
|
/*
|
|
dwRet = GetLastError(); //This will NEVER be ERROR_SUCCESS
|
|
|
|
//BUBGUG -- If the user hits OK -> then ChooseModemDlgInfo.hr == ERROR_SUCCESS,
|
|
BUT if OK was hit then the function returns true and this can never be hit!
|
|
if (ERROR_SUCCESS == dwRet)
|
|
{
|
|
// Error occurred, but the error code was not set.
|
|
dwRet = ERROR_INETCFG_UNKNOWN;
|
|
}*/
|
|
return dwRet;
|
|
}
|
|
|
|
// Copy the modem name string
|
|
lstrcpy (lpRasEntry->szDeviceName, ChooseModemDlgInfo.szModemName);
|
|
}
|
|
}
|
|
|
|
// Now get the type string for this modem
|
|
lstrcpy (lpRasEntry->szDeviceType, EnumModem.GetDeviceTypeFromName(lpRasEntry->szDeviceName));
|
|
}
|
|
|
|
lstrcpy(g_szDeviceName, lpRasEntry->szDeviceName);
|
|
lstrcpy(g_szDeviceType, lpRasEntry->szDeviceType);
|
|
|
|
// Save device name and type
|
|
lstrcpy( m_szDeviceName, lpRasEntry->szDeviceName);
|
|
lstrcpy( m_szDeviceType, lpRasEntry->szDeviceType);
|
|
|
|
// Save data in registry
|
|
SetDeviceSelectedByUser(DEVICENAMEKEY, g_szDeviceName);
|
|
SetDeviceSelectedByUser (DEVICETYPEKEY, g_szDeviceType);
|
|
#endif
|
|
|
|
return dwRet;
|
|
}
|
|
|