VLCWatchMessage.m 2.9 KB

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