// Includes #include "stdafx.h" #include #include #include #include #include "globals.h" #include "comp.h" #include "ib.h" #include "fstream.h" #include #include #include "resource.h" #include "NewDialog.h" #define MAX_SIZE 1024 #define CRVALUE 0x0D #define BUF_SIZE 4096 // for the xml parser used for PrefsTree #include "xmlparse.h" #include "prefselement.h" // Required disk space for Linux build #define LDISK_SPACE 84934656 int interpret(char *cmd); CString rootPath; CString configName; CString configPath; CString workspacePath; CString shellPath; CString cdPath; CString networkPath; CString tempPath; CString iniDstPath; CString iniSrcPath; CString scriptPath; CString nscpxpiPath; CString cdshellPath; CString outputPath; CString xpiDstPath; CString remoteAdminFile; CString curPlatform; CString platformPath; CString curLanguage; // variables for CCK Linux build CString templinuxPath; CString templinuxDirPath; CString xpiDir; CString templinuxDir; CString targzfile; CString strNscpInstaller = "./netscape-installer"; // For use with PrefsTree CString gstrCFGPrefFile; CString gstrPlainPrefFile; CString gstrInstallFile; WIDGET *tempWidget; char buffer[50000]; XPI xpiList[100]; int xpiLen = -1; JAR jarList[100]; int jarLen = -1; // Setup Sections for config.ini CString Setup0Short = "R&ecommended"; CString Setup1Short = "C&ustom"; CString quotes = "\""; CString spaces = " "; BOOL prefDoesntExist = TRUE; COMPONENT Components[100]; int numComponents; int componentOrder; CString componentstr; char tempcomponentstr[MAX_SIZE]; int findXPI(CString xpiname, CString filename) { int found = FALSE; for (int i=0; !found && i<=xpiLen; i++) //xpiList is an array of structures where each structure contains //the name of the xpi file and the subpath of the file within. if (xpiList[i].xpiname == xpiname && xpiList[i].filename == filename) found = TRUE; if (!found) { xpiLen++; xpiList[xpiLen].xpiname = xpiname; xpiList[xpiLen].filename = filename; } return found; } int ExtractXPIFile(CString xpiname, CString xpifile) { CString command; // AfxMessageBox("The xpiname is "+xpiname+" and the file is "+xpifile,MB_OK); if (findXPI(xpiname, xpifile)) return TRUE; // Can use -d instead of change CWD??? CString xpiArchive = nscpxpiPath + "\\" + xpiname; //xpiArchive = CCKTool\NSCPXPI command = quotes +rootPath + "unzip.exe"+ quotes + "-o" + spaces + quotes + xpiArchive + quotes + spaces + quotes + xpifile + quotes; ExecuteCommand((char *)(LPCTSTR) command, SW_HIDE, INFINITE); return TRUE; } int ReplaceXPIFiles() { CString command; CString xpiArchive; CString xpiArcDest; // Go through the whole list putting them into the archives for (int i=0; i<=xpiLen; i++) { // This copy preserves the existing archive if it exists - do we // need to delete it the first time through? xpiArchive = nscpxpiPath + "\\" + xpiList[i].xpiname;//nscpxpiPath=CCKTool\NSCPXPI xpiArcDest = xpiDstPath + "\\" + xpiList[i].xpiname; //xpiDstPath=CCKTool\Configs\ configName\Output\Core if (!CopyFile(xpiArchive, xpiArcDest, TRUE)) DWORD e = GetLastError(); // if ((strcmp(xpiList[i].filename,"bin/defaults/isp/US") == 0) || (strcmp(xpiList[i].filename,"bin/defaults/isp") == 0)) if (((xpiList[i].filename).Find("isp")) != -1) command = quotes + rootPath + "zip.exe" + quotes + "-m " + spaces + quotes +xpiArcDest + quotes + spaces + quotes + xpiList[i].filename + "/*.*" + quotes; else command = quotes + rootPath + "zip.exe" + quotes + "-m " + spaces + quotes +xpiArcDest + quotes + spaces + quotes + xpiList[i].filename + quotes; ExecuteCommand((char *)(LPCTSTR) command, SW_HIDE, INFINITE); } return TRUE; } int findJAR(CString jarname, CString filename) { int found = FALSE; for (int i=0; !found && i<=jarLen; i++) if (jarList[i].jarname == jarname && jarList[i].filename == filename) found = TRUE; if (!found) { jarLen++; jarList[jarLen].jarname = jarname; jarList[jarLen].filename = filename; } return found; } // Decrypt a file to another file. int UnHash(CString HashedFile, CString ClearTextFile) { CString command = quotes + rootPath + "parse_cfg.exe" + quotes + " -Y -input " + HashedFile + " -output " + ClearTextFile; ExecuteCommand((char *)(LPCTSTR) command, SW_HIDE, INFINITE); return TRUE; } // Encrypt a file to another file. int Hash(CString ClearTextFile, CString HashedFile) { CString command = quotes + rootPath + "make_cfg.exe" + quotes + " -Y -input " + quotes + ClearTextFile + quotes +" -output " + quotes + HashedFile + quotes; ExecuteCommand((char *)(LPCTSTR) command, SW_HIDE, INFINITE); return TRUE; } int ExtractJARFile(CString xpiname, CString jarname, CString xpifile) { // AfxMessageBox("The xpiname is "+xpiname+" and the jar name is "+jarname+" and the file is "+xpifile,MB_OK); ExtractXPIFile(xpiname, jarname); CString command; CString jarArchive; if (curPlatform == "Mac OS") { jarname.Replace("/","\\"); jarname.Insert(0,"\\"); jarArchive = tempPath + jarname; } else { //We have to get rid of the bin/chrome/ and hence the delete. jarname.Delete(0,11); jarArchive = tempPath + "\\bin\\chrome\\" + jarname; } if (findJAR(jarname, xpifile)) return TRUE; // Can use -d instead of change CWD??? command = quotes +rootPath + "unzip.exe"+ quotes + "-o" + spaces + quotes + jarArchive + quotes + spaces + quotes + xpifile + quotes; ExecuteCommand((char *)(LPCTSTR) command, SW_HIDE, INFINITE); return TRUE; } int ReplaceJARFiles() { CString command; CString jarArchive; // Go through the whole list putting them into the archives for (int i=0; i<=jarLen; i++) { // This copy preserves the existing archive if it exists - do we // need to delete it the first time through? if (curPlatform == "Mac OS") jarArchive = tempPath + jarList[i].jarname; else jarArchive = tempPath + "\\bin\\chrome\\" + jarList[i].jarname; command = quotes + rootPath + "zip.exe" + quotes + "-m " + spaces + quotes +jarArchive + quotes + spaces + quotes + jarList[i].filename + quotes; ExecuteCommand((char *)(LPCTSTR) command, SW_HIDE, INFINITE); } return TRUE; } int ReplaceINIFile() { CString command1,command2,commandReadme; CString zipName("NSSetup.zip"); CString exeName("NSSetup.exe"); CString copyb = "copy /b "; char olddir[1024]; GetCurrentDirectory(sizeof(olddir), olddir); if(SetCurrentDirectory((char *)(LPCTSTR) xpiDstPath) == FALSE) return FALSE; CString Src = nscpxpiPath + "\\" +zipName; CString Dst = xpiDstPath + "\\" + zipName; if (!CopyFile(Src, Dst, FALSE)) DWORD e = GetLastError(); // command = quotes + rootPath + "nszip.exe " + quotes + spaces + exeName + spaces + "config.ini"; command1 = quotes + rootPath + "zip.exe" + quotes + "-m " + spaces + zipName + spaces + "config.ini"; ExecuteCommand((char *)(LPCTSTR) command1, SW_HIDE, INFINITE); // Copy the Readme file to the core directory and insert it inside the NSSetup.zip********** CString readmePath = GetGlobal("ReadMeFile"); CString replaceReadme = xpiDstPath + "\\Readme.txt"; if (!CopyFile(readmePath, replaceReadme, FALSE)) DWORD e = GetLastError(); commandReadme = quotes + rootPath + "zip.exe" + quotes + "-m " + spaces + zipName + spaces + "Readme.txt"; ExecuteCommand((char *)(LPCTSTR) commandReadme, SW_HIDE, INFINITE); // Finished copying readme and inserting into the zip********** command2 = copyb + quotes + rootPath + "unzipsfx.exe" + quotes + " + NSSetup.zip NSSetup.exe"; // copy /b unzipsfx.exe+letters.zip letters.exe /////////////////////////////////////////////////////// CString copycat = "copycat.bat"; ofstream cc(copycat); cc << command2 <<"\necho off \ncls\n"; cc.close(); CString command3 ="copycat.bat"; /////////////////////////////////////////////////////// ExecuteCommand((char *)(LPCTSTR) command3, SW_HIDE, INFINITE); DeleteFile("copycat.bat"); CString unzipN6 = quotes +rootPath + "unzip.exe"+ quotes + "-o" + spaces + quotes + zipName + quotes; ExecuteCommand((char *)(LPCTSTR) unzipN6, SW_HIDE, INFINITE); DeleteFile(zipName); SetCurrentDirectory(olddir); return TRUE; } void ModifyPref(char *buffer, CString entity, CString newvalue, BOOL bLockPref) { CString buf(buffer); int i = buf.Find(entity); if (i == -1) return; i = buf.Find('"', i+1); if (i == -1) return; i++; i = buf.Find('"', i+1); if (i == -1) return; i++; int j = buf.Find('"', i); if (j == -1) return; j--; buf.Delete(i, j-i+1); buf.Insert(i, newvalue); if (bLockPref) { // If it's not lockPref( already. if (buf.Find("lockPref(") < 0) buf.Replace("pref(", "lockPref("); } strcpy(buffer, (char *)(LPCTSTR) buf); prefDoesntExist = FALSE; } int ModifyProperties(CString xpifile, CString entity, CString newvalue) { int rv = TRUE; CString propFile = xpifile; CString tempFile = xpifile + ".temp"; char properties[400]; ofstream tf(tempFile); if(!tf) { rv = FALSE; cout <<"Cannot open: "<startElement(name, atts); } void characterData(void *userData, const XML_Char *s, int len) { ASSERT(userData); ((CPrefElement*)userData)->characterData(s, len); } // Called by the XML parser when an element close tag is read. void endElement(void *userData, const char *name) { ASSERT(userData); ((CPrefElement*)userData)->endElement(name); if (stricmp(name, "PREF") == 0) { // If locked, write to the .cfg file. Don't care if it's default or not. BOOL bLocked = ((CPrefElement*)userData)->IsLocked(); BOOL bRemoteAdmin = ((CPrefElement*)userData)->IsRemoteAdmin(); BOOL bDefault = ((CPrefElement*)userData)->IsDefault(); if (bLocked && !bRemoteAdmin) { // Write the pref element to prefs file. ExtractXPIFile(gstrInstallFile, gstrCFGPrefFile); ModifyHashedPref(gstrCFGPrefFile, ((CPrefElement*)userData)->GetPrefName(), ((CPrefElement*)userData)->GetPrefValue(), ((CPrefElement*)userData)->GetPrefType(), TRUE); } // If not locked, and not NS default, write to the .js file. else if (!bDefault) { ExtractXPIFile(gstrInstallFile, gstrPlainPrefFile); if ((((CPrefElement*)userData)->GetPrefType() == "int") || (((CPrefElement*)userData)->GetPrefType() == "bool")) ModifyJS2(gstrPlainPrefFile, ((CPrefElement*)userData)->GetPrefName(), ((CPrefElement*)userData)->GetPrefValue(), FALSE); else // string ModifyJS(gstrPlainPrefFile, ((CPrefElement*)userData)->GetPrefName(), ((CPrefElement*)userData)->GetPrefValue(), FALSE); } // If remote admin, write to the .jsc file. if (bRemoteAdmin) { if (!FileExists(remoteAdminFile)) { CString strURL = GetGlobal("RemoteAdminURL"); CString strComment; strComment.Format("/* This Remote Admin file should be placed at %s */\n", strURL); CreateNewFile(remoteAdminFile, strComment); } if ((((CPrefElement*)userData)->GetPrefType() == "int") || (((CPrefElement*)userData)->GetPrefType() == "bool")) ModifyJS2(remoteAdminFile, ((CPrefElement*)userData)->GetPrefName(), ((CPrefElement*)userData)->GetPrefValue(), TRUE); else // string ModifyJS(remoteAdminFile, ((CPrefElement*)userData)->GetPrefName(), ((CPrefElement*)userData)->GetPrefValue(), TRUE); } } } BOOL ProcessMailNews() //CString xpifile, browser.xpi,bin/netscp.cfg,bin/defaults/pref/all-ns.js) { BOOL bMailLocked = (atoi(GetGlobal("MailAcctLocked")) == 0 ? FALSE : TRUE); BOOL bMailRemoteAdmin = (atoi(GetGlobal("MailAcctRemoteAdmin")) == 0 ? FALSE : TRUE); BOOL bNewsLocked = (atoi(GetGlobal("NewsAcctLocked")) == 0 ? FALSE : TRUE); BOOL bNewsRemoteAdmin = (atoi(GetGlobal("NewsAcctRemoteAdmin")) == 0 ? FALSE : TRUE); CString strMailAcctID = GetGlobal("MailAcctID"); CString strMailAcctDisplayName = GetGlobal("MailAcctDisplayName"); CString strMailAcctServer = GetGlobal("MailAcctServer"); CString strMailAcctPortNumber = GetGlobal("MailAcctPortNumber"); int nMailAcctPortNumber = atoi(GetGlobal("MailAcctPortNumber")); CString strMailAcctSMTPServer = GetGlobal("MailAcctSMTPServer"); CString strNewsAcctID = GetGlobal("NewsAcctID"); CString strNewsAcctDisplayName = GetGlobal("NewsAcctDisplayName"); CString strNewsAcctServer = GetGlobal("NewsAcctServer"); CString strNewsAcctPortNumber = GetGlobal("NewsAcctPortNumber"); int nNewsAcctPortNumber = atoi(GetGlobal("NewsAcctPortNumber")); BOOL bMailComplete = strMailAcctID.GetLength() && strMailAcctDisplayName.GetLength() && strMailAcctServer.GetLength() && strMailAcctPortNumber.GetLength() && strMailAcctSMTPServer.GetLength(); BOOL bNewsComplete = strNewsAcctID.GetLength() && strNewsAcctDisplayName.GetLength() && strNewsAcctServer.GetLength(); CString strAccountsToAppend; // If either is remote admin, ensure .jsc file exists already if ((bMailComplete && bMailRemoteAdmin) || (bNewsComplete && bNewsRemoteAdmin)) { if (!FileExists(remoteAdminFile)) { CString strURL = GetGlobal("RemoteAdminURL"); CString strComment; strComment.Format("/* This Remote Admin file should be placed at %s */\n", strURL); CreateNewFile(remoteAdminFile, strComment); } } if (bMailComplete) { // for Mail, we are currently not locking SMTP server info (okay per PM JeffH) // and most setup prefs go into all-ns.js unless locked or remote. // generate account, identity, and server strings from account ID the administrator gave us CString strAccount = "Acct" + strMailAcctID; CString strIdentity = "id" + strMailAcctID; CString strServer = "server" + strMailAcctID; CString strSMTPServer = "smtp" + strMailAcctID; CString strPref; CString strMailAcctServerType; CString strMailAcctPopLeaveMsg; BOOL bIsPop = FALSE; strAccountsToAppend = strAccount; // will add this to appendaccounts pref // Determine whether the server type is POP or IMAP if (GetGlobal("pop") == "1") { strMailAcctServerType = "pop3"; bIsPop = TRUE; // check if "leave pop messages on server" option is set if (GetGlobal("PopMessages") == "0") strMailAcctPopLeaveMsg = "false"; else strMailAcctPopLeaveMsg = "true"; } else strMailAcctServerType = "imap"; // these go to the .js file ExtractXPIFile(gstrInstallFile, gstrPlainPrefFile); strPref.Format("mail.account.%s.identities",strAccount); // i.e. mail.account.Acct9991.identities ModifyJS(gstrPlainPrefFile, strPref, strIdentity, FALSE); strPref.Format("mail.account.%s.server",strAccount); // i.e. mail.account.Acct9991.server ModifyJS(gstrPlainPrefFile, strPref, strServer, FALSE); strPref.Format("mail.identity.%s.smtpServer",strIdentity);// i.e. mail.identity.id9991.smtpServer ModifyJS(gstrPlainPrefFile, strPref, strSMTPServer, FALSE); strPref.Format("mail.identity.%s.smtpRequiresUsername",strIdentity);// i.e. mail.identity.id9991.smtpRequiresUsername ModifyJS2(gstrPlainPrefFile, strPref, "true", FALSE); strPref.Format("mail.smtpserver.%s.hostname",strSMTPServer); // i.e. mail.smtpserver.smtp9991.hostname ModifyJS(gstrPlainPrefFile, strPref, strMailAcctSMTPServer, FALSE); ModifyJS(gstrPlainPrefFile, "mail.smtpservers.appendsmtpservers", strSMTPServer, FALSE); ModifyJS(gstrPlainPrefFile, "mail.smtp.defaultserver", strSMTPServer, FALSE); strPref.Format("mail.identity.%s.valid",strIdentity); // i.e. mail.identity.id9991.valid ModifyJS2(gstrPlainPrefFile, strPref, "false", FALSE); strPref.Format("mail.identity.%s.wizardSkipPanels",strIdentity); // i.e. mail.identity.id9991.wizardSkipPanels ModifyJS2(gstrPlainPrefFile, strPref, "true", FALSE); strPref.Format("mail.server.%s.hostname",strServer); // i.e. mail.server.server9991.hostname ModifyJS(gstrPlainPrefFile, strPref, strMailAcctServer, FALSE); if (bMailLocked && !bMailRemoteAdmin) // save in cfg file { ExtractXPIFile(gstrInstallFile, gstrCFGPrefFile); // user realhostname instead of hostname when locking it strPref.Format("mail.server.%s.realhostname",strServer); // i.e. mail.server.server9991.realhostname ModifyHashedPref(gstrCFGPrefFile, strPref, strMailAcctServer, "string", TRUE); strPref.Format("mail.server.%s.name",strServer); // i.e. mail.server.server9991.name ModifyHashedPref(gstrCFGPrefFile, strPref, strMailAcctDisplayName, "string", TRUE); strPref.Format("mail.server.%s.port",strServer); // i.e. mail.server.server9991.port ModifyHashedPref(gstrCFGPrefFile, strPref, strMailAcctPortNumber, "int", TRUE); strPref.Format("mail.server.%s.type",strServer); // i.e. mail.server.server9991.type ModifyHashedPref(gstrCFGPrefFile, strPref, strMailAcctServerType, "string", TRUE); if (bIsPop) { strPref.Format("mail.server.%s.leave_on_server",strServer); // i.e. mail.server.server9991.type ModifyHashedPref(gstrCFGPrefFile, strPref, strMailAcctPopLeaveMsg, "bool", TRUE); } } else { // if remoteadmin, save in .jsc file, otherwise save in .js file CString strTarget = bMailRemoteAdmin ? remoteAdminFile : gstrPlainPrefFile; BOOL bLocked = bMailRemoteAdmin ? TRUE : FALSE; // only use .realhostname if pref is locked/remote, otherwise use .hostname if (bMailRemoteAdmin) strPref.Format("mail.server.%s.realhostname",strServer); // i.e. mail.server.server9991.realhostname else strPref.Format("mail.server.%s.hostname",strServer); // i.e. mail.server.server9991.hostname ModifyJS(strTarget, strPref, strMailAcctServer, bLocked); strPref.Format("mail.server.%s.name",strServer); // i.e. mail.server.server9991.name ModifyJS(strTarget, strPref, strMailAcctDisplayName, bLocked); strPref.Format("mail.server.%s.port",strServer); // i.e. mail.server.server9991.port ModifyJS2(strTarget, strPref, strMailAcctPortNumber, bLocked); strPref.Format("mail.server.%s.type",strServer); // i.e. mail.server.server9991.type ModifyJS(strTarget, strPref, strMailAcctServerType, bLocked); if (bIsPop) { strPref.Format("mail.server.%s.leave_on_server",strServer); // i.e. mail.server.server9991.type ModifyJS2(strTarget, strPref, strMailAcctPopLeaveMsg, bLocked); } } } if (bNewsComplete) { // setup prefs go into all-ns.js unless locked or remote. // generate account, identity, and server strings from account ID the administrator gave us CString strAccount = "Acct" + strNewsAcctID; CString strIdentity = "id" + strNewsAcctID; CString strServer = "server" + strNewsAcctID; CString strPref; CString strMailAcctServerType; if (strAccountsToAppend.GetLength()) // the mail account is already there, comma delimit it strAccountsToAppend += ","; strAccountsToAppend += strAccount; // will add this to appendaccounts pref // these go to the .js file ExtractXPIFile(gstrInstallFile, gstrPlainPrefFile); strPref.Format("mail.account.%s.identities",strAccount); // i.e. mail.account.Acct9992.identities ModifyJS(gstrPlainPrefFile, strPref, strIdentity, FALSE); strPref.Format("mail.account.%s.server",strAccount); // i.e. mail.account.Acct9992.server ModifyJS(gstrPlainPrefFile, strPref, strServer, FALSE); strPref.Format("mail.identity.%s.valid",strIdentity); // i.e. mail.identity.id9992.valid ModifyJS2(gstrPlainPrefFile, strPref, "false", FALSE); strPref.Format("mail.identity.%s.wizardSkipPanels",strIdentity); // i.e. mail.identity.id9992.wizardSkipPanels ModifyJS2(gstrPlainPrefFile, strPref, "true", FALSE); strPref.Format("mail.server.%s.type",strServer); // i.e. mail.server.server9992.type ModifyJS(gstrPlainPrefFile, strPref, "nntp", FALSE); strPref.Format("mail.server.%s.hostname",strServer); // i.e. mail.server.server9991.hostname ModifyJS(gstrPlainPrefFile, strPref, strNewsAcctServer, FALSE); if (bNewsLocked && !bNewsRemoteAdmin) // save in cfg file { ExtractXPIFile(gstrInstallFile, gstrCFGPrefFile); // user realhostname instead of hostname when locking it strPref.Format("mail.server.%s.realhostname",strServer); // i.e. mail.server.server9992.realhostname ModifyHashedPref(gstrCFGPrefFile, strPref, strNewsAcctServer, "string", TRUE); strPref.Format("mail.server.%s.name",strServer); // i.e. mail.server.server9992.name ModifyHashedPref(gstrCFGPrefFile, strPref, strNewsAcctDisplayName, "string", TRUE); if (strNewsAcctPortNumber.GetLength()) { strPref.Format("mail.server.%s.port",strServer); // i.e. mail.server.server9992.port ModifyHashedPref(gstrCFGPrefFile, strPref, strNewsAcctPortNumber, "int", TRUE); } } else { // if remoteadmin, save in .jsc file, otherwise save in .js file CString strTarget = bNewsRemoteAdmin ? remoteAdminFile : gstrPlainPrefFile; BOOL bLocked = bMailRemoteAdmin ? TRUE : FALSE; // only use .realhostname if pref is locked/remote, otherwise use .hostname if (bNewsRemoteAdmin) strPref.Format("mail.server.%s.realhostname",strServer); // i.e. mail.server.server9992.realhostname else strPref.Format("mail.server.%s.hostname",strServer); // i.e. mail.server.server9992.hostname ModifyJS(strTarget, strPref, strNewsAcctServer, bLocked); strPref.Format("mail.server.%s.name",strServer); // i.e. mail.server.server9991.name ModifyJS(strTarget, strPref, strNewsAcctDisplayName, bLocked); if (strNewsAcctPortNumber.GetLength()) { strPref.Format("mail.server.%s.port",strServer); // i.e. mail.server.server9991.port ModifyJS2(strTarget, strPref, strNewsAcctPortNumber, bLocked); } } } if (strAccountsToAppend.GetLength()) ModifyJS(gstrPlainPrefFile, "mail.accountmanager.appendaccounts", strAccountsToAppend, FALSE); return TRUE; } // special case for homepage URL: if locked or remote admin, do the right thing. // otherwise, call the originally called ModifyProperties method BOOL ModifyHomepageURL(CString xpifile, CString entity, CString newvalue) { bool bLocked = GetGlobal("HomePageURLLocked") == "1"; bool bRemoteAdmin = GetGlobal("HomePageURLRemoteAdmin") == "1"; CString strPref = "browser.startup.homepage"; CString strURL = GetGlobal("HomePageURL"); if (bLocked && !bRemoteAdmin) { // Write the pref element to prefs file. ExtractXPIFile(gstrInstallFile, gstrCFGPrefFile); ModifyHashedPref(gstrCFGPrefFile, strPref, strURL, "string", TRUE); // Lock out the buttons in the pref dialog to change the homepage. ModifyHashedPref(gstrCFGPrefFile, "pref.browser.homepage.disable_button.current_page", "true", "bool", TRUE); ModifyHashedPref(gstrCFGPrefFile, "pref.browser.homepage.disable_button.select_file", "true", "bool", TRUE); } // If remote admin, write to the .jsc file. else if (bRemoteAdmin) { if (!FileExists(remoteAdminFile)) { CString strComment; strComment.Format("/* The Homepage URL should be %s */\n", strURL); CreateNewFile(remoteAdminFile, strComment); } ModifyJS(remoteAdminFile, strPref, strURL, TRUE); // Lock out the buttons in the pref dialog to change the homepage. ModifyJS2(remoteAdminFile, "pref.browser.homepage.disable_button.current_page", "true", TRUE); ModifyJS2(remoteAdminFile, "pref.browser.homepage.disable_button.select_file", "true", TRUE); } // not locked, or remote, just modify the property else ModifyProperties(xpifile, entity, newvalue); return TRUE; } // Sets the autoadmin.global_config_url in strPrefFile to strURL. BOOL ConfigureRemoteAdmin(CString strURL, CString strPrefFile) { ASSERT(!strURL.IsEmpty() && !strPrefFile.IsEmpty()); if (strURL.IsEmpty() || strPrefFile.IsEmpty()) return FALSE; ASSERT(strPrefFile.Find(".cfg") > 0); if (strPrefFile.Find(".cfg") <= 0) return FALSE; ModifyHashedPref(strPrefFile, "autoadmin.global_config_url", strURL, "string", TRUE); CString strFailoverCached = GetGlobal("RemoteAdminFailoverToCached"); ModifyHashedPref(strPrefFile, "autoadmin.failover_to_cached", strFailoverCached, "bool", TRUE); CString strFailover = GetGlobal("RemoteAdminFailover"); ModifyHashedPref(strPrefFile, "autoadmin.offline_failover", strFailover, "bool", TRUE); CString strPoll = GetGlobal("RemoteAdminPoll"); if (strPoll == "1") { CString strPollFreq = GetGlobal("RemoteAdminPollFreq"); ModifyHashedPref(strPrefFile, "autoadmin.refresh_interval", strPollFreq, "int", TRUE); } return TRUE; } // This function can easily be rewriten to parse the XML file by hand if it // needs to be ported to a non-MS OS. The XML is pretty simple. BOOL ProcessPrefsTree(CString strPrefsTreeFile) { //AfxMessageBox("Pause", MB_OK); XML_Parser parser = XML_ParserCreate(NULL); XML_SetElementHandler(parser, startElement, endElement); XML_SetCharacterDataHandler(parser, characterData); // Used by the XML parser. The data object passed to the handlers. static CPrefElement element; XML_SetUserData(parser, &element); // Load the XML from the file. CString strPrefsXML; FILE* pFile = fopen(strPrefsTreeFile, "r"); if (!pFile) { fprintf(stderr, "Can't open the file %s.", strPrefsTreeFile); return FALSE; } // obtain file size. fseek(pFile , 0 , SEEK_END); long lSize = ftell(pFile); rewind(pFile); // allocate memory to contain the whole file. char* buffer = (char*) malloc (lSize + 1); if (buffer == NULL) { fprintf(stderr, "Memory allocation error."); return FALSE; } buffer[lSize] = '\0'; // copy the file into the buffer. size_t len = fread(buffer,1,lSize,pFile); // the whole file is loaded in the buffer. int done = 0; if (!XML_Parse(parser, buffer, len, done)) { fprintf(stderr, "%s at line %d\n", XML_ErrorString(XML_GetErrorCode(parser)), XML_GetCurrentLineNumber(parser)); return FALSE; } XML_ParserFree(parser); free(buffer); return TRUE; } BOOL ModifyUserJS(CString HashedPrefsFile, CString jsSourceFile) { // Unhash the prefs file to a plain text file. If there is no hashed file yet, // create a plaintext file with only a comment. CString PlainTextPrefsFile = HashedPrefsFile + ".js"; if (FileExists(HashedPrefsFile)) { if (!UnHash(HashedPrefsFile, PlainTextPrefsFile)) return FALSE; } else { // Create a plain text prefs with only a comment. CreateNewFile(PlainTextPrefsFile, "/* prefs configured in NCADM */\n"); } // find the block and replace it with the contents of the source file CString newPrefsFile = PlainTextPrefsFile + ".new"; // Read in all.js file and make substitutions CStdioFile srcJSC; FILE* destJSC = fopen(newPrefsFile, "w"); if (srcJSC.Open(PlainTextPrefsFile,CFile::modeRead | CFile::typeText) && destJSC) { CString strLine; bool bInJSBlock = FALSE; bool bInsertUserJSNow = FALSE; bool bDroppedPayload = FALSE; int iBraceLevel = 0; // these are in case cfg file has braces bool bPastFirstBrace = FALSE; while (srcJSC.ReadString(strLine)) { strLine += "\n"; // count braces /* char buffer[4096]; strcpy(buffer,strLine); char *token = strtok( buffer, "{"); while( token != NULL ) { bPastFirstBrace = TRUE; iBraceLevel++; token = strtok(NULL,"{"); } strcpy(buffer,strLine); token = strtok( buffer, "}"); while( token != NULL ) { iBraceLevel--; token = strtok(NULL,"}"); } if (bPastFirstBrace && iBraceLevel < 1) bInsertUserJSNow = TRUE; */ // looking for //ADMJS_BEG (ADM JavaScript Begin) // or //ADMJS_END (ADM JavaScript End) which must be on a line by themselves int len = strLine.GetLength(); if ( strLine.GetLength() > 10 && strLine[0] == '/' && strLine[1] == '/') { CString str = strLine.Left(6); if (str.CompareNoCase("\n\n//ADMJS_BEG\n") == 0) { bInsertUserJSNow = TRUE; bInJSBlock = TRUE; } else if (str.CompareNoCase("//ADMJS_END\n") == 0) bInJSBlock = FALSE; } // drop our payload // if (bInsertUserJSNow) { CStdioFile srcJS; CString strJSLine; fputs(strLine,destJSC); // write out "//ADMJS_BEG" if (srcJS.Open(jsSourceFile,CFile::modeRead | CFile::typeText)) { while (srcJS.ReadString(strJSLine)) { strJSLine += "\n"; fputs(strJSLine, destJSC); } srcJS.Close(); } bInsertUserJSNow = FALSE; bDroppedPayload = TRUE; } else { fputs(strLine,destJSC); // drop whatever line we have } } // while source lines if (!bDroppedPayload) { CStdioFile srcJS; CString strJSLine; strJSLine = "\n\n//ADMJS_BEG\n"; fputs(strJSLine,destJSC); if (srcJS.Open(jsSourceFile,CFile::modeRead | CFile::typeText)) { while (srcJS.ReadString(strJSLine)) { strJSLine += "\n"; fputs(strJSLine, destJSC); } srcJS.Close(); } strJSLine = "//ADMJS_END\n"; fputs(strJSLine,destJSC); } srcJSC.Close(); fclose(destJSC); } // if can open source file // delete orig and rename new file to correct name remove(PlainTextPrefsFile); rename(newPrefsFile, PlainTextPrefsFile); // And rehash it. if (!Hash(PlainTextPrefsFile, HashedPrefsFile)) return FALSE; return TRUE; } BOOL MarkCFGVersion(CString HashedPrefsFile, CString versionTxt) { // Unhash the prefs file to a plain text file. If there is no hashed file yet, // create a plaintext file with only a comment. CString PlainTextPrefsFile = HashedPrefsFile + ".js"; if (FileExists(HashedPrefsFile)) { if (!UnHash(HashedPrefsFile, PlainTextPrefsFile)) return FALSE; } else { // Create a plain text prefs with only a comment. CreateNewFile(PlainTextPrefsFile, "/* prefs configured in NCADM */\n"); } // find the block and replace it with the contents of the source file CString newPrefsFile = PlainTextPrefsFile + ".new"; // Read in all.js file and make substitutions CStdioFile srcJSC; FILE* destJSC = fopen(newPrefsFile, "w"); if (srcJSC.Open(PlainTextPrefsFile,CFile::modeRead | CFile::typeText) && destJSC) { CString strLine; strLine = "//ADMVERSION:" + versionTxt + "\n"; fputs(strLine,destJSC); while (srcJSC.ReadString(strLine)) { strLine += "\n"; CString str = strLine.Left(8); if (str.Compare("//ADMVER") == 0) // throw away any previous //ADMVERSION tags continue; fputs(strLine,destJSC); // drop whatever line we have } srcJSC.Close(); fclose(destJSC); } // if can open source file // delete orig and rename new file to correct name remove(PlainTextPrefsFile); rename(newPrefsFile, PlainTextPrefsFile); // And rehash it. if (!Hash(PlainTextPrefsFile, HashedPrefsFile)) return FALSE; return TRUE; } void ModifySidebar(CString inputFile, CString outputFile) { // Add a sidebar tab at the topmost location in 'My sidebar' char tempbuf[MAX_SIZE]; CString searchstr = ""; CString sidebartabTitle = GetGlobal("SidebartabTitle"); CString sidebartabURL = GetGlobal("SidebartabURL"); ifstream srcf(inputFile); if (!srcf) { AfxMessageBox("Cannot open input file: " + CString(inputFile),MB_OK); return; } ofstream dstf(outputFile); if (!dstf) { AfxMessageBox("Cannot open output file: " + CString(outputFile), MB_OK); return; } while (!srcf.eof()) { srcf.getline(tempbuf,MAX_SIZE); dstf << tempbuf << "\n"; if ((CString(tempbuf).Find(searchstr)) != -1) { if (!(sidebartabTitle.IsEmpty()) && !(sidebartabURL.IsEmpty())) { dstf << " " << "\n"; dstf << " \n"; dstf << " " << sidebartabTitle << "" << "\n"; dstf << " " << sidebartabURL << "" << "\n"; dstf << " " << "\n"; dstf << " " << "\n"; } } } srcf.close(); dstf.close(); } void ModifyBookmarks(CString inputFile, CString outputFile) // add custom bookmark(s) either at the top or bottom of the bookmark menu { char tempbuf[MAX_SIZE]; // variables for custom personal toolbar CString toolbarURL1 = GetGlobal("ToolbarURL1"); CString toolbarURL2 = GetGlobal("ToolbarURL2"); CString toolbarURL3 = GetGlobal("ToolbarURL3"); CString toolbarTitle1 = GetGlobal("ToolbarTitle1"); CString toolbarTitle2 = GetGlobal("ToolbarTitle2"); CString toolbarTitle3 = GetGlobal("ToolbarTitle3"); CString toolbarSearchStr = ">Personal Toolbar Folder<"; // variables for custom bookmark CString bkmkChoice = GetGlobal("radioGroup3"); CString bkmkLocation = GetGlobal("BookmarkLocation"); CString firstbkmkSearchStr = "

