diff --git a/Classes/BITOrderedDictionary.h b/Classes/BITOrderedDictionary.h new file mode 100644 index 0000000000..12824bbd8e --- /dev/null +++ b/Classes/BITOrderedDictionary.h @@ -0,0 +1,14 @@ +#import +#import "HockeySDKNullability.h" + +NS_ASSUME_NONNULL_BEGIN +@interface BITOrderedDictionary : NSMutableDictionary { + NSMutableDictionary *dictionary; + NSMutableArray *order; +} + +- (instancetype)initWithCapacity:(NSUInteger)numItems; +- (void)setObject:(id)anObject forKey:(id)aKey; + +@end +NS_ASSUME_NONNULL_END diff --git a/Classes/BITOrderedDictionary.m b/Classes/BITOrderedDictionary.m new file mode 100644 index 0000000000..9aa431486f --- /dev/null +++ b/Classes/BITOrderedDictionary.m @@ -0,0 +1,42 @@ +#import "BITOrderedDictionary.h" + +@implementation BITOrderedDictionary + +- (instancetype)init { + if (self = [super init]) { + dictionary = [NSMutableDictionary new]; + order = [NSMutableArray new]; + } + return self; +} + +- (instancetype)initWithCapacity:(NSUInteger)numItems { + self = [super init]; + if ( self != nil ) + { + dictionary = [[NSMutableDictionary alloc] initWithCapacity:numItems]; + order = [NSMutableArray new]; + } + return self; +} + +- (void)setObject:(id)anObject forKey:(id)aKey { + if(!dictionary[aKey]) { + [order addObject:aKey]; + } + dictionary[aKey] = anObject; +} + +- (NSEnumerator *)keyEnumerator { + return [order objectEnumerator]; +} + +- (id)objectForKey:(id)key { + return dictionary[key]; +} + +- (NSUInteger)count { + return [dictionary count]; +} + +@end diff --git a/Classes/BITSession.h b/Classes/BITSession.h new file mode 100644 index 0000000000..04843ee2d3 --- /dev/null +++ b/Classes/BITSession.h @@ -0,0 +1,9 @@ +#import "BITTelemetryObject.h" + +@interface BITSession : BITTelemetryObject + +@property (nonatomic, copy) NSString *sessionId; +@property (nonatomic, copy) NSString *isFirst; +@property (nonatomic, copy) NSString *isNew; + +@end diff --git a/Classes/BITSession.m b/Classes/BITSession.m new file mode 100644 index 0000000000..5e3bd608e2 --- /dev/null +++ b/Classes/BITSession.m @@ -0,0 +1,46 @@ +#import "BITSession.h" +#import "BITOrderedDictionary.h" + +/// Data contract class for type Session. +@implementation BITSession + +/// +/// Adds all members of this class to a dictionary +/// @param dictionary to which the members of this class will be added. +/// +- (BITOrderedDictionary *)serializeToDictionary { + BITOrderedDictionary *dict = [super serializeToDictionary]; + if (self.sessionId != nil) { + [dict setObject:self.sessionId forKey:@"ai.session.id"]; + } + if (self.isFirst != nil) { + [dict setObject:self.isFirst forKey:@"ai.session.isFirst"]; + } + if (self.isNew != nil) { + [dict setObject:self.isNew forKey:@"ai.session.isNew"]; + } + return dict; +} + +#pragma mark - NSCoding + +- (instancetype)initWithCoder:(NSCoder *)coder { + self = [super initWithCoder:coder]; + if(self) { + _sessionId = [coder decodeObjectForKey:@"self.sessionId"]; + _isFirst = [coder decodeObjectForKey:@"self.isFirst"]; + _isNew = [coder decodeObjectForKey:@"self.isNew"]; + } + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + [coder encodeObject:self.sessionId forKey:@"self.sessionId"]; + [coder encodeObject:self.isFirst forKey:@"self.isFirst"]; + [coder encodeObject:self.isNew forKey:@"self.isNew"]; +} + + +@end diff --git a/Classes/BITTelemetryObject.h b/Classes/BITTelemetryObject.h new file mode 100644 index 0000000000..af4a1ff1db --- /dev/null +++ b/Classes/BITTelemetryObject.h @@ -0,0 +1,11 @@ +#import +#import "HockeySDKPrivate.h" + +@class BITOrderedDictionary; + +@interface BITTelemetryObject : NSObject + +- (BITOrderedDictionary *)serializeToDictionary; +- (NSString *)serializeToString; + +@end diff --git a/Classes/BITTelemetryObject.m b/Classes/BITTelemetryObject.m new file mode 100644 index 0000000000..fd3c6ffab7 --- /dev/null +++ b/Classes/BITTelemetryObject.m @@ -0,0 +1,31 @@ +#import "BITTelemetryObject.h" +#import "BITOrderedDictionary.h" + +@implementation BITTelemetryObject + +// empty implementation for the base class +- (BITOrderedDictionary *)serializeToDictionary{ + BITOrderedDictionary *dict = [BITOrderedDictionary new]; + return dict; +} + +- (NSString *)serializeToString { + BITOrderedDictionary *dict = [self serializeToDictionary]; + NSMutableString *jsonString; + NSError *error = nil; + NSData *json; + json = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error]; + jsonString = [[NSMutableString alloc] initWithData:json encoding:NSUTF8StringEncoding]; + NSString *returnString = [[jsonString stringByReplacingOccurrencesOfString:@"\"true\"" withString:@"true"] stringByReplacingOccurrencesOfString:@"\"false\"" withString:@"false"]; + return returnString; +} + +- (void)encodeWithCoder:(NSCoder *)coder { +} + +- (instancetype)initWithCoder:(NSCoder *)coder { + return [super init]; +} + + +@end diff --git a/Support/HockeySDK.xcodeproj/project.pbxproj b/Support/HockeySDK.xcodeproj/project.pbxproj index 994708d9ee..8d25f61236 100644 --- a/Support/HockeySDK.xcodeproj/project.pbxproj +++ b/Support/HockeySDK.xcodeproj/project.pbxproj @@ -37,6 +37,18 @@ 1B87EFB61B8D0C540007C96B /* BITTelemetryManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B87EFB41B8D0C540007C96B /* BITTelemetryManager.m */; }; 1B87EFB81B8D1F930007C96B /* BITTelemetryManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B87EFB31B8D0C540007C96B /* BITTelemetryManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1B87EFB91B8D1F9D0007C96B /* BITTelemetryManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B87EFB41B8D0C540007C96B /* BITTelemetryManager.m */; }; + 1B87EFBC1B8D2EF50007C96B /* BITSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B87EFBA1B8D2EF50007C96B /* BITSession.h */; }; + 1B87EFBD1B8D2EF50007C96B /* BITSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B87EFBA1B8D2EF50007C96B /* BITSession.h */; }; + 1B87EFBE1B8D2EF50007C96B /* BITSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B87EFBB1B8D2EF50007C96B /* BITSession.m */; }; + 1B87EFBF1B8D2EF50007C96B /* BITSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B87EFBB1B8D2EF50007C96B /* BITSession.m */; }; + 1B87EFC31B8D2FBA0007C96B /* BITTelemetryObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B87EFC11B8D2FBA0007C96B /* BITTelemetryObject.h */; }; + 1B87EFC41B8D2FBA0007C96B /* BITTelemetryObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B87EFC11B8D2FBA0007C96B /* BITTelemetryObject.h */; }; + 1B87EFC51B8D2FBA0007C96B /* BITTelemetryObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B87EFC21B8D2FBA0007C96B /* BITTelemetryObject.m */; }; + 1B87EFC61B8D2FBA0007C96B /* BITTelemetryObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B87EFC21B8D2FBA0007C96B /* BITTelemetryObject.m */; }; + 1B87EFC91B8D30AC0007C96B /* BITOrderedDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B87EFC71B8D30AC0007C96B /* BITOrderedDictionary.h */; }; + 1B87EFCA1B8D30AC0007C96B /* BITOrderedDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B87EFC71B8D30AC0007C96B /* BITOrderedDictionary.h */; }; + 1B87EFCB1B8D30AC0007C96B /* BITOrderedDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B87EFC81B8D30AC0007C96B /* BITOrderedDictionary.m */; }; + 1B87EFCC1B8D30AC0007C96B /* BITOrderedDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B87EFC81B8D30AC0007C96B /* BITOrderedDictionary.m */; }; 1E0829001708F69A0073050E /* BITStoreUpdateManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E0828FF1708F69A0073050E /* BITStoreUpdateManagerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1E0FEE28173BDB260061331F /* BITKeychainUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E0FEE26173BDB260061331F /* BITKeychainUtils.h */; }; 1E0FEE29173BDB260061331F /* BITKeychainUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E0FEE27173BDB260061331F /* BITKeychainUtils.m */; }; @@ -376,6 +388,12 @@ 1B87EFB31B8D0C540007C96B /* BITTelemetryManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITTelemetryManager.h; sourceTree = ""; }; 1B87EFB41B8D0C540007C96B /* BITTelemetryManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITTelemetryManager.m; sourceTree = ""; }; 1B87EFB71B8D0F800007C96B /* BITTelemetryManagerPrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BITTelemetryManagerPrivate.h; sourceTree = ""; }; + 1B87EFBA1B8D2EF50007C96B /* BITSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITSession.h; sourceTree = ""; }; + 1B87EFBB1B8D2EF50007C96B /* BITSession.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITSession.m; sourceTree = ""; }; + 1B87EFC11B8D2FBA0007C96B /* BITTelemetryObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITTelemetryObject.h; sourceTree = ""; }; + 1B87EFC21B8D2FBA0007C96B /* BITTelemetryObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITTelemetryObject.m; sourceTree = ""; }; + 1B87EFC71B8D30AC0007C96B /* BITOrderedDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITOrderedDictionary.h; sourceTree = ""; }; + 1B87EFC81B8D30AC0007C96B /* BITOrderedDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITOrderedDictionary.m; sourceTree = ""; }; 1E0828FF1708F69A0073050E /* BITStoreUpdateManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITStoreUpdateManagerDelegate.h; sourceTree = ""; }; 1E0FEE26173BDB260061331F /* BITKeychainUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITKeychainUtils.h; sourceTree = ""; }; 1E0FEE27173BDB260061331F /* BITKeychainUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITKeychainUtils.m; sourceTree = ""; }; @@ -640,6 +658,7 @@ 1B87EFB21B8D0B260007C96B /* Telemetry */ = { isa = PBXGroup; children = ( + 1B87EFC01B8D2F870007C96B /* Contract Files */, 1B87EFB31B8D0C540007C96B /* BITTelemetryManager.h */, 1B87EFB41B8D0C540007C96B /* BITTelemetryManager.m */, 1B87EFB71B8D0F800007C96B /* BITTelemetryManagerPrivate.h */, @@ -647,6 +666,19 @@ name = Telemetry; sourceTree = ""; }; + 1B87EFC01B8D2F870007C96B /* Contract Files */ = { + isa = PBXGroup; + children = ( + 1B87EFBA1B8D2EF50007C96B /* BITSession.h */, + 1B87EFBB1B8D2EF50007C96B /* BITSession.m */, + 1B87EFC11B8D2FBA0007C96B /* BITTelemetryObject.h */, + 1B87EFC21B8D2FBA0007C96B /* BITTelemetryObject.m */, + 1B87EFC71B8D30AC0007C96B /* BITOrderedDictionary.h */, + 1B87EFC81B8D30AC0007C96B /* BITOrderedDictionary.m */, + ); + name = "Contract Files"; + sourceTree = ""; + }; 1E5955A415B71BDC00A03429 /* Images */ = { isa = PBXGroup; children = ( @@ -1071,6 +1103,7 @@ 1E49A4541612223B00463151 /* BITFeedbackManagerPrivate.h in Headers */, 1E49A4571612223B00463151 /* BITFeedbackMessage.h in Headers */, 1E49A45D1612223B00463151 /* BITFeedbackUserDataViewController.h in Headers */, + 1B87EFBC1B8D2EF50007C96B /* BITSession.h in Headers */, 1E49A46D1612226D00463151 /* BITAppVersionMetaInfo.h in Headers */, 1E49A47C1612226D00463151 /* BITUpdateManagerPrivate.h in Headers */, 1E49A4851612226D00463151 /* BITUpdateViewControllerPrivate.h in Headers */, @@ -1088,8 +1121,10 @@ 1E754E601621FBB70070AB92 /* BITCrashReportTextFormatter.h in Headers */, 1E84DB3417E099BA00AC83FD /* HockeySDKFeatureConfig.h in Headers */, 1EACC97B162F041E007578C5 /* BITAttributedLabel.h in Headers */, + 1B87EFC31B8D2FBA0007C96B /* BITTelemetryObject.h in Headers */, 1E0FEE28173BDB260061331F /* BITKeychainUtils.h in Headers */, 1E94F9E416E9136B006570AD /* BITStoreUpdateManagerPrivate.h in Headers */, + 1B87EFC91B8D30AC0007C96B /* BITOrderedDictionary.h in Headers */, 9760F6CF18BB685600959B93 /* BITImageAnnotation.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1131,6 +1166,7 @@ 1EB617A61B0A319F0035A986 /* BITUpdateManagerPrivate.h in Headers */, 1EB617A41B0A31940035A986 /* BITUpdateManager.h in Headers */, 1EB617AC1B0A31BA0035A986 /* BITHockeyManager.h in Headers */, + 1B87EFBD1B8D2EF50007C96B /* BITSession.h in Headers */, 1EB617A71B0A31A30035A986 /* BITUpdateViewController.h in Headers */, 1EB617631B0A30AE0035A986 /* BITHockeyHelper.h in Headers */, 1EB617A51B0A319A0035A986 /* BITUpdateManagerDelegate.h in Headers */, @@ -1148,8 +1184,10 @@ 1EB617981B0A315F0035A986 /* BITFeedbackMessage.h in Headers */, 1EB617A91B0A31AB0035A986 /* BITStoreUpdateManager.h in Headers */, 1EB617AB1B0A31B40035A986 /* BITStoreUpdateManagerDelegate.h in Headers */, + 1B87EFC41B8D2FBA0007C96B /* BITTelemetryObject.h in Headers */, 1EB617AD1B0A31BF0035A986 /* BITHockeyManagerDelegate.h in Headers */, 1EB617971B0A31580035A986 /* BITBlurImageAnnotation.h in Headers */, + 1B87EFCA1B8D30AC0007C96B /* BITOrderedDictionary.h in Headers */, 1EB617611B0A30A50035A986 /* BITHockeyBaseViewController.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1462,6 +1500,7 @@ 9774BD00192CB20A00085EB5 /* BITActivityIndicatorButton.m in Sources */, 1E49A4821612226D00463151 /* BITUpdateViewController.m in Sources */, E4B4DB7E17B435550099C67F /* BITAuthenticationViewController.m in Sources */, + 1B87EFBE1B8D2EF50007C96B /* BITSession.m in Sources */, 1E49A4B2161222B900463151 /* BITHockeyBaseManager.m in Sources */, 973EC8C018BE2B5B00DBFFBB /* BITBlurImageAnnotation.m in Sources */, 9760F6D018BB685600959B93 /* BITImageAnnotation.m in Sources */, @@ -1479,10 +1518,12 @@ 1E754E611621FBB70070AB92 /* BITCrashReportTextFormatter.m in Sources */, 1EF95CA7162CB037000AE3AD /* BITFeedbackActivity.m in Sources */, 846A90211B20B0EB0076BB80 /* BITCrashCXXExceptionHandler.mm in Sources */, + 1B87EFC51B8D2FBA0007C96B /* BITTelemetryObject.m in Sources */, 1EACC97C162F041E007578C5 /* BITAttributedLabel.m in Sources */, 973EC8BC18BDE29800DBFFBB /* BITArrowImageAnnotation.m in Sources */, 973EC8B418BCA7BC00DBFFBB /* BITImageAnnotationViewController.m in Sources */, 1E0FEE29173BDB260061331F /* BITKeychainUtils.m in Sources */, + 1B87EFCB1B8D30AC0007C96B /* BITOrderedDictionary.m in Sources */, 1E94F9E216E91330006570AD /* BITStoreUpdateManager.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1532,6 +1573,7 @@ 1EB6176C1B0A30C90035A986 /* BITStoreButton.m in Sources */, 1EB6177C1B0A31170035A986 /* BITCrashMetaData.m in Sources */, 1EB617721B0A30E40035A986 /* BITAuthenticationViewController.m in Sources */, + 1B87EFBF1B8D2EF50007C96B /* BITSession.m in Sources */, 1EB617851B0A313A0035A986 /* BITRectangleImageAnnotation.m in Sources */, 1EB6177E1B0A31200035A986 /* BITCrashAttachment.m in Sources */, 1EB6176E1B0A30CF0035A986 /* BITWebTableViewCell.m in Sources */, @@ -1549,10 +1591,12 @@ 1EB617681B0A30BD0035A986 /* BITAttributedLabel.m in Sources */, 1EB617621B0A30AA0035A986 /* BITHockeyBaseViewController.m in Sources */, 846A90221B20B0EB0076BB80 /* BITCrashCXXExceptionHandler.mm in Sources */, + 1B87EFC61B8D2FBA0007C96B /* BITTelemetryObject.m in Sources */, 1EB6178A1B0A31510035A986 /* BITFeedbackComposeViewController.m in Sources */, 1EB617701B0A30D70035A986 /* BITHockeyAttachment.m in Sources */, 1EB617881B0A31510035A986 /* BITFeedbackMessage.m in Sources */, 1EB617951B0A31510035A986 /* BITHockeyManager.m in Sources */, + 1B87EFCC1B8D30AC0007C96B /* BITOrderedDictionary.m in Sources */, 1EB617921B0A31510035A986 /* BITUpdateManager.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0;