[protobuf] Problem with Protobuf. Crashing on some devices

2018-07-23 Thread jacobo
Hi, 

Some of my clients testing the app are complaining of a crash in the app 
that seems to be related to Firestore's dependency Protobuf. Unfortunately, 
I haven't been able to replicate it in any device of my own, but my 
Crashlytics clearly reports the issue in the 'SelFromStrings' method of the 
GPBDescriptor.m file of Protobuf. 

I am using XCode 10, and testing on devices in iOS 12 and 11. Crashes are 
being produced with users on an iPhone 6, previously logged in using 
Firebase Authentication, and who are downloading the app via Test Flight. 

Attached is an image of the app's crashlytics report (which is in my 
project in Firebase). 

Can I get help with this?

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to protobuf+unsubscr...@googlegroups.com.
To post to this group, send email to protobuf@googlegroups.com.
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.


Re: [protobuf] How to generate FileDescriptor Object which has custom options?

2018-07-23 Thread Ankit Patel
Hi Josh,

I tried your suggested approach, the result is still the same. 

helloD.findServiceByName("HelloWorldService").findMethodByName("sayHello").getOptions()
 
still populates them as unknown fields instead of matching them up to its 
descriptors from Annotations FileDescriptor.

Ankit

On Monday, July 23, 2018 at 11:52:56 AM UTC-7, Josh Humphries wrote:
>
> On Mon, Jul 23, 2018 at 12:56 PM Ankit Patel  > wrote:
>
>> Hi Josh,
>>
>> Thanks for responding. I do not have access to the codegen classes from 
>> the proto compiler. My requirement is to use the proto files and create 
>> descriptors from it and rely on that. I have the proto file where the 
>> extension is defined and I am using that to create a registry and then feed 
>> it to the File descriptor of my proto as shown in the above code. But It is 
>> still not reading that registry and updating itself. What am I doing wrong?
>>
>
> Hi, Ankit,
> I apologize that my first response was incorrect. I clearly didn't ingest 
> your entire code example. After reviewing more closely, I'll admit, it 
> looks like you are doing everything correctly. Hopefully someone else on 
> the list can spot the issue.
>
> In the meantime, I'd probably use a debugger to step through it, 
> particularly the call to internalUpdateFileDescriptor, to see what's 
> going on internally. An alternative you might try is just parsing 
> "Hello.pb" with your initialized extension registry, instead of parsing it 
> up front without and then having to call the internal update method later. 
> (Not that it should behave differently -- but it could be interesting to 
> verify whether or not it behaves differently.)
>  
>
>>
>> Thanks,
>> Ankit
>>
>> On Friday, July 20, 2018 at 5:56:35 PM UTC-7, Josh Humphries wrote:
>>>
>>> The issue is that when you access the descriptor that way, it does not 
>>> know about the custom options.
>>>
>>> You need to create an ExtensionRegistry. You'll also need the Java code 
>>> produced from the annotations.proto file: that generated code will have a 
>>> way to access the extensions (to add them to your registry), and IIRC even 
>>> includes a way to register all extensions in the file.
>>>
>>> Then you'll have to re-parse the descriptor proto with the 
>>> ExtensionRegistry -- that way, the field will be recognized and parsed 
>>> correctly instead of considered an unknown field. IIRC (I've been doing Go 
>>> for a while, so my recollection of the Java protobuf runtime might be 
>>> fading a little), to re-parse them you have to serialize it to bytes (in 
>>> this case, the method descriptor proto) and then de-serialize again. The 
>>> resulting de-serialized message will now have the options in a queryable 
>>> form.
>>>
>>> 
>>> *Josh Humphries*
>>> jh...@bluegosling.com
>>>
>>>
>>>
>>> On Fri, Jul 20, 2018 at 8:30 PM Ankit Patel  
>>> wrote:
>>>
 Hi All,

 I have a simple .proto file

 syntax = "proto3";

 package helloworld.v1;

 option java_package = "helloworld.v1";
 option java_multiple_files = true;

 import "google/api/annotations.proto";

 service HelloWorldService {
 rpc sayHello (SayHelloRequest) returns (SayHelloResponse) {
 option (google.api.http) = {
 post: "/v1/example/echo"
 body: "*"
 };
 }
 }

 message SayHelloRequest {
 string favourite_thing = 1;
 }

 message SayHelloResponse {
 string reply = 1;
 }

 I am generating a proto descriptor set from it using the proto compiler.

 After that I am trying to read the proto descriptor programatically in 
 the java code like this
 FileDescriptorSet Hello = FileDescriptorSet.parseFrom(new 
 FileInputStream(new File("D:\\temp\\descriptor\\Hello.pb")));
 FileDescriptorSet Annotations = FileDescriptorSet.parseFrom(new 
 FileInputStream(new File("D:\\temp\\descriptor\\annotations.pb")));
 FileDescriptorSet Http = FileDescriptorSet.parseFrom(new 
 FileInputStream(new File("D:\\temp\\descriptor\\http.pb")));
 FileDescriptorSet Descriptor = FileDescriptorSet.parseFrom(new 
 FileInputStream(new File("D:\\temp\\descriptor\\descriptor.pb")));

 FileDescriptor httpD = FileDescriptor.buildFrom(Http.getFile(0), new 
 FileDescriptor[] {}, true);
 FileDescriptor descriptorD = 
 FileDescriptor.buildFrom(Descriptor.getFile(0), new FileDescriptor[] {}, 
 true);
 FileDescriptor annotationsD = 
 FileDescriptor.buildFrom(Annotations.getFile(0), new FileDescriptor[] 
 {httpD, descriptorD});

 ExtensionRegistry registry = ExtensionRegistry.newInstance();
 FieldDescriptor httpFD = annotationsD.findExtensionByName("http");
 Message httpRuleM = 
 DynamicMessage.newBuilder(httpD.findMessageTypeByName("HttpRule")).build();
 registry.add(httpFD, httpRuleM);

 FileDescriptor helloD = FileDescriptor.buildFrom(Hello.getFile(0), new 
 FileDescriptor[] {annotation

Re: [protobuf] How to generate FileDescriptor Object which has custom options?

2018-07-23 Thread Josh Humphries
On Mon, Jul 23, 2018 at 12:56 PM Ankit Patel 
wrote:

> Hi Josh,
>
> Thanks for responding. I do not have access to the codegen classes from
> the proto compiler. My requirement is to use the proto files and create
> descriptors from it and rely on that. I have the proto file where the
> extension is defined and I am using that to create a registry and then feed
> it to the File descriptor of my proto as shown in the above code. But It is
> still not reading that registry and updating itself. What am I doing wrong?
>

Hi, Ankit,
I apologize that my first response was incorrect. I clearly didn't ingest
your entire code example. After reviewing more closely, I'll admit, it
looks like you are doing everything correctly. Hopefully someone else on
the list can spot the issue.

In the meantime, I'd probably use a debugger to step through it,
particularly the call to internalUpdateFileDescriptor, to see what's going
on internally. An alternative you might try is just parsing "Hello.pb" with
your initialized extension registry, instead of parsing it up front without
and then having to call the internal update method later. (Not that it
should behave differently -- but it could be interesting to verify whether
or not it behaves differently.)


>
> Thanks,
> Ankit
>
> On Friday, July 20, 2018 at 5:56:35 PM UTC-7, Josh Humphries wrote:
>>
>> The issue is that when you access the descriptor that way, it does not
>> know about the custom options.
>>
>> You need to create an ExtensionRegistry. You'll also need the Java code
>> produced from the annotations.proto file: that generated code will have a
>> way to access the extensions (to add them to your registry), and IIRC even
>> includes a way to register all extensions in the file.
>>
>> Then you'll have to re-parse the descriptor proto with the
>> ExtensionRegistry -- that way, the field will be recognized and parsed
>> correctly instead of considered an unknown field. IIRC (I've been doing Go
>> for a while, so my recollection of the Java protobuf runtime might be
>> fading a little), to re-parse them you have to serialize it to bytes (in
>> this case, the method descriptor proto) and then de-serialize again. The
>> resulting de-serialized message will now have the options in a queryable
>> form.
>>
>> 
>> *Josh Humphries*
>> jh...@bluegosling.com
>>
>>
>>
>> On Fri, Jul 20, 2018 at 8:30 PM Ankit Patel  wrote:
>>
>>> Hi All,
>>>
>>> I have a simple .proto file
>>>
>>> syntax = "proto3";
>>>
>>> package helloworld.v1;
>>>
>>> option java_package = "helloworld.v1";
>>> option java_multiple_files = true;
>>>
>>> import "google/api/annotations.proto";
>>>
>>> service HelloWorldService {
>>> rpc sayHello (SayHelloRequest) returns (SayHelloResponse) {
>>> option (google.api.http) = {
>>> post: "/v1/example/echo"
>>> body: "*"
>>> };
>>> }
>>> }
>>>
>>> message SayHelloRequest {
>>> string favourite_thing = 1;
>>> }
>>>
>>> message SayHelloResponse {
>>> string reply = 1;
>>> }
>>>
>>> I am generating a proto descriptor set from it using the proto compiler.
>>>
>>> After that I am trying to read the proto descriptor programatically in
>>> the java code like this
>>> FileDescriptorSet Hello = FileDescriptorSet.parseFrom(new
>>> FileInputStream(new File("D:\\temp\\descriptor\\Hello.pb")));
>>> FileDescriptorSet Annotations = FileDescriptorSet.parseFrom(new
>>> FileInputStream(new File("D:\\temp\\descriptor\\annotations.pb")));
>>> FileDescriptorSet Http = FileDescriptorSet.parseFrom(new
>>> FileInputStream(new File("D:\\temp\\descriptor\\http.pb")));
>>> FileDescriptorSet Descriptor = FileDescriptorSet.parseFrom(new
>>> FileInputStream(new File("D:\\temp\\descriptor\\descriptor.pb")));
>>>
>>> FileDescriptor httpD = FileDescriptor.buildFrom(Http.getFile(0), new
>>> FileDescriptor[] {}, true);
>>> FileDescriptor descriptorD =
>>> FileDescriptor.buildFrom(Descriptor.getFile(0), new FileDescriptor[] {},
>>> true);
>>> FileDescriptor annotationsD =
>>> FileDescriptor.buildFrom(Annotations.getFile(0), new FileDescriptor[]
>>> {httpD, descriptorD});
>>>
>>> ExtensionRegistry registry = ExtensionRegistry.newInstance();
>>> FieldDescriptor httpFD = annotationsD.findExtensionByName("http");
>>> Message httpRuleM =
>>> DynamicMessage.newBuilder(httpD.findMessageTypeByName("HttpRule")).build();
>>> registry.add(httpFD, httpRuleM);
>>>
>>> FileDescriptor helloD = FileDescriptor.buildFrom(Hello.getFile(0), new
>>> FileDescriptor[] {annotationsD});
>>> FileDescriptor.internalUpdateFileDescriptor(helloD, registry);
>>>
>>> helloD.findServiceByName("HelloWorldService").findMethodByName("sayHello").getOptions();
>>>
>>> The api call in the last line puts the "http" in the unknown field, and
>>> the reason is because its a custom option and not registered. But as you
>>> can see I am doing that.
>>>
>>> Can someone please guide me on what am I doing wrong?
>>>
>>> Thanks!
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Protocol Buff

Re: [protobuf] How to generate FileDescriptor Object which has custom options?

2018-07-23 Thread Ankit Patel
Hi Josh,

Thanks for responding. I do not have access to the codegen classes from the 
proto compiler. My requirement is to use the proto files and create 
descriptors from it and rely on that. I have the proto file where the 
extension is defined and I am using that to create a registry and then feed 
it to the File descriptor of my proto as shown in the above code. But It is 
still not reading that registry and updating itself. What am I doing wrong?

Thanks,
Ankit

On Friday, July 20, 2018 at 5:56:35 PM UTC-7, Josh Humphries wrote:
>
> The issue is that when you access the descriptor that way, it does not 
> know about the custom options.
>
> You need to create an ExtensionRegistry. You'll also need the Java code 
> produced from the annotations.proto file: that generated code will have a 
> way to access the extensions (to add them to your registry), and IIRC even 
> includes a way to register all extensions in the file.
>
> Then you'll have to re-parse the descriptor proto with the 
> ExtensionRegistry -- that way, the field will be recognized and parsed 
> correctly instead of considered an unknown field. IIRC (I've been doing Go 
> for a while, so my recollection of the Java protobuf runtime might be 
> fading a little), to re-parse them you have to serialize it to bytes (in 
> this case, the method descriptor proto) and then de-serialize again. The 
> resulting de-serialized message will now have the options in a queryable 
> form.
>
> 
> *Josh Humphries*
> jh...@bluegosling.com 
>
>
>
> On Fri, Jul 20, 2018 at 8:30 PM Ankit Patel  > wrote:
>
>> Hi All,
>>
>> I have a simple .proto file
>>
>> syntax = "proto3";
>>
>> package helloworld.v1;
>>
>> option java_package = "helloworld.v1";
>> option java_multiple_files = true;
>>
>> import "google/api/annotations.proto";
>>
>> service HelloWorldService {
>> rpc sayHello (SayHelloRequest) returns (SayHelloResponse) {
>> option (google.api.http) = {
>> post: "/v1/example/echo"
>> body: "*"
>> };
>> }
>> }
>>
>> message SayHelloRequest {
>> string favourite_thing = 1;
>> }
>>
>> message SayHelloResponse {
>> string reply = 1;
>> }
>>
>> I am generating a proto descriptor set from it using the proto compiler.
>>
>> After that I am trying to read the proto descriptor programatically in 
>> the java code like this
>> FileDescriptorSet Hello = FileDescriptorSet.parseFrom(new 
>> FileInputStream(new File("D:\\temp\\descriptor\\Hello.pb")));
>> FileDescriptorSet Annotations = FileDescriptorSet.parseFrom(new 
>> FileInputStream(new File("D:\\temp\\descriptor\\annotations.pb")));
>> FileDescriptorSet Http = FileDescriptorSet.parseFrom(new 
>> FileInputStream(new File("D:\\temp\\descriptor\\http.pb")));
>> FileDescriptorSet Descriptor = FileDescriptorSet.parseFrom(new 
>> FileInputStream(new File("D:\\temp\\descriptor\\descriptor.pb")));
>>
>> FileDescriptor httpD = FileDescriptor.buildFrom(Http.getFile(0), new 
>> FileDescriptor[] {}, true);
>> FileDescriptor descriptorD = 
>> FileDescriptor.buildFrom(Descriptor.getFile(0), new FileDescriptor[] {}, 
>> true);
>> FileDescriptor annotationsD = 
>> FileDescriptor.buildFrom(Annotations.getFile(0), new FileDescriptor[] 
>> {httpD, descriptorD});
>>
>> ExtensionRegistry registry = ExtensionRegistry.newInstance();
>> FieldDescriptor httpFD = annotationsD.findExtensionByName("http");
>> Message httpRuleM = 
>> DynamicMessage.newBuilder(httpD.findMessageTypeByName("HttpRule")).build();
>> registry.add(httpFD, httpRuleM);
>>
>> FileDescriptor helloD = FileDescriptor.buildFrom(Hello.getFile(0), new 
>> FileDescriptor[] {annotationsD});
>> FileDescriptor.internalUpdateFileDescriptor(helloD, registry);
>>
>> helloD.findServiceByName("HelloWorldService").findMethodByName("sayHello").getOptions();
>>
>> The api call in the last line puts the "http" in the unknown field, and 
>> the reason is because its a custom option and not registered. But as you 
>> can see I am doing that.
>>
>> Can someone please guide me on what am I doing wrong?
>>
>> Thanks!
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Protocol Buffers" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to protobuf+u...@googlegroups.com .
>> To post to this group, send email to prot...@googlegroups.com 
>> .
>> Visit this group at https://groups.google.com/group/protobuf.
>> For more options, visit https://groups.google.com/d/optout.
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to protobuf+unsubscr...@googlegroups.com.
To post to this group, send email to protobuf@googlegroups.com.
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.