diff --git a/apisupport.harness/release/README b/apisupport.harness/release/README --- a/apisupport.harness/release/README +++ b/apisupport.harness/release/README @@ -707,7 +707,7 @@ copy unmodified to the output cluster. Since 6.0 beta2 also applies to module suite projects. -run.app.exe - "bin\nb.exe"; name of Windows launcher to start (inside +run.app.exe - "bin\netbeans.exe"; name of Windows launcher to start (inside ${netbeans.dest.dir}) if trying to run the application for interactive testing. Only relevant if ${app.name} is unset. diff --git a/apisupport.harness/release/launchers/app.exe b/apisupport.harness/release/launchers/app.exe index c078faae1df1557a2c01de8b3aea166544a0dd0e..b3d257bad8346a7fc1b10ce15a8e08b5ea2ed95f GIT binary patch literal 123904 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 diff --git a/apisupport.harness/release/launchers/app_w.exe b/apisupport.harness/release/launchers/app_w.exe deleted file mode 100644 Binary file apisupport.harness/release/launchers/app_w.exe has changed diff --git a/apisupport.harness/release/run.xml b/apisupport.harness/release/run.xml --- a/apisupport.harness/release/run.xml +++ b/apisupport.harness/release/run.xml @@ -53,7 +53,7 @@ - + diff --git a/apisupport.harness/release/suite.xml b/apisupport.harness/release/suite.xml --- a/apisupport.harness/release/suite.xml +++ b/apisupport.harness/release/suite.xml @@ -199,7 +199,6 @@ - diff --git a/apisupport.harness/windows-launcher-src/.dep.inc b/apisupport.harness/windows-launcher-src/.dep.inc new file mode 100644 --- /dev/null +++ b/apisupport.harness/windows-launcher-src/.dep.inc @@ -0,0 +1,5 @@ +# This code depends on make tool being used +DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES})) +ifneq (${DEPFILES},) +include ${DEPFILES} +endif diff --git a/apisupport.harness/windows-launcher-src/Makefile b/apisupport.harness/windows-launcher-src/Makefile --- a/apisupport.harness/windows-launcher-src/Makefile +++ b/apisupport.harness/windows-launcher-src/Makefile @@ -1,74 +1,94 @@ -# -*- Makefile -*- # -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. +# There exist several targets which are by default empty and which can be +# used for execution of your targets. These targets are usually executed +# before and after some main targets. They are: # -# Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved. +# .build-pre: called before 'build' target +# .build-post: called after 'build' target +# .clean-pre: called before 'clean' target +# .clean-post: called after 'clean' target +# .clobber-pre: called before 'clobber' target +# .clobber-post: called after 'clobber' target +# .all-pre: called before 'all' target +# .all-post: called after 'all' target +# .help-pre: called before 'help' target +# .help-post: called after 'help' target # -# The contents of this file are subject to the terms of either the GNU -# General Public License Version 2 only ("GPL") or the Common -# Development and Distribution License("CDDL") (collectively, the -# "License"). You may not use this file except in compliance with the -# License. You can obtain a copy of the License at -# http://www.netbeans.org/cddl-gplv2.html -# or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the -# specific language governing permissions and limitations under the -# License. When distributing the software, include this License Header -# Notice in each file and include the License file at -# nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this -# particular file as subject to the "Classpath" exception as provided -# by Sun in the GPL Version 2 section of the License file that -# accompanied this code. If applicable, add the following below the -# License Header, with the fields enclosed by brackets [] replaced by -# your own identifying information: -# "Portions Copyrighted [year] [name of copyright owner]" +# Targets beginning with '.' are not intended to be called on their own. # -# Contributor(s): +# Main targets can be executed directly, and they are: +# +# build build a specific configuration +# clean remove built files from a configuration +# clobber remove all built files +# all build all configurations +# help print help mesage +# +# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and +# .help-impl are implemented in nbproject/makefile-impl.mk. # -# The Original Software is Forte for Java, Community Edition. The Initial -# Developer of the Original Software is Sun Microsystems, Inc. Portions -# Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. -# -# If you wish your version of this file to be governed by only the CDDL -# or only the GPL Version 2, indicate your decision by adding -# "[Contributor] elects to include this software in this distribution -# under the [CDDL or GPL Version 2] license." If you do not indicate a -# single choice of license, a recipient has the option to distribute -# your version of this file under either the CDDL, the GPL Version 2 or -# to extend the choice of license to its licensees as provided above. -# However, if you add GPL Version 2 code and therefore, elected the GPL -# Version 2 license, then the option applies only if the new code is -# made subject to such option by the copyright holder. -# +# NOCDDL -LIBS = -#LIBS = advapi32.lib user32.lib -CFLAGS = -s -mno-cygwin -#!ifdef DEBUG -# CFLAGS = $(CFLAGS) -Zi -#!endif +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib -all : app.exe app_w.exe -app.exe : app.cpp app.res - gcc $(CFLAGS) $(LIBS) -mwindows -DWINMAIN app.cpp -o app.exe app.res - mv app.exe ../release/launchers/ +# build +build: .build-post -app_w.exe : app.cpp - gcc $(CFLAGS) $(LIBS) app.cpp -o app_w.exe - mv app_w.exe ../release/launchers/ +.build-pre: app.res +# Add your pre 'build' code here... + +.build-post: .build-impl +# Add your post 'build' code here... app.res : app.rc windres -o$@ -Ocoff app.rc -clean : - -rm *.res *.obj *.pdb *.ilk *~ 2>NUL +# clean +clean: .clean-post -distclean : clean - -rm *.exe 2>NUL +.clean-pre: +# Add your pre 'clean' code here... -test : - ../release/launchers/app.exe +.clean-post: .clean-impl +# Add your post 'clean' code here... -test_w : - ../release/launchers/app_w.exe + +# clobber +clobber: .clobber-post + +.clobber-pre: +# Add your pre 'clobber' code here... + +.clobber-post: .clobber-impl +# Add your post 'clobber' code here... + + +# all +all: .all-post + +.all-pre: +# Add your pre 'all' code here... + +.all-post: .all-impl +# Add your post 'all' code here... + + +# help +help: .help-post + +.help-pre: +# Add your pre 'help' code here... + +.help-post: .help-impl +# Add your post 'help' code here... + + + +# include project implementation makefile +include nbproject/Makefile-impl.mk diff --git a/apisupport.harness/windows-launcher-src/Makefile_windows-launcher-src.mk b/apisupport.harness/windows-launcher-src/Makefile_windows-launcher-src.mk deleted file mode 100644 --- a/apisupport.harness/windows-launcher-src/Makefile_windows-launcher-src.mk +++ /dev/null @@ -1,92 +0,0 @@ -# -# There exist several targets which are by default empty and which can be -# used for execution of your targets. These targets are usually executed -# before and after some main targets. They are: -# -# .build-pre: called before 'build' target -# .build-post: called after 'build' target -# .clean-pre: called before 'clean' target -# .clean-post: called after 'clean' target -# .clobber-pre: called before 'clobber' target -# .clobber-post: called after 'clobber' target -# .all-pre: called before 'all' target -# .all-post: called after 'all' target -# .help-pre: called before 'help' target -# .help-post: called after 'help' target -# -# Targets beginning with '.' are not intended to be called on their own. -# -# Main targets can be executed directly, and they are: -# -# build build a specific configuration -# clean remove built files from a configuration -# clobber remove all built files -# all build all configurations -# help print help mesage -# -# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and -# .help-impl are implemented in nbproject/makefile-impl.mk. -# -# NOCDDL - - -# Environment -MKDIR=mkdir -CP=cp -CCADMIN=CCadmin -RANLIB=ranlib - - -# build -build: .build-pre .build-impl .build-post - -.build-pre: -# Add your pre 'build' code here... - -.build-post: -# Add your post 'build' code here... - - -# clean -clean: .clean-pre .clean-impl .clean-post - -.clean-pre: -# Add your pre 'clean' code here... - -.clean-post: -# Add your post 'clean' code here... - - -# clobber -clobber: .clobber-pre .clobber-impl .clobber-post - -.clobber-pre: -# Add your pre 'clobber' code here... - -.clobber-post: -# Add your post 'clobber' code here... - - -# all -all: .all-pre .all-impl .all-post - -.all-pre: -# Add your pre 'all' code here... - -.all-post: -# Add your post 'all' code here... - - -# help -help: .help-pre .help-impl .help-post - -.help-pre: -# Add your pre 'help' code here... - -.help-post: -# Add your post 'help' code here... - - - -# include project implementation makefile -include nbproject/Makefile-impl.mk diff --git a/apisupport.harness/windows-launcher-src/app.cpp b/apisupport.harness/windows-launcher-src/app.cpp --- a/apisupport.harness/windows-launcher-src/app.cpp +++ b/apisupport.harness/windows-launcher-src/app.cpp @@ -1,7 +1,7 @@ /* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * - * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common @@ -24,7 +24,7 @@ * Contributor(s): * * The Original Software is NetBeans. The Initial Developer of the Original - * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun * Microsystems, Inc. All Rights Reserved. * * If you wish your version of this file to be governed by only the CDDL @@ -37,559 +37,20 @@ * However, if you add GPL Version 2 code and therefore, elected the GPL * Version 2 license, then the option applies only if the new code is * made subject to such option by the copyright holder. + * + * Author: Tomas Holy */ -#include -#include -#include -#include -#include -#include -#include -#include -// #define DEBUG 1 +#include "applauncher.h" -static char* getUserHomeFromRegistry(char* userhome); -static char* GetStringValue(HKEY key, const char *name); -static DWORD GetDWordValue(HKEY key, const char *name); -static void parseConfigFile(const char* path); -static void parseArgs(int argc, char *argv[]); -static int readClusterFile(const char* path); -static int dirExists(const char* path); -static void ErrorExit(LPTSTR lpszMessage, LPTSTR lpszFunction); +typedef BOOL (WINAPI *LPFAC)(DWORD dwProcessId); -static char userdir[MAX_PATH] = "c:\\nbuser"; -static char options[4098] = ""; -static char dirs[4098] = "", extradirs[4098]; -static char jdkswitch[MAX_PATH] = ""; -static char appname[MAX_PATH] = ""; - -static char* defaultDirs[512]; - -#ifdef WINMAIN - -static void parseCommandLine(char *argstr); - -int WINAPI - WinMain (HINSTANCE /* hSelf */, HINSTANCE /* hPrev */, LPSTR cmdline, int /* nShow */) { -#else - int main(int argc, char* argv[]) { - char cmdline[10240] = ""; - - for (int i = 1; i < argc; i++) { - char buf[10240]; - sprintf(buf, "\"%s\" ", argv[i]); - strcat(cmdline, buf); - } -#endif - - char topdir[MAX_PATH]; - char buf[MAX_PATH * 10], *pc; - - GetModuleFileName(0, buf, sizeof buf); - - pc = strrchr(buf, '\\'); - if (pc != NULL) { // always holds - strlwr(pc + 1); - strcpy(appname, pc + 1); // store the app name - *pc = '\0'; // remove .exe filename +int main(int argc, char *argv[]) { + AppLauncher launcher; + DWORD retCode = 0; + if (!launcher.start(argc - 1, argv + 1, &retCode)) { + return -1; } - - pc = strrchr(appname, '.'); - if (pc != NULL) { - *pc = '\0'; - } - - // printf("appname = %s\n", appname); - - pc = strrchr(appname, '_'); - if (pc != NULL) { - if (!strcmp(pc, "_w")) { - *pc = '\0'; - } - } - - - - pc = strrchr(buf, '\\'); - if (pc != NULL && ((0 == stricmp("\\bin", pc)) || (0 == stricmp("\\launchers", pc)))) - *pc = '\0'; - strcpy(topdir, buf); - - sprintf(buf, "%s\\etc\\%s.conf", topdir, appname); - parseConfigFile(buf); - -#ifdef WINMAIN - parseCommandLine(cmdline); -#else - parseArgs(argc - 1, argv + 1); // skip progname -#endif - - char olduserdir[MAX_PATH]; - strcpy(olduserdir, userdir); - sprintf(buf, "%s\\etc\\%s.conf", userdir, appname); - parseConfigFile(buf); - strcpy(userdir, olduserdir); - - char clusterFileName[MAX_PATH]; - sprintf(clusterFileName, "%s\\etc\\%s.clusters", topdir, appname); - - if (!readClusterFile(clusterFileName)) { - ErrorExit("Cannot read cluster file!", NULL); - } - - char nbexec[MAX_PATH]; - char cmdline2[10240]; - - for (char **pdir = defaultDirs; *pdir != NULL; pdir++) { - sprintf(buf, "%s\\%s", topdir, *pdir); - if (dirExists(buf)) { - if (dirs[0] != '\0') { - sprintf(buf, "%s;%s\\%s", dirs, topdir, *pdir); - } - strcpy(dirs, buf); - } - } - - char *p = NULL; - char *q = NULL; - - // printf("extradirs = %s\n", extradirs); - - p = extradirs; - while (*p != '\0') { - if ((q = strchr(p, ';')) != NULL) { - *q = '\0'; - } - if (*(p + 1) == ':') { - sprintf(buf, "%s;%s", dirs, p); - } else { - sprintf(buf, "%s;%s\\%s", dirs, topdir, p); - } - strcpy(dirs, buf); - if (q == NULL) { - break; - } else { - p = q + 1; - } - } - // printf("%s\n", dirs); - // printf("%s\n", userdir); - - char pattern [MAX_PATH]; - WIN32_FIND_DATA ffd; - HANDLE hFind; - BOOL bNext = TRUE; - - sprintf(pattern, "%s\\platform*", topdir); - - hFind = FindFirstFile(pattern, &ffd); - do { - if (hFind == INVALID_HANDLE_VALUE || bNext == FALSE) { - ErrorExit("Cannot find 'platform*' folder!", NULL); - } - if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - sprintf(nbexec, "%s\\%s\\lib\\nbexec.exe", topdir, ffd.cFileName); - break; - } - bNext = FindNextFile(hFind, &ffd); - } while (1); - - sprintf(cmdline2, "\"%s\" %s --clusters \"%s\" --userdir \"%s\" %s %s", - nbexec, - jdkswitch, - dirs, - userdir, - options, - cmdline); - - STARTUPINFO start; - PROCESS_INFORMATION pi; - - memset (&start, 0, sizeof (start)); - start.cb = sizeof (start); - -#ifdef WINMAIN - start.dwFlags = STARTF_USESHOWWINDOW; - start.wShowWindow = SW_HIDE; -#endif - -#ifdef DEBUG - printf("Cmdline: >%s<\ncwd >%s<\n", cmdline2, topdir); -#endif - if (!CreateProcess (NULL, cmdline2, - NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, - NULL, - _T(topdir), // lpCurrentDirectory - &start, - &pi)) { - sprintf(buf, "Cannot start %s", appname); - ErrorExit(buf, "CreateProcess"); - } else { - // Wait until child process exits. - WaitForSingleObject( pi.hProcess, INFINITE ); - - // Close process and thread handles. - CloseHandle( pi.hProcess ); - CloseHandle( pi.hThread ); - exit(0); - } - return 0; + return retCode; } - -char* getUserHomeFromRegistry(char* userhome) -{ - HKEY key; - - if (RegOpenKeyEx( - HKEY_CURRENT_USER, - "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", - 0, - KEY_READ, - &key) != 0) - return NULL; - - char *path = GetStringValue(key, "AppData"); - RegCloseKey(key); - - strcpy(userhome, path); - return userhome; -} - - -char * GetStringValue(HKEY key, const char *name) -{ - DWORD type, size; - char *value = 0; - - if (RegQueryValueEx(key, name, 0, &type, 0, &size) == 0 && type == REG_SZ) { - value = (char*) malloc(size); - if (RegQueryValueEx(key, name, 0, 0, (unsigned char*)value, &size) != 0) { - free(value); - value = 0; - } - } - return value; -} - - -DWORD GetDWordValue(HKEY key, const char *name) -{ - DWORD type, size; - DWORD value = 0; - - if (RegQueryValueEx(key, name, 0, &type, 0, &size) == 0 && type == REG_DWORD) { - if (RegQueryValueEx(key, name, 0, 0, (LPBYTE)&value, &size) != 0) { - return 0; - } - } - return value; -} - - -void parseConfigFile(const char* path) { - FILE* fin = fopen(path, "r"); - if (fin == NULL) - return; - - char line[2048], *pc; - - while (NULL != fgets(line, sizeof line, fin)) { - for (pc = line; *pc != '\0' && (*pc == ' ' || *pc == '\t' || *pc == '\n' || *pc == '\r'); pc++) - ; - if (*pc == '#') - continue; - if (strstr(pc, "default_userdir=") == pc) { - char *q = strstr(pc, "=") + 1; - pc = line + strlen(line) - 1; - while (*pc == '\n' || *pc == '\r' || *pc == '\t' || *pc == ' ') - pc--; - - if (*q == '"' && *pc == '"') { - q++; - pc--; - } - - *(pc+1) = '\0'; - *userdir = '\0'; - - if (strstr(q, "${HOME}") == q) { - char userhome[MAX_PATH]; - strcpy(userdir, getUserHomeFromRegistry(userhome)); - q = q + strlen("${HOME}"); - } - char *r = NULL; - if ((r = strstr(q, "${APPNAME}")) != NULL) { - strncat(userdir, q, r - q); - strcat(userdir, appname); - q = r + strlen("${APPNAME}"); - } - strcat(userdir, q); - } else if (strstr(pc, "default_options=") == pc) { - char *q = strstr(pc, "=") + 1; - pc = line + strlen(line) - 1; - while (*pc == '\n' || *pc == '\r' || *pc == '\t' || *pc == ' ') - pc--; - - if (*q == '"' && *pc == '"') { - q++; - pc--; - } - - *(pc+1) = '\0'; - strcpy(options, q); - } else if (strstr(pc, "extra_clusters=") == pc) { - char *q = strstr(pc, "=") + 1; - pc = line + strlen(line) - 1; - while (*pc == '\n' || *pc == '\r' || *pc == '\t' || *pc == ' ') - pc--; - - if (*q == '"' && *pc == '"') { - q++; - pc--; - } - - *(pc+1) = '\0'; - strcpy(extradirs, q); - } else if (strstr(pc, "jdkhome=") == pc) { - char *q = strstr(pc, "=") + 1; - pc = line + strlen(line) - 1; - while (*pc == '\n' || *pc == '\r' || *pc == '\t' || *pc == ' ') - pc--; - - if (*q == '"' && *pc == '"') { - q++; - pc--; - } - - *(pc+1) = '\0'; - sprintf(jdkswitch, "--jdkhome \"%s\"", q); - } - } - fclose(fin); -} - -#ifdef WINMAIN - -void parseCommandLine(char *argstr) { - char **argv = (char**) malloc(2048 * sizeof (char*)); - int argc = 0; - -#define START 0 -#define NORMAL 1 -#define IN_QUOTES 2 -#define IN_APOS 3 - - char *p, *q; - int state = NORMAL; - char token[1024 * 64]; - int eof; - - q = argstr; - p = token; - state = START; - eof = 0; - - while (!eof) { - if (*q == '\0') - eof = 1; - - switch (state) { - case START: - if (*q == ' ' || *q == '\r' || *q == '\n' || *q == '\t') { - q++; - continue; - } - - p = token; - *p = '\0'; - - if (*q == '"') { - state = IN_QUOTES; - q++; - continue; - } - if (*q == '\'') { - state = IN_APOS; - q++; - continue; - } - - state = NORMAL; - continue; - - case NORMAL: - if (*q == ' ' || *q == '\r' || *q == '\n' || *q == '\t' || *q == '\0') { - *p = '\0'; - argv[argc] = strdup(token); - argc++; - state = START; - } else { - *p++ = *q++; - } - break; - - case IN_QUOTES: - if (*q == '"') { - if (*(q+1) == '"') { - *p++ = '"'; - q += 2; - } else { - *p = '\0'; - - argv[argc] = strdup(token); - argc++; - - q++; - state = START; - } - } else if (*q == '\0') { - *p = '\0'; - argv[argc] = strdup(token); - argc++; - state = START; - } else { - *p++ = *q++; - } - break; - - case IN_APOS: - if (*q == '\'') { - if (*(q+1) == '\'') { - *p++ = '\''; - q += 2; - } else { - *p = '\0'; - - argv[argc] = strdup(token); - argc++; - - q++; - state = START; - } - } else if (*q == '\0') { - *p = '\0'; - argv[argc] = strdup(token); - argc++; - state = START; - } else { - *p++ = *q++; - } - break; - } - } - - parseArgs(argc, argv); - -} -#endif // WINMAIN - -void parseArgs(int argc, char *argv[]) { - char *arg; - - while (argc > 0 && (arg = *argv) != 0) { - argv++; - argc--; - - if (0 == strcmp("--userdir", arg)) { - if (argc > 0) { - arg = *argv; - argv++; - argc--; - if (arg != 0) { - strcpy(userdir, arg); - } - } - } - } -} - -int readClusterFile(const char* path) { - - char **dirs = defaultDirs; - - FILE* fin = fopen(path, "r"); - if (fin == NULL) - return 0; - - char line[2048], *pc; - - while (NULL != fgets(line, sizeof line, fin)) { - for (pc = line; *pc != '\0' && (*pc == ' ' || *pc == '\t' || *pc == '\n' || *pc == '\r'); pc++) - ; - if (*pc == '#') - continue; - - char *s = pc; - - while (*pc != '\0' && *pc != '\t' && *pc != '\n' && *pc != '\r') - pc++; - - *pc = '\0'; - - *dirs = strdup(s); - dirs++; - } - *dirs = NULL; - fclose(fin); - - return 1; -} - -int dirExists(const char* path) { - WIN32_FIND_DATA ffd; - HANDLE ffh; - - memset(&ffd, 0, sizeof ffd); - ffd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; - ffh = FindFirstFile(path, &ffd); - if (ffh != INVALID_HANDLE_VALUE) { - FindClose(ffh); - return 1; - } else { - return 0; - } -} - -// Show error dialog and exits the program -// lpszMessage - error message to be printed -// lpszFunction - name of last called method that return fail status -// can be NULL -void ErrorExit(LPTSTR lpszMessage, LPTSTR lpszFunction) -{ - LPVOID lpMsgBuf; - LPVOID lpDisplayBuf; - DWORD dw = GetLastError(); - - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - dw, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &lpMsgBuf, - 0, NULL ); - - if (lpszFunction != NULL ) { - lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, - (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); - wsprintf((LPTSTR)lpDisplayBuf, - TEXT("%s\n%s failed with error %d: %s"), - lpszMessage, lpszFunction, dw, lpMsgBuf); - } - else { - lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, - lstrlen((LPCTSTR)lpMsgBuf)); - wsprintf((LPTSTR)lpDisplayBuf, - TEXT("%s"), - lpszMessage); - } - - MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_ICONSTOP | MB_OK); - - LocalFree(lpMsgBuf); - LocalFree(lpDisplayBuf); - ExitProcess( (dw != 0)? dw: 1); -} - diff --git a/apisupport.harness/windows-launcher-src/app.res b/apisupport.harness/windows-launcher-src/app.res new file mode 100644 index 0000000000000000000000000000000000000000..423f0bd785026158d394c4e728ca6be8ecc3eea1 GIT binary patch literal 21658 zc%1EgcU)A-(suRa!MuthCQO(RFel78XHgUb1`q@kl#CJ-6%iFMpeQJ2%!&#I5ET{U z8UYh##f(UX`l`}_V?Ix=G5tasybD5&tVW_z|+D}0OBVZGj?)z znhM`jS-NLNdB0KOwSv$MOcVKMm-N2<#cw4brT+~8e9BXPgYqBm%Z2jC()SX|XH(AQ zmryRFJc@ET<;VZ<90RosO3D4<`-;E#-ryJCoBrbaZh!LqH2VMbFZc{2`N@Qx<-glW zRgvtd`hFdx2Vf)rew|&5Ca+}Mr?PUox zG8qkQ{ACz0#0F%x!N3-N0M^P5MoeE0Wl|6pEnNmop#sU6qafLf5E^>|nAII<*t8kQ zt5k>3y9L0OWrORYqrhqo2Ud1Eu$CKu4LJ!4|LZ`V3ht#n0QKQQ@YwwVq;1VX(s~ZC zk!Qi>LJ_c9o>YEyP@f{s<$8j0$1AFH9a!7i0c#oppdLZxO$F8=8Wsn|fVZzds3JZC zJ4JfxSb{40E4<4shS2b%ppGjBY5#EWTz?B#b6b#&bBAWb1Ar+z!92G`uyogbVBPn^ z@c1IIO)iEet=z!a_B=ET{RpaPz z;;8Ngnc(i_4b$Bs;K}23BJnNM@#iylg|5GtUK5UKK*Ws|b1d`4F_~7|8li`?)+J&hNlI z1giZx;Cb*JY~H#Z6!8d-PR_up%!T3-grXwSEi4Zd zM~i`txd_nA9F$8RLQYODB%DnFraKfQ$En<=(|}F74td4&xmExT$R5B|l9lrdQlxiubKpCVN5 zz7UFwi=nc9570>_j;*(Yj@cGiyEz%0UEM&rEnOJ@_-{?}e@^;z$nn1~oZHlPvs2|` zf4Atv5~o#u1NOV3@=H!W(BZ&D?PMnxFxO{kcQs4eRsK8kdprWU8#_hTAU_tt~v$boRByst^^R-ow zSEiyH9(Ccu5u$J-6G41WRE4VR*Dveaw~16+ewfIEga>O%{_X79vwQZWUb_~xuj8_1 z%c>f`>G56u*f1)ZXb7?9o%Qa<5-q_f<$#)g56cT4qKPr|>j{lxWo*vk@&;Gj#zLz*Hb$VYeS(w+WoDo0Y~G)Z_u zcNdp0Tb4IL6MK6Pjr`5--A4+kyUwOKF$oU{^7~1?EN|i_O`2+&tKz{A%_zmwzYil7 zIy})6T;6M;r6?aB?wpdM>8A3!y?XU(#Z#|Vy?Vt52v2Z%U0sLqmNibEEL)z^#fukv ziUyLe9Mn3&a442l^JV90TYV~2$22%FAP3;=tTs$#Rxiq5)jzL!;(IZD3 zsbx!j{SbMnyzsz;070HixnxNh694r48LQB^O26jg1ZjQ!+k(8~YA)YZkmtphqlUU} zW6sz!>gN?MPj{Wuuem=L*MB6)-(0;~kpC|3U}?iGGp)wu3KgFA?pxKhO20)0Bwt5p zfQq8Lz@9n|l}_R(Or{NvSTSqXir&+WjhEf;SH+H=FxbYM>ov&>#S7%Wl|I<8{j8(i z4kV8oH~RDE&pZ0f$y{W>8$kY*iZ2!CWUfa&y)}IJq)G24Pu`xLJ!aseItKouM>pRw zXHI5Qp}X7!Cjo@{2;R*nzAa}f3vF^&ip+kqdySpFC$RO$6yC>J5F(WjT zOHx|5u6PT{-;Q0U78*cK>Daj*j?s7O%8Y`t)~@Mw`^J0xq8Uq1qn?( zMs3SIcI^0%D-(b2xbLf(v!&b3vP*?{Y53PkF8>=s|IsA)LB*QoTeBl{g=n%F3K|mC+nwtfhO;&$?N=-SNO+yqIRzQALi13 zocsJ$&izuw+L%wCFSs)KwsUvF*uB{>n&N3y zbT-9nXO=J5vDnmm|pGZQ2{ZkzK2Bvl&=G1;aq@ni>Q zkQm#7XDG!mOS3>~HlE_mN5Cwug51IfWW8*GQEbIrUQp~32yA&a^gmnxdK4cqueYSb zW?+Ztb7&4!J68hl-hTp}GbJGH)ED{<8boo+Juo~*_SjD{VL8wtwg6=7b3vlt6(qHM zC`K9yimjhuuGd~6K4Wzk0_(94*o;(A$J2915f(1qA;wcveh1c>V%f15seOjP+2nL! zWH-e@k~5@Of9_K#DWNu*c$MO@5s+0-LUFene9fWdRBb`ASun_Vl~CO72Y!La;J0ek zDVC?0-|ZzmN9EU^$x{;#S{Zkxm5=O>vt5`!cV~LQ$e-j z4U|xSlEl!nmHUDd#h%PK6eN>=hi-#bf!_-R=PenaZ!ig@rf$&2G7Kb!y})I|9q?Iv z7)CBn2WvYgsM*{b94OWt;S>kV?mnmv=0QObO$?33fPQ2?oI0HVQcFjQ!=0f{Z%+t+ zfY515nFn?J*$b;TO;<@W!68RM>_w)ssGxg!g@c?C~LT%FkXm=SQH3wmY z)nc%S&V*Ir2S94j5=O>m!LU)I!HoKmNAOOt+qe}RedEB&HwoI?oPY|GF2i)M<3fyF zL^g_khj4~)|M?d1zb*;`)th|n7^I^m8-^Kk1y z?1lDymqTaECE(<;09-viA#zJJNLGCTMd(NHobLnYQf|S;tGD6mwR9LaDGXHWKf==B zL*TPK0W1S9myZ8GowR?M+)V5@KK$i;ADmxz{z=`s%m4hYcX67ouFh1OC5eBm0)m~_ zPaQgH)a!Mx)x8!c{UiWmXKd54S@3#xLw)^~GwZnY&imofCLj4tb^Dns^=l0XA5cfH z_kpqBAN4y$H#3BrbLNCEov^cUmEOHS1!(R&>kM5tYIZ|@)7^3Dguy%e_rF$!{Dcb{ z3Qg4Q8w&S=_^ocP-CSK8(Ea-LbH(BfR?^L&!Tq~+8?wlZr$s|fNJwB|oInApEnRBc z-*t$YwI(F6Hd|C%Ql*Nj{=!I30nU9rTF!das=iNode(Op2^dQxReG!H*V#??!zQ<0 zwygD(Nn?aG>}lUs)@C79Boe*ey*7FC`<9h>n&(sfH}X3s4Ws*uLaM|_^z>Yo@OBC? z@7Qr1#X=o#&m#%CU(U=mL>1GfO`FAwxu194+)zm4#&xutSAER0Rn|lLPpEHXG;NxP z2X6(3j)u*7G8}ieqn+KGNh9gDdwrv6PAh8ENTvIpqi1!!YbXeGw5zmh*YqQ{18Vhh za#~YEp-AWV+qP}nm5WdncDtUmp591ayWx@*bh~WX`)-Jpd-NcI(Gyp%ene_KX=lb%|4n=n9sW`_F3%f`JQ4D_<-#7q%3(0$=H zJ#9<3)kAgX*LY`TBpEbtpT!4&@;#_@vK-wuzVhnwj!S+;N%e9n_;>0aHR$a{fO~Y? z=lP!FHP2LwFfho>tlG0@J@PfzwyNM?@$4ah(<4S$P9EN}WwmPWH}~liyT!g;yAB;X z`1<;0bs7KoF+k6|&&F$ymtF@+UrB?)h#3IIBE%Lr#0nMZf$bINaK1dxx1rG8r zlmzLYfc*;a?F8V*l)+uJPZf~+AQd%!$Y1#&$;rv&GqeY0bqk zJ_RmaxlYgA68sscVg_u$QBs!Hbf5R2-jOTpCo3#ZfNIkhQ0{#Wl6EUVz5ETRX$??C zeg>ugQ(HATwPLQO7eN?nb7tm(2GbmD|%n+Icw0=B9(hz)aYel^Avg zrNdRK=M8{Pb5L!kHEJzcNM<1JS1-r}kQ)-;S0L$s81CM?2a;v9?swh+3X79){4`y+ z>kq8U4*Glrl-}ncF8Lm<7v$$u?F{NQ@5yiI2J(PwaQw^zka#@?#pEPVZTJKV^08Fj zq}!$|5OtFDT9+fNr*cJ7G?`pIQCx2r0W27tx^5fy+i%stC|Pfb?gRU7_HJ>TWd4ueHmdHxR{gdCgh$luF~?zyPe7lE zdl$|Fa2aR3-)Tg}Euoc6hRtt71pOzwHeFr4YS{rEgOp0H!R*R?rw5hY>DzOoUWlNg zw#Gh6XC07^noUl8Eda-*06S>_RG|rz`ake_y@?t?xEBP_pYC;Y^`ZNTP(L?=ru84s zBn|$TTJ8UjM2ly0!U{s)|2CJun}};U0(U=;k5qvGroI>7(@f50fpY%t=v{Gszb@w0!_EAywIFc$3loip)OjU-G! zP)|lEHv^&kID`s)P`AGMm;8dF3@W3+{~~Ww!Vw-+`(c#yJArIqJhGk#5W4L_=(L*er9&+)Y0>*3$KgynLqu;JkIHkCd?_&eTsTa?W#+)$u@9-yc~c z;%u~>Y`z*<8?t-HXk=Ytkm5dM{o_zFC;=rS&!c3_Wn`nzBO4Tl&|?>IwnS(|wr@NI zp~*CaW;WPjxKCzrNy%+)!+(iH*u~&oNH)vUPhcl zi1Rw?C!46BY$47&k@eV%tj{52gO4G_B1mxrvN0EtjlYT#%bO^fat9?-@6dON$eK+P z`8Tl=J~QGE&FyjKf=Iqov-O|kf4&cjK3EI9s6?)(t{PK$O<6f9DkmZvf*JCm&!5bs6Ad$|_pZK90@&aonAfo~G^ z4dOc?MZ`qnH|Ykl$-g6;epiHb8cJq9K#A=`%I{HGPRLr)7-~WDs|mrFU`lnjoQ>+X zt_2^n3x6kGo&E;@vef6F8JNs}!K#z3>k(%|&Y9-G))AteIpji|3~iG(tMz0W$lC$Q&OboBbHsoD7uAq3e#+wx-lKTg{+)$o4G>rnZ6(VB(C8 z1}}VHT!N2?UzLBrzglr|NoLjdE8YwJqgBNBzR{cPJdo@>^yH5==6ok|zQomvxY}^8 z_eD4mH;2a}oC$NE5i*EB!G+-Tl<)*uXLn>K6T~)XZB6}&Y~R*_^4WAfN6^8-C4!HI zg9OQ6@Nbx3Q2bcOY)cL^qyEud(>MOWxzxU;w!N>#^Qj2em%oPFD+1}_@|^GjS=ag0 z*Da|3Oc8ZxMfPt^I<%vH)zOu%Y27oKi`x&K<$m7Wzu?~@JFobjd_rQ0WCU>@p&5S@ zE`7IgseQR^wYj=;WQtgzjdxnmeCI~+c%{*Ubm+B+#_c%bKUw78lKN3A@c0 zr31}%?L4vf)UYSS@$6sl@A39)(KY4#hp6zrk22>}8e{iFJKIwKwSV-ZZQZpv`hWP2 zML$9NUa1~}uDl%5p>Gh)`D4h&v=*Au9NJ>KI0o9#THc!4pbfP_J8x_{dPOGrM|?h# z|APO>haZbBs8+r~RY)ePR%N0hC==xYZ%{J-HQ9{noKNu6=J^R(U=|_!7swL9i&ZN^edT#Nvic9 zQMK_is-nK2YE!n5D=C++$wF!97i7zc*Rn4nR((Yl@)ro=(9)$;2i^_>e`bI1_9q|C zh_Yv2F1*kq$i0W95 zB2*ut{AiK*`Dih!4i}?he-X-d6`^EHA+imGa8150U&J>(wA$bse@*}A<7re3aULsj zZ>rIu39Sc>X*@Tk@lc=ok|E7U4QAo7Q&;#LG~*Zi*9SfbR*Y=pPkQ{oKkNH=F10=9KlTuDrZ}vL1%dcCB45;S zJn^M9p+5PFb!lAJq4uaV6<3BI;y&HtU+|A{N-w#fbE*V&623!yhHzGcBz}#kPSk+k zCwUd=q9onqhq)d_B7femLjQ!nw(a>mJnlI0pCIx#Bs8SCv_7HkSc-iJHR-b+#TV5r zaMs*)_lW1VU+_O=eyik~4)N5vfC9>JP-I=^k_H#)`-|c|owI}_6!l5av<*Q;?In-p z{i;CZzw+ykeMhkUQ*piH>!0}v;!oqY5w$@>>PPj6s{#4DH3>B+#;8g@yDp*PQ0zC% zllu{8{)9UtT1}Vflz)cz;Ib^IlxLc)t<2-xt^MF%$b`Ps)&|Avw-}$4k0!ewVa#xvHfH*Wn!9Ptvpj*CC$93LirU z`Ix6UD=r`9G1(|tMstn}ai2}Lx4SR;OWc1NMlo5FsT4zw7P;3V?$w5n?@MvVZ+$5C z=!r~ahD_N3E9>{j&dJI7KzytJ#J>{xc&}=o#@Fm9@#l!ufIds&5M^AK^BP^W+k~#w zT!%z)EC}PC^FK`dX}(qSxp+U#$;W67+43GGUSxZUUzo*JF|HYWl;#)m|Lag+sWD8$ zy)VT|y@-1k;@y$Zl3;{Vb)%BkuQQ)=U*{+OHH%8{Wrali!cG!r;wt2&IH9G>F=`jO zRwil22#pUN4jS7!rS|9Z>_NU>Aa@*d@D$#=H7D#m8qPi$Z% za@XVBd4K6nd^;0bBU7}X+>lV8ppSR%-n&bD2mQpqNp3Mdl%2&QM!W=^)0x zcpuwG0T1;vIbHKPl=ppM&WbNWVGb_k&)36f;vfEj{F1kXSJWnNP`URx`6ky;GMeIv z+GPJK#Je)}mkK>JHg84TjVNzOs6(HtQC<#@9gn*~d~JW?-|=H1-elAdzCl|LZT?5Z z@xl4C?T8Rf`Nm?DL>8hfst^^s^HH^r)<3=u?xOWOI$QKd1pee(EqQ@TpGT-%`jFb@ z2`aaxqjabz=`d92FCc4AT&ce(nh@#{Y7nXt_p$^PhOJq9mG7JV#DBo^d`w}~4+Q*5 zhoc(q9D4~n2%9zQ7R~ptlIF{$Ur@5-Bg&S2M8z87yx|k7!wGBNqk1{neerYR{{WS) zcTwqZ6%{@=Q0}q;r55v0Vn%CKHPS(Dh#;*&IoVuMo}d=EGldH692|H&x$`Ifl0sF`TQ=-GnWvCQv5dHC`$StM(K!Hl#fqD#f*!n zn0Xl$Ru@p-Hx#ADHYjathq57Fq{m{Ej&-H$fi$LTBa^GX>Cwoj`72rjxF4t1;=dr~ zJtq8;zjnXp{bn0}=N_ivUg{f^a_8~d=oB&b?l^|kn~3VDr* zKk(PK{mZ|6Qvls~qai45VNPRX7Rsi2kRHyY$0SUB z{P;R?9;U_rsO1B^{0H0r+~+mi%Z2A+<*=`45b_DzgnhsP8#2*+!*jIX`V4(zp5daH z#~8f#0j}AbjvMyh!|+|dpmJVJ~4T1_nnE?=`q2C>R$n3&KT91JT>Z7w5XU zqob2ETFy_^yrD9u_tKd$K_i5?~F^sj2<@;dr`{_B)?`d zt#Wn*nxfI^atXR#Dn_^Sh3HP)-A?78+tDoaIP?KM54=IInCIxd;|b1>PR9is@1oE8 z>*%}o68eQEq2G!V=)d$R`Y+jo3zu%Ed?We=gb{)WO9+e6XW=4T;O8&E+t&|0=FcZR z+|a?v32p7|ahkOajxryE9nCsnW!<2*0HbXc=$8U-un)ncD_dEZBKFD=11td;SRd4y@76_ zDd@5CEP5av^zz+~UOpQMVT2&ULV_=P&i5fKKzA>1bo2B=7Y|RI=kAWq zuCD0h;)0IObJ5np0j=%q@@d`5c9=8gy_<)}^YNAwc>lkk#eWFFhOf(fEEC8R!!+_q z-{lqImSgufN|;%e|g9*^0fyDfain zu?bf$T)do;nwFmO>hu!AhoPB%Il5I))29w@Ad-jU&$9Mh@*2~YLH_|-&;_9{ZvmLs+r-IISgtAi+ zD%xR_c5_}96&3SX;NSKeC@QOpW*$w+{+gfavpnIfLCeK2d3{jX0in7pLTw*}dW$Hx z#SvDEACoNq)%`Eew*E$)5^hI6ZxeT(SNDKkpCt7j@<9!j1PIzWhGVGv<8F=H9QFz6Y{;3z0R^{Dz{_ zPL%XGf|7x!kqthD&^H#L$9{xX{s@hxqRePk@x`mR`QGC2zgcg0!UodyRouy2iS7F? zPh&M)kr_~(O?jPbk+s=~%xtT8=Gs42JZ~M9jFR!!Q8MW!N-VC>{pG^%2AGj8*6Ho} z`NPLg@2T8+e^GBsLPF--&)3N(OsZ`f@S4^2qdHfRZTZ+QGtxvm^0RHex9j;vJX`X8 zPoTJTA?5z>#Tb?E%lOgf`ENxo{QPzLS!#c(-*mEgZrRF?Y~f7($P3$8hVj0@_lk71 z>Q5XQn{`7O@*d?uZ&B(`W%=;)(~ndaVaaET=f8+Cy*2{ryCvG^U-XvxmqzQ4;G_rXAw#^YtEq76(C!ik8DjIapN3*s-K@D*ry@1w5B;= z3_=sKLF0+Y_|kh*4<0?^zX|N3slO`4GjH`0i$4qd)?--cJ^mME#BQ zuQ`P3)|^|E=lkbo!v1-O&gRc}oTph|JA5p}TkMqPJc5IwBStH?l%h$+Y4IFIXqWRP zsFNt3W2p}nh-cYbzM^Vd7Aj--`2)>;Hnbk}I)tn~`32PmhHeqPcRnW8!64N$M9 z@h9?`GBy5FkIVwR#>l>m^kxZ!QyLD3#Qk{59^w*1cG)MMF{_V~?uQG6eR$QDFQ{7g z0aYtrqiXF7RBp~ddB9~F>!g4AZV3F$pmg6|X&~&m>r||qN3k-ufdOG`Y7U+k_U1T; zGn)F3YwABB?r}k6u{icZ@=&ts3(7-3qjLRcR7ZS5HLpMT4Jv&eqtfFpDwo|snR5h6 zI!~fLM^T2P9s<)vCKvb2r7E4`?Cfk|4j?$3$-+cokLs*O|I+otj?X!K zzVp)TgVWj|vAvCQhg+y{p?cj?QR#dK71L5sK4cBb20NqF+!dvr#!&yOC+-zXq{Kss z?>~It=OtYTi=y9Q!VmQy|89F0O?5|T_EeW;iE}LfjT7(ZW3M0#A^)TMK7-IT52M{9sUSN_?f1*bB z(zB%Pd_S7zo3K3boZ3rM_l$eU#?u%ZN`6QW@=0256n`K3+iYrYns3VVN2b>cCAGSu zwBaa}HJ^yG9u6p<=z~&AN0fBxiP3xZCUD*Pp2xI@cuCNm*Bz@>_a>@)b)LrNZ&5-v zSK8dc3X?8lU8}R$-sS|3aEe1m-#GLMJcdhy4`Jxq{kVSPZuIc-#SWc1Va2L?D6LQf zCDodv#IP62`bZ7z>S+@as8%UxGo|R*KLTvl_8<% zJZ~P3wXneU9Xn#>YSodI(M732OYAhqo9|U~4r%Q!V@4Gk_cf{A4UZtUKT?dn4;J8v zeYrR><}+IFc#E^PK11iIhv>554!WC`if*WCL*6`o<7oqrW zz(9f{VU=dT>K6GZ?+S`ao@VD2r+xTR`1}3mUoOU;dvY!$D&>lk*Z#C|lfvE%9X+(lhdH8k+|Fa~*`?7feT{8gc_=xYyYQHb5{Vwd!_@`2yuzSEj4yLB!8?*c` zSu!xFBVO^pV<~}(6~!z5S1hF(Ndw_;Sjse#2Et#klz(HO{Pq_)mEZmbr}Eoh-Bf=2 WJDW=3FKCLNwEx~H|56G(O! +#include + +#include "../../ide/launcher/windows/nblauncher.h" + +class AppLauncher : public NbLauncher { + + static const char *OPT_DEFAULT_USER_DIR; + static const char *OPT_DEFAULT_OPTIONS; + static const char *OPT_EXTRA_CLUSTERS; + static const char *OPT_JDK_HOME; + static const char *APPNAME_TOKEN; + static const char *REG_APPDATA_NAME; + +public: + AppLauncher(); + virtual ~AppLauncher(); + +protected: + virtual bool initBaseNames(); + virtual const char * getAppName(); + virtual void addSpecificOptions(CmdArgs &args); + virtual void adjustHeapSize(); + virtual bool findUserDir(const char *str); + virtual const char * getDefUserDirOptName(); + virtual const char * getDefOptionsOptName(); + virtual const char * getExtraClustersOptName(); + virtual const char * getJdkHomeOptName(); + +private: + AppLauncher(const AppLauncher& orig); +}; + +#endif /* _NBLAUNCHER_H */ + diff --git a/apisupport.harness/windows-launcher-src/nbproject/Makefile-Default.mk b/apisupport.harness/windows-launcher-src/nbproject/Makefile-Default.mk deleted file mode 100644 --- a/apisupport.harness/windows-launcher-src/nbproject/Makefile-Default.mk +++ /dev/null @@ -1,53 +0,0 @@ -# -# Gererated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a -pre and a -post target defined where you can add custumized code. -# -# This makefile implements configuration specific macros and targets. - - -# Environment -MKDIR=mkdir -CP=cp -CCADMIN=CCadmin -RANLIB=ranlib -CC=gcc -CCC=g++ -CXX=g++ -FC=g77 - -# Include project Makefile -include Makefile_windows-launcher-src.mk - -# Object Files -OBJECTFILES= - -# C Compiler Flags -CFLAGS= - -# CC Compiler Flags -CCFLAGS= -CXXFLAGS= - -# Fortran Compiler Flags -FFLAGS= - -# Link Libraries and Options -LDLIBSOPTIONS= - -# Build Targets -.build-conf: - cd .;\ - make -f Makefile - -# Subprojects -.build-subprojects: - -# Clean Targets -.clean-conf: - cd .;\ - make -f Makefile clean - -# Subprojects -.clean-subprojects: diff --git a/apisupport.harness/windows-launcher-src/nbproject/Makefile-Release.mk b/apisupport.harness/windows-launcher-src/nbproject/Makefile-Release.mk new file mode 100644 --- /dev/null +++ b/apisupport.harness/windows-launcher-src/nbproject/Makefile-Release.mk @@ -0,0 +1,95 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a -pre and a -post target defined where you can add customized code. +# +# This makefile implements configuration specific macros and targets. + + +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib +CC=gcc.exe +CCC=g++.exe +CXX=g++.exe +FC= +AS= + +# Macros +PLATFORM=Cygwin-Windows + +# Include project Makefile +include Makefile + +# Object Directory +OBJECTDIR=build/Release/${PLATFORM} + +# Object Files +OBJECTFILES= \ + ${OBJECTDIR}/_ext/E_/work/netbeans/hg/main_work/apisupport.harness/windows-launcher-src/../../ide/launcher/windows/nblauncher.o \ + ${OBJECTDIR}/_ext/E_/work/netbeans/hg/main_work/apisupport.harness/windows-launcher-src/../../o.n.bootstrap/launcher/windows/utilsfuncs.o \ + ${OBJECTDIR}/app.o \ + ${OBJECTDIR}/applauncher.o + +# C Compiler Flags +CFLAGS= + +# CC Compiler Flags +CCFLAGS=-m32 -s -mno-cygwin +CXXFLAGS=-m32 -s -mno-cygwin + +# Fortran Compiler Flags +FFLAGS= + +# Assembler Flags +ASFLAGS= + +# Link Libraries and Options +LDLIBSOPTIONS=app.res + +# Build Targets +.build-conf: ${BUILD_SUBPROJECTS} + ${MAKE} -f nbproject/Makefile-Release.mk ../release/launchers/app.exe.exe + +../release/launchers/app.exe.exe: ${OBJECTFILES} + ${MKDIR} -p ../release/launchers + ${LINK.cc} -mwindows -o ../release/launchers/app.exe ${OBJECTFILES} ${LDLIBSOPTIONS} + +${OBJECTDIR}/_ext/E_/work/netbeans/hg/main_work/apisupport.harness/windows-launcher-src/../../ide/launcher/windows/nblauncher.o: ../../ide/launcher/windows/nblauncher.cpp + ${MKDIR} -p ${OBJECTDIR}/_ext/E_/work/netbeans/hg/main_work/apisupport.harness/windows-launcher-src/../../ide/launcher/windows + ${RM} $@.d + $(COMPILE.cc) -O2 -Wall -I/cygdrive/c/cygwin/usr/include/mingw -MMD -MP -MF $@.d -o ${OBJECTDIR}/_ext/E_/work/netbeans/hg/main_work/apisupport.harness/windows-launcher-src/../../ide/launcher/windows/nblauncher.o ../../ide/launcher/windows/nblauncher.cpp + +${OBJECTDIR}/_ext/E_/work/netbeans/hg/main_work/apisupport.harness/windows-launcher-src/../../o.n.bootstrap/launcher/windows/utilsfuncs.o: ../../o.n.bootstrap/launcher/windows/utilsfuncs.cpp + ${MKDIR} -p ${OBJECTDIR}/_ext/E_/work/netbeans/hg/main_work/apisupport.harness/windows-launcher-src/../../o.n.bootstrap/launcher/windows + ${RM} $@.d + $(COMPILE.cc) -O2 -Wall -I/cygdrive/c/cygwin/usr/include/mingw -MMD -MP -MF $@.d -o ${OBJECTDIR}/_ext/E_/work/netbeans/hg/main_work/apisupport.harness/windows-launcher-src/../../o.n.bootstrap/launcher/windows/utilsfuncs.o ../../o.n.bootstrap/launcher/windows/utilsfuncs.cpp + +${OBJECTDIR}/app.o: app.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} $@.d + $(COMPILE.cc) -O2 -Wall -I/cygdrive/c/cygwin/usr/include/mingw -MMD -MP -MF $@.d -o ${OBJECTDIR}/app.o app.cpp + +${OBJECTDIR}/applauncher.o: applauncher.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} $@.d + $(COMPILE.cc) -O2 -Wall -I/cygdrive/c/cygwin/usr/include/mingw -MMD -MP -MF $@.d -o ${OBJECTDIR}/applauncher.o applauncher.cpp + +# Subprojects +.build-subprojects: + +# Clean Targets +.clean-conf: + ${RM} -r build/Release + ${RM} ../release/launchers/app.exe.exe + +# Subprojects +.clean-subprojects: + +# Enable dependency checking +.dep.inc: .depcheck-impl + +include .dep.inc diff --git a/apisupport.harness/windows-launcher-src/nbproject/Makefile-impl.mk b/apisupport.harness/windows-launcher-src/nbproject/Makefile-impl.mk --- a/apisupport.harness/windows-launcher-src/nbproject/Makefile-impl.mk +++ b/apisupport.harness/windows-launcher-src/nbproject/Makefile-impl.mk @@ -27,27 +27,27 @@ PROJECTNAME=windows-launcher-src # Active Configuration -ACTIVECONF=Default -CONF=${ACTIVECONF} +DEFAULTCONF=Release +CONF=${DEFAULTCONF} # All Configurations -ALLCONFS=Default +ALLCONFS=Release # build -.build-impl: .validate-impl +.build-impl: .build-pre .validate-impl .depcheck-impl @#echo "=> Running $@... Configuration=$(CONF)" ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf # clean -.clean-impl: .validate-impl +.clean-impl: .clean-pre .validate-impl .depcheck-impl @#echo "=> Running $@... Configuration=$(CONF)" ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf # clobber -.clobber-impl: +.clobber-impl: .clobber-pre .depcheck-impl @#echo "=> Running $@..." for CONF in ${ALLCONFS}; \ do \ @@ -55,13 +55,25 @@ done # all -.all-impl: +.all-impl: .all-pre .depcheck-impl @#echo "=> Running $@..." for CONF in ${ALLCONFS}; \ do \ ${MAKE} -f nbproject/Makefile-$${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf; \ done +# dependency checking support +.depcheck-impl: + @echo "# This code depends on make tool being used" >.dep.inc + @if [ -n "${MAKE_VERSION}" ]; then \ + echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \ + echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ + echo "include \$${DEPFILES}" >>.dep.inc; \ + echo "endif" >>.dep.inc; \ + else \ + echo ".KEEP_STATE:" >>.dep.inc; \ + echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ + fi # configuration validation .validate-impl: @@ -80,7 +92,7 @@ # help -.help-impl: +.help-impl: .help-pre @echo "This makefile supports the following configurations:" @echo " ${ALLCONFS}" @echo "" @@ -108,10 +120,4 @@ @echo " also build subprojects." @echo "Target 'help' prints this message." @echo "" - @echo "The active configuration (${ACTIVECONF}) is being used if the configuration is not specified." - @echo "" - -# Enable dependency checking -.KEEP_STATE: -.KEEP_STATE_FILE:.make.state.${CONF} diff --git a/apisupport.harness/windows-launcher-src/nbproject/Package-Release.bash b/apisupport.harness/windows-launcher-src/nbproject/Package-Release.bash new file mode 100644 --- /dev/null +++ b/apisupport.harness/windows-launcher-src/nbproject/Package-Release.bash @@ -0,0 +1,72 @@ +#!/bin/bash -x + +# +# Generated - do not edit! +# + +# Macros +TOP=`pwd` +PLATFORM=Cygwin-Windows +TMPDIR=build/Release/${PLATFORM}/tmp-packaging +TMPDIRNAME=tmp-packaging +OUTPUT_PATH=../release/launchers/app.exe +OUTPUT_BASENAME=app.exe +PACKAGE_TOP_DIR=windows-launcher-src/ + +# Functions +function checkReturnCode +{ + rc=$? + if [ $rc != 0 ] + then + exit $rc + fi +} +function makeDirectory +# $1 directory path +# $2 permission (optional) +{ + mkdir -p "$1" + checkReturnCode + if [ "$2" != "" ] + then + chmod $2 "$1" + checkReturnCode + fi +} +function copyFileToTmpDir +# $1 from-file path +# $2 to-file path +# $3 permission +{ + cp "$1" "$2" + checkReturnCode + if [ "$3" != "" ] + then + chmod $3 "$2" + checkReturnCode + fi +} + +# Setup +cd "${TOP}" +mkdir -p dist/Release/${PLATFORM}/package +rm -rf ${TMPDIR} +mkdir -p ${TMPDIR} + +# Copy files and create directories and links +cd "${TOP}" +makeDirectory ${TMPDIR}/windows-launcher-src/bin +copyFileToTmpDir "${OUTPUT_PATH}.exe" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}.exe" 0755 + + +# Generate tar file +cd "${TOP}" +rm -f dist/Release/${PLATFORM}/package/windows-launcher-src.tar +cd ${TMPDIR} +tar -vcf ../../../../dist/Release/${PLATFORM}/package/windows-launcher-src.tar * +checkReturnCode + +# Cleanup +cd "${TOP}" +rm -rf ${TMPDIR} diff --git a/apisupport.harness/windows-launcher-src/nbproject/configurations.xml b/apisupport.harness/windows-launcher-src/nbproject/configurations.xml --- a/apisupport.harness/windows-launcher-src/nbproject/configurations.xml +++ b/apisupport.harness/windows-launcher-src/nbproject/configurations.xml @@ -1,50 +1,82 @@ - + + + applauncher.h + ../../ide/launcher/windows/nblauncher.h + ../../o.n.bootstrap/launcher/windows/utilsfuncs.h + + + + + app.cpp + applauncher.cpp + ../../ide/launcher/windows/nblauncher.cpp + ../../o.n.bootstrap/launcher/windows/utilsfuncs.cpp + - Makefile_windows-launcher-src.mk + Makefile - app.rc - app.ico - app.cpp - Makefile - Makefile_windows-launcher-src.mk - 0 + Makefile - + - 1 + localhost + Cygwin|Cygwin 3 - - - . - make -f Makefile - make -f Makefile clean - ../release/launcher/app.exe - - - - - - - - + + + 5 + + + 5 + 1 + + c:/cygwin/usr/include/mingw + + -s -mno-cygwin + 2 + + + 5 + + + ../release/launchers/app.exe + + app.res + + -mwindows + + + + 1 + + + 3 + + + 1 + + + 3 + 1 - - - - 3 + + 1 - - 3 - - + 3 diff --git a/apisupport.harness/windows-launcher-src/nbproject/project.xml b/apisupport.harness/windows-launcher-src/nbproject/project.xml --- a/apisupport.harness/windows-launcher-src/nbproject/project.xml +++ b/apisupport.harness/windows-launcher-src/nbproject/project.xml @@ -3,8 +3,13 @@ org.netbeans.modules.cnd.makeproject - windows-launcher-src + Platform App Launcher Win 0 + + cpp + h + UTF-8 + diff --git a/ide/launcher/windows/.dep.inc b/ide/launcher/windows/.dep.inc new file mode 100644 --- /dev/null +++ b/ide/launcher/windows/.dep.inc @@ -0,0 +1,5 @@ +# This code depends on make tool being used +DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES})) +ifneq (${DEPFILES},) +include ${DEPFILES} +endif diff --git a/ide/launcher/windows/Makefile b/ide/launcher/windows/Makefile --- a/ide/launcher/windows/Makefile +++ b/ide/launcher/windows/Makefile @@ -1,75 +1,95 @@ -# -*- Makefile -*- # -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. +# There exist several targets which are by default empty and which can be +# used for execution of your targets. These targets are usually executed +# before and after some main targets. They are: # -# Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved. +# .build-pre: called before 'build' target +# .build-post: called after 'build' target +# .clean-pre: called before 'clean' target +# .clean-post: called after 'clean' target +# .clobber-pre: called before 'clobber' target +# .clobber-post: called after 'clobber' target +# .all-pre: called before 'all' target +# .all-post: called after 'all' target +# .help-pre: called before 'help' target +# .help-post: called after 'help' target # -# The contents of this file are subject to the terms of either the GNU -# General Public License Version 2 only ("GPL") or the Common -# Development and Distribution License("CDDL") (collectively, the -# "License"). You may not use this file except in compliance with the -# License. You can obtain a copy of the License at -# http://www.netbeans.org/cddl-gplv2.html -# or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the -# specific language governing permissions and limitations under the -# License. When distributing the software, include this License Header -# Notice in each file and include the License file at -# nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this -# particular file as subject to the "Classpath" exception as provided -# by Sun in the GPL Version 2 section of the License file that -# accompanied this code. If applicable, add the following below the -# License Header, with the fields enclosed by brackets [] replaced by -# your own identifying information: -# "Portions Copyrighted [year] [name of copyright owner]" +# Targets beginning with '.' are not intended to be called on their own. # -# Contributor(s): +# Main targets can be executed directly, and they are: +# +# build build a specific configuration +# clean remove built files from a configuration +# clobber remove all built files +# all build all configurations +# help print help mesage +# +# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and +# .help-impl are implemented in nbproject/makefile-impl.mk. # -# The Original Software is Forte for Java, Community Edition. The Initial -# Developer of the Original Software is Sun Microsystems, Inc. Portions -# Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. -# -# If you wish your version of this file to be governed by only the CDDL -# or only the GPL Version 2, indicate your decision by adding -# "[Contributor] elects to include this software in this distribution -# under the [CDDL or GPL Version 2] license." If you do not indicate a -# single choice of license, a recipient has the option to distribute -# your version of this file under either the CDDL, the GPL Version 2 or -# to extend the choice of license to its licensees as provided above. -# However, if you add GPL Version 2 code and therefore, elected the GPL -# Version 2 license, then the option applies only if the new code is -# made subject to such option by the copyright holder. -# +# NOCDDL -LIBS = -#LIBS = advapi32.lib user32.lib -CFLAGS = -s -mno-cygwin -#!ifdef DEBUG -# CFLAGS = $(CFLAGS) -Zi -#!endif +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib -all : netbeans.exe nb.exe +# build +build: .build-post -netbeans.exe : netbeans.cpp netbeans.res - gcc $(CFLAGS) $(LIBS) -mwindows -DWINMAIN netbeans.cpp -o netbeans.exe netbeans.res -nb.exe : netbeans.cpp - gcc $(CFLAGS) $(LIBS) netbeans.cpp -o nb.exe +.build-pre: netbeans.res +# Add your pre 'build' code here... -netbeans.res : netbeans.rc +.build-post: .build-impl +# Add your post 'build' code here... + cp *.exe ../../../nbbuild/netbeans/bin/ + +netbeans.res: netbeans.rc windres -o$@ -Ocoff netbeans.rc -clean : - -rm *.res *.obj *.pdb *.ilk *~ 2>NUL +# clean +clean: .clean-post -distclean : clean - -rm *.exe 2>NUL +.clean-pre: +# Add your pre 'clean' code here... -testinst : all - cp *.exe ../../../nbbuild/netbeans/bin/ +.clean-post: .clean-impl +# Add your post 'clean' code here... -test : testinst - ../../../nbbuild/netbeans/bin/netbeans.exe -test2 : testinst - ../../../nbbuild/netbeans/bin/nb.exe +# clobber +clobber: .clobber-post + +.clobber-pre: +# Add your pre 'clobber' code here... + +.clobber-post: .clobber-impl +# Add your post 'clobber' code here... + + +# all +all: .all-post + +.all-pre: +# Add your pre 'all' code here... + +.all-post: .all-impl +# Add your post 'all' code here... + + +# help +help: .help-post + +.help-pre: +# Add your pre 'help' code here... + +.help-post: .help-impl +# Add your post 'help' code here... + + + +# include project implementation makefile +include nbproject/Makefile-impl.mk diff --git a/ide/launcher/windows/Makefile_windows.mk b/ide/launcher/windows/Makefile_windows.mk deleted file mode 100644 --- a/ide/launcher/windows/Makefile_windows.mk +++ /dev/null @@ -1,92 +0,0 @@ -# -# There exist several targets which are by default empty and which can be -# used for execution of your targets. These targets are usually executed -# before and after some main targets. They are: -# -# .build-pre: called before 'build' target -# .build-post: called after 'build' target -# .clean-pre: called before 'clean' target -# .clean-post: called after 'clean' target -# .clobber-pre: called before 'clobber' target -# .clobber-post: called after 'clobber' target -# .all-pre: called before 'all' target -# .all-post: called after 'all' target -# .help-pre: called before 'help' target -# .help-post: called after 'help' target -# -# Targets beginning with '.' are not intended to be called on their own. -# -# Main targets can be executed directly, and they are: -# -# build build a specific configuration -# clean remove built files from a configuration -# clobber remove all built files -# all build all configurations -# help print help mesage -# -# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and -# .help-impl are implemented in nbproject/makefile-impl.mk. -# -# NOCDDL - - -# Environment -MKDIR=mkdir -CP=cp -CCADMIN=CCadmin -RANLIB=ranlib - - -# build -build: .build-pre .build-impl .build-post - -.build-pre: -# Add your pre 'build' code here... - -.build-post: -# Add your post 'build' code here... - - -# clean -clean: .clean-pre .clean-impl .clean-post - -.clean-pre: -# Add your pre 'clean' code here... - -.clean-post: -# Add your post 'clean' code here... - - -# clobber -clobber: .clobber-pre .clobber-impl .clobber-post - -.clobber-pre: -# Add your pre 'clobber' code here... - -.clobber-post: -# Add your post 'clobber' code here... - - -# all -all: .all-pre .all-impl .all-post - -.all-pre: -# Add your pre 'all' code here... - -.all-post: -# Add your post 'all' code here... - - -# help -help: .help-pre .help-impl .help-post - -.help-pre: -# Add your pre 'help' code here... - -.help-post: -# Add your post 'help' code here... - - - -# include project implementation makefile -include nbproject/Makefile-impl.mk diff --git a/ide/launcher/windows/cmdargs.h b/ide/launcher/windows/cmdargs.h new file mode 100644 --- /dev/null +++ b/ide/launcher/windows/cmdargs.h @@ -0,0 +1,140 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 1997-2008 Sun Microsystems, Inc. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun + * Microsystems, Inc. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Author: Tomas Holy + */ + +#ifndef _CMDARGS_H +#define _CMDARGS_H + +class CmdArgs { +public: + + CmdArgs(int _count) { + used = 0; + size = _count; + args = new char*[size]; + memset(args, 0, size * sizeof (char*)); + } + + ~CmdArgs() { + if (args) { + for (int i = 0; i < size; i++) { + delete[] args[i]; + } + delete[] args; + } + } + + void add(const char *arg) { + if (used + 1 > size) { + int newSize = size + size / 2 + 1; + char **newArgs = new char*[newSize]; + memcpy(newArgs, args, size * sizeof (char*)); + memset(newArgs + size, 0, (newSize - size) * sizeof (char*)); + delete[] args; + args = newArgs; + size = newSize; + } + args[used] = new char[strlen(arg) + 1]; + strcpy(args[used++], arg); + } + + void addCmdLine(const char *cmdLine) { + char arg[1024] = ""; + bool inQuotes = false; + bool inText = false; + int i = 0; + int j = 0; + char c; + while (c = cmdLine[i]) { + if (inQuotes) { + if (c == '\"') { + inQuotes = false; + } else { + arg[j++] = c; + } + } else { + switch (c) { + case '\"': + inQuotes = true; + inText = true; + break; + case ' ': + case '\t': + case '\n': + case '\r': + if (inText) { + arg[j] = '\0'; + add(arg); + j = 0; + } + inText = false; + break; + default: + inText = true; + arg[j++] = c; + break; + } + } + i++; + } + if (j > 0) { + arg[j] = '\0'; + add(arg); + } + } + + int getCount() { + return used; + } + + char **getArgs() { + return args; + } + +private: + int used; + int size; + char **args; +}; + +#endif /* _CMDARGS_H */ + diff --git a/ide/launcher/windows/nb.exe b/ide/launcher/windows/nb.exe deleted file mode 100644 Binary file ide/launcher/windows/nb.exe has changed diff --git a/ide/launcher/windows/nblauncher.cpp b/ide/launcher/windows/nblauncher.cpp new file mode 100644 --- /dev/null +++ b/ide/launcher/windows/nblauncher.cpp @@ -0,0 +1,398 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 1997-2008 Sun Microsystems, Inc. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun + * Microsystems, Inc. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Author: Tomas Holy + */ + +#include "nblauncher.h" +#include "../../../o.n.bootstrap/launcher/windows/utilsfuncs.h" +#include "../../../o.n.bootstrap/launcher/windows/argnames.h" + +using namespace std; + +const char *NbLauncher::NBEXEC_FILE_PATH = "\\lib\\nbexec.dll"; +const char *NbLauncher::OPT_NB_DEFAULT_USER_DIR = "netbeans_default_userdir="; +const char *NbLauncher::OPT_NB_DEFAULT_OPTIONS = "netbeans_default_options="; +const char *NbLauncher::OPT_NB_EXTRA_CLUSTERS = "netbeans_extraclusters="; +const char *NbLauncher::OPT_NB_JDK_HOME = "netbeans_jdkhome="; +const char *NbLauncher::ENV_USER_PROFILE = "USERPROFILE"; +const char *NbLauncher::HOME_TOKEN = "${HOME}"; +const char *NbLauncher::REG_SHELL_FOLDERS_KEY = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; +const char *NbLauncher::REG_DESKTOP_NAME = "Desktop"; + +const char *NbLauncher::staticOptions[] = { + "-J-Dnetbeans.importclass=org.netbeans.upgrade.AutoUpgrade", + "-J-Dnetbeans.accept_license_class=org.netbeans.license.AcceptLicense", + "--branding", + "nb" +}; + +NbLauncher::NbLauncher() { +} + +NbLauncher::NbLauncher(const NbLauncher& orig) { +} + +NbLauncher::~NbLauncher() { +} + +bool NbLauncher::start(char *cmdLine, DWORD *retCode) { + CmdArgs args(50); + args.addCmdLine(cmdLine); + return start(args.getCount(), args.getArgs(), retCode); +} + +bool NbLauncher::start(int argc, char *argv[], DWORD *retCode) { + SetErrorMode(SetErrorMode(0) | SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); + + if (!checkLoggingArg(argc, argv, true) || !setUpProcess(argc, argv) || !initBaseNames() || !readClusterFile()) { + return false; + } + + parseConfigFile((baseDir + "\\etc\\" + getAppName() + ".conf").c_str()); + + if (!parseArgs(argc, argv)) { + return false; + } + string oldUserDir = userDir; + parseConfigFile((userDir + "\\etc\\" + getAppName() + ".conf").c_str()); + userDir = oldUserDir; + + adjustHeapSize(); + addExtraClusters(); + string nbexecPath; + if (dirExists(platformDir.c_str())) { + nbexecPath = platformDir; + } else { + nbexecPath = baseDir + '\\' + platformDir; + } + if (!dirExists(nbexecPath.c_str())) { + logErr(false, true, "Could not find platform cluster:\n%s", nbexecPath.c_str()); + return false; + } + + CmdArgs newArgs(argc + 20); + addSpecificOptions(newArgs); + + if (!jdkHome.empty()) { + newArgs.add(ARG_NAME_JDKHOME); + newArgs.add(jdkHome.c_str()); + } + if (!clusters.empty()) { + newArgs.add(ARG_NAME_CLUSTERS); + newArgs.add(clusters.c_str()); + } + if (!userDir.empty()) { + newArgs.add(ARG_NAME_USER_DIR); + newArgs.add(userDir.c_str()); + } + if (!nbOptions.empty()) { + newArgs.addCmdLine(nbOptions.c_str()); + } + for (int i = 0; i < argc; i++) { + newArgs.add(argv[i]); + } + nbexecPath += NBEXEC_FILE_PATH; + + HMODULE hLib = LoadLibrary(nbexecPath.c_str()); + if (!hLib) { + logErr(true, true, "Cannot load \"%s\".", nbexecPath.c_str()); + return false; + } + + StartPlatform startPlatform = (StartPlatform) GetProcAddress(hLib, "startPlatform"); + if (!startPlatform) { + logErr(true, true, "Cannot start platform, failed to find startPlatform() in %s", nbexecPath.c_str()); + } + logMsg("Starting platform...\n"); + *retCode = startPlatform(newArgs.getCount(), newArgs.getArgs()); + FreeLibrary(hLib); + return true; +} + +bool NbLauncher::initBaseNames() { + char path[MAX_PATH] = ""; + getCurrentModulePath(path, MAX_PATH); + logMsg("Executable: %s", path); + char *bslash = strrchr(path, '\\'); + if (!bslash) { + return false; + } + appName = bslash + 1; + appName.erase(appName.find('.')); + logMsg("Application name: %s", appName.c_str()); + + *bslash = '\0'; + bslash = strrchr(path, '\\'); + if (!bslash) { + return false; + } + *bslash = '\0'; + + baseDir = path; + logMsg("Base dir: %s", baseDir.c_str()); + return true; +} + +void NbLauncher::addCluster(const char *cl) { + string cluster = dirExists(cl) ? cl : (baseDir + '\\' + cl); + if (!clusters.empty()) { + clusters += ';'; + } + logMsg("Adding cluster %s", cluster.c_str()); + clusters += cluster; +} + +void NbLauncher::addExtraClusters() { + logMsg("addExtraClusters()"); + const char delim = ';'; + string::size_type start = extraClusters.find_first_not_of(delim, 0); + string::size_type end = extraClusters.find_first_of(delim, start); + while (string::npos != end || string::npos != start) { + string cluster = extraClusters.substr(start, end - start); + addCluster(cluster.c_str()); + start = extraClusters.find_first_not_of(delim, end); + end = extraClusters.find_first_of(delim, start); + } +} + +bool NbLauncher::readClusterFile() { + clusters = ""; + string clusterFile = baseDir + "\\etc\\" + getAppName() + ".clusters"; + logMsg("readClusterFile() file: %s", clusterFile.c_str()); + + FILE* file = fopen(clusterFile.c_str(), "r"); + if (!file) { + logErr(true, true, "Cannot open file \"%s\" for reading.", clusterFile.c_str()); + return false; + } + + char line[4096] = ""; + while (fgets(line, sizeof(line), file)) { + char *str = skipWhitespaces(line); + if (*str == '#' || *str == '\0') { + continue; + } + char *pc = str; + while (*pc != '\0' && *pc != '\t' && *pc != '\n' && *pc != '\r') { + pc++; + } + *pc = '\0'; + + if (platformDir.empty()) { + char *slash = strrchr(str, '\\'); + if (!slash) { + slash = strrchr(str, '/'); + } + char *dir = slash ? slash + 1 : str; + if (strncmp(dir, "platform", strlen("platform")) == 0) { + platformDir = str; + } else { + addCluster(str); + } + } else { + addCluster(str); + } + } + bool ok = ferror(file) == 0; + if (!ok) { + logErr(true, true, "Error while reading file \"%s\".", clusterFile.c_str()); + } + fclose(file); + return ok; +} + +bool NbLauncher::parseArgs(int argc, char *argv[]) { +#define CHECK_ARG \ + if (i+1 == argc) {\ + logErr(false, true, "Argument is missing for \"%s\" option.", argv[i]);\ + return false;\ + } + + logMsg("parseArgs():"); + for (int i = 0; i < argc; i++) { + logMsg("\t%s", argv[i]); + } + for (int i = 0; i < argc; i++) { + if (strcmp(ARG_NAME_USER_DIR, argv[i]) == 0) { + CHECK_ARG; + char tmp[MAX_PATH + 1] = {0}; + strncpy(tmp, argv[++i], MAX_PATH); + if (!normalizePath(tmp)) { + logErr(false, true, "User directory path \"%s\" is not valid.", argv[i]); + return false; + } + userDir = tmp; + logMsg("User dir: %s", userDir.c_str()); + } + } + logMsg("parseArgs() finished"); + return true; +} + +bool NbLauncher::findUserDir(const char *str) { + logMsg("NbLauncher::findUserDir()"); + if (strncmp(str, HOME_TOKEN, strlen(HOME_TOKEN)) == 0) { + if (userHome.empty()) { + char *userProfile = getenv(ENV_USER_PROFILE); + if (userProfile) { + userHome = userProfile; + } else { + + if (!getStringFromRegistry(HKEY_CURRENT_USER, REG_SHELL_FOLDERS_KEY, REG_DESKTOP_NAME, userHome)) { + return false; + } + userHome.erase(userHome.rfind('\\')); + } + logMsg("User home: %s", userHome.c_str()); + } + userDir = userHome + (str + strlen(HOME_TOKEN)); + } else { + userDir = str; + } + return true; +} + +bool NbLauncher::getOption(char *&str, const char *opt) { + if (strncmp(str, opt, strlen(opt)) == 0) { + str += strlen(opt); + char *end = trimWhitespaces(str); + if (*str == '"') { + str++; + } + if (end >= str && *end == '"') { + *end = '\0'; + } + logMsg("Option found: %s%s", opt, str); + return true; + } + return false; +} + +bool NbLauncher::parseConfigFile(const char* path) { + logMsg("parseConfigFile(%s)", path); + FILE *file = fopen(path, "r"); + if (!file) { + logErr(true, false, "Cannot open file \"%s\" for reading.", path); + return false; + } + + char line[4096] = ""; + while (fgets(line, sizeof(line), file)) { + char *str = skipWhitespaces(line); + if (*str == '#') { + continue; + } + if (getOption(str, getDefUserDirOptName())) { + findUserDir(str); + logMsg("User dir: %s", userDir.c_str()); + } else if (getOption(str, getDefOptionsOptName())) { + // replace \" by " + int len = strlen(str); + int k = 0; + for (int i = 0; i < len; i++) { + if (str[i] == '\\' && str[i+1] == '\"') { + continue; + } + str[k++] = str[i]; + } + str[k] = '\0'; + nbOptions = str; + logMsg("After replacement: %s", nbOptions.c_str()); + + } else if (getOption(str, getExtraClustersOptName())) { + extraClusters = str; + } else if (getOption(str, getJdkHomeOptName())) { + jdkHome = str; + } + } + bool ok = ferror(file) == 0; + if (!ok) { + logErr(true, false, "Error while reading file \"%s\".", path); + } + fclose(file); + return true; +} + +// Search if -Xmx is specified in existing arguments +// If it isn't it adds it - 20% of available RAM but min is 96M and max 512M +void NbLauncher::adjustHeapSize() { + if (nbOptions.find("-J-Xmx") == string::npos) { + // find how much memory we have and add -Xmx + MEMORYSTATUS ms = {0}; + GlobalMemoryStatus(&ms); + int memory = (int)((ms.dwTotalPhys / 1024 / 1024) / 5); + if (memory < 96) { + memory = 96; + } + else if (memory > 512) { + memory = 512; + } + char tmp[32]; + snprintf(tmp, 32, " -J-Xmx%dm", memory); + nbOptions += tmp; + } +} + +const char * NbLauncher::getAppName() { + return "netbeans"; +} + +void NbLauncher::addSpecificOptions(CmdArgs &args) { + for (unsigned i = 0; i < sizeof (staticOptions) / sizeof (char*); i++) { + args.add(staticOptions[i]); + } +} + +const char * NbLauncher::getDefUserDirOptName() { + return OPT_NB_DEFAULT_USER_DIR; +} + +const char * NbLauncher::getDefOptionsOptName() { + return OPT_NB_DEFAULT_OPTIONS; +} + +const char * NbLauncher::getExtraClustersOptName() { + return OPT_NB_EXTRA_CLUSTERS; +} + +const char * NbLauncher::getJdkHomeOptName() { + return OPT_NB_JDK_HOME; +} diff --git a/ide/launcher/windows/nblauncher.h b/ide/launcher/windows/nblauncher.h new file mode 100644 --- /dev/null +++ b/ide/launcher/windows/nblauncher.h @@ -0,0 +1,108 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 1997-2008 Sun Microsystems, Inc. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun + * Microsystems, Inc. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Author: Tomas Holy + */ + +#ifndef _NBLAUNCHER_H +#define _NBLAUNCHER_H + +#include +#include +#include "cmdargs.h" + +class NbLauncher { +protected: + static const char *NBEXEC_FILE_PATH; + static const char *OPT_NB_DEFAULT_USER_DIR; + static const char *OPT_NB_DEFAULT_OPTIONS; + static const char *OPT_NB_EXTRA_CLUSTERS; + static const char *OPT_NB_JDK_HOME; + static const char *REG_SHELL_FOLDERS_KEY; + static const char *HOME_TOKEN; + +private: + static const char *ENV_USER_PROFILE; + static const char *REG_DESKTOP_NAME; + static const char* staticOptions[]; + + typedef int (*StartPlatform)(int argc, char *argv[]); + +public: + NbLauncher(); + virtual ~NbLauncher(); + + bool start(int argc, char *argv[], DWORD *retCode); + bool start(char *cmdLine, DWORD *retCode); + +protected: + virtual bool initBaseNames(); + virtual void addSpecificOptions(CmdArgs &args); + virtual void adjustHeapSize(); + virtual bool findUserDir(const char *str); + virtual const char * getAppName(); + virtual const char * getDefUserDirOptName(); + virtual const char * getDefOptionsOptName(); + virtual const char * getExtraClustersOptName(); + virtual const char * getJdkHomeOptName(); + +private: + NbLauncher(const NbLauncher& orig); + bool readClusterFile(); + bool parseArgs(int argc, char *argv[]); + bool parseConfigFile(const char* path); + bool getOption(char *&str, const char *opt); + void addCluster(const char *cl); + void addExtraClusters(); + +protected: + std::string baseDir; + std::string appName; + std::string platformDir; + std::string userHome; + std::string userDir; + std::string clusters; + std::string extraClusters; + std::string nbOptions; + std::string jdkHome; +}; + +#endif /* _NBLAUNCHER_H */ + diff --git a/ide/launcher/windows/nbproject/Makefile-Default.mk b/ide/launcher/windows/nbproject/Makefile-Default.mk deleted file mode 100644 --- a/ide/launcher/windows/nbproject/Makefile-Default.mk +++ /dev/null @@ -1,54 +0,0 @@ -# -# Gererated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a -pre and a -post target defined where you can add customized code. -# -# This makefile implements configuration specific macros and targets. - - -# Environment -MKDIR=mkdir -CP=cp -CCADMIN=CCadmin -RANLIB=ranlib -CC=gcc.exe -CCC=g++.exe -CXX=g++.exe -FC= - -# Include project Makefile -include Makefile_windows.mk - -# Object Directory -OBJECTDIR=build/Default/Cygwin-Windows - -# Object Files -OBJECTFILES= - -# C Compiler Flags -CFLAGS= - -# CC Compiler Flags -CCFLAGS= -CXXFLAGS= - -# Fortran Compiler Flags -FFLAGS= - -# Link Libraries and Options -LDLIBSOPTIONS= - -# Build Targets -.build-conf: ${BUILD_SUBPROJECTS} - cd . && make -f Makefile testinst - -# Subprojects -.build-subprojects: - -# Clean Targets -.clean-conf: - cd . && make -f Makefile clean - -# Subprojects -.clean-subprojects: diff --git a/ide/launcher/windows/nbproject/Makefile-impl.mk b/ide/launcher/windows/nbproject/Makefile-impl.mk --- a/ide/launcher/windows/nbproject/Makefile-impl.mk +++ b/ide/launcher/windows/nbproject/Makefile-impl.mk @@ -27,27 +27,27 @@ PROJECTNAME=windows # Active Configuration -DEFAULTCONF=Default +DEFAULTCONF=netbeans.exe CONF=${DEFAULTCONF} # All Configurations -ALLCONFS=Default +ALLCONFS=netbeans.exe # build -.build-impl: .validate-impl +.build-impl: .build-pre .validate-impl .depcheck-impl @#echo "=> Running $@... Configuration=$(CONF)" ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf # clean -.clean-impl: .validate-impl +.clean-impl: .clean-pre .validate-impl .depcheck-impl @#echo "=> Running $@... Configuration=$(CONF)" ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf # clobber -.clobber-impl: +.clobber-impl: .clobber-pre .depcheck-impl @#echo "=> Running $@..." for CONF in ${ALLCONFS}; \ do \ @@ -55,13 +55,25 @@ done # all -.all-impl: +.all-impl: .all-pre .depcheck-impl @#echo "=> Running $@..." for CONF in ${ALLCONFS}; \ do \ ${MAKE} -f nbproject/Makefile-$${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf; \ done +# dependency checking support +.depcheck-impl: + @echo "# This code depends on make tool being used" >.dep.inc + @if [ -n "${MAKE_VERSION}" ]; then \ + echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \ + echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ + echo "include \$${DEPFILES}" >>.dep.inc; \ + echo "endif" >>.dep.inc; \ + else \ + echo ".KEEP_STATE:" >>.dep.inc; \ + echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ + fi # configuration validation .validate-impl: @@ -80,7 +92,7 @@ # help -.help-impl: +.help-impl: .help-pre @echo "This makefile supports the following configurations:" @echo " ${ALLCONFS}" @echo "" @@ -108,6 +120,4 @@ @echo " also build subprojects." @echo "Target 'help' prints this message." @echo "" - @echo "The active configuration (${ACTIVECONF}) is being used if the configuration is not specified." - @echo "" diff --git a/ide/launcher/windows/nbproject/Makefile-netbeans.exe.mk b/ide/launcher/windows/nbproject/Makefile-netbeans.exe.mk new file mode 100644 --- /dev/null +++ b/ide/launcher/windows/nbproject/Makefile-netbeans.exe.mk @@ -0,0 +1,88 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a -pre and a -post target defined where you can add customized code. +# +# This makefile implements configuration specific macros and targets. + + +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib +CC=gcc.exe +CCC=g++.exe +CXX=g++.exe +FC= +AS= + +# Macros +PLATFORM=Cygwin-Windows + +# Include project Makefile +include Makefile + +# Object Directory +OBJECTDIR=build/netbeans.exe/${PLATFORM} + +# Object Files +OBJECTFILES= \ + ${OBJECTDIR}/netbeans.o \ + ${OBJECTDIR}/_ext/E_/work/netbeans/hg/main_work/ide/launcher/windows/../../../o.n.bootstrap/launcher/windows/utilsfuncs.o \ + ${OBJECTDIR}/nblauncher.o + +# C Compiler Flags +CFLAGS= + +# CC Compiler Flags +CCFLAGS=-m32 -s -mno-cygwin +CXXFLAGS=-m32 -s -mno-cygwin + +# Fortran Compiler Flags +FFLAGS= + +# Assembler Flags +ASFLAGS= + +# Link Libraries and Options +LDLIBSOPTIONS=netbeans.res + +# Build Targets +.build-conf: ${BUILD_SUBPROJECTS} + ${MAKE} -f nbproject/Makefile-netbeans.exe.mk netbeans.exe.exe + +netbeans.exe.exe: ${OBJECTFILES} + ${LINK.cc} -mwindows -o netbeans.exe ${OBJECTFILES} ${LDLIBSOPTIONS} + +${OBJECTDIR}/netbeans.o: netbeans.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} $@.d + $(COMPILE.cc) -O2 -Wall -I/cygdrive/c/cygwin/usr/include/mingw -MMD -MP -MF $@.d -o ${OBJECTDIR}/netbeans.o netbeans.cpp + +${OBJECTDIR}/_ext/E_/work/netbeans/hg/main_work/ide/launcher/windows/../../../o.n.bootstrap/launcher/windows/utilsfuncs.o: ../../../o.n.bootstrap/launcher/windows/utilsfuncs.cpp + ${MKDIR} -p ${OBJECTDIR}/_ext/E_/work/netbeans/hg/main_work/ide/launcher/windows/../../../o.n.bootstrap/launcher/windows + ${RM} $@.d + $(COMPILE.cc) -O2 -Wall -I/cygdrive/c/cygwin/usr/include/mingw -MMD -MP -MF $@.d -o ${OBJECTDIR}/_ext/E_/work/netbeans/hg/main_work/ide/launcher/windows/../../../o.n.bootstrap/launcher/windows/utilsfuncs.o ../../../o.n.bootstrap/launcher/windows/utilsfuncs.cpp + +${OBJECTDIR}/nblauncher.o: nblauncher.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} $@.d + $(COMPILE.cc) -O2 -Wall -I/cygdrive/c/cygwin/usr/include/mingw -MMD -MP -MF $@.d -o ${OBJECTDIR}/nblauncher.o nblauncher.cpp + +# Subprojects +.build-subprojects: + +# Clean Targets +.clean-conf: + ${RM} -r build/netbeans.exe + ${RM} netbeans.exe.exe + +# Subprojects +.clean-subprojects: + +# Enable dependency checking +.dep.inc: .depcheck-impl + +include .dep.inc diff --git a/ide/launcher/windows/nbproject/Package-netbeans.exe.bash b/ide/launcher/windows/nbproject/Package-netbeans.exe.bash new file mode 100644 --- /dev/null +++ b/ide/launcher/windows/nbproject/Package-netbeans.exe.bash @@ -0,0 +1,72 @@ +#!/bin/bash -x + +# +# Generated - do not edit! +# + +# Macros +TOP=`pwd` +PLATFORM=Cygwin-Windows +TMPDIR=build/netbeans.exe/${PLATFORM}/tmp-packaging +TMPDIRNAME=tmp-packaging +OUTPUT_PATH=netbeans.exe +OUTPUT_BASENAME=netbeans.exe +PACKAGE_TOP_DIR=windows/ + +# Functions +function checkReturnCode +{ + rc=$? + if [ $rc != 0 ] + then + exit $rc + fi +} +function makeDirectory +# $1 directory path +# $2 permission (optional) +{ + mkdir -p "$1" + checkReturnCode + if [ "$2" != "" ] + then + chmod $2 "$1" + checkReturnCode + fi +} +function copyFileToTmpDir +# $1 from-file path +# $2 to-file path +# $3 permission +{ + cp "$1" "$2" + checkReturnCode + if [ "$3" != "" ] + then + chmod $3 "$2" + checkReturnCode + fi +} + +# Setup +cd "${TOP}" +mkdir -p dist/netbeans.exe/${PLATFORM}/package +rm -rf ${TMPDIR} +mkdir -p ${TMPDIR} + +# Copy files and create directories and links +cd "${TOP}" +makeDirectory ${TMPDIR}/windows/bin +copyFileToTmpDir "${OUTPUT_PATH}.exe" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}.exe" 0755 + + +# Generate tar file +cd "${TOP}" +rm -f dist/netbeans.exe/${PLATFORM}/package/windows.tar +cd ${TMPDIR} +tar -vcf ../../../../dist/netbeans.exe/${PLATFORM}/package/windows.tar * +checkReturnCode + +# Cleanup +cd "${TOP}" +rm -rf ${TMPDIR} diff --git a/ide/launcher/windows/nbproject/configurations.xml b/ide/launcher/windows/nbproject/configurations.xml --- a/ide/launcher/windows/nbproject/configurations.xml +++ b/ide/launcher/windows/nbproject/configurations.xml @@ -1,35 +1,69 @@ - + + + cmdargs.h + nblauncher.h + ../../../o.n.bootstrap/launcher/windows/utilsfuncs.h + + + + + nblauncher.cpp + netbeans.cpp + ../../../o.n.bootstrap/launcher/windows/utilsfuncs.cpp + - Makefile_windows.mk + Makefile - Makefile - netbeans.cpp - Makefile_windows.mk + Makefile - + - Cygwin - true - true - false + localhost + Cygwin|Cygwin 3 - - - . - make -f Makefile testinst - make -f Makefile clean - netbeans.exe - - - - - + + + 5 + 1 + + c:/cygwin/usr/include/mingw + + -s -mno-cygwin + 2 + + + netbeans.exe + + netbeans.res + + -mwindows + + + + 1 + + + 3 + + + 3 + + + 1 + + 3 diff --git a/ide/launcher/windows/nbproject/project.xml b/ide/launcher/windows/nbproject/project.xml --- a/ide/launcher/windows/nbproject/project.xml +++ b/ide/launcher/windows/nbproject/project.xml @@ -3,8 +3,12 @@ org.netbeans.modules.cnd.makeproject - windows + NB Launcher Win 0 + + cpp + h + UTF-8 diff --git a/ide/launcher/windows/netbeans.cpp b/ide/launcher/windows/netbeans.cpp --- a/ide/launcher/windows/netbeans.cpp +++ b/ide/launcher/windows/netbeans.cpp @@ -24,7 +24,7 @@ * Contributor(s): * * The Original Software is NetBeans. The Initial Developer of the Original - * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun * Microsystems, Inc. All Rights Reserved. * * If you wish your version of this file to be governed by only the CDDL @@ -37,577 +37,18 @@ * However, if you add GPL Version 2 code and therefore, elected the GPL * Version 2 license, then the option applies only if the new code is * made subject to such option by the copyright holder. + * + * Author: Tomas Holy */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -// #define DEBUG 1 +#include "nblauncher.h" -static char* getUserHomeFromRegistry(char* userhome); -static char* GetStringValue(HKEY key, const char *name); -static DWORD GetDWordValue(HKEY key, const char *name); -static void parseConfigFile(const char* path); -static void parseArgs(int argc, char *argv[]); -static int readClusterFile(const char* path); -static int dirExists(const char* path); -static void ErrorExit(LPTSTR lpszMessage, LPTSTR lpszFunction); -static void adjustHeapSize(); - -static char userdir[MAX_PATH] = "c:\\nbuser"; -static char options[4098] = ""; -static char dirs[4098] = "", extradirs[4098]; -static char jdkswitch[MAX_PATH] = ""; -static char platformDir[MAX_PATH] = ""; -static char* defaultDirs[512]; -static char msg[MAX_PATH + 128]; - -#ifdef WINMAIN - -static void parseCommandLine(char *argstr); - -int WINAPI - WinMain (HINSTANCE /* hSelf */, HINSTANCE /* hPrev */, LPSTR cmdline, int /* nShow */) { -#else - int main(int argc, char* argv[]) { - char cmdline[10240] = ""; - - for (int i = 1; i < argc; i++) { - char buf[10240]; - char *arg = argv[i]; - int len = strlen(arg); - if (arg[len-1] == '\"') - arg[len-1] = '\0'; - sprintf(buf, "\"%s\" ", arg); - strcat(cmdline, buf); - } -#endif - - char topdir[MAX_PATH]; - char *appname = NULL; - char buf[MAX_PATH * 10], *pc; - - GetModuleFileName(0, buf, sizeof buf); - - pc = strrchr(buf, '\\'); - if (pc != NULL) { // always holds - strlwr(pc + 1); - appname = strdup(pc + 1); - *pc = '\0'; // remove .exe filename +int main(int argc, char *argv[]) { + NbLauncher launcher; + DWORD retCode = 0; + if (!launcher.start(argc - 1, argv + 1, &retCode)) { + return -1; } - - pc = strrchr(buf, '\\'); - if (pc != NULL && 0 == stricmp("\\bin", pc)) - *pc = '\0'; - strcpy(topdir, buf); - - char clusterFileName[MAX_PATH]; - sprintf(clusterFileName, "%s\\etc\\netbeans.clusters", topdir); - - if (!readClusterFile(clusterFileName)) { - sprintf(msg, "Cannot read cluster file: %s", clusterFileName); - ErrorExit(msg, NULL); - } - - sprintf(buf, "%s\\etc\\netbeans.conf", topdir); - parseConfigFile(buf); - -#ifdef WINMAIN - parseCommandLine(cmdline); -#else - parseArgs(argc - 1, argv + 1); // skip progname -#endif - - char olduserdir[MAX_PATH]; - strcpy(olduserdir, userdir); - sprintf(buf, "%s\\etc\\netbeans.conf", userdir); - parseConfigFile(buf); - strcpy(userdir, olduserdir); - - adjustHeapSize(); - - char nbexec[MAX_PATH]; - char cmdline2[10240]; - - dirs[0] = '\0'; - for (char **pdir = defaultDirs; *pdir != NULL; pdir++) { - sprintf(buf, "%s\\%s", topdir, *pdir); - if (dirExists(buf)) { - if (dirs[0] != '\0') { - sprintf(buf, "%s;%s\\%s", dirs, topdir, *pdir); - } - strcpy(dirs, buf); - } - } - - if (extradirs[0] != '\0') { - strcat(strcat(dirs, ";"), extradirs); - } - - if (*platformDir == '\0') { - ErrorExit("Undefined platform cluster!", NULL); - } - - if (!dirExists(platformDir)) { - sprintf(nbexec, "%s\\%s", topdir, platformDir); - } else { - strcpy(nbexec,platformDir); - } - - if (!dirExists(nbexec)) { - sprintf(msg, "Could not find platform cluster:\n\n%s", nbexec); - ErrorExit(msg, NULL); - exit(1); - } - - strcat(nbexec, "\\lib\\nbexec.exe"); - - sprintf(cmdline2, "\"%s\" %s -J-Dnetbeans.importclass=org.netbeans.upgrade.AutoUpgrade -J-Dnetbeans.accept_license_class=org.netbeans.license.AcceptLicense --branding nb --clusters \"%s\" --userdir \"%s\" %s %s", - nbexec, - jdkswitch, - dirs, - userdir, - options, - cmdline); - - STARTUPINFO start; - PROCESS_INFORMATION pi; - - memset (&start, 0, sizeof (start)); - start.cb = sizeof (start); - -#ifdef WINMAIN - start.dwFlags = STARTF_USESHOWWINDOW; - start.wShowWindow = SW_HIDE; -#endif - -#ifdef DEBUG - printf("Cmdline: >%s<\ncwd >%s<\n", cmdline2, topdir); -#endif - if (!CreateProcess (NULL, cmdline2, - NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, - NULL, - NULL, // lpCurrentDirectory - &start, - &pi)) { - sprintf (buf, "Cannot start %s", appname); - ErrorExit(buf, "CreateProcess"); - return 255; - } else { - // Wait until child process exits. - WaitForSingleObject( pi.hProcess, INFINITE ); - - DWORD retCode = 0; - GetExitCodeProcess(pi.hProcess, &retCode); - // Close process and thread handles. - CloseHandle( pi.hProcess ); - CloseHandle( pi.hThread ); - return retCode; - } + return retCode; } - -char* getUserHomeFromRegistry(char* userhome) -{ - HKEY key; - - if (RegOpenKeyEx( - HKEY_CURRENT_USER, - "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", - 0, - KEY_READ, - &key) != 0) - return NULL; - - char *path = GetStringValue(key, "Desktop"); - RegCloseKey(key); - - char *pc = strrchr(path, '\\'); - if (pc == NULL) { - return NULL; - } - *pc = '\0'; - strcpy(userhome, path); - return userhome; -} - - -char * GetStringValue(HKEY key, const char *name) -{ - DWORD type, size; - char *value = 0; - - if (RegQueryValueEx(key, name, 0, &type, 0, &size) == 0 && type == REG_SZ) { - value = (char*) malloc(size); - if (RegQueryValueEx(key, name, 0, 0, (unsigned char*)value, &size) != 0) { - free(value); - value = 0; - } - } - return value; -} - - -DWORD GetDWordValue(HKEY key, const char *name) -{ - DWORD type, size; - DWORD value = 0; - - if (RegQueryValueEx(key, name, 0, &type, 0, &size) == 0 && type == REG_DWORD) { - if (RegQueryValueEx(key, name, 0, 0, (LPBYTE)&value, &size) != 0) { - return 0; - } - } - return value; -} - - -void parseConfigFile(const char* path) { - FILE* fin = fopen(path, "r"); - if (fin == NULL) - return; - - char line[2048], *pc; - - while (NULL != fgets(line, sizeof line, fin)) { - for (pc = line; *pc != '\0' && (*pc == ' ' || *pc == '\t' || *pc == '\n' || *pc == '\r'); pc++) - ; - if (*pc == '#') - continue; - if (strstr(pc, "netbeans_default_userdir=") == pc) { - char *q = strstr(pc, "=") + 1; - pc = line + strlen(line) - 1; - while (*pc == '\n' || *pc == '\r' || *pc == '\t' || *pc == ' ') - pc--; - - if (*q == '"' && *pc == '"') { - q++; - pc--; - } - - *(pc+1) = '\0'; - if (strstr(q, "${HOME}") == q) { - char userhome[MAX_PATH]; - char *userprofile = getenv("USERPROFILE"); - - if (userprofile == NULL) { - userprofile = getUserHomeFromRegistry(userhome); - } - if (userprofile != NULL) { - strcpy(userdir, userprofile); - } - // else { - // ... keep the default userdir value 'c:\nbuser' - // } - strcat(userdir, q + strlen("${HOME}")); - } else { - strcpy(userdir, q); - } - } else if (strstr(pc, "netbeans_default_options=") == pc) { - char *q = strstr(pc, "=") + 1; - pc = line + strlen(line) - 1; - while (*pc == '\n' || *pc == '\r' || *pc == '\t' || *pc == ' ') - pc--; - - if (*q == '"' && *pc == '"') { - q++; - pc--; - } - - *(pc+1) = '\0'; - strcpy(options, q); - } else if (strstr(pc, "netbeans_extraclusters=") == pc) { - char *q = strstr(pc, "=") + 1; - pc = line + strlen(line) - 1; - while (*pc == '\n' || *pc == '\r' || *pc == '\t' || *pc == ' ') - pc--; - - if (*q == '"' && *pc == '"') { - q++; - pc--; - } - - *(pc+1) = '\0'; - strcpy(extradirs, q); - } else if (strstr(pc, "netbeans_jdkhome=") == pc) { - char *q = strstr(pc, "=") + 1; - pc = line + strlen(line) - 1; - while (*pc == '\n' || *pc == '\r' || *pc == '\t' || *pc == ' ') - pc--; - - if (*q == '"' && *pc == '"') { - q++; - pc--; - } - - *(pc+1) = '\0'; - sprintf(jdkswitch, "--jdkhome \"%s\"", q); - } - } - fclose(fin); -} - -#ifdef WINMAIN - -void parseCommandLine(char *argstr) { - char **argv = (char**) malloc(2048 * sizeof (char*)); - int argc = 0; - -#define START 0 -#define NORMAL 1 -#define IN_QUOTES 2 -#define IN_APOS 3 - - char *p, *q; - int state = NORMAL; - char token[1024 * 64]; - int eof; - - q = argstr; - p = token; - state = START; - eof = 0; - - while (!eof) { - if (*q == '\0') - eof = 1; - - switch (state) { - case START: - if (*q == ' ' || *q == '\r' || *q == '\n' || *q == '\t') { - q++; - continue; - } - - p = token; - *p = '\0'; - - if (*q == '"') { - state = IN_QUOTES; - q++; - continue; - } - if (*q == '\'') { - state = IN_APOS; - q++; - continue; - } - - state = NORMAL; - continue; - - case NORMAL: - if (*q == ' ' || *q == '\r' || *q == '\n' || *q == '\t' || *q == '\0') { - *p = '\0'; - argv[argc] = strdup(token); - argc++; - state = START; - } else { - *p++ = *q++; - } - break; - - case IN_QUOTES: - if (*q == '"') { - if (*(q+1) == '"') { - *p++ = '"'; - q += 2; - } else { - *p = '\0'; - - argv[argc] = strdup(token); - argc++; - - q++; - state = START; - } - } else if (*q == '\0') { - *p = '\0'; - argv[argc] = strdup(token); - argc++; - state = START; - } else { - *p++ = *q++; - } - break; - - case IN_APOS: - if (*q == '\'') { - if (*(q+1) == '\'') { - *p++ = '\''; - q += 2; - } else { - *p = '\0'; - - argv[argc] = strdup(token); - argc++; - - q++; - state = START; - } - } else if (*q == '\0') { - *p = '\0'; - argv[argc] = strdup(token); - argc++; - state = START; - } else { - *p++ = *q++; - } - break; - } - } - - parseArgs(argc, argv); - -} -#endif // WINMAIN - -void parseArgs(int argc, char *argv[]) { - char *arg; - - while (argc > 0 && (arg = *argv) != 0) { - argv++; - argc--; - - if (0 == strcmp("--userdir", arg)) { - if (argc > 0) { - arg = *argv; - argv++; - argc--; - if (arg != 0) { - strcpy(userdir, arg); - } - } - } - } -} - -int readClusterFile(const char* path) { - - char **dirs = defaultDirs; - - FILE* fin = fopen(path, "r"); - if (fin == NULL) - return 0; - - char line[2048], *pc; - - while (NULL != fgets(line, sizeof line, fin)) { - for (pc = line; *pc != '\0' && (*pc == ' ' || *pc == '\t' || *pc == '\n' || *pc == '\r'); pc++) - ; - if (*pc == '#') - continue; - - char *s = pc; - - while (*pc != '\0' && *pc != '\t' && *pc != '\n' && *pc != '\r') - pc++; - - *pc = '\0'; - - if (*platformDir == '\0') { // no platform found yet - char *platformStr = strrchr(s,'\\'); - if (platformStr == NULL) { - platformStr = s; - } else { // move over backslash - platformStr++; - } - - if (!strncmp("platform", platformStr, 8)) { // strlen("platform") == 8 - strcpy(platformDir, s); - } - } - else { - *dirs = strdup(s); - dirs++; - } - } - *dirs = NULL; - fclose(fin); - - return 1; -} - -int dirExists(const char* path) { - WIN32_FIND_DATA ffd; - HANDLE ffh; - - memset(&ffd, 0, sizeof ffd); - ffd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; - ffh = FindFirstFile(path, &ffd); - if (ffh != INVALID_HANDLE_VALUE) { - FindClose(ffh); - return 1; - } else { - return 0; - } -} - -// Show error dialog and exits the program -// lpszMessage - error message to be printed -// lpszFunction - name of last called method that return fail status -// can be NULL -void ErrorExit(LPTSTR lpszMessage, LPTSTR lpszFunction) -{ - LPVOID lpMsgBuf; - LPVOID lpDisplayBuf; - DWORD dw = GetLastError(); - - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - dw, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &lpMsgBuf, - 0, NULL ); - - if (lpszFunction != NULL ) { - lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, - (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); - wsprintf((LPTSTR)lpDisplayBuf, - TEXT("%s\n%s failed with error %d: %s"), - lpszMessage, lpszFunction, dw, lpMsgBuf); - } - else { - lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, - lstrlen((LPCTSTR)lpMsgBuf)); - wsprintf((LPTSTR)lpDisplayBuf, - TEXT("%s"), - lpszMessage); - } - - MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_ICONSTOP | MB_OK); - - LocalFree(lpMsgBuf); - LocalFree(lpDisplayBuf); - ExitProcess( (dw != 0)? dw: 1); -} - -// Seaches if -Xmx is specified in existing arguments -// If it isn't it adds it - 20% of available RAM but min is 96M and max 512M -void adjustHeapSize() { - - MEMORYSTATUS ms; - char buf[20]; - - if (strstr(options, "-J-Xmx") == NULL) { - // find how much memory we have and add -Xmx - GlobalMemoryStatus(&ms); - DWORDLONG memory = (ms.dwTotalPhys / 1024 / 1024) / 5; - if (memory < 96) { - memory = 96; - } - else if (memory > 512) { - memory = 512; - } - sprintf(buf, " -J-Xmx%ldm", memory); - strcat(options, buf); - } -} diff --git a/ide/launcher/windows/netbeans.exe b/ide/launcher/windows/netbeans.exe index 80f912945d62b7775f86199ad94f75e7c9a81ecb..fa2105839bc08a39e359d976eae24d478647131d GIT binary patch literal 396800 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 Yy~n&idwBd!zDs+LuZiyKnw4Y!A0G=DGXMYp diff --git a/nbbuild/build.xml b/nbbuild/build.xml --- a/nbbuild/build.xml +++ b/nbbuild/build.xml @@ -589,7 +589,6 @@ - @@ -1217,7 +1216,7 @@ - + @@ -1300,7 +1299,7 @@ - + diff --git a/o.n.bootstrap/launcher/windows/.dep.inc b/o.n.bootstrap/launcher/windows/.dep.inc new file mode 100644 --- /dev/null +++ b/o.n.bootstrap/launcher/windows/.dep.inc @@ -0,0 +1,5 @@ +# This code depends on make tool being used +DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES})) +ifneq (${DEPFILES},) +include ${DEPFILES} +endif diff --git a/o.n.bootstrap/launcher/windows/Makefile b/o.n.bootstrap/launcher/windows/Makefile --- a/o.n.bootstrap/launcher/windows/Makefile +++ b/o.n.bootstrap/launcher/windows/Makefile @@ -1,69 +1,93 @@ -# -*- Makefile -*- # -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. +# There exist several targets which are by default empty and which can be +# used for execution of your targets. These targets are usually executed +# before and after some main targets. They are: # -# Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved. +# .build-pre: called before 'build' target +# .build-post: called after 'build' target +# .clean-pre: called before 'clean' target +# .clean-post: called after 'clean' target +# .clobber-pre: called before 'clobber' target +# .clobber-post: called after 'clobber' target +# .all-pre: called before 'all' target +# .all-post: called after 'all' target +# .help-pre: called before 'help' target +# .help-post: called after 'help' target # -# The contents of this file are subject to the terms of either the GNU -# General Public License Version 2 only ("GPL") or the Common -# Development and Distribution License("CDDL") (collectively, the -# "License"). You may not use this file except in compliance with the -# License. You can obtain a copy of the License at -# http://www.netbeans.org/cddl-gplv2.html -# or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the -# specific language governing permissions and limitations under the -# License. When distributing the software, include this License Header -# Notice in each file and include the License file at -# nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this -# particular file as subject to the "Classpath" exception as provided -# by Sun in the GPL Version 2 section of the License file that -# accompanied this code. If applicable, add the following below the -# License Header, with the fields enclosed by brackets [] replaced by -# your own identifying information: -# "Portions Copyrighted [year] [name of copyright owner]" +# Targets beginning with '.' are not intended to be called on their own. # -# Contributor(s): +# Main targets can be executed directly, and they are: +# +# build build a specific configuration +# clean remove built files from a configuration +# clobber remove all built files +# all build all configurations +# help print help mesage +# +# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and +# .help-impl are implemented in nbproject/makefile-impl.mk. # -# The Original Software is Forte for Java, Community Edition. The Initial -# Developer of the Original Software is Sun Microsystems, Inc. Portions -# Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. -# -# If you wish your version of this file to be governed by only the CDDL -# or only the GPL Version 2, indicate your decision by adding -# "[Contributor] elects to include this software in this distribution -# under the [CDDL or GPL Version 2] license." If you do not indicate a -# single choice of license, a recipient has the option to distribute -# your version of this file under either the CDDL, the GPL Version 2 or -# to extend the choice of license to its licensees as provided above. -# However, if you add GPL Version 2 code and therefore, elected the GPL -# Version 2 license, then the option applies only if the new code is -# made subject to such option by the copyright holder. -# +# NOCDDL -LIBS = -#LIBS = advapi32.lib user32.lib -CFLAGS = -s -mno-cygwin -#!ifdef DEBUG -# CFLAGS = $(CFLAGS) -Zi -#!endif +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib -all : nbexec.exe +# build +build: .build-post -nbexec.exe : nbexec.cpp - g++ $(CFLAGS) $(LIBS) nbexec.cpp -o nbexec.exe +.build-pre: +# Add your pre 'build' code here... -clean : - -rm *.res *.obj *.pdb *.ilk *~ 2>NUL +.build-post: .build-impl +# Add your post 'build' code here... + cp nbexec.exe ../../../nbbuild/netbeans/platform9/lib/ + cp nbexec.dll ../../../nbbuild/netbeans/platform9/lib/ -distclean : clean - -rm *.exe 2>NUL +# clean +clean: .clean-post -testinst : all - cp *.exe ../../../nbbuild/netbeans/platform9/lib/ +.clean-pre: +# Add your pre 'clean' code here... + -rm -r build/* -test : testinst - ../../../nbbuild/netbeans/platform9/lib/nbexec.exe +.clean-post: .clean-impl +# Add your post 'clean' code here... -test2 : testinst - ../../../nbbuild/netbeans/platform9/lib/nbexec.exe + +# clobber +clobber: .clobber-post + +.clobber-pre: +# Add your pre 'clobber' code here... + +.clobber-post: .clobber-impl +# Add your post 'clobber' code here... + + +# all +all: .all-post + +.all-pre: +# Add your pre 'all' code here... + +.all-post: .all-impl +# Add your post 'all' code here... + + +# help +help: .help-post + +.help-pre: +# Add your pre 'help' code here... + +.help-post: .help-impl +# Add your post 'help' code here... + + + +# include project implementation makefile +include nbproject/Makefile-impl.mk diff --git a/o.n.bootstrap/launcher/windows/Makefile_windows.mk b/o.n.bootstrap/launcher/windows/Makefile_windows.mk deleted file mode 100644 --- a/o.n.bootstrap/launcher/windows/Makefile_windows.mk +++ /dev/null @@ -1,92 +0,0 @@ -# -# There exist several targets which are by default empty and which can be -# used for execution of your targets. These targets are usually executed -# before and after some main targets. They are: -# -# .build-pre: called before 'build' target -# .build-post: called after 'build' target -# .clean-pre: called before 'clean' target -# .clean-post: called after 'clean' target -# .clobber-pre: called before 'clobber' target -# .clobber-post: called after 'clobber' target -# .all-pre: called before 'all' target -# .all-post: called after 'all' target -# .help-pre: called before 'help' target -# .help-post: called after 'help' target -# -# Targets beginning with '.' are not intended to be called on their own. -# -# Main targets can be executed directly, and they are: -# -# build build a specific configuration -# clean remove built files from a configuration -# clobber remove all built files -# all build all configurations -# help print help mesage -# -# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and -# .help-impl are implemented in nbproject/makefile-impl.mk. -# -# NOCDDL - - -# Environment -MKDIR=mkdir -CP=cp -CCADMIN=CCadmin -RANLIB=ranlib - - -# build -build: .build-pre .build-impl .build-post - -.build-pre: -# Add your pre 'build' code here... - -.build-post: -# Add your post 'build' code here... - - -# clean -clean: .clean-pre .clean-impl .clean-post - -.clean-pre: -# Add your pre 'clean' code here... - -.clean-post: -# Add your post 'clean' code here... - - -# clobber -clobber: .clobber-pre .clobber-impl .clobber-post - -.clobber-pre: -# Add your pre 'clobber' code here... - -.clobber-post: -# Add your post 'clobber' code here... - - -# all -all: .all-pre .all-impl .all-post - -.all-pre: -# Add your pre 'all' code here... - -.all-post: -# Add your post 'all' code here... - - -# help -help: .help-pre .help-impl .help-post - -.help-pre: -# Add your pre 'help' code here... - -.help-post: -# Add your post 'help' code here... - - - -# include project implementation makefile -include nbproject/Makefile-impl.mk diff --git a/o.n.bootstrap/launcher/windows/argnames.h b/o.n.bootstrap/launcher/windows/argnames.h new file mode 100644 --- /dev/null +++ b/o.n.bootstrap/launcher/windows/argnames.h @@ -0,0 +1,23 @@ +/* + * File: argnames.h + * Author: Holy + * + * Created on 4. prosinec 2008, 14:13 + */ + +#ifndef _ARGNAMES_H +#define _ARGNAMES_H + +#define ARG_NAME_SEPAR_PROC "--sproc" +#define ARG_NAME_CONSOLE "--console" +#define ARG_NAME_LAUNCHER_LOG "--trace" +#define ARG_NAME_USER_DIR "--userdir" +#define ARG_NAME_CLUSTERS "--clusters" +#define ARG_NAME_BOOTCLASS "--bootclass" +#define ARG_NAME_JDKHOME "--jdkhome" +#define ARG_NAME_CP_PREPEND "--cp:p" +#define ARG_NAME_CP_APPEND "--cp:a" + + +#endif /* _ARGNAMES_H */ + diff --git a/o.n.bootstrap/launcher/windows/jvmlauncher.cpp b/o.n.bootstrap/launcher/windows/jvmlauncher.cpp new file mode 100644 --- /dev/null +++ b/o.n.bootstrap/launcher/windows/jvmlauncher.cpp @@ -0,0 +1,394 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 1997-2008 Sun Microsystems, Inc. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun + * Microsystems, Inc. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Author: Tomas Holy + */ + +#include "jvmlauncher.h" +#include + +using namespace std; + +const char *JvmLauncher::JDK_KEY = "Software\\JavaSoft\\Java Development Kit"; +const char *JvmLauncher::JRE_KEY = "Software\\JavaSoft\\Java Runtime Environment"; +const char *JvmLauncher::CUR_VERSION_NAME = "CurrentVersion"; +const char *JvmLauncher::JAVA_HOME_NAME = "JavaHome"; +const char *JvmLauncher::JAVA_BIN_DIR = "\\bin"; +const char *JvmLauncher::JAVA_EXE_FILE = "\\bin\\java.exe"; +const char *JvmLauncher::JAVA_CLIENT_DLL_FILE = "\\bin\\client\\jvm.dll"; +const char *JvmLauncher::JAVA_SERVER_DLL_FILE = "\\bin\\server\\jvm.dll"; +const char *JvmLauncher::JAVA_JRE_PREFIX = "\\jre"; +const char *JvmLauncher::JNI_CREATEVM_FUNC = "JNI_CreateJavaVM"; + + +JvmLauncher::JvmLauncher() { +} + +JvmLauncher::JvmLauncher(const JvmLauncher& orig) { +} + +JvmLauncher::~JvmLauncher() { +} + +bool JvmLauncher::checkJava(const char *path, const char *prefix) { + assert(path); + assert(prefix); + logMsg("checkJava(%s)", path); + javaPath = path; + if (*javaPath.rbegin() == '\\') { + javaPath.erase(javaPath.length() - 1, 1); + } + javaExePath = javaPath + prefix + JAVA_EXE_FILE; + javaClientDllPath = javaPath + prefix + JAVA_CLIENT_DLL_FILE; + javaServerDllPath = javaPath + prefix + JAVA_SERVER_DLL_FILE; + if (!fileExists(javaClientDllPath.c_str())) { + javaClientDllPath = ""; + } + if (!fileExists(javaServerDllPath.c_str())) { + javaServerDllPath = ""; + } + javaBinPath = javaPath + prefix + JAVA_BIN_DIR; + if (fileExists(javaExePath.c_str()) && (!javaClientDllPath.empty() || !javaServerDllPath.empty())) { + return true; + } + + javaPath.clear(); + javaBinPath.clear(); + javaExePath.clear(); + javaClientDllPath.clear(); + javaServerDllPath.clear(); + return false; +} + +bool JvmLauncher::initialize(const char *javaPathOrMinVersion) { + logMsg("JvmLauncher::initialize()\n\tjavaPathOrMinVersion: %s", javaPathOrMinVersion); + assert(javaPathOrMinVersion); + if (isVersionString(javaPathOrMinVersion)) { + return findJava(javaPathOrMinVersion); + } else { + return (checkJava(javaPathOrMinVersion, JAVA_JRE_PREFIX) || checkJava(javaPathOrMinVersion, "")); + } +} + +bool JvmLauncher::getJavaPath(string &path) { + logMsg("JvmLauncher::getJavaPath()"); + path = javaPath; + return !javaPath.empty(); +} + +bool JvmLauncher::start(const char *mainClassName, list args, list options, bool separateProcess, DWORD *retCode) { + assert(mainClassName); + logMsg("JvmLauncher::start()\n\tmainClassName: %s\n\tseparateProcess: %s", + mainClassName, separateProcess ? "true" : "false"); + logMsg(" args:"); + for (list::iterator it = args.begin(); it != args.end(); ++it) { + logMsg("\t%s", it->c_str()); + } + logMsg(" options:"); + for (list::iterator it = options.begin(); it != options.end(); ++it) { + logMsg("\t%s", it->c_str()); + } + + if (javaExePath.empty() || (javaClientDllPath.empty() && javaServerDllPath.empty())) { + if (!initialize("")) { + return false; + } + } + + if (!separateProcess) { + // both client/server found, check option which should be used + if (!javaClientDllPath.empty() && !javaServerDllPath.empty()) { + javaDllPath = findClientOption(options) ? javaClientDllPath : javaServerDllPath; + } else { + javaDllPath = javaClientDllPath.empty() ? javaServerDllPath : javaClientDllPath; + } + logMsg("Java DLL path: %s", javaDllPath.c_str()); + if (!canLoadJavaDll()) { + logMsg("Fallbacking to running java in separate process, dll cannot be loaded (64bit dll?)."); + separateProcess = true; + } + } + + return separateProcess ? startOutProcJvm(mainClassName, args, options, retCode) + : startInProcJvm(mainClassName, args, options); +} + +bool JvmLauncher::findClientOption(list &options) { + for (list::iterator it = options.begin(); it != options.end(); ++it) { + if (*it == "-client") { + return false; + } + } + return true; +} + +bool JvmLauncher::canLoadJavaDll() { + // be prepared for stupid placement of msvcr71.dll in java installation + // (in java 1.6/1.7 jvm.dll is dynamically linked to msvcr71.dll which si placed + // in bin directory) + PrepareDllPath prepare(javaBinPath.c_str()); + HMODULE hDll = LoadLibrary(javaDllPath.c_str()); + if (hDll) { + FreeLibrary(hDll); + return true; + } + logErr(true, false, "Cannot load %s.", javaDllPath.c_str()); + return false; +} + +bool JvmLauncher::isVersionString(const char *str) { + char *end = 0; + strtod(str, &end); + return *end == '\0'; +} + +bool JvmLauncher::startInProcJvm(const char *mainClassName, std::list args, std::list options) { + + class Jvm { + public: + + Jvm(JvmLauncher *jvmLauncher) + : hDll(0) + , jvm(0) + , env(0) + , jvmOptions(0) + , jvmLauncher(jvmLauncher) + { + } + + ~Jvm() { + if (env && env->ExceptionOccurred()) { + env->ExceptionDescribe(); + } + + if (jvm) { + logMsg("Destroying JVM"); + jvm->DestroyJavaVM(); + } + + if (jvmOptions) { + delete[] jvmOptions; + } + + if (hDll) { + FreeLibrary(hDll); + } + } + + bool init(list options) { + logMsg("JvmLauncher::Jvm::init()"); + logMsg("LoadLibrary(\"%s\")", jvmLauncher->javaDllPath.c_str()); + PrepareDllPath prepare(jvmLauncher->javaBinPath.c_str()); + hDll = LoadLibrary(jvmLauncher->javaDllPath.c_str()); + if (!hDll) { + logErr(true, true, "Cannot load %s.", jvmLauncher->javaDllPath.c_str()); + return false; + } + + CreateJavaVM createJavaVM = (CreateJavaVM) GetProcAddress(hDll, JNI_CREATEVM_FUNC); + if (!createJavaVM) { + logErr(true, true, "GetProcAddress for %s failed.", JNI_CREATEVM_FUNC); + return false; + } + + logMsg("JVM options:"); + jvmOptions = new JavaVMOption[options.size()]; + int i = 0; + for (list::iterator it = options.begin(); it != options.end(); ++it, ++i) { + string &option = *it; + logMsg("\t%s", option.c_str()); + jvmOptions[i].optionString = (char *) option.c_str(); + jvmOptions[i].extraInfo = 0; + } + + JavaVMInitArgs jvmArgs; + jvmArgs.options = jvmOptions; + jvmArgs.nOptions = options.size(); + jvmArgs.version = JNI_VERSION_1_4; + jvmArgs.ignoreUnrecognized = JNI_TRUE; + + logMsg("Creating JVM..."); + if (createJavaVM(&jvm, &env, &jvmArgs) < 0) { + logErr(false, true, "JVM creation failed"); + return false; + } + logMsg("JVM created."); + return true; + } + typedef jint (CALLBACK *CreateJavaVM)(JavaVM **jvm, JNIEnv **env, void *args); + + HMODULE hDll; + JavaVM *jvm; + JNIEnv *env; + JavaVMOption *jvmOptions; + JvmLauncher *jvmLauncher; + }; + + Jvm jvm(this); + if (!jvm.init(options)) { + return false; + } + + jclass mainClass = jvm.env->FindClass(mainClassName); + if (!mainClass) { + logErr(false, true, "Cannot find class %s.", mainClassName); + return false; + } + + jmethodID mainMethod = jvm.env->GetStaticMethodID(mainClass, "main", "([Ljava/lang/String;)V"); + if (!mainMethod) { + logErr(false, true, "Cannot get main method."); + return false; + } + + jclass jclassString = jvm.env->FindClass("java/lang/String"); + if (!jclassString) { + logErr(false, true, "Cannot find java/lang/String class"); + return false; + } + + jstring jstringArg = jvm.env->NewStringUTF(""); + if (!jstringArg) { + logErr(false, true, "NewStringUTF() failed"); + return false; + } + + jobjectArray mainArgs = jvm.env->NewObjectArray(args.size(), jclassString, jstringArg); + if (!mainArgs) { + logErr(false, true, "NewObjectArray() failed"); + return false; + } + int i = 0; + for (list::iterator it = args.begin(); it != args.end(); ++it, ++i) { + string &arg = *it; + jstring jstringArg = jvm.env->NewStringUTF(arg.c_str()); + if (!jstringArg) { + logErr(false, true, "NewStringUTF() failed"); + return false; + } + jvm.env->SetObjectArrayElement(mainArgs, i, jstringArg); + } + + jvm.env->CallStaticVoidMethod(mainClass, mainMethod, mainArgs); + return true; +} + + +bool JvmLauncher::startOutProcJvm(const char *mainClassName, std::list args, std::list options, DWORD *retCode) { + STARTUPINFO si = {0}; + si.cb = sizeof(STARTUPINFO); + PROCESS_INFORMATION pi = {0}; + string cmdLine = '\"' + javaExePath + '\"'; + cmdLine.reserve(32*1024); + for (list::iterator it = options.begin(); it != options.end(); ++it) { + cmdLine += " \""; + cmdLine += *it; + cmdLine += "\""; + } + + // mainClass and args + cmdLine += ' '; + cmdLine += mainClassName; + for (list::iterator it = args.begin(); it != args.end(); ++it) { + if (javaClientDllPath.empty() && *it == "-client") { + logMsg("Removing -client option, client java dll not found."); + // remove client parameter, no client java found + continue; + } + cmdLine += " \""; + cmdLine += *it; + cmdLine += "\""; + } + + logMsg("Command line:\n%s", cmdLine.c_str()); + if (cmdLine.size() >= 32*1024) { + logErr(false, true, "Command line is too long. Length: %u. Maximum length: %u.", cmdLine.c_str(), 32*1024); + return false; + } + + char cmdLineStr[32*1024] = ""; + strcpy(cmdLineStr, cmdLine.c_str()); + if (!CreateProcess(NULL, cmdLineStr, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi)) { + logErr(true, true, "Failed to create process"); + return false; + } + + disableFolderVirtualization(pi.hProcess); + ResumeThread(pi.hThread); + WaitForSingleObject(pi.hProcess, INFINITE); + if (retCode) { + GetExitCodeProcess(pi.hProcess, retCode); + } + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + return true; +} + +bool JvmLauncher::findJava(const char *minJavaVersion) { + if (findJava(JDK_KEY, JAVA_JRE_PREFIX, minJavaVersion)) { + return true; + } + if (findJava(JRE_KEY, "", minJavaVersion)) { + return true; + } + javaPath = ""; + javaExePath = ""; + javaClientDllPath = ""; + javaServerDllPath = ""; + javaBinPath = ""; + return false; +} + +bool JvmLauncher::findJava(const char *javaKey, const char *prefix, const char *minJavaVersion) { + logMsg("JvmLauncher::findJava()\n\tjavaKey: %s\n\tprefix: %s\n\tminJavaVersion: %s", javaKey, prefix, minJavaVersion); + string value; + if (getStringFromRegistry(HKEY_LOCAL_MACHINE, javaKey, CUR_VERSION_NAME, value)) { + if (value > minJavaVersion) { + string path; + if (getStringFromRegistry(HKEY_LOCAL_MACHINE, (string(javaKey) + "\\" + value).c_str(), JAVA_HOME_NAME, path)) { + if (*path.rbegin() == '\\') { + path.erase(path.length() - 1, 1); + } + return checkJava(path.c_str(), prefix); + } + } + } + return false; +} diff --git a/o.n.bootstrap/launcher/windows/jvmlauncher.h b/o.n.bootstrap/launcher/windows/jvmlauncher.h new file mode 100644 --- /dev/null +++ b/o.n.bootstrap/launcher/windows/jvmlauncher.h @@ -0,0 +1,134 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 1997-2008 Sun Microsystems, Inc. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun + * Microsystems, Inc. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Author: Tomas Holy + */ + +#ifndef _JVMLAUNCHER_H +#define _JVMLAUNCHER_H + +#include +#include +#include +#include "jni.h" +#include "utilsfuncs.h" + +class JvmLauncher { + static const int MAX_ARGS_LEN = 32*1024; + + static const char *JDK_KEY; + static const char *JRE_KEY; + static const char *CUR_VERSION_NAME; + static const char *JAVA_HOME_NAME; + static const char *JAVA_BIN_DIR; + static const char *JAVA_EXE_FILE; + static const char *JAVA_CLIENT_DLL_FILE; + static const char *JAVA_SERVER_DLL_FILE; + static const char *JAVA_JRE_PREFIX; + static const char *JNI_CREATEVM_FUNC; + +public: + JvmLauncher(); + virtual ~JvmLauncher(); + + bool initialize(const char *javaPathOrMinVersion); + bool getJavaPath(std::string &path); + bool start(const char *mainClassName, std::list args, std::list options, bool separateProcess, DWORD *retCode); + +private: + JvmLauncher(const JvmLauncher& orig); + + bool checkJava(const char *javaPath, const char *prefix); + bool findJava(const char *minJavaVersion); + bool findJava(const char *javaKey, const char *prefix, const char *minJavaVersion); + bool startOutProcJvm(const char *mainClassName, std::list args, std::list options, DWORD *retCode); + bool startInProcJvm(const char *mainClassName, std::list args, std::list options); + bool isVersionString(const char *str); + bool canLoadJavaDll(); + bool findClientOption(std::list &options); + +private: + std::string javaExePath; + std::string javaDllPath; + std::string javaClientDllPath; + std::string javaServerDllPath; + std::string javaPath; + std::string javaBinPath; + + class PrepareDllPath { + public: + PrepareDllPath(const char *dllDirectory) + : setDllDirectory(0) { + logMsg("PrepareDllPath: %s", dllDirectory); + oldCurDir[0] = '\0'; + + // SetDllDirectory is present since XP SP1, so we have to load it dynamically + HINSTANCE hKernel32 = GetModuleHandle("kernel32"); + if (!hKernel32) { + logErr(true, false, "Cannot load kernel32."); + return; + } + + LPFNSDD setDllDirectory = (LPFNSDD)GetProcAddress(hKernel32, "SetDllDirectoryA"); + if (setDllDirectory) { + setDllDirectory(dllDirectory); + } else { + logErr(true, false, "Cannot find SetDllDirectoryA"); + } + GetCurrentDirectory(MAX_PATH, oldCurDir); + SetCurrentDirectory(dllDirectory); + } + ~PrepareDllPath() { + if (setDllDirectory) { + setDllDirectory(NULL); + } + if (oldCurDir[0]) { + SetCurrentDirectory(oldCurDir); + } + } + private: + typedef BOOL (WINAPI *LPFNSDD)(LPCTSTR lpPathname); + LPFNSDD setDllDirectory; + char oldCurDir[MAX_PATH]; + }; +}; + +#endif /* _JVMLAUNCHER_H */ + diff --git a/o.n.bootstrap/launcher/windows/nbexec.cpp b/o.n.bootstrap/launcher/windows/nbexec.cpp --- a/o.n.bootstrap/launcher/windows/nbexec.cpp +++ b/o.n.bootstrap/launcher/windows/nbexec.cpp @@ -1,3 +1,4 @@ + /* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * @@ -39,1107 +40,29 @@ * made subject to such option by the copyright holder. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "platformlauncher.h" +#include "utilsfuncs.h" -using namespace std; - -#define PROG_FULLNAME "Error" -#define IDE_MAIN_CLASS "org/netbeans/Main" -#define UPDATER_MAIN_CLASS "org/netbeans/updater/UpdaterFrame" - -#define JDK_KEY "Software\\JavaSoft\\Java Development Kit" -#define JRE_KEY "Software\\JavaSoft\\Java Runtime Environment" - -#define RUN_NORMAL "-run_normal" -#define RUN_UPDATER "-run_updater" - -#define BAD_OPTION_MSG "Wrong option." - -// #define DEBUG 1 - -static char jdkhome[MAX_PATH]; -static char plathome[MAX_PATH]; -static char userdir[MAX_PATH]; - -static char clusters[MAX_PATH * 20]; - -static char *bootclass = NULL; - -static int runnormal = 0; -static int runupdater = 0; - -static char classpath[1024 * 16]; -static char classpathBefore[1024 * 16]; -static char classpathAfter[1024 * 16]; - -static char **options; -static int numOptions, maxOptions; - -static char *progArgv[1024]; -static int progArgc = 0; - -static void runClass(char *mainclass, bool deleteAUClustersFile, DWORD *retCode); - -static void fatal(const char *str); -static char *findJavaExeInDirectory(char *dir); -static int findJdkFromRegistry(const char* keyname, char jdkhome[]); - -static void addJdkJarsToClassPath(const char *jdkhome); -static void addLauncherJarsToClassPath(); - -static void addToClassPath(const char *pathprefix, const char *path); -static void addToClassPathIfExists(const char *pathprefix, const char *path); -static void addAllFilesToClassPath(const char *dir, const char *subdir, const char *pattern); - -static void parseArgs(int argc, char *argv[]); -static void addOption(char *str); - -static int fileExists(const char* path); - -static void normalizePath(char *userdir); -static bool runAutoUpdater(bool firstStart, const char * root); -static bool runAutoUpdaterOnClusters(bool firstStart); - -static int findProxiesFromRegistry(char **proxy, char **nonProxy, char **socksProxy); -static int findHttpProxyFromEnv(char **proxy, char **nonProxy); - -static char* processAUClustersList(char *userdir); -static int removeAUClustersListFile(char *userdir); - -int checkForNewUpdater(const char *basePath); -int createProcessNoVirt(const char *exePath, char *argv[], DWORD *retCode = 0); -double getPreciseTime(); -int createPath(const char *path); - -#define HELP_STRING \ -"Usage: launcher {options} arguments\n\ -\n\ -General options:\n\ - --help show this help\n\ - --nosplash do not show the splash screen\n\ - --jdkhome path to JDK\n\ - -J pass to JVM\n\ -\n\ - --cp:p prepend to classpath\n\ - --cp:a append to classpath\n\ -\n" - -int main(int argc, char *argv[]) { - for (int i = 0; i < argc; i++) - { - if (strcmp(argv[i], "-h") == 0 - || strcmp(argv[i], "-help") == 0 - || strcmp(argv[i], "--help") == 0 - || strcmp(argv[i], "/?") == 0) - { - printf(HELP_STRING); - return 0; - } - } - - char exepath[1024 * 4]; - char buf[1024 * 8], *pc; - - GetModuleFileName(0, buf, sizeof buf); - strcpy(exepath, buf); - -#ifdef DEBUG - printf("argc = %d\n", argc); - printf("exepath = %s\n", exepath); +#ifdef DLL_BUILD + #define NBEXEC_EXPORT extern "C" __declspec(dllexport) +#else + #define NBEXEC_EXPORT #endif - pc = strrchr(buf, '\\'); - if (pc != NULL) { // always holds - strlwr(pc + 1); - *pc = '\0'; // remove .exe filename - } - - pc = strrchr(buf, '\\'); - if (pc != NULL && 0 == stricmp("\\lib", pc)) - *pc = '\0'; - strcpy(plathome, buf); - strcpy(clusters, buf); - -#ifdef DEBUG - printf("plathome = %s\n", plathome); -#endif - - if (0 != findJdkFromRegistry(JDK_KEY, jdkhome)) - findJdkFromRegistry(JRE_KEY, jdkhome); - -#ifdef DEBUG - printf("jdkhome = %s\n", jdkhome); -#endif - - parseArgs(argc - 1, argv + 1); // skip progname - + NBEXEC_EXPORT int startPlatform(int argc, char *argv[]) { + PlatformLauncher launcher; DWORD retCode = 0; - if (!runnormal && !runupdater) { - char **newargv = (char**) malloc((argc+8) * sizeof (char*)); - int i; - - if (userdir[0] == '\0') { - fatal("Need to specify userdir using command line option --userdir"); - exit(1); - } - - sprintf(buf, "\"%s\"", argv[0]); - newargv[0] = strdup(buf); - -#ifdef DEBUG - printf("newargv[0] = %s\n", newargv[0]); -#endif - - for (i = 1; i < argc; i++) { - sprintf(buf, "\"%s\"", argv[i]); - newargv[i+1] = strdup(buf); -#ifdef DEBUG - printf("newargv[%d] = %s\n", i+1, newargv[i+1]); -#endif - } - i++; - - newargv[i] = NULL; - - bool runUpdater = runAutoUpdaterOnClusters(true); - - if (runUpdater) { - newargv[1] = RUN_UPDATER; - _spawnv(_P_WAIT, exepath, newargv); - } - - AGAIN: - - // run IDE - - newargv[1] = RUN_NORMAL; - retCode = _spawnv(_P_WAIT, exepath, newargv); - - runUpdater = runAutoUpdaterOnClusters(false); - if (runUpdater) { - newargv[1] = RUN_UPDATER; - _spawnv(_P_WAIT, exepath, newargv); - - goto AGAIN; - } - } else if (runnormal) { - argc -= 2; - argv += 2; - if (bootclass != NULL) { - runClass(bootclass, TRUE, &retCode); - } - else { - runClass(IDE_MAIN_CLASS, TRUE, &retCode); - } - } else if (runupdater) { - argc -= 2; - argv += 2; - runClass(UPDATER_MAIN_CLASS, FALSE, &retCode); + if (!launcher.start(argv, argc, &retCode)) { + return -1; } return retCode; } -bool runAutoUpdaterOnClusters(bool firstStart) { - bool runUpdater = false; - char *sClusters = processAUClustersList(userdir); - if (sClusters == NULL) { - sClusters = strdup(clusters); - } - char *pc; +#ifndef DLL_BUILD - checkForNewUpdater(plathome); - runUpdater = runAutoUpdater(firstStart, plathome); - - pc = strtok(sClusters, ";"); - while (pc != NULL) { - checkForNewUpdater(pc); - runUpdater |= runAutoUpdater(firstStart, pc); - pc = strtok(NULL, ";"); - } - - checkForNewUpdater(userdir); - runUpdater |= runAutoUpdater(firstStart, userdir); - -#ifdef DEBUG - printf("runAutoUpdaterOnClusters returning %d (platform %s, clusters %s, userdir %s)\n", - runUpdater, plathome, sClusters, userdir); -#endif - free(sClusters); - return runUpdater; +int main(int argc, char *argv[]) { + checkLoggingArg(argc, argv, true); + return startPlatform(argc - 1, argv + 1); } -bool runAutoUpdater(bool firstStart, const char * root) { - WIN32_FIND_DATA ffd; - char tmp [MAX_PATH]; - - // The logic is following: - // if there is an NBM for installation then run updater - // unless it is not a first start and we asked to install later (on next start) - - // then also check if last run left list of modules to disable/uninstall and - // did not mark them to be deactivated later (on next start) - strcpy(tmp, root); - strcat(tmp, "\\update\\download\\*.nbm"); - HANDLE nbmFiles = FindFirstFile(tmp, &ffd); - - strcpy(tmp, root); - strcat(tmp, "\\update\\download\\install_later.xml"); - HANDLE laterFile = FindFirstFile(tmp, &ffd); - - FindClose(nbmFiles); - FindClose(laterFile); - - if (INVALID_HANDLE_VALUE != nbmFiles && (firstStart || INVALID_HANDLE_VALUE == laterFile)) - return true; - - strcpy(tmp, root); - strcat(tmp, "\\update\\deactivate\\deactivate_later.txt"); - laterFile = FindFirstFile(tmp, &ffd); - FindClose(laterFile); - if (firstStart || (INVALID_HANDLE_VALUE == laterFile)) { - strcpy(tmp, root); - strcat(tmp, "\\update\\deactivate\\to_disable.txt"); - laterFile = FindFirstFile(tmp, &ffd); - if (INVALID_HANDLE_VALUE != laterFile) { - FindClose(laterFile); - return true; - } - strcpy(tmp, root); - strcat(tmp, "\\update\\deactivate\\to_uninstall.txt"); - laterFile = FindFirstFile(tmp, &ffd); - if (INVALID_HANDLE_VALUE != laterFile) { - FindClose(laterFile); - return true; - } - } - - return false; -} - -void runClass(char *mainclass, bool deleteAUClustersFile, DWORD *retCode) { - char buf[10240]; - -#ifdef DEBUG - printf("Running class %s\n", mainclass); #endif - if (jdkhome[0] == '\0') - fatal("JDK 5.0 or newer cannot be found on your machine."); - - strcat(strcpy(buf, "-Djdk.home="), jdkhome); - addOption(buf); - - strcat(strcpy(buf, "-Dnetbeans.home="), plathome); - addOption(buf); - - char *sAUclusters = processAUClustersList(userdir); - if (sAUclusters != NULL) { - strcat(strcpy(buf, "-Dnetbeans.dirs="), sAUclusters); - } - else { - strcat(strcpy(buf, "-Dnetbeans.dirs="), clusters); - } - addOption(buf); - if (deleteAUClustersFile) { - removeAUClustersListFile(userdir); - } - - if (userdir[0] != '\0') { - strcat(strcpy(buf, "-Dnetbeans.user="), userdir); - addOption(buf); - } - - if (classpathBefore[0] != '\0') - strcpy(classpath, classpathBefore); - else - classpath[0] = '\0'; - - addLauncherJarsToClassPath(); - addJdkJarsToClassPath(jdkhome); - - char *proxy = 0, *nonProxyHosts = 0; - char *socksProxy = 0; - if (0 == findHttpProxyFromEnv(&proxy, &nonProxyHosts)) { - sprintf(buf, "-Dnetbeans.system_http_proxy=%s", proxy); - addOption(buf); - sprintf(buf, "-Dnetbeans.system_http_non_proxy_hosts=%s", nonProxyHosts); - addOption(buf); - free(proxy); - free(nonProxyHosts); - } - else if (0 == findProxiesFromRegistry(&proxy, &nonProxyHosts, &socksProxy)) { - if (proxy) - { - sprintf(buf, "-Dnetbeans.system_http_proxy=%s", proxy); - addOption(buf); - free(proxy); - } - if (nonProxyHosts) - { - sprintf(buf, "-Dnetbeans.system_http_non_proxy_hosts=%s", nonProxyHosts); - addOption(buf); - free(nonProxyHosts); - } - if (socksProxy) - { - snprintf(buf, 10240, "-Dnetbeans.system_socks_proxy=%s", socksProxy); - addOption(buf); - free(socksProxy); - } - } - - // see BugTraq #5043070 - addOption("-Dsun.awt.keepWorkingSetOnMinimize=true"); - - // enabling heap dump on OOME - addOption("-XX:+HeapDumpOnOutOfMemoryError"); - snprintf(buf, 10240, "-XX:HeapDumpPath=%s\\var\\log\\heapdump.hprof", userdir); - addOption(buf); - - char *javapath = findJavaExeInDirectory(jdkhome); - if (javapath == NULL) { - sprintf(buf, "Cannot find java.exe.\nNeither %s%s nor %s%s exists.", - jdkhome, "\\jre\\bin\\java.exe", - jdkhome, "\\bin\\java.exe" - ); - fatal(buf); - } - - int argc = numOptions + 3 + progArgc + 1; - char **args = (char**) malloc(argc * sizeof(char*)); - char **p = args; - - sprintf(buf, "\"%s\"", javapath); - *p++ = strdup(buf); - - int i; - for (i = 0; i < numOptions; i++) { -#ifdef DEBUG - printf("runClass[%d] = %s\n", i, options[i]); -#endif - sprintf(buf, "\"%s\"", options[i]); - *p++ = strdup(buf); - } - - *p++ = "-cp"; - - if (classpathAfter[0] != '\0') { - if (classpath[strlen(classpath)] != ';') - strcat(classpath, ";"); - strcat(classpath, classpathAfter); - } - sprintf(buf, "\"%s\"", classpath); - *p++ = strdup(buf); - - *p++ = mainclass; - - for (i = 0; i < progArgc; i++) { - sprintf(buf, "\"%s\"", progArgv[i]); - *p++ = strdup(buf); - } - *p++ = NULL; - - // Prevents Windows from bringing up a "No floppy in drive A:" dialog. - // The error mode should be inherited by the java process - SetErrorMode(SetErrorMode(0) | SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); - -#ifdef DEBUG - fflush(stdout); -#endif - //_spawnv(_P_WAIT, javapath, args); - double start = getPreciseTime(); - if (!createProcessNoVirt(javapath, args, retCode) && *retCode == 1 && (getPreciseTime() - start < 2)) - { - // workaround for 64-bit java - int i = 0; - bool optionClient = false; - while (args[i]) - { - if (strcmp(args[i], "-client") == 0 || strcmp(args[i], "\"-client\"") == 0) - { - optionClient = true; - int k = i; - while (args[k]) - { - args[k] = args[k+1]; - k++; - } - } - else - i++; - } - if (optionClient) - { - printf("Rerunnig without \"-client\" option...\n"); - createProcessNoVirt(javapath, args, retCode); - } - } -} - -////////// - -/* - * Returns string data for the specified registry value name, or - * NULL if not found. - */ -static char * GetStringValue(HKEY key, const char *name) -{ - DWORD type, size; - char *value = 0; - - if (RegQueryValueEx(key, name, 0, &type, 0, &size) == 0 && type == REG_SZ) { - value = (char*) malloc(size); - if (RegQueryValueEx(key, name, 0, 0, (unsigned char*)value, &size) != 0) { - free(value); - value = 0; - } - } - return value; -} - -// returns non zero if version is acceptable to run the application -// currently it means at least JDK 1.5 -static int isAcceptable( const char *version) { - if (version == NULL) - return 0; - - // should work for 1.4, 1.5, 1.5.0, 1.5.0_xy, 1.6, 1.6.0, 1.7 - return (strcmp(version, "1.5") >= 0)? 1: 0; -} - -/* Looks for jre\bin\java.exe or bin\java.exe in given directory - and return newly allocated char array pointing to this .exe file - or NULL -*/ -static char *findJavaExeInDirectory(char *dir) { - char *javapath = (char *)malloc(strlen(dir)+20); - WIN32_FIND_DATA ffd; - - strcat(strcpy(javapath, dir), "\\jre\\bin\\java.exe"); - HANDLE hFind = FindFirstFile(javapath, &ffd); - if (INVALID_HANDLE_VALUE == hFind) { - strcat(strcpy(javapath, dir), "\\bin\\java.exe"); - hFind = FindFirstFile(javapath, &ffd); - if (INVALID_HANDLE_VALUE == hFind) { - free(javapath); - return NULL; - } - FindClose(hFind); - } - FindClose(hFind); - return javapath; -} - -static int findJdkFromRegistry(const char* keyname, char jdkhome[]) -{ - HKEY hkey = NULL, subkey = NULL; - char *ver = NULL; - int rc = 1; - - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyname, 0, KEY_READ, &hkey) == 0) { - ver = GetStringValue(hkey, "CurrentVersion"); - // try default Java - if (isAcceptable(ver)) { - if (RegOpenKeyEx(hkey, ver, 0, KEY_READ, &subkey) == 0) { - char *home = GetStringValue(subkey, "JavaHome"); - if (home != NULL) { - strcpy(jdkhome, home); - if (fileExists(home)) { -#ifdef DEBUG - printf("Found Java in registry (default, version=%s, path=%s)\n", ver, home); -#endif - rc = 0; - } - free(home); - } - if (subkey != NULL) - RegCloseKey(subkey); - } -#ifdef DEBUG - else { - printf("Failed to open key %s under %s, error %ld\n", ver, keyname, GetLastError()); - } -#endif - } - if (rc != 0) { - // try Java SE 6 - if (RegOpenKeyEx(hkey, "1.6", 0, KEY_READ, &subkey) == 0) { - char *home = GetStringValue(subkey, "JavaHome"); - if (home != NULL) { - strcpy(jdkhome, home); - if (fileExists(home)) { -#ifdef DEBUG - printf("Found Java in registry (1.6, path=%s)\n", home); -#endif - rc = 0; - } - free(home); - } - if (subkey != NULL) - RegCloseKey(subkey); - } - } - if (rc != 0) { - // try JDK 1.5 - if (RegOpenKeyEx(hkey, "1.5", 0, KEY_READ, &subkey) == 0) { - char *home = GetStringValue(subkey, "JavaHome"); - if (home != NULL) { - strcpy(jdkhome, home); - if (fileExists(home)) { -#ifdef DEBUG - printf("Found Java in registry (1.6, path=%s)\n", home); -#endif - rc = 0; - } - free(home); - } - if (subkey != NULL) - RegCloseKey(subkey); - } - } - } - - if (ver != NULL) - free(ver); - if (hkey != NULL) - RegCloseKey(hkey); - return rc; -} - -int findProxiesFromRegistry(char **proxy, char **nonProxy, char **socksProxy) -{ - HKEY hkey = NULL; - char *proxyServer = NULL; - char *proxyOverrides = NULL; - int rc = 1; - *proxy = NULL; *nonProxy = NULL; *socksProxy = NULL; - - if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet settings", 0, KEY_READ, &hkey) == 0) { - DWORD proxyEnable, size = sizeof proxyEnable; - - if (RegQueryValueEx(hkey, "ProxyEnable", 0, 0, (unsigned char*) &proxyEnable, &size) == 0) { - if (proxyEnable) { - proxyServer = GetStringValue(hkey, "ProxyServer"); - if (proxyServer == NULL) - goto quit; - - if (strstr(proxyServer, "=") == NULL) { - *proxy = strdup(proxyServer); - rc = 0; - } else { - char *pc = strstr(proxyServer, "socks="); - if (pc) - { - pc += strlen("socks="); - if (*pc != '\0' && *pc != ';') - { - char *end = strchr(pc, ';'); - if (end) - { - *socksProxy = (char *) malloc(end - pc + 1); - strncpy(*socksProxy, pc, end - pc); - } - else - *socksProxy = strdup(pc); - rc = 0; - } - } - pc = strstr(proxyServer, "http="); - if (pc != NULL) { - pc += strlen("http="); - char *qc = strstr(pc, ";"); - if (qc != NULL) - *qc = '\0'; - *proxy = strdup(pc); - rc = 0; - } - } - // ProxyOverride contains semicolon delimited list of host name prefixes - // to connect them directly w/o proxy - // optionally last entry is to bypass local addresses - // *acme.com also works there - proxyOverrides = GetStringValue(hkey, "ProxyOverride"); - if (proxyOverrides != NULL) - *nonProxy = strdup(proxyOverrides); - else - *nonProxy = strdup(""); - } - else { - *proxy = strdup("DIRECT"); - *nonProxy = strdup(""); - rc = 0; - } - } - } - - quit: - if (proxyServer != NULL) - free(proxyServer); - if (proxyOverrides != NULL) - free(proxyOverrides); - if (hkey != NULL) - RegCloseKey(hkey); - return rc; -} - -/* Reads value of http_proxy environment variable to use it as proxy setting - * Returns 0 if it exists and is successfully parsed, other value if there - * is some problem. - */ -int findHttpProxyFromEnv(char **proxy, char **nonProxy) -{ - char *proxyServer = NULL; - char *proxyOverrides = NULL; - int rc = 1; - *proxy = NULL; *nonProxy = NULL; - - char *envvar = getenv("http_proxy"); - if (envvar != NULL) { - // is it URL? - if (strncmp(envvar, "http://", strlen("http://")) == 0 - && envvar[strlen(envvar)-1] == '/' - && strlen(envvar) > strlen("http://")) { - // trim URL part to keep only 'host[:port]' - *proxy = strdup(envvar + strlen("http://")); - (*proxy)[strlen(*proxy)-1] = '\0'; - *nonProxy = strdup(""); - rc = 0; - } - } - return rc; -} - -void addToClassPath(const char *pathprefix, const char *path) { - char buf[1024]; - - strcpy(buf, pathprefix); - if (path != NULL) - strcat(strcat(buf, "\\"), path); - - if (classpath[0] != '\0') - strcat(classpath, ";"); - strcat(classpath, buf); -} - -void addToClassPathIfExists(const char *pathprefix, const char *path) { - char buf[1024]; - - strcpy(buf, pathprefix); - if (path != NULL) - strcat(strcat(buf, "\\"), path); - - if (fileExists(buf) != 0) - addToClassPath(pathprefix, path); -} - - -void addJdkJarsToClassPath(const char *jdkhome) -{ - addToClassPathIfExists(jdkhome, "lib\\dt.jar"); - addToClassPathIfExists(jdkhome, "lib\\tools.jar"); -} - -void addJarsToClassPathFrom(const char *dir) -{ - addAllFilesToClassPath(dir, "lib\\patches", "*.jar"); - addAllFilesToClassPath(dir, "lib\\patches", "*.zip"); - - addAllFilesToClassPath(dir, "lib", "*.jar"); - addAllFilesToClassPath(dir, "lib", "*.zip"); - - addAllFilesToClassPath(dir, "lib\\locale", "*.jar"); - addAllFilesToClassPath(dir, "lib\\locale", "*.zip"); -} - -void addLauncherJarsToClassPath() -{ - addJarsToClassPathFrom(userdir); - addJarsToClassPathFrom(plathome); - - if (runupdater) { - char userUpdater[MAX_PATH] = ""; - _snprintf(userUpdater, MAX_PATH, "%s\\modules\\ext\\updater.jar", userdir); - const char *baseUpdaterPath = plathome; - if (fileExists(userUpdater)) - baseUpdaterPath = userdir; - addToClassPath(baseUpdaterPath, "\\modules\\ext\\updater.jar"); - addAllFilesToClassPath(baseUpdaterPath, "\\modules\\ext\\locale", "updater_*.jar"); - } -} - -set addedToCP; - -void addAllFilesToClassPath(const char *dir, const char *subdir, const char *pattern) { - char path[1024]; - char pathPattern[1024]; - struct _finddata_t fileinfo; - long hFile; - snprintf(path, 1024, "%s\\%s", dir, subdir); - snprintf(pathPattern, 1024, "%s\\%s", path, pattern); - - if ((hFile = _findfirst(pathPattern, &fileinfo)) != -1L) { - do { - string name = subdir; - name += fileinfo.name; - if (addedToCP.insert(name).second) { - addToClassPath(path, fileinfo.name); - } - } while (0 == _findnext(hFile, &fileinfo)); - _findclose(hFile); - } -} - -void fatal(const char *str) -{ -//#ifdef WINMAIN - ::MessageBox(NULL, str, PROG_FULLNAME, MB_ICONSTOP | MB_OK); -//#else -// fprintf(stderr, "%s\n", str); -//#endif - exit(255); -} - -/* - * Adds a new VM option with the given given name and value. - * - * Doesn't modify the input string, creates its copy. - * - */ -void addOption(char *str) -{ - /* - * Expand options array if needed to accomodate at least one more - * VM option. - */ - if (numOptions >= maxOptions) { - if (options == 0) { - maxOptions = 4; - options = (char**) malloc(maxOptions * sizeof(char*)); - } else { - char** tmp; - maxOptions *= 2; - tmp = (char**)malloc(maxOptions * sizeof(char*)); - memcpy(tmp, options, numOptions * sizeof(char*)); - free(options); - options = tmp; - } - } - int len = strlen(str); - char *strOpt = (char *) malloc(len+1); - int k = 0; - for (int i = 0; i < len; i++) { - if (str[i] != '\"') - strOpt[k++] = str[i]; - } - strOpt[k] = '\0'; - options[numOptions++] = strOpt; -} - -void parseArgs(int argc, char *argv[]) { - char *arg; - - while (argc > 0 && (arg = *argv) != 0) { - argv++; - argc--; - -#ifdef DEBUG - printf("parseArgs - processing %s\n", arg); -#endif - - if (0 == strcmp("--userdir", arg)) { - if (argc > 0) { - arg = *argv; - argv++; - argc--; - if (arg != 0) { - strcpy(userdir, arg); - normalizePath(userdir); - } - } - else { - fatal(BAD_OPTION_MSG); - } - } else if (0 == strcmp("--clusters", arg)) { - if (argc > 0) { - arg = *argv; - argv++; - argc--; - if (arg != 0) { - strcpy(clusters, arg); - } - } - else { - fatal(BAD_OPTION_MSG); - } - } else if (0 == strcmp("--bootclass", arg)) { - if (argc > 0) { - arg = *argv; - argv++; - argc--; - if (arg != 0) { - bootclass = strdup(arg); - } - } - else { - fatal(BAD_OPTION_MSG); - } - } else if (0 == strcmp(RUN_NORMAL, arg)) { - runnormal = 1; - runupdater = 0; - } else if (0 == strcmp(RUN_UPDATER, arg)) { - runnormal = 0; - runupdater = 1; - } else if (0 == strcmp("--jdkhome", arg)) { - if (argc > 0) { - arg = *argv; - argv++; - argc--; - if (arg != 0) { - if (findJavaExeInDirectory(arg)) - strcpy(jdkhome, arg); - else { - argv[-1] = argv[-2] = ""; - char errMsg[1024] = ""; - sprintf(errMsg, "Cannot find java.exe in specified jdkhome.\nNeither %s%s nor %s%s exists.\nDo you want to try to use default version?", - arg, "\\jre\\bin\\java.exe", - arg, "\\bin\\java.exe" - ); - if (::MessageBox(NULL, errMsg, "Invalid jdkhome specified", MB_ICONQUESTION | MB_YESNO) == IDNO) - exit(255); - } - } - } - else { - fatal(BAD_OPTION_MSG); - } - } else if (0 == strcmp("-cp:p", arg) || 0 == strcmp("--cp:p", arg)) { - if (argc > 0) { - arg = *argv; - argv++; - argc--; - if (arg != 0) { - if (classpathBefore[0] != '\0' - && classpathBefore[strlen(classpathBefore)] != ';') - strcat(classpathBefore, ";"); - strcat(classpathBefore, arg); - } - } - else { - fatal(BAD_OPTION_MSG); - } - } else if (0 == strcmp("-cp", arg) || 0 == strcmp("-cp:a", arg) || 0 == strcmp("--cp", arg) || 0 == strcmp("--cp:a", arg)) { - if (argc > 0) { - arg = *argv; - argv++; - argc--; - if (arg != 0) { - if (classpathAfter[0] != '\0' - && classpathAfter[strlen(classpathAfter)] != ';') - strcat(classpathAfter, ";"); - strcat(classpathAfter, arg); - } - } - else { - fatal(BAD_OPTION_MSG); - } - } else if (0 == strncmp("-J", arg, 2)) { - addOption(arg + 2); - } else { - progArgv[progArgc++] = arg; - } - } -} - -void normalizePath(char *userdir) -{ - char tmp[MAX_PATH] = ""; - int i = 0; - while (userdir[i] && i < MAX_PATH - 1) - { - tmp[i] = userdir[i] == '/' ? '\\' : userdir[i]; - i++; - } - tmp[i] = '\0'; - _fullpath(userdir, tmp, MAX_PATH); -} - -int fileExists(const char* path) { - WIN32_FIND_DATA ffd; - HANDLE ffh; - - memset(&ffd, 0, sizeof ffd); - ffh = FindFirstFile(path, &ffd); - if (ffh != INVALID_HANDLE_VALUE) { - FindClose(ffh); - return 1; - } else { - return 0; - } -} - -/** Looks for ${userdir}\update\download\netbeans.dirs and reads - * list of clusters. - * @return newly allocated string with file content if file exists - * or NULL if it is not found - */ -char* processAUClustersList(char *userdir) { - if (userdir == NULL || userdir[0] == '\0') - return NULL; - char *pPath = (char*)malloc(strlen(userdir)+32); - if (pPath == NULL) fatal("Cannot allocate memory (processAUClustersList)."); - - strcpy(pPath, userdir); - strcat(pPath, "\\update\\download\\netbeans.dirs"); - -#ifdef DEBUG - if (fileExists(pPath)) printf("Found file with new clusters %s\n", pPath); -#endif - FILE* fin = fopen(pPath, "r"); - if (fin == NULL) - return 0; - - long len = _filelength(_fileno(fin)); - char *pClusters = (char*)malloc(len+1); - if (fgets(pClusters, len+1, fin)) { - while(strlen(pClusters) > 1 && - (pClusters[strlen(pClusters) - 1] == '\r' || pClusters[strlen(pClusters) - 1] == '\n')) { - pClusters[strlen(pClusters) - 1] = '\0'; - } - fclose(fin); -#ifdef DEBUG - printf("Overriden clusters %s\n", pClusters); -#endif - return pClusters; - } - fclose(fin); - return NULL; -} - -/** Deletes ${userdir}\update\download\netbeans.dirs if it exists. - */ -int removeAUClustersListFile(char* userdir) { - if (userdir == NULL || userdir[0] == '\0') - return 0; - char *pPath = (char*)malloc(strlen(userdir)+32); - if (pPath == NULL) fatal("Cannot allocate memory (removeAUClustersListFile)."); - - strcpy(pPath, userdir); - strcat(pPath, "\\update\\download\\netbeans.dirs"); - if (remove(pPath) != 0) { - if (errno != ENOENT) return -1; // an error while deleting - } - return 0; -} - -// check if new updater exists, if exists install it (replace old one) and remove ...\new_updater directory -int checkForNewUpdater(const char *basePath) -{ - char srcPath[MAX_PATH] = ""; - _snprintf(srcPath, MAX_PATH, "%s\\update\\new_updater\\updater.jar", basePath); - WIN32_FIND_DATA fd = {0}; - HANDLE hFind = FindFirstFile(srcPath, &fd); - if (hFind != INVALID_HANDLE_VALUE) - { - FindClose(hFind); - char destPath[MAX_PATH] = ""; - _snprintf(destPath, MAX_PATH, "%s\\modules\\ext\\updater.jar", basePath); - createPath(destPath); - if (!MoveFileEx(srcPath, destPath, MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH)) - return -1; - _snprintf(srcPath, MAX_PATH, "%s\\update\\new_updater", basePath); - RemoveDirectory(srcPath); - } - return 0; -} - -int createPath(const char *path) { - char dir[MAX_PATH] = ""; - const char *sep = strchr(path, '\\'); - while (sep) { - strncpy(dir, path, sep - path); - CreateDirectory(dir, 0); - sep = strchr(sep + 1, '\\'); - } - return 0; -} - -// creates process and disable virtualization (Win VISTA fix) -int createProcessNoVirt(const char *exePath, char *argv[], DWORD *retCode) -{ - const int maxCmdLineLen = 32*1024; - int filled = 0; - char cmdLine[maxCmdLineLen] = ""; - int i = 0; - while (argv[i]) - { - int len = (int) strlen(argv[i]); - if (len + filled + 2 > maxCmdLineLen) - { - char err[1024] = ""; - _snprintf(err, 1024, "Command line arguments for \"%s\" exceeds 32K characters!", exePath); - MessageBox(NULL, err, "Error", MB_OK | MB_ICONSTOP); - return -1; - } - memcpy(cmdLine + filled, argv[i], len); - filled += len; - cmdLine[filled++] = ' '; - i++; - } - cmdLine[filled++] = '\0'; - - STARTUPINFO si = {0}; - si.cb = sizeof(STARTUPINFO); - PROCESS_INFORMATION pi = {0}; - - if (!CreateProcess(NULL, cmdLine, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi)) - { - MessageBox(NULL, "Failed to create process.", "Error", MB_OK | MB_ICONSTOP); - return -1; - } - OSVERSIONINFO osvi = {0}; - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if (GetVersionEx(&osvi) && osvi.dwMajorVersion == 6) // check it is Win VISTA - { - HANDLE hToken; - if (OpenProcessToken(pi.hProcess, TOKEN_ALL_ACCESS, &hToken)) - { - DWORD tokenInfoVal = 0; - if (!SetTokenInformation(hToken, (TOKEN_INFORMATION_CLASS) 24, &tokenInfoVal, sizeof(DWORD))) - { - // invalid token information class (24) is OK, it means there is no folder virtualization on current system - if (GetLastError() != ERROR_INVALID_PARAMETER) - MessageBox(NULL, "Failed to set token information.", "Warning", MB_OK | MB_ICONWARNING); - } - CloseHandle(hToken); - } - else - MessageBox(NULL, "Failed to open process token.", "Warning", MB_OK | MB_ICONWARNING); - } - ResumeThread(pi.hThread); - WaitForSingleObject(pi.hProcess, INFINITE); - if (retCode) - GetExitCodeProcess(pi.hProcess, retCode); - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - return 0; -} - - -double getPreciseTime() -{ - static LARGE_INTEGER perfFrequency = {0}; - LARGE_INTEGER currentCount; - if (perfFrequency.QuadPart == 0) - QueryPerformanceFrequency(&perfFrequency); - QueryPerformanceCounter(¤tCount); - return currentCount.QuadPart / (double) perfFrequency.QuadPart; -} diff --git a/o.n.bootstrap/launcher/windows/nbexec.dll b/o.n.bootstrap/launcher/windows/nbexec.dll new file mode 100644 index 0000000000000000000000000000000000000000..4a9652277ef31468a3cd330ca9ca0ed86bbdb109 GIT binary patch literal 185856 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�MiC@5TcA|XHK8AZ7OhNx= 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 diff --git a/o.n.bootstrap/launcher/windows/nbexec.exe b/o.n.bootstrap/launcher/windows/nbexec.exe index fd7e1979f9eacc75ad50aca31b1a0ea999c3a6da..867ac227963765471b12634ed6829fa1fa6cb633 GIT binary patch literal 182784 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 Vp%%lu2648<;-YX&-2HdE{|A`;&UXL+ diff --git a/o.n.bootstrap/launcher/windows/nbproject/Makefile-Default.mk b/o.n.bootstrap/launcher/windows/nbproject/Makefile-Default.mk deleted file mode 100644 --- a/o.n.bootstrap/launcher/windows/nbproject/Makefile-Default.mk +++ /dev/null @@ -1,54 +0,0 @@ -# -# Gererated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a -pre and a -post target defined where you can add customized code. -# -# This makefile implements configuration specific macros and targets. - - -# Environment -MKDIR=mkdir -CP=cp -CCADMIN=CCadmin -RANLIB=ranlib -CC=gcc.exe -CCC=g++.exe -CXX=g++.exe -FC= - -# Include project Makefile -include Makefile_windows.mk - -# Object Directory -OBJECTDIR=build/Default/Cygwin-Windows - -# Object Files -OBJECTFILES= - -# C Compiler Flags -CFLAGS= - -# CC Compiler Flags -CCFLAGS= -CXXFLAGS= - -# Fortran Compiler Flags -FFLAGS= - -# Link Libraries and Options -LDLIBSOPTIONS= - -# Build Targets -.build-conf: ${BUILD_SUBPROJECTS} - cd . && make -f Makefile testinst - -# Subprojects -.build-subprojects: - -# Clean Targets -.clean-conf: - cd . && make -f Makefile distclean - -# Subprojects -.clean-subprojects: diff --git a/o.n.bootstrap/launcher/windows/nbproject/Makefile-impl.mk b/o.n.bootstrap/launcher/windows/nbproject/Makefile-impl.mk --- a/o.n.bootstrap/launcher/windows/nbproject/Makefile-impl.mk +++ b/o.n.bootstrap/launcher/windows/nbproject/Makefile-impl.mk @@ -27,27 +27,27 @@ PROJECTNAME=windows # Active Configuration -DEFAULTCONF=Default +DEFAULTCONF=nbexec.exe CONF=${DEFAULTCONF} # All Configurations -ALLCONFS=Default +ALLCONFS=nbexec.exe nbexec.dll # build -.build-impl: .validate-impl +.build-impl: .build-pre .validate-impl .depcheck-impl @#echo "=> Running $@... Configuration=$(CONF)" ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf # clean -.clean-impl: .validate-impl +.clean-impl: .clean-pre .validate-impl .depcheck-impl @#echo "=> Running $@... Configuration=$(CONF)" ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf # clobber -.clobber-impl: +.clobber-impl: .clobber-pre .depcheck-impl @#echo "=> Running $@..." for CONF in ${ALLCONFS}; \ do \ @@ -55,13 +55,25 @@ done # all -.all-impl: +.all-impl: .all-pre .depcheck-impl @#echo "=> Running $@..." for CONF in ${ALLCONFS}; \ do \ ${MAKE} -f nbproject/Makefile-$${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf; \ done +# dependency checking support +.depcheck-impl: + @echo "# This code depends on make tool being used" >.dep.inc + @if [ -n "${MAKE_VERSION}" ]; then \ + echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \ + echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ + echo "include \$${DEPFILES}" >>.dep.inc; \ + echo "endif" >>.dep.inc; \ + else \ + echo ".KEEP_STATE:" >>.dep.inc; \ + echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ + fi # configuration validation .validate-impl: @@ -80,7 +92,7 @@ # help -.help-impl: +.help-impl: .help-pre @echo "This makefile supports the following configurations:" @echo " ${ALLCONFS}" @echo "" @@ -108,6 +120,4 @@ @echo " also build subprojects." @echo "Target 'help' prints this message." @echo "" - @echo "The active configuration (${ACTIVECONF}) is being used if the configuration is not specified." - @echo "" diff --git a/o.n.bootstrap/launcher/windows/nbproject/Makefile-nbexec.dll.mk b/o.n.bootstrap/launcher/windows/nbproject/Makefile-nbexec.dll.mk new file mode 100644 --- /dev/null +++ b/o.n.bootstrap/launcher/windows/nbproject/Makefile-nbexec.dll.mk @@ -0,0 +1,94 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a -pre and a -post target defined where you can add customized code. +# +# This makefile implements configuration specific macros and targets. + + +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib +CC=gcc.exe +CCC=g++.exe +CXX=g++.exe +FC= +AS= + +# Macros +PLATFORM=Cygwin-Windows + +# Include project Makefile +include Makefile + +# Object Directory +OBJECTDIR=build/nbexec.dll/${PLATFORM} + +# Object Files +OBJECTFILES= \ + ${OBJECTDIR}/jvmlauncher.o \ + ${OBJECTDIR}/platformlauncher.o \ + ${OBJECTDIR}/utilsfuncs.o \ + ${OBJECTDIR}/nbexec.o + +# C Compiler Flags +CFLAGS=-m32 + +# CC Compiler Flags +CCFLAGS=-m32 -s -mno-cygwin +CXXFLAGS=-m32 -s -mno-cygwin + +# Fortran Compiler Flags +FFLAGS= + +# Assembler Flags +ASFLAGS= + +# Link Libraries and Options +LDLIBSOPTIONS= + +# Build Targets +.build-conf: ${BUILD_SUBPROJECTS} + ${MAKE} -f nbproject/Makefile-nbexec.dll.mk nbexec.dll + +nbexec.dll: ${OBJECTFILES} + ${LINK.cc} -mno-cygwin -shared -o nbexec.dll -fPIC ${OBJECTFILES} ${LDLIBSOPTIONS} + +${OBJECTDIR}/jvmlauncher.o: jvmlauncher.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} $@.d + $(COMPILE.cc) -O2 -Wall -s -DDLL_BUILD -Ic\:/cygwin/usr/include/mingw -IC\:/Program\ Files/Java/jdk1.6.0_10/include -IC\:/Program\ Files/Java/jdk1.6.0_10/include/win32 -fPIC -MMD -MP -MF $@.d -o ${OBJECTDIR}/jvmlauncher.o jvmlauncher.cpp + +${OBJECTDIR}/platformlauncher.o: platformlauncher.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} $@.d + $(COMPILE.cc) -O2 -Wall -s -DDLL_BUILD -Ic\:/cygwin/usr/include/mingw -IC\:/Program\ Files/Java/jdk1.6.0_10/include -IC\:/Program\ Files/Java/jdk1.6.0_10/include/win32 -fPIC -MMD -MP -MF $@.d -o ${OBJECTDIR}/platformlauncher.o platformlauncher.cpp + +${OBJECTDIR}/utilsfuncs.o: utilsfuncs.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} $@.d + $(COMPILE.cc) -O2 -Wall -s -DDLL_BUILD -Ic\:/cygwin/usr/include/mingw -IC\:/Program\ Files/Java/jdk1.6.0_10/include -IC\:/Program\ Files/Java/jdk1.6.0_10/include/win32 -fPIC -MMD -MP -MF $@.d -o ${OBJECTDIR}/utilsfuncs.o utilsfuncs.cpp + +${OBJECTDIR}/nbexec.o: nbexec.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} $@.d + $(COMPILE.cc) -O2 -Wall -s -DDLL_BUILD -Ic\:/cygwin/usr/include/mingw -IC\:/Program\ Files/Java/jdk1.6.0_10/include -IC\:/Program\ Files/Java/jdk1.6.0_10/include/win32 -fPIC -MMD -MP -MF $@.d -o ${OBJECTDIR}/nbexec.o nbexec.cpp + +# Subprojects +.build-subprojects: + +# Clean Targets +.clean-conf: + ${RM} -r build/nbexec.dll + ${RM} nbexec.dll + +# Subprojects +.clean-subprojects: + +# Enable dependency checking +.dep.inc: .depcheck-impl + +include .dep.inc diff --git a/o.n.bootstrap/launcher/windows/nbproject/Makefile-nbexec.exe.mk b/o.n.bootstrap/launcher/windows/nbproject/Makefile-nbexec.exe.mk new file mode 100644 --- /dev/null +++ b/o.n.bootstrap/launcher/windows/nbproject/Makefile-nbexec.exe.mk @@ -0,0 +1,94 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a -pre and a -post target defined where you can add customized code. +# +# This makefile implements configuration specific macros and targets. + + +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib +CC=gcc.exe +CCC=g++.exe +CXX=g++.exe +FC= +AS= + +# Macros +PLATFORM=Cygwin-Windows + +# Include project Makefile +include Makefile + +# Object Directory +OBJECTDIR=build/nbexec.exe/${PLATFORM} + +# Object Files +OBJECTFILES= \ + ${OBJECTDIR}/jvmlauncher.o \ + ${OBJECTDIR}/platformlauncher.o \ + ${OBJECTDIR}/utilsfuncs.o \ + ${OBJECTDIR}/nbexec.o + +# C Compiler Flags +CFLAGS=-m32 + +# CC Compiler Flags +CCFLAGS=-m32 -s -mno-cygwin +CXXFLAGS=-m32 -s -mno-cygwin + +# Fortran Compiler Flags +FFLAGS=-m32 + +# Assembler Flags +ASFLAGS= + +# Link Libraries and Options +LDLIBSOPTIONS= + +# Build Targets +.build-conf: ${BUILD_SUBPROJECTS} + ${MAKE} -f nbproject/Makefile-nbexec.exe.mk nbexec.exe.exe + +nbexec.exe.exe: ${OBJECTFILES} + ${LINK.cc} -o nbexec.exe ${OBJECTFILES} ${LDLIBSOPTIONS} + +${OBJECTDIR}/jvmlauncher.o: jvmlauncher.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} $@.d + $(COMPILE.cc) -O2 -Wall -Ic\:/cygwin/usr/include/mingw -IC\:/Program\ Files/Java/jdk1.6.0_10/include -IC\:/Program\ Files/Java/jdk1.6.0_10/include/win32 -MMD -MP -MF $@.d -o ${OBJECTDIR}/jvmlauncher.o jvmlauncher.cpp + +${OBJECTDIR}/platformlauncher.o: platformlauncher.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} $@.d + $(COMPILE.cc) -O2 -Wall -Ic\:/cygwin/usr/include/mingw -IC\:/Program\ Files/Java/jdk1.6.0_10/include -IC\:/Program\ Files/Java/jdk1.6.0_10/include/win32 -MMD -MP -MF $@.d -o ${OBJECTDIR}/platformlauncher.o platformlauncher.cpp + +${OBJECTDIR}/utilsfuncs.o: utilsfuncs.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} $@.d + $(COMPILE.cc) -O2 -Wall -Ic\:/cygwin/usr/include/mingw -IC\:/Program\ Files/Java/jdk1.6.0_10/include -IC\:/Program\ Files/Java/jdk1.6.0_10/include/win32 -MMD -MP -MF $@.d -o ${OBJECTDIR}/utilsfuncs.o utilsfuncs.cpp + +${OBJECTDIR}/nbexec.o: nbexec.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} $@.d + $(COMPILE.cc) -O2 -Wall -Ic\:/cygwin/usr/include/mingw -IC\:/Program\ Files/Java/jdk1.6.0_10/include -IC\:/Program\ Files/Java/jdk1.6.0_10/include/win32 -MMD -MP -MF $@.d -o ${OBJECTDIR}/nbexec.o nbexec.cpp + +# Subprojects +.build-subprojects: + +# Clean Targets +.clean-conf: + ${RM} -r build/nbexec.exe + ${RM} nbexec.exe.exe + +# Subprojects +.clean-subprojects: + +# Enable dependency checking +.dep.inc: .depcheck-impl + +include .dep.inc diff --git a/o.n.bootstrap/launcher/windows/nbproject/Package-nbexec.dll.bash b/o.n.bootstrap/launcher/windows/nbproject/Package-nbexec.dll.bash new file mode 100644 --- /dev/null +++ b/o.n.bootstrap/launcher/windows/nbproject/Package-nbexec.dll.bash @@ -0,0 +1,72 @@ +#!/bin/bash -x + +# +# Generated - do not edit! +# + +# Macros +TOP=`pwd` +PLATFORM=Cygwin-Windows +TMPDIR=build/nbexec.dll/${PLATFORM}/tmp-packaging +TMPDIRNAME=tmp-packaging +OUTPUT_PATH=nbexec.dll +OUTPUT_BASENAME=nbexec.dll +PACKAGE_TOP_DIR=libwindows.dll/ + +# Functions +function checkReturnCode +{ + rc=$? + if [ $rc != 0 ] + then + exit $rc + fi +} +function makeDirectory +# $1 directory path +# $2 permission (optional) +{ + mkdir -p "$1" + checkReturnCode + if [ "$2" != "" ] + then + chmod $2 "$1" + checkReturnCode + fi +} +function copyFileToTmpDir +# $1 from-file path +# $2 to-file path +# $3 permission +{ + cp "$1" "$2" + checkReturnCode + if [ "$3" != "" ] + then + chmod $3 "$2" + checkReturnCode + fi +} + +# Setup +cd "${TOP}" +mkdir -p dist/nbexec.dll/${PLATFORM}/package +rm -rf ${TMPDIR} +mkdir -p ${TMPDIR} + +# Copy files and create directories and links +cd "${TOP}" +makeDirectory ${TMPDIR}/libwindows.dll/lib +copyFileToTmpDir "${OUTPUT_PATH}" "${TMPDIR}/${PACKAGE_TOP_DIR}lib/${OUTPUT_BASENAME}" 0644 + + +# Generate tar file +cd "${TOP}" +rm -f dist/nbexec.dll/${PLATFORM}/package/libwindows.dll.tar +cd ${TMPDIR} +tar -vcf ../../../../dist/nbexec.dll/${PLATFORM}/package/libwindows.dll.tar * +checkReturnCode + +# Cleanup +cd "${TOP}" +rm -rf ${TMPDIR} diff --git a/o.n.bootstrap/launcher/windows/nbproject/Package-nbexec.exe.bash b/o.n.bootstrap/launcher/windows/nbproject/Package-nbexec.exe.bash new file mode 100644 --- /dev/null +++ b/o.n.bootstrap/launcher/windows/nbproject/Package-nbexec.exe.bash @@ -0,0 +1,72 @@ +#!/bin/bash -x + +# +# Generated - do not edit! +# + +# Macros +TOP=`pwd` +PLATFORM=Cygwin-Windows +TMPDIR=build/nbexec.exe/${PLATFORM}/tmp-packaging +TMPDIRNAME=tmp-packaging +OUTPUT_PATH=nbexec.exe +OUTPUT_BASENAME=nbexec.exe +PACKAGE_TOP_DIR=windows/ + +# Functions +function checkReturnCode +{ + rc=$? + if [ $rc != 0 ] + then + exit $rc + fi +} +function makeDirectory +# $1 directory path +# $2 permission (optional) +{ + mkdir -p "$1" + checkReturnCode + if [ "$2" != "" ] + then + chmod $2 "$1" + checkReturnCode + fi +} +function copyFileToTmpDir +# $1 from-file path +# $2 to-file path +# $3 permission +{ + cp "$1" "$2" + checkReturnCode + if [ "$3" != "" ] + then + chmod $3 "$2" + checkReturnCode + fi +} + +# Setup +cd "${TOP}" +mkdir -p dist/nbexec.exe/${PLATFORM}/package +rm -rf ${TMPDIR} +mkdir -p ${TMPDIR} + +# Copy files and create directories and links +cd "${TOP}" +makeDirectory ${TMPDIR}/windows/bin +copyFileToTmpDir "${OUTPUT_PATH}.exe" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}.exe" 0755 + + +# Generate tar file +cd "${TOP}" +rm -f dist/nbexec.exe/${PLATFORM}/package/windows.tar +cd ${TMPDIR} +tar -vcf ../../../../dist/nbexec.exe/${PLATFORM}/package/windows.tar * +checkReturnCode + +# Cleanup +cd "${TOP}" +rm -rf ${TMPDIR} diff --git a/o.n.bootstrap/launcher/windows/nbproject/configurations.xml b/o.n.bootstrap/launcher/windows/nbproject/configurations.xml --- a/o.n.bootstrap/launcher/windows/nbproject/configurations.xml +++ b/o.n.bootstrap/launcher/windows/nbproject/configurations.xml @@ -1,40 +1,149 @@ - + + + argnames.h + jvmlauncher.h + platformlauncher.h + utilsfuncs.h + + + + + jvmlauncher.cpp + nbexec.cpp + platformlauncher.cpp + utilsfuncs.cpp + - Makefile_windows.mk + Makefile - Makefile - nbexec.cpp - Makefile_windows.mk + Makefile - + - Cygwin - true - true - false + localhost + Cygwin|Cygwin 3 - - - . - make -f Makefile testinst - make -f Makefile distclean - nbexec.exe - - - - - + + + 5 + 1 + 2 + + + 5 + 1 + + c:/cygwin/usr/include/mingw + C:/Program Files/Java/jdk1.6.0_10/include + C:/Program Files/Java/jdk1.6.0_10/include/win32 + + -s -mno-cygwin + 2 + + + 5 + 1 + + + nbexec.exe + + + + + + 3 + + + 1 + + 3 1 + + 1 + + + 3 + + + 1 + + + 3 + + + + + localhost + Cygwin|Cygwin + 3 + + + + 5 + 1 + 2 + + + 5 + true + 1 + + c:/cygwin/usr/include/mingw + C:/Program Files/Java/jdk1.6.0_10/include + C:/Program Files/Java/jdk1.6.0_10/include/win32 + + -s -mno-cygwin + + DLL_BUILD + + 2 + + + nbexec.dll + + + + + + 3 + + + 1 + + + 3 + + + 1 + + + 1 + + + 3 + + + 1 + + + 3 + diff --git a/o.n.bootstrap/launcher/windows/nbproject/project.xml b/o.n.bootstrap/launcher/windows/nbproject/project.xml --- a/o.n.bootstrap/launcher/windows/nbproject/project.xml +++ b/o.n.bootstrap/launcher/windows/nbproject/project.xml @@ -3,8 +3,12 @@ org.netbeans.modules.cnd.makeproject - windows + Platform Launcher Win 0 + + cpp + h + UTF-8 diff --git a/o.n.bootstrap/launcher/windows/platformlauncher.cpp b/o.n.bootstrap/launcher/windows/platformlauncher.cpp new file mode 100644 --- /dev/null +++ b/o.n.bootstrap/launcher/windows/platformlauncher.cpp @@ -0,0 +1,585 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 1997-2008 Sun Microsystems, Inc. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun + * Microsystems, Inc. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Author: Tomas Holy + */ + +#include "utilsfuncs.h" +#include "platformlauncher.h" +#include "argnames.h" + +using namespace std; + +const char *PlatformLauncher::HELP_MSG = +"\nUsage: launcher {options} arguments\n\ +\n\ +General options:\n\ + --help show this help\n\ + --nosplash do not show the splash screen\n\ + --jdkhome path to JDK\n\ + -J pass to JVM\n\ +\n\ + --cp:p prepend to classpath\n\ + --cp:a append to classpath\n\ +\n\ + --sproc run java in separate process\n\ + --trace path for launcher log (for trouble shooting)\n\ +\n"; + +const char *PlatformLauncher::REQ_JAVA_VERSION = "1.5"; + +const char *PlatformLauncher::OPT_JDK_HOME = "-Djdk.home="; +const char *PlatformLauncher::OPT_NB_PLATFORM_HOME = "-Dnetbeans.home="; +const char *PlatformLauncher::OPT_NB_CLUSTERS = "-Dnetbeans.dirs="; +const char *PlatformLauncher::OPT_NB_USERDIR = "-Dnetbeans.user="; +const char *PlatformLauncher::OPT_HTTP_PROXY = "-Dnetbeans.system_http_proxy="; +const char *PlatformLauncher::OPT_HTTP_NONPROXY = "-Dnetbeans.system_http_non_proxy_hosts="; +const char *PlatformLauncher::OPT_SOCKS_PROXY = "-Dnetbeans.system_socks_proxy="; +const char *PlatformLauncher::OPT_HEAP_DUMP = "-XX:+HeapDumpOnOutOfMemoryError"; +const char *PlatformLauncher::OPT_HEAP_DUMP_PATH = "-XX:HeapDumpPath="; +const char *PlatformLauncher::OPT_KEEP_WORKING_SET_ON_MINIMIZE = "-Dsun.awt.keepWorkingSetOnMinimize=true"; +const char *PlatformLauncher::OPT_CLASS_PATH = "-Djava.class.path="; + +const char *PlatformLauncher::REG_PROXY_KEY = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet settings"; +const char *PlatformLauncher::REG_PROXY_ENABLED_NAME = "ProxyEnable"; +const char *PlatformLauncher::REG_PROXY_SERVER_NAME = "ProxyServer"; +const char *PlatformLauncher::REG_PROXY_OVERRIDE_NAME = "ProxyOverride"; +const char *PlatformLauncher::PROXY_DIRECT = "DIRECT"; +const char *PlatformLauncher::HEAP_DUMP_PATH = "\\var\\log\\heapdump.hprof"; + +const char *PlatformLauncher::UPDATER_MAIN_CLASS = "org/netbeans/updater/UpdaterFrame"; +const char *PlatformLauncher::IDE_MAIN_CLASS = "org/netbeans/Main"; + +PlatformLauncher::PlatformLauncher() + : separateProcess(false) { +} + +PlatformLauncher::PlatformLauncher(const PlatformLauncher& orig) { +} + +PlatformLauncher::~PlatformLauncher() { +} + +bool PlatformLauncher::start(char* argv[], int argc, DWORD *retCode) { + if (!checkLoggingArg(argc, argv, false) || !initPlatformDir() || !parseArgs(argc, argv)) { + return false; + } + + if (jdkhome.empty()) { + if (!jvmLauncher.initialize(REQ_JAVA_VERSION)) { + logErr(false, true, "Cannot find Java %s or higher.", REQ_JAVA_VERSION); + return false; + } + } + jvmLauncher.getJavaPath(jdkhome); + + prepareOptions(); + + if (shouldAutoUpdateClusters(true)) { + // run updater + run(true, retCode); + } + + while (true) { + // run ide + run(false, retCode); + + if (shouldAutoUpdateClusters(false)) { + // run updater + run(true, retCode); + } else { + break; + } + } + + return true; +} + +bool PlatformLauncher::run(bool updater, DWORD *retCode) { + constructClassPath(updater); + const char *mainClass = updater ? UPDATER_MAIN_CLASS : (bootclass.empty() ? IDE_MAIN_CLASS : bootclass.c_str()); + + string option = OPT_CLASS_PATH; + option += classPath; + javaOptions.push_back(option); + bool rc = jvmLauncher.start(mainClass, progArgs, javaOptions, separateProcess, retCode); + javaOptions.pop_back(); + return rc; +} + + + +bool PlatformLauncher::initPlatformDir() { + char path[MAX_PATH] = ""; + getCurrentModulePath(path, MAX_PATH); + logMsg("Module: %s", path); + char *bslash = strrchr(path, '\\'); + if (!bslash) { + return false; + } + *bslash = '\0'; + bslash = strrchr(path, '\\'); + if (!bslash) { + return false; + } + *bslash = '\0'; + clusters = platformDir = path; + logMsg("Platform dir: %s", platformDir.c_str()); + return true; +} + +bool PlatformLauncher::parseArgs(int argc, char *argv[]) { +#define CHECK_ARG \ + if (i+1 == argc) {\ + logErr(false, true, "Argument is missing for \"%s\" option.", argv[i]);\ + return false;\ + } + + logMsg("Parsing arguments:"); + for (int i = 0; i < argc; i++) { + logMsg("\t%s", argv[i]); + } + + for (int i = 0; i < argc; i++) { + if (strcmp(ARG_NAME_SEPAR_PROC, argv[i]) == 0) { + separateProcess = true; + logMsg("Run Java in separater process"); + }else if (strcmp(ARG_NAME_LAUNCHER_LOG, argv[i]) == 0) { + CHECK_ARG; + i++; + }else if (strcmp(ARG_NAME_USER_DIR, argv[i]) == 0) { + CHECK_ARG; + char tmp[MAX_PATH + 1] = {0}; + strncpy(tmp, argv[++i], MAX_PATH); + if (!normalizePath(tmp)) { + logErr(false, true, "User directory path \"%s\" is not valid.", argv[i]); + return false; + } + userDir = tmp; + logMsg("User dir: %s", userDir.c_str()); + } else if (strcmp(ARG_NAME_CLUSTERS, argv[i]) == 0) { + CHECK_ARG; + clusters = argv[++i]; + } else if (strcmp(ARG_NAME_BOOTCLASS, argv[i]) == 0) { + CHECK_ARG; + bootclass = argv[++i]; + } else if (strcmp(ARG_NAME_JDKHOME, argv[i]) == 0) { + CHECK_ARG; + jdkhome = argv[++i]; + if (!jvmLauncher.initialize(jdkhome.c_str())) { + logMsg("Cannot locate java installation in specified jdkhome: %s", jdkhome.c_str()); + string errMsg = "Cannot locate java installation in specified jdkhome:\n"; + errMsg += jdkhome; + errMsg += "\nDo you want to try to use default version?"; + jdkhome = ""; + if (::MessageBox(NULL, errMsg.c_str(), "Invalid jdkhome specified", MB_ICONQUESTION | MB_YESNO) == IDNO) { + return false; + } + } + } else if (strcmp(ARG_NAME_CP_PREPEND, argv[i]) == 0 + || strcmp(ARG_NAME_CP_PREPEND + 1, argv[i]) == 0) { + CHECK_ARG; + cpBefore += argv[++i]; + } else if (strcmp(ARG_NAME_CP_APPEND, argv[i]) == 0 + || strcmp(ARG_NAME_CP_APPEND + 1, argv[i]) == 0 + || strncmp(ARG_NAME_CP_APPEND + 1, argv[i], 3) == 0 + || strncmp(ARG_NAME_CP_APPEND, argv[i], 4) == 0) { + CHECK_ARG; + cpAfter += argv[++i]; + } else if (strncmp("-J", argv[i], 2) == 0) { + javaOptions.push_back(argv[i] + 2); + } else { + if (strcmp(argv[i], "-h") == 0 + || strcmp(argv[i], "-help") == 0 + || strcmp(argv[i], "--help") == 0 + || strcmp(argv[i], "/?") == 0) { + FILE *console = fopen("CON", "a"); + if (console) { + fprintf(console, "%s", HELP_MSG); + fclose(console); + } + } + progArgs.push_back(argv[i]); + } + } + return true; +} + +bool PlatformLauncher::processAutoUpdateCL() { + auClusters = ""; + logMsg("processAutoUpdateCL()..."); + if (userDir.empty()) { + logMsg("\tuserdir empty, quiting"); + return false; + } + string listPath = userDir; + listPath += "\\update\\download\\netbeans.dirs"; + + WIN32_FIND_DATA fd = {0}; + HANDLE hFind = 0; + hFind = FindFirstFile(listPath.c_str(), &fd); + if (hFind == INVALID_HANDLE_VALUE) { + logMsg("File \"%s\" does not exist", listPath.c_str()); + return false; + } + FindClose(hFind); + + FILE *file = fopen(listPath.c_str(), "r"); + if (!file) { + logErr(true, false, "Cannot open file %s", listPath.c_str()); + return false; + } + + int len = fd.nFileSizeLow + 1; + char *str = new char[len]; + if (!fgets(str, len, file)) { + fclose(file); + delete[] str; + logErr(true, false, "Cannot read from file %s", listPath.c_str()); + return false; + } + len = strlen(str) - 1; + if (str[len] == '\n') { + str[len] = '\0'; + } + + auClusters = str; + fclose(file); + delete[] str; + return true; +} + +// check if new updater exists, if exists install it (replace old one) and remove ...\new_updater directory +bool PlatformLauncher::checkForNewUpdater(const char *basePath) { + logMsg("checkForNewUpdater() at %s", basePath); + string srcPath = basePath; + srcPath += "\\update\\new_updater\\updater.jar"; + WIN32_FIND_DATA fd = {0}; + HANDLE hFind = FindFirstFile(srcPath.c_str(), &fd); + if (hFind != INVALID_HANDLE_VALUE) { + logMsg("New updater found: %s", srcPath.c_str()); + FindClose(hFind); + string destPath = basePath; + destPath += "\\modules\\ext\\updater.jar"; + createPath(destPath.c_str()); + + if (!MoveFileEx(srcPath.c_str(), destPath.c_str(), MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH)) { + logErr(true, false, "Failed to move \"%s\" to \"%s\"", srcPath.c_str(), destPath.c_str()); + return false; + } + + srcPath.erase(srcPath.rfind('\\')); + logMsg("Removing directory \"%s\"", srcPath.c_str()); + if (!RemoveDirectory(srcPath.c_str())) { + logErr(true, false, "Failed to remove directory \"%s\"", srcPath.c_str()); + } + } else { + logMsg("No new updater at %s", srcPath.c_str()); + } + return true; +} + +bool PlatformLauncher::shouldAutoUpdate(bool firstStart, const char *basePath) { + // The logic is following: + // if there is an NBM for installation then run updater + // unless it is not a first start and we asked to install later (on next start) + + // then also check if last run left list of modules to disable/uninstall and + // did not mark them to be deactivated later (on next start) + string path = basePath; + path += "\\update\\download\\*.nbm"; + logMsg("Checking for updates: %s", path.c_str()); + WIN32_FIND_DATA fd; + HANDLE hFindNbms = FindFirstFile(path.c_str(), &fd); + if (hFindNbms != INVALID_HANDLE_VALUE) { + logMsg("Some updates found."); + FindClose(hFindNbms); + } + + path = basePath; + path += "\\update\\download\\install_later.xml"; + HANDLE hFind = FindFirstFile(path.c_str(), &fd); + if (hFind != INVALID_HANDLE_VALUE) { + logMsg("install_later.xml found: %s", path.c_str()); + FindClose(hFind); + } + + if (hFindNbms != INVALID_HANDLE_VALUE && (firstStart || hFind == INVALID_HANDLE_VALUE)) { + return true; + } + + path = basePath; + path += "\\update\\deactivate\\deactivate_later.txt"; + hFind = FindFirstFile(path.c_str(), &fd); + if (hFind != INVALID_HANDLE_VALUE) { + logMsg("deactivate_later.txt found: %s", path.c_str()); + FindClose(hFind); + } + + if (firstStart || hFind == INVALID_HANDLE_VALUE) { + path = basePath; + path += "\\update\\deactivate\\to_disable.txt"; + hFind = FindFirstFile(path.c_str(), &fd); + if (hFind != INVALID_HANDLE_VALUE) { + logMsg("to_disable.txt found: %s", path.c_str()); + FindClose(hFind); + return true; + } + + path = basePath; + path += "\\update\\deactivate\\to_uninstall.txt"; + hFind = FindFirstFile(path.c_str(), &fd); + if (hFind != INVALID_HANDLE_VALUE) { + logMsg("to_uninstall.txt found: %s", path.c_str()); + FindClose(hFind); + return true; + } + } + + return false; +} + +bool PlatformLauncher::shouldAutoUpdateClusters(bool firstStart) { + bool runUpdater = false; + string cl = processAutoUpdateCL() ? auClusters : clusters; + checkForNewUpdater(platformDir.c_str()); + runUpdater = shouldAutoUpdate(firstStart, platformDir.c_str()); + + const char delim = ';'; + string::size_type start = cl.find_first_not_of(delim, 0); + string::size_type end = cl.find_first_of(delim, start); + while (string::npos != end || string::npos != start) { + string cluster = cl.substr(start, end - start); + checkForNewUpdater(cluster.c_str()); + if (!runUpdater) { + runUpdater = shouldAutoUpdate(firstStart, cluster.c_str()); + } + start = cl.find_first_not_of(delim, end); + end = cl.find_first_of(delim, start); + } + + checkForNewUpdater(userDir.c_str()); + if (!runUpdater) { + runUpdater = shouldAutoUpdate(firstStart, userDir.c_str()); + } + return runUpdater; +} + +void PlatformLauncher::prepareOptions() { + string option = OPT_JDK_HOME; + option += jdkhome; + javaOptions.push_back(option); + + option = OPT_NB_PLATFORM_HOME; + option += platformDir; + javaOptions.push_back(option); + + option = OPT_NB_CLUSTERS; + option += auClusters.empty() ? clusters : auClusters; + javaOptions.push_back(option); + + option = OPT_NB_USERDIR; + option += userDir; + javaOptions.push_back(option); + + option = OPT_HEAP_DUMP; + javaOptions.push_back(option); + + option = OPT_HEAP_DUMP_PATH; + option += userDir; + option += HEAP_DUMP_PATH; + javaOptions.push_back(option); + + string proxy, nonProxy, socksProxy; + if (!findHttpProxyFromEnv(proxy)) { + findProxiesFromRegistry(proxy, nonProxy, socksProxy); + } + if (!proxy.empty()) { + option = OPT_HTTP_PROXY; + option += proxy; + javaOptions.push_back(option); + } + if (!nonProxy.empty()) { + option = OPT_HTTP_NONPROXY; + option += nonProxy; + javaOptions.push_back(option); + } + if (!socksProxy.empty()) { + option = OPT_SOCKS_PROXY; + option += socksProxy; + javaOptions.push_back(option); + } + + option = OPT_KEEP_WORKING_SET_ON_MINIMIZE; + javaOptions.push_back(option); +} + +// Reads value of http_proxy environment variable to use it as proxy setting +bool PlatformLauncher::findHttpProxyFromEnv(string &proxy) { + logMsg("findHttpProxyFromEnv()"); + char *envVar = getenv("http_proxy"); + if (envVar) { + // is it URL? + int prefixLen = strlen("http://"); + if (strncmp(envVar, "http://", prefixLen) == 0 && envVar[strlen(envVar) - 1] == '/' + && strlen(envVar) > strlen("http://")) { + // trim URL part to keep only 'host[:port]' + proxy = envVar + prefixLen; + proxy.erase(proxy.size() - 1); + logMsg("Found proxy in environment variable: %s", proxy.c_str()); + return true; + } + } + return false; +} + +bool PlatformLauncher::findProxiesFromRegistry(string &proxy, string &nonProxy, string &socksProxy) { + logMsg("findProxiesFromRegistry()"); + socksProxy = nonProxy = proxy = ""; + DWORD proxyEnable = 0; + if (!getDwordFromRegistry(HKEY_CURRENT_USER, REG_PROXY_KEY, REG_PROXY_ENABLED_NAME, proxyEnable)) { + return false; + } + + if (!proxyEnable) { + logMsg("Proxy disabled"); + proxy = PROXY_DIRECT; + return true; + } + + string proxyServer; + if (!getStringFromRegistry(HKEY_CURRENT_USER, REG_PROXY_KEY, REG_PROXY_SERVER_NAME, proxyServer)) { + return false; + } + + if (proxyServer.find('=') == string::npos) { + proxy = proxyServer; + } else { + string::size_type pos = proxyServer.find("socks="); + if (pos != string::npos) { + if (proxyServer.size() > pos + 1 && proxyServer.at(pos) != ';') { + string::size_type endPos = proxyServer.find(';', pos); + socksProxy = proxyServer.substr(pos, endPos == string::npos ? string::npos : endPos - pos); + } + } + pos = proxyServer.find("http="); + if (pos != string::npos) { + string::size_type endPos = proxyServer.find(';', pos); + proxy = proxyServer.substr(pos, endPos == string::npos ? string::npos : endPos - pos); + } + } + logMsg("Proxy servers:\n\tproxy: %s\n\tsocks proxy: %s\n\tnonProxy: %s", proxy.c_str(), socksProxy.c_str(), nonProxy.c_str()); + getStringFromRegistry(HKEY_CURRENT_USER, REG_PROXY_KEY, REG_PROXY_OVERRIDE_NAME, nonProxy); + return true; +} + +string & PlatformLauncher::constructClassPath(bool runUpdater) { + logMsg("getClassPath()"); + addedToCP.clear(); + classPath = cpBefore; + + addJarsToClassPathFrom(userDir.c_str()); + addJarsToClassPathFrom(platformDir.c_str()); + + if (runUpdater) { + string userUpdaterPath = userDir; + userUpdaterPath += "\\modules\\ext\\updater.jar"; + const char *baseUpdaterPath = fileExists(userUpdaterPath.c_str()) ? userDir.c_str() : platformDir.c_str(); + addToClassPath(baseUpdaterPath, "\\modules\\ext\\updater.jar"); + addFilesToClassPath(baseUpdaterPath, "\\modules\\ext\\locale", "updater_*.jar"); + } + + addToClassPath((jdkhome + "\\lib\\dt.jar").c_str(), true); + addToClassPath((jdkhome + "\\lib\\tools.jar").c_str(), true); + + classPath += cpAfter; + logMsg("ClassPath: %s", classPath.c_str()); + return classPath; +} + +void PlatformLauncher::addJarsToClassPathFrom(const char *dir) { + addFilesToClassPath(dir, "lib\\patches", "*.jar"); + addFilesToClassPath(dir, "lib\\patches", "*.zip"); + + addFilesToClassPath(dir, "lib", "*.jar"); + addFilesToClassPath(dir, "lib", "*.zip"); + + addFilesToClassPath(dir, "lib\\locale", "*.jar"); + addFilesToClassPath(dir, "lib\\locale", "*.zip"); +} + +void PlatformLauncher::addFilesToClassPath(const char *dir, const char *subdir, const char *pattern) { + logMsg("addFilesToClassPath()\n\tdir: %s\n\tsubdir: %s\n\tpattern: %s", dir, subdir, pattern); + string path = dir; + path += '\\'; + path += subdir; + path += '\\'; + + WIN32_FIND_DATA fd = {0}; + string patternPath = path + pattern; + HANDLE hFind = FindFirstFile(patternPath.c_str(), &fd); + if (hFind == INVALID_HANDLE_VALUE) { + logMsg("Nothing found (%s)", patternPath.c_str()); + return; + } + do { + string name = subdir; + name += fd.cFileName; + string fullName = path + fd.cFileName; + if (addedToCP.insert(name).second) { + addToClassPath(fullName.c_str()); + } else { + logMsg("\"%s\" already added, skipping \"%s\"", name.c_str(), fullName.c_str()); + } + } while (FindNextFile(hFind, &fd)); + FindClose(hFind); +} + +void PlatformLauncher::addToClassPath(const char *path, bool onlyIfExists) { + logMsg("addToClassPath()\n\tpath: %s\n\tonlyIfExists: %s", path, onlyIfExists ? "true" : "false"); + if (onlyIfExists && !fileExists(path)) { + return; + } + + if (!classPath.empty()) { + classPath += ';'; + } + classPath += path; +} diff --git a/o.n.bootstrap/launcher/windows/platformlauncher.h b/o.n.bootstrap/launcher/windows/platformlauncher.h new file mode 100644 --- /dev/null +++ b/o.n.bootstrap/launcher/windows/platformlauncher.h @@ -0,0 +1,122 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 1997-2008 Sun Microsystems, Inc. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun + * Microsystems, Inc. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Author: Tomas Holy + */ + +#ifndef _PLATFORMLAUNCHER_H +#define _PLATFORMLAUNCHER_H + +#include "jvmlauncher.h" +#include +#include +#include + +class PlatformLauncher { + static const char *REQ_JAVA_VERSION; + static const char *HELP_MSG; + static const char *REG_PROXY_KEY; + static const char *REG_PROXY_ENABLED_NAME; + static const char *REG_PROXY_SERVER_NAME; + static const char *REG_PROXY_OVERRIDE_NAME; + + static const char *PROXY_DIRECT; + static const char *HEAP_DUMP_PATH; + + static const char *OPT_JDK_HOME; + static const char *OPT_NB_PLATFORM_HOME; + static const char *OPT_NB_CLUSTERS; + static const char *OPT_NB_USERDIR; + static const char *OPT_HTTP_PROXY; + static const char *OPT_HTTP_NONPROXY; + static const char *OPT_SOCKS_PROXY; + static const char *OPT_HEAP_DUMP; + static const char *OPT_HEAP_DUMP_PATH; + static const char *OPT_KEEP_WORKING_SET_ON_MINIMIZE; + static const char *OPT_CLASS_PATH; + + static const char *UPDATER_MAIN_CLASS; + static const char *IDE_MAIN_CLASS; + + +public: + PlatformLauncher(); + virtual ~PlatformLauncher(); + + bool start(char* argv[], int argc, DWORD *retCode); + +private: + PlatformLauncher(const PlatformLauncher& orig); + bool parseArgs(int argc, char *argv[]); + bool initPlatformDir(); + bool processAutoUpdateCL(); + bool checkForNewUpdater(const char *basePath); + bool shouldAutoUpdate(bool firstStart, const char *basePath); + bool shouldAutoUpdateClusters(bool firstStart); + void prepareOptions(); + bool findHttpProxyFromEnv(std::string &proxy); + bool findProxiesFromRegistry(std::string &proxy, std::string &nonProxy, std::string &socksProxy); + std::string & constructClassPath(bool runUpdater); + void addFilesToClassPath(const char *dir, const char *subdir, const char *pattern); + void addToClassPath(const char *path, bool onlyIfExists = false); + void addJarsToClassPathFrom(const char *dir); + bool run(bool updater, DWORD *retCode); + +private: + bool separateProcess; + std::string platformDir; + std::string userDir; + std::string clusters; + std::string bootclass; + std::string jdkhome; + std::string cpBefore; + std::string cpAfter; + + std::string auClusters; + + std::list javaOptions; + std::list progArgs; + JvmLauncher jvmLauncher; + std::set addedToCP; + std::string classPath; +}; + +#endif /* _PLATFORMLAUNCHER_H */ + diff --git a/o.n.bootstrap/launcher/windows/utilsfuncs.cpp b/o.n.bootstrap/launcher/windows/utilsfuncs.cpp new file mode 100644 --- /dev/null +++ b/o.n.bootstrap/launcher/windows/utilsfuncs.cpp @@ -0,0 +1,311 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 1997-2008 Sun Microsystems, Inc. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun + * Microsystems, Inc. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Author: Tomas Holy + */ + +#include "utilsfuncs.h" +#include "argnames.h" + +using namespace std; + +bool disableFolderVirtualization(HANDLE hProcess) { + OSVERSIONINFO osvi = {0}; + osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); + if (GetVersionEx(&osvi) && osvi.dwMajorVersion == 6) // check it is Win VISTA + { + HANDLE hToken; + if (OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken)) { + DWORD tokenInfoVal = 0; + if (!SetTokenInformation(hToken, (TOKEN_INFORMATION_CLASS) 24, &tokenInfoVal, sizeof (DWORD))) { + // invalid token information class (24) is OK, it means there is no folder virtualization on current system + if (GetLastError() != ERROR_INVALID_PARAMETER) { + logErr(true, true, "Failed to set token information."); + return false; + } + } + CloseHandle(hToken); + } else { + logErr(true, true, "Failed to open process token."); + return false; + } + } + return true; +} + +bool getStringFromRegistry(HKEY rootKey, const char *keyName, const char *valueName, string &value) { + logMsg("getStringFromRegistry()\n\tkeyName: %s\n\tvalueName: %s", keyName, valueName); + HKEY hKey = 0; + if (RegOpenKeyEx(rootKey, keyName, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { + DWORD valSize = 4096; + DWORD type = 0; + char val[4096] = ""; + if (RegQueryValueEx(hKey, valueName, 0, &type, (BYTE *) val, &valSize) == ERROR_SUCCESS + && type == REG_SZ) { + logMsg("%s: %s", valueName, val); + RegCloseKey(hKey); + value = val; + return true; + } else { + logErr(true, false, "RegQueryValueEx() failed."); + } + RegCloseKey(hKey); + } else { + logErr(true, false, "RegOpenKeyEx() failed."); + } + return false; +} + +bool getDwordFromRegistry(HKEY rootKey, const char *keyName, const char *valueName, DWORD &value) { + logMsg("getDwordFromRegistry()\n\tkeyName: %s\n\tvalueName: %s", keyName, valueName); + HKEY hKey = 0; + if (RegOpenKeyEx(rootKey, keyName, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { + DWORD valSize = sizeof(DWORD); + DWORD type = 0; + if (RegQueryValueEx(hKey, valueName, 0, &type, (BYTE *) &value, &valSize) == ERROR_SUCCESS + && type == REG_DWORD) { + logMsg("%s: %u", valueName, value); + RegCloseKey(hKey); + return true; + } else { + logErr(true, false, "RegQueryValueEx() failed."); + } + RegCloseKey(hKey); + } else { + logErr(true, false, "RegOpenKeyEx() failed."); + } + return false; +} + +bool dirExists(const char *path) { + WIN32_FIND_DATA fd = {0}; + HANDLE hFind = 0; + hFind = FindFirstFile(path, &fd); + if (hFind == INVALID_HANDLE_VALUE) { + return false; + } + FindClose(hFind); + return (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; +} + +bool fileExists(const char *path) { + WIN32_FIND_DATA fd = {0}; + HANDLE hFind = 0; + hFind = FindFirstFile(path, &fd); + if (hFind == INVALID_HANDLE_VALUE) { + logMsg("File \"%s\" does not exist", path); + return false; + } + + logMsg("File \"%s\" exists", path); + FindClose(hFind); + return true; +} + +bool normalizePath(char *path) { + char tmp[MAX_PATH] = ""; + int i = 0; + while (path[i] && i < MAX_PATH - 1) { + tmp[i] = path[i] == '/' ? '\\' : path[i]; + i++; + } + tmp[i] = '\0'; + return _fullpath(path, tmp, MAX_PATH) != NULL; +} + +bool createPath(const char *path) { + logMsg("Creating directory \"%s\"", path); + char dir[MAX_PATH] = ""; + const char *sep = strchr(path, '\\'); + while (sep) { + strncpy(dir, path, sep - path); + if (!CreateDirectory(dir, 0) && GetLastError() != ERROR_ALREADY_EXISTS) { + logErr(true, false, "Failed to create directory %s", dir); + return false; + } + sep = strchr(sep + 1, '\\'); + } + return true; +} + + +char * getCurrentModulePath(char *path, int pathLen) { + MEMORY_BASIC_INFORMATION mbi; + static int dummy; + VirtualQuery(&dummy, &mbi, sizeof (mbi)); + HMODULE hModule = (HMODULE) mbi.AllocationBase; + GetModuleFileName(hModule, path, pathLen); + return path; +} + +char * skipWhitespaces(char *str) { + while (*str != '\0' && (*str == ' ' || *str == '\t' || *str == '\n' || *str == '\r')) { + str++; + } + return str; +} + +char * trimWhitespaces(char *str) { + char *end = str + strlen(str) - 1; + while (end >= str && (*end == ' ' || *end == '\t' || *end == '\n' || *end == '\r')) { + *end = '\0'; + end--; + } + return end; +} + +char* getSysError(char *str, int strSize) { + int err = GetLastError(); + LPTSTR lpMsgBuf; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + err, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) & lpMsgBuf, + 0, + NULL + ); + LPTSTR tmp = strchr(lpMsgBuf, '\r'); + if (tmp != NULL) { + *tmp = '\0'; + } + + _snprintf(str, strSize, " %s (%u)", lpMsgBuf, err); + LocalFree(lpMsgBuf); + return str; +} + +string gLogFileName; + +void logV(bool appendSysError, bool showMsgBox, const char *format, va_list args) { + char msg[4096] = ""; + vsnprintf(msg, 4096, format, args); + + if (appendSysError) { + char sysErr[512] = ""; + getSysError(sysErr, 512); + strncat(msg, sysErr, 4096 - strlen(msg)); + } + + if (!gLogFileName.empty()) { + FILE *file = fopen(gLogFileName.c_str(), "a"); + if (file) { + fprintf(file, "%s\n", msg); + fclose(file); + } + } + + if (showMsgBox) { + ::MessageBox(NULL, msg, "Error", MB_OK | MB_ICONSTOP); + } +} + +void logErr(bool appendSysError, bool showMsgBox, const char *format, ...) { + va_list args; + va_start(args, format); + logV(appendSysError, showMsgBox, format, args); +} + +void logMsg(const char *format, ...) { + va_list args; + va_start(args, format); + logV(false, false, format, args); +} + +bool checkLoggingArg(int argc, char *argv[], bool delFile) { + for (int i = 0; i < argc; i++) { + if (strcmp(ARG_NAME_LAUNCHER_LOG, argv[i]) == 0) { + if (i + 1 == argc) { + logErr(false, true, "Argument is missing for \"%s\" option.", argv[i]); + return false; + } + gLogFileName = argv[++i]; + if (delFile) { + DeleteFile(gLogFileName.c_str()); + } + break; + } + } + return true; +} + +bool setUpProcess(int &argc, char *argv[]) { + for (int i = 0; i < argc; i++) { + if (strcmp(ARG_NAME_CONSOLE, argv[i]) == 0) { + if (i + 1 == argc) { + logErr(false, true, "Argument is missing for \"%s\" option.", argv[i]); + return false; + } + if (strcmp("new", argv[i + 1]) == 0){ + AllocConsole(); + } else if (strcmp("suppress", argv[i + 1]) == 0) { + // nothing, no console should be attached + } else { + logErr(false, true, "Invalid argument for \"%s\" option.", argv[i]); + return false; + } + // remove options + for (int k = i + 2; k < argc; k++) { + argv[k-2] = argv[k]; + } + argc -= 2; + return true; + } + } + + // default, attach to parent process console if exists + // AttachConsole exists since WinXP, so be nice and do it dynamically + typedef BOOL (WINAPI *LPFAC)(DWORD dwProcessId); + HINSTANCE hKernel32 = GetModuleHandle("kernel32"); + if (hKernel32) { + LPFAC attachConsole = (LPFAC) GetProcAddress(hKernel32, "AttachConsole"); + if (attachConsole) { + if (!attachConsole((DWORD)-1)) { + logErr(true, false, "AttachConsole failed."); + } + } else { + logErr(true, false, "GetProcAddress() for AttachConsole failed."); + } + } + return true; +} diff --git a/o.n.bootstrap/launcher/windows/utilsfuncs.h b/o.n.bootstrap/launcher/windows/utilsfuncs.h new file mode 100644 --- /dev/null +++ b/o.n.bootstrap/launcher/windows/utilsfuncs.h @@ -0,0 +1,66 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 1997-2008 Sun Microsystems, Inc. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun + * Microsystems, Inc. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Author: Tomas Holy + */ + +#ifndef _UTILSFUNCS_H +#define _UTILSFUNCS_H + +#include +#include + +bool disableFolderVirtualization(HANDLE hProcess); +bool getStringFromRegistry(HKEY rootKey, const char *keyName, const char *valueName, std::string &value); +bool getDwordFromRegistry(HKEY rootKey, const char *keyName, const char *valueName, DWORD &value); +bool dirExists(const char *path); +bool fileExists(const char *path); +bool normalizePath(char *path); +bool createPath(const char *path); +char * getCurrentModulePath(char *path, int pathLen); +char * skipWhitespaces(char *str); +char * trimWhitespaces(char *str); +void logMsg(const char *format, ...); +void logErr(bool appendSysError, bool showMsgBox, const char *format, ...); +bool checkLoggingArg(int argc, char *argv[], bool delFile); +bool setUpProcess(int &argc, char *argv[]); + +#endif /* _UTILSFUNCS_H */ +