PlatformAndroid.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include <Atomic/IO/MemoryBuffer.h>
  2. #include <Atomic/IO/FileSystem.h>
  3. #include "../ToolEnvironment.h"
  4. #include "../Subprocess/SubprocessSystem.h"
  5. #include "../License/LicenseSystem.h"
  6. #include "../Build/BuildAndroid.h"
  7. #include "PlatformAndroid.h"
  8. namespace ToolCore
  9. {
  10. PlatformAndroid::PlatformAndroid(Context* context) : Platform(context)
  11. {
  12. }
  13. PlatformAndroid::~PlatformAndroid()
  14. {
  15. }
  16. BuildBase* PlatformAndroid::NewBuild(Project *project)
  17. {
  18. return new BuildAndroid(context_, project);
  19. }
  20. void PlatformAndroid::PrependAndroidCommandArgs(Vector<String> args)
  21. {
  22. #ifdef ATOMIC_PLATFORM_WINDOWS
  23. // android is a batch file on windows, so have to run with cmd /c
  24. args.Push("/c");
  25. args.Push("\"" + GetAndroidCommand() + "\"");
  26. #endif
  27. }
  28. void PlatformAndroid::HandleRefreshAndroidTargetsEvent(StringHash eventType, VariantMap& eventData)
  29. {
  30. if (eventType == E_SUBPROCESSOUTPUT)
  31. {
  32. targetOutput_ += eventData[SubprocessOutput::P_TEXT].GetString();
  33. }
  34. else if (eventType == E_SUBPROCESSCOMPLETE)
  35. {
  36. refreshAndroidTargetsProcess_ = 0;
  37. androidTargets_.Clear();
  38. MemoryBuffer reader(targetOutput_.CString(), targetOutput_.Length() + 1);
  39. while (!reader.IsEof())
  40. {
  41. String line = reader.ReadLine();
  42. if (line.StartsWith("id:"))
  43. {
  44. //id: 33 or "Google Inc.:Google APIs (x86 System Image):19"
  45. Vector<String> elements = line.Split('\"');
  46. if (elements.Size() == 2)
  47. {
  48. String api = elements[1];
  49. androidTargets_.Push(api);
  50. }
  51. }
  52. }
  53. SendEvent(E_ANDROIDTARGETSREFRESHED);
  54. }
  55. }
  56. void PlatformAndroid::RefreshAndroidTargets()
  57. {
  58. if (refreshAndroidTargetsProcess_.NotNull())
  59. return;
  60. SubprocessSystem* subs = GetSubsystem<SubprocessSystem>();
  61. String androidCommand = GetAndroidCommand();
  62. Vector<String> args;
  63. PrependAndroidCommandArgs(args);
  64. args.Push("list");
  65. args.Push("targets");
  66. targetOutput_.Clear();
  67. refreshAndroidTargetsProcess_ = subs->Launch(androidCommand, args);
  68. if (refreshAndroidTargetsProcess_.NotNull())
  69. {
  70. SubscribeToEvent(refreshAndroidTargetsProcess_, E_SUBPROCESSCOMPLETE, HANDLER(PlatformAndroid, HandleRefreshAndroidTargetsEvent));
  71. SubscribeToEvent(refreshAndroidTargetsProcess_, E_SUBPROCESSOUTPUT, HANDLER(PlatformAndroid, HandleRefreshAndroidTargetsEvent));
  72. }
  73. }
  74. String PlatformAndroid::GetADBCommand() const
  75. {
  76. ToolPrefs* prefs = GetSubsystem<ToolEnvironment>()->GetToolPrefs();
  77. String adbCommand = prefs->GetAndroidSDKPath();
  78. #ifdef ATOMIC_PLATFORM_OSX
  79. adbCommand += "/platform-tools/adb";
  80. #else
  81. adbCommand += "/platform-tools/adb.exe";
  82. #endif
  83. return adbCommand;
  84. }
  85. String PlatformAndroid::GetAndroidCommand() const
  86. {
  87. ToolPrefs* prefs = GetSubsystem<ToolEnvironment>()->GetToolPrefs();
  88. String androidCommand = GetNativePath(prefs->GetAndroidSDKPath());
  89. if (!androidCommand.Length())
  90. return String::EMPTY;
  91. #ifdef ATOMIC_PLATFORM_OSX
  92. //Vector<String> args = String("list targets").Split(' ');
  93. androidCommand += "/tools/android";
  94. #else
  95. // android is a batch file on windows, so have to run with cmd /c
  96. androidCommand += "\\tools\\android.bat";
  97. //androidCommand = "cmd";
  98. #endif
  99. return androidCommand;
  100. }
  101. bool PlatformAndroid::GetLicense()
  102. {
  103. // BEGIN LICENSE MANAGEMENT
  104. return GetSubsystem<LicenseSystem>()->GetLicenseAndroid();
  105. // END LICENSE MANAGEMENT
  106. }
  107. }