1// Copyright 2015-present 650 Industries. All rights reserved.
2#import "EXScopedFileSystemModule.h"
3#import <EXFileSystem/EXFileSystem.h>
4#import "EXUnscopingDataMigrator.h"
5#import "EXEnvironment.h"
6
7@implementation EXScopedFileSystemModule
8
9- (instancetype)initWithExperienceId:(NSString *)experienceId
10{
11  self = [super initWithExperienceId:experienceId];
12  return self;
13}
14
15- (NSString *)documentDirectoryForExperienceId:(NSString *)experienceId
16{
17  return [EXScopedFileSystemModule documentDirectoryForExperienceId:experienceId];
18}
19
20- (NSString *)cachesDirectoryForExperienceId:(NSString *)experienceId
21{
22  return [EXScopedFileSystemModule cachesDirectoryForExperienceId:experienceId];
23}
24
25+ (NSString *)escapedResourceName:(NSString *)name
26{
27  NSString *charactersToEscape = @"!*'();:@&=+$,/?%#[]";
28  NSCharacterSet *allowedCharacters = [[NSCharacterSet characterSetWithCharactersInString:charactersToEscape] invertedSet];
29  return [name stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters];
30}
31
32+ (NSString *)generateDocumentDirectoryPath:(NSString *)experienceId
33{
34  NSString *subdir = [self escapedResourceName:experienceId];
35  return [[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject
36            stringByAppendingPathComponent:@"ExponentExperienceData"]
37           stringByAppendingPathComponent:subdir] stringByStandardizingPath];
38}
39
40+ (NSString *)documentDirectoryForExperienceId:(NSString *)experienceId
41{
42  if ([EXEnvironment sharedEnvironment].isDetached) {
43    if ([EXUnscopingDataMigrator firstStartAfterUpdate:experienceId]) {
44      [EXUnscopingDataMigrator moveOldFiles:experienceId];
45    }
46    return [EXFileSystem documentDirectoryForExperienceId:experienceId];
47  }
48  return [EXScopedFileSystemModule generateDocumentDirectoryPath:experienceId];
49}
50
51+ (NSString *)cachesDirectoryForExperienceId:(NSString *)experienceId
52{
53  if ([EXEnvironment sharedEnvironment].isDetached) {
54    return [EXFileSystem cachesDirectoryForExperienceId:experienceId];
55  }
56  NSString *subdir = [self escapedResourceName:experienceId];
57  return [[[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject
58            stringByAppendingPathComponent:@"ExponentExperienceData"]
59           stringByAppendingPathComponent:subdir] stringByStandardizingPath];
60}
61
62@end
63