Code generate Swift wrappers for protocol buffers.

This commit is contained in:
Matthew Chen 2018-08-01 15:55:00 -04:00
parent 77810f5918
commit 827f979282
4 changed files with 251 additions and 80 deletions

View File

@ -197,11 +197,14 @@ class BaseContext(object):
# TODO: fail # TODO: fail
return base_type return base_type
def can_field_be_optional(self, field): def is_field_primitive(self, field):
if field.proto_type in ('uint64', return field.proto_type in ('uint64',
'uint32', 'uint32',
'fixed64', 'fixed64',
'bool', ): 'bool', )
def can_field_be_optional(self, field):
if self.is_field_primitive(field):
return not field.is_required return not field.is_required
# if field.proto_type == 'uint64': # if field.proto_type == 'uint64':
@ -404,15 +407,32 @@ class MessageContext(BaseContext):
if len(implict_fields) > 0: if len(implict_fields) > 0:
for field in implict_fields: for field in implict_fields:
if field.rules == 'optional': if field.rules == 'optional':
writer.add('@objc public var %s: %s {' % (field.name_swift, field.type_swift_not_optional)) can_be_optional = (not self.is_field_primitive(field)) and (not self.is_field_an_enum(field))
writer.push_indent() if can_be_optional:
if self.is_field_an_enum(field): writer.add('@objc public var %s: %s? {' % (field.name_swift, field.type_swift_not_optional))
enum_context = self.context_for_proto_type(field) writer.push_indent()
writer.add('return %s.%sWrap(proto.%s)' % ( enum_context.parent.swift_name, enum_context.swift_name, field.name_swift, ) ) writer.add('guard proto.%s else {' % field.has_accessor_name() )
writer.push_indent()
writer.add('return nil')
writer.pop_indent()
writer.add('}')
if self.is_field_an_enum(field):
enum_context = self.context_for_proto_type(field)
writer.add('return %s.%sWrap(proto.%s)' % ( enum_context.parent.swift_name, enum_context.swift_name, field.name_swift, ) )
else:
writer.add('return proto.%s' % field.name_swift )
writer.pop_indent()
writer.add('}')
else: else:
writer.add('return proto.%s' % field.name_swift ) writer.add('@objc public var %s: %s {' % (field.name_swift, field.type_swift_not_optional))
writer.pop_indent() writer.push_indent()
writer.add('}') if self.is_field_an_enum(field):
enum_context = self.context_for_proto_type(field)
writer.add('return %s.%sWrap(proto.%s)' % ( enum_context.parent.swift_name, enum_context.swift_name, field.name_swift, ) )
else:
writer.add('return proto.%s' % field.name_swift )
writer.pop_indent()
writer.add('}')
writer.add('@objc public var %s: Bool {' % field.has_accessor_name() ) writer.add('@objc public var %s: Bool {' % field.has_accessor_name() )
writer.push_indent() writer.push_indent()

View File

