CFTimeInterval CFDateGetTimeIntervalSinceDate(CFDateRef date, CFDateRef otherDate) { //TODO _cfTimeIntervalSinceDate:result: //CF_OBJC_FUNCDISPATCH(CFTimeInterval, date, "timeIntervalSinceDate:", otherDate); CF_VALIDATE_OBJECT_ARG(CF, date, CFDateGetTypeID()); CF_VALIDATE_OBJECT_ARG(CF, otherDate, CFDateGetTypeID()); return date->_time - otherDate->_time; }
CFComparisonResult CFDateCompare(CFDateRef date, CFDateRef otherDate, void* context) { CF_OBJC_FUNCDISPATCH(CFComparisonResult, date, "compare:", otherDate); CF_VALIDATE_OBJECT_ARG(CF, date, CFDateGetTypeID()); CF_VALIDATE_OBJECT_ARG(CF, otherDate, CFDateGetTypeID()); if (date->_time < otherDate->_time) { return kCFCompareLessThan; } if (date->_time > otherDate->_time) { return kCFCompareGreaterThan; } return kCFCompareEqualTo; }
static VALUE convert2rb_type(CFTypeRef ref) { VALUE result = Qnil; double double_result; int int_result; long long_result; int i; if (ref) { if (CFGetTypeID(ref) == CFStringGetTypeID()) { result = cfstring2rbstr(ref); } else if (CFGetTypeID(ref) == CFDateGetTypeID()) { // 978307200.0 == (January 1, 2001 00:00 GMT) - (January 1, 1970 00:00 UTC) // CFAbsoluteTime => January 1, 2001 00:00 GMT // ruby Time => January 1, 1970 00:00 UTC double_result = (double) CFDateGetAbsoluteTime(ref) + 978307200; result = rb_funcall(rb_cTime, rb_intern("at"), 1, rb_float_new(double_result)); } else if (CFGetTypeID(ref) == CFArrayGetTypeID()) { result = rb_ary_new(); for (i = 0; i < CFArrayGetCount(ref); i++) { rb_ary_push(result, convert2rb_type(CFArrayGetValueAtIndex(ref, i))); } } else if (CFGetTypeID(ref) == CFNumberGetTypeID()) { if (CFNumberIsFloatType(ref)) { CFNumberGetValue(ref, CFNumberGetType(ref), &double_result); result = rb_float_new(double_result); } else { CFNumberGetValue(ref, CFNumberGetType(ref), &long_result); result = LONG2NUM(long_result); } } } return result; }
static void printObj(CFPropertyListRef obj, struct printContext* c) { CFTypeID typeID = CFGetTypeID(obj); if (typeID == _CFKeyedArchiverUIDGetTypeID()) { unsigned uid = _CFKeyedArchiverUIDGetValue(obj); CFPropertyListRef refObj = CFArrayGetValueAtIndex(c->objs, uid); if (CFEqual(refObj, CFSTR("$null"))) printf("nil"); else if (c->refCount[uid] > 1 && isComplexObj(refObj)) printf("{CF$UID = %u;}", uid); else printObj(refObj, c); } else if (typeID == CFArrayGetTypeID()) { printf("(\n"); ++ c->tabs; CFArrayApplyFunction(obj, CFRangeMake(0, CFArrayGetCount(obj)), (CFArrayApplierFunction)&printObjAsArrayEntry, c); -- c->tabs; for (unsigned i = 0; i < c->tabs; ++ i) printf("\t"); printf(")"); } else if (typeID == CFDictionaryGetTypeID()) { CFStringRef className = CFDictionaryGetValue(obj, CFSTR("$classname")); if (className != NULL) printObjAsClassName(className); else { printf("{\n"); ++ c->tabs; CFIndex dictCount = CFDictionaryGetCount(obj); struct dictionarySorterContext sc; sc.keys = malloc(sizeof(CFStringRef)*dictCount); sc.values = malloc(sizeof(CFPropertyListRef)*dictCount); unsigned* mapping = malloc(sizeof(unsigned)*dictCount); for (unsigned i = 0; i < dictCount; ++ i) mapping[i] = i; CFDictionaryGetKeysAndValues(obj, (const void**)sc.keys, sc.values); qsort_r(mapping, dictCount, sizeof(unsigned), &sc, (int(*)(void*,const void*,const void*))&dictionaryComparer); for (unsigned i = 0; i < dictCount; ++ i) printObjAsDictionaryEntry(sc.keys[mapping[i]], sc.values[mapping[i]], c); free(mapping); free(sc.keys); free(sc.values); -- c->tabs; for (unsigned i = 0; i < c->tabs; ++ i) printf("\t"); printf("}"); } } else if (typeID == CFDataGetTypeID()) printObjAsData(obj); else if (typeID == CFNumberGetTypeID()) printObjAsNumber(obj); else if (typeID == CFStringGetTypeID()) printObjAsString(obj); else if (typeID == CFBooleanGetTypeID()) printf(CFBooleanGetValue(obj) ? "true" : "false"); else if (typeID == CFDateGetTypeID()) printf("/*date*/ %0.09g", CFDateGetAbsoluteTime(obj)); }
CF_PRIVATE CFTimeInterval __CFTimeIntervalUntilTSR(uint64_t tsr) { CFDateGetTypeID(); uint64_t now = mach_absolute_time(); if (tsr >= now) { return __CFTSRToTimeInterval(tsr - now); } else { return -__CFTSRToTimeInterval(now - tsr); } }
/** * Get the value of a #PLIST_DATE node. * This function does nothing if node is not of type #PLIST_DATE * * @param node the node * @param sec a pointer to an int32_t variable. Represents the number of seconds since 01/01/2001. * @param usec a pointer to an int32_t variable. Represents the number of microseconds */ void plist_get_date_val(plist_t node, int32_t * sec, int32_t * usec) { assert(CFGetTypeID(node) == CFDateGetTypeID()); CFAbsoluteTime abstime = CFDateGetAbsoluteTime((CFDateRef) node); abstime += 978307200.0; *sec = (int32_t) abstime; abstime = fabs(abstime); *usec = (int32_t) ((abstime - floor(abstime)) * 1000000); }
CFDateRef CFDateCreate(CFAllocatorRef allocator, CFAbsoluteTime at) { CFDateRef memory; uint32_t size; size = sizeof(struct __CFDate) - sizeof(CFRuntimeBase); memory = (CFDateRef)_CFRuntimeCreateInstance(allocator, CFDateGetTypeID(), size, NULL); if (!memory) { return NULL; } ((struct __CFDate*)memory)->_time = at; return memory; }
/** * Get the #plist_type of a node. * * @param node the node * @return the type of the node */ plist_type plist_get_node_type(plist_t node) { if (!node) return PLIST_NONE; CFTypeID type = CFGetTypeID(node); if (type == CFArrayGetTypeID()) return PLIST_ARRAY; else if (type == CFDictionaryGetTypeID()) return PLIST_DICT; else if (type == CFStringGetTypeID()) return PLIST_STRING; else if (type == CFDataGetTypeID()) return PLIST_DATA; else if (type == CFBooleanGetTypeID()) return PLIST_BOOLEAN; else if (type == CFDateGetTypeID()) return PLIST_DATE; else if (type == CFNumberGetTypeID()) { CFTypeID numType = CFNumberGetType(node); switch (numType) { case kCFNumberFloat32Type: case kCFNumberFloat64Type: case kCFNumberFloatType: case kCFNumberDoubleType: return PLIST_REAL; break; case kCFNumberSInt8Type: case kCFNumberSInt16Type: case kCFNumberSInt32Type: case kCFNumberSInt64Type: case kCFNumberCharType: case kCFNumberShortType: case kCFNumberIntType: return PLIST_UINT; break; default: return PLIST_NONE; break; } } return PLIST_NONE; }
CF_EXPORT CFTimeInterval CFGetSystemUptime(void) { CFDateGetTypeID(); #if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED uint64_t tsr = mach_absolute_time(); return (CFTimeInterval)((double)tsr * __CF1_TSRRate); #elif DEPLOYMENT_TARGET_LINUX || DEPLOYMENT_TARGET_FREEBSD struct timespec res; if (clock_gettime(CLOCK_MONOTONIC, &res) != 0) { HALT; } return (double)res.tv_sec + ((double)res.tv_nsec)/1.0E9; #else #error Unable to calculate uptime for this platform #endif }
void extractQuarantineProperty(const std::string &table_key_name, CFTypeRef property, const std::string &path, QueryData &results) { std::string value; if (CFGetTypeID(property) == CFStringGetTypeID()) { value = stringFromCFString((CFStringRef)property); } else if (CFGetTypeID(property) == CFDateGetTypeID()) { auto unix_time = CFDateGetAbsoluteTime((CFDateRef)property) + kCFAbsoluteTimeIntervalSince1970; value = INTEGER(std::llround(unix_time)); } else if (CFGetTypeID(property) == CFURLGetTypeID()) { value = stringFromCFString(CFURLGetString((CFURLRef)property)); } setRow(results, path, table_key_name, value); }
void genOSXPrefValues(const CFTypeRef& value, const Row& base, QueryData& results, size_t depth) { if (value == nullptr) { return; } // Since we recurse when parsing Arrays/Dicts, monitor stack limits. if (++depth > kPreferenceDepthLimit) { TLOG << "The macOS preference: " << base.at("domain") << " exceeded subkey depth limit: " << kPreferenceDepthLimit; return; } // Emit a string representation for each preference type. Row r = base; if (CFGetTypeID(value) == CFNumberGetTypeID()) { r["value"] = stringFromCFNumber(static_cast<CFDataRef>(value)); } else if (CFGetTypeID(value) == CFStringGetTypeID()) { r["value"] = stringFromCFString(static_cast<CFStringRef>(value)); } else if (CFGetTypeID(value) == CFDateGetTypeID()) { auto unix_time = CFDateGetAbsoluteTime(static_cast<CFDateRef>(value)) + kCFAbsoluteTimeIntervalSince1970; r["value"] = boost::lexical_cast<std::string>(std::llround(unix_time)); } else if (CFGetTypeID(value) == CFBooleanGetTypeID()) { r["value"] = (CFBooleanGetValue(static_cast<CFBooleanRef>(value)) == TRUE) ? "true" : "false"; } else if (CFGetTypeID(value) == CFDataGetTypeID()) { // Do not include data preferences. } else if (CFGetTypeID(value) == CFArrayGetTypeID()) { genOSXListPref(static_cast<CFArrayRef>(value), base, results, depth); return; } else if (CFGetTypeID(value) == CFDictionaryGetTypeID()) { // Generate a row for each hash key. TRowResults trow(base, results, depth); CFDictionaryApplyFunction( static_cast<CFDictionaryRef>(value), &genOSXHashPref, &trow); return; } results.push_back(std::move(r)); }
static void cf_hash_to_rb_hash(const void *raw_key, const void * raw_value, void *ctx){ CFTypeRef value = (CFTypeRef)raw_value; CFStringRef key = (CFStringRef)raw_key; VALUE rubyValue = Qnil; VALUE hash = (VALUE)ctx; if(CFStringGetTypeID() == CFGetTypeID(value)){ rubyValue = cfstring_to_rb_string((CFStringRef)value); } else if(CFDataGetTypeID() == CFGetTypeID(value)){ CFDataRef data = (CFDataRef)value; rubyValue = rb_enc_str_new((const char*)CFDataGetBytePtr(data),CFDataGetLength(data), rb_ascii8bit_encoding()); } else if(CFBooleanGetTypeID() == CFGetTypeID(value)){ Boolean booleanValue = CFBooleanGetValue(value); rubyValue = booleanValue ? Qtrue : Qfalse; } else if(CFNumberGetTypeID() == CFGetTypeID(value)){ if(CFNumberIsFloatType(value)) { double doubleValue; CFNumberGetValue(value, kCFNumberDoubleType, &doubleValue); rubyValue = rb_float_new(doubleValue); }else{ long long longValue; CFNumberGetValue(value, kCFNumberLongLongType, &longValue); rubyValue = LL2NUM(longValue); } } else if (CFDateGetTypeID() == CFGetTypeID(value)){ CFDateRef date = (CFDateRef) value; CFAbsoluteTime abs_time = CFDateGetAbsoluteTime(date); double secondsSinceUnixEpoch = abs_time + kCFAbsoluteTimeIntervalSince1970; time_t seconds = (time_t)secondsSinceUnixEpoch; long usec = (secondsSinceUnixEpoch - seconds) * 1000000; rubyValue = rb_time_new((time_t)secondsSinceUnixEpoch, usec); } if(!NIL_P(rubyValue)){ rb_hash_aset(hash, cfstring_to_rb_string(key), rubyValue); } }
inline SQLite3Status SQLite3StatementBindCFType(SQLite3StatementRef statement, CFIndex index, CFTypeRef value) { SQLite3Status status = kSQLite3StatusError; if (value) { CFTypeID valueTypeID = CFGetTypeID(value); if (CFStringGetTypeID() == valueTypeID) status = SQLite3StatementBindString(statement, index, (CFStringRef)value); else if (CFDataGetTypeID() == valueTypeID) status = SQLite3StatementBindData(statement, index, (CFDataRef)value); // else if (CGImageGetTypeID() == valueTypeID) // status = SQLite3StatementBindImage(statement, index, (CGImageRef)value); else if (CFDateGetTypeID() == valueTypeID) status = SQLite3StatementBindDate(statement, index, (CFDateRef)value); else if (CFNumberGetTypeID() == valueTypeID) status = SQLite3StatementBindNumber(statement, index, (CFNumberRef)value); else status = kSQLite3StatusError; } else { status = SQLite3StatementBindNULL(statement, index); } return status; }
void CFCalendarSetGregorianStartDate(CFCalendarRef calendar, CFDateRef date) { CF_OBJC_FUNCDISPATCHV(CFCalendarGetTypeID(), void, calendar, _setGregorianStartDate:date); __CFGenericValidateType(calendar, CFCalendarGetTypeID()); if (date) __CFGenericValidateType(date, CFDateGetTypeID()); if (!calendar->_cal) __CFCalendarSetupCal(calendar); if (!calendar->_cal) return; if (!date) { UErrorCode status = U_ZERO_ERROR; UCalendar *cal = __CFCalendarCreateUCalendar(calendar->_identifier, calendar->_localeID, calendar->_tz); UDate udate = cal ? ucal_getGregorianChange(cal, &status) : 0; if (cal && U_SUCCESS(status)) { status = U_ZERO_ERROR; if (calendar->_cal) ucal_setGregorianChange(calendar->_cal, udate, &status); } if (cal) ucal_close(cal); } else { CFAbsoluteTime at = CFDateGetAbsoluteTime(date); UDate udate = (at + kCFAbsoluteTimeIntervalSince1970) * 1000.0; UErrorCode status = U_ZERO_ERROR; if (calendar->_cal) ucal_setGregorianChange(calendar->_cal, udate, &status); } }
/* AUDIT[securityd](done): args_in (ok) is a caller provided dictionary, only its cf type has been checked. */ OSStatus SecTrustServerEvaluateAsync(CFDictionaryRef args_in, SecPathBuilderCompleted completed, const void *userData) { OSStatus status = paramErr; CFArrayRef certificates = NULL, anchors = NULL, policies = NULL; /* Proccess incoming arguments. */ CFArrayRef certificatesData = (CFArrayRef)CFDictionaryGetValue(args_in, kSecTrustCertificatesKey); require_quiet(certificatesData && CFGetTypeID(certificatesData) == CFArrayGetTypeID(), errOut); certificates = SecCertificateDataArrayCopyArray(certificatesData); require_quiet(certificates && CFGetTypeID(certificates) == CFArrayGetTypeID() && CFArrayGetCount(certificates) > 0, errOut); CFArrayRef anchorsData = (CFArrayRef)CFDictionaryGetValue(args_in, kSecTrustAnchorsKey); if (anchorsData) { require_quiet(CFGetTypeID(anchorsData) == CFArrayGetTypeID(), errOut); anchors = SecCertificateDataArrayCopyArray(anchorsData); } bool anchorsOnly = CFDictionaryContainsKey(args_in, kSecTrustAnchorsOnlyKey); CFArrayRef serializedPolicies = (CFArrayRef)CFDictionaryGetValue(args_in, kSecTrustPoliciesKey); if (serializedPolicies) { require_quiet(CFGetTypeID(serializedPolicies) == CFArrayGetTypeID(), errOut); policies = SecPolicyArrayDeserialize(serializedPolicies); } CFDateRef verifyDate = (CFDateRef)CFDictionaryGetValue(args_in, kSecTrustVerifyDateKey); require_quiet(verifyDate && CFGetTypeID(verifyDate) == CFDateGetTypeID(), errOut); CFAbsoluteTime verifyTime = CFDateGetAbsoluteTime(verifyDate); /* Call the actual evaluator function. */ SecPathBuilderRef builder = SecPathBuilderCreate(certificates, anchors, anchorsOnly, policies, verifyTime, completed, userData); status = SecPathBuilderStep(builder) ? errSecWaitForCallback : noErr; errOut: CFReleaseSafe(policies); CFReleaseSafe(anchors); CFReleaseSafe(certificates); return status; }
static CFType typeFromCFTypeRef(CFTypeRef type) { ASSERT(type); if (type == tokenNullTypeRef()) return Null; CFTypeID typeID = CFGetTypeID(type); if (typeID == CFArrayGetTypeID()) return CFArray; if (typeID == CFBooleanGetTypeID()) return CFBoolean; if (typeID == CFDataGetTypeID()) return CFData; if (typeID == CFDateGetTypeID()) return CFDate; if (typeID == CFDictionaryGetTypeID()) return CFDictionary; if (typeID == CFNullGetTypeID()) return CFNull; if (typeID == CFNumberGetTypeID()) return CFNumber; if (typeID == CFStringGetTypeID()) return CFString; if (typeID == CFURLGetTypeID()) return CFURL; #if PLATFORM(MAC) if (typeID == SecCertificateGetTypeID()) return SecCertificate; if (typeID == SecKeychainItemGetTypeID()) return SecKeychainItem; #endif ASSERT_NOT_REACHED(); return Unknown; }
static QVariant qtValue(CFPropertyListRef cfvalue) { if (!cfvalue) return QVariant(); CFTypeID typeId = CFGetTypeID(cfvalue); /* Sorted grossly from most to least frequent type. */ if (typeId == CFStringGetTypeID()) { return QSettingsPrivate::stringToVariant(QCFString::toQString(static_cast<CFStringRef>(cfvalue))); } else if (typeId == CFNumberGetTypeID()) { CFNumberRef cfnumber = static_cast<CFNumberRef>(cfvalue); if (CFNumberIsFloatType(cfnumber)) { double d; CFNumberGetValue(cfnumber, kCFNumberDoubleType, &d); return d; } else { int i; qint64 ll; if (CFNumberGetValue(cfnumber, kCFNumberIntType, &i)) return i; CFNumberGetValue(cfnumber, kCFNumberLongLongType, &ll); return ll; } } else if (typeId == CFArrayGetTypeID()) { CFArrayRef cfarray = static_cast<CFArrayRef>(cfvalue); QList<QVariant> list; CFIndex size = CFArrayGetCount(cfarray); bool metNonString = false; for (CFIndex i = 0; i < size; ++i) { QVariant value = qtValue(CFArrayGetValueAtIndex(cfarray, i)); if (value.type() != QVariant::String) metNonString = true; list << value; } if (metNonString) return list; else return QVariant(list).toStringList(); } else if (typeId == CFBooleanGetTypeID()) { return (bool)CFBooleanGetValue(static_cast<CFBooleanRef>(cfvalue)); } else if (typeId == CFDataGetTypeID()) { CFDataRef cfdata = static_cast<CFDataRef>(cfvalue); return QByteArray(reinterpret_cast<const char *>(CFDataGetBytePtr(cfdata)), CFDataGetLength(cfdata)); } else if (typeId == CFDictionaryGetTypeID()) { CFDictionaryRef cfdict = static_cast<CFDictionaryRef>(cfvalue); CFTypeID arrayTypeId = CFArrayGetTypeID(); int size = (int)CFDictionaryGetCount(cfdict); QVarLengthArray<CFPropertyListRef> keys(size); QVarLengthArray<CFPropertyListRef> values(size); CFDictionaryGetKeysAndValues(cfdict, keys.data(), values.data()); QMultiMap<QString, QVariant> map; for (int i = 0; i < size; ++i) { QString key = QCFString::toQString(static_cast<CFStringRef>(keys[i])); if (CFGetTypeID(values[i]) == arrayTypeId) { CFArrayRef cfarray = static_cast<CFArrayRef>(values[i]); CFIndex arraySize = CFArrayGetCount(cfarray); for (CFIndex j = arraySize - 1; j >= 0; --j) map.insert(key, qtValue(CFArrayGetValueAtIndex(cfarray, j))); } else { map.insert(key, qtValue(values[i])); } } return map; } else if (typeId == CFDateGetTypeID()) { QDateTime dt; dt.setTime_t((uint)kCFAbsoluteTimeIntervalSince1970); return dt.addSecs((int)CFDateGetAbsoluteTime(static_cast<CFDateRef>(cfvalue))); } return QVariant(); }
static bool writeDictToFileRecursive(CFDictionaryRef dict, int level, FILE *fp) { for (int i = 0; i < level; i++) fwrite("\t", 1, 1, fp); fwrite("<dict>\n", 1, 7, fp); CFIndex len = CFDictionaryGetCount(dict); if (len == 0) { for (int i = 0; i < level; i++) fwrite("\t", 1, 1, fp); fwrite("</dict>\n", 1, 8, fp); return true; } CFStringRef *keys = (CFStringRef*)malloc(len * sizeof(CFStringRef)); CFTypeRef *values = (CFTypeRef*)malloc(len * sizeof(CFTypeRef)); CFDictionaryGetKeysAndValues(dict, (const void**)keys, (const void**)values); for (CFIndex ci = 0; ci < len; ci++) { for (int i = 0; i <= level; i++) fwrite("\t", 1, 1, fp); fwrite("<key>", 1, 5, fp); CFIndex cflen = CFStringGetLength(keys[ci]); if (cflen > 0) { char buf[cflen+1]; if (CFStringGetCString(keys[ci], buf, cflen+1, kCFStringEncodingUTF8) == false) { free(keys); free(values); return false; } fwrite(buf, 1, cflen, fp); } fwrite("</key>\n", 1, 7, fp); CFTypeID valtype = CFGetTypeID(values[ci]); if (valtype == CFStringGetTypeID()) { for (int i = 0; i <= level; i++) fwrite("\t", 1, 1, fp); fwrite("<string>", 1, 8, fp); cflen = CFStringGetLength((CFStringRef)values[ci]); if (cflen > 0) { char buf[cflen+1]; if (CFStringGetCString((CFStringRef)values[ci], buf, cflen+1, kCFStringEncodingUTF8) == false) { free(keys); free(values); return false; } fwrite(buf, 1, cflen, fp); } fwrite("</string>\n", 1, 10, fp); } else if (valtype == CFDictionaryGetTypeID()) { if (!writeDictToFileRecursive((CFDictionaryRef)values[ci], level+1, fp)) { free(keys); free(values); return false; } } else if (valtype == CFDataGetTypeID()) { for (int i = 0; i <= level; i++) fwrite("\t", 1, 1, fp); fwrite("<data>\n", 1, 7, fp); CFIndex datalen = CFDataGetLength((CFDataRef)values[ci]); if (datalen > 0) { int encodedlen = Base64encode_len((int)datalen); char encodeddata[encodedlen]; Base64encode(encodeddata, (const char*)CFDataGetBytePtr((CFDataRef)values[ci]), (int)datalen); encodedlen = strlen(encodeddata); int count = 0; while (count < encodedlen) { for (int i = 0; i <= level; i++) fwrite("\t", 1, 1, fp); if ( (encodedlen-count) > 60 ) { fwrite(encodeddata+count, 1, 60, fp); count += 60; } else { fwrite(encodeddata+count, 1, encodedlen-count, fp); count = encodedlen; } fwrite("\n", 1, 1, fp); } } for (int i = 0; i <= level; i++) fwrite("\t", 1, 1, fp); fwrite("</data>\n", 1, 8, fp); } else if (valtype == CFBooleanGetTypeID()) { if (CFBooleanGetValue((CFBooleanRef)values[ci]) == true) { for (int i = 0; i <= level; i++) fwrite("\t", 1, 1, fp); fwrite("<true/>\n", 1, 8, fp); } else { for (int i = 0; i <= level; i++) fwrite("\t", 1, 1, fp); fwrite("<false/>\n", 1, 9, fp); } } else if (valtype == CFArrayGetTypeID()) { // TODO: Array output is not supported yet for (int i = 0; i <= level; i++) fwrite("\t", 1, 1, fp); fwrite("<array>\n", 1, 8, fp); for (int i = 0; i <= level; i++) fwrite("\t", 1, 1, fp); fwrite("</array>\n", 1, 9, fp); } #if defined(__APPLE__) else if (valtype == CFDateGetTypeID()) { // TODO: Date output is not supported yet for (int i = 0; i <= level; i++) fwrite("\t", 1, 1, fp); fwrite("<date>\n", 1, 7, fp); for (int i = 0; i <= level; i++) fwrite("\t", 1, 1, fp); fwrite("</date>\n", 1, 8, fp); } #endif else if (valtype == CFNumberGetTypeID()) { // TODO: Number output is not supported yet for (int i = 0; i <= level; i++) fwrite("\t", 1, 1, fp); fwrite("<real>\n", 1, 7, fp); for (int i = 0; i <= level; i++) fwrite("\t", 1, 1, fp); fwrite("</real>\n", 1, 8, fp); } else { // unknown type free(keys); free(values); return false; } } free(keys); free(values); for (int i = 0; i < level; i++) fwrite("\t", 1, 1, fp); fwrite("</dict>\n", 1, 8, fp); return true; }
bool Type::IsDate( void ) const { return this->GetTypeID() == CFDateGetTypeID(); }
CFStringRef _SCCopyDescription(CFTypeRef cf, CFDictionaryRef formatOptions) { #ifdef ENABLE_SC_FORMATTING CFMutableDictionaryRef nFormatOptions; CFStringRef prefix1; CFStringRef prefix2; CFTypeID type = CFGetTypeID(cf); if (!formatOptions || !CFDictionaryGetValueIfPresent(formatOptions, CFSTR("PREFIX1"), (const void **)&prefix1)) { prefix1 = CFSTR(""); } if (type == CFStringGetTypeID()) { return CFStringCreateWithFormat(NULL, formatOptions, CFSTR("%@%@"), prefix1, cf); } if (type == CFBooleanGetTypeID()) { return CFStringCreateWithFormat(NULL, formatOptions, CFSTR("%@%s"), prefix1, CFBooleanGetValue(cf) ? "TRUE" : "FALSE"); } if (type == CFDataGetTypeID()) { const uint8_t *data; CFIndex dataLen; CFIndex i; CFMutableStringRef str; str = CFStringCreateMutable(NULL, 0); CFStringAppendFormat(str, formatOptions, CFSTR("%@<data> 0x"), prefix1); data = CFDataGetBytePtr(cf); dataLen = CFDataGetLength(cf); for (i = 0; i < dataLen; i++) { CFStringAppendFormat(str, NULL, CFSTR("%02x"), data[i]); } return str; } if (type == CFNumberGetTypeID()) { return CFStringCreateWithFormat(NULL, formatOptions, CFSTR("%@%@"), prefix1, cf); } if (type == CFDateGetTypeID()) { CFCalendarRef calendar; CFStringRef str; CFTimeZoneRef tz; int MM, DD, YYYY, hh, mm, ss; calendar = CFCalendarCreateWithIdentifier(NULL, kCFGregorianCalendar); tz = CFTimeZoneCopySystem(); CFCalendarSetTimeZone(calendar, tz); CFRelease(tz); CFCalendarDecomposeAbsoluteTime(calendar, CFDateGetAbsoluteTime(cf), "MdyHms", &MM, &DD, &YYYY, &hh, &mm, &ss); CFRelease(calendar); str = CFStringCreateWithFormat(NULL, formatOptions, CFSTR("%@%02d/%02d/%04d %02d:%02d:%02d"), prefix1, MM, DD, YYYY, hh, mm, ss); return str; } if ((formatOptions == NULL) || !CFDictionaryGetValueIfPresent(formatOptions, CFSTR("PREFIX2"), (const void **)&prefix2)) { prefix2 = prefix1; } if (formatOptions != NULL) { nFormatOptions = CFDictionaryCreateMutableCopy(NULL, 0, formatOptions); } else { nFormatOptions = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); } assert(nFormatOptions != NULL); #define N_QUICK 32 if (type == CFArrayGetTypeID()) { const void * elements_q[N_QUICK]; const void ** elements = elements_q; CFIndex i; CFIndex nElements; CFMutableStringRef str; str = CFStringCreateMutable(NULL, 0); CFStringAppendFormat(str, formatOptions, CFSTR("%@<array> {"), prefix1); nElements = CFArrayGetCount(cf); if (nElements > 0) { if (nElements > (CFIndex)(sizeof(elements_q)/sizeof(CFTypeRef))) elements = CFAllocatorAllocate(NULL, nElements * sizeof(CFTypeRef), 0); CFArrayGetValues(cf, CFRangeMake(0, nElements), elements); for (i = 0; i < nElements; i++) { CFMutableStringRef nPrefix1; CFMutableStringRef nPrefix2; CFStringRef nStr; CFStringRef vStr; nStr = CFStringCreateWithFormat(NULL, NULL, CFSTR("%ld"), i); nPrefix1 = CFStringCreateMutable(NULL, 0); CFStringAppendFormat(nPrefix1, formatOptions, CFSTR("%@ %@ : "), prefix2, nStr); nPrefix2 = CFStringCreateMutable(NULL, 0); CFStringAppendFormat(nPrefix2, formatOptions, CFSTR("%@ "), prefix2); CFDictionarySetValue(nFormatOptions, CFSTR("PREFIX1"), nPrefix1); CFDictionarySetValue(nFormatOptions, CFSTR("PREFIX2"), nPrefix2); CFRelease(nPrefix1); CFRelease(nPrefix2); CFRelease(nStr); vStr = _SCCopyDescription((CFTypeRef)elements[i], nFormatOptions); CFStringAppendFormat(str, formatOptions, CFSTR("\n%@"), vStr); CFRelease(vStr); } if (elements != elements_q) CFAllocatorDeallocate(NULL, elements); } CFStringAppendFormat(str, formatOptions, CFSTR("\n%@}"), prefix2); CFRelease(nFormatOptions); return str; } if (type == CFDictionaryGetTypeID()) { const void * keys_q[N_QUICK]; const void ** keys = keys_q; CFIndex i; CFIndex nElements; CFMutableStringRef nPrefix1; CFMutableStringRef nPrefix2; CFMutableStringRef str; str = CFStringCreateMutable(NULL, 0); CFStringAppendFormat(str, formatOptions, CFSTR("%@<dictionary> {"), prefix1); nElements = CFDictionaryGetCount(cf); if (nElements > 0) { CFComparatorFunction compFunc = NULL; CFMutableArrayRef sortedKeys; if (nElements > (CFIndex)(sizeof(keys_q) / sizeof(CFTypeRef))) { keys = CFAllocatorAllocate(NULL, nElements * sizeof(CFTypeRef), 0); } CFDictionaryGetKeysAndValues(cf, keys, NULL); sortedKeys = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); for (i = 0; i < nElements; i++) { CFArrayAppendValue(sortedKeys, (CFStringRef)keys[i]); } if (isA_CFString(keys[0])) { compFunc = (CFComparatorFunction)CFStringCompare; } else if (isA_CFNumber(keys[0])) { compFunc = (CFComparatorFunction)CFNumberCompare; } else if (isA_CFDate(keys[0])) { compFunc = (CFComparatorFunction)CFDateCompare; } if (compFunc != NULL) { CFArraySortValues(sortedKeys, CFRangeMake(0, nElements), compFunc, NULL); } for (i = 0; i < nElements; i++) { CFStringRef key; CFStringRef kStr; CFTypeRef val; CFStringRef vStr; key = CFArrayGetValueAtIndex(sortedKeys, i); kStr = _SCCopyDescription((CFTypeRef)key, NULL); nPrefix1 = CFStringCreateMutable(NULL, 0); CFStringAppendFormat(nPrefix1, formatOptions, CFSTR("%@ %@ : "), prefix2, kStr); nPrefix2 = CFStringCreateMutable(NULL, 0); CFStringAppendFormat(nPrefix2, formatOptions, CFSTR("%@ "), prefix2); CFDictionarySetValue(nFormatOptions, CFSTR("PREFIX1"), nPrefix1); CFDictionarySetValue(nFormatOptions, CFSTR("PREFIX2"), nPrefix2); CFRelease(nPrefix1); CFRelease(nPrefix2); CFRelease(kStr); val = CFDictionaryGetValue(cf, key); vStr = _SCCopyDescription((CFTypeRef)val, nFormatOptions); CFStringAppendFormat(str, formatOptions, CFSTR("\n%@"), vStr); CFRelease(vStr); } CFRelease(sortedKeys); if (keys != keys_q) { CFAllocatorDeallocate(NULL, keys); } } CFStringAppendFormat(str, formatOptions, CFSTR("\n%@}"), prefix2); CFRelease(nFormatOptions); return str; } CFRelease(nFormatOptions); #endif /* ENABLE_SC_FORMATTING */ return CFStringCreateWithFormat(NULL, formatOptions, CFSTR("%@%@"), prefix1, cf); }
static QVariant q_toVariant(const CFTypeRef &obj) { const CFTypeID typeId = CFGetTypeID(obj); if (typeId == CFStringGetTypeID()) return QVariant(q_toString(static_cast<const CFStringRef>(obj))); if (typeId == CFNumberGetTypeID()) { const CFNumberRef num = static_cast<const CFNumberRef>(obj); const CFNumberType type = CFNumberGetType(num); switch (type) { case kCFNumberSInt8Type: return qVariantFromValue(convertCFNumber<char>(num, type)); case kCFNumberSInt16Type: return qVariantFromValue(convertCFNumber<qint16>(num, type)); case kCFNumberSInt32Type: return qVariantFromValue(convertCFNumber<qint32>(num, type)); case kCFNumberSInt64Type: return qVariantFromValue(convertCFNumber<qint64>(num, type)); case kCFNumberCharType: return qVariantFromValue(convertCFNumber<uchar>(num, type)); case kCFNumberShortType: return qVariantFromValue(convertCFNumber<short>(num, type)); case kCFNumberIntType: return qVariantFromValue(convertCFNumber<int>(num, type)); case kCFNumberLongType: return qVariantFromValue(convertCFNumber<long>(num, type)); case kCFNumberLongLongType: return qVariantFromValue(convertCFNumber<long long>(num, type)); case kCFNumberFloatType: return qVariantFromValue(convertCFNumber<float>(num, type)); case kCFNumberDoubleType: return qVariantFromValue(convertCFNumber<double>(num, type)); default: if (CFNumberIsFloatType(num)) return qVariantFromValue(convertCFNumber<double>(num, kCFNumberDoubleType)); return qVariantFromValue(convertCFNumber<quint64>(num, kCFNumberLongLongType)); } } if (typeId == CFDateGetTypeID()) { QDateTime dt; dt.setTime_t(uint(kCFAbsoluteTimeIntervalSince1970)); return dt.addSecs(int(CFDateGetAbsoluteTime(static_cast<const CFDateRef>(obj)))); } if (typeId == CFDataGetTypeID()) { const CFDataRef cfdata = static_cast<const CFDataRef>(obj); return QByteArray(reinterpret_cast<const char *>(CFDataGetBytePtr(cfdata)), CFDataGetLength(cfdata)); } if (typeId == CFBooleanGetTypeID()) return QVariant(bool(CFBooleanGetValue(static_cast<const CFBooleanRef>(obj)))); if (typeId == CFArrayGetTypeID()) { const CFArrayRef cfarray = static_cast<const CFArrayRef>(obj); QList<QVariant> list; CFIndex size = CFArrayGetCount(cfarray); bool metNonString = false; for (CFIndex i = 0; i < size; ++i) { QVariant value = q_toVariant(CFArrayGetValueAtIndex(cfarray, i)); if (value.type() != QVariant::String) metNonString = true; list << value; } if (metNonString) return list; else return QVariant(list).toStringList(); } if (typeId == CFDictionaryGetTypeID()) { const CFDictionaryRef cfdict = static_cast<const CFDictionaryRef>(obj); const CFTypeID arrayTypeId = CFArrayGetTypeID(); int size = int(CFDictionaryGetCount(cfdict)); QVarLengthArray<CFPropertyListRef> keys(size); QVarLengthArray<CFPropertyListRef> values(size); CFDictionaryGetKeysAndValues(cfdict, keys.data(), values.data()); QMultiMap<QString, QVariant> map; for (int i = 0; i < size; ++i) { QString key = q_toString(static_cast<const CFStringRef>(keys[i])); if (CFGetTypeID(values[i]) == arrayTypeId) { const CFArrayRef cfarray = static_cast<const CFArrayRef>(values[i]); CFIndex arraySize = CFArrayGetCount(cfarray); for (CFIndex j = arraySize - 1; j >= 0; --j) map.insert(key, q_toVariant(CFArrayGetValueAtIndex(cfarray, j))); } else { map.insert(key, q_toVariant(values[i])); } } return map; } return QVariant(); }
CF_INTERNAL void _CFDateInitialize(void) { __CFTSRRate = CFPlatformGetTSRRatePerSecond(); __CF1_TSRRate = 1.0 / __CFTSRRate; CFDateGetTypeID(); // cause side-effects }
CFTimeInterval CFDateGetAbsoluteTime(CFDateRef date) { //TODO _cfTimeIntervalSinceReferenceDate:result: //CF_OBJC_FUNCDISPATCH(CFTimeInterval, date, "timeIntervalSinceReferenceDate"); CF_VALIDATE_OBJECT_ARG(CF, date, CFDateGetTypeID()); return date->_time; }
/* MyPrintDirectoryListing prints a FTP directory entry, represented by a CFDictionary as returned by CFFTPCreateParsedResourceListing, as a single line of text, much like you'd get from "ls -l". */ static void MyPrintDirectoryListing(CFDictionaryRef dictionary) { CFDateRef cfModDate; CFNumberRef cfType, cfMode, cfSize; CFStringRef cfOwner, cfName, cfLink, cfGroup; char owner[256], group[256], name[256]; char permString[12], link[1024]; SInt64 size; SInt32 mode, type; assert(dictionary != NULL); /* You should not assume that the directory entry dictionary will contain all the possible keys. Most of the time it will, however, depending on the FTP server, some of the keys may be missing. */ cfType = CFDictionaryGetValue(dictionary, kCFFTPResourceType); if (cfType) { assert(CFGetTypeID(cfType) == CFNumberGetTypeID()); CFNumberGetValue(cfType, kCFNumberSInt32Type, &type); cfMode = CFDictionaryGetValue(dictionary, kCFFTPResourceMode); if (cfMode) { assert(CFGetTypeID(cfMode) == CFNumberGetTypeID()); CFNumberGetValue(cfMode, kCFNumberSInt32Type, &mode); /* Converts inode status information into a symbolic string */ strmode(mode + DTTOIF(type), permString); fprintf(stderr, "%s ", permString); } } cfOwner = CFDictionaryGetValue(dictionary, kCFFTPResourceOwner); if (cfOwner) { assert(CFGetTypeID(cfOwner) == CFStringGetTypeID()); CFStringGetCString(cfOwner, owner, sizeof(owner), kCFStringEncodingASCII); fprintf(stderr, "%9s", owner); } cfGroup = CFDictionaryGetValue(dictionary, kCFFTPResourceGroup); if (cfGroup) { assert(CFGetTypeID(cfGroup) == CFStringGetTypeID()); CFStringGetCString(cfGroup, group, sizeof(group), kCFStringEncodingASCII); fprintf(stderr, "%9s", group); } cfSize = CFDictionaryGetValue(dictionary, kCFFTPResourceSize); if (cfSize) { assert(CFGetTypeID(cfSize) == CFNumberGetTypeID()); CFNumberGetValue(cfSize, kCFNumberSInt64Type, &size); fprintf(stderr, "%9lld ", size); } cfModDate = CFDictionaryGetValue(dictionary, kCFFTPResourceModDate); if (cfModDate) { CFLocaleRef locale; CFDateFormatterRef formatDate; CFDateFormatterRef formatTime; CFStringRef cfDate; CFStringRef cfTime; char date[256]; char time[256]; assert(CFGetTypeID(cfModDate) == CFDateGetTypeID()); locale = CFLocaleCopyCurrent(); assert(locale != NULL); formatDate = CFDateFormatterCreate(kCFAllocatorDefault, locale, kCFDateFormatterShortStyle, kCFDateFormatterNoStyle ); assert(formatDate != NULL); formatTime = CFDateFormatterCreate(kCFAllocatorDefault, locale, kCFDateFormatterNoStyle, kCFDateFormatterShortStyle); assert(formatTime != NULL); cfDate = CFDateFormatterCreateStringWithDate(kCFAllocatorDefault, formatDate, cfModDate); assert(cfDate != NULL); cfTime = CFDateFormatterCreateStringWithDate(kCFAllocatorDefault, formatTime, cfModDate); assert(cfTime != NULL); CFStringGetCString(cfDate, date, sizeof(date), kCFStringEncodingUTF8); CFStringGetCString(cfTime, time, sizeof(time), kCFStringEncodingUTF8); fprintf(stderr, "%10s %5s ", date, time); CFRelease(cfTime); CFRelease(cfDate); CFRelease(formatTime); CFRelease(formatDate); CFRelease(locale); } /* Note that this sample assumes UTF-8 since that's what the Mac OS X FTP server returns, however, some servers may use a different encoding. */ cfName = CFDictionaryGetValue(dictionary, kCFFTPResourceName); if (cfName) { assert(CFGetTypeID(cfName) == CFStringGetTypeID()); CFStringGetCString(cfName, name, sizeof(name), kCFStringEncodingUTF8); fprintf(stderr, "%s", name); cfLink = CFDictionaryGetValue(dictionary, kCFFTPResourceLink); if (cfLink) { assert(CFGetTypeID(cfLink) == CFStringGetTypeID()); CFStringGetCString(cfLink, link, sizeof(link), kCFStringEncodingUTF8); if (strlen(link) > 0) fprintf(stderr, " -> %s", link); } } fprintf(stderr, "\n"); }