compilerplugins/clang/useuniqueptr.cxx | 9 include/jvmfwk/framework.hxx | 1 jvmfwk/inc/elements.hxx | 7 jvmfwk/inc/vendorplugin.hxx | 27 - jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx | 51 +-- jvmfwk/source/elements.cxx | 20 - jvmfwk/source/framework.cxx | 290 +++++--------------- jvmfwk/source/framework.hxx | 36 -- 8 files changed, 115 insertions(+), 326 deletions(-)
New commits: commit 13180e0c7cdfbaa86b8380fe7e8966f8ebaf1e00 Author: Stephan Bergmann <sberg...@redhat.com> Date: Thu Apr 13 17:01:13 2017 +0200 Use std::unique_ptr<JavaInfo> in createJavaInfo Change-Id: Ie39c40e0fd05f75e734d8cd2d33a7fb13c746f77 diff --git a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx index 273db8f5a99e..a725b2cec55d 100644 --- a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx +++ b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx @@ -148,14 +148,9 @@ OString getPluginJarPath( #endif // UNX -JavaInfo* createJavaInfo(const rtl::Reference<VendorBase> & info) +std::unique_ptr<JavaInfo> createJavaInfo( + const rtl::Reference<VendorBase> & info) { - JavaInfo* pInfo = new JavaInfo; - pInfo->sVendor = info->getVendor(); - pInfo->sLocation = info->getHome(); - pInfo->sVersion = info->getVersion(); - pInfo->nFeatures = info->supportsAccessibility() ? 1 : 0; - pInfo->nRequirements = info->needsRestart() ? JFW_REQUIRE_NEEDRESTART : 0; OUStringBuffer buf(1024); buf.append(info->getRuntimeLibrary()); if (!info->getLibraryPath().isEmpty()) @@ -164,13 +159,15 @@ JavaInfo* createJavaInfo(const rtl::Reference<VendorBase> & info) buf.append(info->getLibraryPath()); buf.append("\n"); } - OUString sVendorData = buf.makeStringAndClear(); - pInfo->arVendorData = rtl::ByteSequence( - reinterpret_cast<sal_Int8*>(sVendorData.pData->buffer), - sVendorData.getLength() * sizeof(sal_Unicode)); - - return pInfo; + return std::unique_ptr<JavaInfo>( + new JavaInfo{ + info->getVendor(), info->getHome(), info->getVersion(), + sal_uInt64(info->supportsAccessibility() ? 1 : 0), + sal_uInt64(info->needsRestart() ? JFW_REQUIRE_NEEDRESTART : 0), + rtl::ByteSequence( + reinterpret_cast<sal_Int8*>(sVendorData.pData->buffer), + sVendorData.getLength() * sizeof(sal_Unicode))}); } OUString getRuntimeLib(const rtl::ByteSequence & data) @@ -337,7 +334,7 @@ javaPluginError jfw_plugin_getAllJavaInfos( typedef vector<rtl::Reference<VendorBase> >::const_iterator cit; for (cit ii = vecVerifiedInfos.begin(); ii != vecVerifiedInfos.end(); ++ii) { - parJavaInfo->push_back(std::unique_ptr<JavaInfo>(createJavaInfo(*ii))); + parJavaInfo->push_back(createJavaInfo(*ii)); } return javaPluginError::NONE; @@ -371,7 +368,7 @@ javaPluginError jfw_plugin_getJavaInfoByPath( aVendorInfo, sMinVersion, sMaxVersion, arExcludeList); if (errorcode == javaPluginError::NONE) - ppInfo->reset(createJavaInfo(aVendorInfo)); + *ppInfo = createJavaInfo(aVendorInfo); return errorcode; } @@ -407,7 +404,7 @@ javaPluginError jfw_plugin_getJavaInfoFromJavaHome( if (errorcode == javaPluginError::NONE) { - ppInfo->reset(createJavaInfo(infoJavaHome[0])); + *ppInfo = createJavaInfo(infoJavaHome[0]); return javaPluginError::NONE; } } @@ -449,8 +446,7 @@ javaPluginError jfw_plugin_getJavaInfosFromPath( if (errorcode == javaPluginError::NONE) { - vecVerifiedInfos.push_back( - std::unique_ptr<JavaInfo>(createJavaInfo(currentInfo))); + vecVerifiedInfos.push_back(createJavaInfo(currentInfo)); } } } commit f276171835c7b820ba271e7d3c28d6704ec823b0 Author: Stephan Bergmann <sberg...@redhat.com> Date: Thu Apr 13 16:54:32 2017 +0200 Use std::unique_ptr<JavaInfo> in jfw_plugin_getAllJavaInfos Change-Id: I2beb95c42c666a788a87a45f59bc15ccfcf25aa6 diff --git a/jvmfwk/inc/vendorplugin.hxx b/jvmfwk/inc/vendorplugin.hxx index 141a93689a8e..a8a7a4b3c7ae 100644 --- a/jvmfwk/inc/vendorplugin.hxx +++ b/jvmfwk/inc/vendorplugin.hxx @@ -74,13 +74,6 @@ enum class javaPluginError The JavaInfo structures returned in <code>parJavaInfo</code> should be ordered according to their version. The one, representing a JRE with the highest version should be the first in the array. </p> - <p> - The function allocates memory for an array and all the JavaInfo objects returned - in <code>parJavaInfo</code>. The caller must delete each JavaInfo object. - The array is to be - freed by rtl_freeMemory. - In case an error occurred <code>parJavaInfo</code> need not be freed. - </p> @param sVendor [in] only JREs from this vendor are examined. This parameter always contains a vendor string. That is, the string it is not empty. @@ -93,10 +86,7 @@ enum class javaPluginError versions must not be returned by this function. @param parJavaInfo [out] if the function runs successfully then <code>parJavaInfo</code> contains - on return an array of pointers to <code>JavaInfo</code> objects. - @param nSizeJavaInfo - [out] the number of <code>JavaInfo</code> pointers contained in - <code>parJavaInfo</code>. + on return a vector of pointers to <code>JavaInfo</code> objects. @return javaPluginError::NONE the function ran successfully.</br> @@ -112,8 +102,7 @@ javaPluginError jfw_plugin_getAllJavaInfos( OUString const& sMinVersion, OUString const& sMaxVersion, std::vector<OUString> const & arExcludeList, - JavaInfo*** parJavaInfo, - sal_Int32 *nSizeJavaInfo, + std::vector<std::unique_ptr<JavaInfo>> * parJavaInfo, std::vector<rtl::Reference<jfw_plugin::VendorBase>> & infos); /** obtains information for a JRE at a given location. diff --git a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx index 261c648f5da5..273db8f5a99e 100644 --- a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx +++ b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx @@ -299,19 +299,15 @@ javaPluginError jfw_plugin_getAllJavaInfos( OUString const& sMinVersion, OUString const& sMaxVersion, std::vector<OUString> const &arExcludeList, - JavaInfo*** parJavaInfo, - sal_Int32 *nLenInfoList, + std::vector<std::unique_ptr<JavaInfo>>* parJavaInfo, std::vector<rtl::Reference<jfw_plugin::VendorBase>> & infos) { assert(parJavaInfo); - assert(nLenInfoList); OSL_ASSERT(!sVendor.isEmpty()); if (sVendor.isEmpty()) return javaPluginError::InvalidArg; - JavaInfo** arInfo = nullptr; - //Find all JREs vector<rtl::Reference<VendorBase> > vecInfos = addAllJREInfos(checkJavaHomeAndPath, infos); @@ -337,17 +333,13 @@ javaPluginError jfw_plugin_getAllJavaInfos( } //Now vecVerifiedInfos contains all those JREs which meet the version requirements //Transfer them into the array that is passed out. - arInfo = static_cast<JavaInfo**>(rtl_allocateMemory(vecVerifiedInfos.size() * sizeof (JavaInfo*))); - int j = 0; + parJavaInfo->clear(); typedef vector<rtl::Reference<VendorBase> >::const_iterator cit; - for (cit ii = vecVerifiedInfos.begin(); ii != vecVerifiedInfos.end(); ++ii, ++j) + for (cit ii = vecVerifiedInfos.begin(); ii != vecVerifiedInfos.end(); ++ii) { - arInfo[j] = createJavaInfo(*ii); + parJavaInfo->push_back(std::unique_ptr<JavaInfo>(createJavaInfo(*ii))); } - *nLenInfoList = vecVerifiedInfos.size(); - - *parJavaInfo = arInfo; return javaPluginError::NONE; } diff --git a/jvmfwk/source/framework.cxx b/jvmfwk/source/framework.cxx index 90aa407e2eb7..ddc5e6c19747 100644 --- a/jvmfwk/source/framework.cxx +++ b/jvmfwk/source/framework.cxx @@ -75,8 +75,7 @@ javaFrameworkError jfw_findAllJREs(std::vector<std::unique_ptr<JavaInfo>> *pparI //get all installations of one vendor according to minVersion, //maxVersion and excludeVersions - sal_Int32 cInfos = 0; - JavaInfo** arInfos = nullptr; + std::vector<std::unique_ptr<JavaInfo>> arInfos; std::vector<rtl::Reference<jfw_plugin::VendorBase>> infos; javaPluginError plerr = jfw_plugin_getAllJavaInfos( true, @@ -85,16 +84,13 @@ javaFrameworkError jfw_findAllJREs(std::vector<std::unique_ptr<JavaInfo>> *pparI versionInfo.sMaxVersion, versionInfo.vecExcludeVersions, & arInfos, - & cInfos, infos); if (plerr != javaPluginError::NONE) return JFW_E_ERROR; - for (int j = 0; j < cInfos; j++) - vecInfo.push_back(std::unique_ptr<JavaInfo>(arInfos[j])); - - rtl_freeMemory(arInfos); + for (auto & j: arInfos) + vecInfo.push_back(std::move(j)); //Check if the current plugin can detect JREs at the location // of the paths added by jfw_addJRELocation @@ -423,8 +419,7 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) //get all installations of one vendor according to minVersion, //maxVersion and excludeVersions - sal_Int32 cInfos = 0; - JavaInfo** arInfos = nullptr; + std::vector<std::unique_ptr<JavaInfo>> arInfos; javaPluginError plerr = jfw_plugin_getAllJavaInfos( false, vendor, @@ -432,22 +427,14 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) versionInfo.sMaxVersion, versionInfo.vecExcludeVersions, & arInfos, - & cInfos, infos); if (plerr != javaPluginError::NONE) continue; //iterate over all installations to find the best which has //all features - if (cInfos == 0) + for (auto & pJInfo: arInfos) { - rtl_freeMemory(arInfos); - continue; - } - for (int ii = 0; ii < cInfos; ii++) - { - JavaInfo* pJInfo = arInfos[ii]; - // compare features // If the user does not require any features (nFeatureFlags = 0) // then the first installation is used @@ -455,8 +442,7 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) { //the just found Java implements all required features //currently there is only accessibility!!! - aCurrentInfo.reset( - jfw::CJavaInfo::copyJavaInfo(pJInfo)); + aCurrentInfo = std::move(pJInfo); bInfoFound = true; break; } @@ -464,15 +450,9 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) { // We remember the first installation in aCurrentInfo if // no JavaInfo has been found before: - aCurrentInfo.reset( - jfw::CJavaInfo::copyJavaInfo(pJInfo)); + aCurrentInfo = std::move(pJInfo); } } - //The array returned by jfw_plugin_getAllJavaInfos must be freed as well as - //its contents - for (int j = 0; j < cInfos; j++) - delete arInfos[j]; - rtl_freeMemory(arInfos); if (bInfoFound) break; @@ -928,9 +908,4 @@ void jfw_unlock() jfw::FwkMutex::get().release(); } -JavaInfo * jfw::CJavaInfo::copyJavaInfo(const JavaInfo * pInfo) -{ - return pInfo == nullptr ? nullptr : new JavaInfo(*pInfo); -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/jvmfwk/source/framework.hxx b/jvmfwk/source/framework.hxx index 3ecd08314ddb..590543b8d6ba 100644 --- a/jvmfwk/source/framework.hxx +++ b/jvmfwk/source/framework.hxx @@ -27,11 +27,6 @@ namespace jfw { -namespace CJavaInfo -{ - JavaInfo * copyJavaInfo(const JavaInfo * pInfo); -} - class FrameworkException : public std::exception { public: commit 8d475bb13fa44a3a2385635dfbc49ab1b2765dd1 Author: Stephan Bergmann <sberg...@redhat.com> Date: Thu Apr 13 16:06:17 2017 +0200 Use std::unique_ptr<JavaInfo> in jfw_plugin_getJavaInfoByPath Change-Id: I3511eaa12bb689a374a775204a3480d7c667a915 diff --git a/jvmfwk/inc/vendorplugin.hxx b/jvmfwk/inc/vendorplugin.hxx index edd32854dda7..141a93689a8e 100644 --- a/jvmfwk/inc/vendorplugin.hxx +++ b/jvmfwk/inc/vendorplugin.hxx @@ -160,7 +160,7 @@ javaPluginError jfw_plugin_getJavaInfoByPath( OUString const& sMinVersion, OUString const& sMaxVersion, std::vector<OUString> const &arExcludeList, - JavaInfo ** ppInfo); + std::unique_ptr<JavaInfo> * ppInfo); /** obtains information for a JRE referenced by the JAVA_HOME environment variable. diff --git a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx index f336532f3515..261c648f5da5 100644 --- a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx +++ b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx @@ -357,7 +357,7 @@ javaPluginError jfw_plugin_getJavaInfoByPath( OUString const& sMinVersion, OUString const& sMaxVersion, std::vector<OUString> const &arExcludeList, - JavaInfo ** ppInfo) + std::unique_ptr<JavaInfo> * ppInfo) { assert(ppInfo != nullptr); OSL_ASSERT(!sPath.isEmpty()); @@ -379,7 +379,7 @@ javaPluginError jfw_plugin_getJavaInfoByPath( aVendorInfo, sMinVersion, sMaxVersion, arExcludeList); if (errorcode == javaPluginError::NONE) - *ppInfo = createJavaInfo(aVendorInfo); + ppInfo->reset(createJavaInfo(aVendorInfo)); return errorcode; } diff --git a/jvmfwk/source/framework.cxx b/jvmfwk/source/framework.cxx index 87f4d3adce2b..90aa407e2eb7 100644 --- a/jvmfwk/source/framework.cxx +++ b/jvmfwk/source/framework.cxx @@ -101,15 +101,14 @@ javaFrameworkError jfw_findAllJREs(std::vector<std::unique_ptr<JavaInfo>> *pparI //Check every manually added location for (auto const & ii: vecJRELocations) { - JavaInfo * info; + std::unique_ptr<JavaInfo> aInfo; plerr = jfw_plugin_getJavaInfoByPath( ii, vendor, versionInfo.sMinVersion, versionInfo.sMaxVersion, versionInfo.vecExcludeVersions, - &info); - std::unique_ptr<JavaInfo> aInfo(info); + &aInfo); if (plerr == javaPluginError::NoJre) continue; if (plerr == javaPluginError::FailedVersion) @@ -499,15 +498,14 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) for (citLoc it = vecJRELocations.begin(); it != vecJRELocations.end(); ++it) { - JavaInfo * info; + std::unique_ptr<JavaInfo> aInfo; javaPluginError err = jfw_plugin_getJavaInfoByPath( *it, vendor, versionInfo.sMinVersion, versionInfo.sMaxVersion, versionInfo.vecExcludeVersions, - &info); - std::unique_ptr<JavaInfo> aInfo(info); + &aInfo); if (err == javaPluginError::NoJre) continue; if (err == javaPluginError::FailedVersion) @@ -667,18 +665,16 @@ javaFrameworkError jfw_getJavaInfoByPath(OUString const & pPath, std::unique_ptr //ask the plugin if this is a JRE. //If so check if it meets the version requirements. //Only if it does return a JavaInfo - JavaInfo* pInfo = nullptr; javaPluginError plerr = jfw_plugin_getJavaInfoByPath( pPath, vendor, versionInfo.sMinVersion, versionInfo.sMaxVersion, versionInfo.vecExcludeVersions, - & pInfo); + ppInfo); if (plerr == javaPluginError::NONE) { - ppInfo->reset(pInfo); break; } else if(plerr == javaPluginError::FailedVersion) commit 74315cbccf13b578551390762d5efc0a30c2d65b Author: Stephan Bergmann <sberg...@redhat.com> Date: Thu Apr 13 15:25:28 2017 +0200 Use std::unique_ptr<JavaInfo> in jfw_plugin_getJavaInfoFromJavaHome Change-Id: I8be48d1eec799f347a5edaa67837cf1bbf4d2cc3 diff --git a/jvmfwk/inc/vendorplugin.hxx b/jvmfwk/inc/vendorplugin.hxx index 875185551688..edd32854dda7 100644 --- a/jvmfwk/inc/vendorplugin.hxx +++ b/jvmfwk/inc/vendorplugin.hxx @@ -190,7 +190,7 @@ javaPluginError jfw_plugin_getJavaInfoByPath( */ javaPluginError jfw_plugin_getJavaInfoFromJavaHome( std::vector<std::pair<OUString, jfw::VersionInfo>> const& vecVendorInfos, - JavaInfo ** ppInfo, + std::unique_ptr<JavaInfo> * ppInfo, std::vector<rtl::Reference<jfw_plugin::VendorBase>> & infos); diff --git a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx index da7f6218d0d3..f336532f3515 100644 --- a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx +++ b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx @@ -386,7 +386,8 @@ javaPluginError jfw_plugin_getJavaInfoByPath( javaPluginError jfw_plugin_getJavaInfoFromJavaHome( std::vector<pair<OUString, jfw::VersionInfo>> const& vecVendorInfos, - JavaInfo ** ppInfo, std::vector<rtl::Reference<VendorBase>> & infos) + std::unique_ptr<JavaInfo> * ppInfo, + std::vector<rtl::Reference<VendorBase>> & infos) { assert(ppInfo); @@ -414,7 +415,7 @@ javaPluginError jfw_plugin_getJavaInfoFromJavaHome( if (errorcode == javaPluginError::NONE) { - *ppInfo = createJavaInfo(infoJavaHome[0]); + ppInfo->reset(createJavaInfo(infoJavaHome[0])); return javaPluginError::NONE; } } diff --git a/jvmfwk/source/framework.cxx b/jvmfwk/source/framework.cxx index 0dd643d92d45..87f4d3adce2b 100644 --- a/jvmfwk/source/framework.cxx +++ b/jvmfwk/source/framework.cxx @@ -364,20 +364,17 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) // first inspect Java installation that the JAVA_HOME // environment variable points to (if it is set) - JavaInfo* pHomeInfo = nullptr; - if (jfw_plugin_getJavaInfoFromJavaHome(versionInfos, &pHomeInfo, infos) + if (jfw_plugin_getJavaInfoFromJavaHome( + versionInfos, &aCurrentInfo, infos) == javaPluginError::NONE) { - aCurrentInfo.reset(pHomeInfo); - // compare features // if the user does not require any features (nFeatureFlags = 0) // or the Java installation provides all features, then this installation is used - if ((pHomeInfo->nFeatures & nFeatureFlags) == nFeatureFlags) + if ((aCurrentInfo->nFeatures & nFeatureFlags) == nFeatureFlags) { bInfoFound = true; } - delete pHomeInfo; } // if no Java installation providing all features was detected by using JAVA_HOME, commit 626dec44e33727a56353efb7f4eee83e93bc2f3d Author: Stephan Bergmann <sberg...@redhat.com> Date: Thu Apr 13 15:19:17 2017 +0200 Use std::unique_ptr<JavaInfo> in jfw_plugin_getJavaInfosFromPath ...thereby fixing a memory leak Change-Id: I1aa91eeb407987abcdaa5221f4abd447f881c5d2 diff --git a/jvmfwk/inc/vendorplugin.hxx b/jvmfwk/inc/vendorplugin.hxx index d456fe74a59c..875185551688 100644 --- a/jvmfwk/inc/vendorplugin.hxx +++ b/jvmfwk/inc/vendorplugin.hxx @@ -25,6 +25,8 @@ #include <rtl/ref.hxx> #include <rtl/ustring.h> #include "jni.h" + +#include <memory> #include <vector> #include <utility> #include "elements.hxx" @@ -204,10 +206,6 @@ javaPluginError jfw_plugin_getJavaInfoFromJavaHome( The JavaInfo structures returned in <code>vecJavaInfosFromPath</code> should be ordered according to their occurrence in the PATH. The one that is the first one on the PATH is also the first element in the vector.</p> - <p> - The function allocates memory for all the JavaInfo objects returned - in <code>vecJavaInfosFromPath</code>. The caller must delete each JavaInfo object. - </p> @param vecVendorInfos [in] vector specifying the vendor and version requirements that the JRE must fulfill. The vector contains pairs of vendors and the respective version requirements @@ -230,7 +228,7 @@ javaPluginError jfw_plugin_getJavaInfoFromJavaHome( javaPluginError jfw_plugin_getJavaInfosFromPath( std::vector<std::pair<OUString, jfw::VersionInfo>> const& vecVendorInfos, - std::vector<JavaInfo*> & vecJavaInfosFromPath, + std::vector<std::unique_ptr<JavaInfo>> & vecJavaInfosFromPath, std::vector<rtl::Reference<jfw_plugin::VendorBase>> & infos); /** starts a Java Virtual Machine. diff --git a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx index 7ade439ed694..da7f6218d0d3 100644 --- a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx +++ b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx @@ -32,6 +32,7 @@ #include <cassert> #include <memory> +#include <utility> #include <vector> #include "config_options.h" @@ -424,14 +425,14 @@ javaPluginError jfw_plugin_getJavaInfoFromJavaHome( javaPluginError jfw_plugin_getJavaInfosFromPath( std::vector<std::pair<OUString, jfw::VersionInfo>> const& vecVendorInfos, - std::vector<JavaInfo*> & javaInfosFromPath, + std::vector<std::unique_ptr<JavaInfo>> & javaInfosFromPath, std::vector<rtl::Reference<jfw_plugin::VendorBase>> & infos) { // find JREs from PATH vector<rtl::Reference<VendorBase>> vecInfosFromPath; addJavaInfosFromPath(infos, vecInfosFromPath); - vector<JavaInfo*> vecVerifiedInfos; + vector<std::unique_ptr<JavaInfo>> vecVerifiedInfos; // copy infos of JREs that meet version requirements to vecVerifiedInfos typedef vector<rtl::Reference<VendorBase> >::iterator it; @@ -455,7 +456,8 @@ javaPluginError jfw_plugin_getJavaInfosFromPath( if (errorcode == javaPluginError::NONE) { - vecVerifiedInfos.push_back(createJavaInfo(currentInfo)); + vecVerifiedInfos.push_back( + std::unique_ptr<JavaInfo>(createJavaInfo(currentInfo))); } } } @@ -464,7 +466,7 @@ javaPluginError jfw_plugin_getJavaInfosFromPath( if (vecVerifiedInfos.empty()) return javaPluginError::NoJre; - javaInfosFromPath = vecVerifiedInfos; + javaInfosFromPath = std::move(vecVerifiedInfos); return javaPluginError::NONE; } diff --git a/jvmfwk/source/framework.cxx b/jvmfwk/source/framework.cxx index 63d5733f445a..0dd643d92d45 100644 --- a/jvmfwk/source/framework.cxx +++ b/jvmfwk/source/framework.cxx @@ -384,35 +384,28 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) // query PATH for Java installations if (!bInfoFound) { - std::vector<JavaInfo*> vecJavaInfosFromPath; + std::vector<std::unique_ptr<JavaInfo>> vecJavaInfosFromPath; if (jfw_plugin_getJavaInfosFromPath( versionInfos, vecJavaInfosFromPath, infos) == javaPluginError::NONE) { - std::vector<JavaInfo*>::const_iterator it = vecJavaInfosFromPath.begin(); - while(it != vecJavaInfosFromPath.end() && !bInfoFound) + for (auto & pJInfo: vecJavaInfosFromPath) { - JavaInfo* pJInfo = *it; - if (pJInfo != nullptr) + // if the current Java installation implements all required features: use it + if ((pJInfo->nFeatures & nFeatureFlags) == nFeatureFlags) { - // if the current Java installation implements all required features: use it - if ((pJInfo->nFeatures & nFeatureFlags) == nFeatureFlags) - { - aCurrentInfo.reset(pJInfo); - bInfoFound = true; - } - else if (!aCurrentInfo) - { - // current Java installation does not provide all features - // but no Java installation has been detected before - // -> remember the current one until one is found - // that provides all features - aCurrentInfo.reset(pJInfo); - } - else - delete pJInfo; + aCurrentInfo = std::move(pJInfo); + bInfoFound = true; + break; + } + else if (!aCurrentInfo) + { + // current Java installation does not provide all features + // but no Java installation has been detected before + // -> remember the current one until one is found + // that provides all features + aCurrentInfo = std::move(pJInfo); } - ++it; } } } commit 6925007c2a86d45a8d71f08ef46e56bb3eda21e3 Author: Stephan Bergmann <sberg...@redhat.com> Date: Thu Apr 13 15:18:14 2017 +0200 Simplify jfw_findAllJREs ...dropping remaining uses of CJavaInfo Change-Id: I76afd5af927233712181f58b14fe6f4c1a9c15c2 diff --git a/compilerplugins/clang/useuniqueptr.cxx b/compilerplugins/clang/useuniqueptr.cxx index 9b607ecffea3..f038bd9c1485 100644 --- a/compilerplugins/clang/useuniqueptr.cxx +++ b/compilerplugins/clang/useuniqueptr.cxx @@ -43,12 +43,6 @@ bool UseUniquePtr::VisitCXXDestructorDecl(const CXXDestructorDecl* destructorDec if (isInUnoIncludeFile(destructorDecl)) return true; -/* - StringRef aFileName = compiler.getSourceManager().getFilename(compiler.getSourceManager().getSpellingLoc(destructorDecl->getLocStart())); - // weird stuff, passing pointers to internal members of struct - if (aFileName.startswith(SRCDIR "/include/jvmfwk/framework.hxx")) - return true; -*/ if (destructorDecl->getBody() == nullptr) return true; const CompoundStmt* compoundStmt = dyn_cast< CompoundStmt >( destructorDecl->getBody() ); @@ -88,9 +82,6 @@ bool UseUniquePtr::VisitCXXDestructorDecl(const CXXDestructorDecl* destructorDec StringRef aFileName = compiler.getSourceManager().getFilename(compiler.getSourceManager().getSpellingLoc(pFieldDecl->getLocStart())); if (aFileName.startswith(WORKDIR)) return true; - // weird stuff, passing pointers to internal members of struct - if (aFileName == SRCDIR "/jvmfwk/source/framework.hxx") - return true; // passes and stores pointers to member fields if (aFileName.startswith(SRCDIR "/sot/source/sdstor/stgdir.hxx")) return true; diff --git a/include/jvmfwk/framework.hxx b/include/jvmfwk/framework.hxx index afab60eef427..767727146c63 100644 --- a/include/jvmfwk/framework.hxx +++ b/include/jvmfwk/framework.hxx @@ -378,7 +378,6 @@ JVMFWK_DLLPUBLIC javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInf @param parInfo [out] on returns it contains a vector of <code>JavaInfo</code> pointers. - Any previously contained elements are removed first. @return JFW_E_NONE function ran successfully.<br/> diff --git a/jvmfwk/source/framework.cxx b/jvmfwk/source/framework.cxx index d817bd36ee2c..63d5733f445a 100644 --- a/jvmfwk/source/framework.cxx +++ b/jvmfwk/source/framework.cxx @@ -21,6 +21,8 @@ #include <cassert> #include <memory> +#include <utility> + #include "rtl/ustring.hxx" #include "rtl/bootstrap.hxx" #include "osl/thread.hxx" @@ -28,7 +30,6 @@ #include "jvmfwk/framework.hxx" #include "vendorplugin.hxx" #include <vector> -#include <functional> #include <algorithm> #include "framework.hxx" #include "fwkutil.hxx" @@ -55,30 +56,20 @@ javaFrameworkError jfw_findAllJREs(std::vector<std::unique_ptr<JavaInfo>> *pparI try { osl::MutexGuard guard(jfw::FwkMutex::get()); - pparInfo->clear(); jfw::VendorSettings aVendorSettings; std::vector<OUString> vecVendors = aVendorSettings.getSupportedVendors(); //Add the JavaInfos found by jfw_plugin_getAllJavaInfos to the vector - //Make sure that the contents are destroyed if this - //function returns with an error - std::vector<jfw::CJavaInfo> vecInfo; - //Add the JavaInfos found by jfw_plugin_getJavaInfoByPath to this vector - //Make sure that the contents are destroyed if this - //function returns with an error - std::vector<jfw::CJavaInfo> vecInfoManual; - typedef std::vector<jfw::CJavaInfo>::iterator it_info; + std::vector<std::unique_ptr<JavaInfo>> vecInfo; //get the list of paths to jre locations which have been //added manually const jfw::MergedSettings settings; const std::vector<OUString>& vecJRELocations = settings.getJRELocations(); //Use every plug-in library to get Java installations. - typedef std::vector<OUString>::const_iterator ci_pl; - for (ci_pl i = vecVendors.begin(); i != vecVendors.end(); ++i) + for (auto const & vendor: vecVendors) { - const OUString & vendor = *i; jfw::VersionInfo versionInfo = aVendorSettings.getVersionInformation(vendor); @@ -101,26 +92,24 @@ javaFrameworkError jfw_findAllJREs(std::vector<std::unique_ptr<JavaInfo>> *pparI return JFW_E_ERROR; for (int j = 0; j < cInfos; j++) - vecInfo.push_back(jfw::CJavaInfo::createWrapper(arInfos[j])); + vecInfo.push_back(std::unique_ptr<JavaInfo>(arInfos[j])); rtl_freeMemory(arInfos); //Check if the current plugin can detect JREs at the location // of the paths added by jfw_addJRELocation - //get the function from the plugin - typedef std::vector<OUString>::const_iterator citLoc; //Check every manually added location - for (citLoc ii = vecJRELocations.begin(); - ii != vecJRELocations.end(); ++ii) + for (auto const & ii: vecJRELocations) { - jfw::CJavaInfo aInfo; + JavaInfo * info; plerr = jfw_plugin_getJavaInfoByPath( - *ii, + ii, vendor, versionInfo.sMinVersion, versionInfo.sMaxVersion, versionInfo.vecExcludeVersions, - & aInfo.pInfo); + &info); + std::unique_ptr<JavaInfo> aInfo(info); if (plerr == javaPluginError::NoJre) continue; if (plerr == javaPluginError::FailedVersion) @@ -128,53 +117,29 @@ javaFrameworkError jfw_findAllJREs(std::vector<std::unique_ptr<JavaInfo>> *pparI else if (plerr != javaPluginError::NONE) return JFW_E_ERROR; - if (aInfo) + // Was this JRE already added? Different plugins could detect + // the same JRE. Also make sure vecInfo contains only JavaInfos + // for the vendors for which there is a javaSelection/plugins/ + // library entry in the javavendors.xml; jfw_getJavaInfoByPath + // can return a JavaInfo of any vendor: + if ((std::find_if( + vecInfo.begin(), vecInfo.end(), + [&aInfo](std::unique_ptr<JavaInfo> const & info) { + return areEqualJavaInfo( + info.get(), aInfo.get()); + }) + == vecInfo.end()) + && (std::find( + vecVendors.begin(), vecVendors.end(), + aInfo->sVendor) + != vecVendors.end())) { - //Was this JRE already added?. Different plugins could detect - //the same JRE - it_info it_duplicate = - std::find_if(vecInfoManual.begin(), vecInfoManual.end(), - std::bind(areEqualJavaInfo, std::placeholders::_1, aInfo)); - if (it_duplicate == vecInfoManual.end()) - vecInfoManual.push_back(aInfo); - } - } - } - //Make sure vecInfoManual contains only JavaInfos for the vendors for which - //there is a javaSelection/plugins/library entry in the javavendors.xml - //To obtain the JavaInfos for the manually added JRE locations the function - //jfw_getJavaInfoByPath is called which can return a JavaInfo of any vendor. - std::vector<jfw::CJavaInfo> vecInfoManual2; - for (it_info ivm = vecInfoManual.begin(); ivm != vecInfoManual.end(); ++ivm) - { - for (ci_pl ii = vecVendors.begin(); ii != vecVendors.end(); ++ii) - { - if ( ii->equals((*ivm)->sVendor)) - { - vecInfoManual2.push_back(*ivm); - break; + vecInfo.push_back(std::move(aInfo)); } } } - //Check which JavaInfo from vector vecInfoManual2 is already - //contained in vecInfo. If it already exists then remove it from - //vecInfoManual2 - for (it_info j = vecInfo.begin(); j != vecInfo.end(); ++j) - { - it_info it_duplicate = - std::find_if(vecInfoManual2.begin(), vecInfoManual2.end(), - std::bind(areEqualJavaInfo, std::placeholders::_1, *j)); - if (it_duplicate != vecInfoManual2.end()) - vecInfoManual2.erase(it_duplicate); - } - typedef std::vector<jfw::CJavaInfo>::iterator it; - //Add the automatically detected JREs - for (it k = vecInfo.begin(); k != vecInfo.end(); ++k) - pparInfo->push_back(std::unique_ptr<JavaInfo>(k->detach())); - //Add the manually detected JREs - for (it l = vecInfoManual2.begin(); l != vecInfoManual2.end(); ++l) - pparInfo->push_back(std::unique_ptr<JavaInfo>(l->detach())); + *pparInfo = std::move(vecInfo); return JFW_E_NONE; } @@ -977,68 +942,9 @@ void jfw_unlock() jfw::FwkMutex::get().release(); } - -namespace jfw -{ -CJavaInfo::CJavaInfo(): pInfo(nullptr) -{ -} - -CJavaInfo::CJavaInfo(const CJavaInfo & info) -{ - pInfo = copyJavaInfo(info.pInfo); -} - -CJavaInfo::CJavaInfo(::JavaInfo * info, _transfer_ownership) -{ - pInfo = info; -} -CJavaInfo CJavaInfo::createWrapper(::JavaInfo* info) -{ - return CJavaInfo(info, TRANSFER); -} -void CJavaInfo::attach(::JavaInfo * info) -{ - delete pInfo; - pInfo = info; -} -::JavaInfo * CJavaInfo::detach() -{ - JavaInfo * tmp = pInfo; - pInfo = nullptr; - return tmp; -} - -CJavaInfo::~CJavaInfo() -{ - delete pInfo; -} - - -JavaInfo * CJavaInfo::copyJavaInfo(const JavaInfo * pInfo) +JavaInfo * jfw::CJavaInfo::copyJavaInfo(const JavaInfo * pInfo) { return pInfo == nullptr ? nullptr : new JavaInfo(*pInfo); } -CJavaInfo & CJavaInfo::operator = (const CJavaInfo& info) -{ - if (&info == this) - return *this; - - delete pInfo; - pInfo = copyJavaInfo(info.pInfo); - return *this; -} -CJavaInfo & CJavaInfo::operator = (const ::JavaInfo* info) -{ - if (info == pInfo) - return *this; - - delete pInfo; - pInfo = copyJavaInfo(info); - return *this; -} - -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/jvmfwk/source/framework.hxx b/jvmfwk/source/framework.hxx index 3f9e5ff6ab85..3ecd08314ddb 100644 --- a/jvmfwk/source/framework.hxx +++ b/jvmfwk/source/framework.hxx @@ -27,38 +27,10 @@ namespace jfw { -class CJavaInfo +namespace CJavaInfo { - enum _transfer_ownership {TRANSFER}; - /*Attaching the pointer to this class. The argument pInfo must not - be freed afterwards. - */ - CJavaInfo(::JavaInfo * info, _transfer_ownership); - -public: - ::JavaInfo * pInfo; - - - CJavaInfo(); - CJavaInfo(const CJavaInfo &); - ~CJavaInfo(); - CJavaInfo& operator =(const ::JavaInfo* info); - CJavaInfo & operator = (const CJavaInfo& info); - - /* The returned class takes ownership of the argument info. info - must not been freed afterwards. - */ - static CJavaInfo createWrapper(::JavaInfo* info); - /*Attaching the pointer to this class. The argument pInfo must not - be freed afterwards. - */ - void attach(::JavaInfo* pInfo); - ::JavaInfo * detach(); - const ::JavaInfo* operator ->() const { return pInfo;} - operator ::JavaInfo* () { return pInfo;} - - static JavaInfo * copyJavaInfo(const JavaInfo * pInfo); -}; + JavaInfo * copyJavaInfo(const JavaInfo * pInfo); +} class FrameworkException : public std::exception { commit 77e5a6d857bd3a1a6a59891aab9b5d9bb9bc85cf Author: Stephan Bergmann <sberg...@redhat.com> Date: Thu Apr 13 12:27:50 2017 +0200 Replace a use of CJavaInfo with std::unique_ptr<JavaInfo> Change-Id: Ib659d6edf362901a95cfb50ac008520805ad0fb0 diff --git a/jvmfwk/source/framework.cxx b/jvmfwk/source/framework.cxx index 4786b9424844..d817bd36ee2c 100644 --- a/jvmfwk/source/framework.cxx +++ b/jvmfwk/source/framework.cxx @@ -366,7 +366,7 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) if (jfw::getMode() == jfw::JFW_MODE_DIRECT) return JFW_E_DIRECT_MODE; sal_uInt64 nFeatureFlags = 0; - jfw::CJavaInfo aCurrentInfo; + std::unique_ptr<JavaInfo> aCurrentInfo; //Determine if accessibility support is needed bool bSupportAccessibility = jfw::isAccessibilitySupportDesired(); nFeatureFlags = bSupportAccessibility ? @@ -403,7 +403,7 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) if (jfw_plugin_getJavaInfoFromJavaHome(versionInfos, &pHomeInfo, infos) == javaPluginError::NONE) { - aCurrentInfo = pHomeInfo; + aCurrentInfo.reset(pHomeInfo); // compare features // if the user does not require any features (nFeatureFlags = 0) @@ -433,19 +433,19 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) // if the current Java installation implements all required features: use it if ((pJInfo->nFeatures & nFeatureFlags) == nFeatureFlags) { - aCurrentInfo = pJInfo; + aCurrentInfo.reset(pJInfo); bInfoFound = true; } - else if (static_cast<JavaInfo*>(aCurrentInfo) == nullptr) + else if (!aCurrentInfo) { // current Java installation does not provide all features // but no Java installation has been detected before // -> remember the current one until one is found // that provides all features - aCurrentInfo = pJInfo; + aCurrentInfo.reset(pJInfo); } - - delete pJInfo; + else + delete pJInfo; } ++it; } @@ -494,10 +494,6 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) { JavaInfo* pJInfo = arInfos[ii]; - //We remember the first installation in aCurrentInfo - // if no JavaInfo has been found before - if (aCurrentInfo.getLocation().isEmpty()) - aCurrentInfo = pJInfo; // compare features // If the user does not require any features (nFeatureFlags = 0) // then the first installation is used @@ -505,10 +501,18 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) { //the just found Java implements all required features //currently there is only accessibility!!! - aCurrentInfo = pJInfo; + aCurrentInfo.reset( + jfw::CJavaInfo::copyJavaInfo(pJInfo)); bInfoFound = true; break; } + else if (!aCurrentInfo) + { + // We remember the first installation in aCurrentInfo if + // no JavaInfo has been found before: + aCurrentInfo.reset( + jfw::CJavaInfo::copyJavaInfo(pJInfo)); + } } //The array returned by jfw_plugin_getAllJavaInfos must be freed as well as //its contents @@ -521,7 +525,7 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) //All Java installations found by the current plug-in lib //do not provide the required features. Try the next plug-in } - if (static_cast<JavaInfo*>(aCurrentInfo) == nullptr) + if (!aCurrentInfo) {//The plug-ins did not find a suitable Java. Now try the paths which have been //added manually. //get the list of paths to jre locations which have been added manually @@ -565,15 +569,15 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) { //the just found Java implements all required features //currently there is only accessibility!!! - aCurrentInfo = aInfo.release(); + aCurrentInfo = std::move(aInfo); bInfoFound = true; break; } - else if (aCurrentInfo.getLocation().isEmpty()) + else if (!aCurrentInfo) { // We remember the very first installation in // aCurrentInfo: - aCurrentInfo = aInfo.release(); + aCurrentInfo = std::move(aInfo); } } }//end iterate over paths @@ -582,18 +586,17 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) }// end iterate plug-ins } } - if (static_cast<JavaInfo*>(aCurrentInfo)) + if (aCurrentInfo) { jfw::NodeJava javaNode(jfw::NodeJava::USER); - javaNode.setJavaInfo(aCurrentInfo,true); + javaNode.setJavaInfo(aCurrentInfo.get(),true); javaNode.write(); //remember that this JRE was selected in this process jfw::setJavaSelected(); if (pInfo !=nullptr) { - //copy to out param - pInfo->reset(jfw::CJavaInfo::copyJavaInfo(aCurrentInfo.pInfo)); + *pInfo = std::move(aCurrentInfo); } } else @@ -1036,14 +1039,6 @@ CJavaInfo & CJavaInfo::operator = (const ::JavaInfo* info) return *this; } -OUString CJavaInfo::getLocation() const -{ - if (pInfo) - return OUString(pInfo->sLocation); - else - return OUString(); -} - } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/jvmfwk/source/framework.hxx b/jvmfwk/source/framework.hxx index 04fdf86165bf..3f9e5ff6ab85 100644 --- a/jvmfwk/source/framework.hxx +++ b/jvmfwk/source/framework.hxx @@ -57,8 +57,6 @@ public: const ::JavaInfo* operator ->() const { return pInfo;} operator ::JavaInfo* () { return pInfo;} - OUString getLocation() const; - static JavaInfo * copyJavaInfo(const JavaInfo * pInfo); }; commit 2767dcc7b2dd4c82981ffdae74547223162c71ff Author: Stephan Bergmann <sberg...@redhat.com> Date: Thu Apr 13 12:16:19 2017 +0200 Replace a use of CJavaInfo with std::unique_ptr<JavaInfo> Change-Id: I89cb19969285200a61c47d29e819a50845fa692b diff --git a/jvmfwk/source/framework.cxx b/jvmfwk/source/framework.cxx index b4e94e0d93bf..4786b9424844 100644 --- a/jvmfwk/source/framework.cxx +++ b/jvmfwk/source/framework.cxx @@ -540,14 +540,15 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) for (citLoc it = vecJRELocations.begin(); it != vecJRELocations.end(); ++it) { - jfw::CJavaInfo aInfo; + JavaInfo * info; javaPluginError err = jfw_plugin_getJavaInfoByPath( *it, vendor, versionInfo.sMinVersion, versionInfo.sMaxVersion, versionInfo.vecExcludeVersions, - & aInfo.pInfo); + &info); + std::unique_ptr<JavaInfo> aInfo(info); if (err == javaPluginError::NoJre) continue; if (err == javaPluginError::FailedVersion) @@ -557,20 +558,23 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) if (aInfo) { - //We remember the very first installation in aCurrentInfo - if (aCurrentInfo.getLocation().isEmpty()) - aCurrentInfo = aInfo; // compare features // If the user does not require any features (nFeatureFlags = 0) // then the first installation is used - if ((aInfo.getFeatures() & nFeatureFlags) == nFeatureFlags) + if ((aInfo->nFeatures & nFeatureFlags) == nFeatureFlags) { //the just found Java implements all required features //currently there is only accessibility!!! - aCurrentInfo = aInfo; + aCurrentInfo = aInfo.release(); bInfoFound = true; break; } + else if (aCurrentInfo.getLocation().isEmpty()) + { + // We remember the very first installation in + // aCurrentInfo: + aCurrentInfo = aInfo.release(); + } } }//end iterate over paths if (bInfoFound) @@ -1040,14 +1044,6 @@ OUString CJavaInfo::getLocation() const return OUString(); } -sal_uInt64 CJavaInfo::getFeatures() const -{ - if (pInfo) - return pInfo->nFeatures; - else - return 0l; -} - } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/jvmfwk/source/framework.hxx b/jvmfwk/source/framework.hxx index f514964db995..04fdf86165bf 100644 --- a/jvmfwk/source/framework.hxx +++ b/jvmfwk/source/framework.hxx @@ -58,7 +58,6 @@ public: operator ::JavaInfo* () { return pInfo;} OUString getLocation() const; - sal_uInt64 getFeatures() const; static JavaInfo * copyJavaInfo(const JavaInfo * pInfo); }; commit 41a20d3b3750fa6eeb8061af9dd25723d4698feb Author: Stephan Bergmann <sberg...@redhat.com> Date: Thu Apr 13 12:08:05 2017 +0200 More std::unique_ptr<JavaInfo> lifecycle management Change-Id: If53347633ec4b2f8c2b221ba2057e0c38fa97b67 diff --git a/jvmfwk/inc/elements.hxx b/jvmfwk/inc/elements.hxx index f4766a5c92bd..047c5aab85bc 100644 --- a/jvmfwk/inc/elements.hxx +++ b/jvmfwk/inc/elements.hxx @@ -19,6 +19,9 @@ #ifndef INCLUDED_JVMFWK_SOURCE_ELEMENTS_HXX #define INCLUDED_JVMFWK_SOURCE_ELEMENTS_HXX +#include <sal/config.h> + +#include <memory> #include <vector> #include "jvmfwk/framework.hxx" #include "fwkutil.hxx" @@ -98,7 +101,7 @@ public: /** returns NULL if javaInfo is nil. */ - JavaInfo * makeJavaInfo() const; + std::unique_ptr<JavaInfo> makeJavaInfo() const; }; /** this class represents the java settings based on a particular @@ -294,7 +297,7 @@ public: which needs to be freed by the caller. If both, user and share settings are nil, then NULL is returned. */ - JavaInfo * createJavaInfo() const; + std::unique_ptr<JavaInfo> createJavaInfo() const; /** returns the value of the attribute /java/javaInfo[@vendorUpdate]. */ diff --git a/jvmfwk/source/elements.cxx b/jvmfwk/source/elements.cxx index 4da38c001ed9..353eab37ba6f 100644 --- a/jvmfwk/source/elements.cxx +++ b/jvmfwk/source/elements.cxx @@ -20,6 +20,7 @@ #include <sal/config.h> #include <cassert> +#include <memory> #include "elements.hxx" #include "osl/mutex.hxx" @@ -925,19 +926,14 @@ void CNodeJavaInfo::writeToNode(xmlDoc* pDoc, xmlAddChild(pJavaInfoNode, nodeCrLf); } -JavaInfo * CNodeJavaInfo::makeJavaInfo() const +std::unique_ptr<JavaInfo> CNodeJavaInfo::makeJavaInfo() const { if (bNil || m_bEmptyNode) - return nullptr; - JavaInfo * pInfo = new JavaInfo; - memset(pInfo, 0, sizeof(JavaInfo)); - pInfo->sVendor = sVendor; - pInfo->sLocation = sLocation; - pInfo->sVersion = sVersion; - pInfo->nFeatures = nFeatures; - pInfo->nRequirements = nRequirements; - pInfo->arVendorData = arVendorData; - return pInfo; + return std::unique_ptr<JavaInfo>(); + return std::unique_ptr<JavaInfo>( + new JavaInfo{ + sVendor, sLocation, sVersion, nFeatures, nRequirements, + arVendorData}); } @@ -1002,7 +998,7 @@ void MergedSettings::merge(const NodeJava & share, const NodeJava & user) } -JavaInfo * MergedSettings::createJavaInfo() const +std::unique_ptr<JavaInfo> MergedSettings::createJavaInfo() const { return m_javaInfo.makeJavaInfo(); } diff --git a/jvmfwk/source/framework.cxx b/jvmfwk/source/framework.cxx index 42d99557fc0b..b4e94e0d93bf 100644 --- a/jvmfwk/source/framework.cxx +++ b/jvmfwk/source/framework.cxx @@ -213,7 +213,7 @@ javaFrameworkError jfw_startVM( const jfw::MergedSettings settings; if (!settings.getEnabled()) return JFW_E_JAVA_DISABLED; - aInfo.reset(settings.createJavaInfo()); + aInfo = settings.createJavaInfo(); //check if a Java has ever been selected if (!aInfo) return JFW_E_NO_SELECT; @@ -650,7 +650,7 @@ javaFrameworkError jfw_getSelectedJRE(std::unique_ptr<JavaInfo> *ppInfo) } const jfw::MergedSettings settings; - ppInfo->reset(settings.createJavaInfo()); + *ppInfo = settings.createJavaInfo(); if (!*ppInfo) { return JFW_E_NONE; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits