// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google.golang.org/appengine/internal/xmpp/xmpp_service.proto

package xmpp

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package

type XmppServiceError_ErrorCode int32

const (
	XmppServiceError_UNSPECIFIED_ERROR    XmppServiceError_ErrorCode = 1
	XmppServiceError_INVALID_JID          XmppServiceError_ErrorCode = 2
	XmppServiceError_NO_BODY              XmppServiceError_ErrorCode = 3
	XmppServiceError_INVALID_XML          XmppServiceError_ErrorCode = 4
	XmppServiceError_INVALID_TYPE         XmppServiceError_ErrorCode = 5
	XmppServiceError_INVALID_SHOW         XmppServiceError_ErrorCode = 6
	XmppServiceError_EXCEEDED_MAX_SIZE    XmppServiceError_ErrorCode = 7
	XmppServiceError_APPID_ALIAS_REQUIRED XmppServiceError_ErrorCode = 8
	XmppServiceError_NONDEFAULT_MODULE    XmppServiceError_ErrorCode = 9
)

var XmppServiceError_ErrorCode_name = map[int32]string{
	1: "UNSPECIFIED_ERROR",
	2: "INVALID_JID",
	3: "NO_BODY",
	4: "INVALID_XML",
	5: "INVALID_TYPE",
	6: "INVALID_SHOW",
	7: "EXCEEDED_MAX_SIZE",
	8: "APPID_ALIAS_REQUIRED",
	9: "NONDEFAULT_MODULE",
}
var XmppServiceError_ErrorCode_value = map[string]int32{
	"UNSPECIFIED_ERROR":    1,
	"INVALID_JID":          2,
	"NO_BODY":              3,
	"INVALID_XML":          4,
	"INVALID_TYPE":         5,
	"INVALID_SHOW":         6,
	"EXCEEDED_MAX_SIZE":    7,
	"APPID_ALIAS_REQUIRED": 8,
	"NONDEFAULT_MODULE":    9,
}

func (x XmppServiceError_ErrorCode) Enum() *XmppServiceError_ErrorCode {
	p := new(XmppServiceError_ErrorCode)
	*p = x
	return p
}
func (x XmppServiceError_ErrorCode) String() string {
	return proto.EnumName(XmppServiceError_ErrorCode_name, int32(x))
}
func (x *XmppServiceError_ErrorCode) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(XmppServiceError_ErrorCode_value, data, "XmppServiceError_ErrorCode")
	if err != nil {
		return err
	}
	*x = XmppServiceError_ErrorCode(value)
	return nil
}
func (XmppServiceError_ErrorCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_xmpp_service_628da92437bed65f, []int{0, 0}
}

type PresenceResponse_SHOW int32

const (
	PresenceResponse_NORMAL         PresenceResponse_SHOW = 0
	PresenceResponse_AWAY           PresenceResponse_SHOW = 1
	PresenceResponse_DO_NOT_DISTURB PresenceResponse_SHOW = 2
	PresenceResponse_CHAT           PresenceResponse_SHOW = 3
	PresenceResponse_EXTENDED_AWAY  PresenceResponse_SHOW = 4
)

var PresenceResponse_SHOW_name = map[int32]string{
	0: "NORMAL",
	1: "AWAY",
	2: "DO_NOT_DISTURB",
	3: "CHAT",
	4: "EXTENDED_AWAY",
}
var PresenceResponse_SHOW_value = map[string]int32{
	"NORMAL":         0,
	"AWAY":           1,
	"DO_NOT_DISTURB": 2,
	"CHAT":           3,
	"EXTENDED_AWAY":  4,
}

func (x PresenceResponse_SHOW) Enum() *PresenceResponse_SHOW {
	p := new(PresenceResponse_SHOW)
	*p = x
	return p
}
func (x PresenceResponse_SHOW) String() string {
	return proto.EnumName(PresenceResponse_SHOW_name, int32(x))
}
func (x *PresenceResponse_SHOW) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(PresenceResponse_SHOW_value, data, "PresenceResponse_SHOW")
	if err != nil {
		return err
	}
	*x = PresenceResponse_SHOW(value)
	return nil
}
func (PresenceResponse_SHOW) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_xmpp_service_628da92437bed65f, []int{2, 0}
}

