- How
ShareKit
presents a remote window:
void * -[SHKRemoteWindowController initWithWindow:clientWindow:remoteView:noSourceWindow:disableServiceWindowPresentation:isInNotificationCenter:service:](void * self, void * _cmd, void * arg2, void * arg3, void * arg4, char arg5, char arg_0, char arg_8, void * arg_10) {
var_30 = arg5;
r12 = [arg2 retain];
var_38 = [arg3 retain];
r15 = [arg4 retain];
r13 = [arg_10 retain];
*var_B0 = self;
*(var_B0 + 0x8) = _OBJC_CLASS_$_SHKRemoteWindowController;
rbx = [[var_B0 super] initWithWindow:r12];
if (rbx != 0x0) {
r14 = rbx;
var_40 = r12;
[r14 setDisableServiceWindowPresentation:sign_extend_64(arg_0)];
[r14 setIsInNotificationCenter:sign_extend_64(arg_8)];
[r14 setRemoteView:r15];
var_58 = r15;
[r15 setRemoteWindowController:r14];
[r14 setClientWindow:var_38];
rbx = r13;
r13 = sign_extend_64(var_30);
[r14 setNoSourceWindow:r13];
var_50 = rbx;
[r14 setService:rbx];
var_30 = r14;
r12 = var_40;
rax = arg_0;
rbx = var_38;
if ([r14 isInNotificationCenter] == 0x0) {
r15 = [SHKDimAndShadowWindow alloc];
rax = @selector(frame);
if (rbx != 0x0) {
objc_msgSend_stret(var_A0, rbx, rax);
}
else {
var_90 = intrinsic_movaps(var_90, 0x0);
var_A0 = intrinsic_movaps(var_A0, 0x0);
}
r12 = var_30;
var_44 = r13;
r14 = [r15 initWithFrame:r13 noSourceWindow:rcx];
[r12 setDimAndShadowWindow:r14];
[r14 release];
r14 = [[r12 dimAndShadowWindow] retain];
[r14 setCanHostLayersInWindowServer:0x1];
[r14 release];
r14 = [[r12 dimAndShadowWindow] retain];
r15 = [[r12 window] retain];
[r14 setRemoteWindow:r15];
rdi = r15;
[rdi release];
[r14 release];
r14 = [[r12 dimAndShadowWindow] retain];
r13 = var_38;
[r14 setSourceWindow:r13];
[r14 release];
r14 = [[r12 dimAndShadowWindow] retain];
rcx = 0x1;
[r13 addChildWindow:r14 ordered:rcx];
[r14 release];
[SHKBlurWindow alloc];
if (r13 != 0x0) {
[var_80 frame];
}
else {
var_70 = intrinsic_movaps(var_70, 0x0);
var_80 = intrinsic_movaps(var_80, 0x0);
}
r14 = [_objc_release initWithFrame:var_44 noSourceWindow:rcx];
[r12 setBlurWindow:r14];
[r14 release];
r14 = [[r12 blurWindow] retain];
rax = [var_50 mask];
[r14 setServiceMask:rax];
[r14 release];
r14 = [[r12 blurWindow] retain];
[r14 setCanHostLayersInWindowServer:0x1];
[r14 release];
r14 = [[r12 blurWindow] retain];
[var_38 addChildWindow:r14 ordered:0x1];
[r14 release];
r12 = var_40;
rax = arg_0;
}
if (rax == 0x0) {
[r12 setDelegate:var_30];
r15 = [[NSNotificationCenter defaultCenter] retain];
rbx = *_NSWindowDidBecomeKeyNotification;
r13 = [[var_30 clientWindow] retain];
[r15 addObserver:var_30 selector:@selector(clientWindowBecameKey) name:rbx object:r13];
[r13 release];
[r15 release];
r14 = [[NSNotificationCenter defaultCenter] retain];
r15 = *_NSWindowDidBecomeMainNotification;
r13 = [[var_30 clientWindow] retain];
[r14 addObserver:var_30 selector:@selector(clientWindowBecameMain) name:r15 object:r13];
[r13 release];
r12 = var_40;
[r14 release];
}
[r12 setOpaque:0x0];
rbx = [[NSColor clearColor] retain];
[r12 setBackgroundColor:rbx];
[rbx release];
r15 = var_58;
r13 = var_50;
rbx = var_30;
}
[r13 release];
[r15 release];
[var_38 release];
[r12 release];
rax = rbx;
return rax;
}
void -[SHKRemoteWindowController advanceToRunPhaseIfNeeded](void * self, void * _cmd) {
rbx = [[self remoteView] retain];
[rbx advanceToRunPhaseIfNeeded];
rdi = rbx;
[rdi release];
return;
}
void -[SHKRemoteWindowController readyToShowWindow](void * self, void * _cmd) {
rbx = self;
if ([self disableServiceWindowPresentation] == 0x0) {
r15 = [[rbx clientWindow] retain];
r12 = [[rbx window] retain];
[r15 addChildWindow:r12 ordered:0x1];
[r12 release];
[r15 release];
r15 = [[rbx window] retain];
[r15 makeKeyAndOrderFront:rbx];
[r15 release];
r14 = [[rbx window] retain];
rbx = [[r14 parentWindow] retain];
[rbx resignKeyAppearance];
[rbx release];
rdi = r14;
[rdi release];
}
return;
}
void -[SHKRemoteWindowController invalidate](void * self, void * _cmd) {
r13 = self;
r12 = [[NSNotificationCenter defaultCenter] retain];
r14 = *_NSWindowDidBecomeKeyNotification;
r15 = [[r13 clientWindow] retain];
[r12 removeObserver:r13 name:r14 object:r15];
[r15 release];
[r12 release];
r15 = [[NSNotificationCenter defaultCenter] retain];
r14 = *_NSWindowDidBecomeMainNotification;
rbx = [[r13 clientWindow] retain];
[r15 removeObserver:r13 name:r14 object:rbx];
[rbx release];
[r15 release];
rbx = [[r13 remoteView] retain];
[rbx invalidate];
[rbx release];
rbx = [[r13 window] retain];
[rbx resignKeyWindow];
[rbx release];
r14 = [[r13 window] retain];
rbx = [[r14 parentWindow] retain];
[rbx makeKeyAndOrderFront:0x0];
[rbx release];
[r14 release];
rbx = [[r13 window] retain];
[rbx setDelegate:0x0];
[rbx release];
rbx = [[r13 blurWindow] retain];
[rbx close];
[rbx release];
[r13 setBlurWindow:0x0];
rbx = [[r13 dimAndShadowWindow] retain];
[rbx close];
[rbx release];
[r13 setDimAndShadowWindow:0x0];
if ([r13 isInNotificationCenter] == 0x0) {
r14 = _objc_msgSend;
rbx = [[r13 window] retain];
_objc_msgSend(rbx, r14);
[rbx release];
[r13 setWindow:0x0];
if ([r13 noSourceWindow] != 0x0) {
rbx = [[r13 clientWindow] retain];
_objc_msgSend(rbx, r14);
[rbx release];
rdi = r13;
[rdi setClientWindow:0x0];
}
}
return;
}
var_148 = rbx;
var_F8 = [NSStringFromRect(rdi) retain];
var_C8 = [SHKRemoteView alloc];
rax = [*(r12 + 0x20) uuid];
rax = [rax retain];
var_D0 = rax;
rax = [rax UUIDString];
rax = [rax retain];
var_D8 = rax;
intrinsic_movdqu(var_A8, intrinsic_punpcklqdq(zero_extend_64(@"SHK_kSourceWindowFrame"), zero_extend_64(@"SHK_kSourceWindowScreenVisibleFrame")));
intrinsic_movdqu(var_98, intrinsic_punpcklqdq(zero_extend_64(@"SHK_kSourceWindowContentRect"), zero_extend_64(@"SHK_kShouldDimSourceWindow")));
r15 = [[NSNumber numberWithBool:sign_extend_64([*(r12 + 0x20) shouldDimSourceWindow])] retain];
r13 = [[NSNumber numberWithBool:sign_extend_64([*(r12 + 0x20) isInNotificationCenter])] retain];
rdx = sign_extend_64(*(int8_t *)(r12 + 0x40));
rbx = [[NSNumber numberWithBool:rdx] retain];
*(var_118 + 0x40) = rbx;
r14 = [[NSDictionary dictionaryWithObjects:rdx forKeys:@"SHK_kServiceName" count:0x9] retain];
var_F0 = [var_C8 initWithOptionsDictionary:r14];
[r14 release];
[rbx release];
[r13 release];
[r15 release];
[var_D8 release];
[var_D0 release];
r12 = var_E0;
r14 = @selector(alloc);
if ([*(r12 + 0x20) isInNotificationCenter] != 0x0) {
var_C8 = 0x0;
}
else {
var_C8 = [_objc_msgSend(@class(SHKRemoteViewContainerWindow), r14) initWithContentRect:0x0 styleMask:0x2 backing:0x0 defer:r9];
[var_C8 setCanHostLayersInWindowServer:0x1];
[var_C8 setContentView:var_F0];
r15 = @selector(title);
rbx = [_objc_msgSend(*(r12 + 0x20), r15) retain];
r13 = [rbx length];
[rbx release];
if (r13 != 0x0) {
rbx = [_objc_msgSend(*(r12 + 0x20), r15) retain];
[var_C8 setTitle:rbx];
[rbx release];
}
[var_C8 setAccessibilitySubrole:*_NSAccessibilitySystemDialogSubrole];
}
[*_NSApp activateIgnoringOtherApps:0x1];
[*(r12 + 0x28) orderFront:0x0];
r15 = _objc_msgSend(@class(SHKRemoteWindowController), r14);
rdi = *(r12 + 0x20);
r13 = *(r12 + 0x28);
r14 = *(int8_t *)(r12 + 0x41);
rbx = [rdi disableServiceWindowPresentation];
rax = [*(r12 + 0x20) isInNotificationCenter];
rax = [r15 initWithWindow:var_C8 clientWindow:r13 remoteView:var_F0 noSourceWindow:sign_extend_64(r14) disableServiceWindowPresentation:sign_extend_64(rbx) isInNotificationCenter:sign_extend_64(rax) service:*(r12 + 0x20)];
rcx = *(r12 + 0x20);
rdi = rcx->_remoteWindowController;
rcx->_remoteWindowController = rax;
[rdi release];
r14 = var_F0;
r15 = [[*(r12 + 0x20) delegate] retain];
r13 = @selector(sharingService:showView:);
if ([r15 respondsToSelector:r13] != 0x0) {
rbx = [[*(r12 + 0x20) nsSharingService] retain];
_objc_msgSend(r15, r13);
[rbx release];
}
rbx = [[r14 window] retain];
[rbx release];
if (rbx == 0x0) {
rbx = [[NSString stringWithUTF8String:"/BuildRoot/Library/Caches/com.apple.xbs/Sources/ShareKit/ShareKit-558/ShareKit/framework/SHKSharingService.m"] retain];
rdi = @"<Unknown File>";
if (rbx != 0x0) {
rdi = rbx;
}
var_D0 = [rdi retain];
[_objc_release release];
r13 = [[NSAssertionHandler currentHandler] retain];
var_D8 = *(r12 + 0x20);
var_E8 = *(r12 + 0x38);
rbx = [[NSThread callStackSymbols] retain];
[r13 handleFailureInMethod:var_E8 object:var_D8 file:var_D0 lineNumber:0x952 description:@"Remote View Should have a window, %@"];
rdi = rbx;
[rdi release];
[r13 release];
[var_D0 release];
}
if ([r14 invalid] != 0x0) {
rbx = [[NSString stringWithUTF8String:"/BuildRoot/Library/Caches/com.apple.xbs/Sources/ShareKit/ShareKit-558/ShareKit/framework/SHKSharingService.m"] retain];
rdi = @"<Unknown File>";
if (rbx != 0x0) {
rdi = rbx;
}
var_D0 = [rdi retain];
[_objc_release release];
r13 = [[NSAssertionHandler currentHandler] retain];
var_D8 = *(r12 + 0x20);
var_E8 = *(r12 + 0x38);
rbx = [[NSThread callStackSymbols] retain];
[r13 handleFailureInMethod:var_E8 object:var_D8 file:var_D0 lineNumber:0x953 description:@"Remote View Invalid %@"];
rdi = rbx;
[rdi release];
[r13 release];
[var_D0 release];
}
[*(r12 + 0x20)->_remoteWindowController advanceToRunPhaseIfNeeded];
[r15 release];
[var_C8 release];
[r14 release];
[var_F8 release];
[var_148 release];
[var_100 release];
[var_108 release];
[var_110 release];
[var_118 release];
- How
AddressBook
presents a remote view in your app:
char -[ABRemotePersonView view:shouldResize:](void * self, void * _cmd, void * arg2, struct CGSize arg3) {
return 0x1;
}
void * -[ABRemotePersonView serviceSubclassName](void * self, void * _cmd) {
rax = @"ABPersonViewService";
return rax;
}
void * -[ABRemotePersonView serviceName](void * self, void * _cmd) {
rax = @"com.apple.AddressBook.ABPersonViewService";
return rax;
}
void * -[ABRemotePersonView serviceViewControllerInterface](void * self, void * _cmd) {
rax = [NSXPCInterface interfaceWithProtocol:__objc_proto_AsyncABPersonViewProtocol_protocol];
return rax;
}
void * -[ABRemotePersonView exportedObject](void * self, void * _cmd) {
rax = [self objectToExport];
return rax;
}
void * -[ABRemotePersonView exportedInterface](void * self, void * _cmd) {
rax = [NSXPCInterface interfaceWithProtocol:__objc_proto_ABPersonViewClientProtocol_protocol];
return rax;
}
void * -[ABPersonViewService exportedInterface](void * self, void * _cmd) {
rax = [NSXPCInterface interfaceWithProtocol:__objc_proto_AsyncABPersonViewProtocol_protocol];
return rax;
}
void -[ABPersonViewService loadView](void * self, void * _cmd) {
var_30 = *___stack_chk_guard;
[self _setupWindow];
r13 = [[[_ABPersonView alloc] init] autorelease];
var_58 = r13;
rax = [r13 contactCardViewController];
[rax setContactCardControllerDelegate:self];
rbx = [[[NSView alloc] init] autorelease];
[rbx addSubview:r13];
[rbx setWantsLayer:0x1];
rax = [self _window];
[rax setContentView:rbx];
[self setView:rbx];
rax = [ABAddressBook addressBook];
[self setAddressBook:rax];
r13 = [ABPersonViewServiceAPIAdapter alloc];
rax = [self addressBook];
rax = [r13 initWithAdaptedObject:var_58 protocol:__objc_proto_AsyncABPersonViewProtocol_protocol protocolIsAsync:0x1 addressBook:rax viewService:self];
rax = [rax autorelease];
[self set_APIAdapter:rax];
[var_58 setTranslatesAutoresizingMaskIntoConstraints:0x0];
*var_40 = @"personView";
*var_38 = var_58;
rdx = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[personView]|" options:0x0 metrics:0x0 views:[NSDictionary dictionaryWithObjects:0x0 forKeys:__objc_proto_AsyncABPersonViewProtocol_protocol count:0x1]];
[rbx addConstraints:rdx];
*var_50 = @"personView";
*var_48 = var_58;
rax = [NSDictionary dictionaryWithObjects:rdx forKeys:0x0 count:0x1];
rax = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[personView]|" options:0x0 metrics:0x0 views:rax];
[rbx addConstraints:rax];
if (*___stack_chk_guard != var_30) {
__stack_chk_fail();
}
return;
}
void -[ABPersonViewService _setupWindow](void * self, void * _cmd) {
rax = [NSWindow alloc];
var_30 = intrinsic_movaps(var_30, 0x0);
intrinsic_movaps(var_20, intrinsic_movaps(0x0, *(int128_t *)0x100003f30));
rax = [rax initWithContentRect:0x0 styleMask:0x2 backing:0x1 defer:0x0 screen:var_30];
rax = [rax autorelease];
[self set_window:rax];
rax = [self _window];
[rax setAutorecalculatesKeyViewLoop:0x1];
return;
}
void * -[ABPersonViewService exportedObject](void * self, void * _cmd) {
rax = [self _APIAdapter];
return rax;
}
void * -[ABPersonViewService remoteViewControllerInterface](void * self, void * _cmd) {
rax = [NSXPCInterface interfaceWithProtocol:__objc_proto_ABPersonViewClientProtocol_protocol];
return rax;
}
void -[ABPersonViewService startSharingSessionForServiceNamed:parameters:](void * self, void * _cmd, void * arg2, void * arg3) {
r15 = arg3;
r14 = arg2;
rbx = self;
r12 = rbx + *objc_ivar_offset_ABPersonViewService__listenerHelper;
rdi = rbx->_listenerHelper;
if (rdi == 0x0) {
rdi = [[ABSharingItemsXPCListenerHelper alloc] init];
*r12 = rdi;
}
[rdi setParameters:r15];
rdi = [rbx remoteViewControllerProxy];
rdx = r14;
rcx = [*r12 endpoint];
[rdi startSharingSessionForServiceNamed:rdx listenerEndpoint:rcx];
return;
}
void -[ABPersonViewService contactCardViewControllerHeaderWasClicked:](void * self, void * _cmd, void * arg2) {
[[self remoteViewControllerProxy] headerWasClicked];
return;
}
void -[ABPersonViewService contactCardViewControllerDesiredHeightDidChange:](void * self, void * _cmd, void * arg2) {
rbx = [self remoteViewControllerProxy];
[arg2 desiredHeight];
rdi = rbx;
[rdi desiredHeightChangedTo:rdx];
return;
}
- How AppKit creates a remote
CAContext
:
int _CreateCAContextForRemoteHosting() {
[CATransaction begin];
[CATransaction setDisableActions:0x1];
NSDictionary *opts = [NSDictionary dictionary];
CAContext *ctx = [CAContext remoteContextWithOptions: opts];
CALayer *layer = [CALayer layer];
[layer setGeometryFlipped:YES];
[ctx setLayer: layer];
[CATransaction commit];
return ctx;
}
int _CreateCALayerForRemoteDrawing(int arg0, int arg1) {
[CATransaction begin];
[CATransaction setDisableActions: YES];
layer = [[CALayerHost alloc] init];
[layer setContextId: arg0];
if (arg1 != 0x0) {
fr = [var_50 frame];
} else {
fr = 0x0;
}
[layer setFrame: fr];
[arg1 addSublayer: layer];
[CATransaction commit];
return layer;
}