/ include / CoreFoundation / CFBundle.h
CFBundle.h
  1  /*
  2   * Copyright (c) 2015 Apple Inc. All rights reserved.
  3   *
  4   * @APPLE_LICENSE_HEADER_START@
  5   *
  6   * This file contains Original Code and/or Modifications of Original Code
  7   * as defined in and that are subject to the Apple Public Source License
  8   * Version 2.0 (the 'License'). You may not use this file except in
  9   * compliance with the License. Please obtain a copy of the License at
 10   * http://www.opensource.apple.com/apsl/ and read it before using this
 11   * file.
 12   *
 13   * The Original Code and all software distributed under the License are
 14   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 15   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 16   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 17   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 18   * Please see the License for the specific language governing rights and
 19   * limitations under the License.
 20   *
 21   * @APPLE_LICENSE_HEADER_END@
 22   */
 23  
 24  /*	CFBundle.h
 25  	Copyright (c) 1999-2014, Apple Inc.  All rights reserved.
 26  */
 27  
 28  #if !defined(__COREFOUNDATION_CFBUNDLE__)
 29  #define __COREFOUNDATION_CFBUNDLE__ 1
 30  
 31  #include <CoreFoundation/CFBase.h>
 32  #include <CoreFoundation/CFArray.h>
 33  #include <CoreFoundation/CFDictionary.h>
 34  #include <CoreFoundation/CFError.h>
 35  #include <CoreFoundation/CFString.h>
 36  #include <CoreFoundation/CFURL.h>
 37  
 38  CF_IMPLICIT_BRIDGING_ENABLED
 39  CF_EXTERN_C_BEGIN
 40  
 41  typedef struct __CFBundle *CFBundleRef;
 42  typedef struct __CFBundle *CFPlugInRef;
 43  
 44  /* ===================== Standard Info.plist keys ===================== */
 45  CF_EXPORT
 46  const CFStringRef kCFBundleInfoDictionaryVersionKey;
 47      /* The version of the Info.plist format */
 48  CF_EXPORT
 49  const CFStringRef kCFBundleExecutableKey;
 50      /* The name of the executable in this bundle, if any */
 51  CF_EXPORT
 52  const CFStringRef kCFBundleIdentifierKey;
 53      /* The bundle identifier (for CFBundleGetBundleWithIdentifier()) */
 54  CF_EXPORT
 55  const CFStringRef kCFBundleVersionKey;
 56      /* The version number of the bundle.  For Mac OS 9 style version numbers (for example "2.5.3d5"), */
 57      /* clients can use CFBundleGetVersionNumber() instead of accessing this key directly since that */
 58      /* function will properly convert the version string into its compact integer representation. */
 59  CF_EXPORT
 60  const CFStringRef kCFBundleDevelopmentRegionKey;
 61      /* The name of the development language of the bundle. */
 62  CF_EXPORT
 63  const CFStringRef kCFBundleNameKey;
 64      /* The human-readable name of the bundle.  This key is often found in the InfoPlist.strings since it is usually localized. */
 65  CF_EXPORT
 66  const CFStringRef kCFBundleLocalizationsKey;
 67      /* Allows an unbundled application that handles localization itself to specify which localizations it has available. */
 68  
 69  /* ===================== Finding Bundles ===================== */
 70  
 71  CF_EXPORT
 72  CFBundleRef CFBundleGetMainBundle(void);
 73  
 74  CF_EXPORT
 75  CFBundleRef CFBundleGetBundleWithIdentifier(CFStringRef bundleID);
 76      /* A bundle can name itself by providing a key in the info dictionary. */
 77      /* This facility is meant to allow bundle-writers to get hold of their */
 78      /* bundle from their code without having to know where it was on the disk. */
 79      /* This is meant to be a replacement mechanism for +bundleForClass: users. */
 80      /* Note that this does not search for bundles on the disk; it will locate */
 81      /* only bundles already loaded or otherwise known to the current process. */
 82  
 83  CF_EXPORT
 84  CFArrayRef CFBundleGetAllBundles(void);
 85      /* This is potentially expensive, and not thread-safe.  Use with care. */
 86      /* Best used for debuggging or other diagnostic purposes. */
 87  
 88  /* ===================== Creating Bundles ===================== */
 89  
 90  CF_EXPORT
 91  CFTypeID CFBundleGetTypeID(void);
 92  
 93  CF_EXPORT
 94  CFBundleRef CFBundleCreate(CFAllocatorRef allocator, CFURLRef bundleURL);
 95      /* Might return an existing instance with the ref-count bumped. */
 96  
 97  CF_EXPORT
 98  CFArrayRef CFBundleCreateBundlesFromDirectory(CFAllocatorRef allocator, CFURLRef directoryURL, CFStringRef bundleType);
 99      /* Create instances for all bundles in the given directory matching the given type */