type XmppMessageResponse_XmppMessageStatus int32

const (
	XmppMessageResponse_NO_ERROR    XmppMessageResponse_XmppMessageStatus = 0
	XmppMessageResponse_INVALID_JID XmppMessageResponse_XmppMessageStatus = 1
	XmppMessageResponse_OTHER_ERROR XmppMessageResponse_XmppMessageStatus = 2
)

var XmppMessageResponse_XmppMessageStatus_name = map[int32]string{
	0: "NO_ERROR",
	1: "INVALID_JID",
	2: "OTHER_ERROR",
}
var XmppMessageResponse_XmppMessageStatus_value = map[string]int32{
	"NO_ERROR":    0,
	"INVALID_JID": 1,
	"OTHER_ERROR": 2,
}

func (x XmppMessageResponse_XmppMessageStatus) Enum() *XmppMessageResponse_XmppMessageStatus {
	p := new(XmppMessageResponse_XmppMessageStatus)
	*p = x
	return p
}
func (x XmppMessageResponse_XmppMessageStatus) String() string {
	return proto.EnumName(XmppMessageResponse_XmppMessageStatus_name, int32(x))
}
func (x *XmppMessageResponse_XmppMessageStatus) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(XmppMessageResponse_XmppMessageStatus_value, data, "XmppMessageResponse_XmppMessageStatus")
	if err != nil {
		return err
	}
	*x = XmppMessageResponse_XmppMessageStatus(value)
	return nil
}
func (XmppMessageResponse_XmppMessageStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_xmpp_service_628da92437bed65f, []int{6, 0}
}

type XmppServiceError struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *XmppServiceError) Reset()         { *m = XmppServiceError{} }
func (m *XmppServiceError) String() string { return proto.CompactTextString(m) }
func (*XmppServiceError) ProtoMessage()    {}
func (*XmppServiceError) Descriptor() ([]byte, []int) {
	return fileDescriptor_xmpp_service_628da92437bed65f, []int{0}
}
func (m *XmppServiceError) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_XmppServiceError.Unmarshal(m, b)
}
func (m *XmppServiceError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_XmppServiceError.Marshal(b, m, deterministic)
}
func (dst *XmppServiceError) XXX_Merge(src proto.Message) {
	xxx_messageInfo_XmppServiceError.Merge(dst, src)
}
func (m *XmppServiceError) XXX_Size() int {
	return xxx_messageInfo_XmppServiceError.Size(m)
}
func (m *XmppServiceError) XXX_DiscardUnknown() {
	xxx_messageInfo_XmppServiceError.DiscardUnknown(m)
}

var xxx_messageInfo_XmppServiceError proto.InternalMessageInfo

