Add nanopb-specific package name option (#422)
diff --git a/docs/reference.rst b/docs/reference.rst
index eff5fd1..8c09b63 100644
--- a/docs/reference.rst
+++ b/docs/reference.rst
@@ -102,6 +102,9 @@
                                (max_size must also be defined).
 fixed_count                    Generate arrays with constant length
                                (max_count must also be defined).
+package                        Package name that applies only for nanopb
+                               generator, as opposed to the .proto file
+                               *package* keyword that applies for all languages.
 ============================  ================================================
 
 These options can be defined for the .proto files before they are converted
diff --git a/generator/nanopb_generator.py b/generator/nanopb_generator.py
index 0b365a2..83264d9 100755
--- a/generator/nanopb_generator.py
+++ b/generator/nanopb_generator.py
@@ -1333,6 +1333,10 @@
             replacement_prefix = ""
             for part in self.fdesc.package.split("."):
                 replacement_prefix += part[0]
+        elif self.file_options.package:
+            strip_prefix = "." + self.fdesc.package
+            replacement_prefix = self.file_options.package
+
 
         def create_name(names):
             if mangle_names == nanopb_pb2.M_NONE or mangle_names == nanopb_pb2.M_PACKAGE_INITIALS:
@@ -1353,14 +1357,15 @@
                     return "." + replacement_prefix + typename[len(strip_prefix):]
                 else:
                     return typename[len(strip_prefix):]
+            elif self.file_options.package:
+                return "." + replacement_prefix + typename
             else:
                 return typename
 
-        if self.fdesc.package:
-            if replacement_prefix is not None:
-                base_name = Names(replacement_prefix)
-            else:
-                base_name = Names(self.fdesc.package.split('.'))
+        if replacement_prefix is not None:
+            base_name = Names(replacement_prefix.split('.'))
+        elif self.fdesc.package:
+            base_name = Names(self.fdesc.package.split('.'))
         else:
             base_name = Names()
 
@@ -1390,6 +1395,11 @@
         for names, extension in iterate_extensions(self.fdesc, flatten):
             name = create_name(names + extension.name)
             field_options = get_nanopb_suboptions(extension, self.file_options, name)
+
+            extension = copy.deepcopy(extension)
+            if extension.type in (FieldD.TYPE_MESSAGE, FieldD.TYPE_ENUM):
+                extension.type_name = mangle_field_typename(extension.type_name)
+
             if field_options.type != nanopb_pb2.FT_IGNORE:
                 self.extensions.append(ExtensionField(name, extension, field_options))
 
diff --git a/generator/proto/nanopb.proto b/generator/proto/nanopb.proto
index 7138b88..2480913 100644
--- a/generator/proto/nanopb.proto
+++ b/generator/proto/nanopb.proto
@@ -131,6 +131,9 @@
 
   // Extra files to include in generated `.pb.h`
   repeated string include = 24;
+
+  // Package name that applies only for nanopb.
+  optional string package = 25;
 }
 
 // Extensions to protoc 'Descriptor' type in order to define options