bool Caching_Stream::open(const Input_Stream_Position& position) { bool status; if (CFURLResourceIsReachable(m_metaDataUrl, NULL) && CFURLResourceIsReachable(m_fileUrl, NULL)) { m_cacheable = false; m_writable = false; m_useCache = true; m_cacheMetaDataWritten = false; readMetaData(); CS_TRACE("Playing file from cache\n"); CS_TRACE_CFURL(m_fileUrl); status = m_fileStream->open(position); } else { m_cacheable = false; m_writable = false; m_useCache = false; m_cacheMetaDataWritten = false; CS_TRACE("File not cached\n"); status = m_target->open(position); } return status; }
Boolean path_exists(CFTypeRef path) { if (CFGetTypeID(path) == CFStringGetTypeID()) { CFURLRef url = CFURLCreateWithFileSystemPath(NULL, path, kCFURLPOSIXPathStyle, true); Boolean result = CFURLResourceIsReachable(url, NULL); CFRelease(url); return result; } else if (CFGetTypeID(path) == CFURLGetTypeID()) { return CFURLResourceIsReachable(path, NULL); } else { return false; } }
// Resolve a path and append it to the CLI settings structure // The FSEvents API will, internally, resolve paths using a similar scheme. // Performing this ahead of time makes things less confusing, IMHO. static void append_path(const char* path) { #ifdef DEBUG fprintf(stderr, "\n"); fprintf(stderr, "append_path called for: %s\n", path); #endif #if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 #ifdef DEBUG fprintf(stderr, "compiled against 10.6+, using CFURLCreateFileReferenceURL\n"); #endif CFURLRef url = CFURLCreateFromFileSystemRepresentation(NULL, (const UInt8*)path, (CFIndex)strlen(path), false); CFURLRef placeholder = CFURLCopyAbsoluteURL(url); CFRelease(url); CFMutableArrayRef imaginary = NULL; // if we don't have an existing url, spin until we get to a parent that // does exist, saving any imaginary components for appending back later while(!CFURLResourceIsReachable(placeholder, NULL)) { #ifdef DEBUG fprintf(stderr, "path does not exist\n"); #endif CFStringRef child; if (imaginary == NULL) { imaginary = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); } child = CFURLCopyLastPathComponent(placeholder); CFArrayInsertValueAtIndex(imaginary, 0, child); CFRelease(child); url = CFURLCreateCopyDeletingLastPathComponent(NULL, placeholder); CFRelease(placeholder); placeholder = url; #ifdef DEBUG fprintf(stderr, "parent: "); CFShow(placeholder); #endif } #ifdef DEBUG fprintf(stderr, "path exists\n"); #endif // realpath() doesn't always return the correct case for a path, so this // is a funky workaround that converts a path into a (volId/inodeId) pair // and asks what the path should be for that. since it looks at the actual // inode instead of returning the same case passed in like realpath() // appears to do for HFS+, it should always be correct. url = CFURLCreateFileReferenceURL(NULL, placeholder, NULL); CFRelease(placeholder); placeholder = CFURLCreateFilePathURL(NULL, url, NULL); CFRelease(url); #ifdef DEBUG fprintf(stderr, "path resolved to: "); CFShow(placeholder); #endif // if we stripped off any imaginary path components, append them back on if (imaginary != NULL) { CFIndex count = CFArrayGetCount(imaginary); for (CFIndex i = 0; i<count; i++) { CFStringRef component = CFArrayGetValueAtIndex(imaginary, i); #ifdef DEBUG fprintf(stderr, "appending component: "); CFShow(component); #endif url = CFURLCreateCopyAppendingPathComponent(NULL, placeholder, component, false); CFRelease(placeholder); placeholder = url; } CFRelease(imaginary); } #ifdef DEBUG fprintf(stderr, "result: "); CFShow(placeholder); #endif CFStringRef cfPath = CFURLCopyFileSystemPath(placeholder, kCFURLPOSIXPathStyle); CFArrayAppendValue(config.paths, cfPath); CFRelease(cfPath); CFRelease(placeholder); #else #ifdef DEBUG fprintf(stderr, "compiled against 10.5, using realpath()\n"); #endif char fullPath[PATH_MAX + 1]; if (realpath(path, fullPath) == NULL) { #ifdef DEBUG fprintf(stderr, " realpath not directly resolvable from path\n"); #endif if (path[0] != '/') { #ifdef DEBUG fprintf(stderr, " passed path is not absolute\n"); #endif size_t len; getcwd(fullPath, sizeof(fullPath)); #ifdef DEBUG fprintf(stderr, " result of getcwd: %s\n", fullPath); #endif len = strlen(fullPath); fullPath[len] = '/'; strlcpy(&fullPath[len + 1], path, sizeof(fullPath) - (len + 1)); } else { #ifdef DEBUG fprintf(stderr, " assuming path does not YET exist\n"); #endif strlcpy(fullPath, path, sizeof(fullPath)); } } #ifdef DEBUG fprintf(stderr, " resolved path to: %s\n", fullPath); fprintf(stderr, "\n"); #endif CFStringRef pathRef = CFStringCreateWithCString(kCFAllocatorDefault, fullPath, kCFStringEncodingUTF8); CFArrayAppendValue(config.paths, pathRef); CFRelease(pathRef); #endif }