Bookmarks

"; CString lastbkmkSearchStr = ">Travel<"; CString folderTitle = GetGlobal("FolderTitle"); CString bookmarkTitle = GetGlobal("BookmarkTitle"); CString bookmarkTitle1 = GetGlobal("BookmarkTitle1"); CString bookmarkTitle2 = GetGlobal("BookmarkTitle2"); CString bookmarkTitle3 = GetGlobal("BookmarkTitle3"); CString bookmarkTitle4 = GetGlobal("BookmarkTitle4"); CString bookmarkTitle5 = GetGlobal("BookmarkTitle5"); CString bookmarkURL = GetGlobal("BookmarkURL"); CString bookmarkURL1 = GetGlobal("BookmarkURL1"); CString bookmarkURL2 = GetGlobal("BookmarkURL2"); CString bookmarkURL3 = GetGlobal("BookmarkURL3"); CString bookmarkURL4 = GetGlobal("BookmarkURL4"); CString bookmarkURL5 = GetGlobal("BookmarkURL5"); ifstream srcf(inputFile); if (!srcf) { AfxMessageBox("Cannot open input file: " + CString(inputFile),MB_OK); return; } ofstream dstf(outputFile); if (!dstf) { AfxMessageBox("Cannot open output file: " + CString(outputFile), MB_OK); srcf.close(); return; } if (curLanguage == "enus") // begin bookmark customization for US builds { while (!srcf.eof()) { srcf.getline(tempbuf,MAX_SIZE); dstf << tempbuf << "\n"; if ((CString(tempbuf).Find(toolbarSearchStr)) != -1) // add custom personal toolbar items { srcf.getline(tempbuf,MAX_SIZE); dstf << tempbuf << "\n"; if (!(toolbarTitle1.IsEmpty()) && !(toolbarURL1.IsEmpty())) dstf << "
" << toolbarTitle1 << "\n"; if (!(toolbarTitle2.IsEmpty()) && !(toolbarURL2.IsEmpty())) dstf << "
" << toolbarTitle2 << "\n"; if (!(toolbarTitle3.IsEmpty()) && !(toolbarURL3.IsEmpty())) dstf << "
" << toolbarTitle3 << "\n"; } if (bkmkChoice == "1") // add single custom bookmark { if ( ((bkmkLocation == "First") && ((CString(tempbuf).Find(firstbkmkSearchStr)) != -1)) || ((bkmkLocation == "Last") && ((CString(tempbuf).Find(lastbkmkSearchStr)) != -1)) ) { srcf.getline(tempbuf,MAX_SIZE); dstf << tempbuf << "\n"; if (bkmkLocation == "Last") { // read one more line if bookmark location is 'last' srcf.getline(tempbuf,MAX_SIZE); dstf << tempbuf << "\n"; } if (!(bookmarkTitle.IsEmpty()) && !(bookmarkURL.IsEmpty())) dstf << "
" << bookmarkTitle << "\n"; } } else if (bkmkChoice == "2") // add custom bookmark folder { if ( ((bkmkLocation == "First") && ((CString(tempbuf).Find(firstbkmkSearchStr)) != -1)) || ((bkmkLocation == "Last") && ((CString(tempbuf).Find(lastbkmkSearchStr)) != -1)) ) { srcf.getline(tempbuf,MAX_SIZE); dstf << tempbuf << "\n"; if (bkmkLocation == "Last") { // read one more line if bookmark location is 'last' srcf.getline(tempbuf,MAX_SIZE); dstf << tempbuf << "\n"; } if (!(folderTitle.IsEmpty())) { dstf << "

