diff --git a/512x512.png b/512x512.png deleted file mode 100644 index 9231bfa..0000000 Binary files a/512x512.png and /dev/null differ diff --git a/CocoaCamp.xcodeproj/project.pbxproj b/CocoaCamp.xcodeproj/project.pbxproj index 7ee2fc9..b2dfc37 100644 --- a/CocoaCamp.xcodeproj/project.pbxproj +++ b/CocoaCamp.xcodeproj/project.pbxproj @@ -3,1151 +3,2170 @@ archiveVersion = 1; classes = { }; - objectVersion = 45; + objectVersion = 46; objects = { /* Begin PBXBuildFile section */ - 030893A31226F05D0088A584 /* ContactExchangeView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 030893A21226F05D0088A584 /* ContactExchangeView.xib */; }; - 030894811226F1E40088A584 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 030894801226F1E40088A584 /* MessageUI.framework */; }; - 0308948E1226F2A90088A584 /* RegistrantListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0308948D1226F2A90088A584 /* RegistrantListView.xib */; }; - 030894911226F2CA0088A584 /* AttendeeListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 030894901226F2CA0088A584 /* AttendeeListViewController.m */; }; - 030894971226F2DB0088A584 /* Registrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 030894931226F2DB0088A584 /* Registrant.m */; }; - 030894981226F2DB0088A584 /* RegistrantDetailView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 030894941226F2DB0088A584 /* RegistrantDetailView.xib */; }; - 030894991226F2DB0088A584 /* RegistrantDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 030894961226F2DB0088A584 /* RegistrantDetailViewController.m */; }; - 0341222E12148A3400B376F7 /* SessionDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0341222C12148A3400B376F7 /* SessionDetailViewController.m */; }; - 0341222F12148A3400B376F7 /* SessionDetailViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0341222D12148A3400B376F7 /* SessionDetailViewController.xib */; }; - 034654EE12269693005A5D6C /* bump_button_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654D512269693005A5D6C /* bump_button_blue.png */; }; - 034654EF12269693005A5D6C /* bump_close.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654D612269693005A5D6C /* bump_close.png */; }; - 034654F012269693005A5D6C /* bump_close_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654D712269693005A5D6C /* bump_close_selected.png */; }; - 034654F112269693005A5D6C /* bump_content_area.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654D812269693005A5D6C /* bump_content_area.png */; }; - 034654F212269693005A5D6C /* bump_dropdown.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654D912269693005A5D6C /* bump_dropdown.png */; }; - 034654F312269693005A5D6C /* bump_hands_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654DA12269693005A5D6C /* bump_hands_bg.png */; }; - 034654F412269693005A5D6C /* bump_lefthand.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654DB12269693005A5D6C /* bump_lefthand.png */; }; - 034654F512269693005A5D6C /* bump_nameview.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654DC12269693005A5D6C /* bump_nameview.png */; }; - 034654F612269693005A5D6C /* bump_no_button.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654DD12269693005A5D6C /* bump_no_button.png */; }; - 034654F712269693005A5D6C /* bump_nonetwork.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654DE12269693005A5D6C /* bump_nonetwork.png */; }; - 034654F812269693005A5D6C /* bump_popupdefault.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654DF12269693005A5D6C /* bump_popupdefault.png */; }; - 034654F912269693005A5D6C /* bump_righthand.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654E012269693005A5D6C /* bump_righthand.png */; }; - 034654FA12269693005A5D6C /* bump_signal1.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654E112269693005A5D6C /* bump_signal1.png */; }; - 034654FB12269693005A5D6C /* bump_signal2.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654E212269693005A5D6C /* bump_signal2.png */; }; - 034654FC12269693005A5D6C /* bump_signal3.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654E312269693005A5D6C /* bump_signal3.png */; }; - 034654FD12269693005A5D6C /* bump_signal4.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654E412269693005A5D6C /* bump_signal4.png */; }; - 034654FE12269693005A5D6C /* bump_tap.aif in Resources */ = {isa = PBXBuildFile; fileRef = 034654E512269693005A5D6C /* bump_tap.aif */; }; - 034654FF12269693005A5D6C /* bump_titlebar_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654E612269693005A5D6C /* bump_titlebar_bg.png */; }; - 0346550012269693005A5D6C /* bump_white_low.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654E712269693005A5D6C /* bump_white_low.png */; }; - 0346550112269693005A5D6C /* bump_yes_button.png in Resources */ = {isa = PBXBuildFile; fileRef = 034654E812269693005A5D6C /* bump_yes_button.png */; }; - 0346550212269693005A5D6C /* BumpApiPopup.xib in Resources */ = {isa = PBXBuildFile; fileRef = 034654E912269693005A5D6C /* BumpApiPopup.xib */; }; - 0346550312269693005A5D6C /* BumpChangeNameScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 034654EA12269693005A5D6C /* BumpChangeNameScreen.xib */; }; - 0346550412269693005A5D6C /* BumpConfirmScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 034654EB12269693005A5D6C /* BumpConfirmScreen.xib */; }; - 0346550512269693005A5D6C /* BumpPromptScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 034654EC12269693005A5D6C /* BumpPromptScreen.xib */; }; - 0346550612269693005A5D6C /* BumpStartScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 034654ED12269693005A5D6C /* BumpStartScreen.xib */; }; - 034A2BF812146E2A009F39A6 /* FlickrPageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 034A2BF712146E2A009F39A6 /* FlickrPageView.xib */; }; - 034A2BFC12146E7B009F39A6 /* roundrecbuttonpress.png in Resources */ = {isa = PBXBuildFile; fileRef = 034A2BFB12146E7B009F39A6 /* roundrecbuttonpress.png */; }; - 034A2BFE12146E91009F39A6 /* headerBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = 034A2BFD12146E91009F39A6 /* headerBackground.png */; }; - 035B9D3B122691540038129A /* calendar.png in Resources */ = {isa = PBXBuildFile; fileRef = 035B9D39122691540038129A /* calendar.png */; }; - 035B9D3C122691540038129A /* group.png in Resources */ = {isa = PBXBuildFile; fileRef = 035B9D3A122691540038129A /* group.png */; }; - 035B9D46122693520038129A /* loading.png in Resources */ = {isa = PBXBuildFile; fileRef = 035B9D45122693520038129A /* loading.png */; }; - 03AE932412309B6200C188E9 /* TabController.m in Sources */ = {isa = PBXBuildFile; fileRef = 03AE932312309B6200C188E9 /* TabController.m */; }; - 03AF412B12120F8D0061D5DD /* FlickrController.m in Sources */ = {isa = PBXBuildFile; fileRef = 03AF412712120F8D0061D5DD /* FlickrController.m */; }; - 03AF412C12120F8D0061D5DD /* FlickrController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 03AF412812120F8D0061D5DD /* FlickrController.xib */; }; - 03AF412D12120F8D0061D5DD /* FlickrPageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 03AF412A12120F8D0061D5DD /* FlickrPageViewController.m */; }; - 03AF413012120FA80061D5DD /* photoIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 03AF412E12120FA80061D5DD /* photoIcon.png */; }; - 03AF413112120FA80061D5DD /* roundrecbuttonnorm.png in Resources */ = {isa = PBXBuildFile; fileRef = 03AF412F12120FA80061D5DD /* roundrecbuttonnorm.png */; }; - 03CD36ED120D0F240054728C /* SessionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 03CD36EB120D0F240054728C /* SessionViewController.m */; }; - 03CD36EE120D0F240054728C /* SessionViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 03CD36EC120D0F240054728C /* SessionViewController.xib */; }; - 03CD3737120D68940054728C /* NSObject+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 03CD372C120D68940054728C /* NSObject+SBJSON.m */; }; - 03CD3738120D68940054728C /* NSString+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 03CD372E120D68940054728C /* NSString+SBJSON.m */; }; - 03CD3739120D68940054728C /* SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 03CD3730120D68940054728C /* SBJSON.m */; }; - 03CD373A120D68940054728C /* SBJsonBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 03CD3732120D68940054728C /* SBJsonBase.m */; }; - 03CD373B120D68940054728C /* SBJsonParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 03CD3734120D68940054728C /* SBJsonParser.m */; }; - 03CD373C120D68940054728C /* SBJsonWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 03CD3736120D68940054728C /* SBJsonWriter.m */; }; - 03D53EB3122FCD5E004DBF63 /* FlickrSearchResultsModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 03D53EAE122FCD5E004DBF63 /* FlickrSearchResultsModel.m */; }; - 03D53EB4122FCD5E004DBF63 /* FlickrJSONResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 03D53EB0122FCD5E004DBF63 /* FlickrJSONResponse.m */; }; - 03D53EBC122FCD7E004DBF63 /* SearchResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 03D53EB7122FCD7E004DBF63 /* SearchResult.m */; }; - 03D53EBD122FCD7E004DBF63 /* URLModelResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 03D53EB9122FCD7E004DBF63 /* URLModelResponse.m */; }; - 03D53EBE122FCD7E004DBF63 /* SearchResultsModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 03D53EBB122FCD7E004DBF63 /* SearchResultsModel.m */; }; - 03D53EC6122FCD96004DBF63 /* SearchPhotosViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 03D53EC1122FCD96004DBF63 /* SearchPhotosViewController.m */; }; - 03D53EC7122FCD96004DBF63 /* SearchResultsPhotoSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 03D53EC3122FCD96004DBF63 /* SearchResultsPhotoSource.m */; }; - 03D53EC8122FCD96004DBF63 /* ForwardingAdapters.m in Sources */ = {isa = PBXBuildFile; fileRef = 03D53EC5122FCD96004DBF63 /* ForwardingAdapters.m */; }; - 03D53F8C122FD06B004DBF63 /* GTMNSString+URLArguments.m in Sources */ = {isa = PBXBuildFile; fileRef = 03D53F89122FD06B004DBF63 /* GTMNSString+URLArguments.m */; }; - 03D53F8D122FD06B004DBF63 /* GTMNSDictionary+URLArguments.m in Sources */ = {isa = PBXBuildFile; fileRef = 03D53F8B122FD06B004DBF63 /* GTMNSDictionary+URLArguments.m */; }; - 03D540BD122FE001004DBF63 /* FlickrThumbnailView.m in Sources */ = {isa = PBXBuildFile; fileRef = 03D540BC122FE001004DBF63 /* FlickrThumbnailView.m */; }; - 03D54117122FEC87004DBF63 /* FlickrAddPhotoController.m in Sources */ = {isa = PBXBuildFile; fileRef = 03D54115122FEC87004DBF63 /* FlickrAddPhotoController.m */; }; - 03D54118122FEC87004DBF63 /* FlickrAddPhotoController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 03D54116122FEC87004DBF63 /* FlickrAddPhotoController.xib */; }; - 03F7D4A212326E1B007FE8C7 /* TwitterFeedTableView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 03F7D49E12326E1B007FE8C7 /* TwitterFeedTableView.xib */; }; - 03F7D4A312326E1B007FE8C7 /* TwitterFeedTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 03F7D49F12326E1B007FE8C7 /* TwitterFeedTableViewCell.xib */; }; - 03F7D4A412326E1B007FE8C7 /* TwitterFeedTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 03F7D4A112326E1B007FE8C7 /* TwitterFeedTableViewController.m */; }; - 03F7D4D41232713C007FE8C7 /* bird.png in Resources */ = {isa = PBXBuildFile; fileRef = 03F7D4D31232713C007FE8C7 /* bird.png */; }; - 03F7D4D912327248007FE8C7 /* NSString+XMLEntities.m in Sources */ = {isa = PBXBuildFile; fileRef = 03F7D4D812327248007FE8C7 /* NSString+XMLEntities.m */; }; - 1D3623260D0F684500981E51 /* CocoaCampAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* CocoaCampAppDelegate.m */; }; - 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; - 288765080DF74369002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765070DF74369002DB57D /* CoreGraphics.framework */; }; - 28AD73880D9D96C1002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD73870D9D96C1002E5188 /* MainWindow.xib */; }; - 80C1A8BF1221CCCD007F7D7A /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80C1A8BE1221CCCD007F7D7A /* CoreLocation.framework */; }; - 80C1A8C31221CCD9007F7D7A /* libBump.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 80C1A8C21221CCD9007F7D7A /* libBump.a */; }; - 80C1A8C81221CCEB007F7D7A /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80C1A8C71221CCEB007F7D7A /* AudioToolbox.framework */; }; - 80C1A8D21221CD02007F7D7A /* ContactManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 80C1A8D01221CD02007F7D7A /* ContactManager.m */; }; - 80C1A8D71221CD17007F7D7A /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80C1A8D61221CD17007F7D7A /* AddressBook.framework */; }; - 80C1A8D91221CD17007F7D7A /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80C1A8D81221CD17007F7D7A /* AddressBookUI.framework */; }; - AB2AE44E11EBAA8E00015C01 /* 512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = AB2AE44D11EBAA8E00015C01 /* 512x512.png */; }; - AB2AE45A11EBACF500015C01 /* iPhoneAppIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = AB2AE45811EBACF500015C01 /* iPhoneAppIcon.png */; }; - AB2AE45B11EBACF500015C01 /* iPhoneAppIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AB2AE45911EBACF500015C01 /* iPhoneAppIcon@2x.png */; }; - AB2AE45F11EBAD7D00015C01 /* LICENSE.txt in Resources */ = {isa = PBXBuildFile; fileRef = AB2AE45E11EBAD7D00015C01 /* LICENSE.txt */; }; - FB477A8B120CA9CF00FA7C4E /* libThree20.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB477A42120CA95E00FA7C4E /* libThree20.a */; }; - FB477A8C120CA9D000FA7C4E /* libThree20Core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB477A69120CA9A500FA7C4E /* libThree20Core.a */; }; - FB477A8D120CA9D100FA7C4E /* libThree20Network.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB477A6F120CA9A500FA7C4E /* libThree20Network.a */; }; - FB477A8E120CA9D100FA7C4E /* libThree20Style.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB477A75120CA9A500FA7C4E /* libThree20Style.a */; }; - FB477A8F120CA9E000FA7C4E /* libThree20UI.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB477A87120CA9A500FA7C4E /* libThree20UI.a */; }; - FB477A90120CA9E200FA7C4E /* libThree20UICommon.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB477A7B120CA9A500FA7C4E /* libThree20UICommon.a */; }; - FB477A91120CA9E200FA7C4E /* libThree20UINavigator.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB477A81120CA9A500FA7C4E /* libThree20UINavigator.a */; }; - FB477AA2120CAAB700FA7C4E /* Three20.bundle in Resources */ = {isa = PBXBuildFile; fileRef = FB477AA1120CAAB700FA7C4E /* Three20.bundle */; }; - FB477ADE120CAAD900FA7C4E /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB477ADD120CAAD900FA7C4E /* QuartzCore.framework */; }; - FBF7E8231227E55000B7A710 /* keynote-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = FBF7E8211227E55000B7A710 /* keynote-icon.png */; }; - FBF7E8241227E55000B7A710 /* keynote-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FBF7E8221227E55000B7A710 /* keynote-icon@2x.png */; }; + 3201088596B4756681693705 /* libThree20UICommon.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3201088596B4756681693704 /* libThree20UICommon.a */; }; + 320A2827FEC940B25BC42C65 /* libThree20Core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 320A2827FEC940B25BC42C64 /* libThree20Core.a */; }; + 320A5A189C235877202780D5 /* libThree20Network.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 320A5A189C235877202780D4 /* libThree20Network.a */; }; + 320A737074758E53BA54BE95 /* libThree20UINavigator.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 320A737074758E53BA54BE94 /* libThree20UINavigator.a */; }; + 320AF8492C47A4D819F7C451 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 320AF8492C47A4D819F7C450 /* QuartzCore.framework */; }; + 320B6C86F11D9990244A9731 /* Three20.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 320B6C86F11D9990244A9730 /* Three20.bundle */; }; + 320CC833B8AF0ACFD35E6225 /* libThree20Style.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 320CC833B8AF0ACFD35E6224 /* libThree20Style.a */; }; + 320D7DCCE32703ACAB9A45E5 /* libThree20.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 320D7DCCE32703ACAB9A45E4 /* libThree20.a */; }; + 320F2C48872C2E2C4DF86205 /* libThree20UI.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 320F2C48872C2E2C4DF86204 /* libThree20UI.a */; }; + A904B51813E8E63300E021CF /* SearchResultsPhotoSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11E813E8A60300ABD295 /* SearchResultsPhotoSource.m */; }; + A904B53013E8EBE400E021CF /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A904B52F13E8EBE400E021CF /* MainWindow.xib */; }; + A904B53313E8F2B200E021CF /* AttendeeListJson.js in Resources */ = {isa = PBXBuildFile; fileRef = A904B53213E8F2B200E021CF /* AttendeeListJson.js */; }; + A904B53F13E978E800E021CF /* webServiceConfig.plist in Resources */ = {isa = PBXBuildFile; fileRef = A904B53E13E978E800E021CF /* webServiceConfig.plist */; }; + A904B54013E978E800E021CF /* webServiceConfig.plist in Resources */ = {isa = PBXBuildFile; fileRef = A904B53E13E978E800E021CF /* webServiceConfig.plist */; }; + A932DF691469C3C400DD0FF3 /* GTMNSString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = A951B74F144FCCAC00C35649 /* GTMNSString+HTML.m */; }; + A932DF6A1469C3C400DD0FF3 /* ContactManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11C813E8A60300ABD295 /* ContactManager.m */; }; + A932DF6B1469C3C400DD0FF3 /* PortraitLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11CA13E8A60300ABD295 /* PortraitLoader.m */; }; + A932DF6C1469C3C400DD0FF3 /* FlickrJSONResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11CE13E8A60300ABD295 /* FlickrJSONResponse.m */; }; + A932DF6D1469C3C400DD0FF3 /* NSObject+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11D213E8A60300ABD295 /* NSObject+SBJSON.m */; }; + A932DF6E1469C3C400DD0FF3 /* NSString+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11D413E8A60300ABD295 /* NSString+SBJSON.m */; }; + A932DF6F1469C3C400DD0FF3 /* SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11D613E8A60300ABD295 /* SBJSON.m */; }; + A932DF701469C3C400DD0FF3 /* SBJsonBase.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11D813E8A60300ABD295 /* SBJsonBase.m */; }; + A932DF711469C3C400DD0FF3 /* SBJsonParser.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11DA13E8A60300ABD295 /* SBJsonParser.m */; }; + A932DF721469C3C400DD0FF3 /* SBJsonWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11DC13E8A60300ABD295 /* SBJsonWriter.m */; }; + A932DF731469C3C400DD0FF3 /* FlickrSearchResultsModel.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11E013E8A60300ABD295 /* FlickrSearchResultsModel.m */; }; + A932DF741469C3C400DD0FF3 /* Registrant.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11E213E8A60300ABD295 /* Registrant.m */; }; + A932DF751469C3C400DD0FF3 /* SearchResult.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11E413E8A60300ABD295 /* SearchResult.m */; }; + A932DF761469C3C400DD0FF3 /* SearchResultsModel.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11E613E8A60300ABD295 /* SearchResultsModel.m */; }; + A932DF771469C3C400DD0FF3 /* ForwardingAdapters.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11EB13E8A60300ABD295 /* ForwardingAdapters.m */; }; + A932DF781469C3C400DD0FF3 /* URLModelResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11ED13E8A60300ABD295 /* URLModelResponse.m */; }; + A932DF791469C3C400DD0FF3 /* FlickrAddPhotoController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11F313E8A60300ABD295 /* FlickrAddPhotoController.m */; }; + A932DF7A1469C3C400DD0FF3 /* FlickrController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11F613E8A60300ABD295 /* FlickrController.m */; }; + A932DF7B1469C3C400DD0FF3 /* FlickrPageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11F913E8A60300ABD295 /* FlickrPageViewController.m */; }; + A932DF7C1469C3C400DD0FF3 /* AttendeeListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11F013E8A60300ABD295 /* AttendeeListViewController.m */; }; + A932DF7D1469C3C400DD0FF3 /* RegistrantDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11FB13E8A60300ABD295 /* RegistrantDetailViewController.m */; }; + A932DF7E1469C3C400DD0FF3 /* SearchPhotosViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11FD13E8A60300ABD295 /* SearchPhotosViewController.m */; }; + A932DF7F1469C3C400DD0FF3 /* SessionDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11FF13E8A60300ABD295 /* SessionDetailViewController.m */; }; + A932DF801469C3C400DD0FF3 /* TabController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E120513E8A60300ABD295 /* TabController.m */; }; + A932DF811469C3C400DD0FF3 /* TwitterFeedTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E120713E8A60300ABD295 /* TwitterFeedTableViewController.m */; }; + A932DF821469C3C400DD0FF3 /* HeaderSponsorsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A93840BF1410232100349F35 /* HeaderSponsorsViewController.m */; }; + A932DF831469C3C400DD0FF3 /* FlickrThumbnailView.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E120B13E8A60300ABD295 /* FlickrThumbnailView.m */; }; + A932DF841469C3C400DD0FF3 /* NSString+XMLEntities.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E121213E8A60300ABD295 /* NSString+XMLEntities.m */; }; + A932DF851469C3F400DD0FF3 /* libThree20.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 320D7DCCE32703ACAB9A45E4 /* libThree20.a */; }; + A932DF861469C3F400DD0FF3 /* libThree20Core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 320A2827FEC940B25BC42C64 /* libThree20Core.a */; }; + A932DF871469C3F400DD0FF3 /* libThree20Network.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 320A5A189C235877202780D4 /* libThree20Network.a */; }; + A932DF881469C3F400DD0FF3 /* libThree20Style.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 320CC833B8AF0ACFD35E6224 /* libThree20Style.a */; }; + A932DF891469C3F400DD0FF3 /* libThree20UI.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 320F2C48872C2E2C4DF86204 /* libThree20UI.a */; }; + A932DF8A1469C3F400DD0FF3 /* libThree20UICommon.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3201088596B4756681693704 /* libThree20UICommon.a */; }; + A932DF8B1469C3F400DD0FF3 /* libThree20UINavigator.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 320A737074758E53BA54BE94 /* libThree20UINavigator.a */; }; + A932DF8D1469C47700DD0FF3 /* CocoaCampAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A9D7C3D013E8A2B300604772 /* CocoaCampAppDelegate.m */; }; + A932DF8E1469C47700DD0FF3 /* CocoaCampAppDelegate_iPhone.m in Sources */ = {isa = PBXBuildFile; fileRef = A9D7C3D413E8A2B300604772 /* CocoaCampAppDelegate_iPhone.m */; }; + A932DF8F1469C47700DD0FF3 /* CocoaCampAppDelegate_iPad.m in Sources */ = {isa = PBXBuildFile; fileRef = A9D7C3DB13E8A2B300604772 /* CocoaCampAppDelegate_iPad.m */; }; + A932DF901469C4E400DD0FF3 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 320AF8492C47A4D819F7C450 /* QuartzCore.framework */; }; + A932DF921469C75D00DD0FF3 /* libBump.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A932DF911469C75D00DD0FF3 /* libBump.a */; }; + A932DF931469C75E00DD0FF3 /* libBump.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A932DF911469C75D00DD0FF3 /* libBump.a */; }; + A932DF961469CEAA00DD0FF3 /* WordPressApiSponsorLogosJsonParser.m in Sources */ = {isa = PBXBuildFile; fileRef = A932DF951469CEAA00DD0FF3 /* WordPressApiSponsorLogosJsonParser.m */; }; + A932DF971469CEAA00DD0FF3 /* WordPressApiSponsorLogosJsonParser.m in Sources */ = {isa = PBXBuildFile; fileRef = A932DF951469CEAA00DD0FF3 /* WordPressApiSponsorLogosJsonParser.m */; }; + A938403B140FC0D100349F35 /* Napaba-logo.png in Resources */ = {isa = PBXBuildFile; fileRef = A938403A140FC0D100349F35 /* Napaba-logo.png */; }; + A938403C140FC0D100349F35 /* Napaba-logo.png in Resources */ = {isa = PBXBuildFile; fileRef = A938403A140FC0D100349F35 /* Napaba-logo.png */; }; + A938403E140FC10E00349F35 /* branded.plist in Resources */ = {isa = PBXBuildFile; fileRef = A938403D140FC10E00349F35 /* branded.plist */; }; + A938403F140FC10E00349F35 /* branded.plist in Resources */ = {isa = PBXBuildFile; fileRef = A938403D140FC10E00349F35 /* branded.plist */; }; + A9384047140FC4A500349F35 /* CCBranding.m in Sources */ = {isa = PBXBuildFile; fileRef = A9384046140FC4A500349F35 /* CCBranding.m */; }; + A9384048140FC4A500349F35 /* CCBranding.m in Sources */ = {isa = PBXBuildFile; fileRef = A9384046140FC4A500349F35 /* CCBranding.m */; }; + A938404A140FFDFB00349F35 /* NapabaHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9384049140FFDFB00349F35 /* NapabaHeaderView.xib */; }; + A938404B140FFDFB00349F35 /* NapabaHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9384049140FFDFB00349F35 /* NapabaHeaderView.xib */; }; + A938404D1410054800349F35 /* Napaba-Background.png in Resources */ = {isa = PBXBuildFile; fileRef = A938404C1410054800349F35 /* Napaba-Background.png */; }; + A938404E1410054800349F35 /* Napaba-Background.png in Resources */ = {isa = PBXBuildFile; fileRef = A938404C1410054800349F35 /* Napaba-Background.png */; }; + A93840581410133000349F35 /* news-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = A93840561410133000349F35 /* news-icon.png */; }; + A93840591410133000349F35 /* news-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = A93840561410133000349F35 /* news-icon.png */; }; + A938405A1410133000349F35 /* news-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A93840571410133000349F35 /* news-icon@2x.png */; }; + A938405B1410133000349F35 /* news-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A93840571410133000349F35 /* news-icon@2x.png */; }; + A93840621410194300349F35 /* GDataXMLNode.m in Sources */ = {isa = PBXBuildFile; fileRef = A93840611410194300349F35 /* GDataXMLNode.m */; }; + A93840631410194300349F35 /* GDataXMLNode.m in Sources */ = {isa = PBXBuildFile; fileRef = A93840611410194300349F35 /* GDataXMLNode.m */; }; + A93840651410198100349F35 /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A93840641410198000349F35 /* libxml2.dylib */; }; + A9384070141019D400349F35 /* RssDetailsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A9384068141019D400349F35 /* RssDetailsViewController.m */; }; + A9384071141019D400349F35 /* RssDetailsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A9384068141019D400349F35 /* RssDetailsViewController.m */; }; + A9384072141019D400349F35 /* RssDetailsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9384069141019D400349F35 /* RssDetailsViewController.xib */; }; + A9384073141019D400349F35 /* RssDetailsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9384069141019D400349F35 /* RssDetailsViewController.xib */; }; + A9384074141019D400349F35 /* RssNewsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A938406B141019D400349F35 /* RssNewsViewController.m */; }; + A9384075141019D400349F35 /* RssNewsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A938406B141019D400349F35 /* RssNewsViewController.m */; }; + A9384076141019D400349F35 /* RSSLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = A938406D141019D400349F35 /* RSSLoader.m */; }; + A9384077141019D400349F35 /* RSSLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = A938406D141019D400349F35 /* RSSLoader.m */; }; + A9384078141019D400349F35 /* RssTableHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = A938406F141019D400349F35 /* RssTableHeaderView.m */; }; + A9384079141019D400349F35 /* RssTableHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = A938406F141019D400349F35 /* RssTableHeaderView.m */; }; + A938407C14101A2F00349F35 /* arss_back.png in Resources */ = {isa = PBXBuildFile; fileRef = A938407A14101A2E00349F35 /* arss_back.png */; }; + A938407D14101A2F00349F35 /* arss_back.png in Resources */ = {isa = PBXBuildFile; fileRef = A938407A14101A2E00349F35 /* arss_back.png */; }; + A938407E14101A2F00349F35 /* arss_header.png in Resources */ = {isa = PBXBuildFile; fileRef = A938407B14101A2E00349F35 /* arss_header.png */; }; + A938407F14101A2F00349F35 /* arss_header.png in Resources */ = {isa = PBXBuildFile; fileRef = A938407B14101A2E00349F35 /* arss_header.png */; }; + A93840BC14101BC200349F35 /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A93840641410198000349F35 /* libxml2.dylib */; }; + A93840C11410232200349F35 /* HeaderSponsorsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A93840BF1410232100349F35 /* HeaderSponsorsViewController.m */; }; + A93840C5141024FB00349F35 /* HeaderSponsorView.m in Sources */ = {isa = PBXBuildFile; fileRef = A93840C4141024FB00349F35 /* HeaderSponsorView.m */; }; + A93840C6141024FB00349F35 /* HeaderSponsorView.m in Sources */ = {isa = PBXBuildFile; fileRef = A93840C4141024FB00349F35 /* HeaderSponsorView.m */; }; + A93E093B14A3C48800585DA2 /* qrcode-cocoacamp-url.png in Resources */ = {isa = PBXBuildFile; fileRef = A93E093A14A3C48800585DA2 /* qrcode-cocoacamp-url.png */; }; + A951B63D144F187800C35649 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A951B63C144F187800C35649 /* CoreData.framework */; }; + A951B649144F188000C35649 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A951B63C144F187800C35649 /* CoreData.framework */; }; + A951B689144F193600C35649 /* CocoaCamp.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = A951B687144F193600C35649 /* CocoaCamp.xcdatamodeld */; }; + A951B68A144F194000C35649 /* CocoaCamp.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = A951B687144F193600C35649 /* CocoaCamp.xcdatamodeld */; }; + A951B695144F2FE900C35649 /* WebServiceUrlManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A951B693144F2FE900C35649 /* WebServiceUrlManager.m */; }; + A951B696144F2FE900C35649 /* WebServiceUrlManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A951B693144F2FE900C35649 /* WebServiceUrlManager.m */; }; + A951B699144F300800C35649 /* WebServiceDataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A951B698144F300800C35649 /* WebServiceDataManager.m */; }; + A951B69A144F300800C35649 /* WebServiceDataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A951B698144F300800C35649 /* WebServiceDataManager.m */; }; + A951B69F144F33A100C35649 /* CoreDataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A951B69E144F33A100C35649 /* CoreDataManager.m */; }; + A951B6A0144F33A100C35649 /* CoreDataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A951B69E144F33A100C35649 /* CoreDataManager.m */; }; + A951B6AB144F3AE000C35649 /* WordPressApiSessionsJsonParser.m in Sources */ = {isa = PBXBuildFile; fileRef = A951B6AA144F3AE000C35649 /* WordPressApiSessionsJsonParser.m */; }; + A951B6AC144F3AE000C35649 /* WordPressApiSessionsJsonParser.m in Sources */ = {isa = PBXBuildFile; fileRef = A951B6AA144F3AE000C35649 /* WordPressApiSessionsJsonParser.m */; }; + A951B6ED144F3C6A00C35649 /* WordPressApiSessionsJsonParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A951B6EC144F3C6A00C35649 /* WordPressApiSessionsJsonParserTests.m */; }; + A951B6EE144F481700C35649 /* AttendeeListJson.js in Resources */ = {isa = PBXBuildFile; fileRef = A904B53213E8F2B200E021CF /* AttendeeListJson.js */; }; + A951B6F0144F4F8E00C35649 /* WordPressScheduleDay.js in Resources */ = {isa = PBXBuildFile; fileRef = A951B6EF144F4F8E00C35649 /* WordPressScheduleDay.js */; }; + A951B6F1144F4F8E00C35649 /* WordPressScheduleDay.js in Resources */ = {isa = PBXBuildFile; fileRef = A951B6EF144F4F8E00C35649 /* WordPressScheduleDay.js */; }; + A951B6FA144FA69400C35649 /* CocoaCamp.xcdatamodeld in Resources */ = {isa = PBXBuildFile; fileRef = A951B687144F193600C35649 /* CocoaCamp.xcdatamodeld */; }; + A951B6FB144FA6F700C35649 /* CocoaCamp.xcdatamodeld in Resources */ = {isa = PBXBuildFile; fileRef = A951B687144F193600C35649 /* CocoaCamp.xcdatamodeld */; }; + A951B6FE144FB26900C35649 /* Session.m in Sources */ = {isa = PBXBuildFile; fileRef = A951B6FD144FB26900C35649 /* Session.m */; }; + A951B6FF144FB26900C35649 /* Session.m in Sources */ = {isa = PBXBuildFile; fileRef = A951B6FD144FB26900C35649 /* Session.m */; }; + A951B70E144FB5B100C35649 /* SessionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A951B70C144FB5B000C35649 /* SessionViewController.m */; }; + A951B70F144FB5B100C35649 /* SessionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A951B70C144FB5B000C35649 /* SessionViewController.m */; }; + A951B710144FB5B100C35649 /* SessionViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A951B70D144FB5B100C35649 /* SessionViewController.xib */; }; + A951B711144FB5B100C35649 /* SessionViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A951B70D144FB5B100C35649 /* SessionViewController.xib */; }; + A951B750144FCCAC00C35649 /* GTMNSString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = A951B74F144FCCAC00C35649 /* GTMNSString+HTML.m */; }; + A951B764144FE2F000C35649 /* Allstate_Platinum.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A951B75D144FE2EE00C35649 /* Allstate_Platinum.jpg */; }; + A951B765144FE2F000C35649 /* Allstate_Platinum.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A951B75D144FE2EE00C35649 /* Allstate_Platinum.jpg */; }; + A951B766144FE2F000C35649 /* AlstonBird_Platinum.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A951B75E144FE2EF00C35649 /* AlstonBird_Platinum.jpg */; }; + A951B767144FE2F000C35649 /* AlstonBird_Platinum.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A951B75E144FE2EF00C35649 /* AlstonBird_Platinum.jpg */; }; + A951B768144FE2F000C35649 /* Prudential_Platinum.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A951B75F144FE2EF00C35649 /* Prudential_Platinum.jpg */; }; + A951B769144FE2F000C35649 /* Prudential_Platinum.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A951B75F144FE2EF00C35649 /* Prudential_Platinum.jpg */; }; + A951B76A144FE2F000C35649 /* SchiffHardin_Platinum.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A951B760144FE2EF00C35649 /* SchiffHardin_Platinum.jpg */; }; + A951B76B144FE2F000C35649 /* SchiffHardin_Platinum.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A951B760144FE2EF00C35649 /* SchiffHardin_Platinum.jpg */; }; + A951B76C144FE2F000C35649 /* Seyfarth_Platinum.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A951B761144FE2EF00C35649 /* Seyfarth_Platinum.jpg */; }; + A951B76D144FE2F000C35649 /* Seyfarth_Platinum.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A951B761144FE2EF00C35649 /* Seyfarth_Platinum.jpg */; }; + A951B770144FE2F000C35649 /* Walmart_Premier.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A951B763144FE2EF00C35649 /* Walmart_Premier.jpg */; }; + A951B771144FE2F000C35649 /* Walmart_Premier.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A951B763144FE2EF00C35649 /* Walmart_Premier.jpg */; }; + A976F96713E8AA0C007E9290 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A976F96613E8AA0C007E9290 /* MessageUI.framework */; }; + A976F96B13E8AA7A007E9290 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A976F96A13E8AA7A007E9290 /* AudioToolbox.framework */; }; + A976F96D13E8AA96007E9290 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A976F96C13E8AA96007E9290 /* CoreLocation.framework */; }; + A976F96E13E8AA9F007E9290 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A976F96C13E8AA96007E9290 /* CoreLocation.framework */; }; + A976F96F13E8AAA2007E9290 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A976F96613E8AA0C007E9290 /* MessageUI.framework */; }; + A976F97013E8AAA4007E9290 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A976F96A13E8AA7A007E9290 /* AudioToolbox.framework */; }; + A97B0F2A144FF69500E4A687 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A97B0F26144FF69500E4A687 /* Icon@2x.png */; }; + A97B0F2B144FF69500E4A687 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A97B0F26144FF69500E4A687 /* Icon@2x.png */; }; + A97B0F2F144FF71800E4A687 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = A97B0F2E144FF71800E4A687 /* Default.png */; }; + A97B0F31144FF72500E4A687 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = A97B0F30144FF72500E4A687 /* Icon.png */; }; + A97B0F37144FF79600E4A687 /* napaba-launch.png in Resources */ = {isa = PBXBuildFile; fileRef = A97B0F36144FF79500E4A687 /* napaba-launch.png */; }; + A98B6D501469D6FC00F3B2EB /* Microsoft.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A98B6D4F1469D6FC00F3B2EB /* Microsoft.jpg */; }; + A98E121313E8A60300ABD295 /* bump_button_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11AB13E8A60300ABD295 /* bump_button_blue.png */; }; + A98E121413E8A60300ABD295 /* bump_close.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11AC13E8A60300ABD295 /* bump_close.png */; }; + A98E121513E8A60300ABD295 /* bump_close_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11AD13E8A60300ABD295 /* bump_close_selected.png */; }; + A98E121613E8A60300ABD295 /* bump_content_area.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11AE13E8A60300ABD295 /* bump_content_area.png */; }; + A98E121713E8A60300ABD295 /* bump_dropdown.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11AF13E8A60300ABD295 /* bump_dropdown.png */; }; + A98E121813E8A60300ABD295 /* bump_hands_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11B013E8A60300ABD295 /* bump_hands_bg.png */; }; + A98E121913E8A60300ABD295 /* bump_lefthand.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11B113E8A60300ABD295 /* bump_lefthand.png */; }; + A98E121A13E8A60300ABD295 /* bump_nameview.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11B213E8A60300ABD295 /* bump_nameview.png */; }; + A98E121B13E8A60300ABD295 /* bump_no_button.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11B313E8A60300ABD295 /* bump_no_button.png */; }; + A98E121C13E8A60300ABD295 /* bump_nonetwork.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11B413E8A60300ABD295 /* bump_nonetwork.png */; }; + A98E121D13E8A60300ABD295 /* bump_popupdefault.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11B513E8A60300ABD295 /* bump_popupdefault.png */; }; + A98E121E13E8A60300ABD295 /* bump_righthand.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11B613E8A60300ABD295 /* bump_righthand.png */; }; + A98E121F13E8A60300ABD295 /* bump_signal1.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11B713E8A60300ABD295 /* bump_signal1.png */; }; + A98E122013E8A60300ABD295 /* bump_signal2.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11B813E8A60300ABD295 /* bump_signal2.png */; }; + A98E122113E8A60300ABD295 /* bump_signal3.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11B913E8A60300ABD295 /* bump_signal3.png */; }; + A98E122213E8A60300ABD295 /* bump_signal4.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11BA13E8A60300ABD295 /* bump_signal4.png */; }; + A98E122313E8A60300ABD295 /* bump_tap.aif in Resources */ = {isa = PBXBuildFile; fileRef = A98E11BB13E8A60300ABD295 /* bump_tap.aif */; }; + A98E122413E8A60300ABD295 /* bump_titlebar_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11BC13E8A60300ABD295 /* bump_titlebar_bg.png */; }; + A98E122513E8A60300ABD295 /* bump_white_low.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11BD13E8A60300ABD295 /* bump_white_low.png */; }; + A98E122613E8A60300ABD295 /* bump_yes_button.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E11BE13E8A60300ABD295 /* bump_yes_button.png */; }; + A98E122713E8A60300ABD295 /* BumpApiPopup.xib in Resources */ = {isa = PBXBuildFile; fileRef = A98E11BF13E8A60300ABD295 /* BumpApiPopup.xib */; }; + A98E122813E8A60300ABD295 /* BumpChangeNameScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = A98E11C013E8A60300ABD295 /* BumpChangeNameScreen.xib */; }; + A98E122913E8A60300ABD295 /* BumpConfirmScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = A98E11C113E8A60300ABD295 /* BumpConfirmScreen.xib */; }; + A98E122A13E8A60300ABD295 /* BumpPromptScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = A98E11C213E8A60300ABD295 /* BumpPromptScreen.xib */; }; + A98E122B13E8A60300ABD295 /* BumpStartScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = A98E11C313E8A60300ABD295 /* BumpStartScreen.xib */; }; + A98E122D13E8A60300ABD295 /* ContactManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11C813E8A60300ABD295 /* ContactManager.m */; }; + A98E122E13E8A60300ABD295 /* PortraitLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11CA13E8A60300ABD295 /* PortraitLoader.m */; }; + A98E122F13E8A60300ABD295 /* FlickrJSONResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11CE13E8A60300ABD295 /* FlickrJSONResponse.m */; }; + A98E123013E8A60300ABD295 /* NSObject+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11D213E8A60300ABD295 /* NSObject+SBJSON.m */; }; + A98E123113E8A60300ABD295 /* NSString+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11D413E8A60300ABD295 /* NSString+SBJSON.m */; }; + A98E123213E8A60300ABD295 /* SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11D613E8A60300ABD295 /* SBJSON.m */; }; + A98E123313E8A60300ABD295 /* SBJsonBase.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11D813E8A60300ABD295 /* SBJsonBase.m */; }; + A98E123413E8A60300ABD295 /* SBJsonParser.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11DA13E8A60300ABD295 /* SBJsonParser.m */; }; + A98E123513E8A60300ABD295 /* SBJsonWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11DC13E8A60300ABD295 /* SBJsonWriter.m */; }; + A98E123613E8A60300ABD295 /* FlickrSearchResultsModel.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11E013E8A60300ABD295 /* FlickrSearchResultsModel.m */; }; + A98E123713E8A60300ABD295 /* Registrant.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11E213E8A60300ABD295 /* Registrant.m */; }; + A98E123813E8A60300ABD295 /* SearchResult.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11E413E8A60300ABD295 /* SearchResult.m */; }; + A98E123913E8A60300ABD295 /* SearchResultsModel.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11E613E8A60300ABD295 /* SearchResultsModel.m */; }; + A98E123A13E8A60300ABD295 /* SearchResultsPhotoSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11E813E8A60300ABD295 /* SearchResultsPhotoSource.m */; }; + A98E123B13E8A60300ABD295 /* ForwardingAdapters.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11EB13E8A60300ABD295 /* ForwardingAdapters.m */; }; + A98E123C13E8A60300ABD295 /* URLModelResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11ED13E8A60300ABD295 /* URLModelResponse.m */; }; + A98E123D13E8A60300ABD295 /* AttendeeListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11F013E8A60300ABD295 /* AttendeeListViewController.m */; }; + A98E123E13E8A60300ABD295 /* FlickrAddPhotoController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11F313E8A60300ABD295 /* FlickrAddPhotoController.m */; }; + A98E123F13E8A60300ABD295 /* FlickrAddPhotoController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A98E11F413E8A60300ABD295 /* FlickrAddPhotoController.xib */; }; + A98E124013E8A60300ABD295 /* FlickrController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11F613E8A60300ABD295 /* FlickrController.m */; }; + A98E124113E8A60300ABD295 /* FlickrController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A98E11F713E8A60300ABD295 /* FlickrController.xib */; }; + A98E124213E8A60300ABD295 /* FlickrPageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11F913E8A60300ABD295 /* FlickrPageViewController.m */; }; + A98E124313E8A60300ABD295 /* RegistrantDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11FB13E8A60300ABD295 /* RegistrantDetailViewController.m */; }; + A98E124413E8A60300ABD295 /* SearchPhotosViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11FD13E8A60300ABD295 /* SearchPhotosViewController.m */; }; + A98E124513E8A60300ABD295 /* SessionDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E11FF13E8A60300ABD295 /* SessionDetailViewController.m */; }; + A98E124613E8A60300ABD295 /* SessionDetailViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A98E120013E8A60300ABD295 /* SessionDetailViewController.xib */; }; + A98E124713E8A60300ABD295 /* OLDSessionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E120213E8A60300ABD295 /* OLDSessionViewController.m */; }; + A98E124813E8A60300ABD295 /* OLDSessionViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A98E120313E8A60300ABD295 /* OLDSessionViewController.xib */; }; + A98E124913E8A60300ABD295 /* TabController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E120513E8A60300ABD295 /* TabController.m */; }; + A98E124A13E8A60300ABD295 /* TwitterFeedTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E120713E8A60300ABD295 /* TwitterFeedTableViewController.m */; }; + A98E124B13E8A60300ABD295 /* FlickrPageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A98E120913E8A60300ABD295 /* FlickrPageView.xib */; }; + A98E124C13E8A60300ABD295 /* FlickrThumbnailView.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E120B13E8A60300ABD295 /* FlickrThumbnailView.m */; }; + A98E124D13E8A60300ABD295 /* RegistrantDetailView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A98E120C13E8A60300ABD295 /* RegistrantDetailView.xib */; }; + A98E124E13E8A60300ABD295 /* RegistrantListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A98E120D13E8A60300ABD295 /* RegistrantListView.xib */; }; + A98E124F13E8A60300ABD295 /* TwitterFeedTableView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A98E120E13E8A60300ABD295 /* TwitterFeedTableView.xib */; }; + A98E125013E8A60300ABD295 /* TwitterFeedTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = A98E120F13E8A60300ABD295 /* TwitterFeedTableViewCell.xib */; }; + A98E125113E8A60300ABD295 /* NSString+XMLEntities.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E121213E8A60300ABD295 /* NSString+XMLEntities.m */; }; + A98E126513E8A63700ABD295 /* 512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E125313E8A63700ABD295 /* 512x512.png */; }; + A98E126613E8A63700ABD295 /* bird.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E125413E8A63700ABD295 /* bird.png */; }; + A98E126713E8A63700ABD295 /* bump.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E125513E8A63700ABD295 /* bump.png */; }; + A98E126813E8A63700ABD295 /* bump@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E125613E8A63700ABD295 /* bump@2x.png */; }; + A98E126913E8A63700ABD295 /* bump_righthand.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E125713E8A63700ABD295 /* bump_righthand.png */; }; + A98E126A13E8A63700ABD295 /* calendar.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E125813E8A63700ABD295 /* calendar.png */; }; + A98E126B13E8A63700ABD295 /* ContactExchangeView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A98E125913E8A63700ABD295 /* ContactExchangeView.xib */; }; + A98E126C13E8A63700ABD295 /* flickrbackground.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E125A13E8A63700ABD295 /* flickrbackground.png */; }; + A98E126D13E8A63700ABD295 /* group.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E125B13E8A63700ABD295 /* group.png */; }; + A98E126E13E8A63700ABD295 /* headerBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E125C13E8A63700ABD295 /* headerBackground.png */; }; + A98E126F13E8A63700ABD295 /* iPhoneAppIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E125D13E8A63700ABD295 /* iPhoneAppIcon.png */; }; + A98E127013E8A63700ABD295 /* iPhoneAppIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E125E13E8A63700ABD295 /* iPhoneAppIcon@2x.png */; }; + A98E127113E8A63700ABD295 /* keynote-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E125F13E8A63700ABD295 /* keynote-icon.png */; }; + A98E127213E8A63700ABD295 /* keynote-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E126013E8A63700ABD295 /* keynote-icon@2x.png */; }; + A98E127313E8A63700ABD295 /* loading.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E126113E8A63700ABD295 /* loading.png */; }; + A98E127413E8A63700ABD295 /* photoIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E126213E8A63700ABD295 /* photoIcon.png */; }; + A98E127513E8A63700ABD295 /* roundrecbuttonnorm.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E126313E8A63700ABD295 /* roundrecbuttonnorm.png */; }; + A98E127613E8A63700ABD295 /* roundrecbuttonpress.png in Resources */ = {isa = PBXBuildFile; fileRef = A98E126413E8A63700ABD295 /* roundrecbuttonpress.png */; }; + A98E127E13E8A73400ABD295 /* GTMNSDictionary+URLArguments.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E127B13E8A73400ABD295 /* GTMNSDictionary+URLArguments.m */; }; + A98E127F13E8A73400ABD295 /* GTMNSDictionary+URLArguments.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E127B13E8A73400ABD295 /* GTMNSDictionary+URLArguments.m */; }; + A98E128013E8A73400ABD295 /* GTMNSString+URLArguments.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E127D13E8A73400ABD295 /* GTMNSString+URLArguments.m */; }; + A98E128113E8A73400ABD295 /* GTMNSString+URLArguments.m in Sources */ = {isa = PBXBuildFile; fileRef = A98E127D13E8A73400ABD295 /* GTMNSString+URLArguments.m */; }; + A98E128313E8A77400ABD295 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A98E128213E8A77400ABD295 /* AddressBook.framework */; }; + A98E128413E8A77E00ABD295 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A98E128213E8A77400ABD295 /* AddressBook.framework */; }; + A9D7C3C113E8A2B300604772 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9D7C3C013E8A2B300604772 /* UIKit.framework */; }; + A9D7C3C313E8A2B300604772 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9D7C3C213E8A2B300604772 /* Foundation.framework */; }; + A9D7C3C513E8A2B300604772 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9D7C3C413E8A2B300604772 /* CoreGraphics.framework */; }; + A9D7C3CB13E8A2B300604772 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = A9D7C3C913E8A2B300604772 /* InfoPlist.strings */; }; + A9D7C3CD13E8A2B300604772 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = A9D7C3CC13E8A2B300604772 /* main.m */; }; + A9D7C3D113E8A2B300604772 /* CocoaCampAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A9D7C3D013E8A2B300604772 /* CocoaCampAppDelegate.m */; }; + A9D7C3D513E8A2B300604772 /* CocoaCampAppDelegate_iPhone.m in Sources */ = {isa = PBXBuildFile; fileRef = A9D7C3D413E8A2B300604772 /* CocoaCampAppDelegate_iPhone.m */; }; + A9D7C3D813E8A2B300604772 /* MainWindow_iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9D7C3D613E8A2B300604772 /* MainWindow_iPhone.xib */; }; + A9D7C3DC13E8A2B300604772 /* CocoaCampAppDelegate_iPad.m in Sources */ = {isa = PBXBuildFile; fileRef = A9D7C3DB13E8A2B300604772 /* CocoaCampAppDelegate_iPad.m */; }; + A9D7C3DF13E8A2B300604772 /* MainWindow_iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9D7C3DD13E8A2B300604772 /* MainWindow_iPad.xib */; }; + A9D7C3E713E8A2B400604772 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9D7C3E613E8A2B400604772 /* SenTestingKit.framework */; }; + A9D7C3E813E8A2B400604772 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9D7C3C013E8A2B300604772 /* UIKit.framework */; }; + A9D7C3E913E8A2B400604772 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9D7C3C213E8A2B300604772 /* Foundation.framework */; }; + A9D7C3EA13E8A2B400604772 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9D7C3C413E8A2B300604772 /* CoreGraphics.framework */; }; + A9D7C3F213E8A2B400604772 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = A9D7C3F013E8A2B400604772 /* InfoPlist.strings */; }; + A9D7C3F413E8A2B400604772 /* CocoaCampTests.h in Resources */ = {isa = PBXBuildFile; fileRef = A9D7C3F313E8A2B400604772 /* CocoaCampTests.h */; }; + A9D7C3F613E8A2B400604772 /* CocoaCampTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A9D7C3F513E8A2B400604772 /* CocoaCampTests.m */; }; + A9E62550145E432100CB124F /* sustainability.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A9E6254E145E432100CB124F /* sustainability.jpg */; }; + A9E62551145E432100CB124F /* sustainability@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A9E6254F145E432100CB124F /* sustainability@2x.jpg */; }; + A9F2F73F14A3A9DD0060FF62 /* libzbar.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F2F73914A3A9DD0060FF62 /* libzbar.a */; }; + A9F2F74014A3A9DD0060FF62 /* libzbar.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F2F73914A3A9DD0060FF62 /* libzbar.a */; }; + A9F2F74114A3A9DD0060FF62 /* zbar-back.png in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F73B14A3A9DD0060FF62 /* zbar-back.png */; }; + A9F2F74214A3A9DD0060FF62 /* zbar-back.png in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F73B14A3A9DD0060FF62 /* zbar-back.png */; }; + A9F2F74314A3A9DD0060FF62 /* zbar-help.html in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F73C14A3A9DD0060FF62 /* zbar-help.html */; }; + A9F2F74414A3A9DD0060FF62 /* zbar-help.html in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F73C14A3A9DD0060FF62 /* zbar-help.html */; }; + A9F2F74514A3A9DD0060FF62 /* zbar-helpicons.png in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F73D14A3A9DD0060FF62 /* zbar-helpicons.png */; }; + A9F2F74614A3A9DD0060FF62 /* zbar-helpicons.png in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F73D14A3A9DD0060FF62 /* zbar-helpicons.png */; }; + A9F2F74714A3A9DD0060FF62 /* zbar-samples.png in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F73E14A3A9DD0060FF62 /* zbar-samples.png */; }; + A9F2F74814A3A9DD0060FF62 /* zbar-samples.png in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F73E14A3A9DD0060FF62 /* zbar-samples.png */; }; + A9F2F74A14A3AA080060FF62 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F2F74914A3AA080060FF62 /* AVFoundation.framework */; }; + A9F2F74D14A3AA1B0060FF62 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F2F74B14A3AA1B0060FF62 /* CoreMedia.framework */; }; + A9F2F74E14A3AA1B0060FF62 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F2F74C14A3AA1B0060FF62 /* CoreVideo.framework */; }; + A9F2F75014A3AA2E0060FF62 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F2F74F14A3AA2E0060FF62 /* libiconv.dylib */; }; + A9F2F75314A3B3220060FF62 /* connect-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F75114A3B3220060FF62 /* connect-icon.png */; }; + A9F2F75414A3B3220060FF62 /* connect-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F75114A3B3220060FF62 /* connect-icon.png */; }; + A9F2F75514A3B3220060FF62 /* connect-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F75214A3B3220060FF62 /* connect-icon@2x.png */; }; + A9F2F75614A3B3220060FF62 /* connect-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F75214A3B3220060FF62 /* connect-icon@2x.png */; }; + A9F2F75A14A3B3C40060FF62 /* PeepsConnectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A9F2F75814A3B3C40060FF62 /* PeepsConnectViewController.m */; }; + A9F2F75B14A3B3C40060FF62 /* PeepsConnectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A9F2F75814A3B3C40060FF62 /* PeepsConnectViewController.m */; }; + A9F2F75C14A3B3C40060FF62 /* PeepsConnectViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F75914A3B3C40060FF62 /* PeepsConnectViewController.xib */; }; + A9F2F75D14A3B3C40060FF62 /* PeepsConnectViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F75914A3B3C40060FF62 /* PeepsConnectViewController.xib */; }; + A9F2F76014A3BDC60060FF62 /* qr-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F75E14A3BDC60060FF62 /* qr-icon.png */; }; + A9F2F76114A3BDC60060FF62 /* qr-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F75E14A3BDC60060FF62 /* qr-icon.png */; }; + A9F2F76214A3BDC60060FF62 /* qr-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F75F14A3BDC60060FF62 /* qr-icon@2x.png */; }; + A9F2F76314A3BDC60060FF62 /* qr-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A9F2F75F14A3BDC60060FF62 /* qr-icon@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - FB477A41120CA95E00FA7C4E /* PBXContainerItemProxy */ = { + 3201088596B4756681693702 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A16120CA95D00FA7C4E /* Three20.xcodeproj */; + containerPortal = 3201088596B4756681693700 /* Three20UICommon.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = BEF31F390F352DF5000DE5D2; + remoteInfo = Three20UICommon; + }; + 3201088596B4756681693706 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3201088596B4756681693700 /* Three20UICommon.xcodeproj */; proxyType = 2; remoteGlobalIDString = BEF31F3A0F352DF5000DE5D2; - remoteInfo = Three20; + remoteInfo = Three20UICommon; }; - FB477A43120CA95E00FA7C4E /* PBXContainerItemProxy */ = { + 320A2827FEC940B25BC42C62 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A16120CA95D00FA7C4E /* Three20.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; - remoteInfo = UnitTests; + containerPortal = 320A2827FEC940B25BC42C60 /* Three20Core.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = BEF31F390F352DF5000DE5D2; + remoteInfo = Three20Core; }; - FB477A68120CA9A500FA7C4E /* PBXContainerItemProxy */ = { + 320A2827FEC940B25BC42C66 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A54120CA9A500FA7C4E /* Three20Core.xcodeproj */; + containerPortal = 320A2827FEC940B25BC42C60 /* Three20Core.xcodeproj */; proxyType = 2; remoteGlobalIDString = BEF31F3A0F352DF5000DE5D2; remoteInfo = Three20Core; }; - FB477A6A120CA9A500FA7C4E /* PBXContainerItemProxy */ = { + 320A5A189C235877202780D2 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A54120CA9A500FA7C4E /* Three20Core.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; - remoteInfo = UnitTests; + containerPortal = 320A5A189C235877202780D0 /* Three20Network.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = BEF31F390F352DF5000DE5D2; + remoteInfo = Three20Network; }; - FB477A6E120CA9A500FA7C4E /* PBXContainerItemProxy */ = { + 320A5A189C235877202780D6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A57120CA9A500FA7C4E /* Three20Network.xcodeproj */; + containerPortal = 320A5A189C235877202780D0 /* Three20Network.xcodeproj */; proxyType = 2; remoteGlobalIDString = BEF31F3A0F352DF5000DE5D2; remoteInfo = Three20Network; }; - FB477A70120CA9A500FA7C4E /* PBXContainerItemProxy */ = { + 320A737074758E53BA54BE92 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A57120CA9A500FA7C4E /* Three20Network.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; - remoteInfo = UnitTests; + containerPortal = 320A737074758E53BA54BE90 /* Three20UINavigator.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = BEF31F390F352DF5000DE5D2; + remoteInfo = Three20UINavigator; }; - FB477A74120CA9A500FA7C4E /* PBXContainerItemProxy */ = { + 320A737074758E53BA54BE96 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A5A120CA9A500FA7C4E /* Three20Style.xcodeproj */; + containerPortal = 320A737074758E53BA54BE90 /* Three20UINavigator.xcodeproj */; proxyType = 2; remoteGlobalIDString = BEF31F3A0F352DF5000DE5D2; - remoteInfo = Three20Style; + remoteInfo = Three20UINavigator; }; - FB477A76120CA9A500FA7C4E /* PBXContainerItemProxy */ = { + 320CC833B8AF0ACFD35E6222 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A5A120CA9A500FA7C4E /* Three20Style.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; - remoteInfo = UnitTests; + containerPortal = 320CC833B8AF0ACFD35E6220 /* Three20Style.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = BEF31F390F352DF5000DE5D2; + remoteInfo = Three20Style; }; - FB477A7A120CA9A500FA7C4E /* PBXContainerItemProxy */ = { + 320CC833B8AF0ACFD35E6226 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A5D120CA9A500FA7C4E /* Three20UICommon.xcodeproj */; + containerPortal = 320CC833B8AF0ACFD35E6220 /* Three20Style.xcodeproj */; proxyType = 2; remoteGlobalIDString = BEF31F3A0F352DF5000DE5D2; - remoteInfo = Three20UICommon; + remoteInfo = Three20Style; }; - FB477A7C120CA9A500FA7C4E /* PBXContainerItemProxy */ = { + 320D7DCCE32703ACAB9A45E2 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A5D120CA9A500FA7C4E /* Three20UICommon.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; - remoteInfo = UnitTests; + containerPortal = 320D7DCCE32703ACAB9A45E0 /* Three20.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = BEF31F390F352DF5000DE5D2; + remoteInfo = Three20; }; - FB477A80120CA9A500FA7C4E /* PBXContainerItemProxy */ = { + 320D7DCCE32703ACAB9A45E6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A60120CA9A500FA7C4E /* Three20UINavigator.xcodeproj */; + containerPortal = 320D7DCCE32703ACAB9A45E0 /* Three20.xcodeproj */; proxyType = 2; remoteGlobalIDString = BEF31F3A0F352DF5000DE5D2; - remoteInfo = Three20UINavigator; + remoteInfo = Three20; }; - FB477A82120CA9A500FA7C4E /* PBXContainerItemProxy */ = { + 320F2C48872C2E2C4DF86202 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A60120CA9A500FA7C4E /* Three20UINavigator.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; - remoteInfo = UnitTests; + containerPortal = 320F2C48872C2E2C4DF86200 /* Three20UI.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = BEF31F390F352DF5000DE5D2; + remoteInfo = Three20UI; }; - FB477A86120CA9A500FA7C4E /* PBXContainerItemProxy */ = { + 320F2C48872C2E2C4DF86206 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A63120CA9A500FA7C4E /* Three20UI.xcodeproj */; + containerPortal = 320F2C48872C2E2C4DF86200 /* Three20UI.xcodeproj */; proxyType = 2; remoteGlobalIDString = BEF31F3A0F352DF5000DE5D2; remoteInfo = Three20UI; }; - FB477A88120CA9A500FA7C4E /* PBXContainerItemProxy */ = { + A976F94B13E8A999007E9290 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A63120CA9A500FA7C4E /* Three20UI.xcodeproj */; + containerPortal = 320D7DCCE32703ACAB9A45E0 /* Three20.xcodeproj */; proxyType = 2; remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; - remoteInfo = UnitTests; + remoteInfo = Three20UnitTests; }; - FB477A92120CAA8300FA7C4E /* PBXContainerItemProxy */ = { + A976F94E13E8A999007E9290 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A60120CA9A500FA7C4E /* Three20UINavigator.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BEF31F390F352DF5000DE5D2; - remoteInfo = Three20UINavigator; + containerPortal = 320A2827FEC940B25BC42C60 /* Three20Core.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; + remoteInfo = Three20CoreUnitTests; }; - FB477A94120CAA8300FA7C4E /* PBXContainerItemProxy */ = { + A976F95513E8A999007E9290 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A54120CA9A500FA7C4E /* Three20Core.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BEF31F390F352DF5000DE5D2; - remoteInfo = Three20Core; + containerPortal = 320A5A189C235877202780D0 /* Three20Network.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; + remoteInfo = Three20NetworkUnitTests; }; - FB477A96120CAA8300FA7C4E /* PBXContainerItemProxy */ = { + A976F95A13E8A999007E9290 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A16120CA95D00FA7C4E /* Three20.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BEF31F390F352DF5000DE5D2; - remoteInfo = Three20; + containerPortal = 320CC833B8AF0ACFD35E6220 /* Three20Style.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; + remoteInfo = Three20StyleUnitTests; }; - FB477A98120CAA8300FA7C4E /* PBXContainerItemProxy */ = { + A976F95D13E8A999007E9290 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A63120CA9A500FA7C4E /* Three20UI.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BEF31F390F352DF5000DE5D2; - remoteInfo = Three20UI; + containerPortal = 320F2C48872C2E2C4DF86200 /* Three20UI.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; + remoteInfo = Three20UIUnitTests; }; - FB477A9A120CAA8300FA7C4E /* PBXContainerItemProxy */ = { + A976F96013E8A999007E9290 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A57120CA9A500FA7C4E /* Three20Network.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BEF31F390F352DF5000DE5D2; - remoteInfo = Three20Network; + containerPortal = 3201088596B4756681693700 /* Three20UICommon.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; + remoteInfo = Three20UICommonUnitTests; }; - FB477A9C120CAA8300FA7C4E /* PBXContainerItemProxy */ = { + A976F96313E8A999007E9290 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A5D120CA9A500FA7C4E /* Three20UICommon.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BEF31F390F352DF5000DE5D2; - remoteInfo = Three20UICommon; + containerPortal = 320A737074758E53BA54BE90 /* Three20UINavigator.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; + remoteInfo = Three20UINavigatorUnitTests; }; - FB477A9E120CAA8300FA7C4E /* PBXContainerItemProxy */ = { + A9D7C3EB13E8A2B400604772 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = FB477A5A120CA9A500FA7C4E /* Three20Style.xcodeproj */; + containerPortal = A9D7C3B313E8A2B300604772 /* Project object */; proxyType = 1; - remoteGlobalIDString = BEF31F390F352DF5000DE5D2; - remoteInfo = Three20Style; + remoteGlobalIDString = A9D7C3BB13E8A2B300604772; + remoteInfo = CocoaCamp; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 030893A21226F05D0088A584 /* ContactExchangeView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ContactExchangeView.xib; path = Resources/ContactExchangeView.xib; sourceTree = ""; }; - 030894801226F1E40088A584 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; }; - 0308948D1226F2A90088A584 /* RegistrantListView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RegistrantListView.xib; sourceTree = ""; }; - 0308948F1226F2CA0088A584 /* AttendeeListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AttendeeListViewController.h; sourceTree = ""; }; - 030894901226F2CA0088A584 /* AttendeeListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AttendeeListViewController.m; sourceTree = ""; }; - 030894921226F2DB0088A584 /* Registrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Registrant.h; sourceTree = ""; }; - 030894931226F2DB0088A584 /* Registrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Registrant.m; sourceTree = ""; }; - 030894941226F2DB0088A584 /* RegistrantDetailView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RegistrantDetailView.xib; sourceTree = ""; }; - 030894951226F2DB0088A584 /* RegistrantDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegistrantDetailViewController.h; sourceTree = ""; }; - 030894961226F2DB0088A584 /* RegistrantDetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RegistrantDetailViewController.m; sourceTree = ""; }; - 0341222B12148A3400B376F7 /* SessionDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SessionDetailViewController.h; sourceTree = ""; }; - 0341222C12148A3400B376F7 /* SessionDetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SessionDetailViewController.m; sourceTree = ""; }; - 0341222D12148A3400B376F7 /* SessionDetailViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SessionDetailViewController.xib; sourceTree = ""; }; - 034654D512269693005A5D6C /* bump_button_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_button_blue.png; sourceTree = ""; }; - 034654D612269693005A5D6C /* bump_close.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_close.png; sourceTree = ""; }; - 034654D712269693005A5D6C /* bump_close_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_close_selected.png; sourceTree = ""; }; - 034654D812269693005A5D6C /* bump_content_area.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_content_area.png; sourceTree = ""; }; - 034654D912269693005A5D6C /* bump_dropdown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_dropdown.png; sourceTree = ""; }; - 034654DA12269693005A5D6C /* bump_hands_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_hands_bg.png; sourceTree = ""; }; - 034654DB12269693005A5D6C /* bump_lefthand.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_lefthand.png; sourceTree = ""; }; - 034654DC12269693005A5D6C /* bump_nameview.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_nameview.png; sourceTree = ""; }; - 034654DD12269693005A5D6C /* bump_no_button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_no_button.png; sourceTree = ""; }; - 034654DE12269693005A5D6C /* bump_nonetwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_nonetwork.png; sourceTree = ""; }; - 034654DF12269693005A5D6C /* bump_popupdefault.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_popupdefault.png; sourceTree = ""; }; - 034654E012269693005A5D6C /* bump_righthand.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_righthand.png; sourceTree = ""; }; - 034654E112269693005A5D6C /* bump_signal1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_signal1.png; sourceTree = ""; }; - 034654E212269693005A5D6C /* bump_signal2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_signal2.png; sourceTree = ""; }; - 034654E312269693005A5D6C /* bump_signal3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_signal3.png; sourceTree = ""; }; - 034654E412269693005A5D6C /* bump_signal4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_signal4.png; sourceTree = ""; }; - 034654E512269693005A5D6C /* bump_tap.aif */ = {isa = PBXFileReference; lastKnownFileType = file; path = bump_tap.aif; sourceTree = ""; }; - 034654E612269693005A5D6C /* bump_titlebar_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_titlebar_bg.png; sourceTree = ""; }; - 034654E712269693005A5D6C /* bump_white_low.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_white_low.png; sourceTree = ""; }; - 034654E812269693005A5D6C /* bump_yes_button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_yes_button.png; sourceTree = ""; }; - 034654E912269693005A5D6C /* BumpApiPopup.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BumpApiPopup.xib; sourceTree = ""; }; - 034654EA12269693005A5D6C /* BumpChangeNameScreen.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BumpChangeNameScreen.xib; sourceTree = ""; }; - 034654EB12269693005A5D6C /* BumpConfirmScreen.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BumpConfirmScreen.xib; sourceTree = ""; }; - 034654EC12269693005A5D6C /* BumpPromptScreen.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BumpPromptScreen.xib; sourceTree = ""; }; - 034654ED12269693005A5D6C /* BumpStartScreen.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BumpStartScreen.xib; sourceTree = ""; }; - 034A2BF712146E2A009F39A6 /* FlickrPageView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FlickrPageView.xib; sourceTree = ""; }; - 034A2BFB12146E7B009F39A6 /* roundrecbuttonpress.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = roundrecbuttonpress.png; sourceTree = ""; }; - 034A2BFD12146E91009F39A6 /* headerBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = headerBackground.png; sourceTree = ""; }; - 035B9D39122691540038129A /* calendar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = calendar.png; path = Resources/calendar.png; sourceTree = ""; }; - 035B9D3A122691540038129A /* group.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = group.png; path = Resources/group.png; sourceTree = ""; }; - 035B9D45122693520038129A /* loading.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = loading.png; path = Resources/loading.png; sourceTree = ""; }; - 03AE932212309B6200C188E9 /* TabController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TabController.h; sourceTree = ""; }; - 03AE932312309B6200C188E9 /* TabController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TabController.m; sourceTree = ""; }; - 03AF412612120F8D0061D5DD /* FlickrController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlickrController.h; sourceTree = ""; }; - 03AF412712120F8D0061D5DD /* FlickrController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlickrController.m; sourceTree = ""; }; - 03AF412812120F8D0061D5DD /* FlickrController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FlickrController.xib; sourceTree = ""; }; - 03AF412912120F8D0061D5DD /* FlickrPageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlickrPageViewController.h; sourceTree = ""; }; - 03AF412A12120F8D0061D5DD /* FlickrPageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlickrPageViewController.m; sourceTree = ""; }; - 03AF412E12120FA80061D5DD /* photoIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = photoIcon.png; sourceTree = ""; }; - 03AF412F12120FA80061D5DD /* roundrecbuttonnorm.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = roundrecbuttonnorm.png; sourceTree = ""; }; - 03CD36EA120D0F240054728C /* SessionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SessionViewController.h; sourceTree = ""; }; - 03CD36EB120D0F240054728C /* SessionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SessionViewController.m; sourceTree = ""; }; - 03CD36EC120D0F240054728C /* SessionViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SessionViewController.xib; sourceTree = ""; }; - 03CD372A120D68940054728C /* JSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSON.h; sourceTree = ""; }; - 03CD372B120D68940054728C /* NSObject+SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+SBJSON.h"; sourceTree = ""; }; - 03CD372C120D68940054728C /* NSObject+SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+SBJSON.m"; sourceTree = ""; }; - 03CD372D120D68940054728C /* NSString+SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+SBJSON.h"; sourceTree = ""; }; - 03CD372E120D68940054728C /* NSString+SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+SBJSON.m"; sourceTree = ""; }; - 03CD372F120D68940054728C /* SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJSON.h; sourceTree = ""; }; - 03CD3730120D68940054728C /* SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJSON.m; sourceTree = ""; }; - 03CD3731120D68940054728C /* SBJsonBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonBase.h; sourceTree = ""; }; - 03CD3732120D68940054728C /* SBJsonBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonBase.m; sourceTree = ""; }; - 03CD3733120D68940054728C /* SBJsonParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonParser.h; sourceTree = ""; }; - 03CD3734120D68940054728C /* SBJsonParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonParser.m; sourceTree = ""; }; - 03CD3735120D68940054728C /* SBJsonWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonWriter.h; sourceTree = ""; }; - 03CD3736120D68940054728C /* SBJsonWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonWriter.m; sourceTree = ""; }; - 03D53EAD122FCD5E004DBF63 /* FlickrSearchResultsModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlickrSearchResultsModel.h; sourceTree = ""; }; - 03D53EAE122FCD5E004DBF63 /* FlickrSearchResultsModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlickrSearchResultsModel.m; sourceTree = ""; }; - 03D53EAF122FCD5E004DBF63 /* FlickrJSONResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlickrJSONResponse.h; sourceTree = ""; }; - 03D53EB0122FCD5E004DBF63 /* FlickrJSONResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlickrJSONResponse.m; sourceTree = ""; }; - 03D53EB6122FCD7E004DBF63 /* SearchResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SearchResult.h; sourceTree = ""; }; - 03D53EB7122FCD7E004DBF63 /* SearchResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SearchResult.m; sourceTree = ""; }; - 03D53EB8122FCD7E004DBF63 /* URLModelResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = URLModelResponse.h; sourceTree = ""; }; - 03D53EB9122FCD7E004DBF63 /* URLModelResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = URLModelResponse.m; sourceTree = ""; }; - 03D53EBA122FCD7E004DBF63 /* SearchResultsModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SearchResultsModel.h; sourceTree = ""; }; - 03D53EBB122FCD7E004DBF63 /* SearchResultsModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SearchResultsModel.m; sourceTree = ""; }; - 03D53EC0122FCD96004DBF63 /* SearchPhotosViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SearchPhotosViewController.h; sourceTree = ""; }; - 03D53EC1122FCD96004DBF63 /* SearchPhotosViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SearchPhotosViewController.m; sourceTree = ""; }; - 03D53EC2122FCD96004DBF63 /* SearchResultsPhotoSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SearchResultsPhotoSource.h; sourceTree = ""; }; - 03D53EC3122FCD96004DBF63 /* SearchResultsPhotoSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SearchResultsPhotoSource.m; sourceTree = ""; }; - 03D53EC4122FCD96004DBF63 /* ForwardingAdapters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ForwardingAdapters.h; sourceTree = ""; }; - 03D53EC5122FCD96004DBF63 /* ForwardingAdapters.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ForwardingAdapters.m; sourceTree = ""; }; - 03D53F87122FD06B004DBF63 /* GTMDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMDefines.h; sourceTree = ""; }; - 03D53F88122FD06B004DBF63 /* GTMNSString+URLArguments.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GTMNSString+URLArguments.h"; sourceTree = ""; }; - 03D53F89122FD06B004DBF63 /* GTMNSString+URLArguments.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSString+URLArguments.m"; sourceTree = ""; }; - 03D53F8A122FD06B004DBF63 /* GTMNSDictionary+URLArguments.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GTMNSDictionary+URLArguments.h"; sourceTree = ""; }; - 03D53F8B122FD06B004DBF63 /* GTMNSDictionary+URLArguments.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSDictionary+URLArguments.m"; sourceTree = ""; }; - 03D540BB122FE001004DBF63 /* FlickrThumbnailView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlickrThumbnailView.h; sourceTree = ""; }; - 03D540BC122FE001004DBF63 /* FlickrThumbnailView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlickrThumbnailView.m; sourceTree = ""; }; - 03D54114122FEC87004DBF63 /* FlickrAddPhotoController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlickrAddPhotoController.h; sourceTree = ""; }; - 03D54115122FEC87004DBF63 /* FlickrAddPhotoController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlickrAddPhotoController.m; sourceTree = ""; }; - 03D54116122FEC87004DBF63 /* FlickrAddPhotoController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FlickrAddPhotoController.xib; sourceTree = ""; }; - 03F7D49E12326E1B007FE8C7 /* TwitterFeedTableView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TwitterFeedTableView.xib; sourceTree = ""; }; - 03F7D49F12326E1B007FE8C7 /* TwitterFeedTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TwitterFeedTableViewCell.xib; sourceTree = ""; }; - 03F7D4A012326E1B007FE8C7 /* TwitterFeedTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TwitterFeedTableViewController.h; sourceTree = ""; }; - 03F7D4A112326E1B007FE8C7 /* TwitterFeedTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TwitterFeedTableViewController.m; sourceTree = ""; }; - 03F7D4D31232713C007FE8C7 /* bird.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = bird.png; path = Resources/bird.png; sourceTree = ""; }; - 03F7D4D712327248007FE8C7 /* NSString+XMLEntities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+XMLEntities.h"; sourceTree = ""; }; - 03F7D4D812327248007FE8C7 /* NSString+XMLEntities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+XMLEntities.m"; sourceTree = ""; }; - 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D3623240D0F684500981E51 /* CocoaCampAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CocoaCampAppDelegate.h; sourceTree = ""; }; - 1D3623250D0F684500981E51 /* CocoaCampAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CocoaCampAppDelegate.m; sourceTree = ""; }; - 1D6058910D05DD3D006BFB54 /* CocoaCamp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CocoaCamp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 288765070DF74369002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 28A0AB4B0D9B1048005BE974 /* CocoaCamp_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CocoaCamp_Prefix.pch; sourceTree = ""; }; - 28AD73870D9D96C1002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; - 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 80C1A8BE1221CCCD007F7D7A /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 80C1A8C21221CCD9007F7D7A /* libBump.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libBump.a; sourceTree = ""; }; - 80C1A8C71221CCEB007F7D7A /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 80C1A8CF1221CD02007F7D7A /* ContactManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactManager.h; sourceTree = ""; }; - 80C1A8D01221CD02007F7D7A /* ContactManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactManager.m; sourceTree = ""; }; - 80C1A8D61221CD17007F7D7A /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; - 80C1A8D81221CD17007F7D7A /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; - 80C1A8F81221CDF4007F7D7A /* Bump.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bump.h; sourceTree = SOURCE_ROOT; }; - 80C1A8F91221CDF4007F7D7A /* BumpContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BumpContact.h; sourceTree = SOURCE_ROOT; }; - 8D1107310486CEB800E47090 /* CocoaCamp-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "CocoaCamp-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; - AB2AE44D11EBAA8E00015C01 /* 512x512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 512x512.png; sourceTree = ""; }; - AB2AE45811EBACF500015C01 /* iPhoneAppIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iPhoneAppIcon.png; sourceTree = ""; }; - AB2AE45911EBACF500015C01 /* iPhoneAppIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "iPhoneAppIcon@2x.png"; sourceTree = ""; }; - AB2AE45E11EBAD7D00015C01 /* LICENSE.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE.txt; sourceTree = ""; }; - FB477A16120CA95D00FA7C4E /* Three20.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20.xcodeproj; path = ../three20/src/Three20/Three20.xcodeproj; sourceTree = SOURCE_ROOT; }; - FB477A54120CA9A500FA7C4E /* Three20Core.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20Core.xcodeproj; path = ../three20/src/Three20Core/Three20Core.xcodeproj; sourceTree = SOURCE_ROOT; }; - FB477A57120CA9A500FA7C4E /* Three20Network.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20Network.xcodeproj; path = ../three20/src/Three20Network/Three20Network.xcodeproj; sourceTree = SOURCE_ROOT; }; - FB477A5A120CA9A500FA7C4E /* Three20Style.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20Style.xcodeproj; path = ../three20/src/Three20Style/Three20Style.xcodeproj; sourceTree = SOURCE_ROOT; }; - FB477A5D120CA9A500FA7C4E /* Three20UICommon.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20UICommon.xcodeproj; path = ../three20/src/Three20UICommon/Three20UICommon.xcodeproj; sourceTree = SOURCE_ROOT; }; - FB477A60120CA9A500FA7C4E /* Three20UINavigator.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20UINavigator.xcodeproj; path = ../three20/src/Three20UINavigator/Three20UINavigator.xcodeproj; sourceTree = SOURCE_ROOT; }; - FB477A63120CA9A500FA7C4E /* Three20UI.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20UI.xcodeproj; path = ../three20/src/Three20UI/Three20UI.xcodeproj; sourceTree = SOURCE_ROOT; }; - FB477AA1120CAAB700FA7C4E /* Three20.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Three20.bundle; path = ../three20/src/Three20.bundle; sourceTree = SOURCE_ROOT; }; - FB477ADD120CAAD900FA7C4E /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - FBF7E8211227E55000B7A710 /* keynote-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "keynote-icon.png"; path = "Resources/keynote-icon.png"; sourceTree = ""; }; - FBF7E8221227E55000B7A710 /* keynote-icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "keynote-icon@2x.png"; path = "Resources/keynote-icon@2x.png"; sourceTree = ""; }; + 3201088596B4756681693700 /* Three20UICommon.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20UICommon.xcodeproj; path = ../three20/src/Three20UICommon/Three20UICommon.xcodeproj; sourceTree = SOURCE_ROOT; }; + 320A2827FEC940B25BC42C60 /* Three20Core.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20Core.xcodeproj; path = ../three20/src/Three20Core/Three20Core.xcodeproj; sourceTree = SOURCE_ROOT; }; + 320A5A189C235877202780D0 /* Three20Network.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20Network.xcodeproj; path = ../three20/src/Three20Network/Three20Network.xcodeproj; sourceTree = SOURCE_ROOT; }; + 320A737074758E53BA54BE90 /* Three20UINavigator.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20UINavigator.xcodeproj; path = ../three20/src/Three20UINavigator/Three20UINavigator.xcodeproj; sourceTree = SOURCE_ROOT; }; + 320AF8492C47A4D819F7C450 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.frameworks; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 320B6C86F11D9990244A9730 /* Three20.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Three20.bundle; path = ../three20/src/Three20.bundle; sourceTree = SOURCE_ROOT; }; + 320CC833B8AF0ACFD35E6220 /* Three20Style.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20Style.xcodeproj; path = ../three20/src/Three20Style/Three20Style.xcodeproj; sourceTree = SOURCE_ROOT; }; + 320D7DCCE32703ACAB9A45E0 /* Three20.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20.xcodeproj; path = ../three20/src/Three20/Three20.xcodeproj; sourceTree = SOURCE_ROOT; }; + 320F2C48872C2E2C4DF86200 /* Three20UI.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20UI.xcodeproj; path = ../three20/src/Three20UI/Three20UI.xcodeproj; sourceTree = SOURCE_ROOT; }; + A904B52F13E8EBE400E021CF /* MainWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; + A904B53213E8F2B200E021CF /* AttendeeListJson.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = AttendeeListJson.js; sourceTree = ""; }; + A904B53E13E978E800E021CF /* webServiceConfig.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = webServiceConfig.plist; sourceTree = ""; }; + A932DF911469C75D00DD0FF3 /* libBump.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libBump.a; sourceTree = ""; }; + A932DF941469CEAA00DD0FF3 /* WordPressApiSponsorLogosJsonParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WordPressApiSponsorLogosJsonParser.h; sourceTree = ""; }; + A932DF951469CEAA00DD0FF3 /* WordPressApiSponsorLogosJsonParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WordPressApiSponsorLogosJsonParser.m; sourceTree = ""; }; + A938403A140FC0D100349F35 /* Napaba-logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Napaba-logo.png"; sourceTree = ""; }; + A938403D140FC10E00349F35 /* branded.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = branded.plist; sourceTree = ""; }; + A9384040140FC19800349F35 /* CocoaCampConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CocoaCampConstants.h; sourceTree = ""; }; + A9384045140FC4A500349F35 /* CCBranding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCBranding.h; sourceTree = ""; }; + A9384046140FC4A500349F35 /* CCBranding.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CCBranding.m; sourceTree = ""; }; + A9384049140FFDFB00349F35 /* NapabaHeaderView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NapabaHeaderView.xib; sourceTree = ""; }; + A938404C1410054800349F35 /* Napaba-Background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Napaba-Background.png"; sourceTree = ""; }; + A93840561410133000349F35 /* news-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "news-icon.png"; sourceTree = ""; }; + A93840571410133000349F35 /* news-icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "news-icon@2x.png"; sourceTree = ""; }; + A93840601410194300349F35 /* GDataXMLNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GDataXMLNode.h; sourceTree = ""; }; + A93840611410194300349F35 /* GDataXMLNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GDataXMLNode.m; sourceTree = ""; }; + A93840641410198000349F35 /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = usr/lib/libxml2.dylib; sourceTree = SDKROOT; }; + A9384067141019D400349F35 /* RssDetailsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RssDetailsViewController.h; sourceTree = ""; }; + A9384068141019D400349F35 /* RssDetailsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RssDetailsViewController.m; sourceTree = ""; }; + A9384069141019D400349F35 /* RssDetailsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RssDetailsViewController.xib; sourceTree = ""; }; + A938406A141019D400349F35 /* RssNewsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RssNewsViewController.h; sourceTree = ""; }; + A938406B141019D400349F35 /* RssNewsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RssNewsViewController.m; sourceTree = ""; }; + A938406C141019D400349F35 /* RSSLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RSSLoader.h; sourceTree = ""; }; + A938406D141019D400349F35 /* RSSLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RSSLoader.m; sourceTree = ""; }; + A938406E141019D400349F35 /* RssTableHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RssTableHeaderView.h; sourceTree = ""; }; + A938406F141019D400349F35 /* RssTableHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RssTableHeaderView.m; sourceTree = ""; }; + A938407A14101A2E00349F35 /* arss_back.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = arss_back.png; sourceTree = ""; }; + A938407B14101A2E00349F35 /* arss_header.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = arss_header.png; sourceTree = ""; }; + A93840BE1410232100349F35 /* HeaderSponsorsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeaderSponsorsViewController.h; sourceTree = ""; }; + A93840BF1410232100349F35 /* HeaderSponsorsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HeaderSponsorsViewController.m; sourceTree = ""; }; + A93840C3141024FB00349F35 /* HeaderSponsorView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeaderSponsorView.h; sourceTree = ""; }; + A93840C4141024FB00349F35 /* HeaderSponsorView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HeaderSponsorView.m; sourceTree = ""; }; + A93E093A14A3C48800585DA2 /* qrcode-cocoacamp-url.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "qrcode-cocoacamp-url.png"; sourceTree = ""; }; + A951B63C144F187800C35649 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + A951B688144F193600C35649 /* CocoaCamp.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = CocoaCamp.xcdatamodel; sourceTree = ""; }; + A951B693144F2FE900C35649 /* WebServiceUrlManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebServiceUrlManager.m; sourceTree = ""; }; + A951B694144F2FE900C35649 /* WebServiceUrlManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebServiceUrlManager.h; sourceTree = ""; }; + A951B697144F300800C35649 /* WebServiceDataManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebServiceDataManager.h; sourceTree = ""; }; + A951B698144F300800C35649 /* WebServiceDataManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebServiceDataManager.m; sourceTree = ""; }; + A951B69D144F33A100C35649 /* CoreDataManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreDataManager.h; sourceTree = ""; }; + A951B69E144F33A100C35649 /* CoreDataManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CoreDataManager.m; sourceTree = ""; }; + A951B6A9144F3AE000C35649 /* WordPressApiSessionsJsonParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WordPressApiSessionsJsonParser.h; sourceTree = ""; }; + A951B6AA144F3AE000C35649 /* WordPressApiSessionsJsonParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WordPressApiSessionsJsonParser.m; sourceTree = ""; }; + A951B6EB144F3C6A00C35649 /* WordPressApiSessionsJsonParserTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WordPressApiSessionsJsonParserTests.h; sourceTree = ""; }; + A951B6EC144F3C6A00C35649 /* WordPressApiSessionsJsonParserTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WordPressApiSessionsJsonParserTests.m; sourceTree = ""; }; + A951B6EF144F4F8E00C35649 /* WordPressScheduleDay.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = WordPressScheduleDay.js; sourceTree = ""; }; + A951B6FC144FB26900C35649 /* Session.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Session.h; sourceTree = ""; }; + A951B6FD144FB26900C35649 /* Session.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Session.m; sourceTree = ""; }; + A951B70B144FB5B000C35649 /* SessionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SessionViewController.h; sourceTree = ""; }; + A951B70C144FB5B000C35649 /* SessionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SessionViewController.m; sourceTree = ""; }; + A951B70D144FB5B100C35649 /* SessionViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SessionViewController.xib; sourceTree = ""; }; + A951B74E144FCCAC00C35649 /* GTMNSString+HTML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GTMNSString+HTML.h"; sourceTree = ""; }; + A951B74F144FCCAC00C35649 /* GTMNSString+HTML.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSString+HTML.m"; sourceTree = ""; }; + A951B75D144FE2EE00C35649 /* Allstate_Platinum.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Allstate_Platinum.jpg; sourceTree = ""; }; + A951B75E144FE2EF00C35649 /* AlstonBird_Platinum.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = AlstonBird_Platinum.jpg; sourceTree = ""; }; + A951B75F144FE2EF00C35649 /* Prudential_Platinum.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Prudential_Platinum.jpg; sourceTree = ""; }; + A951B760144FE2EF00C35649 /* SchiffHardin_Platinum.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = SchiffHardin_Platinum.jpg; sourceTree = ""; }; + A951B761144FE2EF00C35649 /* Seyfarth_Platinum.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Seyfarth_Platinum.jpg; sourceTree = ""; }; + A951B763144FE2EF00C35649 /* Walmart_Premier.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Walmart_Premier.jpg; sourceTree = ""; }; + A976F96613E8AA0C007E9290 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; }; + A976F96A13E8AA7A007E9290 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + A976F96C13E8AA96007E9290 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + A97B0F26144FF69500E4A687 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "CocoaCamp/Resources/Icon@2x.png"; sourceTree = ""; }; + A97B0F2E144FF71800E4A687 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; + A97B0F30144FF72500E4A687 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = ""; }; + A97B0F36144FF79500E4A687 /* napaba-launch.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "napaba-launch.png"; sourceTree = ""; }; + A98B6D4F1469D6FC00F3B2EB /* Microsoft.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Microsoft.jpg; sourceTree = ""; }; + A98E11A413E8A5E400ABD295 /* LICENSE.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE.txt; sourceTree = ""; }; + A98E11A513E8A5E400ABD295 /* README.mdown */ = {isa = PBXFileReference; lastKnownFileType = text; path = README.mdown; sourceTree = ""; }; + A98E11A913E8A60300ABD295 /* Bump.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bump.h; sourceTree = ""; }; + A98E11AB13E8A60300ABD295 /* bump_button_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_button_blue.png; sourceTree = ""; }; + A98E11AC13E8A60300ABD295 /* bump_close.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_close.png; sourceTree = ""; }; + A98E11AD13E8A60300ABD295 /* bump_close_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_close_selected.png; sourceTree = ""; }; + A98E11AE13E8A60300ABD295 /* bump_content_area.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_content_area.png; sourceTree = ""; }; + A98E11AF13E8A60300ABD295 /* bump_dropdown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_dropdown.png; sourceTree = ""; }; + A98E11B013E8A60300ABD295 /* bump_hands_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_hands_bg.png; sourceTree = ""; }; + A98E11B113E8A60300ABD295 /* bump_lefthand.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_lefthand.png; sourceTree = ""; }; + A98E11B213E8A60300ABD295 /* bump_nameview.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_nameview.png; sourceTree = ""; }; + A98E11B313E8A60300ABD295 /* bump_no_button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_no_button.png; sourceTree = ""; }; + A98E11B413E8A60300ABD295 /* bump_nonetwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_nonetwork.png; sourceTree = ""; }; + A98E11B513E8A60300ABD295 /* bump_popupdefault.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_popupdefault.png; sourceTree = ""; }; + A98E11B613E8A60300ABD295 /* bump_righthand.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_righthand.png; sourceTree = ""; }; + A98E11B713E8A60300ABD295 /* bump_signal1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_signal1.png; sourceTree = ""; }; + A98E11B813E8A60300ABD295 /* bump_signal2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_signal2.png; sourceTree = ""; }; + A98E11B913E8A60300ABD295 /* bump_signal3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_signal3.png; sourceTree = ""; }; + A98E11BA13E8A60300ABD295 /* bump_signal4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_signal4.png; sourceTree = ""; }; + A98E11BB13E8A60300ABD295 /* bump_tap.aif */ = {isa = PBXFileReference; lastKnownFileType = file; path = bump_tap.aif; sourceTree = ""; }; + A98E11BC13E8A60300ABD295 /* bump_titlebar_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_titlebar_bg.png; sourceTree = ""; }; + A98E11BD13E8A60300ABD295 /* bump_white_low.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_white_low.png; sourceTree = ""; }; + A98E11BE13E8A60300ABD295 /* bump_yes_button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_yes_button.png; sourceTree = ""; }; + A98E11BF13E8A60300ABD295 /* BumpApiPopup.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BumpApiPopup.xib; sourceTree = ""; }; + A98E11C013E8A60300ABD295 /* BumpChangeNameScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BumpChangeNameScreen.xib; sourceTree = ""; }; + A98E11C113E8A60300ABD295 /* BumpConfirmScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BumpConfirmScreen.xib; sourceTree = ""; }; + A98E11C213E8A60300ABD295 /* BumpPromptScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BumpPromptScreen.xib; sourceTree = ""; }; + A98E11C313E8A60300ABD295 /* BumpStartScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BumpStartScreen.xib; sourceTree = ""; }; + A98E11C413E8A60300ABD295 /* BumpContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BumpContact.h; sourceTree = ""; }; + A98E11C713E8A60300ABD295 /* ContactManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactManager.h; sourceTree = ""; }; + A98E11C813E8A60300ABD295 /* ContactManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactManager.m; sourceTree = ""; }; + A98E11C913E8A60300ABD295 /* PortraitLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PortraitLoader.h; sourceTree = ""; }; + A98E11CA13E8A60300ABD295 /* PortraitLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PortraitLoader.m; sourceTree = ""; }; + A98E11CB13E8A60300ABD295 /* PortraitLoaderDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PortraitLoaderDelegate.h; sourceTree = ""; }; + A98E11CD13E8A60300ABD295 /* FlickrJSONResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlickrJSONResponse.h; sourceTree = ""; }; + A98E11CE13E8A60300ABD295 /* FlickrJSONResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlickrJSONResponse.m; sourceTree = ""; }; + A98E11D013E8A60300ABD295 /* JSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSON.h; sourceTree = ""; }; + A98E11D113E8A60300ABD295 /* NSObject+SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+SBJSON.h"; sourceTree = ""; }; + A98E11D213E8A60300ABD295 /* NSObject+SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+SBJSON.m"; sourceTree = ""; }; + A98E11D313E8A60300ABD295 /* NSString+SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+SBJSON.h"; sourceTree = ""; }; + A98E11D413E8A60300ABD295 /* NSString+SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+SBJSON.m"; sourceTree = ""; }; + A98E11D513E8A60300ABD295 /* SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJSON.h; sourceTree = ""; }; + A98E11D613E8A60300ABD295 /* SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJSON.m; sourceTree = ""; }; + A98E11D713E8A60300ABD295 /* SBJsonBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonBase.h; sourceTree = ""; }; + A98E11D813E8A60300ABD295 /* SBJsonBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonBase.m; sourceTree = ""; }; + A98E11D913E8A60300ABD295 /* SBJsonParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonParser.h; sourceTree = ""; }; + A98E11DA13E8A60300ABD295 /* SBJsonParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonParser.m; sourceTree = ""; }; + A98E11DB13E8A60300ABD295 /* SBJsonWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonWriter.h; sourceTree = ""; }; + A98E11DC13E8A60300ABD295 /* SBJsonWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonWriter.m; sourceTree = ""; }; + A98E11DF13E8A60300ABD295 /* FlickrSearchResultsModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlickrSearchResultsModel.h; sourceTree = ""; }; + A98E11E013E8A60300ABD295 /* FlickrSearchResultsModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlickrSearchResultsModel.m; sourceTree = ""; }; + A98E11E113E8A60300ABD295 /* Registrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Registrant.h; sourceTree = ""; }; + A98E11E213E8A60300ABD295 /* Registrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Registrant.m; sourceTree = ""; }; + A98E11E313E8A60300ABD295 /* SearchResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SearchResult.h; sourceTree = ""; }; + A98E11E413E8A60300ABD295 /* SearchResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SearchResult.m; sourceTree = ""; }; + A98E11E513E8A60300ABD295 /* SearchResultsModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SearchResultsModel.h; sourceTree = ""; }; + A98E11E613E8A60300ABD295 /* SearchResultsModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SearchResultsModel.m; sourceTree = ""; }; + A98E11E713E8A60300ABD295 /* SearchResultsPhotoSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SearchResultsPhotoSource.h; sourceTree = ""; }; + A98E11E813E8A60300ABD295 /* SearchResultsPhotoSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SearchResultsPhotoSource.m; sourceTree = ""; }; + A98E11EA13E8A60300ABD295 /* ForwardingAdapters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ForwardingAdapters.h; sourceTree = ""; }; + A98E11EB13E8A60300ABD295 /* ForwardingAdapters.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ForwardingAdapters.m; sourceTree = ""; }; + A98E11EC13E8A60300ABD295 /* URLModelResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = URLModelResponse.h; sourceTree = ""; }; + A98E11ED13E8A60300ABD295 /* URLModelResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = URLModelResponse.m; sourceTree = ""; }; + A98E11EF13E8A60300ABD295 /* AttendeeListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AttendeeListViewController.h; sourceTree = ""; }; + A98E11F013E8A60300ABD295 /* AttendeeListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AttendeeListViewController.m; sourceTree = ""; }; + A98E11F213E8A60300ABD295 /* FlickrAddPhotoController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlickrAddPhotoController.h; sourceTree = ""; }; + A98E11F313E8A60300ABD295 /* FlickrAddPhotoController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlickrAddPhotoController.m; sourceTree = ""; }; + A98E11F413E8A60300ABD295 /* FlickrAddPhotoController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FlickrAddPhotoController.xib; sourceTree = ""; }; + A98E11F513E8A60300ABD295 /* FlickrController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlickrController.h; sourceTree = ""; }; + A98E11F613E8A60300ABD295 /* FlickrController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlickrController.m; sourceTree = ""; }; + A98E11F713E8A60300ABD295 /* FlickrController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FlickrController.xib; sourceTree = ""; }; + A98E11F813E8A60300ABD295 /* FlickrPageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlickrPageViewController.h; sourceTree = ""; }; + A98E11F913E8A60300ABD295 /* FlickrPageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlickrPageViewController.m; sourceTree = ""; }; + A98E11FA13E8A60300ABD295 /* RegistrantDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegistrantDetailViewController.h; sourceTree = ""; }; + A98E11FB13E8A60300ABD295 /* RegistrantDetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RegistrantDetailViewController.m; sourceTree = ""; }; + A98E11FC13E8A60300ABD295 /* SearchPhotosViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SearchPhotosViewController.h; sourceTree = ""; }; + A98E11FD13E8A60300ABD295 /* SearchPhotosViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SearchPhotosViewController.m; sourceTree = ""; }; + A98E11FE13E8A60300ABD295 /* SessionDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SessionDetailViewController.h; sourceTree = ""; }; + A98E11FF13E8A60300ABD295 /* SessionDetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SessionDetailViewController.m; sourceTree = ""; }; + A98E120013E8A60300ABD295 /* SessionDetailViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SessionDetailViewController.xib; sourceTree = ""; }; + A98E120113E8A60300ABD295 /* OLDSessionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OLDSessionViewController.h; sourceTree = ""; }; + A98E120213E8A60300ABD295 /* OLDSessionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OLDSessionViewController.m; sourceTree = ""; }; + A98E120313E8A60300ABD295 /* OLDSessionViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = OLDSessionViewController.xib; sourceTree = ""; }; + A98E120413E8A60300ABD295 /* TabController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TabController.h; sourceTree = ""; }; + A98E120513E8A60300ABD295 /* TabController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TabController.m; sourceTree = ""; }; + A98E120613E8A60300ABD295 /* TwitterFeedTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TwitterFeedTableViewController.h; sourceTree = ""; }; + A98E120713E8A60300ABD295 /* TwitterFeedTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TwitterFeedTableViewController.m; sourceTree = ""; }; + A98E120913E8A60300ABD295 /* FlickrPageView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FlickrPageView.xib; sourceTree = ""; }; + A98E120A13E8A60300ABD295 /* FlickrThumbnailView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlickrThumbnailView.h; sourceTree = ""; }; + A98E120B13E8A60300ABD295 /* FlickrThumbnailView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlickrThumbnailView.m; sourceTree = ""; }; + A98E120C13E8A60300ABD295 /* RegistrantDetailView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RegistrantDetailView.xib; sourceTree = ""; }; + A98E120D13E8A60300ABD295 /* RegistrantListView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RegistrantListView.xib; sourceTree = ""; }; + A98E120E13E8A60300ABD295 /* TwitterFeedTableView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TwitterFeedTableView.xib; sourceTree = ""; }; + A98E120F13E8A60300ABD295 /* TwitterFeedTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TwitterFeedTableViewCell.xib; sourceTree = ""; }; + A98E121113E8A60300ABD295 /* NSString+XMLEntities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+XMLEntities.h"; sourceTree = ""; }; + A98E121213E8A60300ABD295 /* NSString+XMLEntities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+XMLEntities.m"; sourceTree = ""; }; + A98E125313E8A63700ABD295 /* 512x512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 512x512.png; sourceTree = ""; }; + A98E125413E8A63700ABD295 /* bird.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bird.png; sourceTree = ""; }; + A98E125513E8A63700ABD295 /* bump.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump.png; sourceTree = ""; }; + A98E125613E8A63700ABD295 /* bump@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bump@2x.png"; sourceTree = ""; }; + A98E125713E8A63700ABD295 /* bump_righthand.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_righthand.png; sourceTree = ""; }; + A98E125813E8A63700ABD295 /* calendar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = calendar.png; sourceTree = ""; }; + A98E125913E8A63700ABD295 /* ContactExchangeView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ContactExchangeView.xib; sourceTree = ""; }; + A98E125A13E8A63700ABD295 /* flickrbackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = flickrbackground.png; sourceTree = ""; }; + A98E125B13E8A63700ABD295 /* group.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = group.png; sourceTree = ""; }; + A98E125C13E8A63700ABD295 /* headerBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = headerBackground.png; sourceTree = ""; }; + A98E125D13E8A63700ABD295 /* iPhoneAppIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iPhoneAppIcon.png; sourceTree = ""; }; + A98E125E13E8A63700ABD295 /* iPhoneAppIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "iPhoneAppIcon@2x.png"; sourceTree = ""; }; + A98E125F13E8A63700ABD295 /* keynote-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "keynote-icon.png"; sourceTree = ""; }; + A98E126013E8A63700ABD295 /* keynote-icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "keynote-icon@2x.png"; sourceTree = ""; }; + A98E126113E8A63700ABD295 /* loading.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = loading.png; sourceTree = ""; }; + A98E126213E8A63700ABD295 /* photoIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = photoIcon.png; sourceTree = ""; }; + A98E126313E8A63700ABD295 /* roundrecbuttonnorm.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = roundrecbuttonnorm.png; sourceTree = ""; }; + A98E126413E8A63700ABD295 /* roundrecbuttonpress.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = roundrecbuttonpress.png; sourceTree = ""; }; + A98E127913E8A73400ABD295 /* GTMDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMDefines.h; sourceTree = ""; }; + A98E127A13E8A73400ABD295 /* GTMNSDictionary+URLArguments.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GTMNSDictionary+URLArguments.h"; sourceTree = ""; }; + A98E127B13E8A73400ABD295 /* GTMNSDictionary+URLArguments.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSDictionary+URLArguments.m"; sourceTree = ""; }; + A98E127C13E8A73400ABD295 /* GTMNSString+URLArguments.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GTMNSString+URLArguments.h"; sourceTree = ""; }; + A98E127D13E8A73400ABD295 /* GTMNSString+URLArguments.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSString+URLArguments.m"; sourceTree = ""; }; + A98E128213E8A77400ABD295 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; + A9D7C3BC13E8A2B300604772 /* NAPABA.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NAPABA.app; sourceTree = BUILT_PRODUCTS_DIR; }; + A9D7C3C013E8A2B300604772 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + A9D7C3C213E8A2B300604772 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + A9D7C3C413E8A2B300604772 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + A9D7C3C813E8A2B300604772 /* CocoaCamp-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CocoaCamp-Info.plist"; sourceTree = ""; }; + A9D7C3CA13E8A2B300604772 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + A9D7C3CC13E8A2B300604772 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + A9D7C3CE13E8A2B300604772 /* CocoaCamp-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CocoaCamp-Prefix.pch"; sourceTree = ""; }; + A9D7C3CF13E8A2B300604772 /* CocoaCampAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CocoaCampAppDelegate.h; sourceTree = ""; }; + A9D7C3D013E8A2B300604772 /* CocoaCampAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CocoaCampAppDelegate.m; sourceTree = ""; }; + A9D7C3D313E8A2B300604772 /* CocoaCampAppDelegate_iPhone.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CocoaCampAppDelegate_iPhone.h; path = iPhone/CocoaCampAppDelegate_iPhone.h; sourceTree = ""; }; + A9D7C3D413E8A2B300604772 /* CocoaCampAppDelegate_iPhone.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = CocoaCampAppDelegate_iPhone.m; path = iPhone/CocoaCampAppDelegate_iPhone.m; sourceTree = ""; }; + A9D7C3D713E8A2B300604772 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = iPhone/en.lproj/MainWindow_iPhone.xib; sourceTree = ""; }; + A9D7C3DA13E8A2B300604772 /* CocoaCampAppDelegate_iPad.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CocoaCampAppDelegate_iPad.h; path = iPad/CocoaCampAppDelegate_iPad.h; sourceTree = ""; }; + A9D7C3DB13E8A2B300604772 /* CocoaCampAppDelegate_iPad.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = CocoaCampAppDelegate_iPad.m; path = iPad/CocoaCampAppDelegate_iPad.m; sourceTree = ""; }; + A9D7C3DE13E8A2B300604772 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = iPad/en.lproj/MainWindow_iPad.xib; sourceTree = ""; }; + A9D7C3E513E8A2B400604772 /* CocoaCampTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CocoaCampTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + A9D7C3E613E8A2B400604772 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; + A9D7C3EF13E8A2B400604772 /* CocoaCampTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CocoaCampTests-Info.plist"; sourceTree = ""; }; + A9D7C3F113E8A2B400604772 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + A9D7C3F313E8A2B400604772 /* CocoaCampTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CocoaCampTests.h; sourceTree = ""; }; + A9D7C3F513E8A2B400604772 /* CocoaCampTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CocoaCampTests.m; sourceTree = ""; }; + A9E6254E145E432100CB124F /* sustainability.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = sustainability.jpg; sourceTree = ""; }; + A9E6254F145E432100CB124F /* sustainability@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "sustainability@2x.jpg"; sourceTree = ""; }; + A9F2F72514A3A9DD0060FF62 /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = ""; }; + A9F2F72614A3A9DD0060FF62 /* Exception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Exception.h; sourceTree = ""; }; + A9F2F72714A3A9DD0060FF62 /* Image.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Image.h; sourceTree = ""; }; + A9F2F72814A3A9DD0060FF62 /* ImageScanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageScanner.h; sourceTree = ""; }; + A9F2F72914A3A9DD0060FF62 /* Processor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Processor.h; sourceTree = ""; }; + A9F2F72A14A3A9DD0060FF62 /* Scanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Scanner.h; sourceTree = ""; }; + A9F2F72B14A3A9DD0060FF62 /* Symbol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Symbol.h; sourceTree = ""; }; + A9F2F72C14A3A9DD0060FF62 /* Video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Video.h; sourceTree = ""; }; + A9F2F72D14A3A9DD0060FF62 /* Window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Window.h; sourceTree = ""; }; + A9F2F72E14A3A9DD0060FF62 /* zbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zbar.h; sourceTree = ""; }; + A9F2F72F14A3A9DD0060FF62 /* ZBarCameraSimulator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZBarCameraSimulator.h; sourceTree = ""; }; + A9F2F73014A3A9DD0060FF62 /* ZBarCaptureReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZBarCaptureReader.h; sourceTree = ""; }; + A9F2F73114A3A9DD0060FF62 /* ZBarHelpController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZBarHelpController.h; sourceTree = ""; }; + A9F2F73214A3A9DD0060FF62 /* ZBarImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZBarImage.h; sourceTree = ""; }; + A9F2F73314A3A9DD0060FF62 /* ZBarImageScanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZBarImageScanner.h; sourceTree = ""; }; + A9F2F73414A3A9DD0060FF62 /* ZBarReaderController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZBarReaderController.h; sourceTree = ""; }; + A9F2F73514A3A9DD0060FF62 /* ZBarReaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZBarReaderView.h; sourceTree = ""; }; + A9F2F73614A3A9DD0060FF62 /* ZBarReaderViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZBarReaderViewController.h; sourceTree = ""; }; + A9F2F73714A3A9DD0060FF62 /* ZBarSDK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZBarSDK.h; sourceTree = ""; }; + A9F2F73814A3A9DD0060FF62 /* ZBarSymbol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZBarSymbol.h; sourceTree = ""; }; + A9F2F73914A3A9DD0060FF62 /* libzbar.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libzbar.a; sourceTree = ""; }; + A9F2F73B14A3A9DD0060FF62 /* zbar-back.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "zbar-back.png"; sourceTree = ""; }; + A9F2F73C14A3A9DD0060FF62 /* zbar-help.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "zbar-help.html"; sourceTree = ""; }; + A9F2F73D14A3A9DD0060FF62 /* zbar-helpicons.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "zbar-helpicons.png"; sourceTree = ""; }; + A9F2F73E14A3A9DD0060FF62 /* zbar-samples.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "zbar-samples.png"; sourceTree = ""; }; + A9F2F74914A3AA080060FF62 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + A9F2F74B14A3AA1B0060FF62 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; + A9F2F74C14A3AA1B0060FF62 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; + A9F2F74F14A3AA2E0060FF62 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; + A9F2F75114A3B3220060FF62 /* connect-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "connect-icon.png"; sourceTree = ""; }; + A9F2F75214A3B3220060FF62 /* connect-icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "connect-icon@2x.png"; sourceTree = ""; }; + A9F2F75714A3B3C40060FF62 /* PeepsConnectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PeepsConnectViewController.h; sourceTree = ""; }; + A9F2F75814A3B3C40060FF62 /* PeepsConnectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PeepsConnectViewController.m; sourceTree = ""; }; + A9F2F75914A3B3C40060FF62 /* PeepsConnectViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PeepsConnectViewController.xib; sourceTree = ""; }; + A9F2F75E14A3BDC60060FF62 /* qr-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "qr-icon.png"; sourceTree = ""; }; + A9F2F75F14A3BDC60060FF62 /* qr-icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "qr-icon@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { + A9D7C3B913E8A2B300604772 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A9F2F75014A3AA2E0060FF62 /* libiconv.dylib in Frameworks */, + 320AF8492C47A4D819F7C451 /* QuartzCore.framework in Frameworks */, + A9F2F74D14A3AA1B0060FF62 /* CoreMedia.framework in Frameworks */, + A9F2F74E14A3AA1B0060FF62 /* CoreVideo.framework in Frameworks */, + A9F2F74A14A3AA080060FF62 /* AVFoundation.framework in Frameworks */, + A98E128313E8A77400ABD295 /* AddressBook.framework in Frameworks */, + A976F96B13E8AA7A007E9290 /* AudioToolbox.framework in Frameworks */, + A951B63D144F187800C35649 /* CoreData.framework in Frameworks */, + A9D7C3C513E8A2B300604772 /* CoreGraphics.framework in Frameworks */, + A976F96D13E8AA96007E9290 /* CoreLocation.framework in Frameworks */, + A9D7C3C313E8A2B300604772 /* Foundation.framework in Frameworks */, + A976F96713E8AA0C007E9290 /* MessageUI.framework in Frameworks */, + A9D7C3C113E8A2B300604772 /* UIKit.framework in Frameworks */, + A93840651410198100349F35 /* libxml2.dylib in Frameworks */, + 3201088596B4756681693705 /* libThree20UICommon.a in Frameworks */, + 320D7DCCE32703ACAB9A45E5 /* libThree20.a in Frameworks */, + 320A737074758E53BA54BE95 /* libThree20UINavigator.a in Frameworks */, + 320A2827FEC940B25BC42C65 /* libThree20Core.a in Frameworks */, + 320F2C48872C2E2C4DF86205 /* libThree20UI.a in Frameworks */, + 320A5A189C235877202780D5 /* libThree20Network.a in Frameworks */, + 320CC833B8AF0ACFD35E6225 /* libThree20Style.a in Frameworks */, + A932DF921469C75D00DD0FF3 /* libBump.a in Frameworks */, + A9F2F73F14A3A9DD0060FF62 /* libzbar.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A9D7C3E113E8A2B400604772 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, - 288765080DF74369002DB57D /* CoreGraphics.framework in Frameworks */, - FB477A8B120CA9CF00FA7C4E /* libThree20.a in Frameworks */, - FB477A8C120CA9D000FA7C4E /* libThree20Core.a in Frameworks */, - FB477A8D120CA9D100FA7C4E /* libThree20Network.a in Frameworks */, - FB477A8E120CA9D100FA7C4E /* libThree20Style.a in Frameworks */, - FB477A8F120CA9E000FA7C4E /* libThree20UI.a in Frameworks */, - FB477A90120CA9E200FA7C4E /* libThree20UICommon.a in Frameworks */, - FB477A91120CA9E200FA7C4E /* libThree20UINavigator.a in Frameworks */, - FB477ADE120CAAD900FA7C4E /* QuartzCore.framework in Frameworks */, - 80C1A8BF1221CCCD007F7D7A /* CoreLocation.framework in Frameworks */, - 80C1A8C31221CCD9007F7D7A /* libBump.a in Frameworks */, - 80C1A8C81221CCEB007F7D7A /* AudioToolbox.framework in Frameworks */, - 80C1A8D71221CD17007F7D7A /* AddressBook.framework in Frameworks */, - 80C1A8D91221CD17007F7D7A /* AddressBookUI.framework in Frameworks */, - 030894811226F1E40088A584 /* MessageUI.framework in Frameworks */, + A98E128413E8A77E00ABD295 /* AddressBook.framework in Frameworks */, + A976F97013E8AAA4007E9290 /* AudioToolbox.framework in Frameworks */, + A951B649144F188000C35649 /* CoreData.framework in Frameworks */, + A9D7C3EA13E8A2B400604772 /* CoreGraphics.framework in Frameworks */, + A976F96E13E8AA9F007E9290 /* CoreLocation.framework in Frameworks */, + A9D7C3E913E8A2B400604772 /* Foundation.framework in Frameworks */, + A976F96F13E8AAA2007E9290 /* MessageUI.framework in Frameworks */, + A932DF901469C4E400DD0FF3 /* QuartzCore.framework in Frameworks */, + A9D7C3E713E8A2B400604772 /* SenTestingKit.framework in Frameworks */, + A9D7C3E813E8A2B400604772 /* UIKit.framework in Frameworks */, + A932DF851469C3F400DD0FF3 /* libThree20.a in Frameworks */, + A932DF861469C3F400DD0FF3 /* libThree20Core.a in Frameworks */, + A932DF871469C3F400DD0FF3 /* libThree20Network.a in Frameworks */, + A932DF881469C3F400DD0FF3 /* libThree20Style.a in Frameworks */, + A932DF891469C3F400DD0FF3 /* libThree20UI.a in Frameworks */, + A932DF8A1469C3F400DD0FF3 /* libThree20UICommon.a in Frameworks */, + A932DF8B1469C3F400DD0FF3 /* libThree20UINavigator.a in Frameworks */, + A93840BC14101BC200349F35 /* libxml2.dylib in Frameworks */, + A932DF931469C75E00DD0FF3 /* libBump.a in Frameworks */, + A9F2F74014A3A9DD0060FF62 /* libzbar.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 034654D412269693005A5D6C /* Bump_Resources */ = { + 3201088596B4756681693703 /* Products */ = { isa = PBXGroup; children = ( - 034654D512269693005A5D6C /* bump_button_blue.png */, - 034654D612269693005A5D6C /* bump_close.png */, - 034654D712269693005A5D6C /* bump_close_selected.png */, - 034654D812269693005A5D6C /* bump_content_area.png */, - 034654D912269693005A5D6C /* bump_dropdown.png */, - 034654DA12269693005A5D6C /* bump_hands_bg.png */, - 034654DB12269693005A5D6C /* bump_lefthand.png */, - 034654DC12269693005A5D6C /* bump_nameview.png */, - 034654DD12269693005A5D6C /* bump_no_button.png */, - 034654DE12269693005A5D6C /* bump_nonetwork.png */, - 034654DF12269693005A5D6C /* bump_popupdefault.png */, - 034654E012269693005A5D6C /* bump_righthand.png */, - 034654E112269693005A5D6C /* bump_signal1.png */, - 034654E212269693005A5D6C /* bump_signal2.png */, - 034654E312269693005A5D6C /* bump_signal3.png */, - 034654E412269693005A5D6C /* bump_signal4.png */, - 034654E512269693005A5D6C /* bump_tap.aif */, - 034654E612269693005A5D6C /* bump_titlebar_bg.png */, - 034654E712269693005A5D6C /* bump_white_low.png */, - 034654E812269693005A5D6C /* bump_yes_button.png */, - 034654E912269693005A5D6C /* BumpApiPopup.xib */, - 034654EA12269693005A5D6C /* BumpChangeNameScreen.xib */, - 034654EB12269693005A5D6C /* BumpConfirmScreen.xib */, - 034654EC12269693005A5D6C /* BumpPromptScreen.xib */, - 034654ED12269693005A5D6C /* BumpStartScreen.xib */, + 3201088596B4756681693704 /* libThree20UICommon.a */, + A976F96113E8A999007E9290 /* UICommonUnitTests.octest */, ); - path = Bump_Resources; + name = Products; sourceTree = ""; }; - 03CD3729120D68940054728C /* JSON */ = { + 320A2827FEC940B25BC42C63 /* Products */ = { isa = PBXGroup; children = ( - 03CD372A120D68940054728C /* JSON.h */, - 03CD372B120D68940054728C /* NSObject+SBJSON.h */, - 03CD372C120D68940054728C /* NSObject+SBJSON.m */, - 03CD372D120D68940054728C /* NSString+SBJSON.h */, - 03CD372E120D68940054728C /* NSString+SBJSON.m */, - 03CD372F120D68940054728C /* SBJSON.h */, - 03CD3730120D68940054728C /* SBJSON.m */, - 03CD3731120D68940054728C /* SBJsonBase.h */, - 03CD3732120D68940054728C /* SBJsonBase.m */, - 03CD3733120D68940054728C /* SBJsonParser.h */, - 03CD3734120D68940054728C /* SBJsonParser.m */, - 03CD3735120D68940054728C /* SBJsonWriter.h */, - 03CD3736120D68940054728C /* SBJsonWriter.m */, - ); - path = JSON; + 320A2827FEC940B25BC42C64 /* libThree20Core.a */, + A976F94F13E8A999007E9290 /* CoreUnitTests.octest */, + ); + name = Products; sourceTree = ""; }; - 03D53EAC122FCD5E004DBF63 /* Flickr */ = { + 320A5A189C235877202780D3 /* Products */ = { isa = PBXGroup; children = ( - 03D53EAD122FCD5E004DBF63 /* FlickrSearchResultsModel.h */, - 03D53EAE122FCD5E004DBF63 /* FlickrSearchResultsModel.m */, - 03D53EAF122FCD5E004DBF63 /* FlickrJSONResponse.h */, - 03D53EB0122FCD5E004DBF63 /* FlickrJSONResponse.m */, + 320A5A189C235877202780D4 /* libThree20Network.a */, + A976F95613E8A999007E9290 /* NetworkUnitTests.octest */, ); - name = Flickr; + name = Products; sourceTree = ""; }; - 03D53EBF122FCD96004DBF63 /* Photo */ = { + 320A737074758E53BA54BE93 /* Products */ = { isa = PBXGroup; children = ( - 03D53EC0122FCD96004DBF63 /* SearchPhotosViewController.h */, - 03D53EC1122FCD96004DBF63 /* SearchPhotosViewController.m */, - 03D53EC2122FCD96004DBF63 /* SearchResultsPhotoSource.h */, - 03D53EC3122FCD96004DBF63 /* SearchResultsPhotoSource.m */, - 03D53EC4122FCD96004DBF63 /* ForwardingAdapters.h */, - 03D53EC5122FCD96004DBF63 /* ForwardingAdapters.m */, - ); - name = Photo; + 320A737074758E53BA54BE94 /* libThree20UINavigator.a */, + A976F96413E8A999007E9290 /* UINavigatorUnitTests.octest */, + ); + name = Products; sourceTree = ""; }; - 03D53F86122FD06B004DBF63 /* Google Toolbox for Mac */ = { + 320CC833B8AF0ACFD35E6223 /* Products */ = { isa = PBXGroup; children = ( - 03D53F87122FD06B004DBF63 /* GTMDefines.h */, - 03D53F88122FD06B004DBF63 /* GTMNSString+URLArguments.h */, - 03D53F89122FD06B004DBF63 /* GTMNSString+URLArguments.m */, - 03D53F8A122FD06B004DBF63 /* GTMNSDictionary+URLArguments.h */, - 03D53F8B122FD06B004DBF63 /* GTMNSDictionary+URLArguments.m */, - ); - name = "Google Toolbox for Mac"; - path = ..; + 320CC833B8AF0ACFD35E6224 /* libThree20Style.a */, + A976F95B13E8A999007E9290 /* StyleUnitTests.octest */, + ); + name = Products; sourceTree = ""; }; - 080E96DDFE201D6D7F000001 /* Classes */ = { + 320D7DCCE32703ACAB9A45E3 /* Products */ = { isa = PBXGroup; children = ( - 03D53F86122FD06B004DBF63 /* Google Toolbox for Mac */, - 03D53EBF122FCD96004DBF63 /* Photo */, - 03D53EB6122FCD7E004DBF63 /* SearchResult.h */, - 03D53EB7122FCD7E004DBF63 /* SearchResult.m */, - 03D53EB8122FCD7E004DBF63 /* URLModelResponse.h */, - 03D53EB9122FCD7E004DBF63 /* URLModelResponse.m */, - 03D53EBA122FCD7E004DBF63 /* SearchResultsModel.h */, - 03D53EBB122FCD7E004DBF63 /* SearchResultsModel.m */, - 03D53EAC122FCD5E004DBF63 /* Flickr */, - 030894921226F2DB0088A584 /* Registrant.h */, - 030894931226F2DB0088A584 /* Registrant.m */, - 030894941226F2DB0088A584 /* RegistrantDetailView.xib */, - 030894951226F2DB0088A584 /* RegistrantDetailViewController.h */, - 030894961226F2DB0088A584 /* RegistrantDetailViewController.m */, - 0308948F1226F2CA0088A584 /* AttendeeListViewController.h */, - 030894901226F2CA0088A584 /* AttendeeListViewController.m */, - 80C1A8F81221CDF4007F7D7A /* Bump.h */, - 80C1A8F91221CDF4007F7D7A /* BumpContact.h */, - 80C1A8CF1221CD02007F7D7A /* ContactManager.h */, - 80C1A8D01221CD02007F7D7A /* ContactManager.m */, - 03AF412612120F8D0061D5DD /* FlickrController.h */, - 03AF412712120F8D0061D5DD /* FlickrController.m */, - 03AF412812120F8D0061D5DD /* FlickrController.xib */, - 03AF412912120F8D0061D5DD /* FlickrPageViewController.h */, - 03AF412A12120F8D0061D5DD /* FlickrPageViewController.m */, - 034A2BF712146E2A009F39A6 /* FlickrPageView.xib */, - 03CD3729120D68940054728C /* JSON */, - 1D3623240D0F684500981E51 /* CocoaCampAppDelegate.h */, - 1D3623250D0F684500981E51 /* CocoaCampAppDelegate.m */, - 03CD36EA120D0F240054728C /* SessionViewController.h */, - 03CD36EB120D0F240054728C /* SessionViewController.m */, - 03CD36EC120D0F240054728C /* SessionViewController.xib */, - 0341222B12148A3400B376F7 /* SessionDetailViewController.h */, - 0341222C12148A3400B376F7 /* SessionDetailViewController.m */, - 0341222D12148A3400B376F7 /* SessionDetailViewController.xib */, - 03D540BB122FE001004DBF63 /* FlickrThumbnailView.h */, - 03D540BC122FE001004DBF63 /* FlickrThumbnailView.m */, - 03D54114122FEC87004DBF63 /* FlickrAddPhotoController.h */, - 03D54115122FEC87004DBF63 /* FlickrAddPhotoController.m */, - 03D54116122FEC87004DBF63 /* FlickrAddPhotoController.xib */, - 03AE932212309B6200C188E9 /* TabController.h */, - 03AE932312309B6200C188E9 /* TabController.m */, - 03F7D49E12326E1B007FE8C7 /* TwitterFeedTableView.xib */, - 03F7D49F12326E1B007FE8C7 /* TwitterFeedTableViewCell.xib */, - 03F7D4A012326E1B007FE8C7 /* TwitterFeedTableViewController.h */, - 03F7D4A112326E1B007FE8C7 /* TwitterFeedTableViewController.m */, - 03F7D4D712327248007FE8C7 /* NSString+XMLEntities.h */, - 03F7D4D812327248007FE8C7 /* NSString+XMLEntities.m */, + 320D7DCCE32703ACAB9A45E4 /* libThree20.a */, + A976F94C13E8A999007E9290 /* Three20UnitTests.octest */, ); - path = Classes; + name = Products; sourceTree = ""; }; - 19C28FACFE9D520D11CA2CBB /* Products */ = { + 320F2C48872C2E2C4DF86203 /* Products */ = { isa = PBXGroup; children = ( - 1D6058910D05DD3D006BFB54 /* CocoaCamp.app */, + 320F2C48872C2E2C4DF86204 /* libThree20UI.a */, + A976F95E13E8A999007E9290 /* UIUnitTests.octest */, ); name = Products; sourceTree = ""; }; - 29B97314FDCFA39411CA2CEA /* CocoaCamp */ = { + A904B53113E8F2B200E021CF /* SampleWebServiceData */ = { isa = PBXGroup; children = ( - 080E96DDFE201D6D7F000001 /* Classes */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, - 034654D412269693005A5D6C /* Bump_Resources */, - 29B97317FDCFA39411CA2CEA /* Resources */, - FB4779BC120CA66E00FA7C4E /* Dependencies */, - FB477987120CA57C00FA7C4E /* Libraries */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - 19C28FACFE9D520D11CA2CBB /* Products */, - AB2AE45E11EBAD7D00015C01 /* LICENSE.txt */, - ); - name = CocoaCamp; + A951B6EF144F4F8E00C35649 /* WordPressScheduleDay.js */, + A904B53213E8F2B200E021CF /* AttendeeListJson.js */, + ); + path = SampleWebServiceData; sourceTree = ""; }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { + A904B53413E8F2E100E021CF /* WebService */ = { isa = PBXGroup; children = ( - 28A0AB4B0D9B1048005BE974 /* CocoaCamp_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, + A951B694144F2FE900C35649 /* WebServiceUrlManager.h */, + A951B693144F2FE900C35649 /* WebServiceUrlManager.m */, + A951B697144F300800C35649 /* WebServiceDataManager.h */, + A951B698144F300800C35649 /* WebServiceDataManager.m */, + A951B6A9144F3AE000C35649 /* WordPressApiSessionsJsonParser.h */, + A951B6AA144F3AE000C35649 /* WordPressApiSessionsJsonParser.m */, + A932DF941469CEAA00DD0FF3 /* WordPressApiSponsorLogosJsonParser.h */, + A932DF951469CEAA00DD0FF3 /* WordPressApiSponsorLogosJsonParser.m */, ); - name = "Other Sources"; + path = WebService; sourceTree = ""; }; - 29B97317FDCFA39411CA2CEA /* Resources */ = { + A9384039140FC08000349F35 /* NAPABA */ = { isa = PBXGroup; children = ( - 0308948D1226F2A90088A584 /* RegistrantListView.xib */, - 030893A21226F05D0088A584 /* ContactExchangeView.xib */, - AB2AE44A11EBAA8500015C01 /* images */, - 28AD73870D9D96C1002E5188 /* MainWindow.xib */, - 8D1107310486CEB800E47090 /* CocoaCamp-Info.plist */, + A951B75C144FE2EE00C35649 /* sponsor-logos */, + A938404C1410054800349F35 /* Napaba-Background.png */, + A938403A140FC0D100349F35 /* Napaba-logo.png */, + A9384049140FFDFB00349F35 /* NapabaHeaderView.xib */, ); - name = Resources; + name = NAPABA; + path = BrandedImages/NAPABA; sourceTree = ""; }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { + A9384044140FC48100349F35 /* UI */ = { isa = PBXGroup; children = ( - 80C1A8C21221CCD9007F7D7A /* libBump.a */, - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - 288765070DF74369002DB57D /* CoreGraphics.framework */, - FB477ADD120CAAD900FA7C4E /* QuartzCore.framework */, - 80C1A8BE1221CCCD007F7D7A /* CoreLocation.framework */, - 80C1A8C71221CCEB007F7D7A /* AudioToolbox.framework */, - 80C1A8D61221CD17007F7D7A /* AddressBook.framework */, - 80C1A8D81221CD17007F7D7A /* AddressBookUI.framework */, - 030894801226F1E40088A584 /* MessageUI.framework */, + A9384045140FC4A500349F35 /* CCBranding.h */, + A9384046140FC4A500349F35 /* CCBranding.m */, ); - name = Frameworks; + path = UI; sourceTree = ""; }; - AB2AE44A11EBAA8500015C01 /* images */ = { + A93840661410199900349F35 /* Rss */ = { isa = PBXGroup; children = ( - 03F7D4D31232713C007FE8C7 /* bird.png */, - FBF7E8211227E55000B7A710 /* keynote-icon.png */, - FBF7E8221227E55000B7A710 /* keynote-icon@2x.png */, - 035B9D45122693520038129A /* loading.png */, - 035B9D39122691540038129A /* calendar.png */, - 035B9D3A122691540038129A /* group.png */, - 034A2BFD12146E91009F39A6 /* headerBackground.png */, - 03AF412E12120FA80061D5DD /* photoIcon.png */, - 034A2BFB12146E7B009F39A6 /* roundrecbuttonpress.png */, - 03AF412F12120FA80061D5DD /* roundrecbuttonnorm.png */, - AB2AE45811EBACF500015C01 /* iPhoneAppIcon.png */, - AB2AE45911EBACF500015C01 /* iPhoneAppIcon@2x.png */, - AB2AE44D11EBAA8E00015C01 /* 512x512.png */, - ); - name = images; + A9384067141019D400349F35 /* RssDetailsViewController.h */, + A9384068141019D400349F35 /* RssDetailsViewController.m */, + A9384069141019D400349F35 /* RssDetailsViewController.xib */, + A938406A141019D400349F35 /* RssNewsViewController.h */, + A938406B141019D400349F35 /* RssNewsViewController.m */, + A938406C141019D400349F35 /* RSSLoader.h */, + A938406D141019D400349F35 /* RSSLoader.m */, + A938406E141019D400349F35 /* RssTableHeaderView.h */, + A938406F141019D400349F35 /* RssTableHeaderView.m */, + ); + path = Rss; sourceTree = ""; }; - FB477987120CA57C00FA7C4E /* Libraries */ = { + A951B64A144F189800C35649 /* CoreData */ = { isa = PBXGroup; children = ( + A951B687144F193600C35649 /* CocoaCamp.xcdatamodeld */, + A951B6FC144FB26900C35649 /* Session.h */, + A951B6FD144FB26900C35649 /* Session.m */, ); - path = Libraries; + path = CoreData; sourceTree = ""; }; - FB4779BC120CA66E00FA7C4E /* Dependencies */ = { + A951B69C144F338200C35649 /* CoreData */ = { isa = PBXGroup; children = ( - FB477AA1120CAAB700FA7C4E /* Three20.bundle */, - FB477A16120CA95D00FA7C4E /* Three20.xcodeproj */, - FB477A54120CA9A500FA7C4E /* Three20Core.xcodeproj */, - FB477A57120CA9A500FA7C4E /* Three20Network.xcodeproj */, - FB477A5A120CA9A500FA7C4E /* Three20Style.xcodeproj */, - FB477A5D120CA9A500FA7C4E /* Three20UICommon.xcodeproj */, - FB477A60120CA9A500FA7C4E /* Three20UINavigator.xcodeproj */, - FB477A63120CA9A500FA7C4E /* Three20UI.xcodeproj */, - ); - name = Dependencies; + A951B69D144F33A100C35649 /* CoreDataManager.h */, + A951B69E144F33A100C35649 /* CoreDataManager.m */, + ); + path = CoreData; sourceTree = ""; }; - FB477A17120CA95D00FA7C4E /* Products */ = { + A951B6E9144F3C4D00C35649 /* Classes */ = { isa = PBXGroup; children = ( - FB477A42120CA95E00FA7C4E /* libThree20.a */, - FB477A44120CA95E00FA7C4E /* UnitTests.octest */, + A951B6EA144F3C4D00C35649 /* WebService */, ); - name = Products; + path = Classes; sourceTree = ""; }; - FB477A55120CA9A500FA7C4E /* Products */ = { + A951B6EA144F3C4D00C35649 /* WebService */ = { isa = PBXGroup; children = ( - FB477A69120CA9A500FA7C4E /* libThree20Core.a */, - FB477A6B120CA9A500FA7C4E /* CoreUnitTests.octest */, + A951B6EB144F3C6A00C35649 /* WordPressApiSessionsJsonParserTests.h */, + A951B6EC144F3C6A00C35649 /* WordPressApiSessionsJsonParserTests.m */, ); - name = Products; + path = WebService; sourceTree = ""; }; - FB477A58120CA9A500FA7C4E /* Products */ = { + A951B75C144FE2EE00C35649 /* sponsor-logos */ = { isa = PBXGroup; children = ( - FB477A6F120CA9A500FA7C4E /* libThree20Network.a */, - FB477A71120CA9A500FA7C4E /* UnitTests.octest */, + A98B6D4F1469D6FC00F3B2EB /* Microsoft.jpg */, + A9E6254E145E432100CB124F /* sustainability.jpg */, + A9E6254F145E432100CB124F /* sustainability@2x.jpg */, + A951B75D144FE2EE00C35649 /* Allstate_Platinum.jpg */, + A951B75E144FE2EF00C35649 /* AlstonBird_Platinum.jpg */, + A951B75F144FE2EF00C35649 /* Prudential_Platinum.jpg */, + A951B760144FE2EF00C35649 /* SchiffHardin_Platinum.jpg */, + A951B761144FE2EF00C35649 /* Seyfarth_Platinum.jpg */, + A951B763144FE2EF00C35649 /* Walmart_Premier.jpg */, ); - name = Products; + path = "sponsor-logos"; sourceTree = ""; }; - FB477A5B120CA9A500FA7C4E /* Products */ = { + A98E11A713E8A60300ABD295 /* Classes */ = { isa = PBXGroup; children = ( - FB477A75120CA9A500FA7C4E /* libThree20Style.a */, - FB477A77120CA9A500FA7C4E /* UnitTests.octest */, + A98E11A813E8A60300ABD295 /* Bump */, + A98E11C613E8A60300ABD295 /* Contact */, + A951B69C144F338200C35649 /* CoreData */, + A98E11CC13E8A60300ABD295 /* Json */, + A98E11DD13E8A60300ABD295 /* Model */, + A98E11E913E8A60300ABD295 /* Three20Adapters */, + A9384044140FC48100349F35 /* UI */, + A98E11EE13E8A60300ABD295 /* ViewControllers */, + A98E120813E8A60300ABD295 /* Views */, + A904B53413E8F2E100E021CF /* WebService */, + A98E121013E8A60300ABD295 /* Xml */, ); - name = Products; + path = Classes; sourceTree = ""; }; - FB477A5E120CA9A500FA7C4E /* Products */ = { + A98E11A813E8A60300ABD295 /* Bump */ = { isa = PBXGroup; children = ( - FB477A7B120CA9A500FA7C4E /* libThree20UICommon.a */, - FB477A7D120CA9A500FA7C4E /* UnitTests.octest */, + A932DF911469C75D00DD0FF3 /* libBump.a */, + A98E11A913E8A60300ABD295 /* Bump.h */, + A98E11AA13E8A60300ABD295 /* Bump_Resources */, + A98E11C413E8A60300ABD295 /* BumpContact.h */, ); - name = Products; + path = Bump; sourceTree = ""; }; - FB477A61120CA9A500FA7C4E /* Products */ = { + A98E11AA13E8A60300ABD295 /* Bump_Resources */ = { isa = PBXGroup; children = ( - FB477A81120CA9A500FA7C4E /* libThree20UINavigator.a */, - FB477A83120CA9A500FA7C4E /* UnitTests.octest */, + A98E11AB13E8A60300ABD295 /* bump_button_blue.png */, + A98E11AC13E8A60300ABD295 /* bump_close.png */, + A98E11AD13E8A60300ABD295 /* bump_close_selected.png */, + A98E11AE13E8A60300ABD295 /* bump_content_area.png */, + A98E11AF13E8A60300ABD295 /* bump_dropdown.png */, + A98E11B013E8A60300ABD295 /* bump_hands_bg.png */, + A98E11B113E8A60300ABD295 /* bump_lefthand.png */, + A98E11B213E8A60300ABD295 /* bump_nameview.png */, + A98E11B313E8A60300ABD295 /* bump_no_button.png */, + A98E11B413E8A60300ABD295 /* bump_nonetwork.png */, + A98E11B513E8A60300ABD295 /* bump_popupdefault.png */, + A98E11B613E8A60300ABD295 /* bump_righthand.png */, + A98E11B713E8A60300ABD295 /* bump_signal1.png */, + A98E11B813E8A60300ABD295 /* bump_signal2.png */, + A98E11B913E8A60300ABD295 /* bump_signal3.png */, + A98E11BA13E8A60300ABD295 /* bump_signal4.png */, + A98E11BB13E8A60300ABD295 /* bump_tap.aif */, + A98E11BC13E8A60300ABD295 /* bump_titlebar_bg.png */, + A98E11BD13E8A60300ABD295 /* bump_white_low.png */, + A98E11BE13E8A60300ABD295 /* bump_yes_button.png */, + A98E11BF13E8A60300ABD295 /* BumpApiPopup.xib */, + A98E11C013E8A60300ABD295 /* BumpChangeNameScreen.xib */, + A98E11C113E8A60300ABD295 /* BumpConfirmScreen.xib */, + A98E11C213E8A60300ABD295 /* BumpPromptScreen.xib */, + A98E11C313E8A60300ABD295 /* BumpStartScreen.xib */, ); - name = Products; + path = Bump_Resources; + sourceTree = ""; + }; + A98E11C613E8A60300ABD295 /* Contact */ = { + isa = PBXGroup; + children = ( + A98E11C713E8A60300ABD295 /* ContactManager.h */, + A98E11C813E8A60300ABD295 /* ContactManager.m */, + A98E11C913E8A60300ABD295 /* PortraitLoader.h */, + A98E11CA13E8A60300ABD295 /* PortraitLoader.m */, + A98E11CB13E8A60300ABD295 /* PortraitLoaderDelegate.h */, + ); + path = Contact; + sourceTree = ""; + }; + A98E11CC13E8A60300ABD295 /* Json */ = { + isa = PBXGroup; + children = ( + A98E11CD13E8A60300ABD295 /* FlickrJSONResponse.h */, + A98E11CE13E8A60300ABD295 /* FlickrJSONResponse.m */, + A98E11CF13E8A60300ABD295 /* SBJson */, + ); + path = Json; + sourceTree = ""; + }; + A98E11CF13E8A60300ABD295 /* SBJson */ = { + isa = PBXGroup; + children = ( + A98E11D013E8A60300ABD295 /* JSON.h */, + A98E11D113E8A60300ABD295 /* NSObject+SBJSON.h */, + A98E11D213E8A60300ABD295 /* NSObject+SBJSON.m */, + A98E11D313E8A60300ABD295 /* NSString+SBJSON.h */, + A98E11D413E8A60300ABD295 /* NSString+SBJSON.m */, + A98E11D513E8A60300ABD295 /* SBJSON.h */, + A98E11D613E8A60300ABD295 /* SBJSON.m */, + A98E11D713E8A60300ABD295 /* SBJsonBase.h */, + A98E11D813E8A60300ABD295 /* SBJsonBase.m */, + A98E11D913E8A60300ABD295 /* SBJsonParser.h */, + A98E11DA13E8A60300ABD295 /* SBJsonParser.m */, + A98E11DB13E8A60300ABD295 /* SBJsonWriter.h */, + A98E11DC13E8A60300ABD295 /* SBJsonWriter.m */, + ); + path = SBJson; + sourceTree = ""; + }; + A98E11DD13E8A60300ABD295 /* Model */ = { + isa = PBXGroup; + children = ( + A951B64A144F189800C35649 /* CoreData */, + A98E11DE13E8A60300ABD295 /* Flickr */, + A98E11E113E8A60300ABD295 /* Registrant.h */, + A98E11E213E8A60300ABD295 /* Registrant.m */, + A98E11E313E8A60300ABD295 /* SearchResult.h */, + A98E11E413E8A60300ABD295 /* SearchResult.m */, + A98E11E513E8A60300ABD295 /* SearchResultsModel.h */, + A98E11E613E8A60300ABD295 /* SearchResultsModel.m */, + A98E11E713E8A60300ABD295 /* SearchResultsPhotoSource.h */, + A98E11E813E8A60300ABD295 /* SearchResultsPhotoSource.m */, + ); + path = Model; + sourceTree = ""; + }; + A98E11DE13E8A60300ABD295 /* Flickr */ = { + isa = PBXGroup; + children = ( + A98E11DF13E8A60300ABD295 /* FlickrSearchResultsModel.h */, + A98E11E013E8A60300ABD295 /* FlickrSearchResultsModel.m */, + ); + path = Flickr; + sourceTree = ""; + }; + A98E11E913E8A60300ABD295 /* Three20Adapters */ = { + isa = PBXGroup; + children = ( + A98E11EA13E8A60300ABD295 /* ForwardingAdapters.h */, + A98E11EB13E8A60300ABD295 /* ForwardingAdapters.m */, + A98E11EC13E8A60300ABD295 /* URLModelResponse.h */, + A98E11ED13E8A60300ABD295 /* URLModelResponse.m */, + ); + path = Three20Adapters; + sourceTree = ""; + }; + A98E11EE13E8A60300ABD295 /* ViewControllers */ = { + isa = PBXGroup; + children = ( + A93840661410199900349F35 /* Rss */, + A98E11F113E8A60300ABD295 /* Flickr */, + A98E11EF13E8A60300ABD295 /* AttendeeListViewController.h */, + A98E11F013E8A60300ABD295 /* AttendeeListViewController.m */, + A98E11FA13E8A60300ABD295 /* RegistrantDetailViewController.h */, + A98E11FB13E8A60300ABD295 /* RegistrantDetailViewController.m */, + A98E11FC13E8A60300ABD295 /* SearchPhotosViewController.h */, + A98E11FD13E8A60300ABD295 /* SearchPhotosViewController.m */, + A98E11FE13E8A60300ABD295 /* SessionDetailViewController.h */, + A98E11FF13E8A60300ABD295 /* SessionDetailViewController.m */, + A98E120013E8A60300ABD295 /* SessionDetailViewController.xib */, + A98E120113E8A60300ABD295 /* OLDSessionViewController.h */, + A98E120213E8A60300ABD295 /* OLDSessionViewController.m */, + A98E120313E8A60300ABD295 /* OLDSessionViewController.xib */, + A98E120413E8A60300ABD295 /* TabController.h */, + A98E120513E8A60300ABD295 /* TabController.m */, + A98E120613E8A60300ABD295 /* TwitterFeedTableViewController.h */, + A98E120713E8A60300ABD295 /* TwitterFeedTableViewController.m */, + A93840BE1410232100349F35 /* HeaderSponsorsViewController.h */, + A93840BF1410232100349F35 /* HeaderSponsorsViewController.m */, + A951B70B144FB5B000C35649 /* SessionViewController.h */, + A951B70C144FB5B000C35649 /* SessionViewController.m */, + A951B70D144FB5B100C35649 /* SessionViewController.xib */, + A9F2F75714A3B3C40060FF62 /* PeepsConnectViewController.h */, + A9F2F75814A3B3C40060FF62 /* PeepsConnectViewController.m */, + A9F2F75914A3B3C40060FF62 /* PeepsConnectViewController.xib */, + ); + path = ViewControllers; + sourceTree = ""; + }; + A98E11F113E8A60300ABD295 /* Flickr */ = { + isa = PBXGroup; + children = ( + A98E11F213E8A60300ABD295 /* FlickrAddPhotoController.h */, + A98E11F313E8A60300ABD295 /* FlickrAddPhotoController.m */, + A98E11F413E8A60300ABD295 /* FlickrAddPhotoController.xib */, + A98E11F513E8A60300ABD295 /* FlickrController.h */, + A98E11F613E8A60300ABD295 /* FlickrController.m */, + A98E11F713E8A60300ABD295 /* FlickrController.xib */, + A98E11F813E8A60300ABD295 /* FlickrPageViewController.h */, + A98E11F913E8A60300ABD295 /* FlickrPageViewController.m */, + ); + path = Flickr; + sourceTree = ""; + }; + A98E120813E8A60300ABD295 /* Views */ = { + isa = PBXGroup; + children = ( + A98E120913E8A60300ABD295 /* FlickrPageView.xib */, + A98E120A13E8A60300ABD295 /* FlickrThumbnailView.h */, + A98E120B13E8A60300ABD295 /* FlickrThumbnailView.m */, + A98E120C13E8A60300ABD295 /* RegistrantDetailView.xib */, + A98E120D13E8A60300ABD295 /* RegistrantListView.xib */, + A98E120E13E8A60300ABD295 /* TwitterFeedTableView.xib */, + A98E120F13E8A60300ABD295 /* TwitterFeedTableViewCell.xib */, + A93840C3141024FB00349F35 /* HeaderSponsorView.h */, + A93840C4141024FB00349F35 /* HeaderSponsorView.m */, + ); + path = Views; + sourceTree = ""; + }; + A98E121013E8A60300ABD295 /* Xml */ = { + isa = PBXGroup; + children = ( + A98E121113E8A60300ABD295 /* NSString+XMLEntities.h */, + A98E121213E8A60300ABD295 /* NSString+XMLEntities.m */, + ); + path = Xml; + sourceTree = ""; + }; + A98E125213E8A63700ABD295 /* Resources */ = { + isa = PBXGroup; + children = ( + A93E093A14A3C48800585DA2 /* qrcode-cocoacamp-url.png */, + A9F2F75E14A3BDC60060FF62 /* qr-icon.png */, + A9F2F75F14A3BDC60060FF62 /* qr-icon@2x.png */, + A9384039140FC08000349F35 /* NAPABA */, + A904B53113E8F2B200E021CF /* SampleWebServiceData */, + A9F2F75114A3B3220060FF62 /* connect-icon.png */, + A9F2F75214A3B3220060FF62 /* connect-icon@2x.png */, + 320B6C86F11D9990244A9730 /* Three20.bundle */, + A98E125313E8A63700ABD295 /* 512x512.png */, + A938407A14101A2E00349F35 /* arss_back.png */, + A938407B14101A2E00349F35 /* arss_header.png */, + A98E125413E8A63700ABD295 /* bird.png */, + A98E125513E8A63700ABD295 /* bump.png */, + A98E125613E8A63700ABD295 /* bump@2x.png */, + A98E125713E8A63700ABD295 /* bump_righthand.png */, + A98E125813E8A63700ABD295 /* calendar.png */, + A98E125913E8A63700ABD295 /* ContactExchangeView.xib */, + A98E125A13E8A63700ABD295 /* flickrbackground.png */, + A98E125B13E8A63700ABD295 /* group.png */, + A98E125C13E8A63700ABD295 /* headerBackground.png */, + A98E125D13E8A63700ABD295 /* iPhoneAppIcon.png */, + A98E125E13E8A63700ABD295 /* iPhoneAppIcon@2x.png */, + A98E125F13E8A63700ABD295 /* keynote-icon.png */, + A98E126013E8A63700ABD295 /* keynote-icon@2x.png */, + A93840561410133000349F35 /* news-icon.png */, + A93840571410133000349F35 /* news-icon@2x.png */, + A98E126113E8A63700ABD295 /* loading.png */, + A98E126213E8A63700ABD295 /* photoIcon.png */, + A98E126313E8A63700ABD295 /* roundrecbuttonnorm.png */, + A98E126413E8A63700ABD295 /* roundrecbuttonpress.png */, + A904B53E13E978E800E021CF /* webServiceConfig.plist */, + A938403D140FC10E00349F35 /* branded.plist */, + ); + path = Resources; sourceTree = ""; }; - FB477A64120CA9A500FA7C4E /* Products */ = { + A98E127713E8A72100ABD295 /* Libraries */ = { isa = PBXGroup; children = ( - FB477A87120CA9A500FA7C4E /* libThree20UI.a */, - FB477A89120CA9A500FA7C4E /* UnitTests.octest */, + A9F2F72114A3A9DD0060FF62 /* ZBarSDK */, + A98E127813E8A73400ABD295 /* GoogleToolboxMac */, + ); + name = Libraries; + sourceTree = ""; + }; + A98E127813E8A73400ABD295 /* GoogleToolboxMac */ = { + isa = PBXGroup; + children = ( + A93840601410194300349F35 /* GDataXMLNode.h */, + A93840611410194300349F35 /* GDataXMLNode.m */, + A98E127913E8A73400ABD295 /* GTMDefines.h */, + A98E127A13E8A73400ABD295 /* GTMNSDictionary+URLArguments.h */, + A98E127B13E8A73400ABD295 /* GTMNSDictionary+URLArguments.m */, + A98E127C13E8A73400ABD295 /* GTMNSString+URLArguments.h */, + A98E127D13E8A73400ABD295 /* GTMNSString+URLArguments.m */, + A951B74E144FCCAC00C35649 /* GTMNSString+HTML.h */, + A951B74F144FCCAC00C35649 /* GTMNSString+HTML.m */, + ); + path = GoogleToolboxMac; + sourceTree = ""; + }; + A9D7C3B113E8A2B300604772 = { + isa = PBXGroup; + children = ( + A97B0F36144FF79500E4A687 /* napaba-launch.png */, + A97B0F26144FF69500E4A687 /* Icon@2x.png */, + A97B0F30144FF72500E4A687 /* Icon.png */, + A97B0F2E144FF71800E4A687 /* Default.png */, + A98E11A413E8A5E400ABD295 /* LICENSE.txt */, + A98E11A513E8A5E400ABD295 /* README.mdown */, + A9D7C3C613E8A2B300604772 /* CocoaCamp */, + A9D7C3ED13E8A2B400604772 /* CocoaCampTests */, + A9D7C3BF13E8A2B300604772 /* Frameworks */, + A9D7C3BD13E8A2B300604772 /* Products */, + ); + sourceTree = ""; + }; + A9D7C3BD13E8A2B300604772 /* Products */ = { + isa = PBXGroup; + children = ( + A9D7C3BC13E8A2B300604772 /* NAPABA.app */, + A9D7C3E513E8A2B400604772 /* CocoaCampTests.octest */, ); name = Products; sourceTree = ""; }; + A9D7C3BF13E8A2B300604772 /* Frameworks */ = { + isa = PBXGroup; + children = ( + A9F2F74F14A3AA2E0060FF62 /* libiconv.dylib */, + A9F2F74B14A3AA1B0060FF62 /* CoreMedia.framework */, + A9F2F74C14A3AA1B0060FF62 /* CoreVideo.framework */, + A9F2F74914A3AA080060FF62 /* AVFoundation.framework */, + A951B63C144F187800C35649 /* CoreData.framework */, + A93840641410198000349F35 /* libxml2.dylib */, + 3201088596B4756681693700 /* Three20UICommon.xcodeproj */, + 320D7DCCE32703ACAB9A45E0 /* Three20.xcodeproj */, + 320A737074758E53BA54BE90 /* Three20UINavigator.xcodeproj */, + 320A2827FEC940B25BC42C60 /* Three20Core.xcodeproj */, + 320F2C48872C2E2C4DF86200 /* Three20UI.xcodeproj */, + 320AF8492C47A4D819F7C450 /* QuartzCore.framework */, + 320A5A189C235877202780D0 /* Three20Network.xcodeproj */, + 320CC833B8AF0ACFD35E6220 /* Three20Style.xcodeproj */, + A976F96C13E8AA96007E9290 /* CoreLocation.framework */, + A976F96A13E8AA7A007E9290 /* AudioToolbox.framework */, + A976F96613E8AA0C007E9290 /* MessageUI.framework */, + A98E128213E8A77400ABD295 /* AddressBook.framework */, + A9D7C3C013E8A2B300604772 /* UIKit.framework */, + A9D7C3C213E8A2B300604772 /* Foundation.framework */, + A9D7C3C413E8A2B300604772 /* CoreGraphics.framework */, + A9D7C3E613E8A2B400604772 /* SenTestingKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + A9D7C3C613E8A2B300604772 /* CocoaCamp */ = { + isa = PBXGroup; + children = ( + A98E127713E8A72100ABD295 /* Libraries */, + A98E11A713E8A60300ABD295 /* Classes */, + A9D7C3CF13E8A2B300604772 /* CocoaCampAppDelegate.h */, + A9D7C3D013E8A2B300604772 /* CocoaCampAppDelegate.m */, + A9D7C3D213E8A2B300604772 /* iPhone */, + A9D7C3D913E8A2B300604772 /* iPad */, + A98E125213E8A63700ABD295 /* Resources */, + A9D7C3C713E8A2B300604772 /* Supporting Files */, + A9384040140FC19800349F35 /* CocoaCampConstants.h */, + ); + path = CocoaCamp; + sourceTree = ""; + }; + A9D7C3C713E8A2B300604772 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + A9D7C3C813E8A2B300604772 /* CocoaCamp-Info.plist */, + A9D7C3C913E8A2B300604772 /* InfoPlist.strings */, + A9D7C3CC13E8A2B300604772 /* main.m */, + A904B52F13E8EBE400E021CF /* MainWindow.xib */, + A9D7C3CE13E8A2B300604772 /* CocoaCamp-Prefix.pch */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + A9D7C3D213E8A2B300604772 /* iPhone */ = { + isa = PBXGroup; + children = ( + A9D7C3D313E8A2B300604772 /* CocoaCampAppDelegate_iPhone.h */, + A9D7C3D413E8A2B300604772 /* CocoaCampAppDelegate_iPhone.m */, + A9D7C3D613E8A2B300604772 /* MainWindow_iPhone.xib */, + ); + name = iPhone; + sourceTree = ""; + }; + A9D7C3D913E8A2B300604772 /* iPad */ = { + isa = PBXGroup; + children = ( + A9D7C3DA13E8A2B300604772 /* CocoaCampAppDelegate_iPad.h */, + A9D7C3DB13E8A2B300604772 /* CocoaCampAppDelegate_iPad.m */, + A9D7C3DD13E8A2B300604772 /* MainWindow_iPad.xib */, + ); + name = iPad; + sourceTree = ""; + }; + A9D7C3ED13E8A2B400604772 /* CocoaCampTests */ = { + isa = PBXGroup; + children = ( + A951B6E9144F3C4D00C35649 /* Classes */, + A9D7C3F313E8A2B400604772 /* CocoaCampTests.h */, + A9D7C3F513E8A2B400604772 /* CocoaCampTests.m */, + A9D7C3EE13E8A2B400604772 /* Supporting Files */, + ); + path = CocoaCampTests; + sourceTree = ""; + }; + A9D7C3EE13E8A2B400604772 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + A9D7C3EF13E8A2B400604772 /* CocoaCampTests-Info.plist */, + A9D7C3F013E8A2B400604772 /* InfoPlist.strings */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + A9F2F72114A3A9DD0060FF62 /* ZBarSDK */ = { + isa = PBXGroup; + children = ( + A9F2F72214A3A9DD0060FF62 /* Headers */, + A9F2F73914A3A9DD0060FF62 /* libzbar.a */, + A9F2F73A14A3A9DD0060FF62 /* Resources */, + ); + path = ZBarSDK; + sourceTree = ""; + }; + A9F2F72214A3A9DD0060FF62 /* Headers */ = { + isa = PBXGroup; + children = ( + A9F2F72314A3A9DD0060FF62 /* ZBarSDK */, + ); + path = Headers; + sourceTree = ""; + }; + A9F2F72314A3A9DD0060FF62 /* ZBarSDK */ = { + isa = PBXGroup; + children = ( + A9F2F72414A3A9DD0060FF62 /* zbar */, + A9F2F72E14A3A9DD0060FF62 /* zbar.h */, + A9F2F72F14A3A9DD0060FF62 /* ZBarCameraSimulator.h */, + A9F2F73014A3A9DD0060FF62 /* ZBarCaptureReader.h */, + A9F2F73114A3A9DD0060FF62 /* ZBarHelpController.h */, + A9F2F73214A3A9DD0060FF62 /* ZBarImage.h */, + A9F2F73314A3A9DD0060FF62 /* ZBarImageScanner.h */, + A9F2F73414A3A9DD0060FF62 /* ZBarReaderController.h */, + A9F2F73514A3A9DD0060FF62 /* ZBarReaderView.h */, + A9F2F73614A3A9DD0060FF62 /* ZBarReaderViewController.h */, + A9F2F73714A3A9DD0060FF62 /* ZBarSDK.h */, + A9F2F73814A3A9DD0060FF62 /* ZBarSymbol.h */, + ); + path = ZBarSDK; + sourceTree = ""; + }; + A9F2F72414A3A9DD0060FF62 /* zbar */ = { + isa = PBXGroup; + children = ( + A9F2F72514A3A9DD0060FF62 /* Decoder.h */, + A9F2F72614A3A9DD0060FF62 /* Exception.h */, + A9F2F72714A3A9DD0060FF62 /* Image.h */, + A9F2F72814A3A9DD0060FF62 /* ImageScanner.h */, + A9F2F72914A3A9DD0060FF62 /* Processor.h */, + A9F2F72A14A3A9DD0060FF62 /* Scanner.h */, + A9F2F72B14A3A9DD0060FF62 /* Symbol.h */, + A9F2F72C14A3A9DD0060FF62 /* Video.h */, + A9F2F72D14A3A9DD0060FF62 /* Window.h */, + ); + path = zbar; + sourceTree = ""; + }; + A9F2F73A14A3A9DD0060FF62 /* Resources */ = { + isa = PBXGroup; + children = ( + A9F2F73B14A3A9DD0060FF62 /* zbar-back.png */, + A9F2F73C14A3A9DD0060FF62 /* zbar-help.html */, + A9F2F73D14A3A9DD0060FF62 /* zbar-helpicons.png */, + A9F2F73E14A3A9DD0060FF62 /* zbar-samples.png */, + ); + path = Resources; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 1D6058900D05DD3D006BFB54 /* CocoaCamp */ = { + A9D7C3BB13E8A2B300604772 /* NAPABA */ = { isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "CocoaCamp" */; + buildConfigurationList = A9D7C3F913E8A2B400604772 /* Build configuration list for PBXNativeTarget "NAPABA" */; buildPhases = ( - 1D60588D0D05DD3D006BFB54 /* Resources */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, + A9D7C3B813E8A2B300604772 /* Sources */, + A9D7C3B913E8A2B300604772 /* Frameworks */, + A9D7C3BA13E8A2B300604772 /* Resources */, ); buildRules = ( ); dependencies = ( - FB477A93120CAA8300FA7C4E /* PBXTargetDependency */, - FB477A95120CAA8300FA7C4E /* PBXTargetDependency */, - FB477A97120CAA8300FA7C4E /* PBXTargetDependency */, - FB477A99120CAA8300FA7C4E /* PBXTargetDependency */, - FB477A9B120CAA8300FA7C4E /* PBXTargetDependency */, - FB477A9D120CAA8300FA7C4E /* PBXTargetDependency */, - FB477A9F120CAA8300FA7C4E /* PBXTargetDependency */, - ); - name = CocoaCamp; + 3201088596B4756681693701 /* PBXTargetDependency */, + 320D7DCCE32703ACAB9A45E1 /* PBXTargetDependency */, + 320A737074758E53BA54BE91 /* PBXTargetDependency */, + 320A2827FEC940B25BC42C61 /* PBXTargetDependency */, + 320F2C48872C2E2C4DF86201 /* PBXTargetDependency */, + 320A5A189C235877202780D1 /* PBXTargetDependency */, + 320CC833B8AF0ACFD35E6221 /* PBXTargetDependency */, + ); + name = NAPABA; productName = CocoaCamp; - productReference = 1D6058910D05DD3D006BFB54 /* CocoaCamp.app */; + productReference = A9D7C3BC13E8A2B300604772 /* NAPABA.app */; productType = "com.apple.product-type.application"; }; + A9D7C3E413E8A2B400604772 /* CocoaCampTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = A9D7C3FC13E8A2B400604772 /* Build configuration list for PBXNativeTarget "CocoaCampTests" */; + buildPhases = ( + A9D7C3E013E8A2B400604772 /* Sources */, + A9D7C3E113E8A2B400604772 /* Frameworks */, + A9D7C3E213E8A2B400604772 /* Resources */, + A9D7C3E313E8A2B400604772 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + A9D7C3EC13E8A2B400604772 /* PBXTargetDependency */, + ); + name = CocoaCampTests; + productName = CocoaCampTests; + productReference = A9D7C3E513E8A2B400604772 /* CocoaCampTests.octest */; + productType = "com.apple.product-type.bundle"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { + A9D7C3B313E8A2B300604772 /* Project object */ = { isa = PBXProject; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CocoaCamp" */; - compatibilityVersion = "Xcode 3.1"; - hasScannedForEncodings = 1; - mainGroup = 29B97314FDCFA39411CA2CEA /* CocoaCamp */; + attributes = { + ORGANIZATIONNAME = "LeVous, LLC"; + }; + buildConfigurationList = A9D7C3B613E8A2B300604772 /* Build configuration list for PBXProject "CocoaCamp" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = A9D7C3B113E8A2B300604772; + productRefGroup = A9D7C3BD13E8A2B300604772 /* Products */; projectDirPath = ""; projectReferences = ( { - ProductGroup = FB477A17120CA95D00FA7C4E /* Products */; - ProjectRef = FB477A16120CA95D00FA7C4E /* Three20.xcodeproj */; + ProductGroup = 320D7DCCE32703ACAB9A45E3 /* Products */; + ProjectRef = 320D7DCCE32703ACAB9A45E0 /* Three20.xcodeproj */; }, { - ProductGroup = FB477A55120CA9A500FA7C4E /* Products */; - ProjectRef = FB477A54120CA9A500FA7C4E /* Three20Core.xcodeproj */; + ProductGroup = 320A2827FEC940B25BC42C63 /* Products */; + ProjectRef = 320A2827FEC940B25BC42C60 /* Three20Core.xcodeproj */; }, { - ProductGroup = FB477A58120CA9A500FA7C4E /* Products */; - ProjectRef = FB477A57120CA9A500FA7C4E /* Three20Network.xcodeproj */; + ProductGroup = 320A5A189C235877202780D3 /* Products */; + ProjectRef = 320A5A189C235877202780D0 /* Three20Network.xcodeproj */; }, { - ProductGroup = FB477A5B120CA9A500FA7C4E /* Products */; - ProjectRef = FB477A5A120CA9A500FA7C4E /* Three20Style.xcodeproj */; + ProductGroup = 320CC833B8AF0ACFD35E6223 /* Products */; + ProjectRef = 320CC833B8AF0ACFD35E6220 /* Three20Style.xcodeproj */; }, { - ProductGroup = FB477A64120CA9A500FA7C4E /* Products */; - ProjectRef = FB477A63120CA9A500FA7C4E /* Three20UI.xcodeproj */; + ProductGroup = 320F2C48872C2E2C4DF86203 /* Products */; + ProjectRef = 320F2C48872C2E2C4DF86200 /* Three20UI.xcodeproj */; }, { - ProductGroup = FB477A5E120CA9A500FA7C4E /* Products */; - ProjectRef = FB477A5D120CA9A500FA7C4E /* Three20UICommon.xcodeproj */; + ProductGroup = 3201088596B4756681693703 /* Products */; + ProjectRef = 3201088596B4756681693700 /* Three20UICommon.xcodeproj */; }, { - ProductGroup = FB477A61120CA9A500FA7C4E /* Products */; - ProjectRef = FB477A60120CA9A500FA7C4E /* Three20UINavigator.xcodeproj */; + ProductGroup = 320A737074758E53BA54BE93 /* Products */; + ProjectRef = 320A737074758E53BA54BE90 /* Three20UINavigator.xcodeproj */; }, ); projectRoot = ""; targets = ( - 1D6058900D05DD3D006BFB54 /* CocoaCamp */, + A9D7C3BB13E8A2B300604772 /* NAPABA */, + A9D7C3E413E8A2B400604772 /* CocoaCampTests */, ); }; /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - FB477A42120CA95E00FA7C4E /* libThree20.a */ = { + 3201088596B4756681693704 /* libThree20UICommon.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; - path = libThree20.a; - remoteRef = FB477A41120CA95E00FA7C4E /* PBXContainerItemProxy */; + path = libThree20UICommon.a; + remoteRef = 3201088596B4756681693706 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - FB477A44120CA95E00FA7C4E /* UnitTests.octest */ = { + 320A2827FEC940B25BC42C64 /* libThree20Core.a */ = { isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = UnitTests.octest; - remoteRef = FB477A43120CA95E00FA7C4E /* PBXContainerItemProxy */; + fileType = archive.ar; + path = libThree20Core.a; + remoteRef = 320A2827FEC940B25BC42C66 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - FB477A69120CA9A500FA7C4E /* libThree20Core.a */ = { + 320A5A189C235877202780D4 /* libThree20Network.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; - path = libThree20Core.a; - remoteRef = FB477A68120CA9A500FA7C4E /* PBXContainerItemProxy */; + path = libThree20Network.a; + remoteRef = 320A5A189C235877202780D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - FB477A6B120CA9A500FA7C4E /* CoreUnitTests.octest */ = { + 320A737074758E53BA54BE94 /* libThree20UINavigator.a */ = { isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = CoreUnitTests.octest; - remoteRef = FB477A6A120CA9A500FA7C4E /* PBXContainerItemProxy */; + fileType = archive.ar; + path = libThree20UINavigator.a; + remoteRef = 320A737074758E53BA54BE96 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - FB477A6F120CA9A500FA7C4E /* libThree20Network.a */ = { + 320CC833B8AF0ACFD35E6224 /* libThree20Style.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; - path = libThree20Network.a; - remoteRef = FB477A6E120CA9A500FA7C4E /* PBXContainerItemProxy */; + path = libThree20Style.a; + remoteRef = 320CC833B8AF0ACFD35E6226 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - FB477A71120CA9A500FA7C4E /* UnitTests.octest */ = { + 320D7DCCE32703ACAB9A45E4 /* libThree20.a */ = { isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = UnitTests.octest; - remoteRef = FB477A70120CA9A500FA7C4E /* PBXContainerItemProxy */; + fileType = archive.ar; + path = libThree20.a; + remoteRef = 320D7DCCE32703ACAB9A45E6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - FB477A75120CA9A500FA7C4E /* libThree20Style.a */ = { + 320F2C48872C2E2C4DF86204 /* libThree20UI.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; - path = libThree20Style.a; - remoteRef = FB477A74120CA9A500FA7C4E /* PBXContainerItemProxy */; + path = libThree20UI.a; + remoteRef = 320F2C48872C2E2C4DF86206 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - FB477A77120CA9A500FA7C4E /* UnitTests.octest */ = { + A976F94C13E8A999007E9290 /* Three20UnitTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = UnitTests.octest; - remoteRef = FB477A76120CA9A500FA7C4E /* PBXContainerItemProxy */; + path = Three20UnitTests.octest; + remoteRef = A976F94B13E8A999007E9290 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - FB477A7B120CA9A500FA7C4E /* libThree20UICommon.a */ = { + A976F94F13E8A999007E9290 /* CoreUnitTests.octest */ = { isa = PBXReferenceProxy; - fileType = archive.ar; - path = libThree20UICommon.a; - remoteRef = FB477A7A120CA9A500FA7C4E /* PBXContainerItemProxy */; + fileType = wrapper.cfbundle; + path = CoreUnitTests.octest; + remoteRef = A976F94E13E8A999007E9290 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - FB477A7D120CA9A500FA7C4E /* UnitTests.octest */ = { + A976F95613E8A999007E9290 /* NetworkUnitTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = UnitTests.octest; - remoteRef = FB477A7C120CA9A500FA7C4E /* PBXContainerItemProxy */; + path = NetworkUnitTests.octest; + remoteRef = A976F95513E8A999007E9290 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - FB477A81120CA9A500FA7C4E /* libThree20UINavigator.a */ = { + A976F95B13E8A999007E9290 /* StyleUnitTests.octest */ = { isa = PBXReferenceProxy; - fileType = archive.ar; - path = libThree20UINavigator.a; - remoteRef = FB477A80120CA9A500FA7C4E /* PBXContainerItemProxy */; + fileType = wrapper.cfbundle; + path = StyleUnitTests.octest; + remoteRef = A976F95A13E8A999007E9290 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - FB477A83120CA9A500FA7C4E /* UnitTests.octest */ = { + A976F95E13E8A999007E9290 /* UIUnitTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = UnitTests.octest; - remoteRef = FB477A82120CA9A500FA7C4E /* PBXContainerItemProxy */; + path = UIUnitTests.octest; + remoteRef = A976F95D13E8A999007E9290 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - FB477A87120CA9A500FA7C4E /* libThree20UI.a */ = { + A976F96113E8A999007E9290 /* UICommonUnitTests.octest */ = { isa = PBXReferenceProxy; - fileType = archive.ar; - path = libThree20UI.a; - remoteRef = FB477A86120CA9A500FA7C4E /* PBXContainerItemProxy */; + fileType = wrapper.cfbundle; + path = UICommonUnitTests.octest; + remoteRef = A976F96013E8A999007E9290 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - FB477A89120CA9A500FA7C4E /* UnitTests.octest */ = { + A976F96413E8A999007E9290 /* UINavigatorUnitTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = UnitTests.octest; - remoteRef = FB477A88120CA9A500FA7C4E /* PBXContainerItemProxy */; + path = UINavigatorUnitTests.octest; + remoteRef = A976F96313E8A999007E9290 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { + A9D7C3BA13E8A2B300604772 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A951B6FB144FA6F700C35649 /* CocoaCamp.xcdatamodeld in Resources */, + A904B53313E8F2B200E021CF /* AttendeeListJson.js in Resources */, + 320B6C86F11D9990244A9731 /* Three20.bundle in Resources */, + A9D7C3CB13E8A2B300604772 /* InfoPlist.strings in Resources */, + A9D7C3D813E8A2B300604772 /* MainWindow_iPhone.xib in Resources */, + A9D7C3DF13E8A2B300604772 /* MainWindow_iPad.xib in Resources */, + A98E121313E8A60300ABD295 /* bump_button_blue.png in Resources */, + A951B6F0144F4F8E00C35649 /* WordPressScheduleDay.js in Resources */, + A98E121413E8A60300ABD295 /* bump_close.png in Resources */, + A98E121513E8A60300ABD295 /* bump_close_selected.png in Resources */, + A98E121613E8A60300ABD295 /* bump_content_area.png in Resources */, + A98E121713E8A60300ABD295 /* bump_dropdown.png in Resources */, + A98E121813E8A60300ABD295 /* bump_hands_bg.png in Resources */, + A98E121913E8A60300ABD295 /* bump_lefthand.png in Resources */, + A98E121A13E8A60300ABD295 /* bump_nameview.png in Resources */, + A98E121B13E8A60300ABD295 /* bump_no_button.png in Resources */, + A98E121C13E8A60300ABD295 /* bump_nonetwork.png in Resources */, + A98E121D13E8A60300ABD295 /* bump_popupdefault.png in Resources */, + A98E121E13E8A60300ABD295 /* bump_righthand.png in Resources */, + A98E121F13E8A60300ABD295 /* bump_signal1.png in Resources */, + A98E122013E8A60300ABD295 /* bump_signal2.png in Resources */, + A98E122113E8A60300ABD295 /* bump_signal3.png in Resources */, + A98E122213E8A60300ABD295 /* bump_signal4.png in Resources */, + A98E122313E8A60300ABD295 /* bump_tap.aif in Resources */, + A98E122413E8A60300ABD295 /* bump_titlebar_bg.png in Resources */, + A98E122513E8A60300ABD295 /* bump_white_low.png in Resources */, + A98E122613E8A60300ABD295 /* bump_yes_button.png in Resources */, + A98E122713E8A60300ABD295 /* BumpApiPopup.xib in Resources */, + A98E122813E8A60300ABD295 /* BumpChangeNameScreen.xib in Resources */, + A98E122913E8A60300ABD295 /* BumpConfirmScreen.xib in Resources */, + A98E122A13E8A60300ABD295 /* BumpPromptScreen.xib in Resources */, + A98E122B13E8A60300ABD295 /* BumpStartScreen.xib in Resources */, + A98E123F13E8A60300ABD295 /* FlickrAddPhotoController.xib in Resources */, + A98E124113E8A60300ABD295 /* FlickrController.xib in Resources */, + A98E124613E8A60300ABD295 /* SessionDetailViewController.xib in Resources */, + A98E124813E8A60300ABD295 /* OLDSessionViewController.xib in Resources */, + A98E124B13E8A60300ABD295 /* FlickrPageView.xib in Resources */, + A98E124D13E8A60300ABD295 /* RegistrantDetailView.xib in Resources */, + A98E124E13E8A60300ABD295 /* RegistrantListView.xib in Resources */, + A98E124F13E8A60300ABD295 /* TwitterFeedTableView.xib in Resources */, + A98E125013E8A60300ABD295 /* TwitterFeedTableViewCell.xib in Resources */, + A98E126513E8A63700ABD295 /* 512x512.png in Resources */, + A98E126613E8A63700ABD295 /* bird.png in Resources */, + A98E126713E8A63700ABD295 /* bump.png in Resources */, + A98E126813E8A63700ABD295 /* bump@2x.png in Resources */, + A98E126913E8A63700ABD295 /* bump_righthand.png in Resources */, + A98E126A13E8A63700ABD295 /* calendar.png in Resources */, + A98E126B13E8A63700ABD295 /* ContactExchangeView.xib in Resources */, + A98E126C13E8A63700ABD295 /* flickrbackground.png in Resources */, + A98E126D13E8A63700ABD295 /* group.png in Resources */, + A98E126E13E8A63700ABD295 /* headerBackground.png in Resources */, + A98E126F13E8A63700ABD295 /* iPhoneAppIcon.png in Resources */, + A98E127013E8A63700ABD295 /* iPhoneAppIcon@2x.png in Resources */, + A98E127113E8A63700ABD295 /* keynote-icon.png in Resources */, + A98E127213E8A63700ABD295 /* keynote-icon@2x.png in Resources */, + A98E127313E8A63700ABD295 /* loading.png in Resources */, + A98E127413E8A63700ABD295 /* photoIcon.png in Resources */, + A98E127513E8A63700ABD295 /* roundrecbuttonnorm.png in Resources */, + A98E127613E8A63700ABD295 /* roundrecbuttonpress.png in Resources */, + A904B53013E8EBE400E021CF /* MainWindow.xib in Resources */, + A904B53F13E978E800E021CF /* webServiceConfig.plist in Resources */, + A938403B140FC0D100349F35 /* Napaba-logo.png in Resources */, + A938403E140FC10E00349F35 /* branded.plist in Resources */, + A938404A140FFDFB00349F35 /* NapabaHeaderView.xib in Resources */, + A938404D1410054800349F35 /* Napaba-Background.png in Resources */, + A93840581410133000349F35 /* news-icon.png in Resources */, + A938405A1410133000349F35 /* news-icon@2x.png in Resources */, + A9384072141019D400349F35 /* RssDetailsViewController.xib in Resources */, + A938407C14101A2F00349F35 /* arss_back.png in Resources */, + A938407E14101A2F00349F35 /* arss_header.png in Resources */, + A951B710144FB5B100C35649 /* SessionViewController.xib in Resources */, + A951B764144FE2F000C35649 /* Allstate_Platinum.jpg in Resources */, + A951B766144FE2F000C35649 /* AlstonBird_Platinum.jpg in Resources */, + A951B768144FE2F000C35649 /* Prudential_Platinum.jpg in Resources */, + A951B76A144FE2F000C35649 /* SchiffHardin_Platinum.jpg in Resources */, + A951B76C144FE2F000C35649 /* Seyfarth_Platinum.jpg in Resources */, + A951B770144FE2F000C35649 /* Walmart_Premier.jpg in Resources */, + A97B0F2A144FF69500E4A687 /* Icon@2x.png in Resources */, + A97B0F2F144FF71800E4A687 /* Default.png in Resources */, + A97B0F31144FF72500E4A687 /* Icon.png in Resources */, + A97B0F37144FF79600E4A687 /* napaba-launch.png in Resources */, + A9E62550145E432100CB124F /* sustainability.jpg in Resources */, + A9E62551145E432100CB124F /* sustainability@2x.jpg in Resources */, + A98B6D501469D6FC00F3B2EB /* Microsoft.jpg in Resources */, + A9F2F74114A3A9DD0060FF62 /* zbar-back.png in Resources */, + A9F2F74314A3A9DD0060FF62 /* zbar-help.html in Resources */, + A9F2F74514A3A9DD0060FF62 /* zbar-helpicons.png in Resources */, + A9F2F74714A3A9DD0060FF62 /* zbar-samples.png in Resources */, + A9F2F75314A3B3220060FF62 /* connect-icon.png in Resources */, + A9F2F75514A3B3220060FF62 /* connect-icon@2x.png in Resources */, + A9F2F75C14A3B3C40060FF62 /* PeepsConnectViewController.xib in Resources */, + A9F2F76014A3BDC60060FF62 /* qr-icon.png in Resources */, + A9F2F76214A3BDC60060FF62 /* qr-icon@2x.png in Resources */, + A93E093B14A3C48800585DA2 /* qrcode-cocoacamp-url.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A9D7C3E213E8A2B400604772 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 28AD73880D9D96C1002E5188 /* MainWindow.xib in Resources */, - AB2AE44E11EBAA8E00015C01 /* 512x512.png in Resources */, - AB2AE45A11EBACF500015C01 /* iPhoneAppIcon.png in Resources */, - AB2AE45B11EBACF500015C01 /* iPhoneAppIcon@2x.png in Resources */, - AB2AE45F11EBAD7D00015C01 /* LICENSE.txt in Resources */, - FB477AA2120CAAB700FA7C4E /* Three20.bundle in Resources */, - 03CD36EE120D0F240054728C /* SessionViewController.xib in Resources */, - 03AF412C12120F8D0061D5DD /* FlickrController.xib in Resources */, - 03AF413012120FA80061D5DD /* photoIcon.png in Resources */, - 03AF413112120FA80061D5DD /* roundrecbuttonnorm.png in Resources */, - 034A2BF812146E2A009F39A6 /* FlickrPageView.xib in Resources */, - 034A2BFC12146E7B009F39A6 /* roundrecbuttonpress.png in Resources */, - 034A2BFE12146E91009F39A6 /* headerBackground.png in Resources */, - 0341222F12148A3400B376F7 /* SessionDetailViewController.xib in Resources */, - 035B9D3B122691540038129A /* calendar.png in Resources */, - 035B9D3C122691540038129A /* group.png in Resources */, - 035B9D46122693520038129A /* loading.png in Resources */, - 034654EE12269693005A5D6C /* bump_button_blue.png in Resources */, - 034654EF12269693005A5D6C /* bump_close.png in Resources */, - 034654F012269693005A5D6C /* bump_close_selected.png in Resources */, - 034654F112269693005A5D6C /* bump_content_area.png in Resources */, - 034654F212269693005A5D6C /* bump_dropdown.png in Resources */, - 034654F312269693005A5D6C /* bump_hands_bg.png in Resources */, - 034654F412269693005A5D6C /* bump_lefthand.png in Resources */, - 034654F512269693005A5D6C /* bump_nameview.png in Resources */, - 034654F612269693005A5D6C /* bump_no_button.png in Resources */, - 034654F712269693005A5D6C /* bump_nonetwork.png in Resources */, - 034654F812269693005A5D6C /* bump_popupdefault.png in Resources */, - 034654F912269693005A5D6C /* bump_righthand.png in Resources */, - 034654FA12269693005A5D6C /* bump_signal1.png in Resources */, - 034654FB12269693005A5D6C /* bump_signal2.png in Resources */, - 034654FC12269693005A5D6C /* bump_signal3.png in Resources */, - 034654FD12269693005A5D6C /* bump_signal4.png in Resources */, - 034654FE12269693005A5D6C /* bump_tap.aif in Resources */, - 034654FF12269693005A5D6C /* bump_titlebar_bg.png in Resources */, - 0346550012269693005A5D6C /* bump_white_low.png in Resources */, - 0346550112269693005A5D6C /* bump_yes_button.png in Resources */, - 0346550212269693005A5D6C /* BumpApiPopup.xib in Resources */, - 0346550312269693005A5D6C /* BumpChangeNameScreen.xib in Resources */, - 0346550412269693005A5D6C /* BumpConfirmScreen.xib in Resources */, - 0346550512269693005A5D6C /* BumpPromptScreen.xib in Resources */, - 0346550612269693005A5D6C /* BumpStartScreen.xib in Resources */, - 030893A31226F05D0088A584 /* ContactExchangeView.xib in Resources */, - 0308948E1226F2A90088A584 /* RegistrantListView.xib in Resources */, - 030894981226F2DB0088A584 /* RegistrantDetailView.xib in Resources */, - FBF7E8231227E55000B7A710 /* keynote-icon.png in Resources */, - FBF7E8241227E55000B7A710 /* keynote-icon@2x.png in Resources */, - 03D54118122FEC87004DBF63 /* FlickrAddPhotoController.xib in Resources */, - 03F7D4A212326E1B007FE8C7 /* TwitterFeedTableView.xib in Resources */, - 03F7D4A312326E1B007FE8C7 /* TwitterFeedTableViewCell.xib in Resources */, - 03F7D4D41232713C007FE8C7 /* bird.png in Resources */, + A951B6FA144FA69400C35649 /* CocoaCamp.xcdatamodeld in Resources */, + A951B6EE144F481700C35649 /* AttendeeListJson.js in Resources */, + A951B6F1144F4F8E00C35649 /* WordPressScheduleDay.js in Resources */, + A9D7C3F213E8A2B400604772 /* InfoPlist.strings in Resources */, + A9D7C3F413E8A2B400604772 /* CocoaCampTests.h in Resources */, + A904B54013E978E800E021CF /* webServiceConfig.plist in Resources */, + A938403C140FC0D100349F35 /* Napaba-logo.png in Resources */, + A938403F140FC10E00349F35 /* branded.plist in Resources */, + A938404B140FFDFB00349F35 /* NapabaHeaderView.xib in Resources */, + A938404E1410054800349F35 /* Napaba-Background.png in Resources */, + A93840591410133000349F35 /* news-icon.png in Resources */, + A938405B1410133000349F35 /* news-icon@2x.png in Resources */, + A9384073141019D400349F35 /* RssDetailsViewController.xib in Resources */, + A938407D14101A2F00349F35 /* arss_back.png in Resources */, + A938407F14101A2F00349F35 /* arss_header.png in Resources */, + A951B711144FB5B100C35649 /* SessionViewController.xib in Resources */, + A951B765144FE2F000C35649 /* Allstate_Platinum.jpg in Resources */, + A951B767144FE2F000C35649 /* AlstonBird_Platinum.jpg in Resources */, + A951B769144FE2F000C35649 /* Prudential_Platinum.jpg in Resources */, + A951B76B144FE2F000C35649 /* SchiffHardin_Platinum.jpg in Resources */, + A951B76D144FE2F000C35649 /* Seyfarth_Platinum.jpg in Resources */, + A951B771144FE2F000C35649 /* Walmart_Premier.jpg in Resources */, + A97B0F2B144FF69500E4A687 /* Icon@2x.png in Resources */, + A9F2F74214A3A9DD0060FF62 /* zbar-back.png in Resources */, + A9F2F74414A3A9DD0060FF62 /* zbar-help.html in Resources */, + A9F2F74614A3A9DD0060FF62 /* zbar-helpicons.png in Resources */, + A9F2F74814A3A9DD0060FF62 /* zbar-samples.png in Resources */, + A9F2F75414A3B3220060FF62 /* connect-icon.png in Resources */, + A9F2F75614A3B3220060FF62 /* connect-icon@2x.png in Resources */, + A9F2F75D14A3B3C40060FF62 /* PeepsConnectViewController.xib in Resources */, + A9F2F76114A3BDC60060FF62 /* qr-icon.png in Resources */, + A9F2F76314A3BDC60060FF62 /* qr-icon@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + A9D7C3E313E8A2B400604772 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ - 1D60588E0D05DD3D006BFB54 /* Sources */ = { + A9D7C3B813E8A2B300604772 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1D60589B0D05DD56006BFB54 /* main.m in Sources */, - 1D3623260D0F684500981E51 /* CocoaCampAppDelegate.m in Sources */, - 03CD36ED120D0F240054728C /* SessionViewController.m in Sources */, - 03CD3737120D68940054728C /* NSObject+SBJSON.m in Sources */, - 03CD3738120D68940054728C /* NSString+SBJSON.m in Sources */, - 03CD3739120D68940054728C /* SBJSON.m in Sources */, - 03CD373A120D68940054728C /* SBJsonBase.m in Sources */, - 03CD373B120D68940054728C /* SBJsonParser.m in Sources */, - 03CD373C120D68940054728C /* SBJsonWriter.m in Sources */, - 03AF412B12120F8D0061D5DD /* FlickrController.m in Sources */, - 03AF412D12120F8D0061D5DD /* FlickrPageViewController.m in Sources */, - 0341222E12148A3400B376F7 /* SessionDetailViewController.m in Sources */, - 80C1A8D21221CD02007F7D7A /* ContactManager.m in Sources */, - 030894911226F2CA0088A584 /* AttendeeListViewController.m in Sources */, - 030894971226F2DB0088A584 /* Registrant.m in Sources */, - 030894991226F2DB0088A584 /* RegistrantDetailViewController.m in Sources */, - 03D53EB3122FCD5E004DBF63 /* FlickrSearchResultsModel.m in Sources */, - 03D53EB4122FCD5E004DBF63 /* FlickrJSONResponse.m in Sources */, - 03D53EBC122FCD7E004DBF63 /* SearchResult.m in Sources */, - 03D53EBD122FCD7E004DBF63 /* URLModelResponse.m in Sources */, - 03D53EBE122FCD7E004DBF63 /* SearchResultsModel.m in Sources */, - 03D53EC6122FCD96004DBF63 /* SearchPhotosViewController.m in Sources */, - 03D53EC7122FCD96004DBF63 /* SearchResultsPhotoSource.m in Sources */, - 03D53EC8122FCD96004DBF63 /* ForwardingAdapters.m in Sources */, - 03D53F8C122FD06B004DBF63 /* GTMNSString+URLArguments.m in Sources */, - 03D53F8D122FD06B004DBF63 /* GTMNSDictionary+URLArguments.m in Sources */, - 03D540BD122FE001004DBF63 /* FlickrThumbnailView.m in Sources */, - 03D54117122FEC87004DBF63 /* FlickrAddPhotoController.m in Sources */, - 03AE932412309B6200C188E9 /* TabController.m in Sources */, - 03F7D4A412326E1B007FE8C7 /* TwitterFeedTableViewController.m in Sources */, - 03F7D4D912327248007FE8C7 /* NSString+XMLEntities.m in Sources */, + A9D7C3CD13E8A2B300604772 /* main.m in Sources */, + A9D7C3D113E8A2B300604772 /* CocoaCampAppDelegate.m in Sources */, + A9D7C3D513E8A2B300604772 /* CocoaCampAppDelegate_iPhone.m in Sources */, + A9D7C3DC13E8A2B300604772 /* CocoaCampAppDelegate_iPad.m in Sources */, + A98E122D13E8A60300ABD295 /* ContactManager.m in Sources */, + A98E122E13E8A60300ABD295 /* PortraitLoader.m in Sources */, + A98E122F13E8A60300ABD295 /* FlickrJSONResponse.m in Sources */, + A98E123013E8A60300ABD295 /* NSObject+SBJSON.m in Sources */, + A98E123113E8A60300ABD295 /* NSString+SBJSON.m in Sources */, + A98E123213E8A60300ABD295 /* SBJSON.m in Sources */, + A98E123313E8A60300ABD295 /* SBJsonBase.m in Sources */, + A98E123413E8A60300ABD295 /* SBJsonParser.m in Sources */, + A98E123513E8A60300ABD295 /* SBJsonWriter.m in Sources */, + A98E123613E8A60300ABD295 /* FlickrSearchResultsModel.m in Sources */, + A98E123713E8A60300ABD295 /* Registrant.m in Sources */, + A98E123813E8A60300ABD295 /* SearchResult.m in Sources */, + A98E123913E8A60300ABD295 /* SearchResultsModel.m in Sources */, + A98E123A13E8A60300ABD295 /* SearchResultsPhotoSource.m in Sources */, + A98E123B13E8A60300ABD295 /* ForwardingAdapters.m in Sources */, + A98E123C13E8A60300ABD295 /* URLModelResponse.m in Sources */, + A98E123D13E8A60300ABD295 /* AttendeeListViewController.m in Sources */, + A98E123E13E8A60300ABD295 /* FlickrAddPhotoController.m in Sources */, + A98E124013E8A60300ABD295 /* FlickrController.m in Sources */, + A98E124213E8A60300ABD295 /* FlickrPageViewController.m in Sources */, + A98E124313E8A60300ABD295 /* RegistrantDetailViewController.m in Sources */, + A98E124413E8A60300ABD295 /* SearchPhotosViewController.m in Sources */, + A98E124513E8A60300ABD295 /* SessionDetailViewController.m in Sources */, + A98E124713E8A60300ABD295 /* OLDSessionViewController.m in Sources */, + A98E124913E8A60300ABD295 /* TabController.m in Sources */, + A98E124A13E8A60300ABD295 /* TwitterFeedTableViewController.m in Sources */, + A98E124C13E8A60300ABD295 /* FlickrThumbnailView.m in Sources */, + A98E125113E8A60300ABD295 /* NSString+XMLEntities.m in Sources */, + A98E127E13E8A73400ABD295 /* GTMNSDictionary+URLArguments.m in Sources */, + A98E128013E8A73400ABD295 /* GTMNSString+URLArguments.m in Sources */, + A9384047140FC4A500349F35 /* CCBranding.m in Sources */, + A93840621410194300349F35 /* GDataXMLNode.m in Sources */, + A9384070141019D400349F35 /* RssDetailsViewController.m in Sources */, + A9384074141019D400349F35 /* RssNewsViewController.m in Sources */, + A9384076141019D400349F35 /* RSSLoader.m in Sources */, + A9384078141019D400349F35 /* RssTableHeaderView.m in Sources */, + A93840C11410232200349F35 /* HeaderSponsorsViewController.m in Sources */, + A93840C5141024FB00349F35 /* HeaderSponsorView.m in Sources */, + A951B689144F193600C35649 /* CocoaCamp.xcdatamodeld in Sources */, + A951B695144F2FE900C35649 /* WebServiceUrlManager.m in Sources */, + A951B699144F300800C35649 /* WebServiceDataManager.m in Sources */, + A951B69F144F33A100C35649 /* CoreDataManager.m in Sources */, + A951B6AB144F3AE000C35649 /* WordPressApiSessionsJsonParser.m in Sources */, + A951B6FE144FB26900C35649 /* Session.m in Sources */, + A951B70E144FB5B100C35649 /* SessionViewController.m in Sources */, + A951B750144FCCAC00C35649 /* GTMNSString+HTML.m in Sources */, + A932DF961469CEAA00DD0FF3 /* WordPressApiSponsorLogosJsonParser.m in Sources */, + A9F2F75A14A3B3C40060FF62 /* PeepsConnectViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A9D7C3E013E8A2B400604772 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A932DF8D1469C47700DD0FF3 /* CocoaCampAppDelegate.m in Sources */, + A932DF8E1469C47700DD0FF3 /* CocoaCampAppDelegate_iPhone.m in Sources */, + A932DF8F1469C47700DD0FF3 /* CocoaCampAppDelegate_iPad.m in Sources */, + A932DF691469C3C400DD0FF3 /* GTMNSString+HTML.m in Sources */, + A932DF6A1469C3C400DD0FF3 /* ContactManager.m in Sources */, + A932DF6B1469C3C400DD0FF3 /* PortraitLoader.m in Sources */, + A932DF6C1469C3C400DD0FF3 /* FlickrJSONResponse.m in Sources */, + A932DF6D1469C3C400DD0FF3 /* NSObject+SBJSON.m in Sources */, + A932DF6E1469C3C400DD0FF3 /* NSString+SBJSON.m in Sources */, + A932DF6F1469C3C400DD0FF3 /* SBJSON.m in Sources */, + A932DF701469C3C400DD0FF3 /* SBJsonBase.m in Sources */, + A932DF711469C3C400DD0FF3 /* SBJsonParser.m in Sources */, + A932DF721469C3C400DD0FF3 /* SBJsonWriter.m in Sources */, + A932DF731469C3C400DD0FF3 /* FlickrSearchResultsModel.m in Sources */, + A932DF741469C3C400DD0FF3 /* Registrant.m in Sources */, + A932DF751469C3C400DD0FF3 /* SearchResult.m in Sources */, + A932DF761469C3C400DD0FF3 /* SearchResultsModel.m in Sources */, + A932DF771469C3C400DD0FF3 /* ForwardingAdapters.m in Sources */, + A932DF781469C3C400DD0FF3 /* URLModelResponse.m in Sources */, + A932DF791469C3C400DD0FF3 /* FlickrAddPhotoController.m in Sources */, + A932DF7A1469C3C400DD0FF3 /* FlickrController.m in Sources */, + A932DF7B1469C3C400DD0FF3 /* FlickrPageViewController.m in Sources */, + A932DF7C1469C3C400DD0FF3 /* AttendeeListViewController.m in Sources */, + A932DF7D1469C3C400DD0FF3 /* RegistrantDetailViewController.m in Sources */, + A932DF7E1469C3C400DD0FF3 /* SearchPhotosViewController.m in Sources */, + A932DF7F1469C3C400DD0FF3 /* SessionDetailViewController.m in Sources */, + A932DF801469C3C400DD0FF3 /* TabController.m in Sources */, + A932DF811469C3C400DD0FF3 /* TwitterFeedTableViewController.m in Sources */, + A932DF821469C3C400DD0FF3 /* HeaderSponsorsViewController.m in Sources */, + A932DF831469C3C400DD0FF3 /* FlickrThumbnailView.m in Sources */, + A932DF841469C3C400DD0FF3 /* NSString+XMLEntities.m in Sources */, + A9D7C3F613E8A2B400604772 /* CocoaCampTests.m in Sources */, + A98E127F13E8A73400ABD295 /* GTMNSDictionary+URLArguments.m in Sources */, + A98E128113E8A73400ABD295 /* GTMNSString+URLArguments.m in Sources */, + A904B51813E8E63300E021CF /* SearchResultsPhotoSource.m in Sources */, + A9384048140FC4A500349F35 /* CCBranding.m in Sources */, + A93840631410194300349F35 /* GDataXMLNode.m in Sources */, + A9384071141019D400349F35 /* RssDetailsViewController.m in Sources */, + A9384075141019D400349F35 /* RssNewsViewController.m in Sources */, + A9384077141019D400349F35 /* RSSLoader.m in Sources */, + A9384079141019D400349F35 /* RssTableHeaderView.m in Sources */, + A93840C6141024FB00349F35 /* HeaderSponsorView.m in Sources */, + A951B68A144F194000C35649 /* CocoaCamp.xcdatamodeld in Sources */, + A951B696144F2FE900C35649 /* WebServiceUrlManager.m in Sources */, + A951B69A144F300800C35649 /* WebServiceDataManager.m in Sources */, + A951B6A0144F33A100C35649 /* CoreDataManager.m in Sources */, + A951B6AC144F3AE000C35649 /* WordPressApiSessionsJsonParser.m in Sources */, + A951B6ED144F3C6A00C35649 /* WordPressApiSessionsJsonParserTests.m in Sources */, + A951B6FF144FB26900C35649 /* Session.m in Sources */, + A951B70F144FB5B100C35649 /* SessionViewController.m in Sources */, + A932DF971469CEAA00DD0FF3 /* WordPressApiSponsorLogosJsonParser.m in Sources */, + A9F2F75B14A3B3C40060FF62 /* PeepsConnectViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - FB477A93120CAA8300FA7C4E /* PBXTargetDependency */ = { + 3201088596B4756681693701 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Three20UINavigator; - targetProxy = FB477A92120CAA8300FA7C4E /* PBXContainerItemProxy */; + name = Three20UICommon; + targetProxy = 3201088596B4756681693702 /* PBXContainerItemProxy */; }; - FB477A95120CAA8300FA7C4E /* PBXTargetDependency */ = { + 320A2827FEC940B25BC42C61 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Three20Core; - targetProxy = FB477A94120CAA8300FA7C4E /* PBXContainerItemProxy */; + targetProxy = 320A2827FEC940B25BC42C62 /* PBXContainerItemProxy */; }; - FB477A97120CAA8300FA7C4E /* PBXTargetDependency */ = { + 320A5A189C235877202780D1 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Three20; - targetProxy = FB477A96120CAA8300FA7C4E /* PBXContainerItemProxy */; + name = Three20Network; + targetProxy = 320A5A189C235877202780D2 /* PBXContainerItemProxy */; }; - FB477A99120CAA8300FA7C4E /* PBXTargetDependency */ = { + 320A737074758E53BA54BE91 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Three20UI; - targetProxy = FB477A98120CAA8300FA7C4E /* PBXContainerItemProxy */; + name = Three20UINavigator; + targetProxy = 320A737074758E53BA54BE92 /* PBXContainerItemProxy */; }; - FB477A9B120CAA8300FA7C4E /* PBXTargetDependency */ = { + 320CC833B8AF0ACFD35E6221 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Three20Network; - targetProxy = FB477A9A120CAA8300FA7C4E /* PBXContainerItemProxy */; + name = Three20Style; + targetProxy = 320CC833B8AF0ACFD35E6222 /* PBXContainerItemProxy */; }; - FB477A9D120CAA8300FA7C4E /* PBXTargetDependency */ = { + 320D7DCCE32703ACAB9A45E1 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Three20UICommon; - targetProxy = FB477A9C120CAA8300FA7C4E /* PBXContainerItemProxy */; + name = Three20; + targetProxy = 320D7DCCE32703ACAB9A45E2 /* PBXContainerItemProxy */; }; - FB477A9F120CAA8300FA7C4E /* PBXTargetDependency */ = { + 320F2C48872C2E2C4DF86201 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Three20Style; - targetProxy = FB477A9E120CAA8300FA7C4E /* PBXContainerItemProxy */; + name = Three20UI; + targetProxy = 320F2C48872C2E2C4DF86202 /* PBXContainerItemProxy */; + }; + A9D7C3EC13E8A2B400604772 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A9D7C3BB13E8A2B300604772 /* NAPABA */; + targetProxy = A9D7C3EB13E8A2B400604772 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ +/* Begin PBXVariantGroup section */ + A9D7C3C913E8A2B300604772 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + A9D7C3CA13E8A2B300604772 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + A9D7C3D613E8A2B300604772 /* MainWindow_iPhone.xib */ = { + isa = PBXVariantGroup; + children = ( + A9D7C3D713E8A2B300604772 /* en */, + ); + name = MainWindow_iPhone.xib; + sourceTree = ""; + }; + A9D7C3DD13E8A2B300604772 /* MainWindow_iPad.xib */ = { + isa = PBXVariantGroup; + children = ( + A9D7C3DE13E8A2B300604772 /* en */, + ); + name = MainWindow_iPad.xib; + sourceTree = ""; + }; + A9D7C3F013E8A2B400604772 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + A9D7C3F113E8A2B400604772 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + /* Begin XCBuildConfiguration section */ - 1D6058940D05DD3E006BFB54 /* Debug */ = { + A9D7C3F713E8A2B400604772 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CocoaCamp_Prefix.pch; - INFOPLIST_FILE = "CocoaCamp-Info.plist"; - LIBRARY_SEARCH_PATHS = ( + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", "$(inherited)", - "\"$(SRCROOT)\"", ); - PRODUCT_NAME = CocoaCamp; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + /usr/include/libxml2, + "$(BUILT_PRODUCTS_DIR)/../three20", + "$(BUILT_PRODUCTS_DIR)/../../three20", + ../three20/Build/Products/three20, + ); + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + OTHER_LDFLAGS = "-ObjC"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 1D6058950D05DD3E006BFB54 /* Release */ = { + A9D7C3F813E8A2B400604772 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + /usr/include/libxml2, + "$(BUILT_PRODUCTS_DIR)/../three20", + "$(BUILT_PRODUCTS_DIR)/../../three20", + ../three20/Build/Products/three20, + ); + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + OTHER_LDFLAGS = "-ObjC"; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + A9D7C3FA13E8A2B400604772 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CocoaCamp_Prefix.pch; - INFOPLIST_FILE = "CocoaCamp-Info.plist"; + GCC_PREFIX_HEADER = "CocoaCamp/CocoaCamp-Prefix.pch"; + HEADER_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = "CocoaCamp/CocoaCamp-Info.plist"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", - "\"$(SRCROOT)\"", + "\"$(SRCROOT)/CocoaCamp/Classes/Bump\"", + "\"$(SRCROOT)/CocoaCamp/ZBarSDK\"", ); - PRODUCT_NAME = CocoaCamp; - VALIDATE_PRODUCT = YES; + OTHER_LDFLAGS = ( + "-lxml2", + "-ObjC", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + TARGETED_DEVICE_FAMILY = 1; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + A9D7C3FB13E8A2B400604772 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "CocoaCamp/CocoaCamp-Prefix.pch"; + HEADER_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = "CocoaCamp/CocoaCamp-Info.plist"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/CocoaCamp/Classes/Bump\"", + "\"$(SRCROOT)/CocoaCamp/ZBarSDK\"", + ); + OTHER_LDFLAGS = ( + "-lxml2", + "-ObjC", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + TARGETED_DEVICE_FAMILY = 1; + WRAPPER_EXTENSION = app; }; name = Release; }; - C01FCF4F08A954540054247B /* Debug */ = { + A9D7C3FD13E8A2B400604772 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ../three20/Build/Products/three20; - ONLY_ACTIVE_ARCH = YES; + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/CocoaCamp.app/CocoaCamp"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(DEVELOPER_LIBRARY_DIR)/Frameworks", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "CocoaCamp/CocoaCamp-Prefix.pch"; + HEADER_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = "CocoaCampTests/CocoaCampTests-Info.plist"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/CocoaCamp/Classes/Bump\"", + "\"$(SRCROOT)/CocoaCamp/ZBarSDK\"", + ); OTHER_LDFLAGS = ( + "-lxml2", "-ObjC", - "-all_load", ); - PREBINDING = NO; - SDKROOT = iphoneos4.0; - VALID_ARCHS = armv7; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = octest; }; name = Debug; }; - C01FCF5008A954540054247B /* Release */ = { + A9D7C3FE13E8A2B400604772 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ../three20/Build/Products/three20; - OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/CocoaCamp.app/CocoaCamp"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(DEVELOPER_LIBRARY_DIR)/Frameworks", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "CocoaCamp/CocoaCamp-Prefix.pch"; + HEADER_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = "CocoaCampTests/CocoaCampTests-Info.plist"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/CocoaCamp/Classes/Bump\"", + "\"$(SRCROOT)/CocoaCamp/ZBarSDK\"", + ); OTHER_LDFLAGS = ( + "-lxml2", "-ObjC", - "-all_load", ); - PREBINDING = NO; - SDKROOT = iphoneos4.0; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = octest; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "CocoaCamp" */ = { + A9D7C3B613E8A2B300604772 /* Build configuration list for PBXProject "CocoaCamp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A9D7C3F713E8A2B400604772 /* Debug */, + A9D7C3F813E8A2B400604772 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A9D7C3F913E8A2B400604772 /* Build configuration list for PBXNativeTarget "NAPABA" */ = { isa = XCConfigurationList; buildConfigurations = ( - 1D6058940D05DD3E006BFB54 /* Debug */, - 1D6058950D05DD3E006BFB54 /* Release */, + A9D7C3FA13E8A2B400604772 /* Debug */, + A9D7C3FB13E8A2B400604772 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CocoaCamp" */ = { + A9D7C3FC13E8A2B400604772 /* Build configuration list for PBXNativeTarget "CocoaCampTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - C01FCF4F08A954540054247B /* Debug */, - C01FCF5008A954540054247B /* Release */, + A9D7C3FD13E8A2B400604772 /* Debug */, + A9D7C3FE13E8A2B400604772 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCVersionGroup section */ + A951B687144F193600C35649 /* CocoaCamp.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + A951B688144F193600C35649 /* CocoaCamp.xcdatamodel */, + ); + currentVersion = A951B688144F193600C35649 /* CocoaCamp.xcdatamodel */; + path = CocoaCamp.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; + rootObject = A9D7C3B313E8A2B300604772 /* Project object */; } diff --git a/CocoaCamp.xcodeproj/project.pbxproj.orig b/CocoaCamp.xcodeproj/project.pbxproj.orig deleted file mode 100644 index d6c6df5..0000000 --- a/CocoaCamp.xcodeproj/project.pbxproj.orig +++ /dev/null @@ -1,1084 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 45; - objects = { - -/* Begin PBXBuildFile section */ - 0341222E12148A3400B376F7 /* SessionDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0341222C12148A3400B376F7 /* SessionDetailViewController.m */; }; - 0341222F12148A3400B376F7 /* SessionDetailViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0341222D12148A3400B376F7 /* SessionDetailViewController.xib */; }; - 034A2BF412146D72009F39A6 /* AsyncImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 034A2BF312146D72009F39A6 /* AsyncImageView.m */; }; - 034A2BF812146E2A009F39A6 /* FlickrPageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 034A2BF712146E2A009F39A6 /* FlickrPageView.xib */; }; - 034A2BFC12146E7B009F39A6 /* roundrecbuttonpress.png in Resources */ = {isa = PBXBuildFile; fileRef = 034A2BFB12146E7B009F39A6 /* roundrecbuttonpress.png */; }; - 034A2BFE12146E91009F39A6 /* headerBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = 034A2BFD12146E91009F39A6 /* headerBackground.png */; }; - 03AF412B12120F8D0061D5DD /* FlickrController.m in Sources */ = {isa = PBXBuildFile; fileRef = 03AF412712120F8D0061D5DD /* FlickrController.m */; }; - 03AF412C12120F8D0061D5DD /* FlickrController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 03AF412812120F8D0061D5DD /* FlickrController.xib */; }; - 03AF412D12120F8D0061D5DD /* FlickrPageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 03AF412A12120F8D0061D5DD /* FlickrPageViewController.m */; }; - 03AF413012120FA80061D5DD /* photoIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 03AF412E12120FA80061D5DD /* photoIcon.png */; }; - 03AF413112120FA80061D5DD /* roundrecbuttonnorm.png in Resources */ = {isa = PBXBuildFile; fileRef = 03AF412F12120FA80061D5DD /* roundrecbuttonnorm.png */; }; - 03CD36ED120D0F240054728C /* SessionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 03CD36EB120D0F240054728C /* SessionViewController.m */; }; - 03CD36EE120D0F240054728C /* SessionViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 03CD36EC120D0F240054728C /* SessionViewController.xib */; }; - 03CD3737120D68940054728C /* NSObject+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 03CD372C120D68940054728C /* NSObject+SBJSON.m */; }; - 03CD3738120D68940054728C /* NSString+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 03CD372E120D68940054728C /* NSString+SBJSON.m */; }; - 03CD3739120D68940054728C /* SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 03CD3730120D68940054728C /* SBJSON.m */; }; - 03CD373A120D68940054728C /* SBJsonBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 03CD3732120D68940054728C /* SBJsonBase.m */; }; - 03CD373B120D68940054728C /* SBJsonParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 03CD3734120D68940054728C /* SBJsonParser.m */; }; - 03CD373C120D68940054728C /* SBJsonWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 03CD3736120D68940054728C /* SBJsonWriter.m */; }; - 1D3623260D0F684500981E51 /* CocoaCampAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* CocoaCampAppDelegate.m */; }; - 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; - 28216C970DB411BC00E5133A /* FirstViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28216C960DB411BC00E5133A /* FirstViewController.m */; }; - 288765080DF74369002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765070DF74369002DB57D /* CoreGraphics.framework */; }; - 28AD73880D9D96C1002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD73870D9D96C1002E5188 /* MainWindow.xib */; }; - 80347CCD11F937B6001584F3 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80347CCC11F937B6001584F3 /* AddressBookUI.framework */; }; - 80DFC4F511F90E61005F3907 /* SessionListTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 80DFC4F411F90E61005F3907 /* SessionListTableViewController.m */; }; - 80DFC4FC11F90F04005F3907 /* Session.m in Sources */ = {isa = PBXBuildFile; fileRef = 80DFC4FB11F90F04005F3907 /* Session.m */; }; - 80DFC56211F91A05005F3907 /* ContactExchangeView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 80DFC56011F91A05005F3907 /* ContactExchangeView.xib */; }; - 80DFC56311F91A05005F3907 /* SessionListTableView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 80DFC56111F91A05005F3907 /* SessionListTableView.xib */; }; - 80E958C211F8B2C100589CF0 /* libBump.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 80E958C111F8B2C100589CF0 /* libBump.a */; }; - 80E958C511F8B2E000589CF0 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80E958C411F8B2E000589CF0 /* AudioToolbox.framework */; }; - 80E958C711F8B2E000589CF0 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80E958C611F8B2E000589CF0 /* CoreLocation.framework */; }; - 80E958E611F8B2F400589CF0 /* bump_button_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958CD11F8B2F400589CF0 /* bump_button_blue.png */; }; - 80E958E711F8B2F400589CF0 /* bump_close.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958CE11F8B2F400589CF0 /* bump_close.png */; }; - 80E958E811F8B2F400589CF0 /* bump_close_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958CF11F8B2F400589CF0 /* bump_close_selected.png */; }; - 80E958E911F8B2F400589CF0 /* bump_content_area.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958D011F8B2F400589CF0 /* bump_content_area.png */; }; - 80E958EA11F8B2F400589CF0 /* bump_dropdown.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958D111F8B2F400589CF0 /* bump_dropdown.png */; }; - 80E958EB11F8B2F400589CF0 /* bump_hands_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958D211F8B2F400589CF0 /* bump_hands_bg.png */; }; - 80E958EC11F8B2F400589CF0 /* bump_lefthand.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958D311F8B2F400589CF0 /* bump_lefthand.png */; }; - 80E958ED11F8B2F400589CF0 /* bump_nameview.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958D411F8B2F400589CF0 /* bump_nameview.png */; }; - 80E958EE11F8B2F400589CF0 /* bump_no_button.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958D511F8B2F400589CF0 /* bump_no_button.png */; }; - 80E958EF11F8B2F400589CF0 /* bump_nonetwork.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958D611F8B2F400589CF0 /* bump_nonetwork.png */; }; - 80E958F011F8B2F400589CF0 /* bump_popupdefault.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958D711F8B2F400589CF0 /* bump_popupdefault.png */; }; - 80E958F111F8B2F400589CF0 /* bump_righthand.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958D811F8B2F400589CF0 /* bump_righthand.png */; }; - 80E958F211F8B2F400589CF0 /* bump_signal1.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958D911F8B2F400589CF0 /* bump_signal1.png */; }; - 80E958F311F8B2F400589CF0 /* bump_signal2.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958DA11F8B2F400589CF0 /* bump_signal2.png */; }; - 80E958F411F8B2F400589CF0 /* bump_signal3.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958DB11F8B2F400589CF0 /* bump_signal3.png */; }; - 80E958F511F8B2F400589CF0 /* bump_signal4.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958DC11F8B2F400589CF0 /* bump_signal4.png */; }; - 80E958F611F8B2F400589CF0 /* bump_tap.aif in Resources */ = {isa = PBXBuildFile; fileRef = 80E958DD11F8B2F400589CF0 /* bump_tap.aif */; }; - 80E958F711F8B2F400589CF0 /* bump_titlebar_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958DE11F8B2F400589CF0 /* bump_titlebar_bg.png */; }; - 80E958F811F8B2F400589CF0 /* bump_white_low.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958DF11F8B2F400589CF0 /* bump_white_low.png */; }; - 80E958F911F8B2F400589CF0 /* bump_yes_button.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E958E011F8B2F400589CF0 /* bump_yes_button.png */; }; - 80E958FA11F8B2F400589CF0 /* BumpApiPopup.xib in Resources */ = {isa = PBXBuildFile; fileRef = 80E958E111F8B2F400589CF0 /* BumpApiPopup.xib */; }; - 80E958FB11F8B2F400589CF0 /* BumpChangeNameScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 80E958E211F8B2F400589CF0 /* BumpChangeNameScreen.xib */; }; - 80E958FC11F8B2F400589CF0 /* BumpConfirmScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 80E958E311F8B2F400589CF0 /* BumpConfirmScreen.xib */; }; - 80E958FD11F8B2F400589CF0 /* BumpPromptScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 80E958E411F8B2F400589CF0 /* BumpPromptScreen.xib */; }; - 80E958FE11F8B2F400589CF0 /* BumpStartScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 80E958E511F8B2F400589CF0 /* BumpStartScreen.xib */; }; - 80E9592411F8BCE200589CF0 /* ContactManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 80E9592311F8BCE200589CF0 /* ContactManager.m */; }; - 80E959B111F8D4C700589CF0 /* bird.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E959AE11F8D4C700589CF0 /* bird.png */; }; - 80E959B211F8D4C700589CF0 /* calendar.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E959AF11F8D4C700589CF0 /* calendar.png */; }; - 80E959B311F8D4C700589CF0 /* group.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E959B011F8D4C700589CF0 /* group.png */; }; - 80E959BD11F8D5ED00589CF0 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80E959BC11F8D5ED00589CF0 /* AddressBook.framework */; }; - 80E95B0411F9056F00589CF0 /* bump.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E95B0311F9056F00589CF0 /* bump.png */; }; - 80E95B0611F9062500589CF0 /* bump@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 80E95B0511F9062500589CF0 /* bump@2x.png */; }; - AB2AE44E11EBAA8E00015C01 /* 512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = AB2AE44D11EBAA8E00015C01 /* 512x512.png */; }; - AB2AE45A11EBACF500015C01 /* iPhoneAppIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = AB2AE45811EBACF500015C01 /* iPhoneAppIcon.png */; }; - AB2AE45B11EBACF500015C01 /* iPhoneAppIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AB2AE45911EBACF500015C01 /* iPhoneAppIcon@2x.png */; }; - AB2AE45F11EBAD7D00015C01 /* LICENSE.txt in Resources */ = {isa = PBXBuildFile; fileRef = AB2AE45E11EBAD7D00015C01 /* LICENSE.txt */; }; - FB477A8B120CA9CF00FA7C4E /* libThree20.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB477A42120CA95E00FA7C4E /* libThree20.a */; }; - FB477A8C120CA9D000FA7C4E /* libThree20Core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB477A69120CA9A500FA7C4E /* libThree20Core.a */; }; - FB477A8D120CA9D100FA7C4E /* libThree20Network.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB477A6F120CA9A500FA7C4E /* libThree20Network.a */; }; - FB477A8E120CA9D100FA7C4E /* libThree20Style.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB477A75120CA9A500FA7C4E /* libThree20Style.a */; }; - FB477A8F120CA9E000FA7C4E /* libThree20UI.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB477A87120CA9A500FA7C4E /* libThree20UI.a */; }; - FB477A90120CA9E200FA7C4E /* libThree20UICommon.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB477A7B120CA9A500FA7C4E /* libThree20UICommon.a */; }; - FB477A91120CA9E200FA7C4E /* libThree20UINavigator.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB477A81120CA9A500FA7C4E /* libThree20UINavigator.a */; }; - FB477AA2120CAAB700FA7C4E /* Three20.bundle in Resources */ = {isa = PBXBuildFile; fileRef = FB477AA1120CAAB700FA7C4E /* Three20.bundle */; }; - FB477ADE120CAAD900FA7C4E /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB477ADD120CAAD900FA7C4E /* QuartzCore.framework */; }; - FB477AF1120CACEA00FA7C4E /* SecondViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FB477AF0120CACEA00FA7C4E /* SecondViewController.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - FB477A41120CA95E00FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A16120CA95D00FA7C4E /* Three20.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = BEF31F3A0F352DF5000DE5D2; - remoteInfo = Three20; - }; - FB477A43120CA95E00FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A16120CA95D00FA7C4E /* Three20.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; - remoteInfo = UnitTests; - }; - FB477A68120CA9A500FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A54120CA9A500FA7C4E /* Three20Core.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = BEF31F3A0F352DF5000DE5D2; - remoteInfo = Three20Core; - }; - FB477A6A120CA9A500FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A54120CA9A500FA7C4E /* Three20Core.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; - remoteInfo = UnitTests; - }; - FB477A6E120CA9A500FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A57120CA9A500FA7C4E /* Three20Network.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = BEF31F3A0F352DF5000DE5D2; - remoteInfo = Three20Network; - }; - FB477A70120CA9A500FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A57120CA9A500FA7C4E /* Three20Network.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; - remoteInfo = UnitTests; - }; - FB477A74120CA9A500FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A5A120CA9A500FA7C4E /* Three20Style.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = BEF31F3A0F352DF5000DE5D2; - remoteInfo = Three20Style; - }; - FB477A76120CA9A500FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A5A120CA9A500FA7C4E /* Three20Style.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; - remoteInfo = UnitTests; - }; - FB477A7A120CA9A500FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A5D120CA9A500FA7C4E /* Three20UICommon.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = BEF31F3A0F352DF5000DE5D2; - remoteInfo = Three20UICommon; - }; - FB477A7C120CA9A500FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A5D120CA9A500FA7C4E /* Three20UICommon.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; - remoteInfo = UnitTests; - }; - FB477A80120CA9A500FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A60120CA9A500FA7C4E /* Three20UINavigator.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = BEF31F3A0F352DF5000DE5D2; - remoteInfo = Three20UINavigator; - }; - FB477A82120CA9A500FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A60120CA9A500FA7C4E /* Three20UINavigator.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; - remoteInfo = UnitTests; - }; - FB477A86120CA9A500FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A63120CA9A500FA7C4E /* Three20UI.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = BEF31F3A0F352DF5000DE5D2; - remoteInfo = Three20UI; - }; - FB477A88120CA9A500FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A63120CA9A500FA7C4E /* Three20UI.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = EB9E6C6210B6A8F800DE563C; - remoteInfo = UnitTests; - }; - FB477A92120CAA8300FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A60120CA9A500FA7C4E /* Three20UINavigator.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BEF31F390F352DF5000DE5D2; - remoteInfo = Three20UINavigator; - }; - FB477A94120CAA8300FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A54120CA9A500FA7C4E /* Three20Core.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BEF31F390F352DF5000DE5D2; - remoteInfo = Three20Core; - }; - FB477A96120CAA8300FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A16120CA95D00FA7C4E /* Three20.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BEF31F390F352DF5000DE5D2; - remoteInfo = Three20; - }; - FB477A98120CAA8300FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A63120CA9A500FA7C4E /* Three20UI.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BEF31F390F352DF5000DE5D2; - remoteInfo = Three20UI; - }; - FB477A9A120CAA8300FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A57120CA9A500FA7C4E /* Three20Network.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BEF31F390F352DF5000DE5D2; - remoteInfo = Three20Network; - }; - FB477A9C120CAA8300FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A5D120CA9A500FA7C4E /* Three20UICommon.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BEF31F390F352DF5000DE5D2; - remoteInfo = Three20UICommon; - }; - FB477A9E120CAA8300FA7C4E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = FB477A5A120CA9A500FA7C4E /* Three20Style.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BEF31F390F352DF5000DE5D2; - remoteInfo = Three20Style; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 0341222B12148A3400B376F7 /* SessionDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SessionDetailViewController.h; sourceTree = ""; }; - 0341222C12148A3400B376F7 /* SessionDetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SessionDetailViewController.m; sourceTree = ""; }; - 0341222D12148A3400B376F7 /* SessionDetailViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SessionDetailViewController.xib; sourceTree = ""; }; - 034A2BF212146D72009F39A6 /* AsyncImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsyncImageView.h; sourceTree = ""; }; - 034A2BF312146D72009F39A6 /* AsyncImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AsyncImageView.m; sourceTree = ""; }; - 034A2BF712146E2A009F39A6 /* FlickrPageView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FlickrPageView.xib; sourceTree = ""; }; - 034A2BFB12146E7B009F39A6 /* roundrecbuttonpress.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = roundrecbuttonpress.png; sourceTree = ""; }; - 034A2BFD12146E91009F39A6 /* headerBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = headerBackground.png; sourceTree = ""; }; - 03AF412612120F8D0061D5DD /* FlickrController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlickrController.h; sourceTree = ""; }; - 03AF412712120F8D0061D5DD /* FlickrController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlickrController.m; sourceTree = ""; }; - 03AF412812120F8D0061D5DD /* FlickrController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FlickrController.xib; sourceTree = ""; }; - 03AF412912120F8D0061D5DD /* FlickrPageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlickrPageViewController.h; sourceTree = ""; }; - 03AF412A12120F8D0061D5DD /* FlickrPageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlickrPageViewController.m; sourceTree = ""; }; - 03AF412E12120FA80061D5DD /* photoIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = photoIcon.png; sourceTree = ""; }; - 03AF412F12120FA80061D5DD /* roundrecbuttonnorm.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = roundrecbuttonnorm.png; sourceTree = ""; }; - 03CD36EA120D0F240054728C /* SessionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SessionViewController.h; sourceTree = ""; }; - 03CD36EB120D0F240054728C /* SessionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SessionViewController.m; sourceTree = ""; }; - 03CD36EC120D0F240054728C /* SessionViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = SessionViewController.xib; path = Classes/SessionViewController.xib; sourceTree = ""; }; - 03CD372A120D68940054728C /* JSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSON.h; sourceTree = ""; }; - 03CD372B120D68940054728C /* NSObject+SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+SBJSON.h"; sourceTree = ""; }; - 03CD372C120D68940054728C /* NSObject+SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+SBJSON.m"; sourceTree = ""; }; - 03CD372D120D68940054728C /* NSString+SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+SBJSON.h"; sourceTree = ""; }; - 03CD372E120D68940054728C /* NSString+SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+SBJSON.m"; sourceTree = ""; }; - 03CD372F120D68940054728C /* SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJSON.h; sourceTree = ""; }; - 03CD3730120D68940054728C /* SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJSON.m; sourceTree = ""; }; - 03CD3731120D68940054728C /* SBJsonBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonBase.h; sourceTree = ""; }; - 03CD3732120D68940054728C /* SBJsonBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonBase.m; sourceTree = ""; }; - 03CD3733120D68940054728C /* SBJsonParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonParser.h; sourceTree = ""; }; - 03CD3734120D68940054728C /* SBJsonParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonParser.m; sourceTree = ""; }; - 03CD3735120D68940054728C /* SBJsonWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonWriter.h; sourceTree = ""; }; - 03CD3736120D68940054728C /* SBJsonWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonWriter.m; sourceTree = ""; }; - 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D3623240D0F684500981E51 /* CocoaCampAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CocoaCampAppDelegate.h; sourceTree = ""; }; - 1D3623250D0F684500981E51 /* CocoaCampAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CocoaCampAppDelegate.m; sourceTree = ""; }; - 1D6058910D05DD3D006BFB54 /* CocoaCamp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CocoaCamp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 28216C950DB411BC00E5133A /* FirstViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FirstViewController.h; sourceTree = ""; }; - 28216C960DB411BC00E5133A /* FirstViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FirstViewController.m; sourceTree = ""; }; - 288765070DF74369002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 28A0AB4B0D9B1048005BE974 /* CocoaCamp_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CocoaCamp_Prefix.pch; sourceTree = ""; }; - 28AD73870D9D96C1002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; - 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 80347CCC11F937B6001584F3 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; - 80DFC4F311F90E61005F3907 /* SessionListTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SessionListTableViewController.h; sourceTree = ""; }; - 80DFC4F411F90E61005F3907 /* SessionListTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SessionListTableViewController.m; sourceTree = ""; }; - 80DFC4FA11F90F04005F3907 /* Session.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Session.h; sourceTree = ""; }; - 80DFC4FB11F90F04005F3907 /* Session.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Session.m; sourceTree = ""; }; - 80DFC56011F91A05005F3907 /* ContactExchangeView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ContactExchangeView.xib; path = Resources/ContactExchangeView.xib; sourceTree = ""; }; - 80DFC56111F91A05005F3907 /* SessionListTableView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = SessionListTableView.xib; path = Resources/SessionListTableView.xib; sourceTree = ""; }; - 80E958BF11F8B2B800589CF0 /* Bump.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bump.h; sourceTree = ""; }; - 80E958C011F8B2B800589CF0 /* BumpContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BumpContact.h; sourceTree = ""; }; - 80E958C111F8B2C100589CF0 /* libBump.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libBump.a; sourceTree = ""; }; - 80E958C411F8B2E000589CF0 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 80E958C611F8B2E000589CF0 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 80E958CD11F8B2F400589CF0 /* bump_button_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_button_blue.png; sourceTree = ""; }; - 80E958CE11F8B2F400589CF0 /* bump_close.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_close.png; sourceTree = ""; }; - 80E958CF11F8B2F400589CF0 /* bump_close_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_close_selected.png; sourceTree = ""; }; - 80E958D011F8B2F400589CF0 /* bump_content_area.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_content_area.png; sourceTree = ""; }; - 80E958D111F8B2F400589CF0 /* bump_dropdown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_dropdown.png; sourceTree = ""; }; - 80E958D211F8B2F400589CF0 /* bump_hands_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_hands_bg.png; sourceTree = ""; }; - 80E958D311F8B2F400589CF0 /* bump_lefthand.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_lefthand.png; sourceTree = ""; }; - 80E958D411F8B2F400589CF0 /* bump_nameview.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_nameview.png; sourceTree = ""; }; - 80E958D511F8B2F400589CF0 /* bump_no_button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_no_button.png; sourceTree = ""; }; - 80E958D611F8B2F400589CF0 /* bump_nonetwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_nonetwork.png; sourceTree = ""; }; - 80E958D711F8B2F400589CF0 /* bump_popupdefault.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_popupdefault.png; sourceTree = ""; }; - 80E958D811F8B2F400589CF0 /* bump_righthand.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_righthand.png; sourceTree = ""; }; - 80E958D911F8B2F400589CF0 /* bump_signal1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_signal1.png; sourceTree = ""; }; - 80E958DA11F8B2F400589CF0 /* bump_signal2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_signal2.png; sourceTree = ""; }; - 80E958DB11F8B2F400589CF0 /* bump_signal3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_signal3.png; sourceTree = ""; }; - 80E958DC11F8B2F400589CF0 /* bump_signal4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_signal4.png; sourceTree = ""; }; - 80E958DD11F8B2F400589CF0 /* bump_tap.aif */ = {isa = PBXFileReference; lastKnownFileType = file; path = bump_tap.aif; sourceTree = ""; }; - 80E958DE11F8B2F400589CF0 /* bump_titlebar_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_titlebar_bg.png; sourceTree = ""; }; - 80E958DF11F8B2F400589CF0 /* bump_white_low.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_white_low.png; sourceTree = ""; }; - 80E958E011F8B2F400589CF0 /* bump_yes_button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bump_yes_button.png; sourceTree = ""; }; - 80E958E111F8B2F400589CF0 /* BumpApiPopup.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BumpApiPopup.xib; sourceTree = ""; }; - 80E958E211F8B2F400589CF0 /* BumpChangeNameScreen.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BumpChangeNameScreen.xib; sourceTree = ""; }; - 80E958E311F8B2F400589CF0 /* BumpConfirmScreen.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BumpConfirmScreen.xib; sourceTree = ""; }; - 80E958E411F8B2F400589CF0 /* BumpPromptScreen.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BumpPromptScreen.xib; sourceTree = ""; }; - 80E958E511F8B2F400589CF0 /* BumpStartScreen.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BumpStartScreen.xib; sourceTree = ""; }; - 80E9592211F8BCE200589CF0 /* ContactManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactManager.h; sourceTree = ""; }; - 80E9592311F8BCE200589CF0 /* ContactManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactManager.m; sourceTree = ""; }; - 80E959AE11F8D4C700589CF0 /* bird.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = bird.png; path = Resources/bird.png; sourceTree = ""; }; - 80E959AF11F8D4C700589CF0 /* calendar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = calendar.png; path = Resources/calendar.png; sourceTree = ""; }; - 80E959B011F8D4C700589CF0 /* group.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = group.png; path = Resources/group.png; sourceTree = ""; }; - 80E959BC11F8D5ED00589CF0 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; - 80E95B0311F9056F00589CF0 /* bump.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = bump.png; path = Resources/bump.png; sourceTree = ""; }; - 80E95B0511F9062500589CF0 /* bump@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "bump@2x.png"; path = "Resources/bump@2x.png"; sourceTree = ""; }; - 8D1107310486CEB800E47090 /* CocoaCamp-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "CocoaCamp-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; - AB2AE44D11EBAA8E00015C01 /* 512x512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 512x512.png; sourceTree = ""; }; - AB2AE45811EBACF500015C01 /* iPhoneAppIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iPhoneAppIcon.png; sourceTree = ""; }; - AB2AE45911EBACF500015C01 /* iPhoneAppIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "iPhoneAppIcon@2x.png"; sourceTree = ""; }; - AB2AE45E11EBAD7D00015C01 /* LICENSE.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE.txt; sourceTree = ""; }; - FB477A16120CA95D00FA7C4E /* Three20.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20.xcodeproj; path = ../three20/src/Three20/Three20.xcodeproj; sourceTree = SOURCE_ROOT; }; - FB477A54120CA9A500FA7C4E /* Three20Core.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20Core.xcodeproj; path = ../three20/src/Three20Core/Three20Core.xcodeproj; sourceTree = SOURCE_ROOT; }; - FB477A57120CA9A500FA7C4E /* Three20Network.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20Network.xcodeproj; path = ../three20/src/Three20Network/Three20Network.xcodeproj; sourceTree = SOURCE_ROOT; }; - FB477A5A120CA9A500FA7C4E /* Three20Style.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20Style.xcodeproj; path = ../three20/src/Three20Style/Three20Style.xcodeproj; sourceTree = SOURCE_ROOT; }; - FB477A5D120CA9A500FA7C4E /* Three20UICommon.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20UICommon.xcodeproj; path = ../three20/src/Three20UICommon/Three20UICommon.xcodeproj; sourceTree = SOURCE_ROOT; }; - FB477A60120CA9A500FA7C4E /* Three20UINavigator.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20UINavigator.xcodeproj; path = ../three20/src/Three20UINavigator/Three20UINavigator.xcodeproj; sourceTree = SOURCE_ROOT; }; - FB477A63120CA9A500FA7C4E /* Three20UI.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Three20UI.xcodeproj; path = ../three20/src/Three20UI/Three20UI.xcodeproj; sourceTree = SOURCE_ROOT; }; - FB477AA1120CAAB700FA7C4E /* Three20.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Three20.bundle; path = ../three20/src/Three20.bundle; sourceTree = SOURCE_ROOT; }; - FB477ADD120CAAD900FA7C4E /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - FB477AEF120CACEA00FA7C4E /* SecondViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SecondViewController.h; sourceTree = ""; }; - FB477AF0120CACEA00FA7C4E /* SecondViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SecondViewController.m; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, - 288765080DF74369002DB57D /* CoreGraphics.framework in Frameworks */, -<<<<<<< HEAD - 80E958C211F8B2C100589CF0 /* libBump.a in Frameworks */, - 80E958C511F8B2E000589CF0 /* AudioToolbox.framework in Frameworks */, - 80E958C711F8B2E000589CF0 /* CoreLocation.framework in Frameworks */, - 80E959BD11F8D5ED00589CF0 /* AddressBook.framework in Frameworks */, - 80347CCD11F937B6001584F3 /* AddressBookUI.framework in Frameworks */, -======= - FB477A8B120CA9CF00FA7C4E /* libThree20.a in Frameworks */, - FB477A8C120CA9D000FA7C4E /* libThree20Core.a in Frameworks */, - FB477A8D120CA9D100FA7C4E /* libThree20Network.a in Frameworks */, - FB477A8E120CA9D100FA7C4E /* libThree20Style.a in Frameworks */, - FB477A8F120CA9E000FA7C4E /* libThree20UI.a in Frameworks */, - FB477A90120CA9E200FA7C4E /* libThree20UICommon.a in Frameworks */, - FB477A91120CA9E200FA7C4E /* libThree20UINavigator.a in Frameworks */, - FB477ADE120CAAD900FA7C4E /* QuartzCore.framework in Frameworks */, ->>>>>>> cocoacamp/master - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 03CD3729120D68940054728C /* JSON */ = { - isa = PBXGroup; - children = ( - 03CD372A120D68940054728C /* JSON.h */, - 03CD372B120D68940054728C /* NSObject+SBJSON.h */, - 03CD372C120D68940054728C /* NSObject+SBJSON.m */, - 03CD372D120D68940054728C /* NSString+SBJSON.h */, - 03CD372E120D68940054728C /* NSString+SBJSON.m */, - 03CD372F120D68940054728C /* SBJSON.h */, - 03CD3730120D68940054728C /* SBJSON.m */, - 03CD3731120D68940054728C /* SBJsonBase.h */, - 03CD3732120D68940054728C /* SBJsonBase.m */, - 03CD3733120D68940054728C /* SBJsonParser.h */, - 03CD3734120D68940054728C /* SBJsonParser.m */, - 03CD3735120D68940054728C /* SBJsonWriter.h */, - 03CD3736120D68940054728C /* SBJsonWriter.m */, - ); - path = JSON; - sourceTree = ""; - }; - 080E96DDFE201D6D7F000001 /* Classes */ = { - isa = PBXGroup; - children = ( - 03AF412612120F8D0061D5DD /* FlickrController.h */, - 03AF412712120F8D0061D5DD /* FlickrController.m */, - 03AF412812120F8D0061D5DD /* FlickrController.xib */, - 03AF412912120F8D0061D5DD /* FlickrPageViewController.h */, - 03AF412A12120F8D0061D5DD /* FlickrPageViewController.m */, - 034A2BF712146E2A009F39A6 /* FlickrPageView.xib */, - 03CD3729120D68940054728C /* JSON */, - 28216C950DB411BC00E5133A /* FirstViewController.h */, - 28216C960DB411BC00E5133A /* FirstViewController.m */, - 1D3623240D0F684500981E51 /* CocoaCampAppDelegate.h */, - 1D3623250D0F684500981E51 /* CocoaCampAppDelegate.m */, -<<<<<<< HEAD - 80E9592211F8BCE200589CF0 /* ContactManager.h */, - 80E9592311F8BCE200589CF0 /* ContactManager.m */, - 80DFC4F311F90E61005F3907 /* SessionListTableViewController.h */, - 80DFC4F411F90E61005F3907 /* SessionListTableViewController.m */, - 80DFC4FA11F90F04005F3907 /* Session.h */, - 80DFC4FB11F90F04005F3907 /* Session.m */, -======= - FB477AEF120CACEA00FA7C4E /* SecondViewController.h */, - FB477AF0120CACEA00FA7C4E /* SecondViewController.m */, - 03CD36EA120D0F240054728C /* SessionViewController.h */, - 03CD36EB120D0F240054728C /* SessionViewController.m */, - 034A2BF212146D72009F39A6 /* AsyncImageView.h */, - 034A2BF312146D72009F39A6 /* AsyncImageView.m */, - 0341222B12148A3400B376F7 /* SessionDetailViewController.h */, - 0341222C12148A3400B376F7 /* SessionDetailViewController.m */, - 0341222D12148A3400B376F7 /* SessionDetailViewController.xib */, ->>>>>>> cocoacamp/master - ); - path = Classes; - sourceTree = ""; - }; - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 1D6058910D05DD3D006BFB54 /* CocoaCamp.app */, - ); - name = Products; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CocoaCamp */ = { - isa = PBXGroup; - children = ( - 080E96DDFE201D6D7F000001 /* Classes */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, - 29B97317FDCFA39411CA2CEA /* Resources */, - FB4779BC120CA66E00FA7C4E /* Dependencies */, - FB477987120CA57C00FA7C4E /* Libraries */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - 19C28FACFE9D520D11CA2CBB /* Products */, - AB2AE45E11EBAD7D00015C01 /* LICENSE.txt */, - ); - name = CocoaCamp; - sourceTree = ""; - }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { - isa = PBXGroup; - children = ( - 80E958BF11F8B2B800589CF0 /* Bump.h */, - 80E958C011F8B2B800589CF0 /* BumpContact.h */, - 28A0AB4B0D9B1048005BE974 /* CocoaCamp_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 29B97317FDCFA39411CA2CEA /* Resources */ = { - isa = PBXGroup; - children = ( -<<<<<<< HEAD - 80E958CC11F8B2F400589CF0 /* Bump_Resources */, - AB2AE44A11EBAA8500015C01 /* Images */, - 80DFC56011F91A05005F3907 /* ContactExchangeView.xib */, - 80DFC56111F91A05005F3907 /* SessionListTableView.xib */, -======= - AB2AE44A11EBAA8500015C01 /* images */, - 282CCBFD0DB6C98000C4EA27 /* SecondView.xib */, - 03CD36EC120D0F240054728C /* SessionViewController.xib */, ->>>>>>> cocoacamp/master - 28AD73870D9D96C1002E5188 /* MainWindow.xib */, - 8D1107310486CEB800E47090 /* CocoaCamp-Info.plist */, - ); - name = Resources; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 80E958C111F8B2C100589CF0 /* libBump.a */, - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - 288765070DF74369002DB57D /* CoreGraphics.framework */, -<<<<<<< HEAD - 80E958C411F8B2E000589CF0 /* AudioToolbox.framework */, - 80E958C611F8B2E000589CF0 /* CoreLocation.framework */, - 80E959BC11F8D5ED00589CF0 /* AddressBook.framework */, - 80347CCC11F937B6001584F3 /* AddressBookUI.framework */, -======= - FB477ADD120CAAD900FA7C4E /* QuartzCore.framework */, ->>>>>>> cocoacamp/master - ); - name = Frameworks; - sourceTree = ""; - }; - 80E958CC11F8B2F400589CF0 /* Bump_Resources */ = { - isa = PBXGroup; - children = ( -<<<<<<< HEAD - 80E958CD11F8B2F400589CF0 /* bump_button_blue.png */, - 80E958CE11F8B2F400589CF0 /* bump_close.png */, - 80E958CF11F8B2F400589CF0 /* bump_close_selected.png */, - 80E958D011F8B2F400589CF0 /* bump_content_area.png */, - 80E958D111F8B2F400589CF0 /* bump_dropdown.png */, - 80E958D211F8B2F400589CF0 /* bump_hands_bg.png */, - 80E958D311F8B2F400589CF0 /* bump_lefthand.png */, - 80E958D411F8B2F400589CF0 /* bump_nameview.png */, - 80E958D511F8B2F400589CF0 /* bump_no_button.png */, - 80E958D611F8B2F400589CF0 /* bump_nonetwork.png */, - 80E958D711F8B2F400589CF0 /* bump_popupdefault.png */, - 80E958D811F8B2F400589CF0 /* bump_righthand.png */, - 80E958D911F8B2F400589CF0 /* bump_signal1.png */, - 80E958DA11F8B2F400589CF0 /* bump_signal2.png */, - 80E958DB11F8B2F400589CF0 /* bump_signal3.png */, - 80E958DC11F8B2F400589CF0 /* bump_signal4.png */, - 80E958DD11F8B2F400589CF0 /* bump_tap.aif */, - 80E958DE11F8B2F400589CF0 /* bump_titlebar_bg.png */, - 80E958DF11F8B2F400589CF0 /* bump_white_low.png */, - 80E958E011F8B2F400589CF0 /* bump_yes_button.png */, - 80E958E111F8B2F400589CF0 /* BumpApiPopup.xib */, - 80E958E211F8B2F400589CF0 /* BumpChangeNameScreen.xib */, - 80E958E311F8B2F400589CF0 /* BumpConfirmScreen.xib */, - 80E958E411F8B2F400589CF0 /* BumpPromptScreen.xib */, - 80E958E511F8B2F400589CF0 /* BumpStartScreen.xib */, - ); - path = Bump_Resources; - sourceTree = ""; - }; - AB2AE44A11EBAA8500015C01 /* Images */ = { - isa = PBXGroup; - children = ( - 80E95B0511F9062500589CF0 /* bump@2x.png */, - 80E95B0311F9056F00589CF0 /* bump.png */, - 80E959AE11F8D4C700589CF0 /* bird.png */, - 80E959AF11F8D4C700589CF0 /* calendar.png */, - 80E959B011F8D4C700589CF0 /* group.png */, -======= - 034A2BFD12146E91009F39A6 /* headerBackground.png */, - 03AF412E12120FA80061D5DD /* photoIcon.png */, - 034A2BFB12146E7B009F39A6 /* roundrecbuttonpress.png */, - 03AF412F12120FA80061D5DD /* roundrecbuttonnorm.png */, ->>>>>>> cocoacamp/master - AB2AE45811EBACF500015C01 /* iPhoneAppIcon.png */, - AB2AE45911EBACF500015C01 /* iPhoneAppIcon@2x.png */, - AB2AE44D11EBAA8E00015C01 /* 512x512.png */, - ); - name = Images; - sourceTree = ""; - }; - FB477987120CA57C00FA7C4E /* Libraries */ = { - isa = PBXGroup; - children = ( - ); - path = Libraries; - sourceTree = ""; - }; - FB4779BC120CA66E00FA7C4E /* Dependencies */ = { - isa = PBXGroup; - children = ( - FB477AA1120CAAB700FA7C4E /* Three20.bundle */, - FB477A16120CA95D00FA7C4E /* Three20.xcodeproj */, - FB477A54120CA9A500FA7C4E /* Three20Core.xcodeproj */, - FB477A57120CA9A500FA7C4E /* Three20Network.xcodeproj */, - FB477A5A120CA9A500FA7C4E /* Three20Style.xcodeproj */, - FB477A5D120CA9A500FA7C4E /* Three20UICommon.xcodeproj */, - FB477A60120CA9A500FA7C4E /* Three20UINavigator.xcodeproj */, - FB477A63120CA9A500FA7C4E /* Three20UI.xcodeproj */, - ); - name = Dependencies; - sourceTree = ""; - }; - FB477A17120CA95D00FA7C4E /* Products */ = { - isa = PBXGroup; - children = ( - FB477A42120CA95E00FA7C4E /* libThree20.a */, - FB477A44120CA95E00FA7C4E /* UnitTests.octest */, - ); - name = Products; - sourceTree = ""; - }; - FB477A55120CA9A500FA7C4E /* Products */ = { - isa = PBXGroup; - children = ( - FB477A69120CA9A500FA7C4E /* libThree20Core.a */, - FB477A6B120CA9A500FA7C4E /* CoreUnitTests.octest */, - ); - name = Products; - sourceTree = ""; - }; - FB477A58120CA9A500FA7C4E /* Products */ = { - isa = PBXGroup; - children = ( - FB477A6F120CA9A500FA7C4E /* libThree20Network.a */, - FB477A71120CA9A500FA7C4E /* UnitTests.octest */, - ); - name = Products; - sourceTree = ""; - }; - FB477A5B120CA9A500FA7C4E /* Products */ = { - isa = PBXGroup; - children = ( - FB477A75120CA9A500FA7C4E /* libThree20Style.a */, - FB477A77120CA9A500FA7C4E /* UnitTests.octest */, - ); - name = Products; - sourceTree = ""; - }; - FB477A5E120CA9A500FA7C4E /* Products */ = { - isa = PBXGroup; - children = ( - FB477A7B120CA9A500FA7C4E /* libThree20UICommon.a */, - FB477A7D120CA9A500FA7C4E /* UnitTests.octest */, - ); - name = Products; - sourceTree = ""; - }; - FB477A61120CA9A500FA7C4E /* Products */ = { - isa = PBXGroup; - children = ( - FB477A81120CA9A500FA7C4E /* libThree20UINavigator.a */, - FB477A83120CA9A500FA7C4E /* UnitTests.octest */, - ); - name = Products; - sourceTree = ""; - }; - FB477A64120CA9A500FA7C4E /* Products */ = { - isa = PBXGroup; - children = ( - FB477A87120CA9A500FA7C4E /* libThree20UI.a */, - FB477A89120CA9A500FA7C4E /* UnitTests.octest */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 1D6058900D05DD3D006BFB54 /* CocoaCamp */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "CocoaCamp" */; - buildPhases = ( - 1D60588D0D05DD3D006BFB54 /* Resources */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - FB477A93120CAA8300FA7C4E /* PBXTargetDependency */, - FB477A95120CAA8300FA7C4E /* PBXTargetDependency */, - FB477A97120CAA8300FA7C4E /* PBXTargetDependency */, - FB477A99120CAA8300FA7C4E /* PBXTargetDependency */, - FB477A9B120CAA8300FA7C4E /* PBXTargetDependency */, - FB477A9D120CAA8300FA7C4E /* PBXTargetDependency */, - FB477A9F120CAA8300FA7C4E /* PBXTargetDependency */, - ); - name = CocoaCamp; - productName = CocoaCamp; - productReference = 1D6058910D05DD3D006BFB54 /* CocoaCamp.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CocoaCamp" */; - compatibilityVersion = "Xcode 3.1"; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - ); - mainGroup = 29B97314FDCFA39411CA2CEA /* CocoaCamp */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = FB477A17120CA95D00FA7C4E /* Products */; - ProjectRef = FB477A16120CA95D00FA7C4E /* Three20.xcodeproj */; - }, - { - ProductGroup = FB477A55120CA9A500FA7C4E /* Products */; - ProjectRef = FB477A54120CA9A500FA7C4E /* Three20Core.xcodeproj */; - }, - { - ProductGroup = FB477A58120CA9A500FA7C4E /* Products */; - ProjectRef = FB477A57120CA9A500FA7C4E /* Three20Network.xcodeproj */; - }, - { - ProductGroup = FB477A5B120CA9A500FA7C4E /* Products */; - ProjectRef = FB477A5A120CA9A500FA7C4E /* Three20Style.xcodeproj */; - }, - { - ProductGroup = FB477A64120CA9A500FA7C4E /* Products */; - ProjectRef = FB477A63120CA9A500FA7C4E /* Three20UI.xcodeproj */; - }, - { - ProductGroup = FB477A5E120CA9A500FA7C4E /* Products */; - ProjectRef = FB477A5D120CA9A500FA7C4E /* Three20UICommon.xcodeproj */; - }, - { - ProductGroup = FB477A61120CA9A500FA7C4E /* Products */; - ProjectRef = FB477A60120CA9A500FA7C4E /* Three20UINavigator.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 1D6058900D05DD3D006BFB54 /* CocoaCamp */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - FB477A42120CA95E00FA7C4E /* libThree20.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libThree20.a; - remoteRef = FB477A41120CA95E00FA7C4E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - FB477A44120CA95E00FA7C4E /* UnitTests.octest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = UnitTests.octest; - remoteRef = FB477A43120CA95E00FA7C4E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - FB477A69120CA9A500FA7C4E /* libThree20Core.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libThree20Core.a; - remoteRef = FB477A68120CA9A500FA7C4E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - FB477A6B120CA9A500FA7C4E /* CoreUnitTests.octest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = CoreUnitTests.octest; - remoteRef = FB477A6A120CA9A500FA7C4E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - FB477A6F120CA9A500FA7C4E /* libThree20Network.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libThree20Network.a; - remoteRef = FB477A6E120CA9A500FA7C4E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - FB477A71120CA9A500FA7C4E /* UnitTests.octest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = UnitTests.octest; - remoteRef = FB477A70120CA9A500FA7C4E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - FB477A75120CA9A500FA7C4E /* libThree20Style.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libThree20Style.a; - remoteRef = FB477A74120CA9A500FA7C4E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - FB477A77120CA9A500FA7C4E /* UnitTests.octest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = UnitTests.octest; - remoteRef = FB477A76120CA9A500FA7C4E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - FB477A7B120CA9A500FA7C4E /* libThree20UICommon.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libThree20UICommon.a; - remoteRef = FB477A7A120CA9A500FA7C4E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - FB477A7D120CA9A500FA7C4E /* UnitTests.octest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = UnitTests.octest; - remoteRef = FB477A7C120CA9A500FA7C4E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - FB477A81120CA9A500FA7C4E /* libThree20UINavigator.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libThree20UINavigator.a; - remoteRef = FB477A80120CA9A500FA7C4E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - FB477A83120CA9A500FA7C4E /* UnitTests.octest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = UnitTests.octest; - remoteRef = FB477A82120CA9A500FA7C4E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - FB477A87120CA9A500FA7C4E /* libThree20UI.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libThree20UI.a; - remoteRef = FB477A86120CA9A500FA7C4E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - FB477A89120CA9A500FA7C4E /* UnitTests.octest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = UnitTests.octest; - remoteRef = FB477A88120CA9A500FA7C4E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 28AD73880D9D96C1002E5188 /* MainWindow.xib in Resources */, - AB2AE44E11EBAA8E00015C01 /* 512x512.png in Resources */, - AB2AE45A11EBACF500015C01 /* iPhoneAppIcon.png in Resources */, - AB2AE45B11EBACF500015C01 /* iPhoneAppIcon@2x.png in Resources */, - AB2AE45F11EBAD7D00015C01 /* LICENSE.txt in Resources */, -<<<<<<< HEAD - 80E958E611F8B2F400589CF0 /* bump_button_blue.png in Resources */, - 80E958E711F8B2F400589CF0 /* bump_close.png in Resources */, - 80E958E811F8B2F400589CF0 /* bump_close_selected.png in Resources */, - 80E958E911F8B2F400589CF0 /* bump_content_area.png in Resources */, - 80E958EA11F8B2F400589CF0 /* bump_dropdown.png in Resources */, - 80E958EB11F8B2F400589CF0 /* bump_hands_bg.png in Resources */, - 80E958EC11F8B2F400589CF0 /* bump_lefthand.png in Resources */, - 80E958ED11F8B2F400589CF0 /* bump_nameview.png in Resources */, - 80E958EE11F8B2F400589CF0 /* bump_no_button.png in Resources */, - 80E958EF11F8B2F400589CF0 /* bump_nonetwork.png in Resources */, - 80E958F011F8B2F400589CF0 /* bump_popupdefault.png in Resources */, - 80E958F111F8B2F400589CF0 /* bump_righthand.png in Resources */, - 80E958F211F8B2F400589CF0 /* bump_signal1.png in Resources */, - 80E958F311F8B2F400589CF0 /* bump_signal2.png in Resources */, - 80E958F411F8B2F400589CF0 /* bump_signal3.png in Resources */, - 80E958F511F8B2F400589CF0 /* bump_signal4.png in Resources */, - 80E958F611F8B2F400589CF0 /* bump_tap.aif in Resources */, - 80E958F711F8B2F400589CF0 /* bump_titlebar_bg.png in Resources */, - 80E958F811F8B2F400589CF0 /* bump_white_low.png in Resources */, - 80E958F911F8B2F400589CF0 /* bump_yes_button.png in Resources */, - 80E958FA11F8B2F400589CF0 /* BumpApiPopup.xib in Resources */, - 80E958FB11F8B2F400589CF0 /* BumpChangeNameScreen.xib in Resources */, - 80E958FC11F8B2F400589CF0 /* BumpConfirmScreen.xib in Resources */, - 80E958FD11F8B2F400589CF0 /* BumpPromptScreen.xib in Resources */, - 80E958FE11F8B2F400589CF0 /* BumpStartScreen.xib in Resources */, - 80E959B111F8D4C700589CF0 /* bird.png in Resources */, - 80E959B211F8D4C700589CF0 /* calendar.png in Resources */, - 80E959B311F8D4C700589CF0 /* group.png in Resources */, - 80E95B0411F9056F00589CF0 /* bump.png in Resources */, - 80E95B0611F9062500589CF0 /* bump@2x.png in Resources */, - 80DFC56211F91A05005F3907 /* ContactExchangeView.xib in Resources */, - 80DFC56311F91A05005F3907 /* SessionListTableView.xib in Resources */, -======= - FB477AA2120CAAB700FA7C4E /* Three20.bundle in Resources */, - 03CD36EE120D0F240054728C /* SessionViewController.xib in Resources */, - 03AF412C12120F8D0061D5DD /* FlickrController.xib in Resources */, - 03AF413012120FA80061D5DD /* photoIcon.png in Resources */, - 03AF413112120FA80061D5DD /* roundrecbuttonnorm.png in Resources */, - 034A2BF812146E2A009F39A6 /* FlickrPageView.xib in Resources */, - 034A2BFC12146E7B009F39A6 /* roundrecbuttonpress.png in Resources */, - 034A2BFE12146E91009F39A6 /* headerBackground.png in Resources */, - 0341222F12148A3400B376F7 /* SessionDetailViewController.xib in Resources */, ->>>>>>> cocoacamp/master - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1D60588E0D05DD3D006BFB54 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1D60589B0D05DD56006BFB54 /* main.m in Sources */, - 1D3623260D0F684500981E51 /* CocoaCampAppDelegate.m in Sources */, - 28216C970DB411BC00E5133A /* FirstViewController.m in Sources */, -<<<<<<< HEAD - 80E9592411F8BCE200589CF0 /* ContactManager.m in Sources */, - 80DFC4F511F90E61005F3907 /* SessionListTableViewController.m in Sources */, - 80DFC4FC11F90F04005F3907 /* Session.m in Sources */, -======= - FB477AF1120CACEA00FA7C4E /* SecondViewController.m in Sources */, - 03CD36ED120D0F240054728C /* SessionViewController.m in Sources */, - 03CD3737120D68940054728C /* NSObject+SBJSON.m in Sources */, - 03CD3738120D68940054728C /* NSString+SBJSON.m in Sources */, - 03CD3739120D68940054728C /* SBJSON.m in Sources */, - 03CD373A120D68940054728C /* SBJsonBase.m in Sources */, - 03CD373B120D68940054728C /* SBJsonParser.m in Sources */, - 03CD373C120D68940054728C /* SBJsonWriter.m in Sources */, - 03AF412B12120F8D0061D5DD /* FlickrController.m in Sources */, - 03AF412D12120F8D0061D5DD /* FlickrPageViewController.m in Sources */, - 034A2BF412146D72009F39A6 /* AsyncImageView.m in Sources */, - 0341222E12148A3400B376F7 /* SessionDetailViewController.m in Sources */, ->>>>>>> cocoacamp/master - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - FB477A93120CAA8300FA7C4E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Three20UINavigator; - targetProxy = FB477A92120CAA8300FA7C4E /* PBXContainerItemProxy */; - }; - FB477A95120CAA8300FA7C4E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Three20Core; - targetProxy = FB477A94120CAA8300FA7C4E /* PBXContainerItemProxy */; - }; - FB477A97120CAA8300FA7C4E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Three20; - targetProxy = FB477A96120CAA8300FA7C4E /* PBXContainerItemProxy */; - }; - FB477A99120CAA8300FA7C4E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Three20UI; - targetProxy = FB477A98120CAA8300FA7C4E /* PBXContainerItemProxy */; - }; - FB477A9B120CAA8300FA7C4E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Three20Network; - targetProxy = FB477A9A120CAA8300FA7C4E /* PBXContainerItemProxy */; - }; - FB477A9D120CAA8300FA7C4E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Three20UICommon; - targetProxy = FB477A9C120CAA8300FA7C4E /* PBXContainerItemProxy */; - }; - FB477A9F120CAA8300FA7C4E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Three20Style; - targetProxy = FB477A9E120CAA8300FA7C4E /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1D6058940D05DD3E006BFB54 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CocoaCamp_Prefix.pch; - INFOPLIST_FILE = "CocoaCamp-Info.plist"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - ); - PRODUCT_NAME = CocoaCamp; - }; - name = Debug; - }; - 1D6058950D05DD3E006BFB54 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COPY_PHASE_STRIP = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CocoaCamp_Prefix.pch; - INFOPLIST_FILE = "CocoaCamp-Info.plist"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - ); - PRODUCT_NAME = CocoaCamp; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = YES; - GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; - GCC_WARN_MISSING_PARENTHESES = YES; - GCC_WARN_SIGN_COMPARE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = NO; - GCC_WARN_UNKNOWN_PRAGMAS = YES; - GCC_WARN_UNUSED_LABEL = YES; - GCC_WARN_UNUSED_VALUE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; -<<<<<<< HEAD - IPHONEOS_DEPLOYMENT_TARGET = 3.1.3; -======= - HEADER_SEARCH_PATHS = ../three20/Build/Products/three20; - OTHER_LDFLAGS = ( - "-ObjC", - "-all_load", - ); ->>>>>>> cocoacamp/master - PREBINDING = NO; - SDKROOT = iphoneos4.0; - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = YES; - GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; - GCC_WARN_MISSING_PARENTHESES = YES; - GCC_WARN_SIGN_COMPARE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = NO; - GCC_WARN_UNKNOWN_PRAGMAS = YES; - GCC_WARN_UNUSED_LABEL = YES; - GCC_WARN_UNUSED_VALUE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; -<<<<<<< HEAD - IPHONEOS_DEPLOYMENT_TARGET = 3.1.3; -======= - HEADER_SEARCH_PATHS = ../three20/Build/Products/three20; ->>>>>>> cocoacamp/master - OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; - OTHER_LDFLAGS = ( - "-ObjC", - "-all_load", - ); - PREBINDING = NO; - SDKROOT = iphoneos4.0; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "CocoaCamp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D6058940D05DD3E006BFB54 /* Debug */, - 1D6058950D05DD3E006BFB54 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CocoaCamp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4F08A954540054247B /* Debug */, - C01FCF5008A954540054247B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/CocoaCamp.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/CocoaCamp.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..bdf56f2 --- /dev/null +++ b/CocoaCamp.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/CocoaCamp.xcodeproj/project.xcworkspace/xcuserdata/rustyzarse-ssd.xcuserdatad/WorkspaceSettings.xcsettings b/CocoaCamp.xcodeproj/project.xcworkspace/xcuserdata/rustyzarse-ssd.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..06c7d50 --- /dev/null +++ b/CocoaCamp.xcodeproj/project.xcworkspace/xcuserdata/rustyzarse-ssd.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges + + IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges + + + diff --git a/CocoaCamp.xcodeproj/xcuserdata/rustyzarse-ssd.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/CocoaCamp.xcodeproj/xcuserdata/rustyzarse-ssd.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist new file mode 100644 index 0000000..8596b2a --- /dev/null +++ b/CocoaCamp.xcodeproj/xcuserdata/rustyzarse-ssd.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaCamp.xcodeproj/xcuserdata/rustyzarse-ssd.xcuserdatad/xcschemes/CocoaCamp.xcscheme b/CocoaCamp.xcodeproj/xcuserdata/rustyzarse-ssd.xcuserdatad/xcschemes/CocoaCamp.xcscheme new file mode 100644 index 0000000..c310f81 --- /dev/null +++ b/CocoaCamp.xcodeproj/xcuserdata/rustyzarse-ssd.xcuserdatad/xcschemes/CocoaCamp.xcscheme @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaCamp.xcodeproj/xcuserdata/rustyzarse-ssd.xcuserdatad/xcschemes/xcschememanagement.plist b/CocoaCamp.xcodeproj/xcuserdata/rustyzarse-ssd.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..0d658bb --- /dev/null +++ b/CocoaCamp.xcodeproj/xcuserdata/rustyzarse-ssd.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,27 @@ + + + + + SchemeUserState + + CocoaCamp.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + A9D7C3BB13E8A2B300604772 + + primary + + + A9D7C3E413E8A2B400604772 + + primary + + + + + diff --git a/Bump.h b/CocoaCamp/Classes/Bump/Bump.h similarity index 100% rename from Bump.h rename to CocoaCamp/Classes/Bump/Bump.h diff --git a/BumpContact.h b/CocoaCamp/Classes/Bump/BumpContact.h similarity index 100% rename from BumpContact.h rename to CocoaCamp/Classes/Bump/BumpContact.h diff --git a/Bump_Resources/BumpApiPopup.xib b/CocoaCamp/Classes/Bump/Bump_Resources/BumpApiPopup.xib similarity index 100% rename from Bump_Resources/BumpApiPopup.xib rename to CocoaCamp/Classes/Bump/Bump_Resources/BumpApiPopup.xib diff --git a/Bump_Resources/BumpChangeNameScreen.xib b/CocoaCamp/Classes/Bump/Bump_Resources/BumpChangeNameScreen.xib similarity index 100% rename from Bump_Resources/BumpChangeNameScreen.xib rename to CocoaCamp/Classes/Bump/Bump_Resources/BumpChangeNameScreen.xib diff --git a/Bump_Resources/BumpConfirmScreen.xib b/CocoaCamp/Classes/Bump/Bump_Resources/BumpConfirmScreen.xib similarity index 100% rename from Bump_Resources/BumpConfirmScreen.xib rename to CocoaCamp/Classes/Bump/Bump_Resources/BumpConfirmScreen.xib diff --git a/Bump_Resources/BumpPromptScreen.xib b/CocoaCamp/Classes/Bump/Bump_Resources/BumpPromptScreen.xib similarity index 100% rename from Bump_Resources/BumpPromptScreen.xib rename to CocoaCamp/Classes/Bump/Bump_Resources/BumpPromptScreen.xib diff --git a/Bump_Resources/BumpStartScreen.xib b/CocoaCamp/Classes/Bump/Bump_Resources/BumpStartScreen.xib similarity index 100% rename from Bump_Resources/BumpStartScreen.xib rename to CocoaCamp/Classes/Bump/Bump_Resources/BumpStartScreen.xib diff --git a/Bump_Resources/bump_button_blue.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_button_blue.png similarity index 100% rename from Bump_Resources/bump_button_blue.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_button_blue.png diff --git a/Bump_Resources/bump_close.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_close.png similarity index 100% rename from Bump_Resources/bump_close.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_close.png diff --git a/Bump_Resources/bump_close_selected.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_close_selected.png similarity index 100% rename from Bump_Resources/bump_close_selected.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_close_selected.png diff --git a/Bump_Resources/bump_content_area.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_content_area.png similarity index 100% rename from Bump_Resources/bump_content_area.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_content_area.png diff --git a/Bump_Resources/bump_dropdown.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_dropdown.png similarity index 100% rename from Bump_Resources/bump_dropdown.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_dropdown.png diff --git a/Bump_Resources/bump_hands_bg.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_hands_bg.png similarity index 100% rename from Bump_Resources/bump_hands_bg.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_hands_bg.png diff --git a/Bump_Resources/bump_lefthand.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_lefthand.png similarity index 100% rename from Bump_Resources/bump_lefthand.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_lefthand.png diff --git a/Bump_Resources/bump_nameview.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_nameview.png similarity index 100% rename from Bump_Resources/bump_nameview.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_nameview.png diff --git a/Bump_Resources/bump_no_button.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_no_button.png similarity index 100% rename from Bump_Resources/bump_no_button.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_no_button.png diff --git a/Bump_Resources/bump_nonetwork.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_nonetwork.png similarity index 100% rename from Bump_Resources/bump_nonetwork.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_nonetwork.png diff --git a/Bump_Resources/bump_popupdefault.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_popupdefault.png similarity index 100% rename from Bump_Resources/bump_popupdefault.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_popupdefault.png diff --git a/Bump_Resources/bump_righthand.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_righthand.png similarity index 100% rename from Bump_Resources/bump_righthand.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_righthand.png diff --git a/Bump_Resources/bump_signal1.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_signal1.png similarity index 100% rename from Bump_Resources/bump_signal1.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_signal1.png diff --git a/Bump_Resources/bump_signal2.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_signal2.png similarity index 100% rename from Bump_Resources/bump_signal2.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_signal2.png diff --git a/Bump_Resources/bump_signal3.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_signal3.png similarity index 100% rename from Bump_Resources/bump_signal3.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_signal3.png diff --git a/Bump_Resources/bump_signal4.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_signal4.png similarity index 100% rename from Bump_Resources/bump_signal4.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_signal4.png diff --git a/Bump_Resources/bump_tap.aif b/CocoaCamp/Classes/Bump/Bump_Resources/bump_tap.aif similarity index 100% rename from Bump_Resources/bump_tap.aif rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_tap.aif diff --git a/Bump_Resources/bump_titlebar_bg.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_titlebar_bg.png similarity index 100% rename from Bump_Resources/bump_titlebar_bg.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_titlebar_bg.png diff --git a/Bump_Resources/bump_white_low.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_white_low.png similarity index 100% rename from Bump_Resources/bump_white_low.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_white_low.png diff --git a/Bump_Resources/bump_yes_button.png b/CocoaCamp/Classes/Bump/Bump_Resources/bump_yes_button.png similarity index 100% rename from Bump_Resources/bump_yes_button.png rename to CocoaCamp/Classes/Bump/Bump_Resources/bump_yes_button.png diff --git a/libBump.a b/CocoaCamp/Classes/Bump/libBump.a similarity index 100% rename from libBump.a rename to CocoaCamp/Classes/Bump/libBump.a diff --git a/Classes/ContactManager.h b/CocoaCamp/Classes/Contact/ContactManager.h similarity index 100% rename from Classes/ContactManager.h rename to CocoaCamp/Classes/Contact/ContactManager.h diff --git a/Classes/ContactManager.m b/CocoaCamp/Classes/Contact/ContactManager.m similarity index 100% rename from Classes/ContactManager.m rename to CocoaCamp/Classes/Contact/ContactManager.m diff --git a/Classes/PortraitLoader.h b/CocoaCamp/Classes/Contact/PortraitLoader.h similarity index 100% rename from Classes/PortraitLoader.h rename to CocoaCamp/Classes/Contact/PortraitLoader.h diff --git a/Classes/PortraitLoader.m b/CocoaCamp/Classes/Contact/PortraitLoader.m similarity index 100% rename from Classes/PortraitLoader.m rename to CocoaCamp/Classes/Contact/PortraitLoader.m diff --git a/Classes/PortraitLoaderDelegate.h b/CocoaCamp/Classes/Contact/PortraitLoaderDelegate.h similarity index 100% rename from Classes/PortraitLoaderDelegate.h rename to CocoaCamp/Classes/Contact/PortraitLoaderDelegate.h diff --git a/CocoaCamp/Classes/CoreData/CoreDataManager.h b/CocoaCamp/Classes/CoreData/CoreDataManager.h new file mode 100644 index 0000000..9a046ce --- /dev/null +++ b/CocoaCamp/Classes/CoreData/CoreDataManager.h @@ -0,0 +1,24 @@ +// +// CoreDataManager.h +// CocoaCamp +// +// Created by Rusty Zarse on 10/19/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import + +@interface CoreDataManager : NSObject + +@property(retain, nonatomic) NSManagedObjectContext *managedObjectContext; +@property(retain, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; +@property(retain, nonatomic) NSManagedObjectModel *managedObjectModel; + +- (BOOL)save; + +- (NSFetchRequest *)fetchRequestForEntityNamed:(NSString *)entityName; +- (NSArray *)resultsForRequest:(NSFetchRequest *)fetchRequest; + + ++ (CoreDataManager *)sharedUIThreadInstance; +@end diff --git a/CocoaCamp/Classes/CoreData/CoreDataManager.m b/CocoaCamp/Classes/CoreData/CoreDataManager.m new file mode 100644 index 0000000..352c904 --- /dev/null +++ b/CocoaCamp/Classes/CoreData/CoreDataManager.m @@ -0,0 +1,230 @@ +// +// CoreDataManager.m +// CocoaCamp +// +// Created by Rusty Zarse on 10/19/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import "CoreDataManager.h" +@interface CoreDataManager (Private) +- (NSString *)applicationDocumentsDirectory; +@end + +@implementation CoreDataManager +@synthesize managedObjectContext, persistentStoreCoordinator, managedObjectModel; + +- (void)dealloc{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [super dealloc]; +} + +- (id)init +{ + self = [super init]; + if (self) { + // Initialization code here. + if (![NSThread isMainThread]) { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(ownedManagedContextDidChange:) + name:NSManagedObjectContextDidSaveNotification + object:[self managedObjectContext]]; + } + } + + return self; +} + +#pragma mark - Shared Singleton + ++ (CoreDataManager *)sharedUIThreadInstance{ + + // declare static variable + static CoreDataManager *shared = nil; + + if (!shared && ![NSThread isMainThread]) { + // ensure initialization happens on the main thread + [self performSelectorOnMainThread:@selector(sharedUIThreadInstance) withObject:nil waitUntilDone:YES]; + } + // set up dispatch once macro + static dispatch_once_t pred; + + // initialize one time to enforce singleton + dispatch_once(&pred, ^{ + // return CoreDataManager + shared = [[CoreDataManager alloc] init]; + }); + + return shared; +} + +#pragma mark - +#pragma mark Context Change Notification + +- (void)mergeBackgroundChangeNotification:(NSNotification *)saveNotification{ + // make sure this is always called on the UI Thread + // merge to UIThread moc from sent notification on the UI thread + [[[CoreDataManager sharedUIThreadInstance] managedObjectContext] mergeChangesFromContextDidSaveNotification:saveNotification]; + +} +- (void)ownedManagedContextDidChange:(NSNotification *)saveNotification { + // assuming that all foreground processes use shared UI moc + if (![NSThread isMainThread]) { + [self performSelector:@selector(mergeBackgroundChangeNotification:) + onThread:[NSThread mainThread] + withObject:saveNotification + waitUntilDone:NO]; + } + +} + +#pragma mark - Save + +- (BOOL)save{ + NSError *error = nil; + if (![[self managedObjectContext] save:&error]) + { + NSLog(@"Save FAILED: %@", [error localizedDescription]); + NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey]; + if(detailedErrors != nil && [detailedErrors count] > 0) { + for(NSError* detailedError in detailedErrors) { + NSLog(@" DetailedError: %@", [detailedError userInfo]); + } + } + else { + NSLog(@" %@", [error userInfo]); + } + return NO; + } + return YES; + + +} +#pragma mark - Fetch Request Helpers + +- (NSFetchRequest *)fetchRequestForEntityNamed:(NSString *)entityName{ + // create fetch request + NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; + // set entity and managed object context + [fetchRequest setEntity:[NSEntityDescription entityForName:entityName + inManagedObjectContext:[self managedObjectContext]]]; + // simple, eh? + return fetchRequest; +} + +- (NSArray *)resultsForRequest:(NSFetchRequest *)fetchRequest +{ + NSError *error = nil; + NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; + if (error) { + // log the error. This won't be as helpful here as up the stack so + // consider calling the other selector from the consuming code + NSLog( @"[CoreDataManager resultsForRequest] Failed to execute query expecting array result. Error: %@", + [error userInfo] ); + } + return results; +} + + +#pragma mark - +#pragma mark Core Data stack + +/** + Returns the managed object context for the application. + If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application. + */ +- (NSManagedObjectContext *) managedObjectContext { + + if (managedObjectContext != nil) { + return managedObjectContext; + } + + NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; + if (coordinator != nil) { + managedObjectContext = [[NSManagedObjectContext alloc] init]; + [managedObjectContext setPersistentStoreCoordinator: coordinator]; + } + return managedObjectContext; +} + + +/** + Returns the managed object model for the application. + If the model doesn't already exist, it is created by merging all of the models found in the application bundle. + */ +- (NSManagedObjectModel *)managedObjectModel { + + if (managedObjectModel != nil) { + return managedObjectModel; + } + + NSMutableArray *models = [NSMutableArray array]; + for(NSBundle *bundle in [NSBundle allBundles]) + { + NSArray *modelPaths = [bundle pathsForResourcesOfType:@"momd" inDirectory:nil]; + for(NSString *modelPath in modelPaths) + { + NSURL *momURL = [NSURL fileURLWithPath:modelPath]; + + NSManagedObjectModel *model = [[[NSManagedObjectModel alloc] initWithContentsOfURL:momURL] autorelease]; + if(model != nil) { + [models addObject:model]; + } + } + } + + NSLog(@"Merged a total of %d compiled data models", [models count]); + + managedObjectModel = [[NSManagedObjectModel modelByMergingModels:models] retain]; + + return managedObjectModel; +} + + +/** + Returns the persistent store coordinator for the application. + If the coordinator doesn't already exist, it is created and the application's store added to it. + */ +- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { + + if (persistentStoreCoordinator != nil) { + return persistentStoreCoordinator; + } + + NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"CocoaCamp.sqlite"]]; + NSLog(@"%@",storeUrl); + NSError *error = nil; + persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; + if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) { + NSLog(@"Error encountered while adding persistent store: %@", error); + } + + return persistentStoreCoordinator; +} + + +#pragma mark - +#pragma mark Application's documents directory + +/** + Returns the path to the application's documents directory. + */ +- (NSString *)applicationDocumentsDirectory { + + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; + + NSFileManager *fm = [NSFileManager defaultManager]; + NSError *error; + if(![fm createDirectoryAtPath:basePath withIntermediateDirectories:YES attributes:nil error:&error]){ + NSLog( @"Couldn't create directory for CoreDataManager applicationDocumentsDirectory at path:%@", basePath); + } + + return basePath; +} + + + + +@end diff --git a/CocoaCamp/Classes/ImageCache/CachedImageLoader.h b/CocoaCamp/Classes/ImageCache/CachedImageLoader.h new file mode 100644 index 0000000..eef896e --- /dev/null +++ b/CocoaCamp/Classes/ImageCache/CachedImageLoader.h @@ -0,0 +1,32 @@ +// +// CachedImageLoader.h +// happyhours +// +// Created by David Golightly on 2/16/09. +// Copyright 2009 __MyCompanyName__. All rights reserved. +// + +@protocol ImageConsumer +- (NSURLRequest *)request; +- (void)renderImage:(UIImage *)image; +@end + + +@interface CachedImageLoader : NSObject { +@private + NSOperationQueue *_imageDownloadQueue; +} + + ++ (CachedImageLoader *)sharedImageLoader; + + +- (void)addClientToDownloadQueue:(id)client; +- (UIImage *)cachedImageForClient:(id)client; + +- (void)suspendImageDownloads; +- (void)resumeImageDownloads; +- (void)cancelImageDownloads; + + +@end diff --git a/CocoaCamp/Classes/ImageCache/CachedImageLoader.m b/CocoaCamp/Classes/ImageCache/CachedImageLoader.m new file mode 100644 index 0000000..b1d3667 --- /dev/null +++ b/CocoaCamp/Classes/ImageCache/CachedImageLoader.m @@ -0,0 +1,192 @@ +// +// CachedImageLoader.m +// happyhours +// +// Created by David Golightly on 2/16/09. +// Copyright 2009 __MyCompanyName__. All rights reserved. +// + +#import "CachedImageLoader.h" +#import "DiskCache.h" + +const NSInteger kMaxDownloadConnections = 1; + +static CachedImageLoader *sharedInstance; + + +@interface CachedImageLoader (Privates) +- (void)loadImageForClient:(id)client; +- (BOOL)loadImageRemotelyForClient:(id)request; +@end + + +@implementation CachedImageLoader + +- (void)dealloc { + [_imageDownloadQueue cancelAllOperations]; + [_imageDownloadQueue release]; + + [super dealloc]; +} + + +- (id)init { + if (self = [super init]) { + _imageDownloadQueue = [[NSOperationQueue alloc] init]; + [_imageDownloadQueue setMaxConcurrentOperationCount:kMaxDownloadConnections]; + } + return self; +} + + +- (void)addClientToDownloadQueue:(id)client { + [_imageDownloadQueue setSuspended:NO]; + NSOperation *imageDownloadOp = [[[NSInvocationOperation alloc] initWithTarget:self + selector:@selector(loadImageForClient:) + object:client] autorelease]; + [_imageDownloadQueue addOperation:imageDownloadOp]; +} + +- (void)loadImageForClient:(id)client { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + UIImage *cachedImage = [self cachedImageForClient]; + + if (cachedImage) { + [client renderImage:cachedImage]; + + } else if (![self loadImageRemotelyForClient:client]) { +// DLog(@"image download failed, trying again: %@", client); + [self addClientToDownloadQueue:client]; + } + + [pool release]; +} + + +- (void)suspendImageDownloads { + [_imageDownloadQueue setSuspended:YES]; +} + + +- (void)resumeImageDownloads { + [_imageDownloadQueue setSuspended:NO]; +} + + +- (void)cancelImageDownloads { + [_imageDownloadQueue cancelAllOperations]; +} + + +- (UIImage *)cachedImageForClient:(id)client { + NSData *imageData = nil; + UIImage *image = nil; + + NSURLRequest *request = [client request]; + NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request]; + + if (cachedResponse) { +// DLog(@"found cached image data for %@", [request URL]); + imageData = [cachedResponse data]; + image = [UIImage imageWithData:imageData]; + } + + if (image == nil && + (imageData = [[DiskCache sharedCache] imageDataInCacheForURLString:[[request URL] absoluteString]])) { + NSURLResponse *response = [[[NSURLResponse alloc] initWithURL:[request URL] + MIMEType:@"image/jpeg" + expectedContentLength:[imageData length] + textEncodingName:nil] + autorelease]; + [[DiskCache sharedCache] cacheImageData:imageData + request:request + response:response]; + image = [UIImage imageWithData:imageData]; + } + +// if (image == nil) { +// DLog(@"unable to find image data in cache: %@", request); +// } + + return image; +} + + +- (BOOL)loadImageRemotelyForClient:(id)client { + // DLog(@"loading image data remotely for %@", [self imageURL]); + NSURLResponse *response = nil; + NSError *error = nil; + + NSURLRequest *request = [client request]; + NSData *imageData = [NSURLConnection sendSynchronousRequest:request + returningResponse:&response + error:&error]; + + if (error != nil) { + DLog(@"ERROR RETRIEVING IMAGE at %@: %@", request, error); + DLog(@"User info: %@", [error userInfo]); + if ([[error userInfo] objectForKey:NSUnderlyingErrorKey]) { + DLog(@"underlying error info: %@", [[[error userInfo] objectForKey:NSUnderlyingErrorKey] userInfo]); + } + + NSInteger code = [error code]; + if (code == NSURLErrorUnsupportedURL || + code == NSURLErrorBadURL || + code == NSURLErrorBadServerResponse || + code == NSURLErrorRedirectToNonExistentLocation || + code == NSURLErrorFileDoesNotExist || + code == NSURLErrorFileIsDirectory || + code == NSURLErrorRedirectToNonExistentLocation) { + // the above status codes are permanent fatal errors; + // don't retry + return YES; + } + [error autorelease]; + + } else if (imageData != nil && response != nil) { + [[DiskCache sharedCache] cacheImageData:imageData + request:request + response:response]; + + UIImage *image = [UIImage imageWithData:imageData]; + if (image == nil) { +// DLog(@"removing image data for: %@", [client request]); + [[DiskCache sharedCache] clearCachedDataForRequest:[client request]]; + } else { + [client renderImage:image]; + return YES; + } + + } else { + DLog(@"Unknown error retrieving image %@ (response is null)", request); + } + return NO; +} + + +#pragma mark +#pragma mark ---- singleton implementation ---- + ++ (CachedImageLoader *)sharedImageLoader { + @synchronized(self) { + if (sharedInstance == nil) { + [[self alloc] init]; // assignment not done here + } + } + return sharedInstance; +} + + ++ (id)allocWithZone:(NSZone *)zone { + @synchronized(self) { + if (sharedInstance == nil) { + sharedInstance = [super allocWithZone:zone]; + return sharedInstance; // assignment and return on first allocation + } + } + return nil; // on subsequent allocation attempts return nil +} + + +@end diff --git a/CocoaCamp/Classes/ImageCache/DiskCache.h b/CocoaCamp/Classes/ImageCache/DiskCache.h new file mode 100644 index 0000000..7ef735e --- /dev/null +++ b/CocoaCamp/Classes/ImageCache/DiskCache.h @@ -0,0 +1,28 @@ +// +// DiskCache.h +// happyhours +// +// Created by David Golightly on 2/16/09. +// Copyright 2009 __MyCompanyName__. All rights reserved. +// + + +@interface DiskCache : NSObject { +@private + NSString *_cacheDir; + NSUInteger _cacheSize; +} + +@property (nonatomic, readonly) NSUInteger sizeOfCache; +@property (nonatomic, readonly) NSString *cacheDir; + ++ (DiskCache *)sharedCache; + +- (NSData *)imageDataInCacheForURLString:(NSString *)urlString; +- (void)cacheImageData:(NSData *)imageData + request:(NSURLRequest *)request + response:(NSURLResponse *)response; +- (void)clearCachedDataForRequest:(NSURLRequest *)request; + + +@end diff --git a/CocoaCamp/Classes/ImageCache/DiskCache.m b/CocoaCamp/Classes/ImageCache/DiskCache.m new file mode 100644 index 0000000..0a80283 --- /dev/null +++ b/CocoaCamp/Classes/ImageCache/DiskCache.m @@ -0,0 +1,211 @@ +// +// DiskCache.m +// happyhours +// +// Created by David Golightly on 2/16/09. +// Copyright 2009 __MyCompanyName__. All rights reserved. +// + +#import "DiskCache.h" + +const NSUInteger kMaxDiskCacheSize = 8e7; + +static DiskCache *sharedInstance; + +@interface DiskCache (Privates) +- (void)trimDiskCacheFilesToMaxSize:(NSUInteger)targetBytes; +@end + + +@implementation DiskCache +@dynamic sizeOfCache, cacheDir; + +- (id)init { + if (self = [super init]) { + [self trimDiskCacheFilesToMaxSize:kMaxDiskCacheSize]; + } + return self; +} + + +- (NSString *)cacheDir { + if (_cacheDir == nil) { + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + _cacheDir = [[NSString alloc] initWithString:[[paths objectAtIndex:0] stringByAppendingPathComponent:@"URLCache"]]; + + + /* check for existence of cache directory */ + if (![[NSFileManager defaultManager] fileExistsAtPath:_cacheDir]) { + + /* create a new cache directory */ + if (![[NSFileManager defaultManager] createDirectoryAtPath:_cacheDir + withIntermediateDirectories:NO + attributes:nil + error:nil]) { + NSLog(@"Error creating cache directory"); + + [_cacheDir release]; + _cacheDir = nil; + } + } + } + return _cacheDir; +} + + +- (NSString *)localPathForURL:(NSURL *)url { + NSString *filename = [[[url path] componentsSeparatedByString:@"/"] lastObject]; + + return [[self cacheDir] stringByAppendingPathComponent:filename]; +} + + + +- (NSData *)imageDataInCacheForURLString:(NSString *)urlString { + NSString *localPath = [self localPathForURL:[NSURL URLWithString:urlString]]; + + if ([[NSFileManager defaultManager] fileExistsAtPath:localPath]) { + // "touch" the file so we know when it was last used + [[NSFileManager defaultManager] setAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSDate date], NSFileModificationDate, nil] + ofItemAtPath:localPath + error:nil]; + return [[NSFileManager defaultManager] contentsAtPath:localPath]; + } + + return nil; +} + + +- (void)cacheImageData:(NSData *)imageData + request:(NSURLRequest *)request + response:(NSURLResponse *)response { + if (request != nil && + response != nil && + imageData != nil) { + NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:response + data:imageData]; + [[NSURLCache sharedURLCache] storeCachedResponse:cachedResponse + forRequest:request]; + + if ([self sizeOfCache] >= kMaxDiskCacheSize) { + [self trimDiskCacheFilesToMaxSize:kMaxDiskCacheSize * 0.75]; + } + + NSString *localPath = [self localPathForURL:[request URL]]; + + [[NSFileManager defaultManager] createFileAtPath:localPath + contents:imageData + attributes:nil]; + + if (![[NSFileManager defaultManager] fileExistsAtPath:localPath]) { + DLog(@"ERROR: Could not create file at path: %@", localPath); + } else { + _cacheSize += [imageData length]; + } + + [cachedResponse release]; + } +} + + +- (void)clearCachedDataForRequest:(NSURLRequest *)request { + [[NSURLCache sharedURLCache] removeCachedResponseForRequest:request]; + NSData *data = [self imageDataInCacheForURLString:[[request URL] path]]; + _cacheSize -= [data length]; + [[NSFileManager defaultManager] removeItemAtPath:[self localPathForURL:[request URL]] + error:nil]; +} + + +- (NSUInteger)sizeOfCache { + NSString *cacheDir = [self cacheDir]; + if (_cacheSize <= 0 && cacheDir != nil) { + NSArray *dirContents = [[NSFileManager defaultManager] directoryContentsAtPath:cacheDir]; + NSString *file; + NSDictionary *attrs; + NSNumber *fileSize; + NSUInteger totalSize = 0; + + for (file in dirContents) { + if ([[file pathExtension] isEqualToString:@"jpg"]) { + attrs = [[NSFileManager defaultManager] fileAttributesAtPath:[cacheDir stringByAppendingPathComponent:file] + traverseLink:NO]; + + fileSize = [attrs objectForKey:NSFileSize]; + totalSize += [fileSize integerValue]; + } + } + + _cacheSize = totalSize; + DLog(@"cache size is: %d", _cacheSize); + } + return _cacheSize; +} + + +NSInteger dateModifiedSort(id file1, id file2, void *reverse) { + NSDictionary *attrs1 = [[NSFileManager defaultManager] attributesOfItemAtPath:file1 error:nil]; + NSDictionary *attrs2 = [[NSFileManager defaultManager] attributesOfItemAtPath:file2 error:nil]; + + if ((NSInteger *)reverse == NO) { + return [[attrs2 objectForKey:NSFileModificationDate] compare:[attrs1 objectForKey:NSFileModificationDate]]; + } + + return [[attrs1 objectForKey:NSFileModificationDate] compare:[attrs2 objectForKey:NSFileModificationDate]]; +} + + +- (void)trimDiskCacheFilesToMaxSize:(NSUInteger)targetBytes { + targetBytes = MIN(kMaxDiskCacheSize, MAX(0, targetBytes)); + if ([self sizeOfCache] > targetBytes) { + DLog(@"time to clean the cache! size is: %@, %d", [self cacheDir], [self sizeOfCache]); + NSArray *dirContents = [[NSFileManager defaultManager] directoryContentsAtPath:[self cacheDir]]; + + NSMutableArray *filteredArray = [[NSMutableArray alloc] init]; + for (NSString *file in dirContents) { + if ([[file pathExtension] isEqualToString:@"jpg"]) { + [filteredArray addObject:[[self cacheDir] stringByAppendingPathComponent:file]]; + } + } + + int reverse = YES; + NSMutableArray *sortedDirContents = [NSMutableArray arrayWithArray:[filteredArray sortedArrayUsingFunction:dateModifiedSort context:&reverse]]; + while (_cacheSize > targetBytes && [sortedDirContents count] > 0) { + _cacheSize -= [[[[NSFileManager defaultManager] attributesOfItemAtPath:[sortedDirContents lastObject] error:nil] objectForKey:NSFileSize] integerValue]; + [[NSFileManager defaultManager] removeItemAtPath:[sortedDirContents lastObject] error:nil]; + [sortedDirContents removeLastObject]; + } + DLog(@"remaining cache size: %d, target size: %d", _cacheSize, targetBytes); + [filteredArray release]; + } +} + + + + + +#pragma mark +#pragma mark ---- singleton implementation ---- + ++ (DiskCache *)sharedCache { + @synchronized (sharedInstance) { + if (sharedInstance == nil) { + [[self alloc] init]; // assignment not done here + } + } + return sharedInstance; +} + + ++ (id)allocWithZone:(NSZone *)zone { + @synchronized (sharedInstance) { + if (sharedInstance == nil) { + sharedInstance = [super allocWithZone:zone]; + return sharedInstance; // assignment and return on first allocation + } + } + return nil; // on subsequent allocation attempts return nil +} + + +@end diff --git a/Classes/FlickrJSONResponse.h b/CocoaCamp/Classes/Json/FlickrJSONResponse.h similarity index 100% rename from Classes/FlickrJSONResponse.h rename to CocoaCamp/Classes/Json/FlickrJSONResponse.h diff --git a/Classes/FlickrJSONResponse.m b/CocoaCamp/Classes/Json/FlickrJSONResponse.m similarity index 98% rename from Classes/FlickrJSONResponse.m rename to CocoaCamp/Classes/Json/FlickrJSONResponse.m index 0228e60..680ae3b 100644 --- a/Classes/FlickrJSONResponse.m +++ b/CocoaCamp/Classes/Json/FlickrJSONResponse.m @@ -4,7 +4,7 @@ #import "FlickrJSONResponse.h" #import "SearchResult.h" -#import "JSON/JSON.h" +#import "JSON.h" @implementation FlickrJSONResponse diff --git a/Classes/JSON/JSON.h b/CocoaCamp/Classes/Json/SBJson/JSON.h similarity index 100% rename from Classes/JSON/JSON.h rename to CocoaCamp/Classes/Json/SBJson/JSON.h diff --git a/Classes/JSON/NSObject+SBJSON.h b/CocoaCamp/Classes/Json/SBJson/NSObject+SBJSON.h similarity index 100% rename from Classes/JSON/NSObject+SBJSON.h rename to CocoaCamp/Classes/Json/SBJson/NSObject+SBJSON.h diff --git a/Classes/JSON/NSObject+SBJSON.m b/CocoaCamp/Classes/Json/SBJson/NSObject+SBJSON.m similarity index 100% rename from Classes/JSON/NSObject+SBJSON.m rename to CocoaCamp/Classes/Json/SBJson/NSObject+SBJSON.m diff --git a/Classes/JSON/NSString+SBJSON.h b/CocoaCamp/Classes/Json/SBJson/NSString+SBJSON.h similarity index 100% rename from Classes/JSON/NSString+SBJSON.h rename to CocoaCamp/Classes/Json/SBJson/NSString+SBJSON.h diff --git a/Classes/JSON/NSString+SBJSON.m b/CocoaCamp/Classes/Json/SBJson/NSString+SBJSON.m similarity index 100% rename from Classes/JSON/NSString+SBJSON.m rename to CocoaCamp/Classes/Json/SBJson/NSString+SBJSON.m diff --git a/Classes/JSON/SBJSON.h b/CocoaCamp/Classes/Json/SBJson/SBJSON.h similarity index 100% rename from Classes/JSON/SBJSON.h rename to CocoaCamp/Classes/Json/SBJson/SBJSON.h diff --git a/Classes/JSON/SBJSON.m b/CocoaCamp/Classes/Json/SBJson/SBJSON.m similarity index 100% rename from Classes/JSON/SBJSON.m rename to CocoaCamp/Classes/Json/SBJson/SBJSON.m diff --git a/Classes/JSON/SBJsonBase.h b/CocoaCamp/Classes/Json/SBJson/SBJsonBase.h similarity index 100% rename from Classes/JSON/SBJsonBase.h rename to CocoaCamp/Classes/Json/SBJson/SBJsonBase.h diff --git a/Classes/JSON/SBJsonBase.m b/CocoaCamp/Classes/Json/SBJson/SBJsonBase.m similarity index 100% rename from Classes/JSON/SBJsonBase.m rename to CocoaCamp/Classes/Json/SBJson/SBJsonBase.m diff --git a/Classes/JSON/SBJsonParser.h b/CocoaCamp/Classes/Json/SBJson/SBJsonParser.h similarity index 100% rename from Classes/JSON/SBJsonParser.h rename to CocoaCamp/Classes/Json/SBJson/SBJsonParser.h diff --git a/Classes/JSON/SBJsonParser.m b/CocoaCamp/Classes/Json/SBJson/SBJsonParser.m similarity index 100% rename from Classes/JSON/SBJsonParser.m rename to CocoaCamp/Classes/Json/SBJson/SBJsonParser.m diff --git a/Classes/JSON/SBJsonWriter.h b/CocoaCamp/Classes/Json/SBJson/SBJsonWriter.h similarity index 100% rename from Classes/JSON/SBJsonWriter.h rename to CocoaCamp/Classes/Json/SBJson/SBJsonWriter.h diff --git a/Classes/JSON/SBJsonWriter.m b/CocoaCamp/Classes/Json/SBJson/SBJsonWriter.m similarity index 100% rename from Classes/JSON/SBJsonWriter.m rename to CocoaCamp/Classes/Json/SBJson/SBJsonWriter.m diff --git a/CocoaCamp/Classes/Model/CoreData/CocoaCamp.xcdatamodeld/.xccurrentversion b/CocoaCamp/Classes/Model/CoreData/CocoaCamp.xcdatamodeld/.xccurrentversion new file mode 100644 index 0000000..57030d6 --- /dev/null +++ b/CocoaCamp/Classes/Model/CoreData/CocoaCamp.xcdatamodeld/.xccurrentversion @@ -0,0 +1,8 @@ + + + + + _XCCurrentVersionName + CocoaCamp.xcdatamodel + + diff --git a/CocoaCamp/Classes/Model/CoreData/CocoaCamp.xcdatamodeld/CocoaCamp.xcdatamodel/contents b/CocoaCamp/Classes/Model/CoreData/CocoaCamp.xcdatamodeld/CocoaCamp.xcdatamodel/contents new file mode 100644 index 0000000..7297505 --- /dev/null +++ b/CocoaCamp/Classes/Model/CoreData/CocoaCamp.xcdatamodeld/CocoaCamp.xcdatamodel/contents @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CocoaCamp/Classes/Model/CoreData/Session.h b/CocoaCamp/Classes/Model/CoreData/Session.h new file mode 100644 index 0000000..d082061 --- /dev/null +++ b/CocoaCamp/Classes/Model/CoreData/Session.h @@ -0,0 +1,23 @@ +// +// Session.h +// CocoaCamp +// +// Created by Rusty Zarse on 10/19/11. +// Copyright (c) 2011 LeVous, LLC. All rights reserved. +// + +#import +#import + + +@interface Session : NSManagedObject { +@private +} +@property (nonatomic, retain) NSString * sessionTimeString; +@property (nonatomic, retain) NSDate * datetimeStart; +@property (nonatomic, retain) NSString * externalId; +@property (nonatomic, retain) NSString * title; +@property (nonatomic, retain) NSString * sessionDayTitle; +@property (nonatomic, retain) NSNumber * flagged; + +@end diff --git a/CocoaCamp/Classes/Model/CoreData/Session.m b/CocoaCamp/Classes/Model/CoreData/Session.m new file mode 100644 index 0000000..d931248 --- /dev/null +++ b/CocoaCamp/Classes/Model/CoreData/Session.m @@ -0,0 +1,20 @@ +// +// Session.m +// CocoaCamp +// +// Created by Rusty Zarse on 10/19/11. +// Copyright (c) 2011 LeVous, LLC. All rights reserved. +// + +#import "Session.h" + + +@implementation Session +@dynamic sessionTimeString; +@dynamic datetimeStart; +@dynamic externalId; +@dynamic title; +@dynamic sessionDayTitle; +@dynamic flagged; + +@end diff --git a/Classes/FlickrSearchResultsModel.h b/CocoaCamp/Classes/Model/Flickr/FlickrSearchResultsModel.h similarity index 100% rename from Classes/FlickrSearchResultsModel.h rename to CocoaCamp/Classes/Model/Flickr/FlickrSearchResultsModel.h diff --git a/Classes/FlickrSearchResultsModel.m b/CocoaCamp/Classes/Model/Flickr/FlickrSearchResultsModel.m similarity index 98% rename from Classes/FlickrSearchResultsModel.m rename to CocoaCamp/Classes/Model/Flickr/FlickrSearchResultsModel.m index e910621..dbddd4e 100644 --- a/Classes/FlickrSearchResultsModel.m +++ b/CocoaCamp/Classes/Model/Flickr/FlickrSearchResultsModel.m @@ -50,7 +50,7 @@ - (void)load:(TTURLRequestCachePolicy)cachePolicy more:(BOOL)more NSString *path = @"/services/rest/"; NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys: @"flickr.photos.search", @"method", - @"52319257@N06", @"user_id", + @"67353101@N02", @"user_id", @"url_m,url_t", @"extras", @"43f122b1a7fef3db2328bd75b38da08d", @"api_key", // I am providing my own API key as a convenience because I'm trusting you not to use it for evil. [responseProcessor format], @"format", diff --git a/Classes/Registrant.h b/CocoaCamp/Classes/Model/Registrant.h similarity index 100% rename from Classes/Registrant.h rename to CocoaCamp/Classes/Model/Registrant.h diff --git a/Classes/Registrant.m b/CocoaCamp/Classes/Model/Registrant.m similarity index 100% rename from Classes/Registrant.m rename to CocoaCamp/Classes/Model/Registrant.m diff --git a/Classes/SearchResult.h b/CocoaCamp/Classes/Model/SearchResult.h similarity index 100% rename from Classes/SearchResult.h rename to CocoaCamp/Classes/Model/SearchResult.h diff --git a/Classes/SearchResult.m b/CocoaCamp/Classes/Model/SearchResult.m similarity index 100% rename from Classes/SearchResult.m rename to CocoaCamp/Classes/Model/SearchResult.m diff --git a/Classes/SearchResultsModel.h b/CocoaCamp/Classes/Model/SearchResultsModel.h similarity index 100% rename from Classes/SearchResultsModel.h rename to CocoaCamp/Classes/Model/SearchResultsModel.h diff --git a/Classes/SearchResultsModel.m b/CocoaCamp/Classes/Model/SearchResultsModel.m similarity index 100% rename from Classes/SearchResultsModel.m rename to CocoaCamp/Classes/Model/SearchResultsModel.m diff --git a/Classes/SearchResultsPhotoSource.h b/CocoaCamp/Classes/Model/SearchResultsPhotoSource.h similarity index 100% rename from Classes/SearchResultsPhotoSource.h rename to CocoaCamp/Classes/Model/SearchResultsPhotoSource.h diff --git a/Classes/SearchResultsPhotoSource.m b/CocoaCamp/Classes/Model/SearchResultsPhotoSource.m similarity index 100% rename from Classes/SearchResultsPhotoSource.m rename to CocoaCamp/Classes/Model/SearchResultsPhotoSource.m diff --git a/Classes/ForwardingAdapters.h b/CocoaCamp/Classes/Three20Adapters/ForwardingAdapters.h similarity index 100% rename from Classes/ForwardingAdapters.h rename to CocoaCamp/Classes/Three20Adapters/ForwardingAdapters.h diff --git a/Classes/ForwardingAdapters.m b/CocoaCamp/Classes/Three20Adapters/ForwardingAdapters.m similarity index 100% rename from Classes/ForwardingAdapters.m rename to CocoaCamp/Classes/Three20Adapters/ForwardingAdapters.m diff --git a/Classes/URLModelResponse.h b/CocoaCamp/Classes/Three20Adapters/URLModelResponse.h similarity index 100% rename from Classes/URLModelResponse.h rename to CocoaCamp/Classes/Three20Adapters/URLModelResponse.h diff --git a/Classes/URLModelResponse.m b/CocoaCamp/Classes/Three20Adapters/URLModelResponse.m similarity index 100% rename from Classes/URLModelResponse.m rename to CocoaCamp/Classes/Three20Adapters/URLModelResponse.m diff --git a/CocoaCamp/Classes/UI/CCBranding.h b/CocoaCamp/Classes/UI/CCBranding.h new file mode 100644 index 0000000..ee38a69 --- /dev/null +++ b/CocoaCamp/Classes/UI/CCBranding.h @@ -0,0 +1,20 @@ +// +// CCBranding.h +// CocoaCamp +// +// Created by Rusty Zarse on 9/1/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import + +@interface CCBranding : NSObject{ + NSString *fileNamePrefix; +} +@property(retain, nonatomic) NSDictionary *brandedConfig; +- (NSString *)fileNamePrefix; +- (UIImage *)logoImage; +- (UIView *)headerView; +- (void)applyConfiguredBrandingToTableView:(UITableView *)tableView; + +@end diff --git a/CocoaCamp/Classes/UI/CCBranding.m b/CocoaCamp/Classes/UI/CCBranding.m new file mode 100644 index 0000000..fad5834 --- /dev/null +++ b/CocoaCamp/Classes/UI/CCBranding.m @@ -0,0 +1,63 @@ + // +// CCBranding.m +// CocoaCamp +// +// Created by Rusty Zarse on 9/1/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import "CCBranding.h" +#import "CocoaCampConstants.h" + +@implementation CCBranding + +@synthesize brandedConfig; +- (id)init +{ + self = [super init]; + if (self) { + NSString *path = [[NSBundle mainBundle] pathForResource:@"branded" ofType:@"plist"]; + [self setBrandedConfig:[NSDictionary dictionaryWithContentsOfFile:path]]; + fileNamePrefix = [[self brandedConfig] objectForKey:kBrandedPListKeyFileNamePrefix]; + if (!fileNamePrefix) fileNamePrefix = @""; + } + + return self; +} + +- (NSString *)fileNamePrefix{ + return fileNamePrefix; +} + +- (UIImage *)logoImage{ + NSString *imageName = [NSString stringWithFormat:@"%@logo.png", fileNamePrefix]; + return [UIImage imageNamed:imageName]; +} + +- (UIView *)headerView{ + NSString *headerViewXibName = [[self brandedConfig] objectForKey:kBrandedPListKeyHeaderNibName]; + if (headerViewXibName) { + + /* NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:headerViewXibName + owner:nil + options:nil]; + + UIView *headerView = [nibViews objectAtIndex:1]; + */ + UIViewController *tempController = [[UIViewController alloc] initWithNibName:headerViewXibName bundle:nil]; + UIView *headerView = [tempController view]; + [tempController release]; + + return headerView; + } + return nil; +} + +- (void)applyConfiguredBrandingToTableView:(UITableView *)tableView { + UIView *headerView = [self headerView]; + if (headerView) { + [tableView setTableHeaderView:headerView]; + } +} + +@end diff --git a/Classes/AttendeeListViewController.h b/CocoaCamp/Classes/ViewControllers/AttendeeListViewController.h similarity index 100% rename from Classes/AttendeeListViewController.h rename to CocoaCamp/Classes/ViewControllers/AttendeeListViewController.h diff --git a/Classes/AttendeeListViewController.m b/CocoaCamp/Classes/ViewControllers/AttendeeListViewController.m similarity index 89% rename from Classes/AttendeeListViewController.m rename to CocoaCamp/Classes/ViewControllers/AttendeeListViewController.m index 2b0b651..31ce895 100644 --- a/Classes/AttendeeListViewController.m +++ b/CocoaCamp/Classes/ViewControllers/AttendeeListViewController.m @@ -8,9 +8,10 @@ #import "AttendeeListViewController.h" #import "RegistrantDetailViewController.h" +#import "WebServiceUrlManager.h" #import #import "JSON.h" - +#import "CCBranding.h" @implementation AttendeeListViewController @synthesize attendees, responseData, dictRegistrant, progressInd, attendeeIndex, lstGroupedAttendees; @@ -52,10 +53,32 @@ - (UIActivityIndicatorView *)progressInd { #pragma mark - #pragma mark View lifecycle +- (void)applyBrandingIfPresent{ + + CCBranding *branding = [[CCBranding alloc] init]; + [branding applyConfiguredBrandingToTableView:[self tableView]]; + [branding release]; +} + +// opted for a different solution though this worked +- (void)updateTableViewWithLogoIfPresent{ + + CCBranding *branding = [[CCBranding alloc] init]; + UIImage *logoImage = [branding logoImage]; + if (logoImage) { + UIImageView *imageView = [[UIImageView alloc] initWithImage:logoImage]; + UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, imageView.frame.size.height)]; + [headerView addSubview:imageView]; + [self.tableView setTableHeaderView:headerView]; + } + +} + - (void)viewDidLoad { [super viewDidLoad]; + [self applyBrandingIfPresent]; // Uncomment this to see how the table looks with the grouped style //self.tableViewStyle = UITableViewStyleGrouped; @@ -68,7 +91,12 @@ - (void)viewDidLoad { //Initialize the array. if (responseData == nil){ responseData = [[NSMutableData data] retain]; - NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://cocoa:camp@cocoacamp.org/registers/json?user_name=cocoa&password=camp"]]; + //FIXME: use a factory method to create this class so it can be shared and managed + WebServiceUrlManager *urlManager = [[WebServiceUrlManager alloc] init]; + NSURL *attendeeListUrl = [urlManager attendeeListUrl]; + [urlManager release]; //if using a factory, remove the release + + NSURLRequest *request = [NSURLRequest requestWithURL:attendeeListUrl]; [[NSURLConnection alloc] initWithRequest:request delegate:self ]; [self.view addSubview: self.progressInd]; } diff --git a/Classes/FlickrAddPhotoController.h b/CocoaCamp/Classes/ViewControllers/Flickr/FlickrAddPhotoController.h similarity index 100% rename from Classes/FlickrAddPhotoController.h rename to CocoaCamp/Classes/ViewControllers/Flickr/FlickrAddPhotoController.h diff --git a/Classes/FlickrAddPhotoController.m b/CocoaCamp/Classes/ViewControllers/Flickr/FlickrAddPhotoController.m similarity index 100% rename from Classes/FlickrAddPhotoController.m rename to CocoaCamp/Classes/ViewControllers/Flickr/FlickrAddPhotoController.m diff --git a/CocoaCamp/Classes/ViewControllers/Flickr/FlickrAddPhotoController.xib b/CocoaCamp/Classes/ViewControllers/Flickr/FlickrAddPhotoController.xib new file mode 100644 index 0000000..6b1c2ac --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/Flickr/FlickrAddPhotoController.xib @@ -0,0 +1,328 @@ + + + + 1024 + 11A511 + 1617 + 1138 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 534 + + + YES + IBProxyObject + IBUIView + IBUIButton + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 298 + {{55, 106}, {210, 90}} + + + + NO + IBCocoaTouchFramework + 0 + 0 + + HelveticaNeue-Bold + 18 + 16 + + 1 + From Camera + + 3 + MQA + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + photoIcon.png + + + + + 298 + {{55, 246}, {210, 90}} + + + + NO + IBCocoaTouchFramework + 0 + 0 + + 1 + From Library + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + keynote-icon.png + + + + {{0, 20}, {320, 411}} + + + + + 10 + + 549453824 + {84, 1} + + YES + + YES + + + + TU0AKgAAAVjFzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P8ADQEAAAMAAAABAFQAAAEB +AAMAAAABAAEAAAECAAMAAAAEAAAB+gEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABAAEAAAEXAAQAAAABAAABUAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + 3 + MCAwAA + + + groupTableViewBackgroundColor + + + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + getCameraPicture + + + 7 + + 6 + + + + selectExistingPicture + + + 7 + + 7 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + 5 + + + + + + + YES + + YES + -1.CustomClassName + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 1.IBPluginDependency + 4.IBPluginDependency + 5.IBPluginDependency + + + YES + FlickrAddPhotoController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 7 + + + + YES + + FlickrAddPhotoController + UIViewController + + YES + + YES + getCameraPicture + selectExistingPicture + + + YES + id + id + + + + YES + + YES + getCameraPicture + selectExistingPicture + + + YES + + getCameraPicture + id + + + selectExistingPicture + id + + + + + IBProjectSource + ./Classes/FlickrAddPhotoController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + + YES + + YES + keynote-icon.png + photoIcon.png + + + YES + {32, 32} + {30, 30} + + + 534 + + diff --git a/Classes/FlickrController.h b/CocoaCamp/Classes/ViewControllers/Flickr/FlickrController.h similarity index 100% rename from Classes/FlickrController.h rename to CocoaCamp/Classes/ViewControllers/Flickr/FlickrController.h diff --git a/Classes/FlickrController.m b/CocoaCamp/Classes/ViewControllers/Flickr/FlickrController.m similarity index 100% rename from Classes/FlickrController.m rename to CocoaCamp/Classes/ViewControllers/Flickr/FlickrController.m diff --git a/Classes/FlickrController.xib b/CocoaCamp/Classes/ViewControllers/Flickr/FlickrController.xib similarity index 100% rename from Classes/FlickrController.xib rename to CocoaCamp/Classes/ViewControllers/Flickr/FlickrController.xib diff --git a/Classes/FlickrPageViewController.h b/CocoaCamp/Classes/ViewControllers/Flickr/FlickrPageViewController.h similarity index 100% rename from Classes/FlickrPageViewController.h rename to CocoaCamp/Classes/ViewControllers/Flickr/FlickrPageViewController.h diff --git a/Classes/FlickrPageViewController.m b/CocoaCamp/Classes/ViewControllers/Flickr/FlickrPageViewController.m similarity index 98% rename from Classes/FlickrPageViewController.m rename to CocoaCamp/Classes/ViewControllers/Flickr/FlickrPageViewController.m index 8b67e70..b65acac 100644 --- a/Classes/FlickrPageViewController.m +++ b/CocoaCamp/Classes/ViewControllers/Flickr/FlickrPageViewController.m @@ -30,7 +30,7 @@ - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - NSURL *cocoaFlickr = [[NSURL alloc] initWithString:@"http://m.flickr.com/#/photos/52319257@N06/"]; + NSURL *cocoaFlickr = [[NSURL alloc] initWithString:@"http://m.flickr.com/#/photos/67353101@N02/"]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:cocoaFlickr]; diff --git a/CocoaCamp/Classes/ViewControllers/HeaderSponsorsViewController.h b/CocoaCamp/Classes/ViewControllers/HeaderSponsorsViewController.h new file mode 100644 index 0000000..53687e1 --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/HeaderSponsorsViewController.h @@ -0,0 +1,13 @@ +// +// HeaderSponsorsViewController.h +// CocoaCamp +// +// Created by Rusty Zarse on 9/1/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import + +@interface HeaderSponsorsViewController : UIViewController + +@end diff --git a/CocoaCamp/Classes/ViewControllers/HeaderSponsorsViewController.m b/CocoaCamp/Classes/ViewControllers/HeaderSponsorsViewController.m new file mode 100644 index 0000000..f721b38 --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/HeaderSponsorsViewController.m @@ -0,0 +1,51 @@ +// +// HeaderSponsorsViewController.m +// CocoaCamp +// +// Created by Rusty Zarse on 9/1/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import "HeaderSponsorsViewController.h" + +@implementation HeaderSponsorsViewController + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization + } + return self; +} + +- (void)didReceiveMemoryWarning +{ + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +#pragma mark - View lifecycle + +- (void)viewDidLoad +{ + [super viewDidLoad]; + // Do any additional setup after loading the view from its nib. +} + +- (void)viewDidUnload +{ + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + // Return YES for supported orientations + return (interfaceOrientation == UIInterfaceOrientationPortrait); +} + +@end diff --git a/Classes/SessionViewController.h b/CocoaCamp/Classes/ViewControllers/OLDSessionViewController.h similarity index 82% rename from Classes/SessionViewController.h rename to CocoaCamp/Classes/ViewControllers/OLDSessionViewController.h index 69ce5f8..c7ac67d 100644 --- a/Classes/SessionViewController.h +++ b/CocoaCamp/Classes/ViewControllers/OLDSessionViewController.h @@ -1,5 +1,5 @@ // -// SessionViewController.h +// OLDSessionViewController.h // CocoaCamp // // Created by airportyh on 8/6/10. @@ -8,7 +8,7 @@ #import -@interface SessionViewController : UITableViewController { +@interface OLDSessionViewController : UITableViewController { NSArray *schedules; UIActivityIndicatorView *progressInd; } diff --git a/Classes/SessionViewController.m b/CocoaCamp/Classes/ViewControllers/OLDSessionViewController.m similarity index 94% rename from Classes/SessionViewController.m rename to CocoaCamp/Classes/ViewControllers/OLDSessionViewController.m index 91bcd03..87c507b 100644 --- a/Classes/SessionViewController.m +++ b/CocoaCamp/Classes/ViewControllers/OLDSessionViewController.m @@ -1,16 +1,17 @@ // -// SessionViewController.m +// OLDSessionViewController.m // CocoaCamp // // Created by airportyh on 8/6/10. // Copyright 2010 __MyCompanyName__. All rights reserved. // -#import "SessionViewController.h" +#import "OLDSessionViewController.h" #import "JSON.h" #import "SessionDetailViewController.h" +#import "CCBranding.h" -@implementation SessionViewController +@implementation OLDSessionViewController @synthesize schedules; @synthesize progressInd; @@ -33,7 +34,7 @@ + (NSString *) thumbnailURL: (NSString *)regID{ } -(id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle { - if (self = [super initWithNibName:@"SessionViewController" bundle:bundle]){ + if (self = [super initWithNibName:@"OLDSessionViewController" bundle:bundle]){ self.title = @"Schedule"; UIImage* image = [UIImage imageNamed:@"calendar.png"]; self.tabBarItem = [[[UITabBarItem alloc] initWithTitle:self.title image:image tag:0] autorelease]; @@ -164,7 +165,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N locationLabel.text = [talk objectForKey: @"location"]; [ttImage setImage: nil]; - ttImage.urlPath = [SessionViewController thumbnailURL:regID]; + ttImage.urlPath = [OLDSessionViewController thumbnailURL:regID]; return cell; } @@ -278,9 +279,16 @@ - (UIActivityIndicatorView *)progressInd { return progressInd; } +- (void)applyBrandingIfPresent{ + + CCBranding *branding = [[CCBranding alloc] init]; + [branding applyConfiguredBrandingToTableView:[self tableView]]; + [branding release]; +} + - (void)viewDidLoad { [super viewDidLoad]; - + [self applyBrandingIfPresent]; dateFormatter = [[NSDateFormatter alloc] init]; @@ -290,7 +298,7 @@ - (void)viewDidLoad { if (self.schedules == nil){ [self.view addSubview: self.progressInd]; - NSURLRequest* request = [NSURLRequest requestWithURL: [NSURL URLWithString:[SessionViewController schedulesURL]] + NSURLRequest* request = [NSURLRequest requestWithURL: [NSURL URLWithString:[OLDSessionViewController schedulesURL]] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; [[NSURLConnection alloc] initWithRequest:request delegate:self]; }} diff --git a/Classes/SessionViewController.xib b/CocoaCamp/Classes/ViewControllers/OLDSessionViewController.xib similarity index 100% rename from Classes/SessionViewController.xib rename to CocoaCamp/Classes/ViewControllers/OLDSessionViewController.xib diff --git a/CocoaCamp/Classes/ViewControllers/PeepsConnectViewController.h b/CocoaCamp/Classes/ViewControllers/PeepsConnectViewController.h new file mode 100644 index 0000000..90e4d23 --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/PeepsConnectViewController.h @@ -0,0 +1,18 @@ +// +// PeepsConnectViewController.h +// CocoaCamp +// +// Created by Rusty Zarse on 12/22/11. +// Copyright (c) 2011 LeVous, LLC. All rights reserved. +// + +#import +#import "ZBarSDK.h" + +@interface PeepsConnectViewController : UIViewController +- (IBAction)scanPressed:(id)sender; +- (IBAction)myInfoButtonPressed:(id)sender; + +@property (retain, nonatomic) IBOutlet UIBarButtonItem *myInfoBarButtonItem; +@property (retain, nonatomic) IBOutlet UIImageView *myInfoQRCodeImage; +@end diff --git a/CocoaCamp/Classes/ViewControllers/PeepsConnectViewController.m b/CocoaCamp/Classes/ViewControllers/PeepsConnectViewController.m new file mode 100644 index 0000000..297845a --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/PeepsConnectViewController.m @@ -0,0 +1,106 @@ +// +// PeepsConnectViewController.m +// CocoaCamp +// +// Created by Rusty Zarse on 12/22/11. +// Copyright (c) 2011 LeVous, LLC. All rights reserved. +// + +#import "PeepsConnectViewController.h" + + +@implementation PeepsConnectViewController +@synthesize myInfoBarButtonItem; +@synthesize myInfoQRCodeImage; + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + + self.title = @"Connect"; + UIImage* image = [UIImage imageNamed:@"connect-icon.png"]; + self.tabBarItem = [[[UITabBarItem alloc] initWithTitle:@"Connect" image:image tag:0] autorelease]; + } + return self; +} + +- (void)didReceiveMemoryWarning +{ + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +#pragma mark - View lifecycle + +- (void)viewDidLoad +{ + [super viewDidLoad]; + // Do any additional setup after loading the view from its nib. + [[self navigationItem] setRightBarButtonItem:[self myInfoBarButtonItem]]; +} + +- (void)viewDidUnload +{ + [self setMyInfoQRCodeImage:nil]; + [self setMyInfoBarButtonItem:nil]; + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + // Return YES for supported orientations + return (interfaceOrientation == UIInterfaceOrientationPortrait); +} + +- (IBAction)scanPressed:(id)sender { + ZBarReaderViewController *reader = [ZBarReaderViewController new]; + reader.readerDelegate = self; + [self presentModalViewController: reader + animated: YES]; + [reader release]; + +} + +- (IBAction)myInfoButtonPressed:(id)sender { + UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Not Implemented" + message:@"Need ViewController to gather user info" + delegate:nil + cancelButtonTitle:@"Yaderhey" + otherButtonTitles:nil]; + [alert show]; + [alert release]; + + } + +- (void) imagePickerController: (UIImagePickerController*) reader didFinishPickingMediaWithInfo: (NSDictionary*) info +{ + id results = [info objectForKey: ZBarReaderControllerResults]; + UIImage *image = [info objectForKey: UIImagePickerControllerOriginalImage]; + [reader dismissModalViewControllerAnimated: YES]; + + ZBarSymbol *symbol = nil; + for(symbol in results) + // EXAMPLE: just grab the first barcode + break; + + // TODO: do something useful with the barcode data + UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Not Implemented" + message:symbol.data delegate:nil + cancelButtonTitle:@"Yaderhey" + otherButtonTitles:nil]; + [alert show]; + [alert release]; + +} + +- (void)dealloc { + [myInfoQRCodeImage release]; + [myInfoBarButtonItem release]; + [super dealloc]; +} +@end diff --git a/CocoaCamp/Classes/ViewControllers/PeepsConnectViewController.xib b/CocoaCamp/Classes/ViewControllers/PeepsConnectViewController.xib new file mode 100644 index 0000000..8a6388e --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/PeepsConnectViewController.xib @@ -0,0 +1,271 @@ + + + + 1280 + 11C74 + 1938 + 1138.23 + 567.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 933 + + + IBUIBarButtonItem + IBUIButton + IBUIImageView + IBUIView + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + My Info + IBCocoaTouchFramework + 1 + + + + 274 + + + + 288 + {{20, 308}, {280, 47}} + + + + _NS:225 + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Scan + + 3 + MQA + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + + 288 + {{20, 20}, {280, 280}} + + + + _NS:567 + NO + IBCocoaTouchFramework + + NSImage + qrcode-cocoacamp-url.png + + + + {{0, 64}, {320, 367}} + + + + + 3 + MQA + + 2 + + + + + NO + + + IBCocoaTouchFramework + + + + + + + view + + + + 3 + + + + myInfoQRCodeImage + + + + 7 + + + + myInfoBarButtonItem + + + + 11 + + + + scanPressed: + + + 7 + + 6 + + + + myInfoButtonPressed: + + + + 12 + + + + + + 0 + + + + + + 1 + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + 5 + + + + + 9 + + + + + + + PeepsConnectViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 12 + + + + + PeepsConnectViewController + UIViewController + + id + id + + + + myInfoButtonPressed: + id + + + scanPressed: + id + + + + UIBarButtonItem + UIImageView + + + + myInfoBarButtonItem + UIBarButtonItem + + + myInfoQRCodeImage + UIImageView + + + + IBProjectSource + ./Classes/PeepsConnectViewController.h + + + + + 0 + IBCocoaTouchFramework + YES + 3 + + qrcode-cocoacamp-url.png + {350, 350} + + 933 + + diff --git a/Classes/RegistrantDetailViewController.h b/CocoaCamp/Classes/ViewControllers/RegistrantDetailViewController.h similarity index 91% rename from Classes/RegistrantDetailViewController.h rename to CocoaCamp/Classes/ViewControllers/RegistrantDetailViewController.h index 0f2d9e3..1856b28 100644 --- a/Classes/RegistrantDetailViewController.h +++ b/CocoaCamp/Classes/ViewControllers/RegistrantDetailViewController.h @@ -17,6 +17,7 @@ extern NSString *AppUserRegistrantIDKey; Registrant *currRegistrant; IBOutlet UILabel *nameLabel; IBOutlet UIActivityIndicatorView *loading; + UIView *headerView; BOOL isExchanging; } @@ -24,6 +25,7 @@ extern NSString *AppUserRegistrantIDKey; @property (nonatomic, retain) UILabel *nameLabel; @property (readonly) Bump *bump; @property (nonatomic, retain) IBOutlet UIActivityIndicatorView *loading; +@property (nonatomic, retain) IBOutlet UIView *headerView; - (IBAction)storeCurrentProfileAsIdentity; - (IBAction)initiateContactExchange:(id)sender; diff --git a/Classes/RegistrantDetailViewController.m b/CocoaCamp/Classes/ViewControllers/RegistrantDetailViewController.m similarity index 90% rename from Classes/RegistrantDetailViewController.m rename to CocoaCamp/Classes/ViewControllers/RegistrantDetailViewController.m index 5576ccf..c7778f8 100644 --- a/Classes/RegistrantDetailViewController.m +++ b/CocoaCamp/Classes/ViewControllers/RegistrantDetailViewController.m @@ -11,10 +11,11 @@ #import "ContactManager.h" #import "Bump.h" #import "CocoaCampAppDelegate.h" - +#import "CCBranding.h" @implementation RegistrantDetailViewController +@synthesize headerView; @synthesize currRegistrant, nameLabel, loading; @@ -27,6 +28,14 @@ - (void) viewWillAppear:(BOOL)animated{ self.loading.hidden = YES; } +- (void)updateTableViewWithHeaderIfPresent{ + CCBranding *branding = [[CCBranding alloc] init]; + UIView *configuredHeaderView = [branding headerView]; + if (configuredHeaderView) { + [[self headerView] addSubview:configuredHeaderView]; + } +} + - (void) viewDidLoad { @@ -37,6 +46,8 @@ - (void) viewDidLoad self.navigationItem.title = regName; [self storeCurrentProfileAsIdentity]; + + [self updateTableViewWithHeaderIfPresent]; } @@ -56,6 +67,7 @@ - (void)didReceiveMemoryWarning { } - (void)viewDidUnload { + [self setHeaderView:nil]; // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand. // For example: self.myOutlet = nil; } @@ -64,6 +76,7 @@ - (void)viewDidUnload { - (void)dealloc { [currRegistrant release]; [nameLabel release]; + [headerView release]; [super dealloc]; } diff --git a/CocoaCamp/Classes/ViewControllers/Rss/RSSLoader.h b/CocoaCamp/Classes/ViewControllers/Rss/RSSLoader.h new file mode 100644 index 0000000..7510369 --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/Rss/RSSLoader.h @@ -0,0 +1,29 @@ +// +// RSSLoader.h +// ARSSReader +// +// Created by Marin Todorov on 5/25/10. +// Copyright 2010 Marin Todorov. All rights reserved. +// + +#import +#import "GDataXMLNode.h" + +@protocol RSSLoaderDelegate +@required +-(void)updatedFeedWithRSS:(NSArray*)items; +-(void)failedFeedUpdateWithError:(NSError*)error; +-(void)updatedFeedTitle:(NSString*)title; +@end + +@interface RSSLoader : NSObject { + UIViewController * delegate; + BOOL loaded; +} + +@property (retain, nonatomic) UIViewController * delegate; +@property (nonatomic, assign) BOOL loaded; + +-(void)load; + +@end \ No newline at end of file diff --git a/CocoaCamp/Classes/ViewControllers/Rss/RSSLoader.m b/CocoaCamp/Classes/ViewControllers/Rss/RSSLoader.m new file mode 100644 index 0000000..6778407 --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/Rss/RSSLoader.m @@ -0,0 +1,98 @@ +// +// RSSLoader.m +// ARSSReader +// +// Created by Marin Todorov on 5/25/10. +// Copyright 2010 Marin Todorov. All rights reserved. +// + +#import "RSSLoader.h" +#import "WebServiceUrlManager.h" + +@interface RSSLoader (Private) + +-(void)dispatchLoadingOperation; +-(NSDictionary*)getItemFromXmlElement:(GDataXMLElement*)xmlItem; + +@end + + +@implementation RSSLoader + +@synthesize delegate, loaded; + +-(id)init +{ + if ([super init]!=nil) { + self.loaded = NO; + } + return self; +} + +-(void)load +{ + [self dispatchLoadingOperation]; +} + +-(void)dealloc +{ + self.delegate = nil; + [super dealloc]; +} + +-(void)dispatchLoadingOperation +{ + NSOperationQueue *queue = [NSOperationQueue new]; + + NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self + selector:@selector(fetchRss) + object:nil]; + + [queue addOperation:operation]; + [operation release]; + [queue autorelease]; +} + +-(void)fetchRss +{ + NSLog(@"fetch rss"); + WebServiceUrlManager *urlMgr = [[WebServiceUrlManager alloc] init]; + NSURL *rssUrl = [[urlMgr rssNewsUrl] retain]; + [urlMgr release]; + NSData* xmlData = [[NSMutableData alloc] initWithContentsOfURL:rssUrl]; + NSError *error; + + GDataXMLDocument* doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error]; + + if (doc != nil) { + self.loaded = YES; + + GDataXMLNode* title = [[[doc rootElement] nodesForXPath:@"channel/title" error:&error] objectAtIndex:0]; + [self.delegate updatedFeedTitle: [title stringValue] ]; + + NSArray* items = [[doc rootElement] nodesForXPath:@"channel/item" error:&error]; + NSMutableArray* rssItems = [NSMutableArray arrayWithCapacity:[items count] ]; + + for (GDataXMLElement* xmlItem in items) { + [rssItems addObject: [self getItemFromXmlElement:xmlItem] ]; + } + + [self.delegate performSelectorOnMainThread:@selector(updatedFeedWithRSS:) withObject:rssItems waitUntilDone:YES]; + } else { + [self.delegate performSelectorOnMainThread:@selector(failedFeedUpdateWithError:) withObject:error waitUntilDone:YES]; + } + [rssUrl release]; + [doc autorelease]; + [xmlData release]; +} + +-(NSDictionary*)getItemFromXmlElement:(GDataXMLElement*)xmlItem +{ + return [NSDictionary dictionaryWithObjectsAndKeys: + [[[xmlItem elementsForName:@"title"] objectAtIndex:0] stringValue], @"title", + [[[xmlItem elementsForName:@"link"] objectAtIndex:0] stringValue], @"link", + [[[xmlItem elementsForName:@"description"] objectAtIndex:0] stringValue], @"description", + nil]; +} + +@end diff --git a/CocoaCamp/Classes/ViewControllers/Rss/RssDetailsViewController.h b/CocoaCamp/Classes/ViewControllers/Rss/RssDetailsViewController.h new file mode 100644 index 0000000..11046b0 --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/Rss/RssDetailsViewController.h @@ -0,0 +1,21 @@ +// +// DetailsViewController.h +// ARSSReader +// +// Created by Marin Todorov on 5/25/10. +// Copyright 2010 Marin Todorov. All rights reserved. +// + +#import + + +@interface RssDetailsViewController : UIViewController { + NSDictionary* item; + + IBOutlet UIWebView* webView; + IBOutlet UIActivityIndicatorView* loader; +} + +@property (retain, nonatomic) NSDictionary* item; + +@end diff --git a/CocoaCamp/Classes/ViewControllers/Rss/RssDetailsViewController.m b/CocoaCamp/Classes/ViewControllers/Rss/RssDetailsViewController.m new file mode 100644 index 0000000..64b9a3d --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/Rss/RssDetailsViewController.m @@ -0,0 +1,56 @@ +// +// DetailsViewController.m +// ARSSReader +// +// Created by Marin Todorov on 5/25/10. +// Copyright 2010 Marin Todorov. All rights reserved. +// + +#import "RssDetailsViewController.h" + + +@implementation RssDetailsViewController + +@synthesize item; + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad { + [super viewDidLoad]; + + webView.delegate = self; + webView.scalesPageToFit = YES; + NSURL* url = [NSURL URLWithString:[item objectForKey:@"link"]]; + [webView loadRequest:[NSURLRequest requestWithURL:url]]; + NSLog(@"loading url...%@", url); +} + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; +} + +- (void)viewDidUnload { + [super viewDidUnload]; +} + + +- (void)dealloc { + //very important, otherwise unfinished requests will cause exc_badaccess + webView.delegate = nil; + [super dealloc]; +} + +#pragma mark - +#pragma mark UIWebViewDelegate messages +- (void)webViewDidStartLoad:(UIWebView *)webView +{ + loader.hidden = NO; +} + +- (void)webViewDidFinishLoad:(UIWebView *)webView +{ + loader.hidden = YES; +} + + +@end \ No newline at end of file diff --git a/Classes/FlickrAddPhotoController.xib b/CocoaCamp/Classes/ViewControllers/Rss/RssDetailsViewController.xib similarity index 64% rename from Classes/FlickrAddPhotoController.xib rename to CocoaCamp/Classes/ViewControllers/Rss/RssDetailsViewController.xib index 7e59fe0..9b3143d 100644 --- a/Classes/FlickrAddPhotoController.xib +++ b/CocoaCamp/Classes/ViewControllers/Rss/RssDetailsViewController.xib @@ -1,18 +1,18 @@ - 1024 - 10F569 - 788 + 800 + 10D573 + 762 1038.29 - 461.00 + 460.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 117 + 87 YES - + YES @@ -42,99 +42,41 @@ 274 YES - + - 298 - {{57, 89}, {210, 83}} + 274 + {320, 460} - NO - IBCocoaTouchFramework - 0 - 0 - - HelveticaNeue-Bold - 18 - 16 - - 1 - From Camera - - 3 - MQA - - + 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - NSImage - photoIcon.png + MSAxIDEAA + IBCocoaTouchFramework + 1 + YES - + - 298 - {{57, 270}, {205, 84}} + -2147483356 + {{137, 211}, {37, 37}} NO IBCocoaTouchFramework - 0 - 0 - - 1 - From Library - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - NSImage - keynote-icon.png - + NO + YES + 0 - {320, 411} + {320, 460} - 10 - - 549453824 - {84, 1} - - YES - - YES - - - - TU0AKgAAAVjFzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ -y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ -xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ -xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ -xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ -xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P8ADQEAAAMAAAABAFQAAAEB -AAMAAAABAAEAAAECAAMAAAAEAAAB+gEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES -AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABAAEAAAEXAAQAAAABAAABUAEcAAMAAAABAAEAAAFS -AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA - - - - - - 3 - MCAwAA - + 3 + MQA + + 2 - groupTableViewBackgroundColor - IBCocoaTouchFramework @@ -150,22 +92,20 @@ AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA 3 - - getCameraPicture - - - 7 + + webView + + - 6 + 11 - - selectExistingPicture - - - 7 + + loader + + - 7 + 13 @@ -182,8 +122,8 @@ AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA YES - - + + @@ -199,13 +139,13 @@ AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA - 4 - + 10 + - 5 - + 12 + @@ -218,14 +158,14 @@ AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA -2.CustomClassName 1.IBEditorWindowLastContentRect 1.IBPluginDependency - 4.IBPluginDependency - 5.IBPluginDependency + 10.IBPluginDependency + 12.IBPluginDependency YES - FlickrAddPhotoController + DetailsViewController UIResponder - {{531, 120}, {320, 480}} + {{526, 282}, {320, 480}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -247,108 +187,89 @@ AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA - 7 + 13 YES - FlickrAddPhotoController + DetailsViewController UIViewController - - YES - - YES - getCameraPicture - selectExistingPicture - - - YES - id - id - - - + YES YES - getCameraPicture - selectExistingPicture + loader + webView YES - - getCameraPicture - id - - - selectExistingPicture - id - + UIActivityIndicatorView + UIWebView IBProjectSource - Classes/FlickrAddPhotoController.h + Classes/DetailsViewController.h + + + YES NSObject - IBProjectSource - Classes/JSON/NSObject+SBJSON.h + IBFrameworkSource + Foundation.framework/Headers/NSError.h NSObject - IBProjectSource - Classes/JSON/SBJsonWriter.h + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h - - - YES NSObject IBFrameworkSource - Foundation.framework/Headers/NSError.h + Foundation.framework/Headers/NSKeyValueCoding.h NSObject IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h + Foundation.framework/Headers/NSKeyValueObserving.h NSObject IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h + Foundation.framework/Headers/NSKeyedArchiver.h NSObject IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h + Foundation.framework/Headers/NSNetServices.h NSObject IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h + Foundation.framework/Headers/NSObject.h NSObject IBFrameworkSource - Foundation.framework/Headers/NSObject.h + Foundation.framework/Headers/NSPort.h @@ -362,35 +283,35 @@ AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA NSObject IBFrameworkSource - Foundation.framework/Headers/NSThread.h + Foundation.framework/Headers/NSStream.h NSObject IBFrameworkSource - Foundation.framework/Headers/NSURL.h + Foundation.framework/Headers/NSThread.h NSObject IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h + Foundation.framework/Headers/NSURL.h NSObject IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h + Foundation.framework/Headers/NSURLConnection.h NSObject IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h + Foundation.framework/Headers/NSXMLParser.h @@ -409,31 +330,23 @@ AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA NSObject - + IBFrameworkSource UIKit.framework/Headers/UIResponder.h - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl + UIActivityIndicatorView UIView IBFrameworkSource - UIKit.framework/Headers/UIControl.h + UIKit.framework/Headers/UIActivityIndicatorView.h UIResponder NSObject - + UISearchBar @@ -477,59 +390,36 @@ AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA UIViewController IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h + UIKit.framework/Headers/UITabBarController.h UIViewController + UIResponder IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h + UIKit.framework/Headers/UIViewController.h - UIViewController - UIResponder + UIWebView + UIView IBFrameworkSource - UIKit.framework/Headers/UIViewController.h + UIKit.framework/Headers/UIWebView.h 0 IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 YES - ../CocoaCamp.xcodeproj + ../ARSSReader.xcodeproj 3 - - YES - - YES - keynote-icon.png - photoIcon.png - - - YES - {32, 32} - {30, 30} - - - 117 + 87 diff --git a/CocoaCamp/Classes/ViewControllers/Rss/RssNewsViewController.h b/CocoaCamp/Classes/ViewControllers/Rss/RssNewsViewController.h new file mode 100644 index 0000000..fa2c2cc --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/Rss/RssNewsViewController.h @@ -0,0 +1,19 @@ +// +// RootViewController.h +// ARSSReader +// +// Created by Marin Todorov on 5/25/10. +// Copyright Marin Todorov 2010. All rights reserved. +// + +#import +#import "RSSLoader.h" +#import "RssDetailsViewController.h" +#import "RssTableHeaderView.h" + +@interface RssNewsViewController : UITableViewController { + RSSLoader* rss; + NSMutableArray* rssItems; +} + +@end diff --git a/CocoaCamp/Classes/ViewControllers/Rss/RssNewsViewController.m b/CocoaCamp/Classes/ViewControllers/Rss/RssNewsViewController.m new file mode 100644 index 0000000..ffacfe9 --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/Rss/RssNewsViewController.m @@ -0,0 +1,293 @@ +// +// RootViewController.m +// ARSSReader +// +// Created by Marin Todorov on 5/25/10. +// Copyright Marin Todorov 2010. All rights reserved. +// + +#import "RssNewsViewController.h" +#import "WebServiceUrlManager.h" + +@implementation RssNewsViewController + +#pragma mark - +#pragma mark View lifecycle + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{ + if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]){ + self.title = @"News"; + UIImage* image = [UIImage imageNamed:@"news-icon.png"]; + self.tabBarItem = [[[UITabBarItem alloc] initWithTitle:self.title image:image tag:0] autorelease]; + } + return self; + +} + +- (void)launchWeb:(id)sender{ + WebServiceUrlManager *urlMgr = [[WebServiceUrlManager alloc] init]; + NSURL *webUrl = [urlMgr newsWebUrl]; + + [[UIApplication sharedApplication] openURL:webUrl]; + [urlMgr release]; +} + +- (void)configureToolbar{ + + UIBarButtonItem *launchWebItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction + target:self + action:@selector(launchWeb:)] autorelease]; + + + self.navigationItem.rightBarButtonItem = launchWebItem; + + +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + [self configureToolbar]; + + rssItems = nil; + rss = nil; + + self.tableView.backgroundColor = [UIColor clearColor]; + [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; + [self.tableView setIndicatorStyle:UIScrollViewIndicatorStyleWhite]; + + self.tableView.tableHeaderView = [[RssTableHeaderView alloc] initWithText:@"fetching rss feed"]; + +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + + if (rss==nil) { + rss = [[RSSLoader alloc] init]; + rss.delegate = self; + [rss load]; + } +} + +/* +- (void)viewWillDisappear:(BOOL)animated { + [super viewWillDisappear:animated]; +} +*/ +/* +- (void)viewDidDisappear:(BOOL)animated { + [super viewDidDisappear:animated]; +} +*/ + +/* + // Override to allow orientations other than the default portrait orientation. +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + // Return YES for supported orientations. + return (interfaceOrientation == UIInterfaceOrientationPortrait); +} + */ + + +#pragma mark - +#pragma mark Table view data source + +// Customize the number of sections in the table view. +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 1; +} + + +// Customize the number of rows in the table view. +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + if (rss.loaded == YES) { + return [rssItems count]*2; + } else { + return 1; + } +} + +- (UITableViewCell *)getLoadingTableCellWithTableView:(UITableView *)tableView +{ + static NSString *LoadingCellIdentifier = @"LoadingCell"; + + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:LoadingCellIdentifier]; + + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:LoadingCellIdentifier] autorelease]; + } + + cell.textLabel.text = @"Loading..."; + + UIActivityIndicatorView* activity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; + [activity startAnimating]; + [cell setAccessoryView: activity]; + [activity release]; + + return cell; +} + +- (UITableViewCell *)getTextCellWithTableView:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath { + static NSString *TextCellIdentifier = @"TextCell"; + + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:TextCellIdentifier]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:TextCellIdentifier] autorelease]; + } + + NSDictionary* item = [rssItems objectAtIndex: (indexPath.row-1)/2]; + + //article preview + cell.textLabel.font = [UIFont systemFontOfSize:11]; + cell.textLabel.numberOfLines = 3; + cell.textLabel.textColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.7]; + cell.backgroundColor = [UIColor clearColor]; + cell.textLabel.backgroundColor = [UIColor clearColor]; + + UIView *backView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; + backView.backgroundColor = [UIColor clearColor]; + cell.backgroundView = backView; + + CGRect f = cell.textLabel.frame; + [cell.textLabel setFrame: CGRectMake(f.origin.x+15, f.origin.y, f.size.width-15, f.size.height)]; + cell.textLabel.text = [item objectForKey:@"description"]; + + return cell; +} + +// Customize the appearance of table view cells. +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + + if (rss.loaded == NO) { + return [self getLoadingTableCellWithTableView:tableView]; + } + + if (indexPath.row % 2 == 1) { + return [self getTextCellWithTableView:tableView atIndexPath:indexPath]; + } + + static NSString *CellIdentifier = @"TitleCell"; + + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; + } + + UIView *backView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; + backView.backgroundColor = [UIColor clearColor]; + cell.backgroundView = backView; + + NSDictionary* item = [rssItems objectAtIndex: indexPath.row/2]; + + cell.textLabel.text = [item objectForKey:@"title"]; + + return cell; +} + + + +/* +// Override to support conditional editing of the table view. +- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { + // Return NO if you do not want the specified item to be editable. + return YES; +} +*/ + + +/* +// Override to support editing the table view. +- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { + + if (editingStyle == UITableViewCellEditingStyleDelete) { + // Delete the row from the data source. + [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; + } + else if (editingStyle == UITableViewCellEditingStyleInsert) { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. + } +} +*/ + + +/* +// Override to support rearranging the table view. +- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { +} +*/ + + +/* +// Override to support conditional rearranging of the table view. +- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { + // Return NO if you do not want the item to be re-orderable. + return YES; +} +*/ + + +#pragma mark - +#pragma mark Table view delegate + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + [tableView deselectRowAtIndexPath:indexPath animated:NO]; + + RssDetailsViewController *detailViewController = [[RssDetailsViewController alloc] initWithNibName:@"RssDetailsViewController" bundle:nil]; + detailViewController.item = [rssItems objectAtIndex:floor(indexPath.row/2)]; + [self.navigationController pushViewController:detailViewController animated:YES]; + [detailViewController release]; +} + + +#pragma mark - +#pragma mark Memory management + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Relinquish ownership any cached data, images, etc that aren't in use. +} + +- (void)viewDidUnload { + // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand. + // For example: self.myOutlet = nil; +} + + +- (void)dealloc { + [rssItems release]; + rssItems = nil; + + [rss release]; + rss = nil; + + [super dealloc]; +} + +#pragma mark - +#pragma mark RSSLoaderDelegate +-(void)updatedFeedWithRSS:(NSMutableArray*)items +{ + rssItems = [items retain]; + [self.tableView reloadData]; +} + +-(void)failedFeedUpdateWithError:(NSError *)error +{ + // +} + +-(void)updatedFeedTitle:(NSString*)rssTitle +{ + [(RssTableHeaderView*)self.tableView.tableHeaderView setText:rssTitle]; +} + +@end diff --git a/CocoaCamp/Classes/ViewControllers/Rss/RssTableHeaderView.h b/CocoaCamp/Classes/ViewControllers/Rss/RssTableHeaderView.h new file mode 100644 index 0000000..fc4f85c --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/Rss/RssTableHeaderView.h @@ -0,0 +1,19 @@ +// +// TableHeaderView.h +// ARSSReader +// +// Created by Marin Todorov on 6/2/10. +// Copyright 2010 Marin Todorov. All rights reserved. +// + +#import + + +@interface RssTableHeaderView : UIImageView { + UILabel* label; +} + +- (id)initWithText:(NSString*)text; +- (void)setText:(NSString*)text; + +@end diff --git a/CocoaCamp/Classes/ViewControllers/Rss/RssTableHeaderView.m b/CocoaCamp/Classes/ViewControllers/Rss/RssTableHeaderView.m new file mode 100644 index 0000000..227e1c6 --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/Rss/RssTableHeaderView.m @@ -0,0 +1,67 @@ +// +// TableHeaderView.m +// ARSSReader +// +// Created by Marin Todorov on 6/2/10. +// Copyright 2010 Marin Todorov. All rights reserved. +// + +#import "RssTableHeaderView.h" +#import "CCBranding.h" + +@implementation RssTableHeaderView + +- (id)initWithText:(NSString*)text +{ + + + UIImage* img = [UIImage imageNamed:@"arss_header.png"]; + if ((self = [super initWithImage:img])) { + + // Initialization code + label = [[UILabel alloc] initWithFrame:CGRectMake(20,10,200,70)]; + label.textColor = [UIColor whiteColor]; + label.shadowColor = [UIColor grayColor]; + label.shadowOffset = CGSizeMake(1, 1); + label.backgroundColor = [UIColor clearColor]; + label.font = [UIFont systemFontOfSize:20]; + label.text = text; + label.numberOfLines = 2; + [self addSubview:label]; + [label release]; + + CCBranding *branding = [[CCBranding alloc] init]; + UIView *brandedHeader = [branding headerView]; + if (brandedHeader) { + [self addSubview:brandedHeader]; + [label setFrame:CGRectMake(10, 64, 310, 23)]; + [label setNumberOfLines:1]; + [label setFont:[UIFont systemFontOfSize:16]]; + [label setBackgroundColor:[UIColor lightGrayColor]]; + } + [branding release]; + + + } + return self; +} + +- (void)setText:(NSString*)text +{ + label.text = text; +} + +/* +// Only override drawRect: if you perform custom drawing. +// An empty implementation adversely affects performance during animation. +- (void)drawRect:(CGRect)rect { + // Drawing code +} +*/ + +- (void)dealloc { + [super dealloc]; +} + + +@end diff --git a/Classes/SearchPhotosViewController.h b/CocoaCamp/Classes/ViewControllers/SearchPhotosViewController.h similarity index 100% rename from Classes/SearchPhotosViewController.h rename to CocoaCamp/Classes/ViewControllers/SearchPhotosViewController.h diff --git a/Classes/SearchPhotosViewController.m b/CocoaCamp/Classes/ViewControllers/SearchPhotosViewController.m similarity index 100% rename from Classes/SearchPhotosViewController.m rename to CocoaCamp/Classes/ViewControllers/SearchPhotosViewController.m diff --git a/Classes/SessionDetailViewController.h b/CocoaCamp/Classes/ViewControllers/SessionDetailViewController.h similarity index 100% rename from Classes/SessionDetailViewController.h rename to CocoaCamp/Classes/ViewControllers/SessionDetailViewController.h diff --git a/Classes/SessionDetailViewController.m b/CocoaCamp/Classes/ViewControllers/SessionDetailViewController.m similarity index 100% rename from Classes/SessionDetailViewController.m rename to CocoaCamp/Classes/ViewControllers/SessionDetailViewController.m diff --git a/Classes/SessionDetailViewController.xib b/CocoaCamp/Classes/ViewControllers/SessionDetailViewController.xib similarity index 100% rename from Classes/SessionDetailViewController.xib rename to CocoaCamp/Classes/ViewControllers/SessionDetailViewController.xib diff --git a/CocoaCamp/Classes/ViewControllers/SessionViewController.h b/CocoaCamp/Classes/ViewControllers/SessionViewController.h new file mode 100644 index 0000000..b4afba3 --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/SessionViewController.h @@ -0,0 +1,19 @@ +// +// SessionViewController.h +// CocoaCamp +// +// Created by Rusty Zarse on 10/19/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import +@class WebServiceDataManager; + +@interface SessionViewController : UITableViewController{ + NSFetchedResultsController *fetchedResultsController; + NSDate *lastSessionsUpdate; + WebServiceDataManager *wsMgr; +} +@property (retain, nonatomic) NSFetchedResultsController *fetchedResultsController; +@property (retain, nonatomic) CoreDataManager *coreDataManager; +@end diff --git a/CocoaCamp/Classes/ViewControllers/SessionViewController.m b/CocoaCamp/Classes/ViewControllers/SessionViewController.m new file mode 100644 index 0000000..0d595ad --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/SessionViewController.m @@ -0,0 +1,305 @@ +// +// SessionViewController.m +// CocoaCamp +// +// Created by Rusty Zarse on 10/19/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import "SessionViewController.h" +#import "Session.h" +#import "WebServiceDataManager.h" +#import "CCBranding.h" +#import "WebServiceUrlManager.h" + +@implementation SessionViewController +@synthesize coreDataManager; + +- (void)dealloc{ + [wsMgr release], wsMgr = nil; + [super dealloc]; +} + +-(id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle { + if (self = [super initWithNibName:@"OLDSessionViewController" bundle:bundle]){ + self.title = @"Schedule"; + UIImage* image = [UIImage imageNamed:@"calendar.png"]; + self.tabBarItem = [[[UITabBarItem alloc] initWithTitle:self.title image:image tag:0] autorelease]; + wsMgr = [[WebServiceDataManager alloc] init]; + [wsMgr setDelegate:self]; + } + return self; +} + + +- (void)didReceiveMemoryWarning +{ + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +- (void)applyBrandingIfPresent{ + + CCBranding *branding = [[CCBranding alloc] init]; + [branding applyConfiguredBrandingToTableView:[self tableView]]; + [branding release]; +} + +#pragma mark - Open PDF Schedule + +- (void)openPdfSchedule:(id)sender +{ + + WebServiceUrlManager *urlMgr = [[WebServiceUrlManager alloc] init]; + NSURL *webUrl = [urlMgr sessionSchedulePdfUrl]; + + [[UIApplication sharedApplication] openURL:webUrl]; + [urlMgr release]; +} + +- (void)configureToolbar{ + + UIBarButtonItem *launchWebItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction + target:self + action:@selector(openPdfSchedule:)] autorelease]; + + + self.navigationItem.rightBarButtonItem = launchWebItem; + + +} + +#pragma mark - Schedule Update + +- (void)scheduleUpdateComplete{ + +} + +- (void)updateSchedule{ + NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init]; + [wsMgr refreshSessionSchedule]; + [apool release]; +} + +- (void)checkUpdateSchedule{ + lastSessionsUpdate = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastSessionsUpdate"]; + NSTimeInterval intervalSinceLastUpdate = [lastSessionsUpdate timeIntervalSinceNow]; + if (!lastSessionsUpdate || ABS(intervalSinceLastUpdate) > (5 * 60) ) { + // [self updateSchedule]; + [self performSelectorInBackground:@selector(updateSchedule) withObject:nil]; + lastSessionsUpdate = [NSDate date]; + [[NSUserDefaults standardUserDefaults] setObject:lastSessionsUpdate forKey:@"lastSessionsUpdate"]; + [[NSUserDefaults standardUserDefaults] synchronize]; + + } + +} + + +#pragma mark - View lifecycle + + + + + +- (void)viewDidLoad +{ + [super viewDidLoad]; + [self configureToolbar]; + + [[self tableView] setRowHeight:64.0]; + [self setCoreDataManager:[CoreDataManager sharedUIThreadInstance]]; + + + + NSError *error; + if (![[self fetchedResultsController] performFetch:&error]) { + // Update to handle the error appropriately. + NSLog(@"Unresolved error %@, %@", error, [error userInfo]); + } + + self.title = @"Schedule"; + + + // Uncomment the following line to preserve selection between presentations. + // self.clearsSelectionOnViewWillAppear = NO; + + // Uncomment the following line to display an Edit button in the navigation bar for this view controller. + // self.navigationItem.rightBarButtonItem = self.editButtonItem; +} + +- (void)viewDidUnload +{ + [super viewDidUnload]; + + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; + [self setFetchedResultsController:nil]; + [coreDataManager release]; + +} + +- (void)viewWillAppear:(BOOL)animated +{ + [self checkUpdateSchedule]; + [self applyBrandingIfPresent]; + [super viewWillAppear:animated]; +} + +- (void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; +} + +- (void)viewWillDisappear:(BOOL)animated +{ + [super viewWillDisappear:animated]; +} + +- (void)viewDidDisappear:(BOOL)animated +{ + [super viewDidDisappear:animated]; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + // Return YES for supported orientations + return (interfaceOrientation == UIInterfaceOrientationPortrait); +} + +#pragma mark - Table view data source + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ + NSInteger sectionCount = [[[self fetchedResultsController] sections] count]; + return sectionCount; +} + +- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ + id sectionInfo = + [[[self fetchedResultsController] sections] objectAtIndex:section]; + return [sectionInfo name]; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + id sectionInfo = + [[[self fetchedResultsController] sections] objectAtIndex:section]; + return [sectionInfo numberOfObjects]; +} + +- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath { + Session *session = [[self fetchedResultsController] objectAtIndexPath:indexPath]; + cell.textLabel.text = session.sessionTimeString; + cell.textLabel.backgroundColor = [UIColor clearColor]; + cell.textLabel.font = [UIFont systemFontOfSize:14.0]; + cell.detailTextLabel.text = session.title; + cell.detailTextLabel.font = [UIFont systemFontOfSize:17.0]; + cell.detailTextLabel.numberOfLines = 2; + cell.detailTextLabel.backgroundColor = [UIColor clearColor]; + UIColor *cellBgColor = ([[session flagged] boolValue]) ? [UIColor whiteColor]:[UIColor colorWithRed:0.88 green:0.93 blue:0.98 alpha:1.0]; + cell.contentView.backgroundColor = cellBgColor; + +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + + static NSString *CellIdentifier = @"Cell"; + + UITableViewCell *cell = + [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] + initWithStyle:UITableViewCellStyleSubtitle + reuseIdentifier:CellIdentifier] autorelease]; + } + + // Set up the cell... + [self configureCell:cell atIndexPath:indexPath]; + + return cell; +} + +/* +// Override to support conditional editing of the table view. +- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath +{ + // Return NO if you do not want the specified item to be editable. + return YES; +} +*/ + +/* +// Override to support editing the table view. +- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath +{ + if (editingStyle == UITableViewCellEditingStyleDelete) { + // Delete the row from the data source + [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; + } + else if (editingStyle == UITableViewCellEditingStyleInsert) { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } +} +*/ + +/* +// Override to support rearranging the table view. +- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath +{ +} +*/ + +/* +// Override to support conditional rearranging of the table view. +- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath +{ + // Return NO if you do not want the item to be re-orderable. + return YES; +} +*/ + +#pragma mark - Table view delegate + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + Session *session = (Session*)[[self fetchedResultsController] objectAtIndexPath:indexPath]; + NSNumber *flagged = [NSNumber numberWithBool:![[session flagged] boolValue]]; + [session setFlagged:flagged]; + [[self coreDataManager] save]; +} + +#pragma mark - Fetched Results Controller +- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller{ + [[self tableView] reloadData]; +} + + +-(NSFetchedResultsController *)fetchedResultsController{ + if(fetchedResultsController){ + return fetchedResultsController; + } + NSFetchRequest *allSessions = [[self coreDataManager] fetchRequestForEntityNamed:@"Session"]; + [allSessions setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"datetimeStart" ascending:YES]]]; + + [allSessions setFetchBatchSize:20]; + + fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:allSessions + managedObjectContext:[[self coreDataManager] managedObjectContext] + sectionNameKeyPath:@"sessionDayTitle" + cacheName:@"AllSessions" + ]; + [fetchedResultsController setDelegate:self]; + + return fetchedResultsController; + +} + +- (void)setFetchedResultsController:(NSFetchedResultsController *)aFetchedResultsController{ + id oldFrc = fetchedResultsController; + fetchedResultsController = [aFetchedResultsController retain]; + [oldFrc setDelegate:nil]; + [oldFrc release]; +} + +@end diff --git a/CocoaCamp/Classes/ViewControllers/SessionViewController.xib b/CocoaCamp/Classes/ViewControllers/SessionViewController.xib new file mode 100644 index 0000000..8251038 --- /dev/null +++ b/CocoaCamp/Classes/ViewControllers/SessionViewController.xib @@ -0,0 +1,173 @@ + + + + 784 + 10B500 + 732 + 1038.2 + 437.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 62 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + + + IBFirstResponder + + + + 274 + {320, 460} + + + 3 + MQA + + NO + YES + NO + + NO + 1 + 0 + YES + 44 + 22 + 22 + + + + + YES + + + view + + + + 5 + + + + dataSource + + + + 6 + + + + delegate + + + + 7 + + + + + YES + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 4.IBEditorWindowLastContentRect + 4.IBPluginDependency + + + YES + SessionViewController + UIResponder + {{329, 504}, {320, 480}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 7 + + + + YES + + SessionViewController + UIViewController + + IBProjectSource + SessionViewController.h + + + + + 0 + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + + 3 + 3.1 + + diff --git a/Classes/TabController.h b/CocoaCamp/Classes/ViewControllers/TabController.h similarity index 100% rename from Classes/TabController.h rename to CocoaCamp/Classes/ViewControllers/TabController.h diff --git a/Classes/TabController.m b/CocoaCamp/Classes/ViewControllers/TabController.m similarity index 69% rename from Classes/TabController.m rename to CocoaCamp/Classes/ViewControllers/TabController.m index d1fdb0b..2d23a5e 100644 --- a/Classes/TabController.m +++ b/CocoaCamp/Classes/ViewControllers/TabController.m @@ -7,15 +7,20 @@ // #import "TabController.h" +#import +#import @implementation TabController - (void)viewDidLoad { [self setTabURLs:[NSArray arrayWithObjects: - @"tt://people", + @"tt://schedule", + @"tt://connect", @"tt://flickr", @"tt://twitter", + @"tt://news", + nil]]; } diff --git a/Classes/TwitterFeedTableViewController.h b/CocoaCamp/Classes/ViewControllers/TwitterFeedTableViewController.h similarity index 86% rename from Classes/TwitterFeedTableViewController.h rename to CocoaCamp/Classes/ViewControllers/TwitterFeedTableViewController.h index 2999d46..6a6782c 100644 --- a/Classes/TwitterFeedTableViewController.h +++ b/CocoaCamp/Classes/ViewControllers/TwitterFeedTableViewController.h @@ -13,7 +13,8 @@ NSMutableData *tweetData; NSArray *tweets; NSDateFormatter *dateParser; - NSString *tweetSearchURLSuffix; + NSURL *tweetSearchUrl; + NSString *tweetSearchString, *tweetSearchURLSuffix; UIActivityIndicatorView *activityIndicator; BOOL isLoading; } diff --git a/Classes/TwitterFeedTableViewController.m b/CocoaCamp/Classes/ViewControllers/TwitterFeedTableViewController.m similarity index 90% rename from Classes/TwitterFeedTableViewController.m rename to CocoaCamp/Classes/ViewControllers/TwitterFeedTableViewController.m index 0f9802d..9ebbbfc 100644 --- a/Classes/TwitterFeedTableViewController.m +++ b/CocoaCamp/Classes/ViewControllers/TwitterFeedTableViewController.m @@ -9,31 +9,51 @@ #import "TwitterFeedTableViewController.h" #import "SBJSON.h" #import "NSString+XMLEntities.h" +#import "WebServiceUrlManager.h" +#import "CCBranding.h" @implementation TwitterFeedTableViewController -static NSString *TweetSearchURL = @"http://search.twitter.com/search.json"; static NSString *RFC822DateFormat = @"EEE, dd MMM yyyy HH:mm:ss z"; +- (void)dealloc { + [tweetSearchUrl release], tweetSearchUrl = nil; + [tweetSearchString release], tweetSearchString = nil; + [super dealloc]; +} + -(id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle { if (self = [super initWithNibName:nibName bundle:bundle]){ self.title = @"Twitter Fall"; UIImage* image = [UIImage imageNamed:@"bird.png"]; self.tabBarItem = [[[UITabBarItem alloc] initWithTitle:@"Twitter Fall" image:image tag:0] autorelease]; - } + WebServiceUrlManager *urlManager = [[WebServiceUrlManager alloc] init]; + tweetSearchUrl = [[urlManager twitterSearchUrl] retain]; + tweetSearchString = [[urlManager twitterFallSearchString] retain]; + [urlManager release]; + } return self; } #pragma mark - #pragma mark View lifecycle +- (void)applyBrandingIfPresent{ + + CCBranding *branding = [[CCBranding alloc] init]; + [branding applyConfiguredBrandingToTableView:[self tableView]]; + [branding release]; +} + - (void)viewDidLoad { [super viewDidLoad]; + [self applyBrandingIfPresent]; + if (tweets == nil){ tweets = [[NSMutableArray alloc] init]; - tweetSearchURLSuffix = @"?q=cocoacamp"; + tweetSearchURLSuffix = [[NSString stringWithFormat:@"?q=%@", tweetSearchString] retain]; dateParser = [[NSDateFormatter alloc] init]; [dateParser setDateFormat:RFC822DateFormat]; @@ -60,7 +80,8 @@ - (void)refreshTweets { isLoading = YES; [self.view addSubview:activityIndicator]; tweetData = [[NSMutableData alloc] init]; - NSURL *searchURL = [NSURL URLWithString:[TweetSearchURL stringByAppendingString:tweetSearchURLSuffix]]; + NSString *searchUrlPath = [tweetSearchUrl absoluteString]; + NSURL *searchURL = [NSURL URLWithString:[searchUrlPath stringByAppendingString:tweetSearchURLSuffix]]; NSLog(@"Issuing request for tweets to URL: %@", searchURL); @@ -217,9 +238,7 @@ - (void)viewDidUnload { } -- (void)dealloc { - [super dealloc]; -} + @end diff --git a/Classes/FlickrPageView.xib b/CocoaCamp/Classes/Views/FlickrPageView.xib similarity index 100% rename from Classes/FlickrPageView.xib rename to CocoaCamp/Classes/Views/FlickrPageView.xib diff --git a/Classes/FlickrThumbnailView.h b/CocoaCamp/Classes/Views/FlickrThumbnailView.h similarity index 100% rename from Classes/FlickrThumbnailView.h rename to CocoaCamp/Classes/Views/FlickrThumbnailView.h diff --git a/Classes/FlickrThumbnailView.m b/CocoaCamp/Classes/Views/FlickrThumbnailView.m similarity index 99% rename from Classes/FlickrThumbnailView.m rename to CocoaCamp/Classes/Views/FlickrThumbnailView.m index 9e45424..bb552dc 100644 --- a/Classes/FlickrThumbnailView.m +++ b/CocoaCamp/Classes/Views/FlickrThumbnailView.m @@ -27,11 +27,12 @@ - (void)viewDidLoad{ self.view.autoresizesSubviews = YES; self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + /* UIBarButtonItem *addItem = [[UIBarButtonItem alloc] initWithTitle:@"Add" style:UIBarButtonItemStylePlain target:self action:@selector(addPhoto)]; self.navigationItem.rightBarButtonItem = addItem; - + */ UIBarButtonItem *refreshItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh)] autorelease]; diff --git a/CocoaCamp/Classes/Views/HeaderSponsorView.h b/CocoaCamp/Classes/Views/HeaderSponsorView.h new file mode 100644 index 0000000..017c745 --- /dev/null +++ b/CocoaCamp/Classes/Views/HeaderSponsorView.h @@ -0,0 +1,16 @@ +// +// HeaderSponsorView.h +// CocoaCamp +// +// Created by Rusty Zarse on 9/1/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import + +@interface HeaderSponsorView : UIView{ + NSArray *sponsorLogos; + NSUInteger nextLogoIdx; +} +@property(retain, nonatomic) IBOutlet UIView *sponsorView; +@end diff --git a/CocoaCamp/Classes/Views/HeaderSponsorView.m b/CocoaCamp/Classes/Views/HeaderSponsorView.m new file mode 100644 index 0000000..4aec9cc --- /dev/null +++ b/CocoaCamp/Classes/Views/HeaderSponsorView.m @@ -0,0 +1,95 @@ +// +// HeaderSponsorView.m +// CocoaCamp +// +// Created by Rusty Zarse on 9/1/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import "HeaderSponsorView.h" +#import "WebServiceDataManager.h" + +@implementation HeaderSponsorView +@synthesize sponsorView; + +- (void)changeCurrentSponsor{ + if(!sponsorLogos){ + + // this should be moved to the/a plist + sponsorLogos = [[NSArray arrayWithObjects: + @"Allstate_Platinum.jpg", + @"AlstonBird_Platinum.jpg", + @"Microsoft.jpg", + @"Prudential_Platinum.jpg", + @"SchiffHardin_Platinum.jpg", + @"Seyfarth_Platinum.jpg", + @"Walmart_Premier.jpg", + nil] retain]; + nextLogoIdx = 0; + + + + + } + + [UIView animateWithDuration:1.5 delay:5.0 options:UIViewAnimationOptionAllowUserInteraction animations:^{ + for(UIView *subView in [[self sponsorView] subviews]){ + [subView setAlpha:0.0]; + } + } completion:^(BOOL complete){ + for(UIView *subView in [[self sponsorView] subviews]){ + [subView removeFromSuperview]; + } + + UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, sponsorView.frame.size.width, sponsorView.frame.size.height)]; + [imageView setAlpha:0.0]; + [imageView setContentMode:UIViewContentModeScaleAspectFit]; + NSString *logoName = [sponsorLogos objectAtIndex:nextLogoIdx]; + if (++nextLogoIdx >= [sponsorLogos count]) { + nextLogoIdx = 0; + } + [imageView setImage:[UIImage imageNamed:logoName]]; + [[self sponsorView] addSubview:imageView]; + [imageView release]; + + [UIView animateWithDuration:1.5 delay:0.0 options:UIViewAnimationOptionAllowUserInteraction animations:^{ + [imageView setAlpha:1.0]; + } + completion:^(BOOL finished) { + [self changeCurrentSponsor]; + }]; + }]; + +} + +- (void)dealloc{ + [sponsorLogos release], sponsorLogos = nil; + [super dealloc]; +} + +- (void)awakeFromNib{ + [self changeCurrentSponsor]; + +} + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self changeCurrentSponsor]; + } + return self; +} + + + +/* +// Only override drawRect: if you perform custom drawing. +// An empty implementation adversely affects performance during animation. +- (void)drawRect:(CGRect)rect +{ + // Drawing code +} +*/ + +@end diff --git a/Classes/RegistrantDetailView.xib b/CocoaCamp/Classes/Views/RegistrantDetailView.xib similarity index 56% rename from Classes/RegistrantDetailView.xib rename to CocoaCamp/Classes/Views/RegistrantDetailView.xib index 85cc849..0efa9d7 100644 --- a/Classes/RegistrantDetailView.xib +++ b/CocoaCamp/Classes/Views/RegistrantDetailView.xib @@ -2,17 +2,22 @@ 1024 - 10F569 - 788 - 1038.29 - 461.00 + 11A511 + 1617 + 1138 + 566.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 117 + 534 - + YES - + IBUITextView + IBUIButton + IBUIActivityIndicatorView + IBUIView + IBUILabel + IBProxyObject YES @@ -23,9 +28,7 @@ YES - - YES - + YES @@ -42,11 +45,28 @@ 292 YES + + + 292 + {320, 70} + + + _NS:180 + + 3 + MQA + + 2 + + + IBCocoaTouchFramework + 292 {{111, 50}, {149, 21}} + NO YES 7 @@ -66,6 +86,7 @@ 292 {{20, 149}, {280, 110}} + NO IBCocoaTouchFramework 0 @@ -94,22 +115,23 @@ 292 - {{20, 79}, {280, 62}} + {{26, 110}, {274, 25}} + NO YES 7 NO IBCocoaTouchFramework Made a new friend? - - Optima-Regular - 30 + + Helvetica + 17 16 - - 1 - MC41MDE5NjA4MTQgMCAwAA + + 3 + MC4zMzMzMzMzMzMzAA 1 @@ -120,6 +142,7 @@ 292 {{20, 270}, {280, 72}} + 1 MSAxIDEAA @@ -129,10 +152,7 @@ IBCocoaTouchFramework NO Use bump to exchange contacts with new friends. Only your email and twitter will be shared. - - 3 - MC4zMzMzMzMzMzMzAA - + 2 IBCocoaTouchFramework @@ -141,18 +161,23 @@ 292 - {{20, 20}, {280, 62}} + {{26, 88}, {274, 23}} + NO YES 7 NO IBCocoaTouchFramework Hi, John Joe! - + + Helvetica + 18 + 16 + 1 - MC41MDE5NjA4MTQgMCAwAA + MC4yMjM5NTQwODcgMC4zMDk2OTgzMDYgMC40NDM4Nzc1NTEAA 1 @@ -163,14 +188,16 @@ 292 {{150, 170}, {20, 20}} + NO IBCocoaTouchFramework NO 2 - {320, 367} + {{0, 64}, {320, 367}} + @@ -216,6 +243,14 @@ 39 + + + headerView + + + + 41 + @@ -245,9 +280,10 @@ + + - @@ -281,6 +317,11 @@ + + 40 + + + @@ -288,19 +329,22 @@ YES -1.CustomClassName + -1.IBPluginDependency -2.CustomClassName + -2.IBPluginDependency 16.IBPluginDependency 30.IBPluginDependency 32.IBPluginDependency 34.IBPluginDependency 36.IBPluginDependency 38.IBPluginDependency - 8.IBEditorWindowLastContentRect + 40.IBPluginDependency 8.IBPluginDependency YES RegistrantDetailViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -308,45 +352,28 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {{595, 174}, {320, 480}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES - - YES - + YES - - YES - + - 39 + 41 YES - - NSObject - - IBProjectSource - Classes/JSON/NSObject+SBJSON.h - - - - NSObject - - IBProjectSource - Classes/JSON/SBJsonWriter.h - - RegistrantDetailViewController UIViewController @@ -386,11 +413,13 @@ YES YES + headerView loading nameLabel YES + UIView UIActivityIndicatorView UILabel @@ -399,11 +428,16 @@ YES YES + headerView loading nameLabel YES + + headerView + UIView + loading UIActivityIndicatorView @@ -416,235 +450,7 @@ IBProjectSource - Classes/RegistrantDetailViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIActivityIndicatorView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIActivityIndicatorView.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITextView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITextView.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h + ./Classes/RegistrantDetailViewController.h @@ -660,12 +466,11 @@ YES - ../CocoaCamp.xcodeproj 3 bump_lefthand.png {70, 70} - 117 + 534 diff --git a/RegistrantListView.xib b/CocoaCamp/Classes/Views/RegistrantListView.xib similarity index 100% rename from RegistrantListView.xib rename to CocoaCamp/Classes/Views/RegistrantListView.xib diff --git a/Classes/TwitterFeedTableView.xib b/CocoaCamp/Classes/Views/TwitterFeedTableView.xib similarity index 100% rename from Classes/TwitterFeedTableView.xib rename to CocoaCamp/Classes/Views/TwitterFeedTableView.xib diff --git a/Classes/TwitterFeedTableViewCell.xib b/CocoaCamp/Classes/Views/TwitterFeedTableViewCell.xib similarity index 100% rename from Classes/TwitterFeedTableViewCell.xib rename to CocoaCamp/Classes/Views/TwitterFeedTableViewCell.xib diff --git a/CocoaCamp/Classes/WebService/WebServiceDataManager.h b/CocoaCamp/Classes/WebService/WebServiceDataManager.h new file mode 100644 index 0000000..a263def --- /dev/null +++ b/CocoaCamp/Classes/WebService/WebServiceDataManager.h @@ -0,0 +1,16 @@ +// +// WebServiceDataManager.h +// CocoaCamp +// +// Created by Rusty Zarse on 10/19/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import + +@interface WebServiceDataManager : NSObject +@property (assign, nonatomic) id delegate; + +- (int)refreshSessionSchedule; +- (NSArray *)sponsorLogoUrls; +@end diff --git a/CocoaCamp/Classes/WebService/WebServiceDataManager.m b/CocoaCamp/Classes/WebService/WebServiceDataManager.m new file mode 100644 index 0000000..049ce7b --- /dev/null +++ b/CocoaCamp/Classes/WebService/WebServiceDataManager.m @@ -0,0 +1,130 @@ +// +// WebServiceDataManager.m +// CocoaCamp +// +// Created by Rusty Zarse on 10/19/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import "WebServiceDataManager.h" +#import "CoreDataManager.h" +#import "WordPressApiSessionsJsonParser.h" +#import "WebServiceUrlManager.h" +#import "WordPressApiSponsorLogosJsonParser.h" + +@implementation WebServiceDataManager +@synthesize delegate; + +- (id)init +{ + self = [super init]; + if (self) { + // Initialization code here. + } + + return self; +} + +- (int)refreshSessionSchedule{ + + WebServiceUrlManager *webServiceUrlManager = [[WebServiceUrlManager alloc] init]; + NSArray *scheduleUrls = [[webServiceUrlManager sessionScheduleUrlList] retain]; + [webServiceUrlManager release]; + // this may be on a background thread so get an isolater coredata manager + CoreDataManager *coreDataManager = [[CoreDataManager alloc] init]; + + // good place to build a dependency injection if you need something different + WordPressApiSessionsJsonParser *parser = [[WordPressApiSessionsJsonParser alloc] initWithCoreDataManager:coreDataManager]; + + // reusable vars + + NSURLResponse *urlResponse = nil; + NSError *error = nil; + + NSArray *entityResults = [NSArray array]; + + for( NSURL *url in scheduleUrls){ + // create request + NSURLRequest *request = [NSURLRequest requestWithURL:url + cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; + + // get response + NSData *responseData = [NSURLConnection sendSynchronousRequest:request + returningResponse:&urlResponse + error:&error]; + // convert to string + NSString *jsonText = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; + + // parse to array of model entities + entityResults = [parser parseSessionScheduleJson:jsonText]; + + // HACK BEGIN + // find the lunch item + // this item date was not parsing correctly +// NSPredicate *lunchSessionPredicate = [NSPredicate predicateWithFormat:@"title = 'Luncheon & Plenary Session: Yale Law Professor & Bestselling Author Amy Chua (Co-Sponsored by Allstate & Schiff Hardin, LLP)'"]; +// NSArray *filteredResults = [entityResults filteredArrayUsingPredicate:lunchSessionPredicate]; +// if( 1 == [filteredResults count] ){ +// +// NSManagedObject *lunchSession = [filteredResults objectAtIndex:0]; +// NSDate *sessionStartDateTime = [lunchSession valueForKeyPath:@"datetimeStart"]; +// NSLog(@"%@", lunchSession); +// } + // HACK END + + // clean up for this request + [jsonText release]; + + // save + [coreDataManager save]; + } + + // finished with parser + [parser release]; + + if( delegate && [delegate respondsToSelector:@selector(scheduleUpdateComplete)]){ + [delegate performSelector:@selector(scheduleUpdateComplete)]; + } + + [coreDataManager release]; + [scheduleUrls release]; + + return [entityResults count]; + +} + +- (NSArray *)sponsorLogoUrls{ + WebServiceUrlManager *webServiceUrlManager = [[WebServiceUrlManager alloc] init]; + NSURL *sponsorLogoUrl = [[webServiceUrlManager logoLinksUrl] retain]; + [webServiceUrlManager release]; + NSURLResponse *urlResponse = nil; + NSError *error = nil; + NSArray *urlResults = [NSArray array]; + + + // create request + NSURLRequest *request = [NSURLRequest requestWithURL:sponsorLogoUrl + cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; + + // get response + NSData *responseData = [NSURLConnection sendSynchronousRequest:request + returningResponse:&urlResponse + error:&error]; + // convert to string + NSString *jsonText = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; + + WordPressApiSponsorLogosJsonParser *parser = [[WordPressApiSponsorLogosJsonParser alloc] init]; + // parse to array of urls + urlResults = [parser parseUrlsFromJson:jsonText]; + // clean up for this request + [jsonText release]; + + // finished with parser + [parser release]; + + + [sponsorLogoUrl release]; + + return urlResults; +} + +@end diff --git a/CocoaCamp/Classes/WebService/WebServiceUrlManager.h b/CocoaCamp/Classes/WebService/WebServiceUrlManager.h new file mode 100644 index 0000000..40537e1 --- /dev/null +++ b/CocoaCamp/Classes/WebService/WebServiceUrlManager.h @@ -0,0 +1,22 @@ +// +// WebServiceUrlManager.h +// CocoaCamp +// +// Created by Rusty Zarse on 8/2/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import + +@interface WebServiceUrlManager : NSObject{ + NSURL *attendeeListUrl, *twitterSearchUrl, *rssNewsUrl, *newsWebUrl, *sessionSchedulePdfUrl, *logoLinksUrl; + NSString *twitterFallSearchString; + NSArray *sessionScheduleUrlList; +} + +@property(readonly, nonatomic, copy) NSURL *attendeeListUrl, *twitterSearchUrl, *rssNewsUrl, *newsWebUrl, *sessionSchedulePdfUrl, *logoLinksUrl; +@property(readonly, nonatomic, copy) NSString *twitterFallSearchString; +@property(readonly, nonatomic, retain) NSArray *sessionScheduleUrlList; + + +@end diff --git a/CocoaCamp/Classes/WebService/WebServiceUrlManager.m b/CocoaCamp/Classes/WebService/WebServiceUrlManager.m new file mode 100644 index 0000000..57a806c --- /dev/null +++ b/CocoaCamp/Classes/WebService/WebServiceUrlManager.m @@ -0,0 +1,104 @@ +// +// WebServiceUrlManager.m +// CocoaCamp +// +// Created by Rusty Zarse on 8/2/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import "WebServiceUrlManager.h" + +@implementation WebServiceUrlManager + +- (void)dealloc{ + [attendeeListUrl release], attendeeListUrl = nil; + [twitterSearchUrl release], twitterSearchUrl = nil; + [twitterFallSearchString release], twitterFallSearchString = nil; + [sessionScheduleUrlList release], sessionScheduleUrlList = nil; + [sessionSchedulePdfUrl release], sessionSchedulePdfUrl = nil; + [logoLinksUrl release], logoLinksUrl = nil; + [super dealloc]; +} + +- (id)init +{ + self = [super init]; + if (self) { + + + // Load config plist + NSString *filePathToPList = [[NSBundle mainBundle] pathForResource:@"webServiceConfig" ofType:@"plist"]; + NSMutableDictionary* configDictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:filePathToPList]; + + twitterSearchUrl = [[NSURL alloc] initWithString:[configDictionary objectForKey:@"twitterSearchUrl"]]; + twitterFallSearchString = [[NSString alloc] initWithString:[configDictionary objectForKey:@"twitterFallSearchString"]]; + attendeeListUrl = [[NSURL alloc] initWithString:[configDictionary objectForKey:@"attendeeListUrl"]]; + rssNewsUrl = [[NSURL alloc] initWithString:[configDictionary objectForKey:@"rssNewsUrl"]]; + newsWebUrl = [[NSURL alloc] initWithString:[configDictionary objectForKey:@"newsWebUrl"]]; + + sessionSchedulePdfUrl = [[NSURL alloc] initWithString:[configDictionary objectForKey:@"sessionSchedulePdfUrl"]]; + logoLinksUrl = [[NSURL alloc] initWithString:[configDictionary objectForKey:@"logoLinksUrl"]]; + + + + NSArray *sessionSchedulesList = [NSArray arrayWithArray:[configDictionary objectForKey:@"sessionScheduleUrlList"]]; + + NSMutableArray *urlList = [NSMutableArray array]; + for(NSString *urlString in sessionSchedulesList){ + [urlList addObject:[NSURL URLWithString:urlString]]; + } + + sessionScheduleUrlList = [[NSArray alloc] initWithArray:urlList]; + + // *********************** + // replace with development file urls + + NSString *filePathToSample = [[NSBundle mainBundle] pathForResource:@"AttendeeListJson" ofType:@"js"]; + attendeeListUrl = [NSURL fileURLWithPath:filePathToSample]; + // hang on to that url for reuse + [attendeeListUrl retain]; + } + + + + return self; +} + + +- (NSURL *)attendeeListUrl{ + return [attendeeListUrl copy]; +} + +- (NSURL *)twitterSearchUrl{ + return [twitterSearchUrl copy]; +} + +- (NSString *)twitterFallSearchString{ + return [twitterFallSearchString copy]; +} + + +- (NSArray *)sessionScheduleUrlList{ + return sessionScheduleUrlList; +} + +- (NSURL *)sessionSchedulePdfUrl{ + return sessionSchedulePdfUrl; +} + +- (NSURL *)rssNewsUrl{ + return rssNewsUrl; +} + +- (NSURL *)newsWebUrl{ + return newsWebUrl; +} + +- (NSURL *)logoLinksUrl{ + return logoLinksUrl; +} + + + + +@end diff --git a/CocoaCamp/Classes/WebService/WordPressApiSessionsJsonParser.h b/CocoaCamp/Classes/WebService/WordPressApiSessionsJsonParser.h new file mode 100644 index 0000000..4ff9018 --- /dev/null +++ b/CocoaCamp/Classes/WebService/WordPressApiSessionsJsonParser.h @@ -0,0 +1,21 @@ +// +// WordPressApiSessionsJsonParser.h +// CocoaCamp +// +// Created by Rusty Zarse on 10/19/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import + +@interface WordPressApiSessionsJsonParser : NSObject{ + CoreDataManager *coreDataManager; + NSCalendar *gregorianCalendar; + NSDictionary *scheduleDays; + NSNumberFormatter *numberFormatter; +} + +- (id)initWithCoreDataManager:(CoreDataManager *)aCoreDataManager; + +- (NSArray *)parseSessionScheduleJson:(NSString *)json; +@end diff --git a/CocoaCamp/Classes/WebService/WordPressApiSessionsJsonParser.m b/CocoaCamp/Classes/WebService/WordPressApiSessionsJsonParser.m new file mode 100644 index 0000000..713a6d5 --- /dev/null +++ b/CocoaCamp/Classes/WebService/WordPressApiSessionsJsonParser.m @@ -0,0 +1,154 @@ +// +// WordPressApiSessionsJsonParser.m +// CocoaCamp +// +// Created by Rusty Zarse on 10/19/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import "WordPressApiSessionsJsonParser.h" +#import "JSON.h" +#import "Session.h" +#import "GTMNSString+HTML.h" + + + +@implementation WordPressApiSessionsJsonParser +- (void)dealloc{ + [gregorianCalendar release]; + [scheduleDays release]; + [numberFormatter release]; + [super dealloc]; +} + + +- (void)initializeScheduleDateArray{ + NSDateComponents *scheduleDate = [[NSDateComponents alloc] init]; + [scheduleDate setYear:2011]; + [scheduleDate setMonth:11]; + [scheduleDate setDay:17]; + + NSDate *nov17 = [gregorianCalendar dateFromComponents:scheduleDate]; + + [scheduleDate setDay:18]; + NSDate *nov18 = [gregorianCalendar dateFromComponents:scheduleDate]; + + [scheduleDate setDay:19]; + NSDate *nov19 = [gregorianCalendar dateFromComponents:scheduleDate]; + + [scheduleDate setDay:20]; + NSDate *nov20 = [gregorianCalendar dateFromComponents:scheduleDate]; + + [scheduleDate release]; + + scheduleDays = [[NSDictionary alloc] initWithObjectsAndKeys:nov17, @"November 17th", nov18, @"November 18th", nov19, @"November 19th", nov20, @"November 20th", nil]; +} + +- (id)initWithCoreDataManager:(CoreDataManager *)aCoreDataManager{ + self = [super init]; + if (self) { + coreDataManager = aCoreDataManager; + gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; + [gregorianCalendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]]; // sorry, we're in Atlanta + numberFormatter = [[NSNumberFormatter alloc] init]; + [numberFormatter setFormatterBehavior:[NSNumberFormatter defaultFormatterBehavior]]; + [self initializeScheduleDateArray]; + } + + return self; +} + +- (Session *)applyEntryDictionary:(NSDictionary *)entryDictionary forSessionDateString:(NSString *)sessionDateString toNewOrExistingSessionUsingCurrentSessionsSet:(NSSet *)currentSessions{ + + NSDate *sessionDate = [scheduleDays objectForKey:sessionDateString]; + + NSString *sourceId = [[entryDictionary objectForKey:@"id"] stringValue]; + NSString *title = [[entryDictionary objectForKey:@"title"] gtm_stringByUnescapingFromHTML]; + NSDictionary *customFieldsDictionary = [entryDictionary objectForKey:@"custom_fields"]; + NSString *eventTime = [[customFieldsDictionary objectForKey:@"event_time"] objectAtIndex:0]; + + NSDate *sessionDateTime = sessionDate; + + // parse the time string ex: "3:30PM-5:00PM" + NSRange rangeOfDash = [eventTime rangeOfString:@"-"]; + if(rangeOfDash.location != NSNotFound){ + NSString *startTime = [eventTime substringToIndex:rangeOfDash.location]; + NSString *amPm = [startTime substringFromIndex:[startTime length] - 2]; + BOOL isAM = ([amPm isEqualToString:@"AM"]); + // strip the AM/PM + NSString *hourAndMinute = [startTime substringToIndex:[startTime length] - 2]; + NSRange rangeOfColon = [hourAndMinute rangeOfString:@":"]; + if (rangeOfColon.location != NSNotFound) { + NSString *hour = [hourAndMinute substringToIndex:rangeOfColon.location]; + // substring from colon + NSString *minute = [hourAndMinute substringFromIndex:rangeOfColon.location+1]; + + unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; + NSDateComponents *dateComponents = [gregorianCalendar components:unitFlags fromDate:sessionDate]; + @try { + int hourInteger = [[numberFormatter numberFromString:hour] intValue]; + if(!isAM && hourInteger < 12) hourInteger += 12; + [dateComponents setHour:hourInteger]; + [dateComponents setMinute:[[numberFormatter numberFromString:minute] intValue]]; + } + @catch (NSException *exception) { + // just move on + NSLog( @"ERROR: [WordPressApiSessionsJsonParser applyEntryDictionary:forSessionDate:toNewOrExistingSessionUsingCurrentSessionsSet:] Parsing of event failed. Skipping and moving on."); + } + @finally { + sessionDateTime = [gregorianCalendar dateFromComponents:dateComponents]; + } + + } + + } + + + + + + Session *session = nil; + // look for existing session + NSPredicate *idPredicate = [NSPredicate predicateWithFormat:@"externalId = %@", sourceId]; + NSSet *filteredSet = [currentSessions filteredSetUsingPredicate:idPredicate]; + // if filtered set matches + if ([filteredSet count]) { + // assuming only one in this set + session = [filteredSet anyObject]; + }else{ + // not found so insert + session = (Session *)[NSEntityDescription insertNewObjectForEntityForName:@"Session" + inManagedObjectContext:[coreDataManager managedObjectContext]]; + } + + [session setTitle:title]; + [session setSessionTimeString:eventTime]; + [session setDatetimeStart:sessionDateTime]; + [session setSessionDayTitle:sessionDateString]; + [session setExternalId:sourceId]; + return session; +} + +- (NSArray *)parseSessionScheduleJson:(NSString *)json{ + + NSError *error = nil; + SBJSON *jsonParser = [[SBJSON alloc] init]; + NSDictionary *jsonData = [jsonParser objectWithString:json error:&error]; + [jsonParser release]; + NSDictionary *categories = [jsonData objectForKey:@"category"]; + NSString *sessionDateString = [categories objectForKey:@"title"]; + NSArray *posts = [jsonData objectForKey:@"posts"]; + + NSArray *allCurrentSessions = [coreDataManager resultsForRequest:[coreDataManager fetchRequestForEntityNamed:@"Session"]]; + + NSSet *currentSessionsSet = [NSSet setWithArray:allCurrentSessions]; + + NSMutableArray *entryModels = [NSMutableArray array]; + for (NSDictionary *entryDictionary in posts) { + Session *session = [self applyEntryDictionary:entryDictionary forSessionDateString:sessionDateString toNewOrExistingSessionUsingCurrentSessionsSet:currentSessionsSet]; + [entryModels addObject:session]; + } + return [NSArray arrayWithArray:entryModels]; +} + +@end diff --git a/CocoaCamp/Classes/WebService/WordPressApiSponsorLogosJsonParser.h b/CocoaCamp/Classes/WebService/WordPressApiSponsorLogosJsonParser.h new file mode 100644 index 0000000..7c94149 --- /dev/null +++ b/CocoaCamp/Classes/WebService/WordPressApiSponsorLogosJsonParser.h @@ -0,0 +1,13 @@ +// +// WordPressApiSponsorLogosJsonParser.h +// CocoaCamp +// +// Created by Rusty Zarse on 11/8/11. +// Copyright (c) 2011 LeVous, LLC. All rights reserved. +// + +#import + +@interface WordPressApiSponsorLogosJsonParser : NSObject +- (NSArray *)parseUrlsFromJson:(NSString *)json; +@end diff --git a/CocoaCamp/Classes/WebService/WordPressApiSponsorLogosJsonParser.m b/CocoaCamp/Classes/WebService/WordPressApiSponsorLogosJsonParser.m new file mode 100644 index 0000000..90854eb --- /dev/null +++ b/CocoaCamp/Classes/WebService/WordPressApiSponsorLogosJsonParser.m @@ -0,0 +1,40 @@ +// +// WordPressApiSponsorLogosJsonParser.m +// CocoaCamp +// +// Created by Rusty Zarse on 11/8/11. +// Copyright (c) 2011 LeVous, LLC. All rights reserved. +// + +#import "WordPressApiSponsorLogosJsonParser.h" + +#import "JSON.h" +#import "GTMNSString+HTML.h" + + +@implementation WordPressApiSponsorLogosJsonParser + +- (NSArray *)parseUrlsFromJson:(NSString *)json{ + + NSMutableArray *imageUrls = [NSMutableArray array]; + + NSError *error = nil; + SBJSON *jsonParser = [[SBJSON alloc] init]; + NSDictionary *jsonData = [jsonParser objectWithString:json error:&error]; + [jsonParser release]; + NSDictionary *page = [jsonData objectForKey:@"page"]; + NSArray *attachments = [page objectForKey:@"attachments"]; + + for( NSDictionary *attachment in attachments){ + NSDictionary *imageSet = [attachment objectForKey:@"images"]; + NSDictionary *mediumImage = [imageSet objectForKey:@"medium"]; + NSString *imageUrl = [mediumImage objectForKey:@"url"]; + if( imageUrl ) [imageUrls addObject:[NSURL URLWithString:imageUrl]]; + } + + + return [NSArray arrayWithArray:imageUrls]; + +} + +@end diff --git a/Classes/NSString+XMLEntities.h b/CocoaCamp/Classes/Xml/NSString+XMLEntities.h similarity index 100% rename from Classes/NSString+XMLEntities.h rename to CocoaCamp/Classes/Xml/NSString+XMLEntities.h diff --git a/Classes/NSString+XMLEntities.m b/CocoaCamp/Classes/Xml/NSString+XMLEntities.m similarity index 100% rename from Classes/NSString+XMLEntities.m rename to CocoaCamp/Classes/Xml/NSString+XMLEntities.m diff --git a/CocoaCamp/CocoaCamp-Info.plist b/CocoaCamp/CocoaCamp-Info.plist new file mode 100644 index 0000000..cb567dc --- /dev/null +++ b/CocoaCamp/CocoaCamp-Info.plist @@ -0,0 +1,54 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + Icon.png + CFBundleIconFiles + + Icon@2x.png + Icon.png + + CFBundleIdentifier + com.levous.napaba2011 + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0.2 + CFBundleSignature + ???? + CFBundleVersion + 1.0.2 + LSRequiresIPhoneOS + + NSMainNibFile + MainWindow + NSMainNibFile~ipad + MainWindow_iPad + UILaunchImageFile + napaba-launch.png + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/CocoaCamp_Prefix.pch b/CocoaCamp/CocoaCamp-Prefix.pch similarity index 51% rename from CocoaCamp_Prefix.pch rename to CocoaCamp/CocoaCamp-Prefix.pch index fcd3c96..fede0b0 100644 --- a/CocoaCamp_Prefix.pch +++ b/CocoaCamp/CocoaCamp-Prefix.pch @@ -2,8 +2,17 @@ // Prefix header for all source files of the 'CocoaCamp' target in the 'CocoaCamp' project // +#import + +#ifndef __IPHONE_3_0 +#warning "This project uses features only available in iPhone SDK 3.0 and later." +#endif + #ifdef __OBJC__ - #import #import + #import #import "Three20/Three20.h" + #import + #import "CoreDataManager.h" + #endif diff --git a/CocoaCamp/CocoaCampAppDelegate.h b/CocoaCamp/CocoaCampAppDelegate.h new file mode 100644 index 0000000..05ccb81 --- /dev/null +++ b/CocoaCamp/CocoaCampAppDelegate.h @@ -0,0 +1,20 @@ +// +// CocoaCampAppDelegate.h +// CocoaCamp +// +// Created by Rusty Zarse on 8/2/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import +#import "Bump.h" + +@interface CocoaCampAppDelegate : NSObject + +@property (nonatomic, retain) IBOutlet UIWindow *window; + +@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController; + +@property (nonatomic, retain) Bump *bump; + +@end diff --git a/CocoaCamp/CocoaCampAppDelegate.m b/CocoaCamp/CocoaCampAppDelegate.m new file mode 100644 index 0000000..48f5777 --- /dev/null +++ b/CocoaCamp/CocoaCampAppDelegate.m @@ -0,0 +1,108 @@ +// +// CocoaCampAppDelegate.m +// CocoaCamp +// +// Created by Rusty Zarse on 8/2/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import "CocoaCampAppDelegate.h" +#import "ContactManager.h" +#import "SessionViewController.h" +#import "FlickrThumbnailView.h" +#import "AttendeeListViewController.h" +#import "TwitterFeedTableViewController.h" +#import "TabController.h" +#import "RssNewsViewController.h" +#import "PeepsConnectViewController.h" + +@implementation CocoaCampAppDelegate + +@synthesize window = _window, tabBarController, bump; + +- (void)initializeBump { + bump = [[Bump alloc] init]; + [bump configAPIKey:@"e2c02bad55a14a129ca2498a4c20e924"]; + [bump configHistoryMessage:@"%1 exchanged contacts with %2"]; + [bump configActionMessage:@"Bump with another attendee to swap contacts."]; +} + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + // Override point for customization after application launch. + + TTNavigator* navigator = [TTNavigator navigator]; + navigator.supportsShakeToReload = YES; + navigator.persistenceMode = TTNavigatorPersistenceModeAll; + + // force init + [[CoreDataManager sharedUIThreadInstance] managedObjectContext]; + + TTURLMap* map = navigator.URLMap; + [map from:@"*" toViewController:[TTWebController class]]; + [map from:@"tt://tabs" toViewController:[TabController class]]; + [map from:@"tt://connect" toViewController:[PeepsConnectViewController class]]; + [map from:@"tt://schedule" toViewController:[SessionViewController class]]; + [map from:@"tt://flickr" toViewController:[FlickrThumbnailView class]]; + [map from:@"tt://people" toViewController:[AttendeeListViewController class]]; + [map from:@"tt://twitter" toViewController:[TwitterFeedTableViewController class]]; + [map from:@"tt://news" toViewController:[RssNewsViewController class]]; + + [navigator openURLAction:[TTURLAction actionWithURLPath:@"tt://tabs"]]; + + [self initializeBump]; + + [self.window makeKeyAndVisible]; + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application +{ + /* + Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + */ +} + +- (void)applicationDidEnterBackground:(UIApplication *)application +{ + /* + Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + */ +} + +- (void)applicationWillEnterForeground:(UIApplication *)application +{ + /* + Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + */ +} + +- (void)applicationDidBecomeActive:(UIApplication *)application +{ + /* + Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + */ +} + +- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{ + NSString *something = @""; +} + +- (void)applicationWillTerminate:(UIApplication *)application +{ + /* + Called when the application is about to terminate. + Save data if appropriate. + See also applicationDidEnterBackground:. + */ +} + +- (void)dealloc +{ + [_window release]; + [super dealloc]; +} + +@end diff --git a/Classes/CocoaCampAppDelegate.h b/CocoaCamp/CocoaCampAppDelegateBAK.h similarity index 100% rename from Classes/CocoaCampAppDelegate.h rename to CocoaCamp/CocoaCampAppDelegateBAK.h diff --git a/Classes/CocoaCampAppDelegate.m b/CocoaCamp/CocoaCampAppDelegateBAK.m similarity index 100% rename from Classes/CocoaCampAppDelegate.m rename to CocoaCamp/CocoaCampAppDelegateBAK.m diff --git a/CocoaCamp/CocoaCampConstants.h b/CocoaCamp/CocoaCampConstants.h new file mode 100644 index 0000000..990f108 --- /dev/null +++ b/CocoaCamp/CocoaCampConstants.h @@ -0,0 +1,12 @@ +// +// CocoaCampConstants.h +// CocoaCamp +// +// Created by Rusty Zarse on 9/1/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#pragma mark - resources/branded.plist entry keys + +#define kBrandedPListKeyFileNamePrefix @"fileNamePrefix" +#define kBrandedPListKeyHeaderNibName @"headerViewNibName" diff --git a/CocoaCamp/GoogleToolboxMac/GDataXMLNode.h b/CocoaCamp/GoogleToolboxMac/GDataXMLNode.h new file mode 100644 index 0000000..f6dd786 --- /dev/null +++ b/CocoaCamp/GoogleToolboxMac/GDataXMLNode.h @@ -0,0 +1,214 @@ +/* Copyright (c) 2008 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// These node, element, and document classes implement a subset of the methods +// provided by NSXML. While NSXML behavior is mimicked as much as possible, +// there are important differences. +// +// The biggest difference is that, since this is based on libxml2, there +// is no retain model for the underlying node data. Rather than copy every +// node obtained from a parse tree (which would have a substantial memory +// impact), we rely on weak references, and it is up to the code that +// created a document to retain it for as long as any +// references rely on nodes inside that document tree. + + +#import + +// libxml includes require that the target Header Search Paths contain +// +// /usr/include/libxml2 +// +// and Other Linker Flags contain +// +// -lxml2 + +#import +#import +#import +#import +#import + + +#if (MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4) || defined(GDATA_TARGET_NAMESPACE) + // we need NSInteger for the 10.4 SDK, or we're using target namespace macros + #import "GDataDefines.h" +#endif + +#undef _EXTERN +#undef _INITIALIZE_AS +#ifdef GDATAXMLNODE_DEFINE_GLOBALS +#define _EXTERN +#define _INITIALIZE_AS(x) =x +#else +#define _EXTERN extern +#define _INITIALIZE_AS(x) +#endif + +// when no namespace dictionary is supplied for XPath, the default namespace +// for the evaluated tree is registered with the prefix _def_ns +_EXTERN const char* kGDataXMLXPathDefaultNamespacePrefix _INITIALIZE_AS("_def_ns"); + +// Nomenclature for method names: +// +// Node = GData node +// XMLNode = xmlNodePtr +// +// So, for example: +// + (id)nodeConsumingXMLNode:(xmlNodePtr)theXMLNode; + +@class NSArray, NSDictionary, NSError, NSString, NSURL; +@class GDataXMLElement, GDataXMLDocument; + +enum { + GDataXMLInvalidKind = 0, + GDataXMLDocumentKind, + GDataXMLElementKind, + GDataXMLAttributeKind, + GDataXMLNamespaceKind, + GDataXMLProcessingInstructionKind, + GDataXMLCommentKind, + GDataXMLTextKind, + GDataXMLDTDKind, + GDataXMLEntityDeclarationKind, + GDataXMLAttributeDeclarationKind, + GDataXMLElementDeclarationKind, + GDataXMLNotationDeclarationKind +}; + +typedef NSUInteger GDataXMLNodeKind; + +@interface GDataXMLNode : NSObject { +@protected + // NSXMLNodes can have a namespace URI or prefix even if not part + // of a tree; xmlNodes cannot. When we create nodes apart from + // a tree, we'll store the dangling prefix or URI in the xmlNode's name, + // like + // "prefix:name" + // or + // "{http://uri}:name" + // + // We will fix up the node's namespace and name (and those of any children) + // later when adding the node to a tree with addChild: or addAttribute:. + // See fixUpNamespacesForNode:. + + xmlNodePtr xmlNode_; // may also be an xmlAttrPtr or xmlNsPtr + BOOL shouldFreeXMLNode_; // if yes, xmlNode_ will be free'd in dealloc + + // cached values + NSString *cachedName_; + NSArray *cachedChildren_; + NSArray *cachedAttributes_; +} + ++ (GDataXMLElement *)elementWithName:(NSString *)name; ++ (GDataXMLElement *)elementWithName:(NSString *)name stringValue:(NSString *)value; ++ (GDataXMLElement *)elementWithName:(NSString *)name URI:(NSString *)value; + ++ (id)attributeWithName:(NSString *)name stringValue:(NSString *)value; ++ (id)attributeWithName:(NSString *)name URI:(NSString *)attributeURI stringValue:(NSString *)value; + ++ (id)namespaceWithName:(NSString *)name stringValue:(NSString *)value; + ++ (id)textWithStringValue:(NSString *)value; + +- (NSString *)stringValue; +- (void)setStringValue:(NSString *)str; + +- (NSUInteger)childCount; +- (NSArray *)children; +- (GDataXMLNode *)childAtIndex:(unsigned)index; + +- (NSString *)localName; +- (NSString *)name; +- (NSString *)prefix; +- (NSString *)URI; + +- (GDataXMLNodeKind)kind; + +- (NSString *)XMLString; + ++ (NSString *)localNameForName:(NSString *)name; ++ (NSString *)prefixForName:(NSString *)name; + +// This is the preferred entry point for nodesForXPath. This takes an explicit +// namespace dictionary (keys are prefixes, values are URIs). +- (NSArray *)nodesForXPath:(NSString *)xpath namespaces:(NSDictionary *)namespaces error:(NSError **)error; + +// This implementation of nodesForXPath registers namespaces only from the +// document's root node. _def_ns may be used as a prefix for the default +// namespace, though there's no guarantee that the default namespace will +// be consistenly the same namespace in server responses. +- (NSArray *)nodesForXPath:(NSString *)xpath error:(NSError **)error; + +// access to the underlying libxml node; be sure to release the cached values +// if you change the underlying tree at all +- (xmlNodePtr)XMLNode; +- (void)releaseCachedValues; + +@end + + +@interface GDataXMLElement : GDataXMLNode + +- (id)initWithXMLString:(NSString *)str error:(NSError **)error; + +- (NSArray *)namespaces; +- (void)setNamespaces:(NSArray *)namespaces; +- (void)addNamespace:(GDataXMLNode *)aNamespace; + +- (void)addChild:(GDataXMLNode *)child; +- (void)removeChild:(GDataXMLNode *)child; + +- (NSArray *)elementsForName:(NSString *)name; +- (NSArray *)elementsForLocalName:(NSString *)localName URI:(NSString *)URI; + +- (NSArray *)attributes; +- (GDataXMLNode *)attributeForName:(NSString *)name; +- (GDataXMLNode *)attributeForLocalName:(NSString *)name URI:(NSString *)attributeURI; +- (void)addAttribute:(GDataXMLNode *)attribute; + +- (NSString *)resolvePrefixForNamespaceURI:(NSString *)namespaceURI; + +@end + +@interface GDataXMLDocument : NSObject { +@protected + xmlDoc* xmlDoc_; // strong; always free'd in dealloc +} + +- (id)initWithXMLString:(NSString *)str options:(unsigned int)mask error:(NSError **)error; +- (id)initWithData:(NSData *)data options:(unsigned int)mask error:(NSError **)error; +- (id)initWithRootElement:(GDataXMLElement *)element; + +- (GDataXMLElement *)rootElement; + +- (NSData *)XMLData; + +- (void)setVersion:(NSString *)version; +- (void)setCharacterEncoding:(NSString *)encoding; + +// This is the preferred entry point for nodesForXPath. This takes an explicit +// namespace dictionary (keys are prefixes, values are URIs). +- (NSArray *)nodesForXPath:(NSString *)xpath namespaces:(NSDictionary *)namespaces error:(NSError **)error; + +// This implementation of nodesForXPath registers namespaces only from the +// document's root node. _def_ns may be used as a prefix for the default +// namespace, though there's no guarantee that the default namespace will +// be consistenly the same namespace in server responses. +- (NSArray *)nodesForXPath:(NSString *)xpath error:(NSError **)error; + +- (NSString *)description; +@end diff --git a/CocoaCamp/GoogleToolboxMac/GDataXMLNode.m b/CocoaCamp/GoogleToolboxMac/GDataXMLNode.m new file mode 100644 index 0000000..1ab88e1 --- /dev/null +++ b/CocoaCamp/GoogleToolboxMac/GDataXMLNode.m @@ -0,0 +1,1828 @@ +/* Copyright (c) 2008 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define GDATAXMLNODE_DEFINE_GLOBALS 1 +#import "GDataXMLNode.h" + +@class NSArray, NSDictionary, NSError, NSString, NSURL; +@class GDataXMLElement, GDataXMLDocument; + + +static const int kGDataXMLParseOptions = (XML_PARSE_NOCDATA | XML_PARSE_NOBLANKS); + +// dictionary key callbacks for string cache +static const void *StringCacheKeyRetainCallBack(CFAllocatorRef allocator, const void *str); +static void StringCacheKeyReleaseCallBack(CFAllocatorRef allocator, const void *str); +static CFStringRef StringCacheKeyCopyDescriptionCallBack(const void *str); +static Boolean StringCacheKeyEqualCallBack(const void *str1, const void *str2); +static CFHashCode StringCacheKeyHashCallBack(const void *str); + +// isEqual: has the fatal flaw that it doesn't deal well with the received +// being nil. We'll use this utility instead. + +// Static copy of AreEqualOrBothNil from GDataObject.m, so that using +// GDataXMLNode does not require pulling in all of GData. +static BOOL AreEqualOrBothNilPrivate(id obj1, id obj2) { + if (obj1 == obj2) { + return YES; + } + if (obj1 && obj2) { + return [obj1 isEqual:obj2]; + } + return NO; +} + + +// convert NSString* to xmlChar* +// +// the "Get" part implies that ownership remains with str + +static xmlChar* GDataGetXMLString(NSString *str) { + xmlChar* result = (xmlChar *)[str UTF8String]; + return result; +} + +// Make a fake qualified name we use as local name internally in libxml +// data structures when there's no actual namespace node available to point to +// from an element or attribute node +// +// Returns an autoreleased NSString* + +static NSString *GDataFakeQNameForURIAndName(NSString *theURI, NSString *name) { + + NSString *localName = [GDataXMLNode localNameForName:name]; + NSString *fakeQName = [NSString stringWithFormat:@"{%@}:%@", + theURI, localName]; + return fakeQName; +} + + +// libxml2 offers xmlSplitQName2, but that searches forwards. Since we may +// be searching for a whole URI shoved in as a prefix, like +// {http://foo}:name +// we'll search for the prefix in backwards from the end of the qualified name +// +// returns a copy of qname as the local name if there's no prefix +static xmlChar *SplitQNameReverse(const xmlChar *qname, xmlChar **prefix) { + + // search backwards for a colon + int qnameLen = xmlStrlen(qname); + for (int idx = qnameLen - 1; idx >= 0; idx--) { + + if (qname[idx] == ':') { + + // found the prefix; copy the prefix, if requested + if (prefix != NULL) { + if (idx > 0) { + *prefix = xmlStrsub(qname, 0, idx); + } else { + *prefix = NULL; + } + } + + if (idx < qnameLen - 1) { + // return a copy of the local name + xmlChar *localName = xmlStrsub(qname, idx + 1, qnameLen - idx - 1); + return localName; + } else { + return NULL; + } + } + } + + // no colon found, so the qualified name is the local name + xmlChar *qnameCopy = xmlStrdup(qname); + return qnameCopy; +} + +@interface GDataXMLNode (PrivateMethods) + +// consuming a node implies it will later be freed when the instance is +// dealloc'd; borrowing it implies that ownership and disposal remain the +// job of the supplier of the node + ++ (id)nodeConsumingXMLNode:(xmlNodePtr)theXMLNode; +- (id)initConsumingXMLNode:(xmlNodePtr)theXMLNode; + ++ (id)nodeBorrowingXMLNode:(xmlNodePtr)theXMLNode; +- (id)initBorrowingXMLNode:(xmlNodePtr)theXMLNode; + +// getters of the underlying node +- (xmlNodePtr)XMLNode; +- (xmlNodePtr)XMLNodeCopy; + +// search for an underlying attribute +- (GDataXMLNode *)attributeForXMLNode:(xmlAttrPtr)theXMLNode; + +// return an NSString for an xmlChar*, using our strings cache in the +// document +- (NSString *)stringFromXMLString:(const xmlChar *)chars; + +// setter/getter of the dealloc flag for the underlying node +- (BOOL)shouldFreeXMLNode; +- (void)setShouldFreeXMLNode:(BOOL)flag; + +@end + +@interface GDataXMLElement (PrivateMethods) + ++ (void)fixUpNamespacesForNode:(xmlNodePtr)nodeToFix + graftingToTreeNode:(xmlNodePtr)graftPointNode; +@end + +@implementation GDataXMLNode + ++ (void)load { + xmlInitParser(); +} + +// Note on convenience methods for making stand-alone element and +// attribute nodes: +// +// Since we're making a node from scratch, we don't +// have any namespace info. So the namespace prefix, if +// any, will just be slammed into the node name. +// We'll rely on the -addChild method below to remove +// the namespace prefix and replace it with a proper ns +// pointer. + ++ (GDataXMLElement *)elementWithName:(NSString *)name { + + xmlNodePtr theNewNode = xmlNewNode(NULL, // namespace + GDataGetXMLString(name)); + if (theNewNode) { + // succeeded + return [self nodeConsumingXMLNode:theNewNode]; + } + return nil; +} + ++ (GDataXMLElement *)elementWithName:(NSString *)name stringValue:(NSString *)value { + + xmlNodePtr theNewNode = xmlNewNode(NULL, // namespace + GDataGetXMLString(name)); + if (theNewNode) { + + xmlNodePtr textNode = xmlNewText(GDataGetXMLString(value)); + if (textNode) { + + xmlNodePtr temp = xmlAddChild(theNewNode, textNode); + if (temp) { + // succeeded + return [self nodeConsumingXMLNode:theNewNode]; + } + } + + // failed; free the node and any children + xmlFreeNode(theNewNode); + } + return nil; +} + ++ (GDataXMLElement *)elementWithName:(NSString *)name URI:(NSString *)theURI { + + // since we don't know a prefix yet, shove in the whole URI; we'll look for + // a proper namespace ptr later when addChild calls fixUpNamespacesForNode + + NSString *fakeQName = GDataFakeQNameForURIAndName(theURI, name); + + xmlNodePtr theNewNode = xmlNewNode(NULL, // namespace + GDataGetXMLString(fakeQName)); + if (theNewNode) { + return [self nodeConsumingXMLNode:theNewNode]; + } + return nil; +} + ++ (id)attributeWithName:(NSString *)name stringValue:(NSString *)value { + + xmlChar *xmlName = GDataGetXMLString(name); + xmlChar *xmlValue = GDataGetXMLString(value); + + xmlAttrPtr theNewAttr = xmlNewProp(NULL, // parent node for the attr + xmlName, xmlValue); + if (theNewAttr) { + return [self nodeConsumingXMLNode:(xmlNodePtr) theNewAttr]; + } + + return nil; +} + ++ (id)attributeWithName:(NSString *)name URI:(NSString *)attributeURI stringValue:(NSString *)value { + + // since we don't know a prefix yet, shove in the whole URI; we'll look for + // a proper namespace ptr later when addChild calls fixUpNamespacesForNode + + NSString *fakeQName = GDataFakeQNameForURIAndName(attributeURI, name); + + xmlChar *xmlName = GDataGetXMLString(fakeQName); + xmlChar *xmlValue = GDataGetXMLString(value); + + xmlAttrPtr theNewAttr = xmlNewProp(NULL, // parent node for the attr + xmlName, xmlValue); + if (theNewAttr) { + return [self nodeConsumingXMLNode:(xmlNodePtr) theNewAttr]; + } + + return nil; +} + ++ (id)textWithStringValue:(NSString *)value { + + xmlNodePtr theNewText = xmlNewText(GDataGetXMLString(value)); + if (theNewText) { + return [self nodeConsumingXMLNode:theNewText]; + } + return nil; +} + ++ (id)namespaceWithName:(NSString *)name stringValue:(NSString *)value { + + xmlChar *href = GDataGetXMLString(value); + xmlChar *prefix; + + if ([name length] > 0) { + prefix = GDataGetXMLString(name); + } else { + // default namespace is represented by a nil prefix + prefix = nil; + } + + xmlNsPtr theNewNs = xmlNewNs(NULL, // parent node + href, prefix); + if (theNewNs) { + return [self nodeConsumingXMLNode:(xmlNodePtr) theNewNs]; + } + return nil; +} + ++ (id)nodeConsumingXMLNode:(xmlNodePtr)theXMLNode { + Class theClass; + + if (theXMLNode->type == XML_ELEMENT_NODE) { + theClass = [GDataXMLElement class]; + } else { + theClass = [GDataXMLNode class]; + } + return [[[theClass alloc] initConsumingXMLNode:theXMLNode] autorelease]; +} + +- (id)initConsumingXMLNode:(xmlNodePtr)theXMLNode { + self = [super init]; + if (self) { + xmlNode_ = theXMLNode; + shouldFreeXMLNode_ = YES; + } + return self; +} + ++ (id)nodeBorrowingXMLNode:(xmlNodePtr)theXMLNode { + Class theClass; + if (theXMLNode->type == XML_ELEMENT_NODE) { + theClass = [GDataXMLElement class]; + } else { + theClass = [GDataXMLNode class]; + } + + return [[[theClass alloc] initBorrowingXMLNode:theXMLNode] autorelease]; +} + +- (id)initBorrowingXMLNode:(xmlNodePtr)theXMLNode { + self = [super init]; + if (self) { + xmlNode_ = theXMLNode; + shouldFreeXMLNode_ = NO; + } + return self; +} + +- (void)releaseCachedValues { + + [cachedName_ release]; + cachedName_ = nil; + + [cachedChildren_ release]; + cachedChildren_ = nil; + + [cachedAttributes_ release]; + cachedAttributes_ = nil; +} + + +// convert xmlChar* to NSString* +// +// returns an autoreleased NSString*, from the current node's document strings +// cache if possible +- (NSString *)stringFromXMLString:(const xmlChar *)chars { + +#if DEBUG + NSCAssert(chars != NULL, @"GDataXMLNode sees an unexpected empty string"); +#endif + if (chars == NULL) return nil; + + CFMutableDictionaryRef cacheDict = NULL; + + NSString *result = nil; + + if (xmlNode_ != NULL + && (xmlNode_->type == XML_ELEMENT_NODE + || xmlNode_->type == XML_ATTRIBUTE_NODE + || xmlNode_->type == XML_TEXT_NODE)) { + // there is no xmlDocPtr in XML_NAMESPACE_DECL nodes, + // so we can't cache the text of those + + // look for a strings cache in the document + // + // the cache is in the document's user-defined _private field + + if (xmlNode_->doc != NULL) { + + cacheDict = xmlNode_->doc->_private; + + if (cacheDict) { + + // this document has a strings cache + result = (NSString *) CFDictionaryGetValue(cacheDict, chars); + if (result) { + // we found the xmlChar string in the cache; return the previously + // allocated NSString, rather than allocate a new one + return result; + } + } + } + } + + // allocate a new NSString for this xmlChar* + result = [NSString stringWithUTF8String:(const char *) chars]; + if (cacheDict) { + // save the string in the document's string cache + CFDictionarySetValue(cacheDict, chars, result); + } + + return result; +} + +- (void)dealloc { + + if (xmlNode_ && shouldFreeXMLNode_) { + xmlFreeNode(xmlNode_); + } + + [self releaseCachedValues]; + [super dealloc]; +} + +#pragma mark - + +- (void)setStringValue:(NSString *)str { + if (xmlNode_ != NULL && str != nil) { + + if (xmlNode_->type == XML_NAMESPACE_DECL) { + + // for a namespace node, the value is the namespace URI + xmlNsPtr nsNode = (xmlNsPtr)xmlNode_; + + if (nsNode->href != NULL) xmlFree((char *)nsNode->href); + + nsNode->href = xmlStrdup(GDataGetXMLString(str)); + + } else { + + // attribute or element node + + // do we need to call xmlEncodeSpecialChars? + xmlNodeSetContent(xmlNode_, GDataGetXMLString(str)); + } + } +} + +- (NSString *)stringValue { + + NSString *str = nil; + + if (xmlNode_ != NULL) { + + if (xmlNode_->type == XML_NAMESPACE_DECL) { + + // for a namespace node, the value is the namespace URI + xmlNsPtr nsNode = (xmlNsPtr)xmlNode_; + + str = [self stringFromXMLString:(nsNode->href)]; + + } else { + + // attribute or element node + xmlChar* chars = xmlNodeGetContent(xmlNode_); + if (chars) { + + str = [self stringFromXMLString:chars]; + + xmlFree(chars); + } + } + } + return str; +} + +- (NSString *)XMLString { + + NSString *str = nil; + + if (xmlNode_ != NULL) { + + xmlBufferPtr buff = xmlBufferCreate(); + if (buff) { + + xmlDocPtr doc = NULL; + int level = 0; + int format = 0; + + int result = xmlNodeDump(buff, doc, xmlNode_, level, format); + + if (result > -1) { + str = [[[NSString alloc] initWithBytes:(xmlBufferContent(buff)) + length:(xmlBufferLength(buff)) + encoding:NSUTF8StringEncoding] autorelease]; + } + xmlBufferFree(buff); + } + } + + // remove leading and trailing whitespace + NSCharacterSet *ws = [NSCharacterSet whitespaceAndNewlineCharacterSet]; + NSString *trimmed = [str stringByTrimmingCharactersInSet:ws]; + return trimmed; +} + +- (NSString *)localName { + NSString *str = nil; + + if (xmlNode_ != NULL) { + + str = [self stringFromXMLString:(xmlNode_->name)]; + + // if this is part of a detached subtree, str may have a prefix in it + str = [[self class] localNameForName:str]; + } + return str; +} + +- (NSString *)prefix { + + NSString *str = nil; + + if (xmlNode_ != NULL) { + + // the default namespace's prefix is an empty string, though libxml + // represents it as NULL for ns->prefix + str = @""; + + if (xmlNode_->ns != NULL && xmlNode_->ns->prefix != NULL) { + str = [self stringFromXMLString:(xmlNode_->ns->prefix)]; + } + } + return str; +} + +- (NSString *)URI { + + NSString *str = nil; + + if (xmlNode_ != NULL) { + + if (xmlNode_->ns != NULL && xmlNode_->ns->href != NULL) { + str = [self stringFromXMLString:(xmlNode_->ns->href)]; + } + } + return str; +} + +- (NSString *)qualifiedName { + // internal utility + + NSString *str = nil; + + if (xmlNode_ != NULL) { + if (xmlNode_->type == XML_NAMESPACE_DECL) { + + // name of a namespace node + xmlNsPtr nsNode = (xmlNsPtr)xmlNode_; + + // null is the default namespace; one is the loneliest number + if (nsNode->prefix == NULL) { + str = @""; + } + else { + str = [self stringFromXMLString:(nsNode->prefix)]; + } + + } else if (xmlNode_->ns != NULL && xmlNode_->ns->prefix != NULL) { + + // name of a non-namespace node + + // has a prefix + char *qname; + if (asprintf(&qname, "%s:%s", (const char *)xmlNode_->ns->prefix, + xmlNode_->name) != -1) { + str = [self stringFromXMLString:(const xmlChar *)qname]; + free(qname); + } + } else { + // lacks a prefix + str = [self stringFromXMLString:(xmlNode_->name)]; + } + } + + return str; +} + +- (NSString *)name { + + if (cachedName_ != nil) { + return cachedName_; + } + + NSString *str = [self qualifiedName]; + + cachedName_ = [str retain]; + + return str; +} + ++ (NSString *)localNameForName:(NSString *)name { + if (name != nil) { + + NSRange range = [name rangeOfString:@":"]; + if (range.location != NSNotFound) { + + // found a colon + if (range.location + 1 < [name length]) { + NSString *localName = [name substringFromIndex:(range.location + 1)]; + return localName; + } + } + } + return name; +} + ++ (NSString *)prefixForName:(NSString *)name { + if (name != nil) { + + NSRange range = [name rangeOfString:@":"]; + if (range.location != NSNotFound) { + + NSString *prefix = [name substringToIndex:(range.location)]; + return prefix; + } + } + return nil; +} + +- (NSUInteger)childCount { + + if (cachedChildren_ != nil) { + return [cachedChildren_ count]; + } + + if (xmlNode_ != NULL) { + + unsigned int count = 0; + + xmlNodePtr currChild = xmlNode_->children; + + while (currChild != NULL) { + ++count; + currChild = currChild->next; + } + return count; + } + return 0; +} + +- (NSArray *)children { + + if (cachedChildren_ != nil) { + return cachedChildren_; + } + + NSMutableArray *array = nil; + + if (xmlNode_ != NULL) { + + xmlNodePtr currChild = xmlNode_->children; + + while (currChild != NULL) { + GDataXMLNode *node = [GDataXMLNode nodeBorrowingXMLNode:currChild]; + + if (array == nil) { + array = [NSMutableArray arrayWithObject:node]; + } else { + [array addObject:node]; + } + + currChild = currChild->next; + } + + cachedChildren_ = [array retain]; + } + return array; +} + +- (GDataXMLNode *)childAtIndex:(unsigned)index { + + NSArray *children = [self children]; + + if ([children count] > index) { + + return [children objectAtIndex:index]; + } + return nil; +} + +- (GDataXMLNodeKind)kind { + if (xmlNode_ != NULL) { + xmlElementType nodeType = xmlNode_->type; + switch (nodeType) { + case XML_ELEMENT_NODE: return GDataXMLElementKind; + case XML_ATTRIBUTE_NODE: return GDataXMLAttributeKind; + case XML_TEXT_NODE: return GDataXMLTextKind; + case XML_CDATA_SECTION_NODE: return GDataXMLTextKind; + case XML_ENTITY_REF_NODE: return GDataXMLEntityDeclarationKind; + case XML_ENTITY_NODE: return GDataXMLEntityDeclarationKind; + case XML_PI_NODE: return GDataXMLProcessingInstructionKind; + case XML_COMMENT_NODE: return GDataXMLCommentKind; + case XML_DOCUMENT_NODE: return GDataXMLDocumentKind; + case XML_DOCUMENT_TYPE_NODE: return GDataXMLDocumentKind; + case XML_DOCUMENT_FRAG_NODE: return GDataXMLDocumentKind; + case XML_NOTATION_NODE: return GDataXMLNotationDeclarationKind; + case XML_HTML_DOCUMENT_NODE: return GDataXMLDocumentKind; + case XML_DTD_NODE: return GDataXMLDTDKind; + case XML_ELEMENT_DECL: return GDataXMLElementDeclarationKind; + case XML_ATTRIBUTE_DECL: return GDataXMLAttributeDeclarationKind; + case XML_ENTITY_DECL: return GDataXMLEntityDeclarationKind; + case XML_NAMESPACE_DECL: return GDataXMLNamespaceKind; + case XML_XINCLUDE_START: return GDataXMLProcessingInstructionKind; + case XML_XINCLUDE_END: return GDataXMLProcessingInstructionKind; + case XML_DOCB_DOCUMENT_NODE: return GDataXMLDocumentKind; + } + } + return GDataXMLInvalidKind; +} + +- (NSArray *)nodesForXPath:(NSString *)xpath error:(NSError **)error { + // call through with no explicit namespace dictionary; that will register the + // root node's namespaces + return [self nodesForXPath:xpath namespaces:nil error:error]; +} + +- (NSArray *)nodesForXPath:(NSString *)xpath + namespaces:(NSDictionary *)namespaces + error:(NSError **)error { + + NSMutableArray *array = nil; + NSInteger errorCode = -1; + NSDictionary *errorInfo = nil; + + // xmlXPathNewContext requires a doc for its context, but if our elements + // are created from GDataXMLElement's initWithXMLString there may not be + // a document. (We may later decide that we want to stuff the doc used + // there into a GDataXMLDocument and retain it, but we don't do that now.) + // + // We'll temporarily make a document to use for the xpath context. + + xmlDocPtr tempDoc = NULL; + xmlNodePtr topParent = NULL; + + if (xmlNode_->doc == NULL) { + tempDoc = xmlNewDoc(NULL); + if (tempDoc) { + // find the topmost node of the current tree to make the root of + // our temporary document + topParent = xmlNode_; + while (topParent->parent != NULL) { + topParent = topParent->parent; + } + xmlDocSetRootElement(tempDoc, topParent); + } + } + + if (xmlNode_ != NULL && xmlNode_->doc != NULL) { + + xmlXPathContextPtr xpathCtx = xmlXPathNewContext(xmlNode_->doc); + if (xpathCtx) { + // anchor at our current node + xpathCtx->node = xmlNode_; + + // if a namespace dictionary was provided, register its contents + if (namespaces) { + // the dictionary keys are prefixes; the values are URIs + for (NSString *prefix in namespaces) { + NSString *uri = [namespaces objectForKey:prefix]; + + xmlChar *prefixChars = (xmlChar *) [prefix UTF8String]; + xmlChar *uriChars = (xmlChar *) [uri UTF8String]; + int result = xmlXPathRegisterNs(xpathCtx, prefixChars, uriChars); + if (result != 0) { +#if DEBUG + NSCAssert1(result == 0, @"GDataXMLNode XPath namespace %@ issue", + prefix); +#endif + } + } + } else { + // no namespace dictionary was provided + // + // register the namespaces of this node, if it's an element, or of + // this node's root element, if it's a document + xmlNodePtr nsNodePtr = xmlNode_; + if (xmlNode_->type == XML_DOCUMENT_NODE) { + nsNodePtr = xmlDocGetRootElement((xmlDocPtr) xmlNode_); + } + + // step through the namespaces, if any, and register each with the + // xpath context + if (nsNodePtr != NULL) { + for (xmlNsPtr nsPtr = nsNodePtr->ns; nsPtr != NULL; nsPtr = nsPtr->next) { + + // default namespace is nil in the tree, but there's no way to + // register a default namespace, so we'll register a fake one, + // _def_ns + const xmlChar* prefix = nsPtr->prefix; + if (prefix == NULL) { + prefix = (xmlChar*) kGDataXMLXPathDefaultNamespacePrefix; + } + + int result = xmlXPathRegisterNs(xpathCtx, prefix, nsPtr->href); + if (result != 0) { +#if DEBUG + NSCAssert1(result == 0, @"GDataXMLNode XPath namespace %@ issue", + prefix); +#endif + } + } + } + } + + // now evaluate the path + xmlXPathObjectPtr xpathObj; + xpathObj = xmlXPathEval(GDataGetXMLString(xpath), xpathCtx); + if (xpathObj) { + + // we have some result from the search + array = [NSMutableArray array]; + + xmlNodeSetPtr nodeSet = xpathObj->nodesetval; + if (nodeSet) { + + // add each node in the result set to our array + for (int index = 0; index < nodeSet->nodeNr; index++) { + + xmlNodePtr currNode = nodeSet->nodeTab[index]; + + GDataXMLNode *node = [GDataXMLNode nodeBorrowingXMLNode:currNode]; + if (node) { + [array addObject:node]; + } + } + } + xmlXPathFreeObject(xpathObj); + } else { + // provide an error for failed evaluation + const char *msg = xpathCtx->lastError.str1; + errorCode = xpathCtx->lastError.code; + if (msg) { + NSString *errStr = [NSString stringWithUTF8String:msg]; + errorInfo = [NSDictionary dictionaryWithObject:errStr + forKey:@"error"]; + } + } + + xmlXPathFreeContext(xpathCtx); + } + } else { + // not a valid node for using XPath + errorInfo = [NSDictionary dictionaryWithObject:@"invalid node" + forKey:@"error"]; + } + + if (array == nil && error != nil) { + *error = [NSError errorWithDomain:@"com.google.GDataXML" + code:errorCode + userInfo:errorInfo]; + } + + if (tempDoc != NULL) { + xmlUnlinkNode(topParent); + xmlSetTreeDoc(topParent, NULL); + xmlFreeDoc(tempDoc); + } + return array; +} + +- (NSString *)description { + int nodeType = (xmlNode_ ? (int)xmlNode_->type : -1); + + return [NSString stringWithFormat:@"%@ %p: {type:%d name:%@ xml:\"%@\"}", + [self class], self, nodeType, [self name], [self XMLString]]; +} + +- (id)copyWithZone:(NSZone *)zone { + + xmlNodePtr nodeCopy = [self XMLNodeCopy]; + + if (nodeCopy != NULL) { + return [[[self class] alloc] initConsumingXMLNode:nodeCopy]; + } + return nil; +} + +- (BOOL)isEqual:(GDataXMLNode *)other { + if (self == other) return YES; + if (![other isKindOfClass:[GDataXMLNode class]]) return NO; + + return [self XMLNode] == [other XMLNode] + || ([self kind] == [other kind] + && AreEqualOrBothNilPrivate([self name], [other name]) + && [[self children] count] == [[other children] count]); + +} + +- (NSUInteger)hash { + return (NSUInteger) (void *) [GDataXMLNode class]; +} + +- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector { + return [super methodSignatureForSelector:selector]; +} + +#pragma mark - + +- (xmlNodePtr)XMLNodeCopy { + if (xmlNode_ != NULL) { + + // Note: libxml will create a new copy of namespace nodes (xmlNs records) + // and attach them to this copy in order to keep namespaces within this + // node subtree copy value. + + xmlNodePtr nodeCopy = xmlCopyNode(xmlNode_, 1); // 1 = recursive + return nodeCopy; + } + return NULL; +} + +- (xmlNodePtr)XMLNode { + return xmlNode_; +} + +- (BOOL)shouldFreeXMLNode { + return shouldFreeXMLNode_; +} + +- (void)setShouldFreeXMLNode:(BOOL)flag { + shouldFreeXMLNode_ = flag; +} + +@end + + + +@implementation GDataXMLElement + +- (id)initWithXMLString:(NSString *)str error:(NSError **)error { + self = [super init]; + if (self) { + + const char *utf8Str = [str UTF8String]; + // NOTE: We are assuming a string length that fits into an int + xmlDocPtr doc = xmlReadMemory(utf8Str, (int)strlen(utf8Str), NULL, // URL + NULL, // encoding + kGDataXMLParseOptions); + if (doc == NULL) { + if (error) { + // TODO(grobbins) use xmlSetGenericErrorFunc to capture error + } + } else { + // copy the root node from the doc + xmlNodePtr root = xmlDocGetRootElement(doc); + if (root) { + xmlNode_ = xmlCopyNode(root, 1); // 1: recursive + } + xmlFreeDoc(doc); + } + + + if (xmlNode_ == NULL) { + // failure + if (error) { + *error = [NSError errorWithDomain:@"com.google.GDataXML" + code:-1 + userInfo:nil]; + } + [self release]; + return nil; + } + } + return self; +} + +- (NSArray *)namespaces { + + NSMutableArray *array = nil; + + if (xmlNode_ != NULL && xmlNode_->nsDef != NULL) { + + xmlNsPtr currNS = xmlNode_->nsDef; + while (currNS != NULL) { + + // add this prefix/URI to the list, unless it's the implicit xml prefix + if (!xmlStrEqual(currNS->prefix, (const xmlChar *) "xml")) { + GDataXMLNode *node = [GDataXMLNode nodeBorrowingXMLNode:(xmlNodePtr) currNS]; + + if (array == nil) { + array = [NSMutableArray arrayWithObject:node]; + } else { + [array addObject:node]; + } + } + + currNS = currNS->next; + } + } + return array; +} + +- (void)setNamespaces:(NSArray *)namespaces { + + if (xmlNode_ != NULL) { + + [self releaseCachedValues]; + + // remove previous namespaces + if (xmlNode_->nsDef) { + xmlFreeNsList(xmlNode_->nsDef); + xmlNode_->nsDef = NULL; + } + + // add a namespace for each object in the array + NSEnumerator *enumerator = [namespaces objectEnumerator]; + GDataXMLNode *namespace; + while ((namespace = [enumerator nextObject]) != nil) { + + xmlNsPtr ns = (xmlNsPtr) [namespace XMLNode]; + if (ns) { + (void)xmlNewNs(xmlNode_, ns->href, ns->prefix); + } + } + + // we may need to fix this node's own name; the graft point is where + // the namespace search starts, so that points to this node too + [[self class] fixUpNamespacesForNode:xmlNode_ + graftingToTreeNode:xmlNode_]; + } +} + +- (void)addNamespace:(GDataXMLNode *)aNamespace { + + if (xmlNode_ != NULL) { + + [self releaseCachedValues]; + + xmlNsPtr ns = (xmlNsPtr) [aNamespace XMLNode]; + if (ns) { + (void)xmlNewNs(xmlNode_, ns->href, ns->prefix); + + // we may need to fix this node's own name; the graft point is where + // the namespace search starts, so that points to this node too + [[self class] fixUpNamespacesForNode:xmlNode_ + graftingToTreeNode:xmlNode_]; + } + } +} + +- (void)addChild:(GDataXMLNode *)child { + if ([child kind] == GDataXMLAttributeKind) { + [self addAttribute:child]; + return; + } + + if (xmlNode_ != NULL) { + + [self releaseCachedValues]; + + xmlNodePtr childNodeCopy = [child XMLNodeCopy]; + if (childNodeCopy) { + + xmlNodePtr resultNode = xmlAddChild(xmlNode_, childNodeCopy); + if (resultNode == NULL) { + + // failed to add + xmlFreeNode(childNodeCopy); + + } else { + // added this child subtree successfully; see if it has + // previously-unresolved namespace prefixes that can now be fixed up + [[self class] fixUpNamespacesForNode:childNodeCopy + graftingToTreeNode:xmlNode_]; + } + } + } +} + +- (void)removeChild:(GDataXMLNode *)child { + // this is safe for attributes too + if (xmlNode_ != NULL) { + + [self releaseCachedValues]; + + xmlNodePtr node = [child XMLNode]; + + xmlUnlinkNode(node); + + // if the child node was borrowing its xmlNodePtr, then we need to + // explicitly free it, since there is probably no owning object that will + // free it on dealloc + if (![child shouldFreeXMLNode]) { + xmlFreeNode(node); + } + } +} + +- (NSArray *)elementsForName:(NSString *)name { + + NSString *desiredName = name; + + if (xmlNode_ != NULL) { + + NSString *prefix = [[self class] prefixForName:desiredName]; + if (prefix) { + + xmlChar* desiredPrefix = GDataGetXMLString(prefix); + + xmlNsPtr foundNS = xmlSearchNs(xmlNode_->doc, xmlNode_, desiredPrefix); + if (foundNS) { + + // we found a namespace; fall back on elementsForLocalName:URI: + // to get the elements + NSString *desiredURI = [self stringFromXMLString:(foundNS->href)]; + NSString *localName = [[self class] localNameForName:desiredName]; + + NSArray *nsArray = [self elementsForLocalName:localName URI:desiredURI]; + return nsArray; + } + } + + // no namespace found for the node's prefix; try an exact match + // for the name argument, including any prefix + NSMutableArray *array = nil; + + // walk our list of cached child nodes + NSArray *children = [self children]; + + for (GDataXMLNode *child in children) { + + xmlNodePtr currNode = [child XMLNode]; + + // find all children which are elements with the desired name + if (currNode->type == XML_ELEMENT_NODE) { + + NSString *qName = [child name]; + if ([qName isEqual:name]) { + + if (array == nil) { + array = [NSMutableArray arrayWithObject:child]; + } else { + [array addObject:child]; + } + } + } + } + return array; + } + return nil; +} + +- (NSArray *)elementsForLocalName:(NSString *)localName URI:(NSString *)URI { + + NSMutableArray *array = nil; + + if (xmlNode_ != NULL && xmlNode_->children != NULL) { + + xmlChar* desiredNSHref = GDataGetXMLString(URI); + xmlChar* requestedLocalName = GDataGetXMLString(localName); + xmlChar* expectedLocalName = requestedLocalName; + + // resolve the URI at the parent level, since usually children won't + // have their own namespace definitions, and we don't want to try to + // resolve it once for every child + xmlNsPtr foundParentNS = xmlSearchNsByHref(xmlNode_->doc, xmlNode_, desiredNSHref); + if (foundParentNS == NULL) { + NSString *fakeQName = GDataFakeQNameForURIAndName(URI, localName); + expectedLocalName = GDataGetXMLString(fakeQName); + } + + NSArray *children = [self children]; + + for (GDataXMLNode *child in children) { + + xmlNodePtr currChildPtr = [child XMLNode]; + + // find all children which are elements with the desired name and + // namespace, or with the prefixed name and a null namespace + if (currChildPtr->type == XML_ELEMENT_NODE) { + + // normally, we can assume the resolution done for the parent will apply + // to the child, as most children do not define their own namespaces + xmlNsPtr childLocalNS = foundParentNS; + xmlChar* childDesiredLocalName = expectedLocalName; + + if (currChildPtr->nsDef != NULL) { + // this child has its own namespace definitons; do a fresh resolve + // of the namespace starting from the child, and see if it differs + // from the resolve done starting from the parent. If the resolve + // finds a different namespace, then override the desired local + // name just for this child. + childLocalNS = xmlSearchNsByHref(xmlNode_->doc, currChildPtr, desiredNSHref); + if (childLocalNS != foundParentNS) { + + // this child does indeed have a different namespace resolution + // result than was found for its parent + if (childLocalNS == NULL) { + // no namespace found + NSString *fakeQName = GDataFakeQNameForURIAndName(URI, localName); + childDesiredLocalName = GDataGetXMLString(fakeQName); + } else { + // a namespace was found; use the original local name requested, + // not a faked one expected from resolving the parent + childDesiredLocalName = requestedLocalName; + } + } + } + + // check if this child's namespace and local name are what we're + // seeking + if (currChildPtr->ns == childLocalNS + && currChildPtr->name != NULL + && xmlStrEqual(currChildPtr->name, childDesiredLocalName)) { + + if (array == nil) { + array = [NSMutableArray arrayWithObject:child]; + } else { + [array addObject:child]; + } + } + } + } + // we return nil, not an empty array, according to docs + } + return array; +} + +- (NSArray *)attributes { + + if (cachedAttributes_ != nil) { + return cachedAttributes_; + } + + NSMutableArray *array = nil; + + if (xmlNode_ != NULL && xmlNode_->properties != NULL) { + + xmlAttrPtr prop = xmlNode_->properties; + while (prop != NULL) { + + GDataXMLNode *node = [GDataXMLNode nodeBorrowingXMLNode:(xmlNodePtr) prop]; + if (array == nil) { + array = [NSMutableArray arrayWithObject:node]; + } else { + [array addObject:node]; + } + + prop = prop->next; + } + + cachedAttributes_ = [array retain]; + } + return array; +} + +- (void)addAttribute:(GDataXMLNode *)attribute { + + if (xmlNode_ != NULL) { + + [self releaseCachedValues]; + + xmlAttrPtr attrPtr = (xmlAttrPtr) [attribute XMLNode]; + if (attrPtr) { + + // ignore this if an attribute with the name is already present, + // similar to NSXMLNode's addAttribute + xmlAttrPtr oldAttr; + + if (attrPtr->ns == NULL) { + oldAttr = xmlHasProp(xmlNode_, attrPtr->name); + } else { + oldAttr = xmlHasNsProp(xmlNode_, attrPtr->name, attrPtr->ns->href); + } + + if (oldAttr == NULL) { + + xmlNsPtr newPropNS = NULL; + + // if this attribute has a namespace, search for a matching namespace + // on the node we're adding to + if (attrPtr->ns != NULL) { + + newPropNS = xmlSearchNsByHref(xmlNode_->doc, xmlNode_, attrPtr->ns->href); + if (newPropNS == NULL) { + // make a new namespace on the parent node, and use that for the + // new attribute + newPropNS = xmlNewNs(xmlNode_, attrPtr->ns->href, attrPtr->ns->prefix); + } + } + + // copy the attribute onto this node + xmlChar *value = xmlNodeGetContent((xmlNodePtr) attrPtr); + xmlAttrPtr newProp = xmlNewNsProp(xmlNode_, newPropNS, attrPtr->name, value); + if (newProp != NULL) { + // we made the property, so clean up the property's namespace + + [[self class] fixUpNamespacesForNode:(xmlNodePtr)newProp + graftingToTreeNode:xmlNode_]; + } + + if (value != NULL) { + xmlFree(value); + } + } + } + } +} + +- (GDataXMLNode *)attributeForXMLNode:(xmlAttrPtr)theXMLNode { + // search the cached attributes list for the GDataXMLNode with + // the underlying xmlAttrPtr + NSArray *attributes = [self attributes]; + + for (GDataXMLNode *attr in attributes) { + + if (theXMLNode == (xmlAttrPtr) [attr XMLNode]) { + return attr; + } + } + + return nil; +} + +- (GDataXMLNode *)attributeForName:(NSString *)name { + + if (xmlNode_ != NULL) { + + xmlAttrPtr attrPtr = xmlHasProp(xmlNode_, GDataGetXMLString(name)); + if (attrPtr == NULL) { + + // can we guarantee that xmlAttrPtrs always have the ns ptr and never + // a namespace as part of the actual attribute name? + + // split the name and its prefix, if any + xmlNsPtr ns = NULL; + NSString *prefix = [[self class] prefixForName:name]; + if (prefix) { + + // find the namespace for this prefix, and search on its URI to find + // the xmlNsPtr + name = [[self class] localNameForName:name]; + ns = xmlSearchNs(xmlNode_->doc, xmlNode_, GDataGetXMLString(prefix)); + } + + const xmlChar* nsURI = ((ns != NULL) ? ns->href : NULL); + attrPtr = xmlHasNsProp(xmlNode_, GDataGetXMLString(name), nsURI); + } + + if (attrPtr) { + GDataXMLNode *attr = [self attributeForXMLNode:attrPtr]; + return attr; + } + } + return nil; +} + +- (GDataXMLNode *)attributeForLocalName:(NSString *)localName + URI:(NSString *)attributeURI { + + if (xmlNode_ != NULL) { + + const xmlChar* name = GDataGetXMLString(localName); + const xmlChar* nsURI = GDataGetXMLString(attributeURI); + + xmlAttrPtr attrPtr = xmlHasNsProp(xmlNode_, name, nsURI); + + if (attrPtr == NULL) { + // if the attribute is in a tree lacking the proper namespace, + // the local name may include the full URI as a prefix + NSString *fakeQName = GDataFakeQNameForURIAndName(attributeURI, localName); + const xmlChar* xmlFakeQName = GDataGetXMLString(fakeQName); + + attrPtr = xmlHasProp(xmlNode_, xmlFakeQName); + } + + if (attrPtr) { + GDataXMLNode *attr = [self attributeForXMLNode:attrPtr]; + return attr; + } + } + return nil; +} + +- (NSString *)resolvePrefixForNamespaceURI:(NSString *)namespaceURI { + + if (xmlNode_ != NULL) { + + xmlChar* desiredNSHref = GDataGetXMLString(namespaceURI); + + xmlNsPtr foundNS = xmlSearchNsByHref(xmlNode_->doc, xmlNode_, desiredNSHref); + if (foundNS) { + + // we found the namespace + if (foundNS->prefix != NULL) { + NSString *prefix = [self stringFromXMLString:(foundNS->prefix)]; + return prefix; + } else { + // empty prefix is default namespace + return @""; + } + } + } + return nil; +} + +#pragma mark Namespace fixup routines + ++ (void)deleteNamespacePtr:(xmlNsPtr)namespaceToDelete + fromXMLNode:(xmlNodePtr)node { + + // utilty routine to remove a namespace pointer from an element's + // namespace definition list. This is just removing the nsPtr + // from the singly-linked list, the node's namespace definitions. + xmlNsPtr currNS = node->nsDef; + xmlNsPtr prevNS = NULL; + + while (currNS != NULL) { + xmlNsPtr nextNS = currNS->next; + + if (namespaceToDelete == currNS) { + + // found it; delete it from the head of the node's ns definition list + // or from the next field of the previous namespace + + if (prevNS != NULL) prevNS->next = nextNS; + else node->nsDef = nextNS; + + xmlFreeNs(currNS); + return; + } + prevNS = currNS; + currNS = nextNS; + } +} + ++ (void)fixQualifiedNamesForNode:(xmlNodePtr)nodeToFix + graftingToTreeNode:(xmlNodePtr)graftPointNode { + + // Replace prefix-in-name with proper namespace pointers + // + // This is an inner routine for fixUpNamespacesForNode: + // + // see if this node's name lacks a namespace and is qualified, and if so, + // see if we can resolve the prefix against the parent + // + // The prefix may either be normal, "gd:foo", or a URI + // "{http://blah.com/}:foo" + + if (nodeToFix->ns == NULL) { + xmlNsPtr foundNS = NULL; + + xmlChar* prefix = NULL; + xmlChar* localName = SplitQNameReverse(nodeToFix->name, &prefix); + if (localName != NULL) { + if (prefix != NULL) { + + // if the prefix is wrapped by { and } then it's a URI + int prefixLen = xmlStrlen(prefix); + if (prefixLen > 2 + && prefix[0] == '{' + && prefix[prefixLen - 1] == '}') { + + // search for the namespace by URI + xmlChar* uri = xmlStrsub(prefix, 1, prefixLen - 2); + + if (uri != NULL) { + foundNS = xmlSearchNsByHref(graftPointNode->doc, graftPointNode, uri); + + xmlFree(uri); + } + } + } + + if (foundNS == NULL) { + // search for the namespace by prefix, even if the prefix is nil + // (nil prefix means to search for the default namespace) + foundNS = xmlSearchNs(graftPointNode->doc, graftPointNode, prefix); + } + + if (foundNS != NULL) { + // we found a namespace, so fix the ns pointer and the local name + xmlSetNs(nodeToFix, foundNS); + xmlNodeSetName(nodeToFix, localName); + } + + if (prefix != NULL) { + xmlFree(prefix); + prefix = NULL; + } + + xmlFree(localName); + } + } +} + ++ (void)fixDuplicateNamespacesForNode:(xmlNodePtr)nodeToFix + graftingToTreeNode:(xmlNodePtr)graftPointNode + namespaceSubstitutionMap:(NSMutableDictionary *)nsMap { + + // Duplicate namespace removal + // + // This is an inner routine for fixUpNamespacesForNode: + // + // If any of this node's namespaces are already defined at the graft point + // level, add that namespace to the map of namespace substitutions + // so it will be replaced in the children below the nodeToFix, and + // delete the namespace record + + if (nodeToFix->type == XML_ELEMENT_NODE) { + + // step through the namespaces defined on this node + xmlNsPtr definedNS = nodeToFix->nsDef; + while (definedNS != NULL) { + + // see if this namespace is already defined higher in the tree, + // with both the same URI and the same prefix; if so, add a mapping for + // it + xmlNsPtr foundNS = xmlSearchNsByHref(graftPointNode->doc, graftPointNode, + definedNS->href); + if (foundNS != NULL + && foundNS != definedNS + && xmlStrEqual(definedNS->prefix, foundNS->prefix)) { + + // store a mapping from this defined nsPtr to the one found higher + // in the tree + [nsMap setObject:[NSValue valueWithPointer:foundNS] + forKey:[NSValue valueWithPointer:definedNS]]; + + // remove this namespace from the ns definition list of this node; + // all child elements and attributes referencing this namespace + // now have a dangling pointer and must be updated (that is done later + // in this method) + // + // before we delete this namespace, move our pointer to the + // next one + xmlNsPtr nsToDelete = definedNS; + definedNS = definedNS->next; + + [self deleteNamespacePtr:nsToDelete fromXMLNode:nodeToFix]; + + } else { + // this namespace wasn't a duplicate; move to the next + definedNS = definedNS->next; + } + } + } + + // if this node's namespace is one we deleted, update it to point + // to someplace better + if (nodeToFix->ns != NULL) { + + NSValue *currNS = [NSValue valueWithPointer:nodeToFix->ns]; + NSValue *replacementNS = [nsMap objectForKey:currNS]; + + if (replacementNS != nil) { + xmlNsPtr replaceNSPtr = [replacementNS pointerValue]; + + xmlSetNs(nodeToFix, replaceNSPtr); + } + } +} + + + ++ (void)fixUpNamespacesForNode:(xmlNodePtr)nodeToFix + graftingToTreeNode:(xmlNodePtr)graftPointNode + namespaceSubstitutionMap:(NSMutableDictionary *)nsMap { + + // This is the inner routine for fixUpNamespacesForNode:graftingToTreeNode: + // + // This routine fixes two issues: + // + // Because we can create nodes with qualified names before adding + // them to the tree that declares the namespace for the prefix, + // we need to set the node namespaces after adding them to the tree. + // + // Because libxml adds namespaces to nodes when it copies them, + // we want to remove redundant namespaces after adding them to + // a tree. + // + // If only the Mac's libxml had xmlDOMWrapReconcileNamespaces, it could do + // namespace cleanup for us + + // We only care about fixing names of elements and attributes + if (nodeToFix->type != XML_ELEMENT_NODE + && nodeToFix->type != XML_ATTRIBUTE_NODE) return; + + // Do the fixes + [self fixQualifiedNamesForNode:nodeToFix + graftingToTreeNode:graftPointNode]; + + [self fixDuplicateNamespacesForNode:nodeToFix + graftingToTreeNode:graftPointNode + namespaceSubstitutionMap:nsMap]; + + if (nodeToFix->type == XML_ELEMENT_NODE) { + + // when fixing element nodes, recurse for each child element and + // for each attribute + xmlNodePtr currChild = nodeToFix->children; + while (currChild != NULL) { + [self fixUpNamespacesForNode:currChild + graftingToTreeNode:graftPointNode + namespaceSubstitutionMap:nsMap]; + currChild = currChild->next; + } + + xmlAttrPtr currProp = nodeToFix->properties; + while (currProp != NULL) { + [self fixUpNamespacesForNode:(xmlNodePtr)currProp + graftingToTreeNode:graftPointNode + namespaceSubstitutionMap:nsMap]; + currProp = currProp->next; + } + } +} + ++ (void)fixUpNamespacesForNode:(xmlNodePtr)nodeToFix + graftingToTreeNode:(xmlNodePtr)graftPointNode { + + // allocate the namespace map that will be passed + // down on recursive calls + NSMutableDictionary *nsMap = [NSMutableDictionary dictionary]; + + [self fixUpNamespacesForNode:nodeToFix + graftingToTreeNode:graftPointNode + namespaceSubstitutionMap:nsMap]; +} + +@end + + +@interface GDataXMLDocument (PrivateMethods) +- (void)addStringsCacheToDoc; +@end + +@implementation GDataXMLDocument + +- (id)initWithXMLString:(NSString *)str options:(unsigned int)mask error:(NSError **)error { + + NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; + GDataXMLDocument *doc = [self initWithData:data options:mask error:error]; + return doc; +} + +- (id)initWithData:(NSData *)data options:(unsigned int)mask error:(NSError **)error { + + self = [super init]; + if (self) { + + const char *baseURL = NULL; + const char *encoding = NULL; + + // NOTE: We are assuming [data length] fits into an int. + xmlDoc_ = xmlReadMemory([data bytes], (int)[data length], baseURL, encoding, + kGDataXMLParseOptions); // TODO(grobbins) map option values + if (xmlDoc_ == NULL) { + if (error) { + *error = [NSError errorWithDomain:@"com.google.GDataXML" + code:-1 + userInfo:nil]; + // TODO(grobbins) use xmlSetGenericErrorFunc to capture error + [self release]; + } + return nil; + } else { + if (error) *error = NULL; + + [self addStringsCacheToDoc]; + } + } + + return self; +} + +- (id)initWithRootElement:(GDataXMLElement *)element { + + self = [super init]; + if (self) { + + xmlDoc_ = xmlNewDoc(NULL); + + (void) xmlDocSetRootElement(xmlDoc_, [element XMLNodeCopy]); + + [self addStringsCacheToDoc]; + } + + return self; +} + +- (void)addStringsCacheToDoc { + // utility routine for init methods + +#if DEBUG + NSCAssert(xmlDoc_ != NULL && xmlDoc_->_private == NULL, + @"GDataXMLDocument cache creation problem"); +#endif + + // add a strings cache as private data for the document + // + // we'll use plain C pointers (xmlChar*) as the keys, and NSStrings + // as the values + CFIndex capacity = 0; // no limit + + CFDictionaryKeyCallBacks keyCallBacks = { + 0, // version + StringCacheKeyRetainCallBack, + StringCacheKeyReleaseCallBack, + StringCacheKeyCopyDescriptionCallBack, + StringCacheKeyEqualCallBack, + StringCacheKeyHashCallBack + }; + + CFMutableDictionaryRef dict = CFDictionaryCreateMutable( + kCFAllocatorDefault, capacity, + &keyCallBacks, &kCFTypeDictionaryValueCallBacks); + + // we'll use the user-defined _private field for our cache + xmlDoc_->_private = dict; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@ %p", [self class], self]; +} + +- (void)dealloc { + if (xmlDoc_ != NULL) { + // release the strings cache + // + // since it's a CF object, were anyone to use this in a GC environment, + // this would need to be released in a finalize method, too + if (xmlDoc_->_private != NULL) { + CFRelease(xmlDoc_->_private); + } + + xmlFreeDoc(xmlDoc_); + } + [super dealloc]; +} + +#pragma mark - + +- (GDataXMLElement *)rootElement { + GDataXMLElement *element = nil; + + if (xmlDoc_ != NULL) { + xmlNodePtr rootNode = xmlDocGetRootElement(xmlDoc_); + if (rootNode) { + element = [GDataXMLElement nodeBorrowingXMLNode:rootNode]; + } + } + return element; +} + +- (NSData *)XMLData { + + if (xmlDoc_ != NULL) { + xmlChar *buffer = NULL; + int bufferSize = 0; + + xmlDocDumpMemory(xmlDoc_, &buffer, &bufferSize); + + if (buffer) { + NSData *data = [NSData dataWithBytes:buffer + length:bufferSize]; + xmlFree(buffer); + return data; + } + } + return nil; +} + +- (void)setVersion:(NSString *)version { + + if (xmlDoc_ != NULL) { + if (xmlDoc_->version != NULL) { + // version is a const char* so we must cast + xmlFree((char *) xmlDoc_->version); + xmlDoc_->version = NULL; + } + + if (version != nil) { + xmlDoc_->version = xmlStrdup(GDataGetXMLString(version)); + } + } +} + +- (void)setCharacterEncoding:(NSString *)encoding { + + if (xmlDoc_ != NULL) { + if (xmlDoc_->encoding != NULL) { + // version is a const char* so we must cast + xmlFree((char *) xmlDoc_->encoding); + xmlDoc_->encoding = NULL; + } + + if (encoding != nil) { + xmlDoc_->encoding = xmlStrdup(GDataGetXMLString(encoding)); + } + } +} + +- (NSArray *)nodesForXPath:(NSString *)xpath error:(NSError **)error { + return [self nodesForXPath:xpath namespaces:nil error:error]; +} + +- (NSArray *)nodesForXPath:(NSString *)xpath + namespaces:(NSDictionary *)namespaces + error:(NSError **)error { + if (xmlDoc_ != NULL) { + GDataXMLNode *docNode = [GDataXMLElement nodeBorrowingXMLNode:(xmlNodePtr)xmlDoc_]; + NSArray *array = [docNode nodesForXPath:xpath + namespaces:namespaces + error:error]; + return array; + } + return nil; +} + +@end + +// +// Dictionary key callbacks for our C-string to NSString cache dictionary +// +static const void *StringCacheKeyRetainCallBack(CFAllocatorRef allocator, const void *str) { + // copy the key + xmlChar* key = xmlStrdup(str); + return key; +} + +static void StringCacheKeyReleaseCallBack(CFAllocatorRef allocator, const void *str) { + // free the key + char *chars = (char *)str; + xmlFree((char *) chars); +} + +static CFStringRef StringCacheKeyCopyDescriptionCallBack(const void *str) { + // make a CFString from the key + CFStringRef cfStr = CFStringCreateWithCString(kCFAllocatorDefault, + (const char *)str, + kCFStringEncodingUTF8); + return cfStr; +} + +static Boolean StringCacheKeyEqualCallBack(const void *str1, const void *str2) { + // compare the key strings + if (str1 == str2) return true; + + int result = xmlStrcmp(str1, str2); + return (result == 0); +} + +static CFHashCode StringCacheKeyHashCallBack(const void *str) { + + // dhb hash, per http://www.cse.yorku.ca/~oz/hash.html + CFHashCode hash = 5381; + int c; + const char *chars = (const char *)str; + + while ((c = *chars++) != 0) { + hash = ((hash << 5) + hash) + c; + } + return hash; +} diff --git a/GTMDefines.h b/CocoaCamp/GoogleToolboxMac/GTMDefines.h similarity index 100% rename from GTMDefines.h rename to CocoaCamp/GoogleToolboxMac/GTMDefines.h diff --git a/GTMNSDictionary+URLArguments.h b/CocoaCamp/GoogleToolboxMac/GTMNSDictionary+URLArguments.h similarity index 100% rename from GTMNSDictionary+URLArguments.h rename to CocoaCamp/GoogleToolboxMac/GTMNSDictionary+URLArguments.h diff --git a/GTMNSDictionary+URLArguments.m b/CocoaCamp/GoogleToolboxMac/GTMNSDictionary+URLArguments.m similarity index 100% rename from GTMNSDictionary+URLArguments.m rename to CocoaCamp/GoogleToolboxMac/GTMNSDictionary+URLArguments.m diff --git a/CocoaCamp/GoogleToolboxMac/GTMNSString+HTML.h b/CocoaCamp/GoogleToolboxMac/GTMNSString+HTML.h new file mode 100644 index 0000000..0374ecc --- /dev/null +++ b/CocoaCamp/GoogleToolboxMac/GTMNSString+HTML.h @@ -0,0 +1,66 @@ +// +// GTMNSString+HTML.h +// Dealing with NSStrings that contain HTML +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +/// Utilities for NSStrings containing HTML +@interface NSString (GTMNSStringHTMLAdditions) + +/// Get a string where internal characters that need escaping for HTML are escaped +// +/// For example, '&' become '&'. This will only cover characters from table +/// A.2.2 of http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Special_characters +/// which is what you want for a unicode encoded webpage. If you have a ascii +/// or non-encoded webpage, please use stringByEscapingAsciiHTML which will +/// encode all characters. +/// +/// For obvious reasons this call is only safe once. +// +// Returns: +// Autoreleased NSString +// +- (NSString *)gtm_stringByEscapingForHTML; + +/// Get a string where internal characters that need escaping for HTML are escaped +// +/// For example, '&' become '&' +/// All non-mapped characters (unicode that don't have a &keyword; mapping) +/// will be converted to the appropriate &#xxx; value. If your webpage is +/// unicode encoded (UTF16 or UTF8) use stringByEscapingHTML instead as it is +/// faster, and produces less bloated and more readable HTML (as long as you +/// are using a unicode compliant HTML reader). +/// +/// For obvious reasons this call is only safe once. +// +// Returns: +// Autoreleased NSString +// +- (NSString *)gtm_stringByEscapingForAsciiHTML; + +/// Get a string where internal characters that are escaped for HTML are unescaped +// +/// For example, '&' becomes '&' +/// Handles and 2 cases as well +/// +// Returns: +// Autoreleased NSString +// +- (NSString *)gtm_stringByUnescapingFromHTML; + +@end \ No newline at end of file diff --git a/CocoaCamp/GoogleToolboxMac/GTMNSString+HTML.m b/CocoaCamp/GoogleToolboxMac/GTMNSString+HTML.m new file mode 100644 index 0000000..c7336a7 --- /dev/null +++ b/CocoaCamp/GoogleToolboxMac/GTMNSString+HTML.m @@ -0,0 +1,522 @@ +// +// GTMNSString+HTML.m +// Dealing with NSStrings that contain HTML +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMDefines.h" +#import "GTMNSString+HTML.h" + +typedef struct { + NSString *escapeSequence; + unichar uchar; +} HTMLEscapeMap; + +// Taken from http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Special_characters +// Ordered by uchar lowest to highest for bsearching +static HTMLEscapeMap gAsciiHTMLEscapeMap[] = { + // A.2.2. Special characters + { @""", 34 }, + { @"&", 38 }, + { @"'", 39 }, + { @"<", 60 }, + { @">", 62 }, + + // A.2.1. Latin-1 characters + { @" ", 160 }, + { @"¡", 161 }, + { @"¢", 162 }, + { @"£", 163 }, + { @"¤", 164 }, + { @"¥", 165 }, + { @"¦", 166 }, + { @"§", 167 }, + { @"¨", 168 }, + { @"©", 169 }, + { @"ª", 170 }, + { @"«", 171 }, + { @"¬", 172 }, + { @"­", 173 }, + { @"®", 174 }, + { @"¯", 175 }, + { @"°", 176 }, + { @"±", 177 }, + { @"²", 178 }, + { @"³", 179 }, + { @"´", 180 }, + { @"µ", 181 }, + { @"¶", 182 }, + { @"·", 183 }, + { @"¸", 184 }, + { @"¹", 185 }, + { @"º", 186 }, + { @"»", 187 }, + { @"¼", 188 }, + { @"½", 189 }, + { @"¾", 190 }, + { @"¿", 191 }, + { @"À", 192 }, + { @"Á", 193 }, + { @"Â", 194 }, + { @"Ã", 195 }, + { @"Ä", 196 }, + { @"Å", 197 }, + { @"Æ", 198 }, + { @"Ç", 199 }, + { @"È", 200 }, + { @"É", 201 }, + { @"Ê", 202 }, + { @"Ë", 203 }, + { @"Ì", 204 }, + { @"Í", 205 }, + { @"Î", 206 }, + { @"Ï", 207 }, + { @"Ð", 208 }, + { @"Ñ", 209 }, + { @"Ò", 210 }, + { @"Ó", 211 }, + { @"Ô", 212 }, + { @"Õ", 213 }, + { @"Ö", 214 }, + { @"×", 215 }, + { @"Ø", 216 }, + { @"Ù", 217 }, + { @"Ú", 218 }, + { @"Û", 219 }, + { @"Ü", 220 }, + { @"Ý", 221 }, + { @"Þ", 222 }, + { @"ß", 223 }, + { @"à", 224 }, + { @"á", 225 }, + { @"â", 226 }, + { @"ã", 227 }, + { @"ä", 228 }, + { @"å", 229 }, + { @"æ", 230 }, + { @"ç", 231 }, + { @"è", 232 }, + { @"é", 233 }, + { @"ê", 234 }, + { @"ë", 235 }, + { @"ì", 236 }, + { @"í", 237 }, + { @"î", 238 }, + { @"ï", 239 }, + { @"ð", 240 }, + { @"ñ", 241 }, + { @"ò", 242 }, + { @"ó", 243 }, + { @"ô", 244 }, + { @"õ", 245 }, + { @"ö", 246 }, + { @"÷", 247 }, + { @"ø", 248 }, + { @"ù", 249 }, + { @"ú", 250 }, + { @"û", 251 }, + { @"ü", 252 }, + { @"ý", 253 }, + { @"þ", 254 }, + { @"ÿ", 255 }, + + // A.2.2. Special characters cont'd + { @"Œ", 338 }, + { @"œ", 339 }, + { @"Š", 352 }, + { @"š", 353 }, + { @"Ÿ", 376 }, + + // A.2.3. Symbols + { @"ƒ", 402 }, + + // A.2.2. Special characters cont'd + { @"ˆ", 710 }, + { @"˜", 732 }, + + // A.2.3. Symbols cont'd + { @"Α", 913 }, + { @"Β", 914 }, + { @"Γ", 915 }, + { @"Δ", 916 }, + { @"Ε", 917 }, + { @"Ζ", 918 }, + { @"Η", 919 }, + { @"Θ", 920 }, + { @"Ι", 921 }, + { @"Κ", 922 }, + { @"Λ", 923 }, + { @"Μ", 924 }, + { @"Ν", 925 }, + { @"Ξ", 926 }, + { @"Ο", 927 }, + { @"Π", 928 }, + { @"Ρ", 929 }, + { @"Σ", 931 }, + { @"Τ", 932 }, + { @"Υ", 933 }, + { @"Φ", 934 }, + { @"Χ", 935 }, + { @"Ψ", 936 }, + { @"Ω", 937 }, + { @"α", 945 }, + { @"β", 946 }, + { @"γ", 947 }, + { @"δ", 948 }, + { @"ε", 949 }, + { @"ζ", 950 }, + { @"η", 951 }, + { @"θ", 952 }, + { @"ι", 953 }, + { @"κ", 954 }, + { @"λ", 955 }, + { @"μ", 956 }, + { @"ν", 957 }, + { @"ξ", 958 }, + { @"ο", 959 }, + { @"π", 960 }, + { @"ρ", 961 }, + { @"ς", 962 }, + { @"σ", 963 }, + { @"τ", 964 }, + { @"υ", 965 }, + { @"φ", 966 }, + { @"χ", 967 }, + { @"ψ", 968 }, + { @"ω", 969 }, + { @"ϑ", 977 }, + { @"ϒ", 978 }, + { @"ϖ", 982 }, + + // A.2.2. Special characters cont'd + { @" ", 8194 }, + { @" ", 8195 }, + { @" ", 8201 }, + { @"‌", 8204 }, + { @"‍", 8205 }, + { @"‎", 8206 }, + { @"‏", 8207 }, + { @"–", 8211 }, + { @"—", 8212 }, + { @"‘", 8216 }, + { @"’", 8217 }, + { @"‚", 8218 }, + { @"“", 8220 }, + { @"”", 8221 }, + { @"„", 8222 }, + { @"†", 8224 }, + { @"‡", 8225 }, + // A.2.3. Symbols cont'd + { @"•", 8226 }, + { @"…", 8230 }, + + // A.2.2. Special characters cont'd + { @"‰", 8240 }, + + // A.2.3. Symbols cont'd + { @"′", 8242 }, + { @"″", 8243 }, + + // A.2.2. Special characters cont'd + { @"‹", 8249 }, + { @"›", 8250 }, + + // A.2.3. Symbols cont'd + { @"‾", 8254 }, + { @"⁄", 8260 }, + + // A.2.2. Special characters cont'd + { @"€", 8364 }, + + // A.2.3. Symbols cont'd + { @"ℑ", 8465 }, + { @"℘", 8472 }, + { @"ℜ", 8476 }, + { @"™", 8482 }, + { @"ℵ", 8501 }, + { @"←", 8592 }, + { @"↑", 8593 }, + { @"→", 8594 }, + { @"↓", 8595 }, + { @"↔", 8596 }, + { @"↵", 8629 }, + { @"⇐", 8656 }, + { @"⇑", 8657 }, + { @"⇒", 8658 }, + { @"⇓", 8659 }, + { @"⇔", 8660 }, + { @"∀", 8704 }, + { @"∂", 8706 }, + { @"∃", 8707 }, + { @"∅", 8709 }, + { @"∇", 8711 }, + { @"∈", 8712 }, + { @"∉", 8713 }, + { @"∋", 8715 }, + { @"∏", 8719 }, + { @"∑", 8721 }, + { @"−", 8722 }, + { @"∗", 8727 }, + { @"√", 8730 }, + { @"∝", 8733 }, + { @"∞", 8734 }, + { @"∠", 8736 }, + { @"∧", 8743 }, + { @"∨", 8744 }, + { @"∩", 8745 }, + { @"∪", 8746 }, + { @"∫", 8747 }, + { @"∴", 8756 }, + { @"∼", 8764 }, + { @"≅", 8773 }, + { @"≈", 8776 }, + { @"≠", 8800 }, + { @"≡", 8801 }, + { @"≤", 8804 }, + { @"≥", 8805 }, + { @"⊂", 8834 }, + { @"⊃", 8835 }, + { @"⊄", 8836 }, + { @"⊆", 8838 }, + { @"⊇", 8839 }, + { @"⊕", 8853 }, + { @"⊗", 8855 }, + { @"⊥", 8869 }, + { @"⋅", 8901 }, + { @"⌈", 8968 }, + { @"⌉", 8969 }, + { @"⌊", 8970 }, + { @"⌋", 8971 }, + { @"⟨", 9001 }, + { @"⟩", 9002 }, + { @"◊", 9674 }, + { @"♠", 9824 }, + { @"♣", 9827 }, + { @"♥", 9829 }, + { @"♦", 9830 } +}; + +// Taken from http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Special_characters +// This is table A.2.2 Special Characters +static HTMLEscapeMap gUnicodeHTMLEscapeMap[] = { + // C0 Controls and Basic Latin + { @""", 34 }, + { @"&", 38 }, + { @"'", 39 }, + { @"<", 60 }, + { @">", 62 }, + + // Latin Extended-A + { @"Œ", 338 }, + { @"œ", 339 }, + { @"Š", 352 }, + { @"š", 353 }, + { @"Ÿ", 376 }, + + // Spacing Modifier Letters + { @"ˆ", 710 }, + { @"˜", 732 }, + + // General Punctuation + { @" ", 8194 }, + { @" ", 8195 }, + { @" ", 8201 }, + { @"‌", 8204 }, + { @"‍", 8205 }, + { @"‎", 8206 }, + { @"‏", 8207 }, + { @"–", 8211 }, + { @"—", 8212 }, + { @"‘", 8216 }, + { @"’", 8217 }, + { @"‚", 8218 }, + { @"“", 8220 }, + { @"”", 8221 }, + { @"„", 8222 }, + { @"†", 8224 }, + { @"‡", 8225 }, + { @"‰", 8240 }, + { @"‹", 8249 }, + { @"›", 8250 }, + { @"€", 8364 }, +}; + + +// Utility function for Bsearching table above +static int EscapeMapCompare(const void *ucharVoid, const void *mapVoid) { + const unichar *uchar = (const unichar*)ucharVoid; + const HTMLEscapeMap *map = (const HTMLEscapeMap*)mapVoid; + int val; + if (*uchar > map->uchar) { + val = 1; + } else if (*uchar < map->uchar) { + val = -1; + } else { + val = 0; + } + return val; +} + +@implementation NSString (GTMNSStringHTMLAdditions) + +- (NSString *)gtm_stringByEscapingHTMLUsingTable:(HTMLEscapeMap*)table + ofSize:(NSUInteger)size + escapingUnicode:(BOOL)escapeUnicode { + NSUInteger length = [self length]; + if (!length) { + return self; + } + + NSMutableString *finalString = [NSMutableString string]; + NSMutableData *data2 = [NSMutableData dataWithCapacity:sizeof(unichar) * length]; + + // this block is common between GTMNSString+HTML and GTMNSString+XML but + // it's so short that it isn't really worth trying to share. + const unichar *buffer = CFStringGetCharactersPtr((CFStringRef)self); + if (!buffer) { + // We want this buffer to be autoreleased. + NSMutableData *data = [NSMutableData dataWithLength:length * sizeof(UniChar)]; + if (!data) { + // COV_NF_START - Memory fail case + _GTMDevLog(@"couldn't alloc buffer"); + return nil; + // COV_NF_END + } + [self getCharacters:[data mutableBytes]]; + buffer = [data bytes]; + } + + if (!buffer || !data2) { + // COV_NF_START + _GTMDevLog(@"Unable to allocate buffer or data2"); + return nil; + // COV_NF_END + } + + unichar *buffer2 = (unichar *)[data2 mutableBytes]; + + NSUInteger buffer2Length = 0; + + for (NSUInteger i = 0; i < length; ++i) { + HTMLEscapeMap *val = bsearch(&buffer[i], table, + size / sizeof(HTMLEscapeMap), + sizeof(HTMLEscapeMap), EscapeMapCompare); + if (val || (escapeUnicode && buffer[i] > 127)) { + if (buffer2Length) { + CFStringAppendCharacters((CFMutableStringRef)finalString, + buffer2, + buffer2Length); + buffer2Length = 0; + } + if (val) { + [finalString appendString:val->escapeSequence]; + } + else { + _GTMDevAssert(escapeUnicode && buffer[i] > 127, @"Illegal Character"); + [finalString appendFormat:@"&#%d;", buffer[i]]; + } + } else { + buffer2[buffer2Length] = buffer[i]; + buffer2Length += 1; + } + } + if (buffer2Length) { + CFStringAppendCharacters((CFMutableStringRef)finalString, + buffer2, + buffer2Length); + } + return finalString; +} + +- (NSString *)gtm_stringByEscapingForHTML { + return [self gtm_stringByEscapingHTMLUsingTable:gUnicodeHTMLEscapeMap + ofSize:sizeof(gUnicodeHTMLEscapeMap) + escapingUnicode:NO]; +} // gtm_stringByEscapingHTML + +- (NSString *)gtm_stringByEscapingForAsciiHTML { + return [self gtm_stringByEscapingHTMLUsingTable:gAsciiHTMLEscapeMap + ofSize:sizeof(gAsciiHTMLEscapeMap) + escapingUnicode:YES]; +} // gtm_stringByEscapingAsciiHTML + +- (NSString *)gtm_stringByUnescapingFromHTML { + NSRange range = NSMakeRange(0, [self length]); + NSRange subrange = [self rangeOfString:@"&" options:NSBackwardsSearch range:range]; + + // if no ampersands, we've got a quick way out + if (subrange.length == 0) return self; + NSMutableString *finalString = [NSMutableString stringWithString:self]; + do { + NSRange semiColonRange = NSMakeRange(subrange.location, NSMaxRange(range) - subrange.location); + semiColonRange = [self rangeOfString:@";" options:0 range:semiColonRange]; + range = NSMakeRange(0, subrange.location); + // if we don't find a semicolon in the range, we don't have a sequence + if (semiColonRange.location == NSNotFound) { + continue; + } + NSRange escapeRange = NSMakeRange(subrange.location, semiColonRange.location - subrange.location + 1); + NSString *escapeString = [self substringWithRange:escapeRange]; + NSUInteger length = [escapeString length]; + // a squence must be longer than 3 (<) and less than 11 (ϑ) + if (length > 3 && length < 11) { + if ([escapeString characterAtIndex:1] == '#') { + unichar char2 = [escapeString characterAtIndex:2]; + if (char2 == 'x' || char2 == 'X') { + // Hex escape squences £ + NSString *hexSequence = [escapeString substringWithRange:NSMakeRange(3, length - 4)]; + NSScanner *scanner = [NSScanner scannerWithString:hexSequence]; + unsigned value; + if ([scanner scanHexInt:&value] && + value < USHRT_MAX && + value > 0 + && [scanner scanLocation] == length - 4) { + unichar uchar = value; + NSString *charString = [NSString stringWithCharacters:&uchar length:1]; + [finalString replaceCharactersInRange:escapeRange withString:charString]; + } + + } else { + // Decimal Sequences { + NSString *numberSequence = [escapeString substringWithRange:NSMakeRange(2, length - 3)]; + NSScanner *scanner = [NSScanner scannerWithString:numberSequence]; + int value; + if ([scanner scanInt:&value] && + value < USHRT_MAX && + value > 0 + && [scanner scanLocation] == length - 3) { + unichar uchar = value; + NSString *charString = [NSString stringWithCharacters:&uchar length:1]; + [finalString replaceCharactersInRange:escapeRange withString:charString]; + } + } + } else { + // "standard" sequences + for (unsigned i = 0; i < sizeof(gAsciiHTMLEscapeMap) / sizeof(HTMLEscapeMap); ++i) { + if ([escapeString isEqualToString:gAsciiHTMLEscapeMap[i].escapeSequence]) { + [finalString replaceCharactersInRange:escapeRange withString:[NSString stringWithCharacters:&gAsciiHTMLEscapeMap[i].uchar length:1]]; + break; + } + } + } + } + } while ((subrange = [self rangeOfString:@"&" options:NSBackwardsSearch range:range]).length != 0); + return finalString; +} // gtm_stringByUnescapingHTML + + + +@end \ No newline at end of file diff --git a/GTMNSString+URLArguments.h b/CocoaCamp/GoogleToolboxMac/GTMNSString+URLArguments.h similarity index 100% rename from GTMNSString+URLArguments.h rename to CocoaCamp/GoogleToolboxMac/GTMNSString+URLArguments.h diff --git a/GTMNSString+URLArguments.m b/CocoaCamp/GoogleToolboxMac/GTMNSString+URLArguments.m similarity index 100% rename from GTMNSString+URLArguments.m rename to CocoaCamp/GoogleToolboxMac/GTMNSString+URLArguments.m diff --git a/CocoaCamp/MainWindow.xib b/CocoaCamp/MainWindow.xib new file mode 100755 index 0000000..9538f82 --- /dev/null +++ b/CocoaCamp/MainWindow.xib @@ -0,0 +1,516 @@ + + + + 1024 + 11B26 + 1617 + 1138 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 534 + + + YES + IBProxyObject + IBUINavigationController + IBUITabBarItem + IBUICustomObject + IBUITabBarController + IBUIWindow + IBUITabBar + IBUIViewController + IBUINavigationItem + IBUINavigationBar + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + IBCocoaTouchFramework + + + + 1316 + + {320, 480} + + + + 1 + MSAxIDEAA + + NO + NO + + IBCocoaTouchFramework + YES + YES + + + + + 2 + NO + + + + 1 + 1 + + IBCocoaTouchFramework + NO + + + Schedule + + NSImage + calendar.png + + IBCocoaTouchFramework + + + + + 1 + 1 + + IBCocoaTouchFramework + NO + + + 256 + {320, 44} + NO + YES + YES + IBCocoaTouchFramework + + + YES + + + + Item + IBCocoaTouchFramework + + + SessionViewController + + 1 + 1 + + IBCocoaTouchFramework + NO + + + + + YES + + + People + + People + + NSImage + group.png + + IBCocoaTouchFramework + + + + ContactExchangeView + + 1 + 1 + + IBCocoaTouchFramework + NO + + + + Flickr + + NSImage + photoIcon.png + + IBCocoaTouchFramework + + + + + 1 + 1 + + IBCocoaTouchFramework + NO + + + 256 + {320, 44} + NO + YES + YES + IBCocoaTouchFramework + + + YES + + + + + Item + IBCocoaTouchFramework + + + + 1 + 1 + + IBCocoaTouchFramework + NO + + + + + Attendees + + You + IBCocoaTouchFramework + + + + + 1 + 1 + + IBCocoaTouchFramework + NO + + + + + 266 + {{0, 431}, {320, 49}} + + + 3 + MCAwAA + + NO + IBCocoaTouchFramework + + + + + + YES + + + window + + + + 9 + + + + delegate + + + + 99 + + + + tabBarController + + + + 113 + + + + + YES + + 0 + + + + + + 2 + + + YES + + + + + -1 + + + File's Owner + + + 3 + + + + + 106 + + + YES + + + + + + + + + + 107 + + + + + -2 + + + + + 124 + + + YES + + + + + + + + 125 + + + + + 126 + + + YES + + + + + + 127 + + + + + 128 + + + + + 129 + + + YES + + + + + + 130 + + + + + 131 + + + YES + + + + + + 132 + + + + + 135 + + + YES + + + + + + + + 136 + + + + + 137 + + + YES + + + + + + 138 + + + + + 139 + + + + + + + YES + + YES + -1.CustomClassName + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 106.IBPluginDependency + 107.IBPluginDependency + 124.IBPluginDependency + 125.IBPluginDependency + 126.CustomClassName + 126.IBPluginDependency + 127.IBPluginDependency + 128.IBPluginDependency + 129.CustomClassName + 129.IBPluginDependency + 130.IBPluginDependency + 131.CustomClassName + 131.IBPluginDependency + 132.IBPluginDependency + 135.IBPluginDependency + 136.IBPluginDependency + 137.CustomClassName + 137.IBPluginDependency + 138.IBPluginDependency + 139.IBPluginDependency + 2.IBAttributePlaceholdersKey + 2.IBPluginDependency + 3.CustomClassName + 3.IBPluginDependency + + + YES + UIApplication + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + SessionViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + AttendeeListViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + AttendeeListViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + FlickrThumbnailView + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + YES + + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + CocoaCampAppDelegate + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 139 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + + YES + + YES + calendar.png + group.png + photoIcon.png + + + YES + {23, 25} + {32, 21} + {30, 30} + + + 534 + + diff --git a/CocoaCamp/Resources/512x512.png b/CocoaCamp/Resources/512x512.png new file mode 100644 index 0000000..cdb7143 Binary files /dev/null and b/CocoaCamp/Resources/512x512.png differ diff --git a/CocoaCamp/Resources/BrandedImages/NAPABA/Napaba-Background.png b/CocoaCamp/Resources/BrandedImages/NAPABA/Napaba-Background.png new file mode 100644 index 0000000..748d10a Binary files /dev/null and b/CocoaCamp/Resources/BrandedImages/NAPABA/Napaba-Background.png differ diff --git a/CocoaCamp/Resources/BrandedImages/NAPABA/Napaba-logo.png b/CocoaCamp/Resources/BrandedImages/NAPABA/Napaba-logo.png new file mode 100644 index 0000000..173fa43 Binary files /dev/null and b/CocoaCamp/Resources/BrandedImages/NAPABA/Napaba-logo.png differ diff --git a/CocoaCamp/Resources/BrandedImages/NAPABA/NapabaHeaderView.xib b/CocoaCamp/Resources/BrandedImages/NAPABA/NapabaHeaderView.xib new file mode 100644 index 0000000..3b5c4eb --- /dev/null +++ b/CocoaCamp/Resources/BrandedImages/NAPABA/NapabaHeaderView.xib @@ -0,0 +1,280 @@ + + + + 1280 + 11B26 + 1938 + 1138 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 933 + + + YES + IBProxyObject + IBUIView + IBUIImageView + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + YES + + + 274 + {{7, -10}, {132, 80}} + + + + _NS:541 + 1 + NO + IBCocoaTouchFramework + + NSImage + Napaba-logo.png + + + + + 292 + + YES + + + 292 + {157, 55} + + + + _NS:567 + 5 + NO + IBCocoaTouchFramework + + NSImage + sustainability.jpg + + + + {{154, 4.5}, {157, 55}} + + + + _NS:180 + + 1 + MSAxIDEgMAA + + NO + IBCocoaTouchFramework + + + {320, 64} + + + + _NS:180 + + 3 + MQA + + 2 + + + YES + IBCocoaTouchFramework + + + + + YES + + + view + + + + 7 + + + + sponsorView + + + + 11 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 3 + + + YES + + + + + Header Sponsor View + + + 8 + + + YES + + + + + + 4 + + + + + 14 + + + + + + + YES + + YES + -1.CustomClassName + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 14.IBPluginDependency + 3.CustomClassName + 3.IBPluginDependency + 3.IBUserGuides + 4.IBPluginDependency + 8.IBPluginDependency + + + YES + UIViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + HeaderSponsorView + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + YES + + + 58 + 1 + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 14 + + + + YES + + HeaderSponsorView + UIView + + sponsorView + UIView + + + sponsorView + + sponsorView + UIView + + + + IBProjectSource + ./Classes/HeaderSponsorView.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + + YES + + YES + Napaba-logo.png + sustainability.jpg + + + YES + {214, 80} + {111, 50} + + + 933 + + diff --git a/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/Allstate_Platinum.jpg b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/Allstate_Platinum.jpg new file mode 100644 index 0000000..d8ce20f Binary files /dev/null and b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/Allstate_Platinum.jpg differ diff --git a/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/AlstonBird_Platinum.jpg b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/AlstonBird_Platinum.jpg new file mode 100644 index 0000000..bae59fb Binary files /dev/null and b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/AlstonBird_Platinum.jpg differ diff --git a/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/Microsoft.jpg b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/Microsoft.jpg new file mode 100644 index 0000000..56bd361 Binary files /dev/null and b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/Microsoft.jpg differ diff --git a/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/Prudential_Platinum.jpg b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/Prudential_Platinum.jpg new file mode 100644 index 0000000..65cb1a7 Binary files /dev/null and b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/Prudential_Platinum.jpg differ diff --git a/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/SchiffHardin_Platinum.jpg b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/SchiffHardin_Platinum.jpg new file mode 100644 index 0000000..ce74c49 Binary files /dev/null and b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/SchiffHardin_Platinum.jpg differ diff --git a/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/Seyfarth_Platinum.jpg b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/Seyfarth_Platinum.jpg new file mode 100644 index 0000000..3d8cfaf Binary files /dev/null and b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/Seyfarth_Platinum.jpg differ diff --git a/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/Walmart_Premier.jpg b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/Walmart_Premier.jpg new file mode 100644 index 0000000..0bca626 Binary files /dev/null and b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/Walmart_Premier.jpg differ diff --git a/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/sustainability.jpg b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/sustainability.jpg new file mode 100644 index 0000000..6499e17 Binary files /dev/null and b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/sustainability.jpg differ diff --git a/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/sustainability@2x.jpg b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/sustainability@2x.jpg new file mode 100644 index 0000000..508555f Binary files /dev/null and b/CocoaCamp/Resources/BrandedImages/NAPABA/sponsor-logos/sustainability@2x.jpg differ diff --git a/Resources/ContactExchangeView.xib b/CocoaCamp/Resources/ContactExchangeView.xib similarity index 100% rename from Resources/ContactExchangeView.xib rename to CocoaCamp/Resources/ContactExchangeView.xib diff --git a/CocoaCamp/Resources/Icon.png b/CocoaCamp/Resources/Icon.png new file mode 100644 index 0000000..5c25946 Binary files /dev/null and b/CocoaCamp/Resources/Icon.png differ diff --git a/CocoaCamp/Resources/Icon@2x.png b/CocoaCamp/Resources/Icon@2x.png new file mode 100644 index 0000000..2c81472 Binary files /dev/null and b/CocoaCamp/Resources/Icon@2x.png differ diff --git a/CocoaCamp/Resources/Napaba512x512.png b/CocoaCamp/Resources/Napaba512x512.png new file mode 100644 index 0000000..ab00dcf Binary files /dev/null and b/CocoaCamp/Resources/Napaba512x512.png differ diff --git a/CocoaCamp/Resources/Photos/Fred.jpg b/CocoaCamp/Resources/Photos/Fred.jpg new file mode 100644 index 0000000..086c3be Binary files /dev/null and b/CocoaCamp/Resources/Photos/Fred.jpg differ diff --git a/CocoaCamp/Resources/SampleWebServiceData/AttendeeListJson.js b/CocoaCamp/Resources/SampleWebServiceData/AttendeeListJson.js new file mode 100644 index 0000000..73bb6cc --- /dev/null +++ b/CocoaCamp/Resources/SampleWebServiceData/AttendeeListJson.js @@ -0,0 +1,39 @@ +[ + { + "Register": { + "last_name":"string", + "first_name":"string", + "company":"string", + "twitter":"string", + "industry":"string", + "email":"string", + "id":"string" + }, + "_comment":"Descriptive Example" + + }, + { + "Register": { + "last_name":"Flintstone", + "first_name":"Fred", + "company":"The Slate Rock and Gravel Company", + "twitter":"@fred", + "industry":"Dinocrane Operator", + "email":"fred@bedrock.com", + "id":"ff7879er" + }, + "_comment":"Real Example" + }, + { + "Register": { + "last_name":"Rubble", + "first_name":"Barney", + "company":"Bedrock TV Reposession", + "twitter":"@barney", + "industry":"Repossession", + "email":"braney@bedrock.com", + "id":"6" + }, + "_comment":"Desscriptive Example" + } + ] \ No newline at end of file diff --git a/CocoaCamp/Resources/SampleWebServiceData/ScheduleJson.js b/CocoaCamp/Resources/SampleWebServiceData/ScheduleJson.js new file mode 100644 index 0000000..a94e4d5 --- /dev/null +++ b/CocoaCamp/Resources/SampleWebServiceData/ScheduleJson.js @@ -0,0 +1,16 @@ +[ + { + "Schedule":{ + "start_time":"string:yyyy-MM-dd HH:mm:ss", + "end_time":"string:yyyy-MM-dd HH:mm:ss", + "Talk":{ + "register_id":"sttring", + "title":"string", + "location":"string", + "Register":{ + "see":"attendeeListSample.Register" + } + } + } + } +] \ No newline at end of file diff --git a/CocoaCamp/Resources/SampleWebServiceData/WordPressScheduleDay.js b/CocoaCamp/Resources/SampleWebServiceData/WordPressScheduleDay.js new file mode 100644 index 0000000..de91c74 --- /dev/null +++ b/CocoaCamp/Resources/SampleWebServiceData/WordPressScheduleDay.js @@ -0,0 +1,2112 @@ +{ "category" : { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" +}, + "count" : 50, + "pages" : 2, + "posts" : [ { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "10:00PM-2:00AM" ] }, + "date" : "2011-08-23 22:54:22", + "excerpt" : "", + "id" : 308, + "modified" : "2011-08-23 22:54:22", + "slug" : "late-night-lounge-series-2", + "status" : "publish", + "tags" : [ ], + "title" : "Late Night Lounge Series", + "title_plain" : "Late Night Lounge Series", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/late-night-lounge-series-2/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "8:30PM-12:00AM" ] }, + "date" : "2011-08-23 22:54:03", + "excerpt" : "", + "id" : 306, + "modified" : "2011-11-04 20:07:38", + "slug" : "poker-tournament", + "status" : "publish", + "tags" : [ ], + "title" : "Poker Tournament (limited to the first 40 paid event registrants)", + "title_plain" : "Poker Tournament (limited to the first 40 paid event registrants)", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/poker-tournament/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "8:30PM-12:00AM" ] }, + "date" : "2011-08-23 22:53:47", + "excerpt" : "", + "id" : 304, + "modified" : "2011-11-04 18:47:19", + "slug" : "game-nightkaraoke", + "status" : "publish", + "tags" : [ ], + "title" : "Game Night/Karaoke", + "title_plain" : "Game Night/Karaoke", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/game-nightkaraoke/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "8:00PM-10:00PM" ] }, + "date" : "2011-08-23 22:48:31", + "excerpt" : "", + "id" : 302, + "modified" : "2011-08-23 22:48:31", + "slug" : "napaba-partnersin-house-counsel-dinner", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA Partners/In-House Counsel Dinner", + "title_plain" : "NAPABA Partners/In-House Counsel Dinner", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-partnersin-house-counsel-dinner/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "8:00PM-10:00PM" ] }, + "date" : "2011-08-23 22:48:26", + "excerpt" : "", + "id" : 865, + "modified" : "2011-11-04 18:35:46", + "slug" : "judicial-council-dinner-limited-to-bench-officers", + "status" : "publish", + "tags" : [ ], + "title" : "Judicial Council Dinner (limited to Bench Officers)", + "title_plain" : "Judicial Council Dinner (limited to Bench Officers)", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/judicial-council-dinner-limited-to-bench-officers/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "6:30PM-9:30PM" ] }, + "date" : "2011-08-23 22:48:13", + "excerpt" : "", + "id" : 300, + "modified" : "2011-08-23 22:48:13", + "slug" : "napalsa-dinner", + "status" : "publish", + "tags" : [ ], + "title" : "NAPALSA Dinner", + "title_plain" : "NAPALSA Dinner", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napalsa-dinner/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "6:00PM-7:30PM" ] }, + "date" : "2011-08-23 22:47:54", + "excerpt" : "", + "id" : 298, + "modified" : "2011-11-04 18:32:02", + "slug" : "trailblazers-reception", + "status" : "publish", + "tags" : [ ], + "title" : "Trailblazers Reception (sponsored by Walmart)", + "title_plain" : "Trailblazers Reception (sponsored by Walmart)", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/trailblazers-reception/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "5:00PM-6:00PM" ] }, + "date" : "2011-08-23 22:47:36", + "excerpt" : "", + "id" : 296, + "modified" : "2011-11-04 18:31:29", + "slug" : "3rd-annual-napaba-lgbt-reception", + "status" : "publish", + "tags" : [ ], + "title" : "3rd Annual NAPABA LGBT Reception, Speaker: Associate Justice Sabrina McKenna, Supreme Court of Hawaii (sponsored by King & Spanding, Lexis Nexis, and the National LGBT Bar Association)", + "title_plain" : "3rd Annual NAPABA LGBT Reception, Speaker: Associate Justice Sabrina McKenna, Supreme Court of Hawaii (sponsored by King & Spanding, Lexis Nexis, and the National LGBT Bar Association)", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/3rd-annual-napaba-lgbt-reception/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "5:00PM-6:00PM" ] }, + "date" : "2011-08-23 22:47:31", + "excerpt" : "", + "id" : 851, + "modified" : "2011-11-04 18:23:29", + "slug" : "in-house-committee-reception-co-sponsored-by-alston-bird-llp-prudential", + "status" : "publish", + "tags" : [ ], + "title" : "In-House Committee Reception (co-sponsored by Alston & Bird LLP & Prudential)", + "title_plain" : "In-House Committee Reception (co-sponsored by Alston & Bird LLP & Prudential)", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/in-house-committee-reception-co-sponsored-by-alston-bird-llp-prudential/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "5:00PM-6:00PM" ] }, + "date" : "2011-08-23 22:47:26", + "excerpt" : "", + "id" : 855, + "modified" : "2011-11-04 18:25:45", + "slug" : "labor-employment-committee-reception", + "status" : "publish", + "tags" : [ ], + "title" : "Labor & Employment Committee Reception", + "title_plain" : "Labor & Employment Committee Reception", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/labor-employment-committee-reception/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "5:00PM-6:00PM" ] }, + "date" : "2011-08-23 22:47:17", + "excerpt" : "", + "id" : 294, + "modified" : "2011-08-23 22:47:17", + "slug" : "harvard-law-school-apa-alumni-reception", + "status" : "publish", + "tags" : [ ], + "title" : "Harvard Law School APA Alumni reception", + "title_plain" : "Harvard Law School APA Alumni reception", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/harvard-law-school-apa-alumni-reception/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "5:00PM-6:00PM" ] }, + "date" : "2011-08-23 22:47:15", + "excerpt" : "", + "id" : 846, + "modified" : "2011-11-04 16:45:47", + "slug" : "judiciary-committee-roundtable-by-invitation-only", + "status" : "publish", + "tags" : [ ], + "title" : "Judiciary Committee Roundtable (by invitation only)", + "title_plain" : "Judiciary Committee Roundtable (by invitation only)", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/judiciary-committee-roundtable-by-invitation-only/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "3:30PM-5:15PM" ] }, + "date" : "2011-08-23 22:46:49", + "excerpt" : "", + "id" : 292, + "modified" : "2011-08-23 22:46:49", + "slug" : "napalsa-general-meetings-elections", + "status" : "publish", + "tags" : [ ], + "title" : "NAPALSA General Meetings & Elections", + "title_plain" : "NAPALSA General Meetings & Elections", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napalsa-general-meetings-elections/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "3:30PM-4:45PM" ] }, + "date" : "2011-08-23 22:46:13", + "excerpt" : "", + "id" : 288, + "modified" : "2011-11-03 00:17:34", + "slug" : "napaba-cle-breakout-sessions-iv-406-increasing-apa-presence-on-the-bench-the-do%e2%80%99s-don%e2%80%99ts-of-getting-more-apa-judges-elected-or-appointed-to-state-appellate-trial-courts-administ", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions IV- 406: Increasing APA Presence on the Bench: The Do’s & Don’ts of Getting More APA Judges Elected or Appointed to State Appellate, Trial Courts & Administrative Agencies", + "title_plain" : "NAPABA CLE Breakout Sessions IV- 406: Increasing APA Presence on the Bench: The Do’s & Don’ts of Getting More APA Judges Elected or Appointed to State Appellate, Trial Courts & Administrative Agencies", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iv-406-increasing-apa-presence-on-the-bench-the-do%e2%80%99s-don%e2%80%99ts-of-getting-more-apa-judges-elected-or-appointed-to-state-appellate-trial-courts-administ/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "3:30PM-4:45PM" ] }, + "date" : "2011-08-23 22:45:52", + "excerpt" : "", + "id" : 286, + "modified" : "2011-11-03 00:18:27", + "slug" : "napaba-cle-breakout-sessions-iv-405-red-envelopes-of-cash-fcpa-anti-corruption-practice-enforcement-in-asia-the-need-for-sustainable-compliance-programs", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions IV- 405: Red Envelopes of Cash: FCPA & Anti-Corruption Practice Enforcement in Asia & the Need for Sustainable Compliance Programs", + "title_plain" : "NAPABA CLE Breakout Sessions IV- 405: Red Envelopes of Cash: FCPA & Anti-Corruption Practice Enforcement in Asia & the Need for Sustainable Compliance Programs", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iv-405-red-envelopes-of-cash-fcpa-anti-corruption-practice-enforcement-in-asia-the-need-for-sustainable-compliance-programs/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "3:30PM-4:45PM" ] }, + "date" : "2011-08-23 22:44:56", + "excerpt" : "", + "id" : 282, + "modified" : "2011-11-03 00:18:58", + "slug" : "napaba-cle-breakout-sessions-iv-404-general-counsel-survival-skills", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions IV- 404: General Counsel Survival Skills", + "title_plain" : "NAPABA CLE Breakout Sessions IV- 404: General Counsel Survival Skills", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iv-404-general-counsel-survival-skills/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "3:30PM-4:45PM" ] }, + "date" : "2011-08-23 22:44:31", + "excerpt" : "", + "id" : 280, + "modified" : "2011-11-03 00:20:12", + "slug" : "napaba-cle-breakout-sessions-iv-403-primer-on-renewable-energy-transactions", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions IV- 403: Primer on Renewable Energy Transactions", + "title_plain" : "NAPABA CLE Breakout Sessions IV- 403: Primer on Renewable Energy Transactions", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iv-403-primer-on-renewable-energy-transactions/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "3:30PM-4:45PM" ] }, + "date" : "2011-08-23 22:34:16", + "excerpt" : "", + "id" : 278, + "modified" : "2011-11-03 00:20:38", + "slug" : "napaba-cle-breakout-sessions-iv-402-high-profile-and-complex-litigation-from-the-outside-in-tips-from-diverse-litigators-turned-in-house-counsel", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions IV- 402: High Profile and Complex Litigation from the Outside In: Tips from Diverse Litigators Turned In-house Counsel", + "title_plain" : "NAPABA CLE Breakout Sessions IV- 402: High Profile and Complex Litigation from the Outside In: Tips from Diverse Litigators Turned In-house Counsel", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iv-402-high-profile-and-complex-litigation-from-the-outside-in-tips-from-diverse-litigators-turned-in-house-counsel/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "3:30PM-4:45PM" ] }, + "date" : "2011-08-23 22:33:53", + "excerpt" : "", + "id" : 276, + "modified" : "2011-11-03 00:21:12", + "slug" : "napaba-cle-breakout-sessions-iv-401-immigration-in-the-se-and-the-new-era-of-civil-rights", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions IV- 401: Immigration in the SE and the New Era of Civil Rights", + "title_plain" : "NAPABA CLE Breakout Sessions IV- 401: Immigration in the SE and the New Era of Civil Rights", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iv-401-immigration-in-the-se-and-the-new-era-of-civil-rights/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "3:30PM-4:45PM" ] }, + "date" : "2011-08-23 22:33:29", + "excerpt" : "", + "id" : 274, + "modified" : "2011-08-23 22:33:29", + "slug" : "napaba-cle-breakout-sessions-iv", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions IV", + "title_plain" : "NAPABA CLE Breakout Sessions IV", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iv/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "2:00PM-5:00PM" ] }, + "date" : "2011-08-23 22:28:19", + "excerpt" : "", + "id" : 272, + "modified" : "2011-08-23 22:28:19", + "slug" : "ihc-executive-coaching", + "status" : "publish", + "tags" : [ ], + "title" : "IHC Executive Coaching", + "title_plain" : "IHC Executive Coaching", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/ihc-executive-coaching/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "2:00PM-3:15PM" ] }, + "date" : "2011-08-23 22:27:42", + "excerpt" : "", + "id" : 270, + "modified" : "2011-11-03 21:31:14", + "slug" : "napaba-cle-breakout-sessions-iii-napalsa-breakout-session-5-ip-panel", + "status" : "publish", + "tags" : [ ], + "title" : "NAPALSA Breakout Session 5: The ABC’s of IP: Trends & Careers in Intellectual Property Law", + "title_plain" : "NAPALSA Breakout Session 5: The ABC’s of IP: Trends & Careers in Intellectual Property Law", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iii-napalsa-breakout-session-5-ip-panel/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "2:00PM-3:15PM" ] }, + "date" : "2011-08-23 22:25:04", + "excerpt" : "", + "id" : 268, + "modified" : "2011-11-03 21:29:47", + "slug" : "napaba-cle-breakout-sessions-iii-napalsa-breakout-session-4-international-law-panel", + "status" : "publish", + "tags" : [ ], + "title" : "NAPALSA Breakout Session 4: Crossing Borders: International Practice Panel", + "title_plain" : "NAPALSA Breakout Session 4: Crossing Borders: International Practice Panel", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iii-napalsa-breakout-session-4-international-law-panel/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "2:00PM-3:15PM" ] }, + "date" : "2011-08-23 22:23:24", + "excerpt" : "", + "id" : 266, + "modified" : "2011-11-03 00:21:44", + "slug" : "napaba-cle-breakout-sessions-iii-307-race-color-and-citizenship-ozawa-and-thind", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions III- 307: Race, Color and Citizenship: Ozawa and Thind", + "title_plain" : "NAPABA CLE Breakout Sessions III- 307: Race, Color and Citizenship: Ozawa and Thind", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iii-307-race-color-and-citizenship-ozawa-and-thind/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "2:00PM-3:15PM" ] }, + "date" : "2011-08-23 22:22:59", + "excerpt" : "", + "id" : 264, + "modified" : "2011-11-03 00:22:17", + "slug" : "napaba-cle-breakout-sessions-iii-306-securing-local-compliance-with-section-203-of-voting-rights-act", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions III- 306: Securing Local Compliance with Section 203 of Voting Rights Act", + "title_plain" : "NAPABA CLE Breakout Sessions III- 306: Securing Local Compliance with Section 203 of Voting Rights Act", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iii-306-securing-local-compliance-with-section-203-of-voting-rights-act/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "2:00PM-3:15PM" ] }, + "date" : "2011-08-23 22:21:36", + "excerpt" : "", + "id" : 262, + "modified" : "2011-11-03 00:22:45", + "slug" : "napaba-cle-breakout-sessions-iii-305-lawyers-on-the-move-how-to-sustain-your-career-by-spreading-your-wings", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions III- 305: Lawyers on the Move: How to Sustain Your Career by Spreading Your Wings", + "title_plain" : "NAPABA CLE Breakout Sessions III- 305: Lawyers on the Move: How to Sustain Your Career by Spreading Your Wings", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iii-305-lawyers-on-the-move-how-to-sustain-your-career-by-spreading-your-wings/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "2:00PM-3:15PM" ] }, + "date" : "2011-08-23 22:18:16", + "excerpt" : "", + "id" : 260, + "modified" : "2011-11-03 00:23:05", + "slug" : "napaba-cle-breakout-sessions-iii-304-protecting-your-client%e2%80%99s-intangible-rights", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions III- 304: Protecting Your Client’s Intangible Rights", + "title_plain" : "NAPABA CLE Breakout Sessions III- 304: Protecting Your Client’s Intangible Rights", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iii-304-protecting-your-client%e2%80%99s-intangible-rights/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "2:00PM-3:15PM" ] }, + "date" : "2011-08-23 22:17:54", + "excerpt" : "", + "id" : 258, + "modified" : "2011-11-03 00:23:20", + "slug" : "napaba-cle-breakout-sessions-iii-303-hot-topics-in-securities-law-beyond-dodd-frank", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions III- 303: Hot topics in Securities Law Beyond Dodd-Frank", + "title_plain" : "NAPABA CLE Breakout Sessions III- 303: Hot topics in Securities Law Beyond Dodd-Frank", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iii-303-hot-topics-in-securities-law-beyond-dodd-frank/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "2:00PM-3:15PM" ] }, + "date" : "2011-08-23 22:17:33", + "excerpt" : "", + "id" : 256, + "modified" : "2011-11-03 21:28:39", + "slug" : "napaba-cle-breakout-sessions-iii-302-international-commercial-arbitration", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions III- 302: International Business Disputes: Insights from the Inside Players", + "title_plain" : "NAPABA CLE Breakout Sessions III- 302: International Business Disputes: Insights from the Inside Players", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iii-302-international-commercial-arbitration/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "2:00PM-3:15PM" ] }, + "date" : "2011-08-23 22:15:10", + "excerpt" : "", + "id" : 254, + "modified" : "2011-11-03 00:23:50", + "slug" : "napaba-cle-breakout-sessions-iii-301-does-tiger-mothering-produce-paper-tigers", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions III- 301: Realities of Life in the Jungle for the Tiger Cub", + "title_plain" : "NAPABA CLE Breakout Sessions III- 301: Realities of Life in the Jungle for the Tiger Cub", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iii-301-does-tiger-mothering-produce-paper-tigers/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "2:00PM-3:15PM" ] }, + "date" : "2011-08-23 22:10:19", + "excerpt" : "", + "id" : 250, + "modified" : "2011-08-23 22:13:37", + "slug" : "napaba-cle-breakout-sessions-iii", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions III", + "title_plain" : "NAPABA CLE Breakout Sessions III", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-iii/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "1:30PM-3:00PM" ] }, + "date" : "2011-08-23 22:08:47", + "excerpt" : "", + "id" : 248, + "modified" : "2011-08-23 22:08:47", + "slug" : "thomas-tang-moot-court-competition-round-2", + "status" : "publish", + "tags" : [ ], + "title" : "Thomas Tang Moot Court Competition-Round 2", + "title_plain" : "Thomas Tang Moot Court Competition-Round 2", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/thomas-tang-moot-court-competition-round-2/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "12:30PM-1:45PM" ] }, + "date" : "2011-08-23 22:07:02", + "excerpt" : "", + "id" : 244, + "modified" : "2011-11-03 00:31:43", + "slug" : "luncheon-plenary-session", + "status" : "publish", + "tags" : [ ], + "title" : "Luncheon & Plenary Session: Yale Law Professor & Bestselling Author Amy Chua (Co-Sponsored by Allstate & Schiff Hardin, LLP)", + "title_plain" : "Luncheon & Plenary Session: Yale Law Professor & Bestselling Author Amy Chua (Co-Sponsored by Allstate & Schiff Hardin, LLP)", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/luncheon-plenary-session/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "11:00AM-12:15PM" ] }, + "date" : "2011-08-23 22:06:35", + "excerpt" : "", + "id" : 242, + "modified" : "2011-11-03 21:16:45", + "slug" : "napaba-cle-breakout-sessions-ii-napalsa-breakout-session-2-bankruptcy-panel", + "status" : "publish", + "tags" : [ ], + "title" : "NAPALSA Breakout Session 2: Opportunities in a Depressed Economy-Legal Careers in Bankruptcy & Restructuring", + "title_plain" : "NAPALSA Breakout Session 2: Opportunities in a Depressed Economy-Legal Careers in Bankruptcy & Restructuring", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-ii-napalsa-breakout-session-2-bankruptcy-panel/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "11:00AM-12:15PM" ] }, + "date" : "2011-08-23 22:06:06", + "excerpt" : "", + "id" : 240, + "modified" : "2011-11-03 21:13:58", + "slug" : "napaba-cle-breakout-sessions-ii-napalsa-breakout-session-1-resume-interview-tips", + "status" : "publish", + "tags" : [ ], + "title" : "NAPALSA Breakout Session 1: Getting the Job: Interview/Resume Tips", + "title_plain" : "NAPALSA Breakout Session 1: Getting the Job: Interview/Resume Tips", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-ii-napalsa-breakout-session-1-resume-interview-tips/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "11:00AM-12:15PM" ] }, + "date" : "2011-08-23 22:05:24", + "excerpt" : "", + "id" : 238, + "modified" : "2011-11-03 00:24:10", + "slug" : "napaba-cle-breakout-sessions-ii-207-gitmo-%e2%80%93-10-years-after-911", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions II- 207: Gitmo – 10 Years after 9/11", + "title_plain" : "NAPABA CLE Breakout Sessions II- 207: Gitmo – 10 Years after 9/11", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-ii-207-gitmo-%e2%80%93-10-years-after-911/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "11:00AM-12:15PM" ] }, + "date" : "2011-08-23 22:03:18", + "excerpt" : "", + "id" : 236, + "modified" : "2011-11-03 00:24:22", + "slug" : "napaba-cle-breakout-sessions-ii-206-legal-strategies-for-sustaining-corporate-growth-through-successful-integration-post-ma-deals", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions II- 206: Legal Strategies for Sustaining Corporate Growth through Successful Integration Post M&A Deals", + "title_plain" : "NAPABA CLE Breakout Sessions II- 206: Legal Strategies for Sustaining Corporate Growth through Successful Integration Post M&A Deals", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-ii-206-legal-strategies-for-sustaining-corporate-growth-through-successful-integration-post-ma-deals/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "11:00AM-12:15PM" ] }, + "date" : "2011-08-23 22:01:24", + "excerpt" : "", + "id" : 234, + "modified" : "2011-11-03 00:24:34", + "slug" : "napaba-cle-breakout-sessions-ii-205-global-ip-war-current-trends-strategies", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions II- 205: Global IP War: Current Trends & Strategies", + "title_plain" : "NAPABA CLE Breakout Sessions II- 205: Global IP War: Current Trends & Strategies", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-ii-205-global-ip-war-current-trends-strategies/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "11:00AM-12:15PM" ] }, + "date" : "2011-08-23 21:55:53", + "excerpt" : "", + "id" : 228, + "modified" : "2011-11-03 00:24:46", + "slug" : "napaba-cle-breakout-sessions-ii-204-the-future-of-cleantech-perspectives-from-california-beyond", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions II- 204: The Future of Cleantech: Perspectives from California & Beyond", + "title_plain" : "NAPABA CLE Breakout Sessions II- 204: The Future of Cleantech: Perspectives from California & Beyond", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-ii-204-the-future-of-cleantech-perspectives-from-california-beyond/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "11:00AM-12:15PM" ] }, + "date" : "2011-08-23 21:54:23", + "excerpt" : "", + "id" : 226, + "modified" : "2011-11-03 00:24:59", + "slug" : "napaba-cle-breakout-sessions-ii-203-sustaining-a-competitive-ip-practice-in-an-evolving-market-what-every-ip-lawyer-needs-to-know-about-recent-cases-trends", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions II- 203: Sustaining a Competitive IP Practice in an Evolving Market: What Every IP Lawyer Needs to Know about Recent Cases & Trends", + "title_plain" : "NAPABA CLE Breakout Sessions II- 203: Sustaining a Competitive IP Practice in an Evolving Market: What Every IP Lawyer Needs to Know about Recent Cases & Trends", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-ii-203-sustaining-a-competitive-ip-practice-in-an-evolving-market-what-every-ip-lawyer-needs-to-know-about-recent-cases-trends/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "11:00AM-12:15PM" ] }, + "date" : "2011-08-23 21:53:20", + "excerpt" : "", + "id" : 224, + "modified" : "2011-11-03 00:25:09", + "slug" : "napaba-cle-breakout-sessions-ii-202-best-practices-at-corporations-to-promote-diversity", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions II- 202: Best Practices at Corporations to Promote Diversity", + "title_plain" : "NAPABA CLE Breakout Sessions II- 202: Best Practices at Corporations to Promote Diversity", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-ii-202-best-practices-at-corporations-to-promote-diversity/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "11:00AM-12:15PM" ] }, + "date" : "2011-08-23 21:52:19", + "excerpt" : "", + "id" : 222, + "modified" : "2011-11-03 00:25:20", + "slug" : "napaba-cle-breakout-sessions-ii-201-international-economic-development-case-studies-of-asian-companies-in-the-u-s", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions II-201: International Economic Development: Case Studies of Asian Companies in the U.S.", + "title_plain" : "NAPABA CLE Breakout Sessions II-201: International Economic Development: Case Studies of Asian Companies in the U.S.", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-ii-201-international-economic-development-case-studies-of-asian-companies-in-the-u-s/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "11:00AM-12:15PM" ] }, + "date" : "2011-08-23 21:52:18", + "excerpt" : "", + "id" : 220, + "modified" : "2011-11-03 20:57:19", + "slug" : "napaba-cle-breakout-sessions-ii", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions II", + "title_plain" : "NAPABA CLE Breakout Sessions II", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-ii/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "10:00AM-11:30AM" ] }, + "date" : "2011-08-23 21:51:50", + "excerpt" : "", + "id" : 218, + "modified" : "2011-11-03 21:03:07", + "slug" : "thomas-tang-moot-court-competition-round-1", + "status" : "publish", + "tags" : [ ], + "title" : "Thomas Tang Moot Court Competition-Round 1", + "title_plain" : "Thomas Tang Moot Court Competition-Round 1", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/thomas-tang-moot-court-competition-round-1/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "9:30AM-5:00PM" ] }, + "date" : "2011-08-23 21:50:53", + "excerpt" : "", + "id" : 246, + "modified" : "2011-11-03 21:02:41", + "slug" : "3rd-annual-napaba-pitch-sessions-program", + "status" : "publish", + "tags" : [ ], + "title" : "3RD ANNUAL NAPABA PITCH SESSIONS PROGRAM", + "title_plain" : "3RD ANNUAL NAPABA PITCH SESSIONS PROGRAM", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/3rd-annual-napaba-pitch-sessions-program/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "9:30AM-10:45AM" ] }, + "date" : "2011-08-23 21:50:24", + "excerpt" : "", + "id" : 216, + "modified" : "2011-11-03 20:15:45", + "slug" : "napaba-cle-breakout-sessions-i-napalsa-welcome-session-plus-meet-greet", + "status" : "publish", + "tags" : [ ], + "title" : "NAPALSA Welcome Session (plus meet & greet)", + "title_plain" : "NAPALSA Welcome Session (plus meet & greet)", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-i-napalsa-welcome-session-plus-meet-greet/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "9:30AM-10:45AM" ] }, + "date" : "2011-08-23 21:50:00", + "excerpt" : "", + "id" : 214, + "modified" : "2011-11-03 00:25:37", + "slug" : "napaba-cle-breakout-sessions-i-106-cloud-computing-with-a-chance-of-meatballs", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions I- 106: Cloud Computing with a Chance of Meatballs", + "title_plain" : "NAPABA CLE Breakout Sessions I- 106: Cloud Computing with a Chance of Meatballs", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-i-106-cloud-computing-with-a-chance-of-meatballs/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "9:30AM-10:45AM" ] }, + "date" : "2011-08-23 21:49:08", + "excerpt" : "", + "id" : 212, + "modified" : "2011-11-03 00:25:49", + "slug" : "napaba-cle-breakout-sessions-i-105-hot-topics-in-labor-and-employment-law", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions I- 105: Hot Topics in Labor and Employment Law", + "title_plain" : "NAPABA CLE Breakout Sessions I- 105: Hot Topics in Labor and Employment Law", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-i-105-hot-topics-in-labor-and-employment-law/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "9:30AM-10:45AM" ] }, + "date" : "2011-08-23 21:48:38", + "excerpt" : "", + "id" : 210, + "modified" : "2011-11-03 00:26:48", + "slug" : "napaba-cle-breakout-sessions-i-104-3rd-annual-master-class", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions I- 104: 3rd Annual Master Class: Best Practices Workshop ‐ Building Successful Business Development Skills with Social Media", + "title_plain" : "NAPABA CLE Breakout Sessions I- 104: 3rd Annual Master Class: Best Practices Workshop ‐ Building Successful Business Development Skills with Social Media", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-i-104-3rd-annual-master-class/" + }, + { "attachments" : [ ], + "author" : { "description" : "", + "first_name" : "", + "id" : 1, + "last_name" : "", + "name" : "Napaba", + "nickname" : "Napaba", + "slug" : "napaba", + "url" : "" + }, + "categories" : [ { "description" : "", + "id" : 7, + "parent" : 4, + "post_count" : 56, + "slug" : "november-18th", + "title" : "November 18th" + }, + { "description" : "", + "id" : 4, + "parent" : 0, + "post_count" : 121, + "slug" : "program-schedule", + "title" : "Program Schedule" + } + ], + "comment_count" : 0, + "comment_status" : "open", + "comments" : [ ], + "content" : "", + "custom_fields" : { "event_time" : [ "9:30AM-10:45AM" ] }, + "date" : "2011-08-23 21:48:09", + "excerpt" : "", + "id" : 208, + "modified" : "2011-11-03 00:27:09", + "slug" : "napaba-cle-breakout-sessions-i-103-beyond-sustainability-advancing-apa-lawyers-in-law-firms", + "status" : "publish", + "tags" : [ ], + "title" : "NAPABA CLE Breakout Sessions I- 103: Beyond Sustainability: Advancing APA Lawyers in Law Firms", + "title_plain" : "NAPABA CLE Breakout Sessions I- 103: Beyond Sustainability: Advancing APA Lawyers in Law Firms", + "type" : "post", + "url" : "http://convention.napaba.org/2011/08/napaba-cle-breakout-sessions-i-103-beyond-sustainability-advancing-apa-lawyers-in-law-firms/" + } + ], + "status" : "ok" +} \ No newline at end of file diff --git a/CocoaCamp/Resources/arss_back.png b/CocoaCamp/Resources/arss_back.png new file mode 100644 index 0000000..26e668a Binary files /dev/null and b/CocoaCamp/Resources/arss_back.png differ diff --git a/CocoaCamp/Resources/arss_header.png b/CocoaCamp/Resources/arss_header.png new file mode 100644 index 0000000..2bfa8a6 Binary files /dev/null and b/CocoaCamp/Resources/arss_header.png differ diff --git a/Resources/bird.png b/CocoaCamp/Resources/bird.png similarity index 100% rename from Resources/bird.png rename to CocoaCamp/Resources/bird.png diff --git a/CocoaCamp/Resources/branded.plist b/CocoaCamp/Resources/branded.plist new file mode 100644 index 0000000..a9a6f71 --- /dev/null +++ b/CocoaCamp/Resources/branded.plist @@ -0,0 +1,10 @@ + + + + + fileNamePrefix + Napaba- + headerViewNibName + NapabaHeaderView + + diff --git a/Resources/bump.png b/CocoaCamp/Resources/bump.png similarity index 100% rename from Resources/bump.png rename to CocoaCamp/Resources/bump.png diff --git a/Resources/bump@2x.png b/CocoaCamp/Resources/bump@2x.png similarity index 100% rename from Resources/bump@2x.png rename to CocoaCamp/Resources/bump@2x.png diff --git a/Resources/bump_righthand.png b/CocoaCamp/Resources/bump_righthand.png similarity index 100% rename from Resources/bump_righthand.png rename to CocoaCamp/Resources/bump_righthand.png diff --git a/Resources/calendar.png b/CocoaCamp/Resources/calendar.png similarity index 100% rename from Resources/calendar.png rename to CocoaCamp/Resources/calendar.png diff --git a/CocoaCamp/Resources/connect-icon.png b/CocoaCamp/Resources/connect-icon.png new file mode 100644 index 0000000..78f35dd Binary files /dev/null and b/CocoaCamp/Resources/connect-icon.png differ diff --git a/CocoaCamp/Resources/connect-icon@2x.png b/CocoaCamp/Resources/connect-icon@2x.png new file mode 100644 index 0000000..b663af4 Binary files /dev/null and b/CocoaCamp/Resources/connect-icon@2x.png differ diff --git a/flickrbackground.png b/CocoaCamp/Resources/flickrbackground.png similarity index 100% rename from flickrbackground.png rename to CocoaCamp/Resources/flickrbackground.png diff --git a/Resources/group.png b/CocoaCamp/Resources/group.png similarity index 100% rename from Resources/group.png rename to CocoaCamp/Resources/group.png diff --git a/Classes/headerBackground.png b/CocoaCamp/Resources/headerBackground.png similarity index 100% rename from Classes/headerBackground.png rename to CocoaCamp/Resources/headerBackground.png diff --git a/iPhoneAppIcon.png b/CocoaCamp/Resources/iPhoneAppIcon.png similarity index 100% rename from iPhoneAppIcon.png rename to CocoaCamp/Resources/iPhoneAppIcon.png diff --git a/iPhoneAppIcon@2x.png b/CocoaCamp/Resources/iPhoneAppIcon@2x.png similarity index 100% rename from iPhoneAppIcon@2x.png rename to CocoaCamp/Resources/iPhoneAppIcon@2x.png diff --git a/Resources/keynote-icon.png b/CocoaCamp/Resources/keynote-icon.png similarity index 100% rename from Resources/keynote-icon.png rename to CocoaCamp/Resources/keynote-icon.png diff --git a/Resources/keynote-icon@2x.png b/CocoaCamp/Resources/keynote-icon@2x.png similarity index 100% rename from Resources/keynote-icon@2x.png rename to CocoaCamp/Resources/keynote-icon@2x.png diff --git a/Resources/loading.png b/CocoaCamp/Resources/loading.png similarity index 100% rename from Resources/loading.png rename to CocoaCamp/Resources/loading.png diff --git a/CocoaCamp/Resources/napaba-launch.png b/CocoaCamp/Resources/napaba-launch.png new file mode 100644 index 0000000..9812af1 Binary files /dev/null and b/CocoaCamp/Resources/napaba-launch.png differ diff --git a/CocoaCamp/Resources/news-icon.png b/CocoaCamp/Resources/news-icon.png new file mode 100644 index 0000000..a3bbe8d Binary files /dev/null and b/CocoaCamp/Resources/news-icon.png differ diff --git a/CocoaCamp/Resources/news-icon@2x.png b/CocoaCamp/Resources/news-icon@2x.png new file mode 100644 index 0000000..697fde8 Binary files /dev/null and b/CocoaCamp/Resources/news-icon@2x.png differ diff --git a/photoIcon.png b/CocoaCamp/Resources/photoIcon.png similarity index 100% rename from photoIcon.png rename to CocoaCamp/Resources/photoIcon.png diff --git a/CocoaCamp/Resources/qr-icon.png b/CocoaCamp/Resources/qr-icon.png new file mode 100644 index 0000000..7422558 Binary files /dev/null and b/CocoaCamp/Resources/qr-icon.png differ diff --git a/CocoaCamp/Resources/qr-icon@2x.png b/CocoaCamp/Resources/qr-icon@2x.png new file mode 100644 index 0000000..4d31426 Binary files /dev/null and b/CocoaCamp/Resources/qr-icon@2x.png differ diff --git a/CocoaCamp/Resources/qrcode-cocoacamp-url.png b/CocoaCamp/Resources/qrcode-cocoacamp-url.png new file mode 100644 index 0000000..ea1de68 Binary files /dev/null and b/CocoaCamp/Resources/qrcode-cocoacamp-url.png differ diff --git a/roundrecbuttonnorm.png b/CocoaCamp/Resources/roundrecbuttonnorm.png similarity index 100% rename from roundrecbuttonnorm.png rename to CocoaCamp/Resources/roundrecbuttonnorm.png diff --git a/roundrecbuttonpress.png b/CocoaCamp/Resources/roundrecbuttonpress.png similarity index 100% rename from roundrecbuttonpress.png rename to CocoaCamp/Resources/roundrecbuttonpress.png diff --git a/CocoaCamp/Resources/webServiceConfig.plist b/CocoaCamp/Resources/webServiceConfig.plist new file mode 100644 index 0000000..e053385 --- /dev/null +++ b/CocoaCamp/Resources/webServiceConfig.plist @@ -0,0 +1,27 @@ + + + + + twitterSearchUrl + http://search.twitter.com/search.json + twitterFallSearchString + NAPABA + attendeeListUrl + http://cocoa:camp@cocoacamp.org/registers/json?user_name=cocoa&password=camp + rssNewsUrl + http://convention.napaba.org/category/news/feed/ + newsWebUrl + http://convention.napaba.org/category/news + sessionScheduleUrlList + + http://convention.napaba.org/api/get_category_posts/?id=6&custom_fields=event_time&count=100 + http://convention.napaba.org/api/get_category_posts/?id=7&custom_fields=event_time&count=100 + http://convention.napaba.org/api/get_category_posts/?id=8&custom_fields=event_time&count=100 + http://convention.napaba.org/api/get_category_posts/?id=9&custom_fields=event_time&count=100 + + sessionSchedulePdfUrl + http://www.napaba.org/uploads/napaba/dayataglance101411.pdf + logoLinksUrl + http://convention.napaba.org/sponsors-app/?json=1&count=100 + + diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarCameraSimulator.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarCameraSimulator.h new file mode 100644 index 0000000..61bb07f --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarCameraSimulator.h @@ -0,0 +1,45 @@ +//------------------------------------------------------------------------ +// Copyright 2010-2011 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ + +@class ZBarReaderView; + +// hack around missing simulator support for AVCapture interfaces + +@interface ZBarCameraSimulator + : NSObject + < UINavigationControllerDelegate, + UIImagePickerControllerDelegate, + UIPopoverControllerDelegate > +{ + UIViewController *viewController; + ZBarReaderView *readerView; + UIImagePickerController *picker; + UIPopoverController *pickerPopover; +} + +- (id) initWithViewController: (UIViewController*) viewController; +- (void) takePicture; + +@property (nonatomic, assign) ZBarReaderView *readerView; + +@end diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarCaptureReader.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarCaptureReader.h new file mode 100644 index 0000000..e466130 --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarCaptureReader.h @@ -0,0 +1,111 @@ +//------------------------------------------------------------------------ +// Copyright 2010 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ + +#import +#import "ZBarImageScanner.h" + +@class AVCaptureVideoDataOutput, AVCaptureOutput; +@class ZBarCaptureReader, ZBarCVImage; + +@protocol ZBarCaptureDelegate + +// called when a new barcode is detected. the image refers to the +// video buffer and must not be retained for long +- (void) captureReader: (ZBarCaptureReader*) captureReader + didReadNewSymbolsFromImage: (ZBarImage*) image; + +@optional +// called when a potential/uncertain barcode is detected. will also +// be called *after* captureReader:didReadNewSymbolsFromImage: +// when good barcodes are detected +- (void) captureReader: (ZBarCaptureReader*) captureReader + didTrackSymbols: (ZBarSymbolSet*) symbols; + +@end + +@interface ZBarCaptureReader + : NSObject +{ +#if !TARGET_IPHONE_SIMULATOR + AVCaptureVideoDataOutput *captureOutput; + id captureDelegate; + ZBarImageScanner *scanner; + CGRect scanCrop; + CGSize size; + CGFloat framesPerSecond; + BOOL enableCache; + + dispatch_queue_t queue; + ZBarImage *image; + ZBarCVImage *result; + volatile uint32_t state; + int framecnt; + unsigned width, height; + uint64_t t_frame, t_fps, t_scan; + CGFloat dt_frame; +#endif +} + +// supply a pre-configured image scanner +- (id) initWithImageScanner: (ZBarImageScanner*) imageScanner; + +// this must be called before the session is started +- (void) willStartRunning; + +// this must be called *before* the session is stopped +- (void) willStopRunning; + +// clear the internal result cache +- (void) flushCache; + +// capture the next frame after processing. the captured image will +// follow the same delegate path as an image with decoded symbols. +- (void) captureFrame; + +// the capture output. add this to an instance of AVCaptureSession +@property (nonatomic, readonly) AVCaptureOutput *captureOutput; + +// delegate is notified of decode results and symbol tracking. +@property (nonatomic, assign) id captureDelegate; + +// access to image scanner for configuration. +@property (nonatomic, readonly) ZBarImageScanner *scanner; + +// region of image to scan in normalized coordinates. +// NB horizontal crop currently ignored... +@property (nonatomic, assign) CGRect scanCrop; + +// size of video frames. +@property (nonatomic, readonly) CGSize size; + +// (quickly) gate the reader function without interrupting the video +// stream. also flushes the cache when enabled. defaults to *NO* +@property (nonatomic) BOOL enableReader; + +// current frame rate (for debug/optimization). +// only valid when running +@property (nonatomic, readonly) CGFloat framesPerSecond; + +@property (nonatomic) BOOL enableCache; + +@end diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarHelpController.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarHelpController.h new file mode 100644 index 0000000..37639dd --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarHelpController.h @@ -0,0 +1,60 @@ +//------------------------------------------------------------------------ +// Copyright 2009-2010 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ + +#import + +@class ZBarHelpController; + +@protocol ZBarHelpDelegate +@optional + +- (void) helpControllerDidFinish: (ZBarHelpController*) help; + +@end + + +// failure dialog w/a few useful tips + +@interface ZBarHelpController : UIViewController + < UIWebViewDelegate, + UIAlertViewDelegate > +{ + NSString *reason; + id delegate; + UIWebView *webView; + UIToolbar *toolbar; + UIBarButtonItem *doneBtn, *backBtn, *space; + NSURL *linkURL; + NSUInteger orientations; +} + +@property (nonatomic, assign) id delegate; + +// designated initializer +- (id) initWithReason: (NSString*) reason; + +- (BOOL) isInterfaceOrientationSupported: (UIInterfaceOrientation) orientation; +- (void) setInterfaceOrientation: (UIInterfaceOrientation) orientation + supported: (BOOL) supported; + +@end diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarImage.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarImage.h new file mode 100644 index 0000000..2e6ec8e --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarImage.h @@ -0,0 +1,69 @@ +//------------------------------------------------------------------------ +// Copyright 2009 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ + +#import +#import "zbar.h" +#import "ZBarSymbol.h" + +#ifdef __cplusplus +using namespace zbar; +#endif + +// Obj-C wrapper for ZBar image + +@interface ZBarImage : NSObject +{ + zbar_image_t *zimg; + double t_convert; +} + +@property (nonatomic) unsigned long format; +@property (nonatomic) unsigned sequence; +@property (nonatomic) CGSize size; +@property (nonatomic) CGRect crop; +@property (readonly, nonatomic) const void *data; +@property (readonly, nonatomic) unsigned long dataLength; +@property (copy, nonatomic) ZBarSymbolSet *symbols; +@property (readonly, nonatomic) zbar_image_t *zbarImage; +@property (readonly, nonatomic) UIImage *UIImage; + +- (id) initWithImage: (zbar_image_t*) image; +- (id) initWithCGImage: (CGImageRef) image; +- (id) initWithCGImage: (CGImageRef) image + size: (CGSize) size; +- (id) initWithCGImage: (CGImageRef) image + crop: (CGRect) crop + size: (CGSize) size; + +- (void) setData: (const void*) data + withLength: (unsigned long) length; +- (UIImage*) UIImageWithOrientation: (UIImageOrientation) imageOrientation; +- (void) cleanup; + ++ (unsigned long) fourcc: (NSString*) format; + +#if 0 +- convertToFormat: (unsigned long) format; +#endif + +@end diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarImageScanner.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarImageScanner.h new file mode 100644 index 0000000..c01b047 --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarImageScanner.h @@ -0,0 +1,51 @@ +//------------------------------------------------------------------------ +// Copyright 2009 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ + +#import +#import "zbar.h" +#import "ZBarImage.h" + +#ifdef __cplusplus +using namespace zbar; +#endif + +// Obj-C wrapper for ZBar image scanner + +@interface ZBarImageScanner : NSObject +{ + zbar_image_scanner_t *scanner; +} + +@property (nonatomic) BOOL enableCache; +@property (readonly, nonatomic) ZBarSymbolSet *results; + +// decoder configuration +- (void) parseConfig: (NSString*) configStr; +- (void) setSymbology: (zbar_symbol_type_t) symbology + config: (zbar_config_t) config + to: (int) value; + +// image scanning interface +- (NSInteger) scanImage: (ZBarImage*) image; + +@end diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarReaderController.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarReaderController.h new file mode 100644 index 0000000..9121971 --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarReaderController.h @@ -0,0 +1,142 @@ +//------------------------------------------------------------------------ +// Copyright 2009-2010 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ + +#import +#import "ZBarImageScanner.h" + +#ifdef __cplusplus +using namespace zbar; +#endif + +typedef enum { + // default interface provided by UIImagePickerController - user manually + // captures an image by pressing a button + ZBarReaderControllerCameraModeDefault = 0, + + // automatically scan by taking screenshots with UIGetScreenImage(). + // resolution is limited by the screen, so this is inappropriate for + // longer codes + ZBarReaderControllerCameraModeSampling, + + // automatically scan by rapidly taking pictures with takePicture. + // tradeoff resolution with frame rate by adjusting the crop, and size + // properties of the reader along with the density configs of the image + // scanner + ZBarReaderControllerCameraModeSequence, + +} ZBarReaderControllerCameraMode; + + +@class ZBarReaderController, ZBarHelpController; + +@protocol ZBarReaderDelegate +@optional + +// called when no barcode is found in an image selected by the user. +// if retry is NO, the delegate *must* dismiss the controller +- (void) readerControllerDidFailToRead: (ZBarReaderController*) reader + withRetry: (BOOL) retry; + +@end + + +@interface ZBarReaderController + : UIImagePickerController + < UINavigationControllerDelegate, + UIImagePickerControllerDelegate > +{ + ZBarImageScanner *scanner; + ZBarHelpController *help; + UIView *overlay, *boxView; + CALayer *boxLayer; + + UIToolbar *toolbar; + UIBarButtonItem *cancelBtn, *scanBtn, *space[3]; + UIButton *infoBtn; + + id readerDelegate; + BOOL showsZBarControls, showsHelpOnFail, takesPicture, enableCache; + ZBarReaderControllerCameraMode cameraMode; + CGRect scanCrop; + NSInteger maxScanDimension; + + BOOL hasOverlay, sampling; + uint64_t t_frame; + double dt_frame; + + ZBarSymbol *symbol; +} + +// access to configure image scanner +@property (readonly, nonatomic) ZBarImageScanner *scanner; + +// barcode result recipient (NB don't use delegate) +@property (nonatomic, assign) id readerDelegate; + +// whether to use alternate control set +@property (nonatomic) BOOL showsZBarControls; + +// whether to display helpful information when decoding fails +@property (nonatomic) BOOL showsHelpOnFail; + +// how to use the camera (when sourceType == Camera) +@property (nonatomic) ZBarReaderControllerCameraMode cameraMode; + +// whether to outline symbols with the green tracking box. +@property (nonatomic) BOOL tracksSymbols; + +// whether to automatically take a full picture when a barcode is detected +// (when cameraMode == Sampling) +@property (nonatomic) BOOL takesPicture; + +// whether to use the "cache" for realtime modes (default YES). this can be +// used to safely disable the inter-frame consistency and duplicate checks, +// speeding up recognition, iff: +// 1. the controller is dismissed when a barcode is read and +// 2. unreliable symbologies are disabled (all EAN/UPC variants and I2/5) +@property (nonatomic) BOOL enableCache; + +// crop images for scanning. the original image will be cropped to this +// rectangle before scanning. the rectangle is normalized to the image size +// and aspect ratio; useful values will place the rectangle between 0 and 1 +// on each axis, where the x-axis corresponds to the image major axis. +// defaults to the full image (0, 0, 1, 1). +@property (nonatomic) CGRect scanCrop; + +// scale image to scan. after cropping, the image will be scaled if +// necessary, such that neither of its dimensions exceed this value. +// defaults to 640. +@property (nonatomic) NSInteger maxScanDimension; + +// display the built-in help browser. for use with custom overlays if +// you don't also want to create your own help view. only send this +// message when the reader is displayed. the argument will be passed +// to the onZBarHelp() javascript function. +- (void) showHelpWithReason: (NSString*) reason; + +// direct scanner interface - scan UIImage and return something enumerable +- (id ) scanImage: (CGImageRef) image; + +@end + +extern NSString* const ZBarReaderControllerResults; diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarReaderView.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarReaderView.h new file mode 100644 index 0000000..bc75c9d --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarReaderView.h @@ -0,0 +1,135 @@ +//------------------------------------------------------------------------ +// Copyright 2010 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ + +#import +#import "ZBarImageScanner.h" + +@class AVCaptureSession, AVCaptureDevice; +@class CALayer; +@class ZBarImageScanner, ZBarCaptureReader, ZBarReaderView; + +// delegate is notified of decode results. + +@protocol ZBarReaderViewDelegate < NSObject > + +- (void) readerView: (ZBarReaderView*) readerView + didReadSymbols: (ZBarSymbolSet*) symbols + fromImage: (UIImage*) image; + +@end + +// read barcodes from the displayed video preview. the view maintains +// a complete video capture session feeding a ZBarCaptureReader and +// presents the associated preview with symbol tracking annotations. + +@interface ZBarReaderView + : UIView +{ + id readerDelegate; + ZBarCaptureReader *captureReader; + CGRect scanCrop, effectiveCrop; + CGAffineTransform previewTransform; + CGFloat zoom, zoom0, maxZoom; + UIColor *trackingColor; + BOOL tracksSymbols, showsFPS; + NSInteger torchMode; + UIInterfaceOrientation interfaceOrientation; + NSTimeInterval animationDuration; + + CALayer *preview, *overlay, *tracking, *cropLayer; + UIView *fpsView; + UILabel *fpsLabel; + UIPinchGestureRecognizer *pinch; + CGFloat imageScale; + CGSize imageSize; + BOOL started, running; +} + +// supply a pre-configured image scanner. +- (id) initWithImageScanner: (ZBarImageScanner*) imageScanner; + +// start the video stream and barcode reader. +- (void) start; + +// stop the video stream and barcode reader. +- (void) stop; + +// clear the internal result cache +- (void) flushCache; + +// compensate for device/camera/interface orientation +- (void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) orient + duration: (NSTimeInterval) duration; + +// delegate is notified of decode results. +@property (nonatomic, assign) id readerDelegate; + +// access to image scanner for configuration. +@property (nonatomic, readonly) ZBarImageScanner *scanner; + +// whether to display the tracking annotation for uncertain barcodes +// (default YES). +@property (nonatomic) BOOL tracksSymbols; + +// color of the tracking box (default green) +@property (nonatomic, retain) UIColor *trackingColor; + +// enable pinch gesture recognition for zooming the preview/decode +// (default YES). +@property (nonatomic) BOOL allowsPinchZoom; + +// torch mode to set automatically (default Auto). +@property (nonatomic) NSInteger torchMode; + +// whether to display the frame rate for debug/configuration +// (default NO). +@property (nonatomic) BOOL showsFPS; + +// zoom scale factor applied to video preview *and* scanCrop. +// also updated by pinch-zoom gesture. clipped to range [1,maxZoom], +// defaults to 1.25 +@property (nonatomic) CGFloat zoom; +- (void) setZoom: (CGFloat) zoom + animated: (BOOL) animated; + +// maximum settable zoom factor. +@property (nonatomic) CGFloat maxZoom; + +// the region of the image that will be scanned. normalized coordinates. +@property (nonatomic) CGRect scanCrop; + +// additional transform applied to video preview. +// (NB *not* applied to scan crop) +@property (nonatomic) CGAffineTransform previewTransform; + +// specify an alternate capture device. +@property (nonatomic, retain) AVCaptureDevice *device; + +// direct access to the capture session. warranty void if opened... +@property (nonatomic, readonly) AVCaptureSession *session; +@property (nonatomic, readonly) ZBarCaptureReader *captureReader; + +// this flag still works, but its use is deprecated +@property (nonatomic) BOOL enableCache; + +@end diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarReaderViewController.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarReaderViewController.h new file mode 100644 index 0000000..be2bf21 --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarReaderViewController.h @@ -0,0 +1,130 @@ +//------------------------------------------------------------------------ +// Copyright 2010 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ + +#import +#import "ZBarReaderController.h" + +// orientation set support +#define ZBarOrientationMask(orient) (1 << orient) +#define ZBarOrientationMaskAll \ + (ZBarOrientationMask(UIInterfaceOrientationPortrait) | \ + ZBarOrientationMask(UIInterfaceOrientationPortraitUpsideDown) | \ + ZBarOrientationMask(UIInterfaceOrientationLandscapeLeft) | \ + ZBarOrientationMask(UIInterfaceOrientationLandscapeRight)) + +@class ZBarReaderView, ZBarCameraSimulator; + +// drop in video scanning replacement for ZBarReaderController. +// this is a thin controller around a ZBarReaderView that adds the UI +// controls and select functionality offered by ZBarReaderController. +// Automatically falls back to a ZBarReaderController if video APIs +// are unavailable (eg for OS < 4.0) + +@interface ZBarReaderViewController + : UIViewController +{ + ZBarImageScanner *scanner; + id readerDelegate; + ZBarReaderView *readerView; + UIView *cameraOverlayView; + CGAffineTransform cameraViewTransform; + CGRect scanCrop; + NSUInteger supportedOrientationsMask; + UIImagePickerControllerCameraDevice cameraDevice; + UIImagePickerControllerCameraFlashMode cameraFlashMode; + UIImagePickerControllerQualityType videoQuality; + BOOL showsZBarControls, tracksSymbols, enableCache; + + ZBarHelpController *helpController; + UIView *controls; + BOOL didHideStatusBar, rotating; + ZBarCameraSimulator *cameraSim; +} + +// access to configure image scanner +@property (nonatomic, readonly) ZBarImageScanner *scanner; + +// barcode result recipient +@property (nonatomic, assign) id readerDelegate; + +// whether to use alternate control set +@property (nonatomic) BOOL showsZBarControls; + +// whether to show the green tracking box. note that, even when +// enabled, the box will only be visible when scanning EAN and I2/5. +@property (nonatomic) BOOL tracksSymbols; + +// interface orientation support. bit-mask of accepted orientations. +// see eg ZBarOrientationMask() and ZBarOrientationMaskAll +@property (nonatomic) NSUInteger supportedOrientationsMask; + +// crop images for scanning. the image will be cropped to this +// rectangle before scanning. the rectangle is normalized to the +// image size and aspect ratio; useful values will place the rectangle +// between 0 and 1 on each axis, where the x-axis corresponds to the +// image major axis. defaults to the full image (0, 0, 1, 1). +@property (nonatomic) CGRect scanCrop; + +// provide a custom overlay. note that this can be used with +// showsZBarControls enabled (but not if you want backward compatibility) +@property (nonatomic, retain) UIView *cameraOverlayView; + +// transform applied to the preview image. +@property (nonatomic) CGAffineTransform cameraViewTransform; + +// display the built-in help browser. the argument will be passed to +// the onZBarHelp() javascript function. +- (void) showHelpWithReason: (NSString*) reason; + +// capture the next frame and send it over the usual delegate path. +- (void) takePicture; + +// these attempt to emulate UIImagePickerController ++ (BOOL) isCameraDeviceAvailable: (UIImagePickerControllerCameraDevice) cameraDevice; ++ (BOOL) isFlashAvailableForCameraDevice: (UIImagePickerControllerCameraDevice) cameraDevice; ++ (NSArray*) availableCaptureModesForCameraDevice: (UIImagePickerControllerCameraDevice) cameraDevice; +@property(nonatomic) UIImagePickerControllerCameraDevice cameraDevice; +@property(nonatomic) UIImagePickerControllerCameraFlashMode cameraFlashMode; +@property(nonatomic) UIImagePickerControllerCameraCaptureMode cameraCaptureMode; +@property(nonatomic) UIImagePickerControllerQualityType videoQuality; + +// direct access to the ZBarReaderView +@property (nonatomic, readonly) ZBarReaderView *readerView; + +// this flag still works, but its use is deprecated +@property (nonatomic) BOOL enableCache; + +// these are present only for backward compatibility. +// they will error if inappropriate/unsupported values are set +@property (nonatomic) UIImagePickerControllerSourceType sourceType; // Camera +@property (nonatomic) BOOL allowsEditing; // NO +@property (nonatomic) BOOL allowsImageEditing; // NO +@property (nonatomic) BOOL showsCameraControls; // NO +@property (nonatomic) BOOL showsHelpOnFail; // ignored +@property (nonatomic) ZBarReaderControllerCameraMode cameraMode; // Sampling +@property (nonatomic) BOOL takesPicture; // NO +@property (nonatomic) NSInteger maxScanDimension; // ignored + ++ (BOOL) isSourceTypeAvailable: (UIImagePickerControllerSourceType) sourceType; + +@end diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarSDK.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarSDK.h new file mode 100644 index 0000000..b7cd52d --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarSDK.h @@ -0,0 +1,34 @@ +/*------------------------------------------------------------------------ + * Copyright 2010 (c) Jeff Brown + * + * This file is part of the ZBar Bar Code Reader. + * + * The ZBar Bar Code Reader is free software; you can redistribute it + * and/or modify it under the terms of the GNU Lesser Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * The ZBar Bar Code Reader is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser Public License for more details. + * + * You should have received a copy of the GNU Lesser Public License + * along with the ZBar Bar Code Reader; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301 USA + * + * http://sourceforge.net/projects/zbar + *------------------------------------------------------------------------*/ + +#import "zbar.h" + +#import "ZBarSymbol.h" +#import "ZBarImage.h" +#import "ZBarImageScanner.h" +#import "ZBarReaderView.h" +#import "ZBarReaderViewController.h" +#import "ZBarReaderController.h" +#import "ZBarCaptureReader.h" +#import "ZBarHelpController.h" +#import "ZBarCameraSimulator.h" diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarSymbol.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarSymbol.h new file mode 100644 index 0000000..c8a8574 --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/ZBarSymbol.h @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------ +// Copyright 2009-2010 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ + +#import +#import +#import "zbar.h" + +#ifdef __cplusplus +using namespace zbar; +#endif + +// Obj-C wrapper for ZBar result types + +@interface ZBarSymbolSet + : NSObject +{ + const zbar_symbol_set_t *set; + BOOL filterSymbols; +} + +@property (readonly, nonatomic) int count; +@property (readonly, nonatomic) const zbar_symbol_set_t *zbarSymbolSet; +@property (nonatomic) BOOL filterSymbols; + +- (id) initWithSymbolSet: (const zbar_symbol_set_t*) set; + +@end + + +@interface ZBarSymbol : NSObject +{ + const zbar_symbol_t *symbol; +} + +@property (readonly, nonatomic) zbar_symbol_type_t type; +@property (readonly, nonatomic) NSString *typeName; +@property (readonly, nonatomic) NSUInteger configMask; +@property (readonly, nonatomic) NSUInteger modifierMask; +@property (readonly, nonatomic) NSString *data; +@property (readonly, nonatomic) int quality; +@property (readonly, nonatomic) int count; +@property (readonly, nonatomic) zbar_orientation_t orientation; +@property (readonly, nonatomic) ZBarSymbolSet *components; +@property (readonly, nonatomic) const zbar_symbol_t *zbarSymbol; +@property (readonly, nonatomic) CGRect bounds; + +- (id) initWithSymbol: (const zbar_symbol_t*) symbol; + ++ (NSString*) nameForType: (zbar_symbol_type_t) type; + +@end diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar.h new file mode 100644 index 0000000..49aaea6 --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar.h @@ -0,0 +1,1497 @@ +/*------------------------------------------------------------------------ + * Copyright 2007-2010 (c) Jeff Brown + * + * This file is part of the ZBar Bar Code Reader. + * + * The ZBar Bar Code Reader is free software; you can redistribute it + * and/or modify it under the terms of the GNU Lesser Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * The ZBar Bar Code Reader is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser Public License for more details. + * + * You should have received a copy of the GNU Lesser Public License + * along with the ZBar Bar Code Reader; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301 USA + * + * http://sourceforge.net/projects/zbar + *------------------------------------------------------------------------*/ +#ifndef _ZBAR_H_ +#define _ZBAR_H_ + +/** @file + * ZBar Barcode Reader C API definition + */ + +/** @mainpage + * + * interface to the barcode reader is available at several levels. + * most applications will want to use the high-level interfaces: + * + * @section high-level High-Level Interfaces + * + * these interfaces wrap all library functionality into an easy-to-use + * package for a specific toolkit: + * - the "GTK+ 2.x widget" may be used with GTK GUI applications. a + * Python wrapper is included for PyGtk + * - the @ref zbar::QZBar "Qt4 widget" may be used with Qt GUI + * applications + * - the Processor interface (in @ref c-processor "C" or @ref + * zbar::Processor "C++") adds a scanning window to an application + * with no GUI. + * + * @section mid-level Intermediate Interfaces + * + * building blocks used to construct high-level interfaces: + * - the ImageScanner (in @ref c-imagescanner "C" or @ref + * zbar::ImageScanner "C++") looks for barcodes in a library defined + * image object + * - the Window abstraction (in @ref c-window "C" or @ref + * zbar::Window "C++") sinks library images, displaying them on the + * platform display + * - the Video abstraction (in @ref c-video "C" or @ref zbar::Video + * "C++") sources library images from a video device + * + * @section low-level Low-Level Interfaces + * + * direct interaction with barcode scanning and decoding: + * - the Scanner (in @ref c-scanner "C" or @ref zbar::Scanner "C++") + * looks for barcodes in a linear intensity sample stream + * - the Decoder (in @ref c-decoder "C" or @ref zbar::Decoder "C++") + * extracts barcodes from a stream of bar and space widths + */ + +#ifdef __cplusplus + +/** C++ namespace for library interfaces */ +namespace zbar { + extern "C" { +#endif + + +/** @name Global library interfaces */ +/*@{*/ + +/** "color" of element: bar or space. */ +typedef enum zbar_color_e { + ZBAR_SPACE = 0, /**< light area or space between bars */ + ZBAR_BAR = 1, /**< dark area or colored bar segment */ +} zbar_color_t; + +/** decoded symbol type. */ +typedef enum zbar_symbol_type_e { + ZBAR_NONE = 0, /**< no symbol decoded */ + ZBAR_PARTIAL = 1, /**< intermediate status */ + ZBAR_EAN2 = 2, /**< GS1 2-digit add-on */ + ZBAR_EAN5 = 5, /**< GS1 5-digit add-on */ + ZBAR_EAN8 = 8, /**< EAN-8 */ + ZBAR_UPCE = 9, /**< UPC-E */ + ZBAR_ISBN10 = 10, /**< ISBN-10 (from EAN-13). @since 0.4 */ + ZBAR_UPCA = 12, /**< UPC-A */ + ZBAR_EAN13 = 13, /**< EAN-13 */ + ZBAR_ISBN13 = 14, /**< ISBN-13 (from EAN-13). @since 0.4 */ + ZBAR_COMPOSITE = 15, /**< EAN/UPC composite */ + ZBAR_I25 = 25, /**< Interleaved 2 of 5. @since 0.4 */ + ZBAR_DATABAR = 34, /**< GS1 DataBar (RSS). @since 0.11 */ + ZBAR_DATABAR_EXP = 35, /**< GS1 DataBar Expanded. @since 0.11 */ + ZBAR_CODE39 = 39, /**< Code 39. @since 0.4 */ + ZBAR_PDF417 = 57, /**< PDF417. @since 0.6 */ + ZBAR_QRCODE = 64, /**< QR Code. @since 0.10 */ + ZBAR_CODE93 = 93, /**< Code 93. @since 0.11 */ + ZBAR_CODE128 = 128, /**< Code 128 */ + + /** mask for base symbol type. + * @deprecated in 0.11, remove this from existing code + */ + ZBAR_SYMBOL = 0x00ff, + /** 2-digit add-on flag. + * @deprecated in 0.11, a ::ZBAR_EAN2 component is used for + * 2-digit GS1 add-ons + */ + ZBAR_ADDON2 = 0x0200, + /** 5-digit add-on flag. + * @deprecated in 0.11, a ::ZBAR_EAN5 component is used for + * 5-digit GS1 add-ons + */ + ZBAR_ADDON5 = 0x0500, + /** add-on flag mask. + * @deprecated in 0.11, GS1 add-ons are represented using composite + * symbols of type ::ZBAR_COMPOSITE; add-on components use ::ZBAR_EAN2 + * or ::ZBAR_EAN5 + */ + ZBAR_ADDON = 0x0700, +} zbar_symbol_type_t; + +/** decoded symbol coarse orientation. + * @since 0.11 + */ +typedef enum zbar_orientation_e { + ZBAR_ORIENT_UNKNOWN = -1, /**< unable to determine orientation */ + ZBAR_ORIENT_UP, /**< upright, read left to right */ + ZBAR_ORIENT_RIGHT, /**< sideways, read top to bottom */ + ZBAR_ORIENT_DOWN, /**< upside-down, read right to left */ + ZBAR_ORIENT_LEFT, /**< sideways, read bottom to top */ +} zbar_orientation_t; + +/** error codes. */ +typedef enum zbar_error_e { + ZBAR_OK = 0, /**< no error */ + ZBAR_ERR_NOMEM, /**< out of memory */ + ZBAR_ERR_INTERNAL, /**< internal library error */ + ZBAR_ERR_UNSUPPORTED, /**< unsupported request */ + ZBAR_ERR_INVALID, /**< invalid request */ + ZBAR_ERR_SYSTEM, /**< system error */ + ZBAR_ERR_LOCKING, /**< locking error */ + ZBAR_ERR_BUSY, /**< all resources busy */ + ZBAR_ERR_XDISPLAY, /**< X11 display error */ + ZBAR_ERR_XPROTO, /**< X11 protocol error */ + ZBAR_ERR_CLOSED, /**< output window is closed */ + ZBAR_ERR_WINAPI, /**< windows system error */ + ZBAR_ERR_NUM /**< number of error codes */ +} zbar_error_t; + +/** decoder configuration options. + * @since 0.4 + */ +typedef enum zbar_config_e { + ZBAR_CFG_ENABLE = 0, /**< enable symbology/feature */ + ZBAR_CFG_ADD_CHECK, /**< enable check digit when optional */ + ZBAR_CFG_EMIT_CHECK, /**< return check digit when present */ + ZBAR_CFG_ASCII, /**< enable full ASCII character set */ + ZBAR_CFG_NUM, /**< number of boolean decoder configs */ + + ZBAR_CFG_MIN_LEN = 0x20, /**< minimum data length for valid decode */ + ZBAR_CFG_MAX_LEN, /**< maximum data length for valid decode */ + + ZBAR_CFG_UNCERTAINTY = 0x40,/**< required video consistency frames */ + + ZBAR_CFG_POSITION = 0x80, /**< enable scanner to collect position data */ + + ZBAR_CFG_X_DENSITY = 0x100, /**< image scanner vertical scan density */ + ZBAR_CFG_Y_DENSITY, /**< image scanner horizontal scan density */ +} zbar_config_t; + +/** decoder symbology modifier flags. + * @since 0.11 + */ +typedef enum zbar_modifier_e { + /** barcode tagged as GS1 (EAN.UCC) reserved + * (eg, FNC1 before first data character). + * data may be parsed as a sequence of GS1 AIs + */ + ZBAR_MOD_GS1 = 0, + + /** barcode tagged as AIM reserved + * (eg, FNC1 after first character or digit pair) + */ + ZBAR_MOD_AIM, + + /** number of modifiers */ + ZBAR_MOD_NUM, +} zbar_modifier_t; + +/** retrieve runtime library version information. + * @param major set to the running major version (unless NULL) + * @param minor set to the running minor version (unless NULL) + * @returns 0 + */ +extern int zbar_version(unsigned *major, + unsigned *minor); + +/** set global library debug level. + * @param verbosity desired debug level. higher values create more spew + */ +extern void zbar_set_verbosity(int verbosity); + +/** increase global library debug level. + * eg, for -vvvv + */ +extern void zbar_increase_verbosity(void); + +/** retrieve string name for symbol encoding. + * @param sym symbol type encoding + * @returns the static string name for the specified symbol type, + * or "UNKNOWN" if the encoding is not recognized + */ +extern const char *zbar_get_symbol_name(zbar_symbol_type_t sym); + +/** retrieve string name for addon encoding. + * @param sym symbol type encoding + * @returns static string name for any addon, or the empty string + * if no addons were decoded + * @deprecated in 0.11 + */ +extern const char *zbar_get_addon_name(zbar_symbol_type_t sym); + +/** retrieve string name for configuration setting. + * @param config setting to name + * @returns static string name for config, + * or the empty string if value is not a known config + */ +extern const char *zbar_get_config_name(zbar_config_t config); + +/** retrieve string name for modifier. + * @param modifier flag to name + * @returns static string name for modifier, + * or the empty string if the value is not a known flag + */ +extern const char *zbar_get_modifier_name(zbar_modifier_t modifier); + +/** retrieve string name for orientation. + * @param orientation orientation encoding + * @returns the static string name for the specified orientation, + * or "UNKNOWN" if the orientation is not recognized + * @since 0.11 + */ +extern const char *zbar_get_orientation_name(zbar_orientation_t orientation); + +/** parse a configuration string of the form "[symbology.]config[=value]". + * the config must match one of the recognized names. + * the symbology, if present, must match one of the recognized names. + * if symbology is unspecified, it will be set to 0. + * if value is unspecified it will be set to 1. + * @returns 0 if the config is parsed successfully, 1 otherwise + * @since 0.4 + */ +extern int zbar_parse_config(const char *config_string, + zbar_symbol_type_t *symbology, + zbar_config_t *config, + int *value); + +/** consistently compute fourcc values across architectures + * (adapted from v4l2 specification) + * @since 0.11 + */ +#define zbar_fourcc(a, b, c, d) \ + ((unsigned long)(a) | \ + ((unsigned long)(b) << 8) | \ + ((unsigned long)(c) << 16) | \ + ((unsigned long)(d) << 24)) + +/** parse a fourcc string into its encoded integer value. + * @since 0.11 + */ +static inline unsigned long zbar_fourcc_parse (const char *format) +{ + unsigned long fourcc = 0; + if(format) { + int i; + for(i = 0; i < 4 && format[i]; i++) + fourcc |= ((unsigned long)format[i]) << (i * 8); + } + return(fourcc); +} + +/** @internal type unsafe error API (don't use) */ +extern int _zbar_error_spew(const void *object, + int verbosity); +extern const char *_zbar_error_string(const void *object, + int verbosity); +extern zbar_error_t _zbar_get_error_code(const void *object); + +/*@}*/ + +struct zbar_symbol_s; +typedef struct zbar_symbol_s zbar_symbol_t; + +struct zbar_symbol_set_s; +typedef struct zbar_symbol_set_s zbar_symbol_set_t; + + +/*------------------------------------------------------------*/ +/** @name Symbol interface + * decoded barcode symbol result object. stores type, data, and image + * location of decoded symbol. all memory is owned by the library + */ +/*@{*/ + +/** @typedef zbar_symbol_t + * opaque decoded symbol object. + */ + +/** symbol reference count manipulation. + * increment the reference count when you store a new reference to the + * symbol. decrement when the reference is no longer used. do not + * refer to the symbol once the count is decremented and the + * containing image has been recycled or destroyed. + * @note the containing image holds a reference to the symbol, so you + * only need to use this if you keep a symbol after the image has been + * destroyed or reused. + * @since 0.9 + */ +extern void zbar_symbol_ref(const zbar_symbol_t *symbol, + int refs); + +/** retrieve type of decoded symbol. + * @returns the symbol type + */ +extern zbar_symbol_type_t zbar_symbol_get_type(const zbar_symbol_t *symbol); + +/** retrieve symbology boolean config settings. + * @returns a bitmask indicating which configs were set for the detected + * symbology during decoding. + * @since 0.11 + */ +extern unsigned int zbar_symbol_get_configs(const zbar_symbol_t *symbol); + +/** retrieve symbology modifier flag settings. + * @returns a bitmask indicating which characteristics were detected + * during decoding. + * @since 0.11 + */ +extern unsigned int zbar_symbol_get_modifiers(const zbar_symbol_t *symbol); + +/** retrieve data decoded from symbol. + * @returns the data string + */ +extern const char *zbar_symbol_get_data(const zbar_symbol_t *symbol); + +/** retrieve length of binary data. + * @returns the length of the decoded data + */ +extern unsigned int zbar_symbol_get_data_length(const zbar_symbol_t *symbol); + +/** retrieve a symbol confidence metric. + * @returns an unscaled, relative quantity: larger values are better + * than smaller values, where "large" and "small" are application + * dependent. + * @note expect the exact definition of this quantity to change as the + * metric is refined. currently, only the ordered relationship + * between two values is defined and will remain stable in the future + * @since 0.9 + */ +extern int zbar_symbol_get_quality(const zbar_symbol_t *symbol); + +/** retrieve current cache count. when the cache is enabled for the + * image_scanner this provides inter-frame reliability and redundancy + * information for video streams. + * @returns < 0 if symbol is still uncertain. + * @returns 0 if symbol is newly verified. + * @returns > 0 for duplicate symbols + */ +extern int zbar_symbol_get_count(const zbar_symbol_t *symbol); + +/** retrieve the number of points in the location polygon. the + * location polygon defines the image area that the symbol was + * extracted from. + * @returns the number of points in the location polygon + * @note this is currently not a polygon, but the scan locations + * where the symbol was decoded + */ +extern unsigned zbar_symbol_get_loc_size(const zbar_symbol_t *symbol); + +/** retrieve location polygon x-coordinates. + * points are specified by 0-based index. + * @returns the x-coordinate for a point in the location polygon. + * @returns -1 if index is out of range + */ +extern int zbar_symbol_get_loc_x(const zbar_symbol_t *symbol, + unsigned index); + +/** retrieve location polygon y-coordinates. + * points are specified by 0-based index. + * @returns the y-coordinate for a point in the location polygon. + * @returns -1 if index is out of range + */ +extern int zbar_symbol_get_loc_y(const zbar_symbol_t *symbol, + unsigned index); + +/** retrieve general orientation of decoded symbol. + * @returns a coarse, axis-aligned indication of symbol orientation or + * ::ZBAR_ORIENT_UNKNOWN if unknown + * @since 0.11 + */ +extern zbar_orientation_t +zbar_symbol_get_orientation(const zbar_symbol_t *symbol); + +/** iterate the set to which this symbol belongs (there can be only one). + * @returns the next symbol in the set, or + * @returns NULL when no more results are available + */ +extern const zbar_symbol_t *zbar_symbol_next(const zbar_symbol_t *symbol); + +/** retrieve components of a composite result. + * @returns the symbol set containing the components + * @returns NULL if the symbol is already a physical symbol + * @since 0.10 + */ +extern const zbar_symbol_set_t* +zbar_symbol_get_components(const zbar_symbol_t *symbol); + +/** iterate components of a composite result. + * @returns the first physical component symbol of a composite result + * @returns NULL if the symbol is already a physical symbol + * @since 0.10 + */ +extern const zbar_symbol_t* +zbar_symbol_first_component(const zbar_symbol_t *symbol); + +/** print XML symbol element representation to user result buffer. + * @see http://zbar.sourceforge.net/2008/barcode.xsd for the schema. + * @param symbol is the symbol to print + * @param buffer is the inout result pointer, it will be reallocated + * with a larger size if necessary. + * @param buflen is inout length of the result buffer. + * @returns the buffer pointer + * @since 0.6 + */ +extern char *zbar_symbol_xml(const zbar_symbol_t *symbol, + char **buffer, + unsigned *buflen); + +/*@}*/ + +/*------------------------------------------------------------*/ +/** @name Symbol Set interface + * container for decoded result symbols associated with an image + * or a composite symbol. + * @since 0.10 + */ +/*@{*/ + +/** @typedef zbar_symbol_set_t + * opaque symbol iterator object. + * @since 0.10 + */ + +/** reference count manipulation. + * increment the reference count when you store a new reference. + * decrement when the reference is no longer used. do not refer to + * the object any longer once references have been released. + * @since 0.10 + */ +extern void zbar_symbol_set_ref(const zbar_symbol_set_t *symbols, + int refs); + +/** retrieve set size. + * @returns the number of symbols in the set. + * @since 0.10 + */ +extern int zbar_symbol_set_get_size(const zbar_symbol_set_t *symbols); + +/** set iterator. + * @returns the first decoded symbol result in a set + * @returns NULL if the set is empty + * @since 0.10 + */ +extern const zbar_symbol_t* +zbar_symbol_set_first_symbol(const zbar_symbol_set_t *symbols); + +/** raw result iterator. + * @returns the first decoded symbol result in a set, *before* filtering + * @returns NULL if the set is empty + * @since 0.11 + */ +extern const zbar_symbol_t* +zbar_symbol_set_first_unfiltered(const zbar_symbol_set_t *symbols); + +/*@}*/ + +/*------------------------------------------------------------*/ +/** @name Image interface + * stores image data samples along with associated format and size + * metadata + */ +/*@{*/ + +struct zbar_image_s; +/** opaque image object. */ +typedef struct zbar_image_s zbar_image_t; + +/** cleanup handler callback function. + * called to free sample data when an image is destroyed. + */ +typedef void (zbar_image_cleanup_handler_t)(zbar_image_t *image); + +/** data handler callback function. + * called when decoded symbol results are available for an image + */ +typedef void (zbar_image_data_handler_t)(zbar_image_t *image, + const void *userdata); + +/** new image constructor. + * @returns a new image object with uninitialized data and format. + * this image should be destroyed (using zbar_image_destroy()) as + * soon as the application is finished with it + */ +extern zbar_image_t *zbar_image_create(void); + +/** image destructor. all images created by or returned to the + * application should be destroyed using this function. when an image + * is destroyed, the associated data cleanup handler will be invoked + * if available + * @note make no assumptions about the image or the data buffer. + * they may not be destroyed/cleaned immediately if the library + * is still using them. if necessary, use the cleanup handler hook + * to keep track of image data buffers + */ +extern void zbar_image_destroy(zbar_image_t *image); + +/** image reference count manipulation. + * increment the reference count when you store a new reference to the + * image. decrement when the reference is no longer used. do not + * refer to the image any longer once the count is decremented. + * zbar_image_ref(image, -1) is the same as zbar_image_destroy(image) + * @since 0.5 + */ +extern void zbar_image_ref(zbar_image_t *image, + int refs); + +/** image format conversion. refer to the documentation for supported + * image formats + * @returns a @em new image with the sample data from the original image + * converted to the requested format. the original image is + * unaffected. + * @note the converted image size may be rounded (up) due to format + * constraints + */ +extern zbar_image_t *zbar_image_convert(const zbar_image_t *image, + unsigned long format); + +/** image format conversion with crop/pad. + * if the requested size is larger than the image, the last row/column + * are duplicated to cover the difference. if the requested size is + * smaller than the image, the extra rows/columns are dropped from the + * right/bottom. + * @returns a @em new image with the sample data from the original + * image converted to the requested format and size. + * @note the image is @em not scaled + * @see zbar_image_convert() + * @since 0.4 + */ +extern zbar_image_t *zbar_image_convert_resize(const zbar_image_t *image, + unsigned long format, + unsigned width, + unsigned height); + +/** retrieve the image format. + * @returns the fourcc describing the format of the image sample data + */ +extern unsigned long zbar_image_get_format(const zbar_image_t *image); + +/** retrieve a "sequence" (page/frame) number associated with this image. + * @since 0.6 + */ +extern unsigned zbar_image_get_sequence(const zbar_image_t *image); + +/** retrieve the width of the image. + * @returns the width in sample columns + */ +extern unsigned zbar_image_get_width(const zbar_image_t *image); + +/** retrieve the height of the image. + * @returns the height in sample rows + */ +extern unsigned zbar_image_get_height(const zbar_image_t *image); + +/** retrieve both dimensions of the image. + * fills in the width and height in samples + */ +extern void zbar_image_get_size(const zbar_image_t *image, + unsigned *width, + unsigned *height); + +/** retrieve the crop rectangle. + * fills in the image coordinates of the upper left corner and size + * of an axis-aligned rectangular area of the image that will be scanned. + * defaults to the full image + * @since 0.11 + */ +extern void zbar_image_get_crop(const zbar_image_t *image, + unsigned *x, + unsigned *y, + unsigned *width, + unsigned *height); + +/** return the image sample data. the returned data buffer is only + * valid until zbar_image_destroy() is called + */ +extern const void *zbar_image_get_data(const zbar_image_t *image); + +/** return the size of image data. + * @since 0.6 + */ +extern unsigned long zbar_image_get_data_length(const zbar_image_t *img); + +/** retrieve the decoded results. + * @returns the (possibly empty) set of decoded symbols + * @returns NULL if the image has not been scanned + * @since 0.10 + */ +extern const zbar_symbol_set_t* +zbar_image_get_symbols(const zbar_image_t *image); + +/** associate the specified symbol set with the image, replacing any + * existing results. use NULL to release the current results from the + * image. + * @see zbar_image_scanner_recycle_image() + * @since 0.10 + */ +extern void zbar_image_set_symbols(zbar_image_t *image, + const zbar_symbol_set_t *symbols); + +/** image_scanner decode result iterator. + * @returns the first decoded symbol result for an image + * or NULL if no results are available + */ +extern const zbar_symbol_t* +zbar_image_first_symbol(const zbar_image_t *image); + +/** specify the fourcc image format code for image sample data. + * refer to the documentation for supported formats. + * @note this does not convert the data! + * (see zbar_image_convert() for that) + */ +extern void zbar_image_set_format(zbar_image_t *image, + unsigned long format); + +/** associate a "sequence" (page/frame) number with this image. + * @since 0.6 + */ +extern void zbar_image_set_sequence(zbar_image_t *image, + unsigned sequence_num); + +/** specify the pixel size of the image. + * @note this also resets the crop rectangle to the full image + * (0, 0, width, height) + * @note this does not affect the data! + */ +extern void zbar_image_set_size(zbar_image_t *image, + unsigned width, + unsigned height); + +/** specify a rectangular region of the image to scan. + * the rectangle will be clipped to the image boundaries. + * defaults to the full image specified by zbar_image_set_size() + */ +extern void zbar_image_set_crop(zbar_image_t *image, + unsigned x, + unsigned y, + unsigned width, + unsigned height); + +/** specify image sample data. when image data is no longer needed by + * the library the specific data cleanup handler will be called + * (unless NULL) + * @note application image data will not be modified by the library + */ +extern void zbar_image_set_data(zbar_image_t *image, + const void *data, + unsigned long data_byte_length, + zbar_image_cleanup_handler_t *cleanup_hndlr); + +/** built-in cleanup handler. + * passes the image data buffer to free() + */ +extern void zbar_image_free_data(zbar_image_t *image); + +/** associate user specified data value with an image. + * @since 0.5 + */ +extern void zbar_image_set_userdata(zbar_image_t *image, + void *userdata); + +/** return user specified data value associated with the image. + * @since 0.5 + */ +extern void *zbar_image_get_userdata(const zbar_image_t *image); + +/** dump raw image data to a file for debug. + * the data will be prefixed with a 16 byte header consisting of: + * - 4 bytes uint = 0x676d697a ("zimg") + * - 4 bytes format fourcc + * - 2 bytes width + * - 2 bytes height + * - 4 bytes size of following image data in bytes + * this header can be dumped w/eg: + * @verbatim + od -Ax -tx1z -N16 -w4 [file] +@endverbatim + * for some formats the image can be displayed/converted using + * ImageMagick, eg: + * @verbatim + display -size 640x480+16 [-depth ?] [-sampling-factor ?x?] \ + {GRAY,RGB,UYVY,YUV}:[file] +@endverbatim + * + * @param image the image object to dump + * @param filebase base filename, appended with ".XXXX.zimg" where + * XXXX is the format fourcc + * @returns 0 on success or a system error code on failure + */ +extern int zbar_image_write(const zbar_image_t *image, + const char *filebase); + +/** read back an image in the format written by zbar_image_write() + * @note TBD + */ +extern zbar_image_t *zbar_image_read(char *filename); + +/*@}*/ + +/*------------------------------------------------------------*/ +/** @name Processor interface + * @anchor c-processor + * high-level self-contained image processor. + * processes video and images for barcodes, optionally displaying + * images to a library owned output window + */ +/*@{*/ + +struct zbar_processor_s; +/** opaque standalone processor object. */ +typedef struct zbar_processor_s zbar_processor_t; + +/** constructor. + * if threaded is set and threading is available the processor + * will spawn threads where appropriate to avoid blocking and + * improve responsiveness + */ +extern zbar_processor_t *zbar_processor_create(int threaded); + +/** destructor. cleans up all resources associated with the processor + */ +extern void zbar_processor_destroy(zbar_processor_t *processor); + +/** (re)initialization. + * opens a video input device and/or prepares to display output + */ +extern int zbar_processor_init(zbar_processor_t *processor, + const char *video_device, + int enable_display); + +/** request a preferred size for the video image from the device. + * the request may be adjusted or completely ignored by the driver. + * @note must be called before zbar_processor_init() + * @since 0.6 + */ +extern int zbar_processor_request_size(zbar_processor_t *processor, + unsigned width, + unsigned height); + +/** request a preferred video driver interface version for + * debug/testing. + * @note must be called before zbar_processor_init() + * @since 0.6 + */ +extern int zbar_processor_request_interface(zbar_processor_t *processor, + int version); + +/** request a preferred video I/O mode for debug/testing. You will + * get errors if the driver does not support the specified mode. + * @verbatim + 0 = auto-detect + 1 = force I/O using read() + 2 = force memory mapped I/O using mmap() + 3 = force USERPTR I/O (v4l2 only) +@endverbatim + * @note must be called before zbar_processor_init() + * @since 0.7 + */ +extern int zbar_processor_request_iomode(zbar_processor_t *video, + int iomode); + +/** force specific input and output formats for debug/testing. + * @note must be called before zbar_processor_init() + */ +extern int zbar_processor_force_format(zbar_processor_t *processor, + unsigned long input_format, + unsigned long output_format); + +/** setup result handler callback. + * the specified function will be called by the processor whenever + * new results are available from the video stream or a static image. + * pass a NULL value to disable callbacks. + * @param processor the object on which to set the handler. + * @param handler the function to call when new results are available. + * @param userdata is set as with zbar_processor_set_userdata(). + * @returns the previously registered handler + */ +extern zbar_image_data_handler_t* +zbar_processor_set_data_handler(zbar_processor_t *processor, + zbar_image_data_handler_t *handler, + const void *userdata); + +/** associate user specified data value with the processor. + * @since 0.6 + */ +extern void zbar_processor_set_userdata(zbar_processor_t *processor, + void *userdata); + +/** return user specified data value associated with the processor. + * @since 0.6 + */ +extern void *zbar_processor_get_userdata(const zbar_processor_t *processor); + +/** set config for indicated symbology (0 for all) to specified value. + * @returns 0 for success, non-0 for failure (config does not apply to + * specified symbology, or value out of range) + * @see zbar_decoder_set_config() + * @since 0.4 + */ +extern int zbar_processor_set_config(zbar_processor_t *processor, + zbar_symbol_type_t symbology, + zbar_config_t config, + int value); + +/** parse configuration string using zbar_parse_config() + * and apply to processor using zbar_processor_set_config(). + * @returns 0 for success, non-0 for failure + * @see zbar_parse_config() + * @see zbar_processor_set_config() + * @since 0.4 + */ +static inline int zbar_processor_parse_config (zbar_processor_t *processor, + const char *config_string) +{ + zbar_symbol_type_t sym; + zbar_config_t cfg; + int val; + return(zbar_parse_config(config_string, &sym, &cfg, &val) || + zbar_processor_set_config(processor, sym, cfg, val)); +} + +/** retrieve the current state of the ouput window. + * @returns 1 if the output window is currently displayed, 0 if not. + * @returns -1 if an error occurs + */ +extern int zbar_processor_is_visible(zbar_processor_t *processor); + +/** show or hide the display window owned by the library. + * the size will be adjusted to the input size + */ +extern int zbar_processor_set_visible(zbar_processor_t *processor, + int visible); + +/** control the processor in free running video mode. + * only works if video input is initialized. if threading is in use, + * scanning will occur in the background, otherwise this is only + * useful wrapping calls to zbar_processor_user_wait(). if the + * library output window is visible, video display will be enabled. + */ +extern int zbar_processor_set_active(zbar_processor_t *processor, + int active); + +/** retrieve decode results for last scanned image/frame. + * @returns the symbol set result container or NULL if no results are + * available + * @note the returned symbol set has its reference count incremented; + * ensure that the count is decremented after use + * @since 0.10 + */ +extern const zbar_symbol_set_t* +zbar_processor_get_results(const zbar_processor_t *processor); + +/** wait for input to the display window from the user + * (via mouse or keyboard). + * @returns >0 when input is received, 0 if timeout ms expired + * with no input or -1 in case of an error + */ +extern int zbar_processor_user_wait(zbar_processor_t *processor, + int timeout); + +/** process from the video stream until a result is available, + * or the timeout (in milliseconds) expires. + * specify a timeout of -1 to scan indefinitely + * (zbar_processor_set_active() may still be used to abort the scan + * from another thread). + * if the library window is visible, video display will be enabled. + * @note that multiple results may still be returned (despite the + * name). + * @returns >0 if symbols were successfully decoded, + * 0 if no symbols were found (ie, the timeout expired) + * or -1 if an error occurs + */ +extern int zbar_process_one(zbar_processor_t *processor, + int timeout); + +/** process the provided image for barcodes. + * if the library window is visible, the image will be displayed. + * @returns >0 if symbols were successfully decoded, + * 0 if no symbols were found or -1 if an error occurs + */ +extern int zbar_process_image(zbar_processor_t *processor, + zbar_image_t *image); + +/** display detail for last processor error to stderr. + * @returns a non-zero value suitable for passing to exit() + */ +static inline int +zbar_processor_error_spew (const zbar_processor_t *processor, + int verbosity) +{ + return(_zbar_error_spew(processor, verbosity)); +} + +/** retrieve the detail string for the last processor error. */ +static inline const char* +zbar_processor_error_string (const zbar_processor_t *processor, + int verbosity) +{ + return(_zbar_error_string(processor, verbosity)); +} + +/** retrieve the type code for the last processor error. */ +static inline zbar_error_t +zbar_processor_get_error_code (const zbar_processor_t *processor) +{ + return(_zbar_get_error_code(processor)); +} + +/*@}*/ + +/*------------------------------------------------------------*/ +/** @name Video interface + * @anchor c-video + * mid-level video source abstraction. + * captures images from a video device + */ +/*@{*/ + +struct zbar_video_s; +/** opaque video object. */ +typedef struct zbar_video_s zbar_video_t; + +/** constructor. */ +extern zbar_video_t *zbar_video_create(void); + +/** destructor. */ +extern void zbar_video_destroy(zbar_video_t *video); + +/** open and probe a video device. + * the device specified by platform specific unique name + * (v4l device node path in *nix eg "/dev/video", + * DirectShow DevicePath property in windows). + * @returns 0 if successful or -1 if an error occurs + */ +extern int zbar_video_open(zbar_video_t *video, + const char *device); + +/** retrieve file descriptor associated with open *nix video device + * useful for using select()/poll() to tell when new images are + * available (NB v4l2 only!!). + * @returns the file descriptor or -1 if the video device is not open + * or the driver only supports v4l1 + */ +extern int zbar_video_get_fd(const zbar_video_t *video); + +/** request a preferred size for the video image from the device. + * the request may be adjusted or completely ignored by the driver. + * @returns 0 if successful or -1 if the video device is already + * initialized + * @since 0.6 + */ +extern int zbar_video_request_size(zbar_video_t *video, + unsigned width, + unsigned height); + +/** request a preferred driver interface version for debug/testing. + * @note must be called before zbar_video_open() + * @since 0.6 + */ +extern int zbar_video_request_interface(zbar_video_t *video, + int version); + +/** request a preferred I/O mode for debug/testing. You will get + * errors if the driver does not support the specified mode. + * @verbatim + 0 = auto-detect + 1 = force I/O using read() + 2 = force memory mapped I/O using mmap() + 3 = force USERPTR I/O (v4l2 only) +@endverbatim + * @note must be called before zbar_video_open() + * @since 0.7 + */ +extern int zbar_video_request_iomode(zbar_video_t *video, + int iomode); + +/** retrieve current output image width. + * @returns the width or 0 if the video device is not open + */ +extern int zbar_video_get_width(const zbar_video_t *video); + +/** retrieve current output image height. + * @returns the height or 0 if the video device is not open + */ +extern int zbar_video_get_height(const zbar_video_t *video); + +/** initialize video using a specific format for debug. + * use zbar_negotiate_format() to automatically select and initialize + * the best available format + */ +extern int zbar_video_init(zbar_video_t *video, + unsigned long format); + +/** start/stop video capture. + * all buffered images are retired when capture is disabled. + * @returns 0 if successful or -1 if an error occurs + */ +extern int zbar_video_enable(zbar_video_t *video, + int enable); + +/** retrieve next captured image. blocks until an image is available. + * @returns NULL if video is not enabled or an error occurs + */ +extern zbar_image_t *zbar_video_next_image(zbar_video_t *video); + +/** display detail for last video error to stderr. + * @returns a non-zero value suitable for passing to exit() + */ +static inline int zbar_video_error_spew (const zbar_video_t *video, + int verbosity) +{ + return(_zbar_error_spew(video, verbosity)); +} + +/** retrieve the detail string for the last video error. */ +static inline const char *zbar_video_error_string (const zbar_video_t *video, + int verbosity) +{ + return(_zbar_error_string(video, verbosity)); +} + +/** retrieve the type code for the last video error. */ +static inline zbar_error_t +zbar_video_get_error_code (const zbar_video_t *video) +{ + return(_zbar_get_error_code(video)); +} + +/*@}*/ + +/*------------------------------------------------------------*/ +/** @name Window interface + * @anchor c-window + * mid-level output window abstraction. + * displays images to user-specified platform specific output window + */ +/*@{*/ + +struct zbar_window_s; +/** opaque window object. */ +typedef struct zbar_window_s zbar_window_t; + +/** constructor. */ +extern zbar_window_t *zbar_window_create(void); + +/** destructor. */ +extern void zbar_window_destroy(zbar_window_t *window); + +/** associate reader with an existing platform window. + * This can be any "Drawable" for X Windows or a "HWND" for windows. + * input images will be scaled into the output window. + * pass NULL to detach from the resource, further input will be + * ignored + */ +extern int zbar_window_attach(zbar_window_t *window, + void *x11_display_w32_hwnd, + unsigned long x11_drawable); + +/** control content level of the reader overlay. + * the overlay displays graphical data for informational or debug + * purposes. higher values increase the level of annotation (possibly + * decreasing performance). @verbatim + 0 = disable overlay + 1 = outline decoded symbols (default) + 2 = also track and display input frame rate +@endverbatim + */ +extern void zbar_window_set_overlay(zbar_window_t *window, + int level); + +/** retrieve current content level of reader overlay. + * @see zbar_window_set_overlay() + * @since 0.10 + */ +extern int zbar_window_get_overlay(const zbar_window_t *window); + +/** draw a new image into the output window. */ +extern int zbar_window_draw(zbar_window_t *window, + zbar_image_t *image); + +/** redraw the last image (exposure handler). */ +extern int zbar_window_redraw(zbar_window_t *window); + +/** resize the image window (reconfigure handler). + * this does @em not update the contents of the window + * @since 0.3, changed in 0.4 to not redraw window + */ +extern int zbar_window_resize(zbar_window_t *window, + unsigned width, + unsigned height); + +/** display detail for last window error to stderr. + * @returns a non-zero value suitable for passing to exit() + */ +static inline int zbar_window_error_spew (const zbar_window_t *window, + int verbosity) +{ + return(_zbar_error_spew(window, verbosity)); +} + +/** retrieve the detail string for the last window error. */ +static inline const char* +zbar_window_error_string (const zbar_window_t *window, + int verbosity) +{ + return(_zbar_error_string(window, verbosity)); +} + +/** retrieve the type code for the last window error. */ +static inline zbar_error_t +zbar_window_get_error_code (const zbar_window_t *window) +{ + return(_zbar_get_error_code(window)); +} + + +/** select a compatible format between video input and output window. + * the selection algorithm attempts to use a format shared by + * video input and window output which is also most useful for + * barcode scanning. if a format conversion is necessary, it will + * heuristically attempt to minimize the cost of the conversion + */ +extern int zbar_negotiate_format(zbar_video_t *video, + zbar_window_t *window); + +/*@}*/ + +/*------------------------------------------------------------*/ +/** @name Image Scanner interface + * @anchor c-imagescanner + * mid-level image scanner interface. + * reads barcodes from 2-D images + */ +/*@{*/ + +struct zbar_image_scanner_s; +/** opaque image scanner object. */ +typedef struct zbar_image_scanner_s zbar_image_scanner_t; + +/** constructor. */ +extern zbar_image_scanner_t *zbar_image_scanner_create(void); + +/** destructor. */ +extern void zbar_image_scanner_destroy(zbar_image_scanner_t *scanner); + +/** setup result handler callback. + * the specified function will be called by the scanner whenever + * new results are available from a decoded image. + * pass a NULL value to disable callbacks. + * @returns the previously registered handler + */ +extern zbar_image_data_handler_t* +zbar_image_scanner_set_data_handler(zbar_image_scanner_t *scanner, + zbar_image_data_handler_t *handler, + const void *userdata); + + +/** set config for indicated symbology (0 for all) to specified value. + * @returns 0 for success, non-0 for failure (config does not apply to + * specified symbology, or value out of range) + * @see zbar_decoder_set_config() + * @since 0.4 + */ +extern int zbar_image_scanner_set_config(zbar_image_scanner_t *scanner, + zbar_symbol_type_t symbology, + zbar_config_t config, + int value); + +/** parse configuration string using zbar_parse_config() + * and apply to image scanner using zbar_image_scanner_set_config(). + * @returns 0 for success, non-0 for failure + * @see zbar_parse_config() + * @see zbar_image_scanner_set_config() + * @since 0.4 + */ +static inline int +zbar_image_scanner_parse_config (zbar_image_scanner_t *scanner, + const char *config_string) +{ + zbar_symbol_type_t sym; + zbar_config_t cfg; + int val; + return(zbar_parse_config(config_string, &sym, &cfg, &val) || + zbar_image_scanner_set_config(scanner, sym, cfg, val)); +} + +/** enable or disable the inter-image result cache (default disabled). + * mostly useful for scanning video frames, the cache filters + * duplicate results from consecutive images, while adding some + * consistency checking and hysteresis to the results. + * this interface also clears the cache + */ +extern void zbar_image_scanner_enable_cache(zbar_image_scanner_t *scanner, + int enable); + +/** remove any previously decoded results from the image scanner and the + * specified image. somewhat more efficient version of + * zbar_image_set_symbols(image, NULL) which may retain memory for + * subsequent decodes + * @since 0.10 + */ +extern void zbar_image_scanner_recycle_image(zbar_image_scanner_t *scanner, + zbar_image_t *image); + +/** retrieve decode results for last scanned image. + * @returns the symbol set result container or NULL if no results are + * available + * @note the symbol set does not have its reference count adjusted; + * ensure that the count is incremented if the results may be kept + * after the next image is scanned + * @since 0.10 + */ +extern const zbar_symbol_set_t* +zbar_image_scanner_get_results(const zbar_image_scanner_t *scanner); + +/** scan for symbols in provided image. The image format must be + * "Y800" or "GRAY". + * @returns >0 if symbols were successfully decoded from the image, + * 0 if no symbols were found or -1 if an error occurs + * @see zbar_image_convert() + * @since 0.9 - changed to only accept grayscale images + */ +extern int zbar_scan_image(zbar_image_scanner_t *scanner, + zbar_image_t *image); + +/*@}*/ + +/*------------------------------------------------------------*/ +/** @name Decoder interface + * @anchor c-decoder + * low-level bar width stream decoder interface. + * identifies symbols and extracts encoded data + */ +/*@{*/ + +struct zbar_decoder_s; +/** opaque decoder object. */ +typedef struct zbar_decoder_s zbar_decoder_t; + +/** decoder data handler callback function. + * called by decoder when new data has just been decoded + */ +typedef void (zbar_decoder_handler_t)(zbar_decoder_t *decoder); + +/** constructor. */ +extern zbar_decoder_t *zbar_decoder_create(void); + +/** destructor. */ +extern void zbar_decoder_destroy(zbar_decoder_t *decoder); + +/** set config for indicated symbology (0 for all) to specified value. + * @returns 0 for success, non-0 for failure (config does not apply to + * specified symbology, or value out of range) + * @since 0.4 + */ +extern int zbar_decoder_set_config(zbar_decoder_t *decoder, + zbar_symbol_type_t symbology, + zbar_config_t config, + int value); + +/** parse configuration string using zbar_parse_config() + * and apply to decoder using zbar_decoder_set_config(). + * @returns 0 for success, non-0 for failure + * @see zbar_parse_config() + * @see zbar_decoder_set_config() + * @since 0.4 + */ +static inline int zbar_decoder_parse_config (zbar_decoder_t *decoder, + const char *config_string) +{ + zbar_symbol_type_t sym; + zbar_config_t cfg; + int val; + return(zbar_parse_config(config_string, &sym, &cfg, &val) || + zbar_decoder_set_config(decoder, sym, cfg, val)); +} + +/** retrieve symbology boolean config settings. + * @returns a bitmask indicating which configs are currently set for the + * specified symbology. + * @since 0.11 + */ +extern unsigned int zbar_decoder_get_configs(const zbar_decoder_t *decoder, + zbar_symbol_type_t symbology); + +/** clear all decoder state. + * any partial symbols are flushed + */ +extern void zbar_decoder_reset(zbar_decoder_t *decoder); + +/** mark start of a new scan pass. + * clears any intra-symbol state and resets color to ::ZBAR_SPACE. + * any partially decoded symbol state is retained + */ +extern void zbar_decoder_new_scan(zbar_decoder_t *decoder); + +/** process next bar/space width from input stream. + * the width is in arbitrary relative units. first value of a scan + * is ::ZBAR_SPACE width, alternating from there. + * @returns appropriate symbol type if width completes + * decode of a symbol (data is available for retrieval) + * @returns ::ZBAR_PARTIAL as a hint if part of a symbol was decoded + * @returns ::ZBAR_NONE (0) if no new symbol data is available + */ +extern zbar_symbol_type_t zbar_decode_width(zbar_decoder_t *decoder, + unsigned width); + +/** retrieve color of @em next element passed to + * zbar_decode_width(). */ +extern zbar_color_t zbar_decoder_get_color(const zbar_decoder_t *decoder); + +/** retrieve last decoded data. + * @returns the data string or NULL if no new data available. + * the returned data buffer is owned by library, contents are only + * valid between non-0 return from zbar_decode_width and next library + * call + */ +extern const char *zbar_decoder_get_data(const zbar_decoder_t *decoder); + +/** retrieve length of binary data. + * @returns the length of the decoded data or 0 if no new data + * available. + */ +extern unsigned int +zbar_decoder_get_data_length(const zbar_decoder_t *decoder); + +/** retrieve last decoded symbol type. + * @returns the type or ::ZBAR_NONE if no new data available + */ +extern zbar_symbol_type_t +zbar_decoder_get_type(const zbar_decoder_t *decoder); + +/** retrieve modifier flags for the last decoded symbol. + * @returns a bitmask indicating which characteristics were detected + * during decoding. + * @since 0.11 + */ +extern unsigned int zbar_decoder_get_modifiers(const zbar_decoder_t *decoder); + +/** retrieve last decode direction. + * @returns 1 for forward and -1 for reverse + * @returns 0 if the decode direction is unknown or does not apply + * @since 0.11 + */ +extern int zbar_decoder_get_direction(const zbar_decoder_t *decoder); + +/** setup data handler callback. + * the registered function will be called by the decoder + * just before zbar_decode_width() returns a non-zero value. + * pass a NULL value to disable callbacks. + * @returns the previously registered handler + */ +extern zbar_decoder_handler_t* +zbar_decoder_set_handler(zbar_decoder_t *decoder, + zbar_decoder_handler_t *handler); + +/** associate user specified data value with the decoder. */ +extern void zbar_decoder_set_userdata(zbar_decoder_t *decoder, + void *userdata); + +/** return user specified data value associated with the decoder. */ +extern void *zbar_decoder_get_userdata(const zbar_decoder_t *decoder); + +/*@}*/ + +/*------------------------------------------------------------*/ +/** @name Scanner interface + * @anchor c-scanner + * low-level linear intensity sample stream scanner interface. + * identifies "bar" edges and measures width between them. + * optionally passes to bar width decoder + */ +/*@{*/ + +struct zbar_scanner_s; +/** opaque scanner object. */ +typedef struct zbar_scanner_s zbar_scanner_t; + +/** constructor. + * if decoder is non-NULL it will be attached to scanner + * and called automatically at each new edge + * current color is initialized to ::ZBAR_SPACE + * (so an initial BAR->SPACE transition may be discarded) + */ +extern zbar_scanner_t *zbar_scanner_create(zbar_decoder_t *decoder); + +/** destructor. */ +extern void zbar_scanner_destroy(zbar_scanner_t *scanner); + +/** clear all scanner state. + * also resets an associated decoder + */ +extern zbar_symbol_type_t zbar_scanner_reset(zbar_scanner_t *scanner); + +/** mark start of a new scan pass. resets color to ::ZBAR_SPACE. + * also updates an associated decoder. + * @returns any decode results flushed from the pipeline + * @note when not using callback handlers, the return value should + * be checked the same as zbar_scan_y() + * @note call zbar_scanner_flush() at least twice before calling this + * method to ensure no decode results are lost + */ +extern zbar_symbol_type_t zbar_scanner_new_scan(zbar_scanner_t *scanner); + +/** flush scanner processing pipeline. + * forces current scanner position to be a scan boundary. + * call multiple times (max 3) to completely flush decoder. + * @returns any decode/scan results flushed from the pipeline + * @note when not using callback handlers, the return value should + * be checked the same as zbar_scan_y() + * @since 0.9 + */ +extern zbar_symbol_type_t zbar_scanner_flush(zbar_scanner_t *scanner); + +/** process next sample intensity value. + * intensity (y) is in arbitrary relative units. + * @returns result of zbar_decode_width() if a decoder is attached, + * otherwise @returns (::ZBAR_PARTIAL) when new edge is detected + * or 0 (::ZBAR_NONE) if no new edge is detected + */ +extern zbar_symbol_type_t zbar_scan_y(zbar_scanner_t *scanner, + int y); + +/** process next sample from RGB (or BGR) triple. */ +static inline zbar_symbol_type_t zbar_scan_rgb24 (zbar_scanner_t *scanner, + unsigned char *rgb) +{ + return(zbar_scan_y(scanner, rgb[0] + rgb[1] + rgb[2])); +} + +/** retrieve last scanned width. */ +extern unsigned zbar_scanner_get_width(const zbar_scanner_t *scanner); + +/** retrieve sample position of last edge. + * @since 0.10 + */ +extern unsigned zbar_scanner_get_edge(const zbar_scanner_t *scn, + unsigned offset, + int prec); + +/** retrieve last scanned color. */ +extern zbar_color_t zbar_scanner_get_color(const zbar_scanner_t *scanner); + +/*@}*/ + +#ifdef __cplusplus + } +} + +# include "zbar/Exception.h" +# include "zbar/Decoder.h" +# include "zbar/Scanner.h" +# include "zbar/Symbol.h" +# include "zbar/Image.h" +# include "zbar/ImageScanner.h" +# include "zbar/Video.h" +# include "zbar/Window.h" +# include "zbar/Processor.h" +#endif + +#endif diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Decoder.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Decoder.h new file mode 100644 index 0000000..27e78d8 --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Decoder.h @@ -0,0 +1,202 @@ +//------------------------------------------------------------------------ +// Copyright 2007-2010 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ +#ifndef _ZBAR_DECODER_H_ +#define _ZBAR_DECODER_H_ + +/// @file +/// Decoder C++ wrapper + +#ifndef _ZBAR_H_ +# error "include zbar.h in your application, **not** zbar/Decoder.h" +#endif + +#include + +namespace zbar { + +/// low-level bar width stream decoder interface. +/// identifies symbols and extracts encoded data + +class Decoder { + public: + + /// Decoder result handler. + /// applications should subtype this and pass an instance to + /// set_handler() to implement result processing + class Handler { + public: + virtual ~Handler() { } + + /// invoked by the Decoder as decode results become available. + virtual void decode_callback(Decoder &decoder) = 0; + }; + + /// constructor. + Decoder () + : _handler(NULL) + { + _decoder = zbar_decoder_create(); + } + + ~Decoder () + { + zbar_decoder_destroy(_decoder); + } + + /// clear all decoder state. + /// see zbar_decoder_reset() + void reset () + { + zbar_decoder_reset(_decoder); + } + + /// mark start of a new scan pass. + /// see zbar_decoder_new_scan() + void new_scan () + { + zbar_decoder_new_scan(_decoder); + } + + /// process next bar/space width from input stream. + /// see zbar_decode_width() + zbar_symbol_type_t decode_width (unsigned width) + { + return(zbar_decode_width(_decoder, width)); + } + + /// process next bar/space width from input stream. + /// see zbar_decode_width() + Decoder& operator<< (unsigned width) + { + zbar_decode_width(_decoder, width); + return(*this); + } + + /// retrieve color of @em next element passed to Decoder. + /// see zbar_decoder_get_color() + zbar_color_t get_color () const + { + return(zbar_decoder_get_color(_decoder)); + } + + /// retrieve last decoded symbol type. + /// see zbar_decoder_get_type() + zbar_symbol_type_t get_type () const + { + return(zbar_decoder_get_type(_decoder)); + } + + /// retrieve string name of last decoded symbol type. + /// see zbar_get_symbol_name() + const char *get_symbol_name () const + { + return(zbar_get_symbol_name(zbar_decoder_get_type(_decoder))); + } + + /// retrieve string name for last decode addon. + /// see zbar_get_addon_name() + /// @deprecated in 0.11 + const char *get_addon_name () const + { + return(zbar_get_addon_name(zbar_decoder_get_type(_decoder))); + } + + /// retrieve last decoded data in ASCII format as a char array. + /// see zbar_decoder_get_data() + const char *get_data_chars() const + { + return(zbar_decoder_get_data(_decoder)); + } + + /// retrieve last decoded data as a std::string. + /// see zbar_decoder_get_data() + const std::string get_data_string() const + { + return(std::string(zbar_decoder_get_data(_decoder), + zbar_decoder_get_data_length(_decoder))); + } + + /// retrieve last decoded data as a std::string. + /// see zbar_decoder_get_data() + const std::string get_data() const + { + return(get_data_string()); + } + + /// retrieve length of decoded binary data. + /// see zbar_decoder_get_data_length() + int get_data_length() const + { + return(zbar_decoder_get_data_length(_decoder)); + } + + /// retrieve last decode direction. + /// see zbar_decoder_get_direction() + /// @since 0.11 + int get_direction() const + { + return(zbar_decoder_get_direction(_decoder)); + } + + /// setup callback to handle result data. + void set_handler (Handler &handler) + { + _handler = &handler; + zbar_decoder_set_handler(_decoder, _cb); + zbar_decoder_set_userdata(_decoder, this); + } + + /// set config for indicated symbology (0 for all) to specified value. + /// @see zbar_decoder_set_config() + /// @since 0.4 + int set_config (zbar_symbol_type_t symbology, + zbar_config_t config, + int value) + { + return(zbar_decoder_set_config(_decoder, symbology, config, value)); + } + + /// set config parsed from configuration string. + /// @see zbar_decoder_parse_config() + /// @since 0.4 + int set_config (std::string cfgstr) + { + return(zbar_decoder_parse_config(_decoder, cfgstr.c_str())); + } + + private: + friend class Scanner; + zbar_decoder_t *_decoder; + Handler *_handler; + + static void _cb (zbar_decoder_t *cdcode) + { + Decoder *dcode = (Decoder*)zbar_decoder_get_userdata(cdcode); + if(dcode && dcode->_handler) + dcode->_handler->decode_callback(*dcode); + } +}; + +} + +#endif diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Exception.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Exception.h new file mode 100644 index 0000000..236622f --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Exception.h @@ -0,0 +1,187 @@ +//------------------------------------------------------------------------ +// Copyright 2007-2009 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ +#ifndef _ZBAR_EXCEPTION_H_ +#define _ZBAR_EXCEPTION_H_ + +/// @file +/// C++ Exception definitions + +#ifndef _ZBAR_H_ +# error "include zbar.h in your application, **not** zbar/Exception.h" +#endif + +#include +#include + +namespace zbar { + +/// base class for exceptions defined by this API. +class Exception : public std::exception { + +public: + /// create exception from C library error + Exception (const void *obj = NULL) + : std::exception(), + _obj(obj) + { } + + ~Exception () throw() { } + + /// retrieve error message + virtual const char* what () const throw() + { + if(!_obj) + return("zbar library unspecified generic error"); + return(_zbar_error_string(_obj, 0)); + } + +private: + const void *_obj; +}; + +/// internal library error. +class InternalError : public Exception { +public: + /// create exception from C library error + InternalError (const void *obj) + : Exception(obj) + { } +}; + +/// unsupported request. +class UnsupportedError : public Exception { +public: + /// create exception from C library error + UnsupportedError (const void *obj) + : Exception(obj) + { } +}; + +/// invalid request. +class InvalidError : public Exception { +public: + /// create exception from C library error + InvalidError (const void *obj) + : Exception(obj) + { } +}; + +/// failed system call. +class SystemError : public Exception { +public: + /// create exception from C library error + SystemError (const void *obj) + : Exception(obj) + { } +}; + +/// locking error. +class LockingError : public Exception { +public: + /// create exception from C library error + LockingError (const void *obj) + : Exception(obj) + { } +}; + +/// all resources busy. +class BusyError : public Exception { +public: + /// create exception from C library error + BusyError (const void *obj) + : Exception(obj) + { } +}; + +/// X11 display error. +class XDisplayError : public Exception { +public: + /// create exception from C library error + XDisplayError (const void *obj) + : Exception(obj) + { } +}; + +/// X11 protocol error. +class XProtoError : public Exception { +public: + /// create exception from C library error + XProtoError (const void *obj) + : Exception(obj) + { } +}; + +/// output window is closed. +class ClosedError : public Exception { +public: + /// create exception from C library error + ClosedError (const void *obj) + : Exception(obj) + { } +}; + +/// image format error +class FormatError : public Exception { + // FIXME needs c equivalent + + virtual const char* what () const throw() + { + // FIXME what format? + return("unsupported format"); + } +}; + +/// @internal + +/// extract error information and create exception. +static inline std::exception throw_exception (const void *obj) +{ + switch(_zbar_get_error_code(obj)) { + case ZBAR_ERR_NOMEM: + throw std::bad_alloc(); + case ZBAR_ERR_INTERNAL: + throw InternalError(obj); + case ZBAR_ERR_UNSUPPORTED: + throw UnsupportedError(obj); + case ZBAR_ERR_INVALID: + throw InvalidError(obj); + case ZBAR_ERR_SYSTEM: + throw SystemError(obj); + case ZBAR_ERR_LOCKING: + throw LockingError(obj); + case ZBAR_ERR_BUSY: + throw BusyError(obj); + case ZBAR_ERR_XDISPLAY: + throw XDisplayError(obj); + case ZBAR_ERR_XPROTO: + throw XProtoError(obj); + case ZBAR_ERR_CLOSED: + throw ClosedError(obj); + default: + throw Exception(obj); + } +} + +} + +#endif diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Image.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Image.h new file mode 100644 index 0000000..1a2af46 --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Image.h @@ -0,0 +1,321 @@ +//------------------------------------------------------------------------ +// Copyright 2007-2010 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ +#ifndef _ZBAR_IMAGE_H_ +#define _ZBAR_IMAGE_H_ + +/// @file +/// Image C++ wrapper + +#ifndef _ZBAR_H_ +# error "include zbar.h in your application, **not** zbar/Image.h" +#endif + +#include +#include +#include "Symbol.h" +#include "Exception.h" + +namespace zbar { + +class Video; + +/// stores image data samples along with associated format and size +/// metadata + +class Image { +public: + + /// general Image result handler. + /// applications should subtype this and pass an instance to + /// eg. ImageScanner::set_handler() to implement result processing + class Handler { + public: + virtual ~Handler() { } + + /// invoked by library when Image should be processed + virtual void image_callback(Image &image) = 0; + + /// cast this handler to the C handler + operator zbar_image_data_handler_t* () const + { + return(_cb); + } + + private: + static void _cb (zbar_image_t *zimg, + const void *userdata) + { + if(userdata) { + Image *image = (Image*)zbar_image_get_userdata(zimg); + if(image) + ((Handler*)userdata)->image_callback(*image); + else { + Image tmp(zimg, 1); + ((Handler*)userdata)->image_callback(tmp); + } + } + } + }; + + class SymbolIterator : public zbar::SymbolIterator { + public: + /// default constructor. + SymbolIterator () + : zbar::SymbolIterator() + { } + + /// constructor. + SymbolIterator (const SymbolSet &syms) + : zbar::SymbolIterator(syms) + { } + + /// copy constructor. + SymbolIterator (const SymbolIterator& iter) + : zbar::SymbolIterator(iter) + { } + }; + + /// constructor. + /// create a new Image with the specified parameters + Image (unsigned width = 0, + unsigned height = 0, + const std::string& format = "", + const void *data = NULL, + unsigned long length = 0) + : _img(zbar_image_create()) + { + zbar_image_set_userdata(_img, this); + if(width && height) + set_size(width, height); + if(format.length()) + set_format(format); + if(data && length) + set_data(data, length); + } + + ~Image () + { + set_data(NULL, 0); + zbar_image_set_userdata(_img, NULL); + zbar_image_ref(_img, -1); + } + + /// cast to C image object + operator const zbar_image_t* () const + { + return(_img); + } + + /// cast to C image object + operator zbar_image_t* () + { + return(_img); + } + + /// retrieve the image format. + /// see zbar_image_get_format() + unsigned long get_format () const + { + return(zbar_image_get_format(_img)); + } + + /// specify the fourcc image format code for image sample data. + /// see zbar_image_set_format() + void set_format (unsigned long format) + { + zbar_image_set_format(_img, format); + } + + /// specify the fourcc image format code for image sample data. + /// see zbar_image_set_format() + void set_format (const std::string& format) + { + unsigned long fourcc = zbar_fourcc_parse(format.c_str()); + zbar_image_set_format(_img, fourcc); + } + + /// retrieve a "sequence" (page/frame) number associated with this + /// image. + /// see zbar_image_get_sequence() + /// @since 0.6 + unsigned get_sequence () const + { + return(zbar_image_get_sequence(_img)); + } + + /// associate a "sequence" (page/frame) number with this image. + /// see zbar_image_set_sequence() + /// @since 0.6 + void set_sequence (unsigned sequence_num) + { + zbar_image_set_sequence(_img, sequence_num); + } + + /// retrieve the width of the image. + /// see zbar_image_get_width() + unsigned get_width () const + { + return(zbar_image_get_width(_img)); + } + + /// retrieve the height of the image. + /// see zbar_image_get_height() + unsigned get_height () const + { + return(zbar_image_get_height(_img)); + } + + /// retrieve both dimensions of the image. + /// see zbar_image_get_size() + /// @since 0.11 + void get_size (unsigned &width, + unsigned &height) const + { + zbar_image_get_size(_img, &width, &height); + } + + /// specify the pixel size of the image. + /// see zbar_image_set_size() + void set_size (unsigned width, + unsigned height) + { + zbar_image_set_size(_img, width, height); + } + + /// retrieve the scan crop rectangle. + /// see zbar_image_get_crop() + void get_crop (unsigned &x, + unsigned &y, + unsigned &width, + unsigned &height) const + { + zbar_image_get_crop(_img, &x, &y, &width, &height); + } + + /// set the scan crop rectangle. + /// see zbar_image_set_crop() + void set_crop (unsigned x, + unsigned y, + unsigned width, + unsigned height) + { + zbar_image_set_crop(_img, x, y, width, height); + } + + /// return the image sample data. + /// see zbar_image_get_data() + const void *get_data () const + { + return(zbar_image_get_data(_img)); + } + + /// return the size of the image sample data. + /// see zbar_image_get_data_length() + /// @since 0.6 + unsigned long get_data_length () const + { + return(zbar_image_get_data_length(_img)); + } + + /// specify image sample data. + /// see zbar_image_set_data() + void set_data (const void *data, + unsigned long length) + { + zbar_image_set_data(_img, data, length, _cleanup); + } + + /// image format conversion. + /// see zbar_image_convert() + Image convert (unsigned long format) const + { + zbar_image_t *img = zbar_image_convert(_img, format); + if(img) + return(Image(img)); + throw FormatError(); + } + + /// image format conversion with crop/pad. + /// see zbar_image_convert_resize() + /// @since 0.4 + Image convert (unsigned long format, + unsigned width, + unsigned height) const + { + zbar_image_t *img = + zbar_image_convert_resize(_img, format, width, height); + if(img) + return(Image(img)); + throw FormatError(); + } + + const SymbolSet get_symbols () const { + return(SymbolSet(zbar_image_get_symbols(_img))); + } + + void set_symbols (const SymbolSet &syms) { + zbar_image_set_symbols(_img, syms); + } + + /// create a new SymbolIterator over decoded results. + SymbolIterator symbol_begin () const { + return(SymbolIterator(get_symbols())); + } + + /// return a SymbolIterator suitable for ending iteration. + SymbolIterator symbol_end () const { + return(SymbolIterator()); + } + +protected: + + friend class Video; + + /// constructor. + /// @internal + /// create a new Image from a zbar_image_t C object + Image (zbar_image_t *src, + int refs = 0) + : _img(src) + { + if(refs) + zbar_image_ref(_img, refs); + zbar_image_set_userdata(_img, this); + } + + /// default data cleanup (noop) + /// @internal + static void _cleanup (zbar_image_t *img) + { + // by default nothing is cleaned + assert(img); + assert(zbar_image_get_userdata(img)); + } + +private: + zbar_image_t *_img; +}; + +} + +#endif diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/ImageScanner.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/ImageScanner.h new file mode 100644 index 0000000..bda8433 --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/ImageScanner.h @@ -0,0 +1,130 @@ +//------------------------------------------------------------------------ +// Copyright 2007-2009 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ +#ifndef _ZBAR_IMAGE_SCANNER_H_ +#define _ZBAR_IMAGE_SCANNER_H_ + +/// @file +/// Image Scanner C++ wrapper + +#ifndef _ZBAR_H_ +# error "include zbar.h in your application, **not** zbar/ImageScanner.h" +#endif + +#include "Image.h" + +namespace zbar { + +/// mid-level image scanner interface. +/// reads barcodes from a 2-D Image + +class ImageScanner { +public: + /// constructor. + ImageScanner (zbar_image_scanner_t *scanner = NULL) + { + if(scanner) + _scanner = scanner; + else + _scanner = zbar_image_scanner_create(); + } + + ~ImageScanner () + { + zbar_image_scanner_destroy(_scanner); + } + + /// cast to C image_scanner object + operator zbar_image_scanner_t* () const + { + return(_scanner); + } + + /// setup result handler callback. + void set_handler (Image::Handler &handler) + { + zbar_image_scanner_set_data_handler(_scanner, handler, &handler); + } + + /// set config for indicated symbology (0 for all) to specified value. + /// @see zbar_image_scanner_set_config() + /// @since 0.4 + int set_config (zbar_symbol_type_t symbology, + zbar_config_t config, + int value) + { + return(zbar_image_scanner_set_config(_scanner, symbology, + config, value)); + } + + /// set config parsed from configuration string. + /// @see zbar_image_scanner_parse_config() + /// @since 0.4 + int set_config (std::string cfgstr) + { + return(zbar_image_scanner_parse_config(_scanner, cfgstr.c_str())); + } + + /// enable or disable the inter-image result cache. + /// see zbar_image_scanner_enable_cache() + void enable_cache (bool enable = true) + { + zbar_image_scanner_enable_cache(_scanner, enable); + } + + /// remove previous results from scanner and image. + /// @see zbar_image_scanner_recycle_image() + /// @since 0.10 + void recycle_image (Image &image) + { + zbar_image_scanner_recycle_image(_scanner, image); + } + + /// retrieve decode results for last scanned image. + /// @see zbar_image_scanner_get_results() + /// @since 0.10 + const SymbolSet get_results () const { + return(SymbolSet(zbar_image_scanner_get_results(_scanner))); + } + + /// scan for symbols in provided image. + /// see zbar_scan_image() + int scan (Image& image) + { + return(zbar_scan_image(_scanner, image)); + } + + /// scan for symbols in provided image. + /// see zbar_scan_image() + ImageScanner& operator<< (Image& image) + { + scan(image); + return(*this); + } + +private: + zbar_image_scanner_t *_scanner; +}; + +} + +#endif diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Processor.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Processor.h new file mode 100644 index 0000000..2622ee8 --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Processor.h @@ -0,0 +1,223 @@ +//------------------------------------------------------------------------ +// Copyright 2007-2010 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ +#ifndef _ZBAR_PROCESSOR_H_ +#define _ZBAR_PROCESSOR_H_ + +/// @file +/// Processor C++ wrapper + +#ifndef _ZBAR_H_ +# error "include zbar.h in your application, **not** zbar/Processor.h" +#endif + +#include "Exception.h" +#include "Image.h" + +namespace zbar { + +/// high-level self-contained image processor. +/// processes video and images for barcodes, optionally displaying +/// images to a library owned output window + +class Processor { + public: + /// value to pass for no timeout. + static const int FOREVER = -1; + + /// constructor. + Processor (bool threaded = true, + const char *video_device = "", + bool enable_display = true) + { + _processor = zbar_processor_create(threaded); + if(!_processor) + throw std::bad_alloc(); + init(video_device, enable_display); + } + + ~Processor () + { + zbar_processor_destroy(_processor); + } + + /// cast to C processor object. + operator zbar_processor_t* () + { + return(_processor); + } + + /// opens a video input device and/or prepares to display output. + /// see zbar_processor_init() + void init (const char *video_device = "", + bool enable_display = true) + { + if(zbar_processor_init(_processor, video_device, enable_display)) + throw_exception(_processor); + } + + /// setup result handler callback. + /// see zbar_processor_set_data_handler() + void set_handler (Image::Handler& handler) + { + zbar_processor_set_data_handler(_processor, handler, &handler); + } + + /// set config for indicated symbology (0 for all) to specified value. + /// @see zbar_processor_set_config() + /// @since 0.4 + int set_config (zbar_symbol_type_t symbology, + zbar_config_t config, + int value) + { + return(zbar_processor_set_config(_processor, symbology, + config, value)); + } + + /// set config parsed from configuration string. + /// @see zbar_processor_parse_config() + /// @since 0.4 + int set_config (std::string cfgstr) + { + return(zbar_processor_parse_config(_processor, cfgstr.c_str())); + } + + /// retrieve the current state of the ouput window. + /// see zbar_processor_is_visible() + bool is_visible () + { + int rc = zbar_processor_is_visible(_processor); + if(rc < 0) + throw_exception(_processor); + return(rc != 0); + } + + /// show or hide the display window owned by the library. + /// see zbar_processor_set_visible() + void set_visible (bool visible = true) + { + if(zbar_processor_set_visible(_processor, visible) < 0) + throw_exception(_processor); + } + + /// control the processor in free running video mode. + /// see zbar_processor_set_active() + void set_active (bool active = true) + { + if(zbar_processor_set_active(_processor, active) < 0) + throw_exception(_processor); + } + + /// retrieve decode results for last scanned image. + /// @see zbar_processor_get_results() + /// @since 0.10 + const SymbolSet get_results () const { + return(SymbolSet(zbar_processor_get_results(_processor))); + } + + /// wait for input to the display window from the user. + /// see zbar_processor_user_wait() + int user_wait (int timeout = FOREVER) + { + int rc = zbar_processor_user_wait(_processor, timeout); + if(rc < 0) + throw_exception(_processor); + return(rc); + } + + /// process from the video stream until a result is available. + /// see zbar_process_one() + void process_one (int timeout = FOREVER) + { + if(zbar_process_one(_processor, timeout) < 0) + throw_exception(_processor); + } + + /// process the provided image for barcodes. + /// see zbar_process_image() + void process_image (Image& image) + { + if(zbar_process_image(_processor, image) < 0) + throw_exception(_processor); + } + + /// process the provided image for barcodes. + /// see zbar_process_image() + Processor& operator<< (Image& image) + { + process_image(image); + return(*this); + } + + /// force specific input and output formats for debug/testing. + /// see zbar_processor_force_format() + void force_format (unsigned long input_format, + unsigned long output_format) + { + if(zbar_processor_force_format(_processor, input_format, + output_format)) + throw_exception(_processor); + } + + /// force specific input and output formats for debug/testing. + /// see zbar_processor_force_format() + void force_format (std::string& input_format, + std::string& output_format) + { + unsigned long ifourcc = zbar_fourcc_parse(input_format.c_str()); + unsigned long ofourcc = zbar_fourcc_parse(output_format.c_str()); + if(zbar_processor_force_format(_processor, ifourcc, ofourcc)) + throw_exception(_processor); + } + + /// request a preferred size for the video image from the device. + /// see zbar_processor_request_size() + /// @since 0.6 + void request_size (int width, int height) + { + zbar_processor_request_size(_processor, width, height); + } + + /// request a preferred driver interface version for debug/testing. + /// see zbar_processor_request_interface() + /// @since 0.6 + void request_interface (int version) + { + zbar_processor_request_interface(_processor, version); + } + + /// request a preferred I/O mode for debug/testing. + /// see zbar_processor_request_iomode() + /// @since 0.7 + void request_iomode (int iomode) + { + if(zbar_processor_request_iomode(_processor, iomode)) + throw_exception(_processor); + } + + private: + zbar_processor_t *_processor; +}; + +} + +#endif diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Scanner.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Scanner.h new file mode 100644 index 0000000..8c9a756 --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Scanner.h @@ -0,0 +1,162 @@ +//------------------------------------------------------------------------ +// Copyright 2007-2009 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ +#ifndef _ZBAR_SCANNER_H_ +#define _ZBAR_SCANNER_H_ + +/// @file +/// Scanner C++ wrapper + +#ifndef _ZBAR_H_ +# error "include zbar.h in your application, **not** zbar/Scanner.h" +#endif + +#include + +namespace zbar { + +/// low-level linear intensity sample stream scanner interface. +/// identifies "bar" edges and measures width between them. +/// optionally passes to bar width Decoder + +class Scanner { + public: + + /// constructor. + /// @param decoder reference to a Decoder instance which will + /// be passed scan results automatically + Scanner (Decoder& decoder) + { + _scanner = zbar_scanner_create(decoder._decoder); + } + + /// constructor. + /// @param decoder pointer to a Decoder instance which will + /// be passed scan results automatically + Scanner (Decoder* decoder = NULL) + { + zbar_decoder_t *zdcode = NULL; + if(decoder) + zdcode = decoder->_decoder; + _scanner = zbar_scanner_create(zdcode); + } + + ~Scanner () + { + zbar_scanner_destroy(_scanner); + } + + /// clear all scanner state. + /// see zbar_scanner_reset() + void reset () + { + zbar_scanner_reset(_scanner); + } + + /// mark start of a new scan pass. + /// see zbar_scanner_new_scan() + zbar_symbol_type_t new_scan () + { + _type = zbar_scanner_new_scan(_scanner); + return(_type); + } + + /// flush scanner pipeline. + /// see zbar_scanner_flush() + zbar_symbol_type_t flush () + { + _type = zbar_scanner_flush(_scanner); + return(_type); + } + + /// process next sample intensity value. + /// see zbar_scan_y() + zbar_symbol_type_t scan_y (int y) + { + _type = zbar_scan_y(_scanner, y); + return(_type); + } + + /// process next sample intensity value. + /// see zbar_scan_y() + Scanner& operator<< (int y) + { + _type = zbar_scan_y(_scanner, y); + return(*this); + } + + /// process next sample from RGB (or BGR) triple. + /// see zbar_scan_rgb24() + zbar_symbol_type_t scan_rgb24 (unsigned char *rgb) + { + _type = zbar_scan_rgb24(_scanner, rgb); + return(_type); + } + + /// process next sample from RGB (or BGR) triple. + /// see zbar_scan_rgb24() + Scanner& operator<< (unsigned char *rgb) + { + _type = zbar_scan_rgb24(_scanner, rgb); + return(*this); + } + + /// retrieve last scanned width. + /// see zbar_scanner_get_width() + unsigned get_width () const + { + return(zbar_scanner_get_width(_scanner)); + } + + /// retrieve last scanned color. + /// see zbar_scanner_get_color() + zbar_color_t get_color () const + { + return(zbar_scanner_get_color(_scanner)); + } + + /// retrieve last scan result. + zbar_symbol_type_t get_type () const + { + return(_type); + } + + /// cast to C scanner + operator zbar_scanner_t* () const + { + return(_scanner); + } + + /// retrieve C scanner + const zbar_scanner_t *get_c_scanner () const + { + return(_scanner); + } + + private: + zbar_scanner_t *_scanner; + zbar_symbol_type_t _type; +}; + +} + +#endif diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Symbol.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Symbol.h new file mode 100644 index 0000000..a094222 --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Symbol.h @@ -0,0 +1,528 @@ +//------------------------------------------------------------------------ +// Copyright 2007-2010 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ +#ifndef _ZBAR_SYMBOL_H_ +#define _ZBAR_SYMBOL_H_ + +/// @file +/// Symbol C++ wrapper + +#ifndef _ZBAR_H_ +# error "include zbar.h in your application, **not** zbar/Symbol.h" +#endif + +#include +#include +#include +#include + +namespace zbar { + +class SymbolIterator; + +/// container for decoded result symbols associated with an image +/// or a composite symbol. + +class SymbolSet { +public: + /// constructor. + SymbolSet (const zbar_symbol_set_t *syms = NULL) + : _syms(syms) + { + ref(); + } + + /// copy constructor. + SymbolSet (const SymbolSet& syms) + : _syms(syms._syms) + { + ref(); + } + + /// destructor. + ~SymbolSet () + { + ref(-1); + } + + /// assignment. + SymbolSet& operator= (const SymbolSet& syms) + { + syms.ref(); + ref(-1); + _syms = syms._syms; + return(*this); + } + + /// truth testing. + bool operator! () const + { + return(!_syms || !get_size()); + } + + /// manipulate reference count. + void ref (int delta = 1) const + { + if(_syms) + zbar_symbol_set_ref((zbar_symbol_set_t*)_syms, delta); + } + + /// cast to C symbol set. + operator const zbar_symbol_set_t* () const + { + return(_syms); + } + + int get_size () const + { + return((_syms) ? zbar_symbol_set_get_size(_syms) : 0); + } + + /// create a new SymbolIterator over decoded results. + SymbolIterator symbol_begin() const; + + /// return a SymbolIterator suitable for ending iteration. + const SymbolIterator symbol_end() const; + +private: + const zbar_symbol_set_t *_syms; +}; + +/// decoded barcode symbol result object. stores type, data, and +/// image location of decoded symbol + +class Symbol { +public: + + /// image pixel location (x, y) coordinate tuple. + class Point { + public: + int x; ///< x-coordinate. + int y; ///< y-coordinate. + + Point () { } + + Point(int x, int y) + : x(x), y(y) + { } + + /// copy constructor. + Point (const Point& pt) + : x(pt.x), + y(pt.y) + { } + + /// assignment. + Point& operator= (const Point& pt) + { + x = pt.x; + y = pt.y; + return(*this); + } + }; + + /// iteration over Point objects in a symbol location polygon. + class PointIterator + : public std::iterator { + + public: + /// constructor. + PointIterator (const Symbol *sym = NULL, + int index = 0) + : _sym(sym), + _index(index) + { + sym->ref(1); + if(!sym || + (unsigned)_index >= zbar_symbol_get_loc_size(*_sym)) + _index = -1; + } + + /// copy constructor. + PointIterator (const PointIterator& iter) + : _sym(iter._sym), + _index(iter._index) + { + _sym->ref(); + } + + /// destructor. + ~PointIterator () + { + _sym->ref(-1); + } + + /// assignment. + PointIterator& operator= (const PointIterator& iter) + { + iter._sym->ref(); + _sym->ref(-1); + _sym = iter._sym; + _index = iter._index; + return(*this); + } + + /// truth testing. + bool operator! () const + { + return(!_sym || _index < 0); + } + + /// advance iterator to next Point. + PointIterator& operator++ () + { + unsigned int i = ++_index; + if(i >= zbar_symbol_get_loc_size(*_sym)) + _index = -1; + return(*this); + } + + /// retrieve currently referenced Point. + const Point operator* () const + { + assert(!!*this); + if(!*this) + return(Point()); + return(Point(zbar_symbol_get_loc_x(*_sym, _index), + zbar_symbol_get_loc_y(*_sym, _index))); + } + + /// test if two iterators refer to the same Point in the same + /// Symbol. + bool operator== (const PointIterator& iter) const + { + return(_index == iter._index && + ((_index < 0) || _sym == iter._sym)); + } + + /// test if two iterators refer to the same Point in the same + /// Symbol. + bool operator!= (const PointIterator& iter) const + { + return(!(*this == iter)); + } + + private: + const Symbol *_sym; + int _index; + }; + + /// constructor. + Symbol (const zbar_symbol_t *sym = NULL) + : _xmlbuf(NULL), + _xmllen(0) + { + init(sym); + ref(); + } + + /// copy constructor. + Symbol (const Symbol& sym) + : _sym(sym._sym), + _type(sym._type), + _data(sym._data), + _xmlbuf(NULL), + _xmllen(0) + { + ref(); + } + + /// destructor. + ~Symbol () { + if(_xmlbuf) + free(_xmlbuf); + ref(-1); + } + + /// assignment. + Symbol& operator= (const Symbol& sym) + { + sym.ref(1); + ref(-1); + _sym = sym._sym; + _type = sym._type; + _data = sym._data; + return(*this); + } + + Symbol& operator= (const zbar_symbol_t *sym) + { + if(sym) + zbar_symbol_ref(sym, 1); + ref(-1); + init(sym); + return(*this); + } + + /// truth testing. + bool operator! () const + { + return(!_sym); + } + + void ref (int delta = 1) const + { + if(_sym) + zbar_symbol_ref((zbar_symbol_t*)_sym, delta); + } + + /// cast to C symbol. + operator const zbar_symbol_t* () const + { + return(_sym); + } + + /// test if two Symbol objects refer to the same C symbol. + bool operator== (const Symbol& sym) const + { + return(_sym == sym._sym); + } + + /// test if two Symbol objects refer to the same C symbol. + bool operator!= (const Symbol& sym) const + { + return(!(*this == sym)); + } + + /// retrieve type of decoded symbol. + zbar_symbol_type_t get_type () const + { + return(_type); + } + + /// retrieve the string name of the symbol type. + const std::string get_type_name () const + { + return(zbar_get_symbol_name(_type)); + } + + /// retrieve the string name for any addon. + /// @deprecated in 0.11 + const std::string get_addon_name () const + { + return(zbar_get_addon_name(_type)); + } + + /// retrieve data decoded from symbol. + const std::string get_data () const + { + return(_data); + } + + /// retrieve length of binary data + unsigned get_data_length () const + { + return((_sym) ? zbar_symbol_get_data_length(_sym) : 0); + } + + /// retrieve inter-frame coherency count. + /// see zbar_symbol_get_count() + /// @since 1.5 + int get_count () const + { + return((_sym) ? zbar_symbol_get_count(_sym) : -1); + } + + SymbolSet get_components () const + { + return(SymbolSet((_sym) ? zbar_symbol_get_components(_sym) : NULL)); + } + + /// create a new PointIterator at the start of the location + /// polygon. + PointIterator point_begin() const + { + return(PointIterator(this)); + } + + /// return a PointIterator suitable for ending iteration. + const PointIterator point_end() const + { + return(PointIterator()); + } + + /// see zbar_symbol_get_loc_size(). + int get_location_size () const + { + return((_sym) ? zbar_symbol_get_loc_size(_sym) : 0); + } + + /// see zbar_symbol_get_loc_x(). + int get_location_x (unsigned index) const + { + return((_sym) ? zbar_symbol_get_loc_x(_sym, index) : -1); + } + + /// see zbar_symbol_get_loc_y(). + int get_location_y (unsigned index) const + { + return((_sym) ? zbar_symbol_get_loc_y(_sym, index) : -1); + } + + /// see zbar_symbol_get_orientation(). + /// @since 0.11 + int get_orientation () const + { + return(zbar_symbol_get_orientation(_sym)); + } + + /// see zbar_symbol_xml(). + const std::string xml () const + { + if(!_sym) + return(""); + return(zbar_symbol_xml(_sym, (char**)&_xmlbuf, (unsigned*)&_xmllen)); + } + +protected: + /// (re)initialize Symbol from C symbol object. + void init (const zbar_symbol_t *sym = NULL) + { + _sym = sym; + if(sym) { + _type = zbar_symbol_get_type(sym); + _data = std::string(zbar_symbol_get_data(sym), + zbar_symbol_get_data_length(sym)); + } + else { + _type = ZBAR_NONE; + _data = ""; + } + } + +private: + const zbar_symbol_t *_sym; + zbar_symbol_type_t _type; + std::string _data; + char *_xmlbuf; + unsigned _xmllen; +}; + +/// iteration over Symbol result objects in a scanned Image or SymbolSet. +class SymbolIterator + : public std::iterator { + +public: + /// default constructor. + SymbolIterator () + { } + + /// constructor. + SymbolIterator (const SymbolSet &syms) + : _syms(syms) + { + const zbar_symbol_set_t *zsyms = _syms; + if(zsyms) + _sym = zbar_symbol_set_first_symbol(zsyms); + } + + /// copy constructor. + SymbolIterator (const SymbolIterator& iter) + : _syms(iter._syms) + { + const zbar_symbol_set_t *zsyms = _syms; + if(zsyms) + _sym = zbar_symbol_set_first_symbol(zsyms); + } + + ~SymbolIterator () + { + } + + /// assignment. + SymbolIterator& operator= (const SymbolIterator& iter) + { + _syms = iter._syms; + _sym = iter._sym; + return(*this); + } + + bool operator! () const + { + return(!_syms || !_sym); + } + + /// advance iterator to next Symbol. + SymbolIterator& operator++ () + { + if(!!_sym) + _sym = zbar_symbol_next(_sym); + else if(!!_syms) + _sym = zbar_symbol_set_first_symbol(_syms); + return(*this); + } + + /// retrieve currently referenced Symbol. + const Symbol operator* () const + { + return(_sym); + } + + /// access currently referenced Symbol. + const Symbol* operator-> () const + { + return(&_sym); + } + + /// test if two iterators refer to the same Symbol + bool operator== (const SymbolIterator& iter) const + { + // it is enough to test the symbols, as they belong + // to only one set (also simplifies invalid case) + return(_sym == iter._sym); + } + + /// test if two iterators refer to the same Symbol + bool operator!= (const SymbolIterator& iter) const + { + return(!(*this == iter)); + } + + const SymbolIterator end () const { + return(SymbolIterator()); + } + +private: + SymbolSet _syms; + Symbol _sym; +}; + +inline SymbolIterator SymbolSet::symbol_begin () const { + return(SymbolIterator(*this)); +} + +inline const SymbolIterator SymbolSet::symbol_end () const { + return(SymbolIterator()); +} + +/// @relates Symbol +/// stream the string representation of a Symbol. +static inline std::ostream& operator<< (std::ostream& out, + const Symbol& sym) +{ + out << sym.get_type_name() << ":" << sym.get_data(); + return(out); +} + +} + +#endif diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Video.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Video.h new file mode 100644 index 0000000..61a49f1 --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Video.h @@ -0,0 +1,170 @@ +//------------------------------------------------------------------------ +// Copyright 2007-2010 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ +#ifndef _ZBAR_VIDEO_H_ +#define _ZBAR_VIDEO_H_ + +/// @file +/// Video Input C++ wrapper + +#ifndef _ZBAR_H_ +# error "include zbar.h in your application, **not** zbar/Video.h" +#endif + +#include "Image.h" + +namespace zbar { + +/// mid-level video source abstraction. +/// captures images from a video device + +class Video { +public: + /// constructor. + Video (zbar_video_t *video = NULL) + { + if(video) + _video = video; + else + _video = zbar_video_create(); + } + + /// constructor. + Video (std::string& device) + { + _video = zbar_video_create(); + open(device); + } + + ~Video () + { + zbar_video_destroy(_video); + } + + /// cast to C video object. + operator zbar_video_t* () const + { + return(_video); + } + + /// open and probe a video device. + void open (std::string& device) + { + if(zbar_video_open(_video, device.c_str())) + throw_exception(_video); + } + + /// close video device if open. + void close () + { + if(zbar_video_open(_video, NULL)) + throw_exception(_video); + } + + /// initialize video using a specific format for debug. + /// see zbar_video_init() + void init (unsigned long fourcc) + { + if(zbar_video_init(_video, fourcc)) + throw_exception(_video); + } + + /// initialize video using a specific format for debug. + /// see zbar_video_init() + void init (std::string& format) + { + unsigned int fourcc = zbar_fourcc_parse(format.c_str()); + if(zbar_video_init(_video, fourcc)) + throw_exception(_video); + } + + /// retrieve file descriptor associated with open *nix video device. + /// see zbar_video_get_fd() + int get_fd () + { + return(zbar_video_get_fd(_video)); + } + + /// retrieve current output image width. + /// see zbar_video_get_width() + int get_width () + { + return(zbar_video_get_width(_video)); + } + + /// retrieve current output image height. + /// see zbar_video_get_height() + int get_height () + { + return(zbar_video_get_height(_video)); + } + + /// start/stop video capture. + /// see zbar_video_enable() + void enable (bool enable = true) + { + if(zbar_video_enable(_video, enable)) + throw_exception(_video); + } + + /// retrieve next captured image. + /// see zbar_video_next_image() + Image next_image () + { + zbar_image_t *img = zbar_video_next_image(_video); + if(!img) + throw_exception(_video); + return(Image(img)); + } + + /// request a preferred size for the video image from the device. + /// see zbar_video_request_size() + /// @since 0.6 + void request_size (int width, int height) + { + zbar_video_request_size(_video, width, height); + } + + /// request a preferred driver interface version for debug/testing. + /// see zbar_video_request_interface() + /// @since 0.6 + void request_interface (int version) + { + zbar_video_request_interface(_video, version); + } + + /// request a preferred I/O mode for debug/testing. + /// see zbar_video_request_iomode() + /// @since 0.7 + void request_iomode (int iomode) + { + if(zbar_video_request_iomode(_video, iomode)) + throw_exception(_video); + } + +private: + zbar_video_t *_video; +}; + +} + +#endif diff --git a/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Window.h b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Window.h new file mode 100644 index 0000000..c91a405 --- /dev/null +++ b/CocoaCamp/ZBarSDK/Headers/ZBarSDK/zbar/Window.h @@ -0,0 +1,136 @@ +//------------------------------------------------------------------------ +// Copyright 2007-2009 (c) Jeff Brown +// +// This file is part of the ZBar Bar Code Reader. +// +// The ZBar Bar Code Reader is free software; you can redistribute it +// and/or modify it under the terms of the GNU Lesser Public License as +// published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// The ZBar Bar Code Reader is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser Public License for more details. +// +// You should have received a copy of the GNU Lesser Public License +// along with the ZBar Bar Code Reader; if not, write to the Free +// Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301 USA +// +// http://sourceforge.net/projects/zbar +//------------------------------------------------------------------------ +#ifndef _ZBAR_WINDOW_H_ +#define _ZBAR_WINDOW_H_ + +/// @file +/// Output Window C++ wrapper + +#ifndef _ZBAR_H_ +# error "include zbar.h in your application, **not** zbar/Window.h" +#endif + +#include "Image.h" + +namespace zbar { + +/// mid-level output window abstraction. +/// displays images to user-specified platform specific output window + +class Window { +public: + /// constructor. + Window (zbar_window_t *window = NULL) + { + if(window) + _window = window; + else + _window = zbar_window_create(); + } + + /// constructor. + Window (void *x11_display_w32_hwnd, + unsigned long x11_drawable) + { + _window = zbar_window_create(); + attach(x11_display_w32_hwnd, x11_drawable); + } + + ~Window () + { + zbar_window_destroy(_window); + } + + /// cast to C window object. + operator zbar_window_t* () const + { + return(_window); + } + + /// associate reader with an existing platform window. + /// see zbar_window_attach() + void attach (void *x11_display_w32_hwnd, + unsigned long x11_drawable = 0) + { + if(zbar_window_attach(_window, + x11_display_w32_hwnd, x11_drawable) < 0) + throw_exception(_window); + } + + /// control content level of the reader overlay. + /// see zbar_window_set_overlay() + void set_overlay (int level) + { + zbar_window_set_overlay(_window, level); + } + + /// retrieve current content level of reader overlay. + /// see zbar_window_get_overlay() + + /// draw a new image into the output window. + /// see zbar_window_draw() + void draw (Image& image) + { + if(zbar_window_draw(_window, image) < 0) + throw_exception(_window); + } + + /// clear the image from the output window. + /// see zbar_window_draw() + void clear () + { + if(zbar_window_draw(_window, NULL) < 0) + throw_exception(_window); + } + + /// redraw the last image. + /// zbar_window_redraw() + void redraw () + { + if(zbar_window_redraw(_window) < 0) + throw_exception(_window); + } + + /// resize the image window. + /// zbar_window_resize() + void resize (unsigned width, unsigned height) + { + if(zbar_window_resize(_window, width, height) < 0) + throw_exception(_window); + } + +private: + zbar_window_t *_window; +}; + +/// select a compatible format between video input and output window. +/// see zbar_negotiate_format() +static inline void negotiate_format (Video& video, Window& window) +{ + if(zbar_negotiate_format(video, window) < 0) + throw_exception(video); +} + +} + +#endif diff --git a/CocoaCamp/ZBarSDK/Resources/zbar-back.png b/CocoaCamp/ZBarSDK/Resources/zbar-back.png new file mode 100644 index 0000000..6a0681d Binary files /dev/null and b/CocoaCamp/ZBarSDK/Resources/zbar-back.png differ diff --git a/CocoaCamp/ZBarSDK/Resources/zbar-help.html b/CocoaCamp/ZBarSDK/Resources/zbar-help.html new file mode 100644 index 0000000..72d209c --- /dev/null +++ b/CocoaCamp/ZBarSDK/Resources/zbar-help.html @@ -0,0 +1,88 @@ + + + + + +Barcode Reader Help + + + +

Barcode Reader Help

+
+

Recognized barcodes should look like

+ +
+ +

QR Codes

+
+

Also recognized, but not shown: +Code 128, +DataBar (RSS), +Code 93, +Code 39 and +Interleaved 2 of 5

+
+

Hints for successful scanning

+
+
+

Ensure there is plenty of

+

Light

+
+
+
4"
+

Distance

+

should be about 3 to 5 inches

+
+
+
+

Shake

+

to force the camera to focus

+
+
+
+

Wait

+

for the autofocus to finish

+
+
+
+

Hold Still

+

while the barcode is scanned

+
+ + + diff --git a/CocoaCamp/ZBarSDK/Resources/zbar-helpicons.png b/CocoaCamp/ZBarSDK/Resources/zbar-helpicons.png new file mode 100644 index 0000000..2a07e7c Binary files /dev/null and b/CocoaCamp/ZBarSDK/Resources/zbar-helpicons.png differ diff --git a/CocoaCamp/ZBarSDK/Resources/zbar-samples.png b/CocoaCamp/ZBarSDK/Resources/zbar-samples.png new file mode 100644 index 0000000..7c805e2 Binary files /dev/null and b/CocoaCamp/ZBarSDK/Resources/zbar-samples.png differ diff --git a/CocoaCamp/ZBarSDK/libzbar.a b/CocoaCamp/ZBarSDK/libzbar.a new file mode 100644 index 0000000..defbed4 Binary files /dev/null and b/CocoaCamp/ZBarSDK/libzbar.a differ diff --git a/CocoaCamp/en.lproj/InfoPlist.strings b/CocoaCamp/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/CocoaCamp/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/CocoaCamp/iPad/CocoaCampAppDelegate_iPad.h b/CocoaCamp/iPad/CocoaCampAppDelegate_iPad.h new file mode 100644 index 0000000..8497f2b --- /dev/null +++ b/CocoaCamp/iPad/CocoaCampAppDelegate_iPad.h @@ -0,0 +1,13 @@ +// +// CocoaCampAppDelegate_iPad.h +// CocoaCamp +// +// Created by Rusty Zarse on 8/2/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import "CocoaCampAppDelegate.h" + +@interface CocoaCampAppDelegate_iPad : CocoaCampAppDelegate + +@end diff --git a/CocoaCamp/iPad/CocoaCampAppDelegate_iPad.m b/CocoaCamp/iPad/CocoaCampAppDelegate_iPad.m new file mode 100644 index 0000000..df1db54 --- /dev/null +++ b/CocoaCamp/iPad/CocoaCampAppDelegate_iPad.m @@ -0,0 +1,13 @@ +// +// CocoaCampAppDelegate_iPad.m +// CocoaCamp +// +// Created by Rusty Zarse on 8/2/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import "CocoaCampAppDelegate_iPad.h" + +@implementation CocoaCampAppDelegate_iPad + +@end diff --git a/CocoaCamp/iPad/en.lproj/MainWindow_iPad.xib b/CocoaCamp/iPad/en.lproj/MainWindow_iPad.xib new file mode 100644 index 0000000..350aff0 --- /dev/null +++ b/CocoaCamp/iPad/en.lproj/MainWindow_iPad.xib @@ -0,0 +1,362 @@ + + + + 1024 + 10D573 + 786 + 1038.29 + 460.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 112 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 292 + + YES + + + 301 + {{284, 501}, {200, 22}} + + NO + YES + 7 + NO + IBIPadFramework + My Universal App on iPad + + 1 + MCAwIDAAA + + + 1 + 10 + + + {768, 1024} + + + 1 + MSAxIDEAA + + NO + NO + + 2 + + IBIPadFramework + YES + + + IBIPadFramework + + + + + YES + + + window + + + + 7 + + + + delegate + + + + 8 + + + + + YES + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + + 6 + + + + + 11 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 11.IBPluginDependency + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 6.CustomClassName + 6.IBPluginDependency + + + YES + UIApplication + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + {{202, 84}, {783, 772}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + CocoaCampAppDelegate_iPad + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 11 + + + + YES + + CocoaCampAppDelegate + NSObject + + window + UIWindow + + + window + + window + UIWindow + + + + IBProjectSource + Shared/CocoaCampAppDelegate.h + + + + CocoaCampAppDelegate_iPad + CocoaCampAppDelegate + + IBProjectSource + iPad/CocoaCampAppDelegate_iPad.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIApplication + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIApplication.h + + + + UIResponder + NSObject + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIWindow + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIWindow.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../CocoaCamp.xcodeproj + 3 + 112 + + diff --git a/CocoaCamp/iPhone/CocoaCampAppDelegate_iPhone.h b/CocoaCamp/iPhone/CocoaCampAppDelegate_iPhone.h new file mode 100644 index 0000000..b3c21f7 --- /dev/null +++ b/CocoaCamp/iPhone/CocoaCampAppDelegate_iPhone.h @@ -0,0 +1,13 @@ +// +// CocoaCampAppDelegate_iPhone.h +// CocoaCamp +// +// Created by Rusty Zarse on 8/2/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import "CocoaCampAppDelegate.h" + +@interface CocoaCampAppDelegate_iPhone : CocoaCampAppDelegate + +@end diff --git a/CocoaCamp/iPhone/CocoaCampAppDelegate_iPhone.m b/CocoaCamp/iPhone/CocoaCampAppDelegate_iPhone.m new file mode 100644 index 0000000..d7180bf --- /dev/null +++ b/CocoaCamp/iPhone/CocoaCampAppDelegate_iPhone.m @@ -0,0 +1,13 @@ +// +// CocoaCampAppDelegate_iPhone.m +// CocoaCamp +// +// Created by Rusty Zarse on 8/2/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import "CocoaCampAppDelegate_iPhone.h" + +@implementation CocoaCampAppDelegate_iPhone + +@end diff --git a/CocoaCamp/iPhone/en.lproj/MainWindow_iPhone.xib b/CocoaCamp/iPhone/en.lproj/MainWindow_iPhone.xib new file mode 100644 index 0000000..2b48c09 --- /dev/null +++ b/CocoaCamp/iPhone/en.lproj/MainWindow_iPhone.xib @@ -0,0 +1,372 @@ + + + + 1024 + 10D573 + 786 + 1038.29 + 460.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 112 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + IBCocoaTouchFramework + + + + 1316 + + YES + + + 1325 + {{51, 229}, {218, 22}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + My Universal App on iPhone + + 1 + MCAwIDAAA + + + 1 + 10 + + + + {320, 480} + + + 1 + MSAxIDEAA + + NO + NO + + IBCocoaTouchFramework + YES + + + + + YES + + + delegate + + + + 5 + + + + window + + + + 6 + + + + + YES + + 0 + + + + + + 2 + + + YES + + + + + + -1 + + + File's Owner + + + 4 + + + App Delegate + + + -2 + + + + + 8 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 2.IBAttributePlaceholdersKey + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 2.UIWindow.visibleAtLaunch + 4.CustomClassName + 4.IBPluginDependency + 8.IBPluginDependency + + + YES + UIApplication + UIResponder + + YES + + + YES + + + {{520, 376}, {320, 480}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + CocoaCampAppDelegate_iPhone + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 8 + + + + YES + + CocoaCampAppDelegate + NSObject + + window + UIWindow + + + window + + window + UIWindow + + + + IBProjectSource + Shared/CocoaCampAppDelegate.h + + + + CocoaCampAppDelegate_iPhone + CocoaCampAppDelegate + + IBProjectSource + iPhone/CocoaCampAppDelegate_iPhone.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIApplication + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIApplication.h + + + + UIResponder + NSObject + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIWindow + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIWindow.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../CocoaCamp.xcodeproj + 3 + 112 + + diff --git a/CocoaCamp/main.m b/CocoaCamp/main.m new file mode 100644 index 0000000..b589fe3 --- /dev/null +++ b/CocoaCamp/main.m @@ -0,0 +1,17 @@ +// +// main.m +// CocoaCamp +// +// Created by Rusty Zarse on 8/2/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + int retVal = UIApplicationMain(argc, argv, nil, nil); + [pool release]; + return retVal; +} diff --git a/CocoaCampTests/Classes/WebService/WordPressApiSessionsJsonParserTests.h b/CocoaCampTests/Classes/WebService/WordPressApiSessionsJsonParserTests.h new file mode 100644 index 0000000..b4f853d --- /dev/null +++ b/CocoaCampTests/Classes/WebService/WordPressApiSessionsJsonParserTests.h @@ -0,0 +1,23 @@ +// +// WordPressApiSessionsJsonParserTests.h +// CocoaCamp +// +// Created by Rusty Zarse on 10/19/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// +// See Also: http://developer.apple.com/iphone/library/documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html + +// Application unit tests contain unit test code that must be injected into an application to run correctly. +// Define USE_APPLICATION_UNIT_TEST to 0 if the unit test code is designed to be linked into an independent test executable. + +#define USE_APPLICATION_UNIT_TEST 0 + +#import +#import +//#import "application_headers" as required + +@interface WordPressApiSessionsJsonParserTests : SenTestCase + + + +@end diff --git a/CocoaCampTests/Classes/WebService/WordPressApiSessionsJsonParserTests.m b/CocoaCampTests/Classes/WebService/WordPressApiSessionsJsonParserTests.m new file mode 100644 index 0000000..725b25d --- /dev/null +++ b/CocoaCampTests/Classes/WebService/WordPressApiSessionsJsonParserTests.m @@ -0,0 +1,54 @@ +// +// WordPressApiSessionsJsonParserTests.m +// CocoaCamp +// +// Created by Rusty Zarse on 10/19/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import "WordPressApiSessionsJsonParserTests.h" +#import "WordPressApiSessionsJsonParser.h" +#import "Session.h" + +@implementation WordPressApiSessionsJsonParserTests + +#if USE_APPLICATION_UNIT_TEST // all code under test is in the iPhone Application + +- (void)testAppDelegate { + + id yourApplicationDelegate = [[UIApplication sharedApplication] delegate]; + STAssertNotNil(yourApplicationDelegate, @"UIApplication failed to find the AppDelegate"); + +} + +#else // all code under test must be linked into the Unit Test bundle + +- (void)testParseScheduleJsonSample { + NSString *filePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"WordPressScheduleDay" ofType:@"js"]; + NSString *jsonFileContents = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; + STAssertNotNil(jsonFileContents, @"File contents expected not nil for path %@", filePath); + + CoreDataManager *coreDataManager = [[CoreDataManager alloc] init]; + WordPressApiSessionsJsonParser *parser = [[WordPressApiSessionsJsonParser alloc] initWithManagedObjectContext:[coreDataManager managedObjectContext]]; + + NSArray *results = [parser parseSessionScheduleJson:jsonFileContents]; + STAssertNotNil(results, @"results contents expected not nil for path %@", filePath); + + STAssertEquals((NSUInteger)10, [results count], @"ten sessions expected in sample data"); + + // find the lunch item + // this item date was not parsing correctly + NSPredicate *lunchSessionPredicate = [NSPredicate predicateWithFormat:@"title = 'Luncheon & Plenary Session: Yale Law Professor & Bestselling Author Amy Chua (Co-Sponsored by Allstate & Schiff Hardin, LLP)'"]; + NSArray *filteredResults = [results filteredArrayUsingPredicate:lunchSessionPredicate]; + STAssertEquals((NSUInteger)1, [filteredResults count], @"1 session expected in filtered data"); + + Session *lunchSession = [filteredResults objectAtIndex:0]; + NSDate *sessionStartDateTime = [lunchSession datetimeStart]; + + +} + + +#endif + +@end diff --git a/CocoaCamp-Info.plist b/CocoaCampTests/CocoaCampTests-Info.plist similarity index 56% rename from CocoaCamp-Info.plist rename to CocoaCampTests/CocoaCampTests-Info.plist index 77bab40..3dc91a1 100644 --- a/CocoaCamp-Info.plist +++ b/CocoaCampTests/CocoaCampTests-Info.plist @@ -3,28 +3,20 @@ CFBundleDevelopmentRegion - English - CFBundleDisplayName - ${PRODUCT_NAME} + en CFBundleExecutable ${EXECUTABLE_NAME} - CFBundleIconFile - iPhoneAppIcon.png CFBundleIdentifier - com.yourcompany.${PRODUCT_NAME:rfc1034identifier} + com.ios.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 - CFBundleName - ${PRODUCT_NAME} CFBundlePackageType - APPL + BNDL + CFBundleShortVersionString + 1.0 CFBundleSignature ???? CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - NSMainNibFile - MainWindow + 1 diff --git a/CocoaCampTests/CocoaCampTests.h b/CocoaCampTests/CocoaCampTests.h new file mode 100644 index 0000000..65b4c9e --- /dev/null +++ b/CocoaCampTests/CocoaCampTests.h @@ -0,0 +1,13 @@ +// +// CocoaCampTests.h +// CocoaCampTests +// +// Created by Rusty Zarse on 8/2/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import + +@interface CocoaCampTests : SenTestCase + +@end diff --git a/CocoaCampTests/CocoaCampTests.m b/CocoaCampTests/CocoaCampTests.m new file mode 100644 index 0000000..fec0fc0 --- /dev/null +++ b/CocoaCampTests/CocoaCampTests.m @@ -0,0 +1,32 @@ +// +// CocoaCampTests.m +// CocoaCampTests +// +// Created by Rusty Zarse on 8/2/11. +// Copyright 2011 LeVous, LLC. All rights reserved. +// + +#import "CocoaCampTests.h" + +@implementation CocoaCampTests + +- (void)setUp +{ + [super setUp]; + + // Set-up code here. +} + +- (void)tearDown +{ + // Tear-down code here. + + [super tearDown]; +} + +- (void)testExample +{ + // STFail(@"Unit tests are not implemented yet in CocoaCampTests"); +} + +@end diff --git a/CocoaCampTests/en.lproj/InfoPlist.strings b/CocoaCampTests/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/CocoaCampTests/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Default.png b/Default.png new file mode 100644 index 0000000..9812af1 Binary files /dev/null and b/Default.png differ diff --git a/Icon.png b/Icon.png new file mode 100644 index 0000000..5c25946 Binary files /dev/null and b/Icon.png differ diff --git a/Icon@2x.png b/Icon@2x.png new file mode 100644 index 0000000..2c81472 Binary files /dev/null and b/Icon@2x.png differ diff --git a/MainWindow.xib b/MainWindow.xib deleted file mode 100755 index 7a39645..0000000 --- a/MainWindow.xib +++ /dev/null @@ -1,852 +0,0 @@ - - - - 1024 - 10F569 - 788 - 1038.29 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 117 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - IBCocoaTouchFramework - - - - 1316 - - {320, 480} - - 1 - MSAxIDEAA - - NO - NO - - IBCocoaTouchFramework - YES - YES - - - - - 2 - NO - - - - 1 - - IBCocoaTouchFramework - NO - - People - - People - - NSImage - group.png - - IBCocoaTouchFramework - - - - - ContactExchangeView - - 1 - - IBCocoaTouchFramework - NO - - - YES - - - Schedule - - NSImage - calendar.png - - IBCocoaTouchFramework - - - - - - 1 - - IBCocoaTouchFramework - NO - - - 256 - {320, 44} - NO - YES - YES - IBCocoaTouchFramework - - - YES - - - - Item - IBCocoaTouchFramework - - - SessionViewController - - 1 - - IBCocoaTouchFramework - NO - - - - - - - Flickr - - NSImage - photoIcon.png - - IBCocoaTouchFramework - - - - - - 1 - - IBCocoaTouchFramework - NO - - - 256 - {320, 44} - NO - YES - YES - IBCocoaTouchFramework - - - YES - - - - Item - IBCocoaTouchFramework - - - - 1 - - IBCocoaTouchFramework - NO - - - - - Attendees - - You - IBCocoaTouchFramework - - - - - - 1 - - IBCocoaTouchFramework - NO - - - - - 266 - {{129, 330}, {163, 49}} - - 3 - MCAwAA - - NO - IBCocoaTouchFramework - - - - - - YES - - - window - - - - 9 - - - - delegate - - - - 99 - - - - tabBarController - - - - 113 - - - - - YES - - 0 - - - - - - 2 - - - YES - - - - - -1 - - - File's Owner - - - 3 - - - - - 106 - - - YES - - - - - - - - - - 107 - - - - - -2 - - - - - 124 - - - YES - - - - - - - - 125 - - - - - 126 - - - YES - - - - - - 127 - - - - - 128 - - - - - 129 - - - YES - - - - - - 130 - - - - - 131 - - - YES - - - - - - 132 - - - - - 135 - - - YES - - - - - - - - 136 - - - - - 137 - - - YES - - - - - - 138 - - - - - 139 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 106.IBEditorWindowLastContentRect - 106.IBPluginDependency - 107.IBPluginDependency - 126.CustomClassName - 129.CustomClassName - 131.CustomClassName - 137.CustomClassName - 2.IBAttributePlaceholdersKey - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - - - YES - UIApplication - UIResponder - {{568, 81}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - SessionViewController - AttendeeListViewController - AttendeeListViewController - FlickrThumbnailView - - YES - - - YES - - - {{413, 216}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CocoaCampAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 139 - - - - YES - - AttendeeListViewController - UITableViewController - - searchBar - UISearchBar - - - searchBar - - searchBar - UISearchBar - - - - IBProjectSource - Classes/AttendeeListViewController.h - - - - CocoaCampAppDelegate - NSObject - - YES - - YES - tabBarController - window - - - YES - UITabBarController - UIWindow - - - - YES - - YES - tabBarController - window - - - YES - - tabBarController - UITabBarController - - - window - UIWindow - - - - - IBProjectSource - Classes/CocoaCampAppDelegate.h - - - - FlickrThumbnailView - MyThumbsViewController - - IBProjectSource - Classes/FlickrThumbnailView.h - - - - MyThumbsViewController - TTThumbsViewController - - realModel - id - - - realModel - - realModel - id - - - - IBProjectSource - Classes/ForwardingAdapters.h - - - - NSObject - - IBProjectSource - Classes/JSON/NSObject+SBJSON.h - - - - NSObject - - IBProjectSource - Classes/JSON/SBJsonWriter.h - - - - SessionViewController - UITableViewController - - IBProjectSource - Classes/SessionViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIApplication - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIApplication.h - - - - UIBarButtonItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UIBarButtonItem.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UINavigationBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UINavigationBar.h - - - - UINavigationController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UINavigationItem - NSObject - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITabBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITabBar.h - - - - UITabBarController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UITabBarItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UITabBarItem.h - - - - UITableViewController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITableViewController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWindow - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWindow.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - CocoaCamp.xcodeproj - 3 - - YES - - YES - calendar.png - group.png - photoIcon.png - - - YES - {23, 25} - {32, 21} - {30, 30} - - - 117 - - diff --git a/README.mdown b/README.mdown index f19d5e3..ddd8c87 100644 --- a/README.mdown +++ b/README.mdown @@ -43,11 +43,10 @@ Current State ============= There are 4 tabs: +1. People - bump contact exchange UI 1. Schedule - conference schedule -2. People - bump contact exchange UI -3. Flickr - take pictures and share with other attendees on Flickr -4. You - identify yourself on the app so that you can use bump contact -exchange(maybe should merge this w People in the future?) +3. Flickr Wall - take pictures and share with other attendees on Flickr +4. Twitter Fall - twitter stream for cocoacamp Merging from Main Trunk ======================= @@ -107,3 +106,14 @@ point, follow the *Merging from Main Trunk* instructions above to merge back to your repo. Between the time you send me the pull request and the time I am done with the merge, it's best that you don't do anything that modifies *CocoaCamp.xcodeproj/project.pbxproj* or *MainWindow.xib*. + +Known Issues +============ +CocaoCamp Atlanta 2010 is over! Here are some complaints we heard from the field: + +1. iPhone 3G which were upgraded to iOS 4.x crash on startup. +2. Some have experienced problems with Bump, although it's worked for me every time, so, I believe this is more of a usability problem than a bug. +3. Crashing going back to the Twitter Fall tab after leaving it for a while. +4. In the Flickr image viewer, some images failed to load. + + diff --git a/headerBackground.png b/headerBackground.png deleted file mode 100644 index 7609b91..0000000 Binary files a/headerBackground.png and /dev/null differ diff --git a/main.m b/main.m deleted file mode 100644 index 61d6ea2..0000000 --- a/main.m +++ /dev/null @@ -1,17 +0,0 @@ -// -// main.m -// CocoaCamp -// -// Created by Jonathan Freeman on 7/12/10. -// Copyright __MyCompanyName__ 2010. All rights reserved. -// - -#import - -int main(int argc, char *argv[]) { - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - int retVal = UIApplicationMain(argc, argv, nil, nil); - [pool release]; - return retVal; -} - diff --git a/napaba-launch.png b/napaba-launch.png new file mode 100644 index 0000000..08eb1b2 Binary files /dev/null and b/napaba-launch.png differ