|
|
@@ -1,7 +1,10 @@
|
|
|
|
|
|
+#include <Atomic/IO/MemoryBuffer.h>
|
|
|
#include <Atomic/IO/FileSystem.h>
|
|
|
|
|
|
#include "../ToolEnvironment.h"
|
|
|
+#include "../Subprocess/SubprocessSystem.h"
|
|
|
+
|
|
|
#include "PlatformAndroid.h"
|
|
|
|
|
|
namespace ToolCore
|
|
|
@@ -24,9 +27,74 @@ BuildBase* PlatformAndroid::NewBuild(Project *project)
|
|
|
|
|
|
void PlatformAndroid::PrependAndroidCommandArgs(Vector<String> args)
|
|
|
{
|
|
|
+#ifdef ATOMIC_PLATFORM_WINDOWS
|
|
|
// android is a batch file on windows, so have to run with cmd /c
|
|
|
args.Push("/c");
|
|
|
args.Push("\"" + GetAndroidCommand() + "\"");
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void PlatformAndroid::HandleRefreshAndroidTargetsEvent(StringHash eventType, VariantMap& eventData)
|
|
|
+{
|
|
|
+ if (eventType == E_SUBPROCESSOUTPUT)
|
|
|
+ {
|
|
|
+ targetOutput_ += eventData[SubprocessOutput::P_TEXT].GetString();
|
|
|
+ }
|
|
|
+ else if (eventType == E_SUBPROCESSCOMPLETE)
|
|
|
+ {
|
|
|
+ refreshAndroidTargetsProcess_ = 0;
|
|
|
+
|
|
|
+ androidTargets_.Clear();
|
|
|
+
|
|
|
+ MemoryBuffer reader(targetOutput_.CString(), targetOutput_.Length() + 1);
|
|
|
+
|
|
|
+ while (!reader.IsEof())
|
|
|
+ {
|
|
|
+ String line = reader.ReadLine();
|
|
|
+ if (line.StartsWith("id:"))
|
|
|
+ {
|
|
|
+ //id: 33 or "Google Inc.:Google APIs (x86 System Image):19"
|
|
|
+ Vector<String> elements = line.Split('\"');
|
|
|
+ if (elements.Size() == 2)
|
|
|
+ {
|
|
|
+ String api = elements[1];
|
|
|
+
|
|
|
+ androidTargets_.Push(api);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ SendEvent(E_ANDROIDTARGETSREFRESHED);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void PlatformAndroid::RefreshAndroidTargets()
|
|
|
+{
|
|
|
+ if (refreshAndroidTargetsProcess_.NotNull())
|
|
|
+ return;
|
|
|
+
|
|
|
+ SubprocessSystem* subs = GetSubsystem<SubprocessSystem>();
|
|
|
+
|
|
|
+ String androidCommand = GetAndroidCommand();
|
|
|
+
|
|
|
+ Vector<String> args;
|
|
|
+ PrependAndroidCommandArgs(args);
|
|
|
+ args.Push("list");
|
|
|
+ args.Push("targets");
|
|
|
+
|
|
|
+ targetOutput_.Clear();
|
|
|
+ refreshAndroidTargetsProcess_ = subs->Launch(androidCommand, args);
|
|
|
+
|
|
|
+ if (refreshAndroidTargetsProcess_.NotNull())
|
|
|
+ {
|
|
|
+
|
|
|
+ SubscribeToEvent(refreshAndroidTargetsProcess_, E_SUBPROCESSCOMPLETE, HANDLER(PlatformAndroid, HandleRefreshAndroidTargetsEvent));
|
|
|
+ SubscribeToEvent(refreshAndroidTargetsProcess_, E_SUBPROCESSOUTPUT, HANDLER(PlatformAndroid, HandleRefreshAndroidTargetsEvent));
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -41,7 +109,7 @@ String PlatformAndroid::GetAndroidCommand() const
|
|
|
|
|
|
#ifdef ATOMIC_PLATFORM_OSX
|
|
|
//Vector<String> args = String("list targets").Split(' ');
|
|
|
- androidCommand += "tools/android";
|
|
|
+ androidCommand += "/tools/android";
|
|
|
#else
|
|
|
|
|
|
// android is a batch file on windows, so have to run with cmd /c
|