18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/Assertions.h> 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <dlfcn.h> 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define SOFT_LINK_LIBRARY(lib) \ 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static void* lib##Library() \ 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { \ 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static void* dylib = dlopen("/usr/lib/" #lib ".dylib", RTLD_NOW); \ 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(dylib); \ 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return dylib; \ 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define SOFT_LINK_FRAMEWORK(framework) \ 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static void* framework##Library() \ 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { \ 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static void* frameworkLibrary = dlopen("/System/Library/Frameworks/" #framework ".framework/" #framework, RTLD_NOW); \ 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(frameworkLibrary); \ 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return frameworkLibrary; \ 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define SOFT_LINK(framework, functionName, resultType, parameterDeclarations, parameterNames) \ 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static resultType init##functionName parameterDeclarations; \ 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static resultType (*softLink##functionName) parameterDeclarations = init##functionName; \ 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project \ 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static resultType init##functionName parameterDeclarations \ 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { \ 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project softLink##functionName = (resultType (*) parameterDeclarations) dlsym(framework##Library(), #functionName); \ 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(softLink##functionName); \ 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return softLink##functionName parameterNames; \ 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }\ 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project \ 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inline resultType functionName parameterDeclarations \ 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project {\ 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return softLink##functionName parameterNames; \ 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define SOFT_LINK_CLASS(framework, className) \ 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static Class init##className(); \ 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static Class (*get##className##Class)() = init##className; \ 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static Class class##className; \ 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project \ 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static Class className##Function() \ 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { \ 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return class##className; \ 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }\ 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project \ 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static Class init##className() \ 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { \ 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project framework##Library(); \ 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class##className = objc_getClass(#className); \ 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(class##className); \ 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project get##className##Class = className##Function; \ 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return class##className; \ 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define SOFT_LINK_POINTER(framework, name, type) \ 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static type init##name(); \ 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static type (*get##name)() = init##name; \ 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static type pointer##name; \ 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project \ 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static type name##Function() \ 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { \ 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return pointer##name; \ 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }\ 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project \ 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static type init##name() \ 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { \ 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void** pointer = static_cast<void**>(dlsym(framework##Library(), #name)); \ 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(pointer); \ 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pointer##name = static_cast<type>(*pointer); \ 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project get##name = name##Function; \ 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return pointer##name; \ 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define SOFT_LINK_CONSTANT(framework, name, type) \ 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static type init##name(); \ 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static type (*get##name)() = init##name; \ 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static type constant##name; \ 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project \ 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static type name##Function() \ 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { \ 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return constant##name; \ 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }\ 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project \ 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static type init##name() \ 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { \ 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void* constant = dlsym(framework##Library(), #name); \ 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(constant); \ 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project constant##name = *static_cast<type*>(constant); \ 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project get##name = name##Function; \ 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return constant##name; \ 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 120