PlatformAndroid.cpp 3.3 KB

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