VLCWatchMessage.m 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. static NSString *const VLCWatchMessageNameKey = @"name";
  17. static NSString *const VLCWatchMessagePayloadKey = @"payload";
  18. @implementation VLCWatchMessage
  19. @synthesize dictionaryRepresentation = _dictionaryRepresentation;
  20. - (instancetype)initWithName:(NSString *)name payload:(nullable id<NSObject,NSCoding>)payload
  21. {
  22. self = [super init];
  23. if (self) {
  24. _name = [name copy];
  25. _payload = payload;
  26. }
  27. return self;
  28. }
  29. - (instancetype)initWithDictionary:(NSDictionary *)dictionary
  30. {
  31. NSString *name = dictionary[VLCWatchMessageNameKey];
  32. id<NSObject> payloadObject = dictionary[VLCWatchMessagePayloadKey];
  33. id payload = [self payloadFromPayloadObject:payloadObject];
  34. return [self initWithName:name payload:payload];
  35. }
  36. - (NSDictionary *)dictionaryRepresentation
  37. {
  38. if (!_dictionaryRepresentation) {
  39. _dictionaryRepresentation = [self.class messageDictionaryForName:self.name payload:self.payload];
  40. }
  41. return _dictionaryRepresentation;
  42. }
  43. - (id)payloadFromPayloadObject:(id<NSObject>)payloadObject {
  44. id payload;
  45. if ([payloadObject isKindOfClass:[NSData class]]) {
  46. @try {
  47. payload = [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)payloadObject];
  48. }
  49. @catch (NSException *exception) {
  50. NSLog(@"%s Failed to decode payload with exception: %@",__PRETTY_FUNCTION__,exception);
  51. }
  52. } else {
  53. payload = payloadObject;
  54. }
  55. return payload;
  56. }
  57. + (NSDictionary *)messageDictionaryForName:(NSString *)name payload:(nullable id<NSObject,NSCoding>)payload
  58. {
  59. id payloadObject;
  60. BOOL noArchiving = [payload isKindOfClass:[NSNumber class]] || [payload isKindOfClass:[NSString class]];
  61. if (noArchiving) {
  62. payloadObject = payload;
  63. } else if (payload != nil) {
  64. payloadObject = [NSKeyedArchiver archivedDataWithRootObject:payload];
  65. }
  66. // we use nil termination so when payloadData is nil payload is not set
  67. return [NSDictionary dictionaryWithObjectsAndKeys:
  68. name,VLCWatchMessageNameKey,
  69. payloadObject, VLCWatchMessagePayloadKey,
  70. nil];
  71. }
  72. + (NSDictionary *)messageDictionaryForName:(NSString *)name
  73. {
  74. return [self messageDictionaryForName:name payload:nil];
  75. }
  76. - (NSString *)debugDescription
  77. {
  78. return [NSString stringWithFormat:@"<%@: %p name=%@, payload=%@>",NSStringFromClass(self.class), self, _name, _payload];
  79. }
  80. @end