зеркало из https://github.com/mozilla/gecko-dev.git
331 строка
8.6 KiB
C++
331 строка
8.6 KiB
C++
#include "stdafx.h"
|
|
#include "WizardTypes.h"
|
|
#include "winbase.h" // for CopyDir
|
|
#include <direct.h>
|
|
|
|
__declspec(dllexport) WIDGET GlobalWidgetArray[1000];
|
|
__declspec(dllexport) int GlobalArrayIndex=0;
|
|
__declspec(dllexport) BOOL IsSameCache = TRUE;
|
|
|
|
extern "C" __declspec(dllexport)
|
|
int GetAttrib(CString theValue, char* attribArray[MAX_SIZE])
|
|
{
|
|
// attribArray= (char**) malloc(MIN_SIZE*MINSIZE);
|
|
int j = 0;
|
|
for (int i = 0; i < GlobalArrayIndex; i++)
|
|
{
|
|
if (GlobalWidgetArray[i].attrib == theValue)
|
|
{
|
|
attribArray[j] = (char*)(LPCTSTR)(GlobalWidgetArray[i].name);
|
|
j++;
|
|
}
|
|
}
|
|
return j;
|
|
}
|
|
|
|
|
|
extern "C" __declspec(dllexport)
|
|
WIDGET* findWidget(CString theName)
|
|
{
|
|
|
|
for (int i = 0; i < GlobalArrayIndex; i++)
|
|
{
|
|
if (GlobalWidgetArray[i].name == theName) {
|
|
return (&GlobalWidgetArray[i]);
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
extern "C" __declspec(dllexport)
|
|
WIDGET* SetGlobal(CString theName, CString theValue)
|
|
{
|
|
WIDGET* w = findWidget(theName);
|
|
if (w == NULL)
|
|
{
|
|
// Make sure we can add this value
|
|
if (GlobalArrayIndex >= sizeof(GlobalWidgetArray))
|
|
exit(11);
|
|
|
|
GlobalWidgetArray[GlobalArrayIndex].name = theName;
|
|
GlobalWidgetArray[GlobalArrayIndex].value = theValue;
|
|
w = &GlobalWidgetArray[GlobalArrayIndex];
|
|
GlobalArrayIndex++;
|
|
}
|
|
else
|
|
w->value = theValue;
|
|
|
|
return w;
|
|
}
|
|
|
|
__declspec(dllexport)
|
|
CString GetGlobal(CString theName)
|
|
{
|
|
WIDGET *w = findWidget(theName);
|
|
|
|
if (w)
|
|
return (w->value);
|
|
|
|
return "";
|
|
}
|
|
|
|
extern "C" __declspec(dllexport)
|
|
void CopyDir(CString from, CString to, LPCTSTR extension, int overwrite)
|
|
{
|
|
WIN32_FIND_DATA data;
|
|
HANDLE d;
|
|
CString dot = ".";
|
|
CString dotdot = "..";
|
|
CString fchild, tchild;
|
|
CString pattern = from + "\\*.*";
|
|
int found;
|
|
DWORD tmp;
|
|
|
|
|
|
d = FindFirstFile((const char *) to, &data);
|
|
if (d == INVALID_HANDLE_VALUE)
|
|
mkdir(to);
|
|
|
|
d = FindFirstFile((const char *) pattern, &data);
|
|
found = (d != INVALID_HANDLE_VALUE);
|
|
|
|
while (found)
|
|
{
|
|
if (data.cFileName != dot && data.cFileName != dotdot)
|
|
{
|
|
fchild = from + "\\" + data.cFileName;
|
|
tchild = to + "\\" + data.cFileName;
|
|
tmp = data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
|
|
if (tmp == FILE_ATTRIBUTE_DIRECTORY)
|
|
CopyDir(fchild, tchild, NULL, overwrite);
|
|
else
|
|
{
|
|
CString spot=fchild;
|
|
int loc = fchild.Find('.');
|
|
if (loc)
|
|
spot.Delete(0,loc+1);
|
|
if (!extension || (spot.CompareNoCase((CString)extension)==0))
|
|
CopyFile((const char *) fchild, (const char *) tchild, !overwrite);
|
|
}
|
|
}
|
|
|
|
found = FindNextFile(d, &data);
|
|
}
|
|
|
|
FindClose(d);
|
|
}
|
|
|
|
extern "C" __declspec(dllexport)
|
|
void ExecuteCommand(char *command, int showflag, DWORD wait)
|
|
{
|
|
STARTUPINFO startupInfo;
|
|
PROCESS_INFORMATION processInfo;
|
|
|
|
memset(&startupInfo, 0, sizeof(startupInfo));
|
|
memset(&processInfo, 0, sizeof(processInfo));
|
|
|
|
startupInfo.cb = sizeof(STARTUPINFO);
|
|
startupInfo.dwFlags = STARTF_USESHOWWINDOW;
|
|
//startupInfo.wShowWindow = SW_SHOW;
|
|
startupInfo.wShowWindow = showflag;
|
|
|
|
BOOL executionSuccessful = CreateProcess(NULL, command, NULL, NULL, TRUE,
|
|
NORMAL_PRIORITY_CLASS, NULL, NULL,
|
|
&startupInfo, &processInfo);
|
|
DWORD error = GetLastError();
|
|
WaitForSingleObject(processInfo.hProcess, wait);
|
|
}
|
|
|
|
extern "C" __declspec(dllexport)
|
|
void CopyDirectory(CString source, CString dest, BOOL subdir)
|
|
// Copy files in subdirectories if the subdir flag is set (equal to 1).
|
|
{
|
|
CFileFind finder;
|
|
CString sFileToFind = source + "\\*.*";
|
|
BOOL bWorking = finder.FindFile(sFileToFind);
|
|
while (bWorking)
|
|
{
|
|
bWorking = finder.FindNextFile();
|
|
CString newPath=dest + "\\";
|
|
|
|
if (finder.IsDots()) continue;
|
|
if (finder.IsDirectory())
|
|
{
|
|
CString dirPath = finder.GetFilePath();
|
|
newPath += finder.GetFileName();
|
|
_mkdir(newPath);
|
|
if (subdir == TRUE)
|
|
CopyDirectory(dirPath, newPath, TRUE);
|
|
if (!CopyFile(dirPath,newPath,0))
|
|
DWORD e = GetLastError();
|
|
continue;
|
|
}
|
|
|
|
newPath += finder.GetFileName();
|
|
CString source = finder.GetFilePath();
|
|
if (!CopyFile(source,newPath,0))
|
|
DWORD e = GetLastError();
|
|
}
|
|
}
|
|
|
|
extern "C" __declspec(dllexport)
|
|
void EraseDirectory(CString sPath)
|
|
{
|
|
CFileFind finder;
|
|
CString sFullPath = sPath + "\\*.*";
|
|
|
|
BOOL bWorking = finder.FindFile(sFullPath);
|
|
while (bWorking)
|
|
{
|
|
bWorking = finder.FindNextFile();
|
|
if (finder.IsDots()) continue;
|
|
if (finder.IsDirectory())
|
|
{
|
|
CString dirPath = finder.GetFilePath();
|
|
EraseDirectory(dirPath);
|
|
_rmdir(finder.GetFilePath());
|
|
continue;
|
|
}
|
|
_unlink( finder.GetFilePath() );
|
|
}
|
|
}
|
|
|
|
__declspec(dllexport)
|
|
CString SearchDirectory(CString dirPath, BOOL subDir, CString serachStr)
|
|
// This function searches all the files in the directory dirPath,
|
|
// for the file whose name contains the search string serachStr,
|
|
// searching recursively if subDir is TRUE
|
|
{
|
|
CFileFind finder;
|
|
CString filePath;
|
|
CString fileName;
|
|
CString retval;
|
|
CString sFileToFind = dirPath + "\\*.*";
|
|
BOOL found = finder.FindFile(sFileToFind);
|
|
while (found)
|
|
{
|
|
found = finder.FindNextFile();
|
|
|
|
if (finder.IsDots()) continue;
|
|
|
|
filePath = finder.GetFilePath();
|
|
fileName = finder.GetFileName();
|
|
if (fileName.Find(serachStr) != -1)
|
|
return fileName;
|
|
|
|
if (finder.IsDirectory())
|
|
{
|
|
if (subDir == TRUE)
|
|
retval = SearchDirectory(filePath, TRUE, serachStr);
|
|
return retval;
|
|
}
|
|
}
|
|
return fileName;
|
|
}
|
|
|
|
extern "C" __declspec(dllexport)
|
|
void CreateDirectories(CString instblobPath)
|
|
// Create appropriate platform and language directories
|
|
{
|
|
CString quotes = "\"";
|
|
CString rootPath = GetGlobal("Root");
|
|
CString curVersion = GetGlobal("Version");
|
|
int instblobPathlen = instblobPath.GetLength();
|
|
int findfilePos = instblobPath.Find('.');
|
|
int finddirPos = instblobPath.ReverseFind('\\');
|
|
CString instDirname = instblobPath.Left(finddirPos);
|
|
CString instFilename = instblobPath.Right(instblobPathlen - finddirPos -1);
|
|
CString fileExtension = instblobPath.Right(instblobPathlen - findfilePos -1);
|
|
SetGlobal("InstallerFilename",instFilename);
|
|
|
|
// Is the blob path a Linux blob installer
|
|
if (fileExtension == "tar.gz")
|
|
{
|
|
char oldDir[MAX_SIZE];
|
|
CString platformInfo = "Linux";
|
|
CString platformPath = rootPath + "Version\\" + curVersion + "\\" + platformInfo;
|
|
CString extractPath = platformPath + "\\" + "temp";
|
|
CString tempPath = extractPath;
|
|
|
|
if (GetFileAttributes(platformPath) == -1)
|
|
// platform directory does not exist
|
|
_mkdir(platformPath);
|
|
|
|
// extract contents of Linux blob installer
|
|
_mkdir(extractPath);
|
|
GetCurrentDirectory(sizeof(oldDir), oldDir);
|
|
SetCurrentDirectory((char *)(LPCTSTR) instDirname);
|
|
tempPath.Replace("\\","/");
|
|
tempPath.Replace(":","");
|
|
tempPath.Insert(0,"/cygdrive/");
|
|
CString command = "tar -zxvf " + instFilename + " -C " + quotes + tempPath + quotes;
|
|
ExecuteCommand((char *)(LPCTSTR) command, SW_HIDE, INFINITE);
|
|
CString searchStr = "defl";
|
|
searchStr = SearchDirectory(extractPath, TRUE, searchStr);
|
|
|
|
if (searchStr != "")
|
|
{
|
|
CString languageInfo = searchStr.Mid(4,4);
|
|
CString languagePath = rootPath + "Version\\" + curVersion + "\\" + platformInfo + "\\" + languageInfo;
|
|
CString nscpxpiPath = languagePath + "\\Nscpxpi";
|
|
|
|
_mkdir(languagePath);
|
|
_mkdir(nscpxpiPath);
|
|
|
|
// checking if nscpxpi directory is non-empty
|
|
// to avoid the steps of populating installer files
|
|
BOOL empty = TRUE;
|
|
CFileFind fn;
|
|
if (fn.FindFile(nscpxpiPath+"\\*.*") != 0)
|
|
{
|
|
while (TRUE)
|
|
{
|
|
int fileExist = fn.FindNextFile();
|
|
if (!fn.IsDots())
|
|
{
|
|
empty = FALSE;
|
|
break;
|
|
}
|
|
if (fileExist == 0) break;
|
|
}
|
|
}
|
|
if (empty)
|
|
{
|
|
CString nsinstallerStr = "\\netscape-installer";
|
|
_mkdir(nscpxpiPath+nsinstallerStr);
|
|
CopyDirectory(extractPath+nsinstallerStr+"\\xpi",
|
|
nscpxpiPath, TRUE);
|
|
CopyDirectory(extractPath+nsinstallerStr,
|
|
nscpxpiPath+nsinstallerStr, FALSE);
|
|
CopyFile(nscpxpiPath+nsinstallerStr+"\\Config.ini",
|
|
nscpxpiPath+"\\Config.ini", FALSE);
|
|
CopyFile(rootPath+"script_linux.ib",
|
|
languagePath+"\\script.ib", FALSE);
|
|
}
|
|
}
|
|
EraseDirectory(extractPath);
|
|
RemoveDirectory(extractPath);
|
|
SetCurrentDirectory(oldDir);
|
|
}
|
|
}
|
|
|
|
__declspec(dllexport)
|
|
CString GetModulePath()
|
|
{
|
|
char currPath[MID_SIZE];
|
|
int i,numBytes;
|
|
|
|
// Get the path of the file that was executed
|
|
numBytes = GetModuleFileName(NULL, currPath, MIN_SIZE);
|
|
|
|
// get the cmd path
|
|
// Remove the filename from the path
|
|
for (i=numBytes-1;i >= 0 && currPath[i] != '\\';i--);
|
|
// Terminate command line with 0
|
|
if (i >= 0)
|
|
currPath[i+1]= '\0';
|
|
|
|
return CString(currPath);
|
|
}
|