VLCNetworkServerSearchBrowser.m 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /*****************************************************************************
  2. * VLC for iOS
  3. *****************************************************************************
  4. * Copyright (c) 2016 VideoLAN. All rights reserved.
  5. * $Id$
  6. *
  7. * Authors: Vincent L. Cone <vincent.l.cone # tuta.io>
  8. *
  9. * Refer to the COPYING file of the official project for license.
  10. *****************************************************************************/
  11. #import "VLCNetworkServerSearchBrowser.h"
  12. @interface VLCNetworkServerSearchBrowser()
  13. @property (nonatomic) id<VLCNetworkServerBrowser> serverBrowser;
  14. @property (nonatomic, copy, nullable) NSIndexSet *filteredIndexes;
  15. @property (nonatomic, copy, null_resettable) NSArray<id<VLCNetworkServerBrowserItem>> *filteredItems;
  16. @property (nonatomic, null_resettable) VLCMediaList *filteredMediaList;
  17. @end
  18. @implementation VLCNetworkServerSearchBrowser
  19. @synthesize delegate = _delegate;
  20. - (instancetype)initWithServerBrowser:(id<VLCNetworkServerBrowser>)serverBrowser
  21. {
  22. self = [super init];
  23. if (self) {
  24. _serverBrowser = serverBrowser;
  25. }
  26. return self;
  27. }
  28. - (NSString *)title
  29. {
  30. return self.serverBrowser.title;
  31. }
  32. - (VLCMediaList *)mediaList
  33. {
  34. return self.filteredMediaList;
  35. }
  36. - (NSArray<id<VLCNetworkServerBrowserItem>> *)items
  37. {
  38. return self.filteredItems;
  39. }
  40. - (void)update
  41. {
  42. [self.serverBrowser update];
  43. }
  44. - (void)setSearchText:(NSString *)searchText
  45. {
  46. if (![_searchText isEqualToString:searchText]) {
  47. _searchText = searchText;
  48. [self updateFilteredItems];
  49. [self.delegate networkServerBrowserDidUpdate:self];
  50. }
  51. }
  52. #pragma mark - filtering
  53. - (void)setFilteredIndexes:(NSIndexSet *)filteredIndexes
  54. {
  55. BOOL needUpdate = NO;
  56. if (_filteredIndexes) {
  57. needUpdate = ![_filteredIndexes isEqualToIndexSet:filteredIndexes];
  58. } else if (filteredIndexes) {
  59. needUpdate = YES;
  60. }
  61. if (needUpdate) {
  62. _filteredIndexes = [filteredIndexes copy];
  63. self.filteredItems = nil;
  64. self.filteredMediaList = nil;
  65. }
  66. }
  67. - (NSArray<id<VLCNetworkServerBrowserItem>> *)filteredItems
  68. {
  69. if (!_filteredItems) {
  70. NSIndexSet *indexes = self.filteredIndexes;
  71. NSArray<id<VLCNetworkServerBrowserItem>> *items = self.serverBrowser.items;
  72. _filteredItems = indexes ? [items objectsAtIndexes:indexes] : items;
  73. }
  74. return _filteredItems;
  75. }
  76. - (VLCMediaList *)filteredMediaList
  77. {
  78. if (!_filteredMediaList) {
  79. NSIndexSet *indexes = self.filteredIndexes;
  80. VLCMediaList *mediaList = self.serverBrowser.mediaList;
  81. if (indexes) {
  82. __block NSUInteger count = 0;
  83. VLCMediaList *filteredMediaList = [[VLCMediaList alloc] initWithArray:nil];
  84. [filteredMediaList lock];
  85. [mediaList lock];
  86. [indexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {
  87. VLCMedia *media = [mediaList mediaAtIndex:idx];
  88. [filteredMediaList insertMedia:media atIndex:count];
  89. ++count;
  90. }];
  91. [mediaList unlock];
  92. [filteredMediaList unlock];
  93. _filteredMediaList = filteredMediaList;
  94. } else {
  95. _filteredMediaList = mediaList;
  96. }
  97. }
  98. return _filteredMediaList;
  99. }
  100. - (void)updateFilteredItems
  101. {
  102. NSIndexSet *filteredIndexes = nil;
  103. if (self.searchText.length) {
  104. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@",self.searchText];
  105. NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
  106. NSArray<id<VLCNetworkServerBrowserItem>> *items = self.serverBrowser.items;
  107. [items enumerateObjectsUsingBlock:^(id<VLCNetworkServerBrowserItem> _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  108. if ([predicate evaluateWithObject:obj]) {
  109. [indexSet addIndex:idx];
  110. }
  111. }];
  112. filteredIndexes = indexSet;
  113. }
  114. self.filteredIndexes = filteredIndexes;
  115. }
  116. #pragma mark - VLCNetworkServerBrowserDelegate
  117. - (void)networkServerBrowserDidUpdate:(id<VLCNetworkServerBrowser>)networkBrowser
  118. {
  119. [self updateFilteredItems];
  120. [self.delegate networkServerBrowserDidUpdate:self];
  121. }
  122. - (void)networkServerBrowser:(id<VLCNetworkServerBrowser>)networkBrowser requestDidFailWithError:(NSError *)error
  123. {
  124. [self.delegate networkServerBrowser:self requestDidFailWithError:error];
  125. }
  126. @end