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;
}
Exemplo n.º 2
0
RSPrivate UCalendar *__RSCalendarCreateUCalendar(RSStringRef calendarID, RSTimeZoneRef tz)
{
    const char *cstr = RSStringGetCStringPtr(calendarID, RSStringEncodingASCII);
    if (nil == cstr)
    {
        //if (RSStringGetCString(localeID, buffer, BUFFER_SIZE, RSStringEncodingASCII)) cstr = buffer;
        
    }
    if (nil == cstr)
    {
        return nil;
    }
    
    UChar ubuffer[BUFFER_SIZE];
    RSStringRef tznam = RSTimeZoneGetName(tz);
    RSIndex cnt = RSStringGetLength(tznam);
    if (BUFFER_SIZE < cnt) cnt = BUFFER_SIZE;

    RSStringGetCharacters(tznam, RSMakeRange(0, cnt), (UniChar *)ubuffer);
    
    UErrorCode status = U_ZERO_ERROR;
    UCalendar *cal = ucal_open(ubuffer, (RSBit32)cnt, cstr, UCAL_DEFAULT, &status);

    return cal;
}
Exemplo n.º 3
0
RSExport RSDateRef RSDateCreateWithString(RSAllocatorRef allocator, RSStringRef value) {
    const int dateLength = 20;
    
    RSDateRef _v = nil;
    //%04d-%02d-%02dT%02d:%02d:%02dZ
    //4     +1  +2      +1  +2      +1  +2      +1  +2      +1  +2      +1
    //%04d  -   %02d    -   %02d    T   %02d    :   %02d    :   %02d    Z
    //5,3,3,3,3,3 = 20
    if (dateLength == RSStringGetLength(value))
    {
        UniChar ptr[6] = {0};
        ptr[0] = RSStringGetCharacterAtIndex(value, 5 - 1); //-
        ptr[1] = RSStringGetCharacterAtIndex(value, 8 - 1); //-
        ptr[2] = RSStringGetCharacterAtIndex(value, 11 - 1);//T
        ptr[3] = RSStringGetCharacterAtIndex(value, 14 - 1);//:
        ptr[4] = RSStringGetCharacterAtIndex(value, 17 - 1);//:
        ptr[5] = RSStringGetCharacterAtIndex(value, 20 - 1);//Z
        if ((ptr[0] == ptr[1]) &&
            (ptr[1] == '-') &&
            (ptr[2] == 'T') &&
            (ptr[3] == ptr[4]) &&
            (ptr[4] == ':') &&
            (ptr[5] == 'Z'))
        {
#if 0
            UTF8Char year[5] = {0};
            UTF8Char month[3] = {0};
            UTF8Char day[3] = {0};
            UTF8Char hour[3] = {0};
            UTF8Char minute[3] = {0};
            UTF8Char second[3] = {0};
            RSStringGetUTF8Characters(value, RSMakeRange(0, 4), year);
            RSStringGetUTF8Characters(value, RSMakeRange(5, 2), month);
            RSStringGetUTF8Characters(value, RSMakeRange(8, 2), day);
            RSStringGetUTF8Characters(value, RSMakeRange(11, 2), hour);
            RSStringGetUTF8Characters(value, RSMakeRange(14, 2), minute);
            RSStringGetUTF8Characters(value, RSMakeRange(17, 2), second);
            
            RSGregorianDate gd = {0};
            gd.year = atoi((const char*)year);
            gd.month= atoi((const char*)month);
            gd.day  = atoi((const char*)day);
            gd.hour = atoi((const char*)hour);
            gd.minute = atoi((const char*)minute);
            gd.second = atoi((const char*)second);
#else
            RSGregorianDate gd = {0};
            UniChar payload[4] = {0};
            RSIndex tmp = 0;
            
            RSStringGetCharacters(value, RSMakeRange(0, 4), payload);
            if (!__unichar2i(payload, 4, &tmp)) return nil;
            gd.year = (RSBitU32)tmp;
            
            memset(payload, 0, sizeof(payload));
            
            RSStringGetCharacters(value, RSMakeRange(5, 2), payload);
            if (!__unichar2i(payload, 2, &tmp)) return nil;
            gd.month = (RSBitU8)tmp;
            if (__dateCheckRange(gd.month, 1, 12) == NO) return nil;
            
            RSStringGetCharacters(value, RSMakeRange(8, 2), payload);
            if (!__unichar2i(payload, 2, &tmp)) return nil;
            gd.day = (RSBitU8)tmp;
            
            int maxm = 0;
            switch (gd.month)
            {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    maxm = 31;
                    break;
                case 2:
                    maxm = 28;
                    break;
                default:
                    maxm = 30;
                    break;
            }
            if ((gd.year % 400 == 0) || ((gd.year % 100 != 0) && (gd.year % 4 == 0)))
            {
                maxm++;
            }
            if (maxm > 32) HALTWithError(RSInvalidArgumentException, "maxm > 32");
            if (__dateCheckRange(gd.day, 1, maxm) == NO) return nil;
            
            RSStringGetCharacters(value, RSMakeRange(11, 2), payload);
            if (!__unichar2i(payload, 2, &tmp)) return nil;
            gd.hour = (RSBitU8)tmp;
            if (__dateCheckRange(gd.day, 0, 59) == NO) return nil;
            
            RSStringGetCharacters(value, RSMakeRange(14, 2), payload);
            if (!__unichar2i(payload, 2, &tmp)) return nil;
            gd.minute = (RSBitU8)tmp;
            if (__dateCheckRange(gd.day, 0, 59) == NO) return nil;
            
            RSStringGetCharacters(value, RSMakeRange(17, 2), payload);
            if (!__unichar2i(payload, 2, &tmp)) return nil;
            gd.second = (RSBitU8)tmp;
            if (__dateCheckRange(gd.day, 0, 59) == NO) return nil;
#endif
            _v = RSDateCreate(allocator, RSGregorianDateGetAbsoluteTime(gd, RSTimeZoneCopySystem()));
        }
    }
    return _v;
}