" << folderTitle << "

\n"; dstf << "

\n"; if (!(bookmarkTitle1.IsEmpty()) && !(bookmarkURL1.IsEmpty())) dstf << "

" << bookmarkTitle1 << "\n"; if (!(bookmarkTitle2.IsEmpty()) && !(bookmarkURL2.IsEmpty())) dstf << "
" << bookmarkTitle2 << "\n"; if (!(bookmarkTitle3.IsEmpty()) && !(bookmarkURL3.IsEmpty())) dstf << "
" << bookmarkTitle3 << "\n"; if (!(bookmarkTitle4.IsEmpty()) && !(bookmarkURL4.IsEmpty())) dstf << "
" << bookmarkTitle4<< "\n"; if (!(bookmarkTitle5.IsEmpty()) && !(bookmarkURL5.IsEmpty())) dstf << "
" << bookmarkTitle5 << "\n"; dstf << "

\n"; } } } } } //end bookmark customization for US builds else // begin bookmark customization for non-US builds { toolbarSearchStr = "custom personal toolbar"; firstbkmkSearchStr = "custom bookmark start"; lastbkmkSearchStr = "custom bookmark end"; while (!srcf.eof()) { srcf.getline(tempbuf,MAX_SIZE); dstf << tempbuf << "\n"; if ((CString(tempbuf).Find(toolbarSearchStr)) != -1) // add custom personal toolbar items { srcf.getline(tempbuf,MAX_SIZE); dstf << tempbuf << "\n"; if (!(toolbarTitle1.IsEmpty()) && !(toolbarURL1.IsEmpty())) dstf << "

