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 #if !defined INCLUDED_JFW_PLUGIN_UTIL_HXX
24*b1cdbd2cSJim Jagielski #define INCLUDED_JFW_PLUGIN_UTIL_HXX
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #include "rtl/ustring.hxx"
27*b1cdbd2cSJim Jagielski #include "rtl/bootstrap.hxx"
28*b1cdbd2cSJim Jagielski #include <vector>
29*b1cdbd2cSJim Jagielski #include "vendorbase.hxx"
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski namespace jfw_plugin
32*b1cdbd2cSJim Jagielski {
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski class VendorBase;
35*b1cdbd2cSJim Jagielski std::vector<rtl::OUString> getVectorFromCharArray(char const * const * ar, int size);
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski /*   The function uses the relative paths, such as "bin/java.exe" as provided by
38*b1cdbd2cSJim Jagielski      VendorBase::getJavaExePaths and the provided path to derive the the home directory.
39*b1cdbd2cSJim Jagielski      The home directory is then used as argument to getJREInfoByPath. For example
40*b1cdbd2cSJim Jagielski      usBinDir is file:///c:/j2sdk/jre/bin then file:///c:/j2sdk/jre would be derived.
41*b1cdbd2cSJim Jagielski  */
42*b1cdbd2cSJim Jagielski bool getJREInfoFromBinPath(
43*b1cdbd2cSJim Jagielski     const rtl::OUString& path, std::vector<rtl::Reference<VendorBase> > & vecInfos);
44*b1cdbd2cSJim Jagielski inline rtl::OUString getDirFromFile(const rtl::OUString& usFilePath);
45*b1cdbd2cSJim Jagielski void createJavaInfoFromPath(std::vector<rtl::Reference<VendorBase> >& vecInfos);
46*b1cdbd2cSJim Jagielski void createJavaInfoFromJavaHome(std::vector<rtl::Reference<VendorBase> > &vecInfos);
47*b1cdbd2cSJim Jagielski void createJavaInfoDirScan(std::vector<rtl::Reference<VendorBase> >& vecInfos);
48*b1cdbd2cSJim Jagielski #ifdef WNT
49*b1cdbd2cSJim Jagielski void createJavaInfoFromWinReg(std::vector<rtl::Reference<VendorBase> >& vecInfos);
50*b1cdbd2cSJim Jagielski #endif
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski bool makeDriveLetterSame(rtl::OUString * fileURL);
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski /* for std::find_if
56*b1cdbd2cSJim Jagielski    Used to find a JavaInfo::Impl object in a std::vector<Impl*> which has a member usJavaHome
57*b1cdbd2cSJim Jagielski    as the specified string in the constructor.
58*b1cdbd2cSJim Jagielski */
59*b1cdbd2cSJim Jagielski struct InfoFindSame
60*b1cdbd2cSJim Jagielski {
61*b1cdbd2cSJim Jagielski     rtl::OUString sJava;
InfoFindSamejfw_plugin::InfoFindSame62*b1cdbd2cSJim Jagielski     InfoFindSame(const rtl::OUString& sJavaHome):sJava(sJavaHome){}
63*b1cdbd2cSJim Jagielski 
operator ()jfw_plugin::InfoFindSame64*b1cdbd2cSJim Jagielski     bool operator () (const rtl::Reference<VendorBase> & aVendorInfo)
65*b1cdbd2cSJim Jagielski     {
66*b1cdbd2cSJim Jagielski         return aVendorInfo->getHome().equals(sJava) == sal_True ? true : false;
67*b1cdbd2cSJim Jagielski     }
68*b1cdbd2cSJim Jagielski };
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski struct SameOrSubDirJREMap
71*b1cdbd2cSJim Jagielski {
72*b1cdbd2cSJim Jagielski     rtl::OUString s1;
SameOrSubDirJREMapjfw_plugin::SameOrSubDirJREMap73*b1cdbd2cSJim Jagielski     SameOrSubDirJREMap(const rtl::OUString& s):s1(s){
74*b1cdbd2cSJim Jagielski     }
75*b1cdbd2cSJim Jagielski 
operator ()jfw_plugin::SameOrSubDirJREMap76*b1cdbd2cSJim Jagielski     bool operator () (const std::pair<const rtl::OUString, rtl::Reference<VendorBase> > & s2)
77*b1cdbd2cSJim Jagielski     {
78*b1cdbd2cSJim Jagielski         if (s1 == s2.first)
79*b1cdbd2cSJim Jagielski             return true;
80*b1cdbd2cSJim Jagielski         rtl::OUString sSub;
81*b1cdbd2cSJim Jagielski         sSub = s2.first + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/"));
82*b1cdbd2cSJim Jagielski         if (s1.match(sSub) == sal_True)
83*b1cdbd2cSJim Jagielski             return true;
84*b1cdbd2cSJim Jagielski         return false;
85*b1cdbd2cSJim Jagielski     }
86*b1cdbd2cSJim Jagielski };
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski /* Creates a VendorBase object if a JRE could be found at the specified path.
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski    This depends if there is a JRE at all and if it is from a vendor that
92*b1cdbd2cSJim Jagielski    is supported by this plugin.
93*b1cdbd2cSJim Jagielski  */
94*b1cdbd2cSJim Jagielski rtl::Reference<VendorBase> getJREInfoByPath(const rtl::OUString& path);
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski /* Creates a VendorBase object if a JRE could be found at the specified path.
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski    The difference to the other getJREInfoByPath is that this function checks
99*b1cdbd2cSJim Jagielski    first if the path corresponds to one of the VendorBase::getHome path already
100*b1cdbd2cSJim Jagielski    contained in vecInfo. Only if there is no such entry, then the other
101*b1cdbd2cSJim Jagielski    getJREInfoByPath is called. Again the created VendorBase is compared to
102*b1cdbd2cSJim Jagielski    those contained in vecInfos. If it it not in there then it's added.
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski    @return
105*b1cdbd2cSJim Jagielski    true a VendorBase was created and added to the end of vecInfos.
106*b1cdbd2cSJim Jagielski    false - no VendorBase has been created. Either the path did not represent a
107*b1cdbd2cSJim Jagielski    supported JRE installation or there was already a VendorBase in vecInfos.
108*b1cdbd2cSJim Jagielski  */
109*b1cdbd2cSJim Jagielski bool getJREInfoByPath(const rtl::OUString& path,
110*b1cdbd2cSJim Jagielski                       std::vector<rtl::Reference<VendorBase> > & vecInfos);
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski std::vector<rtl::Reference<VendorBase> > getAllJREInfos();
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski bool getJavaProps(
115*b1cdbd2cSJim Jagielski     const rtl::OUString & exePath,
116*b1cdbd2cSJim Jagielski     std::vector<std::pair<rtl::OUString, rtl::OUString> >& props,
117*b1cdbd2cSJim Jagielski     bool * bProcessRun);
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski void  createJavaInfoFromWinReg(std::vector<rtl::Reference<VendorBase> > & vecInfos);
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski void bubbleSortVersion(std::vector<rtl::Reference<VendorBase> >& vec);
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski rtl::Bootstrap* getBootstrap();
124*b1cdbd2cSJim Jagielski }
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski #endif
127