type PresenceRequest struct {
	Jid                  *string  `protobuf:"bytes,1,req,name=jid" json:"jid,omitempty"`
	FromJid              *string  `protobuf:"bytes,2,opt,name=from_jid,json=fromJid" json:"from_jid,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PresenceRequest) Reset()         { *m = PresenceRequest{} }
func (m *PresenceRequest) String() string { return proto.CompactTextString(m) }
func (*PresenceRequest) ProtoMessage()    {}
func (*PresenceRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_xmpp_service_628da92437bed65f, []int{1}
}
func (m *PresenceRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PresenceRequest.Unmarshal(m, b)
}
func (m *PresenceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PresenceRequest.Marshal(b, m, deterministic)
}
func (dst *PresenceRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PresenceRequest.Merge(dst, src)
}
func (m *PresenceRequest) XXX_Size() int {
	return xxx_messageInfo_PresenceRequest.Size(m)
}
func (m *PresenceRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_PresenceRequest.DiscardUnknown(m)
}

var xxx_messageInfo_PresenceRequest proto.InternalMessageInfo

func (m *PresenceRequest) GetJid() string {
	if m != nil && m.Jid != nil {
		return *m.Jid
	}
	return ""
}

func (m *PresenceRequest) GetFromJid() string {
	if m != nil && m.FromJid != nil {
		return *m.FromJid
	}
	return ""
}

type PresenceResponse struct {
	IsAvailable          *bool                  `protobuf:"varint,1,req,name=is_available,json=isAvailable" json:"is_available,omitempty"`
	Presence             *PresenceResponse_SHOW `protobuf:"varint,2,opt,name=presence,enum=appengine.PresenceResponse_SHOW" json:"presence,omitempty"`
	Valid                *bool                  `protobuf:"varint,3,opt,name=valid" json:"valid,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *PresenceResponse) Reset()         { *m = PresenceResponse{} }
func (m *PresenceResponse) String() string { return proto.CompactTextString(m) }
func (*PresenceResponse) ProtoMessage()    {}
func (*PresenceResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_xmpp_service_628da92437bed65f, []int{2}
}
func (m *PresenceResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PresenceResponse.Unmarshal(m, b)
}
func (m *PresenceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PresenceResponse.Marshal(b, m, deterministic)
}
func (dst *PresenceResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PresenceResponse.Merge(dst, src)
}
func (m *PresenceResponse) XXX_Size() int {
	return xxx_messageInfo_PresenceResponse.Size(m)
}
func (m *PresenceResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_PresenceResponse.DiscardUnknown(m)
}

var xxx_messageInfo_PresenceResponse proto.InternalMessageInfo

func (m *PresenceResponse) GetIsAvailable() bool {
	if m != nil && m.IsAvailable != nil {
		return *m.IsAvailable
	}
	return false
}

func (m *PresenceResponse) GetPresence() PresenceResponse_SHOW {
	if m != nil && m.Presence != nil {
		return *m.Presence
	}
	return PresenceResponse_NORMAL
}

func (m *PresenceResponse) GetValid() bool {
	if m != nil && m.Valid != nil {
		return *m.Valid
	}
	return false
}

type BulkPresenceRequest struct {
	Jid                  []string `protobuf:"bytes,1,rep,name=jid" json:"jid,omitempty"`
	FromJid              *string  `protobuf:"bytes,2,opt,name=from_jid,json=fromJid" json:"from_jid,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BulkPresenceRequest) Reset()         { *m = BulkPresenceRequest{} }
func (m *BulkPresenceRequest) String() string { return proto.CompactTextString(m) }
func (*BulkPresenceRequest) ProtoMessage()    {}
func (*BulkPresenceRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_xmpp_service_628da92437bed65f, []int{3}
}
func (m *BulkPresenceRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BulkPresenceRequest.Unmarshal(m, b)
}
func (m *BulkPresenceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BulkPresenceRequest.Marshal(b, m, deterministic)
}
func (dst *BulkPresenceRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BulkPresenceRequest.Merge(dst, src)
}
func (m *BulkPresenceRequest) XXX_Size() int {
	return xxx_messageInfo_BulkPresenceRequest.Size(m)
}
func (m *BulkPresenceRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_BulkPresenceRequest.DiscardUnknown(m)
}

var xxx_messageInfo_BulkPresenceRequest proto.InternalMessageInfo

func (m *BulkPresenceRequest) GetJid() []string {
	if m != nil {
		return m.Jid
	}
	return nil
}

func (m *BulkPresenceRequest) GetFromJid() string {
	if m != nil && m.FromJid != nil {
		return *m.FromJid
	}
	return ""
}

type BulkPresenceResponse struct {
	PresenceResponse     []*PresenceResponse `protobuf:"bytes,1,rep,name=presence_response,json=presenceResponse" json:"presence_response,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *BulkPresenceResponse) Reset()         { *m = BulkPresenceResponse{} }
func (m *BulkPresenceResponse) String() string { return proto.CompactTextString(m) }
func (*BulkPresenceResponse) ProtoMessage()    {}
func (*BulkPresenceResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_xmpp_service_628da92437bed65f, []int{4}
}
func (m *BulkPresenceResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BulkPresenceResponse.Unmarshal(m, b)
}
func (m *BulkPresenceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BulkPresenceResponse.Marshal(b, m, deterministic)
}
func (dst *BulkPresenceResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BulkPresenceResponse.Merge(dst, src)
}
func (m *BulkPresenceResponse) XXX_Size() int {
	return xxx_messageInfo_BulkPresenceResponse.Size(m)
}
func (m *BulkPresenceResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_BulkPresenceResponse.DiscardUnknown(m)
}

var xxx_messageInfo_BulkPresenceResponse proto.InternalMessageInfo

func (m *BulkPresenceResponse) GetPresenceResponse() []*PresenceResponse {
	if m != nil {
		return m.PresenceResponse
	}
	return nil
}

type XmppMessageRequest struct {
	Jid                  []string `protobuf:"bytes,1,rep,name=jid" json:"jid,omitempty"`
	Body                 *string  `protobuf:"bytes,2,req,name=body" json:"body,omitempty"`
	RawXml               *bool    `protobuf:"varint,3,opt,name=raw_xml,json=rawXml,def=0" json:"raw_xml,omitempty"`
	Type                 *string  `protobuf:"bytes,4,opt,name=type,def=chat" json:"type,omitempty"`
	FromJid              *string  `protobuf:"bytes,5,opt,name=from_jid,json=fromJid" json:"from_jid,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *XmppMessageRequest) Reset()         { *m = XmppMessageRequest{} }
func (m *XmppMessageRequest) String() string { return proto.CompactTextString(m) }
func (*XmppMessageRequest) ProtoMessage()    {}
func (*XmppMessageRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_xmpp_service_628da92437bed65f, []int{5}
}
func (m *XmppMessageRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_XmppMessageRequest.Unmarshal(m, b)
}
func (m *XmppMessageRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_XmppMessageRequest.Marshal(b, m, deterministic)
}
func (dst *XmppMessageRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_XmppMessageRequest.Merge(dst, src)
}
func (m *XmppMessageRequest) XXX_Size() int {
	return xxx_messageInfo_XmppMessageRequest.Size(m)
}
func (m *XmppMessageRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_XmppMessageRequest.DiscardUnknown(m)
}

var xxx_messageInfo_XmppMessageRequest proto.InternalMessageInfo

const Default_XmppMessageRequest_RawXml bool = false
const Default_XmppMessageRequest_Type string = "chat"

func (m *XmppMessageRequest) GetJid() []string {
	if m != nil {
		return m.Jid
	}
	return nil
}

func (m *XmppMessageRequest) GetBody() string {
	if m != nil && m.Body != nil {
		return *m.Body
	}
	return ""
}

func (m *XmppMessageRequest) GetRawXml() bool {
	if m != nil && m.RawXml != nil {
		return *m.RawXml
	}
	return Default_XmppMessageRequest_RawXml
}

func (m *XmppMessageRequest) GetType() string {
	if m != nil && m.Type != nil {
		return *m.Type
	}
	return Default_XmppMessageRequest_Type
}

func (m *XmppMessageRequest) GetFromJid() string {
	if m != nil && m.FromJid != nil {
		return *m.FromJid
	}
	return ""
}

type XmppMessageResponse struct {
	Status               []XmppMessageResponse_XmppMessageStatus `protobuf:"varint,1,rep,name=status,enum=appengine.XmppMessageResponse_XmppMessageStatus" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
	XXX_unrecognized     []byte                                  `json:"-"`
	XXX_sizecache        int32                                   `json:"-"`
}

func (m *XmppMessageResponse) Reset()         { *m = XmppMessageResponse{} }
func (m *XmppMessageResponse) String() string { return proto.CompactTextString(m) }
func (*XmppMessageResponse) ProtoMessage()    {}
func (*XmppMessageResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_xmpp_service_628da92437bed65f, []int{6}
}
func (m *XmppMessageResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_XmppMessageResponse.Unmarshal(m, b)
}
func (m *XmppMessageResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_XmppMessageResponse.Marshal(b, m, deterministic)
}
func (dst *XmppMessageResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_XmppMessageResponse.Merge(dst, src)
}
func (m *XmppMessageResponse) XXX_Size() int {
	return xxx_messageInfo_XmppMessageResponse.Size(m)
}
func (m *XmppMessageResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_XmppMessageResponse.DiscardUnknown(m)
}

var xxx_messageInfo_XmppMessageResponse proto.InternalMessageInfo

func (m *XmppMessageResponse) GetStatus() []XmppMessageResponse_XmppMessageStatus {
	if m != nil {
		return m.Status
	}
	return nil
}

type XmppSendPresenceRequest struct {
	Jid                  *string  `protobuf:"bytes,1,req,name=jid" json:"jid,omitempty"`
	Type                 *string  `protobuf:"bytes,2,opt,name=type" json:"type,omitempty"`
	Show                 *string  `protobuf:"bytes,3,opt,name=show" json:"show,omitempty"`
	Status               *string  `protobuf:"bytes,4,opt,name=status" json:"status,omitempty"`
	FromJid              *string  `protobuf:"bytes,5,opt,name=from_jid,json=fromJid" json:"from_jid,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *XmppSendPresenceRequest) Reset()         { *m = XmppSendPresenceRequest{} }
func (m *XmppSendPresenceRequest) String() string { return proto.CompactTextString(m) }
func (*XmppSendPresenceRequest) ProtoMessage()    {}
func (*XmppSendPresenceRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_xmpp_service_628da92437bed65f, []int{7}
}
func (m *XmppSendPresenceRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_XmppSendPresenceRequest.Unmarshal(m, b)
}
func (m *XmppSendPresenceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_XmppSendPresenceRequest.Marshal(b, m, deterministic)
}
func (dst *XmppSendPresenceRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_XmppSendPresenceRequest.Merge(dst, src)
}
func (m *XmppSendPresenceRequest) XXX_Size() int {
	return xxx_messageInfo_XmppSendPresenceRequest.Size(m)
}
func (m *XmppSendPresenceRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_XmppSendPresenceRequest.DiscardUnknown(m)
}

var xxx_messageInfo_XmppSendPresenceRequest proto.InternalMessageInfo

func (m *XmppSendPresenceRequest) GetJid() string {
	if m != nil && m.Jid != nil {
		return *m.Jid
	}
	return ""
}

func (m *XmppSendPresenceRequest) GetType() string {
	if m != nil && m.Type != nil {
		return *m.Type
	}
	return ""
}

func (m *XmppSendPresenceRequest) GetShow() string {
	if m != nil && m.Show != nil {
		return *m.Show
	}
	return ""
}

func (m *XmppSendPresenceRequest) GetStatus() string {
	if m != nil && m.Status != nil {
		return *m.Status
	}
	return ""
}

func (m *XmppSendPresenceRequest) GetFromJid() string {
	if m != nil && m.FromJid != nil {
		return *m.FromJid
	}
	return ""
}

type XmppSendPresenceResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *XmppSendPresenceResponse) Reset()         { *m = XmppSendPresenceResponse{} }
func (m *XmppSendPresenceResponse) String() string { return proto.CompactTextString(m) }
func (*XmppSendPresenceResponse) ProtoMessage()    {}
func (*XmppSendPresenceResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_xmpp_service_628da92437bed65f, []int{8}
}
func (m *XmppSendPresenceResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_XmppSendPresenceResponse.Unmarshal(m, b)
}
func (m *XmppSendPresenceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_XmppSendPresenceResponse.Marshal(b, m, deterministic)
}
func (dst *XmppSendPresenceResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_XmppSendPresenceResponse.Merge(dst, src)
}
func (m *XmppSendPresenceResponse) XXX_Size() int {
	return xxx_messageInfo_XmppSendPresenceResponse.Size(m)
}
func (m *XmppSendPresenceResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_XmppSendPresenceResponse.DiscardUnknown(m)
}

var xxx_messageInfo_XmppSendPresenceResponse proto.InternalMessageInfo

type XmppInviteRequest struct {
	Jid                  *string  `protobuf:"bytes,1,req,name=jid" json:"jid,omitempty"`
	FromJid              *string  `protobuf:"bytes,2,opt,name=from_jid,json=fromJid" json:"from_jid,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *XmppInviteRequest) Reset()         { *m = XmppInviteRequest{} }
func (m *XmppInviteRequest) String() string { return proto.CompactTextString(m) }
func (*XmppInviteRequest) ProtoMessage()    {}
func (*XmppInviteRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_xmpp_service_628da92437bed65f, []int{9}
}
func (m *XmppInviteRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_XmppInviteRequest.Unmarshal(m, b)
}
func (m *XmppInviteRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_XmppInviteRequest.Marshal(b, m, deterministic)
}
func (dst *XmppInviteRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_XmppInviteRequest.Merge(dst, src)
}
func (m *XmppInviteRequest) XXX_Size() int {
	return xxx_messageInfo_XmppInviteRequest.Size(m)
}
func (m *XmppInviteRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_XmppInviteRequest.DiscardUnknown(m)
}

var xxx_messageInfo_XmppInviteRequest proto.InternalMessageInfo

func (m *XmppInviteRequest) GetJid() string {
	if m != nil && m.Jid != nil {
		return *m.Jid
	}
	return ""
}

func (m *XmppInviteRequest) GetFromJid() string {
	if m != nil && m.FromJid != nil {
		return *m.FromJid
	}
	return ""
}

type XmppInviteResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *XmppInviteResponse) Reset()         { *m = XmppInviteResponse{} }
func (m *XmppInviteResponse) String() string { return proto.CompactTextString(m) }
func (*XmppInviteResponse) ProtoMessage()    {}
func (*XmppInviteResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_xmpp_service_628da92437bed65f, []int{10}
}
func (m *XmppInviteResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_XmppInviteResponse.Unmarshal(m, b)
}
func (m *XmppInviteResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_XmppInviteResponse.Marshal(b, m, deterministic)
}
func (dst *XmppInviteResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_XmppInviteResponse.Merge(dst, src)
}
func (m *XmppInviteResponse) XXX_Size() int {
	return xxx_messageInfo_XmppInviteResponse.Size(m)
}
func (m *XmppInviteResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_XmppInviteResponse.DiscardUnknown(m)
}

var xxx_messageInfo_XmppInviteResponse proto.InternalMessageInfo

func init() {
	proto.RegisterType((*XmppServiceError)(nil), "appengine.XmppServiceError")
	proto.RegisterType((*PresenceRequest)(nil), "appengine.PresenceRequest")
	proto.RegisterType((*PresenceResponse)(nil), "appengine.PresenceResponse")
	proto.RegisterType((*BulkPresenceRequest)(nil), "appengine.BulkPresenceRequest")
	proto.RegisterType((*BulkPresenceResponse)(nil), "appengine.BulkPresenceResponse")
	proto.RegisterType((*XmppMessageRequest)(nil), "appengine.XmppMessageRequest")
	proto.RegisterType((*XmppMessageResponse)(nil), "appengine.XmppMessageResponse")
	proto.RegisterType((*XmppSendPresenceRequest)(nil), "appengine.XmppSendPresenceRequest")
	proto.RegisterType((*XmppSendPresenceResponse)(nil), "appengine.XmppSendPresenceResponse")
	proto.RegisterType((*XmppInviteRequest)(nil), "appengine.XmppInviteRequest")
	proto.RegisterType((*XmppInviteResponse)(nil), "appengine.XmppInviteResponse")
}

func init() {
	proto.RegisterFile("google.golang.org/appengine/internal/xmpp/xmpp_service.proto", fileDescriptor_xmpp_service_628da92437bed65f)
}

var fileDescriptor_xmpp_service_628da92437bed65f = []byte{
	// 681 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xcd, 0x72, 0xda, 0x48,
	0x10, 0xb6, 0x40, 0xfc, 0x35, 0x5e, 0x7b, 0x18, 0xb3, 0xbb, 0xec, 0xa6, 0x2a, 0x45, 0x74, 0xf2,
	0x09, 0xa7, 0x7c, 0x74, 0xb9, 0x52, 0x11, 0x68, 0x5c, 0xc8, 0x05, 0x12, 0x19, 0x20, 0xc6, 0xbe,
	0x4c, 0x64, 0x33, 0x96, 0x95, 0x08, 0x49, 0x91, 0x64, 0x6c, 0xbf, 0x40, 0xae, 0x79, 0x89, 0xbc,
	0x46, 0x5e, 0x22, 0xa7, 0x3c, 0x4e, 0x4a, 0x23, 0x41, 0xc0, 0x4e, 0x9c, 0x54, 0x2e, 0x54, 0xcf,
	0x37, 0xdd, 0x1f, 0xfd, 0x7d, 0x3d, 0x2d, 0x38, 0xb4, 0x7d, 0xdf, 0x76, 0x79, 0xcb, 0xf6, 0x5d,
	0xcb, 0xb3, 0x5b, 0x7e, 0x68, 0xef, 0x59, 0x41, 0xc0, 0x3d, 0xdb, 0xf1, 0xf8, 0x9e, 0xe3, 0xc5,
	0x3c, 0xf4, 0x2c, 0x77, 0xef, 0x76, 0x16, 0x04, 0xe2, 0x87, 0x45, 0x3c, 0x9c, 0x3b, 0x17, 0xbc,
	0x15, 0x84, 0x7e, 0xec, 0xe3, 0xca, 0x32, 0x57, 0xf9, 0x22, 0x01, 0x9a, 0xcc, 0x82, 0x60, 0x98,
	0x26, 0x90, 0x30, 0xf4, 0x43, 0xe5, 0xb3, 0x04, 0x15, 0x11, 0x75, 0xfc, 0x29, 0xc7, 0x7f, 0x43,
	0x6d, 0x6c, 0x0c, 0x07, 0xa4, 0xa3, 0x1f, 0xe9, 0x44, 0x63, 0x84, 0x52, 0x93, 0x22, 0x09, 0x6f,
	0x43, 0x55, 0x37, 0x5e, 0xab, 0x3d, 0x5d, 0x63, 0xc7, 0xba, 0x86, 0x72, 0xb8, 0x0a, 0x25, 0xc3,
	0x64, 0x6d, 0x53, 0x3b, 0x45, 0xf9, 0xd5, 0xdb, 0x49, 0xbf, 0x87, 0x64, 0x8c, 0x60, 0x73, 0x01,
	0x8c, 0x4e, 0x07, 0x04, 0x15, 0x56, 0x91, 0x61, 0xd7, 0x3c, 0x41, 0xc5, 0xe4, 0x9f, 0xc8, 0xa4,
	0x43, 0x88, 0x46, 0x34, 0xd6, 0x57, 0x27, 0x6c, 0xa8, 0x9f, 0x11, 0x54, 0xc2, 0x0d, 0xa8, 0xab,
	0x83, 0x81, 0xae, 0x31, 0xb5, 0xa7, 0xab, 0x43, 0x46, 0xc9, 0xab, 0xb1, 0x4e, 0x89, 0x86, 0xca,
	0x49, 0x81, 0x61, 0x1a, 0x1a, 0x39, 0x52, 0xc7, 0xbd, 0x11, 0xeb, 0x9b, 0xda, 0xb8, 0x47, 0x50,
	0x45, 0x79, 0x01, 0xdb, 0x83, 0x90, 0x47, 0xdc, 0xbb, 0xe0, 0x94, 0xbf, 0xbf, 0xe6, 0x51, 0x8c,
	0x11, 0xe4, 0xdf, 0x3a, 0xd3, 0x86, 0xd4, 0xcc, 0xed, 0x56, 0x68, 0x12, 0xe2, 0xff, 0xa0, 0x7c,
	0x19, 0xfa, 0x33, 0x96, 0xc0, 0xb9, 0xa6, 0xb4, 0x5b, 0xa1, 0xa5, 0xe4, 0x7c, 0xec, 0x4c, 0x95,
	0xaf, 0x12, 0xa0, 0xef, 0x04, 0x51, 0xe0, 0x7b, 0x11, 0xc7, 0xcf, 0x60, 0xd3, 0x89, 0x98, 0x35,
	0xb7, 0x1c, 0xd7, 0x3a, 0x77, 0xb9, 0xa0, 0x2a, 0xd3, 0xaa, 0x13, 0xa9, 0x0b, 0x08, 0x1f, 0x42,
	0x39, 0xc8, 0xca, 0x04, 0xe5, 0xd6, 0x7e, 0xb3, 0xb5, 0xb4, 0xba, 0x75, 0x9f, 0xb1, 0x95, 0xa8,
	0xa6, 0xcb, 0x0a, 0x5c, 0x87, 0xc2, 0xdc, 0x72, 0x9d, 0x69, 0x23, 0xdf, 0x94, 0x76, 0xcb, 0x34,
	0x3d, 0x28, 0x7d, 0x90, 0x93, 0x3c, 0x0c, 0x50, 0x34, 0x4c, 0xda, 0x57, 0x7b, 0x68, 0x03, 0x97,
	0x41, 0x56, 0x4f, 0xd4, 0x53, 0x24, 0x61, 0x0c, 0x5b, 0x9a, 0xc9, 0x0c, 0x73, 0xc4, 0x34, 0x7d,
	0x38, 0x1a, 0xd3, 0x36, 0xca, 0x25, 0xb7, 0x9d, 0xae, 0x3a, 0x42, 0x79, 0x5c, 0x83, 0xbf, 0xc8,
	0x64, 0x44, 0x8c, 0xc4, 0x4f, 0x51, 0x20, 0x2b, 0x6d, 0xd8, 0x69, 0x5f, 0xbb, 0xef, 0x7e, 0x6a,
	0x4f, 0xfe, 0x37, 0xec, 0x79, 0x03, 0xf5, 0x75, 0x8e, 0xcc, 0xa1, 0x2e, 0xd4, 0x16, 0x62, 0x58,
	0x98, 0x81, 0x82, 0xb2, 0xba, 0xff, 0xe4, 0x11, 0x1f, 0x28, 0x0a, 0xee, 0x21, 0xca, 0x47, 0x09,
	0x70, 0xf2, 0x2a, 0xfb, 0x3c, 0x8a, 0x2c, 0xfb, 0x91, 0x2e, 0x31, 0xc8, 0xe7, 0xfe, 0xf4, 0xae,
	0x91, 0x13, 0x73, 0x15, 0x31, 0x7e, 0x0a, 0xa5, 0xd0, 0xba, 0x61, 0xb7, 0x33, 0x37, 0x75, 0xf2,
	0xa0, 0x70, 0x69, 0xb9, 0x11, 0xa7, 0xc5, 0xd0, 0xba, 0x99, 0xcc, 0x5c, 0xdc, 0x00, 0x39, 0xbe,
	0x0b, 0x78, 0x43, 0x4e, 0x54, 0x1d, 0xc8, 0x17, 0x57, 0x56, 0x4c, 0x05, 0xb2, 0xa6, 0xb9, 0xb0,
	0xae, 0xf9, 0x93, 0x04, 0x3b, 0x6b, 0x1d, 0x2d, 0x35, 0x17, 0xa3, 0xd8, 0x8a, 0xaf, 0x23, 0xd1,
	0xd5, 0xd6, 0xfe, 0xf3, 0x15, 0xa1, 0x3f, 0xc8, 0x5f, 0xc5, 0x86, 0xa2, 0x8e, 0x66, 0xf5, 0x4a,
	0x07, 0x6a, 0x0f, 0x2e, 0xf1, 0x26, 0x94, 0x0d, 0x33, 0x5b, 0xb9, 0x8d, 0xfb, 0x2b, 0x27, 0x76,
	0xd0, 0x1c, 0x75, 0x09, 0xcd, 0x32, 0x72, 0xca, 0x07, 0x09, 0xfe, 0x4d, 0xd7, 0xd9, 0x9b, 0xfe,
	0x7a, 0x05, 0x70, 0xe6, 0x44, 0x3a, 0xdf, 0xd4, 0x03, 0x0c, 0x72, 0x74, 0xe5, 0xdf, 0x08, 0xeb,
	0x2a, 0x54, 0xc4, 0xf8, 0x9f, 0xa5, 0x48, 0xe1, 0xd9, 0xa2, 0xe5, 0xc7, 0xfc, 0xfa, 0x1f, 0x1a,
	0x0f, 0xfb, 0xc8, 0xa6, 0xfb, 0x32, 0x55, 0xaa, 0x7b, 0x73, 0x27, 0xfe, 0xb3, 0x05, 0xad, 0xa7,
	0xcf, 0x63, 0xc1, 0x90, 0xf2, 0xb6, 0x8b, 0x67, 0x72, 0xf2, 0xb1, 0xfb, 0x16, 0x00, 0x00, 0xff,
	0xff, 0x4e, 0x58, 0x2e, 0xb1, 0x1d, 0x05, 0x00, 0x00,
}
