#include "stdafx.h" #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 int interpret(char *cmd); CString rootPath; CString configName; CString configPath; CString workspacePath; CString cdPath; CString networkPath; CString tempPath; CString iniDstPath; CString iniSrcPath; CString scriptPath; CString nscpxpiPath; CString cdshellPath; CString outputPath; CString xpiDstPath; WIDGET *tempWidget; char buffer[50000]; XPI xpiList[100]; int xpiLen = -1; JAR jarList[100]; int jarLen = -1; // Setup Sections for config.ini CString Setup0Short = "&Recommended"; CString Setup1Short = "C&ustom"; CString quotes = "\""; CString spaces = " "; BOOL prefDoesntExist = TRUE; COMPONENT Components[100]; int numComponents; int componentOrder; int findXPI(CString xpiname, CString filename) { int found = FALSE; for (int i=0; !found && i<=xpiLen; i++) 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; 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; xpiArcDest = xpiDstPath + "\\" + xpiList[i].xpiname; if (!CopyFile(xpiArchive, xpiArcDest, TRUE)) DWORD e = GetLastError(); 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; } 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; //We have to get rid of the bin/chrome/ and hence the delete. jarname.Delete(0,11); if (findJAR(jarname, xpifile)) return TRUE; // Can use -d instead of change CWD??? CString jarArchive = tempPath + "\\bin\\chrome\\" + jarname; 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? 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("N6Setup.zip"); CString exeName("N6Setup.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_SHOW, INFINITE); // Copy the Readme file to the core directory and insert it inside the N6Setup.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_SHOW, INFINITE); // Finished copying readme and inserting into the zip********** command2 = copyb + quotes + rootPath + "unzipsfx.exe" + quotes + " + N6Setup.zip N6Setup.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_SHOW, INFINITE); DeleteFile("copycat.bat"); CString unzipN6 = quotes +rootPath + "unzip.exe"+ quotes + "-o" + spaces + quotes + zipName + quotes; ExecuteCommand((char *)(LPCTSTR) unzipN6, SW_SHOW, INFINITE); DeleteFile(zipName); SetCurrentDirectory(olddir); return TRUE; } void ModifyPref(char *buffer, CString entity, CString newvalue) { 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); 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: "<value, Components[i].name) == NULL)) { if (!(Components[i].selected && Components[i].invisible)) Components[i].selected = FALSE; } else if (Components[i].additional) 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 doesnt work now - so what we are doing is re writing 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 Type1", NULL, "", iniDstPath); WritePrivateProfileString("Setup Type0","Description Short",(LPCTSTR)Setup0Short,iniDstPath); WritePrivateProfileString("Setup Type0","Description Long", (LPCTSTR)Setup0Long,iniDstPath); WritePrivateProfileString("Setup Type1","Description Short",(LPCTSTR)Setup1Short,iniDstPath); WritePrivateProfileString("Setup Type1","Description Long", (LPCTSTR)Setup1Long,iniDstPath); WritePrivateProfileString("Setup Type2",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; } extern "C" __declspec(dllexport) int StartIB(CString parms, WIDGET *curWidget) { char *fgetsrv; int rv = TRUE; char olddir[1024]; componentOrder =0; rootPath = GetGlobal("Root"); configName = GetGlobal("CustomizationList"); configPath = rootPath + "Configs\\" + configName; outputPath = configPath + "\\Output"; cdPath = configPath + "\\Output\\Core"; cdshellPath = configPath + "\\Output\\Shell"; networkPath = configPath + "\\Network"; tempPath = configPath + "\\Temp"; iniDstPath = cdPath + "\\config.ini"; scriptPath = rootPath + "\\script.ib"; workspacePath = configPath + "\\Workspace"; xpiDstPath = cdPath; if (SearchPath(workspacePath, "NSCPXPI", NULL, 0, NULL, NULL)) nscpxpiPath = workspacePath + "\\NSCPXPI"; else nscpxpiPath = rootPath + "NSCPXPI"; iniSrcPath = nscpxpiPath + "\\config.ini"; //Check for disk space before continuing ULARGE_INTEGER nTotalBytes, nTotalFreeBytes, nTotalAvailable; GetDiskFreeSpaceEx(NULL,&nTotalAvailable, &nTotalBytes, &nTotalFreeBytes); if ((nTotalAvailable.QuadPart) > 17,505,658) ; else { AfxMessageBox("You dont have enough Disk space ", MB_OK); return FALSE; } //Check for Disk space over init_components(); //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 append -CCK to it ; CString userAgent = GetGlobal("OrganizationName"); CString tempAgent ="CCK -"; if (userAgent) tempAgent += userAgent; SetGlobal("OrganizationName",tempAgent); // 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); } // Create the HelpMenu.xul in the beginning so that it can be called from the script.ib CString setHlpRDF = tempPath +"\\helpMenu.rdf"; SetGlobal("HlpRDF",setHlpRDF); CreateHelpMenu(); if (cdDir.Compare("1") ==0) { _mkdir((char *)(LPCTSTR) cdPath); } else { iniDstPath = outputPath + "\\config.ini"; xpiDstPath = outputPath; } CNewDialog newprog; newprog.Create(IDD_NEW_DIALOG,NULL ); newprog.ShowWindow(SW_SHOW); ///////////////////////////// CWnd * dlg; CRect tmpRect = CRect(7,7,173,13); dlg = newprog.GetDlgItem(IDC_BASE_TEXT); CWnd* pwnd = newprog.GetDlgItem(IDD_NEW_DIALOG); dlg->SetWindowText(" Customization is in Progress"); ///////////////////////////// _mkdir((char *)(LPCTSTR) tempPath); _mkdir((char *)(LPCTSTR) workspacePath); // _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 doesnt 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 if (!interpret(buffer)) { rv = FALSE; break; } } } fclose(f); } dlg->SetWindowText(" Customization is in Progress \n |||||||||"); // Put all the extracted files back into their new XPI homes ReplaceJARFiles(); ReplaceXPIFiles(); dlg->SetWindowText(" Customization is in Progress \n ||||||||||||||||||"); // 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; iSetWindowText(" Customization is in Progress \n |||||||||||||||||||||||||||"); invisible(); dlg->SetWindowText(" Customization is in Progress \n ||||||||||||||||||||||||||||||||||||"); AddThirdParty(); dlg->SetWindowText(" Customization is in Progress \n |||||||||||||||||||||||||||||||||||||||||||||"); ReplaceINIFile(); dlg->SetWindowText(" Customization is in Progress \n ||||||||||||||||||||||||||||||||||||||||||||||||||||||"); SetCurrentDirectory(olddir); CString TargetDir = GetGlobal("Root"); CString TargetFile = TargetDir + "wizardmachine.ini"; CString MozBrowser = GetBrowser(); // CreateShortcut(MozBrowser, TargetFile, "HelpLink", TargetDir, FALSE); dlg->SetWindowText(" Customization is in Progress \n |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"); newprog.DestroyWindow(); return TRUE; }