aboutsummaryrefslogtreecommitdiff
path: root/sdklauncher/src/source/sdklauncher.c
diff options
context:
space:
mode:
Diffstat (limited to 'sdklauncher/src/source/sdklauncher.c')
-rw-r--r--sdklauncher/src/source/sdklauncher.c154
1 files changed, 154 insertions, 0 deletions
diff --git a/sdklauncher/src/source/sdklauncher.c b/sdklauncher/src/source/sdklauncher.c
new file mode 100644
index 000000000..6b2c45c99
--- /dev/null
+++ b/sdklauncher/src/source/sdklauncher.c
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * 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.
+ *
+ * TODO: replace by a jar-exe wrapper.
+ */
+
+#ifdef _WIN32
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <windows.h>
+
+
+int _enable_dprintf = 0;
+
+void dprintf(char *msg, ...) {
+ va_list ap;
+ va_start(ap, msg);
+
+ if (_enable_dprintf) {
+ vfprintf(stderr, msg, ap);
+ }
+
+ va_end(ap);
+}
+
+void display_error(LPSTR description) {
+ DWORD err = GetLastError();
+ LPSTR s, s2;
+
+ fprintf(stderr, "%s, error %ld\n", description, err);
+
+ if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | /* dwFlags */
+ FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL, /* lpSource */
+ err, /* dwMessageId */
+ 0, /* dwLanguageId */
+ (LPSTR)&s, /* lpBuffer */
+ 0, /* nSize */
+ NULL) != 0) { /* va_list args */
+ fprintf(stderr, "%s", s);
+
+ s2 = (LPSTR) malloc(strlen(description) + strlen(s) + 5);
+ sprintf(s2, "%s\r\n%s", description, s);
+ MessageBox(NULL, s2, "Android SDK Manager - Error", MB_OK);
+ free(s2);
+ LocalFree(s);
+ }
+}
+
+
+int sdk_launcher() {
+ int result = 0;
+ STARTUPINFO startup;
+ PROCESS_INFORMATION pinfo;
+ CHAR program_dir[MAX_PATH];
+ int ret, pos;
+
+ ZeroMemory(&pinfo, sizeof(pinfo));
+
+ ZeroMemory(&startup, sizeof(startup));
+ startup.cb = sizeof(startup);
+ 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));
+ if (ret == 0) {
+ display_error("Failed to get program's filename:");
+ result = 1;
+ } else {
+ /* Remove the last segment to keep only the directory. */
+ pos = ret - 1;
+ while (pos > 0 && program_dir[pos] != '\\') {
+ --pos;
+ }
+ program_dir[pos] = 0;
+ }
+
+ if (!result) {
+ dprintf("Program dir: %s\n", program_dir);
+
+ // SDK Manager.exe is installed by the Windows Installer just below
+ // the tools directory and needs to access tools\android.bat
+ ret = CreateProcess(
+ NULL, /* program path */
+ "tools\\android.bat sdk", /* command-line */
+ NULL, /* process handle is not inheritable */
+ NULL, /* thread handle is not inheritable */
+ TRUE, /* yes, inherit some handles */
+ CREATE_NO_WINDOW, /* we don't want a console */
+ NULL, /* use parent's environment block */
+ program_dir, /* use parent's starting directory */
+ &startup, /* startup info, i.e. std handles */
+ &pinfo);
+
+ if (!ret) {
+ dprintf("CreateProcess returned %d\n", ret);
+
+ // In the ADT bundle, SDK Manager.exe is located in the sdk folder
+ // and needs to access sdk\tools\android.bat
+ ret = CreateProcess(
+ NULL, /* program path */
+ "sdk\\tools\\android.bat sdk", /* command-line */
+ NULL, /* process handle is not inheritable */
+ NULL, /* thread handle is not inheritable */
+ TRUE, /* yes, inherit some handles */
+ CREATE_NO_WINDOW, /* we don't want a console */
+ NULL, /* use parent's environment block */
+ program_dir, /* use parent's starting directory */
+ &startup, /* startup info, i.e. std handles */
+ &pinfo);
+ }
+
+ dprintf("CreateProcess returned %d\n", ret);
+
+ if (!ret) {
+ display_error("Failed to execute tools\\android.bat:");
+ result = 1;
+ }
+ }
+
+ dprintf("Cleanup.\n");
+
+ return result;
+}
+
+int main(int argc, char **argv) {
+ _enable_dprintf = argc > 1 && strcmp(argv[1], "-v") == 0;
+ dprintf("Verbose debug mode.\n");
+
+ return sdk_launcher();
+}
+
+#endif /* _WIN32 */