BOOL __RSFileManagerContentsDirectory(RSFileManagerRef fmg, RSStringRef path, __autorelease RSErrorRef* error, __RSFileManagerContentsContext* context, BOOL shouldRecursion)
{
    DIR *db;
    char filename[2*RSMaxPathSize] = {0};
    struct dirent *p = nil;
    memcpy(filename, RSStringGetCStringPtr(path, RSStringEncodingMacRoman), RSStringGetLength(path));
    db = opendir(filename);
    if (db == nil)
    {
        if (error)
        {
            RSDictionaryRef userInfo = RSDictionaryCreate(RSAllocatorSystemDefault, (const void**)RSErrorTargetKey, (const void**)&path, 1, RSDictionaryRSTypeContext);
            *error = RSErrorCreate(RSAllocatorSystemDefault, RSErrorDomainRSCoreFoundation, kErrExisting, userInfo);
            RSRelease(userInfo);
            RSAutorelease(*error);
        }
        return NO;
    }
    memset(filename, 0, 2*RSMaxPathSize);
    RSStringRef _fileNameStr = nil;
    RSStringRef _dirPath = nil;
    BOOL success = NO;
    while ((p = readdir(db)))
    {
        if((strcmp(p->d_name, ".") == 0) ||
           (strcmp(p->d_name, "..") == 0))
            continue;
        if (RSStringGetLength(path) > 0)
        {
            if (RSStringGetCStringPtr(path, RSStringEncodingMacRoman)[RSStringGetLength(path) - 1] == '/')
                sprintf(filename,"%s%s", RSStringGetCStringPtr(path, RSStringEncodingMacRoman), p->d_name);
            else
                sprintf(filename,"%s/%s", RSStringGetCStringPtr(path, RSStringEncodingMacRoman), p->d_name);
        }
        else
            sprintf(filename,"%s/%s", RSStringGetCStringPtr(path, RSStringEncodingUTF8), p->d_name);
        _fileNameStr = RSStringCreateWithCString(RSAllocatorSystemDefault, p->d_name, RSStringEncodingMacRoman);
        __RSFileManagerContentContextAddContent(context, _fileNameStr);
        if (p->d_type & DT_DIR && shouldRecursion)
        {
            _dirPath = RSStringCreateWithCString(RSAllocatorSystemDefault, filename, RSStringEncodingMacRoman);
#if !__RSFileManagerContentsContextDoNotUseRSArray
            __RSFileManagerContentContextUpdateDirStack(context, _fileNameStr);
#endif
            success = __RSFileManagerContentsDirectory(fmg, _dirPath, error, context, shouldRecursion);
#if !__RSFileManagerContentsContextDoNotUseRSArray
            __RSFileManagerContentContextUpdateDirStack(context, nil);
#endif
            RSRelease(_dirPath);
            _dirPath = nil;
            if (success == NO) return success;
        }
        RSRelease(_fileNameStr);
        _fileNameStr = nil;
    }
    closedir(db);
    return YES;
}
Пример #2
0
RSInline void __RSDictionaryAddEnvWithCString(RSMutableDictionaryRef dict, const char *key) {
    const char *value = __RSGetEnvironment(key);
    if (dict && key && value)
    {
        RSStringRef k = RSStringCreateWithCString(RSAllocatorSystemDefault, key, RSStringEncodingUTF8);
        RSStringRef v = RSStringCreateWithCString(RSAllocatorSystemDefault, value, RSStringEncodingUTF8);
        RSDictionarySetValue(dict, k, v);
        RSRelease(k);
        RSRelease(v);
    }
}
Пример #3
0
static RSTypeRef __RSErrorRSCoreFoundationCallBack(RSErrorRef err, RSStringRef key)
{
    if (!RSEqual(key, RSErrorDescriptionKey) && !RSEqual(key, RSErrorLocalizedFailureReasonKey)) return nil;
    RSStringRef errStr = nil;
    struct __RSErrorPrivateFormatTable cFormat = __RSErrorDomainRSCoreFoundationGetCStringWithCode(RSErrorGetCode(err));
    if (cFormat.argsCnt)
    {
        RSStringRef format = RSStringCreateWithCString(RSAllocatorSystemDefault, cFormat.format, RSStringEncodingUTF8);
        RSArrayRef objects = RSDictionaryGetValue(__RSErrorGetUserInfo(err), RSErrorTargetKey);
        RSTypeRef object[3] = {nil};
        RSIndex minCnt = 0;
        if (objects)
        {
            minCnt = min(cFormat.argsCnt, RSArrayGetCount(objects));
            switch (minCnt)
            {
                case 1:
                    object[0] = RSArrayObjectAtIndex(objects, 0);
                    errStr = RSStringCreateWithFormat(RSAllocatorSystemDefault, format, object[0]);
                    break;
                case 2:
                    object[0] = RSArrayObjectAtIndex(objects, 0);
                    object[1] = RSArrayObjectAtIndex(objects, 1);
                    errStr = RSStringCreateWithFormat(RSAllocatorSystemDefault, format, object[0], object[1]);
                    break;
                case 3:
                    object[0] = RSArrayObjectAtIndex(objects, 0);
                    object[1] = RSArrayObjectAtIndex(objects, 1);
                    object[2] = RSArrayObjectAtIndex(objects, 2);
                    errStr = RSStringCreateWithFormat(RSAllocatorSystemDefault, format, object[0], object[1], object[2]);
                    break;
                default:
                    HALTWithError(RSInvalidArgumentException, "the formate is too long to support");
                    break;
            }
        }
        for (RSIndex idx = 0; idx < minCnt; idx++)
        {
            RSRelease(object[idx]);
        }
        RSRelease(format);
    }
    else
    {
        errStr = RSStringCreateWithCString(RSAllocatorSystemDefault, cFormat.format, RSStringEncodingUTF8);
    }

    return errStr;
}
Пример #4
0
RSInline RSTypeRef ___RSProcessInfoCreateUpdate(RSStringRef key) {
    RSUInteger size = 0;
    RSCBuffer ckey = nil;
    RSTypeRef value = nil;
    if (!key || key == (RSStringRef)RSNil) return nil;
    if (kSuccess == ____RSProcessInfoUpdate(ckey = RSStringGetCStringPtr(key, RSStringEncodingMacRoman), nil, &size))
    {
        void *buf = RSAllocatorAllocate(RSAllocatorSystemDefault, size);
        if (kSuccess == ____RSProcessInfoUpdate(ckey, buf, &size))
        {
            if (!RSStringHasSuffix(key, RSSTR("size")))
                value = RSStringCreateWithCString(RSAllocatorSystemDefault, buf, RSStringEncodingUTF8);
            else
            {
                if (size == sizeof(unsigned long long))
                    value = RSStringCreateWithFormat(RSAllocatorSystemDefault, RSSTR("%lld"), *(unsigned long long*)buf);
                else if (size == sizeof(unsigned long))
                    value = RSStringCreateWithFormat(RSAllocatorSystemDefault, RSSTR("%ld"), *(unsigned long*)buf);
                else if (size == sizeof(double))
                    value = RSStringCreateWithFormat(RSAllocatorSystemDefault, RSSTR("%f"), *(float*)buf);
            }
        }
        RSAllocatorDeallocate(RSAllocatorSystemDefault, buf);
    }
    return value;
}
Пример #5
0
static RSTypeRef __RSErrorMachCallBack(RSErrorRef err, RSStringRef key)
{
    if (RSEqual(key, RSErrorDescriptionKey))
    {
        const char *errStr = mach_error_string((mach_error_t)RSErrorGetCode(err));
        if (errStr && strlen(errStr)) return RSStringCreateWithCString(RSAllocatorSystemDefault, errStr, RSStringEncodingUTF8);
    }
    return nil;
}
Пример #6
0
/*
 typedef RSTypeRef (*RSErrorUserInfoKeyCallBack)(RSErrorRef err, RSStringRef key)
 */
