Beispiel #1
0
RSExport RSErrorRef RSErrorCreateWithKeysAndValues(RSAllocatorRef allocator, RSStringRef domain, RSIndex code, const void** keys, const void** values, RSIndex userInfoValuesCount)
{
    RSDictionaryRef userInfo = RSDictionaryCreate(allocator, keys, values, RSDictionaryRSTypeContext, userInfoValuesCount);
    RSErrorRef err = RSErrorCreate(allocator, domain, code, userInfo);
    RSRelease(userInfo);
    return err;
}
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;
}
Beispiel #3
0
static RSTypeRef __RSErrorClassCopy(RSAllocatorRef allocator, RSTypeRef rs, BOOL mutableCopy)
{
    RSErrorRef error = (RSErrorRef)rs;
    RSIndex errCode = RSErrorGetCode(error);
    RSStringRef errStr = RSErrorGetDomain(error);
    RSDictionaryRef errUserInfo = RSErrorCopyUserInfo(error);
    RSErrorRef copy = RSErrorCreate(allocator, errStr, errCode, errUserInfo);
    RSRelease(errUserInfo);
    return copy;
}