Status FBIDBServiceHandler::approve()

in idb_companion/Server/FBIDBServiceHandler.mm [854:883]


Status FBIDBServiceHandler::approve(ServerContext *context, const idb::ApproveRequest *request, idb::ApproveResponse *response)
{@autoreleasepool{
  NSError *error = nil;
  NSDictionary<NSNumber *, FBSettingsApprovalService> *mapping = @{
    @((int)idb::ApproveRequest_Permission::ApproveRequest_Permission_MICROPHONE): FBSettingsApprovalServiceMicrophone,
    @((int)idb::ApproveRequest_Permission::ApproveRequest_Permission_PHOTOS): FBSettingsApprovalServicePhotos,
    @((int)idb::ApproveRequest_Permission::ApproveRequest_Permission_CAMERA): FBSettingsApprovalServiceCamera,
    @((int)idb::ApproveRequest_Permission::ApproveRequest_Permission_CONTACTS): FBSettingsApprovalServiceContacts,
    @((int)idb::ApproveRequest_Permission::ApproveRequest_Permission_URL): FBSettingsApprovalServiceUrl,
    @((int)idb::ApproveRequest_Permission::ApproveRequest_Permission_LOCATION): FBSettingsApprovalServiceLocation,
    @((int)idb::ApproveRequest_Permission::ApproveRequest_Permission_NOTIFICATION): FBSettingsApprovalServiceNotification,
  };
  NSMutableSet<FBSettingsApprovalService> *services = NSMutableSet.set;
  for (int j = 0; j < request->permissions_size(); j++) {
    idb::ApproveRequest_Permission permission = request->permissions(j);
    [services addObject:mapping[@(permission)]];
  }
  if ([services containsObject:FBSettingsApprovalServiceUrl]) {
    [services removeObject:FBSettingsApprovalServiceUrl];
    [[_commandExecutor approve_deeplink:nsstring_from_c_string(request->scheme())
                        for_application:nsstring_from_c_string(request->bundle_id())] block:&error];
  }
  if ([services count] > 0 && !error) {
    [[_commandExecutor approve:services for_application:nsstring_from_c_string(request->bundle_id())] block:&error];
  }
  if (error) {
    return Status(grpc::StatusCode::INTERNAL, error.localizedDescription.UTF8String);
  }
  return Status::OK;
}}