mirror of
https://github.com/moparisthebest/davmail
synced 2024-12-14 19:52:21 -05:00
234 lines
6.6 KiB
C++
234 lines
6.6 KiB
C++
|
/*
|
||
|
JSmooth: a VM wrapper toolkit for Windows
|
||
|
Copyright (C) 2003-2007 Rodrigo Reyes <reyes@charabia.net>
|
||
|
|
||
|
This library is free software; you can redistribute it and/or
|
||
|
modify it under the terms of the GNU Library General Public
|
||
|
License as published by the Free Software Foundation; either
|
||
|
version 2 of the License, or (at your option) any later version.
|
||
|
|
||
|
This library is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
Library General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU Library General Public
|
||
|
License along with this library; if not, write to the Free
|
||
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||
|
|
||
|
*/
|
||
|
|
||
|
#include "SunJVMLauncher.h"
|
||
|
#include "Process.h"
|
||
|
|
||
|
#include "SunJVMDLL.h"
|
||
|
#include "JArgs.h"
|
||
|
#include "JClassProxy.h"
|
||
|
|
||
|
extern "C" {
|
||
|
static jint JNICALL myvprintf(FILE *fp, const char *format, va_list args)
|
||
|
{
|
||
|
DEBUG("MYPRINTF");
|
||
|
}
|
||
|
void JNICALL myexit(jint code)
|
||
|
{
|
||
|
DEBUG("EXIT CALLED FROM JVM DLL");
|
||
|
exit(code);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
std::string SunJVMLauncher::toString() const
|
||
|
{
|
||
|
return "<" + JavaHome + "><" + RuntimeLibPath + "><" + VmVersion.toString() + ">";
|
||
|
}
|
||
|
|
||
|
bool SunJVMLauncher::run(ResourceManager& resource, const string& origin, bool justInstanciate)
|
||
|
{
|
||
|
DEBUG("Running now " + this->toString() + ", instanciate=" + (justInstanciate?"yes":"no"));
|
||
|
|
||
|
Version max(resource.getProperty(ResourceManager:: KEY_MAXVERSION));
|
||
|
Version min(resource.getProperty(ResourceManager:: KEY_MINVERSION));
|
||
|
|
||
|
// patch proposed by zregvart: if you're using bundeled JVM, you
|
||
|
// apriori know the version bundled and we can trust. The version
|
||
|
// check is therefore unrequired.
|
||
|
if (origin != "bundled") {
|
||
|
|
||
|
if (VmVersion.isValid() == false)
|
||
|
{
|
||
|
DEBUG("No version identified for " + toString());
|
||
|
SunJVMExe exe(this->JavaHome);
|
||
|
VmVersion = exe.guessVersion();
|
||
|
DEBUG("Version found: " + VmVersion.toString());
|
||
|
}
|
||
|
|
||
|
if (VmVersion.isValid() == false)
|
||
|
{
|
||
|
DEBUG("No version found, can't instanciate DLL without it");
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (min.isValid() && (VmVersion < min))
|
||
|
return false;
|
||
|
|
||
|
if (max.isValid() && (max < VmVersion))
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
DEBUG("Launching " + toString());
|
||
|
|
||
|
//
|
||
|
// search for the dll if it's not set in the registry, or if the
|
||
|
// file doesn't exist
|
||
|
//
|
||
|
if ( (this->JavaHome.size()>0)
|
||
|
&& ((this->RuntimeLibPath.size() == 0) || (!FileUtils::fileExists(this->RuntimeLibPath))) )
|
||
|
{
|
||
|
std::string assump = FileUtils::concFile(this->JavaHome, "jre\\bin\\jvm.dll");
|
||
|
std::string assump2 = FileUtils::concFile(this->JavaHome, "jre\\bin\\server\\jvm.dll"); // for JRE 1.5+
|
||
|
std::string assump3 = FileUtils::concFile(this->JavaHome, "jre\\bin\\client\\jvm.dll"); // for JRE 1.5+
|
||
|
std::string assump4 = FileUtils::concFile(this->JavaHome, "bin\\javai.dll"); // For JRE 1.1
|
||
|
|
||
|
if (FileUtils::fileExists(assump))
|
||
|
this->RuntimeLibPath = assump;
|
||
|
else if (FileUtils::fileExists(assump2))
|
||
|
this->RuntimeLibPath = assump2;
|
||
|
else if (FileUtils::fileExists(assump3))
|
||
|
this->RuntimeLibPath = assump3;
|
||
|
else if (FileUtils::fileExists(assump4))
|
||
|
this->RuntimeLibPath = assump4;
|
||
|
else
|
||
|
{
|
||
|
vector<string> dlls = FileUtils::recursiveSearch(this->JavaHome, string("jvm.dll"));
|
||
|
if (dlls.size() > 0)
|
||
|
this->RuntimeLibPath = dlls[0];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (FileUtils::fileExists(this->RuntimeLibPath))
|
||
|
{
|
||
|
DEBUG("RuntimeLibPath used: " + this->RuntimeLibPath);
|
||
|
Version v = this->VmVersion;
|
||
|
if (!v.isValid())
|
||
|
{
|
||
|
v = min;
|
||
|
if (!v.isValid())
|
||
|
v = Version("1.2.0");
|
||
|
DEBUG("No version, trying with " + v.toString());
|
||
|
}
|
||
|
|
||
|
m_dllrunner = new SunJVMDLL(this->RuntimeLibPath, v);
|
||
|
// set up the vm parameters...
|
||
|
setupVM(resource, m_dllrunner);
|
||
|
|
||
|
if (justInstanciate)
|
||
|
return m_dllrunner->instanciate();
|
||
|
else
|
||
|
return m_dllrunner->run(resource.getProperty(ResourceManager::KEY_MAINCLASSNAME),
|
||
|
true);
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
bool SunJVMLauncher::runProc(ResourceManager& resource, bool useConsole, const string& origin)
|
||
|
{
|
||
|
std::string classname = resource.getProperty(string(ResourceManager::KEY_MAINCLASSNAME));
|
||
|
|
||
|
if (VmVersion.isValid() == false)
|
||
|
{
|
||
|
DEBUG("No version identified for " + toString());
|
||
|
SunJVMExe exe(this->JavaHome);
|
||
|
VmVersion = exe.guessVersion();
|
||
|
DEBUG("Version found: " + VmVersion.toString());
|
||
|
}
|
||
|
|
||
|
if (VmVersion.isValid() == false)
|
||
|
return false;
|
||
|
|
||
|
if (origin != "bundled") {
|
||
|
|
||
|
Version max(resource.getProperty(ResourceManager:: KEY_MAXVERSION));
|
||
|
Version min(resource.getProperty(ResourceManager:: KEY_MINVERSION));
|
||
|
|
||
|
if (min.isValid() && (VmVersion < min))
|
||
|
return false;
|
||
|
|
||
|
if (max.isValid() && (max < VmVersion))
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
SunJVMExe exe(this->JavaHome, VmVersion);
|
||
|
setupVM(resource, &exe);
|
||
|
if (exe.run(classname, useConsole))
|
||
|
{
|
||
|
m_exitCode = exe.getExitCode();
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
bool SunJVMLauncher::setupVM(ResourceManager& resource, JVMBase* vm)
|
||
|
{
|
||
|
//
|
||
|
// create the properties array
|
||
|
const vector<JavaProperty>& jprops = resource.getJavaProperties();
|
||
|
for (int i=0; i<jprops.size(); i++)
|
||
|
{
|
||
|
vm->addProperty(jprops[i]);
|
||
|
}
|
||
|
|
||
|
if (resource.getProperty("maxheap") != "")
|
||
|
vm->setMaxHeap( StringUtils::parseInt(resource.getProperty("maxheap") ));
|
||
|
|
||
|
if (resource.getProperty("initialheap") != "")
|
||
|
vm->setInitialHeap( StringUtils::parseInt(resource.getProperty("initialheap") ));
|
||
|
|
||
|
if (resource.getProperty("vmparameter") != "")
|
||
|
vm->setVmParameter( resource.getProperty("vmparameter") );
|
||
|
|
||
|
if (resource.useEmbeddedJar())
|
||
|
{
|
||
|
std::string embj = resource.saveJarInTempFile();
|
||
|
vm->addPathElement(embj);
|
||
|
}
|
||
|
|
||
|
std::string jnijar = resource.saveJnismoothInTempFile();
|
||
|
if (jnijar != "")
|
||
|
vm->addPathElement(jnijar);
|
||
|
|
||
|
//
|
||
|
// Define the classpath
|
||
|
std::vector<std::string> classpath = resource.getNormalizedClassPathVector();
|
||
|
for (int i=0; i<classpath.size(); i++)
|
||
|
{
|
||
|
vm->addPathElement(classpath[i]);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Defines the arguments passed to the java application
|
||
|
// vm->setArguments(resource.getProperty(ResourceManager::KEY_ARGUMENTS));
|
||
|
std::vector<std::string> args = resource.getArguments();
|
||
|
for (int i=0; i<args.size(); i++)
|
||
|
{
|
||
|
vm->addArgument(args[i]);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
SunJVMDLL* SunJVMLauncher::getDLL()
|
||
|
{
|
||
|
return m_dllrunner;
|
||
|
}
|
||
|
|
||
|
bool operator < (const SunJVMLauncher& v1, const SunJVMLauncher& v2)
|
||
|
{
|
||
|
return v1.VmVersion < v2.VmVersion;
|
||
|
}
|
||
|
|
||
|
int SunJVMLauncher::getExitCode()
|
||
|
{
|
||
|
return m_exitCode;
|
||
|
}
|
||
|
|