tizenmanager.cpp 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030
  1. /**************************************************************************
  2. **
  3. ** Copyright (c) 2014 Tomasz Olszak <olszak.tomasz@gmail.com>
  4. ** Contact: http://www.qt-project.org/legal
  5. **
  6. ** This file is part of Qt Creator.
  7. **
  8. ** Commercial License Usage
  9. ** Licensees holding valid commercial Qt licenses may use this file in
  10. ** accordance with the commercial license agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Digia. For licensing terms and
  13. ** conditions see http://qt.digia.com/licensing. For further information
  14. ** use the contact form at http://qt.digia.com/contact-us.
  15. **
  16. ** GNU Lesser General Public License Usage
  17. ** Alternatively, this file may be used under the terms of the GNU Lesser
  18. ** General Public License version 2.1 as published by the Free Software
  19. ** Foundation and appearing in the file LICENSE.LGPL included in the
  20. ** packaging of this file. Please review the following information to
  21. ** ensure the GNU Lesser General Public License version 2.1 requirements
  22. ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
  23. **
  24. ** In addition, as a special exception, Digia gives you certain additional
  25. ** rights. These rights are described in the Digia Qt LGPL Exception
  26. ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
  27. **
  28. ****************************************************************************/
  29. #include "tizenmanager.h"
  30. #include "tizenconstants.h"
  31. #include <coreplugin/documentmanager.h>
  32. #include <projectexplorer/projectexplorer.h>
  33. #include <projectexplorer/toolchain.h>
  34. #include <projectexplorer/session.h>
  35. #include <projectexplorer/target.h>
  36. #include <qmakeprojectmanager/qmakenodes.h>
  37. #include <qmakeprojectmanager/qmakeproject.h>
  38. #include <qmakeprojectmanager/qmakeprojectmanagerconstants.h>
  39. #include <qmakeprojectmanager/qmakebuildconfiguration.h>
  40. #include <qtsupport/customexecutablerunconfiguration.h>
  41. #include <qtsupport/qtkitinformation.h>
  42. #include <qtsupport/qtsupportconstants.h>
  43. #include <QDir>
  44. #include <QFileSystemWatcher>
  45. #include <QList>
  46. #include <QProcess>
  47. #include <QMessageBox>
  48. #include <QApplication>
  49. #include <QDomDocument>
  50. namespace {
  51. const QLatin1String TizenDirName("tizen");
  52. const QLatin1String TizenManifestName("manifest.xml");
  53. const QLatin1String TizenCommandLineBuildDirName("CommandLineBuild");
  54. const QLatin1String TizenApplicationPackageDirName("ApplicationPackage");
  55. } // anonymous namespace
  56. namespace Tizen {
  57. namespace Internal {
  58. bool TizenManager::supportsTizen(ProjectExplorer::Target *target)
  59. {
  60. if (!qobject_cast<QmakeProjectManager::QmakeProject *>(target->project()))
  61. return false;
  62. QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target->kit());
  63. return version && version->type() == QLatin1String(QLatin1String(Constants::TIZEN_QT));
  64. }
  65. QString TizenManager::packageName(ProjectExplorer::Target *target)
  66. {
  67. return QString(QLatin1String("%1-%2-%3.tpk"))
  68. .arg(packageId(target))
  69. .arg(packageVersionString(target))
  70. .arg(targetArch(target));
  71. }
  72. //bool TizenManager::setPackageName(ProjectExplorer::Target *target, const QString &name)
  73. //{
  74. // QDomDocument doc;
  75. // if (!openManifest(target, doc))
  76. // return false;
  77. // QDomElement manifestElem = doc.documentElement();
  78. // manifestElem.setAttribute(QLatin1String("package"), cleanPackageName(name));
  79. // return saveManifest(target, doc);
  80. //}
  81. QString TizenManager::applicationName(ProjectExplorer::Target *target)
  82. {
  83. // QDomDocument doc;
  84. // if (!openManifest(target,doc))
  85. // return QString();
  86. // QDomElement metadataElem = doc.documentElement().firstChildElement(QLatin1String("string"));
  87. // while (!metadataElem.isNull()) {
  88. // if (metadataElem.attribute(QLatin1String("name")) == QLatin1String("app_name"))
  89. // return metadataElem.text();
  90. // metadataElem = metadataElem.nextSiblingElement(QLatin1String("string"));
  91. // }
  92. return QString();
  93. }
  94. QString TizenManager::packageId(ProjectExplorer::Target *target)
  95. {
  96. QDomDocument doc;
  97. if (!openManifest(target, doc))
  98. return QString();
  99. QDomElement manifestElem = doc.documentElement();
  100. QDomNodeList ids = manifestElem.elementsByTagName(QLatin1String("Id"));
  101. if (ids.count() > 0) {
  102. return ids.item(0).toElement().text();
  103. }
  104. return QString();
  105. }
  106. QString TizenManager::packageVersionString(ProjectExplorer::Target *target)
  107. {
  108. QDomDocument doc;
  109. if (!openManifest(target, doc))
  110. return QString();
  111. QDomElement manifestElem = doc.documentElement();
  112. QDomNodeList ids = manifestElem.elementsByTagName(QLatin1String("Version"));
  113. if (ids.count() > 0) {
  114. return ids.item(0).toElement().text();
  115. }
  116. return QString();
  117. }
  118. //bool TizenManager::setApplicationName(ProjectExplorer::Target *target, const QString &name)
  119. //{
  120. // QDomDocument doc;
  121. // Utils::FileName path = stringsPath(target);
  122. // if (!openXmlFile(doc, path))
  123. // return false;
  124. // QDomElement metadataElem = doc.documentElement().firstChildElement(QLatin1String("string"));
  125. // while (!metadataElem.isNull()) {
  126. // if (metadataElem.attribute(QLatin1String("name")) == QLatin1String("app_name")) {
  127. // metadataElem.removeChild(metadataElem.firstChild());
  128. // metadataElem.appendChild(doc.createTextNode(name));
  129. // break;
  130. // }
  131. // metadataElem = metadataElem.nextSiblingElement(QLatin1String("string"));
  132. // }
  133. // return saveXmlFile(target, doc, path);
  134. //}
  135. //QString TizenManager::intentName(ProjectExplorer::Target *target)
  136. //{
  137. // return packageName(target) + QLatin1Char('/') + activityName(target);
  138. //}
  139. //QString TizenManager::activityName(ProjectExplorer::Target *target)
  140. //{
  141. // QDomDocument doc;
  142. // if (!openManifest(target, doc))
  143. // return QString();
  144. // QDomElement activityElem = doc.documentElement().firstChildElement(QLatin1String("application")).firstChildElement(QLatin1String("activity"));
  145. // return activityElem.attribute(QLatin1String("android:name"));
  146. //}
  147. //QString TizenManager::targetSDK(ProjectExplorer::Target *target)
  148. //{
  149. // QVariant v = target->namedSettings(QLatin1String("TizenManager.TargetSdk"));
  150. // if (v.isValid())
  151. // return v.toString();
  152. // QString fallback = QLatin1String("android-8");
  153. // if (QtSupport::BaseQtVersion *qt = QtSupport::QtKitInformation::qtVersion(target->kit()))
  154. // if (qt->qtVersion() >= QtSupport::QtVersionNumber(5, 0, 0))
  155. // fallback = QLatin1String("android-9");
  156. // if (!createTizenTemplatesIfNecessary(target))
  157. // return TizenConfigurations::instance().bestMatch(fallback);
  158. // QFile file(defaultPropertiesPath(target).toString());
  159. // if (!file.open(QIODevice::ReadOnly))
  160. // return TizenConfigurations::instance().bestMatch(fallback);
  161. // while (!file.atEnd()) {
  162. // QByteArray line = file.readLine();
  163. // if (line.startsWith("target="))
  164. // return QString::fromLatin1(line.trimmed().mid(7));
  165. // }
  166. // return TizenConfigurations::instance().bestMatch(fallback);
  167. //}
  168. //bool TizenManager::setTargetSDK(ProjectExplorer::Target *target, const QString &sdk)
  169. //{
  170. // updateTarget(target, sdk, applicationName(target));
  171. // target->setNamedSettings(QLatin1String("TizenManager.TargetSdk"), sdk);
  172. // return true;
  173. //}
  174. QString TizenManager::targetArch(ProjectExplorer::Target *target)
  175. {
  176. ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(target->kit());
  177. if (!tc)
  178. return QString();
  179. ProjectExplorer::Abi::Architecture architecture = tc->targetAbi().architecture();
  180. if ( architecture == ProjectExplorer::Abi::ArmArchitecture) {
  181. return QLatin1String("arm");
  182. } else if (architecture == ProjectExplorer::Abi::X86Architecture) {
  183. return QLatin1String("i386");
  184. } else {
  185. return QLatin1String("undefined");
  186. }
  187. return QString();
  188. }
  189. //Utils::FileName TizenManager::dirPath(ProjectExplorer::Target *target)
  190. //{
  191. // return Utils::FileName::fromString(target->project()->projectDirectory()).appendPath(TizenDirName);
  192. //}
  193. Utils::FileName TizenManager::manifestPath(ProjectExplorer::Target *target)
  194. {
  195. return Utils::FileName::fromString(target->project()->projectDirectory()).appendPath(TizenDirName).appendPath(TizenManifestName);
  196. }
  197. Utils::FileName TizenManager::commandLineBuildPath(ProjectExplorer::Target *target)
  198. {
  199. return target->activeBuildConfiguration()->buildDirectory()
  200. .appendPath(TizenApplicationPackageDirName)
  201. .appendPath(packageId(target))
  202. .appendPath(TizenCommandLineBuildDirName);
  203. }
  204. //Utils::FileName TizenManager::libsPath(ProjectExplorer::Target *target)
  205. //{
  206. // return dirPath(target).appendPath(TizenLibsFileName);
  207. //}
  208. //Utils::FileName TizenManager::stringsPath(ProjectExplorer::Target *target)
  209. //{
  210. // return dirPath(target).append(TizenStringsFileName);
  211. //}
  212. //Utils::FileName TizenManager::defaultPropertiesPath(ProjectExplorer::Target *target)
  213. //{
  214. // return dirPath(target).appendPath(TizenDefaultPropertiesName);
  215. //}
  216. //Utils::FileName TizenManager::srcPath(ProjectExplorer::Target *target)
  217. //{
  218. // return dirPath(target).appendPath(QLatin1String("/src"));
  219. //}
  220. //Utils::FileName TizenManager::apkPath(ProjectExplorer::Target *target, BuildType buildType)
  221. //{
  222. // return dirPath(target)
  223. // .appendPath(QLatin1String("bin"))
  224. // .appendPath(QString::fromLatin1("%1-%2.apk")
  225. // .arg(applicationName(target))
  226. // .arg(buildType == DebugBuild
  227. // ? QLatin1String("debug")
  228. // : (buildType == ReleaseBuildUnsigned)
  229. // ? QLatin1String("release-unsigned")
  230. // : QLatin1String("signed")));
  231. //}
  232. //QStringList TizenManager::availableTargetApplications(ProjectExplorer::Target *target)
  233. //{
  234. // QStringList apps;
  235. // Qt4ProjectManager::Qt4Project *qt4Project = qobject_cast<Qt4ProjectManager::Qt4Project *>(target->project());
  236. // foreach (Qt4ProjectManager::Qt4ProFileNode *proFile, qt4Project->applicationProFiles()) {
  237. // if (proFile->projectType() == Qt4ProjectManager::ApplicationTemplate) {
  238. // if (proFile->targetInformation().target.startsWith(QLatin1String("lib"))
  239. // && proFile->targetInformation().target.endsWith(QLatin1String(".so")))
  240. // apps << proFile->targetInformation().target.mid(3, proFile->targetInformation().target.lastIndexOf(QLatin1Char('.')) - 3);
  241. // else
  242. // apps << proFile->targetInformation().target;
  243. // }
  244. // }
  245. // apps.sort();
  246. // return apps;
  247. //}
  248. //QString TizenManager::targetApplication(ProjectExplorer::Target *target)
  249. //{
  250. // QDomDocument doc;
  251. // if (!openManifest(target, doc))
  252. // return QString();
  253. // QDomElement metadataElem = doc.documentElement().firstChildElement(QLatin1String("application")).firstChildElement(QLatin1String("activity")).firstChildElement(QLatin1String("meta-data"));
  254. // while (!metadataElem.isNull()) {
  255. // if (metadataElem.attribute(QLatin1String("android:name")) == QLatin1String("android.app.lib_name"))
  256. // return metadataElem.attribute(QLatin1String("android:value"));
  257. // metadataElem = metadataElem.nextSiblingElement(QLatin1String("meta-data"));
  258. // }
  259. // return QString();
  260. //}
  261. //bool TizenManager::bundleQt(ProjectExplorer::Target *target)
  262. //{
  263. // ProjectExplorer::RunConfiguration *runConfiguration = target->activeRunConfiguration();
  264. // TizenRunConfiguration *androidRunConfiguration = qobject_cast<TizenRunConfiguration *>(runConfiguration);
  265. // if (androidRunConfiguration != 0) {
  266. // TizenDeployStep *deployStep = androidRunConfiguration->deployStep();
  267. // return deployStep->deployAction() == TizenDeployStep::BundleLibraries;
  268. // }
  269. // return false;
  270. //}
  271. //bool TizenManager::updateDeploymentSettings(ProjectExplorer::Target *target)
  272. //{
  273. // // For Qt 4, the "use local libs" options is handled by passing command line arguments to the
  274. // // app, so no need to alter the TizenManifest.xml
  275. // QtSupport::BaseQtVersion *baseQtVersion = QtSupport::QtKitInformation::qtVersion(target->kit());
  276. // if (baseQtVersion == 0 || baseQtVersion->qtVersion() < QtSupport::QtVersionNumber(5,0,0))
  277. // return true;
  278. // ProjectExplorer::RunConfiguration *runConfiguration = target->activeRunConfiguration();
  279. // TizenRunConfiguration *androidRunConfiguration = qobject_cast<TizenRunConfiguration *>(runConfiguration);
  280. // if (androidRunConfiguration == 0)
  281. // return false;
  282. // TizenDeployStep *deployStep = androidRunConfiguration->deployStep();
  283. // TizenDeployStep::TizenDeployAction deployAction = deployStep->deployAction();
  284. // bool useLocalLibs = deployAction == TizenDeployStep::DeployLocal
  285. // || deployAction == TizenDeployStep::BundleLibraries;
  286. // bool bundleQtLibs = deployAction == TizenDeployStep::BundleLibraries;
  287. // QDomDocument doc;
  288. // if (!openManifest(target, doc))
  289. // return false;
  290. // QDomElement metadataElem = doc.documentElement().firstChildElement(QLatin1String("application")).firstChildElement(QLatin1String("activity")).firstChildElement(QLatin1String("meta-data"));
  291. // // ### Passes -1 for API level, which means it won't work with setups that require
  292. // // library selection based on API level. Use the old approach (command line argument)
  293. // // in these cases. Hence the Qt version > 4 condition at the beginning of this function.
  294. // QString localLibs;
  295. // QString localJars;
  296. // QString staticInitClasses;
  297. // if (useLocalLibs) {
  298. // localLibs = loadLocalLibs(target, -1);
  299. // localJars = loadLocalJars(target, -1);
  300. // staticInitClasses = loadLocalJarsInitClasses(target, -1);
  301. // }
  302. // bool changedManifest = false;
  303. // while (!metadataElem.isNull()) {
  304. // if (metadataElem.attribute(QLatin1String("android:name")) == QLatin1String("android.app.use_local_qt_libs")) {
  305. // if (metadataElem.attribute(QLatin1String("android:value")).toInt() != int(useLocalLibs)) {
  306. // metadataElem.setAttribute(QLatin1String("android:value"), int(useLocalLibs));
  307. // changedManifest = true;
  308. // }
  309. // } else if (metadataElem.attribute(QLatin1String("android:name")) == QLatin1String("android.app.load_local_libs")) {
  310. // if (metadataElem.attribute(QLatin1String("android:value")) != localLibs) {
  311. // metadataElem.setAttribute(QLatin1String("android:value"), localLibs);
  312. // changedManifest = true;
  313. // }
  314. // } else if (metadataElem.attribute(QLatin1String("android:name")) == QLatin1String("android.app.load_local_jars")) {
  315. // if (metadataElem.attribute(QLatin1String("android:value")) != localJars) {
  316. // metadataElem.setAttribute(QLatin1String("android:value"), localJars);
  317. // changedManifest = true;
  318. // }
  319. // } else if (metadataElem.attribute(QLatin1String("android:name")) == QLatin1String("android.app.static_init_classes")) {
  320. // if (metadataElem.attribute(QLatin1String("android:value")) != staticInitClasses) {
  321. // metadataElem.setAttribute(QLatin1String("android:value"), staticInitClasses);
  322. // changedManifest = true;
  323. // }
  324. // } else if (metadataElem.attribute(QLatin1String("android:name")) == QLatin1String("android.app.bundle_local_qt_libs")) {
  325. // if (metadataElem.attribute(QLatin1String("android:value")).toInt() != int(bundleQtLibs)) {
  326. // metadataElem.setAttribute(QLatin1String("android:value"), int(bundleQtLibs));
  327. // changedManifest = true;
  328. // }
  329. // }
  330. // metadataElem = metadataElem.nextSiblingElement(QLatin1String("meta-data"));
  331. // }
  332. // if (changedManifest)
  333. // return saveManifest(target, doc);
  334. // else
  335. // return true;
  336. //}
  337. //bool TizenManager::setTargetApplication(ProjectExplorer::Target *target, const QString &name)
  338. //{
  339. // QDomDocument doc;
  340. // if (!openManifest(target, doc))
  341. // return false;
  342. // QDomElement metadataElem = doc.documentElement().firstChildElement(QLatin1String("application")).firstChildElement(QLatin1String("activity")).firstChildElement(QLatin1String("meta-data"));
  343. // while (!metadataElem.isNull()) {
  344. // if (metadataElem.attribute(QLatin1String("android:name")) == QLatin1String("android.app.lib_name")) {
  345. // metadataElem.setAttribute(QLatin1String("android:value"), name);
  346. // return saveManifest(target, doc);
  347. // }
  348. // metadataElem = metadataElem.nextSiblingElement(QLatin1String("meta-data"));
  349. // }
  350. // return false;
  351. //}
  352. //QString TizenManager::targetApplicationPath(ProjectExplorer::Target *target)
  353. //{
  354. // QString selectedApp = targetApplication(target);
  355. // if (selectedApp.isEmpty())
  356. // return QString();
  357. // Qt4ProjectManager::Qt4Project *qt4Project = qobject_cast<Qt4ProjectManager::Qt4Project *>(target->project());
  358. // foreach (Qt4ProjectManager::Qt4ProFileNode *proFile, qt4Project->applicationProFiles()) {
  359. // if (proFile->projectType() == Qt4ProjectManager::ApplicationTemplate) {
  360. // if (proFile->targetInformation().target.startsWith(QLatin1String("lib"))
  361. // && proFile->targetInformation().target.endsWith(QLatin1String(".so"))) {
  362. // if (proFile->targetInformation().target.mid(3, proFile->targetInformation().target.lastIndexOf(QLatin1Char('.')) - 3)
  363. // == selectedApp)
  364. // return proFile->targetInformation().buildDir + QLatin1Char('/') + proFile->targetInformation().target;
  365. // } else {
  366. // if (proFile->targetInformation().target == selectedApp)
  367. // return proFile->targetInformation().buildDir + QLatin1String("/lib") + proFile->targetInformation().target + QLatin1String(".so");
  368. // }
  369. // }
  370. // }
  371. // return QString();
  372. //}
  373. //bool TizenManager::createTizenTemplatesIfNecessary(ProjectExplorer::Target *target)
  374. //{
  375. // QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target->kit());
  376. // Qt4ProjectManager::Qt4Project *qt4Project = qobject_cast<Qt4ProjectManager::Qt4Project*>(target->project());
  377. // if (!qt4Project || !qt4Project->rootProjectNode() || !version)
  378. // return false;
  379. // Utils::FileName javaSrcPath
  380. // = Utils::FileName::fromString(version->qmakeProperty("QT_INSTALL_PREFIX"))
  381. // .appendPath(QLatin1String("src/android/java"));
  382. // QDir projectDir(qt4Project->projectDirectory());
  383. // Utils::FileName androidPath = dirPath(target);
  384. // QStringList m_ignoreFiles;
  385. // bool forceUpdate = false;
  386. // QDomDocument srcVersionDoc;
  387. // Utils::FileName srcVersionPath = javaSrcPath;
  388. // srcVersionPath.appendPath(QLatin1String("version.xml"));
  389. // if (openXmlFile(srcVersionDoc, srcVersionPath)) {
  390. // QDomDocument dstVersionDoc;
  391. // Utils::FileName dstVersionPath=androidPath;
  392. // dstVersionPath.appendPath(QLatin1String("version.xml"));
  393. // if (openXmlFile(dstVersionDoc, dstVersionPath))
  394. // forceUpdate = (srcVersionDoc.documentElement().attribute(QLatin1String("value")).toDouble()
  395. // > dstVersionDoc.documentElement().attribute(QLatin1String("value")).toDouble());
  396. // else
  397. // forceUpdate = true;
  398. // if (forceUpdate && androidPath.toFileInfo().exists()) {
  399. // QDomElement ignoreFile = srcVersionDoc.documentElement().firstChildElement(QLatin1String("ignore")).firstChildElement(QLatin1String("file"));
  400. // while (!ignoreFile.isNull()) {
  401. // m_ignoreFiles << ignoreFile.text();
  402. // ignoreFile = ignoreFile.nextSiblingElement();
  403. // }
  404. // }
  405. // }
  406. // Utils::FileName src = androidPath;
  407. // src.appendPath(QLatin1String("src"));
  408. // Utils::FileName res = androidPath;
  409. // res.appendPath(QLatin1String("res"));
  410. // if (!forceUpdate && androidPath.toFileInfo().exists()
  411. // && manifestPath(target).toFileInfo().exists()
  412. // && src.toFileInfo().exists()
  413. // && res.toFileInfo().exists())
  414. // return true;
  415. // forceUpdate &= androidPath.toFileInfo().exists();
  416. // if (!dirPath(target).toFileInfo().exists() && !projectDir.mkdir(TizenDirName)) {
  417. // raiseError(tr("Error creating Tizen directory '%1'.").arg(TizenDirName));
  418. // return false;
  419. // }
  420. // QStringList androidFiles;
  421. // QDirIterator it(javaSrcPath.toString(), QDirIterator::Subdirectories);
  422. // int pos = it.path().size();
  423. // while (it.hasNext()) {
  424. // it.next();
  425. // if (it.fileInfo().isDir()) {
  426. // projectDir.mkpath(TizenDirName + it.filePath().mid(pos));
  427. // } else {
  428. // Utils::FileName dstFile = androidPath;
  429. // dstFile.appendPath(it.filePath().mid(pos));
  430. // if (m_ignoreFiles.contains(it.fileName())) {
  431. // continue;
  432. // } else {
  433. // if (dstFile.toFileInfo().exists())
  434. // QFile::remove(dstFile.toString());
  435. // else
  436. // androidFiles << dstFile.toString();
  437. // }
  438. // QFile::copy(it.filePath(), dstFile.toString());
  439. // }
  440. // }
  441. // if (!androidFiles.isEmpty())
  442. // qt4Project->rootProjectNode()->addFiles(ProjectExplorer::UnknownFileType, androidFiles);
  443. // int minApiLevel = 4;
  444. // if (QtSupport::BaseQtVersion *qt = QtSupport::QtKitInformation::qtVersion(target->kit()))
  445. // if (qt->qtVersion() >= QtSupport::QtVersionNumber(5, 0, 0))
  446. // minApiLevel = 9;
  447. // QStringList sdks = TizenConfigurations::instance().sdkTargets(minApiLevel);
  448. // if (sdks.isEmpty()) {
  449. // raiseError(tr("No Qt for Tizen SDKs were found.\nPlease install at least one SDK."));
  450. // return false;
  451. // }
  452. // updateTarget(target, TizenConfigurations::instance().sdkTargets(minApiLevel).at(0));
  453. // QStringList apps = availableTargetApplications(target);
  454. // if (!apps.isEmpty())
  455. // setTargetApplication(target, apps.at(0));
  456. // QString applicationName = target->project()->displayName();
  457. // if (!applicationName.isEmpty()) {
  458. // setPackageName(target, packageName(target) + QLatin1Char('.') + applicationName);
  459. // applicationName[0] = applicationName[0].toUpper();
  460. // setApplicationName(target, applicationName);
  461. // }
  462. // if (forceUpdate)
  463. // QMessageBox::warning(0, tr("Warning"), tr("Tizen files have been updated automatically"));
  464. // return true;
  465. //}
  466. //void TizenManager::updateTarget(ProjectExplorer::Target *target, const QString &targetSDK, const QString &name)
  467. //{
  468. // QString androidDir = dirPath(target).toString();
  469. // Utils::Environment env = Utils::Environment::systemEnvironment();
  470. // QString javaHome = TizenConfigurations::instance().config().openJDKLocation.toString();
  471. // if (!javaHome.isEmpty())
  472. // env.set(QLatin1String("JAVA_HOME"), javaHome);
  473. // // clean previous build
  474. // QProcess androidProc;
  475. // androidProc.setWorkingDirectory(androidDir);
  476. // androidProc.setProcessEnvironment(env.toProcessEnvironment());
  477. // androidProc.start(TizenConfigurations::instance().antToolPath().toString(),
  478. // QStringList() << QLatin1String("clean"));
  479. // if (!androidProc.waitForFinished(-1))
  480. // androidProc.terminate();
  481. // // clean previous build
  482. // int targetSDKNumber = targetSDK.mid(targetSDK.lastIndexOf(QLatin1Char('-')) + 1).toInt();
  483. // bool commentLines = false;
  484. // QDirIterator it(androidDir, QStringList() << QLatin1String("*.java"), QDir::Files, QDirIterator::Subdirectories);
  485. // while (it.hasNext()) {
  486. // it.next();
  487. // QFile file(it.filePath());
  488. // if (!file.open(QIODevice::ReadWrite))
  489. // continue;
  490. // QList<QByteArray> lines = file.readAll().trimmed().split('\n');
  491. // bool modified = false;
  492. // bool comment = false;
  493. // for (int i = 0; i < lines.size(); i++) {
  494. // QByteArray trimmed = lines[i].trimmed();
  495. // if (trimmed.contains("@ANDROID-")) {
  496. // commentLines = targetSDKNumber < trimmed.mid(trimmed.lastIndexOf('-') + 1).toInt();
  497. // comment = !comment;
  498. // continue;
  499. // }
  500. // if (!comment)
  501. // continue;
  502. // if (commentLines) {
  503. // if (!trimmed.startsWith("//QtCreator")) {
  504. // lines[i] = "//QtCreator " + lines[i];
  505. // modified = true;
  506. // }
  507. // } else { if (trimmed.startsWith("//QtCreator")) {
  508. // lines[i] = lines[i].mid(12);
  509. // modified = true;
  510. // }
  511. // }
  512. // }
  513. // if (modified) {
  514. // file.resize(0);
  515. // foreach (const QByteArray &line, lines) {
  516. // file.write(line);
  517. // file.write("\n");
  518. // }
  519. // }
  520. // file.close();
  521. // }
  522. // QStringList params;
  523. // params << QLatin1String("update") << QLatin1String("project") << QLatin1String("-p") << androidDir;
  524. // if (!targetSDK.isEmpty())
  525. // params << QLatin1String("-t") << targetSDK;
  526. // if (!name.isEmpty())
  527. // params << QLatin1String("-n") << name;
  528. // androidProc.start(TizenConfigurations::instance().androidToolPath().toString(), params);
  529. // if (!androidProc.waitForFinished(-1))
  530. // androidProc.terminate();
  531. //}
  532. //Utils::FileName TizenManager::localLibsRulesFilePath(ProjectExplorer::Target *target)
  533. //{
  534. // QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target->kit());
  535. // if (!version)
  536. // return Utils::FileName();
  537. // return Utils::FileName::fromString(version->qmakeProperty("QT_INSTALL_LIBS"));
  538. //}
  539. //QString TizenManager::loadLocalLibs(ProjectExplorer::Target *target, int apiLevel)
  540. //{
  541. // return loadLocal(target, apiLevel, Lib);
  542. //}
  543. //QString TizenManager::loadLocalBundledFiles(ProjectExplorer::Target *target, int apiLevel)
  544. //{
  545. // return loadLocal(target, apiLevel, BundledFile);
  546. //}
  547. //QString TizenManager::loadLocalJars(ProjectExplorer::Target *target, int apiLevel)
  548. //{
  549. // ItemType type = bundleQt(target) ? BundledJar : Jar;
  550. // return loadLocal(target, apiLevel, type);
  551. //}
  552. //QString TizenManager::loadLocalJarsInitClasses(ProjectExplorer::Target *target, int apiLevel)
  553. //{
  554. // ItemType type = bundleQt(target) ? BundledJar : Jar;
  555. // return loadLocal(target, apiLevel, type, QLatin1String("initClass"));
  556. //}
  557. //QVector<TizenManager::Library> TizenManager::availableQtLibsWithDependencies(ProjectExplorer::Target *target)
  558. //{
  559. // QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target->kit());
  560. // if (!target->activeRunConfiguration())
  561. // return QVector<TizenManager::Library>();
  562. // ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(target->kit());
  563. // if (tc->type() != QLatin1String(Constants::ANDROID_TOOLCHAIN_TYPE))
  564. // return QVector<TizenManager::Library>();
  565. // Qt4ProjectManager::Qt4Project *project = static_cast<Qt4ProjectManager::Qt4Project *>(target->project());
  566. // QString arch = project->rootQt4ProjectNode()->singleVariableValue(Qt4ProjectManager::TizenArchVar);
  567. // TizenToolChain *atc = static_cast<TizenToolChain *>(tc);
  568. // QString libgnustl = libGnuStl(arch, atc->ndkToolChainVersion());
  569. // Utils::FileName readelfPath = TizenConfigurations::instance().readelfPath(target->activeRunConfiguration()->abi().architecture(),
  570. // atc->ndkToolChainVersion());
  571. // const Qt4ProjectManager::Qt4Project *const qt4Project
  572. // = qobject_cast<const Qt4ProjectManager::Qt4Project *>(target->project());
  573. // if (!qt4Project || !version)
  574. // return QVector<TizenManager::Library>();
  575. // QString qtLibsPath = version->qmakeProperty("QT_INSTALL_LIBS");
  576. // if (!readelfPath.toFileInfo().exists()) {
  577. // return QVector<TizenManager::Library>();
  578. // }
  579. // LibrariesMap mapLibs;
  580. // QDir libPath;
  581. // QDirIterator it(qtLibsPath, QStringList() << QLatin1String("*.so"), QDir::Files, QDirIterator::Subdirectories);
  582. // while (it.hasNext()) {
  583. // libPath = it.next();
  584. // const QString library = libPath.absolutePath().mid(libPath.absolutePath().lastIndexOf(QLatin1Char('/')) + 1);
  585. // mapLibs[library].dependencies = dependencies(readelfPath, libPath.absolutePath());
  586. // }
  587. // const QString library = libgnustl.mid(libgnustl.lastIndexOf(QLatin1Char('/')) + 1);
  588. // mapLibs[library] = Library();;
  589. // // clean dependencies
  590. // const LibrariesMap::Iterator lend = mapLibs.end();
  591. // for (LibrariesMap::Iterator lit = mapLibs.begin(); lit != lend; ++lit) {
  592. // Library &library = lit.value();
  593. // int it = 0;
  594. // while (it < library.dependencies.size()) {
  595. // const QString &dependName = library.dependencies[it];
  596. // if (!mapLibs.contains(dependName) && dependName.startsWith(QLatin1String("lib")) && dependName.endsWith(QLatin1String(".so")))
  597. // library.dependencies.removeAt(it);
  598. // else
  599. // ++it;
  600. // }
  601. // if (library.dependencies.isEmpty())
  602. // library.level = 0;
  603. // }
  604. // QVector<Library> qtLibraries;
  605. // // calculate the level for every library
  606. // for (LibrariesMap::Iterator lit = mapLibs.begin(); lit != lend; ++lit) {
  607. // Library &library = lit.value();
  608. // const QString &key = lit.key();
  609. // if (library.level < 0)
  610. // setLibraryLevel(key, mapLibs);
  611. // if (library.name.isEmpty() && key.startsWith(QLatin1String("lib")) && key.endsWith(QLatin1String(".so")))
  612. // library.name = key.mid(3, key.length() - 6);
  613. // for (int it = 0; it < library.dependencies.size(); it++) {
  614. // const QString &libName = library.dependencies[it];
  615. // if (libName.startsWith(QLatin1String("lib")) && libName.endsWith(QLatin1String(".so")))
  616. // library.dependencies[it] = libName.mid(3, libName.length() - 6);
  617. // }
  618. // qtLibraries.push_back(library);
  619. // }
  620. // qSort(qtLibraries.begin(), qtLibraries.end(), qtLibrariesLessThan);
  621. // return qtLibraries;
  622. //}
  623. //QStringList TizenManager::availableQtLibs(ProjectExplorer::Target *target)
  624. //{
  625. // QStringList libs;
  626. // QVector<Library> qtLibraries = availableQtLibsWithDependencies(target);
  627. // foreach (Library lib, qtLibraries)
  628. // libs.push_back(lib.name);
  629. // return libs;
  630. //}
  631. //QStringList TizenManager::qtLibs(ProjectExplorer::Target *target)
  632. //{
  633. // return libsXml(target, QLatin1String("qt_libs"));
  634. //}
  635. //bool TizenManager::setQtLibs(ProjectExplorer::Target *target, const QStringList &libs)
  636. //{
  637. // return setLibsXml(target, libs, QLatin1String("qt_libs"));
  638. //}
  639. //bool TizenManager::setBundledInAssets(ProjectExplorer::Target *target, const QStringList &fileList)
  640. //{
  641. // return setLibsXml(target, fileList, QLatin1String("bundled_in_assets"));
  642. //}
  643. //bool TizenManager::setBundledInLib(ProjectExplorer::Target *target, const QStringList &fileList)
  644. //{
  645. // return setLibsXml(target, fileList, QLatin1String("bundled_in_lib"));
  646. //}
  647. //QStringList TizenManager::availablePrebundledLibs(ProjectExplorer::Target *target)
  648. //{
  649. // QStringList libs;
  650. // Qt4ProjectManager::Qt4Project *qt4Project = qobject_cast<Qt4ProjectManager::Qt4Project *>(target->project());
  651. // if (!qt4Project)
  652. // return libs;
  653. // foreach (Qt4ProjectManager::Qt4ProFileNode *node, qt4Project->allProFiles())
  654. // if (node->projectType() == Qt4ProjectManager::LibraryTemplate)
  655. // libs << node->targetInformation().target;
  656. // return libs;
  657. //}
  658. //QStringList TizenManager::prebundledLibs(ProjectExplorer::Target *target)
  659. //{
  660. // return libsXml(target, QLatin1String("bundled_libs"));
  661. //}
  662. //bool TizenManager::setPrebundledLibs(ProjectExplorer::Target *target, const QStringList &libs)
  663. //{
  664. // return setLibsXml(target, libs, QLatin1String("bundled_libs"));
  665. //}
  666. //bool TizenManager::openLibsXml(ProjectExplorer::Target *target, QDomDocument &doc)
  667. //{
  668. // return openXmlFile(doc, libsPath(target));
  669. //}
  670. //bool TizenManager::saveLibsXml(ProjectExplorer::Target *target, QDomDocument &doc)
  671. //{
  672. // return saveXmlFile(target, doc, libsPath(target));
  673. //}
  674. void TizenManager::raiseError(const QString &reason)
  675. {
  676. QMessageBox::critical(0, tr("Tizen project manager"), reason);
  677. }
  678. //QString TizenManager::loadLocal(ProjectExplorer::Target *target, int apiLevel, ItemType item, const QString &attribute)
  679. //{
  680. // QString itemType;
  681. // if (item == Lib)
  682. // itemType = QLatin1String("lib");
  683. // else if (item == BundledFile)
  684. // itemType = QLatin1String("bundled");
  685. // else // Jar or BundledJar
  686. // itemType = QLatin1String("jar");
  687. // QString localLibs;
  688. // QDir rulesFilesDir(localLibsRulesFilePath(target).toString());
  689. // if (!rulesFilesDir.exists())
  690. // return localLibs;
  691. // QStringList libs;
  692. // libs << qtLibs(target) << prebundledLibs(target);
  693. // QFileInfoList rulesFiles = rulesFilesDir.entryInfoList(QStringList() << QLatin1String("*.xml"),
  694. // QDir::Files | QDir::Readable);
  695. // QStringList dependencyLibs;
  696. // QStringList replacedLibs;
  697. // foreach (QFileInfo rulesFile, rulesFiles) {
  698. // if (rulesFile.baseName() != QLatin1String("rules")
  699. // && !rulesFile.baseName().endsWith(QLatin1String("-android-dependencies"))) {
  700. // continue;
  701. // }
  702. // QDomDocument doc;
  703. // if (!openXmlFile(doc, Utils::FileName::fromString(rulesFile.absoluteFilePath())))
  704. // return localLibs;
  705. // QDomElement element = doc.documentElement().firstChildElement(QLatin1String("platforms")).firstChildElement(itemType + QLatin1Char('s')).firstChildElement(QLatin1String("version"));
  706. // while (!element.isNull()) {
  707. // if (element.attribute(QLatin1String("value")).toInt() == apiLevel) {
  708. // if (element.hasAttribute(QLatin1String("symlink")))
  709. // apiLevel = element.attribute(QLatin1String("symlink")).toInt();
  710. // break;
  711. // }
  712. // element = element.nextSiblingElement(QLatin1String("version"));
  713. // }
  714. // element = doc.documentElement().firstChildElement(QLatin1String("dependencies")).firstChildElement(QLatin1String("lib"));
  715. // while (!element.isNull()) {
  716. // if (libs.contains(element.attribute(QLatin1String("name")))) {
  717. // QDomElement libElement = element.firstChildElement(QLatin1String("depends")).firstChildElement(itemType);
  718. // while (!libElement.isNull()) {
  719. // if (libElement.attribute(QLatin1String("bundling")).toInt() == (item == BundledJar ? 1 : 0)) {
  720. // if (libElement.hasAttribute(attribute)) {
  721. // QString dependencyLib = libElement.attribute(attribute).arg(apiLevel);
  722. // if (libElement.hasAttribute(QLatin1String("extends"))) {
  723. // const QString extends = libElement.attribute(QLatin1String("extends"));
  724. // if (libs.contains(extends)) {
  725. // dependencyLibs << dependencyLib;
  726. // }
  727. // } else if (!dependencyLibs.contains(dependencyLib)) {
  728. // dependencyLibs << dependencyLib;
  729. // }
  730. // }
  731. // if (libElement.hasAttribute(QLatin1String("replaces"))) {
  732. // QString replacedLib = libElement.attribute(QLatin1String("replaces")).arg(apiLevel);
  733. // if (!replacedLibs.contains(replacedLib))
  734. // replacedLibs << replacedLib;
  735. // }
  736. // }
  737. // libElement = libElement.nextSiblingElement(itemType);
  738. // }
  739. // libElement = element.firstChildElement(QLatin1String("replaces")).firstChildElement(itemType);
  740. // while (!libElement.isNull()) {
  741. // if (libElement.hasAttribute(attribute)) {
  742. // QString replacedLib = libElement.attribute(attribute).arg(apiLevel);
  743. // if (!replacedLibs.contains(replacedLib))
  744. // replacedLibs << replacedLib;
  745. // }
  746. // libElement = libElement.nextSiblingElement(itemType);
  747. // }
  748. // }
  749. // element = element.nextSiblingElement(QLatin1String("lib"));
  750. // }
  751. // }
  752. // // The next loop requires all library names to end with a ":" so we append one
  753. // // to the end after joining.
  754. // localLibs = dependencyLibs.join(QLatin1String(":")) + QLatin1Char(':');
  755. // foreach (QString replacedLib, replacedLibs)
  756. // localLibs.remove(replacedLib + QLatin1Char(':'));
  757. // return localLibs;
  758. //}
  759. bool TizenManager::openXmlFile(QDomDocument &doc, const Utils::FileName &fileName)
  760. {
  761. QFile f(fileName.toString());
  762. if (!f.open(QIODevice::ReadOnly)) {
  763. qWarning() <<"Can't open file:"<<fileName.toString();
  764. return false;
  765. }
  766. if (!doc.setContent(f.readAll())) {
  767. raiseError(tr("Can't parse '%1'").arg(fileName.toUserOutput()));
  768. return false;
  769. }
  770. return true;
  771. }
  772. bool TizenManager::saveXmlFile(ProjectExplorer::Target *target, QDomDocument &doc, const Utils::FileName &fileName)
  773. {
  774. QFile f(fileName.toString());
  775. if (!f.open(QIODevice::WriteOnly)) {
  776. raiseError(tr("Can't open '%1'").arg(fileName.toUserOutput()));
  777. return false;
  778. }
  779. return f.write(doc.toByteArray(4)) >= 0;
  780. }
  781. bool TizenManager::openManifest(ProjectExplorer::Target *target, QDomDocument &doc)
  782. {
  783. bool ret = openXmlFile(doc, manifestPath(target));
  784. if (!ret) {
  785. raiseError(tr("Can open manifest file '%1'").arg(manifestPath(target).toUserOutput()));
  786. }
  787. return ret;
  788. }
  789. bool TizenManager::saveManifest(ProjectExplorer::Target *target, QDomDocument &doc)
  790. {
  791. Core::FileChangeBlocker blocker(manifestPath(target).toString());
  792. return saveXmlFile(target, doc, manifestPath(target));
  793. }
  794. //QStringList TizenManager::libsXml(ProjectExplorer::Target *target, const QString &tag)
  795. //{
  796. // QStringList libs;
  797. // QDomDocument doc;
  798. // if (!openLibsXml(target, doc))
  799. // return libs;
  800. // QDomElement arrayElem = doc.documentElement().firstChildElement(QLatin1String("array"));
  801. // while (!arrayElem.isNull()) {
  802. // if (arrayElem.attribute(QLatin1String("name")) == tag) {
  803. // arrayElem = arrayElem.firstChildElement(QLatin1String("item"));
  804. // while (!arrayElem.isNull()) {
  805. // libs << arrayElem.text();
  806. // arrayElem = arrayElem.nextSiblingElement(QLatin1String("item"));
  807. // }
  808. // return libs;
  809. // }
  810. // arrayElem = arrayElem.nextSiblingElement(QLatin1String("array"));
  811. // }
  812. // return libs;
  813. //}
  814. //bool TizenManager::setLibsXml(ProjectExplorer::Target *target, const QStringList &libs, const QString &tag)
  815. //{
  816. // QDomDocument doc;
  817. // if (!openLibsXml(target, doc))
  818. // return false;
  819. // QDomElement arrayElem = doc.documentElement().firstChildElement(QLatin1String("array"));
  820. // while (!arrayElem.isNull()) {
  821. // if (arrayElem.attribute(QLatin1String("name")) == tag) {
  822. // doc.documentElement().removeChild(arrayElem);
  823. // arrayElem = doc.createElement(QLatin1String("array"));
  824. // arrayElem.setAttribute(QLatin1String("name"), tag);
  825. // foreach (const QString &lib, libs) {
  826. // QDomElement item = doc.createElement(QLatin1String("item"));
  827. // item.appendChild(doc.createTextNode(lib));
  828. // arrayElem.appendChild(item);
  829. // }
  830. // doc.documentElement().appendChild(arrayElem);
  831. // return saveLibsXml(target, doc);
  832. // }
  833. // arrayElem = arrayElem.nextSiblingElement(QLatin1String("array"));
  834. // }
  835. // return false;
  836. //}
  837. //QStringList TizenManager::dependencies(const Utils::FileName &readelfPath, const QString &lib)
  838. //{
  839. // QStringList libs;
  840. // QProcess readelfProc;
  841. // readelfProc.start(readelfPath.toString(), QStringList() << QLatin1String("-d") << QLatin1String("-W") << lib);
  842. // if (!readelfProc.waitForFinished(-1)) {
  843. // readelfProc.kill();
  844. // return libs;
  845. // }
  846. // QList<QByteArray> lines = readelfProc.readAll().trimmed().split('\n');
  847. // foreach (const QByteArray &line, lines) {
  848. // if (line.contains("(NEEDED)") && line.contains("Shared library:") ) {
  849. // const int pos = line.lastIndexOf('[') + 1;
  850. // libs << QString::fromLatin1(line.mid(pos, line.lastIndexOf(']') - pos));
  851. // }
  852. // }
  853. // return libs;
  854. //}
  855. //int TizenManager::setLibraryLevel(const QString &library, LibrariesMap &mapLibs)
  856. //{
  857. // int maxlevel = mapLibs[library].level;
  858. // if (maxlevel > 0)
  859. // return maxlevel;
  860. // foreach (QString lib, mapLibs[library].dependencies) {
  861. // foreach (const QString &key, mapLibs.keys()) {
  862. // if (library == key)
  863. // continue;
  864. // if (key == lib) {
  865. // int libLevel = mapLibs[key].level;
  866. // if (libLevel < 0)
  867. // libLevel = setLibraryLevel(key, mapLibs);
  868. // if (libLevel > maxlevel)
  869. // maxlevel = libLevel;
  870. // break;
  871. // }
  872. // }
  873. // }
  874. // if (mapLibs[library].level < 0)
  875. // mapLibs[library].level = maxlevel + 1;
  876. // return maxlevel + 1;
  877. //}
  878. //bool TizenManager::qtLibrariesLessThan(const Library &a, const Library &b)
  879. //{
  880. // if (a.level == b.level)
  881. // return a.name < b.name;
  882. // return a.level < b.level;
  883. //}
  884. //QString TizenManager::libGnuStl(const QString &arch, const QString &ndkToolChainVersion)
  885. //{
  886. // return TizenConfigurations::instance().config().ndkLocation.toString()
  887. // + QLatin1String("/sources/cxx-stl/gnu-libstdc++/")
  888. // + ndkToolChainVersion + QLatin1String("/libs/")
  889. // + arch
  890. // + QLatin1String("/libgnustl_shared.so");
  891. //}
  892. //QString TizenManager::libraryPrefix()
  893. //{
  894. // return TizenLibraryPrefix;
  895. //}
  896. } // namespace Internal
  897. } // namespace Tizen