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

package arc

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	empty "github.com/golang/protobuf/ptypes/empty"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	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

type EnableUDCRequest struct {
	// Enable or disable UDC on DUT. If set true, enable UDC on DUT. If set false, disable UDC on DUT.
	Enable               bool     `protobuf:"varint,1,opt,name=enable,proto3" json:"enable,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_EnableUDCRequest proto.InternalMessageInfo

func (m *EnableUDCRequest) GetEnable() bool {
	if m != nil {
		return m.Enable
	}
	return false
}

type EnableUDCResponse struct {
	// Whether or not the requested value is updated successfully. If set true, UDC request executed successfully, and needs a device reboot. If set false, means no-ops or error occurred.
	UDCValueUpdated      bool     `protobuf:"varint,1,opt,name=UDCValueUpdated,proto3" json:"UDCValueUpdated,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_EnableUDCResponse proto.InternalMessageInfo

func (m *EnableUDCResponse) GetUDCValueUpdated() bool {
	if m != nil {
		return m.UDCValueUpdated
	}
	return false
}

func init() {
	proto.RegisterType((*EnableUDCRequest)(nil), "tast.cros.arc.EnableUDCRequest")
	proto.RegisterType((*EnableUDCResponse)(nil), "tast.cros.arc.EnableUDCResponse")
}

func init() { proto.RegisterFile("adb_over_usb_service.proto", fileDescriptor_187e74bea48a6e82) }

var fileDescriptor_187e74bea48a6e82 = []byte{
	// 272 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x90, 0x4f, 0x4b, 0xc3, 0x30,
	0x18, 0xc6, 0xd7, 0xcb, 0x90, 0xc0, 0xd0, 0xe5, 0x30, 0xa4, 0x1e, 0x9c, 0xf5, 0x32, 0x3c, 0x24,
	0xa0, 0x67, 0x0f, 0x6b, 0x33, 0x0f, 0x5e, 0x84, 0xd5, 0x7a, 0xf0, 0x52, 0x92, 0xf4, 0x75, 0x1b,
	0xb6, 0x4b, 0xcd, 0x9b, 0x14, 0xfc, 0x58, 0x7e, 0x43, 0xe9, 0x1f, 0xc1, 0x0d, 0x76, 0xcc, 0x93,
	0xe7, 0x49, 0x7e, 0xfc, 0x48, 0x28, 0x0b, 0x95, 0x9b, 0x06, 0x6c, 0xee, 0x51, 0xe5, 0x08, 0xb6,
	0xd9, 0x69, 0x60, 0xb5, 0x35, 0xce, 0xd0, 0x89, 0x93, 0xe8, 0x98, 0xb6, 0x06, 0x99, 0xb4, 0x3a,
	0xbc, 0xda, 0x18, 0xb3, 0x29, 0x81, 0x77, 0x97, 0xca, 0x7f, 0x70, 0xa8, 0x6a, 0xf7, 0xdd, 0x77,
	0xa3, 0x3b, 0x72, 0xb1, 0xda, 0x4b, 0x55, 0x42, 0x26, 0x92, 0x35, 0x7c, 0x79, 0x40, 0x47, 0x67,
	0x64, 0x0c, 0x5d, 0x76, 0x19, 0xcc, 0x83, 0xc5, 0xd9, 0x7a, 0x38, 0x45, 0x8f, 0x64, 0xfa, 0xaf,
	0x8b, 0xb5, 0xd9, 0x23, 0xd0, 0x05, 0x39, 0xcf, 0x44, 0xf2, 0x26, 0x4b, 0x0f, 0x59, 0x5d, 0x48,
	0x07, 0xc5, 0xb0, 0x3a, 0x8e, 0xef, 0x7f, 0x02, 0x32, 0x5d, 0x8a, 0xf8, 0xa5, 0x01, 0x9b, 0xa5,
	0x71, 0xda, 0x23, 0xd3, 0x57, 0x32, 0x49, 0xc1, 0x65, 0x22, 0xe9, 0x9f, 0x2e, 0xe8, 0x35, 0x3b,
	0xc0, 0x67, 0xc7, 0x78, 0xe1, 0xfc, 0x74, 0xa1, 0x67, 0x8a, 0x46, 0xf4, 0x89, 0xd0, 0x64, 0x0b,
	0xfa, 0x73, 0x29, 0x62, 0xf1, 0x6c, 0x54, 0xea, 0xa4, 0xf3, 0x48, 0x67, 0xac, 0x57, 0xc1, 0xfe,
	0x54, 0xb0, 0x55, 0xab, 0x22, 0x3c, 0x91, 0x47, 0xa3, 0xf8, 0xf6, 0xfd, 0x46, 0x6f, 0xad, 0xa9,
	0x76, 0xbe, 0x32, 0xc8, 0xdb, 0x7f, 0xf9, 0xe0, 0x1a, 0x79, 0x0b, 0xc0, 0xa5, 0xd5, 0x6a, 0xdc,
	0xcd, 0x1e, 0x7e, 0x03, 0x00, 0x00, 0xff, 0xff, 0x58, 0xa6, 0x05, 0x01, 0x94, 0x01, 0x00, 0x00,
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// ADBOverUSBServiceClient is the client API for ADBOverUSBService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ADBOverUSBServiceClient interface {
	// Set UDC Enabled to enable or disable USB Device Controller (UDC). Return true if the requested value updated successfully. Otherwise return false.
	SetUDCEnabled(ctx context.Context, in *EnableUDCRequest, opts ...grpc.CallOption) (*EnableUDCResponse, error)
	// Check ADBD job status.
	CheckADBDJobStatus(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error)
}

type aDBOverUSBServiceClient struct {
	cc *grpc.ClientConn
}

func NewADBOverUSBServiceClient(cc *grpc.ClientConn) ADBOverUSBServiceClient {
	return &aDBOverUSBServiceClient{cc}
}

func (c *aDBOverUSBServiceClient) SetUDCEnabled(ctx context.Context, in *EnableUDCRequest, opts ...grpc.CallOption) (*EnableUDCResponse, error) {
	out := new(EnableUDCResponse)
	err := c.cc.Invoke(ctx, "/tast.cros.arc.ADBOverUSBService/SetUDCEnabled", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *aDBOverUSBServiceClient) CheckADBDJobStatus(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/tast.cros.arc.ADBOverUSBService/CheckADBDJobStatus", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// ADBOverUSBServiceServer is the server API for ADBOverUSBService service.
type ADBOverUSBServiceServer interface {
	// Set UDC Enabled to enable or disable USB Device Controller (UDC). Return true if the requested value updated successfully. Otherwise return false.
	SetUDCEnabled(context.Context, *EnableUDCRequest) (*EnableUDCResponse, error)
	// Check ADBD job status.
	CheckADBDJobStatus(context.Context, *empty.Empty) (*empty.Empty, error)
}

// UnimplementedADBOverUSBServiceServer can be embedded to have forward compatible implementations.
type UnimplementedADBOverUSBServiceServer struct {
}

func (*UnimplementedADBOverUSBServiceServer) SetUDCEnabled(ctx context.Context, req *EnableUDCRequest) (*EnableUDCResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SetUDCEnabled not implemented")
}
func (*UnimplementedADBOverUSBServiceServer) CheckADBDJobStatus(ctx context.Context, req *empty.Empty) (*empty.Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method CheckADBDJobStatus not implemented")
}

func RegisterADBOverUSBServiceServer(s *grpc.Server, srv ADBOverUSBServiceServer) {
	s.RegisterService(&_ADBOverUSBService_serviceDesc, srv)
}

func _ADBOverUSBService_SetUDCEnabled_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(EnableUDCRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ADBOverUSBServiceServer).SetUDCEnabled(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/tast.cros.arc.ADBOverUSBService/SetUDCEnabled",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ADBOverUSBServiceServer).SetUDCEnabled(ctx, req.(*EnableUDCRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ADBOverUSBService_CheckADBDJobStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(empty.Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ADBOverUSBServiceServer).CheckADBDJobStatus(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/tast.cros.arc.ADBOverUSBService/CheckADBDJobStatus",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ADBOverUSBServiceServer).CheckADBDJobStatus(ctx, req.(*empty.Empty))
	}
	return interceptor(ctx, in, info, handler)
}

var _ADBOverUSBService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "tast.cros.arc.ADBOverUSBService",
	HandlerType: (*ADBOverUSBServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "SetUDCEnabled",
			Handler:    _ADBOverUSBService_SetUDCEnabled_Handler,
		},
		{
			MethodName: "CheckADBDJobStatus",
			Handler:    _ADBOverUSBService_CheckADBDJobStatus_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "adb_over_usb_service.proto",
}