" << toolbarTitle1 << "\n"; if (!(toolbarTitle2.IsEmpty()) && !(toolbarURL2.IsEmpty())) dstf << "
" << toolbarTitle2 << "\n"; if (!(toolbarTitle3.IsEmpty()) && !(toolbarURL3.IsEmpty())) dstf << "
" << toolbarTitle3 << "\n"; } if (bkmkChoice == "1") // add single custom bookmark { if ( ((bkmkLocation == "First") && ((CString(tempbuf).Find(firstbkmkSearchStr)) != -1)) || ((bkmkLocation == "Last") && ((CString(tempbuf).Find(lastbkmkSearchStr)) != -1)) ) { srcf.getline(tempbuf,MAX_SIZE); dstf << tempbuf << "\n"; if (!(bookmarkTitle.IsEmpty()) && !(bookmarkURL.IsEmpty())) dstf << "
" << bookmarkTitle << "\n"; } } else if (bkmkChoice == "2") // add custom bookmark folder { if ( ((bkmkLocation == "First") && ((CString(tempbuf).Find(firstbkmkSearchStr)) != -1)) || ((bkmkLocation == "Last") && ((CString(tempbuf).Find(lastbkmkSearchStr)) != -1)) ) { srcf.getline(tempbuf,MAX_SIZE); dstf << tempbuf << "\n"; if (!(folderTitle.IsEmpty())) { dstf << "