static RSTypeRef __RSErrorPOSIXCallBack(RSErrorRef err, RSStringRef key)
{
    if (!RSEqual(key, RSErrorDescriptionKey) && !RSEqual(key, RSErrorLocalizedFailureReasonKey)) return nil;
    
    const char *errStr = strerror((int)RSErrorGetCode(err));
    if (errStr && strlen(errStr)) return RSStringCreateWithCString(RSAllocatorSystemDefault, errStr, RSStringEncodingUTF8);
    #if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED
    /*RSBundle*/
    #endif
    
    return nil;
}
Пример #7
0
RSInline RSStringRef __RSProcessInfoGetProgramName(RSProcessInfoRef processInfo) {
    RSStringRef name = __RSProcessInfoObjectForKey(processInfo, __RSProcessInfoProgramName);
    if (name) return name;
    
    name = RSStringCreateWithCString(RSAllocatorSystemDefault, getprogname(), RSStringEncodingUTF8);
    if (name)
    {
        __RSRuntimeSetInstanceSpecial(name, YES);
        __RSProcessInfoSetObjectForKey(processInfo, __RSProcessInfoProgramName, name);
    }
    return name;
}
Пример #8
0
static RSArrayRef __RSTimeZoneKnownNamesArrayCreate()
{
    RSMutableArrayRef array = RSArrayCreateMutable(RSAllocatorSystemDefault, __RSPrivateTimeZoneNameCount);
    for (RSIndex idx = 0; idx < __RSPrivateTimeZoneNameCount; idx++)
    {
        RSStringRef name = RSStringCreateWithCString(RSAllocatorSystemDefault, __RSPrivateTimeZoneInfo[idx].timeZoneName, RSStringEncodingUTF8);
        RSArrayAddObject(array, name);
        RSRelease(name);
    }
//    RSArraySort(array, RSOrderedDescending, (RSComparatorFunction)RSStringCompare, nil);
    return array;
}
Пример #9
0
RSExport RSTimeZoneRef RSTimeZoneCopySystem()
{
    RSTimeZoneLockSystem;
    if (likely(__RSTimeZoneSystem))
    {
        RSTimeZoneUnlockSystem;
        return __RSTimeZoneSystem;
    }
    RSTimeZoneUnlockSystem;

    RSTimeZoneRef result = nil;
    RSCBuffer tzenv = __RSRuntimeGetEnvironment("TZFILE");
    if (unlikely(tzenv))
    {
        RSStringRef name = RSStringCreateWithCString(RSAllocatorSystemDefault, tzenv, RSStringEncodingASCII);
        result = RSTimeZoneCreateWithName(RSAllocatorSystemDefault, name);
        RSRelease(name);
        RSTimeZoneLockSystem;
        if (likely(__RSTimeZoneSystem == nil))
        {
            __RSTimeZoneSystem = result;
            __RSRuntimeSetInstanceSpecial(__RSTimeZoneSystem, YES);
        }
        RSTimeZoneUnlockSystem;
        return result;
    }
    tzenv = __RSRuntimeGetEnvironment("TZ");
    if (unlikely(tzenv))
    {
        RSStringRef name = RSStringCreateWithCString(RSAllocatorSystemDefault, tzenv, RSStringEncodingASCII);
        result = RSTimeZoneCreateWithName(RSAllocatorSystemDefault, name);
        RSRelease(name);
        RSTimeZoneLockSystem;
        if (likely(__RSTimeZoneSystem == nil))
        {
            __RSTimeZoneSystem = result;
            __RSRuntimeSetInstanceSpecial(__RSTimeZoneSystem, YES);
        }
        RSTimeZoneUnlockSystem;

        return result;
    }
    char linkbuf[RSMaxPathSize];
    size_t ret = readlink(TZZONELINK, linkbuf, sizeof(linkbuf));
    if (likely(0 < ret))
    {
        RSStringRef name = nil;
        linkbuf[ret] = '\0';
        if (strncmp(linkbuf, TZZONEINFO, sizeof(TZZONEINFO) - 1) == 0)
        {
            //linkbuf[strlen(linkbuf) - sizeof(TZZONEINFO) + 1] = 0;

            name = RSStringCreateWithCString(RSAllocatorSystemDefault, linkbuf + sizeof(TZZONEINFO) - 1, RSStringEncodingUTF8);
        }
        else
        {
            name = RSStringCreateWithCString(RSAllocatorSystemDefault, linkbuf, RSStringEncodingUTF8);//RSStringCreateWithBytes(RSAllocatorSystemDefault, (uint8_t *)linkbuf, strlen(linkbuf), RSStringEncodingUTF8, NO);
        }
        result = RSTimeZoneCreateWithName(RSAllocatorSystemDefault, name);
        RSRelease(name);
        if (result)
        {
            RSTimeZoneLockSystem;
            if (likely(__RSTimeZoneSystem == nil))
            {
                __RSTimeZoneSystem = result;
                __RSRuntimeSetInstanceSpecial(__RSTimeZoneSystem, YES);
            }
            RSTimeZoneUnlockSystem;
        }
        return result;
    }
    return result;
}