100      /* (or all of them if bundleType is NULL).  Instances are created using CFBundleCreate() and are not released. */
101  
102  /* ==================== Basic Bundle Info ==================== */
103  
104  CF_EXPORT
105  CFURLRef CFBundleCopyBundleURL(CFBundleRef bundle);
106  
107  CF_EXPORT
108  CFTypeRef CFBundleGetValueForInfoDictionaryKey(CFBundleRef bundle, CFStringRef key);
109      /* Returns a localized value if available, otherwise the global value. */
110      /* This is the recommended function for examining the info dictionary. */
111  
112  CF_EXPORT
113  CFDictionaryRef CFBundleGetInfoDictionary(CFBundleRef bundle);
114      /* This is the global info dictionary.  Note that CFBundle may add */
115      /* extra keys to the dictionary for its own use. */
116  
117  CF_EXPORT
118  CFDictionaryRef CFBundleGetLocalInfoDictionary(CFBundleRef bundle);
119      /* This is the localized info dictionary. */
120  
121  CF_EXPORT
122  void CFBundleGetPackageInfo(CFBundleRef bundle, UInt32 *packageType, UInt32 *packageCreator);
123  
124  CF_EXPORT
125  CFStringRef CFBundleGetIdentifier(CFBundleRef bundle);
126  
127  CF_EXPORT
128  UInt32 CFBundleGetVersionNumber(CFBundleRef bundle);
129  
130  CF_EXPORT
131  CFStringRef CFBundleGetDevelopmentRegion(CFBundleRef bundle);
132  
133  CF_EXPORT
134  CFURLRef CFBundleCopySupportFilesDirectoryURL(CFBundleRef bundle);
135  
136  CF_EXPORT
137  CFURLRef CFBundleCopyResourcesDirectoryURL(CFBundleRef bundle);
138  
139  CF_EXPORT
140  CFURLRef CFBundleCopyPrivateFrameworksURL(CFBundleRef bundle);
141  
142  CF_EXPORT
143  CFURLRef CFBundleCopySharedFrameworksURL(CFBundleRef bundle);
144  
145  CF_EXPORT
146  CFURLRef CFBundleCopySharedSupportURL(CFBundleRef bundle);
147  
148  CF_EXPORT
149  CFURLRef CFBundleCopyBuiltInPlugInsURL(CFBundleRef bundle);
150  
151  /* ------------- Basic Bundle Info without a CFBundle instance ------------- */
152  /* This API is provided to enable developers to retrieve basic information */
153  /* about a bundle without having to create an instance of CFBundle. */
154  /* Because of caching behavior when a CFBundle instance exists, it will be faster */
155  /* to actually create a CFBundle if you need to retrieve multiple pieces of info. */
156  CF_EXPORT
157  CFDictionaryRef CFBundleCopyInfoDictionaryInDirectory(CFURLRef bundleURL);
158  
159  CF_EXPORT
160  Boolean CFBundleGetPackageInfoInDirectory(CFURLRef url, UInt32 *packageType, UInt32 *packageCreator);
161  
162  /* ==================== Resource Handling API ==================== */
163  
164  CF_EXPORT
165  CFURLRef CFBundleCopyResourceURL(CFBundleRef bundle, CFStringRef resourceName, CFStringRef resourceType, CFStringRef subDirName);
166  
167  CF_EXPORT
168  CFArrayRef CFBundleCopyResourceURLsOfType(CFBundleRef bundle, CFStringRef resourceType, CFStringRef subDirName);
169  
170  CF_EXPORT
171  CFStringRef CFBundleCopyLocalizedString(CFBundleRef bundle, CFStringRef key, CFStringRef value, CFStringRef tableName) CF_FORMAT_ARGUMENT(2);
172  
173  #define CFCopyLocalizedString(key, comment) \
174              CFBundleCopyLocalizedString(CFBundleGetMainBundle(), (key), (key), NULL)
175  #define CFCopyLocalizedStringFromTable(key, tbl, comment) \
176              CFBundleCopyLocalizedString(CFBundleGetMainBundle(), (key), (key), (tbl))
177  #define CFCopyLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
178              CFBundleCopyLocalizedString((bundle), (key), (key), (tbl))
179  #define CFCopyLocalizedStringWithDefaultValue(key, tbl, bundle, value, comment) \
180              CFBundleCopyLocalizedString((bundle), (key), (value), (tbl))
181  
182  /* ------------- Resource Handling without a CFBundle instance ------------- */
183  /* This API is provided to enable developers to use the CFBundle resource */
184  /* searching policy without having to create an instance of CFBundle. */
185  /* Because of caching behavior when a CFBundle instance exists, it will be faster */
186  /* to actually create a CFBundle if you need to access several resources. */
187  
188  CF_EXPORT
189  CFURLRef CFBundleCopyResourceURLInDirectory(CFURLRef bundleURL, CFStringRef resourceName, CFStringRef resourceType, CFStringRef subDirName);
190  
191  CF_EXPORT
192  CFArrayRef CFBundleCopyResourceURLsOfTypeInDirectory(CFURLRef bundleURL, CFStringRef resourceType, CFStringRef subDirName);
193  
194  /* =========== Localization-specific Resource Handling API =========== */
195  /* This API allows finer-grained control over specific localizations,  */
196  /* as distinguished from the above API, which always uses the user's   */
197  /* preferred localizations for the bundle in the current app context.  */
198  
199  CF_EXPORT
200  CFArrayRef CFBundleCopyBundleLocalizations(CFBundleRef bundle);
201      /* Lists the localizations that a bundle contains.  */
202  
203  CF_EXPORT
204  CFArrayRef CFBundleCopyPreferredLocalizationsFromArray(CFArrayRef locArray);
205      /* Given an array of possible localizations, returns the one or more */
206      /* of them that CFBundle would use in the current application context. */
207      /* To determine the localizations that would be used for a particular */
208      /* bundle in the current application context, apply this function to the */
209      /* result of CFBundleCopyBundleLocalizations().  */
210  
211  CF_EXPORT
212  CFArrayRef CFBundleCopyLocalizationsForPreferences(CFArrayRef locArray, CFArrayRef prefArray);
213      /* Given an array of possible localizations, returns the one or more of */
214      /* them that CFBundle would use, without reference to the current application */
215      /* context, if the user's preferred localizations were given by prefArray. */
216      /* If prefArray is NULL, the current user's actual preferred localizations will */
217      /* be used. This is not the same as CFBundleCopyPreferredLocalizationsFromArray(), */
218      /* because that function takes the current application context into account. */
219      /* To determine the localizations that another application would use, apply */
220      /* this function to the result of CFBundleCopyBundleLocalizations().  */
221  
222  CF_EXPORT
223  CFURLRef CFBundleCopyResourceURLForLocalization(CFBundleRef bundle, CFStringRef resourceName, CFStringRef resourceType, CFStringRef subDirName, CFStringRef localizationName);
224  
225  CF_EXPORT
226  CFArrayRef CFBundleCopyResourceURLsOfTypeForLocalization(CFBundleRef bundle, CFStringRef resourceType, CFStringRef subDirName, CFStringRef localizationName);
227      /* The localizationName argument to CFBundleCopyResourceURLForLocalization() or */
228      /* CFBundleCopyResourceURLsOfTypeForLocalization() must be identical to one of the */
229      /* localizations in the bundle, as returned by CFBundleCopyBundleLocalizations(). */
230      /* It is recommended that either CFBundleCopyPreferredLocalizationsFromArray() or */
231      /* CFBundleCopyLocalizationsForPreferences() be used to select the localization. */
232  
233  /* =================== Unbundled application info ===================== */
234  /* This API is provided to enable developers to retrieve bundle-related */
235  /* information about an application that may be bundled or unbundled.   */
236  CF_EXPORT
237  CFDictionaryRef CFBundleCopyInfoDictionaryForURL(CFURLRef url);
238      /* For a directory URL, this is equivalent to CFBundleCopyInfoDictionaryInDirectory(). */
239      /* For a plain file URL representing an unbundled executable, this will attempt to read */
240      /* an info dictionary from the (__TEXT, __info_plist) section, if it is a Mach-o file, */
241      /* or from a 'plst' resource.  */
242  
243  CF_EXPORT
244  CFArrayRef CFBundleCopyLocalizationsForURL(CFURLRef url);
245      /* For a directory URL, this is equivalent to calling CFBundleCopyBundleLocalizations() */
246      /* on the corresponding bundle.  For a plain file URL representing an unbundled executable, */
247      /* this will attempt to determine its localizations using the CFBundleLocalizations and */
248      /* CFBundleDevelopmentRegion keys in the dictionary returned by CFBundleCopyInfoDictionaryForURL,*/
249      /* or from a 'vers' resource if those are not present.  */
250  
251  CF_EXPORT
252  CFArrayRef CFBundleCopyExecutableArchitecturesForURL(CFURLRef url) CF_AVAILABLE(10_5, 2_0);
253      /* For a directory URL, this is equivalent to calling CFBundleCopyExecutableArchitectures() */
254      /* on the corresponding bundle.  For a plain file URL representing an unbundled executable, */
255      /* this will return the architectures it provides, if it is a Mach-o file, or NULL otherwise. */
256  
257  /* ==================== Primitive Code Loading API ==================== */
258  /* This API abstracts the various different executable formats supported on */
259  /* various platforms.  It can load DYLD, CFM, or DLL shared libraries (on their */
260  /* appropriate platforms) and gives a uniform API for looking up functions. */
261  
262  CF_EXPORT
263  CFURLRef CFBundleCopyExecutableURL(CFBundleRef bundle);
264  
265  enum {
266      kCFBundleExecutableArchitectureI386     = 0x00000007,
267      kCFBundleExecutableArchitecturePPC      = 0x00000012,
268      kCFBundleExecutableArchitectureX86_64   = 0x01000007,
269      kCFBundleExecutableArchitecturePPC64    = 0x01000012
270  } CF_ENUM_AVAILABLE(10_5, 2_0);
271  
272  CF_EXPORT
273  CFArrayRef CFBundleCopyExecutableArchitectures(CFBundleRef bundle) CF_AVAILABLE(10_5, 2_0);
274      /* If the bundle's executable exists and is a Mach-o file, this function will return an array */
275      /* of CFNumbers whose values are integers representing the architectures the file provides. */
276      /* The values currently in use are those listed in the enum above, but others may be added */
277      /* in the future.  If the executable is not a Mach-o file, this function returns NULL. */
278  
279  CF_EXPORT
280  Boolean CFBundlePreflightExecutable(CFBundleRef bundle, CFErrorRef *error) CF_AVAILABLE(10_5, 2_0);
281      /* This function will return true if the bundle is loaded, or if the bundle appears to be */
282      /* loadable upon inspection.  This does not mean that the bundle is definitively loadable, */
283      /* since it may fail to load due to link errors or other problems not readily detectable. */
284      /* If this function detects problems, it will return false, and return a CFError by reference. */
285      /* It is the responsibility of the caller to release the CFError. */
286  
287  CF_EXPORT
288  Boolean CFBundleLoadExecutableAndReturnError(CFBundleRef bundle, CFErrorRef *error) CF_AVAILABLE(10_5, 2_0);
289      /* If the bundle is already loaded, this function will return true.  Otherwise, it will attempt */
290      /* to load the bundle, and it will return true if that attempt succeeds.  If the bundle fails */
291      /* to load, this function will return false, and it will return a CFError by reference.  */
292      /* It is the responsibility of the caller to release the CFError. */
293  
294  CF_EXPORT
295  Boolean CFBundleLoadExecutable(CFBundleRef bundle);
296  
297  CF_EXPORT
298  Boolean CFBundleIsExecutableLoaded(CFBundleRef bundle);
299  
300  CF_EXPORT
301  void CFBundleUnloadExecutable(CFBundleRef bundle);
302  
303  CF_EXPORT
304  void *CFBundleGetFunctionPointerForName(CFBundleRef bundle, CFStringRef functionName);
305  
306  CF_EXPORT
307  void CFBundleGetFunctionPointersForNames(CFBundleRef bundle, CFArrayRef functionNames, void *ftbl[]);
308  
309  CF_EXPORT
310  void *CFBundleGetDataPointerForName(CFBundleRef bundle, CFStringRef symbolName);
311  
312  CF_EXPORT
313  void CFBundleGetDataPointersForNames(CFBundleRef bundle, CFArrayRef symbolNames, void *stbl[]);
314  
315  CF_EXPORT
316  CFURLRef CFBundleCopyAuxiliaryExecutableURL(CFBundleRef bundle, CFStringRef executableName);
317      /* This function can be used to find executables other than your main */
318      /* executable.  This is useful, for instance, for applications that have */
319      /* some command line tool that is packaged with and used by the application. */
320      /* The tool can be packaged in the various platform executable directories */
321      /* in the bundle and can be located with this function.  This allows an */
322      /* app to ship versions of the tool for each platform as it does for the */
323      /* main app executable. */
324  
325  /* ==================== Getting a bundle's plugIn ==================== */
326  
327  CF_EXPORT
328  CFPlugInRef CFBundleGetPlugIn(CFBundleRef bundle);
329  
330  /* ==================== Resource Manager-Related API ==================== */
331  
332  #if __LP64__
333  typedef int CFBundleRefNum;
334  #else
335  typedef SInt16 CFBundleRefNum;
336  #endif
337  
338  CF_EXPORT
339  CFBundleRefNum CFBundleOpenBundleResourceMap(CFBundleRef bundle);
340     /* This function opens the non-localized and the localized resource files */
341     /* (if any) for the bundle, creates and makes current a single read-only */
342     /* resource map combining both, and returns a reference number for it. */
343     /* If it is called multiple times, it opens the files multiple times, */
344     /* and returns distinct reference numbers.  */
345  
346  CF_EXPORT
347  SInt32 CFBundleOpenBundleResourceFiles(CFBundleRef bundle, CFBundleRefNum *refNum, CFBundleRefNum *localizedRefNum);
348     /* Similar to CFBundleOpenBundleResourceMap(), except that it creates two */
349     /* separate resource maps and returns reference numbers for both. */
350  
351  CF_EXPORT
352  void CFBundleCloseBundleResourceMap(CFBundleRef bundle, CFBundleRefNum refNum);
353  
354  CF_EXTERN_C_END
355  CF_IMPLICIT_BRIDGING_DISABLED
356  
357  #endif /* ! __COREFOUNDATION_CFBUNDLE__ */
358