PlatformAndroid.cpp 2.9 KB

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