// 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; }