VLCOneDriveObject.m 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /*****************************************************************************
  2. * VLCOneDriveObject.h
  3. * VLC for iOS
  4. *****************************************************************************
  5. * Copyright (c) 2015 VideoLAN. All rights reserved.
  6. * $Id$
  7. *
  8. * Authors: Felix Paul Kühne <fkuehne # videolan.org>
  9. *
  10. * Refer to the COPYING file of the official project for license.
  11. *****************************************************************************/
  12. #import "VLCOneDriveObject.h"
  13. #import "VLCHTTPFileDownloader.h"
  14. #if TARGET_OS_IOS
  15. @interface VLCOneDriveObject () <VLCHTTPFileDownloader>
  16. {
  17. VLCHTTPFileDownloader *_fileDownloader;
  18. }
  19. @end
  20. #else
  21. @interface VLCOneDriveObject ()
  22. @end
  23. #endif
  24. @implementation VLCOneDriveObject
  25. #pragma mark properties
  26. - (BOOL)isFolder
  27. {
  28. return [self.type isEqual:@"folder"] || [self.type isEqual:@"album"];
  29. }
  30. - (BOOL)isVideo
  31. {
  32. return [self.type isEqual:@"video"];
  33. }
  34. - (BOOL)isAudio
  35. {
  36. return [self.type isEqual:@"audio"];
  37. }
  38. - (NSString *)filesPath
  39. {
  40. return [self.objectId stringByAppendingString:@"/files"];
  41. }
  42. - (BOOL)hasFullFolderTree
  43. {
  44. BOOL hasFullTree = YES;
  45. if (self.folders != nil) {
  46. NSUInteger count = self.folders.count;
  47. for (NSUInteger x = 0; x < count; x++) {
  48. VLCOneDriveObject *folder = self.folders[x];
  49. if (!folder.hasFullFolderTree) {
  50. hasFullTree = NO;
  51. break;
  52. }
  53. }
  54. } else
  55. hasFullTree = NO;
  56. return hasFullTree;
  57. }
  58. #pragma mark - actions
  59. - (void)loadFolderContent
  60. {
  61. if (!self.isFolder) {
  62. APLog(@"%@ is no folder, can't load content", self.objectId);
  63. return;
  64. }
  65. if (self.folders == nil) {
  66. [self.liveClient getWithPath:self.filesPath
  67. delegate:self
  68. userState:@"load-folder-content"];
  69. } else {
  70. NSUInteger count = self.folders.count;
  71. for (NSUInteger x = 0; x < count; x++) {
  72. VLCOneDriveObject *folder = self.folders[x];
  73. if (!folder.hasFullFolderTree) {
  74. [folder loadFolderContent];
  75. return;
  76. }
  77. }
  78. [self.delegate fullFolderTreeLoaded:self];
  79. }
  80. }
  81. #pragma mark - live operations
  82. - (void)liveOperationSucceeded:(LiveDownloadOperation *)operation
  83. {
  84. NSString *userState = operation.userState;
  85. if ([userState isEqualToString:@"load-folder-content"]) {
  86. NSMutableArray *subFolders = [[NSMutableArray alloc] init];
  87. NSMutableArray *folderFiles = [[NSMutableArray alloc] init];
  88. NSMutableArray *items = [[NSMutableArray alloc] init];
  89. NSArray *rawFolderObjects = operation.result[@"data"];
  90. BOOL hasSubFolders = NO;
  91. NSUInteger count = rawFolderObjects.count;
  92. for (NSUInteger x = 0; x < count; x++) {
  93. NSDictionary *rawObject = rawFolderObjects[x];
  94. VLCOneDriveObject *oneDriveObject = [[VLCOneDriveObject alloc] init];
  95. oneDriveObject.parent = self;
  96. oneDriveObject.objectId = rawObject[@"id"];
  97. oneDriveObject.name = rawObject[@"name"];
  98. oneDriveObject.type = rawObject[@"type"];
  99. oneDriveObject.liveClient = self.liveClient;
  100. if (oneDriveObject.isFolder) {
  101. hasSubFolders = YES;
  102. [subFolders addObject:oneDriveObject];
  103. } else {
  104. oneDriveObject.size = rawObject[@"size"];
  105. oneDriveObject.thumbnailURL = rawObject[@"picture"];
  106. oneDriveObject.downloadPath = rawObject[@"source"];
  107. oneDriveObject.duration = rawObject[@"duration"];
  108. [folderFiles addObject:oneDriveObject];
  109. }
  110. [items addObject:oneDriveObject];
  111. }
  112. self.folders = subFolders;
  113. self.files = folderFiles;
  114. self.items = items;
  115. [self.delegate folderContentLoaded:self];
  116. }
  117. }
  118. - (void)liveOperationFailed:(NSError *)error operation:(LiveDownloadOperation *)operation
  119. {
  120. NSString *userState = operation.userState;
  121. APLog(@"liveOperationFailed %@ (%@)", userState, error);
  122. if ([userState isEqualToString:@"load-folder-content"])
  123. [self.delegate folderContentLoadingFailed:error sender:self];
  124. }
  125. #pragma mark - delegation
  126. - (void)folderContentLoaded:(VLCOneDriveObject *)sender
  127. {
  128. }
  129. - (void)folderContentLoadingFailed:(NSError *)error sender:(VLCOneDriveObject *)sender
  130. {
  131. if (self.delegate)
  132. [self.delegate folderContentLoadingFailed:error sender:self];
  133. }
  134. - (void)fullFolderTreeLoaded:(VLCOneDriveObject *)sender
  135. {
  136. [self loadFolderContent];
  137. }
  138. #pragma mark - file downloading
  139. - (void)saveObjectToDocuments
  140. {
  141. #if TARGET_OS_IOS
  142. _fileDownloader = [[VLCHTTPFileDownloader alloc] init];
  143. _fileDownloader.delegate = self;
  144. [_fileDownloader downloadFileFromURL:[NSURL URLWithString:self.downloadPath] withFileName:self.name];
  145. #endif
  146. }
  147. - (void)downloadStarted
  148. {
  149. if ([self.downloadDelegate respondsToSelector:@selector(downloadStarted:)])
  150. [self.downloadDelegate downloadStarted:self];
  151. }
  152. - (void)downloadEnded
  153. {
  154. if ([self.downloadDelegate respondsToSelector:@selector(downloadEnded:)])
  155. [self.downloadDelegate downloadEnded:self];
  156. }
  157. - (void)downloadFailedWithErrorDescription:(NSString *)description
  158. {
  159. APLog(@"download failed (%@)", description);
  160. }
  161. - (void)progressUpdatedTo:(CGFloat)percentage receivedDataSize:(CGFloat)receivedDataSize expectedDownloadSize:(CGFloat)expectedDownloadSize
  162. {
  163. if ([self.downloadDelegate respondsToSelector:@selector(progressUpdated:)])
  164. [self.downloadDelegate progressUpdated:percentage];
  165. if ([self.downloadDelegate respondsToSelector:@selector(calculateRemainingTime:expectedDownloadSize:)])
  166. [self.downloadDelegate calculateRemainingTime:receivedDataSize expectedDownloadSize:expectedDownloadSize];
  167. }
  168. @end