File: GSTaskRegistry.m

package info (click to toggle)
gnustep-base 1.28.1%2Breally1.28.0-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 28,008 kB
  • sloc: objc: 223,137; ansic: 35,562; sh: 184; makefile: 128; cpp: 122; xml: 32
file content (98 lines) | stat: -rw-r--r-- 2,024 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#import "GSTaskRegistry.h"
#import "Foundation/NSDictionary.h"
#import "Foundation/NSException.h"
#import "Foundation/NSURLSession.h"


@implementation GSTaskRegistry
{
  NSMutableDictionary  *_tasks;
  void                 (^_tasksCompletion)(void);
}

- (instancetype) init 
{
  if (nil != (self = [super init])) 
    {
      _tasks = [[NSMutableDictionary alloc] init];
    }
  
  return self;
}

- (void) dealloc
{
  DESTROY(_tasks);
  [super dealloc];
}

- (NSArray*) allTasks 
{
  return [_tasks allValues];
}

- (BOOL) isEmpty 
{
  return [_tasks count] == 0;
}

- (void) notifyOnTasksCompletion: (void (^)(void))tasksCompletion 
{
  _tasksCompletion = tasksCompletion;
}

- (void) addTask: (NSURLSessionTask*)task
{
  NSString          *identifier;
  NSUInteger        taskIdentifier;
  NSURLSessionTask  *t;

  taskIdentifier = [task taskIdentifier];

  NSAssert(taskIdentifier != 0, @"Invalid task identifier");
  
  identifier = [NSString stringWithFormat: @"%lu", taskIdentifier];

  if (nil != (t = [_tasks objectForKey: identifier])) 
    {
      if ([t isEqual: task]) 
        {
          NSAssert(NO,
            @"Trying to re-insert a task that's already in the registry.");
        } 
      else 
        {
          NSAssert(NO,
            @"Trying to insert a task, but a different task with the same"
            @" identifier is already in the registry.");
        }
    }
  
  [_tasks setObject: task forKey: identifier];
}

- (void) removeTask: (NSURLSessionTask*)task 
{
  NSString          *identifier;
  NSUInteger        taskIdentifier;

  taskIdentifier = [task taskIdentifier];

  NSAssert(taskIdentifier != 0, @"Invalid task identifier");
  
  identifier = [NSString stringWithFormat: @"%lu", taskIdentifier];

  if (nil == [_tasks objectForKey: identifier])
    {
      NSAssert(NO, @"Trying to remove task, but it's not in the registry."); 
    }

  [_tasks removeObjectForKey: identifier];

  if (nil != _tasksCompletion && [self isEmpty]) 
    {
      _tasksCompletion();
    }
}

@end