Fixed grpc_getMetadataArray

pull/1363/head
murgatroid99 10 years ago
parent 69927d65c3
commit 3d13eb056c
  1. 3
      src/objective-c/GRPCClient/private/GRPCWrappedCall.m
  2. 2
      src/objective-c/GRPCClient/private/NSDictionary+GRPC.h
  3. 27
      src/objective-c/GRPCClient/private/NSDictionary+GRPC.m

@ -94,7 +94,8 @@
switch ([key intValue]) { switch ([key intValue]) {
case GRPC_OP_SEND_INITIAL_METADATA: case GRPC_OP_SEND_INITIAL_METADATA:
// TODO(jcanizales): Name the type of current->data.send_initial_metadata in the C library so a pointer to it can be returned from methods. // TODO(jcanizales): Name the type of current->data.send_initial_metadata in the C library so a pointer to it can be returned from methods.
current->data.send_initial_metadata.count = [operations[key] grpc_toMetadataArray:&send_metadata]; current->data.send_initial_metadata.count = [operations[key] count];
[operations[key] grpc_getMetadataArray:&send_metadata];
current->data.send_initial_metadata.metadata = send_metadata; current->data.send_initial_metadata.metadata = send_metadata;
opBlock = ^{ opBlock = ^{
gpr_free(send_metadata); gpr_free(send_metadata);

@ -36,5 +36,5 @@
@interface NSDictionary (GRPC) @interface NSDictionary (GRPC)
+ (instancetype)grpc_dictionaryFromMetadata:(struct grpc_metadata *)entries count:(size_t)count; + (instancetype)grpc_dictionaryFromMetadata:(struct grpc_metadata *)entries count:(size_t)count;
- (size_t)grpc_toMetadataArray:(grpc_metadata **)metadata; - (void)grpc_getMetadataArray:(grpc_metadata **)metadata;
@end @end

@ -55,23 +55,22 @@
return metadata; return metadata;
} }
- (size_t)grpc_toMetadataArray:(grpc_metadata **)metadata { - (void)grpc_getMetadataArray:(grpc_metadata **)metadata {
size_t count = 0; *metadata = gpr_malloc([self count] * sizeof(grpc_metadata));
size_t capacity = 0; int i = 0;
for (id key in self) { for (id key in self) {
capacity += [self[key] count]; id value = self[key];
} grpc_metadata *current = &(*metadata)[i];
*metadata = gpr_malloc(capacity * sizeof(grpc_metadata)); current->key = [key UTF8String];
for (id key in self) { if ([value isKindOfClass:[NSData class]]) {
id value_array = self[key]; current->value = [value bytes];
for (id value in value_array) { } else if ([value isKindOfClass:[NSString class]]) {
grpc_metadata *current = &(*metadata)[count];
current->key = [key UTF8String];
current->value = [value UTF8String]; current->value = [value UTF8String];
current->value_length = [value length]; } else {
count += 1; [NSException raise:NSInvalidArgumentException format:@"Metadata values must be NSString or NSData."];
} }
current->value = [value UTF8String];
i += 1;
} }
return count;
} }
@end @end

Loading…
Cancel
Save