VLCWatchMessage.m 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. //
  2. // VLCWatchMessage.m
  3. // VLC for iOS
  4. //
  5. // Created by Tobias Conradi on 02.05.15.
  6. // Copyright (c) 2015 VideoLAN. All rights reserved.
  7. //
  8. #import "VLCWatchMessage.h"
  9. NSString *const VLCWatchMessageNameGetNowPlayingInfo = @"getNowPlayingInfo";
  10. NSString *const VLCWatchMessageNamePlayPause = @"playpause";
  11. NSString *const VLCWatchMessageNameSkipForward = @"skipForward";
  12. NSString *const VLCWatchMessageNameSkipBackward = @"skipBackward";
  13. NSString *const VLCWatchMessageNamePlayFile = @"playFile";
  14. NSString *const VLCWatchMessageNameSetVolume = @"setVolume";
  15. NSString *const VLCWatchMessageNameNotification = @"notification";
  16. NSString *const VLCWatchMessageNameRequestThumbnail = @"requestThumbnail";
  17. NSString *const VLCWatchMessageNameRequestDB = @"requestDB";
  18. NSString *const VLCWatchMessageKeyURIRepresentation = @"URIRepresentation";
  19. static NSString *const VLCWatchMessageNameKey = @"name";
  20. static NSString *const VLCWatchMessagePayloadKey = @"payload";
  21. @implementation VLCWatchMessage
  22. @synthesize dictionaryRepresentation = _dictionaryRepresentation;
  23. - (instancetype)initWithName:(NSString *)name payload:(nullable id<NSObject,NSCoding>)payload
  24. {
  25. self = [super init];
  26. if (self) {
  27. _name = [name copy];
  28. _payload = payload;
  29. }
  30. return self;
  31. }
  32. - (instancetype)initWithDictionary:(NSDictionary *)dictionary
  33. {
  34. NSString *name = dictionary[VLCWatchMessageNameKey];
  35. id<NSObject> payloadObject = dictionary[VLCWatchMessagePayloadKey];
  36. id payload = [self payloadFromPayloadObject:payloadObject];
  37. return [self initWithName:name payload:payload];
  38. }
  39. - (NSDictionary *)dictionaryRepresentation
  40. {
  41. if (!_dictionaryRepresentation) {
  42. _dictionaryRepresentation = [self.class messageDictionaryForName:self.name payload:self.payload];
  43. }
  44. return _dictionaryRepresentation;
  45. }
  46. - (id)payloadFromPayloadObject:(id<NSObject>)payloadObject {
  47. id payload;
  48. if ([payloadObject isKindOfClass:[NSData class]]) {
  49. @try {
  50. payload = [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)payloadObject];
  51. }
  52. @catch (NSException *exception) {
  53. NSLog(@"%s Failed to decode payload with exception: %@",__PRETTY_FUNCTION__,exception);
  54. }
  55. } else {
  56. payload = payloadObject;
  57. }
  58. return payload;
  59. }
  60. + (NSDictionary *)messageDictionaryForName:(NSString *)name payload:(nullable id<NSObject,NSCoding>)payload
  61. {
  62. id payloadObject;
  63. BOOL noArchiving = [payload isKindOfClass:[NSNumber class]] || [payload isKindOfClass:[NSString class]];
  64. if (noArchiving) {
  65. payloadObject = payload;
  66. } else if (payload != nil) {
  67. payloadObject = [NSKeyedArchiver archivedDataWithRootObject:payload];
  68. }
  69. // we use nil termination so when payloadData is nil payload is not set
  70. return [NSDictionary dictionaryWithObjectsAndKeys:
  71. name,VLCWatchMessageNameKey,
  72. payloadObject, VLCWatchMessagePayloadKey,
  73. nil];
  74. }
  75. + (NSDictionary *)messageDictionaryForName:(NSString *)name
  76. {
  77. return [self messageDictionaryForName:name payload:nil];
  78. }
  79. - (NSString *)debugDescription
  80. {
  81. return [NSString stringWithFormat:@"<%@: %p name=%@, payload=%@>",NSStringFromClass(self.class), self, _name, _payload];
  82. }
  83. @end