SDK Manager Windows: detach from java process.

This fixes 2 issues:
- A bug in android.bat was that the bat+lib were
  only copied if the arguments were 'update sdk'.
  However since Tools R14 the sdkmanager doesn't
  use these arguments anymore.
- Consequently when invoked as 'android sdk' it was
  not copying itself in the temp folder and thus
  was locking the tools folder, preventing updates.
- The new behavior is to always copy, like that we
  don't care how the app is launched.

- The SDK Manager.exe was launching android.bat and
  then waiting for it to finish, capturing its
  stdout in care there's an error to display.
  That locks SDK Manager.exe and thus prevent from
  updating it too. So instead we just don't wait for
  the bat to finish, don't capture/display its stdout.
  If there's an error, the user can still use the
  command line version to find out what's wrong.

SDK Bugs: 21212:SDK Setup.exe [keeps] an open file handle
SDK Bugs: 11989:SDK Manager.exe should be able to detach
(it doesn't do the part where the sdk manager could restart
 itself after an update though. I'll file a different issue.)

Change-Id: Id473ce58d3f36d417b6c0ee5f07a039adbbe06c0
diff --git a/sdklauncher/sdklauncher.c b/sdklauncher/sdklauncher.c
index 570da86..fd03d99 100644
--- a/sdklauncher/sdklauncher.c
+++ b/sdklauncher/sdklauncher.c
@@ -18,7 +18,6 @@
  * The "SDK Manager" is for Windows only.
  * This simple .exe will sit at the root of the Windows SDK
  * and currently simply executes tools\android.bat.
- * Eventually it should simply replace the batch file.
  *
  * TODO: replace by a jar-exe wrapper.
  */
@@ -69,137 +68,19 @@
 }
 
 
-HANDLE create_temp_file(LPSTR temp_filename) {
-
-    HANDLE file_handle = INVALID_HANDLE_VALUE;
-    LPSTR temp_path = (LPSTR) malloc(MAX_PATH);
-
-    /* Get the temp directory path using GetTempPath.
-       GetTempFilename indicates that the temp path dir should not be larger than MAX_PATH-14.
-    */
-    int ret = GetTempPath(MAX_PATH - 14, temp_path);
-    if (ret > MAX_PATH || ret == 0) {
-        display_error("GetTempPath failed");
-        free(temp_path);
-        return INVALID_HANDLE_VALUE;
-    }
-
-    /* Now get a temp filename in the temp directory. */
-    if (!GetTempFileName(temp_path, "txt", 0, temp_filename)) {
-        display_error("GetTempFileName failed");
-
-    } else {
-        SECURITY_ATTRIBUTES sattr;
-        ZeroMemory(&sattr, sizeof(sattr));
-        sattr.nLength = sizeof(SECURITY_ATTRIBUTES);
-        sattr.bInheritHandle = TRUE;
-
-        file_handle = CreateFile(temp_filename,             // filename
-                                 GENERIC_WRITE,             // access: write
-                                 FILE_SHARE_READ,           // share mode: read OK
-                                 &sattr,                    // security attributes
-                                 CREATE_ALWAYS,             // create even if exists
-                                 FILE_ATTRIBUTE_NORMAL,     // flags and attributes
-                                 NULL);                     // template
-        if (file_handle == INVALID_HANDLE_VALUE) {
-            display_error("Create temp file failed");
-        }
-    }
-
-    free(temp_path);
-    return file_handle;
-}
-
-
-void read_temp_file(LPSTR temp_filename) {
-    HANDLE handle;
-
-    handle = CreateFile(temp_filename,             // filename
-                        GENERIC_READ,              // access: read
-                        FILE_SHARE_READ,           // share mode: read OK
-                        NULL,                      // security attributes
-                        OPEN_EXISTING,             // only open existing file
-                        FILE_ATTRIBUTE_NORMAL,     // flags and attributes
-                        NULL);                     // template
-
-    if (handle == INVALID_HANDLE_VALUE) {
-        display_error("Open temp file failed");
-        return;
-    }
-
-    /* Cap the size we're reading.
-       4K is good enough to display in a message box.
-    */
-    DWORD size = 4096;
-
-    LPSTR buffer = (LPSTR) malloc(size + 1);
-
-    LPSTR p = buffer;
-    DWORD num_left = size;
-    DWORD num_read;
-    do {
-        if (!ReadFile(handle, p, num_left, &num_read, NULL)) {
-            display_error("Read Output failed");
-            break;
-        }
-
-        num_left -= num_read;
-        p += num_read;
-    } while (num_read > 0);
-
-    if (p != buffer) {
-        *p = 0;
-
-        /* Only output the buffer if it contains special keywords WARNING or ERROR. */
-        char* s1 = strstr(buffer, "WARNING");
-        char* s2 = strstr(buffer, "ERROR");
-
-        if (s2 != NULL && s2 < s1) {
-            s1 = s2;
-        }
-
-        if (s1 != NULL) {
-            /* We end the message at the first occurence of [INFO]. */
-            s2 = strstr(s1, "[INFO]");
-            if (s2 != NULL) {
-                *s2 = 0;
-            }
-
-            MessageBox(NULL, s1, "Android SDK Manager - Output", MB_OK);
-        }
-
-    }
-
-    free(buffer);
-
-    if (!CloseHandle(handle)) {
-        display_error("CloseHandle read temp file failed");
-    }
-}
-
-
 int sdk_launcher() {
     int                   result = 0;
     STARTUPINFO           startup;
     PROCESS_INFORMATION   pinfo;
     CHAR                  program_dir[MAX_PATH];
     int                   ret, pos;
-    CHAR                  temp_filename[MAX_PATH];
-    HANDLE                temp_handle;
 
     ZeroMemory(&pinfo, sizeof(pinfo));
 
-    temp_handle = create_temp_file(temp_filename);
-    if (temp_handle == INVALID_HANDLE_VALUE) {
-        return 1;
-    }
-
     ZeroMemory(&startup, sizeof(startup));
     startup.cb = sizeof(startup);
-    startup.dwFlags    = STARTF_USESTDHANDLES;
-    startup.hStdInput  = GetStdHandle(STD_INPUT_HANDLE);
-    startup.hStdOutput = temp_handle;
-    startup.hStdError  = temp_handle;
+    startup.dwFlags     = STARTF_USESHOWWINDOW;
+    startup.wShowWindow = SW_HIDE|SW_MINIMIZE;
 
     /* get path of current program, to switch dirs here when executing the command. */
     ret = GetModuleFileName(NULL, program_dir, sizeof(program_dir));
@@ -235,29 +116,11 @@
         if (!ret) {
             display_error("Failed to execute tools\\android.bat:");
             result = 1;
-        } else {
-            dprintf("Wait for process to finish.\n");
-
-            WaitForSingleObject(pinfo.hProcess, INFINITE);
-            CloseHandle(pinfo.hProcess);
-            CloseHandle(pinfo.hThread);
         }
     }
 
     dprintf("Cleanup.\n");
 
-    if (!CloseHandle(temp_handle)) {
-        display_error("CloseHandle temp file failed");
-    }
-
-    if (!result) {
-        read_temp_file(temp_filename);
-    }
-
-    if (!DeleteFile(temp_filename)) {
-        display_error("Delete temp file failed");
-    }
-
     return result;
 }