├── .gitattributes ├── English.lproj └── InfoPlist.strings ├── CDEvents_Prefix.pch ├── .gitignore ├── version.plist ├── CDEvents.podspec ├── Info.plist ├── CDEventsTestApp-Info.plist ├── LICENSE ├── api.appledoc.sh ├── TestApp ├── CDEventsTestAppController.h ├── main.m └── CDEventsTestAppController.m ├── CDEventsDelegate.h ├── compat.h ├── CDEvent.m ├── README.mdown ├── CDEvents.m ├── CDEvent.h ├── CDEvents.h ├── CDEvents.xcodeproj └── project.pbxproj └── api.doxygen /.gitattributes: -------------------------------------------------------------------------------- 1 | *.m diff=objc 2 | *.mm diff=objc 3 | -------------------------------------------------------------------------------- /English.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /CDEvents_Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'CDEvents' target in the 'CDEvents' project. 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #endif 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .svn 2 | 3 | *.swp 4 | *.o 5 | *.lo 6 | .libs 7 | *.la 8 | 9 | .DS_Store 10 | 11 | build 12 | 13 | *.perspectivev3 14 | *.pbxuser 15 | *.perspective 16 | *.mode1v3 17 | *.mode2v3 18 | *.tm_build_errors 19 | *.xcodeproj/xcuserdata 20 | *.xcodeproj/project.xcworkspace 21 | !default.pbxuser 22 | !default.perspectivev3 23 | !default.mode1v3 24 | !default.mode2v3 25 | 26 | *~.nib 27 | *~.xib 28 | 29 | api 30 | docs 31 | -------------------------------------------------------------------------------- /version.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildVersion 6 | 2 7 | CFBundleShortVersionString 8 | 1.0 9 | CFBundleVersion 10 | 1 11 | ProjectName 12 | DevToolsWizardTemplates 13 | SourceVersion 14 | 15920000 15 | 16 | 17 | -------------------------------------------------------------------------------- /CDEvents.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "CDEvents" 3 | s.version = "1.2.2" 4 | s.summary = "An Objective-C wrapper for Mac OS X’s FSEvents C API." 5 | s.homepage = "http://rastersize.github.com/CDEvents" 6 | s.license = "MIT" 7 | s.author = { "Aron Cedercrantz" => "aron@cedercrantz.se" } 8 | s.source = { :git => "https://github.com/rastersize/CDEvents.git", :tag => "1.2.2" } 9 | s.platform = :osx, "10.6" 10 | s.source_files = "*.{h,m}" 11 | s.framework = "CoreServices" 12 | s.requires_arc = true 13 | end 14 | -------------------------------------------------------------------------------- /Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | com.cedercrantz.${PRODUCT_NAME:rfc1034Identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 1.2.2 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.2.2 25 | NSPrincipalClass 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /CDEventsTestApp-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | com.yourcompany.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | APPL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | LSMinimumSystemVersion 22 | ${MACOSX_DEPLOYMENT_TARGET} 23 | NSMainNibFile 24 | MainMenu 25 | NSPrincipalClass 26 | NSApplication 27 | 28 | 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2010, 2011 Aron Cedercrantz 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /api.appledoc.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ## 4 | # USAGE 5 | # ./api.appledoc.sh [version-string] 6 | # 7 | # Execute it from the root of the CDEvents project. 8 | 9 | 10 | PROJECT_VERSION="HEAD" 11 | if [ "$#" -gt "0" ] 12 | then 13 | PROJECT_VERSION=$1 14 | fi 15 | 16 | API_DOCS_DIR="./api/appledoc" 17 | #HEADER_FILES=`find . -name '*.h'` 18 | HEADER_FILES=`ls *.h` 19 | 20 | 21 | echo "API documentation generator for CDEvents v1" 22 | echo "Will save generated documentation to \"${API_DOCS_DIR}\"" 23 | echo "Removing old API documentation" 24 | rm -r $API_DOCS_DIR/html 2> /dev/null 25 | rm -r $API_DOCS_DIR/docset 2> /dev/null 26 | 27 | echo "Will generate API documentation based on:" 28 | echo ${HEADER_FILES} 29 | 30 | echo "Generating for version \"${PROJECT_VERSION}\"..." 31 | appledoc \ 32 | --output ${API_DOCS_DIR} \ 33 | --project-name "CDEvents" \ 34 | --project-version ${PROJECT_VERSION} \ 35 | --project-company "Aron Cedercrantz" \ 36 | --company-id "com.cedercrantz" \ 37 | --create-html \ 38 | --keep-intermediate-files \ 39 | --no-install-docset \ 40 | ${HEADER_FILES} 41 | echo "Done!" 42 | 43 | echo "You can open the HTML documentation with:" 44 | echo "\"open ${API_DOCS_DIR}/html/index.html\"" 45 | 46 | -------------------------------------------------------------------------------- /TestApp/CDEventsTestAppController.h: -------------------------------------------------------------------------------- 1 | /** 2 | * CDEvents 3 | * 4 | * Copyright (c) 2010-2013 Aron Cedercrantz 5 | * http://github.com/rastersize/CDEvents/ 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import 30 | #import 31 | 32 | @class CDEvents; 33 | 34 | 35 | @interface CDEventsTestAppController : NSObject { 36 | CDEvents *_events; 37 | } 38 | 39 | - (void)run; 40 | 41 | @end 42 | -------------------------------------------------------------------------------- /TestApp/main.m: -------------------------------------------------------------------------------- 1 | /** 2 | * CDEvents 3 | * 4 | * Copyright (c) 2010-2013 Aron Cedercrantz 5 | * http://github.com/rastersize/CDEvents/ 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import "CDEventsTestAppController.h" 30 | 31 | /** 32 | * Runs forever outputting all changes to the users home directory to the 33 | * standard output (via NSLog()). 34 | * 35 | * The CDEventsTestAppController implements the CDEventsDelegate protocol and 36 | * when it receives any event notificaitons it just echos it to the standard 37 | * output. 38 | */ 39 | int main(int argc, char *argv[]) 40 | { 41 | NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 42 | 43 | CDEventsTestAppController *controller = [[[CDEventsTestAppController alloc] init] autorelease]; 44 | [controller run]; 45 | 46 | [[NSRunLoop currentRunLoop] run]; 47 | 48 | [pool drain]; 49 | 50 | return 0; 51 | } -------------------------------------------------------------------------------- /CDEventsDelegate.h: -------------------------------------------------------------------------------- 1 | /** 2 | * CDEvents 3 | * 4 | * Copyright (c) 2010-2013 Aron Cedercrantz 5 | * http://github.com/rastersize/CDEvents/ 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | /** 30 | * @headerfile CDEventsDelegate.h CDEvents/CDEventsDelegate.h 31 | 32 | * 33 | * A protocol that that delegates of CDEvents conform to. Inspired and based 34 | * upon the open source project SCEvents created by Stuart Connolly 35 | * http://stuconnolly.com/projects/code/ 36 | */ 37 | 38 | @class CDEvents; 39 | @class CDEvent; 40 | 41 | 42 | /** 43 | * The CDEventsDelegate protocol defines the required methods implemented by delegates of CDEvents objects. 44 | * 45 | * @see CDEvents 46 | * @see CDEvent 47 | * 48 | * @since 1.0.0 49 | */ 50 | @protocol CDEventsDelegate 51 | 52 | @required 53 | /** 54 | * The method called by the CDEvents object on its delegate object. 55 | * 56 | * @param URLWatcher The CDEvents object which the event was recieved thru. 57 | * @param event The event data. 58 | * 59 | * @see CDEvents 60 | * @see CDEvent 61 | * 62 | * @discussion Conforming objects' implementation of this method will be called 63 | * whenever an event occurs. The instance of CDEvents which received the event 64 | * and the event itself are passed as parameters. 65 | * 66 | * @since 1.0.0 67 | */ 68 | - (void)URLWatcher:(CDEvents *)URLWatcher eventOccurred:(CDEvent *)event; 69 | 70 | @end 71 | 72 | -------------------------------------------------------------------------------- /compat.h: -------------------------------------------------------------------------------- 1 | /** 2 | * CDEvents 3 | * 4 | * Copyright (c) 2010-2013 Aron Cedercrantz 5 | * http://github.com/rastersize/CDEvents/ 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | /** 30 | * @headerfile compat.h 31 | * FSEventStream flag compatibility shim 32 | * 33 | * In order to compile a binary against an older SDK yet still support the 34 | * features present in later OS releases, we need to define any missing enum 35 | * constants not present in the older SDK. This allows us to safely defer 36 | * feature detection to runtime (and avoid recompilation). 37 | */ 38 | 39 | #import 40 | 41 | #if MAC_OS_X_VERSION_MAX_ALLOWED < 1060 42 | // ignoring events originating from the current process introduced in 10.6 43 | FSEventStreamCreateFlags kFSEventStreamCreateFlagIgnoreSelf = 0x00000008; 44 | #endif 45 | 46 | #if MAC_OS_X_VERSION_MAX_ALLOWED < 1070 47 | // file-level events introduced in 10.7 48 | FSEventStreamCreateFlags kFSEventStreamCreateFlagFileEvents = 0x00000010; 49 | FSEventStreamEventFlags kFSEventStreamEventFlagItemCreated = 0x00000100, 50 | kFSEventStreamEventFlagItemRemoved = 0x00000200, 51 | kFSEventStreamEventFlagItemInodeMetaMod = 0x00000400, 52 | kFSEventStreamEventFlagItemRenamed = 0x00000800, 53 | kFSEventStreamEventFlagItemModified = 0x00001000, 54 | kFSEventStreamEventFlagItemFinderInfoMod = 0x00002000, 55 | kFSEventStreamEventFlagItemChangeOwner = 0x00004000, 56 | kFSEventStreamEventFlagItemXattrMod = 0x00008000, 57 | kFSEventStreamEventFlagItemIsFile = 0x00010000, 58 | kFSEventStreamEventFlagItemIsDir = 0x00020000, 59 | kFSEventStreamEventFlagItemIsSymlink = 0x00040000; 60 | #endif 61 | -------------------------------------------------------------------------------- /TestApp/CDEventsTestAppController.m: -------------------------------------------------------------------------------- 1 | /** 2 | * CDEvents 3 | * 4 | * Copyright (c) 2010-2013 Aron Cedercrantz 5 | * http://github.com/rastersize/CDEvents/ 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | #import "CDEventsTestAppController.h" 29 | 30 | #import 31 | #import 32 | 33 | 34 | #define CD_EVENTS_TEST_APP_USE_BLOCKS_API 1 35 | 36 | 37 | bool systemVersionIsAtLeast(SInt32 major, SInt32 minor) 38 | { 39 | static SInt32 versionMajor = 0, versionMinor = 0; 40 | 41 | if (versionMajor == 0) { 42 | Gestalt(gestaltSystemVersionMajor, &versionMajor); 43 | } 44 | 45 | if (versionMinor == 0) { 46 | Gestalt(gestaltSystemVersionMinor, &versionMinor); 47 | } 48 | 49 | return ((versionMajor > major) || 50 | ((versionMajor == major) && (versionMinor >= minor))); 51 | } 52 | 53 | 54 | @implementation CDEventsTestAppController 55 | 56 | - (void)run 57 | { 58 | NSArray *watchedURLs = [NSArray arrayWithObject: 59 | [NSURL URLWithString:[NSHomeDirectory() 60 | stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]; 61 | NSArray *excludeURLs = [NSMutableArray arrayWithObject: 62 | [NSURL URLWithString:[[NSHomeDirectory() stringByAppendingPathComponent:@"Downloads"] 63 | stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]; 64 | 65 | CDEventsEventStreamCreationFlags creationFlags = kCDEventsDefaultEventStreamFlags; 66 | 67 | if (systemVersionIsAtLeast(10,6)) { 68 | creationFlags |= kFSEventStreamCreateFlagIgnoreSelf; 69 | } 70 | 71 | if (systemVersionIsAtLeast(10,7)) { 72 | creationFlags |= kFSEventStreamCreateFlagFileEvents; 73 | } 74 | 75 | #if CD_EVENTS_TEST_APP_USE_BLOCKS_API 76 | _events = [[CDEvents alloc] initWithURLs:watchedURLs 77 | block:^(CDEvents *watcher, CDEvent *event){ NSLog(@"[Block] URLWatcher: %@\nEvent: %@", watcher, event); } 78 | onRunLoop:[NSRunLoop currentRunLoop] 79 | sinceEventIdentifier:kCDEventsSinceEventNow 80 | notificationLantency:CD_EVENTS_DEFAULT_NOTIFICATION_LATENCY 81 | ignoreEventsFromSubDirs:CD_EVENTS_DEFAULT_IGNORE_EVENT_FROM_SUB_DIRS 82 | excludeURLs:excludeURLs 83 | streamCreationFlags:creationFlags]; 84 | #else 85 | _events = [[CDEvents alloc] initWithURLs:watchedURLs 86 | delegate:self 87 | onRunLoop:[NSRunLoop currentRunLoop] 88 | sinceEventIdentifier:kCDEventsSinceEventNow 89 | notificationLantency:CD_EVENTS_DEFAULT_NOTIFICATION_LATENCY 90 | ignoreEventsFromSubDirs:CD_EVENTS_DEFAULT_IGNORE_EVENT_FROM_SUB_DIRS 91 | excludeURLs:excludeURLs 92 | streamCreationFlags:creationFlags]; 93 | //[_events setIgnoreEventsFromSubDirectories:YES]; 94 | #endif 95 | 96 | NSLog(@"-[CDEventsTestAppController run]:\n%@\n------\n%@", 97 | _events, 98 | [_events streamDescription]); 99 | } 100 | 101 | - (void)dealloc 102 | { 103 | [_events setDelegate:nil]; 104 | [_events release]; 105 | 106 | [super dealloc]; 107 | } 108 | 109 | - (void)URLWatcher:(CDEvents *)urlWatcher eventOccurred:(CDEvent *)event 110 | { 111 | NSLog(@"[Delegate] URLWatcher: %@\nEvent: %@", urlWatcher, event); 112 | } 113 | 114 | @end 115 | -------------------------------------------------------------------------------- /CDEvent.m: -------------------------------------------------------------------------------- 1 | /** 2 | * CDEvents 3 | * 4 | * Copyright (c) 2010-2013 Aron Cedercrantz 5 | * http://github.com/rastersize/CDEvents/ 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import "CDEvent.h" 30 | #import "compat.h" 31 | 32 | @implementation CDEvent 33 | 34 | #pragma mark Properties 35 | @synthesize identifier = _identifier; 36 | @synthesize date = _date; 37 | @synthesize URL = _URL; 38 | @synthesize flags = _flags; 39 | 40 | 41 | #pragma mark Class object creators 42 | + (CDEvent *)eventWithIdentifier:(NSUInteger)identifier 43 | date:(NSDate *)date 44 | URL:(NSURL *)URL 45 | flags:(CDEventFlags)flags 46 | { 47 | return [[CDEvent alloc] initWithIdentifier:identifier 48 | date:date 49 | URL:URL 50 | flags:flags]; 51 | } 52 | 53 | 54 | #pragma mark Init/dealloc methods 55 | 56 | - (id)initWithIdentifier:(NSUInteger)identifier 57 | date:(NSDate *)date 58 | URL:(NSURL *)URL 59 | flags:(CDEventFlags)flags 60 | { 61 | if ((self = [super init])) { 62 | _identifier = identifier; 63 | _flags = flags; 64 | _date = date; 65 | _URL = URL; 66 | } 67 | 68 | return self; 69 | } 70 | 71 | 72 | #pragma mark NSCoding methods 73 | - (void)encodeWithCoder:(NSCoder *)aCoder 74 | { 75 | [aCoder encodeObject:[NSNumber numberWithUnsignedInteger:[self identifier]] forKey:@"identifier"]; 76 | [aCoder encodeObject:[NSNumber numberWithUnsignedInteger:[self flags]] forKey:@"flags"]; 77 | [aCoder encodeObject:[self date] forKey:@"date"]; 78 | [aCoder encodeObject:[self URL] forKey:@"URL"]; 79 | } 80 | 81 | - (id)initWithCoder:(NSCoder *)aDecoder 82 | { 83 | self = [self initWithIdentifier:[[aDecoder decodeObjectForKey:@"identifier"] unsignedIntegerValue] 84 | date:[aDecoder decodeObjectForKey:@"date"] 85 | URL:[aDecoder decodeObjectForKey:@"URL"] 86 | flags:[[aDecoder decodeObjectForKey:@"flags"] unsignedIntValue]]; 87 | 88 | return self; 89 | } 90 | 91 | 92 | #pragma mark NSCopying methods 93 | - (id)copyWithZone:(NSZone *)zone 94 | { 95 | // We can do this since we are immutable. 96 | return self; 97 | } 98 | 99 | #pragma mark Specific flag properties 100 | - (BOOL)isGenericChange 101 | { 102 | return (kFSEventStreamEventFlagNone == _flags); 103 | } 104 | 105 | #define FLAG_CHECK(flags, flag) ((flags) & (flag)) 106 | 107 | #define FLAG_PROPERTY(name, flag) \ 108 | - (BOOL)name \ 109 | { return (FLAG_CHECK(_flags, flag) ? YES : NO); } 110 | 111 | FLAG_PROPERTY(mustRescanSubDirectories, kFSEventStreamEventFlagMustScanSubDirs) 112 | FLAG_PROPERTY(isUserDropped, kFSEventStreamEventFlagUserDropped) 113 | FLAG_PROPERTY(isKernelDropped, kFSEventStreamEventFlagKernelDropped) 114 | FLAG_PROPERTY(isEventIdentifiersWrapped, kFSEventStreamEventFlagEventIdsWrapped) 115 | FLAG_PROPERTY(isHistoryDone, kFSEventStreamEventFlagHistoryDone) 116 | FLAG_PROPERTY(isRootChanged, kFSEventStreamEventFlagRootChanged) 117 | FLAG_PROPERTY(didVolumeMount, kFSEventStreamEventFlagMount) 118 | FLAG_PROPERTY(didVolumeUnmount, kFSEventStreamEventFlagUnmount) 119 | 120 | // file-level events introduced in 10.7 121 | FLAG_PROPERTY(isCreated, kFSEventStreamEventFlagItemCreated) 122 | FLAG_PROPERTY(isRemoved, kFSEventStreamEventFlagItemRemoved) 123 | FLAG_PROPERTY(isInodeMetadataModified, kFSEventStreamEventFlagItemInodeMetaMod) 124 | FLAG_PROPERTY(isRenamed, kFSEventStreamEventFlagItemRenamed) 125 | FLAG_PROPERTY(isModified, kFSEventStreamEventFlagItemModified) 126 | FLAG_PROPERTY(isFinderInfoModified, kFSEventStreamEventFlagItemFinderInfoMod) 127 | FLAG_PROPERTY(didChangeOwner, kFSEventStreamEventFlagItemChangeOwner) 128 | FLAG_PROPERTY(isXattrModified, kFSEventStreamEventFlagItemXattrMod) 129 | FLAG_PROPERTY(isFile, kFSEventStreamEventFlagItemIsFile) 130 | FLAG_PROPERTY(isDir, kFSEventStreamEventFlagItemIsDir) 131 | FLAG_PROPERTY(isSymlink, kFSEventStreamEventFlagItemIsSymlink) 132 | 133 | #pragma mark Misc 134 | - (NSString *)description 135 | { 136 | return [NSString stringWithFormat:@"<%@: %p { identifier = %ld, URL = %@, flags = %ld, date = %@ }>", 137 | [self className], 138 | self, 139 | (unsigned long)[self identifier], 140 | [self URL], 141 | (unsigned long)[self flags], 142 | [self date]]; 143 | } 144 | 145 | @end 146 | -------------------------------------------------------------------------------- /README.mdown: -------------------------------------------------------------------------------- 1 | # CDEvents 2 | ***Note:*** The `develop` branch **requires Mac OS X 10.6 or newer** as the framework relies on [ARC](http://clang.llvm.org/docs/AutomaticReferenceCounting.html "Automatic Reference Counting Technical Specification") and [blocks](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html "Blocks Programming Topics"). 3 | 4 | Website: http://rastersize.github.com/CDEvents 5 | 6 | ## What is this? 7 | It's an Objective-C wrapper for Mac OS X's [FSEvents C API](http://developer.apple.com/mac/library/documentation/Darwin/Reference/FSEvents_Ref/FSEvents_h/index.html) with support for blocks. Furthermore, all the classes are immutable and it should be thread-safe. 8 | 9 | 10 | ## Requirements 11 | Requires Mac OS X 10.6 (Snow Leopard) and an Intel 64-bit CPU. The requirements stems from that automatic reference counting (ARC) is supported from 10.6 and up as long as the modern (i.e. 64-bit) Objective-C runtime is used since ARC requires the non-fragile ABI. Although the built product works on 10.6 and up it must be built on a machine running 10.7 (Lion) using Xcode 4.2 and the 10.7 SDK as the 10.6 SDK does not include ARC. The built product support both manual memory management and automatic reference counting. 12 | 13 | If you need to support older versions of OS X or garbage collection please see the branch `support/1.1`. All _1.1.x_ version will support garbage collection and OS X 10.5. 14 | 15 | 16 | ## Usage 17 | You can use either the block based version (recommended) or the delegate based. Using both systems at the same time is not supported. 18 | 19 | ### Block based (recommended) 20 | 1. Add CDEvents to your project, 21 | * either by compiling the project and dragging the `CDEvents.framework` into your project or 22 | * by dragging the entire CDEvents project into your project as a sub-project. 23 | 2. Import the `CDEvents.h` header where you need it. 24 | 3. Set up your `CDEvents` instance and give it a block to execute when a event occurs. 25 | 26 | Easy example code: 27 | 28 | self.events = [[CDEvents alloc] initWithURLs: 29 | block:^(CDEvents *watcher, CDEvent *event) { 30 | 31 | }]; 32 | 33 | Or use all the all-options initiator: 34 | 35 | self.events = [[CDEvents alloc] initWithURLs: 36 | block:^(CDEvents *watcher, CDEvent *event) { 37 | 38 | } 39 | onRunLoop:[NSRunLoop currentRunLoop] 40 | sinceEventIdentifier:kCDEventsSinceEventNow 41 | notificationLantency:CD_EVENTS_DEFAULT_NOTIFICATION_LATENCY 42 | ignoreEventsFromSubDirs:CD_EVENTS_DEFAULT_IGNORE_EVENT_FROM_SUB_DIRS 43 | excludeURLs: 44 | streamCreationFlags:kCDEventsDefaultEventStreamFlags]; 45 | 46 | See the test app (`TestApp`) for an example on how to use the framework. 47 | 48 | ### Delegate based 49 | ***This is the same behavior as pre ARC and blocks.*** 50 | 51 | 1. Add CDEvents to your project, 52 | * either by compiling the project and dragging the `CDEvents.framework` into your project or 53 | * by dragging the entire CDEvents project into your project as a sub-project. 54 | 2. Import the `CDEvents.h` header where you need it. 55 | 3. Import the `CDEventsDelegate.h` header where you need it (i.e. in the file which declares your delegate). 56 | 4. Implement the delegate (`-URLWatcher:eventOccurred:`) and create your `CDEvents` instance. 57 | 5. Zero out the delegate when you no longer need it. 58 | 59 | Example code: 60 | 61 | self.events = [[CDEvents alloc] initWithURLs: 62 | delegate: 63 | onRunLoop:[NSRunLoop currentRunLoop] 64 | sinceEventIdentifier:kCDEventsSinceEventNow 65 | notificationLantency:CD_EVENTS_DEFAULT_NOTIFICATION_LATENCY 66 | ignoreEventsFromSubDirs:CD_EVENTS_DEFAULT_IGNORE_EVENT_FROM_SUB_DIRS 67 | excludeURLs: 68 | streamCreationFlags:kCDEventsDefaultEventStreamFlags]; 69 | 70 | See the test app (`TestApp`) for an example on how to use the framework. 71 | 72 | **Important:** Since Mac OS X 10.6 is set as the deployment target automatic zeroing of weak references is not available. Thus you must set the `delegate` of `CDEvents` to `nil` when you no longer want to receive events. That is, at least in your `-dealloc` method. This is also required when using 10.7 and up! (`delegate` is an `unsafe_unretained` property.) 73 | 74 | For more details please refer to the documentation in the header files and the section "API documentation" below. 75 | 76 | 77 | ## API documentation 78 | Read the latest [API documentation](http://rastersize.github.com/CDEvents/docs/api/head) or [browse for each version](http://rastersize.github.com/CDEvents/docs/api) of CDEvents. Alternatively you can generate it yourself, please see below. 79 | 80 | ### appledoc 81 | Run the script `api.appledoc.sh` from the root of the project. The script takes one optional argument, the version of the project as a string. If the version string is empty "HEAD" will be used instead. 82 | 83 | ### Doxygen 84 | You can generate API documentation with the help of [Doxygen](http://www.stack.nl/~dimitri/doxygen/). In Doxygen open the file `api.doxygen`, click the `Run` tab and then the `Run doxygen` button. When it's done you should have a directory (ignored by git) in the root of the project named `api` with a sub-directory `html` in which you will find `index.html` double-click and enjoy. 85 | 86 | ## Contributors 87 | See GitHubs [contributors to rastersize/CDEvents](https://github.com/rastersize/CDEvents/contributors) statistics page. 88 | 89 | ## License 90 | The code is released under the [MIT-license](http://www.opensource.org/licenses/mit-license.php). 91 | 92 | If you want, even though you really don't have to, I would love to hear what you use CDEvents for! Send me an email (first name (i.e. aron) @ last name (i.e. cedercrantz) dot se). 93 | -------------------------------------------------------------------------------- /CDEvents.m: -------------------------------------------------------------------------------- 1 | /** 2 | * CDEvents 3 | * 4 | * Copyright (c) 2010-2013 Aron Cedercrantz 5 | * http://github.com/rastersize/CDEvents/ 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import "CDEvents.h" 30 | 31 | #import "CDEventsDelegate.h" 32 | 33 | #ifndef __has_feature 34 | #define __has_feature(x) 0 35 | #endif 36 | 37 | #if !__has_feature(objc_arc) 38 | #error CDEvents must be built with ARC. 39 | #endif 40 | 41 | #if !__has_feature(blocks) 42 | #error CDEvents must be built with support for blocks. 43 | #endif 44 | 45 | 46 | #pragma mark CDEvents custom exceptions 47 | NSString *const CDEventsEventStreamCreationFailureException = @"CDEventsEventStreamCreationFailureException"; 48 | 49 | #pragma - 50 | #pragma mark Default values 51 | const CDEventsEventStreamCreationFlags kCDEventsDefaultEventStreamFlags = 52 | (kFSEventStreamCreateFlagUseCFTypes | 53 | kFSEventStreamCreateFlagWatchRoot); 54 | 55 | const CDEventIdentifier kCDEventsSinceEventNow = kFSEventStreamEventIdSinceNow; 56 | 57 | 58 | #pragma mark - 59 | #pragma mark Private API 60 | // Private API 61 | @interface CDEvents () { 62 | @private 63 | CDEventsEventBlock _eventBlock; 64 | 65 | FSEventStreamRef _eventStream; 66 | CDEventsEventStreamCreationFlags _eventStreamCreationFlags; 67 | } 68 | 69 | // Redefine the properties that should be writeable. 70 | @property (strong, readwrite) CDEvent *lastEvent; 71 | @property (copy, readwrite) NSArray *watchedURLs; 72 | 73 | // The FSEvents callback function 74 | static void CDEventsCallback( 75 | ConstFSEventStreamRef streamRef, 76 | void *callbackCtxInfo, 77 | size_t numEvents, 78 | void *eventPaths, 79 | const FSEventStreamEventFlags eventFlags[], 80 | const FSEventStreamEventId eventIds[]); 81 | 82 | // Creates and initiates the event stream. 83 | - (void)createEventStream; 84 | // Disposes of the event stream. 85 | - (void)disposeEventStream; 86 | 87 | @end 88 | 89 | 90 | #pragma mark - 91 | #pragma mark Implementation 92 | @implementation CDEvents 93 | 94 | #pragma mark Properties 95 | @synthesize delegate = _delegate; 96 | @synthesize notificationLatency = _notificationLatency; 97 | @synthesize sinceEventIdentifier = _sinceEventIdentifier; 98 | @synthesize ignoreEventsFromSubDirectories = _ignoreEventsFromSubDirectories; 99 | @synthesize lastEvent = _lastEvent; 100 | @synthesize watchedURLs = _watchedURLs; 101 | @synthesize excludedURLs = _excludedURLs; 102 | 103 | 104 | #pragma mark Event identifier class methods 105 | + (CDEventIdentifier)currentEventIdentifier 106 | { 107 | return (NSUInteger)FSEventsGetCurrentEventId(); 108 | } 109 | 110 | 111 | #pragma mark Init/dealloc/finalize methods 112 | - (void)dealloc 113 | { 114 | [self disposeEventStream]; 115 | 116 | _delegate = nil; 117 | } 118 | 119 | - (void)finalize 120 | { 121 | [self disposeEventStream]; 122 | 123 | _delegate = nil; 124 | 125 | [super finalize]; 126 | } 127 | 128 | - (id)initWithURLs:(NSArray *)URLs delegate:(id)delegate 129 | { 130 | return [self initWithURLs:URLs 131 | delegate:delegate 132 | onRunLoop:[NSRunLoop currentRunLoop]]; 133 | } 134 | 135 | - (id)initWithURLs:(NSArray *)URLs 136 | delegate:(id)delegate 137 | onRunLoop:(NSRunLoop *)runLoop 138 | { 139 | return [self initWithURLs:URLs 140 | delegate:delegate 141 | onRunLoop:runLoop 142 | sinceEventIdentifier:kCDEventsSinceEventNow 143 | notificationLantency:CD_EVENTS_DEFAULT_NOTIFICATION_LATENCY 144 | ignoreEventsFromSubDirs:CD_EVENTS_DEFAULT_IGNORE_EVENT_FROM_SUB_DIRS 145 | excludeURLs:nil 146 | streamCreationFlags:kCDEventsDefaultEventStreamFlags]; 147 | } 148 | 149 | - (id)initWithURLs:(NSArray *)URLs 150 | delegate:(id)delegate 151 | onRunLoop:(NSRunLoop *)runLoop 152 | sinceEventIdentifier:(CDEventIdentifier)sinceEventIdentifier 153 | notificationLantency:(CFTimeInterval)notificationLatency 154 | ignoreEventsFromSubDirs:(BOOL)ignoreEventsFromSubDirs 155 | excludeURLs:(NSArray *)exludeURLs 156 | streamCreationFlags:(CDEventsEventStreamCreationFlags)streamCreationFlags 157 | { 158 | if (delegate == nil) { 159 | [NSException raise:NSInvalidArgumentException 160 | format:@"Invalid arguments passed to CDEvents init-method."]; 161 | } 162 | 163 | _delegate = delegate; 164 | 165 | return [self initWithURLs:URLs 166 | block:^(CDEvents *watcher, CDEvent *event){ 167 | if ([(id)[watcher delegate] conformsToProtocol:@protocol(CDEventsDelegate)]) { 168 | [[watcher delegate] URLWatcher:watcher eventOccurred:event]; 169 | } 170 | } 171 | onRunLoop:runLoop 172 | sinceEventIdentifier:sinceEventIdentifier 173 | notificationLantency:notificationLatency 174 | ignoreEventsFromSubDirs:ignoreEventsFromSubDirs 175 | excludeURLs:exludeURLs 176 | streamCreationFlags:streamCreationFlags]; 177 | } 178 | 179 | 180 | #pragma mark Creating CDEvents Objects With a Block 181 | - (id)initWithURLs:(NSArray *)URLs block:(CDEventsEventBlock)block 182 | { 183 | return [self initWithURLs:URLs block:block onRunLoop:[NSRunLoop currentRunLoop]]; 184 | } 185 | 186 | - (id)initWithURLs:(NSArray *)URLs 187 | block:(CDEventsEventBlock)block 188 | onRunLoop:(NSRunLoop *)runLoop 189 | { 190 | return [self initWithURLs:URLs 191 | block:block 192 | onRunLoop:runLoop 193 | sinceEventIdentifier:kCDEventsSinceEventNow 194 | notificationLantency:CD_EVENTS_DEFAULT_NOTIFICATION_LATENCY 195 | ignoreEventsFromSubDirs:CD_EVENTS_DEFAULT_IGNORE_EVENT_FROM_SUB_DIRS 196 | excludeURLs:nil 197 | streamCreationFlags:kCDEventsDefaultEventStreamFlags]; 198 | } 199 | 200 | - (id)initWithURLs:(NSArray *)URLs 201 | block:(CDEventsEventBlock)block 202 | onRunLoop:(NSRunLoop *)runLoop 203 | sinceEventIdentifier:(CDEventIdentifier)sinceEventIdentifier 204 | notificationLantency:(CFTimeInterval)notificationLatency 205 | ignoreEventsFromSubDirs:(BOOL)ignoreEventsFromSubDirs 206 | excludeURLs:(NSArray *)exludeURLs 207 | streamCreationFlags:(CDEventsEventStreamCreationFlags)streamCreationFlags 208 | { 209 | if (block == NULL || URLs == nil || [URLs count] == 0) { 210 | [NSException raise:NSInvalidArgumentException 211 | format:@"Invalid arguments passed to CDEvents init-method."]; 212 | } 213 | 214 | if ((self = [super init])) { 215 | _watchedURLs = [URLs copy]; 216 | _excludedURLs = [exludeURLs copy]; 217 | _eventBlock = block; 218 | 219 | _sinceEventIdentifier = sinceEventIdentifier; 220 | _eventStreamCreationFlags = streamCreationFlags; 221 | 222 | _notificationLatency = notificationLatency; 223 | _ignoreEventsFromSubDirectories = ignoreEventsFromSubDirs; 224 | 225 | _lastEvent = nil; 226 | 227 | [self createEventStream]; 228 | 229 | FSEventStreamScheduleWithRunLoop(_eventStream, 230 | [runLoop getCFRunLoop], 231 | kCFRunLoopDefaultMode); 232 | if (!FSEventStreamStart(_eventStream)) { 233 | [NSException raise:CDEventsEventStreamCreationFailureException 234 | format:@"Failed to create event stream."]; 235 | } 236 | } 237 | 238 | return self; 239 | } 240 | 241 | 242 | #pragma mark NSCopying method 243 | - (id)copyWithZone:(NSZone *)zone 244 | { 245 | CDEvents *copy = [[CDEvents alloc] initWithURLs:[self watchedURLs] 246 | block:[self eventBlock] 247 | onRunLoop:[NSRunLoop currentRunLoop] 248 | sinceEventIdentifier:[self sinceEventIdentifier] 249 | notificationLantency:[self notificationLatency] 250 | ignoreEventsFromSubDirs:[self ignoreEventsFromSubDirectories] 251 | excludeURLs:[self excludedURLs] 252 | streamCreationFlags:_eventStreamCreationFlags]; 253 | 254 | return copy; 255 | } 256 | 257 | #pragma mark Block 258 | - (CDEventsEventBlock)eventBlock 259 | { 260 | return _eventBlock; 261 | } 262 | 263 | 264 | #pragma mark Flush methods 265 | - (void)flushSynchronously 266 | { 267 | FSEventStreamFlushSync(_eventStream); 268 | } 269 | 270 | - (void)flushAsynchronously 271 | { 272 | FSEventStreamFlushAsync(_eventStream); 273 | } 274 | 275 | 276 | #pragma mark Misc methods 277 | - (NSString *)description 278 | { 279 | return [NSString stringWithFormat:@"<%@: %p { watchedURLs = %@ }>", 280 | [self className], 281 | self, 282 | [self watchedURLs]]; 283 | } 284 | 285 | - (NSString *)streamDescription 286 | { 287 | CFStringRef streamDescriptionCF = FSEventStreamCopyDescription(_eventStream); 288 | NSString *returnString = [[NSString alloc] initWithString:(__bridge NSString *)streamDescriptionCF]; 289 | CFRelease(streamDescriptionCF); 290 | 291 | return returnString; 292 | } 293 | 294 | 295 | #pragma mark Private API: 296 | - (void)createEventStream 297 | { 298 | FSEventStreamContext callbackCtx; 299 | callbackCtx.version = 0; 300 | callbackCtx.info = (__bridge void *)self; 301 | callbackCtx.retain = NULL; 302 | callbackCtx.release = NULL; 303 | callbackCtx.copyDescription = NULL; 304 | 305 | NSMutableArray *watchedPaths = [NSMutableArray arrayWithCapacity:[[self watchedURLs] count]]; 306 | for (NSURL *URL in [self watchedURLs]) { 307 | [watchedPaths addObject:[URL path]]; 308 | } 309 | 310 | _eventStream = FSEventStreamCreate(kCFAllocatorDefault, 311 | &CDEventsCallback, 312 | &callbackCtx, 313 | (__bridge CFArrayRef)watchedPaths, 314 | (FSEventStreamEventId)[self sinceEventIdentifier], 315 | [self notificationLatency], 316 | (uint) _eventStreamCreationFlags); 317 | } 318 | 319 | - (void)disposeEventStream 320 | { 321 | if (!(_eventStream)) { 322 | return; 323 | } 324 | 325 | FSEventStreamStop(_eventStream); 326 | FSEventStreamInvalidate(_eventStream); 327 | FSEventStreamRelease(_eventStream); 328 | _eventStream = NULL; 329 | } 330 | 331 | static void CDEventsCallback( 332 | ConstFSEventStreamRef streamRef, 333 | void *callbackCtxInfo, 334 | size_t numEvents, 335 | void *eventPaths, // CFArrayRef 336 | const FSEventStreamEventFlags eventFlags[], 337 | const FSEventStreamEventId eventIds[]) 338 | { 339 | CDEvents *watcher = (__bridge CDEvents *)callbackCtxInfo; 340 | NSArray *eventPathsArray = (__bridge NSArray *)eventPaths; 341 | NSArray *watchedURLs = [watcher watchedURLs]; 342 | NSArray *excludedURLs = [watcher excludedURLs]; 343 | CDEvent *lastEvent = nil; 344 | 345 | for (NSUInteger i = 0; i < numEvents; ++i) { 346 | BOOL shouldIgnore = NO; 347 | FSEventStreamEventFlags flags = eventFlags[i]; 348 | FSEventStreamEventId identifier = eventIds[i]; 349 | 350 | // We do this hackery to ensure that the eventPath string doesn't 351 | // contain any trailing slash. 352 | NSURL *eventURL = [NSURL fileURLWithPath:[[eventPathsArray objectAtIndex:i] stringByStandardizingPath]]; 353 | NSString *eventPath = [eventURL path]; 354 | 355 | // Ignore all events except for the URLs we are explicitly watching. 356 | if ([watcher ignoreEventsFromSubDirectories]) { 357 | shouldIgnore = YES; 358 | for (NSURL *url in watchedURLs) { 359 | if ([[url path] isEqualToString:eventPath]) { 360 | shouldIgnore = NO; 361 | break; 362 | } 363 | } 364 | // Ignore all explicitly excludeded URLs (not required to check if we 365 | // ignore all events from sub-directories). 366 | } else if (excludedURLs != nil) { 367 | for (NSURL *url in excludedURLs) { 368 | if ([eventPath hasPrefix:[url path]]) { 369 | shouldIgnore = YES; 370 | break; 371 | } 372 | } 373 | } 374 | 375 | if (!shouldIgnore) { 376 | CDEvent *event = [[CDEvent alloc] initWithIdentifier:identifier date:[NSDate date] URL:eventURL flags:flags]; 377 | lastEvent = event; 378 | 379 | CDEventsEventBlock eventBlock = [watcher eventBlock]; 380 | eventBlock(watcher, event); 381 | } 382 | } 383 | 384 | if (lastEvent) { 385 | [watcher setLastEvent:lastEvent]; 386 | } 387 | } 388 | 389 | @end 390 | -------------------------------------------------------------------------------- /CDEvent.h: -------------------------------------------------------------------------------- 1 | /** 2 | * CDEvents 3 | * 4 | * Copyright (c) 2010-2013 Aron Cedercrantz 5 | * http://github.com/rastersize/CDEvents/ 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | /** 30 | * @headerfile CDEvent.h CDEvents/CDEvent.h 31 | * A class that wraps the data from a FSEvents event callback. 32 | * 33 | * A class that wraps the data from a FSEvents event callback. Inspired and 34 | * based upon the open source project SCEvents created by Stuart Connolly 35 | * http://stuconnolly.com/projects/code/ 36 | */ 37 | 38 | #import 39 | #import 40 | 41 | #pragma mark - 42 | #pragma mark CDEvent types 43 | /** 44 | * The event identifier type. 45 | * 46 | * @since 1.0.0 47 | */ 48 | typedef FSEventStreamEventId CDEventIdentifier; 49 | 50 | /** 51 | * The event stream event flags type. 52 | * 53 | * @since 1.0.1 54 | */ 55 | typedef FSEventStreamEventFlags CDEventFlags; 56 | 57 | 58 | #pragma mark - 59 | #pragma mark CDEvent interface 60 | /** 61 | * An Objective-C wrapper for a FSEvents event data. 62 | * 63 | * @note Inspired by SCEvent class of the SCEvents project by Stuart Connolly. 64 | * @note The class is immutable. 65 | * 66 | * @see FSEvents.h in CoreServices 67 | * 68 | * @since 1.0.0 69 | */ 70 | @interface CDEvent : NSObject {} 71 | 72 | #pragma mark Properties 73 | /** @name Getting Event Properties */ 74 | /** 75 | * The event identifier. 76 | * 77 | * The event identifier as returned by FSEvents. 78 | * 79 | * @return The event identifier. 80 | * 81 | * @since 1.0.0 82 | */ 83 | @property (readonly) CDEventIdentifier identifier; 84 | 85 | /** 86 | * An approximate date and time the event occured. 87 | * 88 | * @return The approximate date and time the event occured. 89 | * 90 | * @since 1.0.0 91 | */ 92 | @property (strong, readonly) NSDate *date; 93 | 94 | /** 95 | * The URL of the item which changed. 96 | * 97 | * @return The URL of the item which changed. 98 | * 99 | * @since 1.0.0 100 | */ 101 | @property (strong, readonly) NSURL *URL; 102 | 103 | 104 | /** @name Getting Event Flags */ 105 | /** 106 | * The flags of the event. 107 | * 108 | * The flags of the event as returned by FSEvents. 109 | * 110 | * @return The flags of the event. 111 | * 112 | * @see FSEventStreamEventFlags 113 | * 114 | * @since 1.0.0 115 | */ 116 | @property (readonly) CDEventFlags flags; 117 | 118 | #pragma mark Specific flag properties 119 | /** 120 | * Wheter there was some change in the directory at the specific path supplied in this event. 121 | * 122 | * @return YES if there was some change in the directory, otherwise NO. 123 | * 124 | * @see kFSEventStreamEventFlagNone 125 | * @see flags 126 | * @see mustRescanSubDirectories 127 | * @see isUserDropped 128 | * @see isKernelDropped 129 | * @see isEventIdentifiersWrapped 130 | * @see isHistoryDone 131 | * @see isRootChanged 132 | * @see didVolumeMount 133 | * @see didVolumeUnmount 134 | * 135 | * @since 1.1.0 136 | */ 137 | @property (readonly) BOOL isGenericChange; 138 | 139 | /** 140 | * Wheter you must rescan the whole URL including its children. 141 | * 142 | * Wheter your application must rescan not just the URL given in the event, but 143 | * all its children, recursively. This can happen if there was a problem whereby 144 | * events were coalesced hierarchically. For example, an event in 145 | * /Users/jsmith/Music and an event in 146 | * /Users/jsmith/Pictures might be coalesced into an event with 147 | * this flag set and URL = /Users/jsmith. If this flag is set 148 | * you may be able to get an idea of whether the bottleneck happened in the 149 | * kernel (less likely) or in your client (more likely) by checking if 150 | * isUserDropped or isKernelDropped returns YES. 151 | * 152 | * @return YES if you must rescan the whole directory including its children, otherwise NO. 153 | * 154 | * @see kFSEventStreamEventFlagMustScanSubDirs 155 | * @see flags 156 | * @see isGenericChange 157 | * @see isUserDropped 158 | * @see isKernelDropped 159 | * @see isEventIdentifiersWrapped 160 | * @see isHistoryDone 161 | * @see isRootChanged 162 | * @see didVolumeMount 163 | * @see didVolumeUnmount 164 | * 165 | * @since 1.1.0 166 | */ 167 | @property (readonly) BOOL mustRescanSubDirectories; 168 | 169 | /** 170 | * Provides some information as to what might have caused the need to rescan the URL including its children. 171 | * 172 | * @return YES if mustRescanSubDirectories returns YES and the cause were in userland, otherwise NO. 173 | * 174 | * @see kFSEventStreamEventFlagUserDropped 175 | * @see flags 176 | * @see isGenericChange 177 | * @see mustRescanSubDirectories 178 | * @see isKernelDropped 179 | * @see isEventIdentifiersWrapped 180 | * @see isHistoryDone 181 | * @see isRootChanged 182 | * @see didVolumeMount 183 | * @see didVolumeUnmount 184 | * 185 | * @since 1.1.0 186 | */ 187 | @property (readonly) BOOL isUserDropped; 188 | 189 | /** 190 | * Provides some information as to what might have caused the need to rescan the URL including its children. 191 | * 192 | * @return YES if mustRescanSubDirectories returns YES and the cause were in kernelspace, otherwise NO. 193 | * 194 | * @see kFSEventStreamEventFlagKernelDropped 195 | * @see flags 196 | * @see isGenericChange 197 | * @see mustRescanSubDirectories 198 | * @see isUserDropped 199 | * @see isEventIdentifiersWrapped 200 | * @see isHistoryDone 201 | * @see isRootChanged 202 | * @see didVolumeMount 203 | * @see didVolumeUnmount 204 | * 205 | * @since 1.1.0 206 | */ 207 | @property (readonly) BOOL isKernelDropped; 208 | 209 | /** 210 | * Wheter the 64-bit event identifier counter has wrapped around. 211 | * 212 | * Wheter the 64-bit event identifier counter has wrapped around. As a result, 213 | * previously-issued event identifiers are no longer valid arguments for the 214 | * sinceEventIdentifier parameter of the CDEvents init methods. 215 | * 216 | * @return YES if the 64-bit event identifier counter has wrapped around, otherwise NO. 217 | * 218 | * @see kFSEventStreamEventFlagEventIdsWrapped 219 | * @see flags 220 | * @see isGenericChange 221 | * @see mustRescanSubDirectories 222 | * @see isUserDropped 223 | * @see isKernelDropped 224 | * @see isHistoryDone 225 | * @see isRootChanged 226 | * @see didVolumeMount 227 | * @see didVolumeUnmount 228 | * 229 | * @since 1.1.0 230 | */ 231 | @property (readonly) BOOL isEventIdentifiersWrapped; 232 | 233 | /** 234 | * Denotes a sentinel event sent to mark the end of the "historical" events sent. 235 | * 236 | * Denotes a sentinel event sent to mark the end of the "historical" events sent 237 | * as a result of specifying a sinceEventIdentifier argument other than 238 | * kCDEventsSinceEventNow with the CDEvents init methods. 239 | * 240 | * @return YES if if the event is sent to mark the end of the "historical" events sent, otherwise NO. 241 | * 242 | * @see kFSEventStreamEventFlagHistoryDone 243 | * @see flags 244 | * @see isGenericChange 245 | * @see mustRescanSubDirectories 246 | * @see isUserDropped 247 | * @see isKernelDropped 248 | * @see isEventIdentifiersWrapped 249 | * @see isRootChanged 250 | * @see didVolumeMount 251 | * @see didVolumeUnmount 252 | * @see kCDEventsSinceEventNow 253 | * @see CDEvents 254 | * 255 | * @since 1.1.0 256 | */ 257 | @property (readonly) BOOL isHistoryDone; 258 | 259 | /** 260 | * Denotes a special event sent when there is a change to one of the URLs you asked to watch. 261 | * 262 | * Denotes a special event sent when there is a change to one of the URLs you 263 | * asked to watch. When this method returns YES, the event 264 | * identifier is zero and the URL corresponds to one of the URLs 265 | * you asked to watch (specifically, the one that changed). The URL may no 266 | * longer exist because it or one of its parents was deleted or renamed. Events 267 | * with this flag set will only be sent if you passed the flag 268 | * kFSEventStreamCreateFlagWatchRoot to the CDEvents. 269 | * 270 | * @return YES if there is a change to one of the URLs you asked to watch, otherwise NO. 271 | * 272 | * @see kFSEventStreamEventFlagRootChanged 273 | * @see flags 274 | * @see isGenericChange 275 | * @see mustRescanSubDirectories 276 | * @see isUserDropped 277 | * @see isKernelDropped 278 | * @see isEventIdentifiersWrapped 279 | * @see isHistoryDone 280 | * @see didVolumeMount 281 | * @see didVolumeUnmount 282 | * @see CDEvents 283 | * @see kCDEventsDefaultEventStreamFlags 284 | * 285 | * @since 1.1.0 286 | */ 287 | @property (readonly) BOOL isRootChanged; 288 | 289 | /** 290 | * Denotes a special event sent when a volume is mounted underneath one of the URLs being watched. 291 | * 292 | * Denotes a special event sent when a volume is mounted underneath one of the 293 | * URLs being watched. The URL in the event is the URL to the newly-mounted 294 | * volume. You will receive one of these notifications for every volume mount 295 | * event inside the kernel (independent of DiskArbitration). Beware that a 296 | * newly-mounted volume could contain an arbitrarily large directory hierarchy. 297 | * Avoid pitfalls like triggering a recursive scan of a non-local filesystem, 298 | * which you can detect by checking for the absence of the 299 | * MNT_LOCAL flag in the f_flags returned by statfs(). 300 | * Also be aware of the MNT_DONTBROWSE flag that is set for volumes 301 | * which should not be displayed by user interface elements. 302 | * 303 | * @return YES if a volumen is mounted underneath one of the URLs being watched, otherwise NO. 304 | * 305 | * @see kFSEventStreamEventFlagMount 306 | * @see flags 307 | * @see isGenericChange 308 | * @see mustRescanSubDirectories 309 | * @see isUserDropped 310 | * @see isKernelDropped 311 | * @see isEventIdentifiersWrapped 312 | * @see isHistoryDone 313 | * @see isRootChanged 314 | * @see didVolumeUnmount 315 | * 316 | * @since 1.1.0 317 | */ 318 | @property (readonly) BOOL didVolumeMount; 319 | 320 | /** 321 | * Denotes a special event sent when a volume is unmounted underneath one of the URLs being watched. 322 | * 323 | * Denotes a special event sent when a volume is unmounted underneath one of the 324 | * URLs being watched. The URL in the event is the URL to the directory from 325 | * which the volume was unmounted. You will receive one of these notifications 326 | * for every volume unmount event inside the kernel. This is not a substitute 327 | * for the notifications provided by the DiskArbitration framework; you only get 328 | * notified after the unmount has occurred. Beware that unmounting a volume 329 | * could uncover an arbitrarily large directory hierarchy, although Mac OS X 330 | * never does that. 331 | * 332 | * @return YES if a volume is unmounted underneath one of the URLs being watched, otherwise NO. 333 | * 334 | * @see kFSEventStreamEventFlagUnmount 335 | * @see flags 336 | * @see isGenericChange 337 | * @see mustRescanSubDirectories 338 | * @see isUserDropped 339 | * @see isKernelDropped 340 | * @see isEventIdentifiersWrapped 341 | * @see isHistoryDone 342 | * @see isRootChanged 343 | * @see didVolumeMount 344 | * 345 | * @since 1.1.0 346 | */ 347 | @property (readonly) BOOL didVolumeUnmount; 348 | 349 | 350 | /** 351 | * The entirety of the documentation on file level events in lion is 3 sentences 352 | * long. Rename behavior is odd, making the combination of events and flags 353 | * somewhat confusing for atomic writes. It also appears possible to get a 354 | * singular event where a file has been created, modified, and removed. 355 | */ 356 | @property (readonly) BOOL isCreated; 357 | @property (readonly) BOOL isRemoved; 358 | @property (readonly) BOOL isInodeMetadataModified; 359 | @property (readonly) BOOL isRenamed; 360 | @property (readonly) BOOL isModified; 361 | @property (readonly) BOOL isFinderInfoModified; 362 | @property (readonly) BOOL didChangeOwner; 363 | @property (readonly) BOOL isXattrModified; 364 | @property (readonly) BOOL isFile; 365 | @property (readonly) BOOL isDir; 366 | @property (readonly) BOOL isSymlink; 367 | 368 | #pragma mark Class object creators 369 | /** @name Creating CDEvent Objects */ 370 | /** 371 | * Returns an CDEvent created with the given identifier, date, URL and flags. 372 | * 373 | * @param identifier The identifier of the the event. 374 | * @param date The date when the event occured. 375 | * @param URL The URL of the item the event concerns. 376 | * @param flags The flags of the event. 377 | * @return An CDEvent created with the given identifier, date, URL and flags. 378 | * 379 | * @see FSEventStreamEventFlags 380 | * @see initWithIdentifier:date:URL:flags: 381 | * 382 | * @since 1.0.0 383 | */ 384 | + (CDEvent *)eventWithIdentifier:(NSUInteger)identifier 385 | date:(NSDate *)date 386 | URL:(NSURL *)URL 387 | flags:(CDEventFlags)flags; 388 | 389 | #pragma mark Init methods 390 | /** 391 | * Returns an CDEvent object initialized with the given identifier, date, URL and flags. 392 | * 393 | * @param identifier The identifier of the the event. 394 | * @param date The date when the event occured. 395 | * @param URL The URL of the item the event concerns. 396 | * @param flags The flags of the event. 397 | * @return An CDEvent object initialized with the given identifier, date, URL and flags. 398 | * @see FSEventStreamEventFlags 399 | * @see eventWithIdentifier:date:URL:flags: 400 | * 401 | * @since 1.0.0 402 | */ 403 | - (id)initWithIdentifier:(NSUInteger)identifier 404 | date:(NSDate *)date 405 | URL:(NSURL *)URL 406 | flags:(CDEventFlags)flags; 407 | 408 | @end 409 | -------------------------------------------------------------------------------- /CDEvents.h: -------------------------------------------------------------------------------- 1 | /** 2 | * CDEvents 3 | * 4 | * Copyright (c) 2010-2013 Aron Cedercrantz 5 | * http://github.com/rastersize/CDEvents/ 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | /** 30 | * @headerfile CDEvents.h CDEvents/CDEvents.h 31 | * A class that wraps the FSEvents C API. 32 | * 33 | * A class that wraps the FSEvents C API. Inspired and based 34 | * upon the open source project SCEvents created by Stuart Connolly 35 | * http://stuconnolly.com/projects/code/ 36 | */ 37 | 38 | #import 39 | #import 40 | 41 | #import "CDEvent.h" 42 | 43 | @protocol CDEventsDelegate; 44 | 45 | 46 | #pragma mark - 47 | #pragma mark CDEvents types 48 | /** 49 | * The event stream creation flags type. 50 | * 51 | * @since 1.0.2 52 | */ 53 | typedef FSEventStreamCreateFlags CDEventsEventStreamCreationFlags; 54 | 55 | 56 | #pragma mark - 57 | #pragma mark CDEvents custom exceptions 58 | /** 59 | * The exception raised if CDEvents failed to create the event stream. 60 | * 61 | * @since 1.0.0 62 | */ 63 | extern NSString *const CDEventsEventStreamCreationFailureException; 64 | 65 | 66 | #pragma mark - 67 | #pragma mark Default values 68 | /** 69 | * The default notificaion latency. 70 | * 71 | * @since 1.0.0 72 | */ 73 | #define CD_EVENTS_DEFAULT_NOTIFICATION_LATENCY ((NSTimeInterval)3.0) 74 | 75 | /** 76 | * The default value whether events from sub directories should be ignored or not. 77 | * 78 | * @since 1.0.0 79 | */ 80 | #define CD_EVENTS_DEFAULT_IGNORE_EVENT_FROM_SUB_DIRS NO 81 | 82 | /** 83 | * The default event stream creation flags. 84 | * 85 | * @since 1.0.0 86 | */ 87 | extern const CDEventsEventStreamCreationFlags kCDEventsDefaultEventStreamFlags; 88 | 89 | /** 90 | * Use this to get all event since now when initializing a CDEvents object. 91 | * 92 | * @since 1.1.0 93 | */ 94 | extern const CDEventIdentifier kCDEventsSinceEventNow; 95 | 96 | 97 | #pragma mark - 98 | #pragma mark CDEvents Block Type 99 | @class CDEvents; 100 | /** 101 | * Type of the block which gets called when an event occurs. 102 | * 103 | * @since head 104 | */ 105 | typedef void (^CDEventsEventBlock)(CDEvents *watcher, CDEvent *event); 106 | 107 | 108 | #pragma mark - 109 | #pragma mark CDEvents interface 110 | /** 111 | * An Objective-C wrapper for the FSEvents C API. 112 | * 113 | * @note Inspired by SCEvents class of the SCEvents project by Stuart Connolly. 114 | * 115 | * @see FSEvents.h in CoreServices 116 | * 117 | * @since 1.0.0 118 | */ 119 | @interface CDEvents : NSObject {} 120 | 121 | #pragma mark Properties 122 | /** @name Managing the Delegate */ 123 | /** 124 | * The delegate object the CDEvents object calls when it recieves an event. 125 | * 126 | * @param delegate Delegate for the events object. nil removes the delegate. 127 | * @return The events's delegate. 128 | * 129 | * @see CDEventsDelegate 130 | * 131 | * @since 1.0.0 132 | */ 133 | @property (unsafe_unretained) id delegate; 134 | 135 | /** @name Getting Event Block */ 136 | /** 137 | * The event block. 138 | * 139 | * @return The CDEventsEventBlock block which is executed when an event occurs. 140 | * 141 | * @since head 142 | */ 143 | @property (readonly) CDEventsEventBlock eventBlock; 144 | 145 | /** @name Getting Event Watcher Properties */ 146 | /** 147 | * The (approximate) time intervall between notifications sent to the delegate. 148 | * 149 | * @return The time intervall between notifications. 150 | * 151 | * @since 1.0.0 152 | */ 153 | @property (readonly) CFTimeInterval notificationLatency; 154 | 155 | /** 156 | * The event identifier from which events will be supplied to the delegate. 157 | * 158 | * @return The event identifier from which events will be supplied to the delegate. 159 | * 160 | * @since 1.0.0 161 | */ 162 | @property (readonly) CDEventIdentifier sinceEventIdentifier; 163 | 164 | /** 165 | * The last event that occured and has been delivered to the delegate. 166 | * 167 | * @return The last event that occured and has been delivered to the delegate. 168 | * 169 | * @since 1.0.0 170 | */ 171 | @property (strong, readonly) CDEvent *lastEvent; 172 | 173 | /** 174 | * The URLs that we watch for events. 175 | * 176 | * @return An array of NSURL object for the URLs which we watch for events. 177 | * 178 | * @since 1.0.0 179 | */ 180 | @property (copy, readonly) NSArray *watchedURLs; 181 | 182 | 183 | /** @name Configuring the Event watcher */ 184 | /** 185 | * The URLs that we should ignore events from. 186 | * 187 | * @return An array of NSURL object for the URLs which we want to ignore. 188 | * @discussion Events from concerning these URLs and there sub-directories will not be delivered to the delegate. 189 | * 190 | * @since 1.0.0 191 | */ 192 | @property (copy) NSArray *excludedURLs; 193 | 194 | /** 195 | * Wheter events from sub-directories of the watched URLs should be ignored or not. 196 | * 197 | * @param flag Wheter events from sub-directories of the watched URLs shouled be ignored or not. 198 | * @return YES if events from sub-directories should be ignored, otherwise NO. 199 | * 200 | * @since 1.0.0 201 | */ 202 | @property (assign) BOOL ignoreEventsFromSubDirectories; 203 | 204 | 205 | #pragma mark Event identifier class methods 206 | /** @name Current Event Identifier */ 207 | /** 208 | * The current event identifier. 209 | * 210 | * @return The current event identifier. 211 | * 212 | * @see FSEventsGetCurrentEventId(void) 213 | * 214 | * @since 1.0.0 215 | */ 216 | + (CDEventIdentifier)currentEventIdentifier; 217 | 218 | 219 | #pragma mark Creating CDEvents Objects With a Delegate 220 | /** @name Creating CDEvents Objects With a Delegate */ 221 | /** 222 | * Returns an CDEvents object initialized with the given URLs to watch. 223 | * 224 | * @param URLs An array of URLs we want to watch. 225 | * @param delegate The delegate object the CDEvents object calls when it recieves an event. 226 | * @return An CDEvents object initialized with the given URLs to watch. 227 | * @throws NSInvalidArgumentException if URLs is empty or points to nil. 228 | * @throws NSInvalidArgumentException if delegateis nil. 229 | * @throws CDEventsEventStreamCreationFailureException if we failed to create a event stream. 230 | * 231 | * @see initWithURLs:delegate:onRunLoop: 232 | * @see initWithURLs:delegate:onRunLoop:sinceEventIdentifier:notificationLantency:ignoreEventsFromSubDirs:excludeURLs:streamCreationFlags: 233 | * @see CDEventsDelegate 234 | * @see kCDEventsDefaultEventStreamFlags 235 | * @see kCDEventsSinceEventNow 236 | * 237 | * @discussion Calls initWithURLs:delegate:onRunLoop:sinceEventIdentifier:notificationLantency:ignoreEventsFromSubDirs:excludeURLs:streamCreationFlags: 238 | * with sinceEventIdentifier with the event identifier for "event 239 | * since now", notificationLatency set to 3.0 seconds, 240 | * ignoreEventsFromSubDirectories set to NO, 241 | * excludedURLs to nil, the event stream creation 242 | * flags will be set to kCDEventsDefaultEventStreamFlags and 243 | * schedueled on the current run loop. 244 | * 245 | * @since 1.0.0 246 | */ 247 | - (id)initWithURLs:(NSArray *)URLs delegate:(id)delegate; 248 | 249 | /** 250 | * Returns an CDEvents object initialized with the given URLs to watch and schedules the watcher on the given run loop. 251 | * 252 | * @param URLs An array of URLs we want to watch. 253 | * @param delegate The delegate object the CDEvents object calls when it recieves an event. 254 | * @param runLoop The run loop which the which the watcher should be schedueled on. 255 | * @return An CDEvents object initialized with the given URLs to watch. 256 | * @throws NSInvalidArgumentException if URLs is empty or points to nil. 257 | * @throws NSInvalidArgumentException if delegateis nil. 258 | * @throws CDEventsEventStreamCreationFailureException if we failed to create a event stream. 259 | * 260 | * @see initWithURLs:delegate: 261 | * @see initWithURLs:delegate:onRunLoop:sinceEventIdentifier:notificationLantency:ignoreEventsFromSubDirs:excludeURLs:streamCreationFlags: 262 | * @see CDEventsDelegate 263 | * @see kCDEventsDefaultEventStreamFlags 264 | * @see kCDEventsSinceEventNow 265 | * 266 | * @discussion Calls initWithURLs:delegate:onRunLoop:sinceEventIdentifier:notificationLantency:ignoreEventsFromSubDirs:excludeURLs:streamCreationFlags: 267 | * with sinceEventIdentifier with the event identifier for "event 268 | * since now", notificationLatency set to 3.0 seconds, 269 | * ignoreEventsFromSubDirectories set to NO, 270 | * excludedURLs to nil and the event stream creation 271 | * flags will be set to kCDEventsDefaultEventStreamFlags. 272 | * 273 | * @since 1.0.0 274 | */ 275 | - (id)initWithURLs:(NSArray *)URLs 276 | delegate:(id)delegate 277 | onRunLoop:(NSRunLoop *)runLoop; 278 | 279 | /** 280 | * Returns an CDEvents object initialized with the given URLs to watch, URLs to exclude, whether events from sub-directories are ignored or not and schedules the watcher on the given run loop. 281 | * 282 | * @param URLs An array of URLs (NSURL) we want to watch. 283 | * @param delegate The delegate object the CDEvents object calls when it recieves an event. 284 | * @param runLoop The run loop which the which the watcher should be schedueled on. 285 | * @param sinceEventIdentifier Events that have happened after the given event identifier will be supplied. 286 | * @param notificationLatency The (approximate) time intervall between notifications sent to the delegate. 287 | * @param ignoreEventsFromSubDirs Wheter events from sub-directories of the watched URLs should be ignored or not. 288 | * @param exludeURLs An array of URLs that we should ignore events from. Pass nil if none should be excluded. 289 | * @param streamCreationFlags The event stream creation flags. 290 | * @return An CDEvents object initialized with the given URLs to watch, URLs to exclude, whether events from sub-directories are ignored or not and run on the given run loop. 291 | * @throws NSInvalidArgumentException if the parameter URLs is empty or points to nil. 292 | * @throws NSInvalidArgumentException if delegateis nil. 293 | * @throws CDEventsEventStreamCreationFailureException if we failed to create a event stream. 294 | * 295 | * @see initWithURLs:delegate: 296 | * @see initWithURLs:delegate:onRunLoop: 297 | * @see ignoreEventsFromSubDirectories 298 | * @see excludedURLs 299 | * @see CDEventsDelegate 300 | * @see FSEventStreamCreateFlags 301 | * 302 | * @discussion To ask for events "since now" pass the return value of 303 | * currentEventIdentifier as the parameter sinceEventIdentifier. 304 | * CDEventStreamCreationFailureException should be extremely rare. 305 | * 306 | * @since 1.0.0 307 | */ 308 | - (id)initWithURLs:(NSArray *)URLs 309 | delegate:(id)delegate 310 | onRunLoop:(NSRunLoop *)runLoop 311 | sinceEventIdentifier:(CDEventIdentifier)sinceEventIdentifier 312 | notificationLantency:(CFTimeInterval)notificationLatency 313 | ignoreEventsFromSubDirs:(BOOL)ignoreEventsFromSubDirs 314 | excludeURLs:(NSArray *)exludeURLs 315 | streamCreationFlags:(CDEventsEventStreamCreationFlags)streamCreationFlags; 316 | 317 | #pragma mark Creating CDEvents Objects With a Block 318 | /** @name Creating CDEvents Objects With a Block */ 319 | /** 320 | * Returns an CDEvents object initialized with the given URLs to watch. 321 | * 322 | * @param URLs An array of URLs we want to watch. 323 | * @param block The block which the CDEvents object executes when it recieves an event. 324 | * @return An CDEvents object initialized with the given URLs to watch. 325 | * @throws NSInvalidArgumentException if URLs is empty or points to nil. 326 | * @throws NSInvalidArgumentException if delegateis nil. 327 | * @throws CDEventsEventStreamCreationFailureException if we failed to create a event stream. 328 | * 329 | * @see initWithURLs:delegate:onRunLoop: 330 | * @see initWithURLs:delegate:onRunLoop:sinceEventIdentifier:notificationLantency:ignoreEventsFromSubDirs:excludeURLs:streamCreationFlags: 331 | * @see CDEventsEventBlock 332 | * @see kCDEventsDefaultEventStreamFlags 333 | * @see kCDEventsSinceEventNow 334 | * 335 | * @discussion Calls initWithURLs:block:onRunLoop:sinceEventIdentifier:notificationLantency:ignoreEventsFromSubDirs:excludeURLs:streamCreationFlags: 336 | * with sinceEventIdentifier with the event identifier for "event 337 | * since now", notificationLatency set to 3.0 seconds, 338 | * ignoreEventsFromSubDirectories set to NO, 339 | * excludedURLs to nil, the event stream creation 340 | * flags will be set to kCDEventsDefaultEventStreamFlags and 341 | * schedueled on the current run loop. 342 | * 343 | * @since head 344 | */ 345 | - (id)initWithURLs:(NSArray *)URLs block:(CDEventsEventBlock)block; 346 | 347 | /** 348 | * Returns an CDEvents object initialized with the given URLs to watch and schedules the watcher on the given run loop. 349 | * 350 | * @param URLs An array of URLs we want to watch. 351 | * @param block The block which the CDEvents object executes when it recieves an event. 352 | * @param runLoop The run loop which the which the watcher should be schedueled on. 353 | * @return An CDEvents object initialized with the given URLs to watch. 354 | * @throws NSInvalidArgumentException if URLs is empty or points to nil. 355 | * @throws NSInvalidArgumentException if delegateis nil. 356 | * @throws CDEventsEventStreamCreationFailureException if we failed to create a event stream. 357 | * 358 | * @see initWithURLs:delegate: 359 | * @see initWithURLs:delegate:onRunLoop:sinceEventIdentifier:notificationLantency:ignoreEventsFromSubDirs:excludeURLs:streamCreationFlags: 360 | * @see CDEventsEventBlock 361 | * @see kCDEventsDefaultEventStreamFlags 362 | * @see kCDEventsSinceEventNow 363 | * 364 | * @discussion Calls initWithURLs:delegate:onRunLoop:sinceEventIdentifier:notificationLantency:ignoreEventsFromSubDirs:excludeURLs:streamCreationFlags: 365 | * with sinceEventIdentifier with the event identifier for "event 366 | * since now", notificationLatency set to 3.0 seconds, 367 | * ignoreEventsFromSubDirectories set to NO, 368 | * excludedURLs to nil and the event stream creation 369 | * flags will be set to kCDEventsDefaultEventStreamFlags. 370 | * 371 | * @since head 372 | */ 373 | - (id)initWithURLs:(NSArray *)URLs 374 | block:(CDEventsEventBlock)block 375 | onRunLoop:(NSRunLoop *)runLoop; 376 | 377 | /** 378 | * Returns an CDEvents object initialized with the given URLs to watch, URLs to exclude, whether events from sub-directories are ignored or not and schedules the watcher on the given run loop. 379 | * 380 | * @param URLs An array of URLs (NSURL) we want to watch. 381 | * @param block The block which the CDEvents object executes when it recieves an event. 382 | * @param runLoop The run loop which the which the watcher should be schedueled on. 383 | * @param sinceEventIdentifier Events that have happened after the given event identifier will be supplied. 384 | * @param notificationLatency The (approximate) time intervall between notifications sent to the delegate. 385 | * @param ignoreEventsFromSubDirs Wheter events from sub-directories of the watched URLs should be ignored or not. 386 | * @param exludeURLs An array of URLs that we should ignore events from. Pass nil if none should be excluded. 387 | * @param streamCreationFlags The event stream creation flags. 388 | * @return An CDEvents object initialized with the given URLs to watch, URLs to exclude, whether events from sub-directories are ignored or not and run on the given run loop. 389 | * @throws NSInvalidArgumentException if the parameter URLs is empty or points to nil. 390 | * @throws NSInvalidArgumentException if delegateis nil. 391 | * @throws CDEventsEventStreamCreationFailureException if we failed to create a event stream. 392 | * 393 | * @see initWithURLs:delegate: 394 | * @see initWithURLs:delegate:onRunLoop: 395 | * @see ignoreEventsFromSubDirectories 396 | * @see excludedURLs 397 | * @see CDEventsEventBlock 398 | * @see FSEventStreamCreateFlags 399 | * 400 | * @discussion To ask for events "since now" pass the return value of 401 | * currentEventIdentifier as the parameter sinceEventIdentifier. 402 | * CDEventStreamCreationFailureException should be extremely rare. 403 | * 404 | * @since head 405 | */ 406 | - (id)initWithURLs:(NSArray *)URLs 407 | block:(CDEventsEventBlock)block 408 | onRunLoop:(NSRunLoop *)runLoop 409 | sinceEventIdentifier:(CDEventIdentifier)sinceEventIdentifier 410 | notificationLantency:(CFTimeInterval)notificationLatency 411 | ignoreEventsFromSubDirs:(BOOL)ignoreEventsFromSubDirs 412 | excludeURLs:(NSArray *)exludeURLs 413 | streamCreationFlags:(CDEventsEventStreamCreationFlags)streamCreationFlags; 414 | 415 | #pragma mark Flush methods 416 | /** @name Flushing Events */ 417 | /** 418 | * Flushes the event stream synchronously. 419 | * 420 | * Flushes the event stream synchronously by sending events that have already occurred but not yet delivered. 421 | * 422 | * @see flushAsynchronously 423 | * 424 | * @since 1.0.0 425 | */ 426 | - (void)flushSynchronously; 427 | 428 | /** 429 | * Flushes the event stream asynchronously. 430 | * 431 | * Flushes the event stream asynchronously by sending events that have already occurred but not yet delivered. 432 | * 433 | * @see flushSynchronously 434 | * 435 | * @since 1.0.0 436 | */ 437 | - (void)flushAsynchronously; 438 | 439 | #pragma mark Misc methods 440 | /** @name Events Description */ 441 | /** 442 | * Returns a NSString containing the description of the current event stream. 443 | * 444 | * @return A NSString containing the description of the current event stream. 445 | * 446 | * @see FSEventStreamCopyDescription 447 | * 448 | * @discussion For debugging only. 449 | * 450 | * @since 1.0.0 451 | */ 452 | - (NSString *)streamDescription; 453 | 454 | @end 455 | -------------------------------------------------------------------------------- /CDEvents.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 6A05775A1400F49900BF73C4 /* compat.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A0577591400F49900BF73C4 /* compat.h */; }; 11 | 8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; }; 12 | 9C6D03031166AFFA00343E46 /* CDEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C6D03011166AFFA00343E46 /* CDEvent.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | 9C6D03041166AFFA00343E46 /* CDEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C6D03021166AFFA00343E46 /* CDEvent.m */; }; 14 | 9C6D033D1166B32000343E46 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C6D033C1166B32000343E46 /* Foundation.framework */; }; 15 | 9C6D04451166B35700343E46 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C6D04441166B35700343E46 /* CoreServices.framework */; }; 16 | 9C6D051D1166BD5800343E46 /* CDEventsDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C6D051C1166BD5800343E46 /* CDEventsDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 17 | 9C6D05241166BF5300343E46 /* CDEvents.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C6D05221166BF5300343E46 /* CDEvents.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18 | 9C6D05251166BF5300343E46 /* CDEvents.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C6D05231166BF5300343E46 /* CDEvents.m */; }; 19 | 9C6D06851167CC8600343E46 /* CDEvents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* CDEvents.framework */; }; 20 | 9C6D06881167CCBD00343E46 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C6D06871167CCBD00343E46 /* main.m */; }; 21 | 9C6D06B01167CE2000343E46 /* CDEventsTestAppController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C6D06AF1167CE2000343E46 /* CDEventsTestAppController.m */; }; 22 | 9C6D06B91167CE8C00343E46 /* CDEvents.framework in Copy Bundle Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* CDEvents.framework */; }; 23 | /* End PBXBuildFile section */ 24 | 25 | /* Begin PBXContainerItemProxy section */ 26 | 9C6D06831167CC8300343E46 /* PBXContainerItemProxy */ = { 27 | isa = PBXContainerItemProxy; 28 | containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; 29 | proxyType = 1; 30 | remoteGlobalIDString = 8DC2EF4F0486A6940098B216; 31 | remoteInfo = CDEvents; 32 | }; 33 | /* End PBXContainerItemProxy section */ 34 | 35 | /* Begin PBXCopyFilesBuildPhase section */ 36 | 9C6D06BD1167CEAA00343E46 /* Copy Bundle Frameworks */ = { 37 | isa = PBXCopyFilesBuildPhase; 38 | buildActionMask = 2147483647; 39 | dstPath = ""; 40 | dstSubfolderSpec = 10; 41 | files = ( 42 | 9C6D06B91167CE8C00343E46 /* CDEvents.framework in Copy Bundle Frameworks */, 43 | ); 44 | name = "Copy Bundle Frameworks"; 45 | runOnlyForDeploymentPostprocessing = 0; 46 | }; 47 | /* End PBXCopyFilesBuildPhase section */ 48 | 49 | /* Begin PBXFileReference section */ 50 | 0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 51 | 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 52 | 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 53 | 32DBCF5E0370ADEE00C91783 /* CDEvents_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDEvents_Prefix.pch; sourceTree = ""; }; 54 | 6A0577591400F49900BF73C4 /* compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compat.h; sourceTree = ""; }; 55 | 8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 56 | 8DC2EF5B0486A6940098B216 /* CDEvents.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CDEvents.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 57 | 9C6D03011166AFFA00343E46 /* CDEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDEvent.h; sourceTree = ""; }; 58 | 9C6D03021166AFFA00343E46 /* CDEvent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDEvent.m; sourceTree = ""; }; 59 | 9C6D033C1166B32000343E46 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 60 | 9C6D04441166B35700343E46 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; }; 61 | 9C6D051C1166BD5800343E46 /* CDEventsDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDEventsDelegate.h; sourceTree = ""; }; 62 | 9C6D05221166BF5300343E46 /* CDEvents.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDEvents.h; sourceTree = ""; }; 63 | 9C6D05231166BF5300343E46 /* CDEvents.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDEvents.m; sourceTree = ""; }; 64 | 9C6D067D1167CC7400343E46 /* CDEventsTestApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CDEventsTestApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 65 | 9C6D067F1167CC7400343E46 /* CDEventsTestApp-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CDEventsTestApp-Info.plist"; sourceTree = ""; }; 66 | 9C6D06871167CCBD00343E46 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 67 | 9C6D06AE1167CE2000343E46 /* CDEventsTestAppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDEventsTestAppController.h; sourceTree = ""; }; 68 | 9C6D06AF1167CE2000343E46 /* CDEventsTestAppController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDEventsTestAppController.m; sourceTree = ""; }; 69 | D2F7E79907B2D74100F64583 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; 70 | /* End PBXFileReference section */ 71 | 72 | /* Begin PBXFrameworksBuildPhase section */ 73 | 8DC2EF560486A6940098B216 /* Frameworks */ = { 74 | isa = PBXFrameworksBuildPhase; 75 | buildActionMask = 2147483647; 76 | files = ( 77 | 9C6D033D1166B32000343E46 /* Foundation.framework in Frameworks */, 78 | 9C6D04451166B35700343E46 /* CoreServices.framework in Frameworks */, 79 | ); 80 | runOnlyForDeploymentPostprocessing = 0; 81 | }; 82 | 9C6D067B1167CC7400343E46 /* Frameworks */ = { 83 | isa = PBXFrameworksBuildPhase; 84 | buildActionMask = 2147483647; 85 | files = ( 86 | 9C6D06851167CC8600343E46 /* CDEvents.framework in Frameworks */, 87 | ); 88 | runOnlyForDeploymentPostprocessing = 0; 89 | }; 90 | /* End PBXFrameworksBuildPhase section */ 91 | 92 | /* Begin PBXGroup section */ 93 | 034768DFFF38A50411DB9C8B /* Products */ = { 94 | isa = PBXGroup; 95 | children = ( 96 | 8DC2EF5B0486A6940098B216 /* CDEvents.framework */, 97 | 9C6D067D1167CC7400343E46 /* CDEventsTestApp.app */, 98 | ); 99 | name = Products; 100 | sourceTree = ""; 101 | }; 102 | 0867D691FE84028FC02AAC07 /* CDEvents */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | 08FB77AEFE84172EC02AAC07 /* Classes */, 106 | 32C88DFF0371C24200C91783 /* Other Sources */, 107 | 089C1665FE841158C02AAC07 /* Resources */, 108 | 9C6D06861167CC8E00343E46 /* TestApp */, 109 | 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, 110 | 034768DFFF38A50411DB9C8B /* Products */, 111 | 9C6D067F1167CC7400343E46 /* CDEventsTestApp-Info.plist */, 112 | ); 113 | name = CDEvents; 114 | sourceTree = ""; 115 | }; 116 | 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | 1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */, 120 | 1058C7B2FEA5585E11CA2CBB /* Other Frameworks */, 121 | ); 122 | name = "External Frameworks and Libraries"; 123 | sourceTree = ""; 124 | }; 125 | 089C1665FE841158C02AAC07 /* Resources */ = { 126 | isa = PBXGroup; 127 | children = ( 128 | 8DC2EF5A0486A6940098B216 /* Info.plist */, 129 | 089C1666FE841158C02AAC07 /* InfoPlist.strings */, 130 | ); 131 | name = Resources; 132 | sourceTree = ""; 133 | }; 134 | 08FB77AEFE84172EC02AAC07 /* Classes */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 9C6D03011166AFFA00343E46 /* CDEvent.h */, 138 | 9C6D03021166AFFA00343E46 /* CDEvent.m */, 139 | 9C6D05221166BF5300343E46 /* CDEvents.h */, 140 | 9C6D05231166BF5300343E46 /* CDEvents.m */, 141 | 9C6D051C1166BD5800343E46 /* CDEventsDelegate.h */, 142 | ); 143 | name = Classes; 144 | sourceTree = ""; 145 | }; 146 | 1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */ = { 147 | isa = PBXGroup; 148 | children = ( 149 | 9C6D033C1166B32000343E46 /* Foundation.framework */, 150 | 9C6D04441166B35700343E46 /* CoreServices.framework */, 151 | ); 152 | name = "Linked Frameworks"; 153 | sourceTree = ""; 154 | }; 155 | 1058C7B2FEA5585E11CA2CBB /* Other Frameworks */ = { 156 | isa = PBXGroup; 157 | children = ( 158 | 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */, 159 | 0867D6A5FE840307C02AAC07 /* AppKit.framework */, 160 | D2F7E79907B2D74100F64583 /* CoreData.framework */, 161 | ); 162 | name = "Other Frameworks"; 163 | sourceTree = ""; 164 | }; 165 | 32C88DFF0371C24200C91783 /* Other Sources */ = { 166 | isa = PBXGroup; 167 | children = ( 168 | 6A0577591400F49900BF73C4 /* compat.h */, 169 | 32DBCF5E0370ADEE00C91783 /* CDEvents_Prefix.pch */, 170 | ); 171 | name = "Other Sources"; 172 | sourceTree = ""; 173 | }; 174 | 9C6D06861167CC8E00343E46 /* TestApp */ = { 175 | isa = PBXGroup; 176 | children = ( 177 | 9C6D06871167CCBD00343E46 /* main.m */, 178 | 9C6D06AE1167CE2000343E46 /* CDEventsTestAppController.h */, 179 | 9C6D06AF1167CE2000343E46 /* CDEventsTestAppController.m */, 180 | ); 181 | path = TestApp; 182 | sourceTree = ""; 183 | }; 184 | /* End PBXGroup section */ 185 | 186 | /* Begin PBXHeadersBuildPhase section */ 187 | 8DC2EF500486A6940098B216 /* Headers */ = { 188 | isa = PBXHeadersBuildPhase; 189 | buildActionMask = 2147483647; 190 | files = ( 191 | 9C6D03031166AFFA00343E46 /* CDEvent.h in Headers */, 192 | 9C6D051D1166BD5800343E46 /* CDEventsDelegate.h in Headers */, 193 | 9C6D05241166BF5300343E46 /* CDEvents.h in Headers */, 194 | 6A05775A1400F49900BF73C4 /* compat.h in Headers */, 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | }; 198 | /* End PBXHeadersBuildPhase section */ 199 | 200 | /* Begin PBXNativeTarget section */ 201 | 8DC2EF4F0486A6940098B216 /* CDEvents */ = { 202 | isa = PBXNativeTarget; 203 | buildConfigurationList = 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "CDEvents" */; 204 | buildPhases = ( 205 | 8DC2EF500486A6940098B216 /* Headers */, 206 | 8DC2EF520486A6940098B216 /* Resources */, 207 | 8DC2EF540486A6940098B216 /* Sources */, 208 | 8DC2EF560486A6940098B216 /* Frameworks */, 209 | ); 210 | buildRules = ( 211 | ); 212 | dependencies = ( 213 | ); 214 | name = CDEvents; 215 | productInstallPath = "$(HOME)/Library/Frameworks"; 216 | productName = CDEvents; 217 | productReference = 8DC2EF5B0486A6940098B216 /* CDEvents.framework */; 218 | productType = "com.apple.product-type.framework"; 219 | }; 220 | 9C6D067C1167CC7400343E46 /* CDEventsTestApp */ = { 221 | isa = PBXNativeTarget; 222 | buildConfigurationList = 9C6D06821167CC7500343E46 /* Build configuration list for PBXNativeTarget "CDEventsTestApp" */; 223 | buildPhases = ( 224 | 9C6D06791167CC7400343E46 /* Resources */, 225 | 9C6D067A1167CC7400343E46 /* Sources */, 226 | 9C6D067B1167CC7400343E46 /* Frameworks */, 227 | 9C6D06BD1167CEAA00343E46 /* Copy Bundle Frameworks */, 228 | ); 229 | buildRules = ( 230 | ); 231 | dependencies = ( 232 | 9C6D06841167CC8300343E46 /* PBXTargetDependency */, 233 | ); 234 | name = CDEventsTestApp; 235 | productName = CDEventsTestApp; 236 | productReference = 9C6D067D1167CC7400343E46 /* CDEventsTestApp.app */; 237 | productType = "com.apple.product-type.application"; 238 | }; 239 | /* End PBXNativeTarget section */ 240 | 241 | /* Begin PBXProject section */ 242 | 0867D690FE84028FC02AAC07 /* Project object */ = { 243 | isa = PBXProject; 244 | attributes = { 245 | LastUpgradeCheck = 0460; 246 | ORGANIZATIONNAME = "Aron Cedercrantz"; 247 | }; 248 | buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "CDEvents" */; 249 | compatibilityVersion = "Xcode 3.2"; 250 | developmentRegion = English; 251 | hasScannedForEncodings = 1; 252 | knownRegions = ( 253 | English, 254 | Japanese, 255 | French, 256 | German, 257 | ); 258 | mainGroup = 0867D691FE84028FC02AAC07 /* CDEvents */; 259 | productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; 260 | projectDirPath = ""; 261 | projectRoot = ""; 262 | targets = ( 263 | 8DC2EF4F0486A6940098B216 /* CDEvents */, 264 | 9C6D067C1167CC7400343E46 /* CDEventsTestApp */, 265 | ); 266 | }; 267 | /* End PBXProject section */ 268 | 269 | /* Begin PBXResourcesBuildPhase section */ 270 | 8DC2EF520486A6940098B216 /* Resources */ = { 271 | isa = PBXResourcesBuildPhase; 272 | buildActionMask = 2147483647; 273 | files = ( 274 | 8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */, 275 | ); 276 | runOnlyForDeploymentPostprocessing = 0; 277 | }; 278 | 9C6D06791167CC7400343E46 /* Resources */ = { 279 | isa = PBXResourcesBuildPhase; 280 | buildActionMask = 2147483647; 281 | files = ( 282 | ); 283 | runOnlyForDeploymentPostprocessing = 0; 284 | }; 285 | /* End PBXResourcesBuildPhase section */ 286 | 287 | /* Begin PBXSourcesBuildPhase section */ 288 | 8DC2EF540486A6940098B216 /* Sources */ = { 289 | isa = PBXSourcesBuildPhase; 290 | buildActionMask = 2147483647; 291 | files = ( 292 | 9C6D03041166AFFA00343E46 /* CDEvent.m in Sources */, 293 | 9C6D05251166BF5300343E46 /* CDEvents.m in Sources */, 294 | ); 295 | runOnlyForDeploymentPostprocessing = 0; 296 | }; 297 | 9C6D067A1167CC7400343E46 /* Sources */ = { 298 | isa = PBXSourcesBuildPhase; 299 | buildActionMask = 2147483647; 300 | files = ( 301 | 9C6D06881167CCBD00343E46 /* main.m in Sources */, 302 | 9C6D06B01167CE2000343E46 /* CDEventsTestAppController.m in Sources */, 303 | ); 304 | runOnlyForDeploymentPostprocessing = 0; 305 | }; 306 | /* End PBXSourcesBuildPhase section */ 307 | 308 | /* Begin PBXTargetDependency section */ 309 | 9C6D06841167CC8300343E46 /* PBXTargetDependency */ = { 310 | isa = PBXTargetDependency; 311 | target = 8DC2EF4F0486A6940098B216 /* CDEvents */; 312 | targetProxy = 9C6D06831167CC8300343E46 /* PBXContainerItemProxy */; 313 | }; 314 | /* End PBXTargetDependency section */ 315 | 316 | /* Begin PBXVariantGroup section */ 317 | 089C1666FE841158C02AAC07 /* InfoPlist.strings */ = { 318 | isa = PBXVariantGroup; 319 | children = ( 320 | 089C1667FE841158C02AAC07 /* English */, 321 | ); 322 | name = InfoPlist.strings; 323 | sourceTree = ""; 324 | }; 325 | /* End PBXVariantGroup section */ 326 | 327 | /* Begin XCBuildConfiguration section */ 328 | 1DEB91AE08733DA50010E9CD /* Debug */ = { 329 | isa = XCBuildConfiguration; 330 | buildSettings = { 331 | ALWAYS_SEARCH_USER_PATHS = NO; 332 | CLANG_ENABLE_OBJC_ARC = YES; 333 | COMBINE_HIDPI_IMAGES = YES; 334 | COPY_PHASE_STRIP = NO; 335 | DYLIB_COMPATIBILITY_VERSION = 1; 336 | DYLIB_CURRENT_VERSION = 1; 337 | FRAMEWORK_VERSION = A; 338 | GCC_DYNAMIC_NO_PIC = NO; 339 | GCC_ENABLE_OBJC_GC = unsupported; 340 | GCC_MODEL_TUNING = ""; 341 | GCC_OPTIMIZATION_LEVEL = 0; 342 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 343 | GCC_PREFIX_HEADER = CDEvents_Prefix.pch; 344 | GCC_PREPROCESSOR_DEFINITIONS = ""; 345 | INFOPLIST_FILE = Info.plist; 346 | INSTALL_PATH = "@loader_path/../Frameworks"; 347 | PRODUCT_NAME = CDEvents; 348 | WRAPPER_EXTENSION = framework; 349 | }; 350 | name = Debug; 351 | }; 352 | 1DEB91AF08733DA50010E9CD /* Release */ = { 353 | isa = XCBuildConfiguration; 354 | buildSettings = { 355 | ALWAYS_SEARCH_USER_PATHS = NO; 356 | CLANG_ENABLE_OBJC_ARC = YES; 357 | COMBINE_HIDPI_IMAGES = YES; 358 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 359 | DYLIB_COMPATIBILITY_VERSION = 1; 360 | DYLIB_CURRENT_VERSION = 1; 361 | FRAMEWORK_VERSION = A; 362 | GCC_ENABLE_OBJC_GC = unsupported; 363 | GCC_MODEL_TUNING = ""; 364 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 365 | GCC_PREFIX_HEADER = CDEvents_Prefix.pch; 366 | GCC_PREPROCESSOR_DEFINITIONS = ""; 367 | INFOPLIST_FILE = Info.plist; 368 | INSTALL_PATH = "@loader_path/../Frameworks"; 369 | PRODUCT_NAME = CDEvents; 370 | WRAPPER_EXTENSION = framework; 371 | }; 372 | name = Release; 373 | }; 374 | 1DEB91B208733DA50010E9CD /* Debug */ = { 375 | isa = XCBuildConfiguration; 376 | buildSettings = { 377 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 378 | CLANG_WARN_CONSTANT_CONVERSION = YES; 379 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 380 | CLANG_WARN_INT_CONVERSION = YES; 381 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 382 | GCC_C_LANGUAGE_STANDARD = gnu99; 383 | GCC_ENABLE_SSE3_EXTENSIONS = YES; 384 | GCC_OPTIMIZATION_LEVEL = 0; 385 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 386 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 387 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 388 | GCC_WARN_UNUSED_VARIABLE = YES; 389 | MACOSX_DEPLOYMENT_TARGET = 10.6; 390 | ONLY_ACTIVE_ARCH = YES; 391 | RUN_CLANG_STATIC_ANALYZER = YES; 392 | SDKROOT = macosx; 393 | }; 394 | name = Debug; 395 | }; 396 | 1DEB91B308733DA50010E9CD /* Release */ = { 397 | isa = XCBuildConfiguration; 398 | buildSettings = { 399 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 400 | CLANG_WARN_CONSTANT_CONVERSION = YES; 401 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 402 | CLANG_WARN_INT_CONVERSION = YES; 403 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 404 | GCC_C_LANGUAGE_STANDARD = gnu99; 405 | GCC_ENABLE_SSE3_EXTENSIONS = YES; 406 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 407 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 408 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 409 | GCC_WARN_UNUSED_VARIABLE = YES; 410 | MACOSX_DEPLOYMENT_TARGET = 10.6; 411 | RUN_CLANG_STATIC_ANALYZER = YES; 412 | SDKROOT = macosx; 413 | }; 414 | name = Release; 415 | }; 416 | 9C6D06801167CC7500343E46 /* Debug */ = { 417 | isa = XCBuildConfiguration; 418 | buildSettings = { 419 | ALWAYS_SEARCH_USER_PATHS = NO; 420 | COMBINE_HIDPI_IMAGES = YES; 421 | COPY_PHASE_STRIP = NO; 422 | GCC_DYNAMIC_NO_PIC = NO; 423 | GCC_ENABLE_OBJC_GC = unsupported; 424 | GCC_MODEL_TUNING = ""; 425 | GCC_OPTIMIZATION_LEVEL = 0; 426 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 427 | GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; 428 | GCC_PREPROCESSOR_DEFINITIONS = ""; 429 | INFOPLIST_FILE = "CDEventsTestApp-Info.plist"; 430 | INSTALL_PATH = "$(HOME)/Applications"; 431 | LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks"; 432 | OTHER_LDFLAGS = ( 433 | "-framework", 434 | Foundation, 435 | "-framework", 436 | AppKit, 437 | ); 438 | PRODUCT_NAME = CDEventsTestApp; 439 | ZERO_LINK = NO; 440 | }; 441 | name = Debug; 442 | }; 443 | 9C6D06811167CC7500343E46 /* Release */ = { 444 | isa = XCBuildConfiguration; 445 | buildSettings = { 446 | ALWAYS_SEARCH_USER_PATHS = NO; 447 | COMBINE_HIDPI_IMAGES = YES; 448 | COPY_PHASE_STRIP = YES; 449 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 450 | GCC_ENABLE_OBJC_GC = unsupported; 451 | GCC_MODEL_TUNING = ""; 452 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 453 | GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; 454 | GCC_PREPROCESSOR_DEFINITIONS = ""; 455 | INFOPLIST_FILE = "CDEventsTestApp-Info.plist"; 456 | INSTALL_PATH = "$(HOME)/Applications"; 457 | LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks"; 458 | OTHER_LDFLAGS = ( 459 | "-framework", 460 | Foundation, 461 | "-framework", 462 | AppKit, 463 | ); 464 | PRODUCT_NAME = CDEventsTestApp; 465 | ZERO_LINK = NO; 466 | }; 467 | name = Release; 468 | }; 469 | /* End XCBuildConfiguration section */ 470 | 471 | /* Begin XCConfigurationList section */ 472 | 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "CDEvents" */ = { 473 | isa = XCConfigurationList; 474 | buildConfigurations = ( 475 | 1DEB91AE08733DA50010E9CD /* Debug */, 476 | 1DEB91AF08733DA50010E9CD /* Release */, 477 | ); 478 | defaultConfigurationIsVisible = 0; 479 | defaultConfigurationName = Release; 480 | }; 481 | 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "CDEvents" */ = { 482 | isa = XCConfigurationList; 483 | buildConfigurations = ( 484 | 1DEB91B208733DA50010E9CD /* Debug */, 485 | 1DEB91B308733DA50010E9CD /* Release */, 486 | ); 487 | defaultConfigurationIsVisible = 0; 488 | defaultConfigurationName = Release; 489 | }; 490 | 9C6D06821167CC7500343E46 /* Build configuration list for PBXNativeTarget "CDEventsTestApp" */ = { 491 | isa = XCConfigurationList; 492 | buildConfigurations = ( 493 | 9C6D06801167CC7500343E46 /* Debug */, 494 | 9C6D06811167CC7500343E46 /* Release */, 495 | ); 496 | defaultConfigurationIsVisible = 0; 497 | defaultConfigurationName = Release; 498 | }; 499 | /* End XCConfigurationList section */ 500 | }; 501 | rootObject = 0867D690FE84028FC02AAC07 /* Project object */; 502 | } 503 | -------------------------------------------------------------------------------- /api.doxygen: -------------------------------------------------------------------------------- 1 | # Doxyfile 1.5.9 2 | 3 | # This file describes the settings to be used by the documentation system 4 | # doxygen (www.doxygen.org) for a project 5 | # 6 | # All text after a hash (#) is considered a comment and will be ignored 7 | # The format is: 8 | # TAG = value [value, ...] 9 | # For lists items can also be appended using: 10 | # TAG += value [value, ...] 11 | # Values that contain spaces should be placed between quotes (" ") 12 | 13 | #--------------------------------------------------------------------------- 14 | # Project related configuration options 15 | #--------------------------------------------------------------------------- 16 | 17 | # This tag specifies the encoding used for all characters in the config file 18 | # that follow. The default is UTF-8 which is also the encoding used for all 19 | # text before the first occurrence of this tag. Doxygen uses libiconv (or the 20 | # iconv built into libc) for the transcoding. See 21 | # http://www.gnu.org/software/libiconv for the list of possible encodings. 22 | 23 | DOXYFILE_ENCODING = 24 | 25 | # The PROJECT_NAME tag is a single word (or a sequence of words surrounded 26 | # by quotes) that should identify the project. 27 | 28 | PROJECT_NAME = CDEvents 29 | 30 | # The PROJECT_NUMBER tag can be used to enter a project or revision number. 31 | # This could be handy for archiving the generated documentation or 32 | # if some version control system is used. 33 | 34 | PROJECT_NUMBER = HEAD 35 | 36 | # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 37 | # base path where the generated documentation will be put. 38 | # If a relative path is entered, it will be relative to the location 39 | # where doxygen was started. If left blank the current directory will be used. 40 | 41 | OUTPUT_DIRECTORY = api 42 | 43 | # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 44 | # 4096 sub-directories (in 2 levels) under the output directory of each output 45 | # format and will distribute the generated files over these directories. 46 | # Enabling this option can be useful when feeding doxygen a huge amount of 47 | # source files, where putting all generated files in the same directory would 48 | # otherwise cause performance problems for the file system. 49 | 50 | CREATE_SUBDIRS = NO 51 | 52 | # The OUTPUT_LANGUAGE tag is used to specify the language in which all 53 | # documentation generated by doxygen is written. Doxygen will use this 54 | # information to generate all constant output in the proper language. 55 | # The default language is English, other supported languages are: 56 | # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 57 | # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, 58 | # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English 59 | # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, 60 | # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, 61 | # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. 62 | 63 | OUTPUT_LANGUAGE = 64 | 65 | # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 66 | # include brief member descriptions after the members that are listed in 67 | # the file and class documentation (similar to JavaDoc). 68 | # Set to NO to disable this. 69 | 70 | BRIEF_MEMBER_DESC = NO 71 | 72 | # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 73 | # the brief description of a member or function before the detailed description. 74 | # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 75 | # brief descriptions will be completely suppressed. 76 | 77 | REPEAT_BRIEF = NO 78 | 79 | # This tag implements a quasi-intelligent brief description abbreviator 80 | # that is used to form the text in various listings. Each string 81 | # in this list, if found as the leading text of the brief description, will be 82 | # stripped from the text and the result after processing the whole list, is 83 | # used as the annotated text. Otherwise, the brief description is used as-is. 84 | # If left blank, the following values are used ("$name" is automatically 85 | # replaced with the name of the entity): "The $name class" "The $name widget" 86 | # "The $name file" "is" "provides" "specifies" "contains" 87 | # "represents" "a" "an" "the" 88 | 89 | ABBREVIATE_BRIEF = 90 | 91 | # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 92 | # Doxygen will generate a detailed section even if there is only a brief 93 | # description. 94 | 95 | ALWAYS_DETAILED_SEC = NO 96 | 97 | # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 98 | # inherited members of a class in the documentation of that class as if those 99 | # members were ordinary class members. Constructors, destructors and assignment 100 | # operators of the base classes will not be shown. 101 | 102 | INLINE_INHERITED_MEMB = NO 103 | 104 | # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 105 | # path before files name in the file list and in the header files. If set 106 | # to NO the shortest path that makes the file name unique will be used. 107 | 108 | FULL_PATH_NAMES = NO 109 | 110 | # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 111 | # can be used to strip a user-defined part of the path. Stripping is 112 | # only done if one of the specified strings matches the left-hand part of 113 | # the path. The tag can be used to show relative paths in the file list. 114 | # If left blank the directory from which doxygen is run is used as the 115 | # path to strip. 116 | 117 | STRIP_FROM_PATH = 118 | 119 | # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 120 | # the path mentioned in the documentation of a class, which tells 121 | # the reader which header file to include in order to use a class. 122 | # If left blank only the name of the header file containing the class 123 | # definition is used. Otherwise one should specify the include paths that 124 | # are normally passed to the compiler using the -I flag. 125 | 126 | STRIP_FROM_INC_PATH = 127 | 128 | # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 129 | # (but less readable) file names. This can be useful is your file systems 130 | # doesn't support long names like on DOS, Mac, or CD-ROM. 131 | 132 | SHORT_NAMES = NO 133 | 134 | # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 135 | # will interpret the first line (until the first dot) of a JavaDoc-style 136 | # comment as the brief description. If set to NO, the JavaDoc 137 | # comments will behave just like regular Qt-style comments 138 | # (thus requiring an explicit @brief command for a brief description.) 139 | 140 | JAVADOC_AUTOBRIEF = YES 141 | 142 | # If the QT_AUTOBRIEF tag is set to YES then Doxygen will 143 | # interpret the first line (until the first dot) of a Qt-style 144 | # comment as the brief description. If set to NO, the comments 145 | # will behave just like regular Qt-style comments (thus requiring 146 | # an explicit \brief command for a brief description.) 147 | 148 | QT_AUTOBRIEF = NO 149 | 150 | # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 151 | # treat a multi-line C++ special comment block (i.e. a block of //! or /// 152 | # comments) as a brief description. This used to be the default behaviour. 153 | # The new default is to treat a multi-line C++ comment block as a detailed 154 | # description. Set this tag to YES if you prefer the old behaviour instead. 155 | 156 | MULTILINE_CPP_IS_BRIEF = NO 157 | 158 | # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 159 | # member inherits the documentation from any documented member that it 160 | # re-implements. 161 | 162 | INHERIT_DOCS = NO 163 | 164 | # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 165 | # a new page for each member. If set to NO, the documentation of a member will 166 | # be part of the file/class/namespace that contains it. 167 | 168 | SEPARATE_MEMBER_PAGES = NO 169 | 170 | # The TAB_SIZE tag can be used to set the number of spaces in a tab. 171 | # Doxygen uses this value to replace tabs by spaces in code fragments. 172 | 173 | TAB_SIZE = 4 174 | 175 | # This tag can be used to specify a number of aliases that acts 176 | # as commands in the documentation. An alias has the form "name=value". 177 | # For example adding "sideeffect=\par Side Effects:\n" will allow you to 178 | # put the command \sideeffect (or @sideeffect) in the documentation, which 179 | # will result in a user-defined paragraph with heading "Side Effects:". 180 | # You can put \n's in the value part of an alias to insert newlines. 181 | 182 | ALIASES = 183 | 184 | # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 185 | # sources only. Doxygen will then generate output that is more tailored for C. 186 | # For instance, some of the names that are used will be different. The list 187 | # of all members will be omitted, etc. 188 | 189 | OPTIMIZE_OUTPUT_FOR_C = YES 190 | 191 | # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 192 | # sources only. Doxygen will then generate output that is more tailored for 193 | # Java. For instance, namespaces will be presented as packages, qualified 194 | # scopes will look different, etc. 195 | 196 | OPTIMIZE_OUTPUT_JAVA = NO 197 | 198 | # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 199 | # sources only. Doxygen will then generate output that is more tailored for 200 | # Fortran. 201 | 202 | OPTIMIZE_FOR_FORTRAN = NO 203 | 204 | # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 205 | # sources. Doxygen will then generate output that is tailored for 206 | # VHDL. 207 | 208 | OPTIMIZE_OUTPUT_VHDL = NO 209 | 210 | # Doxygen selects the parser to use depending on the extension of the files it parses. 211 | # With this tag you can assign which parser to use for a given extension. 212 | # Doxygen has a built-in mapping, but you can override or extend it using this tag. 213 | # The format is ext=language, where ext is a file extension, and language is one of 214 | # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, 215 | # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat 216 | # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), 217 | # use: inc=Fortran f=C. Note that for custom extensions you also need to set 218 | # FILE_PATTERNS otherwise the files are not read by doxygen. 219 | 220 | EXTENSION_MAPPING = 221 | 222 | # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 223 | # to include (a tag file for) the STL sources as input, then you should 224 | # set this tag to YES in order to let doxygen match functions declarations and 225 | # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 226 | # func(std::string) {}). This also make the inheritance and collaboration 227 | # diagrams that involve STL classes more complete and accurate. 228 | 229 | BUILTIN_STL_SUPPORT = NO 230 | 231 | # If you use Microsoft's C++/CLI language, you should set this option to YES to 232 | # enable parsing support. 233 | 234 | CPP_CLI_SUPPORT = NO 235 | 236 | # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 237 | # Doxygen will parse them like normal C++ but will assume all classes use public 238 | # instead of private inheritance when no explicit protection keyword is present. 239 | 240 | SIP_SUPPORT = NO 241 | 242 | # For Microsoft's IDL there are propget and propput attributes to indicate getter 243 | # and setter methods for a property. Setting this option to YES (the default) 244 | # will make doxygen to replace the get and set methods by a property in the 245 | # documentation. This will only work if the methods are indeed getting or 246 | # setting a simple type. If this is not the case, or you want to show the 247 | # methods anyway, you should set this option to NO. 248 | 249 | IDL_PROPERTY_SUPPORT = NO 250 | 251 | # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 252 | # tag is set to YES, then doxygen will reuse the documentation of the first 253 | # member in the group (if any) for the other members of the group. By default 254 | # all members of a group must be documented explicitly. 255 | 256 | DISTRIBUTE_GROUP_DOC = NO 257 | 258 | # Set the SUBGROUPING tag to YES (the default) to allow class member groups of 259 | # the same type (for instance a group of public functions) to be put as a 260 | # subgroup of that type (e.g. under the Public Functions section). Set it to 261 | # NO to prevent subgrouping. Alternatively, this can be done per class using 262 | # the \nosubgrouping command. 263 | 264 | SUBGROUPING = NO 265 | 266 | # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 267 | # is documented as struct, union, or enum with the name of the typedef. So 268 | # typedef struct TypeS {} TypeT, will appear in the documentation as a struct 269 | # with name TypeT. When disabled the typedef will appear as a member of a file, 270 | # namespace, or class. And the struct will be named TypeS. This can typically 271 | # be useful for C code in case the coding convention dictates that all compound 272 | # types are typedef'ed and only the typedef is referenced, never the tag name. 273 | 274 | TYPEDEF_HIDES_STRUCT = YES 275 | 276 | # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 277 | # determine which symbols to keep in memory and which to flush to disk. 278 | # When the cache is full, less often used symbols will be written to disk. 279 | # For small to medium size projects (<1000 input files) the default value is 280 | # probably good enough. For larger projects a too small cache size can cause 281 | # doxygen to be busy swapping symbols to and from disk most of the time 282 | # causing a significant performance penality. 283 | # If the system has enough physical memory increasing the cache will improve the 284 | # performance by keeping more symbols in memory. Note that the value works on 285 | # a logarithmic scale so increasing the size by one will rougly double the 286 | # memory usage. The cache size is given by this formula: 287 | # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 288 | # corresponding to a cache size of 2^16 = 65536 symbols 289 | 290 | SYMBOL_CACHE_SIZE = 0 291 | 292 | #--------------------------------------------------------------------------- 293 | # Build related configuration options 294 | #--------------------------------------------------------------------------- 295 | 296 | # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 297 | # documentation are documented, even if no documentation was available. 298 | # Private class members and static file members will be hidden unless 299 | # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES 300 | 301 | EXTRACT_ALL = YES 302 | 303 | # If the EXTRACT_PRIVATE tag is set to YES all private members of a class 304 | # will be included in the documentation. 305 | 306 | EXTRACT_PRIVATE = NO 307 | 308 | # If the EXTRACT_STATIC tag is set to YES all static members of a file 309 | # will be included in the documentation. 310 | 311 | EXTRACT_STATIC = YES 312 | 313 | # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 314 | # defined locally in source files will be included in the documentation. 315 | # If set to NO only classes defined in header files are included. 316 | 317 | EXTRACT_LOCAL_CLASSES = NO 318 | 319 | # This flag is only useful for Objective-C code. When set to YES local 320 | # methods, which are defined in the implementation section but not in 321 | # the interface are included in the documentation. 322 | # If set to NO (the default) only methods in the interface are included. 323 | 324 | EXTRACT_LOCAL_METHODS = NO 325 | 326 | # If this flag is set to YES, the members of anonymous namespaces will be 327 | # extracted and appear in the documentation as a namespace called 328 | # 'anonymous_namespace{file}', where file will be replaced with the base 329 | # name of the file that contains the anonymous namespace. By default 330 | # anonymous namespace are hidden. 331 | 332 | EXTRACT_ANON_NSPACES = NO 333 | 334 | # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 335 | # undocumented members of documented classes, files or namespaces. 336 | # If set to NO (the default) these members will be included in the 337 | # various overviews, but no documentation section is generated. 338 | # This option has no effect if EXTRACT_ALL is enabled. 339 | 340 | HIDE_UNDOC_MEMBERS = YES 341 | 342 | # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 343 | # undocumented classes that are normally visible in the class hierarchy. 344 | # If set to NO (the default) these classes will be included in the various 345 | # overviews. This option has no effect if EXTRACT_ALL is enabled. 346 | 347 | HIDE_UNDOC_CLASSES = NO 348 | 349 | # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 350 | # friend (class|struct|union) declarations. 351 | # If set to NO (the default) these declarations will be included in the 352 | # documentation. 353 | 354 | HIDE_FRIEND_COMPOUNDS = NO 355 | 356 | # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 357 | # documentation blocks found inside the body of a function. 358 | # If set to NO (the default) these blocks will be appended to the 359 | # function's detailed documentation block. 360 | 361 | HIDE_IN_BODY_DOCS = NO 362 | 363 | # The INTERNAL_DOCS tag determines if documentation 364 | # that is typed after a \internal command is included. If the tag is set 365 | # to NO (the default) then the documentation will be excluded. 366 | # Set it to YES to include the internal documentation. 367 | 368 | INTERNAL_DOCS = NO 369 | 370 | # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 371 | # file names in lower-case letters. If set to YES upper-case letters are also 372 | # allowed. This is useful if you have classes or files whose names only differ 373 | # in case and if your file system supports case sensitive file names. Windows 374 | # and Mac users are advised to set this option to NO. 375 | 376 | CASE_SENSE_NAMES = NO 377 | 378 | # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 379 | # will show members with their full class and namespace scopes in the 380 | # documentation. If set to YES the scope will be hidden. 381 | 382 | HIDE_SCOPE_NAMES = YES 383 | 384 | # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 385 | # will put a list of the files that are included by a file in the documentation 386 | # of that file. 387 | 388 | SHOW_INCLUDE_FILES = NO 389 | 390 | # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 391 | # is inserted in the documentation for inline members. 392 | 393 | INLINE_INFO = NO 394 | 395 | # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 396 | # will sort the (detailed) documentation of file and class members 397 | # alphabetically by member name. If set to NO the members will appear in 398 | # declaration order. 399 | 400 | SORT_MEMBER_DOCS = NO 401 | 402 | # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 403 | # brief documentation of file, namespace and class members alphabetically 404 | # by member name. If set to NO (the default) the members will appear in 405 | # declaration order. 406 | 407 | SORT_BRIEF_DOCS = NO 408 | 409 | # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 410 | # hierarchy of group names into alphabetical order. If set to NO (the default) 411 | # the group names will appear in their defined order. 412 | 413 | SORT_GROUP_NAMES = NO 414 | 415 | # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 416 | # sorted by fully-qualified names, including namespaces. If set to 417 | # NO (the default), the class list will be sorted only by class name, 418 | # not including the namespace part. 419 | # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 420 | # Note: This option applies only to the class list, not to the 421 | # alphabetical list. 422 | 423 | SORT_BY_SCOPE_NAME = NO 424 | 425 | # The GENERATE_TODOLIST tag can be used to enable (YES) or 426 | # disable (NO) the todo list. This list is created by putting \todo 427 | # commands in the documentation. 428 | 429 | GENERATE_TODOLIST = YES 430 | 431 | # The GENERATE_TESTLIST tag can be used to enable (YES) or 432 | # disable (NO) the test list. This list is created by putting \test 433 | # commands in the documentation. 434 | 435 | GENERATE_TESTLIST = NO 436 | 437 | # The GENERATE_BUGLIST tag can be used to enable (YES) or 438 | # disable (NO) the bug list. This list is created by putting \bug 439 | # commands in the documentation. 440 | 441 | GENERATE_BUGLIST = YES 442 | 443 | # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 444 | # disable (NO) the deprecated list. This list is created by putting 445 | # \deprecated commands in the documentation. 446 | 447 | GENERATE_DEPRECATEDLIST= YES 448 | 449 | # The ENABLED_SECTIONS tag can be used to enable conditional 450 | # documentation sections, marked by \if sectionname ... \endif. 451 | 452 | ENABLED_SECTIONS = 453 | 454 | # The MAX_INITIALIZER_LINES tag determines the maximum number of lines 455 | # the initial value of a variable or define consists of for it to appear in 456 | # the documentation. If the initializer consists of more lines than specified 457 | # here it will be hidden. Use a value of 0 to hide initializers completely. 458 | # The appearance of the initializer of individual variables and defines in the 459 | # documentation can be controlled using \showinitializer or \hideinitializer 460 | # command in the documentation regardless of this setting. 461 | 462 | MAX_INITIALIZER_LINES = 0 463 | 464 | # If the sources in your project are distributed over multiple directories 465 | # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 466 | # in the documentation. The default is NO. 467 | 468 | SHOW_DIRECTORIES = NO 469 | 470 | # Set the SHOW_FILES tag to NO to disable the generation of the Files page. 471 | # This will remove the Files entry from the Quick Index and from the 472 | # Folder Tree View (if specified). The default is YES. 473 | 474 | SHOW_FILES = NO 475 | 476 | # Set the SHOW_NAMESPACES tag to NO to disable the generation of the 477 | # Namespaces page. This will remove the Namespaces entry from the Quick Index 478 | # and from the Folder Tree View (if specified). The default is YES. 479 | 480 | SHOW_NAMESPACES = NO 481 | 482 | # The FILE_VERSION_FILTER tag can be used to specify a program or script that 483 | # doxygen should invoke to get the current version for each file (typically from 484 | # the version control system). Doxygen will invoke the program by executing (via 485 | # popen()) the command , where is the value of 486 | # the FILE_VERSION_FILTER tag, and is the name of an input file 487 | # provided by doxygen. Whatever the program writes to standard output 488 | # is used as the file version. See the manual for examples. 489 | 490 | FILE_VERSION_FILTER = 491 | 492 | # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by 493 | # doxygen. The layout file controls the global structure of the generated output files 494 | # in an output format independent way. The create the layout file that represents 495 | # doxygen's defaults, run doxygen with the -l option. You can optionally specify a 496 | # file name after the option, if omitted DoxygenLayout.xml will be used as the name 497 | # of the layout file. 498 | 499 | LAYOUT_FILE = 500 | 501 | #--------------------------------------------------------------------------- 502 | # configuration options related to warning and progress messages 503 | #--------------------------------------------------------------------------- 504 | 505 | # The QUIET tag can be used to turn on/off the messages that are generated 506 | # by doxygen. Possible values are YES and NO. If left blank NO is used. 507 | 508 | QUIET = NO 509 | 510 | # The WARNINGS tag can be used to turn on/off the warning messages that are 511 | # generated by doxygen. Possible values are YES and NO. If left blank 512 | # NO is used. 513 | 514 | WARNINGS = NO 515 | 516 | # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 517 | # for undocumented members. If EXTRACT_ALL is set to YES then this flag will 518 | # automatically be disabled. 519 | 520 | WARN_IF_UNDOCUMENTED = NO 521 | 522 | # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 523 | # potential errors in the documentation, such as not documenting some 524 | # parameters in a documented function, or documenting parameters that 525 | # don't exist or using markup commands wrongly. 526 | 527 | WARN_IF_DOC_ERROR = NO 528 | 529 | # This WARN_NO_PARAMDOC option can be abled to get warnings for 530 | # functions that are documented, but have no documentation for their parameters 531 | # or return value. If set to NO (the default) doxygen will only warn about 532 | # wrong or incomplete parameter documentation, but not about the absence of 533 | # documentation. 534 | 535 | WARN_NO_PARAMDOC = NO 536 | 537 | # The WARN_FORMAT tag determines the format of the warning messages that 538 | # doxygen can produce. The string should contain the $file, $line, and $text 539 | # tags, which will be replaced by the file and line number from which the 540 | # warning originated and the warning text. Optionally the format may contain 541 | # $version, which will be replaced by the version of the file (if it could 542 | # be obtained via FILE_VERSION_FILTER) 543 | 544 | WARN_FORMAT = 545 | 546 | # The WARN_LOGFILE tag can be used to specify a file to which warning 547 | # and error messages should be written. If left blank the output is written 548 | # to stderr. 549 | 550 | WARN_LOGFILE = 551 | 552 | #--------------------------------------------------------------------------- 553 | # configuration options related to the input files 554 | #--------------------------------------------------------------------------- 555 | 556 | # The INPUT tag can be used to specify the files and/or directories that contain 557 | # documented source files. You may enter file names like "myfile.cpp" or 558 | # directories like "/usr/src/myproject". Separate the files or directories 559 | # with spaces. 560 | 561 | INPUT = . 562 | 563 | # This tag can be used to specify the character encoding of the source files 564 | # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 565 | # also the default input encoding. Doxygen uses libiconv (or the iconv built 566 | # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 567 | # the list of possible encodings. 568 | 569 | INPUT_ENCODING = 570 | 571 | # If the value of the INPUT tag contains directories, you can use the 572 | # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 573 | # and *.h) to filter out the source-files in the directories. If left 574 | # blank the following patterns are tested: 575 | # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 576 | # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 577 | 578 | FILE_PATTERNS = *.h 579 | 580 | # The RECURSIVE tag can be used to turn specify whether or not subdirectories 581 | # should be searched for input files as well. Possible values are YES and NO. 582 | # If left blank NO is used. 583 | 584 | RECURSIVE = YES 585 | 586 | # The EXCLUDE tag can be used to specify files and/or directories that should 587 | # excluded from the INPUT source files. This way you can easily exclude a 588 | # subdirectory from a directory tree whose root is specified with the INPUT tag. 589 | 590 | EXCLUDE = TestApp \ 591 | build \ 592 | *.lproj \ 593 | api 594 | 595 | # The EXCLUDE_SYMLINKS tag can be used select whether or not files or 596 | # directories that are symbolic links (a Unix filesystem feature) are excluded 597 | # from the input. 598 | 599 | EXCLUDE_SYMLINKS = NO 600 | 601 | # If the value of the INPUT tag contains directories, you can use the 602 | # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 603 | # certain files from those directories. Note that the wildcards are matched 604 | # against the file with absolute path, so to exclude all test directories 605 | # for example use the pattern */test/* 606 | 607 | EXCLUDE_PATTERNS = 608 | 609 | # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 610 | # (namespaces, classes, functions, etc.) that should be excluded from the 611 | # output. The symbol name can be a fully qualified name, a word, or if the 612 | # wildcard * is used, a substring. Examples: ANamespace, AClass, 613 | # AClass::ANamespace, ANamespace::*Test 614 | 615 | EXCLUDE_SYMBOLS = NS* 616 | 617 | # The EXAMPLE_PATH tag can be used to specify one or more files or 618 | # directories that contain example code fragments that are included (see 619 | # the \include command). 620 | 621 | EXAMPLE_PATH = 622 | 623 | # If the value of the EXAMPLE_PATH tag contains directories, you can use the 624 | # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 625 | # and *.h) to filter out the source-files in the directories. If left 626 | # blank all files are included. 627 | 628 | EXAMPLE_PATTERNS = 629 | 630 | # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 631 | # searched for input files to be used with the \include or \dontinclude 632 | # commands irrespective of the value of the RECURSIVE tag. 633 | # Possible values are YES and NO. If left blank NO is used. 634 | 635 | EXAMPLE_RECURSIVE = NO 636 | 637 | # The IMAGE_PATH tag can be used to specify one or more files or 638 | # directories that contain image that are included in the documentation (see 639 | # the \image command). 640 | 641 | IMAGE_PATH = 642 | 643 | # The INPUT_FILTER tag can be used to specify a program that doxygen should 644 | # invoke to filter for each input file. Doxygen will invoke the filter program 645 | # by executing (via popen()) the command , where 646 | # is the value of the INPUT_FILTER tag, and is the name of an 647 | # input file. Doxygen will then use the output that the filter program writes 648 | # to standard output. If FILTER_PATTERNS is specified, this tag will be 649 | # ignored. 650 | 651 | INPUT_FILTER = 652 | 653 | # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 654 | # basis. Doxygen will compare the file name with each pattern and apply the 655 | # filter if there is a match. The filters are a list of the form: 656 | # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 657 | # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 658 | # is applied to all files. 659 | 660 | FILTER_PATTERNS = 661 | 662 | # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 663 | # INPUT_FILTER) will be used to filter the input files when producing source 664 | # files to browse (i.e. when SOURCE_BROWSER is set to YES). 665 | 666 | FILTER_SOURCE_FILES = NO 667 | 668 | #--------------------------------------------------------------------------- 669 | # configuration options related to source browsing 670 | #--------------------------------------------------------------------------- 671 | 672 | # If the SOURCE_BROWSER tag is set to YES then a list of source files will 673 | # be generated. Documented entities will be cross-referenced with these sources. 674 | # Note: To get rid of all source code in the generated output, make sure also 675 | # VERBATIM_HEADERS is set to NO. 676 | 677 | SOURCE_BROWSER = YES 678 | 679 | # Setting the INLINE_SOURCES tag to YES will include the body 680 | # of functions and classes directly in the documentation. 681 | 682 | INLINE_SOURCES = NO 683 | 684 | # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 685 | # doxygen to hide any special comment blocks from generated source code 686 | # fragments. Normal C and C++ comments will always remain visible. 687 | 688 | STRIP_CODE_COMMENTS = NO 689 | 690 | # If the REFERENCED_BY_RELATION tag is set to YES 691 | # then for each documented function all documented 692 | # functions referencing it will be listed. 693 | 694 | REFERENCED_BY_RELATION = NO 695 | 696 | # If the REFERENCES_RELATION tag is set to YES 697 | # then for each documented function all documented entities 698 | # called/used by that function will be listed. 699 | 700 | REFERENCES_RELATION = NO 701 | 702 | # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) 703 | # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from 704 | # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 705 | # link to the source code. Otherwise they will link to the documentation. 706 | 707 | REFERENCES_LINK_SOURCE = NO 708 | 709 | # If the USE_HTAGS tag is set to YES then the references to source code 710 | # will point to the HTML generated by the htags(1) tool instead of doxygen 711 | # built-in source browser. The htags tool is part of GNU's global source 712 | # tagging system (see http://www.gnu.org/software/global/global.html). You 713 | # will need version 4.8.6 or higher. 714 | 715 | USE_HTAGS = NO 716 | 717 | # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 718 | # will generate a verbatim copy of the header file for each class for 719 | # which an include is specified. Set to NO to disable this. 720 | 721 | VERBATIM_HEADERS = NO 722 | 723 | #--------------------------------------------------------------------------- 724 | # configuration options related to the alphabetical class index 725 | #--------------------------------------------------------------------------- 726 | 727 | # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 728 | # of all compounds will be generated. Enable this if the project 729 | # contains a lot of classes, structs, unions or interfaces. 730 | 731 | ALPHABETICAL_INDEX = YES 732 | 733 | # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 734 | # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 735 | # in which this list will be split (can be a number in the range [1..20]) 736 | 737 | COLS_IN_ALPHA_INDEX = 1 738 | 739 | # In case all classes in a project start with a common prefix, all 740 | # classes will be put under the same header in the alphabetical index. 741 | # The IGNORE_PREFIX tag can be used to specify one or more prefixes that 742 | # should be ignored while generating the index headers. 743 | 744 | IGNORE_PREFIX = 745 | 746 | #--------------------------------------------------------------------------- 747 | # configuration options related to the HTML output 748 | #--------------------------------------------------------------------------- 749 | 750 | # If the GENERATE_HTML tag is set to YES (the default) Doxygen will 751 | # generate HTML output. 752 | 753 | GENERATE_HTML = YES 754 | 755 | # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 756 | # If a relative path is entered the value of OUTPUT_DIRECTORY will be 757 | # put in front of it. If left blank `html' will be used as the default path. 758 | 759 | HTML_OUTPUT = 760 | 761 | # The HTML_FILE_EXTENSION tag can be used to specify the file extension for 762 | # each generated HTML page (for example: .htm,.php,.asp). If it is left blank 763 | # doxygen will generate files with .html extension. 764 | 765 | HTML_FILE_EXTENSION = 766 | 767 | # The HTML_HEADER tag can be used to specify a personal HTML header for 768 | # each generated HTML page. If it is left blank doxygen will generate a 769 | # standard header. 770 | 771 | HTML_HEADER = 772 | 773 | # The HTML_FOOTER tag can be used to specify a personal HTML footer for 774 | # each generated HTML page. If it is left blank doxygen will generate a 775 | # standard footer. 776 | 777 | HTML_FOOTER = 778 | 779 | # The HTML_STYLESHEET tag can be used to specify a user-defined cascading 780 | # style sheet that is used by each HTML page. It can be used to 781 | # fine-tune the look of the HTML output. If the tag is left blank doxygen 782 | # will generate a default style sheet. Note that doxygen will try to copy 783 | # the style sheet file to the HTML output directory, so don't put your own 784 | # stylesheet in the HTML output directory as well, or it will be erased! 785 | 786 | HTML_STYLESHEET = 787 | 788 | # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 789 | # files or namespaces will be aligned in HTML using tables. If set to 790 | # NO a bullet list will be used. 791 | 792 | HTML_ALIGN_MEMBERS = NO 793 | 794 | # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 795 | # documentation will contain sections that can be hidden and shown after the 796 | # page has loaded. For this to work a browser that supports 797 | # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 798 | # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). 799 | 800 | HTML_DYNAMIC_SECTIONS = NO 801 | 802 | # If the GENERATE_DOCSET tag is set to YES, additional index files 803 | # will be generated that can be used as input for Apple's Xcode 3 804 | # integrated development environment, introduced with OSX 10.5 (Leopard). 805 | # To create a documentation set, doxygen will generate a Makefile in the 806 | # HTML output directory. Running make will produce the docset in that 807 | # directory and running "make install" will install the docset in 808 | # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 809 | # it at startup. 810 | # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. 811 | 812 | GENERATE_DOCSET = NO 813 | 814 | # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 815 | # feed. A documentation feed provides an umbrella under which multiple 816 | # documentation sets from a single provider (such as a company or product suite) 817 | # can be grouped. 818 | 819 | DOCSET_FEEDNAME = 820 | 821 | # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 822 | # should uniquely identify the documentation set bundle. This should be a 823 | # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 824 | # will append .docset to the name. 825 | 826 | DOCSET_BUNDLE_ID = 827 | 828 | # If the GENERATE_HTMLHELP tag is set to YES, additional index files 829 | # will be generated that can be used as input for tools like the 830 | # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 831 | # of the generated HTML documentation. 832 | 833 | GENERATE_HTMLHELP = NO 834 | 835 | # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 836 | # be used to specify the file name of the resulting .chm file. You 837 | # can add a path in front of the file if the result should not be 838 | # written to the html output directory. 839 | 840 | CHM_FILE = 841 | 842 | # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 843 | # be used to specify the location (absolute path including file name) of 844 | # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 845 | # the HTML help compiler on the generated index.hhp. 846 | 847 | HHC_LOCATION = 848 | 849 | # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 850 | # controls if a separate .chi index file is generated (YES) or that 851 | # it should be included in the master .chm file (NO). 852 | 853 | GENERATE_CHI = NO 854 | 855 | # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING 856 | # is used to encode HtmlHelp index (hhk), content (hhc) and project file 857 | # content. 858 | 859 | CHM_INDEX_ENCODING = 860 | 861 | # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 862 | # controls whether a binary table of contents is generated (YES) or a 863 | # normal table of contents (NO) in the .chm file. 864 | 865 | BINARY_TOC = NO 866 | 867 | # The TOC_EXPAND flag can be set to YES to add extra items for group members 868 | # to the contents of the HTML help documentation and to the tree view. 869 | 870 | TOC_EXPAND = NO 871 | 872 | # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER 873 | # are set, an additional index file will be generated that can be used as input for 874 | # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated 875 | # HTML documentation. 876 | 877 | GENERATE_QHP = NO 878 | 879 | # If the QHG_LOCATION tag is specified, the QCH_FILE tag can 880 | # be used to specify the file name of the resulting .qch file. 881 | # The path specified is relative to the HTML output folder. 882 | 883 | QCH_FILE = 884 | 885 | # The QHP_NAMESPACE tag specifies the namespace to use when generating 886 | # Qt Help Project output. For more information please see 887 | # http://doc.trolltech.com/qthelpproject.html#namespace 888 | 889 | QHP_NAMESPACE = 890 | 891 | # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 892 | # Qt Help Project output. For more information please see 893 | # http://doc.trolltech.com/qthelpproject.html#virtual-folders 894 | 895 | QHP_VIRTUAL_FOLDER = 896 | 897 | # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. 898 | # For more information please see 899 | # http://doc.trolltech.com/qthelpproject.html#custom-filters 900 | 901 | QHP_CUST_FILTER_NAME = 902 | 903 | # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see 904 | # Qt Help Project / Custom Filters. 905 | 906 | QHP_CUST_FILTER_ATTRS = 907 | 908 | # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's 909 | # filter section matches. 910 | # Qt Help Project / Filter Attributes. 911 | 912 | QHP_SECT_FILTER_ATTRS = 913 | 914 | # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 915 | # be used to specify the location of Qt's qhelpgenerator. 916 | # If non-empty doxygen will try to run qhelpgenerator on the generated 917 | # .qhp file. 918 | 919 | QHG_LOCATION = 920 | 921 | # The DISABLE_INDEX tag can be used to turn on/off the condensed index at 922 | # top of each HTML page. The value NO (the default) enables the index and 923 | # the value YES disables it. 924 | 925 | DISABLE_INDEX = NO 926 | 927 | # This tag can be used to set the number of enum values (range [1..20]) 928 | # that doxygen will group on one line in the generated HTML documentation. 929 | 930 | ENUM_VALUES_PER_LINE = 1 931 | 932 | # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 933 | # structure should be generated to display hierarchical information. 934 | # If the tag value is set to FRAME, a side panel will be generated 935 | # containing a tree-like index structure (just like the one that 936 | # is generated for HTML Help). For this to work a browser that supports 937 | # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 938 | # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 939 | # probably better off using the HTML help feature. Other possible values 940 | # for this tag are: HIERARCHIES, which will generate the Groups, Directories, 941 | # and Class Hierarchy pages using a tree view instead of an ordered list; 942 | # ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which 943 | # disables this behavior completely. For backwards compatibility with previous 944 | # releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE 945 | # respectively. 946 | 947 | GENERATE_TREEVIEW = 948 | 949 | # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 950 | # used to set the initial width (in pixels) of the frame in which the tree 951 | # is shown. 952 | 953 | TREEVIEW_WIDTH = 0 954 | 955 | # Use this tag to change the font size of Latex formulas included 956 | # as images in the HTML documentation. The default is 10. Note that 957 | # when you change the font size after a successful doxygen run you need 958 | # to manually remove any form_*.png images from the HTML output directory 959 | # to force them to be regenerated. 960 | 961 | FORMULA_FONTSIZE = 8 962 | 963 | #--------------------------------------------------------------------------- 964 | # configuration options related to the LaTeX output 965 | #--------------------------------------------------------------------------- 966 | 967 | # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 968 | # generate Latex output. 969 | 970 | GENERATE_LATEX = NO 971 | 972 | # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 973 | # If a relative path is entered the value of OUTPUT_DIRECTORY will be 974 | # put in front of it. If left blank `latex' will be used as the default path. 975 | 976 | LATEX_OUTPUT = 977 | 978 | # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 979 | # invoked. If left blank `latex' will be used as the default command name. 980 | 981 | LATEX_CMD_NAME = 982 | 983 | # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 984 | # generate index for LaTeX. If left blank `makeindex' will be used as the 985 | # default command name. 986 | 987 | MAKEINDEX_CMD_NAME = 988 | 989 | # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 990 | # LaTeX documents. This may be useful for small projects and may help to 991 | # save some trees in general. 992 | 993 | COMPACT_LATEX = NO 994 | 995 | # The PAPER_TYPE tag can be used to set the paper type that is used 996 | # by the printer. Possible values are: a4, a4wide, letter, legal and 997 | # executive. If left blank a4wide will be used. 998 | 999 | PAPER_TYPE = a4wide 1000 | 1001 | # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 1002 | # packages that should be included in the LaTeX output. 1003 | 1004 | EXTRA_PACKAGES = 1005 | 1006 | # The LATEX_HEADER tag can be used to specify a personal LaTeX header for 1007 | # the generated latex document. The header should contain everything until 1008 | # the first chapter. If it is left blank doxygen will generate a 1009 | # standard header. Notice: only use this tag if you know what you are doing! 1010 | 1011 | LATEX_HEADER = 1012 | 1013 | # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 1014 | # is prepared for conversion to pdf (using ps2pdf). The pdf file will 1015 | # contain links (just like the HTML output) instead of page references 1016 | # This makes the output suitable for online browsing using a pdf viewer. 1017 | 1018 | PDF_HYPERLINKS = YES 1019 | 1020 | # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 1021 | # plain latex in the generated Makefile. Set this option to YES to get a 1022 | # higher quality PDF documentation. 1023 | 1024 | USE_PDFLATEX = YES 1025 | 1026 | # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 1027 | # command to the generated LaTeX files. This will instruct LaTeX to keep 1028 | # running if errors occur, instead of asking the user for help. 1029 | # This option is also used when generating formulas in HTML. 1030 | 1031 | LATEX_BATCHMODE = NO 1032 | 1033 | # If LATEX_HIDE_INDICES is set to YES then doxygen will not 1034 | # include the index chapters (such as File Index, Compound Index, etc.) 1035 | # in the output. 1036 | 1037 | LATEX_HIDE_INDICES = NO 1038 | 1039 | # If LATEX_SOURCE_CODE is set to YES then doxygen will include 1040 | # source code with syntax highlighting in the LaTeX output. 1041 | # Note that which sources are shown also depends on other settings 1042 | # such as SOURCE_BROWSER. 1043 | 1044 | LATEX_SOURCE_CODE = NO 1045 | 1046 | #--------------------------------------------------------------------------- 1047 | # configuration options related to the RTF output 1048 | #--------------------------------------------------------------------------- 1049 | 1050 | # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 1051 | # The RTF output is optimized for Word 97 and may not look very pretty with 1052 | # other RTF readers or editors. 1053 | 1054 | GENERATE_RTF = NO 1055 | 1056 | # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 1057 | # If a relative path is entered the value of OUTPUT_DIRECTORY will be 1058 | # put in front of it. If left blank `rtf' will be used as the default path. 1059 | 1060 | RTF_OUTPUT = 1061 | 1062 | # If the COMPACT_RTF tag is set to YES Doxygen generates more compact 1063 | # RTF documents. This may be useful for small projects and may help to 1064 | # save some trees in general. 1065 | 1066 | COMPACT_RTF = NO 1067 | 1068 | # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 1069 | # will contain hyperlink fields. The RTF file will 1070 | # contain links (just like the HTML output) instead of page references. 1071 | # This makes the output suitable for online browsing using WORD or other 1072 | # programs which support those fields. 1073 | # Note: wordpad (write) and others do not support links. 1074 | 1075 | RTF_HYPERLINKS = NO 1076 | 1077 | # Load stylesheet definitions from file. Syntax is similar to doxygen's 1078 | # config file, i.e. a series of assignments. You only have to provide 1079 | # replacements, missing definitions are set to their default value. 1080 | 1081 | RTF_STYLESHEET_FILE = 1082 | 1083 | # Set optional variables used in the generation of an rtf document. 1084 | # Syntax is similar to doxygen's config file. 1085 | 1086 | RTF_EXTENSIONS_FILE = 1087 | 1088 | #--------------------------------------------------------------------------- 1089 | # configuration options related to the man page output 1090 | #--------------------------------------------------------------------------- 1091 | 1092 | # If the GENERATE_MAN tag is set to YES (the default) Doxygen will 1093 | # generate man pages 1094 | 1095 | GENERATE_MAN = NO 1096 | 1097 | # The MAN_OUTPUT tag is used to specify where the man pages will be put. 1098 | # If a relative path is entered the value of OUTPUT_DIRECTORY will be 1099 | # put in front of it. If left blank `man' will be used as the default path. 1100 | 1101 | MAN_OUTPUT = 1102 | 1103 | # The MAN_EXTENSION tag determines the extension that is added to 1104 | # the generated man pages (default is the subroutine's section .3) 1105 | 1106 | MAN_EXTENSION = 1107 | 1108 | # If the MAN_LINKS tag is set to YES and Doxygen generates man output, 1109 | # then it will generate one additional man file for each entity 1110 | # documented in the real man page(s). These additional files 1111 | # only source the real man page, but without them the man command 1112 | # would be unable to find the correct page. The default is NO. 1113 | 1114 | MAN_LINKS = NO 1115 | 1116 | #--------------------------------------------------------------------------- 1117 | # configuration options related to the XML output 1118 | #--------------------------------------------------------------------------- 1119 | 1120 | # If the GENERATE_XML tag is set to YES Doxygen will 1121 | # generate an XML file that captures the structure of 1122 | # the code including all documentation. 1123 | 1124 | GENERATE_XML = NO 1125 | 1126 | # The XML_OUTPUT tag is used to specify where the XML pages will be put. 1127 | # If a relative path is entered the value of OUTPUT_DIRECTORY will be 1128 | # put in front of it. If left blank `xml' will be used as the default path. 1129 | 1130 | XML_OUTPUT = 1131 | 1132 | # The XML_SCHEMA tag can be used to specify an XML schema, 1133 | # which can be used by a validating XML parser to check the 1134 | # syntax of the XML files. 1135 | 1136 | XML_SCHEMA = 1137 | 1138 | # The XML_DTD tag can be used to specify an XML DTD, 1139 | # which can be used by a validating XML parser to check the 1140 | # syntax of the XML files. 1141 | 1142 | XML_DTD = 1143 | 1144 | # If the XML_PROGRAMLISTING tag is set to YES Doxygen will 1145 | # dump the program listings (including syntax highlighting 1146 | # and cross-referencing information) to the XML output. Note that 1147 | # enabling this will significantly increase the size of the XML output. 1148 | 1149 | XML_PROGRAMLISTING = NO 1150 | 1151 | #--------------------------------------------------------------------------- 1152 | # configuration options for the AutoGen Definitions output 1153 | #--------------------------------------------------------------------------- 1154 | 1155 | # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 1156 | # generate an AutoGen Definitions (see autogen.sf.net) file 1157 | # that captures the structure of the code including all 1158 | # documentation. Note that this feature is still experimental 1159 | # and incomplete at the moment. 1160 | 1161 | GENERATE_AUTOGEN_DEF = NO 1162 | 1163 | #--------------------------------------------------------------------------- 1164 | # configuration options related to the Perl module output 1165 | #--------------------------------------------------------------------------- 1166 | 1167 | # If the GENERATE_PERLMOD tag is set to YES Doxygen will 1168 | # generate a Perl module file that captures the structure of 1169 | # the code including all documentation. Note that this 1170 | # feature is still experimental and incomplete at the 1171 | # moment. 1172 | 1173 | GENERATE_PERLMOD = NO 1174 | 1175 | # If the PERLMOD_LATEX tag is set to YES Doxygen will generate 1176 | # the necessary Makefile rules, Perl scripts and LaTeX code to be able 1177 | # to generate PDF and DVI output from the Perl module output. 1178 | 1179 | PERLMOD_LATEX = NO 1180 | 1181 | # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 1182 | # nicely formatted so it can be parsed by a human reader. This is useful 1183 | # if you want to understand what is going on. On the other hand, if this 1184 | # tag is set to NO the size of the Perl module output will be much smaller 1185 | # and Perl will parse it just the same. 1186 | 1187 | PERLMOD_PRETTY = NO 1188 | 1189 | # The names of the make variables in the generated doxyrules.make file 1190 | # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 1191 | # This is useful so different doxyrules.make files included by the same 1192 | # Makefile don't overwrite each other's variables. 1193 | 1194 | PERLMOD_MAKEVAR_PREFIX = 1195 | 1196 | #--------------------------------------------------------------------------- 1197 | # Configuration options related to the preprocessor 1198 | #--------------------------------------------------------------------------- 1199 | 1200 | # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 1201 | # evaluate all C-preprocessor directives found in the sources and include 1202 | # files. 1203 | 1204 | ENABLE_PREPROCESSING = NO 1205 | 1206 | # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 1207 | # names in the source code. If set to NO (the default) only conditional 1208 | # compilation will be performed. Macro expansion can be done in a controlled 1209 | # way by setting EXPAND_ONLY_PREDEF to YES. 1210 | 1211 | MACRO_EXPANSION = YES 1212 | 1213 | # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 1214 | # then the macro expansion is limited to the macros specified with the 1215 | # PREDEFINED and EXPAND_AS_DEFINED tags. 1216 | 1217 | EXPAND_ONLY_PREDEF = YES 1218 | 1219 | # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 1220 | # in the INCLUDE_PATH (see below) will be search if a #include is found. 1221 | 1222 | SEARCH_INCLUDES = NO 1223 | 1224 | # The INCLUDE_PATH tag can be used to specify one or more directories that 1225 | # contain include files that are not input files but should be processed by 1226 | # the preprocessor. 1227 | 1228 | INCLUDE_PATH = 1229 | 1230 | # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 1231 | # patterns (like *.h and *.hpp) to filter out the header-files in the 1232 | # directories. If left blank, the patterns specified with FILE_PATTERNS will 1233 | # be used. 1234 | 1235 | INCLUDE_FILE_PATTERNS = 1236 | 1237 | # The PREDEFINED tag can be used to specify one or more macro names that 1238 | # are defined before the preprocessor is started (similar to the -D option of 1239 | # gcc). The argument of the tag is a list of macros of the form: name 1240 | # or name=definition (no spaces). If the definition and the = are 1241 | # omitted =1 is assumed. To prevent a macro definition from being 1242 | # undefined via #undef or recursively expanded use the := operator 1243 | # instead of the = operator. 1244 | 1245 | PREDEFINED = 1246 | 1247 | # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 1248 | # this tag can be used to specify a list of macro names that should be expanded. 1249 | # The macro definition that is found in the sources will be used. 1250 | # Use the PREDEFINED tag if you want to use a different macro definition. 1251 | 1252 | EXPAND_AS_DEFINED = 1253 | 1254 | # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 1255 | # doxygen's preprocessor will remove all function-like macros that are alone 1256 | # on a line, have an all uppercase name, and do not end with a semicolon. Such 1257 | # function macros are typically used for boiler-plate code, and will confuse 1258 | # the parser if not removed. 1259 | 1260 | SKIP_FUNCTION_MACROS = NO 1261 | 1262 | #--------------------------------------------------------------------------- 1263 | # Configuration::additions related to external references 1264 | #--------------------------------------------------------------------------- 1265 | 1266 | # The TAGFILES option can be used to specify one or more tagfiles. 1267 | # Optionally an initial location of the external documentation 1268 | # can be added for each tagfile. The format of a tag file without 1269 | # this location is as follows: 1270 | # TAGFILES = file1 file2 ... 1271 | # Adding location for the tag files is done as follows: 1272 | # TAGFILES = file1=loc1 "file2 = loc2" ... 1273 | # where "loc1" and "loc2" can be relative or absolute paths or 1274 | # URLs. If a location is present for each tag, the installdox tool 1275 | # does not have to be run to correct the links. 1276 | # Note that each tag file must have a unique name 1277 | # (where the name does NOT include the path) 1278 | # If a tag file is not located in the directory in which doxygen 1279 | # is run, you must also specify the path to the tagfile here. 1280 | 1281 | TAGFILES = 1282 | 1283 | # When a file name is specified after GENERATE_TAGFILE, doxygen will create 1284 | # a tag file that is based on the input files it reads. 1285 | 1286 | GENERATE_TAGFILE = api/cdevents.tag 1287 | 1288 | # If the ALLEXTERNALS tag is set to YES all external classes will be listed 1289 | # in the class index. If set to NO only the inherited external classes 1290 | # will be listed. 1291 | 1292 | ALLEXTERNALS = NO 1293 | 1294 | # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 1295 | # in the modules index. If set to NO, only the current project's groups will 1296 | # be listed. 1297 | 1298 | EXTERNAL_GROUPS = NO 1299 | 1300 | # The PERL_PATH should be the absolute path and name of the perl script 1301 | # interpreter (i.e. the result of `which perl'). 1302 | 1303 | PERL_PATH = 1304 | 1305 | #--------------------------------------------------------------------------- 1306 | # Configuration options related to the dot tool 1307 | #--------------------------------------------------------------------------- 1308 | 1309 | # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 1310 | # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 1311 | # or super classes. Setting the tag to NO turns the diagrams off. Note that 1312 | # this option is superseded by the HAVE_DOT option below. This is only a 1313 | # fallback. It is recommended to install and use dot, since it yields more 1314 | # powerful graphs. 1315 | 1316 | CLASS_DIAGRAMS = NO 1317 | 1318 | # You can define message sequence charts within doxygen comments using the \msc 1319 | # command. Doxygen will then run the mscgen tool (see 1320 | # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 1321 | # documentation. The MSCGEN_PATH tag allows you to specify the directory where 1322 | # the mscgen tool resides. If left empty the tool is assumed to be found in the 1323 | # default search path. 1324 | 1325 | MSCGEN_PATH = 1326 | 1327 | # If set to YES, the inheritance and collaboration graphs will hide 1328 | # inheritance and usage relations if the target is undocumented 1329 | # or is not a class. 1330 | 1331 | HIDE_UNDOC_RELATIONS = NO 1332 | 1333 | # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 1334 | # available from the path. This tool is part of Graphviz, a graph visualization 1335 | # toolkit from AT&T and Lucent Bell Labs. The other options in this section 1336 | # have no effect if this option is set to NO (the default) 1337 | 1338 | HAVE_DOT = YES 1339 | 1340 | # By default doxygen will write a font called FreeSans.ttf to the output 1341 | # directory and reference it in all dot files that doxygen generates. This 1342 | # font does not include all possible unicode characters however, so when you need 1343 | # these (or just want a differently looking font) you can specify the font name 1344 | # using DOT_FONTNAME. You need need to make sure dot is able to find the font, 1345 | # which can be done by putting it in a standard location or by setting the 1346 | # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory 1347 | # containing the font. 1348 | 1349 | DOT_FONTNAME = 1350 | 1351 | # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 1352 | # The default size is 10pt. 1353 | 1354 | DOT_FONTSIZE = 4 1355 | 1356 | # By default doxygen will tell dot to use the output directory to look for the 1357 | # FreeSans.ttf font (which doxygen will put there itself). If you specify a 1358 | # different font using DOT_FONTNAME you can set the path where dot 1359 | # can find it using this tag. 1360 | 1361 | DOT_FONTPATH = 1362 | 1363 | # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 1364 | # will generate a graph for each documented class showing the direct and 1365 | # indirect inheritance relations. Setting this tag to YES will force the 1366 | # the CLASS_DIAGRAMS tag to NO. 1367 | 1368 | CLASS_GRAPH = YES 1369 | 1370 | # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 1371 | # will generate a graph for each documented class showing the direct and 1372 | # indirect implementation dependencies (inheritance, containment, and 1373 | # class references variables) of the class with other documented classes. 1374 | 1375 | COLLABORATION_GRAPH = NO 1376 | 1377 | # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 1378 | # will generate a graph for groups, showing the direct groups dependencies 1379 | 1380 | GROUP_GRAPHS = NO 1381 | 1382 | # If the UML_LOOK tag is set to YES doxygen will generate inheritance and 1383 | # collaboration diagrams in a style similar to the OMG's Unified Modeling 1384 | # Language. 1385 | 1386 | UML_LOOK = NO 1387 | 1388 | # If set to YES, the inheritance and collaboration graphs will show the 1389 | # relations between templates and their instances. 1390 | 1391 | TEMPLATE_RELATIONS = NO 1392 | 1393 | # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 1394 | # tags are set to YES then doxygen will generate a graph for each documented 1395 | # file showing the direct and indirect include dependencies of the file with 1396 | # other documented files. 1397 | 1398 | INCLUDE_GRAPH = NO 1399 | 1400 | # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 1401 | # HAVE_DOT tags are set to YES then doxygen will generate a graph for each 1402 | # documented header file showing the documented files that directly or 1403 | # indirectly include this file. 1404 | 1405 | INCLUDED_BY_GRAPH = NO 1406 | 1407 | # If the CALL_GRAPH and HAVE_DOT options are set to YES then 1408 | # doxygen will generate a call dependency graph for every global function 1409 | # or class method. Note that enabling this option will significantly increase 1410 | # the time of a run. So in most cases it will be better to enable call graphs 1411 | # for selected functions only using the \callgraph command. 1412 | 1413 | CALL_GRAPH = NO 1414 | 1415 | # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 1416 | # doxygen will generate a caller dependency graph for every global function 1417 | # or class method. Note that enabling this option will significantly increase 1418 | # the time of a run. So in most cases it will be better to enable caller 1419 | # graphs for selected functions only using the \callergraph command. 1420 | 1421 | CALLER_GRAPH = NO 1422 | 1423 | # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 1424 | # will graphical hierarchy of all classes instead of a textual one. 1425 | 1426 | GRAPHICAL_HIERARCHY = YES 1427 | 1428 | # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 1429 | # then doxygen will show the dependencies a directory has on other directories 1430 | # in a graphical way. The dependency relations are determined by the #include 1431 | # relations between the files in the directories. 1432 | 1433 | DIRECTORY_GRAPH = NO 1434 | 1435 | # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 1436 | # generated by dot. Possible values are png, jpg, or gif 1437 | # If left blank png will be used. 1438 | 1439 | DOT_IMAGE_FORMAT = png 1440 | 1441 | # The tag DOT_PATH can be used to specify the path where the dot tool can be 1442 | # found. If left blank, it is assumed the dot tool can be found in the path. 1443 | 1444 | DOT_PATH = 1445 | 1446 | # The DOTFILE_DIRS tag can be used to specify one or more directories that 1447 | # contain dot files that are included in the documentation (see the 1448 | # \dotfile command). 1449 | 1450 | DOTFILE_DIRS = 1451 | 1452 | # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 1453 | # nodes that will be shown in the graph. If the number of nodes in a graph 1454 | # becomes larger than this value, doxygen will truncate the graph, which is 1455 | # visualized by representing a node as a red box. Note that doxygen if the 1456 | # number of direct children of the root node in a graph is already larger than 1457 | # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 1458 | # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. 1459 | 1460 | DOT_GRAPH_MAX_NODES = 0 1461 | 1462 | # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 1463 | # graphs generated by dot. A depth value of 3 means that only nodes reachable 1464 | # from the root by following a path via at most 3 edges will be shown. Nodes 1465 | # that lay further from the root node will be omitted. Note that setting this 1466 | # option to 1 or 2 may greatly reduce the computation time needed for large 1467 | # code bases. Also note that the size of a graph can be further restricted by 1468 | # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. 1469 | 1470 | MAX_DOT_GRAPH_DEPTH = 0 1471 | 1472 | # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 1473 | # background. This is disabled by default, because dot on Windows does not 1474 | # seem to support this out of the box. Warning: Depending on the platform used, 1475 | # enabling this option may lead to badly anti-aliased labels on the edges of 1476 | # a graph (i.e. they become hard to read). 1477 | 1478 | DOT_TRANSPARENT = NO 1479 | 1480 | # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 1481 | # files in one run (i.e. multiple -o and -T options on the command line). This 1482 | # makes dot run faster, but since only newer versions of dot (>1.8.10) 1483 | # support this, this feature is disabled by default. 1484 | 1485 | DOT_MULTI_TARGETS = NO 1486 | 1487 | # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 1488 | # generate a legend page explaining the meaning of the various boxes and 1489 | # arrows in the dot generated graphs. 1490 | 1491 | GENERATE_LEGEND = NO 1492 | 1493 | # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 1494 | # remove the intermediate dot files that are used to generate 1495 | # the various graphs. 1496 | 1497 | DOT_CLEANUP = NO 1498 | 1499 | #--------------------------------------------------------------------------- 1500 | # Options related to the search engine 1501 | #--------------------------------------------------------------------------- 1502 | 1503 | # The SEARCHENGINE tag specifies whether or not a search engine should be 1504 | # used. If set to NO the values of all tags below this one will be ignored. 1505 | 1506 | SEARCHENGINE = NO 1507 | --------------------------------------------------------------------------------