" << folderTitle << "

\n"; dstf << "

\n"; if (!(bookmarkTitle1.IsEmpty()) && !(bookmarkURL1.IsEmpty())) dstf << "

" << bookmarkTitle1 << "\n"; if (!(bookmarkTitle2.IsEmpty()) && !(bookmarkURL2.IsEmpty())) dstf << "
" << bookmarkTitle2 << "\n"; if (!(bookmarkTitle3.IsEmpty()) && !(bookmarkURL3.IsEmpty())) dstf << "
" << bookmarkTitle3 << "\n"; if (!(bookmarkTitle4.IsEmpty()) && !(bookmarkURL4.IsEmpty())) dstf << "
" << bookmarkTitle4<< "\n"; if (!(bookmarkTitle5.IsEmpty()) && !(bookmarkURL5.IsEmpty())) dstf << "
" << bookmarkTitle5 << "\n"; dstf << "

\n"; } } } } } // end bookmark customization for non-US builds srcf.close(); dstf.close(); } void ModifyHelpMenu(CString inputFile, CString outputFile) { // Add an item to the Help menu char tempbuf[MAX_SIZE]; CString searchstr = "oncommand=\"openTopWin(\'urn:clienturl:help:security\');\" />"; CString helpMenuName = GetGlobal("HelpMenuCommandName"); CString helpMenuUrl = GetGlobal("HelpMenuCommandURL"); ifstream srcf(inputFile); if (!srcf) { AfxMessageBox("Cannot open input file: " + CString(inputFile),MB_OK); return; } ofstream dstf(outputFile); if (!dstf) { AfxMessageBox("Cannot open output file: " + CString(outputFile), MB_OK); srcf.close(); return; } while (!srcf.eof()) { if (curPlatform == "Mac OS") srcf.getline(tempbuf,MAX_SIZE,'\r'); else srcf.getline(tempbuf,MAX_SIZE); dstf << tempbuf << "\n"; if ((CString(tempbuf).Find(searchstr)) != -1) { if (!(helpMenuName.IsEmpty()) && !(helpMenuUrl.IsEmpty())) { dstf << " \n"; } } } srcf.close(); dstf.close(); } BOOL RemoveNIMRestart(CString inputFile, CString outputFile) { char tempbuf[MAX_SIZE]; BOOL bCheck0 = FALSE; BOOL bCheck1 = FALSE; BOOL bCheck2 = FALSE; BOOL bCheck3 = FALSE; BOOL bCheck4 = FALSE; ifstream srcf(inputFile); if (!srcf) { AfxMessageBox("Cannot open input file: " + CString(inputFile),MB_OK); return FALSE; } ofstream dstf(outputFile); if (!dstf) { AfxMessageBox("Cannot open output file: " + CString(outputFile), MB_OK); srcf.close(); return FALSE; } srcf.getline(tempbuf,MAX_SIZE); while (!srcf.eof()) { if ((CString(tempbuf).Find("var bTurboSet;")) != -1) { bCheck0 = TRUE; dstf << "// The following has been commented out by your Customization Software\n"; dstf << "if(0)\n"; dstf << "{\n"; dstf << tempbuf << "\n"; dstf << "} //End of Customization change\n"; srcf.getline(tempbuf, MAX_SIZE); while (!srcf.eof()) { dstf << tempbuf << "\n"; // Search for start of block of code we want to comment out if ((CString(tempbuf).Find("// Register Aim to quick launch")) != -1) { bCheck1 = TRUE; //Found start of block of code //Add comments to describe what we are doing, and add if(0) dstf << "// The following has been commented out by your Customization Software\n"; dstf << "if(0)\n"; dstf << "{\n"; srcf.getline(tempbuf,MAX_SIZE); while (!srcf.eof()) { dstf << tempbuf << "\n"; if(((CString(tempbuf).Find("if(")) != -1) && ((CString(tempbuf).Find("AIM")) != -1)) { bCheck2 = TRUE; srcf.getline(tempbuf, MAX_SIZE); while (!srcf.eof()) { dstf << tempbuf << "\n"; if((CString(tempbuf).Find("gWinReg.setValueString(subkey, valname, newKey);")) != -1) { bCheck3 = TRUE; srcf.getline(tempbuf, MAX_SIZE); while (!srcf.eof()) { dstf << tempbuf << "\n"; if((CString(tempbuf).Find("}")) != -1) { bCheck4 = TRUE; dstf << "} //End of Customization change\n"; break; } srcf.getline(tempbuf, MAX_SIZE); } } srcf.getline(tempbuf, MAX_SIZE); } } srcf.getline(tempbuf, MAX_SIZE); } } srcf.getline(tempbuf, MAX_SIZE); } } else dstf << tempbuf << "\n"; srcf.getline(tempbuf, MAX_SIZE); } srcf.close(); dstf.close(); if(!(bCheck0 && bCheck1 && bCheck2 && bCheck3 && bCheck4)) { //We didn't pass all the code checkpoints //return FALSE and leave the file unchanged AfxMessageBox("Code change to remove NIM Restart feature was unsuccessful, leaving file unchanged", MB_OK); return FALSE; } return TRUE; } int interpret(char *cmd) { char *cmdname = strtok(cmd, "("); if (strcmp(cmdname, "configure") == 0) { char temp[1024]; char *section = strtok(NULL, ",)"); char *key = strtok(NULL, ",)"); char *value = strtok(NULL, ",)"); char *newvalue = value; if (value[0] == '%') { value++; char *t = strchr(value, '%'); //Post Beta - we have to figure a way to handle these cases - right now returning FALSE //causes the other commands to not be carried through- changing return FALSE to TRUE if (!t) return TRUE;//*** Changed FALSE to TRUE *t = '\0'; newvalue = (char *)(LPCTSTR) GetGlobal(value); } if (!section || !key || !newvalue) return TRUE;//***Changed FALSE to TRUE if (!CopyFile(iniSrcPath, iniDstPath, TRUE)) DWORD e = GetLastError(); if (strcmp(key, "Program Folder Name") == 0) { CString browserName = GetGlobal("BrowserName"); if (strcmp(newvalue, "") == 0) strcpy(temp, browserName); else { browserName = browserName + " by "; strcpy(temp, browserName); } strcat(temp, newvalue); newvalue = temp; } CString encodedValue = newvalue; WritePrivateProfileString(section, key, ConvertUTF8toANSI(encodedValue), iniDstPath); } else if (strcmp(cmdname, "configureAddText") == 0) { char *fileToAdd = strtok(NULL, ",)"); // copy config.ini to destination if it hasn't already been done if (!CopyFile(iniSrcPath, iniDstPath, TRUE)) DWORD e = GetLastError(); CStdioFile sfConfig, sfAddText; CString strAddTextFile = rootPath + fileToAdd; if (sfConfig.Open(iniDstPath, CFile::modeReadWrite | CFile::typeText) == 0) return TRUE; if (sfAddText.Open(strAddTextFile, CFile::modeRead | CFile::typeText) == 0) { sfConfig.Close(); return TRUE; } sfConfig.SeekToEnd(); CString strLine; while(sfAddText.ReadString(strLine)) { sfConfig.WriteString(strLine + '\n'); } sfAddText.Close(); sfConfig.Flush(); sfConfig.Close(); } else if (strcmp(cmdname, "replaceXPI") == 0) { char *xpiname = strtok(NULL, ",)"); char *jname = strtok(NULL, ",)"); char *xpifile = strtok(NULL, ",)"); char *value = strtok(NULL, ",)"); char *newvalue = value; CString jarname = jname; if (value[0] == '%') { value++; char *t = strchr(value, '%'); if (!t) return TRUE;//*** Changed FALSE to TRUE *t = '\0'; newvalue = (char *)(LPCTSTR) GetGlobal(value); } if (!xpiname || !xpifile || !newvalue) return TRUE;//*** Changed FALSE to TRUE /*Post Beta -This is a hack to prevent the last page from staying up there endlessly; We check to see if the filename is null and if it is, we return true so that the return value isn't made FALSE */ CString filename = newvalue; if (filename.IsEmpty()) return TRUE; //////////////////////////////// //check to see if it is a jar and then do accordingly if (jarname.CompareNoCase("no.jar")==0) ExtractXPIFile(xpiname, xpifile); else ExtractJARFile(xpiname, jarname, xpifile); if (!CopyFile(newvalue, xpifile, FALSE)) { DWORD e = GetLastError(); return TRUE;//*** Changed FALSE to TRUE } } // If the string in script.ib matches "addrdfFile" perform this code // This code decompresses the xpi files to which the rdf files must be // added and copies the rdf files (mailaccount.rdf and newsaccount.rdf) // from the Temp directory to the resulting directory after decompression else if (strcmp(cmdname, "addrdfFile") == 0) { char *xpiname = strtok(NULL, ",)"); // xpi file name char *jname = strtok(NULL, ",)"); // jar name within xpi file char *xpifile = strtok(NULL, ",)"); // directory path within jar file char *value2 = strtok(NULL, ",)"); // name of rdf file to be added char *value = strtok(NULL, ",)"); // variable which specifies the path of the Temp dir char *newvalue = value; CString jarname = jname; if (value[0] == '%') { value++; char *t = strchr(value, '%'); if (!t) return TRUE;//*** Changed FALSE to TRUE *t = '\0'; newvalue = (char *)(LPCTSTR) GetGlobal(value); } if (!xpiname || !xpifile || !newvalue) return TRUE;//*** Changed FALSE to TRUE CString command; if (strcmp(value2,"newsaccount.rdf") != 0) { if (findXPI(xpiname, xpifile)) return TRUE; } // nscpxpipath = \CCKTool\NSCPXPI CString xpiArchive = nscpxpiPath + "\\" + xpiname; // decompressing the directory path within the XPI file command = quotes +rootPath + "unzip.exe"+ quotes + "-o" + spaces + quotes + xpiArchive + quotes + spaces + quotes + xpifile + "/*.*" + quotes; ExecuteCommand((char *)(LPCTSTR) command, SW_HIDE, INFINITE); CString xpifile1 = xpifile; CString tempval=value2; CString newxpifile = xpifile1 + "/" + tempval; // copy rdf file from Temp directory if (!CopyFile(newvalue, newxpifile, FALSE)) { DWORD e = GetLastError(); return TRUE;//*** Changed FALSE to TRUE } } else if ((strcmp(cmdname, "modifySidebar") == 0) || (strcmp(cmdname, "modifyBookmarks") == 0) || (strcmp(cmdname, "modifyHelpMenu") == 0)) { // extract the file to be modified from the jar/xpi // and process the file char *xpiname = strtok(NULL, ",)"); // xpi file name char *jarname = strtok(NULL, ",)"); // jar name within xpi file char *filename = strtok(NULL, ",)"); // file name within jar file CString inputFile = filename; inputFile.Replace("/","\\"); inputFile = tempPath + "\\" + inputFile; CString outputFile = inputFile + ".new"; if (!xpiname || !filename) return TRUE; //check to see if it is a jar and then do accordingly if (stricmp(jarname,"no.jar")==0) ExtractXPIFile(xpiname, filename); else ExtractJARFile(xpiname, (CString)jarname, filename); if (strcmp(cmdname, "modifySidebar") == 0) ModifySidebar(inputFile, outputFile); else if (strcmp(cmdname, "modifyBookmarks") == 0) ModifyBookmarks(inputFile, outputFile); else if (strcmp(cmdname, "modifyHelpMenu") == 0) ModifyHelpMenu(inputFile, outputFile); remove(inputFile); rename(outputFile, inputFile); } else if (strcmp(cmdname, "removeNIMRestart") == 0) { // extract the file to be modified from the jar/xpi // and process the file char *xpiname = strtok(NULL, ",)"); // xpi file name char *jarname = strtok(NULL, ",)"); // jar name within xpi file char *filename = strtok(NULL, ",)"); // file name within jar file CString inputFile = filename; inputFile.Replace("/","\\"); inputFile = tempPath + "\\" + inputFile; CString outputFile = inputFile + ".new"; if (!xpiname || !filename) return TRUE; //check to see if it is a jar and then do accordingly if (stricmp(jarname,"no.jar")==0) ExtractXPIFile(xpiname, filename); else ExtractJARFile(xpiname, (CString)jarname, filename); if(!(RemoveNIMRestart(inputFile, outputFile))) remove(outputFile); else { remove(inputFile); rename(outputFile, inputFile); } } else if ((strcmp(cmdname, "modifyDTD") == 0) || (strcmp(cmdname, "modifyJS") == 0) || (strcmp(cmdname, "modifyJS1") == 0) || (strcmp(cmdname, "modifyJS2") == 0) || (strcmp(cmdname, "modifyHomepageURL") == 0) || (strcmp(cmdname, "modifyProperties") == 0) || (strcmp(cmdname, "modifyHashedPrefString") == 0) || (strcmp(cmdname, "modifyHashedPrefInt") == 0) || (strcmp(cmdname, "modifyHashedPrefBool") == 0)) { char *xpiname = strtok(NULL, ",)"); char *jname = strtok(NULL, ",)"); char *xpifile = strtok(NULL, ",)"); char *entity = strtok(NULL, ",)"); char *value = strtok(NULL, ",)"); char *newvalue = value; CString jarname = jname; if (value[0] == '%') { value++; char *t = strchr(value, '%'); if (!t) return TRUE;//*** Changed FALSE to TRUE *t = '\0'; newvalue = (char *)(LPCTSTR) GetGlobal(value); } if (!xpiname || !xpifile || !entity || !newvalue) return TRUE;//*** Changed FALSE to TRUE //check to see if it is a jar and then do accordingly if (jarname.CompareNoCase("no.jar")==0) ExtractXPIFile(xpiname, xpifile); else ExtractJARFile(xpiname, jarname, xpifile); if (strcmp(cmdname, "modifyHashedPrefString") == 0) ModifyHashedPref(xpifile,entity,newvalue, "string", TRUE); else if (strcmp(cmdname, "modifyHashedPrefInt") == 0) ModifyHashedPref(xpifile,entity,newvalue, "int", TRUE); else if (strcmp(cmdname, "modifyHashedPrefBool") == 0) ModifyHashedPref(xpifile,entity,newvalue, "bool", TRUE); else if (strcmp(cmdname, "modifyHomepageURL") == 0) ModifyHomepageURL(xpifile,entity,newvalue); else if (strcmp(cmdname, "modifyJS") == 0) ModifyJS(xpifile,entity,newvalue, FALSE); else if (strcmp(cmdname, "modifyProperties") == 0) ModifyProperties(xpifile,entity,newvalue); else if (strcmp(cmdname, "modifyJS1") == 0) ModifyJS1(xpifile,entity,newvalue, FALSE); else if (strcmp(cmdname, "modifyJS2") == 0) ModifyJS2(xpifile,entity,newvalue, FALSE); else { // If the browser window's title bar text field is empty, // the default browser value is displayed if ((strcmp(entity,"mainWindow.titlemodifier") == 0) && (strcmp(newvalue,"") == 0)) newvalue = "&brandShortName;"; ModifyDTD(xpifile, entity, newvalue); } } else if (strcmp(cmdname, "wrapXPI") == 0) { } else if (strcmp(cmdname, "processMailNews") == 0) { ProcessMailNews(); } else if (strcmp(cmdname, "processPrefsTree") == 0) { char *prefsTreeFile = strtok(NULL, ",)"); CString fileWithPath = configPath + "\\" + prefsTreeFile; char *installFile = strtok(NULL, ",)"); gstrInstallFile = installFile; char *cfgPrefFile = strtok(NULL, ",)"); gstrCFGPrefFile = cfgPrefFile; char *plainPrefFile = strtok(NULL, ",)"); gstrPlainPrefFile = plainPrefFile; ProcessPrefsTree(fileWithPath); } else if (strcmp(cmdname, "configureRemoteAdmin") == 0) { char *vConvert = strtok(NULL, ",)"); // if set, then do the convert to remote admin if (vConvert[0] == '%') { vConvert++; char *t = strchr(vConvert, '%'); if (!t) return TRUE; *t = '\0'; char *bConvert = (char *)(LPCTSTR) GetGlobal(vConvert); // The convert checkbox was not checked. No need to continue. if (strcmp(bConvert, "1") != 0) return TRUE; } char *url = strtok(NULL, ",)"); if (url[0] == '%') { url++; char *t = strchr(url, '%'); if (!t) return TRUE; *t = '\0'; url = (char *)(LPCTSTR) GetGlobal(url); if (!url) return TRUE; } char *prefFile = strtok(NULL, ",)"); if (!prefFile) return TRUE; ConfigureRemoteAdmin(url, prefFile); } else if (strcmp(cmdname, "modifyUserJS") == 0) { // modifyUserJS(XPIname, fileWithinXPI, JSsourcefile) // within XPI // modifyUserJS(browser.xpi, bin, jsedit.jsc) // example // modifyUserJS(none, pathAndFilename, JSsourcefile) // normal file // modifyUserJS(none, \autoadmin\test.jsc, jsedit.jsc) // example char *xpiname = strtok(NULL, ",)"); char *filename = strtok(NULL, ",)"); char *jssource = strtok(NULL, ",)"); CString jsSourceFile = configPath + "\\" + jssource; // pull the cfg file out of the XPI // ExtractXPIFile(xpiname, filename); // replace the appropriate block of javascript // ModifyUserJS(filename, jsSourceFile); // cfg file gets repackaged with call to ReplaceXPIFiles in StartIB after all the interpret calls, // so no need to repacked it ourself. } else if (strcmp(cmdname, "markcfgversion") == 0) { char *xpiname = strtok(NULL, ",)"); char *filename = strtok(NULL, ",)"); char *versiontxt = strtok(NULL, ",)"); // make a substitution if the text is a variable if (versiontxt[0] == '%') { versiontxt++; char *t = strchr(versiontxt, '%'); if (t) { *t = '\0'; versiontxt = (char *)(LPCTSTR) GetGlobal(versiontxt); } } // pull the cfg file out of the XPI // ExtractXPIFile(xpiname, filename); // replace the appropriate block of javascript // MarkCFGVersion(filename, versiontxt); // cfg file gets repackaged with call to ReplaceXPIFiles in StartIB after all the interpret calls, // so no need to repacked it ourself. } else return FALSE;//*** We have to handle this condition better. return TRUE; } void init_components() { int i; WIDGET *w = findWidget("SelectedComponents"); BuildComponentList(Components, &numComponents, iniSrcPath,0); // Turn off components that aren't selected for (i=0; ivalue), Components[i].name) == NULL)) { if (!(Components[i].selected && Components[i].invisible)) Components[i].selected = FALSE; } else if ((Components[i].additional) || (Components[i].visible)) Components[i].selected = TRUE; } } /*Post Beta - we will use the DISABLED key. Now this is implemented the round about way here. We have to take only the components that are chosen and mark the rest as disabled Disabled doesn't work now - so what we are doing is rewriting every key in the sections. besides that we are also deleting the keys in the setup types 2&3 so that we have only two as per request of mktg. */ void invisible() { CString Setup0Long = "Program will be installed with the most common options"; CString Setup1Long = "You may choose the options you want to install. Recommended for advanced users."; WritePrivateProfileString("Setup Type0", NULL, "", iniDstPath); WritePrivateProfileString("Setup Type2", NULL, "", iniDstPath); WritePrivateProfileString("Setup Type0","Description Short",(LPCTSTR)Setup0Short,iniDstPath); WritePrivateProfileString("Setup Type0","Description Long", (LPCTSTR)Setup0Long,iniDstPath); WritePrivateProfileString("Setup Type2","Description Short",(LPCTSTR)Setup1Short,iniDstPath); WritePrivateProfileString("Setup Type2","Description Long", (LPCTSTR)Setup1Long,iniDstPath); WritePrivateProfileString("Setup Type1",NULL," ",iniDstPath); WritePrivateProfileString("Setup Type3",NULL," ",iniDstPath); CString Cee; tempWidget = findWidget("SelectedComponents"); CString component; for (int i=0; iSetPath(Target); psl->SetArguments(Arguments); psl->SetWorkingDirectory(WorkingDir); hres = psl->QueryInterface( IID_IPersistFile, (LPVOID *) &ppf); if (SUCCEEDED(hres)) { CString Temp = Link; Temp.MakeLower(); if (Temp.Find(".lnk")==-1) Link += ".lnk"; // Important !!! WORD wsz[MAX_PATH]; MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, Link, -1, wsz,MAX_PATH); hres = ppf->Save(wsz, TRUE); ppf->Release(); } psl->Release(); } } else { hres = _mkdir(Link); } return hres; } BOOL GetRegistryKey( HKEY key, char *subkey, char *retdata ) { long retval; HKEY hkey; retval = RegOpenKeyEx(key, subkey, 0, KEY_QUERY_VALUE, &hkey); if(retval == ERROR_SUCCESS) { long datasize = MAX_SIZE; char data[MAX_SIZE]; RegQueryValue(hkey,NULL,(LPSTR)data,&datasize); lstrcpy(retdata,data); RegCloseKey(hkey); } return retval; } CString GetBrowser(void) { char key[MAX_SIZE + MAX_SIZE]; CString retflag = ""; /* get the .htm regkey and lookup the program */ if(GetRegistryKey(HKEY_CLASSES_ROOT,".htm",key) == ERROR_SUCCESS) { lstrcat(key,"\\shell\\open\\command"); if(GetRegistryKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) { char *pos; pos = strstr(key,"\"%1\""); if(pos == NULL) /* if no quotes */ { /* now check for %1, without the quotes */ pos = strstr(key,"%1"); if(pos == NULL) /* if no parameter */ pos = key+lstrlen(key)-1; else *pos = '\0'; /* remove the parameter */ } else *pos = '\0'; /* remove the parameter */ retflag = key; } } return retflag; } CString SubstituteValues(CString inLine) // Replace tokens in script template with appropriate locale values { CString newValue, oldValue, strTemp; int tokenStartPos, tokenEndPos, searchPos=0, count=0; int inLineLength = inLine.GetLength(); while (count < inLineLength) { tokenStartPos = inLine.Find('%', searchPos); if (tokenStartPos != -1) { tokenEndPos = inLine.Find('%', tokenStartPos+1); tokenEndPos += 1; strTemp = inLine.Left(tokenEndPos); oldValue = strTemp.Right(tokenEndPos-tokenStartPos); WIDGET *w = findWidget(oldValue); if (w) { newValue = GetGlobal(oldValue); searchPos = 0; } else { newValue = oldValue; searchPos = tokenEndPos; } inLine.Replace(oldValue, newValue); count = tokenEndPos; } else count = inLineLength; } return inLine; } void CreateLinuxInstaller() { char currentdir[_MAX_PATH]; _getcwd(currentdir,_MAX_PATH); // delete tar.gz file of output dir if it already exists if (FileExists(xpiDstPath+"\\"+targzfile)) DeleteFile(xpiDstPath+"\\"+targzfile); // Copy customized files to templinux directory CopyDirectory(xpiDstPath, templinuxPath + xpiDir, TRUE); CopyFile(xpiDstPath+"\\Config.ini", templinuxPath+"\\Config.ini",FALSE); DeleteFile(templinuxPath + xpiDir + "\\Config.ini"); // Remove extra carriage returns in config.ini file FILE *fout = fopen(templinuxPath+"\\config.tmp", "wb"); if (!fout) { AfxMessageBox("Cannot open output file", MB_OK); exit(3); } FILE *fin = fopen(templinuxPath+"\\Config.ini", "rb"); if (!fin) { AfxMessageBox("Cannot open Config.ini file", MB_OK); exit(3); } else { char inbuf[BUF_SIZE], outbuf[BUF_SIZE]; int cnt2=0; while(!feof(fin)) { int count = fread(&inbuf, sizeof(char), sizeof(inbuf), fin); if (ferror(fin)) { AfxMessageBox("Error in reading Config.ini file", MB_OK); exit(3); } char *cpin = inbuf; char *cpout = outbuf; while (count-- > 0) { if (*cpin == CRVALUE) cpin++; else { *cpout++ = *cpin++; cnt2++; } } fwrite(&outbuf, sizeof(char), cnt2, fout); if (ferror(fout)) { AfxMessageBox("Error in writing Config.ini file", MB_OK); exit(3); } cnt2=0; } fclose(fin); } fputs("[END]\n", fout); fclose(fout); DeleteFile(templinuxPath+"\\Config.ini"); rename(templinuxPath+"\\config.tmp", templinuxPath+"\\config.ini"); _chdir(outputPath); int pos = targzfile.ReverseFind('.'); CString tarfile = targzfile.Left(pos); CopyFile(nscpxpiPath+"\\"+tarfile, xpiDstPath+"\\"+tarfile, FALSE); templinuxDirPath.Replace("\\", "/"); templinuxDirPath.Replace(":",""); templinuxDirPath.Insert(0,"/cygdrive/"); // Add customized xpi files to linux tar file CString command = "tar -rvf " + tarfile + " -C " + quotes + templinuxDirPath + quotes + spaces + strNscpInstaller; ExecuteCommand((char *)(LPCTSTR) command, SW_HIDE, INFINITE); // Compress tar file to create customized tar.gz file command = "gzip " + tarfile; ExecuteCommand((char *)(LPCTSTR) command, SW_HIDE, INFINITE); _chdir(currentdir); } void CreateMacZipFile() // Creating a single customized Mac zip file which contains mac scripts // and customized mac files { CString customizedZipFile = "CustomizedMacFiles.zip"; if (FileExists(customizedZipFile)) DeleteFile(customizedZipFile); // Adding Mac scripts shipped with the tool to the final Mac zip file CString command = quotes + rootPath + "zip.exe" + quotes + spaces + "-j" + spaces + quotes + xpiDstPath + "\\" + customizedZipFile + quotes + spaces + quotes + platformPath + "\\*.*" + quotes; ExecuteCommand((char *)(LPCTSTR) command, SW_HIDE, INFINITE); // Adding customized mac files created in output directory to the // final Mac zip file command = quotes + rootPath + "zip.exe" + quotes + spaces + "-jm" + spaces + quotes + xpiDstPath + "\\" + customizedZipFile + quotes + spaces + quotes + xpiDstPath + "\\*.*" + quotes + " -x autoconfig.jsc"; ExecuteCommand((char *)(LPCTSTR) command, SW_HIDE, INFINITE); } void InsertComma(CString& requiredSpace) { int len = requiredSpace.GetLength(); int pos = len%3; if (pos == 0) pos = 3; for(int i=pos; i= 0) { //We should never enter this condition via wizardmachine.exe AfxMessageBox("The current .che file called: "+file+" contains some unfilled parameters." "These parameters will appear between two percent (%) signs such as %Root%" "Please replace these parameters with their appropriate values and restart" "the program", MB_OK); // value=theInterpreter->replaceVars((char *) (LPCSTR) value,NULL); } WIDGET* w = SetGlobal(name, value); if (w) w->cached = TRUE; } } } fclose(globs); return TRUE; } int StartIB(/*CString parms, WIDGET *curWidget*/) { char *fgetsrv; int rv = TRUE; char olddir[1024]; CString curVersion, localePath, strLang, strRegion, strREGION; componentOrder = 0; rootPath = GetModulePath(); SetGlobal("Root", rootPath); configName = GetGlobal("_NewConfigName"); SetGlobal("CustomizationList", configName); curVersion = GetGlobal("Version"); curPlatform = GetGlobal("lPlatform"); platformPath = rootPath+"Version\\"+curVersion+"\\"+curPlatform; curLanguage = GetLocaleCode(GetGlobal("Language")); localePath = rootPath+"Version\\"+curVersion+"\\"+curPlatform+"\\"+curLanguage; configPath = rootPath + "Configs\\" + configName; outputPath = configPath + "\\Output"; cdPath = configPath + "\\Output\\Core"; cdshellPath = configPath + "\\Output\\Shell"; remoteAdminFile = outputPath + "\\autoconfig.jsc"; networkPath = configPath + "\\Network"; tempPath = configPath + "\\Temp"; iniDstPath = cdPath + "\\config.ini"; scriptPath = rootPath + "script_" + curPlatform + ".ib"; workspacePath = configPath + "\\Workspace"; shellPath = workspacePath + "\\Autorun\\"; xpiDstPath = cdPath; // variables for language-region information strLang = curLanguage.Left(2); strRegion = curLanguage.Right(2); strREGION = strRegion; strREGION.MakeUpper(); SetGlobal("%lang%", strLang); SetGlobal("%region%", strRegion); SetGlobal("%REGION%", strREGION); // initializing variables for CCK linux build templinuxPath = tempPath + "\\templinux\\netscape-installer"; xpiDir = "\\xpi"; templinuxDir = "tempLinux"; targzfile = "netscape-i686-pc-linux-gnu-sea.tar.gz"; templinuxDirPath = tempPath + "\\" + templinuxDir; // AfxMessageBox("set breakpoint",MB_OK); // delete contents of output directory before creating customized installer EraseDirectory(outputPath); if (SearchPath(workspacePath, "NSCPXPI", NULL, 0, NULL, NULL)) nscpxpiPath = workspacePath + "\\NSCPXPI"; else nscpxpiPath = localePath + "\\Nscpxpi"; if (curPlatform == "Linux") { // Create directories for temporarily storing customized files _mkdir(tempPath); _chdir(tempPath); _mkdir(templinuxDir); _mkdir(templinuxPath); _mkdir(templinuxPath + xpiDir); } iniSrcPath = nscpxpiPath + "\\config.ini"; init_components(); //Check for disk space before continuing ULARGE_INTEGER nTotalBytes, nTotalFreeBytes, nTotalAvailable; GetDiskFreeSpaceEx(NULL,&nTotalAvailable, &nTotalBytes, &nTotalFreeBytes); if (curPlatform == "Windows") { ULONGLONG reqdWinDiskSpace = ComputeReqdWinDiskSpace(); if ((nTotalAvailable.QuadPart) < reqdWinDiskSpace) { DiskSpaceAlert(reqdWinDiskSpace, (nTotalAvailable.QuadPart)); return FALSE; } } else if (curPlatform == "Linux") { if ((nTotalAvailable.QuadPart) < LDISK_SPACE) { DiskSpaceAlert(LDISK_SPACE,(nTotalAvailable.QuadPart)); return FALSE; } } else if (curPlatform == "Mac OS") { ULONGLONG reqdMacDiskSpace = ComputeReqdMacDiskSpace(); if ((nTotalAvailable.QuadPart) < reqdMacDiskSpace) { DiskSpaceAlert(reqdMacDiskSpace, (nTotalAvailable.QuadPart)); return FALSE; } } //Check for Disk space over //checking for the autorun CD shell - inorder to create a Core dir or not CString cdDir= GetGlobal("CD image"); CString networkDir = GetGlobal("Network"); CString ftpLocation = GetGlobal("FTPLocation"); //checking to see if the AnimatedLogoURL has a http:// appended in front of it //if not then we have to append it; //Check to see if the User Agent string exists and if so then prefix with -CK //(-CK can be replaced with a string UserAgentPrefix global.) CString userAgentPrefix = GetGlobal("UserAgentPrefix"); if (userAgentPrefix.IsEmpty()) userAgentPrefix = "CK-"; CString userAgent = GetGlobal("OrganizationName"); if (userAgent) { CString templeft = userAgent.Left(3); if ((templeft.CompareNoCase(userAgentPrefix)) != 0) userAgent = userAgentPrefix + userAgent; } SetGlobal("OrganizationName",userAgent); // check to see if the bmp for rshell background is bigger than 302KB; HANDLE hFile; DWORD dwFileSize; CString Rshellbmp = GetGlobal("ShellBgBitmap"); hFile = CreateFile ((LPCTSTR)Rshellbmp,GENERIC_READ,FILE_SHARE_READ,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL); dwFileSize = GetFileSize (hFile, NULL); int returnValue; if (dwFileSize < 300000) returnValue = AfxMessageBox("You have chosen a background BitMap that is too small for the customized RShell-If you want to proceed anyway choose Cancel or click on Retry and go back and make your changes",MB_RETRYCANCEL); if (returnValue == IDRETRY) return FALSE; //end of filesize check; // Check to see if the animatedlogourl has the http before it or not- else the browser // looks only in the chrome directory. CString animLogoUrl = GetGlobal("AnimatedLogoURL"); CString leftvalue = animLogoUrl.Left(7); CString httpvalue = "http://"; if (leftvalue.CompareNoCase("http://") != 0) { httpvalue = httpvalue + animLogoUrl; SetGlobal("AnimatedLogoURL",httpvalue); } CString HelpUrl = GetGlobal("HelpMenuCommandURL"); leftvalue = HelpUrl.Left(7); httpvalue = "http://"; if (leftvalue.CompareNoCase("http://") != 0) { httpvalue = httpvalue + HelpUrl; SetGlobal("HelpMenuCommandURL",httpvalue); } CString setIspRDF = tempPath +"\\mailaccount.rdf"; SetGlobal("IspRDF",setIspRDF); CreateIspMenu(); CString setnewsRDF = tempPath +"\\newsaccount.rdf"; SetGlobal("NewsRDF",setnewsRDF); CreateNewsMenu(); // Determine which proxy configuration is chosen CString proxyConfigoption = GetGlobal("radioGroup2"); if (proxyConfigoption == "3") SetGlobal("ProxyConfig","2"); else if (proxyConfigoption == "2") SetGlobal("ProxyConfig","1"); else SetGlobal("ProxyConfig","0"); // Determine which SOCKS version is chosen CString socksVer = GetGlobal("socksv"); if (socksVer == "SOCKS v4") SetGlobal("SocksVersion","4"); else SetGlobal("SocksVersion","5"); if ((cdDir.Compare("1")==0) && (curPlatform.Compare("Windows")==0)) { _mkdir((char *)(LPCTSTR) cdPath); } else { iniDstPath = outputPath + "\\config.ini"; xpiDstPath = outputPath; } ///////////////////////////// _mkdir((char *)(LPCTSTR) tempPath); _mkdir((char *)(LPCTSTR) workspacePath); // Copying config.ini file to the output directory if (!CopyFile(iniSrcPath, iniDstPath, TRUE)) DWORD e = GetLastError(); // _mkdir((char *)(LPCTSTR) cdshellPath); GetCurrentDirectory(sizeof(olddir), olddir); if(SetCurrentDirectory((char *)(LPCTSTR) tempPath) == FALSE) { AfxMessageBox("Windows System Error:Unable to change directory",MB_OK); return TRUE; } //PostBeta - We have to inform the user that he has not set any value //and that it will default. Returning TRUE so that it doesn't stay in the last //screen forever. // Read in script file and interpret commands from it FILE *f = fopen(scriptPath, "r"); if (!f) rv = FALSE; else { int done = FALSE; while (!done) { fgetsrv = fgets(buffer, sizeof(buffer), f); done = feof(f); if (!done) { if (!fgetsrv || ferror(f)) { rv = FALSE; break; } buffer[strlen(buffer)] = '\0'; // Eliminate the trailing newline CString strTempBuffer = buffer; strcpy(buffer, SubstituteValues(strTempBuffer)); if (!interpret(buffer)) { rv = FALSE; break; } } } fclose(f); } // Copy the .cfg, if it exists, to the output directory in case the user // wants to save it or look at it or something. if (!gstrCFGPrefFile.IsEmpty()) { int ipos = gstrCFGPrefFile.ReverseFind('/'); if (ipos >= 0) { CString baseFilename = gstrCFGPrefFile.Right(gstrCFGPrefFile.GetLength() - (ipos + 1)); CopyFile(tempPath+"\\bin\\"+baseFilename, outputPath+"\\"+baseFilename, FALSE); // FALSE to overwrite } } // Put all the extracted files back into their new XPI homes ReplaceJARFiles(); ReplaceXPIFiles(); // Copy remaining default installer files into config // preserving any existing files that we created already // in previous steps /* -- Need to be more selective than this CopyDir(nscpxpiPath, cdPath, NULL, FALSE); */ for (int i=0; i