#!/usr/bin/python2.4
# Generated by the protocol buffer compiler.  DO NOT EDIT!

from froofle.protobuf import descriptor
from froofle.protobuf import message
from froofle.protobuf import reflection
from froofle.protobuf import service
from froofle.protobuf import service_reflection
from froofle.protobuf import descriptor_pb2


_UPLOADBUNDLERESPONSE_CODETYPE = descriptor.EnumDescriptor(
  name='CodeType',
  full_name='codereview.UploadBundleResponse.CodeType',
  filename='CodeType',
  values=[
    descriptor.EnumValueDescriptor(
      name='RECEIVED', index=0, number=1,
      options=None,
      type=None),
    descriptor.EnumValueDescriptor(
      name='CONTINUE', index=1, number=4,
      options=None,
      type=None),
    descriptor.EnumValueDescriptor(
      name='UNAUTHORIZED_USER', index=2, number=7,
      options=None,
      type=None),
    descriptor.EnumValueDescriptor(
      name='UNKNOWN_PROJECT', index=3, number=2,
      options=None,
      type=None),
    descriptor.EnumValueDescriptor(
      name='UNKNOWN_BRANCH', index=4, number=3,
      options=None,
      type=None),
    descriptor.EnumValueDescriptor(
      name='UNKNOWN_BUNDLE', index=5, number=5,
      options=None,
      type=None),
    descriptor.EnumValueDescriptor(
      name='NOT_BUNDLE_OWNER', index=6, number=6,
      options=None,
      type=None),
    descriptor.EnumValueDescriptor(
      name='BUNDLE_CLOSED', index=7, number=8,
      options=None,
      type=None),
  ],
  options=None,
)


_UPLOADBUNDLEREQUEST = descriptor.Descriptor(
  name='UploadBundleRequest',
  full_name='codereview.UploadBundleRequest',
  filename='upload_bundle.proto',
  containing_type=None,
  fields=[
    descriptor.FieldDescriptor(
      name='dest_project', full_name='codereview.UploadBundleRequest.dest_project', index=0,
      number=10, type=9, cpp_type=9, label=2,
      default_value=unicode("", "utf-8"),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    descriptor.FieldDescriptor(
      name='dest_branch', full_name='codereview.UploadBundleRequest.dest_branch', index=1,
      number=11, type=9, cpp_type=9, label=2,
      default_value=unicode("", "utf-8"),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    descriptor.FieldDescriptor(
      name='partial_upload', full_name='codereview.UploadBundleRequest.partial_upload', index=2,
      number=12, type=8, cpp_type=7, label=2,
      default_value=False,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    descriptor.FieldDescriptor(
      name='bundle_data', full_name='codereview.UploadBundleRequest.bundle_data', index=3,
      number=13, type=12, cpp_type=9, label=2,
      default_value="",
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    descriptor.FieldDescriptor(
      name='contained_object', full_name='codereview.UploadBundleRequest.contained_object', index=4,
      number=1, type=9, cpp_type=9, label=3,
      default_value=[],
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
  ],
  extensions=[
  ],
  nested_types=[],  # TODO(robinson): Implement.
  enum_types=[
  ],
  options=None)


_UPLOADBUNDLERESPONSE = descriptor.Descriptor(
  name='UploadBundleResponse',
  full_name='codereview.UploadBundleResponse',
  filename='upload_bundle.proto',
  containing_type=None,
  fields=[
    descriptor.FieldDescriptor(
      name='status_code', full_name='codereview.UploadBundleResponse.status_code', index=0,
      number=10, type=14, cpp_type=8, label=2,
      default_value=1,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    descriptor.FieldDescriptor(
      name='bundle_id', full_name='codereview.UploadBundleResponse.bundle_id', index=1,
      number=11, type=9, cpp_type=9, label=1,
      default_value=unicode("", "utf-8"),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
  ],
  extensions=[
  ],
  nested_types=[],  # TODO(robinson): Implement.
  enum_types=[
    _UPLOADBUNDLERESPONSE_CODETYPE,
  ],
  options=None)


_UPLOADBUNDLECONTINUE = descriptor.Descriptor(
  name='UploadBundleContinue',
  full_name='codereview.UploadBundleContinue',
  filename='upload_bundle.proto',
  containing_type=None,
  fields=[
    descriptor.FieldDescriptor(
      name='bundle_id', full_name='codereview.UploadBundleContinue.bundle_id', index=0,
      number=10, type=9, cpp_type=9, label=2,
      default_value=unicode("", "utf-8"),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    descriptor.FieldDescriptor(
      name='segment_id', full_name='codereview.UploadBundleContinue.segment_id', index=1,
      number=11, type=5, cpp_type=1, label=2,
      default_value=0,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    descriptor.FieldDescriptor(
      name='partial_upload', full_name='codereview.UploadBundleContinue.partial_upload', index=2,
      number=12, type=8, cpp_type=7, label=2,
      default_value=False,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    descriptor.FieldDescriptor(
      name='bundle_data', full_name='codereview.UploadBundleContinue.bundle_data', index=3,
      number=13, type=12, cpp_type=9, label=1,
      default_value="",
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
  ],
  extensions=[
  ],
  nested_types=[],  # TODO(robinson): Implement.
  enum_types=[
  ],
  options=None)


_UPLOADBUNDLERESPONSE.fields_by_name['status_code'].enum_type = _UPLOADBUNDLERESPONSE_CODETYPE

class UploadBundleRequest(message.Message):
  __metaclass__ = reflection.GeneratedProtocolMessageType
  DESCRIPTOR = _UPLOADBUNDLEREQUEST

class UploadBundleResponse(message.Message):
  __metaclass__ = reflection.GeneratedProtocolMessageType
  DESCRIPTOR = _UPLOADBUNDLERESPONSE

class UploadBundleContinue(message.Message):
  __metaclass__ = reflection.GeneratedProtocolMessageType
  DESCRIPTOR = _UPLOADBUNDLECONTINUE

