auto import from //branches/cupcake_rel/...@138607
diff --git a/tools/aidl/aidl.cpp b/tools/aidl/aidl.cpp
index e248763..fc658f5 100644
--- a/tools/aidl/aidl.cpp
+++ b/tools/aidl/aidl.cpp
@@ -610,6 +610,62 @@
 }
 
 // ==========================================================
+static string
+generate_outputFileName(const Options& options, const document_item_type* items)
+{
+    string result;
+
+    // items has already been checked to have only one interface.
+    if (items->item_type == INTERFACE_TYPE) {
+        interface_type* type = (interface_type*)items;
+
+        // create the path to the destination folder based on the
+        // interface package name
+        result = options.outputBaseFolder;
+        result += OS_PATH_SEPARATOR;
+
+        string package = type->package;
+        size_t len = package.length();
+        for (size_t i=0; i<len; i++) {
+            if (package[i] == '.') {
+                package[i] = OS_PATH_SEPARATOR;
+            }
+        }
+
+        result += package;
+        
+        // add the filename by replacing the .aidl extension to .java
+        const char* p = strchr(type->name.data, '.');
+        len = p ? p-type->name.data : strlen(type->name.data);
+
+        result += OS_PATH_SEPARATOR;
+        result.append(type->name.data, len);
+        result += ".java";
+    }
+
+    return result;
+}
+
+// ==========================================================
+static void
+check_outputFileName(const string& path) {
+    size_t len = path.length();
+    for (size_t i=0; i<len ; i++) {
+        if (path[i] == OS_PATH_SEPARATOR) {
+            string p = path.substr(0, i);
+            if (access(path.data(), F_OK) != 0) {
+#ifdef HAVE_MS_C_RUNTIME
+                _mkdir(p.data());
+#else
+                mkdir(p.data(), S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP);
+#endif
+            }
+        }
+    }
+}
+
+
+// ==========================================================
 static int
 parse_preprocessed_file(const string& filename)
 {
@@ -804,7 +860,17 @@
         generate_dep_file(options);
     }
 
-    err = generate_java(options.outputFileName, options.inputFileName.c_str(),
+    // if needed, generate the outputFileName from the outputBaseFolder
+    string outputFileName = options.outputFileName;
+    if (outputFileName.length() == 0 &&
+            options.outputBaseFolder.length() > 0) {
+        outputFileName = generate_outputFileName(options, mainDoc);
+    }
+    
+    // make sure the folders of the output file all exists
+    check_outputFileName(outputFileName);
+
+    err = generate_java(outputFileName, options.inputFileName.c_str(),
                         (interface_type*)mainDoc);
 
     return err;
diff --git a/tools/aidl/options.cpp b/tools/aidl/options.cpp
index 57b10ae..0aa7db2 100644
--- a/tools/aidl/options.cpp
+++ b/tools/aidl/options.cpp
@@ -13,16 +13,19 @@
             "       aidl --preprocess OUTPUT INPUT...\n"
             "\n"
             "OPTIONS:\n"
-            "   -I<DIR>  search path for import statements.\n"
-            "   -d<FILE> generate dependency file.\n"
-            "   -p<FILE> file created by --preprocess to import.\n"
-            "   -b       fail when trying to compile a parcelable.\n"
+            "   -I<DIR>    search path for import statements.\n"
+            "   -d<FILE>   generate dependency file.\n"
+            "   -p<FILE>   file created by --preprocess to import.\n"
+            "   -o<FOLDER> base output folder for generated files.\n"
+            "   -b         fail when trying to compile a parcelable.\n"
             "\n"
             "INPUT:\n"
             "   An aidl interface file.\n"
             "\n"
             "OUTPUT:\n"
-            "   The generated interface files. If omitted, the input filename is used, with the .aidl extension changed to a .java extension.\n"
+            "   The generated interface files.\n"
+            "   If omitted and the -o option is not used, the input filename is used, with the .aidl extension changed to a .java extension.\n"
+            "   If the -o option is used, the generated files will be placed in the base output folder, under their package folder\n"
            );
     return 1;
 }
@@ -78,6 +81,14 @@
                         return usage();
                     }
                 }
+                else if (s[1] == 'o') {
+                    if (len > 2) {
+                        options->outputBaseFolder = s+2;
+                    } else {
+                        fprintf(stderr, "-o option (%d) requires a path.\n", i);
+                        return usage();
+                    }
+                }
                 else if (len == 2 && s[1] == 'b') {
                     options->failOnParcelable = true;
                 }
@@ -111,7 +122,7 @@
     if (i < argc) {
         options->outputFileName = argv[i];
         i++;
-    } else {
+    } else if (options->outputBaseFolder.length() == 0) {
         // copy input into output and change the extension from .aidl to .java
         options->outputFileName = options->inputFileName;
         string::size_type pos = options->outputFileName.size()-5;
diff --git a/tools/aidl/options.h b/tools/aidl/options.h
index dc3c45a..e9bf0f7 100644
--- a/tools/aidl/options.h
+++ b/tools/aidl/options.h
@@ -20,6 +20,7 @@
     vector<string> preprocessedFiles;
     string inputFileName;
     string outputFileName;
+    string outputBaseFolder;
     string depFileName;
 
     vector<string> filesToPreprocess;