ViewBridge.framework - avaidyam/Parrot GitHub Wiki

  • 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;
}