VLCLocalNetworkServiceBrowserDSM.m 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*****************************************************************************
  2. * VLCLocalNetworkServiceBrowserDSM.m
  3. * VLC for iOS
  4. *****************************************************************************
  5. * Copyright (c) 2015 VideoLAN. All rights reserved.
  6. * $Id$
  7. *
  8. * Authors: Tobias Conradi <videolan # tobias-conradi.de>
  9. *
  10. * Refer to the COPYING file of the official project for license.
  11. *****************************************************************************/
  12. #import "VLCLocalNetworkServiceBrowserDSM.h"
  13. #import "VLCNetworkServerLoginInformation.h"
  14. @implementation VLCLocalNetworkServiceBrowserDSM
  15. - (instancetype)init {
  16. #if TARGET_OS_TV
  17. NSString *name = NSLocalizedString(@"SMB_CIFS_FILE_SERVERS_SHORT", nil);
  18. #else
  19. NSString *name = NSLocalizedString(@"SMB_CIFS_FILE_SERVERS", nil);
  20. #endif
  21. return [super initWithName:name
  22. serviceServiceName:@"dsm"];
  23. }
  24. - (id<VLCLocalNetworkService>)networkServiceForIndex:(NSUInteger)index {
  25. VLCMedia *media = [self.mediaDiscoverer.discoveredMedia mediaAtIndex:index];
  26. if (media)
  27. return [[VLCLocalNetworkServiceDSM alloc] initWithMediaItem:media serviceName:self.name];
  28. return nil;
  29. }
  30. @end
  31. NSString *const VLCNetworkServerProtocolIdentifierSMB = @"smb";
  32. static NSString *const VLCLocalNetworkServiceDSMWorkgroupIdentifier = @"VLCLocalNetworkServiceDSMWorkgroup";
  33. @implementation VLCLocalNetworkServiceDSM
  34. - (UIImage *)icon {
  35. return [UIImage imageNamed:@"serverIcon"];
  36. }
  37. - (VLCNetworkServerLoginInformation *)loginInformation {
  38. VLCMedia *media = self.mediaItem;
  39. if (media.mediaType != VLCMediaTypeDirectory)
  40. return nil;
  41. VLCNetworkServerLoginInformation *login = [[VLCNetworkServerLoginInformation alloc] init];
  42. login.address = self.mediaItem.url.host;
  43. login.protocolIdentifier = VLCNetworkServerProtocolIdentifierSMB;
  44. VLCNetworkServerLoginInformationField *workgroupField = [[VLCNetworkServerLoginInformationField alloc] initWithType:VLCNetworkServerLoginInformationFieldTypeText
  45. identifier:VLCLocalNetworkServiceDSMWorkgroupIdentifier
  46. label:NSLocalizedString(@"DSM_WORKGROUP", nil)
  47. textValue:@"WORKGROUP"];
  48. login.additionalFields = @[workgroupField];
  49. return login;
  50. }
  51. @end
  52. @implementation VLCNetworkServerBrowserVLCMedia (SMB)
  53. + (instancetype)SMBNetworkServerBrowserWithLogin:(VLCNetworkServerLoginInformation *)login
  54. {
  55. NSURLComponents *components = [[NSURLComponents alloc] init];
  56. components.scheme = @"smb";
  57. components.host = login.address;
  58. components.port = login.port;
  59. NSURL *url = components.URL;
  60. __block NSString *workgroup = nil;
  61. [login.additionalFields enumerateObjectsUsingBlock:^(VLCNetworkServerLoginInformationField * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  62. if ([obj.identifier isEqualToString:VLCLocalNetworkServiceDSMWorkgroupIdentifier])
  63. {
  64. workgroup = obj.textValue;
  65. }
  66. }];
  67. return [self SMBNetworkServerBrowserWithURL:url
  68. username:login.username
  69. password:login.password
  70. workgroup:workgroup];
  71. }
  72. + (instancetype)SMBNetworkServerBrowserWithURL:(NSURL *)url username:(NSString *)username password:(NSString *)password workgroup:(NSString *)workgroup
  73. {
  74. VLCMedia *media = [VLCMedia mediaWithURL:url];
  75. NSDictionary *mediaOptions = @{@"smb-user" : username ?: @"",
  76. @"smb-pwd" : password ?: @"",
  77. @"smb-domain" : workgroup?: @"WORKGROUP"};
  78. [media addOptions:mediaOptions];
  79. return [[self alloc] initWithMedia:media options:mediaOptions];
  80. }
  81. @end