session-ios/SignalServiceKit/src/Messages/Interactions/OWSContactShare.m

209 lines
6.4 KiB
Mathematica
Raw Normal View History

2018-04-27 21:29:19 +02:00
//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "OWSContactShare.h"
2018-04-27 22:14:25 +02:00
#import "OWSContactShare+Private.h"
2018-04-27 21:29:19 +02:00
#import "OWSSignalServiceProtos.pb.h"
#import "TSAttachment.h"
#import <YapDatabase/YapDatabaseTransaction.h>
NS_ASSUME_NONNULL_BEGIN
@implementation OWSContactSharePhoneNumber
@end
#pragma mark -
@implementation OWSContactShareEmail
@end
#pragma mark -
@implementation OWSContactShareAddress
@end
#pragma mark -
@interface OWSContactShare ()
@end
#pragma mark -
@implementation OWSContactShare
2018-04-27 22:14:25 +02:00
+ (OWSContactShare *_Nullable)contactShareForDataMessage:(OWSSignalServiceProtosDataMessage *)dataMessage
transaction:(YapDatabaseReadWriteTransaction *)transaction
2018-04-27 21:29:19 +02:00
{
OWSAssert(dataMessage);
if (dataMessage.contact.count < 1) {
return nil;
}
OWSAssert(dataMessage.contact.count == 1);
OWSSignalServiceProtosDataMessageContact *contactProto = dataMessage.contact.firstObject;
OWSContactShare *contactShare = [OWSContactShare new];
if (contactProto.hasName) {
OWSSignalServiceProtosDataMessageContactName *nameProto = contactProto.name;
if (nameProto.hasGivenName) {
contactShare.givenName = nameProto.givenName;
}
if (nameProto.hasFamilyName) {
contactShare.familyName = nameProto.familyName;
}
if (nameProto.hasPrefix) {
contactShare.namePrefix = nameProto.prefix;
}
if (nameProto.hasSuffix) {
contactShare.nameSuffix = nameProto.suffix;
}
if (nameProto.hasMiddleName) {
contactShare.middleName = nameProto.middleName;
}
}
NSMutableArray<OWSContactSharePhoneNumber *> *phoneNumbers = [NSMutableArray new];
for (OWSSignalServiceProtosDataMessageContactPhone *phoneNumberProto in contactProto.number) {
OWSContactSharePhoneNumber *_Nullable phoneNumber = [self phoneNumberForProto:phoneNumberProto];
if (phoneNumber) {
[phoneNumbers addObject:phoneNumber];
}
}
contactShare.phoneNumbers = [phoneNumbers copy];
NSMutableArray<OWSContactShareEmail *> *emails = [NSMutableArray new];
for (OWSSignalServiceProtosDataMessageContactEmail *emailProto in contactProto.email) {
OWSContactShareEmail *_Nullable email = [self emailForProto:emailProto];
if (email) {
[emails addObject:email];
}
}
contactShare.emails = [emails copy];
NSMutableArray<OWSContactShareAddress *> *addresses = [NSMutableArray new];
for (OWSSignalServiceProtosDataMessageContactPostalAddress *addressProto in contactProto.address) {
OWSContactShareAddress *_Nullable address = [self addressForProto:addressProto];
if (address) {
[addresses addObject:address];
}
}
contactShare.addresses = [addresses copy];
return contactShare;
}
+ (nullable OWSContactSharePhoneNumber *)phoneNumberForProto:
(OWSSignalServiceProtosDataMessageContactPhone *)phoneNumberProto
{
OWSContactSharePhoneNumber *result = [OWSContactSharePhoneNumber new];
result.phoneType = OWSContactSharePhoneType_Custom;
if (phoneNumberProto.hasType) {
switch (phoneNumberProto.type) {
case OWSSignalServiceProtosDataMessageContactPhoneTypeHome:
result.phoneType = OWSContactSharePhoneType_Home;
break;
case OWSSignalServiceProtosDataMessageContactPhoneTypeMobile:
result.phoneType = OWSContactSharePhoneType_Mobile;
break;
case OWSSignalServiceProtosDataMessageContactPhoneTypeWork:
result.phoneType = OWSContactSharePhoneType_Work;
break;
default:
break;
}
}
if (phoneNumberProto.hasLabel) {
result.label = phoneNumberProto.label;
}
if (phoneNumberProto.hasValue) {
result.phoneNumber = phoneNumberProto.value;
} else {
return nil;
}
return result;
}
+ (nullable OWSContactShareEmail *)emailForProto:(OWSSignalServiceProtosDataMessageContactEmail *)emailProto
{
OWSContactShareEmail *result = [OWSContactShareEmail new];
result.emailType = OWSContactShareEmailType_Custom;
if (emailProto.hasType) {
switch (emailProto.type) {
case OWSSignalServiceProtosDataMessageContactEmailTypeHome:
result.emailType = OWSContactShareEmailType_Home;
break;
case OWSSignalServiceProtosDataMessageContactEmailTypeMobile:
result.emailType = OWSContactShareEmailType_Mobile;
break;
case OWSSignalServiceProtosDataMessageContactEmailTypeWork:
result.emailType = OWSContactShareEmailType_Work;
break;
default:
break;
}
}
if (emailProto.hasLabel) {
result.label = emailProto.label;
}
if (emailProto.hasValue) {
result.email = emailProto.value;
} else {
return nil;
}
return result;
}
+ (nullable OWSContactShareAddress *)addressForProto:
(OWSSignalServiceProtosDataMessageContactPostalAddress *)addressProto
{
OWSContactShareAddress *result = [OWSContactShareAddress new];
result.addressType = OWSContactShareAddressType_Custom;
if (addressProto.hasType) {
switch (addressProto.type) {
case OWSSignalServiceProtosDataMessageContactPostalAddressTypeHome:
result.addressType = OWSContactShareAddressType_Home;
break;
case OWSSignalServiceProtosDataMessageContactPostalAddressTypeWork:
result.addressType = OWSContactShareAddressType_Work;
break;
default:
break;
}
}
if (addressProto.hasLabel) {
result.label = addressProto.label;
}
if (addressProto.hasStreet) {
result.street = addressProto.street;
}
if (addressProto.hasPobox) {
result.pobox = addressProto.pobox;
}
if (addressProto.hasNeighborhood) {
result.neighborhood = addressProto.neighborhood;
}
if (addressProto.hasCity) {
result.city = addressProto.city;
}
if (addressProto.hasRegion) {
result.region = addressProto.region;
}
if (addressProto.hasPostcode) {
result.postcode = addressProto.postcode;
}
if (addressProto.hasCountry) {
result.country = addressProto.country;
}
return result;
}
@end
NS_ASSUME_NONNULL_END