// Code generated by protoc-gen-go. DO NOT EDIT.
// source: voltha_protos/voip_user_profile.proto

package voip_user_profile

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	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.ProtoPackageIsVersion3 // please upgrade the proto package

// A user specific profile for voip service
type VoipUserProfileRequest struct {
	// for the path in KV store
	Key                  string           `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	VoipUserProfile      *VoipUserProfile `protobuf:"bytes,2,opt,name=voipUserProfile,proto3" json:"voipUserProfile,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *VoipUserProfileRequest) Reset()         { *m = VoipUserProfileRequest{} }
func (m *VoipUserProfileRequest) String() string { return proto.CompactTextString(m) }
func (*VoipUserProfileRequest) ProtoMessage()    {}
func (*VoipUserProfileRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_0ecf0ef501fce1bc, []int{0}
}

func (m *VoipUserProfileRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_VoipUserProfileRequest.Unmarshal(m, b)
}
func (m *VoipUserProfileRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_VoipUserProfileRequest.Marshal(b, m, deterministic)
}
func (m *VoipUserProfileRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_VoipUserProfileRequest.Merge(m, src)
}
func (m *VoipUserProfileRequest) XXX_Size() int {
	return xxx_messageInfo_VoipUserProfileRequest.Size(m)
}
func (m *VoipUserProfileRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_VoipUserProfileRequest.DiscardUnknown(m)
}

var xxx_messageInfo_VoipUserProfileRequest proto.InternalMessageInfo

func (m *VoipUserProfileRequest) GetKey() string {
	if m != nil {
		return m.Key
	}
	return ""
}

func (m *VoipUserProfileRequest) GetVoipUserProfile() *VoipUserProfile {
	if m != nil {
		return m.VoipUserProfile
	}
	return nil
}

type VoipUserProfile struct {
	VoipSystemProfileKey string   `protobuf:"bytes,1,opt,name=voipSystemProfileKey,proto3" json:"voipSystemProfileKey,omitempty"`
	Username             string   `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"`
	Password             string   `protobuf:"bytes,3,opt,name=password,proto3" json:"password,omitempty"`
	Domain               string   `protobuf:"bytes,4,opt,name=domain,proto3" json:"domain,omitempty"`
	Proxy                string   `protobuf:"bytes,5,opt,name=proxy,proto3" json:"proxy,omitempty"`
	Port                 uint32   `protobuf:"varint,6,opt,name=port,proto3" json:"port,omitempty"`
	SipDisplayName       string   `protobuf:"bytes,7,opt,name=sipDisplayName,proto3" json:"sipDisplayName,omitempty"`
	Realm                string   `protobuf:"bytes,8,opt,name=realm,proto3" json:"realm,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *VoipUserProfile) Reset()         { *m = VoipUserProfile{} }
func (m *VoipUserProfile) String() string { return proto.CompactTextString(m) }
func (*VoipUserProfile) ProtoMessage()    {}
func (*VoipUserProfile) Descriptor() ([]byte, []int) {
	return fileDescriptor_0ecf0ef501fce1bc, []int{1}
}

func (m *VoipUserProfile) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_VoipUserProfile.Unmarshal(m, b)
}
func (m *VoipUserProfile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_VoipUserProfile.Marshal(b, m, deterministic)
}
func (m *VoipUserProfile) XXX_Merge(src proto.Message) {
	xxx_messageInfo_VoipUserProfile.Merge(m, src)
}
func (m *VoipUserProfile) XXX_Size() int {
	return xxx_messageInfo_VoipUserProfile.Size(m)
}
func (m *VoipUserProfile) XXX_DiscardUnknown() {
	xxx_messageInfo_VoipUserProfile.DiscardUnknown(m)
}

var xxx_messageInfo_VoipUserProfile proto.InternalMessageInfo

func (m *VoipUserProfile) GetVoipSystemProfileKey() string {
	if m != nil {
		return m.VoipSystemProfileKey
	}
	return ""
}

func (m *VoipUserProfile) GetUsername() string {
	if m != nil {
		return m.Username
	}
	return ""
}

func (m *VoipUserProfile) GetPassword() string {
	if m != nil {
		return m.Password
	}
	return ""
}

func (m *VoipUserProfile) GetDomain() string {
	if m != nil {
		return m.Domain
	}
	return ""
}

func (m *VoipUserProfile) GetProxy() string {
	if m != nil {
		return m.Proxy
	}
	return ""
}

func (m *VoipUserProfile) GetPort() uint32 {
	if m != nil {
		return m.Port
	}
	return 0
}

func (m *VoipUserProfile) GetSipDisplayName() string {
	if m != nil {
		return m.SipDisplayName
	}
	return ""
}

func (m *VoipUserProfile) GetRealm() string {
	if m != nil {
		return m.Realm
	}
	return ""
}

func init() {
	proto.RegisterType((*VoipUserProfileRequest)(nil), "voip_user_profile.VoipUserProfileRequest")
	proto.RegisterType((*VoipUserProfile)(nil), "voip_user_profile.VoipUserProfile")
}

func init() {
	proto.RegisterFile("voltha_protos/voip_user_profile.proto", fileDescriptor_0ecf0ef501fce1bc)
}

var fileDescriptor_0ecf0ef501fce1bc = []byte{
	// 322 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0xcb, 0x4b, 0x33, 0x31,
	0x10, 0x67, 0xbf, 0x3e, 0xbe, 0x76, 0x44, 0xab, 0xa1, 0x94, 0x50, 0x3c, 0x94, 0x42, 0xa5, 0x17,
	0x77, 0xa1, 0xe2, 0xc1, 0xab, 0x78, 0x53, 0x44, 0x56, 0xf4, 0xe0, 0xa5, 0xa4, 0x6d, 0xdc, 0x06,
	0x77, 0x77, 0x62, 0x92, 0xd6, 0xee, 0x1f, 0x2f, 0x48, 0x92, 0x6e, 0xc1, 0x5d, 0x6f, 0xf3, 0x7b,
	0xcd, 0x0c, 0xc9, 0xc0, 0x64, 0x8b, 0xa9, 0x59, 0xb3, 0xb9, 0x54, 0x68, 0x50, 0x47, 0x5b, 0x14,
	0x72, 0xbe, 0xd1, 0x5c, 0x59, 0xe2, 0x5d, 0xa4, 0x3c, 0x74, 0x02, 0x39, 0xab, 0x09, 0xc3, 0xf3,
	0x04, 0x31, 0x49, 0x79, 0xc4, 0xa4, 0x88, 0x58, 0x9e, 0xa3, 0x61, 0x46, 0x60, 0xae, 0x7d, 0x60,
	0xbc, 0x83, 0xc1, 0x2b, 0x0a, 0xf9, 0xa2, 0xb9, 0x7a, 0xf2, 0x81, 0x98, 0x7f, 0x6e, 0xb8, 0x36,
	0xe4, 0x14, 0x1a, 0x1f, 0xbc, 0xa0, 0xc1, 0x28, 0x98, 0x76, 0x63, 0x5b, 0x92, 0x07, 0xe8, 0x6d,
	0x7f, 0x7b, 0xe9, 0xbf, 0x51, 0x30, 0x3d, 0x9a, 0x8d, 0xc3, 0xfa, 0x3e, 0xd5, 0xae, 0xd5, 0xe8,
	0xf8, 0x3b, 0x80, 0x5e, 0xc5, 0x44, 0x66, 0xd0, 0xb7, 0xb6, 0xe7, 0x42, 0x1b, 0x9e, 0xed, 0xc9,
	0xfb, 0xc3, 0x12, 0x7f, 0x6a, 0x64, 0x08, 0x1d, 0x3b, 0x38, 0x67, 0x99, 0x5f, 0xa7, 0x1b, 0x1f,
	0xb0, 0xd5, 0x24, 0xd3, 0xfa, 0x0b, 0xd5, 0x8a, 0x36, 0xbc, 0x56, 0x62, 0x32, 0x80, 0xf6, 0x0a,
	0x33, 0x26, 0x72, 0xda, 0x74, 0xca, 0x1e, 0x91, 0x3e, 0xb4, 0xa4, 0xc2, 0x5d, 0x41, 0x5b, 0x8e,
	0xf6, 0x80, 0x10, 0x68, 0x4a, 0x54, 0x86, 0xb6, 0x47, 0xc1, 0xf4, 0x38, 0x76, 0x35, 0xb9, 0x80,
	0x13, 0x2d, 0xe4, 0x9d, 0xd0, 0x32, 0x65, 0xc5, 0xa3, 0x9d, 0xff, 0xdf, 0x45, 0x2a, 0xac, 0xed,
	0xa8, 0x38, 0x4b, 0x33, 0xda, 0xf1, 0x1d, 0x1d, 0xb8, 0x5d, 0xc0, 0x04, 0x55, 0x12, 0xa2, 0xe4,
	0xf9, 0x12, 0xd5, 0x2a, 0xf4, 0x1f, 0x5c, 0x7f, 0xc9, 0xb7, 0x9b, 0x44, 0x98, 0xf5, 0x66, 0x11,
	0x2e, 0x31, 0x8b, 0x4a, 0x77, 0xe4, 0xdd, 0x97, 0xe5, 0x39, 0x5c, 0x47, 0x09, 0xd6, 0x8f, 0x62,
	0xd1, 0x76, 0xfa, 0xd5, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x84, 0x23, 0x54, 0x5a, 0x3e, 0x02,
	0x00, 0x00,
}
