Skip to content

Commit 2582ebd

Browse files
committed
Changes required for swift-4.1-branch port to Android
1 parent 6c54c84 commit 2582ebd

File tree

16 files changed

+62
-32
lines changed

16 files changed

+62
-32
lines changed

CoreFoundation/Base.subproj/CFInternal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ extern void __CFGenericValidateType_(CFTypeRef cf, CFTypeID type, const char *fu
216216
#define __CFBitfield64GetValue(V, N1, N2) (((V) & __CFBitfield64Mask(N1, N2)) >> (N2))
217217
#define __CFBitfield64SetValue(V, N1, N2, X) ((V) = ((V) & ~__CFBitfield64Mask(N1, N2)) | ((((uint64_t)X) << (N2)) & __CFBitfield64Mask(N1, N2)))
218218

219-
#if __LP64__
219+
#if __LP64__ || DEPLOYMENT_TARGET_ANDROID
220220
typedef uint64_t __CFInfoType;
221221
#define __CFInfoMask(N1, N2) __CFBitfield64Mask(N1, N2)
222222
#else

CoreFoundation/Base.subproj/CFPlatform.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,9 @@ CF_EXPORT CFStringRef CFCopyFullUserName(void) {
297297
uid_t euid;
298298
__CFGetUGIDs(&euid, NULL);
299299
struct passwd *upwd = getpwuid(euid ? euid : getuid());
300+
#if DEPLOYMENT_TARGET_ANDROID
301+
#define pw_gecos pw_name
302+
#endif
300303
if (upwd && upwd->pw_gecos) {
301304
result = CFStringCreateWithCString(kCFAllocatorSystemDefault, upwd->pw_gecos, kCFPlatformInterfaceStringEncoding);
302305
}

CoreFoundation/Base.subproj/CFUtilities.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,6 +1000,7 @@ void CFLog1(CFLogLevel lev, CFStringRef message) {
10001000
CFStringGetCString(message, buffer, maxLength, encoding);
10011001

10021002
__android_log_print(priority, tag, "%s", buffer);
1003+
fprintf(stderr, "%s\n", buffer);
10031004

10041005
if (buffer != &stack_buffer[0]) free(buffer);
10051006
#else

CoreFoundation/Base.subproj/ForSwiftFoundationOnly.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,8 @@ static inline _Bool _withStackOrHeapBuffer(size_t amount, void (__attribute__((n
403403
static inline int _direntNameLength(struct dirent *entry) {
404404
#ifdef _D_EXACT_NAMLEN // defined on Linux
405405
return _D_EXACT_NAMLEN(entry);
406+
#elif DEPLOYMENT_TARGET_ANDROID
407+
return strlen(entry->d_name);
406408
#else
407409
return entry->d_namlen;
408410
#endif

CoreFoundation/NumberDate.subproj/CFTimeZone.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -813,6 +813,15 @@ static CFTimeZoneRef __CFTimeZoneCreateSystem(void) {
813813
CFRelease(name);
814814
if (result) return result;
815815
}
816+
#if DEPLOYMENT_TARGET_ANDROID
817+
// Timezone database by name not available on Android.
818+
// Approximate with gmtoff - could be general default.
819+
struct tm info;
820+
time_t now = time(NULL);
821+
if (NULL != localtime_r(&now, &info)) {
822+
return CFTimeZoneCreateWithTimeIntervalFromGMT(kCFAllocatorSystemDefault, info.tm_gmtoff);
823+
}
824+
#endif
816825
return CFTimeZoneCreateWithTimeIntervalFromGMT(kCFAllocatorSystemDefault, 0.0);
817826
}
818827

CoreFoundation/PlugIn.subproj/CFBundle.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -714,7 +714,7 @@ static CFBundleRef _CFBundleCreate(CFAllocatorRef allocator, CFURLRef bundleURL,
714714

715715
bundle->_url = newURL;
716716

717-
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS
717+
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS && !DEPLOYMENT_TARGET_ANDROID
718718
bundle->_isFHSInstalledBundle = _CFBundleURLIsForFHSInstalledBundle(newURL);
719719
#endif
720720

CoreFoundation/PlugIn.subproj/CFBundle_Main.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,20 @@ static CFBundleRef _CFBundleGetMainBundleAlreadyLocked(void) {
7979
CFStringRef str = NULL;
8080
CFURLRef executableURL = NULL, bundleURL = NULL;
8181
_initedMainBundle = true;
82+
#if DEPLOYMENT_TARGET_ANDROID
83+
const char *bundlePath = getenv("CFFIXED_USER_HOME") ?: getenv("TMPDIR") ?: "/data/local/tmp";
84+
CFStringRef bundleRef = CFStringCreateWithFileSystemRepresentation(kCFAllocatorNull, bundlePath);
85+
bundleURL = CFRetain(CFURLCreateWithFileSystemPath(kCFAllocatorSystemDefault, bundleRef,
86+
PLATFORM_PATH_STYLE, false));
87+
CFRelease(bundleRef);
88+
#else
8289
processPath = _CFProcessPath();
8390
if (processPath) {
8491
str = CFStringCreateWithFileSystemRepresentation(kCFAllocatorSystemDefault, processPath);
8592
if (!executableURL) executableURL = CFURLCreateWithFileSystemPath(kCFAllocatorSystemDefault, str, PLATFORM_PATH_STYLE, false);
8693
}
8794
if (executableURL) bundleURL = _CFBundleCopyBundleURLForExecutableURL(executableURL);
95+
#endif
8896
if (bundleURL) {
8997
// make sure that main bundle has executable path
9098
//??? what if we are not the main executable in the bundle?

CoreFoundation/Preferences.subproj/CFPreferences.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,11 @@ static CFURLRef _CFPreferencesURLForStandardDomainWithSafetyLevel(CFStringRef do
440440
CFURLRef theURL = NULL;
441441
CFAllocatorRef prefAlloc = __CFPreferencesAllocator();
442442
#if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_LINUX || DEPLOYMENT_TARGET_WINDOWS
443+
#if DEPLOYMENT_TARGET_ANDROID
444+
CFURLRef prefDir = CFBundleCopyBundleURL(CFBundleGetMainBundle());
445+
#else
443446
CFURLRef prefDir = _preferencesDirectoryForUserHostSafetyLevel(userName, hostName, safeLevel);
447+
#endif
444448
CFStringRef appName;
445449
CFStringRef fileName;
446450
Boolean mustFreeAppName = false;

CoreFoundation/URL.subproj/CFURL.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@
2525
#include <unistd.h>
2626
#include <sys/stat.h>
2727
#include <sys/types.h>
28-
#if __has_include(<sys/syslog.h>)
29-
#include <sys/syslog.h>
30-
#elif __has_include(<syslog.h>)
28+
#if __has_include(<syslog.h>)
3129
#include <syslog.h>
30+
#else
31+
#include <sys/syslog.h>
3232
#endif
3333
#include <CoreFoundation/CFURLPriv.h>
3434
#endif

Foundation/Bundle.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,16 @@ open class Bundle: NSObject {
5353
self.init(path: url.path)
5454
}
5555

56-
public init(for aClass: AnyClass) { NSUnimplemented() }
57-
56+
#if os(Android)
57+
public convenience init(for aClass: AnyClass) {
58+
self.init(path: Bundle.main.bundlePath)!
59+
}
60+
#else
61+
public init(for aClass: AnyClass) {
62+
NSUnimplemented()
63+
}
64+
#endif
65+
5866
public init?(identifier: String) {
5967
super.init()
6068

0 commit comments

Comments
 (0)