FBXCDeviceEvent.m 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. /**
  2. * Copyright (c) 2015-present, Facebook, Inc.
  3. * All rights reserved.
  4. *
  5. * This source code is licensed under the BSD-style license found in the
  6. * LICENSE file in the root directory of this source tree. An additional grant
  7. * of patent rights can be found in the PATENTS file in the same directory.
  8. */
  9. #import "FBXCDeviceEvent.h"
  10. #import "FBErrorBuilder.h"
  11. id<FBXCDeviceEvent> FBCreateXCDeviceEvent(unsigned int page,
  12. unsigned int usage,
  13. double duration,
  14. NSError **error)
  15. {
  16. Class xcDeviceEventClass = NSClassFromString(@"XCDeviceEvent");
  17. if (nil == xcDeviceEventClass) {
  18. [[[FBErrorBuilder builder]
  19. withDescription:@"Cannot find XCDeviceEvent class"]
  20. buildError:error];
  21. return nil;
  22. }
  23. SEL deviceEventFactorySelector = NSSelectorFromString(@"deviceEventWithPage:usage:duration:");
  24. if (![xcDeviceEventClass respondsToSelector:deviceEventFactorySelector]) {
  25. [[[FBErrorBuilder builder]
  26. withDescription:@"'deviceEventWithPage:usage:duration:' factory method is not found on XCDeviceEvent class"]
  27. buildError:error];
  28. return nil;
  29. }
  30. NSMethodSignature *deviceEventFactorySignature = [xcDeviceEventClass methodSignatureForSelector:deviceEventFactorySelector];
  31. NSInvocation *deviceEventFactoryInvocation = [NSInvocation invocationWithMethodSignature:deviceEventFactorySignature];
  32. [deviceEventFactoryInvocation setSelector:deviceEventFactorySelector];
  33. [deviceEventFactoryInvocation setArgument:&page atIndex:2];
  34. [deviceEventFactoryInvocation setArgument:&usage atIndex:3];
  35. [deviceEventFactoryInvocation setArgument:&duration atIndex:4];
  36. [deviceEventFactoryInvocation invokeWithTarget:xcDeviceEventClass];
  37. id<FBXCDeviceEvent> __unsafe_unretained instance;
  38. [deviceEventFactoryInvocation getReturnValue:&instance];
  39. return instance;
  40. }