diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..8428e8d --- /dev/null +++ b/Podfile @@ -0,0 +1,2 @@ +platform :osx, '10.9' +pod 'SSKeychain' \ No newline at end of file diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 0000000..570b748 --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,10 @@ +PODS: + - SSKeychain (1.2.2) + +DEPENDENCIES: + - SSKeychain + +SPEC CHECKSUMS: + SSKeychain: cc48bd3ad24fcd9125adb9e0d23dd50b8bbd08b9 + +COCOAPODS: 0.33.1 diff --git a/Pods/BuildHeaders/SSKeychain/SSKeychain.h b/Pods/BuildHeaders/SSKeychain/SSKeychain.h new file mode 120000 index 0000000..e29ede6 --- /dev/null +++ b/Pods/BuildHeaders/SSKeychain/SSKeychain.h @@ -0,0 +1 @@ +../../SSKeychain/SSKeychain/SSKeychain.h \ No newline at end of file diff --git a/Pods/BuildHeaders/SSKeychain/SSKeychainQuery.h b/Pods/BuildHeaders/SSKeychain/SSKeychainQuery.h new file mode 120000 index 0000000..588528f --- /dev/null +++ b/Pods/BuildHeaders/SSKeychain/SSKeychainQuery.h @@ -0,0 +1 @@ +../../SSKeychain/SSKeychain/SSKeychainQuery.h \ No newline at end of file diff --git a/Pods/Headers/SSKeychain/SSKeychain.h b/Pods/Headers/SSKeychain/SSKeychain.h new file mode 120000 index 0000000..e29ede6 --- /dev/null +++ b/Pods/Headers/SSKeychain/SSKeychain.h @@ -0,0 +1 @@ +../../SSKeychain/SSKeychain/SSKeychain.h \ No newline at end of file diff --git a/Pods/Headers/SSKeychain/SSKeychainQuery.h b/Pods/Headers/SSKeychain/SSKeychainQuery.h new file mode 120000 index 0000000..588528f --- /dev/null +++ b/Pods/Headers/SSKeychain/SSKeychainQuery.h @@ -0,0 +1 @@ +../../SSKeychain/SSKeychain/SSKeychainQuery.h \ No newline at end of file diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock new file mode 100644 index 0000000..570b748 --- /dev/null +++ b/Pods/Manifest.lock @@ -0,0 +1,10 @@ +PODS: + - SSKeychain (1.2.2) + +DEPENDENCIES: + - SSKeychain + +SPEC CHECKSUMS: + SSKeychain: cc48bd3ad24fcd9125adb9e0d23dd50b8bbd08b9 + +COCOAPODS: 0.33.1 diff --git a/Pods/Pods-SSKeychain-Private.xcconfig b/Pods/Pods-SSKeychain-Private.xcconfig new file mode 100644 index 0000000..86ab340 --- /dev/null +++ b/Pods/Pods-SSKeychain-Private.xcconfig @@ -0,0 +1,5 @@ +#include "Pods-SSKeychain.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/BuildHeaders" "${PODS_ROOT}/BuildHeaders/SSKeychain" "${PODS_ROOT}/Headers" "${PODS_ROOT}/Headers/SSKeychain" +OTHER_LDFLAGS = -ObjC ${PODS_SSKEYCHAIN_OTHER_LDFLAGS} +PODS_ROOT = ${SRCROOT} \ No newline at end of file diff --git a/Pods/Pods-SSKeychain-dummy.m b/Pods/Pods-SSKeychain-dummy.m new file mode 100644 index 0000000..e80bea6 --- /dev/null +++ b/Pods/Pods-SSKeychain-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_SSKeychain : NSObject +@end +@implementation PodsDummy_Pods_SSKeychain +@end diff --git a/Pods/Pods-SSKeychain-prefix.pch b/Pods/Pods-SSKeychain-prefix.pch new file mode 100644 index 0000000..2e9257c --- /dev/null +++ b/Pods/Pods-SSKeychain-prefix.pch @@ -0,0 +1,5 @@ +#ifdef __OBJC__ +#import +#endif + +#import "Pods-environment.h" diff --git a/Pods/Pods-SSKeychain.xcconfig b/Pods/Pods-SSKeychain.xcconfig new file mode 100644 index 0000000..4aa77fe --- /dev/null +++ b/Pods/Pods-SSKeychain.xcconfig @@ -0,0 +1 @@ +PODS_SSKEYCHAIN_OTHER_LDFLAGS = -framework Foundation -framework Security \ No newline at end of file diff --git a/Pods/Pods-acknowledgements.markdown b/Pods/Pods-acknowledgements.markdown new file mode 100644 index 0000000..40ada16 --- /dev/null +++ b/Pods/Pods-acknowledgements.markdown @@ -0,0 +1,27 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## SSKeychain + +Copyright (c) 2010-2014 Sam Soffes, http://soff.es + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Generated by CocoaPods - http://cocoapods.org diff --git a/Pods/Pods-acknowledgements.plist b/Pods/Pods-acknowledgements.plist new file mode 100644 index 0000000..99a2b95 --- /dev/null +++ b/Pods/Pods-acknowledgements.plist @@ -0,0 +1,57 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2010-2014 Sam Soffes, http://soff.es + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Title + SSKeychain + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - http://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Pods-dummy.m b/Pods/Pods-dummy.m new file mode 100644 index 0000000..ade64bd --- /dev/null +++ b/Pods/Pods-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods : NSObject +@end +@implementation PodsDummy_Pods +@end diff --git a/Pods/Pods-environment.h b/Pods/Pods-environment.h new file mode 100644 index 0000000..32fded8 --- /dev/null +++ b/Pods/Pods-environment.h @@ -0,0 +1,14 @@ + +// To check if a library is compiled with CocoaPods you +// can use the `COCOAPODS` macro definition which is +// defined in the xcconfigs so it is available in +// headers also when they are imported in the client +// project. + + +// SSKeychain +#define COCOAPODS_POD_AVAILABLE_SSKeychain +#define COCOAPODS_VERSION_MAJOR_SSKeychain 1 +#define COCOAPODS_VERSION_MINOR_SSKeychain 2 +#define COCOAPODS_VERSION_PATCH_SSKeychain 2 + diff --git a/Pods/Pods-resources.sh b/Pods/Pods-resources.sh new file mode 100755 index 0000000..39c2549 --- /dev/null +++ b/Pods/Pods-resources.sh @@ -0,0 +1,68 @@ +#!/bin/sh +set -e + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +install_resource() +{ + case $1 in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" + ;; + *.xcassets) + ;; + /*) + echo "$1" + echo "$1" >> "$RESOURCES_TO_COPY" + ;; + *) + echo "${PODS_ROOT}/$1" + echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]]; then + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ `xcrun --find actool` ] && [ `find . -name '*.xcassets' | wc -l` -ne 0 ] +then + case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; + esac + find "${PWD}" -name "*.xcassets" -print0 | xargs -0 actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Pods/Pods.xcconfig b/Pods/Pods.xcconfig new file mode 100644 index 0000000..0b1c505 --- /dev/null +++ b/Pods/Pods.xcconfig @@ -0,0 +1,5 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers" "${PODS_ROOT}/Headers/SSKeychain" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers" -isystem "${PODS_ROOT}/Headers/SSKeychain" +OTHER_LDFLAGS = -ObjC -framework Foundation -framework Security +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..189d048 --- /dev/null +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1070 @@ + + + + + archiveVersion + 1 + classes + + objectVersion + 46 + objects + + 037E645E51414480B35672E4 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SSKeychainQuery.m + path + SSKeychain/SSKeychainQuery.m + sourceTree + <group> + + 03A0AC9D78014D54A23E90D2 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text + path + Pods-acknowledgements.markdown + sourceTree + <group> + + 040797A47CAB45728345D784 + + baseConfigurationReference + 794B81678E5546B7BC30B8BB + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COMBINE_HIDPI_IMAGES + YES + COPY_PHASE_STRIP + YES + DEBUG_INFORMATION_FORMAT + dwarf-with-dsym + DSTROOT + /tmp/xcodeproj.dst + GCC_C_LANGUAGE_STANDARD + gnu99 + GCC_ENABLE_OBJC_EXCEPTIONS + YES + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Pods-SSKeychain-prefix.pch + GCC_VERSION + com.apple.compilers.llvm.clang.1_0 + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + MACOSX_DEPLOYMENT_TARGET + 10.9 + OTHER_CFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_CPLUSPLUSFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_LDFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + SDKROOT + macosx + SKIP_INSTALL + YES + + isa + XCBuildConfiguration + name + Release + + 09081E03A474404F99E27C3B + + fileRef + 3AA3C551ED0B44818D8A3EC9 + isa + PBXBuildFile + + 1B5CC0C4EEAC4B55997B4A98 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text + name + Podfile + path + ../Podfile + sourceTree + SOURCE_ROOT + xcLanguageSpecificationIdentifier + xcode.lang.ruby + + 2575A39894D843E48932D6D4 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.script.sh + path + Pods-resources.sh + sourceTree + <group> + + 285ECC318E334026B4471578 + + explicitFileType + archive.ar + includeInIndex + 0 + isa + PBXFileReference + path + libPods.a + sourceTree + BUILT_PRODUCTS_DIR + + 2F36FA23206B475683C5A503 + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + Cocoa.framework + path + Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/Cocoa.framework + sourceTree + DEVELOPER_DIR + + 2FE52B77808B43BC8F54F253 + + baseConfigurationReference + CE7965FCDC99487A93764CC5 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COMBINE_HIDPI_IMAGES + YES + COPY_PHASE_STRIP + NO + DSTROOT + /tmp/xcodeproj.dst + GCC_C_LANGUAGE_STANDARD + gnu99 + GCC_DYNAMIC_NO_PIC + NO + GCC_ENABLE_OBJC_EXCEPTIONS + YES + GCC_OPTIMIZATION_LEVEL + 0 + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + GCC_SYMBOLS_PRIVATE_EXTERN + NO + GCC_VERSION + com.apple.compilers.llvm.clang.1_0 + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + MACOSX_DEPLOYMENT_TARGET + 10.9 + OTHER_LDFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + SDKROOT + macosx + SKIP_INSTALL + YES + + isa + XCBuildConfiguration + name + Debug + + 32B2ED4BB56B424C9DA1057E + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + Pods-environment.h + sourceTree + <group> + + 38575FA34E434565BDAB8DE2 + + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + CLANG_CXX_LANGUAGE_STANDARD + gnu++0x + CLANG_CXX_LIBRARY + libc++ + CLANG_ENABLE_MODULES + YES + CLANG_ENABLE_OBJC_ARC + NO + CLANG_WARN_BOOL_CONVERSION + YES + CLANG_WARN_CONSTANT_CONVERSION + YES + CLANG_WARN_DIRECT_OBJC_ISA_USAGE + YES + CLANG_WARN_EMPTY_BODY + YES + CLANG_WARN_ENUM_CONVERSION + YES + CLANG_WARN_INT_CONVERSION + YES + CLANG_WARN_OBJC_ROOT_CLASS + YES + COPY_PHASE_STRIP + NO + ENABLE_NS_ASSERTIONS + NO + GCC_C_LANGUAGE_STANDARD + gnu99 + GCC_WARN_64_TO_32_BIT_CONVERSION + YES + GCC_WARN_ABOUT_RETURN_TYPE + YES + GCC_WARN_UNDECLARED_SELECTOR + YES + GCC_WARN_UNINITIALIZED_AUTOS + YES + GCC_WARN_UNUSED_FUNCTION + YES + GCC_WARN_UNUSED_VARIABLE + YES + MACOSX_DEPLOYMENT_TARGET + 10.9 + STRIP_INSTALLED_PRODUCT + NO + VALIDATE_PRODUCT + YES + + isa + XCBuildConfiguration + name + Release + + 38EBD0CE7FB54455856C60E6 + + children + + 2F36FA23206B475683C5A503 + 72DFA8CC25584AEAA22B8B1C + 44B438426834499583DC63AB + + isa + PBXGroup + name + OS X + sourceTree + <group> + + 3AA3C551ED0B44818D8A3EC9 + + explicitFileType + archive.ar + includeInIndex + 0 + isa + PBXFileReference + path + libPods-SSKeychain.a + sourceTree + BUILT_PRODUCTS_DIR + + 3EE54875C21A4C89AD9E8E80 + + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + CLANG_CXX_LANGUAGE_STANDARD + gnu++0x + CLANG_CXX_LIBRARY + libc++ + CLANG_ENABLE_MODULES + YES + CLANG_ENABLE_OBJC_ARC + NO + CLANG_WARN_BOOL_CONVERSION + YES + CLANG_WARN_CONSTANT_CONVERSION + YES + CLANG_WARN_DIRECT_OBJC_ISA_USAGE + YES + CLANG_WARN_EMPTY_BODY + YES + CLANG_WARN_ENUM_CONVERSION + YES + CLANG_WARN_INT_CONVERSION + YES + CLANG_WARN_OBJC_ROOT_CLASS + YES + COPY_PHASE_STRIP + YES + GCC_C_LANGUAGE_STANDARD + gnu99 + GCC_DYNAMIC_NO_PIC + NO + GCC_OPTIMIZATION_LEVEL + 0 + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + GCC_SYMBOLS_PRIVATE_EXTERN + NO + GCC_WARN_64_TO_32_BIT_CONVERSION + YES + GCC_WARN_ABOUT_RETURN_TYPE + YES + GCC_WARN_UNDECLARED_SELECTOR + YES + GCC_WARN_UNINITIALIZED_AUTOS + YES + GCC_WARN_UNUSED_FUNCTION + YES + GCC_WARN_UNUSED_VARIABLE + YES + MACOSX_DEPLOYMENT_TARGET + 10.9 + ONLY_ACTIVE_ARCH + YES + STRIP_INSTALLED_PRODUCT + NO + + isa + XCBuildConfiguration + name + Debug + + 43E9D01DEC1447FB8BF1947C + + children + + 7856AC246FB54A10AF746530 + + isa + PBXGroup + name + Pods + sourceTree + <group> + + 44B438426834499583DC63AB + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + Security.framework + path + Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/Security.framework + sourceTree + DEVELOPER_DIR + + 4B754CA14930448B8459C006 + + fileRef + B39D7894EE424DB087E29C8D + isa + PBXBuildFile + + 4CD89A493D01440A85ACDADB + + fileRef + 037E645E51414480B35672E4 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -fobjc-arc -DOS_OBJECT_USE_OBJC=0 + + + 4DB4378F88644FEC980F82BD + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SSKeychain.m + path + SSKeychain/SSKeychain.m + sourceTree + <group> + + 50938D8A997740D7BEFA05D8 + + buildActionMask + 2147483647 + files + + 4B754CA14930448B8459C006 + 9B299DBFD8EE4EDC9A75B49F + + isa + PBXHeadersBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 5DA64FE435E44FE39912140F + + attributes + + LastUpgradeCheck + 0510 + + buildConfigurationList + BA069C4B2B8840B3AC49BF75 + compatibilityVersion + Xcode 3.2 + developmentRegion + English + hasScannedForEncodings + 0 + isa + PBXProject + knownRegions + + en + + mainGroup + 9ECD4670923E4F0C802D5C83 + productRefGroup + 5EB9817AE7974BF8B94B1CEA + projectDirPath + + projectReferences + + projectRoot + + targets + + 6712BC97D9834E638B2C493F + 70FAC04579594ABC8BE98FA3 + + + 5EB9817AE7974BF8B94B1CEA + + children + + 285ECC318E334026B4471578 + 3AA3C551ED0B44818D8A3EC9 + + isa + PBXGroup + name + Products + sourceTree + <group> + + 6712BC97D9834E638B2C493F + + buildConfigurationList + E2D5486BDEFD465083F807B2 + buildPhases + + 6983E931D59341DC913C752A + 82FC372BE73E40A9B5CDC600 + + buildRules + + dependencies + + C75A0EC71D6B43838A011079 + + isa + PBXNativeTarget + name + Pods + productName + Pods + productReference + 285ECC318E334026B4471578 + productType + com.apple.product-type.library.static + + 6983E931D59341DC913C752A + + buildActionMask + 2147483647 + files + + 8E7FB561046443A69BF1A00B + + isa + PBXSourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 6A8966906865446899F5E9E2 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + Pods-SSKeychain-dummy.m + sourceTree + <group> + + 6BF0C14CD58C4FFDBC7AD679 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + Pods-dummy.m + sourceTree + <group> + + 6C08F108207A427B8E0AA993 + + fileRef + 44B438426834499583DC63AB + isa + PBXBuildFile + + 6DDD9EA500C94B1099BEC8CA + + children + + F7BE1890FE5F466FBE2B90C1 + + isa + PBXGroup + name + Targets Support Files + sourceTree + <group> + + 70FAC04579594ABC8BE98FA3 + + buildConfigurationList + 71EF20229C614B28B5A04CFB + buildPhases + + C2F0E28BC8C94A22869E38F6 + A168E2FACA3B48D6BA9C2C19 + 50938D8A997740D7BEFA05D8 + + buildRules + + dependencies + + isa + PBXNativeTarget + name + Pods-SSKeychain + productName + Pods-SSKeychain + productReference + 3AA3C551ED0B44818D8A3EC9 + productType + com.apple.product-type.library.static + + 71EF20229C614B28B5A04CFB + + buildConfigurations + + AF343173690342808E1DDAFD + 040797A47CAB45728345D784 + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + 72DFA8CC25584AEAA22B8B1C + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + Foundation.framework + path + Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/Foundation.framework + sourceTree + DEVELOPER_DIR + + 7856AC246FB54A10AF746530 + + children + + B39D7894EE424DB087E29C8D + 4DB4378F88644FEC980F82BD + D4A67B82C6DA42F0BE7A4CA9 + 037E645E51414480B35672E4 + 948C68B6065B4225A30853AA + + isa + PBXGroup + name + SSKeychain + path + SSKeychain + sourceTree + <group> + + 794B81678E5546B7BC30B8BB + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-SSKeychain-Private.xcconfig + sourceTree + <group> + + 82FC372BE73E40A9B5CDC600 + + buildActionMask + 2147483647 + files + + F65FA3618A07421B859C3D62 + 09081E03A474404F99E27C3B + + isa + PBXFrameworksBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 8D560C128D42442D807105D9 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.plist.xml + path + Pods-acknowledgements.plist + sourceTree + <group> + + 8E7FB561046443A69BF1A00B + + fileRef + 6BF0C14CD58C4FFDBC7AD679 + isa + PBXBuildFile + + 948C68B6065B4225A30853AA + + children + + 96099E6C1B0947A7B5706F8A + 794B81678E5546B7BC30B8BB + 6A8966906865446899F5E9E2 + C4012953F5274F5A97007A89 + + isa + PBXGroup + name + Support Files + sourceTree + SOURCE_ROOT + + 96099E6C1B0947A7B5706F8A + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-SSKeychain.xcconfig + sourceTree + <group> + + 9B299DBFD8EE4EDC9A75B49F + + fileRef + D4A67B82C6DA42F0BE7A4CA9 + isa + PBXBuildFile + + 9ECD4670923E4F0C802D5C83 + + children + + 1B5CC0C4EEAC4B55997B4A98 + B21328B9B7CA48109C554AEC + 43E9D01DEC1447FB8BF1947C + 5EB9817AE7974BF8B94B1CEA + 6DDD9EA500C94B1099BEC8CA + + isa + PBXGroup + sourceTree + <group> + + A168E2FACA3B48D6BA9C2C19 + + buildActionMask + 2147483647 + files + + CC61CD34F986428F9DB2C73A + FB60ED26D2A74F5F8B23F1BC + 6C08F108207A427B8E0AA993 + + isa + PBXFrameworksBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + AF343173690342808E1DDAFD + + baseConfigurationReference + 794B81678E5546B7BC30B8BB + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COMBINE_HIDPI_IMAGES + YES + COPY_PHASE_STRIP + NO + DSTROOT + /tmp/xcodeproj.dst + GCC_C_LANGUAGE_STANDARD + gnu99 + GCC_DYNAMIC_NO_PIC + NO + GCC_ENABLE_OBJC_EXCEPTIONS + YES + GCC_OPTIMIZATION_LEVEL + 0 + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Pods-SSKeychain-prefix.pch + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + GCC_SYMBOLS_PRIVATE_EXTERN + NO + GCC_VERSION + com.apple.compilers.llvm.clang.1_0 + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + MACOSX_DEPLOYMENT_TARGET + 10.9 + OTHER_LDFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + SDKROOT + macosx + SKIP_INSTALL + YES + + isa + XCBuildConfiguration + name + Debug + + B21328B9B7CA48109C554AEC + + children + + 38EBD0CE7FB54455856C60E6 + + isa + PBXGroup + name + Frameworks + sourceTree + <group> + + B39D7894EE424DB087E29C8D + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SSKeychain.h + path + SSKeychain/SSKeychain.h + sourceTree + <group> + + BA069C4B2B8840B3AC49BF75 + + buildConfigurations + + 3EE54875C21A4C89AD9E8E80 + 38575FA34E434565BDAB8DE2 + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + BE5A8A33B13844239F77FAF8 + + fileRef + 4DB4378F88644FEC980F82BD + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -fobjc-arc -DOS_OBJECT_USE_OBJC=0 + + + C2F0E28BC8C94A22869E38F6 + + buildActionMask + 2147483647 + files + + FA4BEABA36EB4FEAAA1DADEE + BE5A8A33B13844239F77FAF8 + 4CD89A493D01440A85ACDADB + + isa + PBXSourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + C35B184B6151434CA6C5F804 + + baseConfigurationReference + CE7965FCDC99487A93764CC5 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COMBINE_HIDPI_IMAGES + YES + COPY_PHASE_STRIP + YES + DEBUG_INFORMATION_FORMAT + dwarf-with-dsym + DSTROOT + /tmp/xcodeproj.dst + GCC_C_LANGUAGE_STANDARD + gnu99 + GCC_ENABLE_OBJC_EXCEPTIONS + YES + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_VERSION + com.apple.compilers.llvm.clang.1_0 + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + MACOSX_DEPLOYMENT_TARGET + 10.9 + OTHER_CFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_CPLUSPLUSFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_LDFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + SDKROOT + macosx + SKIP_INSTALL + YES + + isa + XCBuildConfiguration + name + Release + + C4012953F5274F5A97007A89 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + Pods-SSKeychain-prefix.pch + sourceTree + <group> + + C75A0EC71D6B43838A011079 + + isa + PBXTargetDependency + target + 70FAC04579594ABC8BE98FA3 + targetProxy + D57C5446B94A486DA76E6B8D + + CC61CD34F986428F9DB2C73A + + fileRef + 2F36FA23206B475683C5A503 + isa + PBXBuildFile + + CE7965FCDC99487A93764CC5 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods.xcconfig + sourceTree + <group> + + D4A67B82C6DA42F0BE7A4CA9 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SSKeychainQuery.h + path + SSKeychain/SSKeychainQuery.h + sourceTree + <group> + + D57C5446B94A486DA76E6B8D + + containerPortal + 5DA64FE435E44FE39912140F + isa + PBXContainerItemProxy + proxyType + 1 + remoteGlobalIDString + 70FAC04579594ABC8BE98FA3 + remoteInfo + Pods-SSKeychain + + E2D5486BDEFD465083F807B2 + + buildConfigurations + + 2FE52B77808B43BC8F54F253 + C35B184B6151434CA6C5F804 + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + F65FA3618A07421B859C3D62 + + fileRef + 2F36FA23206B475683C5A503 + isa + PBXBuildFile + + F7BE1890FE5F466FBE2B90C1 + + children + + CE7965FCDC99487A93764CC5 + 03A0AC9D78014D54A23E90D2 + 8D560C128D42442D807105D9 + 6BF0C14CD58C4FFDBC7AD679 + 32B2ED4BB56B424C9DA1057E + 2575A39894D843E48932D6D4 + + isa + PBXGroup + name + Pods + sourceTree + <group> + + FA4BEABA36EB4FEAAA1DADEE + + fileRef + 6A8966906865446899F5E9E2 + isa + PBXBuildFile + + FB60ED26D2A74F5F8B23F1BC + + fileRef + 72DFA8CC25584AEAA22B8B1C + isa + PBXBuildFile + + + rootObject + 5DA64FE435E44FE39912140F + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/rdougan.xcuserdatad/xcschemes/Pods-SSKeychain.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/rdougan.xcuserdatad/xcschemes/Pods-SSKeychain.xcscheme new file mode 100644 index 0000000..d747dcc --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/rdougan.xcuserdatad/xcschemes/Pods-SSKeychain.xcscheme @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/rdougan.xcuserdatad/xcschemes/Pods.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/rdougan.xcuserdatad/xcschemes/Pods.xcscheme new file mode 100644 index 0000000..73c7824 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/rdougan.xcuserdatad/xcschemes/Pods.xcscheme @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/rdougan.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/rdougan.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..818eb2a --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/rdougan.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,32 @@ + + + + + SchemeUserState + + Pods-SSKeychain.xcscheme + + isShown + + + Pods.xcscheme + + isShown + + + + SuppressBuildableAutocreation + + 6712BC97D9834E638B2C493F + + primary + + + 70FAC04579594ABC8BE98FA3 + + primary + + + + + diff --git a/Pods/SSKeychain/LICENSE b/Pods/SSKeychain/LICENSE new file mode 100644 index 0000000..2ed16bd --- /dev/null +++ b/Pods/SSKeychain/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2010-2014 Sam Soffes, http://soff.es + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Pods/SSKeychain/Readme.markdown b/Pods/SSKeychain/Readme.markdown new file mode 100644 index 0000000..c39ba8e --- /dev/null +++ b/Pods/SSKeychain/Readme.markdown @@ -0,0 +1,71 @@ +# SSKeychain + +SSKeychain is a simple wrapper for accessing accounts, getting passwords, setting passwords, and deleting passwords using the system Keychain on Mac OS X and iOS. + +## Adding to Your Project + +Simply add the following to your Podfile if you're using CocoaPods: + +``` ruby +pod 'SSKeychain' +``` + +To manually add to your project: + +1. Add `Security.framework` to your target +2. Add `SSKeychain.h`, `SSKeychain.m`, `SSKeychainQuery.h`, and `SSKeychainQuery.m` to your project. + +SSKeychain requires ARC. + +Note: Currently SSKeychain does not support Mac OS 10.6. + +## Working with the Keychain + +SSKeychain has the following class methods for working with the system keychain: + +```objective-c ++ (NSArray *)allAccounts; ++ (NSArray *)accountsForService:(NSString *)serviceName; ++ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account; ++ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account; ++ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account; +``` + +Easy as that. (See [SSKeychain.h](https://github.com/soffes/sskeychain/blob/master/SSKeychain/SSKeychain.h) and [SSKeychainQuery.h](https://github.com/soffes/sskeychain/blob/master/SSKeychain/SSKeychainQuery.h) for all of the methods.) + +## Documentation + +### Use prepared documentation + +Read the [online documentation](http://cocoadocs.org/docsets/SSKeychain/1.2.1/). + +## Debugging + +If your saving to the keychain fails, use the NSError object to handle it. You can invoke `[error code]` to get the numeric error code. A few values are defined in SSKeychain.h, and the rest in SecBase.h. + +```objective-c +NSError *error = nil; +SSKeychainQuery *query = [[SSKeychainQuery alloc] init]; +query.service = @"MyService"; +query.account = @"soffes"; +[query fetch:&error]; + +if ([error code] == errSecItemNotFound) { + NSLog(@"Password not found"); +} else if (error != nil) { + NSLog(@"Some other error occurred: %@", [error localizedDescription]); +} +``` + +Obviously, you should do something more sophisticated. You can just call `[error localizedDescription]` if all you need is the error message. + +## Disclaimer + +Working with the keychain is pretty sucky. You should really check for errors and failures. This library doesn't make it any more stable, it just wraps up all of the annoying C APIs. + + +## Thanks + +This was originally inspired by EMKeychain and SDKeychain (both of which are now gone). Thanks to the authors. SSKeychain has since switched to a simpler implementation that was abstracted from [SSToolkit](http://sstoolk.it). + +A huge thanks to [Caleb Davenport](https://github.com/calebd) for leading the way on version 1.0 of SSKeychain. diff --git a/Pods/SSKeychain/SSKeychain/SSKeychain.h b/Pods/SSKeychain/SSKeychain/SSKeychain.h new file mode 100644 index 0000000..3fcb2de --- /dev/null +++ b/Pods/SSKeychain/SSKeychain/SSKeychain.h @@ -0,0 +1,161 @@ +// +// SSKeychain.h +// SSKeychain +// +// Created by Sam Soffes on 5/19/10. +// Copyright (c) 2010-2014 Sam Soffes. All rights reserved. +// + +#import "SSKeychainQuery.h" + +/** + Error code specific to SSKeychain that can be returned in NSError objects. + For codes returned by the operating system, refer to SecBase.h for your + platform. + */ +typedef NS_ENUM(OSStatus, SSKeychainErrorCode) { + /** Some of the arguments were invalid. */ + SSKeychainErrorBadArguments = -1001, +}; + +/** SSKeychain error domain */ +extern NSString *const kSSKeychainErrorDomain; + +/** Account name. */ +extern NSString *const kSSKeychainAccountKey; + +/** + Time the item was created. + + The value will be a string. + */ +extern NSString *const kSSKeychainCreatedAtKey; + +/** Item class. */ +extern NSString *const kSSKeychainClassKey; + +/** Item description. */ +extern NSString *const kSSKeychainDescriptionKey; + +/** Item label. */ +extern NSString *const kSSKeychainLabelKey; + +/** Time the item was last modified. + + The value will be a string. + */ +extern NSString *const kSSKeychainLastModifiedKey; + +/** Where the item was created. */ +extern NSString *const kSSKeychainWhereKey; + +/** + Simple wrapper for accessing accounts, getting passwords, setting passwords, and deleting passwords using the system + Keychain on Mac OS X and iOS. + + This was originally inspired by EMKeychain and SDKeychain (both of which are now gone). Thanks to the authors. + SSKeychain has since switched to a simpler implementation that was abstracted from [SSToolkit](http://sstoolk.it). + */ +@interface SSKeychain : NSObject + +#pragma mark - Classic methods + +/** + Returns a string containing the password for a given account and service, or `nil` if the Keychain doesn't have a + password for the given parameters. + + @param serviceName The service for which to return the corresponding password. + + @param account The account for which to return the corresponding password. + + @return Returns a string containing the password for a given account and service, or `nil` if the Keychain doesn't + have a password for the given parameters. + */ ++ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account; ++ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error; + + +/** + Deletes a password from the Keychain. + + @param serviceName The service for which to delete the corresponding password. + + @param account The account for which to delete the corresponding password. + + @return Returns `YES` on success, or `NO` on failure. + */ ++ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account; ++ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error; + + +/** + Sets a password in the Keychain. + + @param password The password to store in the Keychain. + + @param serviceName The service for which to set the corresponding password. + + @param account The account for which to set the corresponding password. + + @return Returns `YES` on success, or `NO` on failure. + */ ++ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account; ++ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error; + + +/** + Returns an array containing the Keychain's accounts, or `nil` if the Keychain has no accounts. + + See the `NSString` constants declared in SSKeychain.h for a list of keys that can be used when accessing the + dictionaries returned by this method. + + @return An array of dictionaries containing the Keychain's accounts, or `nil` if the Keychain doesn't have any + accounts. The order of the objects in the array isn't defined. + */ ++ (NSArray *)allAccounts; + + +/** + Returns an array containing the Keychain's accounts for a given service, or `nil` if the Keychain doesn't have any + accounts for the given service. + + See the `NSString` constants declared in SSKeychain.h for a list of keys that can be used when accessing the + dictionaries returned by this method. + + @param serviceName The service for which to return the corresponding accounts. + + @return An array of dictionaries containing the Keychain's accountsfor a given `serviceName`, or `nil` if the Keychain + doesn't have any accounts for the given `serviceName`. The order of the objects in the array isn't defined. + */ ++ (NSArray *)accountsForService:(NSString *)serviceName; + + +#pragma mark - Configuration + +#if __IPHONE_4_0 && TARGET_OS_IPHONE +/** + Returns the accessibility type for all future passwords saved to the Keychain. + + @return Returns the accessibility type. + + The return value will be `NULL` or one of the "Keychain Item Accessibility + Constants" used for determining when a keychain item should be readable. + + @see setAccessibilityType + */ ++ (CFTypeRef)accessibilityType; + +/** + Sets the accessibility type for all future passwords saved to the Keychain. + + @param accessibilityType One of the "Keychain Item Accessibility Constants" + used for determining when a keychain item should be readable. + + If the value is `NULL` (the default), the Keychain default will be used. + + @see accessibilityType + */ ++ (void)setAccessibilityType:(CFTypeRef)accessibilityType; +#endif + +@end diff --git a/Pods/SSKeychain/SSKeychain/SSKeychain.m b/Pods/SSKeychain/SSKeychain/SSKeychain.m new file mode 100644 index 0000000..36337ba --- /dev/null +++ b/Pods/SSKeychain/SSKeychain/SSKeychain.m @@ -0,0 +1,94 @@ +// +// SSKeychain.m +// SSKeychain +// +// Created by Sam Soffes on 5/19/10. +// Copyright (c) 2010-2014 Sam Soffes. All rights reserved. +// + +#import "SSKeychain.h" + +NSString *const kSSKeychainErrorDomain = @"com.samsoffes.sskeychain"; +NSString *const kSSKeychainAccountKey = @"acct"; +NSString *const kSSKeychainCreatedAtKey = @"cdat"; +NSString *const kSSKeychainClassKey = @"labl"; +NSString *const kSSKeychainDescriptionKey = @"desc"; +NSString *const kSSKeychainLabelKey = @"labl"; +NSString *const kSSKeychainLastModifiedKey = @"mdat"; +NSString *const kSSKeychainWhereKey = @"svce"; + +#if __IPHONE_4_0 && TARGET_OS_IPHONE + static CFTypeRef SSKeychainAccessibilityType = NULL; +#endif + +@implementation SSKeychain + ++ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account { + return [self passwordForService:serviceName account:account error:nil]; +} + + ++ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account error:(NSError *__autoreleasing *)error { + SSKeychainQuery *query = [[SSKeychainQuery alloc] init]; + query.service = serviceName; + query.account = account; + [query fetch:error]; + return query.password; +} + + ++ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account { + return [self deletePasswordForService:serviceName account:account error:nil]; +} + + ++ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account error:(NSError *__autoreleasing *)error { + SSKeychainQuery *query = [[SSKeychainQuery alloc] init]; + query.service = serviceName; + query.account = account; + return [query deleteItem:error]; +} + + ++ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account { + return [self setPassword:password forService:serviceName account:account error:nil]; +} + + ++ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account error:(NSError *__autoreleasing *)error { + SSKeychainQuery *query = [[SSKeychainQuery alloc] init]; + query.service = serviceName; + query.account = account; + query.password = password; + return [query save:error]; +} + + ++ (NSArray *)allAccounts { + return [self accountsForService:nil]; +} + + ++ (NSArray *)accountsForService:(NSString *)serviceName { + SSKeychainQuery *query = [[SSKeychainQuery alloc] init]; + query.service = serviceName; + return [query fetchAll:nil]; +} + + +#if __IPHONE_4_0 && TARGET_OS_IPHONE ++ (CFTypeRef)accessibilityType { + return SSKeychainAccessibilityType; +} + + ++ (void)setAccessibilityType:(CFTypeRef)accessibilityType { + CFRetain(accessibilityType); + if (SSKeychainAccessibilityType) { + CFRelease(SSKeychainAccessibilityType); + } + SSKeychainAccessibilityType = accessibilityType; +} +#endif + +@end diff --git a/Pods/SSKeychain/SSKeychain/SSKeychainQuery.h b/Pods/SSKeychain/SSKeychain/SSKeychainQuery.h new file mode 100644 index 0000000..436e2fd --- /dev/null +++ b/Pods/SSKeychain/SSKeychain/SSKeychainQuery.h @@ -0,0 +1,133 @@ +// +// SSKeychainQuery.h +// SSKeychain +// +// Created by Caleb Davenport on 3/19/13. +// Copyright (c) 2013-2014 Sam Soffes. All rights reserved. +// + +#import +#import + +#if __IPHONE_7_0 || __MAC_10_9 + // Keychain synchronization available at compile time + #define SSKEYCHAIN_SYNCHRONIZATION_AVAILABLE 1 +#endif + +#ifdef SSKEYCHAIN_SYNCHRONIZATION_AVAILABLE +typedef NS_ENUM(NSUInteger, SSKeychainQuerySynchronizationMode) { + SSKeychainQuerySynchronizationModeAny, + SSKeychainQuerySynchronizationModeNo, + SSKeychainQuerySynchronizationModeYes +}; +#endif + +/** + Simple interface for querying or modifying keychain items. + */ +@interface SSKeychainQuery : NSObject + +/** kSecAttrAccount */ +@property (nonatomic, copy) NSString *account; + +/** kSecAttrService */ +@property (nonatomic, copy) NSString *service; + +/** kSecAttrLabel */ +@property (nonatomic, copy) NSString *label; + +#if __IPHONE_3_0 && TARGET_OS_IPHONE +/** kSecAttrAccessGroup (only used on iOS) */ +@property (nonatomic, copy) NSString *accessGroup; +#endif + +#ifdef SSKEYCHAIN_SYNCHRONIZATION_AVAILABLE +/** kSecAttrSynchronizable */ +@property (nonatomic) SSKeychainQuerySynchronizationMode synchronizationMode; +#endif + +/** Root storage for password information */ +@property (nonatomic, copy) NSData *passwordData; + +/** + This property automatically transitions between an object and the value of + `passwordData` using NSKeyedArchiver and NSKeyedUnarchiver. + */ +@property (nonatomic, copy) id passwordObject; + +/** + Convenience accessor for setting and getting a password string. Passes through + to `passwordData` using UTF-8 string encoding. + */ +@property (nonatomic, copy) NSString *password; + + +///------------------------ +/// @name Saving & Deleting +///------------------------ + +/** + Save the receiver's attributes as a keychain item. Existing items with the + given account, service, and access group will first be deleted. + + @param error Populated should an error occur. + + @return `YES` if saving was successful, `NO` otherwise. + */ +- (BOOL)save:(NSError **)error; + +/** + Dete keychain items that match the given account, service, and access group. + + @param error Populated should an error occur. + + @return `YES` if saving was successful, `NO` otherwise. + */ +- (BOOL)deleteItem:(NSError **)error; + + +///--------------- +/// @name Fetching +///--------------- + +/** + Fetch all keychain items that match the given account, service, and access + group. The values of `password` and `passwordData` are ignored when fetching. + + @param error Populated should an error occur. + + @return An array of dictionaries that represent all matching keychain items or + `nil` should an error occur. + The order of the items is not determined. + */ +- (NSArray *)fetchAll:(NSError **)error; + +/** + Fetch the keychain item that matches the given account, service, and access + group. The `password` and `passwordData` properties will be populated unless + an error occurs. The values of `password` and `passwordData` are ignored when + fetching. + + @param error Populated should an error occur. + + @return `YES` if fetching was successful, `NO` otherwise. + */ +- (BOOL)fetch:(NSError **)error; + + +///----------------------------- +/// @name Synchronization Status +///----------------------------- + +#ifdef SSKEYCHAIN_SYNCHRONIZATION_AVAILABLE +/** + Returns a boolean indicating if keychain synchronization is available on the device at runtime. The #define + SSKEYCHAIN_SYNCHRONIZATION_AVAILABLE is only for compile time. If you are checking for the presence of synchronization, + you should use this method. + + @return A value indicating if keychain synchronization is available + */ ++ (BOOL)isSynchronizationAvailable; +#endif + +@end diff --git a/Pods/SSKeychain/SSKeychain/SSKeychainQuery.m b/Pods/SSKeychain/SSKeychain/SSKeychainQuery.m new file mode 100644 index 0000000..b93c620 --- /dev/null +++ b/Pods/SSKeychain/SSKeychain/SSKeychainQuery.m @@ -0,0 +1,282 @@ +// +// SSKeychainQuery.m +// SSKeychain +// +// Created by Caleb Davenport on 3/19/13. +// Copyright (c) 2013-2014 Sam Soffes. All rights reserved. +// + +#import "SSKeychainQuery.h" +#import "SSKeychain.h" + +@implementation SSKeychainQuery + +@synthesize account = _account; +@synthesize service = _service; +@synthesize label = _label; +@synthesize passwordData = _passwordData; + +#if __IPHONE_3_0 && TARGET_OS_IPHONE +@synthesize accessGroup = _accessGroup; +#endif + +#ifdef SSKEYCHAIN_SYNCHRONIZATION_AVAILABLE +@synthesize synchronizationMode = _synchronizationMode; +#endif + +#pragma mark - Public + +- (BOOL)save:(NSError *__autoreleasing *)error { + OSStatus status = SSKeychainErrorBadArguments; + if (!self.service || !self.account || !self.passwordData) { + if (error) { + *error = [[self class] errorWithCode:status]; + } + return NO; + } + + [self deleteItem:nil]; + + NSMutableDictionary *query = [self query]; + [query setObject:self.passwordData forKey:(__bridge id)kSecValueData]; + if (self.label) { + [query setObject:self.label forKey:(__bridge id)kSecAttrLabel]; + } +#if __IPHONE_4_0 && TARGET_OS_IPHONE + CFTypeRef accessibilityType = [SSKeychain accessibilityType]; + if (accessibilityType) { + [query setObject:(__bridge id)accessibilityType forKey:(__bridge id)kSecAttrAccessible]; + } +#endif + status = SecItemAdd((__bridge CFDictionaryRef)query, NULL); + + if (status != errSecSuccess && error != NULL) { + *error = [[self class] errorWithCode:status]; + } + + return (status == errSecSuccess); +} + + +- (BOOL)deleteItem:(NSError *__autoreleasing *)error { + OSStatus status = SSKeychainErrorBadArguments; + if (!self.service || !self.account) { + if (error) { + *error = [[self class] errorWithCode:status]; + } + return NO; + } + + NSMutableDictionary *query = [self query]; +#if TARGET_OS_IPHONE + status = SecItemDelete((__bridge CFDictionaryRef)query); +#else + CFTypeRef result = NULL; + [query setObject:@YES forKey:(__bridge id)kSecReturnRef]; + status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result); + if (status == errSecSuccess) { + status = SecKeychainItemDelete((SecKeychainItemRef)result); + CFRelease(result); + } +#endif + + if (status != errSecSuccess && error != NULL) { + *error = [[self class] errorWithCode:status]; + } + + return (status == errSecSuccess); +} + + +- (NSArray *)fetchAll:(NSError *__autoreleasing *)error { + OSStatus status = SSKeychainErrorBadArguments; + NSMutableDictionary *query = [self query]; + [query setObject:@YES forKey:(__bridge id)kSecReturnAttributes]; + [query setObject:(__bridge id)kSecMatchLimitAll forKey:(__bridge id)kSecMatchLimit]; + + CFTypeRef result = NULL; + status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result); + if (status != errSecSuccess && error != NULL) { + *error = [[self class] errorWithCode:status]; + return nil; + } + + return (__bridge_transfer NSArray *)result; +} + + +- (BOOL)fetch:(NSError *__autoreleasing *)error { + OSStatus status = SSKeychainErrorBadArguments; + if (!self.service || !self.account) { + if (error) { + *error = [[self class] errorWithCode:status]; + } + return NO; + } + + CFTypeRef result = NULL; + NSMutableDictionary *query = [self query]; + [query setObject:@YES forKey:(__bridge id)kSecReturnData]; + [query setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; + status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result); + + if (status != errSecSuccess && error != NULL) { + *error = [[self class] errorWithCode:status]; + return NO; + } + + self.passwordData = (__bridge_transfer NSData *)result; + return YES; +} + + +#pragma mark - Accessors + +- (void)setPasswordObject:(id)object { + self.passwordData = [NSKeyedArchiver archivedDataWithRootObject:object]; +} + + +- (id)passwordObject { + if ([self.passwordData length]) { + return [NSKeyedUnarchiver unarchiveObjectWithData:self.passwordData]; + } + return nil; +} + + +- (void)setPassword:(NSString *)password { + self.passwordData = [password dataUsingEncoding:NSUTF8StringEncoding]; +} + + +- (NSString *)password { + if ([self.passwordData length]) { + return [[NSString alloc] initWithData:self.passwordData encoding:NSUTF8StringEncoding]; + } + return nil; +} + + +#pragma mark - Synchronization Status + +#ifdef SSKEYCHAIN_SYNCHRONIZATION_AVAILABLE ++ (BOOL)isSynchronizationAvailable { +#if TARGET_OS_IPHONE + // Apple suggested way to check for 7.0 at runtime + // https://developer.apple.com/library/ios/documentation/userexperience/conceptual/transitionguide/SupportingEarlieriOS.html + return floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1; +#else + return floor(NSFoundationVersionNumber) > NSFoundationVersionNumber10_8_4; +#endif +} +#endif + + +#pragma mark - Private + +- (NSMutableDictionary *)query { + NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:3]; + [dictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; + + if (self.service) { + [dictionary setObject:self.service forKey:(__bridge id)kSecAttrService]; + } + + if (self.account) { + [dictionary setObject:self.account forKey:(__bridge id)kSecAttrAccount]; + } + +#if __IPHONE_3_0 && TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR + if (self.accessGroup) { + [dictionary setObject:self.accessGroup forKey:(__bridge id)kSecAttrAccessGroup]; + } +#endif + +#ifdef SSKEYCHAIN_SYNCHRONIZATION_AVAILABLE + if ([[self class] isSynchronizationAvailable]) { + id value; + + switch (self.synchronizationMode) { + case SSKeychainQuerySynchronizationModeNo: { + value = @NO; + break; + } + case SSKeychainQuerySynchronizationModeYes: { + value = @YES; + break; + } + case SSKeychainQuerySynchronizationModeAny: { + value = (__bridge id)(kSecAttrSynchronizableAny); + break; + } + } + + [dictionary setObject:value forKey:(__bridge id)(kSecAttrSynchronizable)]; + } +#endif + + return dictionary; +} + + ++ (NSError *)errorWithCode:(OSStatus) code { + NSString *message = nil; + switch (code) { + case errSecSuccess: return nil; + case SSKeychainErrorBadArguments: message = NSLocalizedStringFromTable(@"SSKeychainErrorBadArguments", @"SSKeychain", nil); break; + +#if TARGET_OS_IPHONE + case errSecUnimplemented: { + message = NSLocalizedStringFromTable(@"errSecUnimplemented", @"SSKeychain", nil); + break; + } + case errSecParam: { + message = NSLocalizedStringFromTable(@"errSecParam", @"SSKeychain", nil); + break; + } + case errSecAllocate: { + message = NSLocalizedStringFromTable(@"errSecAllocate", @"SSKeychain", nil); + break; + } + case errSecNotAvailable: { + message = NSLocalizedStringFromTable(@"errSecNotAvailable", @"SSKeychain", nil); + break; + } + case errSecDuplicateItem: { + message = NSLocalizedStringFromTable(@"errSecDuplicateItem", @"SSKeychain", nil); + break; + } + case errSecItemNotFound: { + message = NSLocalizedStringFromTable(@"errSecItemNotFound", @"SSKeychain", nil); + break; + } + case errSecInteractionNotAllowed: { + message = NSLocalizedStringFromTable(@"errSecInteractionNotAllowed", @"SSKeychain", nil); + break; + } + case errSecDecode: { + message = NSLocalizedStringFromTable(@"errSecDecode", @"SSKeychain", nil); + break; + } + case errSecAuthFailed: { + message = NSLocalizedStringFromTable(@"errSecAuthFailed", @"SSKeychain", nil); + break; + } + default: { + message = NSLocalizedStringFromTable(@"errSecDefault", @"SSKeychain", nil); + } +#else + default: + message = (__bridge_transfer NSString *)SecCopyErrorMessageString(code, NULL); +#endif + } + + NSDictionary *userInfo = nil; + if (message) { + userInfo = @{ NSLocalizedDescriptionKey : message }; + } + return [NSError errorWithDomain:kSSKeychainErrorDomain code:code userInfo:userInfo]; +} + +@end diff --git a/README.md b/README.md new file mode 100644 index 0000000..30a48ef --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# Tado for OSX + +A simple application to show the current temperature of your [Tado](http://www.tado.com/de-en/) heating device in the OSX status bar. + +## How it works + +It is rather simple. On first load, the application will ask you for your username and password your Tado device (these are what you use to login to `my.tado.com`). It then saves those details in the keychain and starts fetching the Tado API every 5 minutes for the latest temperature. + +The temperature is displayed in the OSX status bar: + +![Screenshot](http://i.imgur.com/mnZdAHm.png) + +## Usage + +- Download and run the application +- Login +- Add the application to your login items (System Preferences > Users & Groups > Login Items) + +## Thanks + +- [SSKeychain](https://github.com/soffes/sskeychain) +- [Mac App Icon Template](http://blog.dfilimonov.com/2013/07/08/mac-app-icon-template-for-photoshop.html) \ No newline at end of file diff --git a/Tado.xcodeproj/project.pbxproj b/Tado.xcodeproj/project.pbxproj new file mode 100644 index 0000000..db082ff --- /dev/null +++ b/Tado.xcodeproj/project.pbxproj @@ -0,0 +1,1086 @@ + + + + + archiveVersion + 1 + classes + + objectVersion + 46 + objects + + 4A7276C2260D4F3D941932D0 + + buildActionMask + 2147483647 + files + + inputPaths + + isa + PBXShellScriptBuildPhase + name + Copy Pods Resources + outputPaths + + runOnlyForDeploymentPostprocessing + 0 + shellPath + /bin/sh + shellScript + "${SRCROOT}/Pods/Pods-resources.sh" + + showEnvVarsInLog + 0 + + 509694EBC6994F24B0710150 + + explicitFileType + archive.ar + includeInIndex + 0 + isa + PBXFileReference + path + libPods.a + sourceTree + BUILT_PRODUCTS_DIR + + 60F3F43D1978240B000A72AE + + children + + 60F3F44F1978240C000A72AE + 60F3F46D1978240C000A72AE + 60F3F4481978240C000A72AE + 60F3F4471978240C000A72AE + DAD04D69278B422FA8A2CDE4 + + isa + PBXGroup + sourceTree + <group> + + 60F3F43E1978240B000A72AE + + attributes + + LastUpgradeCheck + 0510 + ORGANIZATIONNAME + Robert Dougan + TargetAttributes + + 60F3F4661978240C000A72AE + + TestTargetID + 60F3F4451978240B000A72AE + + + + buildConfigurationList + 60F3F4411978240B000A72AE + compatibilityVersion + Xcode 3.2 + developmentRegion + English + hasScannedForEncodings + 0 + isa + PBXProject + knownRegions + + en + Base + + mainGroup + 60F3F43D1978240B000A72AE + productRefGroup + 60F3F4471978240C000A72AE + projectDirPath + + projectReferences + + projectRoot + + targets + + 60F3F4451978240B000A72AE + 60F3F4661978240C000A72AE + + + 60F3F4411978240B000A72AE + + buildConfigurations + + 60F3F4751978240C000A72AE + 60F3F4761978240C000A72AE + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + 60F3F4421978240B000A72AE + + buildActionMask + 2147483647 + files + + 60F3F45D1978240C000A72AE + 60F3F4561978240C000A72AE + + isa + PBXSourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 60F3F4431978240B000A72AE + + buildActionMask + 2147483647 + files + + 60F3F44A1978240C000A72AE + 70CB8C7BEBFC485F998D8501 + + isa + PBXFrameworksBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 60F3F4441978240B000A72AE + + buildActionMask + 2147483647 + files + + 60F3F4541978240C000A72AE + 60F3F4621978240C000A72AE + 60F3F45A1978240C000A72AE + 60F3F4601978240C000A72AE + + isa + PBXResourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 60F3F4451978240B000A72AE + + buildConfigurationList + 60F3F4771978240C000A72AE + buildPhases + + 73A4F64B53B145E49C230408 + 60F3F4421978240B000A72AE + 60F3F4431978240B000A72AE + 60F3F4441978240B000A72AE + 4A7276C2260D4F3D941932D0 + + buildRules + + dependencies + + isa + PBXNativeTarget + name + Tado + productName + Tado + productReference + 60F3F4461978240C000A72AE + productType + com.apple.product-type.application + + 60F3F4461978240C000A72AE + + explicitFileType + wrapper.application + includeInIndex + 0 + isa + PBXFileReference + path + Tado.app + sourceTree + BUILT_PRODUCTS_DIR + + 60F3F4471978240C000A72AE + + children + + 60F3F4461978240C000A72AE + 60F3F4671978240C000A72AE + + isa + PBXGroup + name + Products + sourceTree + <group> + + 60F3F4481978240C000A72AE + + children + + 60F3F4491978240C000A72AE + 60F3F4681978240C000A72AE + 60F3F44B1978240C000A72AE + 509694EBC6994F24B0710150 + + isa + PBXGroup + name + Frameworks + sourceTree + <group> + + 60F3F4491978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + Cocoa.framework + path + System/Library/Frameworks/Cocoa.framework + sourceTree + SDKROOT + + 60F3F44A1978240C000A72AE + + fileRef + 60F3F4491978240C000A72AE + isa + PBXBuildFile + + 60F3F44B1978240C000A72AE + + children + + 60F3F44C1978240C000A72AE + 60F3F44D1978240C000A72AE + 60F3F44E1978240C000A72AE + + isa + PBXGroup + name + Other Frameworks + sourceTree + <group> + + 60F3F44C1978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + AppKit.framework + path + System/Library/Frameworks/AppKit.framework + sourceTree + SDKROOT + + 60F3F44D1978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + CoreData.framework + path + System/Library/Frameworks/CoreData.framework + sourceTree + SDKROOT + + 60F3F44E1978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + Foundation.framework + path + System/Library/Frameworks/Foundation.framework + sourceTree + SDKROOT + + 60F3F44F1978240C000A72AE + + children + + 60F3F45B1978240C000A72AE + 60F3F45C1978240C000A72AE + 60F3F45E1978240C000A72AE + 60F3F4611978240C000A72AE + 60F3F4501978240C000A72AE + + isa + PBXGroup + path + Tado + sourceTree + <group> + + 60F3F4501978240C000A72AE + + children + + 60F3F4511978240C000A72AE + 60F3F4521978240C000A72AE + 60F3F4551978240C000A72AE + 60F3F4571978240C000A72AE + 60F3F4581978240C000A72AE + + isa + PBXGroup + name + Supporting Files + sourceTree + <group> + + 60F3F4511978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + text.plist.xml + path + Tado-Info.plist + sourceTree + <group> + + 60F3F4521978240C000A72AE + + children + + 60F3F4531978240C000A72AE + + isa + PBXVariantGroup + name + InfoPlist.strings + sourceTree + <group> + + 60F3F4531978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + text.plist.strings + name + en + path + en.lproj/InfoPlist.strings + sourceTree + <group> + + 60F3F4541978240C000A72AE + + fileRef + 60F3F4521978240C000A72AE + isa + PBXBuildFile + + 60F3F4551978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + main.m + sourceTree + <group> + + 60F3F4561978240C000A72AE + + fileRef + 60F3F4551978240C000A72AE + isa + PBXBuildFile + + 60F3F4571978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + Tado-Prefix.pch + sourceTree + <group> + + 60F3F4581978240C000A72AE + + children + + 60F3F4591978240C000A72AE + + isa + PBXVariantGroup + name + Credits.rtf + sourceTree + <group> + + 60F3F4591978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + text.rtf + name + en + path + en.lproj/Credits.rtf + sourceTree + <group> + + 60F3F45A1978240C000A72AE + + fileRef + 60F3F4581978240C000A72AE + isa + PBXBuildFile + + 60F3F45B1978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + AppDelegate.h + sourceTree + <group> + + 60F3F45C1978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + AppDelegate.m + sourceTree + <group> + + 60F3F45D1978240C000A72AE + + fileRef + 60F3F45C1978240C000A72AE + isa + PBXBuildFile + + 60F3F45E1978240C000A72AE + + children + + 60F3F45F1978240C000A72AE + + isa + PBXVariantGroup + name + MainMenu.xib + sourceTree + <group> + + 60F3F45F1978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + file.xib + name + Base + path + Base.lproj/MainMenu.xib + sourceTree + <group> + + 60F3F4601978240C000A72AE + + fileRef + 60F3F45E1978240C000A72AE + isa + PBXBuildFile + + 60F3F4611978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + folder.assetcatalog + path + Images.xcassets + sourceTree + <group> + + 60F3F4621978240C000A72AE + + fileRef + 60F3F4611978240C000A72AE + isa + PBXBuildFile + + 60F3F4631978240C000A72AE + + buildActionMask + 2147483647 + files + + 60F3F4741978240C000A72AE + + isa + PBXSourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 60F3F4641978240C000A72AE + + buildActionMask + 2147483647 + files + + 60F3F46A1978240C000A72AE + 60F3F4691978240C000A72AE + + isa + PBXFrameworksBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 60F3F4651978240C000A72AE + + buildActionMask + 2147483647 + files + + 60F3F4721978240C000A72AE + + isa + PBXResourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 60F3F4661978240C000A72AE + + buildConfigurationList + 60F3F47A1978240C000A72AE + buildPhases + + 60F3F4631978240C000A72AE + 60F3F4641978240C000A72AE + 60F3F4651978240C000A72AE + + buildRules + + dependencies + + 60F3F46C1978240C000A72AE + + isa + PBXNativeTarget + name + TadoTests + productName + TadoTests + productReference + 60F3F4671978240C000A72AE + productType + com.apple.product-type.bundle.unit-test + + 60F3F4671978240C000A72AE + + explicitFileType + wrapper.cfbundle + includeInIndex + 0 + isa + PBXFileReference + path + TadoTests.xctest + sourceTree + BUILT_PRODUCTS_DIR + + 60F3F4681978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + XCTest.framework + path + Library/Frameworks/XCTest.framework + sourceTree + DEVELOPER_DIR + + 60F3F4691978240C000A72AE + + fileRef + 60F3F4681978240C000A72AE + isa + PBXBuildFile + + 60F3F46A1978240C000A72AE + + fileRef + 60F3F4491978240C000A72AE + isa + PBXBuildFile + + 60F3F46B1978240C000A72AE + + containerPortal + 60F3F43E1978240B000A72AE + isa + PBXContainerItemProxy + proxyType + 1 + remoteGlobalIDString + 60F3F4451978240B000A72AE + remoteInfo + Tado + + 60F3F46C1978240C000A72AE + + isa + PBXTargetDependency + target + 60F3F4451978240B000A72AE + targetProxy + 60F3F46B1978240C000A72AE + + 60F3F46D1978240C000A72AE + + children + + 60F3F4731978240C000A72AE + 60F3F46E1978240C000A72AE + + isa + PBXGroup + path + TadoTests + sourceTree + <group> + + 60F3F46E1978240C000A72AE + + children + + 60F3F46F1978240C000A72AE + 60F3F4701978240C000A72AE + + isa + PBXGroup + name + Supporting Files + sourceTree + <group> + + 60F3F46F1978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + text.plist.xml + path + TadoTests-Info.plist + sourceTree + <group> + + 60F3F4701978240C000A72AE + + children + + 60F3F4711978240C000A72AE + + isa + PBXVariantGroup + name + InfoPlist.strings + sourceTree + <group> + + 60F3F4711978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + text.plist.strings + name + en + path + en.lproj/InfoPlist.strings + sourceTree + <group> + + 60F3F4721978240C000A72AE + + fileRef + 60F3F4701978240C000A72AE + isa + PBXBuildFile + + 60F3F4731978240C000A72AE + + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + TadoTests.m + sourceTree + <group> + + 60F3F4741978240C000A72AE + + fileRef + 60F3F4731978240C000A72AE + isa + PBXBuildFile + + 60F3F4751978240C000A72AE + + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + CLANG_CXX_LANGUAGE_STANDARD + gnu++0x + CLANG_CXX_LIBRARY + libc++ + CLANG_ENABLE_MODULES + YES + CLANG_ENABLE_OBJC_ARC + YES + CLANG_WARN_BOOL_CONVERSION + YES + CLANG_WARN_CONSTANT_CONVERSION + YES + CLANG_WARN_DIRECT_OBJC_ISA_USAGE + YES_ERROR + CLANG_WARN_EMPTY_BODY + YES + CLANG_WARN_ENUM_CONVERSION + YES + CLANG_WARN_INT_CONVERSION + YES + CLANG_WARN_OBJC_ROOT_CLASS + YES_ERROR + CLANG_WARN__DUPLICATE_METHOD_MATCH + YES + COPY_PHASE_STRIP + NO + GCC_C_LANGUAGE_STANDARD + gnu99 + GCC_DYNAMIC_NO_PIC + NO + GCC_ENABLE_OBJC_EXCEPTIONS + YES + GCC_OPTIMIZATION_LEVEL + 0 + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + GCC_SYMBOLS_PRIVATE_EXTERN + NO + GCC_WARN_64_TO_32_BIT_CONVERSION + YES + GCC_WARN_ABOUT_RETURN_TYPE + YES_ERROR + GCC_WARN_UNDECLARED_SELECTOR + YES + GCC_WARN_UNINITIALIZED_AUTOS + YES_AGGRESSIVE + GCC_WARN_UNUSED_FUNCTION + YES + GCC_WARN_UNUSED_VARIABLE + YES + MACOSX_DEPLOYMENT_TARGET + 10.10 + ONLY_ACTIVE_ARCH + YES + SDKROOT + macosx + + isa + XCBuildConfiguration + name + Debug + + 60F3F4761978240C000A72AE + + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + CLANG_CXX_LANGUAGE_STANDARD + gnu++0x + CLANG_CXX_LIBRARY + libc++ + CLANG_ENABLE_MODULES + YES + CLANG_ENABLE_OBJC_ARC + YES + CLANG_WARN_BOOL_CONVERSION + YES + CLANG_WARN_CONSTANT_CONVERSION + YES + CLANG_WARN_DIRECT_OBJC_ISA_USAGE + YES_ERROR + CLANG_WARN_EMPTY_BODY + YES + CLANG_WARN_ENUM_CONVERSION + YES + CLANG_WARN_INT_CONVERSION + YES + CLANG_WARN_OBJC_ROOT_CLASS + YES_ERROR + CLANG_WARN__DUPLICATE_METHOD_MATCH + YES + COPY_PHASE_STRIP + YES + DEBUG_INFORMATION_FORMAT + dwarf-with-dsym + ENABLE_NS_ASSERTIONS + NO + GCC_C_LANGUAGE_STANDARD + gnu99 + GCC_ENABLE_OBJC_EXCEPTIONS + YES + GCC_WARN_64_TO_32_BIT_CONVERSION + YES + GCC_WARN_ABOUT_RETURN_TYPE + YES_ERROR + GCC_WARN_UNDECLARED_SELECTOR + YES + GCC_WARN_UNINITIALIZED_AUTOS + YES_AGGRESSIVE + GCC_WARN_UNUSED_FUNCTION + YES + GCC_WARN_UNUSED_VARIABLE + YES + MACOSX_DEPLOYMENT_TARGET + 10.10 + SDKROOT + macosx + + isa + XCBuildConfiguration + name + Release + + 60F3F4771978240C000A72AE + + buildConfigurations + + 60F3F4781978240C000A72AE + 60F3F4791978240C000A72AE + + defaultConfigurationIsVisible + 0 + isa + XCConfigurationList + + 60F3F4781978240C000A72AE + + baseConfigurationReference + DAD04D69278B422FA8A2CDE4 + buildSettings + + ASSETCATALOG_COMPILER_APPICON_NAME + AppIcon + COMBINE_HIDPI_IMAGES + YES + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Tado/Tado-Prefix.pch + INFOPLIST_FILE + Tado/Tado-Info.plist + PRODUCT_NAME + $(TARGET_NAME) + WRAPPER_EXTENSION + app + + isa + XCBuildConfiguration + name + Debug + + 60F3F4791978240C000A72AE + + baseConfigurationReference + DAD04D69278B422FA8A2CDE4 + buildSettings + + ASSETCATALOG_COMPILER_APPICON_NAME + AppIcon + COMBINE_HIDPI_IMAGES + YES + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Tado/Tado-Prefix.pch + INFOPLIST_FILE + Tado/Tado-Info.plist + PRODUCT_NAME + $(TARGET_NAME) + WRAPPER_EXTENSION + app + + isa + XCBuildConfiguration + name + Release + + 60F3F47A1978240C000A72AE + + buildConfigurations + + 60F3F47B1978240C000A72AE + 60F3F47C1978240C000A72AE + + defaultConfigurationIsVisible + 0 + isa + XCConfigurationList + + 60F3F47B1978240C000A72AE + + buildSettings + + BUNDLE_LOADER + $(BUILT_PRODUCTS_DIR)/Tado.app/Contents/MacOS/Tado + COMBINE_HIDPI_IMAGES + YES + FRAMEWORK_SEARCH_PATHS + + $(DEVELOPER_FRAMEWORKS_DIR) + $(inherited) + + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Tado/Tado-Prefix.pch + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + INFOPLIST_FILE + TadoTests/TadoTests-Info.plist + PRODUCT_NAME + $(TARGET_NAME) + TEST_HOST + $(BUNDLE_LOADER) + WRAPPER_EXTENSION + xctest + + isa + XCBuildConfiguration + name + Debug + + 60F3F47C1978240C000A72AE + + buildSettings + + BUNDLE_LOADER + $(BUILT_PRODUCTS_DIR)/Tado.app/Contents/MacOS/Tado + COMBINE_HIDPI_IMAGES + YES + FRAMEWORK_SEARCH_PATHS + + $(DEVELOPER_FRAMEWORKS_DIR) + $(inherited) + + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Tado/Tado-Prefix.pch + INFOPLIST_FILE + TadoTests/TadoTests-Info.plist + PRODUCT_NAME + $(TARGET_NAME) + TEST_HOST + $(BUNDLE_LOADER) + WRAPPER_EXTENSION + xctest + + isa + XCBuildConfiguration + name + Release + + 70CB8C7BEBFC485F998D8501 + + fileRef + 509694EBC6994F24B0710150 + isa + PBXBuildFile + + 73A4F64B53B145E49C230408 + + buildActionMask + 2147483647 + files + + inputPaths + + isa + PBXShellScriptBuildPhase + name + Check Pods Manifest.lock + outputPaths + + runOnlyForDeploymentPostprocessing + 0 + shellPath + /bin/sh + shellScript + diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null +if [[ $? != 0 ]] ; then + cat << EOM +error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation. +EOM + exit 1 +fi + + showEnvVarsInLog + 0 + + DAD04D69278B422FA8A2CDE4 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + name + Pods.xcconfig + path + Pods/Pods.xcconfig + sourceTree + <group> + + + rootObject + 60F3F43E1978240B000A72AE + + diff --git a/Tado.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Tado.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..95e4b70 --- /dev/null +++ b/Tado.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Tado.xcodeproj/project.xcworkspace/xcuserdata/rdougan.xcuserdatad/UserInterfaceState.xcuserstate b/Tado.xcodeproj/project.xcworkspace/xcuserdata/rdougan.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..fc28704 Binary files /dev/null and b/Tado.xcodeproj/project.xcworkspace/xcuserdata/rdougan.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Tado.xcodeproj/xcuserdata/rdougan.xcuserdatad/xcschemes/Tado.xcscheme b/Tado.xcodeproj/xcuserdata/rdougan.xcuserdatad/xcschemes/Tado.xcscheme new file mode 100644 index 0000000..072d665 --- /dev/null +++ b/Tado.xcodeproj/xcuserdata/rdougan.xcuserdatad/xcschemes/Tado.xcscheme @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tado.xcodeproj/xcuserdata/rdougan.xcuserdatad/xcschemes/xcschememanagement.plist b/Tado.xcodeproj/xcuserdata/rdougan.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..b9ad771 --- /dev/null +++ b/Tado.xcodeproj/xcuserdata/rdougan.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,27 @@ + + + + + SchemeUserState + + Tado.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 60F3F4451978240B000A72AE + + primary + + + 60F3F4661978240C000A72AE + + primary + + + + + diff --git a/Tado.xcworkspace/contents.xcworkspacedata b/Tado.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..d42cdbd --- /dev/null +++ b/Tado.xcworkspace/contents.xcworkspacedata @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Tado.xcworkspace/xcuserdata/rdougan.xcuserdatad/UserInterfaceState.xcuserstate b/Tado.xcworkspace/xcuserdata/rdougan.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..3409603 Binary files /dev/null and b/Tado.xcworkspace/xcuserdata/rdougan.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Tado/AppDelegate.h b/Tado/AppDelegate.h new file mode 100644 index 0000000..73047c5 --- /dev/null +++ b/Tado/AppDelegate.h @@ -0,0 +1,16 @@ +// +// AppDelegate.h +// Tado +// +// Created by Robert Dougan on 17/07/14. +// Copyright (c) 2014 Robert Dougan. All rights reserved. +// + +#import + +@interface AppDelegate : NSObject + +@property (assign) IBOutlet NSWindow *loginWindow; +@property (strong, nonatomic) NSStatusItem *statusItem; + +@end diff --git a/Tado/AppDelegate.m b/Tado/AppDelegate.m new file mode 100644 index 0000000..3ebf91a --- /dev/null +++ b/Tado/AppDelegate.m @@ -0,0 +1,121 @@ +// +// AppDelegate.m +// Tado +// +// Created by Robert Dougan on 17/07/14. +// Copyright (c) 2014 Robert Dougan. All rights reserved. +// + +#import "AppDelegate.h" + +#import + +@interface AppDelegate () + +@property (nonatomic, weak) IBOutlet NSTextField *usernameField; +@property (nonatomic, weak) IBOutlet NSSecureTextField *passwordField; +@property (nonatomic, weak) IBOutlet NSButton *loginButton; + +@end + +@implementation AppDelegate + +- (void)applicationDidFinishLaunching:(NSNotification *)notification +{ + self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; + self.statusItem.highlightMode = NO; + + // Check if the user has logged in + if (![self loginDetails]) { + [self.loginWindow makeKeyAndOrderFront:self]; + return; + } + + [self startFetching]; +} + +- (NSDictionary *)loginDetails +{ + NSString *username = [[NSUserDefaults standardUserDefaults] objectForKey:@"username"]; + if (!username) { + return nil; + } + + NSString *password = [SSKeychain passwordForService:@"Tado" account:username]; + if (!password) { + return nil; + } + + return @{ + @"username": username, + @"password": password + }; +} + +- (void)startFetching +{ + [self fetchTemperatue]; + + [NSTimer scheduledTimerWithTimeInterval:60.0f * 5.0f + target:self + selector:@selector(fetchTemperatue) + userInfo:nil + repeats:YES]; +} + +- (void)fetchTemperatue +{ + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ + NSDictionary *loginDetails = [self loginDetails]; + + NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://my.tado.com/mobile/1.3/getCurrentState?username=%@&password=%@", [loginDetails valueForKey:@"username"], [loginDetails valueForKey:@"password"]]]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url + cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData + timeoutInterval:10]; + + NSError *requestError; + NSURLResponse *urlResponse = nil; + NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError]; + + if (requestError) { + return; + } + + NSError *error; + NSDictionary *json = [NSJSONSerialization JSONObjectWithData:response options:kNilOptions error:&error]; + + if (error) { + return; + } + + NSString *temperature = [NSString stringWithFormat:@"%.1f°", [[json valueForKey:@"insideTemp"] floatValue]]; + self.statusItem.title = temperature; + }); +} + +- (IBAction)login:(id)sender +{ + NSString *username = self.usernameField.stringValue; + NSString *password = self.passwordField.stringValue; + + [[NSUserDefaults standardUserDefaults] setObject:username forKey:@"username"]; + [SSKeychain setPassword:password forService:@"Tado" account:username]; + + [self.loginWindow close]; + self.loginWindow = nil; + + [self startFetching]; +} + +#pragma mark - NSTextFieldDelegate + +- (void)controlTextDidChange:(NSNotification *)notification +{ + NSString *username = self.usernameField.stringValue; + NSString *password = self.passwordField.stringValue; + + BOOL disabled = !username || !password || [username isEqualToString:@""] || [password isEqualToString:@""]; + [self.loginButton setEnabled:!disabled]; +} + +@end diff --git a/Tado/Base.lproj/MainMenu.xib b/Tado/Base.lproj/MainMenu.xib new file mode 100644 index 0000000..f4bc754 --- /dev/null +++ b/Tado/Base.lproj/MainMenu.xib @@ -0,0 +1,741 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSAllRomanInputSourcesLocaleIdentifier + + + + + + + + + + + + diff --git a/Tado/Images.xcassets/AppIcon.appiconset/Contents.json b/Tado/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..7cd4f8e --- /dev/null +++ b/Tado/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "icon_16x16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "icon_16x16@2x.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "icon_32x32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "icon_32x32@2x.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "icon_128x128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "icon_128x128@2x.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "icon_256x256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "icon_256x256@2x.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "icon_512x512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "icon_512x512@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Tado/Images.xcassets/AppIcon.appiconset/icon_128x128.png b/Tado/Images.xcassets/AppIcon.appiconset/icon_128x128.png new file mode 100644 index 0000000..27c784e Binary files /dev/null and b/Tado/Images.xcassets/AppIcon.appiconset/icon_128x128.png differ diff --git a/Tado/Images.xcassets/AppIcon.appiconset/icon_128x128@2x.png b/Tado/Images.xcassets/AppIcon.appiconset/icon_128x128@2x.png new file mode 100644 index 0000000..45227b4 Binary files /dev/null and b/Tado/Images.xcassets/AppIcon.appiconset/icon_128x128@2x.png differ diff --git a/Tado/Images.xcassets/AppIcon.appiconset/icon_16x16.png b/Tado/Images.xcassets/AppIcon.appiconset/icon_16x16.png new file mode 100644 index 0000000..1972090 Binary files /dev/null and b/Tado/Images.xcassets/AppIcon.appiconset/icon_16x16.png differ diff --git a/Tado/Images.xcassets/AppIcon.appiconset/icon_16x16@2x.png b/Tado/Images.xcassets/AppIcon.appiconset/icon_16x16@2x.png new file mode 100644 index 0000000..c45a153 Binary files /dev/null and b/Tado/Images.xcassets/AppIcon.appiconset/icon_16x16@2x.png differ diff --git a/Tado/Images.xcassets/AppIcon.appiconset/icon_256x256.png b/Tado/Images.xcassets/AppIcon.appiconset/icon_256x256.png new file mode 100644 index 0000000..03d6674 Binary files /dev/null and b/Tado/Images.xcassets/AppIcon.appiconset/icon_256x256.png differ diff --git a/Tado/Images.xcassets/AppIcon.appiconset/icon_256x256@2x.png b/Tado/Images.xcassets/AppIcon.appiconset/icon_256x256@2x.png new file mode 100644 index 0000000..de7d802 Binary files /dev/null and b/Tado/Images.xcassets/AppIcon.appiconset/icon_256x256@2x.png differ diff --git a/Tado/Images.xcassets/AppIcon.appiconset/icon_32x32.png b/Tado/Images.xcassets/AppIcon.appiconset/icon_32x32.png new file mode 100644 index 0000000..c45a153 Binary files /dev/null and b/Tado/Images.xcassets/AppIcon.appiconset/icon_32x32.png differ diff --git a/Tado/Images.xcassets/AppIcon.appiconset/icon_32x32@2x.png b/Tado/Images.xcassets/AppIcon.appiconset/icon_32x32@2x.png new file mode 100644 index 0000000..a51cc51 Binary files /dev/null and b/Tado/Images.xcassets/AppIcon.appiconset/icon_32x32@2x.png differ diff --git a/Tado/Images.xcassets/AppIcon.appiconset/icon_512x512.png b/Tado/Images.xcassets/AppIcon.appiconset/icon_512x512.png new file mode 100644 index 0000000..b2a188e Binary files /dev/null and b/Tado/Images.xcassets/AppIcon.appiconset/icon_512x512.png differ diff --git a/Tado/Images.xcassets/AppIcon.appiconset/icon_512x512@2x.png b/Tado/Images.xcassets/AppIcon.appiconset/icon_512x512@2x.png new file mode 100644 index 0000000..9b56ee0 Binary files /dev/null and b/Tado/Images.xcassets/AppIcon.appiconset/icon_512x512@2x.png differ diff --git a/Tado/Tado-Info.plist b/Tado/Tado-Info.plist new file mode 100644 index 0000000..1120ea1 --- /dev/null +++ b/Tado/Tado-Info.plist @@ -0,0 +1,36 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.rdougan.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright © 2014 Robert Dougan. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + LSUIElement + 1 + + diff --git a/Tado/Tado-Prefix.pch b/Tado/Tado-Prefix.pch new file mode 100644 index 0000000..35d7640 --- /dev/null +++ b/Tado/Tado-Prefix.pch @@ -0,0 +1,9 @@ +// +// Prefix header +// +// The contents of this file are implicitly included at the beginning of every source file. +// + +#ifdef __OBJC__ + #import +#endif diff --git a/Tado/en.lproj/Credits.rtf b/Tado/en.lproj/Credits.rtf new file mode 100644 index 0000000..46576ef --- /dev/null +++ b/Tado/en.lproj/Credits.rtf @@ -0,0 +1,29 @@ +{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} +{\colortbl;\red255\green255\blue255;} +\paperw9840\paperh8400 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs24 \cf0 Engineering: +\b0 \ + Some people\ +\ + +\b Human Interface Design: +\b0 \ + Some other people\ +\ + +\b Testing: +\b0 \ + Hopefully not nobody\ +\ + +\b Documentation: +\b0 \ + Whoever\ +\ + +\b With special thanks to: +\b0 \ + Mom\ +} diff --git a/Tado/en.lproj/InfoPlist.strings b/Tado/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/Tado/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Tado/main.m b/Tado/main.m new file mode 100644 index 0000000..d1cbeca --- /dev/null +++ b/Tado/main.m @@ -0,0 +1,14 @@ +// +// main.m +// Tado +// +// Created by Robert Dougan on 17/07/14. +// Copyright (c) 2014 Robert Dougan. All rights reserved. +// + +#import + +int main(int argc, const char * argv[]) +{ + return NSApplicationMain(argc, argv); +} diff --git a/TadoTests/TadoTests-Info.plist b/TadoTests/TadoTests-Info.plist new file mode 100644 index 0000000..e06a426 --- /dev/null +++ b/TadoTests/TadoTests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.rdougan.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/TadoTests/TadoTests.m b/TadoTests/TadoTests.m new file mode 100644 index 0000000..8e5e9d8 --- /dev/null +++ b/TadoTests/TadoTests.m @@ -0,0 +1,34 @@ +// +// TadoTests.m +// TadoTests +// +// Created by Robert Dougan on 17/07/14. +// Copyright (c) 2014 Robert Dougan. All rights reserved. +// + +#import + +@interface TadoTests : XCTestCase + +@end + +@implementation TadoTests + +- (void)setUp +{ + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown +{ + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +- (void)testExample +{ + XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); +} + +@end diff --git a/TadoTests/en.lproj/InfoPlist.strings b/TadoTests/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/TadoTests/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ +