mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			116 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Objective-C
		
	
			
		
		
	
	
			116 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Objective-C
		
	
| //
 | |
| //  Copyright (c) 2017 Open Whisper Systems. All rights reserved.
 | |
| //
 | |
| 
 | |
| #import "SessionRecord.h"
 | |
| #import <SessionProtocolKit/OWSAsserts.h>
 | |
| 
 | |
| #define ARCHIVED_STATES_MAX_LENGTH 40
 | |
| 
 | |
| @interface SessionRecord()
 | |
| 
 | |
| @property (nonatomic, retain) SessionState* sessionState;
 | |
| @property (nonatomic, retain) NSMutableArray* previousStates;
 | |
| @property (nonatomic) BOOL fresh;
 | |
| 
 | |
| @end
 | |
| 
 | |
| #define currentSessionStateKey   @"currentSessionStateKey"
 | |
| #define previousSessionsStateKey @"previousSessionStateKeys"
 | |
| 
 | |
| @implementation SessionRecord
 | |
| 
 | |
| - (instancetype)init{
 | |
|     self = [super init];
 | |
|     
 | |
|     if (self) {
 | |
|         _fresh = YES;
 | |
|         _sessionState = [SessionState new];
 | |
|         _previousStates = [NSMutableArray new];
 | |
|     }
 | |
|     
 | |
|     return self;
 | |
| }
 | |
| 
 | |
| #pragma mark Serialization
 | |
| 
 | |
| + (BOOL)supportsSecureCoding{
 | |
|     return YES;
 | |
| }
 | |
| 
 | |
| - (void)encodeWithCoder:(NSCoder *)aCoder{
 | |
|     [aCoder encodeObject:self.previousStates forKey:previousSessionsStateKey];
 | |
|     [aCoder encodeObject:self.sessionState   forKey:currentSessionStateKey];
 | |
| }
 | |
| 
 | |
| - (instancetype)initWithCoder:(NSCoder *)aDecoder{
 | |
|     self = [self init];
 | |
|     
 | |
|     self.fresh = false;
 | |
|     
 | |
|     self.previousStates = [aDecoder decodeObjectOfClass:[NSMutableArray class] forKey:previousSessionsStateKey];
 | |
|     self.sessionState   = [aDecoder decodeObjectOfClass:[SessionState class]   forKey:currentSessionStateKey];
 | |
|     
 | |
|     return self;
 | |
| }
 | |
| 
 | |
| - (BOOL)hasSessionState:(int)version baseKey:(NSData *)aliceBaseKey{
 | |
|     if (self.sessionState.version == version && [aliceBaseKey isEqualToData:self.sessionState.aliceBaseKey]) {
 | |
|         return YES;
 | |
|     }
 | |
|     
 | |
|     for (SessionState *state in self.previousStates) {
 | |
|         if (state.version == version && [aliceBaseKey isEqualToData:self.sessionState.aliceBaseKey]) {
 | |
|             return YES;
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     return NO;
 | |
| }
 | |
| 
 | |
| - (SessionState*)sessionState{
 | |
|     return _sessionState;
 | |
| }
 | |
| 
 | |
| - (NSMutableArray<SessionState *> *)previousSessionStates
 | |
| {
 | |
|     return _previousStates;
 | |
| }
 | |
| 
 | |
| - (void)removePreviousSessionStates
 | |
| {
 | |
|     [_previousStates removeAllObjects];
 | |
| }
 | |
| 
 | |
| - (BOOL)isFresh{
 | |
|     return _fresh;
 | |
| }
 | |
| 
 | |
| - (void)markAsUnFresh
 | |
| {
 | |
|     self.fresh = false;
 | |
| }
 | |
| 
 | |
| - (void)archiveCurrentState{
 | |
|     [self promoteState:[SessionState new]];
 | |
| }
 | |
| 
 | |
| - (void)promoteState:(SessionState *)promotedState{
 | |
|     [self.previousStates insertObject:self.sessionState atIndex:0];
 | |
|     self.sessionState = promotedState;
 | |
|     
 | |
|     if (self.previousStates.count > ARCHIVED_STATES_MAX_LENGTH) {
 | |
|         NSUInteger deleteCount;
 | |
|         ows_sub_overflow(self.previousStates.count, ARCHIVED_STATES_MAX_LENGTH, &deleteCount);
 | |
|         NSIndexSet *indexesToDelete =
 | |
|             [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(ARCHIVED_STATES_MAX_LENGTH, deleteCount)];
 | |
|         [self.previousSessionStates removeObjectsAtIndexes:indexesToDelete];
 | |
|     }
 | |
| }
 | |
| 
 | |
| - (void)setState:(SessionState *)sessionState{
 | |
|     self.sessionState = sessionState;
 | |
| }
 | |
| 
 | |
| @end
 |