@ -179,10 +179,7 @@ public class MessageFetcherJob: NSObject {
} }
private func acknowledgeDelivery(envelope: SSKProtoEnvelope) { private func acknowledgeDelivery(envelope: SSKProtoEnvelope) {
guard let source = envelope.source else { let source = envelope.source
Logger.error("\(self.logTag) envelope missing source.")
return
}
let request = OWSRequestFactory.acknowledgeMessageDeliveryRequest(withSource: source, timestamp: envelope.timestamp) let request = OWSRequestFactory.acknowledgeMessageDeliveryRequest(withSource: source, timestamp: envelope.timestamp)
self.networkManager.makeRequest(request, self.networkManager.makeRequest(request,
success: { (_: URLSessionDataTask?, _: Any?) -> Void in success: { (_: URLSessionDataTask?, _: Any?) -> Void in

View File

@ -3390,14 +3390,17 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
} }
}(); }();
SSKProtoEnvelopeBuilder *envelopeBuilder = [SSKProtoEnvelopeBuilder new];
SSKProtoEnvelope *envelope = [[SSKProtoEnvelope alloc] initWithType:SSKProtoEnvelopeTypeCiphertext envelopeBuilder.type = SSKProtoEnvelopeTypeCiphertext;
source:source envelopeBuilder.source = source;
sourceDevice:1 envelopeBuilder.sourceDevice = 1;
relay:nil envelopeBuilder.timestamp = timestamp;
timestamp:timestamp NSError *error;
legacyMessage:nil SSKProtoEnvelope *_Nullable envelope = [envelopeBuilder buildAndReturnError:&error];
content:nil]; if (error || !envelope) {
OWSFail(@"%@ Could not construct envelope: %@.", self.logTag, error);
return nil;
}
return envelope; return envelope;
} }
@ -3890,17 +3893,24 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
SSKProtoEnvelopeType envelopeType = SSKProtoEnvelopeTypeCiphertext; SSKProtoEnvelopeType envelopeType = SSKProtoEnvelopeTypeCiphertext;
NSData *content = plaintextData; NSData *content = plaintextData;
SSKProtoEnvelope *envelope = [[SSKProtoEnvelope alloc] initWithType:envelopeType SSKProtoEnvelopeBuilder *envelopeBuilder = [SSKProtoEnvelopeBuilder new];
source:source envelopeBuilder.type = envelopeType;
sourceDevice:sourceDevice envelopeBuilder.source = source;
relay:nil envelopeBuilder.sourceDevice = sourceDevice;
timestamp:timestamp envelopeBuilder.timestamp = timestamp;
legacyMessage:nil envelopeBuilder.content = content;
content:content];
NSError *error; NSError *error;
SSKProtoEnvelope *_Nullable envelope = [envelopeBuilder buildAndReturnError:&error];
if (error || !envelope) {
OWSFail(@"%@ Could not construct envelope: %@.", self.logTag, error);
return;
}
NSData *_Nullable envelopeData = [envelope serializedDataAndReturnError:&error]; NSData *_Nullable envelopeData = [envelope serializedDataAndReturnError:&error];
OWSAssert(!error && envelopeData); if (error || !envelopeData) {
OWSFail(@"%@ Could not serialize envelope: %@.", self.logTag, error);
return;
}
[OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[[OWSBatchMessageProcessor sharedInstance] enqueueEnvelopeData:envelopeData [[OWSBatchMessageProcessor sharedInstance] enqueueEnvelopeData:envelopeData

View File

@ -130,21 +130,30 @@ public enum SSKProtoError: Error {
@objc public let sourceDevice: UInt32 @objc public let sourceDevice: UInt32
@objc public let timestamp: UInt64 @objc public let timestamp: UInt64
@objc public var relay: String { @objc public var relay: String? {
guard proto.hasRelay else {
return nil
}
return proto.relay return proto.relay
} }
@objc public var hasRelay: Bool { @objc public var hasRelay: Bool {
return proto.hasRelay return proto.hasRelay
} }
@objc public var legacyMessage: Data { @objc public var legacyMessage: Data? {
guard proto.hasLegacyMessage else {
return nil
}
return proto.legacyMessage return proto.legacyMessage
} }
@objc public var hasLegacyMessage: Bool { @objc public var hasLegacyMessage: Bool {
return proto.hasLegacyMessage return proto.hasLegacyMessage
} }
@objc public var content: Data { @objc public var content: Data? {
guard proto.hasContent else {
return nil
}
return proto.content return proto.content
} }
@objc public var hasContent: Bool { @objc public var hasContent: Bool {
@ -384,7 +393,10 @@ public enum SSKProtoError: Error {
@objc public let id: UInt64 @objc public let id: UInt64
@objc public var sessionDescription: String { @objc public var sessionDescription: String? {
guard proto.hasSessionDescription else {
return nil
}
return proto.sessionDescription return proto.sessionDescription
} }
@objc public var hasSessionDescription: Bool { @objc public var hasSessionDescription: Bool {
@ -464,7 +476,10 @@ public enum SSKProtoError: Error {
@objc public let id: UInt64 @objc public let id: UInt64
@objc public var sessionDescription: String { @objc public var sessionDescription: String? {
guard proto.hasSessionDescription else {
return nil
}
return proto.sessionDescription return proto.sessionDescription
} }
@objc public var hasSessionDescription: Bool { @objc public var hasSessionDescription: Bool {
@ -562,7 +577,10 @@ public enum SSKProtoError: Error {
@objc public let id: UInt64 @objc public let id: UInt64
@objc public var sdpMid: String { @objc public var sdpMid: String? {
guard proto.hasSdpMid else {
return nil
}
return proto.sdpMid return proto.sdpMid
} }
@objc public var hasSdpMid: Bool { @objc public var hasSdpMid: Bool {
@ -576,7 +594,10 @@ public enum SSKProtoError: Error {
return proto.hasSdpMlineIndex return proto.hasSdpMlineIndex
} }
@objc public var sdp: String { @objc public var sdp: String? {
guard proto.hasSdp else {
return nil
}
return proto.sdp return proto.sdp
} }
@objc public var hasSdp: Bool { @objc public var hasSdp: Bool {
@ -826,7 +847,10 @@ public enum SSKProtoError: Error {
@objc public let hangup: SSKProtoCallMessageHangup? @objc public let hangup: SSKProtoCallMessageHangup?
@objc public let busy: SSKProtoCallMessageBusy? @objc public let busy: SSKProtoCallMessageBusy?
@objc public var profileKey: Data { @objc public var profileKey: Data? {
guard proto.hasProfileKey else {
return nil
}
return proto.profileKey return proto.profileKey
} }
@objc public var hasProfileKey: Bool { @objc public var hasProfileKey: Bool {
@ -975,14 +999,20 @@ public enum SSKProtoError: Error {
@objc public let thumbnail: SSKProtoAttachmentPointer? @objc public let thumbnail: SSKProtoAttachmentPointer?
@objc public var contentType: String { @objc public var contentType: String? {
guard proto.hasContentType else {
return nil
}
return proto.contentType return proto.contentType
} }
@objc public var hasContentType: Bool { @objc public var hasContentType: Bool {
return proto.hasContentType return proto.hasContentType
} }
@objc public var fileName: String { @objc public var fileName: String? {
guard proto.hasFileName else {
return nil
}
return proto.fileName return proto.fileName
} }
@objc public var hasFileName: Bool { @objc public var hasFileName: Bool {
@ -1091,7 +1121,10 @@ public enum SSKProtoError: Error {
@objc public let author: String @objc public let author: String
@objc public let attachments: [SSKProtoDataMessageQuoteQuotedAttachment] @objc public let attachments: [SSKProtoDataMessageQuoteQuotedAttachment]
@objc public var text: String { @objc public var text: String? {
guard proto.hasText else {
return nil
}
return proto.text return proto.text
} }
@objc public var hasText: Bool { @objc public var hasText: Bool {
@ -1222,42 +1255,60 @@ public enum SSKProtoError: Error {
fileprivate let proto: SignalServiceProtos_DataMessage.Contact.Name fileprivate let proto: SignalServiceProtos_DataMessage.Contact.Name
@objc public var givenName: String { @objc public var givenName: String? {
guard proto.hasGivenName else {
return nil
}
return proto.givenName return proto.givenName
} }
@objc public var hasGivenName: Bool { @objc public var hasGivenName: Bool {
return proto.hasGivenName return proto.hasGivenName
} }
@objc public var familyName: String { @objc public var familyName: String? {
guard proto.hasFamilyName else {
return nil
}
return proto.familyName return proto.familyName
} }
@objc public var hasFamilyName: Bool { @objc public var hasFamilyName: Bool {
return proto.hasFamilyName return proto.hasFamilyName
} }
@objc public var prefix: String { @objc public var prefix: String? {
guard proto.hasPrefix else {
return nil
}
return proto.prefix return proto.prefix
} }
@objc public var hasPrefix: Bool { @objc public var hasPrefix: Bool {
return proto.hasPrefix return proto.hasPrefix
} }
@objc public var suffix: String { @objc public var suffix: String? {
guard proto.hasSuffix else {
return nil
}
return proto.suffix return proto.suffix
} }
@objc public var hasSuffix: Bool { @objc public var hasSuffix: Bool {
return proto.hasSuffix return proto.hasSuffix
} }
@objc public var middleName: String { @objc public var middleName: String? {
guard proto.hasMiddleName else {
return nil
}
return proto.middleName return proto.middleName
} }
@objc public var hasMiddleName: Bool { @objc public var hasMiddleName: Bool {
return proto.hasMiddleName return proto.hasMiddleName
} }
@objc public var displayName: String { @objc public var displayName: String? {
guard proto.hasDisplayName else {
return nil
}
return proto.displayName return proto.displayName
} }
@objc public var hasDisplayName: Bool { @objc public var hasDisplayName: Bool {
@ -1372,7 +1423,10 @@ public enum SSKProtoError: Error {
return proto.hasType return proto.hasType
} }
@objc public var label: String { @objc public var label: String? {
guard proto.hasLabel else {
return nil
}
return proto.label return proto.label
} }
@objc public var hasLabel: Bool { @objc public var hasLabel: Bool {
@ -1495,7 +1549,10 @@ public enum SSKProtoError: Error {
return proto.hasType return proto.hasType
} }
@objc public var label: String { @objc public var label: String? {
guard proto.hasLabel else {
return nil
}
return proto.label return proto.label
} }
@objc public var hasLabel: Bool { @objc public var hasLabel: Bool {
@ -1667,56 +1724,80 @@ public enum SSKProtoError: Error {
return proto.hasType return proto.hasType
} }
@objc public var label: String { @objc public var label: String? {
guard proto.hasLabel else {
return nil
}
return proto.label return proto.label
} }
@objc public var hasLabel: Bool { @objc public var hasLabel: Bool {
return proto.hasLabel return proto.hasLabel
} }
@objc public var street: String { @objc public var street: String? {
guard proto.hasStreet else {
return nil
}
return proto.street return proto.street
} }
@objc public var hasStreet: Bool { @objc public var hasStreet: Bool {
return proto.hasStreet return proto.hasStreet
} }
@objc public var pobox: String { @objc public var pobox: String? {
guard proto.hasPobox else {
return nil
}
return proto.pobox return proto.pobox
} }
@objc public var hasPobox: Bool { @objc public var hasPobox: Bool {
return proto.hasPobox return proto.hasPobox
} }
@objc public var neighborhood: String { @objc public var neighborhood: String? {
guard proto.hasNeighborhood else {
return nil
}
return proto.neighborhood return proto.neighborhood
} }
@objc public var hasNeighborhood: Bool { @objc public var hasNeighborhood: Bool {
return proto.hasNeighborhood return proto.hasNeighborhood
} }
@objc public var city: String { @objc public var city: String? {
guard proto.hasCity else {
return nil
}
return proto.city return proto.city
} }
@objc public var hasCity: Bool { @objc public var hasCity: Bool {
return proto.hasCity return proto.hasCity
} }
@objc public var region: String { @objc public var region: String? {
guard proto.hasRegion else {
return nil
}
return proto.region return proto.region
} }
@objc public var hasRegion: Bool { @objc public var hasRegion: Bool {
return proto.hasRegion return proto.hasRegion
} }
@objc public var postcode: String { @objc public var postcode: String? {
guard proto.hasPostcode else {
return nil
}
return proto.postcode return proto.postcode
} }
@objc public var hasPostcode: Bool { @objc public var hasPostcode: Bool {
return proto.hasPostcode return proto.hasPostcode
} }
@objc public var country: String { @objc public var country: String? {
guard proto.hasCountry else {
return nil
}
return proto.country return proto.country
} }
@objc public var hasCountry: Bool { @objc public var hasCountry: Bool {
@ -1914,7 +1995,10 @@ public enum SSKProtoError: Error {
@objc public let address: [SSKProtoDataMessageContactPostalAddress] @objc public let address: [SSKProtoDataMessageContactPostalAddress]
@objc public let avatar: SSKProtoDataMessageContactAvatar? @objc public let avatar: SSKProtoDataMessageContactAvatar?
@objc public var organization: String { @objc public var organization: String? {
guard proto.hasOrganization else {
return nil
}
return proto.organization return proto.organization
} }
@objc public var hasOrganization: Bool { @objc public var hasOrganization: Bool {
@ -2123,7 +2207,10 @@ public enum SSKProtoError: Error {
@objc public let quote: SSKProtoDataMessageQuote? @objc public let quote: SSKProtoDataMessageQuote?
@objc public let contact: [SSKProtoDataMessageContact] @objc public let contact: [SSKProtoDataMessageContact]
@objc public var body: String { @objc public var body: String? {
guard proto.hasBody else {
return nil
}
return proto.body return proto.body
} }
@objc public var hasBody: Bool { @objc public var hasBody: Bool {
@ -2144,7 +2231,10 @@ public enum SSKProtoError: Error {
return proto.hasExpireTimer return proto.hasExpireTimer
} }
@objc public var profileKey: Data { @objc public var profileKey: Data? {
guard proto.hasProfileKey else {
return nil
}
return proto.profileKey return proto.profileKey
} }
@objc public var hasProfileKey: Bool { @objc public var hasProfileKey: Bool {
@ -2246,7 +2336,10 @@ public enum SSKProtoError: Error {
fileprivate let proto: SignalServiceProtos_NullMessage fileprivate let proto: SignalServiceProtos_NullMessage
@objc public var padding: Data { @objc public var padding: Data? {
guard proto.hasPadding else {
return nil
}
return proto.padding return proto.padding
} }
@objc public var hasPadding: Bool { @objc public var hasPadding: Bool {
@ -2460,7 +2553,10 @@ fileprivate let proto: SignalServiceProtos_Verified
@objc public let destination: String @objc public let destination: String
@objc public var identityKey: Data { @objc public var identityKey: Data? {
guard proto.hasIdentityKey else {
return nil
}
return proto.identityKey return proto.identityKey
} }
@objc public var hasIdentityKey: Bool { @objc public var hasIdentityKey: Bool {
@ -2474,7 +2570,10 @@ fileprivate let proto: SignalServiceProtos_Verified
return proto.hasState return proto.hasState
} }
@objc public var nullMessage: Data { @objc public var nullMessage: Data? {
guard proto.hasNullMessage else {
return nil
}
return proto.nullMessage return proto.nullMessage
} }
@objc public var hasNullMessage: Bool { @objc public var hasNullMessage: Bool {
@ -2572,7 +2671,10 @@ fileprivate let proto: SignalServiceProtos_SyncMessage.Sent
@objc public let message: SSKProtoDataMessage? @objc public let message: SSKProtoDataMessage?
@objc public var destination: String { @objc public var destination: String? {
guard proto.hasDestination else {
return nil
}
return proto.destination return proto.destination
} }
@objc public var hasDestination: Bool { @objc public var hasDestination: Bool {
@ -3179,7 +3281,10 @@ fileprivate let proto: SignalServiceProtos_SyncMessage
@objc public let verified: SSKProtoVerified? @objc public let verified: SSKProtoVerified?
@objc public let configuration: SSKProtoSyncMessageConfiguration? @objc public let configuration: SSKProtoSyncMessageConfiguration?
@objc public var padding: Data { @objc public var padding: Data? {
guard proto.hasPadding else {
return nil
}
return proto.padding return proto.padding
} }
@objc public var hasPadding: Bool { @objc public var hasPadding: Bool {
@ -3406,14 +3511,20 @@ fileprivate let proto: SignalServiceProtos_AttachmentPointer
@objc public let id: UInt64 @objc public let id: UInt64
@objc public var contentType: String { @objc public var contentType: String? {
guard proto.hasContentType else {
return nil
}
return proto.contentType return proto.contentType
} }
@objc public var hasContentType: Bool { @objc public var hasContentType: Bool {
return proto.hasContentType return proto.hasContentType
} }
@objc public var key: Data { @objc public var key: Data? {
guard proto.hasKey else {
return nil
}
return proto.key return proto.key
} }
@objc public var hasKey: Bool { @objc public var hasKey: Bool {
@ -3427,21 +3538,30 @@ return proto.size
return proto.hasSize return proto.hasSize
} }
@objc public var thumbnail: Data { @objc public var thumbnail: Data? {
guard proto.hasThumbnail else {
return nil
}
return proto.thumbnail return proto.thumbnail
} }
@objc public var hasThumbnail: Bool { @objc public var hasThumbnail: Bool {
return proto.hasThumbnail return proto.hasThumbnail
} }
@objc public var digest: Data { @objc public var digest: Data? {
guard proto.hasDigest else {
return nil
}
return proto.digest return proto.digest
} }
@objc public var hasDigest: Bool { @objc public var hasDigest: Bool {
return proto.hasDigest return proto.hasDigest
} }
@objc public var fileName: String { @objc public var fileName: String? {
guard proto.hasFileName else {
return nil
}
return proto.fileName return proto.fileName
} }
@objc public var hasFileName: Bool { @objc public var hasFileName: Bool {
@ -3603,7 +3723,10 @@ fileprivate let proto: SignalServiceProtos_GroupContext
@objc public let type: SSKProtoGroupContextType @objc public let type: SSKProtoGroupContextType
@objc public let avatar: SSKProtoAttachmentPointer? @objc public let avatar: SSKProtoAttachmentPointer?
@objc public var name: String { @objc public var name: String? {
guard proto.hasName else {
return nil
}
return proto.name return proto.name
} }
@objc public var hasName: Bool { @objc public var hasName: Bool {
@ -3701,7 +3824,10 @@ return wrapper
fileprivate let proto: SignalServiceProtos_ContactDetails.Avatar fileprivate let proto: SignalServiceProtos_ContactDetails.Avatar
@objc public var contentType: String { @objc public var contentType: String? {
guard proto.hasContentType else {
return nil
}
return proto.contentType return proto.contentType
} }
@objc public var hasContentType: Bool { @objc public var hasContentType: Bool {
@ -3836,21 +3962,30 @@ fileprivate let proto: SignalServiceProtos_ContactDetails
@objc public let avatar: SSKProtoContactDetailsAvatar? @objc public let avatar: SSKProtoContactDetailsAvatar?
@objc public let verified: SSKProtoVerified? @objc public let verified: SSKProtoVerified?
@objc public var name: String { @objc public var name: String? {
guard proto.hasName else {
return nil
}
return proto.name return proto.name
} }
@objc public var hasName: Bool { @objc public var hasName: Bool {
return proto.hasName return proto.hasName
} }
@objc public var color: String { @objc public var color: String? {
guard proto.hasColor else {
return nil
}
return proto.color return proto.color
} }
@objc public var hasColor: Bool { @objc public var hasColor: Bool {
return proto.hasColor return proto.hasColor
} }
@objc public var profileKey: Data { @objc public var profileKey: Data? {
guard proto.hasProfileKey else {
return nil
}
return proto.profileKey return proto.profileKey
} }
@objc public var hasProfileKey: Bool { @objc public var hasProfileKey: Bool {
@ -3958,7 +4093,10 @@ return wrapper
fileprivate let proto: SignalServiceProtos_GroupDetails.Avatar fileprivate let proto: SignalServiceProtos_GroupDetails.Avatar
@objc public var contentType: String { @objc public var contentType: String? {
guard proto.hasContentType else {
return nil
}
return proto.contentType return proto.contentType
} }
@objc public var hasContentType: Bool { @objc public var hasContentType: Bool {
@ -4085,7 +4223,10 @@ fileprivate let proto: SignalServiceProtos_GroupDetails
@objc public let id: Data @objc public let id: Data
@objc public let avatar: SSKProtoGroupDetailsAvatar? @objc public let avatar: SSKProtoGroupDetailsAvatar?
@objc public var name: String { @objc public var name: String? {
guard proto.hasName else {
return nil
}
return proto.name return proto.name
} }
@objc public var hasName: Bool { @objc public var hasName: Bool {
@ -4110,7 +4251,10 @@ return proto.expireTimer
return proto.hasExpireTimer return proto.hasExpireTimer
} }
@objc public var color: String { @objc public var color: String? {
guard proto.hasColor else {
return nil
}
return proto.color return proto.color
} }
@objc public var hasColor: Bool { @objc public var hasColor: Bool {