1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_jvmfwk.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <stdio.h>
28*b1cdbd2cSJim Jagielski #include <stdlib.h>
29*b1cdbd2cSJim Jagielski #include <string.h>
30*b1cdbd2cSJim Jagielski #include "sal/main.h"
31*b1cdbd2cSJim Jagielski #include "sal/types.h"
32*b1cdbd2cSJim Jagielski #include "osl/thread.h"
33*b1cdbd2cSJim Jagielski #include "rtl/ustring.hxx"
34*b1cdbd2cSJim Jagielski #include "rtl/byteseq.hxx"
35*b1cdbd2cSJim Jagielski #include "jvmfwk/framework.h"
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski using namespace rtl;
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski #define OUSTR(x) OUString(RTL_CONSTASCII_USTRINGPARAM( x ))
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski static sal_Bool hasOption(char const * szOption, int argc, char** argv);
42*b1cdbd2cSJim Jagielski static rtl::OString getLD_LIBRARY_PATH(const rtl::ByteSequence & vendorData);
43*b1cdbd2cSJim Jagielski static bool findAndSelect(JavaInfo**);
44*b1cdbd2cSJim Jagielski //static sal_Bool printPaths(const OUString& sPathFile);
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski #define HELP_TEXT    \
47*b1cdbd2cSJim Jagielski "\njavaldx is necessary to make Java work on some UNIX platforms." \
48*b1cdbd2cSJim Jagielski "It prints a string to std out that consists of directories which " \
49*b1cdbd2cSJim Jagielski "have to be included into the LD_LIBRARY_PATH variable.The setting of " \
50*b1cdbd2cSJim Jagielski "the variable usually occurs in a shell script that runs javaldx.\n" \
51*b1cdbd2cSJim Jagielski "The directories are from the chosen java installation. \n" \
52*b1cdbd2cSJim Jagielski "Options are: \n"\
53*b1cdbd2cSJim Jagielski "--help or -h\n"
54*b1cdbd2cSJim Jagielski 
SAL_IMPLEMENT_MAIN_WITH_ARGS(argc,argv)55*b1cdbd2cSJim Jagielski SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
56*b1cdbd2cSJim Jagielski {
57*b1cdbd2cSJim Jagielski     if( hasOption("--help",argc, argv) || hasOption("-h", argc, argv))
58*b1cdbd2cSJim Jagielski     {
59*b1cdbd2cSJim Jagielski         fprintf(stdout, HELP_TEXT);// default
60*b1cdbd2cSJim Jagielski         return 0;
61*b1cdbd2cSJim Jagielski     }
62*b1cdbd2cSJim Jagielski     javaFrameworkError errcode = JFW_E_NONE;
63*b1cdbd2cSJim Jagielski     sal_Bool bEnabled = sal_False;
64*b1cdbd2cSJim Jagielski     errcode = jfw_getEnabled( & bEnabled);
65*b1cdbd2cSJim Jagielski     if (errcode == JFW_E_NONE && bEnabled == sal_False)
66*b1cdbd2cSJim Jagielski     {
67*b1cdbd2cSJim Jagielski             //Do not do any preparation because that may only slow startup time.
68*b1cdbd2cSJim Jagielski         return 0;
69*b1cdbd2cSJim Jagielski     }
70*b1cdbd2cSJim Jagielski     else if (errcode != JFW_E_NONE && errcode != JFW_E_DIRECT_MODE)
71*b1cdbd2cSJim Jagielski     {
72*b1cdbd2cSJim Jagielski         fprintf(stderr,"javaldx failed!\n");
73*b1cdbd2cSJim Jagielski         return -1;
74*b1cdbd2cSJim Jagielski     }
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski     JavaInfo * pInfo = NULL;
78*b1cdbd2cSJim Jagielski     errcode = jfw_getSelectedJRE( & pInfo);
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski     if (errcode == JFW_E_INVALID_SETTINGS)
81*b1cdbd2cSJim Jagielski     {
82*b1cdbd2cSJim Jagielski         fprintf(stderr,"javaldx: invalid settings. User must select a JRE from options dialog!\n");
83*b1cdbd2cSJim Jagielski         return -1;
84*b1cdbd2cSJim Jagielski     }
85*b1cdbd2cSJim Jagielski     else if (errcode != JFW_E_NONE)
86*b1cdbd2cSJim Jagielski     {
87*b1cdbd2cSJim Jagielski         fprintf(stderr,"javaldx failed!\n");
88*b1cdbd2cSJim Jagielski         return -1;
89*b1cdbd2cSJim Jagielski     }
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski     if (pInfo == NULL)
92*b1cdbd2cSJim Jagielski     {
93*b1cdbd2cSJim Jagielski         if (false == findAndSelect(&pInfo))
94*b1cdbd2cSJim Jagielski             return -1;
95*b1cdbd2cSJim Jagielski     }
96*b1cdbd2cSJim Jagielski     else
97*b1cdbd2cSJim Jagielski     {
98*b1cdbd2cSJim Jagielski         //check if the JRE was not uninstalled
99*b1cdbd2cSJim Jagielski         sal_Bool bExist = sal_False;
100*b1cdbd2cSJim Jagielski         errcode = jfw_existJRE(pInfo, &bExist);
101*b1cdbd2cSJim Jagielski         if (errcode == JFW_E_NONE)
102*b1cdbd2cSJim Jagielski         {
103*b1cdbd2cSJim Jagielski             if (!bExist && !findAndSelect(&pInfo))
104*b1cdbd2cSJim Jagielski                 return -1;
105*b1cdbd2cSJim Jagielski         }
106*b1cdbd2cSJim Jagielski         else
107*b1cdbd2cSJim Jagielski         {
108*b1cdbd2cSJim Jagielski             fprintf(stderr, "javaldx: Could not determine if JRE still exist\n");
109*b1cdbd2cSJim Jagielski             return -1;
110*b1cdbd2cSJim Jagielski         }
111*b1cdbd2cSJim Jagielski     }
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski     //Only do something if the sunjavaplugin created this JavaInfo
114*b1cdbd2cSJim Jagielski     rtl::OUString sVendor0(RTL_CONSTASCII_USTRINGPARAM("Oracle Corporation"));
115*b1cdbd2cSJim Jagielski     rtl::OUString sVendor1(RTL_CONSTASCII_USTRINGPARAM("Sun Microsystems Inc."));
116*b1cdbd2cSJim Jagielski     rtl::OUString sVendor2(RTL_CONSTASCII_USTRINGPARAM("IBM Corporation"));
117*b1cdbd2cSJim Jagielski     rtl::OUString sVendor3(RTL_CONSTASCII_USTRINGPARAM("Blackdown Java-Linux Team"));
118*b1cdbd2cSJim Jagielski     rtl::OUString sVendor4(RTL_CONSTASCII_USTRINGPARAM("Apple Inc."));
119*b1cdbd2cSJim Jagielski     rtl::OUString sVendor5(RTL_CONSTASCII_USTRINGPARAM("Apple Computer, Inc."));
120*b1cdbd2cSJim Jagielski     rtl::OUString sVendor6(RTL_CONSTASCII_USTRINGPARAM("BEA Systems, Inc."));
121*b1cdbd2cSJim Jagielski     rtl::OUString sVendor7(RTL_CONSTASCII_USTRINGPARAM("Free Software Foundation, Inc."));
122*b1cdbd2cSJim Jagielski     rtl::OUString sVendor8(RTL_CONSTASCII_USTRINGPARAM("The FreeBSD Foundation"));
123*b1cdbd2cSJim Jagielski     rtl::OUString sVendor9(RTL_CONSTASCII_USTRINGPARAM("AdoptOpenJDK"));
124*b1cdbd2cSJim Jagielski     rtl::OUString sVendor10(RTL_CONSTASCII_USTRINGPARAM("OpenJDK"));
125*b1cdbd2cSJim Jagielski     if ( ! (sVendor0.equals(pInfo->sVendor) == sal_True
126*b1cdbd2cSJim Jagielski             || sVendor1.equals(pInfo->sVendor) == sal_True
127*b1cdbd2cSJim Jagielski             || sVendor2.equals(pInfo->sVendor) == sal_True
128*b1cdbd2cSJim Jagielski             || sVendor3.equals(pInfo->sVendor) == sal_True
129*b1cdbd2cSJim Jagielski             || sVendor4.equals(pInfo->sVendor) == sal_True
130*b1cdbd2cSJim Jagielski             || sVendor5.equals(pInfo->sVendor) == sal_True
131*b1cdbd2cSJim Jagielski             || sVendor6.equals(pInfo->sVendor) == sal_True
132*b1cdbd2cSJim Jagielski             || sVendor7.equals(pInfo->sVendor) == sal_True
133*b1cdbd2cSJim Jagielski             || sVendor8.equals(pInfo->sVendor) == sal_True
134*b1cdbd2cSJim Jagielski             || sVendor9.equals(pInfo->sVendor) == sal_True
135*b1cdbd2cSJim Jagielski             || sVendor10.equals(pInfo->sVendor) == sal_True))
136*b1cdbd2cSJim Jagielski         return 0;
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski     rtl::OString sPaths = getLD_LIBRARY_PATH(pInfo->arVendorData);
139*b1cdbd2cSJim Jagielski     fprintf(stdout, "%s\n", sPaths.getStr());
140*b1cdbd2cSJim Jagielski     jfw_freeJavaInfo(pInfo);
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski     return 0;
143*b1cdbd2cSJim Jagielski }
144*b1cdbd2cSJim Jagielski 
getLD_LIBRARY_PATH(const rtl::ByteSequence & vendorData)145*b1cdbd2cSJim Jagielski rtl::OString getLD_LIBRARY_PATH(const rtl::ByteSequence & vendorData)
146*b1cdbd2cSJim Jagielski {
147*b1cdbd2cSJim Jagielski     const sal_Unicode* chars = (sal_Unicode*) vendorData.getConstArray();
148*b1cdbd2cSJim Jagielski     sal_Int32 len = vendorData.getLength();
149*b1cdbd2cSJim Jagielski     rtl::OUString sData(chars, len / 2);
150*b1cdbd2cSJim Jagielski     //the runtime lib is on the first line
151*b1cdbd2cSJim Jagielski     sal_Int32 index = 0;
152*b1cdbd2cSJim Jagielski     rtl::OUString aToken = sData.getToken( 1, '\n', index);
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski     rtl::OString paths =
155*b1cdbd2cSJim Jagielski         rtl::OUStringToOString(aToken, osl_getThreadTextEncoding());
156*b1cdbd2cSJim Jagielski     return paths;
157*b1cdbd2cSJim Jagielski }
158*b1cdbd2cSJim Jagielski 
hasOption(char const * szOption,int argc,char ** argv)159*b1cdbd2cSJim Jagielski static sal_Bool hasOption(char const * szOption, int argc, char** argv)
160*b1cdbd2cSJim Jagielski {
161*b1cdbd2cSJim Jagielski     sal_Bool retVal= sal_False;
162*b1cdbd2cSJim Jagielski     for(sal_Int16 i= 1; i < argc; i++)
163*b1cdbd2cSJim Jagielski     {
164*b1cdbd2cSJim Jagielski         if( ! strcmp(argv[i], szOption))
165*b1cdbd2cSJim Jagielski         {
166*b1cdbd2cSJim Jagielski             retVal= sal_True;
167*b1cdbd2cSJim Jagielski             break;
168*b1cdbd2cSJim Jagielski         }
169*b1cdbd2cSJim Jagielski     }
170*b1cdbd2cSJim Jagielski     return retVal;
171*b1cdbd2cSJim Jagielski }
172*b1cdbd2cSJim Jagielski 
findAndSelect(JavaInfo ** ppInfo)173*b1cdbd2cSJim Jagielski static bool findAndSelect(JavaInfo ** ppInfo)
174*b1cdbd2cSJim Jagielski {
175*b1cdbd2cSJim Jagielski     javaFrameworkError errcode = jfw_findAndSelectJRE(ppInfo);
176*b1cdbd2cSJim Jagielski     if (errcode == JFW_E_NO_JAVA_FOUND)
177*b1cdbd2cSJim Jagielski     {
178*b1cdbd2cSJim Jagielski         fprintf(stderr,"javaldx: Could not find a Java Runtime Environment!\n");
179*b1cdbd2cSJim Jagielski         return false;
180*b1cdbd2cSJim Jagielski     }
181*b1cdbd2cSJim Jagielski     else if (errcode != JFW_E_NONE && errcode != JFW_E_DIRECT_MODE)
182*b1cdbd2cSJim Jagielski     {
183*b1cdbd2cSJim Jagielski         fprintf(stderr,"javaldx failed!\n");
184*b1cdbd2cSJim Jagielski         return false;
185*b1cdbd2cSJim Jagielski     }
186*b1cdbd2cSJim Jagielski     return true;
187*b1cdbd2cSJim Jagielski }
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski 
191