VLCLocalNetworkServiceBrowserDSM.m 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. @interface VLCLocalNetworkServiceDSM ()
  15. + (void)registerLoginInformation;
  16. @end
  17. @implementation VLCLocalNetworkServiceBrowserDSM
  18. - (instancetype)init {
  19. #if TARGET_OS_TV
  20. NSString *name = NSLocalizedString(@"SMB_CIFS_FILE_SERVERS_SHORT", nil);
  21. #else
  22. NSString *name = NSLocalizedString(@"SMB_CIFS_FILE_SERVERS", nil);
  23. #endif
  24. return [super initWithName:name
  25. serviceServiceName:@"dsm"];
  26. }
  27. - (id<VLCLocalNetworkService>)networkServiceForIndex:(NSUInteger)index {
  28. VLCMedia *media = [self.mediaDiscoverer.discoveredMedia mediaAtIndex:index];
  29. if (media)
  30. return [[VLCLocalNetworkServiceDSM alloc] initWithMediaItem:media serviceName:self.name];
  31. return nil;
  32. }
  33. + (void)initialize
  34. {
  35. [super initialize];
  36. [VLCLocalNetworkServiceDSM registerLoginInformation];
  37. }
  38. @end
  39. NSString *const VLCNetworkServerProtocolIdentifierSMB = @"smb";
  40. static NSString *const VLCLocalNetworkServiceDSMWorkgroupIdentifier = @"VLCLocalNetworkServiceDSMWorkgroup";
  41. @implementation VLCLocalNetworkServiceDSM
  42. + (void)registerLoginInformation
  43. {
  44. VLCNetworkServerLoginInformation *login = [[VLCNetworkServerLoginInformation alloc] init];
  45. login.protocolIdentifier = VLCNetworkServerProtocolIdentifierSMB;
  46. VLCNetworkServerLoginInformationField *workgroupField = [[VLCNetworkServerLoginInformationField alloc] initWithType:VLCNetworkServerLoginInformationFieldTypeText
  47. identifier:VLCLocalNetworkServiceDSMWorkgroupIdentifier
  48. label:NSLocalizedString(@"DSM_WORKGROUP", nil)
  49. textValue:@"WORKGROUP"];
  50. login.additionalFields = @[workgroupField];
  51. [VLCNetworkServerLoginInformation registerTemplateLoginInformation:login];
  52. }
  53. - (UIImage *)icon {
  54. return [UIImage imageNamed:@"serverIcon"];
  55. }
  56. - (VLCNetworkServerLoginInformation *)loginInformation {
  57. VLCMedia *media = self.mediaItem;
  58. if (media.mediaType != VLCMediaTypeDirectory)
  59. return nil;
  60. VLCNetworkServerLoginInformation *login = [VLCNetworkServerLoginInformation newLoginInformationForProtocol:VLCNetworkServerProtocolIdentifierSMB];
  61. login.address = self.mediaItem.url.host;
  62. return login;
  63. }
  64. @end
  65. @implementation VLCNetworkServerBrowserVLCMedia (SMB)
  66. + (instancetype)SMBNetworkServerBrowserWithLogin:(VLCNetworkServerLoginInformation *)login
  67. {
  68. NSURLComponents *components = [[NSURLComponents alloc] init];
  69. components.scheme = @"smb";
  70. components.host = login.address;
  71. components.port = login.port;
  72. NSURL *url = components.URL;
  73. __block NSString *workgroup = nil;
  74. [login.additionalFields enumerateObjectsUsingBlock:^(VLCNetworkServerLoginInformationField * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  75. if ([obj.identifier isEqualToString:VLCLocalNetworkServiceDSMWorkgroupIdentifier])
  76. {
  77. workgroup = obj.textValue;
  78. }
  79. }];
  80. return [self SMBNetworkServerBrowserWithURL:url
  81. username:login.username
  82. password:login.password
  83. workgroup:workgroup];
  84. }
  85. + (instancetype)SMBNetworkServerBrowserWithURL:(NSURL *)url username:(NSString *)username password:(NSString *)password workgroup:(NSString *)workgroup
  86. {
  87. VLCMedia *media = [VLCMedia mediaWithURL:url];
  88. NSDictionary *mediaOptions = @{@"smb-user" : username ?: @"",
  89. @"smb-pwd" : password ?: @"",
  90. @"smb-domain" : workgroup?: @"WORKGROUP"};
  91. [media addOptions:mediaOptions];
  92. return [[self alloc] initWithMedia:media options:mediaOptions];
  93. }
  94. @end