#include "stdafx.h" #include #include #include "globals.h" #include "comp.h" #include "ib.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; WIDGET *tempWidget; int selCount; char buffer[50000]; XPI xpiList[100]; int xpiLen = -1; COMPONENT Components[100]; int numComponents; 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; if (findXPI(xpiname, xpifile)) return TRUE; // Can use -d instead of change CWD??? CString xpiArchive = nscpxpiPath + "\\" + xpiname; command = rootPath + "unzip.exe -o" + " " + xpiArchive + " " + xpifile; 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 = cdPath + "\\" + xpiList[i].xpiname; if (!CopyFile(xpiArchive, xpiArcDest, TRUE)) DWORD e = GetLastError(); command = rootPath + "zip.exe -m " + xpiArcDest + " " + xpiList[i].filename; ExecuteCommand((char *)(LPCTSTR) command, SW_HIDE, INFINITE); } return TRUE; } int ReplaceINIFile() { CString command; CString exeName("Seamonkey32e.exe"); char olddir[1024]; GetCurrentDirectory(sizeof(olddir), olddir); if(SetCurrentDirectory((char *)(LPCTSTR) cdPath) == FALSE) return FALSE; CString Src = nscpxpiPath + "\\" +exeName; CString Dst = cdPath + "\\" + exeName; if (!CopyFile(Src, Dst, TRUE)) DWORD e = GetLastError(); command = rootPath + "nszip.exe " + exeName + " config.ini"; ExecuteCommand((char *)(LPCTSTR) command, SW_SHOW, INFINITE); SetCurrentDirectory(olddir); return TRUE; } void ModifyEntity(char *buffer, CString entity, CString newvalue) { CString buf(buffer); entity = entity + " "; // Ensure we don't get false matches int i = buf.Find(entity); if (i == -1) return; 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); } int ModifyDTD(CString xpifile, CString entity, CString newvalue) { CString newfile = xpifile + ".new"; int rv = TRUE; char *fgetsrv; // Read in DTD file and make substitutions FILE *srcf = fopen(xpifile, "r"); FILE *dstf = fopen(newfile, "w"); if (!srcf) rv = FALSE; else { int done = FALSE; while (!done) { fgetsrv = fgets(buffer, sizeof(buffer), srcf); done = feof(srcf); if (!done) { if (!fgetsrv || ferror(srcf)) { rv = FALSE; break; } ModifyEntity(buffer, entity, newvalue); fputs(buffer, dstf); } } fclose(srcf); fclose(dstf); } remove(xpifile); rename(newfile, xpifile); 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, '%'); if (!t) return FALSE; *t = '\0'; newvalue = (char *)(LPCTSTR) GetGlobal(value); } if (!section || !key || !newvalue) return FALSE; if (!CopyFile(iniSrcPath, iniDstPath, TRUE)) DWORD e = GetLastError(); if (strcmp(key, "Program Folder Name") == 0) { strcpy(temp, "Netscape Communicator by "); strcat(temp, newvalue); newvalue = temp; } WritePrivateProfileString(section, key, newvalue, iniDstPath); } else if (strcmp(cmdname, "replaceXPI") == 0) { char *xpiname = strtok(NULL, ",)"); char *xpifile = strtok(NULL, ",)"); char *value = strtok(NULL, ",)"); char *newvalue = value; if (value[0] == '%') { value++; char *t = strchr(value, '%'); if (!t) return FALSE; *t = '\0'; newvalue = (char *)(LPCTSTR) GetGlobal(value); } if (!xpiname || !xpifile || !newvalue) return FALSE; ExtractXPIFile(xpiname, xpifile); if (!CopyFile(newvalue, xpifile, FALSE)) { DWORD e = GetLastError(); return FALSE; } } else if (strcmp(cmdname, "modifyDTD") == 0) { char *xpiname = strtok(NULL, ",)"); char *xpifile = strtok(NULL, ",)"); char *entity = strtok(NULL, ",)"); char *value = strtok(NULL, ",)"); char *newvalue = value; if (value[0] == '%') { value++; char *t = strchr(value, '%'); if (!t) return FALSE; *t = '\0'; newvalue = (char *)(LPCTSTR) GetGlobal(value); } if (!xpiname || !xpifile || !entity || !newvalue) return FALSE; ExtractXPIFile(xpiname, xpifile); ModifyDTD(xpifile, entity, newvalue); } else if (strcmp(cmdname, "wrapXPI") == 0) { } else return FALSE; return TRUE; } void init_components() { int i; WIDGET *w = findWidget("SelectedComponents"); BuildComponentList(Components, &numComponents, iniSrcPath); // Turn off components that aren't selected for (i=0; ivalue, Components[i].name) == NULL) Components[i].selected = FALSE; } void invisible() { tempWidget = findWidget("SelectedComponents"); CString component; { selCount = (((CCheckListBox *)tempWidget->control))->GetCount(); for (int i=0; i < selCount; i++) { if (((CCheckListBox *)tempWidget->control)->GetCheck(i) != 1) { component = Components[i].compname; WritePrivateProfileString(Components[i].compname, "Attributes", "INVISIBLE", iniDstPath); } } } } void AddThirdParty() { CString tpCompPath1 = GetGlobal("CustomComponent1"); CString tpCompPath2 = GetGlobal("CustomComponent137"); CString tpComp1 = GetGlobal("CustomComponent2"); CString tpComp2 = GetGlobal("CustomComponent23"); CString tpCompSize1 = GetGlobal("ComponentSize"); CString tpCompSize2 = GetGlobal("ModuleSize"); CString componentName; CString cName; CString compSDesc = "Description Short="; CString compLDesc = "Description Long="; CString compArchive = "Archive="; CString compISize = "Install Size="; CString compAttrib = "Attributes=SELECTED|LAUNCHAPP"; int archiveLen = tpCompPath1.GetLength(); int findLen = tpCompPath1.ReverseFind('\\'); CString Archive1 = tpCompPath1.Right(archiveLen - findLen -1); archiveLen = tpCompPath2.GetLength(); findLen = tpCompPath2.ReverseFind('\\'); CString Archive2 = tpCompPath2.Right(archiveLen - findLen -1); CString tempstr; char *cBuffer1 = new char [MAX_SIZE]; char *p = cBuffer1; strcpy(p,LPCTSTR(compSDesc + tpComp1)); tempstr = compSDesc + tpComp1; p += (tempstr.GetLength() +1); strcpy(p,LPCTSTR(compLDesc + tpComp1)); tempstr = compLDesc + tpComp1; p += (tempstr.GetLength() +1); strcpy(p,LPCTSTR(compArchive + Archive1)); tempstr = compArchive + Archive1; p += (tempstr.GetLength() +1); strcpy(p,LPCTSTR(compISize + tpCompSize1)); tempstr = compISize + tpCompSize1; p += (tempstr.GetLength() +1); strcpy(p,LPCTSTR(compAttrib)); p += (compAttrib.GetLength() +1); *p = 0; char *cBuffer2 = new char [MAX_SIZE]; char *q = cBuffer2; strcpy(q,LPCTSTR(compSDesc + tpComp2)); tempstr = compSDesc + tpComp2; q += (tempstr.GetLength() +1); strcpy(q,LPCTSTR(compLDesc + tpComp2)); tempstr = compLDesc + tpComp2; q += (tempstr.GetLength() +1); strcpy(q,LPCTSTR(compArchive + Archive2)); tempstr = compArchive + Archive2; q += (tempstr.GetLength() +1); strcpy(q,LPCTSTR(compISize + tpCompSize2)); tempstr = compISize + tpCompSize2; q += (tempstr.GetLength() +1); strcpy(q,LPCTSTR(compAttrib)); q += (compAttrib.GetLength() +1); *q = 0; /* char cBuffer1[MAX_SIZE][MAX_SIZE]={LPCTSTR(compSDesc + tpComp1),LPCTSTR(compLDesc + tpComp1), LPCTSTR(compArchive + Archive1),LPCTSTR(compISize + tpCompSize1), LPCTSTR(compAttrib)}; char *cBuffer2[]={LPCTSTR(compSDesc + tpComp2),LPCTSTR(compLDesc + tpComp2), LPCTSTR(compArchive + Archive2),LPCTSTR(compISize + tpCompSize2), LPCTSTR(compAttrib)}; */ if (!tpCompPath1.IsEmpty()) { componentName.Format("Component%d", (selCount)); cName.Format("C%d", (selCount -1)); WritePrivateProfileString("Setup Type0", cName, componentName, iniDstPath); WritePrivateProfileString("Setup Type1", cName, componentName, iniDstPath); WritePrivateProfileString("Setup Type2", cName, componentName, iniDstPath); WritePrivateProfileString("Setup Type3", cName, componentName, iniDstPath); WritePrivateProfileSection(componentName, cBuffer1, iniDstPath); selCount++; CopyFile(tpCompPath1, cdPath + "\\" + Archive1, FALSE); DWORD e1 = GetLastError(); } if (!tpCompPath2.IsEmpty()) { componentName.Format("Component%d", (selCount)); cName.Format("C%d", (selCount -1)); WritePrivateProfileString("Setup Type0", cName, componentName, iniDstPath); WritePrivateProfileString("Setup Type1", cName, componentName, iniDstPath); WritePrivateProfileString("Setup Type2", cName, componentName, iniDstPath); WritePrivateProfileString("Setup Type3", cName, componentName, iniDstPath); WritePrivateProfileSection(componentName, cBuffer2, iniDstPath); CopyFile(tpCompPath2, cdPath + "\\" + Archive2, FALSE); DWORD e2 = GetLastError(); } delete [] cBuffer1; delete [] cBuffer2; } HRESULT CreateShortcut(const CString Target, const CString Arguments, const CString LinkFileName, const CString WorkingDir, bool IsFolder) { // Initialize OLE libraries if (!AfxOleInit()) return FALSE; HRESULT hres; CString Desktop=getenv("USERPROFILE"); Desktop += "\\Desktop\\"; CString Link = Desktop + LinkFileName; if (!IsFolder) { IShellLink* psl; hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*) &psl); if (SUCCEEDED(hres)) { IPersistFile* ppf; psl->SetPath(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; } /*BOOL Progress() { CProgressCtrl progressDlg(this); progressDlg.Create(IDD_NEW_DIALOG); CProgressCtrl *pProgressDlg = &progressDlg; //CRuntimeClass *pProgDlgThread = RUNTIME_CLASS(CProgDlgThread); //This is the multi-threading stuff for the progress dialog //AfxBeginThread(pProgDlgThread); pProgressDlg->m_ProgressText.SetWindowText("Creating a CD Layout..."); pProgressDlg->m_ProgressBar.SetPos(0); pProgressDlg->m_ProgressBar.SetRange(0,4); pProgressDlg->m_ProgressBar.SetStep(1); pProgressDlg->m_ProgressText.SetWindowText("Loading Globals..."); // LoadGlobals(); pProgressDlg->m_ProgressBar.StepIt(); pProgressDlg->UpdateWindow(); pProgressDlg->m_ProgressText.SetWindowText("Reading files..."); // ReadIniFile(); pProgressDlg->m_ProgressBar.StepIt(); pProgressDlg->UpdateWindow(); pProgressDlg->m_ProgressText.SetWindowText("Merging files..."); // MergeFiles(); pProgressDlg->m_ProgressBar.StepIt(); pProgressDlg->UpdateWindow(); pProgressDlg->m_ProgressText.SetWindowText("Creating CD Layout..."); // CreateMedia(); pProgressDlg->m_ProgressBar.StepIt(); pProgressDlg->UpdateWindow(); AfxMessageBox("CD Directory created", MB_OK); } return TRUE; } */ extern "C" __declspec(dllexport) int StartIB(CString parms, WIDGET *curWidget) { char *fgetsrv; int rv = TRUE; char olddir[1024]; 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"; if (SearchPath(workspacePath, "NSCPXPI", NULL, 0, NULL, NULL)) nscpxpiPath = workspacePath + "\\NSCPXPI"; else nscpxpiPath = rootPath + "NSCPXPI"; iniSrcPath = nscpxpiPath + "\\config.ini"; init_components(); 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) cdPath); _mkdir((char *)(LPCTSTR) tempPath); _mkdir((char *)(LPCTSTR) workspacePath); // _mkdir((char *)(LPCTSTR) cdshellPath); GetCurrentDirectory(sizeof(olddir), olddir); if(SetCurrentDirectory((char *)(LPCTSTR) tempPath) == FALSE) return FALSE; // 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(" Replacing XPI Files"); // Put all the extracted files back into their new XPI homes ReplaceXPIFiles(); dlg->SetWindowText(" Copying default files into the configuration"); // 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); */ CString cdDir= GetGlobal("CD image"); CString networkDir = GetGlobal("Network"); CString ftpLocation = GetGlobal("FTPLocation"); for (int i=0; iSetWindowText(" Checking for neccessary components to install"); invisible(); dlg->SetWindowText(" Checking for Third Party Software"); AddThirdParty(); dlg->SetWindowText(" Replacing config.ini"); ReplaceINIFile(); dlg->SetWindowText(" Creating Desktop Shortcut for Help"); SetCurrentDirectory(olddir); CString TargetDir = GetGlobal("Root"); CString TargetFile = TargetDir + "wizardmachine.ini"; CString MozBrowser = GetBrowser(); CreateShortcut(MozBrowser, TargetFile, "HelpLink", TargetDir, FALSE); dlg->SetWindowText(" Customization is Complete"); newprog.DestroyWindow(); return rv; }