From 556bf841cdf71d1ecdba0b52884b2665f9b8c67a Mon Sep 17 00:00:00 2001 From: Daisy <> Date: Wed, 1 Nov 2023 14:18:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EiOS=E7=AB=AF=20=E5=8F=AF?= =?UTF-8?q?=E8=A7=86=E5=AF=B9=E8=AE=B2=E5=8F=8A=E6=B6=88=E6=81=AF=E6=8E=A8?= =?UTF-8?q?=E9=80=81=20=E6=B5=8B=E8=AF=95=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/android/app/build.gradle | 9 +- .../app/src/profile/AndroidManifest.xml | 53 + star_lock/android/build.gradle | 2 + star_lock/ios/Podfile | 5 + star_lock/ios/Podfile.lock | 46 +- .../ios/Runner.xcodeproj/project.pbxproj | 964 +++- .../ios/Runner/AliyunEmasServices-Info.plist | 86 + star_lock/ios/Runner/AppDelegate.h | 46 +- star_lock/ios/Runner/AppDelegate.m | 285 +- star_lock/ios/Runner/CommonDefine.h | 7 +- star_lock/ios/Runner/Runner.entitlements | 2 + star_lock/ios/Runner/XSFlutterManager.h | 25 + star_lock/ios/Runner/XSFlutterManager.m | 139 +- .../XSTalkManager/External/AsyncSocket.h | 657 +++ .../XSTalkManager/External/AsyncSocket.m | 4313 +++++++++++++++++ .../XSTalkManager/External/AsyncUdpSocket.h | 368 ++ .../XSTalkManager/External/AsyncUdpSocket.m | 2318 +++++++++ .../External/UIView+AutoLayout.h | 278 ++ .../External/UIView+AutoLayout.m | 1318 +++++ .../ios/Runner/XSTalkManager/NextPage/Call.h | 20 + .../ios/Runner/XSTalkManager/NextPage/Call.m | 378 ++ .../Runner/XSTalkManager/NextPage/EquAdd.h | 25 + .../Runner/XSTalkManager/NextPage/EquAdd.m | 346 ++ .../Runner/XSTalkManager/NextPage/EquConfig.h | 27 + .../Runner/XSTalkManager/NextPage/EquConfig.m | 532 ++ .../Runner/XSTalkManager/NextPage/EquList.h | 16 + .../Runner/XSTalkManager/NextPage/EquList.m | 143 + .../XSTalkManager/NextPage/FaceSubPage.h | 22 + .../XSTalkManager/NextPage/FaceSubPage.m | 226 + .../XSTalkManager/NextPage/FaceUpload.h | 19 + .../XSTalkManager/NextPage/FaceUpload.m | 202 + .../Runner/XSTalkManager/NextPage/OpenPwd.h | 21 + .../Runner/XSTalkManager/NextPage/OpenPwd.m | 168 + .../Runner/XSTalkManager/NextPage/P2pTest.h | 20 + .../Runner/XSTalkManager/NextPage/P2pTest.m | 583 +++ .../Runner/XSTalkManager/NextPage/Setting.h | 18 + .../Runner/XSTalkManager/NextPage/Setting.m | 154 + .../ios/Runner/XSTalkManager/NextPage/Web.h | 16 + .../ios/Runner/XSTalkManager/NextPage/Web.m | 130 + .../Runner/XSTalkManager/NextPage/WifiList.h | 16 + .../Runner/XSTalkManager/NextPage/WifiList.m | 130 + .../Runner/XSTalkManager/Utils/HttpManager.h | 26 + .../Runner/XSTalkManager/Utils/HttpManager.m | 310 ++ .../ios/Runner/XSTalkManager/Utils/Msg.h | 17 + .../ios/Runner/XSTalkManager/Utils/Msg.m | 152 + .../ios/Runner/XSTalkManager/Utils/Pub.h | 50 + .../ios/Runner/XSTalkManager/Utils/Pub.m | 356 ++ .../ios/Runner/XSTalkManager/Utils/Sformat.h | 22 + .../ios/Runner/XSTalkManager/Utils/Sformat.m | 127 + .../XSTalkManager/Utils/Talk/IframeInfo.h | 22 + .../XSTalkManager/Utils/Talk/IframeInfo.m | 29 + .../XSTalkManager/Utils/Talk/playAudio.h | 50 + .../XSTalkManager/Utils/Talk/playAudio.m | 240 + .../XSTalkManager/Utils/Talk/recordAudio.h | 54 + .../XSTalkManager/Utils/Talk/recordAudio.m | 763 +++ .../XSTalkManager/Utils/Talk/talk_Class.h | 101 + .../XSTalkManager/Utils/Talk/talk_Class.m | 1037 ++++ .../XSTalkManager/Utils/UDP/UdpHelper.h | 40 + .../XSTalkManager/Utils/UDP/UdpHelper.m | 734 +++ .../XSTalkManager/Utils/UDP/udp_data_class.h | 21 + .../XSTalkManager/Utils/UDP/udp_data_class.m | 21 + star_lock/ios/Runner/XSTalkManager/Utils/UI.h | 86 + star_lock/ios/Runner/XSTalkManager/Utils/UI.m | 356 ++ .../ios/Runner/XSTalkManager/Utils/sysInfo.h | 57 + .../ios/Runner/XSTalkManager/Utils/sysInfo.m | 225 + .../Runner/XSTalkManager/mainPage/Opendoor.h | 25 + .../Runner/XSTalkManager/mainPage/Opendoor.m | 413 ++ .../Runner/XSTalkManager/pushkit/RingCall.h | 17 + .../Runner/XSTalkManager/pushkit/RingCall.m | 89 + .../XSTalkManager/pushkit/VideoTalkManager.h | 41 + .../XSTalkManager/pushkit/VideoTalkManager.m | 131 + .../XSTalkManager/pushkit/voip_call.caf | Bin 0 -> 755200 bytes .../ios/Runner/XSTalkManager/sound/Piano.caf | Bin 0 -> 890070 bytes .../ios/Runner/XSTalkManager/sound/alarm.wav | Bin 0 -> 17068 bytes .../ios/Runner/XSTalkManager/sound/err.wav | Bin 0 -> 60044 bytes .../ios/Runner/XSTalkManager/sound/notice.wav | Bin 0 -> 60044 bytes .../ios/Runner/XSTalkManager/sound/ok.wav | Bin 0 -> 66442 bytes .../ios/Runner/XSTalkManager/sound/ring1.mp3 | Bin 0 -> 254379 bytes .../views/BaseNavigationController.h | 15 + .../views/BaseNavigationController.m | 47 + .../views/BasePageViewController.h | 24 + .../views/BasePageViewController.m | 127 + .../views/BaseTableViewController.h | 23 + .../views/BaseTableViewController.m | 119 + .../XSTalkManager/views/BaseViewController.h | 24 + .../XSTalkManager/views/BaseViewController.m | 141 + .../views/TextField/HKHTextField.h | 15 + .../views/TextField/HKHTextField.m | 101 + star_lock/ios/Runner/img/add.png | Bin 0 -> 281 bytes star_lock/ios/Runner/img/add2.png | Bin 0 -> 899 bytes star_lock/ios/Runner/img/back.png | Bin 0 -> 466 bytes star_lock/ios/Runner/img/back3.png | Bin 0 -> 202573 bytes star_lock/ios/Runner/img/blank.png | Bin 0 -> 2815 bytes star_lock/ios/Runner/img/call_call_on.png | Bin 0 -> 981 bytes star_lock/ios/Runner/img/call_del.png | Bin 0 -> 808 bytes star_lock/ios/Runner/img/call_del_on.png | Bin 0 -> 624 bytes star_lock/ios/Runner/img/call_menu.png | Bin 0 -> 319 bytes star_lock/ios/Runner/img/call_menu_on.png | Bin 0 -> 260 bytes star_lock/ios/Runner/img/clear.png | Bin 0 -> 310 bytes .../img/emotionstore_progresscancelbtn.png | Bin 0 -> 1058 bytes star_lock/ios/Runner/img/hangup.png | Bin 0 -> 947 bytes star_lock/ios/Runner/img/hf.png | Bin 0 -> 4551 bytes star_lock/ios/Runner/img/hf_on.png | Bin 0 -> 5126 bytes star_lock/ios/Runner/img/ic_launcher.png | Bin 0 -> 24777 bytes star_lock/ios/Runner/img/ic_vd_mic_off.png | Bin 0 -> 2851 bytes star_lock/ios/Runner/img/ic_vd_mic_on.png | Bin 0 -> 2489 bytes star_lock/ios/Runner/img/icon_close.png | Bin 0 -> 2001 bytes star_lock/ios/Runner/img/icon_key.png | Bin 0 -> 1868 bytes star_lock/ios/Runner/img/key.png | Bin 0 -> 3938 bytes star_lock/ios/Runner/img/key_on.png | Bin 0 -> 3942 bytes star_lock/ios/Runner/img/lock.png | Bin 0 -> 5152 bytes star_lock/ios/Runner/img/lock2.png | Bin 0 -> 10458 bytes star_lock/ios/Runner/img/lock_on.png | Bin 0 -> 5151 bytes star_lock/ios/Runner/img/menu.png | Bin 0 -> 321 bytes star_lock/ios/Runner/img/mic.png | Bin 0 -> 1114 bytes star_lock/ios/Runner/img/rotate.png | Bin 0 -> 1719 bytes star_lock/ios/Runner/img/save_photo.png | Bin 0 -> 1762 bytes .../Runner/img/search_bar_edit_normal.9.png | Bin 0 -> 1801 bytes .../Runner/img/search_bar_edit_pressed.9.png | Bin 0 -> 1935 bytes .../ios/Runner/img/search_bar_icon_normal.png | Bin 0 -> 598 bytes star_lock/ios/Runner/img/setting.png | Bin 0 -> 2291 bytes star_lock/ios/Runner/img/shop_loading.png | Bin 0 -> 3451 bytes .../ios/Runner/img/show_head_toast_bg.9.PNG | Bin 0 -> 3549 bytes .../ios/Runner/img/sidebar_background.xml | 10 + star_lock/ios/Runner/img/spk.png | Bin 0 -> 537 bytes star_lock/ios/Runner/img/split.JPG | Bin 0 -> 531 bytes star_lock/ios/Runner/img/split3.png | Bin 0 -> 503 bytes star_lock/ios/Runner/img/split4.png | Bin 0 -> 339 bytes star_lock/ios/Runner/img/thumb.png | Bin 0 -> 3562 bytes star_lock/ios/Runner/img/unlock_on2.png | Bin 0 -> 1208 bytes star_lock/ios/Runner/img/vcall.png | Bin 0 -> 1987 bytes star_lock/ios/Runner/img/vcall_on.png | Bin 0 -> 1988 bytes star_lock/ios/Runner/img/vcontacts.png | Bin 0 -> 2853 bytes star_lock/ios/Runner/img/vcontacts2.png | Bin 0 -> 5005 bytes star_lock/ios/Runner/img/vcontacts_on.png | Bin 0 -> 2774 bytes star_lock/ios/Runner/img/vrecord.png | Bin 0 -> 2185 bytes star_lock/ios/Runner/img/vrecord_on.png | Bin 0 -> 2176 bytes star_lock/ios/Runner/img/watch.png | Bin 0 -> 29612 bytes star_lock/ios/Runner/img/wave1.png | Bin 0 -> 8092 bytes star_lock/ios/Runner/img/wave2.png | Bin 0 -> 8515 bytes star_lock/ios/Runner/img/wave3.png | Bin 0 -> 9077 bytes star_lock/ios/Runner/img/zoom.png | Bin 0 -> 885 bytes star_lock/lib/main.dart | 29 + .../lockDetail/lockDetail_page.dart | 22 +- star_lock/lib/tools/xs_aliyunPush.dart | 116 + star_lock/pubspec.yaml | 3 +- 146 files changed, 20476 insertions(+), 85 deletions(-) create mode 100644 star_lock/ios/Runner/AliyunEmasServices-Info.plist create mode 100755 star_lock/ios/Runner/XSTalkManager/External/AsyncSocket.h create mode 100755 star_lock/ios/Runner/XSTalkManager/External/AsyncSocket.m create mode 100755 star_lock/ios/Runner/XSTalkManager/External/AsyncUdpSocket.h create mode 100755 star_lock/ios/Runner/XSTalkManager/External/AsyncUdpSocket.m create mode 100755 star_lock/ios/Runner/XSTalkManager/External/UIView+AutoLayout.h create mode 100755 star_lock/ios/Runner/XSTalkManager/External/UIView+AutoLayout.m create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/Call.h create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/Call.m create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/EquAdd.h create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/EquAdd.m create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/EquConfig.h create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/EquConfig.m create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/EquList.h create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/EquList.m create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/FaceSubPage.h create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/FaceSubPage.m create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/FaceUpload.h create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/FaceUpload.m create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/OpenPwd.h create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/OpenPwd.m create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/P2pTest.h create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/P2pTest.m create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/Setting.h create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/Setting.m create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/Web.h create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/Web.m create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/WifiList.h create mode 100755 star_lock/ios/Runner/XSTalkManager/NextPage/WifiList.m create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/HttpManager.h create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/HttpManager.m create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/Msg.h create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/Msg.m create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/Pub.h create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/Pub.m create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/Sformat.h create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/Sformat.m create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/Talk/IframeInfo.h create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/Talk/IframeInfo.m create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/Talk/playAudio.h create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/Talk/playAudio.m create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/Talk/recordAudio.h create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/Talk/recordAudio.m create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/Talk/talk_Class.h create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/Talk/talk_Class.m create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/UDP/UdpHelper.h create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/UDP/UdpHelper.m create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/UDP/udp_data_class.h create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/UDP/udp_data_class.m create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/UI.h create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/UI.m create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/sysInfo.h create mode 100755 star_lock/ios/Runner/XSTalkManager/Utils/sysInfo.m create mode 100755 star_lock/ios/Runner/XSTalkManager/mainPage/Opendoor.h create mode 100755 star_lock/ios/Runner/XSTalkManager/mainPage/Opendoor.m create mode 100755 star_lock/ios/Runner/XSTalkManager/pushkit/RingCall.h create mode 100755 star_lock/ios/Runner/XSTalkManager/pushkit/RingCall.m create mode 100755 star_lock/ios/Runner/XSTalkManager/pushkit/VideoTalkManager.h create mode 100755 star_lock/ios/Runner/XSTalkManager/pushkit/VideoTalkManager.m create mode 100755 star_lock/ios/Runner/XSTalkManager/pushkit/voip_call.caf create mode 100755 star_lock/ios/Runner/XSTalkManager/sound/Piano.caf create mode 100755 star_lock/ios/Runner/XSTalkManager/sound/alarm.wav create mode 100755 star_lock/ios/Runner/XSTalkManager/sound/err.wav create mode 100755 star_lock/ios/Runner/XSTalkManager/sound/notice.wav create mode 100755 star_lock/ios/Runner/XSTalkManager/sound/ok.wav create mode 100755 star_lock/ios/Runner/XSTalkManager/sound/ring1.mp3 create mode 100755 star_lock/ios/Runner/XSTalkManager/views/BaseNavigationController.h create mode 100755 star_lock/ios/Runner/XSTalkManager/views/BaseNavigationController.m create mode 100755 star_lock/ios/Runner/XSTalkManager/views/BasePageViewController.h create mode 100755 star_lock/ios/Runner/XSTalkManager/views/BasePageViewController.m create mode 100755 star_lock/ios/Runner/XSTalkManager/views/BaseTableViewController.h create mode 100755 star_lock/ios/Runner/XSTalkManager/views/BaseTableViewController.m create mode 100755 star_lock/ios/Runner/XSTalkManager/views/BaseViewController.h create mode 100755 star_lock/ios/Runner/XSTalkManager/views/BaseViewController.m create mode 100755 star_lock/ios/Runner/XSTalkManager/views/TextField/HKHTextField.h create mode 100755 star_lock/ios/Runner/XSTalkManager/views/TextField/HKHTextField.m create mode 100755 star_lock/ios/Runner/img/add.png create mode 100755 star_lock/ios/Runner/img/add2.png create mode 100755 star_lock/ios/Runner/img/back.png create mode 100755 star_lock/ios/Runner/img/back3.png create mode 100755 star_lock/ios/Runner/img/blank.png create mode 100755 star_lock/ios/Runner/img/call_call_on.png create mode 100755 star_lock/ios/Runner/img/call_del.png create mode 100755 star_lock/ios/Runner/img/call_del_on.png create mode 100755 star_lock/ios/Runner/img/call_menu.png create mode 100755 star_lock/ios/Runner/img/call_menu_on.png create mode 100755 star_lock/ios/Runner/img/clear.png create mode 100755 star_lock/ios/Runner/img/emotionstore_progresscancelbtn.png create mode 100755 star_lock/ios/Runner/img/hangup.png create mode 100755 star_lock/ios/Runner/img/hf.png create mode 100755 star_lock/ios/Runner/img/hf_on.png create mode 100755 star_lock/ios/Runner/img/ic_launcher.png create mode 100755 star_lock/ios/Runner/img/ic_vd_mic_off.png create mode 100755 star_lock/ios/Runner/img/ic_vd_mic_on.png create mode 100755 star_lock/ios/Runner/img/icon_close.png create mode 100755 star_lock/ios/Runner/img/icon_key.png create mode 100755 star_lock/ios/Runner/img/key.png create mode 100755 star_lock/ios/Runner/img/key_on.png create mode 100755 star_lock/ios/Runner/img/lock.png create mode 100755 star_lock/ios/Runner/img/lock2.png create mode 100755 star_lock/ios/Runner/img/lock_on.png create mode 100755 star_lock/ios/Runner/img/menu.png create mode 100755 star_lock/ios/Runner/img/mic.png create mode 100755 star_lock/ios/Runner/img/rotate.png create mode 100755 star_lock/ios/Runner/img/save_photo.png create mode 100755 star_lock/ios/Runner/img/search_bar_edit_normal.9.png create mode 100755 star_lock/ios/Runner/img/search_bar_edit_pressed.9.png create mode 100755 star_lock/ios/Runner/img/search_bar_icon_normal.png create mode 100755 star_lock/ios/Runner/img/setting.png create mode 100755 star_lock/ios/Runner/img/shop_loading.png create mode 100755 star_lock/ios/Runner/img/show_head_toast_bg.9.PNG create mode 100755 star_lock/ios/Runner/img/sidebar_background.xml create mode 100755 star_lock/ios/Runner/img/spk.png create mode 100755 star_lock/ios/Runner/img/split.JPG create mode 100755 star_lock/ios/Runner/img/split3.png create mode 100755 star_lock/ios/Runner/img/split4.png create mode 100755 star_lock/ios/Runner/img/thumb.png create mode 100755 star_lock/ios/Runner/img/unlock_on2.png create mode 100755 star_lock/ios/Runner/img/vcall.png create mode 100755 star_lock/ios/Runner/img/vcall_on.png create mode 100755 star_lock/ios/Runner/img/vcontacts.png create mode 100755 star_lock/ios/Runner/img/vcontacts2.png create mode 100755 star_lock/ios/Runner/img/vcontacts_on.png create mode 100755 star_lock/ios/Runner/img/vrecord.png create mode 100755 star_lock/ios/Runner/img/vrecord_on.png create mode 100755 star_lock/ios/Runner/img/watch.png create mode 100755 star_lock/ios/Runner/img/wave1.png create mode 100755 star_lock/ios/Runner/img/wave2.png create mode 100755 star_lock/ios/Runner/img/wave3.png create mode 100755 star_lock/ios/Runner/img/zoom.png create mode 100644 star_lock/lib/tools/xs_aliyunPush.dart diff --git a/star_lock/android/app/build.gradle b/star_lock/android/app/build.gradle index f2aea2f4..b8265947 100644 --- a/star_lock/android/app/build.gradle +++ b/star_lock/android/app/build.gradle @@ -8,7 +8,8 @@ if (localPropertiesFile.exists()) { def flutterRoot = localProperties.getProperty('flutter.sdk') if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") + // throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") + throw new Exception("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") } def flutterVersionCode = localProperties.getProperty('flutter.versionCode') @@ -29,6 +30,12 @@ android { compileSdkVersion flutter.compileSdkVersion ndkVersion flutter.ndkVersion + lintOptions{ + checkReleaseBuilds false + abortOnError false + } + + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 diff --git a/star_lock/android/app/src/profile/AndroidManifest.xml b/star_lock/android/app/src/profile/AndroidManifest.xml index 90a3ec8b..8effd092 100644 --- a/star_lock/android/app/src/profile/AndroidManifest.xml +++ b/star_lock/android/app/src/profile/AndroidManifest.xml @@ -9,4 +9,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/star_lock/android/build.gradle b/star_lock/android/build.gradle index eeb73c04..571c17ca 100644 --- a/star_lock/android/build.gradle +++ b/star_lock/android/build.gradle @@ -3,6 +3,8 @@ buildscript { repositories { google() mavenCentral() + mavenCentral() + mavenLocal() } dependencies { diff --git a/star_lock/ios/Podfile b/star_lock/ios/Podfile index 2b973e42..7c55adff 100644 --- a/star_lock/ios/Podfile +++ b/star_lock/ios/Podfile @@ -32,6 +32,11 @@ target 'Runner' do flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) end +# Plugin Pods +source 'https://github.com/CocoaPods/Specs.git' +source 'https://github.com/aliyun/aliyun-specs.git' +pod 'AlicloudPush', '~> 1.9.9' + post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) diff --git a/star_lock/ios/Podfile.lock b/star_lock/ios/Podfile.lock index 2ddd0a42..12c4a1f2 100644 --- a/star_lock/ios/Podfile.lock +++ b/star_lock/ios/Podfile.lock @@ -1,6 +1,21 @@ PODS: - aj_captcha_flutter (0.0.1): - Flutter + - AlicloudPush (1.9.9.8): + - AlicloudSender + - AlicloudUT + - AlicloudUtils + - AlicloudSender (1.0.0.3): + - AlicloudUTDID + - EMASRest + - AlicloudUT (5.2.0.16): + - AlicloudUTDID + - AlicloudUTDID (1.5.0.94) + - AlicloudUtils (1.4.1): + - AlicloudUTDID + - aliyun_push (0.0.1): + - AlicloudPush + - Flutter - AMap3DMap (9.7.0): - AMapFoundation (>= 1.8.0) - amap_flutter_location (0.0.1): @@ -16,6 +31,7 @@ PODS: - Flutter - device_info_plus (0.0.1): - Flutter + - EMASRest (11.1.1.2) - Flutter (1.0.0) - flutter_native_contact_picker (0.0.1): - Flutter @@ -44,7 +60,7 @@ PODS: - FlutterMacOS - permission_handler_apple (9.1.1): - Flutter - - Protobuf (3.24.2) + - Protobuf (3.24.4) - reactive_ble_mobile (0.0.1): - Flutter - Protobuf (~> 3.5) @@ -55,7 +71,7 @@ PODS: - sqflite (0.0.3): - Flutter - FMDB (>= 2.7.5) - - SwiftProtobuf (1.22.1) + - SwiftProtobuf (1.24.0) - Toast (4.0.0) - url_launcher_ios (0.0.1): - Flutter @@ -64,6 +80,8 @@ PODS: DEPENDENCIES: - aj_captcha_flutter (from `.symlinks/plugins/aj_captcha_flutter/ios`) + - AlicloudPush (~> 1.9.9) + - aliyun_push (from `.symlinks/plugins/aliyun_push/ios`) - amap_flutter_location (from `.symlinks/plugins/amap_flutter_location/ios`) - amap_flutter_map (from `.symlinks/plugins/amap_flutter_map/ios`) - camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`) @@ -84,7 +102,14 @@ DEPENDENCIES: - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`) SPEC REPOS: - trunk: + https://github.com/aliyun/aliyun-specs.git: + - AlicloudPush + - AlicloudSender + - AlicloudUT + - AlicloudUTDID + - AlicloudUtils + - EMASRest + https://github.com/CocoaPods/Specs.git: - AMap3DMap - AMapFoundation - AMapLocation @@ -97,6 +122,8 @@ SPEC REPOS: EXTERNAL SOURCES: aj_captcha_flutter: :path: ".symlinks/plugins/aj_captcha_flutter/ios" + aliyun_push: + :path: ".symlinks/plugins/aliyun_push/ios" amap_flutter_location: :path: ".symlinks/plugins/amap_flutter_location/ios" amap_flutter_map: @@ -136,6 +163,12 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: aj_captcha_flutter: dd7af1aa064bdd621ae335b819bab07309c3c023 + AlicloudPush: 88529c9b796e4ece0601de0867b30359f55b61f7 + AlicloudSender: 1f468b6bd962a099ffc19d45e3608b0fe98f259d + AlicloudUT: 6d1cf30d57d096b7e9bb4b069dd0ba6ad59a3338 + AlicloudUTDID: 7323c443dcdf9a73e2224dc6ce51703671d7a765 + AlicloudUtils: 873a76615bebcee8b1996f20820d366e433c3eab + aliyun_push: e92c2a8ca91b134bfabf7631816cce5f36e04a44 AMap3DMap: dce25dd3e51e6b92109caa7d0c97fc6055830fb3 amap_flutter_location: 44ff5beb64f42e0bf5feb402fe299dac0013af6f amap_flutter_map: 979e54d227cedac6c7504a2151bfbf3bcf96760a @@ -143,6 +176,7 @@ SPEC CHECKSUMS: AMapLocation: 5248aec2455ebb5d104b367813c946430a2ee033 camera_avfoundation: 3125e8cd1a4387f6f31c6c63abb8a55892a9eeeb device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed + EMASRest: 8df6f87836767a9415ad5cc4af739bc9d215b475 Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 flutter_native_contact_picker: bd430ba0fbf82768bb50c2c52a69a65759a8f907 fluttertoast: fafc4fa4d01a6a9e4f772ecd190ffa525e9e2d9c @@ -154,15 +188,15 @@ SPEC CHECKSUMS: package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6 - Protobuf: de0b7ad27d01105fc191b77b003e74af6dbd2c2c + Protobuf: 351e9022fe13a6e2af00e9aefc22077cb88520f8 reactive_ble_mobile: 9ce6723d37ccf701dbffd202d487f23f5de03b4c shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a - SwiftProtobuf: 7773c4e96a99d7b8ab7cda0fc30a883732ff93b1 + SwiftProtobuf: bcfd2bc231cf9ae552cdc7c4e877bd3b41fe57b1 Toast: 91b396c56ee72a5790816f40d3a94dd357abc196 url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 webview_flutter_wkwebview: 2e2d318f21a5e036e2c3f26171342e95908bd60a -PODFILE CHECKSUM: 25020dfb9636b328cc2c56b27dc72344b9af6474 +PODFILE CHECKSUM: 0d47c2846028fdf29a51fec8e73b918bb76aa04e COCOAPODS: 1.12.1 diff --git a/star_lock/ios/Runner.xcodeproj/project.pbxproj b/star_lock/ios/Runner.xcodeproj/project.pbxproj index a90477c9..8d5130c6 100644 --- a/star_lock/ios/Runner.xcodeproj/project.pbxproj +++ b/star_lock/ios/Runner.xcodeproj/project.pbxproj @@ -10,8 +10,116 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3EF1E85D6F1EE0C0DCF8449F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09D8B2FA2B26BA5BFF31AB2A /* Pods_Runner.framework */; }; - 82BD91202ADA6FBB0018E523 /* XSFlutterManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 82BD911F2ADA6FBB0018E523 /* XSFlutterManager.m */; }; - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 8297E4102AE75AC500E886FA /* XSFlutterManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E40E2AE75AC500E886FA /* XSFlutterManager.m */; }; + 8297E43A2AE75BEE00E886FA /* Msg.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4132AE75BEE00E886FA /* Msg.m */; }; + 8297E43B2AE75BEE00E886FA /* udp_data_class.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4172AE75BEE00E886FA /* udp_data_class.m */; }; + 8297E43C2AE75BEE00E886FA /* UdpHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4182AE75BEE00E886FA /* UdpHelper.m */; }; + 8297E43D2AE75BEE00E886FA /* Sformat.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E41B2AE75BEE00E886FA /* Sformat.m */; }; + 8297E43E2AE75BEE00E886FA /* HttpManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4202AE75BEE00E886FA /* HttpManager.m */; }; + 8297E43F2AE75BEE00E886FA /* UI.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4212AE75BEE00E886FA /* UI.m */; }; + 8297E4402AE75BEE00E886FA /* sysInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4222AE75BEE00E886FA /* sysInfo.m */; }; + 8297E4412AE75BEE00E886FA /* Pub.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4232AE75BEE00E886FA /* Pub.m */; }; + 8297E4422AE75BEE00E886FA /* recordAudio.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4252AE75BEE00E886FA /* recordAudio.m */; }; + 8297E4432AE75BEE00E886FA /* playAudio.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4282AE75BEE00E886FA /* playAudio.m */; }; + 8297E4442AE75BEE00E886FA /* talk_Class.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E42A2AE75BEE00E886FA /* talk_Class.m */; }; + 8297E4452AE75BEE00E886FA /* IframeInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E42C2AE75BEE00E886FA /* IframeInfo.m */; }; + 8297E4462AE75BEE00E886FA /* Piano.caf in Resources */ = {isa = PBXBuildFile; fileRef = 8297E42E2AE75BEE00E886FA /* Piano.caf */; }; + 8297E4472AE75BEE00E886FA /* ring1.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 8297E42F2AE75BEE00E886FA /* ring1.mp3 */; }; + 8297E4482AE75BEE00E886FA /* ok.wav in Resources */ = {isa = PBXBuildFile; fileRef = 8297E4302AE75BEE00E886FA /* ok.wav */; }; + 8297E4492AE75BEE00E886FA /* notice.wav in Resources */ = {isa = PBXBuildFile; fileRef = 8297E4312AE75BEE00E886FA /* notice.wav */; }; + 8297E44A2AE75BEE00E886FA /* err.wav in Resources */ = {isa = PBXBuildFile; fileRef = 8297E4322AE75BEE00E886FA /* err.wav */; }; + 8297E44B2AE75BEE00E886FA /* alarm.wav in Resources */ = {isa = PBXBuildFile; fileRef = 8297E4332AE75BEE00E886FA /* alarm.wav */; }; + 8297E44C2AE75BEE00E886FA /* RingCall.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4362AE75BEE00E886FA /* RingCall.m */; }; + 8297E44D2AE75BEE00E886FA /* VideoTalkManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4382AE75BEE00E886FA /* VideoTalkManager.m */; }; + 8297E44E2AE75BEE00E886FA /* voip_call.caf in Resources */ = {isa = PBXBuildFile; fileRef = 8297E4392AE75BEE00E886FA /* voip_call.caf */; }; + 8297E4662AE75D4E00E886FA /* FaceSubPage.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4542AE75D4E00E886FA /* FaceSubPage.m */; }; + 8297E4672AE75D4E00E886FA /* EquConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4552AE75D4E00E886FA /* EquConfig.m */; }; + 8297E4682AE75D4E00E886FA /* OpenPwd.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4562AE75D4E00E886FA /* OpenPwd.m */; }; + 8297E4692AE75D4E00E886FA /* Web.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4582AE75D4E00E886FA /* Web.m */; }; + 8297E46A2AE75D4E00E886FA /* Setting.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E45A2AE75D4E00E886FA /* Setting.m */; }; + 8297E46B2AE75D4E00E886FA /* FaceUpload.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E45B2AE75D4E00E886FA /* FaceUpload.m */; }; + 8297E46C2AE75D4E00E886FA /* EquAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E45C2AE75D4E00E886FA /* EquAdd.m */; }; + 8297E46D2AE75D4E00E886FA /* EquList.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E45D2AE75D4E00E886FA /* EquList.m */; }; + 8297E46E2AE75D4E00E886FA /* WifiList.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E45F2AE75D4E00E886FA /* WifiList.m */; }; + 8297E46F2AE75D4E00E886FA /* P2pTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4612AE75D4E00E886FA /* P2pTest.m */; }; + 8297E4702AE75D4E00E886FA /* Call.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4642AE75D4E00E886FA /* Call.m */; }; + 8297E4742AE761EB00E886FA /* BaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4722AE761EB00E886FA /* BaseViewController.m */; }; + 8297E4782AE7635400E886FA /* Opendoor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4772AE7635400E886FA /* Opendoor.m */; }; + 8297E4802AE7643100E886FA /* AsyncUdpSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E47A2AE7643100E886FA /* AsyncUdpSocket.m */; }; + 8297E4812AE7643100E886FA /* UIView+AutoLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E47C2AE7643100E886FA /* UIView+AutoLayout.m */; }; + 8297E4822AE7643100E886FA /* AsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E47E2AE7643100E886FA /* AsyncSocket.m */; }; + 8297E4882AE768DE00E886FA /* BaseNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4872AE768DE00E886FA /* BaseNavigationController.m */; }; + 8297E48E2AE76D0500E886FA /* BaseTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E48D2AE76D0500E886FA /* BaseTableViewController.m */; }; + 8297E4912AE76DD500E886FA /* BasePageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4902AE76DD500E886FA /* BasePageViewController.m */; }; + 8297E4952AE76EC700E886FA /* HKHTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E4942AE76EC700E886FA /* HKHTextField.m */; }; + 8297E49B2AE7974700E886FA /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E49A2AE7974700E886FA /* AppDelegate.m */; }; + 82C026542AE8AC6D0011FE6A /* AliyunEmasServices-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 82C026532AE8AC6D0011FE6A /* AliyunEmasServices-Info.plist */; }; + 82C026982AEB6C050011FE6A /* add.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026562AEB6C050011FE6A /* add.png */; }; + 82C026992AEB6C050011FE6A /* ic_vd_mic_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026572AEB6C050011FE6A /* ic_vd_mic_on.png */; }; + 82C0269A2AEB6C050011FE6A /* watch.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026582AEB6C050011FE6A /* watch.png */; }; + 82C0269B2AEB6C050011FE6A /* call_menu.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026592AEB6C050011FE6A /* call_menu.png */; }; + 82C0269C2AEB6C050011FE6A /* call_del_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0265A2AEB6C050011FE6A /* call_del_on.png */; }; + 82C0269D2AEB6C050011FE6A /* hangup.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0265B2AEB6C050011FE6A /* hangup.png */; }; + 82C0269E2AEB6C050011FE6A /* save_photo.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0265C2AEB6C050011FE6A /* save_photo.png */; }; + 82C0269F2AEB6C050011FE6A /* show_head_toast_bg.9.PNG in Resources */ = {isa = PBXBuildFile; fileRef = 82C0265D2AEB6C050011FE6A /* show_head_toast_bg.9.PNG */; }; + 82C026A02AEB6C050011FE6A /* search_bar_edit_normal.9.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0265E2AEB6C050011FE6A /* search_bar_edit_normal.9.png */; }; + 82C026A12AEB6C050011FE6A /* icon_close.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0265F2AEB6C050011FE6A /* icon_close.png */; }; + 82C026A22AEB6C050011FE6A /* swicth_minus_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026602AEB6C050011FE6A /* swicth_minus_off.png */; }; + 82C026A32AEB6C050011FE6A /* sidebar_background.xml in Resources */ = {isa = PBXBuildFile; fileRef = 82C026612AEB6C050011FE6A /* sidebar_background.xml */; }; + 82C026A42AEB6C050011FE6A /* hf_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026622AEB6C050011FE6A /* hf_on.png */; }; + 82C026A52AEB6C050011FE6A /* unlock_on2.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026632AEB6C050011FE6A /* unlock_on2.png */; }; + 82C026A62AEB6C050011FE6A /* vcontacts.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026642AEB6C050011FE6A /* vcontacts.png */; }; + 82C026A72AEB6C050011FE6A /* zoom.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026652AEB6C050011FE6A /* zoom.png */; }; + 82C026A82AEB6C050011FE6A /* key.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026662AEB6C050011FE6A /* key.png */; }; + 82C026A92AEB6C050011FE6A /* lock2.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026672AEB6C050011FE6A /* lock2.png */; }; + 82C026AA2AEB6C050011FE6A /* lock.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026682AEB6C050011FE6A /* lock.png */; }; + 82C026AB2AEB6C050011FE6A /* vcall.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026692AEB6C050011FE6A /* vcall.png */; }; + 82C026AC2AEB6C050011FE6A /* spk.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0266A2AEB6C050011FE6A /* spk.png */; }; + 82C026AD2AEB6C050011FE6A /* blank.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0266B2AEB6C050011FE6A /* blank.png */; }; + 82C026AE2AEB6C050011FE6A /* clear.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0266C2AEB6C050011FE6A /* clear.png */; }; + 82C026AF2AEB6C050011FE6A /* rotate.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0266D2AEB6C050011FE6A /* rotate.png */; }; + 82C026B02AEB6C050011FE6A /* call_call_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0266E2AEB6C050011FE6A /* call_call_on.png */; }; + 82C026B12AEB6C050011FE6A /* call_del.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0266F2AEB6C050011FE6A /* call_del.png */; }; + 82C026B22AEB6C050011FE6A /* swicth_minus_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026702AEB6C050011FE6A /* swicth_minus_on.png */; }; + 82C026B32AEB6C050011FE6A /* lock_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026712AEB6C050011FE6A /* lock_on.png */; }; + 82C026B42AEB6C050011FE6A /* vrecord_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026722AEB6C050011FE6A /* vrecord_on.png */; }; + 82C026B52AEB6C050011FE6A /* search_bar_icon_normal.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026732AEB6C050011FE6A /* search_bar_icon_normal.png */; }; + 82C026B62AEB6C050011FE6A /* vrecord.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026742AEB6C050011FE6A /* vrecord.png */; }; + 82C026B72AEB6C050011FE6A /* swicth_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026752AEB6C050011FE6A /* swicth_off.png */; }; + 82C026B82AEB6C050011FE6A /* test.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 82C026762AEB6C050011FE6A /* test.jpg */; }; + 82C026B92AEB6C050011FE6A /* back3.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026772AEB6C050011FE6A /* back3.png */; }; + 82C026BA2AEB6C050011FE6A /* logo3.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026782AEB6C050011FE6A /* logo3.png */; }; + 82C026BB2AEB6C050011FE6A /* menu.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026792AEB6C050011FE6A /* menu.png */; }; + 82C026BC2AEB6C050011FE6A /* logo.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0267A2AEB6C050011FE6A /* logo.png */; }; + 82C026BD2AEB6C050011FE6A /* logo2.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0267B2AEB6C050011FE6A /* logo2.png */; }; + 82C026BE2AEB6C050011FE6A /* vcontacts2.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0267C2AEB6C050011FE6A /* vcontacts2.png */; }; + 82C026BF2AEB6C050011FE6A /* swicth_add_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0267D2AEB6C050011FE6A /* swicth_add_on.png */; }; + 82C026C02AEB6C050011FE6A /* add2.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0267E2AEB6C050011FE6A /* add2.png */; }; + 82C026C12AEB6C050011FE6A /* swicth_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0267F2AEB6C050011FE6A /* swicth_on.png */; }; + 82C026C22AEB6C050011FE6A /* shop_loading.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026802AEB6C050011FE6A /* shop_loading.png */; }; + 82C026C32AEB6C050011FE6A /* call_menu_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026812AEB6C050011FE6A /* call_menu_on.png */; }; + 82C026C42AEB6C050011FE6A /* vcall_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026822AEB6C050011FE6A /* vcall_on.png */; }; + 82C026C52AEB6C050011FE6A /* wave1.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026832AEB6C050011FE6A /* wave1.png */; }; + 82C026C62AEB6C050011FE6A /* ic_launcher.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026842AEB6C050011FE6A /* ic_launcher.png */; }; + 82C026C72AEB6C050011FE6A /* key_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026852AEB6C050011FE6A /* key_on.png */; }; + 82C026C82AEB6C050011FE6A /* hf.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026862AEB6C050011FE6A /* hf.png */; }; + 82C026C92AEB6C050011FE6A /* wave3.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026872AEB6C050011FE6A /* wave3.png */; }; + 82C026CA2AEB6C050011FE6A /* wave2.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026882AEB6C050011FE6A /* wave2.png */; }; + 82C026CB2AEB6C050011FE6A /* ic_vd_mic_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026892AEB6C050011FE6A /* ic_vd_mic_off.png */; }; + 82C026CC2AEB6C050011FE6A /* split3.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0268A2AEB6C050011FE6A /* split3.png */; }; + 82C026CD2AEB6C050011FE6A /* emotionstore_progresscancelbtn.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0268B2AEB6C050011FE6A /* emotionstore_progresscancelbtn.png */; }; + 82C026CE2AEB6C050011FE6A /* split.JPG in Resources */ = {isa = PBXBuildFile; fileRef = 82C0268C2AEB6C050011FE6A /* split.JPG */; }; + 82C026CF2AEB6C050011FE6A /* swicth_add_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0268D2AEB6C050011FE6A /* swicth_add_off.png */; }; + 82C026D02AEB6C050011FE6A /* search_bar_edit_pressed.9.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0268E2AEB6C050011FE6A /* search_bar_edit_pressed.9.png */; }; + 82C026D12AEB6C050011FE6A /* setting.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C0268F2AEB6C050011FE6A /* setting.png */; }; + 82C026D22AEB6C050011FE6A /* back.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026902AEB6C050011FE6A /* back.png */; }; + 82C026D32AEB6C050011FE6A /* thumb_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026912AEB6C050011FE6A /* thumb_on.png */; }; + 82C026D42AEB6C050011FE6A /* split4.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026922AEB6C050011FE6A /* split4.png */; }; + 82C026D52AEB6C050011FE6A /* thumb.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026932AEB6C050011FE6A /* thumb.png */; }; + 82C026D62AEB6C050011FE6A /* vcontacts_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026942AEB6C050011FE6A /* vcontacts_on.png */; }; + 82C026D72AEB6C050011FE6A /* mic.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026952AEB6C050011FE6A /* mic.png */; }; + 82C026D82AEB6C050011FE6A /* icon_key.png in Resources */ = {isa = PBXBuildFile; fileRef = 82C026962AEB6C050011FE6A /* icon_key.png */; }; + 82C026D92AEB6C050011FE6A /* bg.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 82C026972AEB6C050011FE6A /* bg.jpg */; }; 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; @@ -38,11 +146,153 @@ 33BF41252A96174D009D92E2 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 82BD911E2ADA6FBB0018E523 /* XSFlutterManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XSFlutterManager.h; sourceTree = ""; }; - 82BD911F2ADA6FBB0018E523 /* XSFlutterManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XSFlutterManager.m; sourceTree = ""; }; + 8297E40E2AE75AC500E886FA /* XSFlutterManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XSFlutterManager.m; sourceTree = ""; }; + 8297E40F2AE75AC500E886FA /* XSFlutterManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XSFlutterManager.h; sourceTree = ""; }; + 8297E4132AE75BEE00E886FA /* Msg.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Msg.m; sourceTree = ""; }; + 8297E4142AE75BEE00E886FA /* UI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UI.h; sourceTree = ""; }; + 8297E4152AE75BEE00E886FA /* HttpManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HttpManager.h; sourceTree = ""; }; + 8297E4172AE75BEE00E886FA /* udp_data_class.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = udp_data_class.m; sourceTree = ""; }; + 8297E4182AE75BEE00E886FA /* UdpHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UdpHelper.m; sourceTree = ""; }; + 8297E4192AE75BEE00E886FA /* udp_data_class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = udp_data_class.h; sourceTree = ""; }; + 8297E41A2AE75BEE00E886FA /* UdpHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UdpHelper.h; sourceTree = ""; }; + 8297E41B2AE75BEE00E886FA /* Sformat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Sformat.m; sourceTree = ""; }; + 8297E41C2AE75BEE00E886FA /* Pub.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Pub.h; sourceTree = ""; }; + 8297E41D2AE75BEE00E886FA /* sysInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sysInfo.h; sourceTree = ""; }; + 8297E41E2AE75BEE00E886FA /* Msg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Msg.h; sourceTree = ""; }; + 8297E41F2AE75BEE00E886FA /* Sformat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sformat.h; sourceTree = ""; }; + 8297E4202AE75BEE00E886FA /* HttpManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HttpManager.m; sourceTree = ""; }; + 8297E4212AE75BEE00E886FA /* UI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UI.m; sourceTree = ""; }; + 8297E4222AE75BEE00E886FA /* sysInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = sysInfo.m; sourceTree = ""; }; + 8297E4232AE75BEE00E886FA /* Pub.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Pub.m; sourceTree = ""; }; + 8297E4252AE75BEE00E886FA /* recordAudio.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = recordAudio.m; sourceTree = ""; }; + 8297E4262AE75BEE00E886FA /* talk_Class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = talk_Class.h; sourceTree = ""; }; + 8297E4272AE75BEE00E886FA /* IframeInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IframeInfo.h; sourceTree = ""; }; + 8297E4282AE75BEE00E886FA /* playAudio.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = playAudio.m; sourceTree = ""; }; + 8297E4292AE75BEE00E886FA /* recordAudio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = recordAudio.h; sourceTree = ""; }; + 8297E42A2AE75BEE00E886FA /* talk_Class.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = talk_Class.m; sourceTree = ""; }; + 8297E42B2AE75BEE00E886FA /* playAudio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = playAudio.h; sourceTree = ""; }; + 8297E42C2AE75BEE00E886FA /* IframeInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IframeInfo.m; sourceTree = ""; }; + 8297E42E2AE75BEE00E886FA /* Piano.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Piano.caf; sourceTree = ""; }; + 8297E42F2AE75BEE00E886FA /* ring1.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = ring1.mp3; sourceTree = ""; }; + 8297E4302AE75BEE00E886FA /* ok.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = ok.wav; sourceTree = ""; }; + 8297E4312AE75BEE00E886FA /* notice.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = notice.wav; sourceTree = ""; }; + 8297E4322AE75BEE00E886FA /* err.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = err.wav; sourceTree = ""; }; + 8297E4332AE75BEE00E886FA /* alarm.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = alarm.wav; sourceTree = ""; }; + 8297E4352AE75BEE00E886FA /* VideoTalkManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoTalkManager.h; sourceTree = ""; }; + 8297E4362AE75BEE00E886FA /* RingCall.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RingCall.m; sourceTree = ""; }; + 8297E4372AE75BEE00E886FA /* RingCall.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RingCall.h; sourceTree = ""; }; + 8297E4382AE75BEE00E886FA /* VideoTalkManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VideoTalkManager.m; sourceTree = ""; }; + 8297E4392AE75BEE00E886FA /* voip_call.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = voip_call.caf; sourceTree = ""; }; + 8297E4502AE75D4E00E886FA /* EquList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EquList.h; sourceTree = ""; }; + 8297E4512AE75D4E00E886FA /* EquAdd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EquAdd.h; sourceTree = ""; }; + 8297E4522AE75D4E00E886FA /* FaceUpload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FaceUpload.h; sourceTree = ""; }; + 8297E4532AE75D4E00E886FA /* WifiList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WifiList.h; sourceTree = ""; }; + 8297E4542AE75D4E00E886FA /* FaceSubPage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FaceSubPage.m; sourceTree = ""; }; + 8297E4552AE75D4E00E886FA /* EquConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EquConfig.m; sourceTree = ""; }; + 8297E4562AE75D4E00E886FA /* OpenPwd.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OpenPwd.m; sourceTree = ""; }; + 8297E4572AE75D4E00E886FA /* P2pTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = P2pTest.h; sourceTree = ""; }; + 8297E4582AE75D4E00E886FA /* Web.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Web.m; sourceTree = ""; }; + 8297E4592AE75D4E00E886FA /* Call.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Call.h; sourceTree = ""; }; + 8297E45A2AE75D4E00E886FA /* Setting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Setting.m; sourceTree = ""; }; + 8297E45B2AE75D4E00E886FA /* FaceUpload.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FaceUpload.m; sourceTree = ""; }; + 8297E45C2AE75D4E00E886FA /* EquAdd.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EquAdd.m; sourceTree = ""; }; + 8297E45D2AE75D4E00E886FA /* EquList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EquList.m; sourceTree = ""; }; + 8297E45E2AE75D4E00E886FA /* FaceSubPage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FaceSubPage.h; sourceTree = ""; }; + 8297E45F2AE75D4E00E886FA /* WifiList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WifiList.m; sourceTree = ""; }; + 8297E4602AE75D4E00E886FA /* OpenPwd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenPwd.h; sourceTree = ""; }; + 8297E4612AE75D4E00E886FA /* P2pTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = P2pTest.m; sourceTree = ""; }; + 8297E4622AE75D4E00E886FA /* EquConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EquConfig.h; sourceTree = ""; }; + 8297E4632AE75D4E00E886FA /* Setting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Setting.h; sourceTree = ""; }; + 8297E4642AE75D4E00E886FA /* Call.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Call.m; sourceTree = ""; }; + 8297E4652AE75D4E00E886FA /* Web.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Web.h; sourceTree = ""; }; + 8297E4722AE761EB00E886FA /* BaseViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseViewController.m; sourceTree = ""; }; + 8297E4732AE761EB00E886FA /* BaseViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseViewController.h; sourceTree = ""; }; + 8297E4762AE7635400E886FA /* Opendoor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Opendoor.h; sourceTree = ""; }; + 8297E4772AE7635400E886FA /* Opendoor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Opendoor.m; sourceTree = ""; }; + 8297E47A2AE7643100E886FA /* AsyncUdpSocket.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AsyncUdpSocket.m; sourceTree = ""; }; + 8297E47B2AE7643100E886FA /* AsyncSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsyncSocket.h; sourceTree = ""; }; + 8297E47C2AE7643100E886FA /* UIView+AutoLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+AutoLayout.m"; sourceTree = ""; }; + 8297E47D2AE7643100E886FA /* UIView+AutoLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+AutoLayout.h"; sourceTree = ""; }; + 8297E47E2AE7643100E886FA /* AsyncSocket.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AsyncSocket.m; sourceTree = ""; }; + 8297E47F2AE7643100E886FA /* AsyncUdpSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsyncUdpSocket.h; sourceTree = ""; }; + 8297E4862AE768DE00E886FA /* BaseNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseNavigationController.h; sourceTree = ""; }; + 8297E4872AE768DE00E886FA /* BaseNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseNavigationController.m; sourceTree = ""; }; + 8297E48C2AE76D0500E886FA /* BaseTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseTableViewController.h; sourceTree = ""; }; + 8297E48D2AE76D0500E886FA /* BaseTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseTableViewController.m; sourceTree = ""; }; + 8297E48F2AE76DD500E886FA /* BasePageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BasePageViewController.h; sourceTree = ""; }; + 8297E4902AE76DD500E886FA /* BasePageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BasePageViewController.m; sourceTree = ""; }; + 8297E4932AE76EC700E886FA /* HKHTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HKHTextField.h; sourceTree = ""; }; + 8297E4942AE76EC700E886FA /* HKHTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HKHTextField.m; sourceTree = ""; }; + 8297E4992AE7974700E886FA /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 8297E49A2AE7974700E886FA /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 82BD91212ADA72360018E523 /* CommonDefine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CommonDefine.h; sourceTree = ""; }; + 82C026532AE8AC6D0011FE6A /* AliyunEmasServices-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "AliyunEmasServices-Info.plist"; sourceTree = ""; }; + 82C026562AEB6C050011FE6A /* add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = add.png; sourceTree = ""; }; + 82C026572AEB6C050011FE6A /* ic_vd_mic_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_vd_mic_on.png; sourceTree = ""; }; + 82C026582AEB6C050011FE6A /* watch.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = watch.png; sourceTree = ""; }; + 82C026592AEB6C050011FE6A /* call_menu.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_menu.png; sourceTree = ""; }; + 82C0265A2AEB6C050011FE6A /* call_del_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_del_on.png; sourceTree = ""; }; + 82C0265B2AEB6C050011FE6A /* hangup.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = hangup.png; sourceTree = ""; }; + 82C0265C2AEB6C050011FE6A /* save_photo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = save_photo.png; sourceTree = ""; }; + 82C0265D2AEB6C050011FE6A /* show_head_toast_bg.9.PNG */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = show_head_toast_bg.9.PNG; sourceTree = ""; }; + 82C0265E2AEB6C050011FE6A /* search_bar_edit_normal.9.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = search_bar_edit_normal.9.png; sourceTree = ""; }; + 82C0265F2AEB6C050011FE6A /* icon_close.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_close.png; sourceTree = ""; }; + 82C026602AEB6C050011FE6A /* swicth_minus_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = swicth_minus_off.png; sourceTree = ""; }; + 82C026612AEB6C050011FE6A /* sidebar_background.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = sidebar_background.xml; sourceTree = ""; }; + 82C026622AEB6C050011FE6A /* hf_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = hf_on.png; sourceTree = ""; }; + 82C026632AEB6C050011FE6A /* unlock_on2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = unlock_on2.png; sourceTree = ""; }; + 82C026642AEB6C050011FE6A /* vcontacts.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vcontacts.png; sourceTree = ""; }; + 82C026652AEB6C050011FE6A /* zoom.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = zoom.png; sourceTree = ""; }; + 82C026662AEB6C050011FE6A /* key.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = key.png; sourceTree = ""; }; + 82C026672AEB6C050011FE6A /* lock2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = lock2.png; sourceTree = ""; }; + 82C026682AEB6C050011FE6A /* lock.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = lock.png; sourceTree = ""; }; + 82C026692AEB6C050011FE6A /* vcall.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vcall.png; sourceTree = ""; }; + 82C0266A2AEB6C050011FE6A /* spk.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = spk.png; sourceTree = ""; }; + 82C0266B2AEB6C050011FE6A /* blank.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = blank.png; sourceTree = ""; }; + 82C0266C2AEB6C050011FE6A /* clear.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = clear.png; sourceTree = ""; }; + 82C0266D2AEB6C050011FE6A /* rotate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = rotate.png; sourceTree = ""; }; + 82C0266E2AEB6C050011FE6A /* call_call_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_call_on.png; sourceTree = ""; }; + 82C0266F2AEB6C050011FE6A /* call_del.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_del.png; sourceTree = ""; }; + 82C026702AEB6C050011FE6A /* swicth_minus_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = swicth_minus_on.png; sourceTree = ""; }; + 82C026712AEB6C050011FE6A /* lock_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = lock_on.png; sourceTree = ""; }; + 82C026722AEB6C050011FE6A /* vrecord_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vrecord_on.png; sourceTree = ""; }; + 82C026732AEB6C050011FE6A /* search_bar_icon_normal.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = search_bar_icon_normal.png; sourceTree = ""; }; + 82C026742AEB6C050011FE6A /* vrecord.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vrecord.png; sourceTree = ""; }; + 82C026752AEB6C050011FE6A /* swicth_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = swicth_off.png; sourceTree = ""; }; + 82C026762AEB6C050011FE6A /* test.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = test.jpg; sourceTree = ""; }; + 82C026772AEB6C050011FE6A /* back3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = back3.png; sourceTree = ""; }; + 82C026782AEB6C050011FE6A /* logo3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = logo3.png; sourceTree = ""; }; + 82C026792AEB6C050011FE6A /* menu.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu.png; sourceTree = ""; }; + 82C0267A2AEB6C050011FE6A /* logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = logo.png; sourceTree = ""; }; + 82C0267B2AEB6C050011FE6A /* logo2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = logo2.png; sourceTree = ""; }; + 82C0267C2AEB6C050011FE6A /* vcontacts2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vcontacts2.png; sourceTree = ""; }; + 82C0267D2AEB6C050011FE6A /* swicth_add_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = swicth_add_on.png; sourceTree = ""; }; + 82C0267E2AEB6C050011FE6A /* add2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = add2.png; sourceTree = ""; }; + 82C0267F2AEB6C050011FE6A /* swicth_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = swicth_on.png; sourceTree = ""; }; + 82C026802AEB6C050011FE6A /* shop_loading.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = shop_loading.png; sourceTree = ""; }; + 82C026812AEB6C050011FE6A /* call_menu_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_menu_on.png; sourceTree = ""; }; + 82C026822AEB6C050011FE6A /* vcall_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vcall_on.png; sourceTree = ""; }; + 82C026832AEB6C050011FE6A /* wave1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = wave1.png; sourceTree = ""; }; + 82C026842AEB6C050011FE6A /* ic_launcher.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_launcher.png; sourceTree = ""; }; + 82C026852AEB6C050011FE6A /* key_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = key_on.png; sourceTree = ""; }; + 82C026862AEB6C050011FE6A /* hf.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = hf.png; sourceTree = ""; }; + 82C026872AEB6C050011FE6A /* wave3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = wave3.png; sourceTree = ""; }; + 82C026882AEB6C050011FE6A /* wave2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = wave2.png; sourceTree = ""; }; + 82C026892AEB6C050011FE6A /* ic_vd_mic_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_vd_mic_off.png; sourceTree = ""; }; + 82C0268A2AEB6C050011FE6A /* split3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = split3.png; sourceTree = ""; }; + 82C0268B2AEB6C050011FE6A /* emotionstore_progresscancelbtn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = emotionstore_progresscancelbtn.png; sourceTree = ""; }; + 82C0268C2AEB6C050011FE6A /* split.JPG */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = split.JPG; sourceTree = ""; }; + 82C0268D2AEB6C050011FE6A /* swicth_add_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = swicth_add_off.png; sourceTree = ""; }; + 82C0268E2AEB6C050011FE6A /* search_bar_edit_pressed.9.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = search_bar_edit_pressed.9.png; sourceTree = ""; }; + 82C0268F2AEB6C050011FE6A /* setting.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = setting.png; sourceTree = ""; }; + 82C026902AEB6C050011FE6A /* back.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = back.png; sourceTree = ""; }; + 82C026912AEB6C050011FE6A /* thumb_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = thumb_on.png; sourceTree = ""; }; + 82C026922AEB6C050011FE6A /* split4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = split4.png; sourceTree = ""; }; + 82C026932AEB6C050011FE6A /* thumb.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = thumb.png; sourceTree = ""; }; + 82C026942AEB6C050011FE6A /* vcontacts_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vcontacts_on.png; sourceTree = ""; }; + 82C026952AEB6C050011FE6A /* mic.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mic.png; sourceTree = ""; }; + 82C026962AEB6C050011FE6A /* icon_key.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_key.png; sourceTree = ""; }; + 82C026972AEB6C050011FE6A /* bg.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bg.jpg; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -78,13 +328,239 @@ path = Pods; sourceTree = ""; }; - 826570C02ADCDD0200A92776 /* XSController */ = { + 8297E4112AE75BEE00E886FA /* XSTalkManager */ = { isa = PBXGroup; children = ( - 82BD911E2ADA6FBB0018E523 /* XSFlutterManager.h */, - 82BD911F2ADA6FBB0018E523 /* XSFlutterManager.m */, + 8297E4792AE7643100E886FA /* External */, + 8297E4752AE7635400E886FA /* mainPage */, + 8297E4712AE761EB00E886FA /* views */, + 8297E44F2AE75D4E00E886FA /* NextPage */, + 8297E4122AE75BEE00E886FA /* Utils */, + 8297E42D2AE75BEE00E886FA /* sound */, + 8297E4342AE75BEE00E886FA /* pushkit */, ); - name = XSController; + path = XSTalkManager; + sourceTree = ""; + }; + 8297E4122AE75BEE00E886FA /* Utils */ = { + isa = PBXGroup; + children = ( + 8297E4132AE75BEE00E886FA /* Msg.m */, + 8297E4142AE75BEE00E886FA /* UI.h */, + 8297E4152AE75BEE00E886FA /* HttpManager.h */, + 8297E4162AE75BEE00E886FA /* UDP */, + 8297E41B2AE75BEE00E886FA /* Sformat.m */, + 8297E41C2AE75BEE00E886FA /* Pub.h */, + 8297E41D2AE75BEE00E886FA /* sysInfo.h */, + 8297E41E2AE75BEE00E886FA /* Msg.h */, + 8297E41F2AE75BEE00E886FA /* Sformat.h */, + 8297E4202AE75BEE00E886FA /* HttpManager.m */, + 8297E4212AE75BEE00E886FA /* UI.m */, + 8297E4222AE75BEE00E886FA /* sysInfo.m */, + 8297E4232AE75BEE00E886FA /* Pub.m */, + 8297E4242AE75BEE00E886FA /* Talk */, + ); + path = Utils; + sourceTree = ""; + }; + 8297E4162AE75BEE00E886FA /* UDP */ = { + isa = PBXGroup; + children = ( + 8297E4192AE75BEE00E886FA /* udp_data_class.h */, + 8297E4172AE75BEE00E886FA /* udp_data_class.m */, + 8297E41A2AE75BEE00E886FA /* UdpHelper.h */, + 8297E4182AE75BEE00E886FA /* UdpHelper.m */, + ); + path = UDP; + sourceTree = ""; + }; + 8297E4242AE75BEE00E886FA /* Talk */ = { + isa = PBXGroup; + children = ( + 8297E4272AE75BEE00E886FA /* IframeInfo.h */, + 8297E42C2AE75BEE00E886FA /* IframeInfo.m */, + 8297E4292AE75BEE00E886FA /* recordAudio.h */, + 8297E4252AE75BEE00E886FA /* recordAudio.m */, + 8297E4262AE75BEE00E886FA /* talk_Class.h */, + 8297E42A2AE75BEE00E886FA /* talk_Class.m */, + 8297E42B2AE75BEE00E886FA /* playAudio.h */, + 8297E4282AE75BEE00E886FA /* playAudio.m */, + ); + path = Talk; + sourceTree = ""; + }; + 8297E42D2AE75BEE00E886FA /* sound */ = { + isa = PBXGroup; + children = ( + 8297E42E2AE75BEE00E886FA /* Piano.caf */, + 8297E42F2AE75BEE00E886FA /* ring1.mp3 */, + 8297E4302AE75BEE00E886FA /* ok.wav */, + 8297E4312AE75BEE00E886FA /* notice.wav */, + 8297E4322AE75BEE00E886FA /* err.wav */, + 8297E4332AE75BEE00E886FA /* alarm.wav */, + ); + path = sound; + sourceTree = ""; + }; + 8297E4342AE75BEE00E886FA /* pushkit */ = { + isa = PBXGroup; + children = ( + 8297E4352AE75BEE00E886FA /* VideoTalkManager.h */, + 8297E4362AE75BEE00E886FA /* RingCall.m */, + 8297E4372AE75BEE00E886FA /* RingCall.h */, + 8297E4382AE75BEE00E886FA /* VideoTalkManager.m */, + 8297E4392AE75BEE00E886FA /* voip_call.caf */, + ); + path = pushkit; + sourceTree = ""; + }; + 8297E44F2AE75D4E00E886FA /* NextPage */ = { + isa = PBXGroup; + children = ( + 8297E4502AE75D4E00E886FA /* EquList.h */, + 8297E4512AE75D4E00E886FA /* EquAdd.h */, + 8297E4522AE75D4E00E886FA /* FaceUpload.h */, + 8297E4532AE75D4E00E886FA /* WifiList.h */, + 8297E4542AE75D4E00E886FA /* FaceSubPage.m */, + 8297E4552AE75D4E00E886FA /* EquConfig.m */, + 8297E4562AE75D4E00E886FA /* OpenPwd.m */, + 8297E4572AE75D4E00E886FA /* P2pTest.h */, + 8297E4582AE75D4E00E886FA /* Web.m */, + 8297E4592AE75D4E00E886FA /* Call.h */, + 8297E45A2AE75D4E00E886FA /* Setting.m */, + 8297E45B2AE75D4E00E886FA /* FaceUpload.m */, + 8297E45C2AE75D4E00E886FA /* EquAdd.m */, + 8297E45D2AE75D4E00E886FA /* EquList.m */, + 8297E45E2AE75D4E00E886FA /* FaceSubPage.h */, + 8297E45F2AE75D4E00E886FA /* WifiList.m */, + 8297E4602AE75D4E00E886FA /* OpenPwd.h */, + 8297E4612AE75D4E00E886FA /* P2pTest.m */, + 8297E4622AE75D4E00E886FA /* EquConfig.h */, + 8297E4632AE75D4E00E886FA /* Setting.h */, + 8297E4642AE75D4E00E886FA /* Call.m */, + 8297E4652AE75D4E00E886FA /* Web.h */, + ); + path = NextPage; + sourceTree = ""; + }; + 8297E4712AE761EB00E886FA /* views */ = { + isa = PBXGroup; + children = ( + 8297E4922AE76EC700E886FA /* TextField */, + 8297E48F2AE76DD500E886FA /* BasePageViewController.h */, + 8297E4902AE76DD500E886FA /* BasePageViewController.m */, + 8297E48C2AE76D0500E886FA /* BaseTableViewController.h */, + 8297E48D2AE76D0500E886FA /* BaseTableViewController.m */, + 8297E4862AE768DE00E886FA /* BaseNavigationController.h */, + 8297E4872AE768DE00E886FA /* BaseNavigationController.m */, + 8297E4722AE761EB00E886FA /* BaseViewController.m */, + 8297E4732AE761EB00E886FA /* BaseViewController.h */, + ); + path = views; + sourceTree = ""; + }; + 8297E4752AE7635400E886FA /* mainPage */ = { + isa = PBXGroup; + children = ( + 8297E4762AE7635400E886FA /* Opendoor.h */, + 8297E4772AE7635400E886FA /* Opendoor.m */, + ); + path = mainPage; + sourceTree = ""; + }; + 8297E4792AE7643100E886FA /* External */ = { + isa = PBXGroup; + children = ( + 8297E47A2AE7643100E886FA /* AsyncUdpSocket.m */, + 8297E47B2AE7643100E886FA /* AsyncSocket.h */, + 8297E47C2AE7643100E886FA /* UIView+AutoLayout.m */, + 8297E47D2AE7643100E886FA /* UIView+AutoLayout.h */, + 8297E47E2AE7643100E886FA /* AsyncSocket.m */, + 8297E47F2AE7643100E886FA /* AsyncUdpSocket.h */, + ); + path = External; + sourceTree = ""; + }; + 8297E4922AE76EC700E886FA /* TextField */ = { + isa = PBXGroup; + children = ( + 8297E4932AE76EC700E886FA /* HKHTextField.h */, + 8297E4942AE76EC700E886FA /* HKHTextField.m */, + ); + path = TextField; + sourceTree = ""; + }; + 82C026552AEB6C050011FE6A /* img */ = { + isa = PBXGroup; + children = ( + 82C026562AEB6C050011FE6A /* add.png */, + 82C026572AEB6C050011FE6A /* ic_vd_mic_on.png */, + 82C026582AEB6C050011FE6A /* watch.png */, + 82C026592AEB6C050011FE6A /* call_menu.png */, + 82C0265A2AEB6C050011FE6A /* call_del_on.png */, + 82C0265B2AEB6C050011FE6A /* hangup.png */, + 82C0265C2AEB6C050011FE6A /* save_photo.png */, + 82C0265D2AEB6C050011FE6A /* show_head_toast_bg.9.PNG */, + 82C0265E2AEB6C050011FE6A /* search_bar_edit_normal.9.png */, + 82C0265F2AEB6C050011FE6A /* icon_close.png */, + 82C026602AEB6C050011FE6A /* swicth_minus_off.png */, + 82C026612AEB6C050011FE6A /* sidebar_background.xml */, + 82C026622AEB6C050011FE6A /* hf_on.png */, + 82C026632AEB6C050011FE6A /* unlock_on2.png */, + 82C026642AEB6C050011FE6A /* vcontacts.png */, + 82C026652AEB6C050011FE6A /* zoom.png */, + 82C026662AEB6C050011FE6A /* key.png */, + 82C026672AEB6C050011FE6A /* lock2.png */, + 82C026682AEB6C050011FE6A /* lock.png */, + 82C026692AEB6C050011FE6A /* vcall.png */, + 82C0266A2AEB6C050011FE6A /* spk.png */, + 82C0266B2AEB6C050011FE6A /* blank.png */, + 82C0266C2AEB6C050011FE6A /* clear.png */, + 82C0266D2AEB6C050011FE6A /* rotate.png */, + 82C0266E2AEB6C050011FE6A /* call_call_on.png */, + 82C0266F2AEB6C050011FE6A /* call_del.png */, + 82C026702AEB6C050011FE6A /* swicth_minus_on.png */, + 82C026712AEB6C050011FE6A /* lock_on.png */, + 82C026722AEB6C050011FE6A /* vrecord_on.png */, + 82C026732AEB6C050011FE6A /* search_bar_icon_normal.png */, + 82C026742AEB6C050011FE6A /* vrecord.png */, + 82C026752AEB6C050011FE6A /* swicth_off.png */, + 82C026762AEB6C050011FE6A /* test.jpg */, + 82C026772AEB6C050011FE6A /* back3.png */, + 82C026782AEB6C050011FE6A /* logo3.png */, + 82C026792AEB6C050011FE6A /* menu.png */, + 82C0267A2AEB6C050011FE6A /* logo.png */, + 82C0267B2AEB6C050011FE6A /* logo2.png */, + 82C0267C2AEB6C050011FE6A /* vcontacts2.png */, + 82C0267D2AEB6C050011FE6A /* swicth_add_on.png */, + 82C0267E2AEB6C050011FE6A /* add2.png */, + 82C0267F2AEB6C050011FE6A /* swicth_on.png */, + 82C026802AEB6C050011FE6A /* shop_loading.png */, + 82C026812AEB6C050011FE6A /* call_menu_on.png */, + 82C026822AEB6C050011FE6A /* vcall_on.png */, + 82C026832AEB6C050011FE6A /* wave1.png */, + 82C026842AEB6C050011FE6A /* ic_launcher.png */, + 82C026852AEB6C050011FE6A /* key_on.png */, + 82C026862AEB6C050011FE6A /* hf.png */, + 82C026872AEB6C050011FE6A /* wave3.png */, + 82C026882AEB6C050011FE6A /* wave2.png */, + 82C026892AEB6C050011FE6A /* ic_vd_mic_off.png */, + 82C0268A2AEB6C050011FE6A /* split3.png */, + 82C0268B2AEB6C050011FE6A /* emotionstore_progresscancelbtn.png */, + 82C0268C2AEB6C050011FE6A /* split.JPG */, + 82C0268D2AEB6C050011FE6A /* swicth_add_off.png */, + 82C0268E2AEB6C050011FE6A /* search_bar_edit_pressed.9.png */, + 82C0268F2AEB6C050011FE6A /* setting.png */, + 82C026902AEB6C050011FE6A /* back.png */, + 82C026912AEB6C050011FE6A /* thumb_on.png */, + 82C026922AEB6C050011FE6A /* split4.png */, + 82C026932AEB6C050011FE6A /* thumb.png */, + 82C026942AEB6C050011FE6A /* vcontacts_on.png */, + 82C026952AEB6C050011FE6A /* mic.png */, + 82C026962AEB6C050011FE6A /* icon_key.png */, + 82C026972AEB6C050011FE6A /* bg.jpg */, + ); + path = img; sourceTree = ""; }; 9304F75C378DB3447BB2408C /* Frameworks */ = { @@ -128,10 +604,14 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( - 826570C02ADCDD0200A92776 /* XSController */, + 82C026552AEB6C050011FE6A /* img */, + 82C026532AE8AC6D0011FE6A /* AliyunEmasServices-Info.plist */, + 8297E4992AE7974700E886FA /* AppDelegate.h */, + 8297E49A2AE7974700E886FA /* AppDelegate.m */, + 8297E40F2AE75AC500E886FA /* XSFlutterManager.h */, + 8297E40E2AE75AC500E886FA /* XSFlutterManager.m */, + 8297E4112AE75BEE00E886FA /* XSTalkManager */, 33BF41252A96174D009D92E2 /* Runner.entitlements */, - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -215,10 +695,84 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 82C026A02AEB6C050011FE6A /* search_bar_edit_normal.9.png in Resources */, + 82C026A92AEB6C050011FE6A /* lock2.png in Resources */, + 82C026AE2AEB6C050011FE6A /* clear.png in Resources */, + 82C0269B2AEB6C050011FE6A /* call_menu.png in Resources */, + 82C026542AE8AC6D0011FE6A /* AliyunEmasServices-Info.plist in Resources */, + 82C026AD2AEB6C050011FE6A /* blank.png in Resources */, + 82C0269F2AEB6C050011FE6A /* show_head_toast_bg.9.PNG in Resources */, + 8297E44B2AE75BEE00E886FA /* alarm.wav in Resources */, + 82C026BA2AEB6C050011FE6A /* logo3.png in Resources */, + 82C026B22AEB6C050011FE6A /* swicth_minus_on.png in Resources */, + 82C026C22AEB6C050011FE6A /* shop_loading.png in Resources */, + 82C026AF2AEB6C050011FE6A /* rotate.png in Resources */, + 82C026BD2AEB6C050011FE6A /* logo2.png in Resources */, + 8297E44A2AE75BEE00E886FA /* err.wav in Resources */, + 8297E4492AE75BEE00E886FA /* notice.wav in Resources */, + 82C026C62AEB6C050011FE6A /* ic_launcher.png in Resources */, + 8297E4472AE75BEE00E886FA /* ring1.mp3 in Resources */, + 8297E44E2AE75BEE00E886FA /* voip_call.caf in Resources */, 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 82C026D62AEB6C050011FE6A /* vcontacts_on.png in Resources */, + 82C026BF2AEB6C050011FE6A /* swicth_add_on.png in Resources */, + 82C026A52AEB6C050011FE6A /* unlock_on2.png in Resources */, + 82C026A12AEB6C050011FE6A /* icon_close.png in Resources */, + 82C026AB2AEB6C050011FE6A /* vcall.png in Resources */, + 82C026CE2AEB6C050011FE6A /* split.JPG in Resources */, + 8297E4462AE75BEE00E886FA /* Piano.caf in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 8297E4482AE75BEE00E886FA /* ok.wav in Resources */, + 82C026A72AEB6C050011FE6A /* zoom.png in Resources */, + 82C026D42AEB6C050011FE6A /* split4.png in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + 82C026992AEB6C050011FE6A /* ic_vd_mic_on.png in Resources */, + 82C026C12AEB6C050011FE6A /* swicth_on.png in Resources */, + 82C026B72AEB6C050011FE6A /* swicth_off.png in Resources */, + 82C026D72AEB6C050011FE6A /* mic.png in Resources */, + 82C026C32AEB6C050011FE6A /* call_menu_on.png in Resources */, + 82C026B02AEB6C050011FE6A /* call_call_on.png in Resources */, + 82C026C82AEB6C050011FE6A /* hf.png in Resources */, + 82C026BE2AEB6C050011FE6A /* vcontacts2.png in Resources */, + 82C026AC2AEB6C050011FE6A /* spk.png in Resources */, + 82C026D12AEB6C050011FE6A /* setting.png in Resources */, + 82C026D82AEB6C050011FE6A /* icon_key.png in Resources */, + 82C026C42AEB6C050011FE6A /* vcall_on.png in Resources */, + 82C026982AEB6C050011FE6A /* add.png in Resources */, + 82C026D22AEB6C050011FE6A /* back.png in Resources */, + 82C0269C2AEB6C050011FE6A /* call_del_on.png in Resources */, + 82C026B92AEB6C050011FE6A /* back3.png in Resources */, + 82C026C02AEB6C050011FE6A /* add2.png in Resources */, + 82C026BB2AEB6C050011FE6A /* menu.png in Resources */, + 82C026AA2AEB6C050011FE6A /* lock.png in Resources */, + 82C026CC2AEB6C050011FE6A /* split3.png in Resources */, + 82C026D92AEB6C050011FE6A /* bg.jpg in Resources */, + 82C026B82AEB6C050011FE6A /* test.jpg in Resources */, + 82C026B12AEB6C050011FE6A /* call_del.png in Resources */, + 82C026B52AEB6C050011FE6A /* search_bar_icon_normal.png in Resources */, + 82C026CA2AEB6C050011FE6A /* wave2.png in Resources */, + 82C0269D2AEB6C050011FE6A /* hangup.png in Resources */, + 82C0269A2AEB6C050011FE6A /* watch.png in Resources */, + 82C0269E2AEB6C050011FE6A /* save_photo.png in Resources */, + 82C026A62AEB6C050011FE6A /* vcontacts.png in Resources */, + 82C026C72AEB6C050011FE6A /* key_on.png in Resources */, + 82C026D52AEB6C050011FE6A /* thumb.png in Resources */, + 82C026B32AEB6C050011FE6A /* lock_on.png in Resources */, + 82C026A32AEB6C050011FE6A /* sidebar_background.xml in Resources */, + 82C026CF2AEB6C050011FE6A /* swicth_add_off.png in Resources */, + 82C026A22AEB6C050011FE6A /* swicth_minus_off.png in Resources */, + 82C026A42AEB6C050011FE6A /* hf_on.png in Resources */, + 82C026C92AEB6C050011FE6A /* wave3.png in Resources */, + 82C026D02AEB6C050011FE6A /* search_bar_edit_pressed.9.png in Resources */, + 82C026A82AEB6C050011FE6A /* key.png in Resources */, + 82C026CB2AEB6C050011FE6A /* ic_vd_mic_off.png in Resources */, + 82C026CD2AEB6C050011FE6A /* emotionstore_progresscancelbtn.png in Resources */, + 82C026D32AEB6C050011FE6A /* thumb_on.png in Resources */, + 82C026BC2AEB6C050011FE6A /* logo.png in Resources */, + 82C026B42AEB6C050011FE6A /* vrecord_on.png in Resources */, + 82C026C52AEB6C050011FE6A /* wave1.png in Resources */, + 82C026B62AEB6C050011FE6A /* vrecord.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -261,7 +815,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n"; }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; @@ -276,7 +830,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; D9B107A6B141D5F15BC356F2 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; @@ -302,10 +856,44 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, - 82BD91202ADA6FBB0018E523 /* XSFlutterManager.m in Sources */, + 8297E49B2AE7974700E886FA /* AppDelegate.m in Sources */, + 8297E4692AE75D4E00E886FA /* Web.m in Sources */, + 8297E4742AE761EB00E886FA /* BaseViewController.m in Sources */, + 8297E43E2AE75BEE00E886FA /* HttpManager.m in Sources */, + 8297E43F2AE75BEE00E886FA /* UI.m in Sources */, + 8297E46B2AE75D4E00E886FA /* FaceUpload.m in Sources */, + 8297E43D2AE75BEE00E886FA /* Sformat.m in Sources */, + 8297E4672AE75D4E00E886FA /* EquConfig.m in Sources */, + 8297E4912AE76DD500E886FA /* BasePageViewController.m in Sources */, + 8297E46C2AE75D4E00E886FA /* EquAdd.m in Sources */, + 8297E46D2AE75D4E00E886FA /* EquList.m in Sources */, + 8297E4412AE75BEE00E886FA /* Pub.m in Sources */, + 8297E4662AE75D4E00E886FA /* FaceSubPage.m in Sources */, + 8297E4702AE75D4E00E886FA /* Call.m in Sources */, + 8297E43A2AE75BEE00E886FA /* Msg.m in Sources */, + 8297E4822AE7643100E886FA /* AsyncSocket.m in Sources */, + 8297E4952AE76EC700E886FA /* HKHTextField.m in Sources */, + 8297E43C2AE75BEE00E886FA /* UdpHelper.m in Sources */, + 8297E4452AE75BEE00E886FA /* IframeInfo.m in Sources */, + 8297E4102AE75AC500E886FA /* XSFlutterManager.m in Sources */, + 8297E46A2AE75D4E00E886FA /* Setting.m in Sources */, 97C146F31CF9000F007C117D /* main.m in Sources */, + 8297E4812AE7643100E886FA /* UIView+AutoLayout.m in Sources */, + 8297E4422AE75BEE00E886FA /* recordAudio.m in Sources */, + 8297E4432AE75BEE00E886FA /* playAudio.m in Sources */, + 8297E48E2AE76D0500E886FA /* BaseTableViewController.m in Sources */, + 8297E4442AE75BEE00E886FA /* talk_Class.m in Sources */, + 8297E4402AE75BEE00E886FA /* sysInfo.m in Sources */, + 8297E44C2AE75BEE00E886FA /* RingCall.m in Sources */, + 8297E4682AE75D4E00E886FA /* OpenPwd.m in Sources */, + 8297E44D2AE75BEE00E886FA /* VideoTalkManager.m in Sources */, + 8297E43B2AE75BEE00E886FA /* udp_data_class.m in Sources */, + 8297E4882AE768DE00E886FA /* BaseNavigationController.m in Sources */, + 8297E4802AE7643100E886FA /* AsyncUdpSocket.m in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + 8297E4782AE7635400E886FA /* Opendoor.m in Sources */, + 8297E46F2AE75D4E00E886FA /* P2pTest.m in Sources */, + 8297E46E2AE75D4E00E886FA /* WifiList.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -393,15 +981,125 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = DWNXC92BQ6; + DEVELOPMENT_TEAM = 7D53BZAN75; ENABLE_BITCODE = NO; + GCC_NO_COMMON_BLOCKS = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0.0; - PRODUCT_BUNDLE_IDENTIFIER = "cn.star-lock.lock20231021"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-l\"c++\"", + "-l\"resolv\"", + "-l\"sqlite3\"", + "-l\"sqlite3.0\"", + "-l\"z\"", + "-framework", + "\"AMapFoundationKit\"", + "-framework", + "\"AMapLocationKit\"", + "-framework", + "\"Accelerate\"", + "-framework", + "\"AlicloudSender\"", + "-framework", + "\"AlicloudUtils\"", + "-framework", + "\"CloudPushSDK\"", + "-framework", + "\"CoreData\"", + "-framework", + "\"CoreGraphics\"", + "-framework", + "\"CoreImage\"", + "-framework", + "\"CoreLocation\"", + "-framework", + "\"CoreTelephony\"", + "-framework", + "\"CoreText\"", + "-framework", + "\"EMASRest\"", + "-framework", + "\"ExternalAccessory\"", + "-framework", + "\"FMDB\"", + "-framework", + "\"GLKit\"", + "-framework", + "\"GoogleMaps\"", + "-framework", + "\"GoogleMapsBase\"", + "-framework", + "\"GoogleMapsCore\"", + "-framework", + "\"ImageIO\"", + "-framework", + "\"MAMapKit\"", + "-framework", + "\"Metal\"", + "-framework", + "\"OpenGLES\"", + "-framework", + "\"Protobuf\"", + "-framework", + "\"QuartzCore\"", + "-framework", + "\"Security\"", + "-framework", + "\"SwiftProtobuf\"", + "-framework", + "\"SystemConfiguration\"", + "-framework", + "\"Toast\"", + "-framework", + "\"UIKit\"", + "-framework", + "\"UTDID\"", + "-framework", + "\"UTMini\"", + "-framework", + "\"aj_captcha_flutter\"", + "-framework", + "\"amap_flutter_location\"", + "-framework", + "\"amap_flutter_map\"", + "-framework", + "\"camera_avfoundation\"", + "-framework", + "\"device_info_plus\"", + "-framework", + "\"flutter_native_contact_picker\"", + "-framework", + "\"fluttertoast\"", + "-framework", + "\"google_maps_flutter_ios\"", + "-framework", + "\"image_picker_ios\"", + "-framework", + "\"network_info_plus\"", + "-framework", + "\"package_info_plus\"", + "-framework", + "\"path_provider_foundation\"", + "-framework", + "\"permission_handler_apple\"", + "-framework", + "\"reactive_ble_mobile\"", + "-framework", + "\"shared_preferences_foundation\"", + "-framework", + "\"sqflite\"", + "-framework", + "\"url_launcher_ios\"", + "-framework", + "\"webview_flutter_wkwebview\"", + ); + PRODUCT_BUNDLE_IDENTIFIER = "cn.star-lock.starLock"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -528,15 +1226,125 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = DWNXC92BQ6; + DEVELOPMENT_TEAM = 7D53BZAN75; ENABLE_BITCODE = NO; + GCC_NO_COMMON_BLOCKS = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0.0; - PRODUCT_BUNDLE_IDENTIFIER = "cn.star-lock.lock20231021"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-l\"c++\"", + "-l\"resolv\"", + "-l\"sqlite3\"", + "-l\"sqlite3.0\"", + "-l\"z\"", + "-framework", + "\"AMapFoundationKit\"", + "-framework", + "\"AMapLocationKit\"", + "-framework", + "\"Accelerate\"", + "-framework", + "\"AlicloudSender\"", + "-framework", + "\"AlicloudUtils\"", + "-framework", + "\"CloudPushSDK\"", + "-framework", + "\"CoreData\"", + "-framework", + "\"CoreGraphics\"", + "-framework", + "\"CoreImage\"", + "-framework", + "\"CoreLocation\"", + "-framework", + "\"CoreTelephony\"", + "-framework", + "\"CoreText\"", + "-framework", + "\"EMASRest\"", + "-framework", + "\"ExternalAccessory\"", + "-framework", + "\"FMDB\"", + "-framework", + "\"GLKit\"", + "-framework", + "\"GoogleMaps\"", + "-framework", + "\"GoogleMapsBase\"", + "-framework", + "\"GoogleMapsCore\"", + "-framework", + "\"ImageIO\"", + "-framework", + "\"MAMapKit\"", + "-framework", + "\"Metal\"", + "-framework", + "\"OpenGLES\"", + "-framework", + "\"Protobuf\"", + "-framework", + "\"QuartzCore\"", + "-framework", + "\"Security\"", + "-framework", + "\"SwiftProtobuf\"", + "-framework", + "\"SystemConfiguration\"", + "-framework", + "\"Toast\"", + "-framework", + "\"UIKit\"", + "-framework", + "\"UTDID\"", + "-framework", + "\"UTMini\"", + "-framework", + "\"aj_captcha_flutter\"", + "-framework", + "\"amap_flutter_location\"", + "-framework", + "\"amap_flutter_map\"", + "-framework", + "\"camera_avfoundation\"", + "-framework", + "\"device_info_plus\"", + "-framework", + "\"flutter_native_contact_picker\"", + "-framework", + "\"fluttertoast\"", + "-framework", + "\"google_maps_flutter_ios\"", + "-framework", + "\"image_picker_ios\"", + "-framework", + "\"network_info_plus\"", + "-framework", + "\"package_info_plus\"", + "-framework", + "\"path_provider_foundation\"", + "-framework", + "\"permission_handler_apple\"", + "-framework", + "\"reactive_ble_mobile\"", + "-framework", + "\"shared_preferences_foundation\"", + "-framework", + "\"sqflite\"", + "-framework", + "\"url_launcher_ios\"", + "-framework", + "\"webview_flutter_wkwebview\"", + ); + PRODUCT_BUNDLE_IDENTIFIER = "cn.star-lock.starLock"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -557,15 +1365,125 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = DWNXC92BQ6; + DEVELOPMENT_TEAM = 7D53BZAN75; ENABLE_BITCODE = NO; + GCC_NO_COMMON_BLOCKS = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0.0; - PRODUCT_BUNDLE_IDENTIFIER = "cn.star-lock.lock20231021"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-l\"c++\"", + "-l\"resolv\"", + "-l\"sqlite3\"", + "-l\"sqlite3.0\"", + "-l\"z\"", + "-framework", + "\"AMapFoundationKit\"", + "-framework", + "\"AMapLocationKit\"", + "-framework", + "\"Accelerate\"", + "-framework", + "\"AlicloudSender\"", + "-framework", + "\"AlicloudUtils\"", + "-framework", + "\"CloudPushSDK\"", + "-framework", + "\"CoreData\"", + "-framework", + "\"CoreGraphics\"", + "-framework", + "\"CoreImage\"", + "-framework", + "\"CoreLocation\"", + "-framework", + "\"CoreTelephony\"", + "-framework", + "\"CoreText\"", + "-framework", + "\"EMASRest\"", + "-framework", + "\"ExternalAccessory\"", + "-framework", + "\"FMDB\"", + "-framework", + "\"GLKit\"", + "-framework", + "\"GoogleMaps\"", + "-framework", + "\"GoogleMapsBase\"", + "-framework", + "\"GoogleMapsCore\"", + "-framework", + "\"ImageIO\"", + "-framework", + "\"MAMapKit\"", + "-framework", + "\"Metal\"", + "-framework", + "\"OpenGLES\"", + "-framework", + "\"Protobuf\"", + "-framework", + "\"QuartzCore\"", + "-framework", + "\"Security\"", + "-framework", + "\"SwiftProtobuf\"", + "-framework", + "\"SystemConfiguration\"", + "-framework", + "\"Toast\"", + "-framework", + "\"UIKit\"", + "-framework", + "\"UTDID\"", + "-framework", + "\"UTMini\"", + "-framework", + "\"aj_captcha_flutter\"", + "-framework", + "\"amap_flutter_location\"", + "-framework", + "\"amap_flutter_map\"", + "-framework", + "\"camera_avfoundation\"", + "-framework", + "\"device_info_plus\"", + "-framework", + "\"flutter_native_contact_picker\"", + "-framework", + "\"fluttertoast\"", + "-framework", + "\"google_maps_flutter_ios\"", + "-framework", + "\"image_picker_ios\"", + "-framework", + "\"network_info_plus\"", + "-framework", + "\"package_info_plus\"", + "-framework", + "\"path_provider_foundation\"", + "-framework", + "\"permission_handler_apple\"", + "-framework", + "\"reactive_ble_mobile\"", + "-framework", + "\"shared_preferences_foundation\"", + "-framework", + "\"sqflite\"", + "-framework", + "\"url_launcher_ios\"", + "-framework", + "\"webview_flutter_wkwebview\"", + ); + PRODUCT_BUNDLE_IDENTIFIER = "cn.star-lock.starLock"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; diff --git a/star_lock/ios/Runner/AliyunEmasServices-Info.plist b/star_lock/ios/Runner/AliyunEmasServices-Info.plist new file mode 100644 index 00000000..ea7823a7 --- /dev/null +++ b/star_lock/ios/Runner/AliyunEmasServices-Info.plist @@ -0,0 +1,86 @@ + + + + + config + + emas.appKey + 333904046 + emas.appSecret + 3eead09a7fc7416cb4082319aa6f48c6 + emas.bundleId + cn.star-lock.starLock + hotfix.idSecret + 333904046-2 + hotfix.rsaSecret + MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCS0i6gEzmEoaXFe0gDcur1sdkE2ecWXRay3h+O11F0FmoNfQx+V4i+pt2se+KDAx/GQq8Axj4DnjzE4KT0TeVmrutI1FF4h2Tv5Ge9KT0yuCayiQPW5gkqTDxaehkRDyCzGkwaLkVslN2kFqammWsODTQw2a0/lziMrNpQU8bnjjYbKS1eIQUPM9s6smwN2A4RErAP7X1knsT1tCHoCgfgjZf1nddQSMw4vy9FBpKZDYD1gjdo5+U93VopVLpMqcbOVXbQeUwpArURNnY/dbSkrGsC2TXAfaYa+sVXPchy0pZ7C2wU2/6INkFBpw2QjFQ4uAcNXwoEn5x5iBw4VbnPAgMBAAECggEAfoowLT7kf+9iFIZgVrig0QlrZcb4aEnq2lafFFl3lnoLBX0VW37OGKNwwswzOX9jz1iBxEUYBb5H2ddT1Euev5Vaq/ZyEVOAJ1HQJzR3zlLw50c3y+uPUqlKCyDYod9L65FqrdXbd+4F6Pqsv0HTBtVSehfiPcBzuKrxrfHGqKKWx4C620SxPqtpNaYXaENyqfZ3qyKw+xtWGJtxjQ8DFkeWJ1C8O7ZxJ33SpwpEb9UIJpDtPcaKbwccLn/w5214kYAqE7m5aTmLUTFRYay2Hez1gPUKVirt/QDfEfHRv6xbv5jePl0snXWK0VwgoR3hLDuF9etM3UFLr40eQNICQQKBgQDCBjM7NvscgRCJ7E8vdcfxlebUhooZUewc9gBsTpPMcS8xZXP8desc1smZvokPtIKKwPdECw6rGf1a+sb6dnHMNjWBUbHTxWnYKqVlDDXJkgcSynK+74wRCfzmFamtQmJ1qVATHRVLoVSzmCwn9q+HsGWLAsMXDu5qbL6B91La2QKBgQDBuBHfPo4AwqefsPn5isw0bFYuc5rGSbfRTAlOC09BDJb2E9bz8QiC0A/Ar8i2fx9UbHKj96NYwMGwS49Bu/Behq5v2TnODbA6j5lN4fMbRBaCMs4TINUjG4xGeFehELiFIJvCJ+3z6zRBuXmCkxtso3VM6uVSn8TX1gjBgzxA5wKBgHjJYVVoyfUZyBEE4tr56OpV1qjRxOE0Zdg1sVe7pzkr8SRAM2+kfSSr9j9XJX54cpgsvwJGG/CasmXUHtFHsVpfGPoTwK/EgzsGeYapjkaZOPwSulJxUHI/FIisTcBFxoPXTrlHbr1xhwhzIHIUmXvQbbaXlpohOn1Yi1Tfgl4pAoGAJBdZLRCIgFfDxxq/1+AmH3Y3sDvVkC/X0WSrLyEoSORBk+MqXxR/E3AUH0Ag0u9oNOBnk2jlw/lVnLTXIdYT+Gh7Q1djT6J5PM/YLgx0sJXE48j3X9T0ILBXOCHfoaBt4E+s9UVfLdyaRcx6ePtTVrA1gHka9IPTtqqnwvXiWe0CgYBjmKSq2uBXSzAWMAR5KbUYDzUoqWGGHyRHtX4IqlLYF6paabzJDxPg2QScv9e8+js5Vmbg/G5RUPhYMqJIatAzLQDujaLovLGPXlx2xQXf4Nn0M5AnvKXMF+m8xBY5KnT5SWjI9Uq9QVJMcMl43Nq1V4NSsnB8SIZsGVOgxB9tuw== + httpdns.accountId + 125761 + httpdns.secretKey + f77f39c6f0e66d7c169aa7e8d87dfe13 + appmonitor.tlog.rsaSecret + MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCSlqdpwcdPniL1ahrYfTy47aD8Ay7D7qLyKO5QeXy64V+CQ0UvYwyTtfPRzvlXbwmc2ONjwKHq2B7SRhwHuBwURZNp5Iw1XaGCmqPPMOpL9UnYEIO90x3sFebIRHmXscyRVniGhmmdOXpVaP6BA3RWK1uwH/FBetzom6H+dcNMPQIDAQAB + appmonitor.rsaSecret + MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCSlqdpwcdPniL1ahrYfTy47aD8Ay7D7qLyKO5QeXy64V+CQ0UvYwyTtfPRzvlXbwmc2ONjwKHq2B7SRhwHuBwURZNp5Iw1XaGCmqPPMOpL9UnYEIO90x3sFebIRHmXscyRVniGhmmdOXpVaP6BA3RWK1uwH/FBetzom6H+dcNMPQIDAQAB + + services + + hotfix_service + + status + 1 + version + 1.0.0-1 + + feedback_service + + status + 1 + version + 3.3.11 + + tlog_service + + status + 1 + version + 1.0.1.2 + + httpdns_service + + status + 1 + version + 2.1.0 + + apm_service + + status + 1 + version + 1.1.1 + + crashreporter_service + + status + 1 + version + 1.2.0 + + man_service + + status + 0 + version + 1.0.13 + + cps_service + + status + 1 + version + 2.0.4 + + + + diff --git a/star_lock/ios/Runner/AppDelegate.h b/star_lock/ios/Runner/AppDelegate.h index 36e21bbf..d16620c4 100644 --- a/star_lock/ios/Runner/AppDelegate.h +++ b/star_lock/ios/Runner/AppDelegate.h @@ -1,6 +1,50 @@ #import #import -@interface AppDelegate : FlutterAppDelegate +#import +#import +#import +#include +#import +#import + +#import "sysInfo.h" +#import "UdpHelper.h" +#import "talk_Class.h" +#import "Call.h" +#import "P2pTest.h" +#import "Opendoor.h" +#import "HKHTextField.h" +#import + +#define SoundOK 0 +#define SoundNotice 1 +#define SoundError 2 +#define SoundAlarm 3 +#define SoundRing 4 + +@interface AppDelegate : FlutterAppDelegate + +@property (strong, nonatomic) UIWindow *window; +@property (strong, nonatomic) Opendoor *main; +@property (strong, nonatomic) Call *callOut; +@property (strong, nonatomic) P2pTest *p2ptest; +@property (strong, nonatomic) AVAudioPlayer *audioPlayer; +@property (nonatomic) BOOL isBack; +@property (nonatomic) BOOL TalkSendAudio; + +@property sqlite3 *db; +@property (strong, nonatomic) sysInfo *sysinfo; +@property (strong, nonatomic) UdpHelper *udp; +@property (strong, nonatomic) talk_Class *talk; +@property (strong, nonatomic) HKHTextField *activeTextField; + + +- (void)playSoundWith:(NSInteger)mode; +- (void)OpenDoorSucc:(NSString *)equid; +- (void)OpenDoorFail:(NSString *)equid; +- (void)ring; +- (void)ring_stop; + @end diff --git a/star_lock/ios/Runner/AppDelegate.m b/star_lock/ios/Runner/AppDelegate.m index 9156fe49..75342698 100644 --- a/star_lock/ios/Runner/AppDelegate.m +++ b/star_lock/ios/Runner/AppDelegate.m @@ -1,16 +1,291 @@ #import "AppDelegate.h" -#import "GeneratedPluginRegistrant.h" -#import "XSFlutterManager.h" -#import "CommonDefine.h" -@implementation AppDelegate +#import "GeneratedPluginRegistrant.h" +#import "CommonDefine.h" +#import "XSFlutterManager.h" + +#import "Sformat.h" +#import "Pub.h" +#import "Msg.h" +#import "VideoTalkManager.h" +#import +#import "BaseViewController.h" + + +@interface AppDelegate() + +@end + +@implementation AppDelegate { + SystemSoundID okSound; + SystemSoundID noticeSound; + SystemSoundID errorSound; + SystemSoundID alarmSound; + SystemSoundID ringSound; +} + +@synthesize sysinfo; +@synthesize db; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - XSFlutterManager * VC = [[XSFlutterManager alloc]init]; + + [self initCloudPush]; + [CloudPushSDK sendNotificationAck:launchOptions]; + XSFlutterManager *VC = [[XSFlutterManager alloc] init]; self.window.rootViewController = VC; [self.window makeKeyAndVisible]; + + [self initSound]; + _udp = [[UdpHelper alloc] init]; + [_udp Open]; + _talk = [[talk_Class alloc] init]; + + sysinfo.launchtime = [Sformat timestamp]; + + return YES; } +- (void)initCloudPush { + // SDK初始化 + [CloudPushSDK asyncInit:@"333904046" appSecret:@"3eead09a7fc7416cb4082319aa6f48c6" callback:^(CloudPushCallbackResult *res) { + if (res.success) { + NSLog(@"Push SDK init success, deviceId: %@.", [CloudPushSDK getDeviceId]); + } else { + NSLog(@"Push SDK init failed, error: %@", res.error); + } + }]; +} + +/** + * 注册苹果推送,获取deviceToken用于推送 + * + * @param application + */ +- (void)registerAPNS:(UIApplication *)application { + if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) { + // iOS 8 Notifications + [application registerUserNotificationSettings: + [UIUserNotificationSettings settingsForTypes: + (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) + categories:nil]]; + [application registerForRemoteNotifications]; + } + else { + // iOS < 8 Notifications + [[UIApplication sharedApplication] registerForRemoteNotificationTypes: + (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; + } +} +/* + * 苹果推送注册成功回调,将苹果返回的deviceToken上传到CloudPush服务器 + */ +- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { + [CloudPushSDK registerDevice:deviceToken withCallback:^(CloudPushCallbackResult *res) { + if (res.success) { + NSLog(@"Register deviceToken success."); + } else { + NSLog(@"Register deviceToken failed, error: %@", res.error); + } + }]; +} +/* + * 苹果推送注册失败回调 + */ +- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { + NSLog(@"didFailToRegisterForRemoteNotificationsWithError %@", error); +} + +/** + * 注册推送消息到来监听 + */ +- (void)registerMessageReceive { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(onMessageReceived:) + name:@"CCPDidReceiveMessageNotification" + object:nil]; +} +/** + * 处理到来推送消息 + * + * @param notification + */ +- (void)onMessageReceived:(NSNotification *)notification { + CCPSysMessage *message = [notification object]; + NSString *title = [[NSString alloc] initWithData:message.title encoding:NSUTF8StringEncoding]; + NSString *body = [[NSString alloc] initWithData:message.body encoding:NSUTF8StringEncoding]; + NSLog(@"Receive message title: %@, content: %@.", title, body); +} + +//- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { +// // 点击通知将App从关闭状态启动时,将通知打开回执上报 +// // [CloudPushSDK handleLaunching:launchOptions];(Deprecated from v1.8.1) +// [CloudPushSDK sendNotificationAck:launchOptions]; +// return YES; +//} +/* + * App处于启动状态时,通知打开回调 + */ +- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo { + NSLog(@"Receive one notification."); + // 取得APNS通知内容 + NSDictionary *aps = [userInfo valueForKey:@"aps"]; + // 内容 + NSString *content = [aps valueForKey:@"alert"]; + // badge数量 + NSInteger badge = [[aps valueForKey:@"badge"] integerValue]; + // 播放声音 + NSString *sound = [aps valueForKey:@"sound"]; + // 取得Extras字段内容 + NSString *Extras = [userInfo valueForKey:@"Extras"]; //服务端中Extras字段,key是自己定义的 + NSLog(@"content = [%@], badge = [%ld], sound = [%@], Extras = [%@]", content, (long)badge, sound, Extras); + // iOS badge 清0 + application.applicationIconBadgeNumber = 0; + // 通知打开回执上报 + // [CloudPushSDK handleReceiveRemoteNotification:userInfo];(Deprecated from v1.8.1) + [CloudPushSDK sendNotificationAck:userInfo]; +} + +- (void)initSound +{ + + CFURLRef okURL = (CFURLRef)CFBridgingRetain([NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"ok" ofType:@"wav"]]); + CFURLRef noticeURL = (CFURLRef)CFBridgingRetain([NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"notice" ofType:@"wav"]]); + CFURLRef errURL = (CFURLRef)CFBridgingRetain([NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"err" ofType:@"wav"]]); + CFURLRef alarmURL = (CFURLRef)CFBridgingRetain([NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"alarm" ofType:@"wav"]]); + CFURLRef ringURL = (CFURLRef)CFBridgingRetain([NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"notice" ofType:@"wav"]]); + + AudioServicesCreateSystemSoundID(okURL, &okSound); + AudioServicesCreateSystemSoundID(noticeURL, ¬iceSound); + AudioServicesCreateSystemSoundID(errURL, &errorSound); + AudioServicesCreateSystemSoundID(alarmURL, &alarmSound); + AudioServicesCreateSystemSoundID(ringURL, &ringSound); + AudioServicesPropertyID flag = 0; //0 means always play + AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(SystemSoundID), &okSound, sizeof(AudioServicesPropertyID), &flag); + AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(SystemSoundID), ¬iceSound, sizeof(AudioServicesPropertyID), &flag); + AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(SystemSoundID), &errorSound, sizeof(AudioServicesPropertyID), &flag); + AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(SystemSoundID), &alarmSound, sizeof(AudioServicesPropertyID), &flag); + AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(SystemSoundID), &ringSound, sizeof(AudioServicesPropertyID), &flag); + + CFBridgingRelease(okURL); + CFBridgingRelease(noticeURL); + CFBridgingRelease(errURL); + CFBridgingRelease(alarmURL); + CFBridgingRelease(ringURL); +} + + +- (void)playSoundWith:(NSInteger)mode +{ + dispatch_async(dispatch_get_main_queue(), ^{//转到主线程处理 + if ([MPMusicPlayerController systemMusicPlayer].playbackState == MPMusicPlaybackStatePlaying) { + NSLog(@"play ServicesPlayAlertSound ..."); + switch (mode) { + case SoundOK: + AudioServicesPlayAlertSound(self->okSound); + break; + case SoundNotice: + AudioServicesPlayAlertSound(self->noticeSound); + break; + case SoundError: + AudioServicesPlayAlertSound(self->errorSound); + break; + case SoundAlarm: + AudioServicesPlayAlertSound(self->alarmSound); + break; + case SoundRing: + AudioServicesPlayAlertSound(self->ringSound); + break; + default: + break; + } + + } + else + { + NSLog(@"play ServicesPlaySystemSound ..."); + switch (mode) { + case SoundOK: + AudioServicesPlaySystemSound(self->okSound); + break; + case SoundNotice: + AudioServicesPlaySystemSound(self->noticeSound); + break; + case SoundError: + AudioServicesPlaySystemSound(self->errorSound); + break; + case SoundAlarm: + AudioServicesPlayAlertSound(self->alarmSound); + break; + case SoundRing: + AudioServicesPlayAlertSound(self->ringSound); + break; + default: + break; + } + } + }); + +} +- (void)ring +{ + if (!self.isBack)[self playaudio]; + //if (!self.isBack)[self playSoundWith:SoundRing]; + +} + +- (void)ring_stop +{ + + if(self.audioPlayer != nil) { + [self.audioPlayer stop]; + self.audioPlayer = nil; + } + AVAudioSession *session = [AVAudioSession sharedInstance]; + [session setActive:YES error:nil]; + [session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; + +} + +- (void)playaudio +{ + AVAudioSession *session = [AVAudioSession sharedInstance]; + [session setActive:YES error:nil]; + [session setCategory:AVAudioSessionCategoryPlayback error:nil]; + //播放背景音乐 + NSString *musicPath = [[NSBundle mainBundle] pathForResource:@"ring1" ofType:@"mp3"]; + + NSURL *url = [[NSURL alloc] initFileURLWithPath:musicPath]; + + // 创建播放器 + self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; + //[url release]; + [self.audioPlayer prepareToPlay]; + + [self.audioPlayer setVolume:.5]; + self.audioPlayer.numberOfLoops = -1; //设置音乐播放次数 -1为一直循环 + [self.audioPlayer play]; //播放 + NSLog(@"playaudio"); +} + +- (void)OpenDoorSucc:(NSString *)equid{ + if(self.callOut){ + [self.callOut alert:@"开门成功"]; + } + + [self playSoundWith:SoundOK]; + [self.sysinfo SaveRecord:[Sformat timestamp] Type:@"开门" Equ:equid Img:@"" Note:@"成功"]; +} +- (void)OpenDoorFail:(NSString *)equid{ + if(self.callOut){ + [self.callOut alert:@"开门失败"]; + NSLog(@"通话中开门失败"); + } + + [self playSoundWith:SoundError]; + [self.sysinfo SaveRecord:[Sformat timestamp] Type:@"开门" Equ:equid Img:@"" Note:@"失败"]; +} + + @end diff --git a/star_lock/ios/Runner/CommonDefine.h b/star_lock/ios/Runner/CommonDefine.h index 08bcda1d..f8dfb8e8 100644 --- a/star_lock/ios/Runner/CommonDefine.h +++ b/star_lock/ios/Runner/CommonDefine.h @@ -10,10 +10,11 @@ /** 信号通道,须与flutter里一致*/ -#define flutterMethodChannel @"flutter_native_ios" +#define XSflutterMethodChannel @"flutter_native_ios" /** 交互方法字段名,须与flutter里一致*/ -#define flutterMethodSharePassword @"flutter_sharePassword_to_ios" -#define flutterMethodPresent @"flutter_present_to_ios" +#define XSflutterMethodSharePassword @"flutter_sharePassword_to_ios"//分享密码 +#define XSflutterMethodPresent @"flutter_present_to_ios" +#define XSflutterMethodVideoTalk @"flutter_videoTalk_to_ios"//视频对讲 #endif /* CommonDefine_h */ diff --git a/star_lock/ios/Runner/Runner.entitlements b/star_lock/ios/Runner/Runner.entitlements index c9a86ce0..ccc11436 100644 --- a/star_lock/ios/Runner/Runner.entitlements +++ b/star_lock/ios/Runner/Runner.entitlements @@ -2,6 +2,8 @@ + aps-environment + development com.apple.external-accessory.wireless-configuration diff --git a/star_lock/ios/Runner/XSFlutterManager.h b/star_lock/ios/Runner/XSFlutterManager.h index 2be71177..b21284ce 100644 --- a/star_lock/ios/Runner/XSFlutterManager.h +++ b/star_lock/ios/Runner/XSFlutterManager.h @@ -7,10 +7,35 @@ #import +#import "sysInfo.h" +#import "UdpHelper.h" +#import "talk_Class.h" +#import "Call.h" +#import "P2pTest.h" +#import "Opendoor.h" +#import "HKHTextField.h" +#import "Pub.h" +#import "Sformat.h" + + NS_ASSUME_NONNULL_BEGIN + +#define SoundOK 0 +#define SoundNotice 1 +#define SoundError 2 +#define SoundAlarm 3 +#define SoundRing 4 + + @interface XSFlutterManager : FlutterViewController +@property (strong, nonatomic) sysInfo *sysinfo; +@property (strong, nonatomic) UdpHelper *udp; +@property (strong, nonatomic) talk_Class *talk; +@property (strong, nonatomic) HKHTextField *activeTextField; + + @end NS_ASSUME_NONNULL_END diff --git a/star_lock/ios/Runner/XSFlutterManager.m b/star_lock/ios/Runner/XSFlutterManager.m index 8d037ec6..a3363373 100644 --- a/star_lock/ios/Runner/XSFlutterManager.m +++ b/star_lock/ios/Runner/XSFlutterManager.m @@ -17,69 +17,122 @@ @end -@implementation XSFlutterManager +@implementation XSFlutterManager{ + SystemSoundID okSound; + SystemSoundID noticeSound; + SystemSoundID errorSound; + SystemSoundID alarmSound; + SystemSoundID ringSound; +} + +@synthesize sysinfo; +//@synthesize db; - (void)viewDidLoad { [super viewDidLoad]; self.textToShare = [[NSString alloc] init]; - + [self methodChannelFunction]; } - (void)methodChannelFunction { //创建 FlutterMethodChannel self.methodChannel = [FlutterMethodChannel - methodChannelWithName:flutterMethodChannel binaryMessenger:self]; + methodChannelWithName:XSflutterMethodChannel binaryMessenger:self]; //设置监听 - [self.methodChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) { + [self.methodChannel setMethodCallHandler:^(FlutterMethodCall* methodCall, FlutterResult result) { // TODO - NSString *method=call.method; + NSString *method=methodCall.method; //调用系统分享 - if ([method isEqualToString:flutterMethodSharePassword]) { - id params = call.arguments; + if ([method isEqualToString:XSflutterMethodSharePassword]) { + id params = methodCall.arguments; self.textToShare = @"您好,您的密码是:"; - if ([params isKindOfClass:[NSDictionary class]]) { - NSDictionary *paramDic = (NSDictionary *)params; - //分享的标题 - self.textToShare = paramDic[@"pwdShareStr"]; - } - //分享的url - NSURL *urlToShare = [NSURL URLWithString:@"https://pre.lock.star-lock.cn:8093/login"]; - - //在这里呢 如果想分享图片 就把图片添加进去 文字什么的通上 - NSArray *activityItems = @[self.textToShare,urlToShare]; - - UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil]; - - //不出现在活动项目 - activityVC.excludedActivityTypes = @[UIActivityTypePrint]; - [self presentViewController:activityVC animated:YES completion:nil]; - - // 分享之后的回调 - activityVC.completionWithItemsHandler = ^(UIActivityType _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) { + if ([params isKindOfClass:[NSDictionary class]]) { + NSDictionary *paramDic = (NSDictionary *)params; + //分享的标题 + self.textToShare = paramDic[@"pwdShareStr"]; + } + //分享的url + NSURL *urlToShare = [NSURL URLWithString:@"https://pre.lock.star-lock.cn:8093/login"]; + + //在这里呢 如果想分享图片 就把图片添加进去 文字什么的通上 + NSArray *activityItems = @[self.textToShare,urlToShare]; + + UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil]; + + //不出现在活动项目 + activityVC.excludedActivityTypes = @[UIActivityTypePrint]; + // [self presentViewController:activityVC animated:YES completion:nil]; + [[Pub getApp].window.rootViewController presentViewController:activityVC animated:YES completion:nil]; + + // 分享之后的回调 + activityVC.completionWithItemsHandler = ^(UIActivityType _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) { if (completed) { - NSLog(@"completed"); - //分享 成功 - } else { - NSLog(@"cancled"); - //分享 取消 - } - - }; - + }; result(@"push返回到flutter"); + } else if ([method isEqualToString:XSflutterMethodVideoTalk]) { + id params = methodCall.arguments; + if ([params isKindOfClass:[NSDictionary class]]) { + NSDictionary *paramDic = (NSDictionary *)params; + NSLog(@"得到了参数%@", paramDic[@"videoTalk"]); + } + + sysinfo = [[sysInfo alloc] init]; + [sysinfo initDB]; + [sysinfo readSystemInfo]; + +// BaseViewController * VC = [[BaseViewController alloc]init]; +// [Pub getApp].window.rootViewController = VC; +// [[Pub getApp].window makeKeyAndVisible]; + + [self initSound]; + _udp = [[UdpHelper alloc] init]; + [_udp Open]; + _talk = [[talk_Class alloc] init]; + + sysinfo.launchtime = [Sformat timestamp]; } }]; [GeneratedPluginRegistrant registerWithRegistry:self]; } + +- (void)initSound +{ + + CFURLRef okURL = (CFURLRef)CFBridgingRetain([NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"ok" ofType:@"wav"]]); + CFURLRef noticeURL = (CFURLRef)CFBridgingRetain([NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"notice" ofType:@"wav"]]); + CFURLRef errURL = (CFURLRef)CFBridgingRetain([NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"err" ofType:@"wav"]]); + CFURLRef alarmURL = (CFURLRef)CFBridgingRetain([NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"alarm" ofType:@"wav"]]); + CFURLRef ringURL = (CFURLRef)CFBridgingRetain([NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"notice" ofType:@"wav"]]); + + AudioServicesCreateSystemSoundID(okURL, &okSound); + AudioServicesCreateSystemSoundID(noticeURL, ¬iceSound); + AudioServicesCreateSystemSoundID(errURL, &errorSound); + AudioServicesCreateSystemSoundID(alarmURL, &alarmSound); + AudioServicesCreateSystemSoundID(ringURL, &ringSound); + AudioServicesPropertyID flag = 0; //0 means always play + AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(SystemSoundID), &okSound, sizeof(AudioServicesPropertyID), &flag); + AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(SystemSoundID), ¬iceSound, sizeof(AudioServicesPropertyID), &flag); + AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(SystemSoundID), &errorSound, sizeof(AudioServicesPropertyID), &flag); + AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(SystemSoundID), &alarmSound, sizeof(AudioServicesPropertyID), &flag); + AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(SystemSoundID), &ringSound, sizeof(AudioServicesPropertyID), &flag); + + CFBridgingRelease(okURL); + CFBridgingRelease(noticeURL); + CFBridgingRelease(errURL); + CFBridgingRelease(alarmURL); + CFBridgingRelease(ringURL); +} + + -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:YES]; @@ -92,13 +145,13 @@ /* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ + #pragma mark - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. + } + */ @end diff --git a/star_lock/ios/Runner/XSTalkManager/External/AsyncSocket.h b/star_lock/ios/Runner/XSTalkManager/External/AsyncSocket.h new file mode 100755 index 00000000..335166b4 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/External/AsyncSocket.h @@ -0,0 +1,657 @@ +// +// AsyncSocket.h +// +// This class is in the public domain. +// Originally created by Dustin Voss on Wed Jan 29 2003. +// Updated and maintained by Deusty Designs and the Mac development community. +// +// http://code.google.com/p/cocoaasyncsocket/ +// + +#import + +@class AsyncSocket; +@class AsyncReadPacket; +@class AsyncWritePacket; + +extern NSString *const AsyncSocketException; +extern NSString *const AsyncSocketErrorDomain; + +typedef NS_ENUM(NSInteger, AsyncSocketError) { + AsyncSocketCFSocketError = kCFSocketError, // From CFSocketError enum. + AsyncSocketNoError = 0, // Never used. + AsyncSocketCanceledError, // onSocketWillConnect: returned NO. + AsyncSocketConnectTimeoutError, + AsyncSocketReadMaxedOutError, // Reached set maxLength without completing + AsyncSocketReadTimeoutError, + AsyncSocketWriteTimeoutError +}; + +@protocol AsyncSocketDelegate +@optional + +/** + * In the event of an error, the socket is closed. + * You may call "unreadData" during this call-back to get the last bit of data off the socket. + * When connecting, this delegate method may be called + * before"onSocket:didAcceptNewSocket:" or "onSocket:didConnectToHost:". +**/ +- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err; + +/** + * Called when a socket disconnects with or without error. If you want to release a socket after it disconnects, + * do so here. It is not safe to do that during "onSocket:willDisconnectWithError:". + * + * If you call the disconnect method, and the socket wasn't already disconnected, + * this delegate method will be called before the disconnect method returns. +**/ +- (void)onSocketDidDisconnect:(AsyncSocket *)sock; + +/** + * Called when a socket accepts a connection. Another socket is spawned to handle it. The new socket will have + * the same delegate and will call "onSocket:didConnectToHost:port:". +**/ +- (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket; + +/** + * Called when a new socket is spawned to handle a connection. This method should return the run-loop of the + * thread on which the new socket and its delegate should operate. If omitted, [NSRunLoop currentRunLoop] is used. +**/ +- (NSRunLoop *)onSocket:(AsyncSocket *)sock wantsRunLoopForNewSocket:(AsyncSocket *)newSocket; + +/** + * Called when a socket is about to connect. This method should return YES to continue, or NO to abort. + * If aborted, will result in AsyncSocketCanceledError. + * + * If the connectToHost:onPort:error: method was called, the delegate will be able to access and configure the + * CFReadStream and CFWriteStream as desired prior to connection. + * + * If the connectToAddress:error: method was called, the delegate will be able to access and configure the + * CFSocket and CFSocketNativeHandle (BSD socket) as desired prior to connection. You will be able to access and + * configure the CFReadStream and CFWriteStream in the onSocket:didConnectToHost:port: method. +**/ +- (BOOL)onSocketWillConnect:(AsyncSocket *)sock; + +/** + * Called when a socket connects and is ready for reading and writing. + * The host parameter will be an IP address, not a DNS name. +**/ +- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port; + +/** + * Called when a socket has completed reading the requested data into memory. + * Not called if there is an error. +**/ +- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag; + +/** + * Called when a socket has read in data, but has not yet completed the read. + * This would occur if using readToData: or readToLength: methods. + * It may be used to for things such as updating progress bars. +**/ +- (void)onSocket:(AsyncSocket *)sock didReadPartialDataOfLength:(NSUInteger)partialLength tag:(long)tag; + +/** + * Called when a socket has completed writing the requested data. Not called if there is an error. +**/ +- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag; + +/** + * Called when a socket has written some data, but has not yet completed the entire write. + * It may be used to for things such as updating progress bars. +**/ +- (void)onSocket:(AsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)tag; + +/** + * Called if a read operation has reached its timeout without completing. + * This method allows you to optionally extend the timeout. + * If you return a positive time interval (> 0) the read's timeout will be extended by the given amount. + * If you don't implement this method, or return a non-positive time interval (<= 0) the read will timeout as usual. + * + * The elapsed parameter is the sum of the original timeout, plus any additions previously added via this method. + * The length parameter is the number of bytes that have been read so far for the read operation. + * + * Note that this method may be called multiple times for a single read if you return positive numbers. +**/ +- (NSTimeInterval)onSocket:(AsyncSocket *)sock + shouldTimeoutReadWithTag:(long)tag + elapsed:(NSTimeInterval)elapsed + bytesDone:(NSUInteger)length; + +/** + * Called if a write operation has reached its timeout without completing. + * This method allows you to optionally extend the timeout. + * If you return a positive time interval (> 0) the write's timeout will be extended by the given amount. + * If you don't implement this method, or return a non-positive time interval (<= 0) the write will timeout as usual. + * + * The elapsed parameter is the sum of the original timeout, plus any additions previously added via this method. + * The length parameter is the number of bytes that have been written so far for the write operation. + * + * Note that this method may be called multiple times for a single write if you return positive numbers. +**/ +- (NSTimeInterval)onSocket:(AsyncSocket *)sock + shouldTimeoutWriteWithTag:(long)tag + elapsed:(NSTimeInterval)elapsed + bytesDone:(NSUInteger)length; + +/** + * Called after the socket has successfully completed SSL/TLS negotiation. + * This method is not called unless you use the provided startTLS method. + * + * If a SSL/TLS negotiation fails (invalid certificate, etc) then the socket will immediately close, + * and the onSocket:willDisconnectWithError: delegate method will be called with the specific SSL error code. +**/ +- (void)onSocketDidSecure:(AsyncSocket *)sock; + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@interface AsyncSocket : NSObject +{ + CFSocketNativeHandle theNativeSocket4; + CFSocketNativeHandle theNativeSocket6; + + CFSocketRef theSocket4; // IPv4 accept or connect socket + CFSocketRef theSocket6; // IPv6 accept or connect socket + + CFReadStreamRef theReadStream; + CFWriteStreamRef theWriteStream; + + CFRunLoopSourceRef theSource4; // For theSocket4 + CFRunLoopSourceRef theSource6; // For theSocket6 + CFRunLoopRef theRunLoop; + CFSocketContext theContext; + NSArray *theRunLoopModes; + + NSTimer *theConnectTimer; + + NSMutableArray *theReadQueue; + AsyncReadPacket *theCurrentRead; + NSTimer *theReadTimer; + NSMutableData *partialReadBuffer; + + NSMutableArray *theWriteQueue; + AsyncWritePacket *theCurrentWrite; + NSTimer *theWriteTimer; + + id theDelegate; + UInt16 theFlags; + + long theUserData; +} + +- (id)init; +- (id)initWithDelegate:(id)delegate; +- (id)initWithDelegate:(id)delegate userData:(long)userData; + +/* String representation is long but has no "\n". */ +- (NSString *)description; + +/** + * Use "canSafelySetDelegate" to see if there is any pending business (reads and writes) with the current delegate + * before changing it. It is, of course, safe to change the delegate before connecting or accepting connections. +**/ +- (id)delegate; +- (BOOL)canSafelySetDelegate; +- (void)setDelegate:(id)delegate; + +/* User data can be a long, or an id or void * cast to a long. */ +- (long)userData; +- (void)setUserData:(long)userData; + +/* Don't use these to read or write. And don't close them either! */ +- (CFSocketRef)getCFSocket; +- (CFReadStreamRef)getCFReadStream; +- (CFWriteStreamRef)getCFWriteStream; + +// Once one of the accept or connect methods are called, the AsyncSocket instance is locked in +// and the other accept/connect methods can't be called without disconnecting the socket first. +// If the attempt fails or times out, these methods either return NO or +// call "onSocket:willDisconnectWithError:" and "onSockedDidDisconnect:". + +// When an incoming connection is accepted, AsyncSocket invokes several delegate methods. +// These methods are (in chronological order): +// 1. onSocket:didAcceptNewSocket: +// 2. onSocket:wantsRunLoopForNewSocket: +// 3. onSocketWillConnect: +// +// Your server code will need to retain the accepted socket (if you want to accept it). +// The best place to do this is probably in the onSocket:didAcceptNewSocket: method. +// +// After the read and write streams have been setup for the newly accepted socket, +// the onSocket:didConnectToHost:port: method will be called on the proper run loop. +// +// Multithreading Note: If you're going to be moving the newly accepted socket to another run +// loop by implementing onSocket:wantsRunLoopForNewSocket:, then you should wait until the +// onSocket:didConnectToHost:port: method before calling read, write, or startTLS methods. +// Otherwise read/write events are scheduled on the incorrect runloop, and chaos may ensue. + +/** + * Tells the socket to begin listening and accepting connections on the given port. + * When a connection comes in, the AsyncSocket instance will call the various delegate methods (see above). + * The socket will listen on all available interfaces (e.g. wifi, ethernet, etc) +**/ +- (BOOL)acceptOnPort:(UInt16)port error:(NSError **)errPtr; + +/** + * This method is the same as acceptOnPort:error: with the additional option + * of specifying which interface to listen on. So, for example, if you were writing code for a server that + * has multiple IP addresses, you could specify which address you wanted to listen on. Or you could use it + * to specify that the socket should only accept connections over ethernet, and not other interfaces such as wifi. + * You may also use the special strings "localhost" or "loopback" to specify that + * the socket only accept connections from the local machine. + * + * To accept connections on any interface pass nil, or simply use the acceptOnPort:error: method. +**/ +- (BOOL)acceptOnInterface:(NSString *)interface port:(UInt16)port error:(NSError **)errPtr; + +/** + * Connects to the given host and port. + * The host may be a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2") +**/ +- (BOOL)connectToHost:(NSString *)hostname onPort:(UInt16)port error:(NSError **)errPtr; + +/** + * This method is the same as connectToHost:onPort:error: with an additional timeout option. + * To not time out use a negative time interval, or simply use the connectToHost:onPort:error: method. +**/ +- (BOOL)connectToHost:(NSString *)hostname + onPort:(UInt16)port + withTimeout:(NSTimeInterval)timeout + error:(NSError **)errPtr; + +/** + * Connects to the given address, specified as a sockaddr structure wrapped in a NSData object. + * For example, a NSData object returned from NSNetService's addresses method. + * + * If you have an existing struct sockaddr you can convert it to a NSData object like so: + * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len]; + * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len]; +**/ +- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr; + +/** + * This method is the same as connectToAddress:error: with an additional timeout option. + * To not time out use a negative time interval, or simply use the connectToAddress:error: method. +**/ +- (BOOL)connectToAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr; + +- (BOOL)connectToAddress:(NSData *)remoteAddr + viaInterfaceAddress:(NSData *)interfaceAddr + withTimeout:(NSTimeInterval)timeout + error:(NSError **)errPtr; + +/** + * Disconnects immediately. Any pending reads or writes are dropped. + * If the socket is not already disconnected, the onSocketDidDisconnect delegate method + * will be called immediately, before this method returns. + * + * Please note the recommended way of releasing an AsyncSocket instance (e.g. in a dealloc method) + * [asyncSocket setDelegate:nil]; + * [asyncSocket disconnect]; + * [asyncSocket release]; +**/ +- (void)disconnect; + +/** + * Disconnects after all pending reads have completed. + * After calling this, the read and write methods will do nothing. + * The socket will disconnect even if there are still pending writes. +**/ +- (void)disconnectAfterReading; + +/** + * Disconnects after all pending writes have completed. + * After calling this, the read and write methods will do nothing. + * The socket will disconnect even if there are still pending reads. +**/ +- (void)disconnectAfterWriting; + +/** + * Disconnects after all pending reads and writes have completed. + * After calling this, the read and write methods will do nothing. +**/ +- (void)disconnectAfterReadingAndWriting; + +/* Returns YES if the socket and streams are open, connected, and ready for reading and writing. */ +- (BOOL)isConnected; + +/** + * Returns the local or remote host and port to which this socket is connected, or nil and 0 if not connected. + * The host will be an IP address. +**/ +- (NSString *)connectedHost; +- (UInt16)connectedPort; + +- (NSString *)localHost; +- (UInt16)localPort; + +/** + * Returns the local or remote address to which this socket is connected, + * specified as a sockaddr structure wrapped in a NSData object. + * + * See also the connectedHost, connectedPort, localHost and localPort methods. +**/ +- (NSData *)connectedAddress; +- (NSData *)localAddress; + +/** + * Returns whether the socket is IPv4 or IPv6. + * An accepting socket may be both. +**/ +- (BOOL)isIPv4; +- (BOOL)isIPv6; + +// The readData and writeData methods won't block (they are asynchronous). +// +// When a read is complete the onSocket:didReadData:withTag: delegate method is called. +// When a write is complete the onSocket:didWriteDataWithTag: delegate method is called. +// +// You may optionally set a timeout for any read/write operation. (To not timeout, use a negative time interval.) +// If a read/write opertion times out, the corresponding "onSocket:shouldTimeout..." delegate method +// is called to optionally allow you to extend the timeout. +// Upon a timeout, the "onSocket:willDisconnectWithError:" method is called, followed by "onSocketDidDisconnect". +// +// The tag is for your convenience. +// You can use it as an array index, step number, state id, pointer, etc. + +/** + * Reads the first available bytes that become available on the socket. + * + * If the timeout value is negative, the read operation will not use a timeout. +**/ +- (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag; + +/** + * Reads the first available bytes that become available on the socket. + * The bytes will be appended to the given byte buffer starting at the given offset. + * The given buffer will automatically be increased in size if needed. + * + * If the timeout value is negative, the read operation will not use a timeout. + * If the buffer if nil, the socket will create a buffer for you. + * + * If the bufferOffset is greater than the length of the given buffer, + * the method will do nothing, and the delegate will not be called. + * + * If you pass a buffer, you must not alter it in any way while AsyncSocket is using it. + * After completion, the data returned in onSocket:didReadData:withTag: will be a subset of the given buffer. + * That is, it will reference the bytes that were appended to the given buffer. +**/ +- (void)readDataWithTimeout:(NSTimeInterval)timeout + buffer:(NSMutableData *)buffer + bufferOffset:(NSUInteger)offset + tag:(long)tag; + +/** + * Reads the first available bytes that become available on the socket. + * The bytes will be appended to the given byte buffer starting at the given offset. + * The given buffer will automatically be increased in size if needed. + * A maximum of length bytes will be read. + * + * If the timeout value is negative, the read operation will not use a timeout. + * If the buffer if nil, a buffer will automatically be created for you. + * If maxLength is zero, no length restriction is enforced. + * + * If the bufferOffset is greater than the length of the given buffer, + * the method will do nothing, and the delegate will not be called. + * + * If you pass a buffer, you must not alter it in any way while AsyncSocket is using it. + * After completion, the data returned in onSocket:didReadData:withTag: will be a subset of the given buffer. + * That is, it will reference the bytes that were appended to the given buffer. +**/ +- (void)readDataWithTimeout:(NSTimeInterval)timeout + buffer:(NSMutableData *)buffer + bufferOffset:(NSUInteger)offset + maxLength:(NSUInteger)length + tag:(long)tag; + +/** + * Reads the given number of bytes. + * + * If the timeout value is negative, the read operation will not use a timeout. + * + * If the length is 0, this method does nothing and the delegate is not called. +**/ +- (void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag; + +/** + * Reads the given number of bytes. + * The bytes will be appended to the given byte buffer starting at the given offset. + * The given buffer will automatically be increased in size if needed. + * + * If the timeout value is negative, the read operation will not use a timeout. + * If the buffer if nil, a buffer will automatically be created for you. + * + * If the length is 0, this method does nothing and the delegate is not called. + * If the bufferOffset is greater than the length of the given buffer, + * the method will do nothing, and the delegate will not be called. + * + * If you pass a buffer, you must not alter it in any way while AsyncSocket is using it. + * After completion, the data returned in onSocket:didReadData:withTag: will be a subset of the given buffer. + * That is, it will reference the bytes that were appended to the given buffer. +**/ +- (void)readDataToLength:(NSUInteger)length + withTimeout:(NSTimeInterval)timeout + buffer:(NSMutableData *)buffer + bufferOffset:(NSUInteger)offset + tag:(long)tag; + +/** + * Reads bytes until (and including) the passed "data" parameter, which acts as a separator. + * + * If the timeout value is negative, the read operation will not use a timeout. + * + * If you pass nil or zero-length data as the "data" parameter, + * the method will do nothing, and the delegate will not be called. + * + * To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter. + * Note that this method is not character-set aware, so if a separator can occur naturally as part of the encoding for + * a character, the read will prematurely end. +**/ +- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag; + +/** + * Reads bytes until (and including) the passed "data" parameter, which acts as a separator. + * The bytes will be appended to the given byte buffer starting at the given offset. + * The given buffer will automatically be increased in size if needed. + * + * If the timeout value is negative, the read operation will not use a timeout. + * If the buffer if nil, a buffer will automatically be created for you. + * + * If the bufferOffset is greater than the length of the given buffer, + * the method will do nothing, and the delegate will not be called. + * + * If you pass a buffer, you must not alter it in any way while AsyncSocket is using it. + * After completion, the data returned in onSocket:didReadData:withTag: will be a subset of the given buffer. + * That is, it will reference the bytes that were appended to the given buffer. + * + * To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter. + * Note that this method is not character-set aware, so if a separator can occur naturally as part of the encoding for + * a character, the read will prematurely end. +**/ +- (void)readDataToData:(NSData *)data + withTimeout:(NSTimeInterval)timeout + buffer:(NSMutableData *)buffer + bufferOffset:(NSUInteger)offset + tag:(long)tag; + +/** + * Reads bytes until (and including) the passed "data" parameter, which acts as a separator. + * + * If the timeout value is negative, the read operation will not use a timeout. + * + * If maxLength is zero, no length restriction is enforced. + * Otherwise if maxLength bytes are read without completing the read, + * it is treated similarly to a timeout - the socket is closed with a AsyncSocketReadMaxedOutError. + * The read will complete successfully if exactly maxLength bytes are read and the given data is found at the end. + * + * If you pass nil or zero-length data as the "data" parameter, + * the method will do nothing, and the delegate will not be called. + * If you pass a maxLength parameter that is less than the length of the data parameter, + * the method will do nothing, and the delegate will not be called. + * + * To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter. + * Note that this method is not character-set aware, so if a separator can occur naturally as part of the encoding for + * a character, the read will prematurely end. +**/ +- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout maxLength:(NSUInteger)length tag:(long)tag; + +/** + * Reads bytes until (and including) the passed "data" parameter, which acts as a separator. + * The bytes will be appended to the given byte buffer starting at the given offset. + * The given buffer will automatically be increased in size if needed. + * A maximum of length bytes will be read. + * + * If the timeout value is negative, the read operation will not use a timeout. + * If the buffer if nil, a buffer will automatically be created for you. + * + * If maxLength is zero, no length restriction is enforced. + * Otherwise if maxLength bytes are read without completing the read, + * it is treated similarly to a timeout - the socket is closed with a AsyncSocketReadMaxedOutError. + * The read will complete successfully if exactly maxLength bytes are read and the given data is found at the end. + * + * If you pass a maxLength parameter that is less than the length of the data parameter, + * the method will do nothing, and the delegate will not be called. + * If the bufferOffset is greater than the length of the given buffer, + * the method will do nothing, and the delegate will not be called. + * + * If you pass a buffer, you must not alter it in any way while AsyncSocket is using it. + * After completion, the data returned in onSocket:didReadData:withTag: will be a subset of the given buffer. + * That is, it will reference the bytes that were appended to the given buffer. + * + * To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter. + * Note that this method is not character-set aware, so if a separator can occur naturally as part of the encoding for + * a character, the read will prematurely end. +**/ +- (void)readDataToData:(NSData *)data + withTimeout:(NSTimeInterval)timeout + buffer:(NSMutableData *)buffer + bufferOffset:(NSUInteger)offset + maxLength:(NSUInteger)length + tag:(long)tag; + +/** + * Writes data to the socket, and calls the delegate when finished. + * + * If you pass in nil or zero-length data, this method does nothing and the delegate will not be called. + * If the timeout value is negative, the write operation will not use a timeout. +**/ +- (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag; + +/** + * Returns progress of current read or write, from 0.0 to 1.0, or NaN if no read/write (use isnan() to check). + * "tag", "done" and "total" will be filled in if they aren't NULL. +**/ +- (float)progressOfReadReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total; +- (float)progressOfWriteReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total; + +/** + * Secures the connection using SSL/TLS. + * + * This method may be called at any time, and the TLS handshake will occur after all pending reads and writes + * are finished. This allows one the option of sending a protocol dependent StartTLS message, and queuing + * the upgrade to TLS at the same time, without having to wait for the write to finish. + * Any reads or writes scheduled after this method is called will occur over the secured connection. + * + * The possible keys and values for the TLS settings are well documented. + * Some possible keys are: + * - kCFStreamSSLLevel + * - kCFStreamSSLAllowsExpiredCertificates + * - kCFStreamSSLAllowsExpiredRoots + * - kCFStreamSSLAllowsAnyRoot + * - kCFStreamSSLValidatesCertificateChain + * - kCFStreamSSLPeerName + * - kCFStreamSSLCertificates + * - kCFStreamSSLIsServer + * + * Please refer to Apple's documentation for associated values, as well as other possible keys. + * + * If you pass in nil or an empty dictionary, the default settings will be used. + * + * The default settings will check to make sure the remote party's certificate is signed by a + * trusted 3rd party certificate agency (e.g. verisign) and that the certificate is not expired. + * However it will not verify the name on the certificate unless you + * give it a name to verify against via the kCFStreamSSLPeerName key. + * The security implications of this are important to understand. + * Imagine you are attempting to create a secure connection to MySecureServer.com, + * but your socket gets directed to MaliciousServer.com because of a hacked DNS server. + * If you simply use the default settings, and MaliciousServer.com has a valid certificate, + * the default settings will not detect any problems since the certificate is valid. + * To properly secure your connection in this particular scenario you + * should set the kCFStreamSSLPeerName property to "MySecureServer.com". + * If you do not know the peer name of the remote host in advance (for example, you're not sure + * if it will be "domain.com" or "www.domain.com"), then you can use the default settings to validate the + * certificate, and then use the X509Certificate class to verify the issuer after the socket has been secured. + * The X509Certificate class is part of the CocoaAsyncSocket open source project. +**/ +- (void)startTLS:(NSDictionary *)tlsSettings; + +/** + * For handling readDataToData requests, data is necessarily read from the socket in small increments. + * The performance can be much improved by allowing AsyncSocket to read larger chunks at a time and + * store any overflow in a small internal buffer. + * This is termed pre-buffering, as some data may be read for you before you ask for it. + * If you use readDataToData a lot, enabling pre-buffering will result in better performance, especially on the iPhone. + * + * The default pre-buffering state is controlled by the DEFAULT_PREBUFFERING definition. + * It is highly recommended one leave this set to YES. + * + * This method exists in case pre-buffering needs to be disabled by default for some unforeseen reason. + * In that case, this method exists to allow one to easily enable pre-buffering when ready. +**/ +- (void)enablePreBuffering; + +/** + * When you create an AsyncSocket, it is added to the runloop of the current thread. + * So for manually created sockets, it is easiest to simply create the socket on the thread you intend to use it. + * + * If a new socket is accepted, the delegate method onSocket:wantsRunLoopForNewSocket: is called to + * allow you to place the socket on a separate thread. This works best in conjunction with a thread pool design. + * + * If, however, you need to move the socket to a separate thread at a later time, this + * method may be used to accomplish the task. + * + * This method must be called from the thread/runloop the socket is currently running on. + * + * Note: After calling this method, all further method calls to this object should be done from the given runloop. + * Also, all delegate calls will be sent on the given runloop. +**/ +- (BOOL)moveToRunLoop:(NSRunLoop *)runLoop; + +/** + * Allows you to configure which run loop modes the socket uses. + * The default set of run loop modes is NSDefaultRunLoopMode. + * + * If you'd like your socket to continue operation during other modes, you may want to add modes such as + * NSModalPanelRunLoopMode or NSEventTrackingRunLoopMode. Or you may simply want to use NSRunLoopCommonModes. + * + * Accepted sockets will automatically inherit the same run loop modes as the listening socket. + * + * Note: NSRunLoopCommonModes is defined in 10.5. For previous versions one can use kCFRunLoopCommonModes. +**/ +- (BOOL)setRunLoopModes:(NSArray *)runLoopModes; +- (BOOL)addRunLoopMode:(NSString *)runLoopMode; +- (BOOL)removeRunLoopMode:(NSString *)runLoopMode; + +/** + * Returns the current run loop modes the AsyncSocket instance is operating in. + * The default set of run loop modes is NSDefaultRunLoopMode. +**/ +- (NSArray *)runLoopModes; + +/** + * In the event of an error, this method may be called during onSocket:willDisconnectWithError: to read + * any data that's left on the socket. +**/ +- (NSData *)unreadData; + +/* A few common line separators, for use with the readDataToData:... methods. */ ++ (NSData *)CRLFData; // 0x0D0A ++ (NSData *)CRData; // 0x0D ++ (NSData *)LFData; // 0x0A ++ (NSData *)ZeroData; // 0x00 + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/External/AsyncSocket.m b/star_lock/ios/Runner/XSTalkManager/External/AsyncSocket.m new file mode 100755 index 00000000..8931679a --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/External/AsyncSocket.m @@ -0,0 +1,4313 @@ +// +// AsyncSocket.m +// +// This class is in the public domain. +// Originally created by Dustin Voss on Wed Jan 29 2003. +// Updated and maintained by Deusty Designs and the Mac development community. +// +// http://code.google.com/p/cocoaasyncsocket/ +// + +#if ! __has_feature(objc_arc) +#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). +#endif + +#import "AsyncSocket.h" +#import +#import +#import +#import +#import + +#if TARGET_OS_IPHONE +// Note: You may need to add the CFNetwork Framework to your project +#import +#endif + +#pragma mark Declarations + +#define DEFAULT_PREBUFFERING YES // Whether pre-buffering is enabled by default + +#define READQUEUE_CAPACITY 5 // Initial capacity +#define WRITEQUEUE_CAPACITY 5 // Initial capacity +#define READALL_CHUNKSIZE 256 // Incremental increase in buffer size +#define WRITE_CHUNKSIZE (1024 * 4) // Limit on size of each write pass + +// AsyncSocket is RunLoop based, and is thus not thread-safe. +// You must always access your AsyncSocket instance from the thread/runloop in which the instance is running. +// You can use methods such as performSelectorOnThread to accomplish this. +// Failure to comply with these thread-safety rules may result in errors. +// You can enable this option to help diagnose where you are incorrectly accessing your socket. +#if DEBUG + #define DEBUG_THREAD_SAFETY 1 +#else + #define DEBUG_THREAD_SAFETY 0 +#endif +// +// If you constantly need to access your socket from multiple threads +// then you may consider using GCDAsyncSocket instead, which is thread-safe. + +NSString *const AsyncSocketException = @"AsyncSocketException"; +NSString *const AsyncSocketErrorDomain = @"AsyncSocketErrorDomain"; + + +enum AsyncSocketFlags +{ + kEnablePreBuffering = 1 << 0, // If set, pre-buffering is enabled + kDidStartDelegate = 1 << 1, // If set, disconnection results in delegate call + kDidCompleteOpenForRead = 1 << 2, // If set, open callback has been called for read stream + kDidCompleteOpenForWrite = 1 << 3, // If set, open callback has been called for write stream + kStartingReadTLS = 1 << 4, // If set, we're waiting for TLS negotiation to complete + kStartingWriteTLS = 1 << 5, // If set, we're waiting for TLS negotiation to complete + kForbidReadsWrites = 1 << 6, // If set, no new reads or writes are allowed + kDisconnectAfterReads = 1 << 7, // If set, disconnect after no more reads are queued + kDisconnectAfterWrites = 1 << 8, // If set, disconnect after no more writes are queued + kClosingWithError = 1 << 9, // If set, the socket is being closed due to an error + kDequeueReadScheduled = 1 << 10, // If set, a maybeDequeueRead operation is already scheduled + kDequeueWriteScheduled = 1 << 11, // If set, a maybeDequeueWrite operation is already scheduled + kSocketCanAcceptBytes = 1 << 12, // If set, we know socket can accept bytes. If unset, it's unknown. + kSocketHasBytesAvailable = 1 << 13, // If set, we know socket has bytes available. If unset, it's unknown. +}; + +@interface AsyncSocket (Private) + +// Connecting +- (void)startConnectTimeout:(NSTimeInterval)timeout; +- (void)endConnectTimeout; +- (void)doConnectTimeout:(NSTimer *)timer; + +// Socket Implementation +- (CFSocketRef)newAcceptSocketForAddress:(NSData *)addr error:(NSError **)errPtr; +- (BOOL)createSocketForAddress:(NSData *)remoteAddr error:(NSError **)errPtr; +- (BOOL)bindSocketToAddress:(NSData *)interfaceAddr error:(NSError **)errPtr; +- (BOOL)attachSocketsToRunLoop:(NSRunLoop *)runLoop error:(NSError **)errPtr; +- (BOOL)configureSocketAndReturnError:(NSError **)errPtr; +- (BOOL)connectSocketToAddress:(NSData *)remoteAddr error:(NSError **)errPtr; +- (void)doAcceptWithSocket:(CFSocketNativeHandle)newSocket; +- (void)doSocketOpen:(CFSocketRef)sock withCFSocketError:(CFSocketError)err; + +// Stream Implementation +- (BOOL)createStreamsFromNative:(CFSocketNativeHandle)native error:(NSError **)errPtr; +- (BOOL)createStreamsToHost:(NSString *)hostname onPort:(UInt16)port error:(NSError **)errPtr; +- (BOOL)attachStreamsToRunLoop:(NSRunLoop *)runLoop error:(NSError **)errPtr; +- (BOOL)configureStreamsAndReturnError:(NSError **)errPtr; +- (BOOL)openStreamsAndReturnError:(NSError **)errPtr; +- (void)doStreamOpen; +- (BOOL)setSocketFromStreamsAndReturnError:(NSError **)errPtr; + +// Disconnect Implementation +- (void)closeWithError:(NSError *)err; +- (void)recoverUnreadData; +- (void)emptyQueues; +- (void)close; + +// Errors +- (NSError *)getErrnoError; +- (NSError *)getAbortError; +- (NSError *)getStreamError; +- (NSError *)getSocketError; +- (NSError *)getConnectTimeoutError; +- (NSError *)getReadMaxedOutError; +- (NSError *)getReadTimeoutError; +- (NSError *)getWriteTimeoutError; +- (NSError *)errorFromCFStreamError:(CFStreamError)err; + +// Diagnostics +- (BOOL)isDisconnected; +- (BOOL)areStreamsConnected; +- (NSString *)connectedHostFromNativeSocket4:(CFSocketNativeHandle)theNativeSocket; +- (NSString *)connectedHostFromNativeSocket6:(CFSocketNativeHandle)theNativeSocket; +- (NSString *)connectedHostFromCFSocket4:(CFSocketRef)socket; +- (NSString *)connectedHostFromCFSocket6:(CFSocketRef)socket; +- (UInt16)connectedPortFromNativeSocket4:(CFSocketNativeHandle)theNativeSocket; +- (UInt16)connectedPortFromNativeSocket6:(CFSocketNativeHandle)theNativeSocket; +- (UInt16)connectedPortFromCFSocket4:(CFSocketRef)socket; +- (UInt16)connectedPortFromCFSocket6:(CFSocketRef)socket; +- (NSString *)localHostFromNativeSocket4:(CFSocketNativeHandle)theNativeSocket; +- (NSString *)localHostFromNativeSocket6:(CFSocketNativeHandle)theNativeSocket; +- (NSString *)localHostFromCFSocket4:(CFSocketRef)socket; +- (NSString *)localHostFromCFSocket6:(CFSocketRef)socket; +- (UInt16)localPortFromNativeSocket4:(CFSocketNativeHandle)theNativeSocket; +- (UInt16)localPortFromNativeSocket6:(CFSocketNativeHandle)theNativeSocket; +- (UInt16)localPortFromCFSocket4:(CFSocketRef)socket; +- (UInt16)localPortFromCFSocket6:(CFSocketRef)socket; +- (NSString *)hostFromAddress4:(struct sockaddr_in *)pSockaddr4; +- (NSString *)hostFromAddress6:(struct sockaddr_in6 *)pSockaddr6; +- (UInt16)portFromAddress4:(struct sockaddr_in *)pSockaddr4; +- (UInt16)portFromAddress6:(struct sockaddr_in6 *)pSockaddr6; + +// Reading +- (void)doBytesAvailable; +- (void)completeCurrentRead; +- (void)endCurrentRead; +- (void)scheduleDequeueRead; +- (void)maybeDequeueRead; +- (void)doReadTimeout:(NSTimer *)timer; + +// Writing +- (void)doSendBytes; +- (void)completeCurrentWrite; +- (void)endCurrentWrite; +- (void)scheduleDequeueWrite; +- (void)maybeDequeueWrite; +- (void)maybeScheduleDisconnect; +- (void)doWriteTimeout:(NSTimer *)timer; + +// Run Loop +- (void)runLoopAddSource:(CFRunLoopSourceRef)source; +- (void)runLoopRemoveSource:(CFRunLoopSourceRef)source; +- (void)runLoopAddTimer:(NSTimer *)timer; +- (void)runLoopRemoveTimer:(NSTimer *)timer; +- (void)runLoopUnscheduleReadStream; +- (void)runLoopUnscheduleWriteStream; + +// Security +- (void)maybeStartTLS; +- (void)onTLSHandshakeSuccessful; + +// Callbacks +- (void)doCFCallback:(CFSocketCallBackType)type + forSocket:(CFSocketRef)sock withAddress:(NSData *)address withData:(const void *)pData; +- (void)doCFReadStreamCallback:(CFStreamEventType)type forStream:(CFReadStreamRef)stream; +- (void)doCFWriteStreamCallback:(CFStreamEventType)type forStream:(CFWriteStreamRef)stream; + +@end + +static void MyCFSocketCallback(CFSocketRef, CFSocketCallBackType, CFDataRef, const void *, void *); +static void MyCFReadStreamCallback(CFReadStreamRef stream, CFStreamEventType type, void *pInfo); +static void MyCFWriteStreamCallback(CFWriteStreamRef stream, CFStreamEventType type, void *pInfo); + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * The AsyncReadPacket encompasses the instructions for any given read. + * The content of a read packet allows the code to determine if we're: + * - reading to a certain length + * - reading to a certain separator + * - or simply reading the first chunk of available data +**/ +@interface AsyncReadPacket : NSObject +{ + @public + NSMutableData *buffer; + NSUInteger startOffset; + NSUInteger bytesDone; + NSUInteger maxLength; + NSTimeInterval timeout; + NSUInteger readLength; + NSData *term; + BOOL bufferOwner; + NSUInteger originalBufferLength; + long tag; +} +- (id)initWithData:(NSMutableData *)d + startOffset:(NSUInteger)s + maxLength:(NSUInteger)m + timeout:(NSTimeInterval)t + readLength:(NSUInteger)l + terminator:(NSData *)e + tag:(long)i; + +- (NSUInteger)readLengthForNonTerm; +- (NSUInteger)readLengthForTerm; +- (NSUInteger)readLengthForTermWithPreBuffer:(NSData *)preBuffer found:(BOOL *)foundPtr; + +- (NSUInteger)prebufferReadLengthForTerm; +- (NSInteger)searchForTermAfterPreBuffering:(NSUInteger)numBytes; +@end + +@implementation AsyncReadPacket + +- (id)initWithData:(NSMutableData *)d + startOffset:(NSUInteger)s + maxLength:(NSUInteger)m + timeout:(NSTimeInterval)t + readLength:(NSUInteger)l + terminator:(NSData *)e + tag:(long)i +{ + if((self = [super init])) + { + if (d) + { + buffer = d; + startOffset = s; + bufferOwner = NO; + originalBufferLength = [d length]; + } + else + { + if (readLength > 0) + buffer = [[NSMutableData alloc] initWithLength:readLength]; + else + buffer = [[NSMutableData alloc] initWithLength:0]; + + startOffset = 0; + bufferOwner = YES; + originalBufferLength = 0; + } + + bytesDone = 0; + maxLength = m; + timeout = t; + readLength = l; + term = [e copy]; + tag = i; + } + return self; +} + +/** + * For read packets without a set terminator, returns the safe length of data that can be read + * without exceeding the maxLength, or forcing a resize of the buffer if at all possible. +**/ +- (NSUInteger)readLengthForNonTerm +{ + NSAssert(term == nil, @"This method does not apply to term reads"); + + if (readLength > 0) + { + // Read a specific length of data + + return readLength - bytesDone; + + // No need to avoid resizing the buffer. + // It should be resized if the buffer space is less than the requested read length. + } + else + { + // Read all available data + + NSUInteger result = READALL_CHUNKSIZE; + + if (maxLength > 0) + { + result = MIN(result, (maxLength - bytesDone)); + } + + if (!bufferOwner) + { + // We did NOT create the buffer. + // It is owned by the caller. + // Avoid resizing the buffer if at all possible. + + if ([buffer length] == originalBufferLength) + { + NSUInteger buffSize = [buffer length]; + NSUInteger buffSpace = buffSize - startOffset - bytesDone; + + if (buffSpace > 0) + { + result = MIN(result, buffSpace); + } + } + } + + return result; + } +} + +/** + * For read packets with a set terminator, returns the safe length of data that can be read + * without going over a terminator, or the maxLength, or forcing a resize of the buffer if at all possible. + * + * It is assumed the terminator has not already been read. +**/ +- (NSUInteger)readLengthForTerm +{ + NSAssert(term != nil, @"This method does not apply to non-term reads"); + + // What we're going to do is look for a partial sequence of the terminator at the end of the buffer. + // If a partial sequence occurs, then we must assume the next bytes to arrive will be the rest of the term, + // and we can only read that amount. + // Otherwise, we're safe to read the entire length of the term. + + NSUInteger termLength = [term length]; + + // Shortcuts + if (bytesDone == 0) return termLength; + if (termLength == 1) return termLength; + + // i = index within buffer at which to check data + // j = length of term to check against + + NSUInteger i, j; + if (bytesDone >= termLength) + { + i = bytesDone - termLength + 1; + j = termLength - 1; + } + else + { + i = 0; + j = bytesDone; + } + + NSUInteger result = termLength; + + void *buf = [buffer mutableBytes]; + const void *termBuf = [term bytes]; + + while (i < bytesDone) + { + void *subbuf = buf + startOffset + i; + + if (memcmp(subbuf, termBuf, j) == 0) + { + result = termLength - j; + break; + } + + i++; + j--; + } + + if (maxLength > 0) + { + result = MIN(result, (maxLength - bytesDone)); + } + + if (!bufferOwner) + { + // We did NOT create the buffer. + // It is owned by the caller. + // Avoid resizing the buffer if at all possible. + + if ([buffer length] == originalBufferLength) + { + NSUInteger buffSize = [buffer length]; + NSUInteger buffSpace = buffSize - startOffset - bytesDone; + + if (buffSpace > 0) + { + result = MIN(result, buffSpace); + } + } + } + + return result; +} + +/** + * For read packets with a set terminator, + * returns the safe length of data that can be read from the given preBuffer, + * without going over a terminator or the maxLength. + * + * It is assumed the terminator has not already been read. +**/ +- (NSUInteger)readLengthForTermWithPreBuffer:(NSData *)preBuffer found:(BOOL *)foundPtr +{ + NSAssert(term != nil, @"This method does not apply to non-term reads"); + NSAssert([preBuffer length] > 0, @"Invoked with empty pre buffer!"); + + // We know that the terminator, as a whole, doesn't exist in our own buffer. + // But it is possible that a portion of it exists in our buffer. + // So we're going to look for the terminator starting with a portion of our own buffer. + // + // Example: + // + // term length = 3 bytes + // bytesDone = 5 bytes + // preBuffer length = 5 bytes + // + // If we append the preBuffer to our buffer, + // it would look like this: + // + // --------------------- + // |B|B|B|B|B|P|P|P|P|P| + // --------------------- + // + // So we start our search here: + // + // --------------------- + // |B|B|B|B|B|P|P|P|P|P| + // -------^-^-^--------- + // + // And move forwards... + // + // --------------------- + // |B|B|B|B|B|P|P|P|P|P| + // ---------^-^-^------- + // + // Until we find the terminator or reach the end. + // + // --------------------- + // |B|B|B|B|B|P|P|P|P|P| + // ---------------^-^-^- + + BOOL found = NO; + + NSUInteger termLength = [term length]; + NSUInteger preBufferLength = [preBuffer length]; + + if ((bytesDone + preBufferLength) < termLength) + { + // Not enough data for a full term sequence yet + return preBufferLength; + } + + NSUInteger maxPreBufferLength; + if (maxLength > 0) { + maxPreBufferLength = MIN(preBufferLength, (maxLength - bytesDone)); + + // Note: maxLength >= termLength + } + else { + maxPreBufferLength = preBufferLength; + } + + Byte seq[termLength]; + const void *termBuf = [term bytes]; + + NSUInteger bufLen = MIN(bytesDone, (termLength - 1)); + void *buf = [buffer mutableBytes] + startOffset + bytesDone - bufLen; + + NSUInteger preLen = termLength - bufLen; + void *pre = (void *)[preBuffer bytes]; + + NSUInteger loopCount = bufLen + maxPreBufferLength - termLength + 1; // Plus one. See example above. + + NSUInteger result = preBufferLength; + + NSUInteger i; + for (i = 0; i < loopCount; i++) + { + if (bufLen > 0) + { + // Combining bytes from buffer and preBuffer + + memcpy(seq, buf, bufLen); + memcpy(seq + bufLen, pre, preLen); + + if (memcmp(seq, termBuf, termLength) == 0) + { + result = preLen; + found = YES; + break; + } + + buf++; + bufLen--; + preLen++; + } + else + { + // Comparing directly from preBuffer + + if (memcmp(pre, termBuf, termLength) == 0) + { + NSUInteger preOffset = pre - [preBuffer bytes]; // pointer arithmetic + + result = preOffset + termLength; + found = YES; + break; + } + + pre++; + } + } + + // There is no need to avoid resizing the buffer in this particular situation. + + if (foundPtr) *foundPtr = found; + return result; +} + +/** + * Assuming pre-buffering is enabled, returns the amount of data that can be read + * without going over the maxLength. +**/ +- (NSUInteger)prebufferReadLengthForTerm +{ + NSAssert(term != nil, @"This method does not apply to non-term reads"); + + NSUInteger result = READALL_CHUNKSIZE; + + if (maxLength > 0) + { + result = MIN(result, (maxLength - bytesDone)); + } + + if (!bufferOwner) + { + // We did NOT create the buffer. + // It is owned by the caller. + // Avoid resizing the buffer if at all possible. + + if ([buffer length] == originalBufferLength) + { + NSUInteger buffSize = [buffer length]; + NSUInteger buffSpace = buffSize - startOffset - bytesDone; + + if (buffSpace > 0) + { + result = MIN(result, buffSpace); + } + } + } + + return result; +} + +/** + * For read packets with a set terminator, scans the packet buffer for the term. + * It is assumed the terminator had not been fully read prior to the new bytes. + * + * If the term is found, the number of excess bytes after the term are returned. + * If the term is not found, this method will return -1. + * + * Note: A return value of zero means the term was found at the very end. +**/ +- (NSInteger)searchForTermAfterPreBuffering:(NSUInteger)numBytes +{ + NSAssert(term != nil, @"This method does not apply to non-term reads"); + NSAssert(bytesDone >= numBytes, @"Invoked with invalid numBytes!"); + + // We try to start the search such that the first new byte read matches up with the last byte of the term. + // We continue searching forward after this until the term no longer fits into the buffer. + + NSUInteger termLength = [term length]; + const void *termBuffer = [term bytes]; + + // Remember: This method is called after the bytesDone variable has been updated. + + NSUInteger prevBytesDone = bytesDone - numBytes; + + NSUInteger i; + if (prevBytesDone >= termLength) + i = prevBytesDone - termLength + 1; + else + i = 0; + + while ((i + termLength) <= bytesDone) + { + void *subBuffer = [buffer mutableBytes] + startOffset + i; + + if(memcmp(subBuffer, termBuffer, termLength) == 0) + { + return bytesDone - (i + termLength); + } + + i++; + } + + return -1; +} + + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * The AsyncWritePacket encompasses the instructions for any given write. +**/ +@interface AsyncWritePacket : NSObject +{ + @public + NSData *buffer; + NSUInteger bytesDone; + long tag; + NSTimeInterval timeout; +} +- (id)initWithData:(NSData *)d timeout:(NSTimeInterval)t tag:(long)i; +@end + +@implementation AsyncWritePacket + +- (id)initWithData:(NSData *)d timeout:(NSTimeInterval)t tag:(long)i +{ + if((self = [super init])) + { + buffer = d; + timeout = t; + tag = i; + bytesDone = 0; + } + return self; +} + + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * The AsyncSpecialPacket encompasses special instructions for interruptions in the read/write queues. + * This class my be altered to support more than just TLS in the future. +**/ +@interface AsyncSpecialPacket : NSObject +{ + @public + NSDictionary *tlsSettings; +} +- (id)initWithTLSSettings:(NSDictionary *)settings; +@end + +@implementation AsyncSpecialPacket + +- (id)initWithTLSSettings:(NSDictionary *)settings +{ + if((self = [super init])) + { + tlsSettings = [settings copy]; + } + return self; +} + + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation AsyncSocket + +- (id)init +{ + return [self initWithDelegate:nil userData:0]; +} + +- (id)initWithDelegate:(id)delegate +{ + return [self initWithDelegate:delegate userData:0]; +} + +// Designated initializer. +- (id)initWithDelegate:(id)delegate userData:(long)userData +{ + if((self = [super init])) + { + theFlags = DEFAULT_PREBUFFERING ? kEnablePreBuffering : 0; + theDelegate = delegate; + theUserData = userData; + + theNativeSocket4 = 0; + theNativeSocket6 = 0; + + theSocket4 = NULL; + theSource4 = NULL; + + theSocket6 = NULL; + theSource6 = NULL; + + theRunLoop = NULL; + theReadStream = NULL; + theWriteStream = NULL; + + theConnectTimer = nil; + + theReadQueue = [[NSMutableArray alloc] initWithCapacity:READQUEUE_CAPACITY]; + theCurrentRead = nil; + theReadTimer = nil; + + partialReadBuffer = [[NSMutableData alloc] initWithCapacity:READALL_CHUNKSIZE]; + + theWriteQueue = [[NSMutableArray alloc] initWithCapacity:WRITEQUEUE_CAPACITY]; + theCurrentWrite = nil; + theWriteTimer = nil; + + // Socket context + NSAssert(sizeof(CFSocketContext) == sizeof(CFStreamClientContext), @"CFSocketContext != CFStreamClientContext"); + theContext.version = 0; + theContext.info = (__bridge void *)(self); + theContext.retain = nil; + theContext.release = nil; + theContext.copyDescription = nil; + + // Default run loop modes + theRunLoopModes = [NSArray arrayWithObject:NSDefaultRunLoopMode]; + } + return self; +} + +// The socket may been initialized in a connected state and auto-released, so this should close it down cleanly. +- (void)dealloc +{ + [self close]; + [NSObject cancelPreviousPerformRequestsWithTarget:self]; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Thread-Safety +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)checkForThreadSafety +{ + if (theRunLoop && (theRunLoop != CFRunLoopGetCurrent())) + { + // AsyncSocket is RunLoop based. + // It is designed to be run and accessed from a particular thread/runloop. + // As such, it is faster as it does not have the overhead of locks/synchronization. + // + // However, this places a minimal requirement on the developer to maintain thread-safety. + // If you are seeing errors or crashes in AsyncSocket, + // it is very likely that thread-safety has been broken. + // This method may be enabled via the DEBUG_THREAD_SAFETY macro, + // and will allow you to discover the place in your code where thread-safety is being broken. + // + // Note: + // + // If you find you constantly need to access your socket from various threads, + // you may prefer to use GCDAsyncSocket which is thread-safe. + + [NSException raise:AsyncSocketException + format:@"Attempting to access AsyncSocket instance from incorrect thread."]; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Accessors +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (long)userData +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + return theUserData; +} + +- (void)setUserData:(long)userData +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + theUserData = userData; +} + +- (id)delegate +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + return theDelegate; +} + +- (void)setDelegate:(id)delegate +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + theDelegate = delegate; +} + +- (BOOL)canSafelySetDelegate +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + return ([theReadQueue count] == 0 && [theWriteQueue count] == 0 && theCurrentRead == nil && theCurrentWrite == nil); +} + +- (CFSocketRef)getCFSocket +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + if(theSocket4) + return theSocket4; + else + return theSocket6; +} + +- (CFReadStreamRef)getCFReadStream +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + return theReadStream; +} + +- (CFWriteStreamRef)getCFWriteStream +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + return theWriteStream; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Progress +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (float)progressOfReadReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + // Check to make sure we're actually reading something right now, + // and that the read packet isn't an AsyncSpecialPacket (upgrade to TLS). + if (!theCurrentRead || ![theCurrentRead isKindOfClass:[AsyncReadPacket class]]) + { + if (tag != NULL) *tag = 0; + if (done != NULL) *done = 0; + if (total != NULL) *total = 0; + + return NAN; + } + + // It's only possible to know the progress of our read if we're reading to a certain length. + // If we're reading to data, we of course have no idea when the data will arrive. + // If we're reading to timeout, then we have no idea when the next chunk of data will arrive. + + NSUInteger d = theCurrentRead->bytesDone; + NSUInteger t = theCurrentRead->readLength; + + if (tag != NULL) *tag = theCurrentRead->tag; + if (done != NULL) *done = d; + if (total != NULL) *total = t; + + if (t > 0.0) + return (float)d / (float)t; + else + return 1.0F; +} + +- (float)progressOfWriteReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + // Check to make sure we're actually writing something right now, + // and that the write packet isn't an AsyncSpecialPacket (upgrade to TLS). + if (!theCurrentWrite || ![theCurrentWrite isKindOfClass:[AsyncWritePacket class]]) + { + if (tag != NULL) *tag = 0; + if (done != NULL) *done = 0; + if (total != NULL) *total = 0; + + return NAN; + } + + NSUInteger d = theCurrentWrite->bytesDone; + NSUInteger t = [theCurrentWrite->buffer length]; + + if (tag != NULL) *tag = theCurrentWrite->tag; + if (done != NULL) *done = d; + if (total != NULL) *total = t; + + return (float)d / (float)t; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Run Loop +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)runLoopAddSource:(CFRunLoopSourceRef)source +{ + for (NSString *runLoopMode in theRunLoopModes) + { + CFRunLoopAddSource(theRunLoop, source, (__bridge CFStringRef)runLoopMode); + } +} + +- (void)runLoopRemoveSource:(CFRunLoopSourceRef)source +{ + for (NSString *runLoopMode in theRunLoopModes) + { + CFRunLoopRemoveSource(theRunLoop, source, (__bridge CFStringRef)runLoopMode); + } +} + +- (void)runLoopAddSource:(CFRunLoopSourceRef)source mode:(NSString *)runLoopMode +{ + CFRunLoopAddSource(theRunLoop, source, (__bridge CFStringRef)runLoopMode); +} + +- (void)runLoopRemoveSource:(CFRunLoopSourceRef)source mode:(NSString *)runLoopMode +{ + CFRunLoopRemoveSource(theRunLoop, source, (__bridge CFStringRef)runLoopMode); +} + +- (void)runLoopAddTimer:(NSTimer *)timer +{ + for (NSString *runLoopMode in theRunLoopModes) + { + CFRunLoopAddTimer(theRunLoop, (__bridge CFRunLoopTimerRef)timer, (__bridge CFStringRef)runLoopMode); + } +} + +- (void)runLoopRemoveTimer:(NSTimer *)timer +{ + for (NSString *runLoopMode in theRunLoopModes) + { + CFRunLoopRemoveTimer(theRunLoop, (__bridge CFRunLoopTimerRef)timer, (__bridge CFStringRef)runLoopMode); + } +} + +- (void)runLoopAddTimer:(NSTimer *)timer mode:(NSString *)runLoopMode +{ + CFRunLoopAddTimer(theRunLoop, (__bridge CFRunLoopTimerRef)timer, (__bridge CFStringRef)runLoopMode); +} + +- (void)runLoopRemoveTimer:(NSTimer *)timer mode:(NSString *)runLoopMode +{ + CFRunLoopRemoveTimer(theRunLoop, (__bridge CFRunLoopTimerRef)timer, (__bridge CFStringRef)runLoopMode); +} + +- (void)runLoopUnscheduleReadStream +{ + for (NSString *runLoopMode in theRunLoopModes) + { + CFReadStreamUnscheduleFromRunLoop(theReadStream, theRunLoop, (__bridge CFStringRef)runLoopMode); + } + CFReadStreamSetClient(theReadStream, kCFStreamEventNone, NULL, NULL); +} + +- (void)runLoopUnscheduleWriteStream +{ + for (NSString *runLoopMode in theRunLoopModes) + { + CFWriteStreamUnscheduleFromRunLoop(theWriteStream, theRunLoop, (__bridge CFStringRef)runLoopMode); + } + CFWriteStreamSetClient(theWriteStream, kCFStreamEventNone, NULL, NULL); +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Configuration +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * See the header file for a full explanation of pre-buffering. +**/ +- (void)enablePreBuffering +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + theFlags |= kEnablePreBuffering; +} + +/** + * See the header file for a full explanation of this method. +**/ +- (BOOL)moveToRunLoop:(NSRunLoop *)runLoop +{ + NSAssert((theRunLoop == NULL) || (theRunLoop == CFRunLoopGetCurrent()), + @"moveToRunLoop must be called from within the current RunLoop!"); + + if(runLoop == nil) + { + return NO; + } + if(theRunLoop == [runLoop getCFRunLoop]) + { + return YES; + } + + [NSObject cancelPreviousPerformRequestsWithTarget:self]; + theFlags &= ~kDequeueReadScheduled; + theFlags &= ~kDequeueWriteScheduled; + + if(theReadStream && theWriteStream) + { + [self runLoopUnscheduleReadStream]; + [self runLoopUnscheduleWriteStream]; + } + + if(theSource4) [self runLoopRemoveSource:theSource4]; + if(theSource6) [self runLoopRemoveSource:theSource6]; + + if(theReadTimer) [self runLoopRemoveTimer:theReadTimer]; + if(theWriteTimer) [self runLoopRemoveTimer:theWriteTimer]; + + theRunLoop = [runLoop getCFRunLoop]; + + if(theReadTimer) [self runLoopAddTimer:theReadTimer]; + if(theWriteTimer) [self runLoopAddTimer:theWriteTimer]; + + if(theSource4) [self runLoopAddSource:theSource4]; + if(theSource6) [self runLoopAddSource:theSource6]; + + if(theReadStream && theWriteStream) + { + if(![self attachStreamsToRunLoop:runLoop error:nil]) + { + return NO; + } + } + + [runLoop performSelector:@selector(maybeDequeueRead) target:self argument:nil order:0 modes:theRunLoopModes]; + [runLoop performSelector:@selector(maybeDequeueWrite) target:self argument:nil order:0 modes:theRunLoopModes]; + [runLoop performSelector:@selector(maybeScheduleDisconnect) target:self argument:nil order:0 modes:theRunLoopModes]; + + return YES; +} + +/** + * See the header file for a full explanation of this method. +**/ +- (BOOL)setRunLoopModes:(NSArray *)runLoopModes +{ + NSAssert((theRunLoop == NULL) || (theRunLoop == CFRunLoopGetCurrent()), + @"setRunLoopModes must be called from within the current RunLoop!"); + + if([runLoopModes count] == 0) + { + return NO; + } + if([theRunLoopModes isEqualToArray:runLoopModes]) + { + return YES; + } + + [NSObject cancelPreviousPerformRequestsWithTarget:self]; + theFlags &= ~kDequeueReadScheduled; + theFlags &= ~kDequeueWriteScheduled; + + if(theReadStream && theWriteStream) + { + [self runLoopUnscheduleReadStream]; + [self runLoopUnscheduleWriteStream]; + } + + if(theSource4) [self runLoopRemoveSource:theSource4]; + if(theSource6) [self runLoopRemoveSource:theSource6]; + + if(theReadTimer) [self runLoopRemoveTimer:theReadTimer]; + if(theWriteTimer) [self runLoopRemoveTimer:theWriteTimer]; + + theRunLoopModes = [runLoopModes copy]; + + if(theReadTimer) [self runLoopAddTimer:theReadTimer]; + if(theWriteTimer) [self runLoopAddTimer:theWriteTimer]; + + if(theSource4) [self runLoopAddSource:theSource4]; + if(theSource6) [self runLoopAddSource:theSource6]; + + if(theReadStream && theWriteStream) + { + // Note: theRunLoop variable is a CFRunLoop, and NSRunLoop is NOT toll-free bridged with CFRunLoop. + // So we cannot pass theRunLoop to the method below, which is expecting a NSRunLoop parameter. + // Instead we pass nil, which will result in the method properly using the current run loop. + + if(![self attachStreamsToRunLoop:nil error:nil]) + { + return NO; + } + } + + [self performSelector:@selector(maybeDequeueRead) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + [self performSelector:@selector(maybeDequeueWrite) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + [self performSelector:@selector(maybeScheduleDisconnect) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + + return YES; +} + +- (BOOL)addRunLoopMode:(NSString *)runLoopMode +{ + NSAssert((theRunLoop == NULL) || (theRunLoop == CFRunLoopGetCurrent()), + @"addRunLoopMode must be called from within the current RunLoop!"); + + if(runLoopMode == nil) + { + return NO; + } + if([theRunLoopModes containsObject:runLoopMode]) + { + return YES; + } + + [NSObject cancelPreviousPerformRequestsWithTarget:self]; + theFlags &= ~kDequeueReadScheduled; + theFlags &= ~kDequeueWriteScheduled; + + NSArray *newRunLoopModes = [theRunLoopModes arrayByAddingObject:runLoopMode]; + theRunLoopModes = newRunLoopModes; + + if(theReadTimer) [self runLoopAddTimer:theReadTimer mode:runLoopMode]; + if(theWriteTimer) [self runLoopAddTimer:theWriteTimer mode:runLoopMode]; + + if(theSource4) [self runLoopAddSource:theSource4 mode:runLoopMode]; + if(theSource6) [self runLoopAddSource:theSource6 mode:runLoopMode]; + + if(theReadStream && theWriteStream) + { + CFReadStreamScheduleWithRunLoop(theReadStream, CFRunLoopGetCurrent(), (__bridge CFStringRef)runLoopMode); + CFWriteStreamScheduleWithRunLoop(theWriteStream, CFRunLoopGetCurrent(), (__bridge CFStringRef)runLoopMode); + } + + [self performSelector:@selector(maybeDequeueRead) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + [self performSelector:@selector(maybeDequeueWrite) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + [self performSelector:@selector(maybeScheduleDisconnect) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + + return YES; +} + +- (BOOL)removeRunLoopMode:(NSString *)runLoopMode +{ + NSAssert((theRunLoop == NULL) || (theRunLoop == CFRunLoopGetCurrent()), + @"addRunLoopMode must be called from within the current RunLoop!"); + + if(runLoopMode == nil) + { + return NO; + } + if(![theRunLoopModes containsObject:runLoopMode]) + { + return YES; + } + + NSMutableArray *newRunLoopModes = [theRunLoopModes mutableCopy]; + [newRunLoopModes removeObject:runLoopMode]; + + if([newRunLoopModes count] == 0) + { + return NO; + } + + [NSObject cancelPreviousPerformRequestsWithTarget:self]; + theFlags &= ~kDequeueReadScheduled; + theFlags &= ~kDequeueWriteScheduled; + + theRunLoopModes = [newRunLoopModes copy]; + + if(theReadTimer) [self runLoopRemoveTimer:theReadTimer mode:runLoopMode]; + if(theWriteTimer) [self runLoopRemoveTimer:theWriteTimer mode:runLoopMode]; + + if(theSource4) [self runLoopRemoveSource:theSource4 mode:runLoopMode]; + if(theSource6) [self runLoopRemoveSource:theSource6 mode:runLoopMode]; + + if(theReadStream && theWriteStream) + { + CFReadStreamScheduleWithRunLoop(theReadStream, CFRunLoopGetCurrent(), (__bridge CFStringRef)runLoopMode); + CFWriteStreamScheduleWithRunLoop(theWriteStream, CFRunLoopGetCurrent(), (__bridge CFStringRef)runLoopMode); + } + + [self performSelector:@selector(maybeDequeueRead) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + [self performSelector:@selector(maybeDequeueWrite) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + [self performSelector:@selector(maybeScheduleDisconnect) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + + return YES; +} + +- (NSArray *)runLoopModes +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + return theRunLoopModes; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Accepting +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)acceptOnPort:(UInt16)port error:(NSError **)errPtr +{ + return [self acceptOnInterface:nil port:port error:errPtr]; +} + +/** + * To accept on a certain interface, pass the address to accept on. + * To accept on any interface, pass nil or an empty string. + * To accept only connections from localhost pass "localhost" or "loopback". +**/ +- (BOOL)acceptOnInterface:(NSString *)interface port:(UInt16)port error:(NSError **)errPtr +{ + if (theDelegate == NULL) + { + [NSException raise:AsyncSocketException + format:@"Attempting to accept without a delegate. Set a delegate first."]; + } + + if (![self isDisconnected]) + { + [NSException raise:AsyncSocketException + format:@"Attempting to accept while connected or accepting connections. Disconnect first."]; + } + + // Clear queues (spurious read/write requests post disconnect) + [self emptyQueues]; + + // Set up the listen sockaddr structs if needed. + + NSData *address4 = nil, *address6 = nil; + if(interface == nil || ([interface length] == 0)) + { + // Accept on ANY address + struct sockaddr_in nativeAddr4; + nativeAddr4.sin_len = sizeof(struct sockaddr_in); + nativeAddr4.sin_family = AF_INET; + nativeAddr4.sin_port = htons(port); + nativeAddr4.sin_addr.s_addr = htonl(INADDR_ANY); + memset(&(nativeAddr4.sin_zero), 0, sizeof(nativeAddr4.sin_zero)); + + struct sockaddr_in6 nativeAddr6; + nativeAddr6.sin6_len = sizeof(struct sockaddr_in6); + nativeAddr6.sin6_family = AF_INET6; + nativeAddr6.sin6_port = htons(port); + nativeAddr6.sin6_flowinfo = 0; + nativeAddr6.sin6_addr = in6addr_any; + nativeAddr6.sin6_scope_id = 0; + + // Wrap the native address structures for CFSocketSetAddress. + address4 = [NSData dataWithBytes:&nativeAddr4 length:sizeof(nativeAddr4)]; + address6 = [NSData dataWithBytes:&nativeAddr6 length:sizeof(nativeAddr6)]; + } + else if([interface isEqualToString:@"localhost"] || [interface isEqualToString:@"loopback"]) + { + // Accept only on LOOPBACK address + struct sockaddr_in nativeAddr4; + nativeAddr4.sin_len = sizeof(struct sockaddr_in); + nativeAddr4.sin_family = AF_INET; + nativeAddr4.sin_port = htons(port); + nativeAddr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + memset(&(nativeAddr4.sin_zero), 0, sizeof(nativeAddr4.sin_zero)); + + struct sockaddr_in6 nativeAddr6; + nativeAddr6.sin6_len = sizeof(struct sockaddr_in6); + nativeAddr6.sin6_family = AF_INET6; + nativeAddr6.sin6_port = htons(port); + nativeAddr6.sin6_flowinfo = 0; + nativeAddr6.sin6_addr = in6addr_loopback; + nativeAddr6.sin6_scope_id = 0; + + // Wrap the native address structures for CFSocketSetAddress. + address4 = [NSData dataWithBytes:&nativeAddr4 length:sizeof(nativeAddr4)]; + address6 = [NSData dataWithBytes:&nativeAddr6 length:sizeof(nativeAddr6)]; + } + else + { + NSString *portStr = [NSString stringWithFormat:@"%hu", port]; + + struct addrinfo hints, *res, *res0; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + hints.ai_flags = AI_PASSIVE; + + int error = getaddrinfo([interface UTF8String], [portStr UTF8String], &hints, &res0); + + if (error) + { + if (errPtr) + { + NSString *errMsg = [NSString stringWithCString:gai_strerror(error) encoding:NSASCIIStringEncoding]; + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + *errPtr = [NSError errorWithDomain:@"kCFStreamErrorDomainNetDB" code:error userInfo:info]; + } + } + else + { + for (res = res0; res; res = res->ai_next) + { + if (!address4 && (res->ai_family == AF_INET)) + { + // Found IPv4 address + // Wrap the native address structures for CFSocketSetAddress. + address4 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]; + } + else if (!address6 && (res->ai_family == AF_INET6)) + { + // Found IPv6 address + // Wrap the native address structures for CFSocketSetAddress. + address6 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]; + } + } + freeaddrinfo(res0); + } + + if(!address4 && !address6) return NO; + } + + // Create the sockets. + + if (address4) + { + theSocket4 = [self newAcceptSocketForAddress:address4 error:errPtr]; + if (theSocket4 == NULL) goto Failed; + } + + if (address6) + { + theSocket6 = [self newAcceptSocketForAddress:address6 error:errPtr]; + + // Note: The iPhone doesn't currently support IPv6 + +#if !TARGET_OS_IPHONE + if (theSocket6 == NULL) goto Failed; +#endif + } + + // Attach the sockets to the run loop so that callback methods work + + [self attachSocketsToRunLoop:nil error:nil]; + + // Set the SO_REUSEADDR flags. + + int reuseOn = 1; + if (theSocket4) setsockopt(CFSocketGetNative(theSocket4), SOL_SOCKET, SO_REUSEADDR, &reuseOn, sizeof(reuseOn)); + if (theSocket6) setsockopt(CFSocketGetNative(theSocket6), SOL_SOCKET, SO_REUSEADDR, &reuseOn, sizeof(reuseOn)); + + // Set the local bindings which causes the sockets to start listening. + + CFSocketError err; + if (theSocket4) + { + err = CFSocketSetAddress(theSocket4, (__bridge CFDataRef)address4); + if (err != kCFSocketSuccess) goto Failed; + + //NSLog(@"theSocket4: %hu", [self localPortFromCFSocket4:theSocket4]); + } + + if(port == 0 && theSocket4 && theSocket6) + { + // The user has passed in port 0, which means he wants to allow the kernel to choose the port for them + // However, the kernel will choose a different port for both theSocket4 and theSocket6 + // So we grab the port the kernel choose for theSocket4, and set it as the port for theSocket6 + UInt16 chosenPort = [self localPortFromCFSocket4:theSocket4]; + + struct sockaddr_in6 *pSockAddr6 = (struct sockaddr_in6 *)[address6 bytes]; + if (pSockAddr6) // If statement to quiet the static analyzer + { + pSockAddr6->sin6_port = htons(chosenPort); + } + } + + if (theSocket6) + { + err = CFSocketSetAddress(theSocket6, (__bridge CFDataRef)address6); + if (err != kCFSocketSuccess) goto Failed; + + //NSLog(@"theSocket6: %hu", [self localPortFromCFSocket6:theSocket6]); + } + + theFlags |= kDidStartDelegate; + return YES; + +Failed: + if(errPtr) *errPtr = [self getSocketError]; + if(theSocket4 != NULL) + { + CFSocketInvalidate(theSocket4); + CFRelease(theSocket4); + theSocket4 = NULL; + } + if(theSocket6 != NULL) + { + CFSocketInvalidate(theSocket6); + CFRelease(theSocket6); + theSocket6 = NULL; + } + return NO; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Connecting +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)connectToHost:(NSString*)hostname onPort:(UInt16)port error:(NSError **)errPtr +{ + return [self connectToHost:hostname onPort:port withTimeout:-1 error:errPtr]; +} + +/** + * This method creates an initial CFReadStream and CFWriteStream to the given host on the given port. + * The connection is then opened, and the corresponding CFSocket will be extracted after the connection succeeds. + * + * Thus the delegate will have access to the CFReadStream and CFWriteStream prior to connection, + * specifically in the onSocketWillConnect: method. +**/ +- (BOOL)connectToHost:(NSString *)hostname + onPort:(UInt16)port + withTimeout:(NSTimeInterval)timeout + error:(NSError **)errPtr +{ + if (theDelegate == NULL) + { + [NSException raise:AsyncSocketException + format:@"Attempting to connect without a delegate. Set a delegate first."]; + } + + if (![self isDisconnected]) + { + [NSException raise:AsyncSocketException + format:@"Attempting to connect while connected or accepting connections. Disconnect first."]; + } + + // Clear queues (spurious read/write requests post disconnect) + [self emptyQueues]; + + if(![self createStreamsToHost:hostname onPort:port error:errPtr]) goto Failed; + if(![self attachStreamsToRunLoop:nil error:errPtr]) goto Failed; + if(![self configureStreamsAndReturnError:errPtr]) goto Failed; + if(![self openStreamsAndReturnError:errPtr]) goto Failed; + + [self startConnectTimeout:timeout]; + theFlags |= kDidStartDelegate; + + return YES; + +Failed: + [self close]; + return NO; +} + +- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr +{ + return [self connectToAddress:remoteAddr viaInterfaceAddress:nil withTimeout:-1 error:errPtr]; +} + +/** + * This method creates an initial CFSocket to the given address. + * The connection is then opened, and the corresponding CFReadStream and CFWriteStream will be + * created from the low-level sockets after the connection succeeds. + * + * Thus the delegate will have access to the CFSocket and CFSocketNativeHandle (BSD socket) prior to connection, + * specifically in the onSocketWillConnect: method. + * + * Note: The NSData parameter is expected to be a sockaddr structure. For example, an NSData object returned from + * NSNetService addresses method. + * If you have an existing struct sockaddr you can convert it to an NSData object like so: + * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len]; + * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len]; +**/ +- (BOOL)connectToAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr +{ + return [self connectToAddress:remoteAddr viaInterfaceAddress:nil withTimeout:timeout error:errPtr]; +} + +/** + * This method is similar to the one above, but allows you to specify which socket interface + * the connection should run over. E.g. ethernet, wifi, bluetooth, etc. +**/ +- (BOOL)connectToAddress:(NSData *)remoteAddr + viaInterfaceAddress:(NSData *)interfaceAddr + withTimeout:(NSTimeInterval)timeout + error:(NSError **)errPtr +{ + if (theDelegate == NULL) + { + [NSException raise:AsyncSocketException + format:@"Attempting to connect without a delegate. Set a delegate first."]; + } + + if (![self isDisconnected]) + { + [NSException raise:AsyncSocketException + format:@"Attempting to connect while connected or accepting connections. Disconnect first."]; + } + + // Clear queues (spurious read/write requests post disconnect) + [self emptyQueues]; + + if(![self createSocketForAddress:remoteAddr error:errPtr]) goto Failed; + if(![self bindSocketToAddress:interfaceAddr error:errPtr]) goto Failed; + if(![self attachSocketsToRunLoop:nil error:errPtr]) goto Failed; + if(![self configureSocketAndReturnError:errPtr]) goto Failed; + if(![self connectSocketToAddress:remoteAddr error:errPtr]) goto Failed; + + [self startConnectTimeout:timeout]; + theFlags |= kDidStartDelegate; + + return YES; + +Failed: + [self close]; + return NO; +} + +- (void)startConnectTimeout:(NSTimeInterval)timeout +{ + if(timeout >= 0.0) + { + theConnectTimer = [NSTimer timerWithTimeInterval:timeout + target:self + selector:@selector(doConnectTimeout:) + userInfo:nil + repeats:NO]; + [self runLoopAddTimer:theConnectTimer]; + } +} + +- (void)endConnectTimeout +{ + [theConnectTimer invalidate]; + theConnectTimer = nil; +} + +- (void)doConnectTimeout:(NSTimer *)timer +{ + #pragma unused(timer) + + [self endConnectTimeout]; + [self closeWithError:[self getConnectTimeoutError]]; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Socket Implementation +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Creates the accept sockets. + * Returns true if either IPv4 or IPv6 is created. + * If either is missing, an error is returned (even though the method may return true). +**/ +- (CFSocketRef)newAcceptSocketForAddress:(NSData *)addr error:(NSError **)errPtr +{ + struct sockaddr *pSockAddr = (struct sockaddr *)[addr bytes]; + int addressFamily = pSockAddr->sa_family; + + CFSocketRef theSocket = CFSocketCreate(kCFAllocatorDefault, + addressFamily, + SOCK_STREAM, + 0, + kCFSocketAcceptCallBack, // Callback flags + (CFSocketCallBack)&MyCFSocketCallback, // Callback method + &theContext); + + if(theSocket == NULL) + { + if(errPtr) *errPtr = [self getSocketError]; + } + + return theSocket; +} + +- (BOOL)createSocketForAddress:(NSData *)remoteAddr error:(NSError **)errPtr +{ + struct sockaddr *pSockAddr = (struct sockaddr *)[remoteAddr bytes]; + + if(pSockAddr->sa_family == AF_INET) + { + theSocket4 = CFSocketCreate(NULL, // Default allocator + PF_INET, // Protocol Family + SOCK_STREAM, // Socket Type + IPPROTO_TCP, // Protocol + kCFSocketConnectCallBack, // Callback flags + (CFSocketCallBack)&MyCFSocketCallback, // Callback method + &theContext); // Socket Context + + if(theSocket4 == NULL) + { + if (errPtr) *errPtr = [self getSocketError]; + return NO; + } + } + else if(pSockAddr->sa_family == AF_INET6) + { + theSocket6 = CFSocketCreate(NULL, // Default allocator + PF_INET6, // Protocol Family + SOCK_STREAM, // Socket Type + IPPROTO_TCP, // Protocol + kCFSocketConnectCallBack, // Callback flags + (CFSocketCallBack)&MyCFSocketCallback, // Callback method + &theContext); // Socket Context + + if(theSocket6 == NULL) + { + if (errPtr) *errPtr = [self getSocketError]; + return NO; + } + } + else + { + if (errPtr) + { + NSString *errMsg = @"Remote address is not IPv4 or IPv6"; + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + *errPtr = [NSError errorWithDomain:AsyncSocketErrorDomain code:AsyncSocketCFSocketError userInfo:info]; + } + return NO; + } + + return YES; +} + +- (BOOL)bindSocketToAddress:(NSData *)interfaceAddr error:(NSError **)errPtr +{ + if (interfaceAddr == nil) return YES; + + struct sockaddr *pSockAddr = (struct sockaddr *)[interfaceAddr bytes]; + + CFSocketRef theSocket = (theSocket4 != NULL) ? theSocket4 : theSocket6; + NSAssert((theSocket != NULL), @"bindSocketToAddress called without valid socket"); + + CFSocketNativeHandle nativeSocket = CFSocketGetNative(theSocket); + + if (pSockAddr->sa_family == AF_INET || pSockAddr->sa_family == AF_INET6) + { + int result = bind(nativeSocket, pSockAddr, (socklen_t)[interfaceAddr length]); + if (result != 0) + { + if (errPtr) *errPtr = [self getErrnoError]; + return NO; + } + } + else + { + if (errPtr) + { + NSString *errMsg = @"Interface address is not IPv4 or IPv6"; + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + *errPtr = [NSError errorWithDomain:AsyncSocketErrorDomain code:AsyncSocketCFSocketError userInfo:info]; + } + return NO; + } + + return YES; +} + +/** + * Adds the CFSocket's to the run-loop so that callbacks will work properly. +**/ +- (BOOL)attachSocketsToRunLoop:(NSRunLoop *)runLoop error:(NSError **)errPtr +{ + #pragma unused(errPtr) + + // Get the CFRunLoop to which the socket should be attached. + theRunLoop = (runLoop == nil) ? CFRunLoopGetCurrent() : [runLoop getCFRunLoop]; + + if(theSocket4) + { + theSource4 = CFSocketCreateRunLoopSource (kCFAllocatorDefault, theSocket4, 0); + [self runLoopAddSource:theSource4]; + } + + if(theSocket6) + { + theSource6 = CFSocketCreateRunLoopSource (kCFAllocatorDefault, theSocket6, 0); + [self runLoopAddSource:theSource6]; + } + + return YES; +} + +/** + * Allows the delegate method to configure the CFSocket or CFNativeSocket as desired before we connect. + * Note that the CFReadStream and CFWriteStream will not be available until after the connection is opened. +**/ +- (BOOL)configureSocketAndReturnError:(NSError **)errPtr +{ + // Call the delegate method for further configuration. + if([theDelegate respondsToSelector:@selector(onSocketWillConnect:)]) + { + if([theDelegate onSocketWillConnect:self] == NO) + { + if (errPtr) *errPtr = [self getAbortError]; + return NO; + } + } + return YES; +} + +- (BOOL)connectSocketToAddress:(NSData *)remoteAddr error:(NSError **)errPtr +{ + // Start connecting to the given address in the background + // The MyCFSocketCallback method will be called when the connection succeeds or fails + if(theSocket4) + { + CFSocketError err = CFSocketConnectToAddress(theSocket4, (__bridge CFDataRef)remoteAddr, -1); + if(err != kCFSocketSuccess) + { + if (errPtr) *errPtr = [self getSocketError]; + return NO; + } + } + else if(theSocket6) + { + CFSocketError err = CFSocketConnectToAddress(theSocket6, (__bridge CFDataRef)remoteAddr, -1); + if(err != kCFSocketSuccess) + { + if (errPtr) *errPtr = [self getSocketError]; + return NO; + } + } + + return YES; +} + +/** + * Attempt to make the new socket. + * If an error occurs, ignore this event. +**/ +- (void)doAcceptFromSocket:(CFSocketRef)parentSocket withNewNativeSocket:(CFSocketNativeHandle)newNativeSocket +{ + if(newNativeSocket) + { + // New socket inherits same delegate and run loop modes. + // Note: We use [self class] to support subclassing AsyncSocket. + AsyncSocket *newSocket = [[[self class] alloc] initWithDelegate:theDelegate]; + [newSocket setRunLoopModes:theRunLoopModes]; + + if (![newSocket createStreamsFromNative:newNativeSocket error:nil]) + { + [newSocket close]; + return; + } + + if (parentSocket == theSocket4) + newSocket->theNativeSocket4 = newNativeSocket; + else + newSocket->theNativeSocket6 = newNativeSocket; + + if ([theDelegate respondsToSelector:@selector(onSocket:didAcceptNewSocket:)]) + [theDelegate onSocket:self didAcceptNewSocket:newSocket]; + + newSocket->theFlags |= kDidStartDelegate; + + NSRunLoop *runLoop = nil; + if ([theDelegate respondsToSelector:@selector(onSocket:wantsRunLoopForNewSocket:)]) + { + runLoop = [theDelegate onSocket:self wantsRunLoopForNewSocket:newSocket]; + } + + if(![newSocket attachStreamsToRunLoop:runLoop error:nil]) goto Failed; + if(![newSocket configureStreamsAndReturnError:nil]) goto Failed; + if(![newSocket openStreamsAndReturnError:nil]) goto Failed; + + return; + + Failed: + [newSocket close]; + } +} + +/** + * This method is called as a result of connectToAddress:withTimeout:error:. + * At this point we have an open CFSocket from which we need to create our read and write stream. +**/ +- (void)doSocketOpen:(CFSocketRef)sock withCFSocketError:(CFSocketError)socketError +{ + NSParameterAssert ((sock == theSocket4) || (sock == theSocket6)); + + if(socketError == kCFSocketTimeout || socketError == kCFSocketError) + { + [self closeWithError:[self getSocketError]]; + return; + } + + // Get the underlying native (BSD) socket + CFSocketNativeHandle nativeSocket = CFSocketGetNative(sock); + + // Store a reference to it + if (sock == theSocket4) + theNativeSocket4 = nativeSocket; + else + theNativeSocket6 = nativeSocket; + + // Setup the CFSocket so that invalidating it will not close the underlying native socket + CFSocketSetSocketFlags(sock, 0); + + // Invalidate and release the CFSocket - All we need from here on out is the nativeSocket. + // Note: If we don't invalidate the CFSocket (leaving the native socket open) + // then theReadStream and theWriteStream won't function properly. + // Specifically, their callbacks won't work, with the exception of kCFStreamEventOpenCompleted. + // + // This is likely due to the mixture of the CFSocketCreateWithNative method, + // along with the CFStreamCreatePairWithSocket method. + // The documentation for CFSocketCreateWithNative states: + // + // If a CFSocket object already exists for sock, + // the function returns the pre-existing object instead of creating a new object; + // the context, callout, and callBackTypes parameters are ignored in this case. + // + // So the CFStreamCreateWithNative method invokes the CFSocketCreateWithNative method, + // thinking that is creating a new underlying CFSocket for it's own purposes. + // When it does this, it uses the context/callout/callbackTypes parameters to setup everything appropriately. + // However, if a CFSocket already exists for the native socket, + // then it is returned (as per the documentation), which in turn screws up the CFStreams. + + CFSocketInvalidate(sock); + CFRelease(sock); + theSocket4 = NULL; + theSocket6 = NULL; + + NSError *err; + BOOL pass = YES; + + if(pass && ![self createStreamsFromNative:nativeSocket error:&err]) pass = NO; + if(pass && ![self attachStreamsToRunLoop:nil error:&err]) pass = NO; + if(pass && ![self openStreamsAndReturnError:&err]) pass = NO; + + if(!pass) + { + [self closeWithError:err]; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Stream Implementation +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Creates the CFReadStream and CFWriteStream from the given native socket. + * The CFSocket may be extracted from either stream after the streams have been opened. + * + * Note: The given native socket must already be connected! +**/ +- (BOOL)createStreamsFromNative:(CFSocketNativeHandle)native error:(NSError **)errPtr +{ + // Create the socket & streams. + CFStreamCreatePairWithSocket(kCFAllocatorDefault, native, &theReadStream, &theWriteStream); + if (theReadStream == NULL || theWriteStream == NULL) + { + NSError *err = [self getStreamError]; + + NSLog(@"AsyncSocket %p couldn't create streams from accepted socket: %@", self, err); + + if (errPtr) *errPtr = err; + return NO; + } + + // Ensure the CF & BSD socket is closed when the streams are closed. + CFReadStreamSetProperty(theReadStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); + CFWriteStreamSetProperty(theWriteStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); + + return YES; +} + +/** + * Creates the CFReadStream and CFWriteStream from the given hostname and port number. + * The CFSocket may be extracted from either stream after the streams have been opened. +**/ +- (BOOL)createStreamsToHost:(NSString *)hostname onPort:(UInt16)port error:(NSError **)errPtr +{ + // Create the socket & streams. + CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)hostname, port, &theReadStream, &theWriteStream); + if (theReadStream == NULL || theWriteStream == NULL) + { + if (errPtr) *errPtr = [self getStreamError]; + return NO; + } + + // Ensure the CF & BSD socket is closed when the streams are closed. + CFReadStreamSetProperty(theReadStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); + CFWriteStreamSetProperty(theWriteStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); + + return YES; +} + +- (BOOL)attachStreamsToRunLoop:(NSRunLoop *)runLoop error:(NSError **)errPtr +{ + // Get the CFRunLoop to which the socket should be attached. + theRunLoop = (runLoop == nil) ? CFRunLoopGetCurrent() : [runLoop getCFRunLoop]; + + // Setup read stream callbacks + + CFOptionFlags readStreamEvents = kCFStreamEventHasBytesAvailable | + kCFStreamEventErrorOccurred | + kCFStreamEventEndEncountered | + kCFStreamEventOpenCompleted; + + if (!CFReadStreamSetClient(theReadStream, + readStreamEvents, + (CFReadStreamClientCallBack)&MyCFReadStreamCallback, + (CFStreamClientContext *)(&theContext))) + { + NSError *err = [self getStreamError]; + + NSLog (@"AsyncSocket %p couldn't attach read stream to run-loop,", self); + NSLog (@"Error: %@", err); + + if (errPtr) *errPtr = err; + return NO; + } + + // Setup write stream callbacks + + CFOptionFlags writeStreamEvents = kCFStreamEventCanAcceptBytes | + kCFStreamEventErrorOccurred | + kCFStreamEventEndEncountered | + kCFStreamEventOpenCompleted; + + if (!CFWriteStreamSetClient (theWriteStream, + writeStreamEvents, + (CFWriteStreamClientCallBack)&MyCFWriteStreamCallback, + (CFStreamClientContext *)(&theContext))) + { + NSError *err = [self getStreamError]; + + NSLog (@"AsyncSocket %p couldn't attach write stream to run-loop,", self); + NSLog (@"Error: %@", err); + + if (errPtr) *errPtr = err; + return NO; + } + + // Add read and write streams to run loop + + for (NSString *runLoopMode in theRunLoopModes) + { + CFReadStreamScheduleWithRunLoop(theReadStream, theRunLoop, (__bridge CFStringRef)runLoopMode); + CFWriteStreamScheduleWithRunLoop(theWriteStream, theRunLoop, (__bridge CFStringRef)runLoopMode); + } + + return YES; +} + +/** + * Allows the delegate method to configure the CFReadStream and/or CFWriteStream as desired before we connect. + * + * If being called from a connect method, + * the CFSocket and CFNativeSocket will not be available until after the connection is opened. +**/ +- (BOOL)configureStreamsAndReturnError:(NSError **)errPtr +{ + // Call the delegate method for further configuration. + if([theDelegate respondsToSelector:@selector(onSocketWillConnect:)]) + { + if([theDelegate onSocketWillConnect:self] == NO) + { + if (errPtr) *errPtr = [self getAbortError]; + return NO; + } + } + return YES; +} + +- (BOOL)openStreamsAndReturnError:(NSError **)errPtr +{ + BOOL pass = YES; + + if(pass && !CFReadStreamOpen(theReadStream)) + { + NSLog (@"AsyncSocket %p couldn't open read stream,", self); + pass = NO; + } + + if(pass && !CFWriteStreamOpen(theWriteStream)) + { + NSLog (@"AsyncSocket %p couldn't open write stream,", self); + pass = NO; + } + + if(!pass) + { + if (errPtr) *errPtr = [self getStreamError]; + } + + return pass; +} + +/** + * Called when read or write streams open. + * When the socket is connected and both streams are open, consider the AsyncSocket instance to be ready. +**/ +- (void)doStreamOpen +{ + if ((theFlags & kDidCompleteOpenForRead) && (theFlags & kDidCompleteOpenForWrite)) + { + NSError *err = nil; + + // Get the socket + if (![self setSocketFromStreamsAndReturnError: &err]) + { + NSLog (@"AsyncSocket %p couldn't get socket from streams, %@. Disconnecting.", self, err); + [self closeWithError:err]; + return; + } + + // Stop the connection attempt timeout timer + [self endConnectTimeout]; + + if ([theDelegate respondsToSelector:@selector(onSocket:didConnectToHost:port:)]) + { + [theDelegate onSocket:self didConnectToHost:[self connectedHost] port:[self connectedPort]]; + } + + // Immediately deal with any already-queued requests. + [self maybeDequeueRead]; + [self maybeDequeueWrite]; + } +} + +- (BOOL)setSocketFromStreamsAndReturnError:(NSError **)errPtr +{ + // Get the CFSocketNativeHandle from theReadStream + CFSocketNativeHandle native; + CFDataRef nativeProp = CFReadStreamCopyProperty(theReadStream, kCFStreamPropertySocketNativeHandle); + if(nativeProp == NULL) + { + if (errPtr) *errPtr = [self getStreamError]; + return NO; + } + + CFIndex nativePropLen = CFDataGetLength(nativeProp); + CFIndex nativeLen = (CFIndex)sizeof(native); + + CFIndex len = MIN(nativePropLen, nativeLen); + + CFDataGetBytes(nativeProp, CFRangeMake(0, len), (UInt8 *)&native); + CFRelease(nativeProp); + + CFSocketRef theSocket = CFSocketCreateWithNative(kCFAllocatorDefault, native, 0, NULL, NULL); + if(theSocket == NULL) + { + if (errPtr) *errPtr = [self getSocketError]; + return NO; + } + + // Determine whether the connection was IPv4 or IPv6. + // We may already know if this was an accepted socket, + // or if the connectToAddress method was used. + // In either of the above two cases, the native socket variable would already be set. + + if (theNativeSocket4 > 0) + { + theSocket4 = theSocket; + return YES; + } + if (theNativeSocket6 > 0) + { + theSocket6 = theSocket; + return YES; + } + + CFDataRef peeraddr = CFSocketCopyPeerAddress(theSocket); + if(peeraddr == NULL) + { + NSLog(@"AsyncSocket couldn't determine IP version of socket"); + + CFRelease(theSocket); + + if (errPtr) *errPtr = [self getSocketError]; + return NO; + } + struct sockaddr *sa = (struct sockaddr *)CFDataGetBytePtr(peeraddr); + + if(sa->sa_family == AF_INET) + { + theSocket4 = theSocket; + theNativeSocket4 = native; + } + else + { + theSocket6 = theSocket; + theNativeSocket6 = native; + } + + CFRelease(peeraddr); + + return YES; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Disconnect Implementation +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Sends error message and disconnects +- (void)closeWithError:(NSError *)err +{ + theFlags |= kClosingWithError; + + if (theFlags & kDidStartDelegate) + { + // Try to salvage what data we can. + [self recoverUnreadData]; + + // Let the delegate know, so it can try to recover if it likes. + if ([theDelegate respondsToSelector:@selector(onSocket:willDisconnectWithError:)]) + { + [theDelegate onSocket:self willDisconnectWithError:err]; + } + } + [self close]; +} + +// Prepare partially read data for recovery. +- (void)recoverUnreadData +{ + if(theCurrentRead != nil) + { + // We never finished the current read. + // Check to see if it's a normal read packet (not AsyncSpecialPacket) and if it had read anything yet. + + if(([theCurrentRead isKindOfClass:[AsyncReadPacket class]]) && (theCurrentRead->bytesDone > 0)) + { + // We need to move its data into the front of the partial read buffer. + + void *buffer = [theCurrentRead->buffer mutableBytes] + theCurrentRead->startOffset; + + [partialReadBuffer replaceBytesInRange:NSMakeRange(0, 0) + withBytes:buffer + length:theCurrentRead->bytesDone]; + } + } + + [self emptyQueues]; +} + +- (void)emptyQueues +{ + if (theCurrentRead != nil) [self endCurrentRead]; + if (theCurrentWrite != nil) [self endCurrentWrite]; + + [theReadQueue removeAllObjects]; + [theWriteQueue removeAllObjects]; + + [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(maybeDequeueRead) object:nil]; + [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(maybeDequeueWrite) object:nil]; + + theFlags &= ~kDequeueReadScheduled; + theFlags &= ~kDequeueWriteScheduled; +} + +/** + * Disconnects. This is called for both error and clean disconnections. +**/ +- (void)close +{ + // Empty queues + [self emptyQueues]; + + // Clear partialReadBuffer (pre-buffer and also unreadData buffer in case of error) + [partialReadBuffer replaceBytesInRange:NSMakeRange(0, [partialReadBuffer length]) withBytes:NULL length:0]; + + [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(disconnect) object:nil]; + + // Stop the connection attempt timeout timer + if (theConnectTimer != nil) + { + [self endConnectTimeout]; + } + + // Close streams. + if (theReadStream != NULL) + { + [self runLoopUnscheduleReadStream]; + CFReadStreamClose(theReadStream); + CFRelease(theReadStream); + theReadStream = NULL; + } + if (theWriteStream != NULL) + { + [self runLoopUnscheduleWriteStream]; + CFWriteStreamClose(theWriteStream); + CFRelease(theWriteStream); + theWriteStream = NULL; + } + + // Close sockets. + if (theSocket4 != NULL) + { + CFSocketInvalidate (theSocket4); + CFRelease (theSocket4); + theSocket4 = NULL; + } + if (theSocket6 != NULL) + { + CFSocketInvalidate (theSocket6); + CFRelease (theSocket6); + theSocket6 = NULL; + } + + // Closing the streams or sockets resulted in closing the underlying native socket + theNativeSocket4 = 0; + theNativeSocket6 = 0; + + // Remove run loop sources + if (theSource4 != NULL) + { + [self runLoopRemoveSource:theSource4]; + CFRelease (theSource4); + theSource4 = NULL; + } + if (theSource6 != NULL) + { + [self runLoopRemoveSource:theSource6]; + CFRelease (theSource6); + theSource6 = NULL; + } + theRunLoop = NULL; + + // If the client has passed the connect/accept method, then the connection has at least begun. + // Notify delegate that it is now ending. + BOOL shouldCallDelegate = (theFlags & kDidStartDelegate); + + // Clear all flags (except the pre-buffering flag, which should remain as is) + theFlags &= kEnablePreBuffering; + + if (shouldCallDelegate) + { + if ([theDelegate respondsToSelector: @selector(onSocketDidDisconnect:)]) + { + [theDelegate onSocketDidDisconnect:self]; + } + } + + // Do not access any instance variables after calling onSocketDidDisconnect. + // This gives the delegate freedom to release us without returning here and crashing. +} + +/** + * Disconnects immediately. Any pending reads or writes are dropped. +**/ +- (void)disconnect +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + [self close]; +} + +/** + * Diconnects after all pending reads have completed. +**/ +- (void)disconnectAfterReading +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + theFlags |= (kForbidReadsWrites | kDisconnectAfterReads); + + [self maybeScheduleDisconnect]; +} + +/** + * Disconnects after all pending writes have completed. +**/ +- (void)disconnectAfterWriting +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + theFlags |= (kForbidReadsWrites | kDisconnectAfterWrites); + + [self maybeScheduleDisconnect]; +} + +/** + * Disconnects after all pending reads and writes have completed. +**/ +- (void)disconnectAfterReadingAndWriting +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + theFlags |= (kForbidReadsWrites | kDisconnectAfterReads | kDisconnectAfterWrites); + + [self maybeScheduleDisconnect]; +} + +/** + * Schedules a call to disconnect if possible. + * That is, if all writes have completed, and we're set to disconnect after writing, + * or if all reads have completed, and we're set to disconnect after reading. +**/ +- (void)maybeScheduleDisconnect +{ + BOOL shouldDisconnect = NO; + + if(theFlags & kDisconnectAfterReads) + { + if(([theReadQueue count] == 0) && (theCurrentRead == nil)) + { + if(theFlags & kDisconnectAfterWrites) + { + if(([theWriteQueue count] == 0) && (theCurrentWrite == nil)) + { + shouldDisconnect = YES; + } + } + else + { + shouldDisconnect = YES; + } + } + } + else if(theFlags & kDisconnectAfterWrites) + { + if(([theWriteQueue count] == 0) && (theCurrentWrite == nil)) + { + shouldDisconnect = YES; + } + } + + if(shouldDisconnect) + { + [self performSelector:@selector(disconnect) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + } +} + +/** + * In the event of an error, this method may be called during onSocket:willDisconnectWithError: to read + * any data that's left on the socket. +**/ +- (NSData *)unreadData +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + // Ensure this method will only return data in the event of an error + if (!(theFlags & kClosingWithError)) return nil; + + if (theReadStream == NULL) return nil; + + NSUInteger totalBytesRead = [partialReadBuffer length]; + + BOOL error = NO; + while (!error && CFReadStreamHasBytesAvailable(theReadStream)) + { + if (totalBytesRead == [partialReadBuffer length]) + { + [partialReadBuffer increaseLengthBy:READALL_CHUNKSIZE]; + } + + // Number of bytes to read is space left in packet buffer. + NSUInteger bytesToRead = [partialReadBuffer length] - totalBytesRead; + + // Read data into packet buffer + UInt8 *packetbuf = (UInt8 *)( [partialReadBuffer mutableBytes] + totalBytesRead ); + + CFIndex result = CFReadStreamRead(theReadStream, packetbuf, bytesToRead); + + // Check results + if (result < 0) + { + error = YES; + } + else + { + CFIndex bytesRead = result; + + totalBytesRead += bytesRead; + } + } + + [partialReadBuffer setLength:totalBytesRead]; + + return partialReadBuffer; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Errors +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Returns a standard error object for the current errno value. + * Errno is used for low-level BSD socket errors. +**/ +- (NSError *)getErrnoError +{ + NSString *errorMsg = [NSString stringWithUTF8String:strerror(errno)]; + NSDictionary *userInfo = [NSDictionary dictionaryWithObject:errorMsg forKey:NSLocalizedDescriptionKey]; + + return [NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:userInfo]; +} + +/** + * Returns a standard error message for a CFSocket error. + * Unfortunately, CFSocket offers no feedback on its errors. +**/ +- (NSError *)getSocketError +{ + NSString *errMsg = NSLocalizedStringWithDefaultValue(@"AsyncSocketCFSocketError", + @"AsyncSocket", [NSBundle mainBundle], + @"General CFSocket error", nil); + + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + return [NSError errorWithDomain:AsyncSocketErrorDomain code:AsyncSocketCFSocketError userInfo:info]; +} + +- (NSError *)getStreamError +{ + CFStreamError err; + if (theReadStream != NULL) + { + err = CFReadStreamGetError (theReadStream); + if (err.error != 0) return [self errorFromCFStreamError: err]; + } + + if (theWriteStream != NULL) + { + err = CFWriteStreamGetError (theWriteStream); + if (err.error != 0) return [self errorFromCFStreamError: err]; + } + + return nil; +} + +/** + * Returns a standard AsyncSocket abort error. +**/ +- (NSError *)getAbortError +{ + NSString *errMsg = NSLocalizedStringWithDefaultValue(@"AsyncSocketCanceledError", + @"AsyncSocket", [NSBundle mainBundle], + @"Connection canceled", nil); + + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + return [NSError errorWithDomain:AsyncSocketErrorDomain code:AsyncSocketCanceledError userInfo:info]; +} + +/** + * Returns a standard AsyncSocket connect timeout error. +**/ +- (NSError *)getConnectTimeoutError +{ + NSString *errMsg = NSLocalizedStringWithDefaultValue(@"AsyncSocketConnectTimeoutError", + @"AsyncSocket", [NSBundle mainBundle], + @"Attempt to connect to host timed out", nil); + + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + return [NSError errorWithDomain:AsyncSocketErrorDomain code:AsyncSocketConnectTimeoutError userInfo:info]; +} + +/** + * Returns a standard AsyncSocket maxed out error. +**/ +- (NSError *)getReadMaxedOutError +{ + NSString *errMsg = NSLocalizedStringWithDefaultValue(@"AsyncSocketReadMaxedOutError", + @"AsyncSocket", [NSBundle mainBundle], + @"Read operation reached set maximum length", nil); + + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + return [NSError errorWithDomain:AsyncSocketErrorDomain code:AsyncSocketReadMaxedOutError userInfo:info]; +} + +/** + * Returns a standard AsyncSocket read timeout error. +**/ +- (NSError *)getReadTimeoutError +{ + NSString *errMsg = NSLocalizedStringWithDefaultValue(@"AsyncSocketReadTimeoutError", + @"AsyncSocket", [NSBundle mainBundle], + @"Read operation timed out", nil); + + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + return [NSError errorWithDomain:AsyncSocketErrorDomain code:AsyncSocketReadTimeoutError userInfo:info]; +} + +/** + * Returns a standard AsyncSocket write timeout error. +**/ +- (NSError *)getWriteTimeoutError +{ + NSString *errMsg = NSLocalizedStringWithDefaultValue(@"AsyncSocketWriteTimeoutError", + @"AsyncSocket", [NSBundle mainBundle], + @"Write operation timed out", nil); + + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + return [NSError errorWithDomain:AsyncSocketErrorDomain code:AsyncSocketWriteTimeoutError userInfo:info]; +} + +- (NSError *)errorFromCFStreamError:(CFStreamError)err +{ + if (err.domain == 0 && err.error == 0) return nil; + + // Can't use switch; these constants aren't int literals. + NSString *domain = @"CFStreamError (unlisted domain)"; + NSString *message = nil; + + if(err.domain == kCFStreamErrorDomainPOSIX) { + domain = NSPOSIXErrorDomain; + } + else if(err.domain == kCFStreamErrorDomainMacOSStatus) { + domain = NSOSStatusErrorDomain; + } + else if(err.domain == kCFStreamErrorDomainMach) { + domain = NSMachErrorDomain; + } + else if(err.domain == kCFStreamErrorDomainNetDB) + { + domain = @"kCFStreamErrorDomainNetDB"; + message = [NSString stringWithCString:gai_strerror(err.error) encoding:NSASCIIStringEncoding]; + } + else if(err.domain == kCFStreamErrorDomainNetServices) { + domain = @"kCFStreamErrorDomainNetServices"; + } + else if(err.domain == kCFStreamErrorDomainSOCKS) { + domain = @"kCFStreamErrorDomainSOCKS"; + } + else if(err.domain == kCFStreamErrorDomainSystemConfiguration) { + domain = @"kCFStreamErrorDomainSystemConfiguration"; + } + else if(err.domain == kCFStreamErrorDomainSSL) { + domain = @"kCFStreamErrorDomainSSL"; + } + + NSDictionary *info = nil; + if(message != nil) + { + info = [NSDictionary dictionaryWithObject:message forKey:NSLocalizedDescriptionKey]; + } + return [NSError errorWithDomain:domain code:err.error userInfo:info]; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Diagnostics +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)isDisconnected +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + if (theNativeSocket4 > 0) return NO; + if (theNativeSocket6 > 0) return NO; + + if (theSocket4) return NO; + if (theSocket6) return NO; + + if (theReadStream) return NO; + if (theWriteStream) return NO; + + return YES; +} + +- (BOOL)isConnected +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + return [self areStreamsConnected]; +} + +- (NSString *)connectedHost +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + if(theSocket4) + return [self connectedHostFromCFSocket4:theSocket4]; + if(theSocket6) + return [self connectedHostFromCFSocket6:theSocket6]; + + if(theNativeSocket4 > 0) + return [self connectedHostFromNativeSocket4:theNativeSocket4]; + if(theNativeSocket6 > 0) + return [self connectedHostFromNativeSocket6:theNativeSocket6]; + + return nil; +} + +- (UInt16)connectedPort +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + if(theSocket4) + return [self connectedPortFromCFSocket4:theSocket4]; + if(theSocket6) + return [self connectedPortFromCFSocket6:theSocket6]; + + if(theNativeSocket4 > 0) + return [self connectedPortFromNativeSocket4:theNativeSocket4]; + if(theNativeSocket6 > 0) + return [self connectedPortFromNativeSocket6:theNativeSocket6]; + + return 0; +} + +- (NSString *)localHost +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + if(theSocket4) + return [self localHostFromCFSocket4:theSocket4]; + if(theSocket6) + return [self localHostFromCFSocket6:theSocket6]; + + if(theNativeSocket4 > 0) + return [self localHostFromNativeSocket4:theNativeSocket4]; + if(theNativeSocket6 > 0) + return [self localHostFromNativeSocket6:theNativeSocket6]; + + return nil; +} + +- (UInt16)localPort +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + if(theSocket4) + return [self localPortFromCFSocket4:theSocket4]; + if(theSocket6) + return [self localPortFromCFSocket6:theSocket6]; + + if(theNativeSocket4 > 0) + return [self localPortFromNativeSocket4:theNativeSocket4]; + if(theNativeSocket6 > 0) + return [self localPortFromNativeSocket6:theNativeSocket6]; + + return 0; +} + +- (NSString *)connectedHost4 +{ + if(theSocket4) + return [self connectedHostFromCFSocket4:theSocket4]; + if(theNativeSocket4 > 0) + return [self connectedHostFromNativeSocket4:theNativeSocket4]; + + return nil; +} + +- (NSString *)connectedHost6 +{ + if(theSocket6) + return [self connectedHostFromCFSocket6:theSocket6]; + if(theNativeSocket6 > 0) + return [self connectedHostFromNativeSocket6:theNativeSocket6]; + + return nil; +} + +- (UInt16)connectedPort4 +{ + if(theSocket4) + return [self connectedPortFromCFSocket4:theSocket4]; + if(theNativeSocket4 > 0) + return [self connectedPortFromNativeSocket4:theNativeSocket4]; + + return 0; +} + +- (UInt16)connectedPort6 +{ + if(theSocket6) + return [self connectedPortFromCFSocket6:theSocket6]; + if(theNativeSocket6 > 0) + return [self connectedPortFromNativeSocket6:theNativeSocket6]; + + return 0; +} + +- (NSString *)localHost4 +{ + if(theSocket4) + return [self localHostFromCFSocket4:theSocket4]; + if(theNativeSocket4 > 0) + return [self localHostFromNativeSocket4:theNativeSocket4]; + + return nil; +} + +- (NSString *)localHost6 +{ + if(theSocket6) + return [self localHostFromCFSocket6:theSocket6]; + if(theNativeSocket6 > 0) + return [self localHostFromNativeSocket6:theNativeSocket6]; + + return nil; +} + +- (UInt16)localPort4 +{ + if(theSocket4) + return [self localPortFromCFSocket4:theSocket4]; + if(theNativeSocket4 > 0) + return [self localPortFromNativeSocket4:theNativeSocket4]; + + return 0; +} + +- (UInt16)localPort6 +{ + if(theSocket6) + return [self localPortFromCFSocket6:theSocket6]; + if(theNativeSocket6 > 0) + return [self localPortFromNativeSocket6:theNativeSocket6]; + + return 0; +} + +- (NSString *)connectedHostFromNativeSocket4:(CFSocketNativeHandle)theNativeSocket +{ + struct sockaddr_in sockaddr4; + socklen_t sockaddr4len = sizeof(sockaddr4); + + if(getpeername(theNativeSocket, (struct sockaddr *)&sockaddr4, &sockaddr4len) < 0) + { + return nil; + } + return [self hostFromAddress4:&sockaddr4]; +} + +- (NSString *)connectedHostFromNativeSocket6:(CFSocketNativeHandle)theNativeSocket +{ + struct sockaddr_in6 sockaddr6; + socklen_t sockaddr6len = sizeof(sockaddr6); + + if(getpeername(theNativeSocket, (struct sockaddr *)&sockaddr6, &sockaddr6len) < 0) + { + return nil; + } + return [self hostFromAddress6:&sockaddr6]; +} + +- (NSString *)connectedHostFromCFSocket4:(CFSocketRef)theSocket +{ + CFDataRef peeraddr; + NSString *peerstr = nil; + + if((peeraddr = CFSocketCopyPeerAddress(theSocket))) + { + struct sockaddr_in *pSockAddr = (struct sockaddr_in *)CFDataGetBytePtr(peeraddr); + + peerstr = [self hostFromAddress4:pSockAddr]; + CFRelease (peeraddr); + } + + return peerstr; +} + +- (NSString *)connectedHostFromCFSocket6:(CFSocketRef)theSocket +{ + CFDataRef peeraddr; + NSString *peerstr = nil; + + if((peeraddr = CFSocketCopyPeerAddress(theSocket))) + { + struct sockaddr_in6 *pSockAddr = (struct sockaddr_in6 *)CFDataGetBytePtr(peeraddr); + + peerstr = [self hostFromAddress6:pSockAddr]; + CFRelease (peeraddr); + } + + return peerstr; +} + +- (UInt16)connectedPortFromNativeSocket4:(CFSocketNativeHandle)theNativeSocket +{ + struct sockaddr_in sockaddr4; + socklen_t sockaddr4len = sizeof(sockaddr4); + + if(getpeername(theNativeSocket, (struct sockaddr *)&sockaddr4, &sockaddr4len) < 0) + { + return 0; + } + return [self portFromAddress4:&sockaddr4]; +} + +- (UInt16)connectedPortFromNativeSocket6:(CFSocketNativeHandle)theNativeSocket +{ + struct sockaddr_in6 sockaddr6; + socklen_t sockaddr6len = sizeof(sockaddr6); + + if(getpeername(theNativeSocket, (struct sockaddr *)&sockaddr6, &sockaddr6len) < 0) + { + return 0; + } + return [self portFromAddress6:&sockaddr6]; +} + +- (UInt16)connectedPortFromCFSocket4:(CFSocketRef)theSocket +{ + CFDataRef peeraddr; + UInt16 peerport = 0; + + if((peeraddr = CFSocketCopyPeerAddress(theSocket))) + { + struct sockaddr_in *pSockAddr = (struct sockaddr_in *)CFDataGetBytePtr(peeraddr); + + peerport = [self portFromAddress4:pSockAddr]; + CFRelease (peeraddr); + } + + return peerport; +} + +- (UInt16)connectedPortFromCFSocket6:(CFSocketRef)theSocket +{ + CFDataRef peeraddr; + UInt16 peerport = 0; + + if((peeraddr = CFSocketCopyPeerAddress(theSocket))) + { + struct sockaddr_in6 *pSockAddr = (struct sockaddr_in6 *)CFDataGetBytePtr(peeraddr); + + peerport = [self portFromAddress6:pSockAddr]; + CFRelease (peeraddr); + } + + return peerport; +} + +- (NSString *)localHostFromNativeSocket4:(CFSocketNativeHandle)theNativeSocket +{ + struct sockaddr_in sockaddr4; + socklen_t sockaddr4len = sizeof(sockaddr4); + + if(getsockname(theNativeSocket, (struct sockaddr *)&sockaddr4, &sockaddr4len) < 0) + { + return nil; + } + return [self hostFromAddress4:&sockaddr4]; +} + +- (NSString *)localHostFromNativeSocket6:(CFSocketNativeHandle)theNativeSocket +{ + struct sockaddr_in6 sockaddr6; + socklen_t sockaddr6len = sizeof(sockaddr6); + + if(getsockname(theNativeSocket, (struct sockaddr *)&sockaddr6, &sockaddr6len) < 0) + { + return nil; + } + return [self hostFromAddress6:&sockaddr6]; +} + +- (NSString *)localHostFromCFSocket4:(CFSocketRef)theSocket +{ + CFDataRef selfaddr; + NSString *selfstr = nil; + + if((selfaddr = CFSocketCopyAddress(theSocket))) + { + struct sockaddr_in *pSockAddr = (struct sockaddr_in *)CFDataGetBytePtr(selfaddr); + + selfstr = [self hostFromAddress4:pSockAddr]; + CFRelease (selfaddr); + } + + return selfstr; +} + +- (NSString *)localHostFromCFSocket6:(CFSocketRef)theSocket +{ + CFDataRef selfaddr; + NSString *selfstr = nil; + + if((selfaddr = CFSocketCopyAddress(theSocket))) + { + struct sockaddr_in6 *pSockAddr = (struct sockaddr_in6 *)CFDataGetBytePtr(selfaddr); + + selfstr = [self hostFromAddress6:pSockAddr]; + CFRelease (selfaddr); + } + + return selfstr; +} + +- (UInt16)localPortFromNativeSocket4:(CFSocketNativeHandle)theNativeSocket +{ + struct sockaddr_in sockaddr4; + socklen_t sockaddr4len = sizeof(sockaddr4); + + if(getsockname(theNativeSocket, (struct sockaddr *)&sockaddr4, &sockaddr4len) < 0) + { + return 0; + } + return [self portFromAddress4:&sockaddr4]; +} + +- (UInt16)localPortFromNativeSocket6:(CFSocketNativeHandle)theNativeSocket +{ + struct sockaddr_in6 sockaddr6; + socklen_t sockaddr6len = sizeof(sockaddr6); + + if(getsockname(theNativeSocket, (struct sockaddr *)&sockaddr6, &sockaddr6len) < 0) + { + return 0; + } + return [self portFromAddress6:&sockaddr6]; +} + +- (UInt16)localPortFromCFSocket4:(CFSocketRef)theSocket +{ + CFDataRef selfaddr; + UInt16 selfport = 0; + + if ((selfaddr = CFSocketCopyAddress(theSocket))) + { + struct sockaddr_in *pSockAddr = (struct sockaddr_in *)CFDataGetBytePtr(selfaddr); + + selfport = [self portFromAddress4:pSockAddr]; + CFRelease (selfaddr); + } + + return selfport; +} + +- (UInt16)localPortFromCFSocket6:(CFSocketRef)theSocket +{ + CFDataRef selfaddr; + UInt16 selfport = 0; + + if ((selfaddr = CFSocketCopyAddress(theSocket))) + { + struct sockaddr_in6 *pSockAddr = (struct sockaddr_in6 *)CFDataGetBytePtr(selfaddr); + + selfport = [self portFromAddress6:pSockAddr]; + CFRelease (selfaddr); + } + + return selfport; +} + +- (NSString *)hostFromAddress4:(struct sockaddr_in *)pSockaddr4 +{ + char addrBuf[INET_ADDRSTRLEN]; + + if(inet_ntop(AF_INET, &pSockaddr4->sin_addr, addrBuf, (socklen_t)sizeof(addrBuf)) == NULL) + { + [NSException raise:NSInternalInconsistencyException format:@"Cannot convert IPv4 address to string."]; + } + + return [NSString stringWithCString:addrBuf encoding:NSASCIIStringEncoding]; +} + +- (NSString *)hostFromAddress6:(struct sockaddr_in6 *)pSockaddr6 +{ + char addrBuf[INET6_ADDRSTRLEN]; + + if(inet_ntop(AF_INET6, &pSockaddr6->sin6_addr, addrBuf, (socklen_t)sizeof(addrBuf)) == NULL) + { + [NSException raise:NSInternalInconsistencyException format:@"Cannot convert IPv6 address to string."]; + } + + return [NSString stringWithCString:addrBuf encoding:NSASCIIStringEncoding]; +} + +- (UInt16)portFromAddress4:(struct sockaddr_in *)pSockaddr4 +{ + return ntohs(pSockaddr4->sin_port); +} + +- (UInt16)portFromAddress6:(struct sockaddr_in6 *)pSockaddr6 +{ + return ntohs(pSockaddr6->sin6_port); +} + +- (NSData *)connectedAddress +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + // Extract address from CFSocket + + CFSocketRef theSocket; + + if (theSocket4) + theSocket = theSocket4; + else + theSocket = theSocket6; + + if (theSocket) + { + CFDataRef peeraddr = CFSocketCopyPeerAddress(theSocket); + + if (peeraddr == NULL) return nil; + + NSData *result = (__bridge_transfer NSData *)peeraddr; + return result; + } + + // Extract address from CFSocketNativeHandle + + socklen_t sockaddrlen; + CFSocketNativeHandle theNativeSocket = 0; + + if (theNativeSocket4 > 0) + { + theNativeSocket = theNativeSocket4; + sockaddrlen = sizeof(struct sockaddr_in); + } + else + { + theNativeSocket = theNativeSocket6; + sockaddrlen = sizeof(struct sockaddr_in6); + } + + NSData *result = nil; + void *sockaddr = malloc(sockaddrlen); + + if(getpeername(theNativeSocket, (struct sockaddr *)sockaddr, &sockaddrlen) >= 0) + { + result = [NSData dataWithBytesNoCopy:sockaddr length:sockaddrlen freeWhenDone:YES]; + } + else + { + free(sockaddr); + } + + return result; +} + +- (NSData *)localAddress +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + // Extract address from CFSocket + + CFSocketRef theSocket; + + if (theSocket4) + theSocket = theSocket4; + else + theSocket = theSocket6; + + if (theSocket) + { + CFDataRef selfaddr = CFSocketCopyAddress(theSocket); + + if (selfaddr == NULL) return nil; + + NSData *result = (__bridge_transfer NSData *)selfaddr; + return result; + } + + // Extract address from CFSocketNativeHandle + + socklen_t sockaddrlen; + CFSocketNativeHandle theNativeSocket = 0; + + if (theNativeSocket4 > 0) + { + theNativeSocket = theNativeSocket4; + sockaddrlen = sizeof(struct sockaddr_in); + } + else + { + theNativeSocket = theNativeSocket6; + sockaddrlen = sizeof(struct sockaddr_in6); + } + + NSData *result = nil; + void *sockaddr = malloc(sockaddrlen); + + if(getsockname(theNativeSocket, (struct sockaddr *)sockaddr, &sockaddrlen) >= 0) + { + result = [NSData dataWithBytesNoCopy:sockaddr length:sockaddrlen freeWhenDone:YES]; + } + else + { + free(sockaddr); + } + + return result; +} + +- (BOOL)isIPv4 +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + return (theNativeSocket4 > 0 || theSocket4 != NULL); +} + +- (BOOL)isIPv6 +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + return (theNativeSocket6 > 0 || theSocket6 != NULL); +} + +- (BOOL)areStreamsConnected +{ + CFStreamStatus s; + + if (theReadStream != NULL) + { + s = CFReadStreamGetStatus(theReadStream); + if ( !(s == kCFStreamStatusOpen || s == kCFStreamStatusReading || s == kCFStreamStatusError) ) + return NO; + } + else return NO; + + if (theWriteStream != NULL) + { + s = CFWriteStreamGetStatus(theWriteStream); + if ( !(s == kCFStreamStatusOpen || s == kCFStreamStatusWriting || s == kCFStreamStatusError) ) + return NO; + } + else return NO; + + return YES; +} + +- (NSString *)description +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + static const char *statstr[] = {"not open","opening","open","reading","writing","at end","closed","has error"}; + CFStreamStatus rs = (theReadStream != NULL) ? CFReadStreamGetStatus(theReadStream) : 0; + CFStreamStatus ws = (theWriteStream != NULL) ? CFWriteStreamGetStatus(theWriteStream) : 0; + + NSString *peerstr, *selfstr; + + BOOL is4 = [self isIPv4]; + BOOL is6 = [self isIPv6]; + + if (is4 || is6) + { + if (is4 && is6) + { + peerstr = [NSString stringWithFormat: @"%@/%@ %u", + [self connectedHost4], + [self connectedHost6], + [self connectedPort]]; + } + else if (is4) + { + peerstr = [NSString stringWithFormat: @"%@ %u", + [self connectedHost4], + [self connectedPort4]]; + } + else + { + peerstr = [NSString stringWithFormat: @"%@ %u", + [self connectedHost6], + [self connectedPort6]]; + } + } + else peerstr = @"nowhere"; + + if (is4 || is6) + { + if (is4 && is6) + { + selfstr = [NSString stringWithFormat: @"%@/%@ %u", + [self localHost4], + [self localHost6], + [self localPort]]; + } + else if (is4) + { + selfstr = [NSString stringWithFormat: @"%@ %u", + [self localHost4], + [self localPort4]]; + } + else + { + selfstr = [NSString stringWithFormat: @"%@ %u", + [self localHost6], + [self localPort6]]; + } + } + else selfstr = @"nowhere"; + + NSMutableString *ms = [[NSMutableString alloc] initWithCapacity:150]; + + [ms appendString:[NSString stringWithFormat:@"readLength > 0) + percentDone = (float)theCurrentRead->bytesDone / (float)theCurrentRead->readLength * 100.0F; + else + percentDone = 100.0F; + + [ms appendString: [NSString stringWithFormat:@"currently read %u bytes (%d%% done), ", + (unsigned int)[theCurrentRead->buffer length], + theCurrentRead->bytesDone ? percentDone : 0]]; + } + + if (theCurrentWrite == nil || [theCurrentWrite isKindOfClass:[AsyncSpecialPacket class]]) + [ms appendString: @"no current write, "]; + else + { + int percentDone = (float)theCurrentWrite->bytesDone / (float)[theCurrentWrite->buffer length] * 100.0F; + + [ms appendString: [NSString stringWithFormat:@"currently written %u (%d%%), ", + (unsigned int)[theCurrentWrite->buffer length], + theCurrentWrite->bytesDone ? percentDone : 0]]; + } + + [ms appendString:[NSString stringWithFormat:@"read stream %p %s, ", theReadStream, statstr[rs]]]; + [ms appendString:[NSString stringWithFormat:@"write stream %p %s", theWriteStream, statstr[ws]]]; + + if(theFlags & kDisconnectAfterReads) + { + if(theFlags & kDisconnectAfterWrites) + [ms appendString: @", will disconnect after reads & writes"]; + else + [ms appendString: @", will disconnect after reads"]; + } + else if(theFlags & kDisconnectAfterWrites) + { + [ms appendString: @", will disconnect after writes"]; + } + + if (![self isConnected]) [ms appendString: @", not connected"]; + + [ms appendString:@">"]; + + return ms; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Reading +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag +{ + [self readDataWithTimeout:timeout buffer:nil bufferOffset:0 maxLength:0 tag:tag]; +} + +- (void)readDataWithTimeout:(NSTimeInterval)timeout + buffer:(NSMutableData *)buffer + bufferOffset:(NSUInteger)offset + tag:(long)tag +{ + [self readDataWithTimeout:timeout buffer:buffer bufferOffset:offset maxLength:0 tag:tag]; +} + +- (void)readDataWithTimeout:(NSTimeInterval)timeout + buffer:(NSMutableData *)buffer + bufferOffset:(NSUInteger)offset + maxLength:(NSUInteger)length + tag:(long)tag +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + if (offset > [buffer length]) return; + if (theFlags & kForbidReadsWrites) return; + + AsyncReadPacket *packet = [[AsyncReadPacket alloc] initWithData:buffer + startOffset:offset + maxLength:length + timeout:timeout + readLength:0 + terminator:nil + tag:tag]; + [theReadQueue addObject:packet]; + [self scheduleDequeueRead]; + +} + +- (void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag +{ + [self readDataToLength:length withTimeout:timeout buffer:nil bufferOffset:0 tag:tag]; +} + +- (void)readDataToLength:(NSUInteger)length + withTimeout:(NSTimeInterval)timeout + buffer:(NSMutableData *)buffer + bufferOffset:(NSUInteger)offset + tag:(long)tag +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + if (length == 0) return; + if (offset > [buffer length]) return; + if (theFlags & kForbidReadsWrites) return; + + AsyncReadPacket *packet = [[AsyncReadPacket alloc] initWithData:buffer + startOffset:offset + maxLength:0 + timeout:timeout + readLength:length + terminator:nil + tag:tag]; + [theReadQueue addObject:packet]; + [self scheduleDequeueRead]; + +} + +- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag +{ + [self readDataToData:data withTimeout:timeout buffer:nil bufferOffset:0 maxLength:0 tag:tag]; +} + +- (void)readDataToData:(NSData *)data + withTimeout:(NSTimeInterval)timeout + buffer:(NSMutableData *)buffer + bufferOffset:(NSUInteger)offset + tag:(long)tag +{ + [self readDataToData:data withTimeout:timeout buffer:buffer bufferOffset:offset maxLength:0 tag:tag]; +} + +- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout maxLength:(NSUInteger)length tag:(long)tag +{ + [self readDataToData:data withTimeout:timeout buffer:nil bufferOffset:0 maxLength:length tag:tag]; +} + +- (void)readDataToData:(NSData *)data + withTimeout:(NSTimeInterval)timeout + buffer:(NSMutableData *)buffer + bufferOffset:(NSUInteger)offset + maxLength:(NSUInteger)length + tag:(long)tag +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + if (data == nil || [data length] == 0) return; + if (offset > [buffer length]) return; + if (length > 0 && length < [data length]) return; + if (theFlags & kForbidReadsWrites) return; + + AsyncReadPacket *packet = [[AsyncReadPacket alloc] initWithData:buffer + startOffset:offset + maxLength:length + timeout:timeout + readLength:0 + terminator:data + tag:tag]; + [theReadQueue addObject:packet]; + [self scheduleDequeueRead]; + +} + +/** + * Puts a maybeDequeueRead on the run loop. + * An assumption here is that selectors will be performed consecutively within their priority. +**/ +- (void)scheduleDequeueRead +{ + if((theFlags & kDequeueReadScheduled) == 0) + { + theFlags |= kDequeueReadScheduled; + [self performSelector:@selector(maybeDequeueRead) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + } +} + +/** + * This method starts a new read, if needed. + * It is called when a user requests a read, + * or when a stream opens that may have requested reads sitting in the queue, etc. +**/ +- (void)maybeDequeueRead +{ + // Unset the flag indicating a call to this method is scheduled + theFlags &= ~kDequeueReadScheduled; + + // If we're not currently processing a read AND we have an available read stream + if((theCurrentRead == nil) && (theReadStream != NULL)) + { + if([theReadQueue count] > 0) + { + // Dequeue the next object in the write queue + theCurrentRead = [theReadQueue objectAtIndex:0]; + [theReadQueue removeObjectAtIndex:0]; + + if([theCurrentRead isKindOfClass:[AsyncSpecialPacket class]]) + { + // Attempt to start TLS + theFlags |= kStartingReadTLS; + + // This method won't do anything unless both kStartingReadTLS and kStartingWriteTLS are set + [self maybeStartTLS]; + } + else + { + // Start time-out timer + if(theCurrentRead->timeout >= 0.0) + { + theReadTimer = [NSTimer timerWithTimeInterval:theCurrentRead->timeout + target:self + selector:@selector(doReadTimeout:) + userInfo:nil + repeats:NO]; + [self runLoopAddTimer:theReadTimer]; + } + + // Immediately read, if possible + [self doBytesAvailable]; + } + } + else if(theFlags & kDisconnectAfterReads) + { + if(theFlags & kDisconnectAfterWrites) + { + if(([theWriteQueue count] == 0) && (theCurrentWrite == nil)) + { + [self disconnect]; + } + } + else + { + [self disconnect]; + } + } + } +} + +/** + * Call this method in doBytesAvailable instead of CFReadStreamHasBytesAvailable(). + * This method supports pre-buffering properly as well as the kSocketHasBytesAvailable flag. +**/ +- (BOOL)hasBytesAvailable +{ + if ((theFlags & kSocketHasBytesAvailable) || ([partialReadBuffer length] > 0)) + { + return YES; + } + else + { + return CFReadStreamHasBytesAvailable(theReadStream); + } +} + +/** + * Call this method in doBytesAvailable instead of CFReadStreamRead(). + * This method support pre-buffering properly. +**/ +- (CFIndex)readIntoBuffer:(void *)buffer maxLength:(NSUInteger)length +{ + if([partialReadBuffer length] > 0) + { + // Determine the maximum amount of data to read + NSUInteger bytesToRead = MIN(length, [partialReadBuffer length]); + + // Copy the bytes from the partial read buffer + memcpy(buffer, [partialReadBuffer bytes], (size_t)bytesToRead); + + // Remove the copied bytes from the partial read buffer + [partialReadBuffer replaceBytesInRange:NSMakeRange(0, bytesToRead) withBytes:NULL length:0]; + + return (CFIndex)bytesToRead; + } + else + { + // Unset the "has-bytes-available" flag + theFlags &= ~kSocketHasBytesAvailable; + + return CFReadStreamRead(theReadStream, (UInt8 *)buffer, length); + } +} + +/** + * This method is called when a new read is taken from the read queue or when new data becomes available on the stream. +**/ +- (void)doBytesAvailable +{ + // If data is available on the stream, but there is no read request, then we don't need to process the data yet. + // Also, if there is a read request but no read stream setup, we can't process any data yet. + if((theCurrentRead == nil) || (theReadStream == NULL)) + { + return; + } + + // Note: This method is not called if theCurrentRead is an AsyncSpecialPacket (startTLS packet) + + NSUInteger totalBytesRead = 0; + + BOOL done = NO; + BOOL socketError = NO; + BOOL maxoutError = NO; + + while(!done && !socketError && !maxoutError && [self hasBytesAvailable]) + { + BOOL didPreBuffer = NO; + BOOL didReadFromPreBuffer = NO; + + // There are 3 types of read packets: + // + // 1) Read all available data. + // 2) Read a specific length of data. + // 3) Read up to a particular terminator. + + NSUInteger bytesToRead; + + if (theCurrentRead->term != nil) + { + // Read type #3 - read up to a terminator + // + // If pre-buffering is enabled we'll read a chunk and search for the terminator. + // If the terminator is found, overflow data will be placed in the partialReadBuffer for the next read. + // + // If pre-buffering is disabled we'll be forced to read only a few bytes. + // Just enough to ensure we don't go past our term or over our max limit. + // + // If we already have data pre-buffered, we can read directly from it. + + if ([partialReadBuffer length] > 0) + { + didReadFromPreBuffer = YES; + bytesToRead = [theCurrentRead readLengthForTermWithPreBuffer:partialReadBuffer found:&done]; + } + else + { + if (theFlags & kEnablePreBuffering) + { + didPreBuffer = YES; + bytesToRead = [theCurrentRead prebufferReadLengthForTerm]; + } + else + { + bytesToRead = [theCurrentRead readLengthForTerm]; + } + } + } + else + { + // Read type #1 or #2 + + bytesToRead = [theCurrentRead readLengthForNonTerm]; + } + + // Make sure we have enough room in the buffer for our read + + NSUInteger buffSize = [theCurrentRead->buffer length]; + NSUInteger buffSpace = buffSize - theCurrentRead->startOffset - theCurrentRead->bytesDone; + + if (bytesToRead > buffSpace) + { + NSUInteger buffInc = bytesToRead - buffSpace; + + [theCurrentRead->buffer increaseLengthBy:buffInc]; + } + + // Read data into packet buffer + + void *buffer = [theCurrentRead->buffer mutableBytes] + theCurrentRead->startOffset; + void *subBuffer = buffer + theCurrentRead->bytesDone; + + CFIndex result = [self readIntoBuffer:subBuffer maxLength:bytesToRead]; + + // Check results + if (result < 0) + { + socketError = YES; + } + else + { + CFIndex bytesRead = result; + + // Update total amount read for the current read + theCurrentRead->bytesDone += bytesRead; + + // Update total amount read in this method invocation + totalBytesRead += bytesRead; + + + // Is packet done? + if (theCurrentRead->readLength > 0) + { + // Read type #2 - read a specific length of data + + done = (theCurrentRead->bytesDone == theCurrentRead->readLength); + } + else if (theCurrentRead->term != nil) + { + // Read type #3 - read up to a terminator + + if (didPreBuffer) + { + // Search for the terminating sequence within the big chunk we just read. + + NSInteger overflow = [theCurrentRead searchForTermAfterPreBuffering:result]; + + if (overflow > 0) + { + // Copy excess data into partialReadBuffer + void *overflowBuffer = buffer + theCurrentRead->bytesDone - overflow; + + [partialReadBuffer appendBytes:overflowBuffer length:overflow]; + + // Update the bytesDone variable. + theCurrentRead->bytesDone -= overflow; + + // Note: The completeCurrentRead method will trim the buffer for us. + } + + done = (overflow >= 0); + } + else if (didReadFromPreBuffer) + { + // Our 'done' variable was updated via the readLengthForTermWithPreBuffer:found: method + } + else + { + // Search for the terminating sequence at the end of the buffer + + NSUInteger termlen = [theCurrentRead->term length]; + + if(theCurrentRead->bytesDone >= termlen) + { + void *bufferEnd = buffer + (theCurrentRead->bytesDone - termlen); + + const void *seq = [theCurrentRead->term bytes]; + + done = (memcmp (bufferEnd, seq, termlen) == 0); + } + } + + if(!done && theCurrentRead->maxLength > 0) + { + // We're not done and there's a set maxLength. + // Have we reached that maxLength yet? + + if(theCurrentRead->bytesDone >= theCurrentRead->maxLength) + { + maxoutError = YES; + } + } + } + else + { + // Read type #1 - read all available data + // + // We're done when: + // - we reach maxLength (if there is a max) + // - all readable is read (see below) + + if (theCurrentRead->maxLength > 0) + { + done = (theCurrentRead->bytesDone >= theCurrentRead->maxLength); + } + } + } + } + + if (theCurrentRead->readLength <= 0 && theCurrentRead->term == nil) + { + // Read type #1 - read all available data + + if (theCurrentRead->bytesDone > 0) + { + // Ran out of bytes, so the "read-all-available-data" type packet is done + done = YES; + } + } + + if (done) + { + [self completeCurrentRead]; + if (!socketError) [self scheduleDequeueRead]; + } + else if (totalBytesRead > 0) + { + // We're not done with the readToLength or readToData yet, but we have read in some bytes + if ([theDelegate respondsToSelector:@selector(onSocket:didReadPartialDataOfLength:tag:)]) + { + [theDelegate onSocket:self didReadPartialDataOfLength:totalBytesRead tag:theCurrentRead->tag]; + } + } + + if(socketError) + { + CFStreamError err = CFReadStreamGetError(theReadStream); + [self closeWithError:[self errorFromCFStreamError:err]]; + return; + } + + if(maxoutError) + { + [self closeWithError:[self getReadMaxedOutError]]; + return; + } +} + +// Ends current read and calls delegate. +- (void)completeCurrentRead +{ + NSAssert(theCurrentRead, @"Trying to complete current read when there is no current read."); + + NSData *result; + + if (theCurrentRead->bufferOwner) + { + // We created the buffer on behalf of the user. + // Trim our buffer to be the proper size. + [theCurrentRead->buffer setLength:theCurrentRead->bytesDone]; + + result = theCurrentRead->buffer; + } + else + { + // We did NOT create the buffer. + // The buffer is owned by the caller. + // Only trim the buffer if we had to increase its size. + + if ([theCurrentRead->buffer length] > theCurrentRead->originalBufferLength) + { + NSUInteger readSize = theCurrentRead->startOffset + theCurrentRead->bytesDone; + NSUInteger origSize = theCurrentRead->originalBufferLength; + + NSUInteger buffSize = MAX(readSize, origSize); + + [theCurrentRead->buffer setLength:buffSize]; + } + + void *buffer = [theCurrentRead->buffer mutableBytes] + theCurrentRead->startOffset; + + result = [NSData dataWithBytesNoCopy:buffer length:theCurrentRead->bytesDone freeWhenDone:NO]; + } + + if([theDelegate respondsToSelector:@selector(onSocket:didReadData:withTag:)]) + { + [theDelegate onSocket:self didReadData:result withTag:theCurrentRead->tag]; + } + + // Caller may have disconnected in the above delegate method + if (theCurrentRead != nil) + { + [self endCurrentRead]; + } +} + +// Ends current read. +- (void)endCurrentRead +{ + NSAssert(theCurrentRead, @"Trying to end current read when there is no current read."); + + [theReadTimer invalidate]; + theReadTimer = nil; + + theCurrentRead = nil; +} + +- (void)doReadTimeout:(NSTimer *)timer +{ + #pragma unused(timer) + + NSTimeInterval timeoutExtension = 0.0; + + if([theDelegate respondsToSelector:@selector(onSocket:shouldTimeoutReadWithTag:elapsed:bytesDone:)]) + { + timeoutExtension = [theDelegate onSocket:self shouldTimeoutReadWithTag:theCurrentRead->tag + elapsed:theCurrentRead->timeout + bytesDone:theCurrentRead->bytesDone]; + } + + if(timeoutExtension > 0.0) + { + theCurrentRead->timeout += timeoutExtension; + + theReadTimer = [NSTimer timerWithTimeInterval:timeoutExtension + target:self + selector:@selector(doReadTimeout:) + userInfo:nil + repeats:NO]; + [self runLoopAddTimer:theReadTimer]; + } + else + { + // Do not call endCurrentRead here. + // We must allow the delegate access to any partial read in the unreadData method. + + [self closeWithError:[self getReadTimeoutError]]; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Writing +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + if (data == nil || [data length] == 0) return; + if (theFlags & kForbidReadsWrites) return; + + AsyncWritePacket *packet = [[AsyncWritePacket alloc] initWithData:data timeout:timeout tag:tag]; + + [theWriteQueue addObject:packet]; + [self scheduleDequeueWrite]; + +} + +- (void)scheduleDequeueWrite +{ + if((theFlags & kDequeueWriteScheduled) == 0) + { + theFlags |= kDequeueWriteScheduled; + [self performSelector:@selector(maybeDequeueWrite) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + } +} + +/** + * Conditionally starts a new write. + * + * IF there is not another write in process + * AND there is a write queued + * AND we have a write stream available + * + * This method also handles auto-disconnect post read/write completion. +**/ +- (void)maybeDequeueWrite +{ + // Unset the flag indicating a call to this method is scheduled + theFlags &= ~kDequeueWriteScheduled; + + // If we're not currently processing a write AND we have an available write stream + if((theCurrentWrite == nil) && (theWriteStream != NULL)) + { + if([theWriteQueue count] > 0) + { + // Dequeue the next object in the write queue + theCurrentWrite = [theWriteQueue objectAtIndex:0]; + [theWriteQueue removeObjectAtIndex:0]; + + if([theCurrentWrite isKindOfClass:[AsyncSpecialPacket class]]) + { + // Attempt to start TLS + theFlags |= kStartingWriteTLS; + + // This method won't do anything unless both kStartingReadTLS and kStartingWriteTLS are set + [self maybeStartTLS]; + } + else + { + // Start time-out timer + if(theCurrentWrite->timeout >= 0.0) + { + theWriteTimer = [NSTimer timerWithTimeInterval:theCurrentWrite->timeout + target:self + selector:@selector(doWriteTimeout:) + userInfo:nil + repeats:NO]; + [self runLoopAddTimer:theWriteTimer]; + } + + // Immediately write, if possible + [self doSendBytes]; + } + } + else if(theFlags & kDisconnectAfterWrites) + { + if(theFlags & kDisconnectAfterReads) + { + if(([theReadQueue count] == 0) && (theCurrentRead == nil)) + { + [self disconnect]; + } + } + else + { + [self disconnect]; + } + } + } +} + +/** + * Call this method in doSendBytes instead of CFWriteStreamCanAcceptBytes(). + * This method supports the kSocketCanAcceptBytes flag. +**/ +- (BOOL)canAcceptBytes +{ + if (theFlags & kSocketCanAcceptBytes) + { + return YES; + } + else + { + return CFWriteStreamCanAcceptBytes(theWriteStream); + } +} + +- (void)doSendBytes +{ + if ((theCurrentWrite == nil) || (theWriteStream == NULL)) + { + return; + } + + // Note: This method is not called if theCurrentWrite is an AsyncSpecialPacket (startTLS packet) + + NSUInteger totalBytesWritten = 0; + + BOOL done = NO; + BOOL error = NO; + + while (!done && !error && [self canAcceptBytes]) + { + // Figure out what to write + NSUInteger bytesRemaining = [theCurrentWrite->buffer length] - theCurrentWrite->bytesDone; + NSUInteger bytesToWrite = (bytesRemaining < WRITE_CHUNKSIZE) ? bytesRemaining : WRITE_CHUNKSIZE; + + UInt8 *writestart = (UInt8 *)([theCurrentWrite->buffer bytes] + theCurrentWrite->bytesDone); + + // Write + CFIndex result = CFWriteStreamWrite(theWriteStream, writestart, bytesToWrite); + + // Unset the "can accept bytes" flag + theFlags &= ~kSocketCanAcceptBytes; + + // Check results + if (result < 0) + { + error = YES; + } + else + { + CFIndex bytesWritten = result; + + // Update total amount read for the current write + theCurrentWrite->bytesDone += bytesWritten; + + // Update total amount written in this method invocation + totalBytesWritten += bytesWritten; + + // Is packet done? + done = ([theCurrentWrite->buffer length] == theCurrentWrite->bytesDone); + } + } + + if(done) + { + [self completeCurrentWrite]; + [self scheduleDequeueWrite]; + } + else if(error) + { + CFStreamError err = CFWriteStreamGetError(theWriteStream); + [self closeWithError:[self errorFromCFStreamError:err]]; + return; + } + else if (totalBytesWritten > 0) + { + // We're not done with the entire write, but we have written some bytes + if ([theDelegate respondsToSelector:@selector(onSocket:didWritePartialDataOfLength:tag:)]) + { + [theDelegate onSocket:self didWritePartialDataOfLength:totalBytesWritten tag:theCurrentWrite->tag]; + } + } +} + +// Ends current write and calls delegate. +- (void)completeCurrentWrite +{ + NSAssert(theCurrentWrite, @"Trying to complete current write when there is no current write."); + + if ([theDelegate respondsToSelector:@selector(onSocket:didWriteDataWithTag:)]) + { + [theDelegate onSocket:self didWriteDataWithTag:theCurrentWrite->tag]; + } + + if (theCurrentWrite != nil) [self endCurrentWrite]; // Caller may have disconnected. +} + +// Ends current write. +- (void)endCurrentWrite +{ + NSAssert(theCurrentWrite, @"Trying to complete current write when there is no current write."); + + [theWriteTimer invalidate]; + theWriteTimer = nil; + + theCurrentWrite = nil; +} + +- (void)doWriteTimeout:(NSTimer *)timer +{ + #pragma unused(timer) + + NSTimeInterval timeoutExtension = 0.0; + + if([theDelegate respondsToSelector:@selector(onSocket:shouldTimeoutWriteWithTag:elapsed:bytesDone:)]) + { + timeoutExtension = [theDelegate onSocket:self shouldTimeoutWriteWithTag:theCurrentWrite->tag + elapsed:theCurrentWrite->timeout + bytesDone:theCurrentWrite->bytesDone]; + } + + if(timeoutExtension > 0.0) + { + theCurrentWrite->timeout += timeoutExtension; + + theWriteTimer = [NSTimer timerWithTimeInterval:timeoutExtension + target:self + selector:@selector(doWriteTimeout:) + userInfo:nil + repeats:NO]; + [self runLoopAddTimer:theWriteTimer]; + } + else + { + [self closeWithError:[self getWriteTimeoutError]]; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Security +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)startTLS:(NSDictionary *)tlsSettings +{ +#if DEBUG_THREAD_SAFETY + [self checkForThreadSafety]; +#endif + + if(tlsSettings == nil) + { + // Passing nil/NULL to CFReadStreamSetProperty will appear to work the same as passing an empty dictionary, + // but causes problems if we later try to fetch the remote host's certificate. + // + // To be exact, it causes the following to return NULL instead of the normal result: + // CFReadStreamCopyProperty(readStream, kCFStreamPropertySSLPeerCertificates) + // + // So we use an empty dictionary instead, which works perfectly. + + tlsSettings = [NSDictionary dictionary]; + } + + AsyncSpecialPacket *packet = [[AsyncSpecialPacket alloc] initWithTLSSettings:tlsSettings]; + + [theReadQueue addObject:packet]; + [self scheduleDequeueRead]; + + [theWriteQueue addObject:packet]; + [self scheduleDequeueWrite]; + +} + +- (void)maybeStartTLS +{ + // We can't start TLS until: + // - All queued reads prior to the user calling StartTLS are complete + // - All queued writes prior to the user calling StartTLS are complete + // + // We'll know these conditions are met when both kStartingReadTLS and kStartingWriteTLS are set + + if((theFlags & kStartingReadTLS) && (theFlags & kStartingWriteTLS)) + { + AsyncSpecialPacket *tlsPacket = (AsyncSpecialPacket *)theCurrentRead; + + BOOL didStartOnReadStream = CFReadStreamSetProperty(theReadStream, kCFStreamPropertySSLSettings, + (__bridge CFDictionaryRef)tlsPacket->tlsSettings); + BOOL didStartOnWriteStream = CFWriteStreamSetProperty(theWriteStream, kCFStreamPropertySSLSettings, + (__bridge CFDictionaryRef)tlsPacket->tlsSettings); + + if(!didStartOnReadStream || !didStartOnWriteStream) + { + [self closeWithError:[self getSocketError]]; + } + } +} + +- (void)onTLSHandshakeSuccessful +{ + if((theFlags & kStartingReadTLS) && (theFlags & kStartingWriteTLS)) + { + theFlags &= ~kStartingReadTLS; + theFlags &= ~kStartingWriteTLS; + + if([theDelegate respondsToSelector:@selector(onSocketDidSecure:)]) + { + [theDelegate onSocketDidSecure:self]; + } + + [self endCurrentRead]; + [self endCurrentWrite]; + + [self scheduleDequeueRead]; + [self scheduleDequeueWrite]; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark CF Callbacks +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)doCFSocketCallback:(CFSocketCallBackType)type + forSocket:(CFSocketRef)sock + withAddress:(NSData *)address + withData:(const void *)pData +{ + #pragma unused(address) + + NSParameterAssert ((sock == theSocket4) || (sock == theSocket6)); + + switch (type) + { + case kCFSocketConnectCallBack: + // The data argument is either NULL or a pointer to an SInt32 error code, if the connect failed. + if(pData) + [self doSocketOpen:sock withCFSocketError:kCFSocketError]; + else + [self doSocketOpen:sock withCFSocketError:kCFSocketSuccess]; + break; + case kCFSocketAcceptCallBack: + [self doAcceptFromSocket:sock withNewNativeSocket:*((CFSocketNativeHandle *)pData)]; + break; + default: + NSLog(@"AsyncSocket %p received unexpected CFSocketCallBackType %i", self, (int)type); + break; + } +} + +- (void)doCFReadStreamCallback:(CFStreamEventType)type forStream:(CFReadStreamRef)stream +{ + #pragma unused(stream) + + NSParameterAssert(theReadStream != NULL); + + CFStreamError err; + switch (type) + { + case kCFStreamEventOpenCompleted: + theFlags |= kDidCompleteOpenForRead; + [self doStreamOpen]; + break; + case kCFStreamEventHasBytesAvailable: + if(theFlags & kStartingReadTLS) { + [self onTLSHandshakeSuccessful]; + } + else { + theFlags |= kSocketHasBytesAvailable; + [self doBytesAvailable]; + } + break; + case kCFStreamEventErrorOccurred: + case kCFStreamEventEndEncountered: + err = CFReadStreamGetError (theReadStream); + [self closeWithError: [self errorFromCFStreamError:err]]; + break; + default: + NSLog(@"AsyncSocket %p received unexpected CFReadStream callback, CFStreamEventType %i", self, (int)type); + } +} + +- (void)doCFWriteStreamCallback:(CFStreamEventType)type forStream:(CFWriteStreamRef)stream +{ + #pragma unused(stream) + + NSParameterAssert(theWriteStream != NULL); + + CFStreamError err; + switch (type) + { + case kCFStreamEventOpenCompleted: + theFlags |= kDidCompleteOpenForWrite; + [self doStreamOpen]; + break; + case kCFStreamEventCanAcceptBytes: + if(theFlags & kStartingWriteTLS) { + [self onTLSHandshakeSuccessful]; + } + else { + theFlags |= kSocketCanAcceptBytes; + [self doSendBytes]; + } + break; + case kCFStreamEventErrorOccurred: + case kCFStreamEventEndEncountered: + err = CFWriteStreamGetError (theWriteStream); + [self closeWithError: [self errorFromCFStreamError:err]]; + break; + default: + NSLog(@"AsyncSocket %p received unexpected CFWriteStream callback, CFStreamEventType %i", self, (int)type); + } +} + +/** + * This is the callback we setup for CFSocket. + * This method does nothing but forward the call to it's Objective-C counterpart +**/ +static void MyCFSocketCallback (CFSocketRef sref, CFSocketCallBackType type, CFDataRef inAddress, const void *pData, void *pInfo) +{ + @autoreleasepool { + + AsyncSocket *theSocket = (__bridge AsyncSocket *)pInfo; + NSData *address = [(__bridge NSData *)inAddress copy]; + + [theSocket doCFSocketCallback:type forSocket:sref withAddress:address withData:pData]; + + } +} + +/** + * This is the callback we setup for CFReadStream. + * This method does nothing but forward the call to it's Objective-C counterpart +**/ +static void MyCFReadStreamCallback (CFReadStreamRef stream, CFStreamEventType type, void *pInfo) +{ + @autoreleasepool { + + AsyncSocket *theSocket = (__bridge AsyncSocket *)pInfo; + [theSocket doCFReadStreamCallback:type forStream:stream]; + + } +} + +/** + * This is the callback we setup for CFWriteStream. + * This method does nothing but forward the call to it's Objective-C counterpart +**/ +static void MyCFWriteStreamCallback (CFWriteStreamRef stream, CFStreamEventType type, void *pInfo) +{ + @autoreleasepool { + + AsyncSocket *theSocket = (__bridge AsyncSocket *)pInfo; + [theSocket doCFWriteStreamCallback:type forStream:stream]; + + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Class Methods +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Return line separators. ++ (NSData *)CRLFData +{ + return [NSData dataWithBytes:"\x0D\x0A" length:2]; +} + ++ (NSData *)CRData +{ + return [NSData dataWithBytes:"\x0D" length:1]; +} + ++ (NSData *)LFData +{ + return [NSData dataWithBytes:"\x0A" length:1]; +} + ++ (NSData *)ZeroData +{ + return [NSData dataWithBytes:"" length:1]; +} + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/External/AsyncUdpSocket.h b/star_lock/ios/Runner/XSTalkManager/External/AsyncUdpSocket.h new file mode 100755 index 00000000..7bacef41 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/External/AsyncUdpSocket.h @@ -0,0 +1,368 @@ +// +// AsyncUdpSocket.h +// +// This class is in the public domain. +// Originally created by Robbie Hanson on Wed Oct 01 2008. +// Updated and maintained by Deusty Designs and the Mac development community. +// +// http://code.google.com/p/cocoaasyncsocket/ +// + +#import + +@class AsyncSendPacket; +@class AsyncReceivePacket; + +extern NSString *const AsyncUdpSocketException; +extern NSString *const AsyncUdpSocketErrorDomain; + +typedef NS_ENUM(NSInteger, AsyncUdpSocketError) { + AsyncUdpSocketCFSocketError = kCFSocketError, // From CFSocketError enum + AsyncUdpSocketNoError = 0, // Never used + AsyncUdpSocketBadParameter, // Used if given a bad parameter (such as an improper address) + AsyncUdpSocketIPv4Unavailable, // Used if you bind/connect using IPv6 only + AsyncUdpSocketIPv6Unavailable, // Used if you bind/connect using IPv4 only (or iPhone) + AsyncUdpSocketSendTimeoutError, + AsyncUdpSocketReceiveTimeoutError +}; + +@interface AsyncUdpSocket : NSObject +{ + CFSocketRef theSocket4; // IPv4 socket + CFSocketRef theSocket6; // IPv6 socket + + CFRunLoopSourceRef theSource4; // For theSocket4 + CFRunLoopSourceRef theSource6; // For theSocket6 + CFRunLoopRef theRunLoop; + CFSocketContext theContext; + NSArray *theRunLoopModes; + + NSMutableArray *theSendQueue; + AsyncSendPacket *theCurrentSend; + NSTimer *theSendTimer; + + NSMutableArray *theReceiveQueue; + AsyncReceivePacket *theCurrentReceive; + NSTimer *theReceiveTimer; + + id theDelegate; + UInt16 theFlags; + + long theUserData; + + NSString *cachedLocalHost; + UInt16 cachedLocalPort; + + NSString *cachedConnectedHost; + UInt16 cachedConnectedPort; + + UInt32 maxReceiveBufferSize; +} + +/** + * Creates new instances of AsyncUdpSocket. +**/ +- (id)init; +- (id)initWithDelegate:(id)delegate; +- (id)initWithDelegate:(id)delegate userData:(long)userData; + +/** + * Creates new instances of AsyncUdpSocket that support only IPv4 or IPv6. + * The other init methods will support both, unless specifically binded or connected to one protocol. + * If you know you'll only be using one protocol, these init methods may be a bit more efficient. +**/ +- (id)initIPv4; +- (id)initIPv6; + +- (id)delegate; +- (void)setDelegate:(id)delegate; + +- (long)userData; +- (void)setUserData:(long)userData; + +/** + * Returns the local address info for the socket. + * + * Note: Address info may not be available until after the socket has been bind'ed, + * or until after data has been sent. +**/ +- (NSString *)localHost; +- (UInt16)localPort; + +/** + * Returns the remote address info for the socket. + * + * Note: Since UDP is connectionless by design, connected address info + * will not be available unless the socket is explicitly connected to a remote host/port +**/ +- (NSString *)connectedHost; +- (UInt16)connectedPort; + +/** + * Returns whether or not this socket has been connected to a single host. + * By design, UDP is a connectionless protocol, and connecting is not needed. + * If connected, the socket will only be able to send/receive data to/from the connected host. +**/ +- (BOOL)isConnected; + +/** + * Returns whether or not this socket has been closed. + * The only way a socket can be closed is if you explicitly call one of the close methods. +**/ +- (BOOL)isClosed; + +/** + * Returns whether or not this socket supports IPv4. + * By default this will be true, unless the socket is specifically initialized as IPv6 only, + * or is binded or connected to an IPv6 address. +**/ +- (BOOL)isIPv4; + +/** + * Returns whether or not this socket supports IPv6. + * By default this will be true, unless the socket is specifically initialized as IPv4 only, + * or is binded or connected to an IPv4 address. + * + * This method will also return false on platforms that do not support IPv6. + * Note: The iPhone does not currently support IPv6. +**/ +- (BOOL)isIPv6; + +/** + * Returns the mtu of the socket. + * If unknown, returns zero. + * + * Sending data larger than this may result in an error. + * This is an advanced topic, and one should understand the wide range of mtu's on networks and the internet. + * Therefore this method is only for reference and may be of little use in many situations. +**/ +- (unsigned int)maximumTransmissionUnit; + +/** + * Binds the UDP socket to the given port and optional address. + * Binding should be done for server sockets that receive data prior to sending it. + * Client sockets can skip binding, + * as the OS will automatically assign the socket an available port when it starts sending data. + * + * You cannot bind a socket after its been connected. + * You can only bind a socket once. + * You can still connect a socket (if desired) after binding. + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. +**/ +- (BOOL)bindToPort:(UInt16)port error:(NSError **)errPtr; +- (BOOL)bindToAddress:(NSString *)localAddr port:(UInt16)port error:(NSError **)errPtr; + +/** + * Connects the UDP socket to the given host and port. + * By design, UDP is a connectionless protocol, and connecting is not needed. + * + * Choosing to connect to a specific host/port has the following effect: + * - You will only be able to send data to the connected host/port. + * - You will only be able to receive data from the connected host/port. + * - You will receive ICMP messages that come from the connected host/port, such as "connection refused". + * + * Connecting a UDP socket does not result in any communication on the socket. + * It simply changes the internal state of the socket. + * + * You cannot bind a socket after its been connected. + * You can only connect a socket once. + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. +**/ +- (BOOL)connectToHost:(NSString *)host onPort:(UInt16)port error:(NSError **)errPtr; +- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr; + +/** + * Join multicast group + * + * Group should be an IP address (eg @"225.228.0.1") +**/ +- (BOOL)joinMulticastGroup:(NSString *)group error:(NSError **)errPtr; +- (BOOL)joinMulticastGroup:(NSString *)group withAddress:(NSString *)interface error:(NSError **)errPtr; + +/** + * By default, the underlying socket in the OS will not allow you to send broadcast messages. + * In order to send broadcast messages, you need to enable this functionality in the socket. + * + * A broadcast is a UDP message to addresses like "192.168.255.255" or "255.255.255.255" that is + * delivered to every host on the network. + * The reason this is generally disabled by default is to prevent + * accidental broadcast messages from flooding the network. +**/ +- (BOOL)enableBroadcast:(BOOL)flag error:(NSError **)errPtr; + +/** + * Asynchronously sends the given data, with the given timeout and tag. + * + * This method may only be used with a connected socket. + * + * If data is nil or zero-length, this method does nothing and immediately returns NO. + * If the socket is not connected, this method does nothing and immediately returns NO. +**/ +- (BOOL)sendData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag; + +/** + * Asynchronously sends the given data, with the given timeout and tag, to the given host and port. + * + * This method cannot be used with a connected socket. + * + * If data is nil or zero-length, this method does nothing and immediately returns NO. + * If the socket is connected, this method does nothing and immediately returns NO. + * If unable to resolve host to a valid IPv4 or IPv6 address, this method returns NO. +**/ +- (BOOL)sendData:(NSData *)data toHost:(NSString *)host port:(UInt16)port withTimeout:(NSTimeInterval)timeout tag:(long)tag; + +/** + * Asynchronously sends the given data, with the given timeout and tag, to the given address. + * + * This method cannot be used with a connected socket. + * + * If data is nil or zero-length, this method does nothing and immediately returns NO. + * If the socket is connected, this method does nothing and immediately returns NO. +**/ +- (BOOL)sendData:(NSData *)data toAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout tag:(long)tag; + +/** + * Asynchronously receives a single datagram packet. + * + * If the receive succeeds, the onUdpSocket:didReceiveData:fromHost:port:tag delegate method will be called. + * Otherwise, a timeout will occur, and the onUdpSocket:didNotReceiveDataWithTag: delegate method will be called. +**/ +- (void)receiveWithTimeout:(NSTimeInterval)timeout tag:(long)tag; + +/** + * Closes the socket immediately. Any pending send or receive operations are dropped. +**/ +- (void)close; + +/** + * Closes after all pending send operations have completed. + * After calling this, the sendData: and receive: methods will do nothing. + * In other words, you won't be able to add any more send or receive operations to the queue. + * The socket will close even if there are still pending receive operations. +**/ +- (void)closeAfterSending; + +/** + * Closes after all pending receive operations have completed. + * After calling this, the sendData: and receive: methods will do nothing. + * In other words, you won't be able to add any more send or receive operations to the queue. + * The socket will close even if there are still pending send operations. +**/ +- (void)closeAfterReceiving; + +/** + * Closes after all pending send and receive operations have completed. + * After calling this, the sendData: and receive: methods will do nothing. + * In other words, you won't be able to add any more send or receive operations to the queue. +**/ +- (void)closeAfterSendingAndReceiving; + +/** + * Gets/Sets the maximum size of the buffer that will be allocated for receive operations. + * The default size is 9216 bytes. + * + * The theoretical maximum size of any IPv4 UDP packet is UINT16_MAX = 65535. + * The theoretical maximum size of any IPv6 UDP packet is UINT32_MAX = 4294967295. + * + * In practice, however, the size of UDP packets will be much smaller. + * Indeed most protocols will send and receive packets of only a few bytes, + * or will set a limit on the size of packets to prevent fragmentation in the IP layer. + * + * If you set the buffer size too small, the sockets API in the OS will silently discard + * any extra data, and you will not be notified of the error. +**/ +- (UInt32)maxReceiveBufferSize; +- (void)setMaxReceiveBufferSize:(UInt32)max; + +/** + * When you create an AsyncUdpSocket, it is added to the runloop of the current thread. + * So it is easiest to simply create the socket on the thread you intend to use it. + * + * If, however, you need to move the socket to a separate thread at a later time, this + * method may be used to accomplish the task. + * + * This method must be called from the thread/runloop the socket is currently running on. + * + * Note: After calling this method, all further method calls to this object should be done from the given runloop. + * Also, all delegate calls will be sent on the given runloop. +**/ +- (BOOL)moveToRunLoop:(NSRunLoop *)runLoop; + +/** + * Allows you to configure which run loop modes the socket uses. + * The default set of run loop modes is NSDefaultRunLoopMode. + * + * If you'd like your socket to continue operation during other modes, you may want to add modes such as + * NSModalPanelRunLoopMode or NSEventTrackingRunLoopMode. Or you may simply want to use NSRunLoopCommonModes. + * + * Note: NSRunLoopCommonModes is defined in 10.5. For previous versions one can use kCFRunLoopCommonModes. +**/ +- (BOOL)setRunLoopModes:(NSArray *)runLoopModes; + +/** + * Returns the current run loop modes the AsyncSocket instance is operating in. + * The default set of run loop modes is NSDefaultRunLoopMode. +**/ +- (NSArray *)runLoopModes; + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@protocol AsyncUdpSocketDelegate +@optional + +/** + * Called when the datagram with the given tag has been sent. +**/ +- (void)onUdpSocket:(AsyncUdpSocket *)sock didSendDataWithTag:(long)tag; + +/** + * Called if an error occurs while trying to send a datagram. + * This could be due to a timeout, or something more serious such as the data being too large to fit in a sigle packet. +**/ +- (void)onUdpSocket:(AsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError *)error; + +/** + * Called when the socket has received the requested datagram. + * + * Due to the nature of UDP, you may occasionally receive undesired packets. + * These may be rogue UDP packets from unknown hosts, + * or they may be delayed packets arriving after retransmissions have already occurred. + * It's important these packets are properly ignored, while not interfering with the flow of your implementation. + * As an aid, this delegate method has a boolean return value. + * If you ever need to ignore a received packet, simply return NO, + * and AsyncUdpSocket will continue as if the packet never arrived. + * That is, the original receive request will still be queued, and will still timeout as usual if a timeout was set. + * For example, say you requested to receive data, and you set a timeout of 500 milliseconds, using a tag of 15. + * If rogue data arrives after 250 milliseconds, this delegate method would be invoked, and you could simply return NO. + * If the expected data then arrives within the next 250 milliseconds, + * this delegate method will be invoked, with a tag of 15, just as if the rogue data never appeared. + * + * Under normal circumstances, you simply return YES from this method. +**/ +- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock + didReceiveData:(NSData *)data + withTag:(long)tag + fromHost:(NSString *)host + port:(UInt16)port; + +/** + * Called if an error occurs while trying to receive a requested datagram. + * This is generally due to a timeout, but could potentially be something else if some kind of OS error occurred. +**/ +- (void)onUdpSocket:(AsyncUdpSocket *)sock didNotReceiveDataWithTag:(long)tag dueToError:(NSError *)error; + +/** + * Called when the socket is closed. + * A socket is only closed if you explicitly call one of the close methods. +**/ +- (void)onUdpSocketDidClose:(AsyncUdpSocket *)sock; + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/External/AsyncUdpSocket.m b/star_lock/ios/Runner/XSTalkManager/External/AsyncUdpSocket.m new file mode 100755 index 00000000..e8e68e26 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/External/AsyncUdpSocket.m @@ -0,0 +1,2318 @@ +// +// AsyncUdpSocket.m +// +// This class is in the public domain. +// Originally created by Robbie Hanson on Wed Oct 01 2008. +// Updated and maintained by Deusty Designs and the Mac development community. +// +// http://code.google.com/p/cocoaasyncsocket/ +// + +#if ! __has_feature(objc_arc) +#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). +#endif + +#import "AsyncUdpSocket.h" +#import +#import +#import +#import +#import +#import +#import + +#if TARGET_OS_IPHONE +// Note: You may need to add the CFNetwork Framework to your project +#import +#endif + + +#define SENDQUEUE_CAPACITY 5 // Initial capacity +#define RECEIVEQUEUE_CAPACITY 5 // Initial capacity + +#define DEFAULT_MAX_RECEIVE_BUFFER_SIZE 9216 + +NSString *const AsyncUdpSocketException = @"AsyncUdpSocketException"; +NSString *const AsyncUdpSocketErrorDomain = @"AsyncUdpSocketErrorDomain"; + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 +// Mutex lock used by all instances of AsyncUdpSocket, to protect getaddrinfo. +// Prior to Mac OS X 10.5 this method was not thread-safe. +static NSString *getaddrinfoLock = @"lock"; +#endif + +enum AsyncUdpSocketFlags +{ + kDidBind = 1 << 0, // If set, bind has been called. + kDidConnect = 1 << 1, // If set, connect has been called. + kSock4CanAcceptBytes = 1 << 2, // If set, we know socket4 can accept bytes. If unset, it's unknown. + kSock6CanAcceptBytes = 1 << 3, // If set, we know socket6 can accept bytes. If unset, it's unknown. + kSock4HasBytesAvailable = 1 << 4, // If set, we know socket4 has bytes available. If unset, it's unknown. + kSock6HasBytesAvailable = 1 << 5, // If set, we know socket6 has bytes available. If unset, it's unknown. + kForbidSendReceive = 1 << 6, // If set, no new send or receive operations are allowed to be queued. + kCloseAfterSends = 1 << 7, // If set, close as soon as no more sends are queued. + kCloseAfterReceives = 1 << 8, // If set, close as soon as no more receives are queued. + kDidClose = 1 << 9, // If set, the socket has been closed, and should not be used anymore. + kDequeueSendScheduled = 1 << 10, // If set, a maybeDequeueSend operation is already scheduled. + kDequeueReceiveScheduled = 1 << 11, // If set, a maybeDequeueReceive operation is already scheduled. + kFlipFlop = 1 << 12, // Used to alternate between IPv4 and IPv6 sockets. +}; + +@interface AsyncUdpSocket (Private) + +// Run Loop +- (void)runLoopAddSource:(CFRunLoopSourceRef)source; +- (void)runLoopRemoveSource:(CFRunLoopSourceRef)source; +- (void)runLoopAddTimer:(NSTimer *)timer; +- (void)runLoopRemoveTimer:(NSTimer *)timer; + +// Utilities +- (NSString *)addressHost4:(struct sockaddr_in *)pSockaddr4; +- (NSString *)addressHost6:(struct sockaddr_in6 *)pSockaddr6; +- (NSString *)addressHost:(struct sockaddr *)pSockaddr; + +// Disconnect Implementation +- (void)emptyQueues; +- (void)closeSocket4; +- (void)closeSocket6; +- (void)maybeScheduleClose; + +// Errors +- (NSError *)getErrnoError; +- (NSError *)getSocketError; +- (NSError *)getIPv4UnavailableError; +- (NSError *)getIPv6UnavailableError; +- (NSError *)getSendTimeoutError; +- (NSError *)getReceiveTimeoutError; + +// Diagnostics +- (NSString *)connectedHost:(CFSocketRef)socket; +- (UInt16)connectedPort:(CFSocketRef)socket; +- (NSString *)localHost:(CFSocketRef)socket; +- (UInt16)localPort:(CFSocketRef)socket; + +// Sending +- (BOOL)canAcceptBytes:(CFSocketRef)sockRef; +- (void)scheduleDequeueSend; +- (void)maybeDequeueSend; +- (void)doSend:(CFSocketRef)sockRef; +- (void)completeCurrentSend; +- (void)failCurrentSend:(NSError *)error; +- (void)endCurrentSend; +- (void)doSendTimeout:(NSTimer *)timer; + +// Receiving +- (BOOL)hasBytesAvailable:(CFSocketRef)sockRef; +- (void)scheduleDequeueReceive; +- (void)maybeDequeueReceive; +- (void)doReceive4; +- (void)doReceive6; +- (void)doReceive:(CFSocketRef)sockRef; +- (BOOL)maybeCompleteCurrentReceive; +- (void)failCurrentReceive:(NSError *)error; +- (void)endCurrentReceive; +- (void)doReceiveTimeout:(NSTimer *)timer; + +@end + +static void MyCFSocketCallback(CFSocketRef, CFSocketCallBackType, CFDataRef, const void *, void *); + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * The AsyncSendPacket encompasses the instructions for a single send/write. +**/ +@interface AsyncSendPacket : NSObject +{ +@public + NSData *buffer; + NSData *address; + NSTimeInterval timeout; + long tag; +} +- (id)initWithData:(NSData *)d address:(NSData *)a timeout:(NSTimeInterval)t tag:(long)i; +@end + +@implementation AsyncSendPacket + +- (id)initWithData:(NSData *)d address:(NSData *)a timeout:(NSTimeInterval)t tag:(long)i +{ + if((self = [super init])) + { + buffer = d; + address = a; + timeout = t; + tag = i; + } + return self; +} + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * The AsyncReceivePacket encompasses the instructions for a single receive/read. +**/ +@interface AsyncReceivePacket : NSObject +{ +@public + NSTimeInterval timeout; + long tag; + NSData *buffer; + NSString *host; + UInt16 port; +} +- (id)initWithTimeout:(NSTimeInterval)t tag:(long)i; +@end + +@implementation AsyncReceivePacket + +- (id)initWithTimeout:(NSTimeInterval)t tag:(long)i +{ + if((self = [super init])) + { + timeout = t; + tag = i; + + buffer = nil; + host = nil; + port = 0; + } + return self; +} + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation AsyncUdpSocket + +- (id)initWithDelegate:(id)delegate userData:(long)userData enableIPv4:(BOOL)enableIPv4 enableIPv6:(BOOL)enableIPv6 +{ + if((self = [super init])) + { + theFlags = 0; + theDelegate = delegate; + theUserData = userData; + maxReceiveBufferSize = DEFAULT_MAX_RECEIVE_BUFFER_SIZE; + + theSendQueue = [[NSMutableArray alloc] initWithCapacity:SENDQUEUE_CAPACITY]; + theCurrentSend = nil; + theSendTimer = nil; + + theReceiveQueue = [[NSMutableArray alloc] initWithCapacity:RECEIVEQUEUE_CAPACITY]; + theCurrentReceive = nil; + theReceiveTimer = nil; + + // Socket context + theContext.version = 0; + theContext.info = (__bridge void *)self; + theContext.retain = nil; + theContext.release = nil; + theContext.copyDescription = nil; + + // Create the sockets + theSocket4 = NULL; + theSocket6 = NULL; + + if(enableIPv4) + { + theSocket4 = CFSocketCreate(kCFAllocatorDefault, + PF_INET, + SOCK_DGRAM, + IPPROTO_UDP, + kCFSocketReadCallBack | kCFSocketWriteCallBack, + (CFSocketCallBack)&MyCFSocketCallback, + &theContext); + } + if(enableIPv6) + { + theSocket6 = CFSocketCreate(kCFAllocatorDefault, + PF_INET6, + SOCK_DGRAM, + IPPROTO_UDP, + kCFSocketReadCallBack | kCFSocketWriteCallBack, + (CFSocketCallBack)&MyCFSocketCallback, + &theContext); + } + + // Disable continuous callbacks for read and write. + // If we don't do this, the socket(s) will just sit there firing read callbacks + // at us hundreds of times a second if we don't immediately read the available data. + if(theSocket4) + { + CFSocketSetSocketFlags(theSocket4, kCFSocketCloseOnInvalidate); + } + if(theSocket6) + { + CFSocketSetSocketFlags(theSocket6, kCFSocketCloseOnInvalidate); + } + + // Prevent sendto calls from sending SIGPIPE signal when socket has been shutdown for writing. + // sendto will instead let us handle errors as usual by returning -1. + int noSigPipe = 1; + if(theSocket4) + { + setsockopt(CFSocketGetNative(theSocket4), SOL_SOCKET, SO_NOSIGPIPE, &noSigPipe, sizeof(noSigPipe)); + } + if(theSocket6) + { + setsockopt(CFSocketGetNative(theSocket6), SOL_SOCKET, SO_NOSIGPIPE, &noSigPipe, sizeof(noSigPipe)); + } + + // Get the CFRunLoop to which the socket should be attached. + theRunLoop = CFRunLoopGetCurrent(); + + // Set default run loop modes + theRunLoopModes = [NSArray arrayWithObject:NSDefaultRunLoopMode]; + + // Attach the sockets to the run loop + + if(theSocket4) + { + theSource4 = CFSocketCreateRunLoopSource(kCFAllocatorDefault, theSocket4, 0); + [self runLoopAddSource:theSource4]; + } + + if(theSocket6) + { + theSource6 = CFSocketCreateRunLoopSource(kCFAllocatorDefault, theSocket6, 0); + [self runLoopAddSource:theSource6]; + } + + cachedLocalPort = 0; + cachedConnectedPort = 0; + } + return self; +} + +- (id)init +{ + return [self initWithDelegate:nil userData:0 enableIPv4:YES enableIPv6:YES]; +} + +- (id)initWithDelegate:(id)delegate +{ + return [self initWithDelegate:delegate userData:0 enableIPv4:YES enableIPv6:YES]; +} + +- (id)initWithDelegate:(id)delegate userData:(long)userData +{ + return [self initWithDelegate:delegate userData:userData enableIPv4:YES enableIPv6:YES]; +} + +- (id)initIPv4 +{ + return [self initWithDelegate:nil userData:0 enableIPv4:YES enableIPv6:NO]; +} + +- (id)initIPv6 +{ + return [self initWithDelegate:nil userData:0 enableIPv4:NO enableIPv6:YES]; +} + +- (void) dealloc +{ + [self close]; + + [NSObject cancelPreviousPerformRequestsWithTarget:theDelegate selector:@selector(onUdpSocketDidClose:) object:self]; + [NSObject cancelPreviousPerformRequestsWithTarget:self]; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Accessors +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (id)delegate +{ + return theDelegate; +} + +- (void)setDelegate:(id)delegate +{ + theDelegate = delegate; +} + +- (long)userData +{ + return theUserData; +} + +- (void)setUserData:(long)userData +{ + theUserData = userData; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Run Loop +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)runLoopAddSource:(CFRunLoopSourceRef)source +{ + for (NSString *runLoopMode in theRunLoopModes) + { + CFRunLoopAddSource(theRunLoop, source, (__bridge CFStringRef)runLoopMode); + } +} + +- (void)runLoopRemoveSource:(CFRunLoopSourceRef)source +{ + for (NSString *runLoopMode in theRunLoopModes) + { + CFRunLoopRemoveSource(theRunLoop, source, (__bridge CFStringRef)runLoopMode); + } +} + +- (void)runLoopAddTimer:(NSTimer *)timer +{ + for (NSString *runLoopMode in theRunLoopModes) + { + CFRunLoopAddTimer(theRunLoop, (__bridge CFRunLoopTimerRef)timer, (__bridge CFStringRef)runLoopMode); + } +} + +- (void)runLoopRemoveTimer:(NSTimer *)timer +{ + for (NSString *runLoopMode in theRunLoopModes) + { + CFRunLoopRemoveTimer(theRunLoop, (__bridge CFRunLoopTimerRef)timer, (__bridge CFStringRef)runLoopMode); + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Configuration +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (UInt32)maxReceiveBufferSize +{ + return maxReceiveBufferSize; +} + +- (void)setMaxReceiveBufferSize:(UInt32)max +{ + maxReceiveBufferSize = max; +} + +/** + * See the header file for a full explanation of this method. +**/ +- (BOOL)moveToRunLoop:(NSRunLoop *)runLoop +{ + NSAssert((theRunLoop == NULL) || (theRunLoop == CFRunLoopGetCurrent()), + @"moveToRunLoop must be called from within the current RunLoop!"); + + if(runLoop == nil) + { + return NO; + } + if(theRunLoop == [runLoop getCFRunLoop]) + { + return YES; + } + + [NSObject cancelPreviousPerformRequestsWithTarget:self]; + theFlags &= ~kDequeueSendScheduled; + theFlags &= ~kDequeueReceiveScheduled; + + if(theSource4) [self runLoopRemoveSource:theSource4]; + if(theSource6) [self runLoopRemoveSource:theSource6]; + + if(theSendTimer) [self runLoopRemoveTimer:theSendTimer]; + if(theReceiveTimer) [self runLoopRemoveTimer:theReceiveTimer]; + + theRunLoop = [runLoop getCFRunLoop]; + + if(theSendTimer) [self runLoopAddTimer:theSendTimer]; + if(theReceiveTimer) [self runLoopAddTimer:theReceiveTimer]; + + if(theSource4) [self runLoopAddSource:theSource4]; + if(theSource6) [self runLoopAddSource:theSource6]; + + [runLoop performSelector:@selector(maybeDequeueSend) target:self argument:nil order:0 modes:theRunLoopModes]; + [runLoop performSelector:@selector(maybeDequeueReceive) target:self argument:nil order:0 modes:theRunLoopModes]; + [runLoop performSelector:@selector(maybeScheduleClose) target:self argument:nil order:0 modes:theRunLoopModes]; + + return YES; +} + +/** + * See the header file for a full explanation of this method. +**/ +- (BOOL)setRunLoopModes:(NSArray *)runLoopModes +{ + NSAssert((theRunLoop == NULL) || (theRunLoop == CFRunLoopGetCurrent()), + @"setRunLoopModes must be called from within the current RunLoop!"); + + if([runLoopModes count] == 0) + { + return NO; + } + if([theRunLoopModes isEqualToArray:runLoopModes]) + { + return YES; + } + + [NSObject cancelPreviousPerformRequestsWithTarget:self]; + theFlags &= ~kDequeueSendScheduled; + theFlags &= ~kDequeueReceiveScheduled; + + if(theSource4) [self runLoopRemoveSource:theSource4]; + if(theSource6) [self runLoopRemoveSource:theSource6]; + + if(theSendTimer) [self runLoopRemoveTimer:theSendTimer]; + if(theReceiveTimer) [self runLoopRemoveTimer:theReceiveTimer]; + + theRunLoopModes = [runLoopModes copy]; + + if(theSendTimer) [self runLoopAddTimer:theSendTimer]; + if(theReceiveTimer) [self runLoopAddTimer:theReceiveTimer]; + + if(theSource4) [self runLoopAddSource:theSource4]; + if(theSource6) [self runLoopAddSource:theSource6]; + + [self performSelector:@selector(maybeDequeueSend) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + [self performSelector:@selector(maybeDequeueReceive) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + [self performSelector:@selector(maybeScheduleClose) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + + return YES; +} + +- (NSArray *)runLoopModes +{ + return [theRunLoopModes copy]; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Utilities: +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Attempts to convert the given host/port into and IPv4 and/or IPv6 data structure. + * The data structure is of type sockaddr_in for IPv4 and sockaddr_in6 for IPv6. + * + * Returns zero on success, or one of the error codes listed in gai_strerror if an error occurs (as per getaddrinfo). +**/ +- (int)convertForBindHost:(NSString *)host + port:(UInt16)port + intoAddress4:(NSData **)address4 + address6:(NSData **)address6 +{ + if(host == nil || ([host length] == 0)) + { + // Use ANY address + struct sockaddr_in nativeAddr; + nativeAddr.sin_len = sizeof(struct sockaddr_in); + nativeAddr.sin_family = AF_INET; + nativeAddr.sin_port = htons(port); + nativeAddr.sin_addr.s_addr = htonl(INADDR_ANY); + memset(&(nativeAddr.sin_zero), 0, sizeof(nativeAddr.sin_zero)); + + struct sockaddr_in6 nativeAddr6; + nativeAddr6.sin6_len = sizeof(struct sockaddr_in6); + nativeAddr6.sin6_family = AF_INET6; + nativeAddr6.sin6_port = htons(port); + nativeAddr6.sin6_flowinfo = 0; + nativeAddr6.sin6_addr = in6addr_any; + nativeAddr6.sin6_scope_id = 0; + + // Wrap the native address structures for CFSocketSetAddress. + if(address4) *address4 = [NSData dataWithBytes:&nativeAddr length:sizeof(nativeAddr)]; + if(address6) *address6 = [NSData dataWithBytes:&nativeAddr6 length:sizeof(nativeAddr6)]; + + return 0; + } + else if([host isEqualToString:@"localhost"] || [host isEqualToString:@"loopback"]) + { + // Note: getaddrinfo("localhost",...) fails on 10.5.3 + + // Use LOOPBACK address + struct sockaddr_in nativeAddr; + nativeAddr.sin_len = sizeof(struct sockaddr_in); + nativeAddr.sin_family = AF_INET; + nativeAddr.sin_port = htons(port); + nativeAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + memset(&(nativeAddr.sin_zero), 0, sizeof(nativeAddr.sin_zero)); + + struct sockaddr_in6 nativeAddr6; + nativeAddr6.sin6_len = sizeof(struct sockaddr_in6); + nativeAddr6.sin6_family = AF_INET6; + nativeAddr6.sin6_port = htons(port); + nativeAddr6.sin6_flowinfo = 0; + nativeAddr6.sin6_addr = in6addr_loopback; + nativeAddr6.sin6_scope_id = 0; + + // Wrap the native address structures for CFSocketSetAddress. + if(address4) *address4 = [NSData dataWithBytes:&nativeAddr length:sizeof(nativeAddr)]; + if(address6) *address6 = [NSData dataWithBytes:&nativeAddr6 length:sizeof(nativeAddr6)]; + + return 0; + } + else + { + NSString *portStr = [NSString stringWithFormat:@"%hu", port]; + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + @synchronized (getaddrinfoLock) +#endif + { + struct addrinfo hints, *res, *res0; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_protocol = IPPROTO_UDP; + hints.ai_flags = AI_PASSIVE; + + int error = getaddrinfo([host UTF8String], [portStr UTF8String], &hints, &res0); + + if(error) return error; + + for(res = res0; res; res = res->ai_next) + { + if(address4 && !*address4 && (res->ai_family == AF_INET)) + { + // Found IPv4 address + // Wrap the native address structures for CFSocketSetAddress. + if(address4) *address4 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]; + } + else if(address6 && !*address6 && (res->ai_family == AF_INET6)) + { + // Found IPv6 address + // Wrap the native address structures for CFSocketSetAddress. + if(address6) *address6 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]; + } + } + freeaddrinfo(res0); + } + + return 0; + } +} + +/** + * Attempts to convert the given host/port into and IPv4 and/or IPv6 data structure. + * The data structure is of type sockaddr_in for IPv4 and sockaddr_in6 for IPv6. + * + * Returns zero on success, or one of the error codes listed in gai_strerror if an error occurs (as per getaddrinfo). +**/ +- (int)convertForSendHost:(NSString *)host + port:(UInt16)port + intoAddress4:(NSData **)address4 + address6:(NSData **)address6 +{ + if(host == nil || ([host length] == 0)) + { + // We're not binding, so what are we supposed to do with this? + return EAI_NONAME; + } + else if([host isEqualToString:@"localhost"] || [host isEqualToString:@"loopback"]) + { + // Note: getaddrinfo("localhost",...) fails on 10.5.3 + + // Use LOOPBACK address + struct sockaddr_in nativeAddr; + nativeAddr.sin_len = sizeof(struct sockaddr_in); + nativeAddr.sin_family = AF_INET; + nativeAddr.sin_port = htons(port); + nativeAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + memset(&(nativeAddr.sin_zero), 0, sizeof(nativeAddr.sin_zero)); + + struct sockaddr_in6 nativeAddr6; + nativeAddr6.sin6_len = sizeof(struct sockaddr_in6); + nativeAddr6.sin6_family = AF_INET6; + nativeAddr6.sin6_port = htons(port); + nativeAddr6.sin6_flowinfo = 0; + nativeAddr6.sin6_addr = in6addr_loopback; + nativeAddr6.sin6_scope_id = 0; + + // Wrap the native address structures for CFSocketSetAddress. + if(address4) *address4 = [NSData dataWithBytes:&nativeAddr length:sizeof(nativeAddr)]; + if(address6) *address6 = [NSData dataWithBytes:&nativeAddr6 length:sizeof(nativeAddr6)]; + + return 0; + } + else + { + NSString *portStr = [NSString stringWithFormat:@"%hu", port]; + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + @synchronized (getaddrinfoLock) +#endif + { + struct addrinfo hints, *res, *res0; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_protocol = IPPROTO_UDP; + // No passive flag on a send or connect + + int error = getaddrinfo([host UTF8String], [portStr UTF8String], &hints, &res0); + + if(error) return error; + + for(res = res0; res; res = res->ai_next) + { + if(address4 && !*address4 && (res->ai_family == AF_INET)) + { + // Found IPv4 address + // Wrap the native address structures for CFSocketSetAddress. + if(address4) *address4 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]; + } + else if(address6 && !*address6 && (res->ai_family == AF_INET6)) + { + // Found IPv6 address + // Wrap the native address structures for CFSocketSetAddress. + if(address6) *address6 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]; + } + } + freeaddrinfo(res0); + } + + return 0; + } +} + +- (NSString *)addressHost4:(struct sockaddr_in *)pSockaddr4 +{ + char addrBuf[INET_ADDRSTRLEN]; + + if(inet_ntop(AF_INET, &pSockaddr4->sin_addr, addrBuf, sizeof(addrBuf)) == NULL) + { + [NSException raise:NSInternalInconsistencyException format:@"Cannot convert address to string."]; + } + + return [NSString stringWithCString:addrBuf encoding:NSASCIIStringEncoding]; +} + +- (NSString *)addressHost6:(struct sockaddr_in6 *)pSockaddr6 +{ + char addrBuf[INET6_ADDRSTRLEN]; + + if(inet_ntop(AF_INET6, &pSockaddr6->sin6_addr, addrBuf, sizeof(addrBuf)) == NULL) + { + [NSException raise:NSInternalInconsistencyException format:@"Cannot convert address to string."]; + } + + return [NSString stringWithCString:addrBuf encoding:NSASCIIStringEncoding]; +} + +- (NSString *)addressHost:(struct sockaddr *)pSockaddr +{ + if(pSockaddr->sa_family == AF_INET) + { + return [self addressHost4:(struct sockaddr_in *)pSockaddr]; + } + else + { + return [self addressHost6:(struct sockaddr_in6 *)pSockaddr]; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Socket Implementation: +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Binds the underlying socket(s) to the given port. + * The socket(s) will be able to receive data on any interface. + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. +**/ +- (BOOL)bindToPort:(UInt16)port error:(NSError **)errPtr +{ + return [self bindToAddress:nil port:port error:errPtr]; +} + +/** + * Binds the underlying socket(s) to the given address and port. + * The sockets(s) will be able to receive data only on the given interface. + * + * To receive data on any interface, pass nil or "". + * To receive data only on the loopback interface, pass "localhost" or "loopback". + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. +**/ +- (BOOL)bindToAddress:(NSString *)host port:(UInt16)port error:(NSError **)errPtr +{ + if(theFlags & kDidClose) + { + [NSException raise:AsyncUdpSocketException + format:@"The socket is closed."]; + } + if(theFlags & kDidBind) + { + [NSException raise:AsyncUdpSocketException + format:@"Cannot bind a socket more than once."]; + } + if(theFlags & kDidConnect) + { + [NSException raise:AsyncUdpSocketException + format:@"Cannot bind after connecting. If needed, bind first, then connect."]; + } + + // Convert the given host/port into native address structures for CFSocketSetAddress + NSData *address4 = nil, *address6 = nil; + + int gai_error = [self convertForBindHost:host port:port intoAddress4:&address4 address6:&address6]; + if(gai_error) + { + if(errPtr) + { + NSString *errMsg = [NSString stringWithCString:gai_strerror(gai_error) encoding:NSASCIIStringEncoding]; + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + *errPtr = [NSError errorWithDomain:@"kCFStreamErrorDomainNetDB" code:gai_error userInfo:info]; + } + return NO; + } + + NSAssert((address4 || address6), @"address4 and address6 are nil"); + + // Set the SO_REUSEADDR flags + + int reuseOn = 1; + if (theSocket4) setsockopt(CFSocketGetNative(theSocket4), SOL_SOCKET, SO_REUSEADDR, &reuseOn, sizeof(reuseOn)); + if (theSocket6) setsockopt(CFSocketGetNative(theSocket6), SOL_SOCKET, SO_REUSEADDR, &reuseOn, sizeof(reuseOn)); + + // Bind the sockets + + if(address4) + { + if(theSocket4) + { + CFSocketError error = CFSocketSetAddress(theSocket4, (__bridge CFDataRef)address4); + if(error != kCFSocketSuccess) + { + if(errPtr) *errPtr = [self getSocketError]; + return NO; + } + + if(!address6) + { + // Using IPv4 only + [self closeSocket6]; + } + } + else if(!address6) + { + if(errPtr) *errPtr = [self getIPv4UnavailableError]; + return NO; + } + } + + if(address6) + { + // Note: The iPhone doesn't currently support IPv6 + + if(theSocket6) + { + CFSocketError error = CFSocketSetAddress(theSocket6, (__bridge CFDataRef)address6); + if(error != kCFSocketSuccess) + { + if(errPtr) *errPtr = [self getSocketError]; + return NO; + } + + if(!address4) + { + // Using IPv6 only + [self closeSocket4]; + } + } + else if(!address4) + { + if(errPtr) *errPtr = [self getIPv6UnavailableError]; + return NO; + } + } + + theFlags |= kDidBind; + return YES; +} + +/** + * Connects the underlying UDP socket to the given host and port. + * If an IPv4 address is resolved, the IPv4 socket is connected, and the IPv6 socket is invalidated and released. + * If an IPv6 address is resolved, the IPv6 socket is connected, and the IPv4 socket is invalidated and released. + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. +**/ +- (BOOL)connectToHost:(NSString *)host onPort:(UInt16)port error:(NSError **)errPtr +{ + if(theFlags & kDidClose) + { + [NSException raise:AsyncUdpSocketException + format:@"The socket is closed."]; + } + if(theFlags & kDidConnect) + { + [NSException raise:AsyncUdpSocketException + format:@"Cannot connect a socket more than once."]; + } + + // Convert the given host/port into native address structures for CFSocketSetAddress + NSData *address4 = nil, *address6 = nil; + + int error = [self convertForSendHost:host port:port intoAddress4:&address4 address6:&address6]; + if(error) + { + if(errPtr) + { + NSString *errMsg = [NSString stringWithCString:gai_strerror(error) encoding:NSASCIIStringEncoding]; + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + *errPtr = [NSError errorWithDomain:@"kCFStreamErrorDomainNetDB" code:error userInfo:info]; + } + return NO; + } + + NSAssert((address4 || address6), @"address4 and address6 are nil"); + + // We only want to connect via a single interface. + // IPv4 is currently preferred, but this may change in the future. + + CFSocketError sockErr; + + if (address4) + { + if (theSocket4) + { + sockErr = CFSocketConnectToAddress(theSocket4, (__bridge CFDataRef)address4, (CFTimeInterval)0.0); + if (sockErr != kCFSocketSuccess) + { + if(errPtr) *errPtr = [self getSocketError]; + return NO; + } + theFlags |= kDidConnect; + + // We're connected to an IPv4 address, so no need for the IPv6 socket + [self closeSocket6]; + + return YES; + } + else if(!address6) + { + if(errPtr) *errPtr = [self getIPv4UnavailableError]; + return NO; + } + } + + if (address6) + { + // Note: The iPhone doesn't currently support IPv6 + + if (theSocket6) + { + sockErr = CFSocketConnectToAddress(theSocket6, (__bridge CFDataRef)address6, (CFTimeInterval)0.0); + if (sockErr != kCFSocketSuccess) + { + if(errPtr) *errPtr = [self getSocketError]; + return NO; + } + theFlags |= kDidConnect; + + // We're connected to an IPv6 address, so no need for the IPv4 socket + [self closeSocket4]; + + return YES; + } + else + { + if(errPtr) *errPtr = [self getIPv6UnavailableError]; + return NO; + } + } + + // It shouldn't be possible to get to this point because either address4 or address6 was non-nil. + if(errPtr) *errPtr = nil; + return NO; +} + +/** + * Connects the underlying UDP socket to the remote address. + * If the address is an IPv4 address, the IPv4 socket is connected, and the IPv6 socket is invalidated and released. + * If the address is an IPv6 address, the IPv6 socket is connected, and the IPv4 socket is invalidated and released. + * + * The address is a native address structure, as may be returned from API's such as Bonjour. + * An address may be created manually by simply wrapping a sockaddr_in or sockaddr_in6 in an NSData object. + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. +**/ +- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr +{ + if (theFlags & kDidClose) + { + [NSException raise:AsyncUdpSocketException + format:@"The socket is closed."]; + } + if (theFlags & kDidConnect) + { + [NSException raise:AsyncUdpSocketException + format:@"Cannot connect a socket more than once."]; + } + + CFSocketError sockErr; + + // Is remoteAddr an IPv4 address? + if ([remoteAddr length] == sizeof(struct sockaddr_in)) + { + if (theSocket4) + { + sockErr = CFSocketConnectToAddress(theSocket4, (__bridge CFDataRef)remoteAddr, (CFTimeInterval)0.0); + if (sockErr != kCFSocketSuccess) + { + if(errPtr) *errPtr = [self getSocketError]; + return NO; + } + theFlags |= kDidConnect; + + // We're connected to an IPv4 address, so no need for the IPv6 socket + [self closeSocket6]; + + return YES; + } + else + { + if(errPtr) *errPtr = [self getIPv4UnavailableError]; + return NO; + } + } + + // Is remoteAddr an IPv6 address? + if ([remoteAddr length] == sizeof(struct sockaddr_in6)) + { + if (theSocket6) + { + sockErr = CFSocketConnectToAddress(theSocket6, (__bridge CFDataRef)remoteAddr, (CFTimeInterval)0.0); + if (sockErr != kCFSocketSuccess) + { + if(errPtr) *errPtr = [self getSocketError]; + return NO; + } + theFlags |= kDidConnect; + + // We're connected to an IPv6 address, so no need for the IPv4 socket + [self closeSocket4]; + + return YES; + } + else + { + if(errPtr) *errPtr = [self getIPv6UnavailableError]; + return NO; + } + } + + // The remoteAddr was invalid + if(errPtr) + { + NSString *errMsg = @"remoteAddr parameter is not a valid address"; + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + *errPtr = [NSError errorWithDomain:AsyncUdpSocketErrorDomain + code:AsyncUdpSocketBadParameter + userInfo:info]; + } + return NO; +} + +/** + * Join multicast group + * + * Group should be a multicast IP address (eg. @"239.255.250.250" for IPv4). + * Address is local interface for IPv4, but currently defaults under IPv6. +**/ +- (BOOL)joinMulticastGroup:(NSString *)group error:(NSError **)errPtr +{ + return [self joinMulticastGroup:group withAddress:nil error:errPtr]; +} + +- (BOOL)joinMulticastGroup:(NSString *)group withAddress:(NSString *)address error:(NSError **)errPtr +{ + if(theFlags & kDidClose) + { + [NSException raise:AsyncUdpSocketException + format:@"The socket is closed."]; + } + if(!(theFlags & kDidBind)) + { + [NSException raise:AsyncUdpSocketException + format:@"Must bind a socket before joining a multicast group."]; + } + if(theFlags & kDidConnect) + { + [NSException raise:AsyncUdpSocketException + format:@"Cannot join a multicast group if connected."]; + } + + // Get local interface address + // Convert the given host/port into native address structures for CFSocketSetAddress + NSData *address4 = nil, *address6 = nil; + + int error = [self convertForBindHost:address port:0 intoAddress4:&address4 address6:&address6]; + if(error) + { + if(errPtr) + { + NSString *errMsg = [NSString stringWithCString:gai_strerror(error) encoding:NSASCIIStringEncoding]; + NSString *errDsc = [NSString stringWithFormat:@"Invalid parameter 'address': %@", errMsg]; + NSDictionary *info = [NSDictionary dictionaryWithObject:errDsc forKey:NSLocalizedDescriptionKey]; + + *errPtr = [NSError errorWithDomain:@"kCFStreamErrorDomainNetDB" code:error userInfo:info]; + } + return NO; + } + + NSAssert((address4 || address6), @"address4 and address6 are nil"); + + // Get multicast address (group) + NSData *group4 = nil, *group6 = nil; + + error = [self convertForBindHost:group port:0 intoAddress4:&group4 address6:&group6]; + if(error) + { + if(errPtr) + { + NSString *errMsg = [NSString stringWithCString:gai_strerror(error) encoding:NSASCIIStringEncoding]; + NSString *errDsc = [NSString stringWithFormat:@"Invalid parameter 'group': %@", errMsg]; + NSDictionary *info = [NSDictionary dictionaryWithObject:errDsc forKey:NSLocalizedDescriptionKey]; + + *errPtr = [NSError errorWithDomain:@"kCFStreamErrorDomainNetDB" code:error userInfo:info]; + } + return NO; + } + + NSAssert((group4 || group6), @"group4 and group6 are nil"); + + if(theSocket4 && group4 && address4) + { + const struct sockaddr_in* nativeAddress = [address4 bytes]; + const struct sockaddr_in* nativeGroup = [group4 bytes]; + + struct ip_mreq imreq; + imreq.imr_multiaddr = nativeGroup->sin_addr; + imreq.imr_interface = nativeAddress->sin_addr; + + // JOIN multicast group on default interface + error = setsockopt(CFSocketGetNative(theSocket4), IPPROTO_IP, IP_ADD_MEMBERSHIP, + (const void *)&imreq, sizeof(struct ip_mreq)); + if(error) + { + if(errPtr) + { + NSString *errMsg = @"Unable to join IPv4 multicast group"; + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + *errPtr = [NSError errorWithDomain:@"kCFStreamErrorDomainPOSIX" code:error userInfo:info]; + } + return NO; + } + + // Using IPv4 only + [self closeSocket6]; + + return YES; + } + + if(theSocket6 && group6 && address6) + { + const struct sockaddr_in6* nativeGroup = [group6 bytes]; + + struct ipv6_mreq imreq; + imreq.ipv6mr_multiaddr = nativeGroup->sin6_addr; + imreq.ipv6mr_interface = 0; + + // JOIN multicast group on default interface + error = setsockopt(CFSocketGetNative(theSocket6), IPPROTO_IP, IPV6_JOIN_GROUP, + (const void *)&imreq, sizeof(struct ipv6_mreq)); + if(error) + { + if(errPtr) + { + NSString *errMsg = @"Unable to join IPv6 multicast group"; + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + *errPtr = [NSError errorWithDomain:@"kCFStreamErrorDomainPOSIX" code:error userInfo:info]; + } + return NO; + } + + // Using IPv6 only + [self closeSocket4]; + + return YES; + } + + // The given address and group didn't match the existing socket(s). + // This means there were no compatible combination of all IPv4 or IPv6 socket, group and address. + if(errPtr) + { + NSString *errMsg = @"Invalid group and/or address, not matching existing socket(s)"; + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + *errPtr = [NSError errorWithDomain:AsyncUdpSocketErrorDomain + code:AsyncUdpSocketBadParameter + userInfo:info]; + } + return NO; +} + +/** + * By default, the underlying socket in the OS will not allow you to send broadcast messages. + * In order to send broadcast messages, you need to enable this functionality in the socket. + * + * A broadcast is a UDP message to addresses like "192.168.255.255" or "255.255.255.255" that is + * delivered to every host on the network. + * The reason this is generally disabled by default is to prevent + * accidental broadcast messages from flooding the network. +**/ +- (BOOL)enableBroadcast:(BOOL)flag error:(NSError **)errPtr +{ + if (theSocket4) + { + int value = flag ? 1 : 0; + int error = setsockopt(CFSocketGetNative(theSocket4), SOL_SOCKET, SO_BROADCAST, + (const void *)&value, sizeof(value)); + if(error) + { + if(errPtr) + { + NSString *errMsg = @"Unable to enable broadcast message sending"; + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + *errPtr = [NSError errorWithDomain:@"kCFStreamErrorDomainPOSIX" code:error userInfo:info]; + } + return NO; + } + } + + // IPv6 does not implement broadcast, the ability to send a packet to all hosts on the attached link. + // The same effect can be achieved by sending a packet to the link-local all hosts multicast group. + + return YES; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Disconnect Implementation: +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)emptyQueues +{ + if (theCurrentSend) [self endCurrentSend]; + if (theCurrentReceive) [self endCurrentReceive]; + + [theSendQueue removeAllObjects]; + [theReceiveQueue removeAllObjects]; + + [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(maybeDequeueSend) object:nil]; + [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(maybeDequeueReceive) object:nil]; + + theFlags &= ~kDequeueSendScheduled; + theFlags &= ~kDequeueReceiveScheduled; +} + +- (void)closeSocket4 +{ + if (theSocket4 != NULL) + { + CFSocketInvalidate(theSocket4); + CFRelease(theSocket4); + theSocket4 = NULL; + } + if (theSource4 != NULL) + { + [self runLoopRemoveSource:theSource4]; + CFRelease(theSource4); + theSource4 = NULL; + } +} + +- (void)closeSocket6 +{ + if (theSocket6 != NULL) + { + CFSocketInvalidate(theSocket6); + CFRelease(theSocket6); + theSocket6 = NULL; + } + if (theSource6 != NULL) + { + [self runLoopRemoveSource:theSource6]; + CFRelease(theSource6); + theSource6 = NULL; + } +} + +- (void)close +{ + [self emptyQueues]; + [self closeSocket4]; + [self closeSocket6]; + + theRunLoop = NULL; + + // Delay notification to give user freedom to release without returning here and core-dumping. + if ([theDelegate respondsToSelector:@selector(onUdpSocketDidClose:)]) + { + [theDelegate performSelector:@selector(onUdpSocketDidClose:) + withObject:self + afterDelay:0 + inModes:theRunLoopModes]; + } + + theFlags |= kDidClose; +} + +- (void)closeAfterSending +{ + if(theFlags & kDidClose) return; + + theFlags |= (kForbidSendReceive | kCloseAfterSends); + [self maybeScheduleClose]; +} + +- (void)closeAfterReceiving +{ + if(theFlags & kDidClose) return; + + theFlags |= (kForbidSendReceive | kCloseAfterReceives); + [self maybeScheduleClose]; +} + +- (void)closeAfterSendingAndReceiving +{ + if(theFlags & kDidClose) return; + + theFlags |= (kForbidSendReceive | kCloseAfterSends | kCloseAfterReceives); + [self maybeScheduleClose]; +} + +- (void)maybeScheduleClose +{ + BOOL shouldDisconnect = NO; + + if(theFlags & kCloseAfterSends) + { + if(([theSendQueue count] == 0) && (theCurrentSend == nil)) + { + if(theFlags & kCloseAfterReceives) + { + if(([theReceiveQueue count] == 0) && (theCurrentReceive == nil)) + { + shouldDisconnect = YES; + } + } + else + { + shouldDisconnect = YES; + } + } + } + else if(theFlags & kCloseAfterReceives) + { + if(([theReceiveQueue count] == 0) && (theCurrentReceive == nil)) + { + shouldDisconnect = YES; + } + } + + if(shouldDisconnect) + { + [self performSelector:@selector(close) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Errors +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Returns a standard error object for the current errno value. + * Errno is used for low-level BSD socket errors. +**/ +- (NSError *)getErrnoError +{ + NSString *errorMsg = [NSString stringWithUTF8String:strerror(errno)]; + NSDictionary *userInfo = [NSDictionary dictionaryWithObject:errorMsg forKey:NSLocalizedDescriptionKey]; + + return [NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:userInfo]; +} + +/** + * Returns a standard error message for a CFSocket error. + * Unfortunately, CFSocket offers no feedback on its errors. +**/ +- (NSError *)getSocketError +{ + NSString *errMsg = @"General CFSocket error"; + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + return [NSError errorWithDomain:AsyncUdpSocketErrorDomain code:AsyncUdpSocketCFSocketError userInfo:info]; +} + +- (NSError *)getIPv4UnavailableError +{ + NSString *errMsg = @"IPv4 is unavailable due to binding/connecting using IPv6 only"; + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + return [NSError errorWithDomain:AsyncUdpSocketErrorDomain code:AsyncUdpSocketIPv4Unavailable userInfo:info]; +} + +- (NSError *)getIPv6UnavailableError +{ + NSString *errMsg = @"IPv6 is unavailable due to binding/connecting using IPv4 only or is not supported on this platform"; + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + return [NSError errorWithDomain:AsyncUdpSocketErrorDomain code:AsyncUdpSocketIPv6Unavailable userInfo:info]; +} + +- (NSError *)getSendTimeoutError +{ + NSString *errMsg = @"Send operation timed out"; + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + return [NSError errorWithDomain:AsyncUdpSocketErrorDomain code:AsyncUdpSocketSendTimeoutError userInfo:info]; +} +- (NSError *)getReceiveTimeoutError +{ + NSString *errMsg = @"Receive operation timed out"; + NSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey]; + + return [NSError errorWithDomain:AsyncUdpSocketErrorDomain code:AsyncUdpSocketReceiveTimeoutError userInfo:info]; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Diagnostics +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (NSString *)localHost +{ + if(cachedLocalHost) return cachedLocalHost; + + if(theSocket4) + return [self localHost:theSocket4]; + else + return [self localHost:theSocket6]; +} + +- (UInt16)localPort +{ + if(cachedLocalPort > 0) return cachedLocalPort; + + if(theSocket4) + return [self localPort:theSocket4]; + else + return [self localPort:theSocket6]; +} + +- (NSString *)connectedHost +{ + if(cachedConnectedHost) return cachedConnectedHost; + + if(theSocket4) + return [self connectedHost:theSocket4]; + else + return [self connectedHost:theSocket6]; +} + +- (UInt16)connectedPort +{ + if(cachedConnectedPort > 0) return cachedConnectedPort; + + if(theSocket4) + return [self connectedPort:theSocket4]; + else + return [self connectedPort:theSocket6]; +} + +- (NSString *)localHost:(CFSocketRef)theSocket +{ + if (theSocket == NULL) return nil; + + // Unfortunately we can't use CFSocketCopyAddress. + // The CFSocket library caches the address the first time you call CFSocketCopyAddress. + // So if this is called prior to binding/connecting/sending, it won't be updated again when necessary, + // and will continue to return the old value of the socket address. + + NSString *result = nil; + + if (theSocket == theSocket4) + { + struct sockaddr_in sockaddr4; + socklen_t sockaddr4len = sizeof(sockaddr4); + + if (getsockname(CFSocketGetNative(theSocket), (struct sockaddr *)&sockaddr4, &sockaddr4len) < 0) + { + return nil; + } + result = [self addressHost4:&sockaddr4]; + } + else + { + struct sockaddr_in6 sockaddr6; + socklen_t sockaddr6len = sizeof(sockaddr6); + + if (getsockname(CFSocketGetNative(theSocket), (struct sockaddr *)&sockaddr6, &sockaddr6len) < 0) + { + return nil; + } + result = [self addressHost6:&sockaddr6]; + } + + if (theFlags & kDidBind) + { + cachedLocalHost = [result copy]; + } + + return result; +} + +- (UInt16)localPort:(CFSocketRef)theSocket +{ + if (theSocket == NULL) return 0; + + // Unfortunately we can't use CFSocketCopyAddress. + // The CFSocket library caches the address the first time you call CFSocketCopyAddress. + // So if this is called prior to binding/connecting/sending, it won't be updated again when necessary, + // and will continue to return the old value of the socket address. + + UInt16 result = 0; + + if (theSocket == theSocket4) + { + struct sockaddr_in sockaddr4; + socklen_t sockaddr4len = sizeof(sockaddr4); + + if (getsockname(CFSocketGetNative(theSocket), (struct sockaddr *)&sockaddr4, &sockaddr4len) < 0) + { + return 0; + } + result = ntohs(sockaddr4.sin_port); + } + else + { + struct sockaddr_in6 sockaddr6; + socklen_t sockaddr6len = sizeof(sockaddr6); + + if (getsockname(CFSocketGetNative(theSocket), (struct sockaddr *)&sockaddr6, &sockaddr6len) < 0) + { + return 0; + } + result = ntohs(sockaddr6.sin6_port); + } + + if (theFlags & kDidBind) + { + cachedLocalPort = result; + } + + return result; +} + +- (NSString *)connectedHost:(CFSocketRef)theSocket +{ + if (theSocket == NULL) return nil; + + // Unfortunately we can't use CFSocketCopyPeerAddress. + // The CFSocket library caches the address the first time you call CFSocketCopyPeerAddress. + // So if this is called prior to binding/connecting/sending, it may not be updated again when necessary, + // and will continue to return the old value of the socket peer address. + + NSString *result = nil; + + if (theSocket == theSocket4) + { + struct sockaddr_in sockaddr4; + socklen_t sockaddr4len = sizeof(sockaddr4); + + if (getpeername(CFSocketGetNative(theSocket), (struct sockaddr *)&sockaddr4, &sockaddr4len) < 0) + { + return nil; + } + result = [self addressHost4:&sockaddr4]; + } + else + { + struct sockaddr_in6 sockaddr6; + socklen_t sockaddr6len = sizeof(sockaddr6); + + if (getpeername(CFSocketGetNative(theSocket), (struct sockaddr *)&sockaddr6, &sockaddr6len) < 0) + { + return nil; + } + result = [self addressHost6:&sockaddr6]; + } + + if (theFlags & kDidConnect) + { + cachedConnectedHost = [result copy]; + } + + return result; +} + +- (UInt16)connectedPort:(CFSocketRef)theSocket +{ + if(theSocket == NULL) return 0; + + // Unfortunately we can't use CFSocketCopyPeerAddress. + // The CFSocket library caches the address the first time you call CFSocketCopyPeerAddress. + // So if this is called prior to binding/connecting/sending, it may not be updated again when necessary, + // and will continue to return the old value of the socket peer address. + + UInt16 result = 0; + + if(theSocket == theSocket4) + { + struct sockaddr_in sockaddr4; + socklen_t sockaddr4len = sizeof(sockaddr4); + + if(getpeername(CFSocketGetNative(theSocket), (struct sockaddr *)&sockaddr4, &sockaddr4len) < 0) + { + return 0; + } + result = ntohs(sockaddr4.sin_port); + } + else + { + struct sockaddr_in6 sockaddr6; + socklen_t sockaddr6len = sizeof(sockaddr6); + + if(getpeername(CFSocketGetNative(theSocket), (struct sockaddr *)&sockaddr6, &sockaddr6len) < 0) + { + return 0; + } + result = ntohs(sockaddr6.sin6_port); + } + + if(theFlags & kDidConnect) + { + cachedConnectedPort = result; + } + + return result; +} + +- (BOOL)isConnected +{ + return (((theFlags & kDidConnect) != 0) && ((theFlags & kDidClose) == 0)); +} + +- (BOOL)isConnectedToHost:(NSString *)host port:(UInt16)port +{ + return [[self connectedHost] isEqualToString:host] && ([self connectedPort] == port); +} + +- (BOOL)isClosed +{ + return (theFlags & kDidClose) ? YES : NO; +} + +- (BOOL)isIPv4 +{ + return (theSocket4 != NULL); +} + +- (BOOL)isIPv6 +{ + return (theSocket6 != NULL); +} + +- (unsigned int)maximumTransmissionUnit +{ + CFSocketNativeHandle theNativeSocket; + if(theSocket4) + theNativeSocket = CFSocketGetNative(theSocket4); + else if(theSocket6) + theNativeSocket = CFSocketGetNative(theSocket6); + else + return 0; + + if(theNativeSocket == 0) + { + return 0; + } + + struct ifreq ifr; + bzero(&ifr, sizeof(ifr)); + + if(if_indextoname(theNativeSocket, ifr.ifr_name) == NULL) + { + return 0; + } + + if(ioctl(theNativeSocket, SIOCGIFMTU, &ifr) >= 0) + { + return ifr.ifr_mtu; + } + + return 0; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Sending +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)sendData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag +{ + if([data length] == 0) return NO; + if(theFlags & kForbidSendReceive) return NO; + if(theFlags & kDidClose) return NO; + + // This method is only for connected sockets + if(![self isConnected]) return NO; + + AsyncSendPacket *packet = [[AsyncSendPacket alloc] initWithData:data address:nil timeout:timeout tag:tag]; + + [theSendQueue addObject:packet]; + [self scheduleDequeueSend]; + + return YES; +} + +- (BOOL)sendData:(NSData *)data + toHost:(NSString *)host + port:(UInt16)port + withTimeout:(NSTimeInterval)timeout + tag:(long)tag +{ + if([data length] == 0) return NO; + if(theFlags & kForbidSendReceive) return NO; + if(theFlags & kDidClose) return NO; + + // This method is only for non-connected sockets + if([self isConnected]) return NO; + + NSData *address4 = nil, *address6 = nil; + [self convertForSendHost:host port:port intoAddress4:&address4 address6:&address6]; + + AsyncSendPacket *packet = nil; + + if(address4 && theSocket4) + packet = [[AsyncSendPacket alloc] initWithData:data address:address4 timeout:timeout tag:tag]; + else if(address6 && theSocket6) + packet = [[AsyncSendPacket alloc] initWithData:data address:address6 timeout:timeout tag:tag]; + else + return NO; + + if(address6 && theSocket6){ + NSLog(@"sendData ipv6"); + } + + + [theSendQueue addObject:packet]; + [self scheduleDequeueSend]; + + return YES; +} + +- (BOOL)sendData:(NSData *)data toAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout tag:(long)tag +{ + if([data length] == 0) return NO; + if(theFlags & kForbidSendReceive) return NO; + if(theFlags & kDidClose) return NO; + + // This method is only for non-connected sockets + if([self isConnected]) return NO; + + if([remoteAddr length] == sizeof(struct sockaddr_in) && !theSocket4) + return NO; + + if([remoteAddr length] == sizeof(struct sockaddr_in6) && !theSocket6) + return NO; + + AsyncSendPacket *packet = [[AsyncSendPacket alloc] initWithData:data address:remoteAddr timeout:timeout tag:tag]; + + [theSendQueue addObject:packet]; + [self scheduleDequeueSend]; + + return YES; +} + +- (BOOL)canAcceptBytes:(CFSocketRef)sockRef +{ + if(sockRef == theSocket4) + { + if(theFlags & kSock4CanAcceptBytes) return YES; + } + else + { + if(theFlags & kSock6CanAcceptBytes) return YES; + } + + CFSocketNativeHandle theNativeSocket = CFSocketGetNative(sockRef); + + if(theNativeSocket == 0) + { + NSLog(@"Error - Could not get CFSocketNativeHandle from CFSocketRef"); + return NO; + } + + fd_set fds; + FD_ZERO(&fds); + FD_SET(theNativeSocket, &fds); + + struct timeval timeout; + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + return select(FD_SETSIZE, NULL, &fds, NULL, &timeout) > 0; +} + +- (CFSocketRef)socketForPacket:(AsyncSendPacket *)packet +{ + if(!theSocket4) + return theSocket6; + if(!theSocket6) + return theSocket4; + + return ([packet->address length] == sizeof(struct sockaddr_in)) ? theSocket4 : theSocket6; +} + +/** + * Puts a maybeDequeueSend on the run loop. +**/ +- (void)scheduleDequeueSend +{ + if((theFlags & kDequeueSendScheduled) == 0) + { + theFlags |= kDequeueSendScheduled; + [self performSelector:@selector(maybeDequeueSend) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + } +} + +/** + * This method starts a new send, if needed. + * It is called when a user requests a send. +**/ +- (void)maybeDequeueSend +{ + // Unset the flag indicating a call to this method is scheduled + theFlags &= ~kDequeueSendScheduled; + + if(theCurrentSend == nil) + { + if([theSendQueue count] > 0) + { + // Dequeue next send packet + theCurrentSend = [theSendQueue objectAtIndex:0]; + [theSendQueue removeObjectAtIndex:0]; + + // Start time-out timer. + if(theCurrentSend->timeout >= 0.0) + { + theSendTimer = [NSTimer timerWithTimeInterval:theCurrentSend->timeout + target:self + selector:@selector(doSendTimeout:) + userInfo:nil + repeats:NO]; + + [self runLoopAddTimer:theSendTimer]; + } + + // Immediately send, if possible. + [self doSend:[self socketForPacket:theCurrentSend]]; + } + else if(theFlags & kCloseAfterSends) + { + if(theFlags & kCloseAfterReceives) + { + if(([theReceiveQueue count] == 0) && (theCurrentReceive == nil)) + { + [self close]; + } + } + else + { + [self close]; + } + } + } +} + +/** + * This method is called when a new read is taken from the read queue or when new data becomes available on the stream. +**/ +- (void)doSend:(CFSocketRef)theSocket +{ + if(theCurrentSend != nil) + { + if(theSocket != [self socketForPacket:theCurrentSend]) + { + // Current send is for the other socket + return; + } + + if([self canAcceptBytes:theSocket]) + { + ssize_t result; + CFSocketNativeHandle theNativeSocket = CFSocketGetNative(theSocket); + + const void *buf = [theCurrentSend->buffer bytes]; + NSUInteger bufSize = [theCurrentSend->buffer length]; + + if([self isConnected]) + { + result = send(theNativeSocket, buf, (size_t)bufSize, 0); + } + else + { + const void *dst = [theCurrentSend->address bytes]; + NSUInteger dstSize = [theCurrentSend->address length]; + + result = sendto(theNativeSocket, buf, (size_t)bufSize, 0, dst, (socklen_t)dstSize); + } + + if(theSocket == theSocket4) + theFlags &= ~kSock4CanAcceptBytes; + else + theFlags &= ~kSock6CanAcceptBytes; + + if(result < 0) + { + [self failCurrentSend:[self getErrnoError]]; + } + else + { + // If it wasn't bound before, it's bound now + theFlags |= kDidBind; + + [self completeCurrentSend]; + } + + [self scheduleDequeueSend]; + } + else + { + // Request notification when the socket is ready to send more data + CFSocketEnableCallBacks(theSocket, kCFSocketReadCallBack | kCFSocketWriteCallBack); + } + } +} + +- (void)completeCurrentSend +{ + NSAssert (theCurrentSend, @"Trying to complete current send when there is no current send."); + + if ([theDelegate respondsToSelector:@selector(onUdpSocket:didSendDataWithTag:)]) + { + [theDelegate onUdpSocket:self didSendDataWithTag:theCurrentSend->tag]; + } + + if (theCurrentSend != nil) [self endCurrentSend]; // Caller may have disconnected. +} + +- (void)failCurrentSend:(NSError *)error +{ + NSAssert (theCurrentSend, @"Trying to fail current send when there is no current send."); + + if ([theDelegate respondsToSelector:@selector(onUdpSocket:didNotSendDataWithTag:dueToError:)]) + { + [theDelegate onUdpSocket:self didNotSendDataWithTag:theCurrentSend->tag dueToError:error]; + } + + if (theCurrentSend != nil) [self endCurrentSend]; // Caller may have disconnected. +} + +/** + * Ends the current send, and all associated variables such as the send timer. +**/ +- (void)endCurrentSend +{ + NSAssert (theCurrentSend, @"Trying to end current send when there is no current send."); + + [theSendTimer invalidate]; + theSendTimer = nil; + + theCurrentSend = nil; +} + +- (void)doSendTimeout:(NSTimer *)timer +{ + if (timer != theSendTimer) return; // Old timer. Ignore it. + if (theCurrentSend != nil) + { + [self failCurrentSend:[self getSendTimeoutError]]; + [self scheduleDequeueSend]; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Receiving +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)receiveWithTimeout:(NSTimeInterval)timeout tag:(long)tag +{ + if(theFlags & kForbidSendReceive) return; + if(theFlags & kDidClose) return; + + AsyncReceivePacket *packet = [[AsyncReceivePacket alloc] initWithTimeout:timeout tag:tag]; + + [theReceiveQueue addObject:packet]; + [self scheduleDequeueReceive]; +} + +- (BOOL)hasBytesAvailable:(CFSocketRef)sockRef +{ + if(sockRef == theSocket4) + { + if(theFlags & kSock4HasBytesAvailable) return YES; + } + else + { + if(theFlags & kSock6HasBytesAvailable) return YES; + } + + CFSocketNativeHandle theNativeSocket = CFSocketGetNative(sockRef); + + if(theNativeSocket == 0) + { + NSLog(@"Error - Could not get CFSocketNativeHandle from CFSocketRef"); + return NO; + } + + fd_set fds; + FD_ZERO(&fds); + FD_SET(theNativeSocket, &fds); + + struct timeval timeout; + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + return select(FD_SETSIZE, &fds, NULL, NULL, &timeout) > 0; +} + +/** + * Puts a maybeDequeueReceive on the run loop. +**/ +- (void)scheduleDequeueReceive +{ + if((theFlags & kDequeueReceiveScheduled) == 0) + { + theFlags |= kDequeueReceiveScheduled; + [self performSelector:@selector(maybeDequeueReceive) withObject:nil afterDelay:0 inModes:theRunLoopModes]; + } +} + +/** + * Starts a new receive operation if needed +**/ +- (void)maybeDequeueReceive +{ + // Unset the flag indicating a call to this method is scheduled + theFlags &= ~kDequeueReceiveScheduled; + + if (theCurrentReceive == nil) + { + if ([theReceiveQueue count] > 0) + { + // Dequeue next receive packet + theCurrentReceive = [theReceiveQueue objectAtIndex:0]; + [theReceiveQueue removeObjectAtIndex:0]; + + // Start time-out timer. + if (theCurrentReceive->timeout >= 0.0) + { + theReceiveTimer = [NSTimer timerWithTimeInterval:theCurrentReceive->timeout + target:self + selector:@selector(doReceiveTimeout:) + userInfo:nil + repeats:NO]; + + [self runLoopAddTimer:theReceiveTimer]; + } + + // Immediately receive, if possible + // We always check both sockets so we don't ever starve one of them. + // We also check them in alternating orders to prevent starvation if both of them + // have a continuous flow of incoming data. + if(theFlags & kFlipFlop) + { + [self doReceive4]; + [self doReceive6]; + } + else + { + [self doReceive6]; + [self doReceive4]; + } + + theFlags ^= kFlipFlop; + } + else if(theFlags & kCloseAfterReceives) + { + if(theFlags & kCloseAfterSends) + { + if(([theSendQueue count] == 0) && (theCurrentSend == nil)) + { + [self close]; + } + } + else + { + [self close]; + } + } + } +} + +- (void)doReceive4 +{ + if(theSocket4) [self doReceive:theSocket4]; +} + +- (void)doReceive6 +{ + if(theSocket6) [self doReceive:theSocket6]; +} + +- (void)doReceive:(CFSocketRef)theSocket +{ + if (theCurrentReceive != nil) + { + BOOL appIgnoredReceivedData; + BOOL userIgnoredReceivedData; + + do + { + // Set or reset ignored variables. + // If the app or user ignores the received data, we'll continue this do-while loop. + appIgnoredReceivedData = NO; + userIgnoredReceivedData = NO; + + if([self hasBytesAvailable:theSocket]) + { + NSData* bufferData = nil; + ssize_t result; + CFSocketNativeHandle theNativeSocket = CFSocketGetNative(theSocket); + + // Allocate buffer for recvfrom operation. + // If the operation is successful, we'll realloc the buffer to the appropriate size, + // and create an NSData wrapper around it without needing to copy any bytes around. + void *buf = malloc(maxReceiveBufferSize); + size_t bufSize = maxReceiveBufferSize; + + if(theSocket == theSocket4) + { + struct sockaddr_in sockaddr4; + socklen_t sockaddr4len = sizeof(sockaddr4); + + result = recvfrom(theNativeSocket, buf, bufSize, 0, (struct sockaddr *)&sockaddr4, &sockaddr4len); + + if(result >= 0) + { + NSString *host = [self addressHost4:&sockaddr4]; + UInt16 port = ntohs(sockaddr4.sin_port); + + if([self isConnected] && ![self isConnectedToHost:host port:port]) + { + // The user connected to an address, and the received data doesn't match the address. + // This may happen if the data is received by the kernel prior to the connect call. + appIgnoredReceivedData = YES; + } + else + { + if(result != bufSize) + { + buf = realloc(buf, result); + } + bufferData = [[NSData alloc] initWithBytesNoCopy:buf + length:result + freeWhenDone:YES]; + theCurrentReceive->buffer = bufferData; + theCurrentReceive->host = host; + theCurrentReceive->port = port; + } + } + + theFlags &= ~kSock4HasBytesAvailable; + } + else + { + struct sockaddr_in6 sockaddr6; + socklen_t sockaddr6len = sizeof(sockaddr6); + + result = recvfrom(theNativeSocket, buf, bufSize, 0, (struct sockaddr *)&sockaddr6, &sockaddr6len); + + if(result >= 0) + { + NSString *host = [self addressHost6:&sockaddr6]; + UInt16 port = ntohs(sockaddr6.sin6_port); + + if([self isConnected] && ![self isConnectedToHost:host port:port]) + { + // The user connected to an address, and the received data doesn't match the address. + // This may happen if the data is received by the kernel prior to the connect call. + appIgnoredReceivedData = YES; + } + else + { + if(result != bufSize) + { + buf = realloc(buf, result); + } + bufferData = [[NSData alloc] initWithBytesNoCopy:buf + length:result + freeWhenDone:YES]; + theCurrentReceive->buffer = bufferData; + theCurrentReceive->host = host; + theCurrentReceive->port = port; + } + } + + theFlags &= ~kSock6HasBytesAvailable; + } + + // Check to see if we need to free our alloc'd buffer + // If bufferData is non-nil, it has taken ownership of the buffer + if(bufferData == nil) + { + free(buf); + } + + if(result < 0) + { + [self failCurrentReceive:[self getErrnoError]]; + [self scheduleDequeueReceive]; + } + else if(!appIgnoredReceivedData) + { + BOOL finished = [self maybeCompleteCurrentReceive]; + + if(finished) + { + [self scheduleDequeueReceive]; + } + else + { + theCurrentReceive->buffer = nil; + theCurrentReceive->host = nil; + + userIgnoredReceivedData = YES; + } + } + } + else + { + // Request notification when the socket is ready to receive more data + CFSocketEnableCallBacks(theSocket, kCFSocketReadCallBack | kCFSocketWriteCallBack); + } + + } while(appIgnoredReceivedData || userIgnoredReceivedData); + } +} + +- (BOOL)maybeCompleteCurrentReceive +{ + NSAssert (theCurrentReceive, @"Trying to complete current receive when there is no current receive."); + + BOOL finished = YES; + + if ([theDelegate respondsToSelector:@selector(onUdpSocket:didReceiveData:withTag:fromHost:port:)]) + { + finished = [theDelegate onUdpSocket:self + didReceiveData:theCurrentReceive->buffer + withTag:theCurrentReceive->tag + fromHost:theCurrentReceive->host + port:theCurrentReceive->port]; + } + + if (finished) + { + if (theCurrentReceive != nil) [self endCurrentReceive]; // Caller may have disconnected. + } + return finished; +} + +- (void)failCurrentReceive:(NSError *)error +{ + NSAssert (theCurrentReceive, @"Trying to fail current receive when there is no current receive."); + + if ([theDelegate respondsToSelector:@selector(onUdpSocket:didNotReceiveDataWithTag:dueToError:)]) + { + [theDelegate onUdpSocket:self didNotReceiveDataWithTag:theCurrentReceive->tag dueToError:error]; + } + + if (theCurrentReceive != nil) [self endCurrentReceive]; // Caller may have disconnected. +} + +- (void)endCurrentReceive +{ + NSAssert (theCurrentReceive, @"Trying to end current receive when there is no current receive."); + + [theReceiveTimer invalidate]; + theReceiveTimer = nil; + + theCurrentReceive = nil; +} + +- (void)doReceiveTimeout:(NSTimer *)timer +{ + if (timer != theReceiveTimer) return; // Old timer. Ignore it. + if (theCurrentReceive != nil) + { + [self failCurrentReceive:[self getReceiveTimeoutError]]; + [self scheduleDequeueReceive]; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark CF Callbacks +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)doCFSocketCallback:(CFSocketCallBackType)type + forSocket:(CFSocketRef)sock + withAddress:(NSData *)address + withData:(const void *)pData +{ + NSParameterAssert((sock == theSocket4) || (sock == theSocket6)); + + switch (type) + { + case kCFSocketReadCallBack: + if(sock == theSocket4) + theFlags |= kSock4HasBytesAvailable; + else + theFlags |= kSock6HasBytesAvailable; + [self doReceive:sock]; + break; + case kCFSocketWriteCallBack: + if(sock == theSocket4) + theFlags |= kSock4CanAcceptBytes; + else + theFlags |= kSock6CanAcceptBytes; + [self doSend:sock]; + break; + default: + NSLog (@"AsyncUdpSocket %p received unexpected CFSocketCallBackType %lu.", self, (unsigned long)type); + break; + } +} + +/** + * This is the callback we setup for CFSocket. + * This method does nothing but forward the call to it's Objective-C counterpart +**/ +static void MyCFSocketCallback(CFSocketRef sref, CFSocketCallBackType type, CFDataRef address, const void *pData, void *pInfo) +{ + @autoreleasepool { + + AsyncUdpSocket *theSocket = (__bridge AsyncUdpSocket *)pInfo; + [theSocket doCFSocketCallback:type forSocket:sref withAddress:(__bridge NSData *)address withData:pData]; + + } +} + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/External/UIView+AutoLayout.h b/star_lock/ios/Runner/XSTalkManager/External/UIView+AutoLayout.h new file mode 100755 index 00000000..ea34ad73 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/External/UIView+AutoLayout.h @@ -0,0 +1,278 @@ +// +// UIView+AutoLayout.h +// v2.0.0 +// https://github.com/smileyborg/UIView-AutoLayout +// +// Copyright (c) 2012 Richard Turton +// Copyright (c) 2013 Tyler Fox +// +// This code is distributed under the terms and conditions of the MIT license. +// +// 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. +// + +#import + +#pragma mark ALAttributes + +typedef NS_ENUM(NSInteger, ALEdge) { + ALEdgeLeft = NSLayoutAttributeLeft, // the left edge of the view + ALEdgeRight = NSLayoutAttributeRight, // the right edge of the view + ALEdgeTop = NSLayoutAttributeTop, // the top edge of the view + ALEdgeBottom = NSLayoutAttributeBottom, // the bottom edge of the view + ALEdgeLeading = NSLayoutAttributeLeading, // the leading edge of the view (left edge for left-to-right languages like English, right edge for right-to-left languages like Arabic) + ALEdgeTrailing = NSLayoutAttributeTrailing // the trailing edge of the view (right edge for left-to-right languages like English, left edge for right-to-left languages like Arabic) +}; + +typedef NS_ENUM(NSInteger, ALDimension) { + ALDimensionWidth = NSLayoutAttributeWidth, // the width of the view + ALDimensionHeight = NSLayoutAttributeHeight // the height of the view +}; + +typedef NS_ENUM(NSInteger, ALAxis) { + ALAxisVertical = NSLayoutAttributeCenterX, // a vertical line through the center of the view + ALAxisHorizontal = NSLayoutAttributeCenterY, // a horizontal line through the center of the view + ALAxisBaseline = NSLayoutAttributeBaseline // a horizontal line at the text baseline (not applicable to all views) +}; + +typedef void(^ALConstraintsBlock)(void); // a block of method calls to the UIView+AutoLayout category API + + +#pragma mark - UIView+AutoLayout + +/** + A category on UIView that provides a simple yet powerful interface for creating Auto Layout constraints. + */ +@interface UIView (AutoLayout) + + +#pragma mark Factory & Initializer Methods + +/** Creates and returns a new view that does not convert the autoresizing mask into constraints. */ ++ (instancetype)newAutoLayoutView; + +/** Initializes and returns a new view that does not convert the autoresizing mask into constraints. */ +- (instancetype)initForAutoLayout; + + +#pragma mark Set Constraint Priority + +/** Sets the constraint priority to the given value for all constraints created using the UIView+AutoLayout category API within the given constraints block. + NOTE: This method will have no effect (and will NOT set the priority) on constraints created or added using the SDK directly within the block! */ ++ (void)autoSetPriority:(UILayoutPriority)priority forConstraints:(ALConstraintsBlock)block; + + +#pragma mark Remove Constraints + +/** Removes the given constraint from the view it has been added to. */ ++ (void)autoRemoveConstraint:(NSLayoutConstraint *)constraint; + +/** Removes the given constraints from the views they have been added to. */ ++ (void)autoRemoveConstraints:(NSArray *)constraints; + +/** Removes all explicit constraints that affect the view. + WARNING: Apple's constraint solver is not optimized for large-scale constraint removal; you may encounter major performance issues after using this method. + NOTE: This method preserves implicit constraints, such as intrinsic content size constraints, which you usually do not want to remove. */ +- (void)autoRemoveConstraintsAffectingView; + +/** Removes all constraints that affect the view, optionally including implicit constraints. + WARNING: Apple's constraint solver is not optimized for large-scale constraint removal; you may encounter major performance issues after using this method. + NOTE: Implicit constraints are auto-generated lower priority constraints, and you usually do not want to remove these. */ +- (void)autoRemoveConstraintsAffectingViewIncludingImplicitConstraints:(BOOL)shouldRemoveImplicitConstraints; + +/** Recursively removes all explicit constraints that affect the view and its subviews. + WARNING: Apple's constraint solver is not optimized for large-scale constraint removal; you may encounter major performance issues after using this method. + NOTE: This method preserves implicit constraints, such as intrinsic content size constraints, which you usually do not want to remove. */ +- (void)autoRemoveConstraintsAffectingViewAndSubviews; + +/** Recursively removes all constraints from the view and its subviews, optionally including implicit constraints. + WARNING: Apple's constraint solver is not optimized for large-scale constraint removal; you may encounter major performance issues after using this method. + NOTE: Implicit constraints are auto-generated lower priority constraints, and you usually do not want to remove these. */ +- (void)autoRemoveConstraintsAffectingViewAndSubviewsIncludingImplicitConstraints:(BOOL)shouldRemoveImplicitConstraints; + + +#pragma mark Center in Superview + +/** Centers the view in its superview. */ +- (NSArray *)autoCenterInSuperview; + +/** Aligns the view to the same axis of its superview. */ +- (NSLayoutConstraint *)autoAlignAxisToSuperviewAxis:(ALAxis)axis; + + +#pragma mark Pin Edges to Superview + +/** Pins the given edge of the view to the same edge of the superview with an inset. */ +- (NSLayoutConstraint *)autoPinEdgeToSuperviewEdge:(ALEdge)edge withInset:(CGFloat)inset; + +/** Pins the given edge of the view to the same edge of the superview with an inset as a maximum or minimum. */ +- (NSLayoutConstraint *)autoPinEdgeToSuperviewEdge:(ALEdge)edge withInset:(CGFloat)inset relation:(NSLayoutRelation)relation; + +/** Pins the edges of the view to the edges of its superview with the given edge insets. */ +- (NSArray *)autoPinEdgesToSuperviewEdgesWithInsets:(UIEdgeInsets)insets; + +/** Pins 3 of the 4 edges of the view to the edges of its superview with the given edge insets, excluding one edge. */ +- (NSArray *)autoPinEdgesToSuperviewEdgesWithInsets:(UIEdgeInsets)insets excludingEdge:(ALEdge)edge; + + +#pragma mark Pin Edges + +/** Pins an edge of the view to a given edge of another view. */ +- (NSLayoutConstraint *)autoPinEdge:(ALEdge)edge toEdge:(ALEdge)toEdge ofView:(UIView *)peerView; + +/** Pins an edge of the view to a given edge of another view with an offset. */ +- (NSLayoutConstraint *)autoPinEdge:(ALEdge)edge toEdge:(ALEdge)toEdge ofView:(UIView *)peerView withOffset:(CGFloat)offset; + +/** Pins an edge of the view to a given edge of another view with an offset as a maximum or minimum. */ +- (NSLayoutConstraint *)autoPinEdge:(ALEdge)edge toEdge:(ALEdge)toEdge ofView:(UIView *)peerView withOffset:(CGFloat)offset relation:(NSLayoutRelation)relation; + + +#pragma mark Align Axes + +/** Aligns an axis of the view to the same axis of another view. */ +- (NSLayoutConstraint *)autoAlignAxis:(ALAxis)axis toSameAxisOfView:(UIView *)peerView; + +/** Aligns an axis of the view to the same axis of another view with an offset. */ +- (NSLayoutConstraint *)autoAlignAxis:(ALAxis)axis toSameAxisOfView:(UIView *)peerView withOffset:(CGFloat)offset; + + +#pragma mark Match Dimensions + +/** Matches a dimension of the view to a given dimension of another view. */ +- (NSLayoutConstraint *)autoMatchDimension:(ALDimension)dimension toDimension:(ALDimension)toDimension ofView:(UIView *)peerView; + +/** Matches a dimension of the view to a given dimension of another view with an offset. */ +- (NSLayoutConstraint *)autoMatchDimension:(ALDimension)dimension toDimension:(ALDimension)toDimension ofView:(UIView *)peerView withOffset:(CGFloat)offset; + +/** Matches a dimension of the view to a given dimension of another view with an offset as a maximum or minimum. */ +- (NSLayoutConstraint *)autoMatchDimension:(ALDimension)dimension toDimension:(ALDimension)toDimension ofView:(UIView *)peerView withOffset:(CGFloat)offset relation:(NSLayoutRelation)relation; + +/** Matches a dimension of the view to a multiple of a given dimension of another view. */ +- (NSLayoutConstraint *)autoMatchDimension:(ALDimension)dimension toDimension:(ALDimension)toDimension ofView:(UIView *)peerView withMultiplier:(CGFloat)multiplier; + +/** Matches a dimension of the view to a multiple of a given dimension of another view as a maximum or minimum. */ +- (NSLayoutConstraint *)autoMatchDimension:(ALDimension)dimension toDimension:(ALDimension)toDimension ofView:(UIView *)peerView withMultiplier:(CGFloat)multiplier relation:(NSLayoutRelation)relation; + + +#pragma mark Set Dimensions + +/** Sets the view to a specific size. */ +- (NSArray *)autoSetDimensionsToSize:(CGSize)size; + +/** Sets the given dimension of the view to a specific size. */ +- (NSLayoutConstraint *)autoSetDimension:(ALDimension)dimension toSize:(CGFloat)size; + +/** Sets the given dimension of the view to a specific size as a maximum or minimum. */ +- (NSLayoutConstraint *)autoSetDimension:(ALDimension)dimension toSize:(CGFloat)size relation:(NSLayoutRelation)relation; + + +#pragma mark Set Content Compression Resistance & Hugging + +/** Sets the priority of content compression resistance for an axis. + NOTE: This method must only be called from within the block passed into the method +[UIView autoSetPriority:forConstraints:] */ +- (void)autoSetContentCompressionResistancePriorityForAxis:(ALAxis)axis; + +/** Sets the priority of content hugging for an axis. + NOTE: This method must only be called from within the block passed into the method +[UIView autoSetPriority:forConstraints:] */ +- (void)autoSetContentHuggingPriorityForAxis:(ALAxis)axis; + + +#pragma mark Constrain Any Attributes + +/** Constrains an attribute (any ALEdge, ALAxis, or ALDimension) of the view to a given attribute of another view. */ +- (NSLayoutConstraint *)autoConstrainAttribute:(NSInteger)attribute toAttribute:(NSInteger)toAttribute ofView:(UIView *)peerView; + +/** Constrains an attribute (any ALEdge, ALAxis, or ALDimension) of the view to a given attribute of another view with an offset. */ +- (NSLayoutConstraint *)autoConstrainAttribute:(NSInteger)attribute toAttribute:(NSInteger)toAttribute ofView:(UIView *)peerView withOffset:(CGFloat)offset; + +/** Constrains an attribute (any ALEdge, ALAxis, or ALDimension) of the view to a given attribute of another view with an offset as a maximum or minimum. */ +- (NSLayoutConstraint *)autoConstrainAttribute:(NSInteger)attribute toAttribute:(NSInteger)toAttribute ofView:(UIView *)peerView withOffset:(CGFloat)offset relation:(NSLayoutRelation)relation; + +/** Constrains an attribute (any ALEdge, ALAxis, or ALDimension) of the view to a given attribute of another view with a multiplier. */ +- (NSLayoutConstraint *)autoConstrainAttribute:(NSInteger)attribute toAttribute:(NSInteger)toAttribute ofView:(UIView *)peerView withMultiplier:(CGFloat)multiplier; + +/** Constrains an attribute (any ALEdge, ALAxis, or ALDimension) of the view to a given attribute of another view with a multiplier as a maximum or minimum. */ +- (NSLayoutConstraint *)autoConstrainAttribute:(NSInteger)attribute toAttribute:(NSInteger)toAttribute ofView:(UIView *)peerView withMultiplier:(CGFloat)multiplier relation:(NSLayoutRelation)relation; + + +#pragma mark Pin to Layout Guides + +/** Pins the top edge of the view to the top layout guide of the given view controller with an inset. */ +- (NSLayoutConstraint *)autoPinToTopLayoutGuideOfViewController:(UIViewController *)viewController withInset:(CGFloat)inset; + +/** Pins the bottom edge of the view to the bottom layout guide of the given view controller with an inset. */ +- (NSLayoutConstraint *)autoPinToBottomLayoutGuideOfViewController:(UIViewController *)viewController withInset:(CGFloat)inset; + +@end + + +#pragma mark - NSArray+AutoLayout + +/** + A category on NSArray that provides a simple yet powerful interface for applying constraints to groups of views. + */ +@interface NSArray (AutoLayout) + + +#pragma mark Constrain Multiple Views + +/** Aligns views in this array to one another along a given edge. */ +- (NSArray *)autoAlignViewsToEdge:(ALEdge)edge; + +/** Aligns views in this array to one another along a given axis. */ +- (NSArray *)autoAlignViewsToAxis:(ALAxis)axis; + +/** Matches a given dimension of all the views in this array. */ +- (NSArray *)autoMatchViewsDimension:(ALDimension)dimension; + +/** Sets the given dimension of all the views in this array to a given size. */ +- (NSArray *)autoSetViewsDimension:(ALDimension)dimension toSize:(CGFloat)size; + + +#pragma mark Distribute Multiple Views + +/** Distributes the views in this array equally along the selected axis in their superview. Views will be the same size (variable) in the dimension along the axis and will have spacing (fixed) between them. */ +- (NSArray *)autoDistributeViewsAlongAxis:(ALAxis)axis withFixedSpacing:(CGFloat)spacing alignment:(NSLayoutFormatOptions)alignment; + +/** Distributes the views in this array equally along the selected axis in their superview. Views will be the same size (variable) in the dimension along the axis and will have spacing (fixed) between them, with optional insets from the first and last views to their superview. */ +- (NSArray *)autoDistributeViewsAlongAxis:(ALAxis)axis withFixedSpacing:(CGFloat)spacing insetSpacing:(BOOL)shouldSpaceInsets alignment:(NSLayoutFormatOptions)alignment; + +/** Distributes the views in this array equally along the selected axis in their superview. Views will be the same size (fixed) in the dimension along the axis and will have spacing (variable) between them. */ +- (NSArray *)autoDistributeViewsAlongAxis:(ALAxis)axis withFixedSize:(CGFloat)size alignment:(NSLayoutFormatOptions)alignment; + +/** Distributes the views in this array equally along the selected axis in their superview. Views will be the same size (fixed) in the dimension along the axis and will have spacing (variable) between them, with optional insets from the first and last views to their superview. */ +- (NSArray *)autoDistributeViewsAlongAxis:(ALAxis)axis withFixedSize:(CGFloat)size insetSpacing:(BOOL)shouldSpaceInsets alignment:(NSLayoutFormatOptions)alignment; + +@end + + +#pragma mark - NSLayoutConstraint+AutoLayout + +/** + A category on NSLayoutConstraint that allows constraints to be easily removed. + */ +@interface NSLayoutConstraint (AutoLayout) + +/** Adds the constraint to the appropriate view. */ +- (void)autoInstall; + +/** Removes the constraint from the view it has been added to. */ +- (void)autoRemove; + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/External/UIView+AutoLayout.m b/star_lock/ios/Runner/XSTalkManager/External/UIView+AutoLayout.m new file mode 100755 index 00000000..d529a387 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/External/UIView+AutoLayout.m @@ -0,0 +1,1318 @@ +// +// UIView+AutoLayout.m +// v2.0.0 +// https://github.com/smileyborg/UIView-AutoLayout +// +// Copyright (c) 2012 Richard Turton +// Copyright (c) 2013 Tyler Fox +// +// This code is distributed under the terms and conditions of the MIT license. +// +// 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. +// + +#import "UIView+AutoLayout.h" + + +#pragma mark - UIView+AutoLayout + +@implementation UIView (AutoLayout) + + +#pragma mark Factory & Initializer Methods + +/** + Creates and returns a new view that does not convert the autoresizing mask into constraints. + */ ++ (instancetype)newAutoLayoutView +{ + UIView *view = [self new]; + view.translatesAutoresizingMaskIntoConstraints = NO; + return view; +} + +/** + Initializes and returns a new view that does not convert the autoresizing mask into constraints. + */ +- (instancetype)initForAutoLayout +{ + self = [self init]; + if (self) { + self.translatesAutoresizingMaskIntoConstraints = NO; + } + return self; +} + + +#pragma mark Set Constraint Priority + +/** + A global variable that determines the priority of all constraints created and added by this category. + Defaults to Required, will only be a different value while executing a constraints block passed into the + +[UIView autoSetPriority:forConstraints:] method (as that method will reset the value back to Required + before returning). + NOTE: As UIKit is not thread safe, access to this variable is not synchronized (and should only be done + on the main thread). + */ +static UILayoutPriority _al_globalConstraintPriority = UILayoutPriorityRequired; + +/** + A global variable that is set to YES while the constraints block passed in to the + +[UIView autoSetPriority:forConstraints:] method is executing. + NOTE: As UIKit is not thread safe, access to this variable is not synchronized (and should only be done + on the main thread). + */ +static BOOL _al_isExecutingConstraintsBlock = NO; + +/** + Sets the constraint priority to the given value for all constraints created using the UIView+AutoLayout + category API within the given constraints block. + + NOTE: This method will have no effect (and will NOT set the priority) on constraints created or added + using the SDK directly within the block! + + @param priority The layout priority to be set on all constraints in the constraints block. + @param block A block of method calls to the UIView+AutoLayout API that create and add constraints. + */ ++ (void)autoSetPriority:(UILayoutPriority)priority forConstraints:(ALConstraintsBlock)block +{ + NSAssert(block, @"The constraints block cannot be nil."); + if (block) { + _al_globalConstraintPriority = priority; + _al_isExecutingConstraintsBlock = YES; + block(); + _al_isExecutingConstraintsBlock = NO; + _al_globalConstraintPriority = UILayoutPriorityRequired; + } +} + + +#pragma mark Remove Constraints + +/** + Removes the given constraint from the view it has been added to. + + @param constraint The constraint to remove. + */ ++ (void)autoRemoveConstraint:(NSLayoutConstraint *)constraint +{ + if (constraint.secondItem) { + UIView *commonSuperview = [constraint.firstItem al_commonSuperviewWithView:constraint.secondItem]; + while (commonSuperview) { + if ([commonSuperview.constraints containsObject:constraint]) { + [commonSuperview removeConstraint:constraint]; + return; + } + commonSuperview = commonSuperview.superview; + } + } + else { + [constraint.firstItem removeConstraint:constraint]; + return; + } + NSAssert(nil, @"Failed to remove constraint: %@", constraint); +} + +/** + Removes the given constraints from the views they have been added to. + + @param constraints The constraints to remove. + */ ++ (void)autoRemoveConstraints:(NSArray *)constraints +{ + for (id object in constraints) { + if ([object isKindOfClass:[NSLayoutConstraint class]]) { + [self autoRemoveConstraint:((NSLayoutConstraint *)object)]; + } else { + NSAssert(nil, @"All constraints to remove must be instances of NSLayoutConstraint."); + } + } +} + +/** + Removes all explicit constraints that affect the view. + WARNING: Apple's constraint solver is not optimized for large-scale constraint removal; you may encounter major performance issues after using this method. + It is not recommended to use this method to "reset" a view for reuse in a different way with new constraints. Create a new view instead. + NOTE: This method preserves implicit constraints, such as intrinsic content size constraints, which you usually do not want to remove. + */ +- (void)autoRemoveConstraintsAffectingView +{ + [self autoRemoveConstraintsAffectingViewIncludingImplicitConstraints:NO]; +} + +/** + Removes all constraints that affect the view, optionally including implicit constraints. + WARNING: Apple's constraint solver is not optimized for large-scale constraint removal; you may encounter major performance issues after using this method. + It is not recommended to use this method to "reset" a view for reuse in a different way with new constraints. Create a new view instead. + NOTE: Implicit constraints are auto-generated lower priority constraints (such as those that attempt to keep a view at + its intrinsic content size by hugging its content & resisting compression), and you usually do not want to remove these. + + @param shouldRemoveImplicitConstraints Whether implicit constraints should be removed or skipped. + */ +- (void)autoRemoveConstraintsAffectingViewIncludingImplicitConstraints:(BOOL)shouldRemoveImplicitConstraints +{ + NSMutableArray *constraintsToRemove = [NSMutableArray new]; + UIView *startView = self; + do { + for (NSLayoutConstraint *constraint in startView.constraints) { + BOOL isImplicitConstraint = [NSStringFromClass([constraint class]) isEqualToString:@"NSContentSizeLayoutConstraint"]; + if (shouldRemoveImplicitConstraints || !isImplicitConstraint) { + if (constraint.firstItem == self || constraint.secondItem == self) { + [constraintsToRemove addObject:constraint]; + } + } + } + startView = startView.superview; + } while (startView); + [UIView autoRemoveConstraints:constraintsToRemove]; +} + +/** + Recursively removes all explicit constraints that affect the view and its subviews. + WARNING: Apple's constraint solver is not optimized for large-scale constraint removal; you may encounter major performance issues after using this method. + It is not recommended to use this method to "reset" views for reuse in a different way with new constraints. Create a new view instead. + NOTE: This method preserves implicit constraints, such as intrinsic content size constraints, which you usually do not want to remove. + */ +- (void)autoRemoveConstraintsAffectingViewAndSubviews +{ + [self autoRemoveConstraintsAffectingViewAndSubviewsIncludingImplicitConstraints:NO]; +} + +/** + Recursively removes all constraints that affect the view and its subviews, optionally including implicit constraints. + WARNING: Apple's constraint solver is not optimized for large-scale constraint removal; you may encounter major performance issues after using this method. + It is not recommended to use this method to "reset" views for reuse in a different way with new constraints. Create a new view instead. + NOTE: Implicit constraints are auto-generated lower priority constraints (such as those that attempt to keep a view at + its intrinsic content size by hugging its content & resisting compression), and you usually do not want to remove these. + + @param shouldRemoveImplicitConstraints Whether implicit constraints should be removed or skipped. + */ +- (void)autoRemoveConstraintsAffectingViewAndSubviewsIncludingImplicitConstraints:(BOOL)shouldRemoveImplicitConstraints +{ + [self autoRemoveConstraintsAffectingViewIncludingImplicitConstraints:shouldRemoveImplicitConstraints]; + for (UIView *subview in self.subviews) { + [subview autoRemoveConstraintsAffectingViewAndSubviewsIncludingImplicitConstraints:shouldRemoveImplicitConstraints]; + } +} + + +#pragma mark Center in Superview + +/** + Centers the view in its superview. + + @return An array of constraints added. + */ +- (NSArray *)autoCenterInSuperview +{ + NSMutableArray *constraints = [NSMutableArray new]; + [constraints addObject:[self autoAlignAxisToSuperviewAxis:ALAxisHorizontal]]; + [constraints addObject:[self autoAlignAxisToSuperviewAxis:ALAxisVertical]]; + return constraints; +} + +/** + Aligns the view to the same axis of its superview. + + @param axis The axis of this view and of its superview to align. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoAlignAxisToSuperviewAxis:(ALAxis)axis +{ + self.translatesAutoresizingMaskIntoConstraints = NO; + UIView *superview = self.superview; + NSAssert(superview, @"View's superview must not be nil.\nView: %@", self); + NSLayoutAttribute attribute = [UIView al_attributeForAxis:axis]; + NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:attribute relatedBy:NSLayoutRelationEqual toItem:superview attribute:attribute multiplier:1.0f constant:0.0f]; + [constraint autoInstall]; + return constraint; +} + + +#pragma mark Pin Edges to Superview + +/** + Pins the given edge of the view to the same edge of the superview with an inset. + + @param edge The edge of this view and the superview to pin. + @param inset The amount to inset this view's edge from the superview's edge. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoPinEdgeToSuperviewEdge:(ALEdge)edge withInset:(CGFloat)inset +{ + return [self autoPinEdgeToSuperviewEdge:edge withInset:inset relation:NSLayoutRelationEqual]; +} + +/** + Pins the given edge of the view to the same edge of the superview with an inset as a maximum or minimum. + + @param edge The edge of this view and the superview to pin. + @param inset The amount to inset this view's edge from the superview's edge. + @param relation Whether the inset should be at least, at most, or exactly equal to the given value. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoPinEdgeToSuperviewEdge:(ALEdge)edge withInset:(CGFloat)inset relation:(NSLayoutRelation)relation +{ + self.translatesAutoresizingMaskIntoConstraints = NO; + UIView *superview = self.superview; + NSAssert(superview, @"View's superview must not be nil.\nView: %@", self); + if (edge == ALEdgeBottom || edge == ALEdgeRight || edge == ALEdgeTrailing) { + // The bottom, right, and trailing insets (and relations, if an inequality) are inverted to become offsets + inset = -inset; + if (relation == NSLayoutRelationLessThanOrEqual) { + relation = NSLayoutRelationGreaterThanOrEqual; + } else if (relation == NSLayoutRelationGreaterThanOrEqual) { + relation = NSLayoutRelationLessThanOrEqual; + } + } + return [self autoPinEdge:edge toEdge:edge ofView:superview withOffset:inset relation:relation]; +} + +/** + Pins the edges of the view to the edges of its superview with the given edge insets. + The insets.left corresponds to a leading edge constraint, and insets.right corresponds to a trailing edge constraint. + + @param insets The insets for this view's edges from the superview's edges. + @return An array of constraints added. + */ +- (NSArray *)autoPinEdgesToSuperviewEdgesWithInsets:(UIEdgeInsets)insets +{ + NSMutableArray *constraints = [NSMutableArray new]; + [constraints addObject:[self autoPinEdgeToSuperviewEdge:ALEdgeTop withInset:insets.top]]; + [constraints addObject:[self autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:insets.left]]; + [constraints addObject:[self autoPinEdgeToSuperviewEdge:ALEdgeBottom withInset:insets.bottom]]; + [constraints addObject:[self autoPinEdgeToSuperviewEdge:ALEdgeTrailing withInset:insets.right]]; + return constraints; +} + +/** + Pins 3 of the 4 edges of the view to the edges of its superview with the given edge insets, excluding one edge. + The insets.left corresponds to a leading edge constraint, and insets.right corresponds to a trailing edge constraint. + + @param insets The insets for this view's edges from the superview's edges. The inset corresponding to the excluded edge + will be ignored. + @param edge The edge of this view to exclude in pinning to the superview; this method will not apply any constraint to it. + @return An array of constraints added. + */ +- (NSArray *)autoPinEdgesToSuperviewEdgesWithInsets:(UIEdgeInsets)insets excludingEdge:(ALEdge)edge +{ + NSMutableArray *constraints = [NSMutableArray new]; + if (edge != ALEdgeTop) { + [constraints addObject:[self autoPinEdgeToSuperviewEdge:ALEdgeTop withInset:insets.top]]; + } + if (edge != ALEdgeLeading && edge != ALEdgeLeft) { + [constraints addObject:[self autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:insets.left]]; + } + if (edge != ALEdgeBottom) { + [constraints addObject:[self autoPinEdgeToSuperviewEdge:ALEdgeBottom withInset:insets.bottom]]; + } + if (edge != ALEdgeTrailing && edge != ALEdgeRight) { + [constraints addObject:[self autoPinEdgeToSuperviewEdge:ALEdgeTrailing withInset:insets.right]]; + } + return constraints; +} + + +#pragma mark Pin Edges + +/** + Pins an edge of the view to a given edge of another view. + + @param edge The edge of this view to pin. + @param toEdge The edge of the peer view to pin to. + @param peerView The peer view to pin to. Must be in the same view hierarchy as this view. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoPinEdge:(ALEdge)edge toEdge:(ALEdge)toEdge ofView:(UIView *)peerView +{ + return [self autoPinEdge:edge toEdge:toEdge ofView:peerView withOffset:0.0f]; +} + +/** + Pins an edge of the view to a given edge of another view with an offset. + + @param edge The edge of this view to pin. + @param toEdge The edge of the peer view to pin to. + @param peerView The peer view to pin to. Must be in the same view hierarchy as this view. + @param offset The offset between the edge of this view and the edge of the peer view. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoPinEdge:(ALEdge)edge toEdge:(ALEdge)toEdge ofView:(UIView *)peerView withOffset:(CGFloat)offset +{ + return [self autoPinEdge:edge toEdge:toEdge ofView:peerView withOffset:offset relation:NSLayoutRelationEqual]; +} + +/** + Pins an edge of the view to a given edge of another view with an offset as a maximum or minimum. + + @param edge The edge of this view to pin. + @param toEdge The edge of the peer view to pin to. + @param peerView The peer view to pin to. Must be in the same view hierarchy as this view. + @param offset The offset between the edge of this view and the edge of the peer view. + @param relation Whether the offset should be at least, at most, or exactly equal to the given value. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoPinEdge:(ALEdge)edge toEdge:(ALEdge)toEdge ofView:(UIView *)peerView withOffset:(CGFloat)offset relation:(NSLayoutRelation)relation +{ + self.translatesAutoresizingMaskIntoConstraints = NO; + NSLayoutAttribute attribute = [UIView al_attributeForEdge:edge]; + NSLayoutAttribute toAttribute = [UIView al_attributeForEdge:toEdge]; + NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:attribute relatedBy:relation toItem:peerView attribute:toAttribute multiplier:1.0f constant:offset]; + [constraint autoInstall]; + return constraint; +} + + +#pragma mark Align Axes + +/** + Aligns an axis of the view to the same axis of another view. + + @param axis The axis of this view and the peer view to align. + @param peerView The peer view to align to. Must be in the same view hierarchy as this view. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoAlignAxis:(ALAxis)axis toSameAxisOfView:(UIView *)peerView +{ + return [self autoAlignAxis:axis toSameAxisOfView:peerView withOffset:0.0f]; +} + +/** + Aligns an axis of the view to the same axis of another view with an offset. + + @param axis The axis of this view and the peer view to align. + @param peerView The peer view to align to. Must be in the same view hierarchy as this view. + @param offset The offset between the axis of this view and the axis of the peer view. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoAlignAxis:(ALAxis)axis toSameAxisOfView:(UIView *)peerView withOffset:(CGFloat)offset +{ + self.translatesAutoresizingMaskIntoConstraints = NO; + NSLayoutAttribute attribute = [UIView al_attributeForAxis:axis]; + NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:attribute relatedBy:NSLayoutRelationEqual toItem:peerView attribute:attribute multiplier:1.0f constant:offset]; + [constraint autoInstall]; + return constraint; +} + + +#pragma mark Match Dimensions + +/** + Matches a dimension of the view to a given dimension of another view. + + @param dimension The dimension of this view to pin. + @param toDimension The dimension of the peer view to pin to. + @param peerView The peer view to match to. Must be in the same view hierarchy as this view. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoMatchDimension:(ALDimension)dimension toDimension:(ALDimension)toDimension ofView:(UIView *)peerView +{ + return [self autoMatchDimension:dimension toDimension:toDimension ofView:peerView withOffset:0.0f]; +} + +/** + Matches a dimension of the view to a given dimension of another view with an offset. + + @param dimension The dimension of this view to pin. + @param toDimension The dimension of the peer view to pin to. + @param peerView The peer view to match to. Must be in the same view hierarchy as this view. + @param offset The offset between the dimension of this view and the dimension of the peer view. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoMatchDimension:(ALDimension)dimension toDimension:(ALDimension)toDimension ofView:(UIView *)peerView withOffset:(CGFloat)offset +{ + return [self autoMatchDimension:dimension toDimension:toDimension ofView:peerView withOffset:offset relation:NSLayoutRelationEqual]; +} + +/** + Matches a dimension of the view to a given dimension of another view with an offset as a maximum or minimum. + + @param dimension The dimension of this view to pin. + @param toDimension The dimension of the peer view to pin to. + @param peerView The peer view to match to. Must be in the same view hierarchy as this view. + @param offset The offset between the dimension of this view and the dimension of the peer view. + @param relation Whether the offset should be at least, at most, or exactly equal to the given value. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoMatchDimension:(ALDimension)dimension toDimension:(ALDimension)toDimension ofView:(UIView *)peerView withOffset:(CGFloat)offset relation:(NSLayoutRelation)relation +{ + self.translatesAutoresizingMaskIntoConstraints = NO; + NSLayoutAttribute attribute = [UIView al_attributeForDimension:dimension]; + NSLayoutAttribute toAttribute = [UIView al_attributeForDimension:toDimension]; + NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:attribute relatedBy:relation toItem:peerView attribute:toAttribute multiplier:1.0f constant:offset]; + [constraint autoInstall]; + return constraint; +} + +/** + Matches a dimension of the view to a multiple of a given dimension of another view. + + @param dimension The dimension of this view to pin. + @param toDimension The dimension of the peer view to pin to. + @param peerView The peer view to match to. Must be in the same view hierarchy as this view. + @param multiplier The multiple of the peer view's given dimension that this view's given dimension should be. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoMatchDimension:(ALDimension)dimension toDimension:(ALDimension)toDimension ofView:(UIView *)peerView withMultiplier:(CGFloat)multiplier +{ + return [self autoMatchDimension:dimension toDimension:toDimension ofView:peerView withMultiplier:multiplier relation:NSLayoutRelationEqual]; +} + +/** + Matches a dimension of the view to a multiple of a given dimension of another view as a maximum or minimum. + + @param dimension The dimension of this view to pin. + @param toDimension The dimension of the peer view to pin to. + @param peerView The peer view to match to. Must be in the same view hierarchy as this view. + @param multiplier The multiple of the peer view's given dimension that this view's given dimension should be. + @param relation Whether the multiple should be at least, at most, or exactly equal to the given value. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoMatchDimension:(ALDimension)dimension toDimension:(ALDimension)toDimension ofView:(UIView *)peerView withMultiplier:(CGFloat)multiplier relation:(NSLayoutRelation)relation +{ + self.translatesAutoresizingMaskIntoConstraints = NO; + NSLayoutAttribute attribute = [UIView al_attributeForDimension:dimension]; + NSLayoutAttribute toAttribute = [UIView al_attributeForDimension:toDimension]; + NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:attribute relatedBy:relation toItem:peerView attribute:toAttribute multiplier:multiplier constant:0.0f]; + [constraint autoInstall]; + return constraint; +} + + +#pragma mark Set Dimensions + +/** + Sets the view to a specific size. + + @param size The size to set this view's dimensions to. + @return An array of constraints added. + */ +- (NSArray *)autoSetDimensionsToSize:(CGSize)size +{ + NSMutableArray *constraints = [NSMutableArray new]; + [constraints addObject:[self autoSetDimension:ALDimensionWidth toSize:size.width]]; + [constraints addObject:[self autoSetDimension:ALDimensionHeight toSize:size.height]]; + return constraints; +} + +/** + Sets the given dimension of the view to a specific size. + + @param dimension The dimension of this view to set. + @param size The size to set the given dimension to. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoSetDimension:(ALDimension)dimension toSize:(CGFloat)size +{ + return [self autoSetDimension:dimension toSize:size relation:NSLayoutRelationEqual]; +} + +/** + Sets the given dimension of the view to a specific size as a maximum or minimum. + + @param dimension The dimension of this view to set. + @param size The size to set the given dimension to. + @param relation Whether the size should be at least, at most, or exactly equal to the given value. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoSetDimension:(ALDimension)dimension toSize:(CGFloat)size relation:(NSLayoutRelation)relation +{ + self.translatesAutoresizingMaskIntoConstraints = NO; + NSLayoutAttribute attribute = [UIView al_attributeForDimension:dimension]; + NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:attribute relatedBy:relation toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0f constant:size]; + [constraint autoInstall]; + return constraint; +} + + +#pragma mark Set Content Compression Resistance & Hugging + +/** + Sets the priority of content compression resistance for an axis. + NOTE: This method must only be called from within the block passed into the method +[UIView autoSetPriority:forConstraints:] + + @param axis The axis to set the content compression resistance priority for. + */ +- (void)autoSetContentCompressionResistancePriorityForAxis:(ALAxis)axis +{ + NSAssert(_al_isExecutingConstraintsBlock, @"%@ should only be called from within the block passed into the method +[UIView autoSetPriority:forConstraints:]", NSStringFromSelector(_cmd)); + if (_al_isExecutingConstraintsBlock) { + self.translatesAutoresizingMaskIntoConstraints = NO; + UILayoutConstraintAxis constraintAxis = [UIView al_constraintAxisForAxis:axis]; + [self setContentCompressionResistancePriority:_al_globalConstraintPriority forAxis:constraintAxis]; + } +} + +/** + Sets the priority of content hugging for an axis. + NOTE: This method must only be called from within the block passed into the method +[UIView autoSetPriority:forConstraints:] + + @param axis The axis to set the content hugging priority for. + */ +- (void)autoSetContentHuggingPriorityForAxis:(ALAxis)axis +{ + NSAssert(_al_isExecutingConstraintsBlock, @"%@ should only be called from within the block passed into the method +[UIView autoSetPriority:forConstraints:]", NSStringFromSelector(_cmd)); + if (_al_isExecutingConstraintsBlock) { + self.translatesAutoresizingMaskIntoConstraints = NO; + UILayoutConstraintAxis constraintAxis = [UIView al_constraintAxisForAxis:axis]; + [self setContentHuggingPriority:_al_globalConstraintPriority forAxis:constraintAxis]; + } +} + + +#pragma mark Constrain Any Attributes + +/** + Constrains an attribute (any ALEdge, ALAxis, or ALDimension) of the view to a given attribute of another view. + This method can be used to constrain different types of attributes across two views. + + @param ALAttribute Any ALEdge, ALAxis, or ALDimension of this view to constrain. + @param toALAttribute Any ALEdge, ALAxis, or ALDimension of the peer view to constrain to. + @param peerView The peer view to constrain to. Must be in the same view hierarchy as this view. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoConstrainAttribute:(NSInteger)ALAttribute toAttribute:(NSInteger)toALAttribute ofView:(UIView *)peerView +{ + return [self autoConstrainAttribute:ALAttribute toAttribute:toALAttribute ofView:peerView withOffset:0.0f]; +} + +/** + Constrains an attribute (any ALEdge, ALAxis, or ALDimension) of the view to a given attribute of another view with an offset. + This method can be used to constrain different types of attributes across two views. + + @param ALAttribute Any ALEdge, ALAxis, or ALDimension of this view to constrain. + @param toALAttribute Any ALEdge, ALAxis, or ALDimension of the peer view to constrain to. + @param peerView The peer view to constrain to. Must be in the same view hierarchy as this view. + @param offset The offset between the attribute of this view and the attribute of the peer view. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoConstrainAttribute:(NSInteger)ALAttribute toAttribute:(NSInteger)toALAttribute ofView:(UIView *)peerView withOffset:(CGFloat)offset +{ + return [self autoConstrainAttribute:ALAttribute toAttribute:toALAttribute ofView:peerView withOffset:offset relation:NSLayoutRelationEqual]; +} + +/** + Constrains an attribute (any ALEdge, ALAxis, or ALDimension) of the view to a given attribute of another view with an offset as a maximum or minimum. + This method can be used to constrain different types of attributes across two views. + + @param ALAttribute Any ALEdge, ALAxis, or ALDimension of this view to constrain. + @param toALAttribute Any ALEdge, ALAxis, or ALDimension of the peer view to constrain to. + @param peerView The peer view to constrain to. Must be in the same view hierarchy as this view. + @param offset The offset between the attribute of this view and the attribute of the peer view. + @param relation Whether the offset should be at least, at most, or exactly equal to the given value. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoConstrainAttribute:(NSInteger)ALAttribute toAttribute:(NSInteger)toALAttribute ofView:(UIView *)peerView withOffset:(CGFloat)offset relation:(NSLayoutRelation)relation +{ + self.translatesAutoresizingMaskIntoConstraints = NO; + NSLayoutAttribute attribute = [UIView al_attributeForALAttribute:ALAttribute]; + NSLayoutAttribute toAttribute = [UIView al_attributeForALAttribute:toALAttribute]; + NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:attribute relatedBy:relation toItem:peerView attribute:toAttribute multiplier:1.0f constant:offset]; + [constraint autoInstall]; + return constraint; +} + +/** + Constrains an attribute (any ALEdge, ALAxis, or ALDimension) of the view to a given attribute of another view with a multiplier. + This method can be used to constrain different types of attributes across two views. + + @param ALAttribute Any ALEdge, ALAxis, or ALDimension of this view to constrain. + @param toALAttribute Any ALEdge, ALAxis, or ALDimension of the peer view to constrain to. + @param peerView The peer view to constrain to. Must be in the same view hierarchy as this view. + @param multiplier The multiplier between the attribute of this view and the attribute of the peer view. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoConstrainAttribute:(NSInteger)ALAttribute toAttribute:(NSInteger)toALAttribute ofView:(UIView *)peerView withMultiplier:(CGFloat)multiplier +{ + return [self autoConstrainAttribute:ALAttribute toAttribute:toALAttribute ofView:peerView withMultiplier:multiplier relation:NSLayoutRelationEqual]; +} + +/** + Constrains an attribute (any ALEdge, ALAxis, or ALDimension) of the view to a given attribute of another view with a multiplier as a maximum or minimum. + This method can be used to constrain different types of attributes across two views. + + @param ALAttribute Any ALEdge, ALAxis, or ALDimension of this view to constrain. + @param toALAttribute Any ALEdge, ALAxis, or ALDimension of the peer view to constrain to. + @param peerView The peer view to constrain to. Must be in the same view hierarchy as this view. + @param multiplier The multiplier between the attribute of this view and the attribute of the peer view. + @param relation Whether the multiplier should be at least, at most, or exactly equal to the given value. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoConstrainAttribute:(NSInteger)ALAttribute toAttribute:(NSInteger)toALAttribute ofView:(UIView *)peerView withMultiplier:(CGFloat)multiplier relation:(NSLayoutRelation)relation +{ + self.translatesAutoresizingMaskIntoConstraints = NO; + NSLayoutAttribute attribute = [UIView al_attributeForALAttribute:ALAttribute]; + NSLayoutAttribute toAttribute = [UIView al_attributeForALAttribute:toALAttribute]; + NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:attribute relatedBy:relation toItem:peerView attribute:toAttribute multiplier:multiplier constant:0.0f]; + [constraint autoInstall]; + return constraint; +} + + +#pragma mark Pin to Layout Guides + +/** + Pins the top edge of the view to the top layout guide of the given view controller with an inset. + For compatibility with iOS 6 (where layout guides do not exist), this method will simply pin the top edge of + the view to the top edge of the given view controller's view with an inset. + + @param viewController The view controller whose topLayoutGuide should be used to pin to. + @param inset The amount to inset this view's top edge from the layout guide. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoPinToTopLayoutGuideOfViewController:(UIViewController *)viewController withInset:(CGFloat)inset +{ + if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) { + return [self autoPinEdge:ALEdgeTop toEdge:ALEdgeTop ofView:viewController.view withOffset:inset]; + } else { + self.translatesAutoresizingMaskIntoConstraints = NO; + NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:viewController.topLayoutGuide attribute:NSLayoutAttributeBottom multiplier:1.0f constant:inset]; + [viewController.view al_addConstraintUsingGlobalPriority:constraint]; + return constraint; + } +} + +/** + Pins the bottom edge of the view to the bottom layout guide of the given view controller with an inset. + For compatibility with iOS 6 (where layout guides do not exist), this method will simply pin the bottom edge of + the view to the bottom edge of the given view controller's view with an inset. + + @param viewController The view controller whose bottomLayoutGuide should be used to pin to. + @param inset The amount to inset this view's bottom edge from the layout guide. + @return The constraint added. + */ +- (NSLayoutConstraint *)autoPinToBottomLayoutGuideOfViewController:(UIViewController *)viewController withInset:(CGFloat)inset +{ + if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) { + return [self autoPinEdge:ALEdgeBottom toEdge:ALEdgeBottom ofView:viewController.view withOffset:-inset]; + } else { + self.translatesAutoresizingMaskIntoConstraints = NO; + NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:viewController.bottomLayoutGuide attribute:NSLayoutAttributeTop multiplier:1.0f constant:-inset]; + [viewController.view al_addConstraintUsingGlobalPriority:constraint]; + return constraint; + } +} + + +#pragma mark Internal Helper Methods + +/** + Adds the given constraint to this view after setting the constraint's priority to the global constraint priority. + + This method is the only one that calls the SDK addConstraint: method directly; all other instances in this category + should use this method to add constraints so that the global priority is correctly set on constraints. + + @param constraint The constraint to set the global priority on and then add to this view. + */ +- (void)al_addConstraintUsingGlobalPriority:(NSLayoutConstraint *)constraint +{ + constraint.priority = _al_globalConstraintPriority; + [self addConstraint:constraint]; +} + +/** + Returns the corresponding NSLayoutAttribute for the given ALEdge. + + @return The layout attribute for the given edge. + */ ++ (NSLayoutAttribute)al_attributeForEdge:(ALEdge)edge +{ + NSLayoutAttribute attribute = NSLayoutAttributeNotAnAttribute; + switch (edge) { + case ALEdgeLeft: + attribute = NSLayoutAttributeLeft; + break; + case ALEdgeRight: + attribute = NSLayoutAttributeRight; + break; + case ALEdgeTop: + attribute = NSLayoutAttributeTop; + break; + case ALEdgeBottom: + attribute = NSLayoutAttributeBottom; + break; + case ALEdgeLeading: + attribute = NSLayoutAttributeLeading; + break; + case ALEdgeTrailing: + attribute = NSLayoutAttributeTrailing; + break; + default: + NSAssert(nil, @"Not a valid ALEdge."); + break; + } + return attribute; +} + +/** + Returns the corresponding NSLayoutAttribute for the given ALAxis. + + @return The layout attribute for the given axis. + */ ++ (NSLayoutAttribute)al_attributeForAxis:(ALAxis)axis +{ + NSLayoutAttribute attribute = NSLayoutAttributeNotAnAttribute; + switch (axis) { + case ALAxisVertical: + attribute = NSLayoutAttributeCenterX; + break; + case ALAxisHorizontal: + attribute = NSLayoutAttributeCenterY; + break; + case ALAxisBaseline: + attribute = NSLayoutAttributeBaseline; + break; + default: + NSAssert(nil, @"Not a valid ALAxis."); + break; + } + return attribute; +} + +/** + Returns the corresponding NSLayoutAttribute for the given ALDimension. + + @return The layout attribute for the given dimension. + */ ++ (NSLayoutAttribute)al_attributeForDimension:(ALDimension)dimension +{ + NSLayoutAttribute attribute = NSLayoutAttributeNotAnAttribute; + switch (dimension) { + case ALDimensionWidth: + attribute = NSLayoutAttributeWidth; + break; + case ALDimensionHeight: + attribute = NSLayoutAttributeHeight; + break; + default: + NSAssert(nil, @"Not a valid ALDimension."); + break; + } + return attribute; +} + +/** + Returns the corresponding NSLayoutAttribute for the given ALAttribute. + + @return The layout attribute for the given ALAttribute. + */ ++ (NSLayoutAttribute)al_attributeForALAttribute:(NSInteger)ALAttribute +{ + NSLayoutAttribute attribute = NSLayoutAttributeNotAnAttribute; + switch (ALAttribute) { + case ALEdgeLeft: + attribute = NSLayoutAttributeLeft; + break; + case ALEdgeRight: + attribute = NSLayoutAttributeRight; + break; + case ALEdgeTop: + attribute = NSLayoutAttributeTop; + break; + case ALEdgeBottom: + attribute = NSLayoutAttributeBottom; + break; + case ALEdgeLeading: + attribute = NSLayoutAttributeLeading; + break; + case ALEdgeTrailing: + attribute = NSLayoutAttributeTrailing; + break; + case ALDimensionWidth: + attribute = NSLayoutAttributeWidth; + break; + case ALDimensionHeight: + attribute = NSLayoutAttributeHeight; + break; + case ALAxisVertical: + attribute = NSLayoutAttributeCenterX; + break; + case ALAxisHorizontal: + attribute = NSLayoutAttributeCenterY; + break; + case ALAxisBaseline: + attribute = NSLayoutAttributeBaseline; + break; + default: + NSAssert(nil, @"Not a valid ALAttribute."); + break; + } + return attribute; +} + +/** + Returns the corresponding UILayoutConstraintAxis for the given ALAxis. + + @return The constraint axis for the given axis. + */ ++ (UILayoutConstraintAxis)al_constraintAxisForAxis:(ALAxis)axis +{ + UILayoutConstraintAxis constraintAxis; + switch (axis) { + case ALAxisVertical: + constraintAxis = UILayoutConstraintAxisVertical; + break; + case ALAxisHorizontal: + case ALAxisBaseline: + constraintAxis = UILayoutConstraintAxisHorizontal; + break; + default: + NSAssert(nil, @"Not a valid ALAxis."); + break; + } + return constraintAxis; +} + +/** + Returns the common superview for this view and the given peer view. + Raises an exception if this view and the peer view do not share a common superview. + + @return The common superview for the two views. + */ +- (UIView *)al_commonSuperviewWithView:(UIView *)peerView +{ + UIView *commonSuperview = nil; + UIView *startView = self; + do { + if ([peerView isDescendantOfView:startView]) { + commonSuperview = startView; + } + startView = startView.superview; + } while (startView && !commonSuperview); + NSAssert(commonSuperview, @"Can't constrain two views that do not share a common superview. Make sure that both views have been added into the same view hierarchy."); + return commonSuperview; +} + +/** + Aligns this view to a peer view with an alignment option. + + @param peerView The peer view to align to. + @param alignment The alignment option to apply to the two views. + @param axis The axis along which the views are distributed, used to validate the alignment option. + @return The constraint added. + */ +- (NSLayoutConstraint *)al_alignToView:(UIView *)peerView withOption:(NSLayoutFormatOptions)alignment forAxis:(ALAxis)axis +{ + NSLayoutConstraint *constraint = nil; + switch (alignment) { + case NSLayoutFormatAlignAllCenterX: + NSAssert(axis == ALAxisVertical, @"Cannot align views that are distributed horizontally with NSLayoutFormatAlignAllCenterX."); + constraint = [self autoAlignAxis:ALAxisVertical toSameAxisOfView:peerView]; + break; + case NSLayoutFormatAlignAllCenterY: + NSAssert(axis != ALAxisVertical, @"Cannot align views that are distributed vertically with NSLayoutFormatAlignAllCenterY."); + constraint = [self autoAlignAxis:ALAxisHorizontal toSameAxisOfView:peerView]; + break; + case NSLayoutFormatAlignAllBaseline: + NSAssert(axis != ALAxisVertical, @"Cannot align views that are distributed vertically with NSLayoutFormatAlignAllBaseline."); + constraint = [self autoAlignAxis:ALAxisBaseline toSameAxisOfView:peerView]; + break; + case NSLayoutFormatAlignAllTop: + NSAssert(axis != ALAxisVertical, @"Cannot align views that are distributed vertically with NSLayoutFormatAlignAllTop."); + constraint = [self autoPinEdge:ALEdgeTop toEdge:ALEdgeTop ofView:peerView]; + break; + case NSLayoutFormatAlignAllLeft: + NSAssert(axis == ALAxisVertical, @"Cannot align views that are distributed horizontally with NSLayoutFormatAlignAllLeft."); + constraint = [self autoPinEdge:ALEdgeLeft toEdge:ALEdgeLeft ofView:peerView]; + break; + case NSLayoutFormatAlignAllBottom: + NSAssert(axis != ALAxisVertical, @"Cannot align views that are distributed vertically with NSLayoutFormatAlignAllBottom."); + constraint = [self autoPinEdge:ALEdgeBottom toEdge:ALEdgeBottom ofView:peerView]; + break; + case NSLayoutFormatAlignAllRight: + NSAssert(axis == ALAxisVertical, @"Cannot align views that are distributed horizontally with NSLayoutFormatAlignAllRight."); + constraint = [self autoPinEdge:ALEdgeRight toEdge:ALEdgeRight ofView:peerView]; + break; + case NSLayoutFormatAlignAllLeading: + NSAssert(axis == ALAxisVertical, @"Cannot align views that are distributed horizontally with NSLayoutFormatAlignAllLeading."); + constraint = [self autoPinEdge:ALEdgeLeading toEdge:ALEdgeLeading ofView:peerView]; + break; + case NSLayoutFormatAlignAllTrailing: + NSAssert(axis == ALAxisVertical, @"Cannot align views that are distributed horizontally with NSLayoutFormatAlignAllTrailing."); + constraint = [self autoPinEdge:ALEdgeTrailing toEdge:ALEdgeTrailing ofView:peerView]; + break; + default: + NSAssert(nil, @"Unsupported alignment option."); + break; + } + return constraint; +} + +@end + + +#pragma mark - NSArray+AutoLayout + +@implementation NSArray (AutoLayout) + + +#pragma mark Constrain Multiple Views + +/** + Aligns views in this array to one another along a given edge. + Note: This array must contain at least 2 views, and all views must share a common superview. + + @param edge The edge to which the subviews will be aligned. + @return An array of constraints added. + */ +- (NSArray *)autoAlignViewsToEdge:(ALEdge)edge +{ + NSAssert([self al_containsMinimumNumberOfViews:2], @"This array must contain at least 2 views."); + NSMutableArray *constraints = [NSMutableArray new]; + UIView *previousView = nil; + for (id object in self) { + if ([object isKindOfClass:[UIView class]]) { + UIView *view = (UIView *)object; + view.translatesAutoresizingMaskIntoConstraints = NO; + if (previousView) { + [constraints addObject:[view autoPinEdge:edge toEdge:edge ofView:previousView]]; + } + previousView = view; + } + } + return constraints; +} + +/** + Aligns views in this array to one another along a given axis. + Note: This array must contain at least 2 views, and all views must share a common superview. + + @param axis The axis to which to subviews will be aligned. + @return An array of constraints added. + */ +- (NSArray *)autoAlignViewsToAxis:(ALAxis)axis +{ + NSAssert([self al_containsMinimumNumberOfViews:2], @"This array must contain at least 2 views."); + NSMutableArray *constraints = [NSMutableArray new]; + UIView *previousView = nil; + for (id object in self) { + if ([object isKindOfClass:[UIView class]]) { + UIView *view = (UIView *)object; + view.translatesAutoresizingMaskIntoConstraints = NO; + if (previousView) { + [constraints addObject:[view autoAlignAxis:axis toSameAxisOfView:previousView]]; + } + previousView = view; + } + } + return constraints; +} + +/** + Matches a given dimension of all the views in this array. + Note: This array must contain at least 2 views, and all views must share a common superview. + + @param dimension The dimension to match for all of the subviews. + @return An array of constraints added. + */ +- (NSArray *)autoMatchViewsDimension:(ALDimension)dimension +{ + NSAssert([self al_containsMinimumNumberOfViews:2], @"This array must contain at least 2 views."); + NSMutableArray *constraints = [NSMutableArray new]; + UIView *previousView = nil; + for (id object in self) { + if ([object isKindOfClass:[UIView class]]) { + UIView *view = (UIView *)object; + view.translatesAutoresizingMaskIntoConstraints = NO; + if (previousView) { + [constraints addObject:[view autoMatchDimension:dimension toDimension:dimension ofView:previousView]]; + } + previousView = view; + } + } + return constraints; +} + +/** + Sets the given dimension of all the views in this array to a given size. + Note: This array must contain at least 1 view. + + @param dimension The dimension of each of the subviews to set. + @param size The size to set the given dimension of each subview to. + @return An array of constraints added. + */ +- (NSArray *)autoSetViewsDimension:(ALDimension)dimension toSize:(CGFloat)size +{ + NSAssert([self al_containsMinimumNumberOfViews:1], @"This array must contain at least 1 view."); + NSMutableArray *constraints = [NSMutableArray new]; + for (id object in self) { + if ([object isKindOfClass:[UIView class]]) { + UIView *view = (UIView *)object; + view.translatesAutoresizingMaskIntoConstraints = NO; + [constraints addObject:[view autoSetDimension:dimension toSize:size]]; + } + } + return constraints; +} + + +#pragma mark Distribute Multiple Views + +/** + Distributes the views in this array equally along the selected axis in their superview. + Views will be the same size (variable) in the dimension along the axis and will have spacing (fixed) between them, + including from the first and last views to their superview. + + @param axis The axis along which to distribute the subviews. + @param spacing The fixed amount of spacing between each subview, before the first subview and after the last subview. + @param alignment The way in which the subviews will be aligned. + @return An array of constraints added. + */ +- (NSArray *)autoDistributeViewsAlongAxis:(ALAxis)axis withFixedSpacing:(CGFloat)spacing alignment:(NSLayoutFormatOptions)alignment +{ + return [self autoDistributeViewsAlongAxis:axis withFixedSpacing:spacing insetSpacing:YES alignment:alignment]; +} + +/** + Distributes the views in this array equally along the selected axis in their superview. + Views will be the same size (variable) in the dimension along the axis and will have spacing (fixed) between them. + The first and last views can optionally be inset from their superview by the same amount of spacing as between views. + + @param axis The axis along which to distribute the subviews. + @param spacing The fixed amount of spacing between each subview. + @param shouldSpaceInsets Whether the first and last views should be equally inset from their superview. + @param alignment The way in which the subviews will be aligned. + @return An array of constraints added. + */ +- (NSArray *)autoDistributeViewsAlongAxis:(ALAxis)axis withFixedSpacing:(CGFloat)spacing insetSpacing:(BOOL)shouldSpaceInsets alignment:(NSLayoutFormatOptions)alignment +{ + NSAssert([self al_containsMinimumNumberOfViews:2], @"This array must contain at least 2 views to distribute."); + ALDimension matchedDimension; + ALEdge firstEdge, lastEdge; + switch (axis) { + case ALAxisHorizontal: + case ALAxisBaseline: + matchedDimension = ALDimensionWidth; + firstEdge = ALEdgeLeading; + lastEdge = ALEdgeTrailing; + break; + case ALAxisVertical: + matchedDimension = ALDimensionHeight; + firstEdge = ALEdgeTop; + lastEdge = ALEdgeBottom; + break; + default: + NSAssert(nil, @"Not a valid ALAxis."); + return nil; + } + CGFloat leadingSpacing = shouldSpaceInsets ? spacing : 0.0; + CGFloat trailingSpacing = shouldSpaceInsets ? spacing : 0.0; + + NSMutableArray *constraints = [NSMutableArray new]; + UIView *previousView = nil; + for (id object in self) { + if ([object isKindOfClass:[UIView class]]) { + UIView *view = (UIView *)object; + view.translatesAutoresizingMaskIntoConstraints = NO; + if (previousView) { + // Second, Third, ... View + [constraints addObject:[view autoPinEdge:firstEdge toEdge:lastEdge ofView:previousView withOffset:spacing]]; + [constraints addObject:[view autoMatchDimension:matchedDimension toDimension:matchedDimension ofView:previousView]]; + [constraints addObject:[view al_alignToView:previousView withOption:alignment forAxis:axis]]; + } + else { + // First view + [constraints addObject:[view autoPinEdgeToSuperviewEdge:firstEdge withInset:leadingSpacing]]; + } + previousView = view; + } + } + if (previousView) { + // Last View + [constraints addObject:[previousView autoPinEdgeToSuperviewEdge:lastEdge withInset:trailingSpacing]]; + } + return constraints; +} + +/** + Distributes the views in this array equally along the selected axis in their superview. + Views will be the same size (fixed) in the dimension along the axis and will have spacing (variable) between them, + including from the first and last views to their superview. + + @param axis The axis along which to distribute the subviews. + @param size The fixed size of each subview in the dimension along the given axis. + @param alignment The way in which the subviews will be aligned. + @return An array of constraints added. + */ +- (NSArray *)autoDistributeViewsAlongAxis:(ALAxis)axis withFixedSize:(CGFloat)size alignment:(NSLayoutFormatOptions)alignment +{ + return [self autoDistributeViewsAlongAxis:axis withFixedSize:size insetSpacing:YES alignment:alignment]; +} + +/** + Distributes the views in this array equally along the selected axis in their superview. + Views will be the same size (fixed) in the dimension along the axis and will have spacing (variable) between them. + The first and last views can optionally be inset from their superview by the same amount of spacing as between views. + + @param axis The axis along which to distribute the subviews. + @param size The fixed size of each subview in the dimension along the given axis. + @param shouldSpaceInsets Whether the first and last views should be equally inset from their superview. + @param alignment The way in which the subviews will be aligned. + @return An array of constraints added. + */ +- (NSArray *)autoDistributeViewsAlongAxis:(ALAxis)axis withFixedSize:(CGFloat)size insetSpacing:(BOOL)shouldSpaceInsets alignment:(NSLayoutFormatOptions)alignment +{ + NSAssert([self al_containsMinimumNumberOfViews:2], @"This array must contain at least 2 views to distribute."); + ALDimension fixedDimension; + NSLayoutAttribute attribute; + switch (axis) { + case ALAxisHorizontal: + case ALAxisBaseline: + fixedDimension = ALDimensionWidth; + attribute = NSLayoutAttributeCenterX; + break; + case ALAxisVertical: + fixedDimension = ALDimensionHeight; + attribute = NSLayoutAttributeCenterY; + break; + default: + NSAssert(nil, @"Not a valid ALAxis."); + return nil; + } + BOOL isRightToLeftLanguage = [NSLocale characterDirectionForLanguage:[[NSBundle mainBundle] preferredLocalizations][0]] == NSLocaleLanguageDirectionRightToLeft; + BOOL shouldFlipOrder = isRightToLeftLanguage && (axis != ALAxisVertical); // imitate the effect of leading/trailing when distributing horizontally + + NSMutableArray *constraints = [NSMutableArray new]; + NSArray *views = [self al_copyViewsOnly]; + NSUInteger numberOfViews = [views count]; + UIView *commonSuperview = [views al_commonSuperviewOfViews]; + UIView *previousView = nil; + for (NSUInteger i = 0; i < numberOfViews; i++) { + UIView *view = shouldFlipOrder ? views[numberOfViews - i - 1] : views[i]; + view.translatesAutoresizingMaskIntoConstraints = NO; + [constraints addObject:[view autoSetDimension:fixedDimension toSize:size]]; + CGFloat multiplier, constant; + if (shouldSpaceInsets) { + multiplier = (i * 2.0f + 2.0f) / (numberOfViews + 1.0f); + constant = (multiplier - 1.0f) * size / 2.0f; + } else { + multiplier = (i * 2.0f) / (numberOfViews - 1.0f); + constant = (-multiplier + 1.0f) * size / 2.0f; + } + NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:view attribute:attribute relatedBy:NSLayoutRelationEqual toItem:commonSuperview attribute:attribute multiplier:multiplier constant:constant]; + [commonSuperview al_addConstraintUsingGlobalPriority:constraint]; + [constraints addObject:constraint]; + if (previousView) { + [constraints addObject:[view al_alignToView:previousView withOption:alignment forAxis:axis]]; + } + previousView = view; + } + return constraints; +} + +#pragma mark Internal Helper Methods + +/** + Returns the common superview for the views in this array. + Raises an exception if the views in this array do not share a common superview. + + @return The common superview for the views in this array. + */ +- (UIView *)al_commonSuperviewOfViews +{ + UIView *commonSuperview = nil; + UIView *previousView = nil; + for (id object in self) { + if ([object isKindOfClass:[UIView class]]) { + UIView *view = (UIView *)object; + if (previousView) { + commonSuperview = [view al_commonSuperviewWithView:commonSuperview]; + } else { + commonSuperview = view; + } + previousView = view; + } + } + NSAssert(commonSuperview, @"Can't constrain views that do not share a common superview. Make sure that all the views in this array have been added into the same view hierarchy."); + return commonSuperview; +} + +/** + Determines whether this array contains a minimum number of views. + + @param minimumNumberOfViews The minimum number of views to check for. + @return YES if this array contains at least the minimum number of views, NO otherwise. + */ +- (BOOL)al_containsMinimumNumberOfViews:(NSUInteger)minimumNumberOfViews +{ + NSUInteger numberOfViews = 0; + for (id object in self) { + if ([object isKindOfClass:[UIView class]]) { + numberOfViews++; + if (numberOfViews >= minimumNumberOfViews) { + return YES; + } + } + } + return numberOfViews >= minimumNumberOfViews; +} + +/** + Creates a copy of this array containing only the view objects in it. + + @return A new array containing only the views that are in this array. + */ +- (NSArray *)al_copyViewsOnly +{ + NSMutableArray *viewsOnlyArray = [NSMutableArray arrayWithCapacity:[self count]]; + for (id object in self) { + if ([object isKindOfClass:[UIView class]]) { + [viewsOnlyArray addObject:object]; + } + } + return viewsOnlyArray; +} + +@end + + +#pragma mark - NSLayoutConstraint+AutoLayout + +@implementation NSLayoutConstraint (AutoLayout) + +/** + Adds the constraint to the appropriate view. + */ +- (void)autoInstall +{ + NSAssert(self.firstItem || self.secondItem, @"Can't install a constraint with nil firstItem and secondItem."); + if (self.firstItem) { + if (self.secondItem) { + NSAssert([self.firstItem isKindOfClass:[UIView class]] && [self.secondItem isKindOfClass:[UIView class]], @"Can only automatically install a constraint if both items are views."); + UIView *commonSuperview = [self.firstItem al_commonSuperviewWithView:self.secondItem]; + [commonSuperview al_addConstraintUsingGlobalPriority:self]; + } else { + NSAssert([self.firstItem isKindOfClass:[UIView class]], @"Can only automatically install a constraint if the item is a view."); + [self.firstItem al_addConstraintUsingGlobalPriority:self]; + } + } else { + NSAssert([self.secondItem isKindOfClass:[UIView class]], @"Can only automatically install a constraint if the item is a view."); + [self.secondItem al_addConstraintUsingGlobalPriority:self]; + } +} + +/** + Removes the constraint from the view it has been added to. + */ +- (void)autoRemove +{ + [UIView autoRemoveConstraint:self]; +} + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/Call.h b/star_lock/ios/Runner/XSTalkManager/NextPage/Call.h new file mode 100755 index 00000000..ac30255b --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/Call.h @@ -0,0 +1,20 @@ +// +// FirstViewController.h +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import +#import "BaseViewController.h" + +@interface Call : BaseViewController +@property(nonatomic) NSString *CallTag; +- (void)RefImg:(NSData *)data; +- (void)setTime:(long)time0; +- (void)UIClose; +- (void)AnswerSucc; +- (void)OpenDoorGo:(NSString *)pwd; +@end + diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/Call.m b/star_lock/ios/Runner/XSTalkManager/NextPage/Call.m new file mode 100755 index 00000000..8be18c48 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/Call.m @@ -0,0 +1,378 @@ +// +// FirstViewController.m +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import "Call.h" +#import "UI.h" +#import "Pub.h" +#import "Opendoor.h" +#import "Sformat.h" +#import "Msg.h" +#import "AppDelegate.h" + +@interface Call () +@property (nonatomic, strong)UIView *rview,*spkView,*cutView,*hangupView,*openView; +@property (nonatomic, strong)UIImageView *playerImage,*spkImage,*cutImage,*hangupImage,*answerImage,*openImage; +@property (nonatomic, strong)UIScrollView *scrollView; +@property (nonatomic, strong)UIButton *answerView; +@property (nonatomic, strong)UILabel *statuLabel; +@property (nonatomic, strong)UIAlertController *openAlert; +@property (nonatomic, strong)NSTimer *timer; +@end + +@implementation Call + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. + [self.navigationController.navigationBar setHidden:YES]; + [self setupViews]; + [self setUI]; +} +- (void)setupViews +{ + + self.edgesForExtendedLayout = UIRectEdgeNone; + self.extendedLayoutIncludesOpaqueBars = NO; + self.modalPresentationCapturesStatusBarAppearance = NO; + self.automaticallyAdjustsScrollViewInsets = NO; + [self.view addSubview:self.rview]; + [self.rview addSubview:self.scrollView]; + [self.scrollView addSubview:self.playerImage]; + [self.rview addSubview:self.statuLabel]; + + + if([_CallTag isEqualToString:@"BECALL"]){ + [_statuLabel setText:[[NSString alloc] initWithFormat:@"%@呼叫",@"小小茜子的搬砖"]]; + +// [_statuLabel setText:[[NSString alloc] initWithFormat:@"%@呼叫",[Opendoor EquNameById:[[Pub getApp].talk getRemoteEqu]]]]; + + [self.rview addSubview:self.spkView]; + [self.spkView addSubview:self.spkImage]; + [self.rview addSubview:self.cutView]; + [self.cutView addSubview:self.cutImage]; + [self.rview addSubview:self.hangupView]; + [self.hangupView addSubview:self.hangupImage]; + [self.rview addSubview:self.answerView]; + [self.answerView addSubview:self.answerImage]; + [self.rview addSubview:self.openView]; + [self.openView addSubview:self.openImage]; + + + [self.cutView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(SaveImg)]]; + [self.hangupView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Hangup)]]; + [self.answerView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Answer)]]; + [self.openView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Open)]]; + } + else if([_CallTag isEqualToString:@"WATCH"]){ + [_statuLabel setText:[[NSString alloc] initWithFormat:@"监视%@",[Opendoor EquNameById:[[Pub getApp].talk getRemoteEqu]]]]; + + [self.rview addSubview:self.cutView]; + [self.cutView addSubview:self.cutImage]; + [self.rview addSubview:self.hangupView]; + [self.hangupView addSubview:self.hangupImage]; + [self.rview addSubview:self.openView]; + [self.openView addSubview:self.openImage]; + + + [self.cutView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(SaveImg)]]; + [self.hangupView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Hangup)]]; + [self.openView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Open)]]; + } + +} +- (void)setUI{ + [UI SetRView:self.rview Top:@"0" Right:@"0" Bottom:@"0" Left:@"0"]; + + CGFloat imgwidth = [UI getScreenHeight]*640/480; + self.scrollView.contentSize=CGSizeMake(imgwidth, [UI getScreenHeight]); + self.playerImage.frame = CGRectMake(0,0,imgwidth, [UI getScreenHeight]); + [self.scrollView setContentOffset:CGPointMake((imgwidth-[UI getScreenWidth])/2, 0)]; + [UI setFrameInView:self.statuLabel Width:@"100vw" Height:@"20" TranslateX:@"0" TranslateY:@"5vh" InView:nil Position:UITopMid]; + + if([_CallTag isEqualToString:@"BECALL"]){ + [UI setFrameInView:self.spkView Width:@"14vmin" Height:@"14vmin" TranslateX:@"-36vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid]; + [UI setCornerRadius:self.spkView]; + [UI setFrameInView:self.spkImage Width:@"50%" Height:@"50%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter]; + + + [UI setFrameInView:self.cutView Width:@"14vmin" Height:@"14vmin" TranslateX:@"-18vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid]; + [UI setCornerRadius:self.cutView]; + [UI setFrameInView:self.cutImage Width:@"50%" Height:@"50%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter]; + + + [UI setFrameInView:self.hangupView Width:@"14vmin" Height:@"14vmin" TranslateX:@"0" TranslateY:@"10vmin" InView:nil Position:UIBottomMid]; + [UI setCornerRadius:self.hangupView]; + [UI setFrameInView:self.hangupImage Width:@"58%" Height:@"22%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter]; + + + [UI setFrameInView:self.answerView Width:@"14vmin" Height:@"14vmin" TranslateX:@"18vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid]; + [UI setCornerRadius:self.answerView]; + [UI setFrameInView:self.answerImage Width:@"40%" Height:@"40%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter]; + + + [UI setFrameInView:self.openView Width:@"14vmin" Height:@"14vmin" TranslateX:@"36vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid]; + [UI setCornerRadius:self.openView]; + [UI setFrameInView:self.openImage Width:@"35%" Height:@"40%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter]; + + } + else if([_CallTag isEqualToString:@"WATCH"]){ + [UI setFrameInView:self.cutView Width:@"14vmin" Height:@"14vmin" TranslateX:@"-26vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid]; + [UI setCornerRadius:self.cutView]; + [UI setFrameInView:self.cutImage Width:@"50%" Height:@"50%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter]; + + + [UI setFrameInView:self.hangupView Width:@"14vmin" Height:@"14vmin" TranslateX:@"0" TranslateY:@"10vmin" InView:nil Position:UIBottomMid]; + [UI setCornerRadius:self.hangupView]; + [UI setFrameInView:self.hangupImage Width:@"58%" Height:@"22%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter]; + + + [UI setFrameInView:self.openView Width:@"14vmin" Height:@"14vmin" TranslateX:@"26vmin" TranslateY:@"10vmin" InView:nil Position:UIBottomMid]; + [UI setCornerRadius:self.openView]; + [UI setFrameInView:self.openImage Width:@"35%" Height:@"40%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter]; + + [[Pub getApp].talk watchByServer]; + } + +} +- (void)setTime:(long)time0{ + int sec_total = (int)([Sformat timestamp] - time0)/1000; + int sec = sec_total % 60; + int min = (sec_total-sec)/60; + //dispatch_async(dispatch_get_main_queue(), ^{//转到主线程处理 + [self.statuLabel setText:[[NSString alloc] initWithFormat:@"%02d:%02d",min,sec]]; + //}); + +} +- (void)SaveImg{ + long time = [Sformat timestamp]; + // +// NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); +// // 构造保存文件的名称 保存成功会返回YES +// NSString *filePath = [[paths objectAtIndex:0]stringByAppendingPathComponent: +// [NSString stringWithFormat:@"%ld.jpg",time]]; + + NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];// 拼接图⽚名为"currentImage.png"的路径 + NSString *filePath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"%ld.jpg",time]];//获取⽹络请求中的url地址 + + + //保存操作 + BOOL result = [UIImageJPEGRepresentation(self.playerImage.image, .9) writeToFile:filePath atomically:YES]; + if (result == YES) { + [self alert:@"保存截图成功"]; + [[Pub getApp].sysinfo SaveRecord:time Type:@"截图" Equ:[[Pub getApp].talk getRemoteEqu] Img:[NSString stringWithFormat:@"%ld.jpg",time] Note:@""]; + }else{ + [self alert:@"保存截图失败"]; + } + //https://wenku.baidu.com/view/2ff5463ba000a6c30c22590102020740be1ecd95.html + +} +- (void)Hangup{ + NSLog(@"挂机"); + if([Pub getApp].talk.status>0){ + if([_CallTag isEqualToString:@"BECALL"]){ + [[Pub getApp].talk talkEnd]; + } + else{ + [[Pub getApp].talk watchEnd]; + } + } + + if([_CallTag isEqualToString:@"WATCH"]){ + if([Pub getApp].talk.status==0){ + [[Pub getApp].udp stopSend:@"" rr6:152 rr8:1]; + } + } + [self UIClose]; +} +- (void)UIClose{ + [[Pub getApp].talk status_ini]; + [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; + [Pub getApp].callOut = nil; + +} +- (void)Answer{ + if([Pub getApp].talk.status==6){ + NSLog(@"接听"); + [Pub getApp].TalkSendAudio = false; + [[Pub getApp] ring_stop]; + [[Pub getApp].talk talkOn]; + + } + else{ + [self TouchUp]; + } + + +} + +//接听成功 +- (void)AnswerSucc{ + NSLog(@"接听Succ"); + dispatch_async(dispatch_get_main_queue(), ^{//转到主线程处理 + [self.answerImage setImage:[UIImage imageNamed:@"ic_vd_mic_off"]]; + + [self.answerView addTarget:self action:@selector(TouchDown) forControlEvents:UIControlEventTouchDown]; + [self.answerView addTarget:self action:@selector(TouchUp) forControlEvents:UIControlEventTouchUpInside]; + [self.answerView addTarget:self action:@selector(TouchUp) forControlEvents:UIControlEventTouchUpOutside]; + + }); +} +-(void)TouchDown{ + [self.answerImage setImage:[UIImage imageNamed:@"ic_vd_mic_on"]]; + [Pub getApp].TalkSendAudio = true; +} +-(void)TouchUp{ + [self.answerImage setImage:[UIImage imageNamed:@"ic_vd_mic_off"]]; + [Pub getApp].TalkSendAudio = false; + +} +- (void)Open{ + self.openAlert = [Msg OpendoorByPwd:self SelectedHandler:^(int index) { + [self alert:@"请输入6位数字密码"]; + }]; +} +- (void)OpenDoorGo:(NSString *)pwd{ + if(self.openAlert){ + [self.openAlert dismissViewControllerAnimated:YES completion:nil]; + [[Pub getApp].talk openDoor:pwd]; + } +} +- (void)RefImg:(NSData *)data{ + UIImage *image = [UIImage imageWithData: data]; + //self.playerImage = [[UIImageView alloc] initWithImage:image]; + [self.playerImage setImage:image]; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + + +#pragma mark Property Accessors +- (UIView *)rview +{ + if (!_rview) { + _rview = [[UIView alloc] init]; + _rview.backgroundColor = [UIColor colorWithRed:0/255. green:0/255. blue:0/255. alpha:1]; + } + return _rview; +} +- (UILabel *)statuLabel +{ + if (!_statuLabel) { + _statuLabel = [[UILabel alloc] init]; + _statuLabel.font = [UIFont systemFontOfSize:18.0f]; + _statuLabel.textColor = [UIColor whiteColor]; + _statuLabel.textAlignment = NSTextAlignmentCenter; + _statuLabel.text = NSLocalizedString(@"", nil); + } + return _statuLabel; +} +//免提 +- (UIView *)spkView +{ + if (!_spkView) { + _spkView = [[UIView alloc] init]; + _spkView.backgroundColor = [UI colorWithHex:0x999999 alpha: .8]; + } + return _spkView; +} +- (UIImageView *)spkImage +{ + if (!_spkImage) { + _spkImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"hf"]]; + } + return _spkImage; +} +//截图 +- (UIView *)cutView +{ + if (!_cutView) { + _cutView = [[UIView alloc] init]; + _cutView.backgroundColor = [UI colorWithHex:0x999999 alpha: .8]; + } + return _cutView; +} +- (UIImageView *)cutImage +{ + if (!_cutImage) { + _cutImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"save_photo"]]; + } + return _cutImage; +} +//挂机 +- (UIView *)hangupView +{ + if (!_hangupView) { + _hangupView = [[UIView alloc] init]; + _hangupView.backgroundColor = [UI colorWithHex:0xff0000 alpha: .8]; + + } + return _hangupView; +} +- (UIImageView *)hangupImage +{ + if (!_hangupImage) { + _hangupImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"hangup"]]; + } + return _hangupImage; +} +//接听 +- (UIButton *)answerView +{ + if (!_answerView) { + _answerView = [[UIButton alloc] init]; + _answerView.backgroundColor = [UI colorWithHex:0x2f6da8 alpha: .8]; + } + return _answerView; +} +- (UIImageView *)answerImage +{ + if (!_answerImage) { + _answerImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"call_call_on"]]; + } + return _answerImage; +} +//开门 +- (UIView *)openView +{ + if (!_openView) { + _openView = [[UIView alloc] init]; + _openView.backgroundColor = [UI colorWithHex:0x999999 alpha: .8]; + } + return _openView; +} +- (UIImageView *)openImage +{ + if (!_openImage) { + _openImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"unlock_on2"]]; + } + return _openImage; +} +//播放画面 +- (UIScrollView *)scrollView{ + if(!_scrollView){ + _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, [UI getScreenWidth], [UI getScreenHeight])]; + _scrollView.pagingEnabled = NO; + _scrollView.showsHorizontalScrollIndicator = YES; + _scrollView.showsVerticalScrollIndicator = NO; + _scrollView.delegate = self; + } + return _scrollView; +} + +- (UIImageView *)playerImage +{ + if (!_playerImage) { + //_playerImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.jpg"]]; + _playerImage = [[UIImageView alloc] init]; + } + return _playerImage; +} +@end diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/EquAdd.h b/star_lock/ios/Runner/XSTalkManager/NextPage/EquAdd.h new file mode 100755 index 00000000..e9825293 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/EquAdd.h @@ -0,0 +1,25 @@ +// +// FirstViewController.h +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import +#import +#import "BaseViewController.h" +#import "EquList.h" + +@interface EquAdd : BaseViewController +@property(nonatomic) NSString *equid; +@property(nonatomic) NSString *name; +@property(nonatomic) EquList *parent; + +@property (nonatomic,strong)CBCentralManager *ble; +@property (nonatomic,strong)CBPeripheral *device; +@property (nonatomic,strong)CBCharacteristic *wrter; +@property (nonatomic,strong)CBCharacteristic *reader; + +@end + diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/EquAdd.m b/star_lock/ios/Runner/XSTalkManager/NextPage/EquAdd.m new file mode 100755 index 00000000..1b5ee0c0 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/EquAdd.m @@ -0,0 +1,346 @@ +// +// FirstViewController.m +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import "EquAdd.h" +#import "HKHTextField.h" +//#import "MainTabBar.h" +#import "UI.h" +#import "HttpManager.h" +#import "Msg.h" +#import "Pub.h" +#import "sysInfo.h" +#import "Sformat.h" +#import "EquList.h" +#import "Opendoor.h" +#import "EquConfig.h" + + +@interface EquAdd () + +@property (nonatomic, strong)UIView *rview; +@property (nonatomic, strong)UILabel *equidLabel,*nameLabel; +@property (nonatomic, strong)HKHTextField *equidTextField, *nameTextField; +@property (nonatomic, strong)UIButton *addButton ,*selEquButton; +@property (nonatomic, strong)UIAlertController *waiting; + +@property (nonatomic, strong) NSMutableArray *equArray; + +@end + +@implementation EquAdd + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. + + //UIView *RootView = [[[NSBundle mainBundle] loadNibNamed:@"View" owner:self options:nil] objectAtIndex:0]; + //[self.title autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsMake(0,0,0,0)]; + + + + [self setupViews]; + [self setUI]; + if(self.equid == nil){ + [self setupBle]; + } + + //https://blog.csdn.net/liumude123/article/details/80579152 + //[self.view setNeedsUpdateConstraints]; + + + +} +- (void)updateViewConstraints +{ + [super updateViewConstraints]; + NSLog(@"updateViewConstraints"); + + [self setUI]; +} +- (void)setupViews +{ + + + [self.view addSubview:self.rview]; + [self.rview addSubview:self.equidLabel]; + [self.rview addSubview:self.equidTextField]; + [self.rview addSubview:self.nameLabel]; + [self.rview addSubview:self.nameTextField]; + [self.rview addSubview:self.addButton]; + + + if(self.equid){ + [self setNavTitle:@"命名设备"]; + + self.equidTextField.enabled = NO; + self.equidTextField.text = self.equid; + self.nameTextField.text = self.name; + + + + } + else{ + + [self.rview addSubview:self.selEquButton]; + self.equidTextField.enabled = NO; + self.equidTextField.backgroundColor = [UIColor whiteColor]; + [self setNavTitle:@"添加设备"]; + + + + [self.equidTextField resignFirstResponder]; + //[self.equidTextField setUserInteractionEnabled:YES]; + [self.selEquButton addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(SelEqu)]]; + [self.addButton setTitle:@"点击搜索门锁" forState:UIControlStateNormal]; + + } + + + + [self.addButton addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(AddEqu)]]; +} +- (void)setUI +{ + [UI SetRView:self.rview Top:[[NSString alloc] initWithFormat:@"%f",[UI getStatuAndStatuHeight]+10] Right:@"20" Bottom:@"0" Left:@"20"]; + + + [UI setFrameInView:self.equidLabel Width:@"70" Height:@"44" TranslateX:@"0" TranslateY:@"10" InView:nil Position:UITopLeft]; + [UI setFrameInView:self.equidTextField Width:@"100%" Height:@"44" TranslateX:@"0" TranslateY:@"10" InView:nil Position:UITopRight]; + [UI setFrameInView:self.nameLabel Width:@"70" Height:@"44" TranslateX:@"0" TranslateY:@"64" InView:nil Position:UITopLeft]; + [UI setFrameInView:self.nameTextField Width:@"100%" Height:@"44" TranslateX:@"0" TranslateY:@"64" InView:nil Position:UITopRight]; + [UI chgMargin:self.equidTextField Css:@"0 0 0 80"]; + [UI chgMargin:self.nameTextField Css:@"0 0 0 80"]; + + + [UI setFrameInView:self.addButton Width:@"100%" Height:@"44" TranslateX:@"0" TranslateY:@"140" InView:nil Position:UITopMid]; + + + if(self.equid==nil){ + [UI setFrameInView:self.selEquButton Width:@"100%" Height:@"44" TranslateX:@"0" TranslateY:@"10" InView:nil Position:UITopRight]; + [UI chgMargin:self.selEquButton Css:@"0 0 0 80"]; + } +} + +- (void)setupBle{ + _ble = [[CBCentralManager alloc] initWithDelegate:self queue:(nil)]; + self.equArray = [[NSMutableArray alloc] init]; +} + +#pragma mark-CBCentralManagerDelegate +- (void)centralManagerDidUpdateState:(CBCentralManager *)central{ + switch (central.state){ + case CBCentralManagerStatePoweredOff:{ + NSLog(@"蓝牙关闭"); + [self alert:@"手机蓝牙未开启"]; + } + + break; + case CBCentralManagerStatePoweredOn:{ + NSLog(@"蓝牙打开"); + [self ScanEqu]; + } + + break; + default: + break; + } +} +- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{ + if(peripheral.name==nil)return; + if(![peripheral.name hasPrefix:@"T9A"])return; + NSLog(@"发现蓝牙:%@,%@",peripheral,advertisementData); + if(self.waiting){ + [self.waiting dismissViewControllerAnimated:YES completion:nil]; + self.waiting = nil; + } + + if(self.device==nil){ + self.device = peripheral; + self.equidTextField.text = self.device.name; + self.nameTextField.placeholder = self.device.name; + [self.addButton setTitle:@"添加设备" forState:UIControlStateNormal]; + } + for(int i=0;i0 && index +#import +#import "BaseViewController.h" + +@interface EquConfig : BaseViewController +@property(nonatomic) NSString *equid; + + +@property (nonatomic,strong)CBCentralManager *ble; +@property (nonatomic,strong)CBPeripheral *device; +@property (nonatomic,strong)CBCharacteristic *writer; +@property (nonatomic,strong)CBCharacteristic *reader; +@property (nonatomic)BOOL needSend; +@property (nonatomic)BOOL sending; +@property (nonatomic)BOOL connected; +@property (nonatomic,strong)NSData *data2send; + +@end + diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/EquConfig.m b/star_lock/ios/Runner/XSTalkManager/NextPage/EquConfig.m new file mode 100755 index 00000000..9a162f10 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/EquConfig.m @@ -0,0 +1,532 @@ +// +// FirstViewController.m +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import "EquConfig.h" +#import "HKHTextField.h" +//#import "MainTabBar.h" +#import "UI.h" +#import "HttpManager.h" +#import "Msg.h" +#import "Pub.h" +#import "sysInfo.h" +#import "Sformat.h" +#import "EquList.h" +#import "WifiList.h" + + +@interface EquConfig () + +@property (nonatomic, strong)UIView *rview; +@property (nonatomic, strong)UILabel *WIFILabel,*PwdLabel,*hitLabel; +@property (nonatomic, strong)HKHTextField *WIFITextField, *PwdTextField; +@property (nonatomic, strong)UIButton *searchWIFIButton,*configButton; + + +@end + +@implementation EquConfig + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. + + //UIView *RootView = [[[NSBundle mainBundle] loadNibNamed:@"View" owner:self options:nil] objectAtIndex:0]; + //[self.title autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsMake(0,0,0,0)]; + + + [self setNavTitle:@"配置网关"]; + [self setupViews]; + [self setUI]; + [self setupBle]; + + + + + +} +- (void)updateViewConstraints +{ + [super updateViewConstraints]; + +} +- (void)setupViews +{ + + + [self.view addSubview:self.rview]; + [self.rview addSubview:self.WIFILabel]; + [self.rview addSubview:self.WIFITextField]; + [self.rview addSubview:self.PwdLabel]; + [self.rview addSubview:self.PwdTextField]; + [self.rview addSubview:self.searchWIFIButton]; + [self.rview addSubview:self.configButton]; + [self.rview addSubview:self.hitLabel]; + + + + + + [self.searchWIFIButton addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(SelectWifi)]]; + [self.configButton addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(ConfigEqu)]]; +} +- (void)setUI +{ + [UI SetRView:self.rview Top:[[NSString alloc] initWithFormat:@"%f",[UI getStatuAndStatuHeight]+10] Right:@"20" Bottom:@"0" Left:@"20"]; + + + [UI setFrameInView:self.WIFILabel Width:@"70" Height:@"44" TranslateX:@"0" TranslateY:@"10" InView:nil Position:UITopLeft]; + [UI setFrameInView:self.WIFITextField Width:@"100%" Height:@"44" TranslateX:@"0" TranslateY:@"10" InView:nil Position:UITopRight]; + //[UI setFrameInView:self.searchWIFIButton Width:@"80" Height:@"44" TranslateX:@"0" TranslateY:@"10" InView:nil Position:UITopRight]; + [UI setFrameInView:self.PwdLabel Width:@"70" Height:@"44" TranslateX:@"0" TranslateY:@"64" InView:nil Position:UITopLeft]; + [UI setFrameInView:self.PwdTextField Width:@"100%" Height:@"44" TranslateX:@"0" TranslateY:@"64" InView:nil Position:UITopRight]; + //[UI chgMargin:self.WIFITextField Css:@"0 90 0 80"]; + [UI chgMargin:self.WIFITextField Css:@"0 0 0 80"]; + [UI chgMargin:self.PwdTextField Css:@"0 0 0 80"]; + + + [UI setFrameInView:self.configButton Width:@"100%" Height:@"44" TranslateX:@"0" TranslateY:@"140" InView:nil Position:UITopMid]; + [UI setFrameInView:self.hitLabel Width:@"100%" Height:@"44" TranslateX:@"0" TranslateY:@"190" InView:nil Position:UITopMid]; + +} +- (void)setupBle{ + _connected = NO; + _needSend = NO; + _sending = NO; + _ble = [[CBCentralManager alloc] initWithDelegate:self queue:(nil)]; +} +#pragma mark-CBCentralManagerDelegate +- (void)centralManagerDidUpdateState:(CBCentralManager *)central{ + switch (central.state){ + case CBCentralManagerStatePoweredOff:{ + NSLog(@"蓝牙关闭"); + [self alert:@"手机蓝牙未开启"]; + } + + break; + case CBCentralManagerStatePoweredOn:{ + NSLog(@"蓝牙打开"); + [self ScanEqu]; + } + + break; + default: + break; + } +} +- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{ + if(peripheral.name==nil)return; + if(![peripheral.name isEqual:self.equid])return; + NSLog(@"发现蓝牙:%@,%@",peripheral,advertisementData); + + if(self.device==nil){ + self.hitLabel.text = @"发现门锁"; + self.device = peripheral; + } + if(!_connected){ + self.hitLabel.text = @"正在连接门锁"; + [_ble connectPeripheral:self.device options:nil]; + } + +} +- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(nonnull CBPeripheral *)peripheral{ + NSLog(@"已连接门锁"); + self.hitLabel.text = @"已连接门锁"; + [self.device setDelegate:self]; + [self.device discoverServices:nil]; +} +- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(nonnull CBPeripheral *)peripheral error:(nullable NSError *)error{ + NSLog(@"连接门锁失败,重新连接"); + self.hitLabel.text = @"连接门锁失败,重新连接"; + [_ble connectPeripheral:self.device options:nil]; +} +- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(nonnull CBPeripheral *)peripheral error:(nullable NSError *)error{ + NSLog(@"连接断开,正在重新连接"); + self.hitLabel.text = @"连接断开,正在重新连接"; + _connected = NO; + if(_sending){ + _sending = NO; + _needSend = YES; + } + + [_ble connectPeripheral:self.device options:nil]; +} +- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(nullable NSError *)error{ + if(error)return; + NSLog(@"已连接至门锁"); + self.hitLabel.text = @"已连接至门锁"; + for(CBService *service in peripheral.services){ + NSLog(@"Service:%@;",service.UUID); + if([service.UUID isEqual:[CBUUID UUIDWithString:@"FFF0"]]){ + NSLog(@"discoverCharacteristics:%@",service.UUID); + [_device discoverCharacteristics:nil forService:service]; + + } + } +} +- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(nonnull CBService *)service error:(nullable NSError *)error{ + NSLog(@"已连接到门锁"); + self.hitLabel.text = @"已连接到门锁"; + for(CBCharacteristic *characteristic in service.characteristics){ + NSLog(@"Characteristic:%@",characteristic.UUID); + if([characteristic.UUID isEqual:[CBUUID UUIDWithString:@"FFF1"]]){ + self.reader = characteristic; + [_device setNotifyValue:YES forCharacteristic:self.reader]; + [_device readValueForCharacteristic:self.reader]; + } + else if([characteristic.UUID isEqual:[CBUUID UUIDWithString:@"FFF2"]]){ + self.writer = characteristic; + } + } + _connected = YES; + if(_needSend){ + [self ConfigEqu_go]; + } +} +- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(nonnull CBCharacteristic *)characteristic error:(nullable NSError *)error{ + if(error){ + _sending = NO; + _needSend = NO; + self.configButton.enabled = YES; + self.configButton.backgroundColor = [UI colorWithHex:0x378fe8]; + NSLog(@"通信失败"); + self.hitLabel.text = @"通信失败"; + return; + } + NSLog(@"didWriteValueForCharacteristic :发送成功"); + +} +- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(nonnull CBCharacteristic *)characteristic error:(nullable NSError *)error{ + //收到数据 + int len = characteristic.value.length; + NSLog(@"didUpdateValueForCharacteristic:%ld",len); + Byte bb[len]; + [characteristic.value getBytes:&bb length:len]; + NSLog(@"%@",[[NSData alloc] initWithBytes:bb length:len]); + if(len==20 && bb[0]==0x22){ + Byte temp[16]; + NSData *temp2; + memcpy(temp,bb+3,16); + temp2 = [Pub AES128_Decrypt:@"1123456789ABCDEE" encryptData:[[NSData alloc] initWithBytes:temp length:16]]; + NSLog(@"解密后:%@",temp2); + if(temp2){ + Byte temp3[16]; + memcpy(temp3,temp2.bytes,16); + if(temp3[0] == 0xf1){ + //配网数据反馈 + if( bb[1]== bb[2]+1){//最后一包 + if(temp3[3]==1){ + NSLog(@"已下发WIFI信息,请等待门锁连接网关"); + self.hitLabel.text = @"已下发WIFI信息,请等待门锁连接网关"; + _sending = NO; + _needSend = NO; + self.configButton.enabled = YES; + self.configButton.backgroundColor = [UI colorWithHex:0x378fe8]; + } + else{ + NSLog(@"配网失败"); + self.hitLabel.text = @"配网失败" ; + _sending = NO; + _needSend = NO; + self.configButton.enabled = YES; + self.configButton.backgroundColor = [UI colorWithHex:0x378fe8]; + } + } + else{ + if(temp3[3]==1){ + [self Send20]; + } + else{ + NSLog(@"配网失败"); + self.hitLabel.text = @"配网失败"; + _sending = NO; + _needSend = NO; + self.configButton.enabled = YES; + self.configButton.backgroundColor = [UI colorWithHex:0x378fe8]; + } + + } + } + else if(temp3[0] == 0xf2){ + //配网数据结果 + if(temp3[3] == 0){ + NSLog(@"配网成功"); + self.hitLabel.text = @"配网成功"; + //[Msg Alert:self Msg:@"配网成功"]; + [Msg MessageBox:self Msg:@"配网成功" SelectedHandler:^(int index) { + [self pageBack]; + }]; + + + + } + else{ + NSLog(@"配网失败"); + self.hitLabel.text = @"无法连接网关,请检查WIFI名称和密码是否正确"; + [Msg Alert:self Msg:@"无法连接网关,请检查WIFI名称和密码是否正确"]; + + } + } + } + } +} + + +- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(nonnull CBCharacteristic *)characteristic error:(nullable NSError *)error{ + + //NSLog(@"didUpdateNotificationStateForCharacteristic:%ld",characteristic.value.length); + +} +- (void)SelectWifi{ + WifiList *wifi = [[WifiList alloc] init]; + [self.navigationController pushViewController:wifi animated:YES]; +} + +- (void)ScanEqu{ + NSLog(@"ScanEqu"); + self.hitLabel.text = @"请打开门锁蓝牙,正在搜索门锁…"; + [_ble scanForPeripheralsWithServices:nil options:nil]; +} +- (void)ConfigEqu{ + if(self.device==nil){ + _needSend = YES; + [self ScanEqu]; + return; + } + if(!_connected){_needSend = YES;return;} + if(_sending){return;} + + + + + [self ConfigEqu_go]; +} + +- (BOOL)SetUpData{ + if([self.WIFITextField.text isEqualToString:@""]){[self alert:@"请输入wifi名称"];return NO;} + if([self.PwdTextField.text isEqualToString:@""]){[self alert:@"请输入wifi密码"];return NO;} + int bblen = 64; + Byte bb[bblen]; + memset(bb, 0, 64); + [Pub addGKB:self.WIFITextField.text toByte:bb at:0]; + [Pub addGKB:self.PwdTextField.text toByte:bb at:30]; + [Pub addGKB:[Pub getApp].sysinfo.equid toByte:bb at:50]; + + int bag_len = 14; + int bag_len_last = bblen % bag_len; + int bag_num = (bblen-bag_len_last)/bag_len; + if(bag_len_last!=0)bag_num++; + + Byte package1[bag_num*20]; + memset(package1, 0, bag_num*20); + for(int i=0;i=20){ + NSData *send = [[NSData alloc] initWithBytes:_data2send.bytes length:20]; + [_device writeValue:send forCharacteristic:_writer type:CBCharacteristicWriteWithResponse]; + + int leftlen = _data2send.length - 20; + if(leftlen>0){ + Byte left[leftlen]; + memcpy(left,_data2send.bytes+20,leftlen); + _data2send = [[NSData alloc] initWithBytes:left length:leftlen]; + } + else{ + _data2send = nil; + _sending = NO; + self.configButton.enabled = YES; + self.configButton.backgroundColor = [UI colorWithHex:0x378fe8]; + self.hitLabel.text = @"通信结束"; + } + } + else{ + _data2send = nil; + _sending = NO; + self.configButton.enabled = YES; + self.configButton.backgroundColor = [UI colorWithHex:0x378fe8]; + self.hitLabel.text = @"通信失败"; + } + } + else{ + _sending = NO; + self.configButton.enabled = YES; + self.configButton.backgroundColor = [UI colorWithHex:0x378fe8]; + self.hitLabel.text = @"通信结束"; + } +} + +- (void)ConfigEqu_go{ + if(![self SetUpData])return; + self.hitLabel.text = @"正在配置"; + self.configButton.enabled = NO; + self.configButton.backgroundColor = [UI colorWithHex:0x999999]; + _sending = YES; + [self Send20]; +} +#pragma mark Property Accessors +- (UIView *)rview +{ + if (!_rview) { + _rview = [[UIView alloc] init]; + //_rview.backgroundColor = [UIColor redColor]; + } + return _rview; +} + +- (UILabel *)hitLabel +{ + if (!_hitLabel) { + _hitLabel = [[UILabel alloc] init]; + //_WIFILabel.backgroundColor = [UIColor orangeColor]; + //_WIFILabel.numberOfLines = 0; + _hitLabel.font = [UIFont systemFontOfSize:15.0f]; + _hitLabel.textColor = [UIColor grayColor]; + _hitLabel.textAlignment = NSTextAlignmentCenter; + _hitLabel.text = NSLocalizedString(@"", nil); + } + return _hitLabel; +} +- (UILabel *)WIFILabel +{ + if (!_WIFILabel) { + _WIFILabel = [[UILabel alloc] init]; + //_WIFILabel.backgroundColor = [UIColor orangeColor]; + //_WIFILabel.numberOfLines = 0; + _WIFILabel.font = [UIFont systemFontOfSize:15.0f]; + _WIFILabel.textColor = [UIColor blackColor]; + _WIFILabel.textAlignment = NSTextAlignmentLeft; + _WIFILabel.text = NSLocalizedString(@"WIFI名称", nil); + } + return _WIFILabel; +} +- (UILabel *)PwdLabel +{ + if (!_PwdLabel) { + _PwdLabel = [[UILabel alloc] init]; + //_PwdLabel.backgroundColor = [UIColor orangeColor]; + //_PwdLabel.numberOfLines = 0; + _PwdLabel.font = [UIFont systemFontOfSize:15.0f]; + _PwdLabel.textColor = [UIColor blackColor]; + _PwdLabel.textAlignment = NSTextAlignmentLeft; + _PwdLabel.text = NSLocalizedString(@"WIFI密码", nil); + } + return _PwdLabel; +} +- (HKHTextField *)WIFITextField +{ + if (!_WIFITextField) { + _WIFITextField = [[HKHTextField alloc] init]; + _WIFITextField.borderStyle = UITextBorderStyleRoundedRect; + _WIFITextField.placeholder = @"门锁连接WIFI的名称"; + + } + return _WIFITextField; +} +- (HKHTextField *)PwdTextField +{ + if (!_PwdTextField) { + _PwdTextField = [[HKHTextField alloc] init]; + _PwdTextField.borderStyle = UITextBorderStyleRoundedRect; + _PwdTextField.placeholder = @"门锁连接WIFI的密码"; + _PwdTextField.secureTextEntry = YES; + + } + return _PwdTextField; +} + +- (UIButton *)searchWIFIButton +{ + if (!_searchWIFIButton) { + _searchWIFIButton = [[UIButton alloc] init]; + [_searchWIFIButton setTitle:@"搜索WIFI" forState:UIControlStateNormal]; + [_searchWIFIButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [_searchWIFIButton setTitleColor:[UIColor colorWithRed:255/255. green:128/255. blue:0/255. alpha:1] forState:UIControlStateHighlighted]; + _searchWIFIButton.backgroundColor = [UI colorWithHex:0x378fe8]; + [_searchWIFIButton.layer setMasksToBounds:YES]; + [_searchWIFIButton.layer setCornerRadius:10.0]; //设置矩形四个圆角半径 + _searchWIFIButton.font = [UIFont systemFontOfSize:14.0f]; + //边框宽度 + //[_searchWIFIButton.layer setBorderWidth:1.0]; + //_searchWIFIButton.layer.borderColor=[UIColor grayColor].CGColor; + + + } + return _searchWIFIButton; +} + +- (UIButton *)configButton +{ + if (!_configButton) { + _configButton = [[UIButton alloc] init]; + [_configButton setTitle:@"开始配置" forState:UIControlStateNormal]; + [_configButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [_configButton setTitleColor:[UIColor colorWithRed:255/255. green:128/255. blue:0/255. alpha:1] forState:UIControlStateHighlighted]; + _configButton.backgroundColor = [UI colorWithHex:0x378fe8]; + [_configButton.layer setMasksToBounds:YES]; + [_configButton.layer setCornerRadius:10.0]; //设置矩形四个圆角半径 + //边框宽度 + //[_configButton.layer setBorderWidth:1.0]; + //_configButton.layer.borderColor=[UIColor grayColor].CGColor; + + } + return _configButton; +} + + + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/EquList.h b/star_lock/ios/Runner/XSTalkManager/NextPage/EquList.h new file mode 100755 index 00000000..00ece8d0 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/EquList.h @@ -0,0 +1,16 @@ +// +// FirstViewController.h +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import +#import "BaseTableViewController.h" + +@interface EquList : BaseTableViewController + +- (void)setData; +@end + diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/EquList.m b/star_lock/ios/Runner/XSTalkManager/NextPage/EquList.m new file mode 100755 index 00000000..fb61e7b2 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/EquList.m @@ -0,0 +1,143 @@ +// +// FirstViewController.m +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import "EquList.h" +#import "UI.h" +#import "HttpManager.h" +#import "Msg.h" +#import "Pub.h" +#import "sysInfo.h" +//#import "EquListCell.h" +#import "Opendoor.h" +#import "EquAdd.h" +#import "EquConfig.h" +#import "FaceUpload.h" + +@interface EquList () +@property (nonatomic, strong)UIView *rview; + +@end + +@implementation EquList +NSMutableArray *_dataArray; + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. +// [self setNavTitle:@"我的设备"]; +// [self setNavRight:@"add" action:@selector(AddEqu)]; +// [self setUI]; +// [self setData]; +} +/* +- (void)setData{ + _dataArray = [[NSMutableArray alloc] initWithCapacity:0]; + [_dataArray addObjectsFromArray:[Opendoor getEqulist]]; + [self.tableView reloadData]; + +} +- (void)setUI{ + + + + self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 70, [UI getScreenWidth], [UI getScreenHeight]-60) style:UITableViewStylePlain]; + [self.tableView registerClass:[EquListCell class] forCellReuseIdentifier:@"EquListCell"]; + self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + self.tableView.delegate = self; + self.tableView.dataSource = self; + + NSLog(@"table:%f,%f,%f,%f",self.tableView.frame.origin.x,self.tableView.frame.origin.y,self.tableView.frame.size.width,self.tableView.frame.size.height); + + +} + +- (void)AddEqu{ + EquAdd *equadd = [[EquAdd alloc] init]; + equadd.parent = self; + [self.navigationController pushViewController:equadd animated:YES]; +} + +#pragma mark 返回分组数 +-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ + //NSLog(@"计算分组数"); + return 1; +} + +#pragma mark 返回每组行数 +-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ + //NSLog(@"计算每组(组%li)行数",(long)section); + return _dataArray.count; +} + +- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + return 60; +} +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + NSLog(@"cellForRowAtIndexPath:%ld",indexPath.row); + //EquListCell *cell = [tableView dequeueReusableCellWithIdentifier:@"EquListCell" forIndexPath:indexPath]; + EquListCell *cell = [tableView dequeueReusableCellWithIdentifier:@"EquListCell"]; + + if (cell == nil) { + cell = [[EquListCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"EquListCell"]; + } + if(indexPath.row<_dataArray.count){ + cell.titleLabel.text = [_dataArray[indexPath.row] valueForKey:@"name"]; + cell.contentLabel.text = [_dataArray[indexPath.row] valueForKey:@"equid"]; + } + + +// if (indexPath.row == self.timeListenData.count - 1) { +// [tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; +// } + return cell; +} +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + //NSLog(@"didSelectRowAtIndexPath:%ld",indexPath.row); + if(indexPath.row<_dataArray.count){ + NSArray * options = @[@"命名设备",@"配置网关",@"人脸开门",@"删除"]; + [Msg Select:self SourceView:[tableView cellForRowAtIndexPath:indexPath] Title:@"请选择" Options:options SelectedHandler:^(int index) { + if(index==0){ + EquAdd *equadd = [[EquAdd alloc] init]; + equadd.parent = self; + equadd.equid = [_dataArray[indexPath.row] valueForKey:@"equid"]; + equadd.name = [_dataArray[indexPath.row] valueForKey:@"name"]; + [self.navigationController pushViewController:equadd animated:YES]; + } + else if(index==1){ + + EquConfig *equconfig = [[EquConfig alloc] init]; + equconfig.equid = [_dataArray[indexPath.row] valueForKey:@"equid"]; + [self.navigationController pushViewController:equconfig animated:YES]; + } + else if(index==2){ + FaceUpload *face = [[FaceUpload alloc] init]; + face.equid = [_dataArray[indexPath.row] valueForKey:@"equid"]; + face.index0 = 0; + [self.navigationController pushViewController:face animated:YES]; + } + else if(index==3){ + [HttpManager DelEqu:[Pub getApp].sysinfo.username Token:[Pub getApp].sysinfo.token Equid:[_dataArray[indexPath.row] valueForKey:@"equid"] HttpResultHandler:^(NSDictionary *json) { + if([[json objectForKey:@"result"] isEqualToString:@"ok"]){ + [Opendoor refEqulist:^{ + [self setData]; + }]; + } + }]; + } + }]; + } + +} +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + */ + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/FaceSubPage.h b/star_lock/ios/Runner/XSTalkManager/NextPage/FaceSubPage.h new file mode 100755 index 00000000..6bdc115d --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/FaceSubPage.h @@ -0,0 +1,22 @@ +// +// FirstViewController.h +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import +#import "BaseViewController.h" +#import "FaceUpload.h" + +@interface FaceSubPage : BaseViewController +@property(nonatomic) UILabel *hit; +@property(nonatomic) UIButton *button; +@property(nonatomic) UIImageView *imgView; +@property(nonatomic) NSString *no; + +@property(nonatomic) FaceUpload *parent; + +@end + diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/FaceSubPage.m b/star_lock/ios/Runner/XSTalkManager/NextPage/FaceSubPage.m new file mode 100755 index 00000000..a62b5ee0 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/FaceSubPage.m @@ -0,0 +1,226 @@ +// +// FirstViewController.m +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import "FaceSubPage.h" +#import +#import "UI.h" +#import "HttpManager.h" +#import "Msg.h" +#import "Pub.h" +#import "sysInfo.h" +#import "EquList.h" + +@interface FaceSubPage () + +@property (nonatomic, strong)UIView *rview; +@end + +@implementation FaceSubPage + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. + [self setupViews]; + [self setUI]; +} +- (void)setupViews +{ + + + [self.view addSubview:self.rview]; + [self.rview addSubview:self.imgView]; + [self.rview addSubview:self.hit]; + [self.rview addSubview:self.button]; + + [self.button addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Action)]]; + +} +- (void)setUI{ + [UI SetRView:self.rview Top:@"0" Right:@"0" Bottom:@"0" Left:@"0"]; + NSLog(@"FaceSubPage:%f,%f",self.rview.frame.origin.x,self.rview.frame.size.width); + + + [UI setFrameInView:self.imgView Width:@"86vw" Height:@"60vh" TranslateX:@"0" TranslateY:[[NSString alloc] initWithFormat:@"%f",[UI getStatuAndStatuHeight]+20] InView:nil Position:UITopMid]; + [UI setFrameByView:self.hit Width:@"86vw" Height:@"40" TranslateX:@"0" TranslateY:@"10" ByView:self.imgView Position:BottomAlignCenter]; + [UI setFrameByView:self.button Width:@"86vw" Height:@"40" TranslateX:@"0" TranslateY:@"10" ByView:self.hit Position:BottomAlignCenter]; + +} +- (void)Action{ + NSLog(@"Action"); + if(_no){ + NSLog(@"删除"); + [HttpManager delPhoto:[Pub getApp].sysinfo.username Token:[Pub getApp].sysinfo.token No:_no HttpResultHandler:^(NSDictionary *json) { + [self.parent ReLoad:0]; + }]; + } + else{ + NSLog(@"拍照"); + if (![self isCameraAvailable]){[self alert:@"没有摄像头"];return;} + if (![self doesCameraSupportTakingPhotos]){[self alert:@"不支持拍照"];return;} + + // 初始化图片选择控制器 + UIImagePickerController *controller = [[UIImagePickerController alloc] init]; + [controller setSourceType:UIImagePickerControllerSourceTypeCamera];// 设置类型 + controller.cameraDevice = UIImagePickerControllerCameraDeviceFront;//默认前置摄像头 + // 设置所支持的类型,设置只能拍照,或则只能录像,或者两者都可以 + NSString *requiredMediaType = ( NSString *)kUTTypeImage; + NSString *requiredMediaType1 = ( NSString *)kUTTypeMovie; + //NSArray *arrMediaTypes=[NSArray arrayWithObjects:requiredMediaType, requiredMediaType1,nil]; + NSArray *arrMediaTypes=[NSArray arrayWithObjects:requiredMediaType,nil]; + [controller setMediaTypes:arrMediaTypes]; + // 设置录制视频的质量 + //[controller setVideoQuality:UIImagePickerControllerQualityTypeHigh]; + //设置最长摄像时间 + //[controller setVideoMaximumDuration:10.f]; + //[controller setAllowsEditing:YES];// 设置是否可以管理已经存在的图片或者视频 + [controller setDelegate:self];// 设置代理 + [_parent.navigationController presentModalViewController:controller animated:YES]; + //[controller release]; + + } +} + +-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ + + NSLog(@"didFinishPickingMediaWithInfo"); + //NSLog(@"%@", info); + NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; + // 判断获取类型:图片 + if ([mediaType isEqualToString:( NSString *)kUTTypeImage]){ + UIImage *theImage = nil; + // 判断,图片是否允许修改 + if ([picker allowsEditing]){ + //获取用户编辑之后的图像 + theImage = [info objectForKey:UIImagePickerControllerEditedImage]; + + } else { + // 照片的元数据参数 + theImage = [info objectForKey:UIImagePickerControllerOriginalImage]; + } + [self.imgView setImage:theImage]; + + NSLog(@"UpPhoto"); + self.hit.text = @"正在上传照片…"; + [HttpManager UpPhoto:[Pub getApp].sysinfo.username Token:[Pub getApp].sysinfo.token Equid:_parent.equid Imgdata:UIImageJPEGRepresentation(theImage, .1) HttpResultHandler:^(NSDictionary *json) { + if([[json objectForKey:@"result"] isEqualToString:@"ok"]){ + NSLog(@"成功"); + self.hit.text = @"上传成功"; + [self.parent ReLoad:-2]; + } + else{ + NSLog(@"失败"); + self.hit.text = @"上传失败"; + [self.parent alert:[json objectForKey:@"result"]]; + } + }]; + + + + } + [picker dismissModalViewControllerAnimated:YES]; + +} +// 判断设备是否有摄像头 +- (BOOL)isCameraAvailable{ + return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]; +} + +// 前面的摄像头是否可用 +- (BOOL) isFrontCameraAvailable{ + return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]; +} + +// 后面的摄像头是否可用 +- (BOOL) isRearCameraAvailable{ + return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear]; +} + + +// 判断是否支持某种多媒体类型:拍照,视频 +- (BOOL) cameraSupportsMedia:(NSString *)paramMediaType sourceType:(UIImagePickerControllerSourceType)paramSourceType{ + __block BOOL result = NO; + if ([paramMediaType length] == 0){ + NSLog(@"Media type is empty."); + return NO; + } + NSArray *availableMediaTypes =[UIImagePickerController availableMediaTypesForSourceType:paramSourceType]; + [availableMediaTypes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL*stop) { + NSString *mediaType = (NSString *)obj; + if ([mediaType isEqualToString:paramMediaType]){ + result = YES; + *stop= YES; + } + }]; + return result; +} + +// 检查摄像头是否支持录像 +- (BOOL) doesCameraSupportShootingVideos{ + return [self cameraSupportsMedia:( NSString *)kUTTypeMovie sourceType:UIImagePickerControllerSourceTypeCamera]; +} + +// 检查摄像头是否支持拍照 +- (BOOL) doesCameraSupportTakingPhotos{ + return [self cameraSupportsMedia:( NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypeCamera]; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +#pragma mark Property Accessors +- (UIView *)rview +{ + if (!_rview) { + _rview = [[UIView alloc] init]; + _rview.backgroundColor = [UIColor colorWithRed:189/255. green:211/255. blue:194/255. alpha:1]; + } + return _rview; +} + +- (UILabel *)hit +{ + if (!_hit) { + _hit = [[UILabel alloc] init]; + //_nameLabel.backgroundColor = [UIColor orangeColor]; + //_nameLabel.numberOfLines = 0; + _hit.font = [UIFont systemFontOfSize:15.0f]; + _hit.textColor = [UIColor blackColor]; + _hit.textAlignment = NSTextAlignmentCenter; + _hit.text = NSLocalizedString(@"提示", nil); + } + return _hit; +} + +- (UIImageView *)imgView +{ + if (!_imgView) { + _imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"vcontacts2.png"]];//[UI reSizeImage: toSize:CGSizeMake(33, 33)]; + _imgView.layer.opacity = .3; + _imgView.contentMode = UIViewContentModeScaleAspectFit; + } + return _imgView; +} +- (UIButton *)button +{ + if (!_button) { + _button = [[UIButton alloc] init]; + [_button setTitle:@"删除人脸信息" forState:UIControlStateNormal]; + [_button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [_button setTitleColor:[UIColor colorWithRed:255/255. green:128/255. blue:0/255. alpha:1] forState:UIControlStateHighlighted]; + _button.backgroundColor = [UIColor redColor]; + [_button.layer setMasksToBounds:YES]; + [_button.layer setCornerRadius:5.0]; //设置矩形四个圆角半径 + + + } + return _button; +} + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/FaceUpload.h b/star_lock/ios/Runner/XSTalkManager/NextPage/FaceUpload.h new file mode 100755 index 00000000..c10dba8a --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/FaceUpload.h @@ -0,0 +1,19 @@ +// +// FirstViewController.h +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import +#import "BaseViewController.h" +#import "BasePageViewController.h" + +@interface FaceUpload : BaseViewController + +@property(nonatomic) NSString *equid; +@property(nonatomic) int index0; +- (void)ReLoad:(int)index; +@end + diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/FaceUpload.m b/star_lock/ios/Runner/XSTalkManager/NextPage/FaceUpload.m new file mode 100755 index 00000000..807a0f88 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/FaceUpload.m @@ -0,0 +1,202 @@ +// +// FirstViewController.m +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import "FaceUpload.h" +#import "UI.h" +#import "HttpManager.h" +#import "Msg.h" +#import "Pub.h" +#import "sysInfo.h" +#import "HttpManager.h" +#import "FaceSubPage.h" + +@interface FaceUpload () + +@property (nonatomic, strong)UIView *rview; +//翻页视图控制器对象 +@property (nonatomic, strong) UIPageViewController * pageViewControl; +@property (nonatomic, strong) NSMutableArray* dataArray; +@end + +@implementation FaceUpload + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. + + [self setNavTitle:@"人脸开门"]; + [self setupViews]; + [self setUI]; + [self setData]; + + } + + +- (void)setupViews{ + [self.view addSubview:self.rview]; + + + + +} + +- (void)ReLoad:(int)index{ + NSArray *viewControlles = self.navigationController.viewControllers; + NSMutableArray *newviewControlles = [NSMutableArray array]; + if ([viewControlles count] > 0) { + for (int i=0; i < [viewControlles count]-1; i++) { + [newviewControlles addObject:[viewControlles objectAtIndex:i]]; + } + } + + FaceUpload *face = [[FaceUpload alloc] init]; + face.index0 = index; + face.equid = _equid; + [self.navigationController pushViewController:face animated:YES]; + [newviewControlles addObject:face]; + [self.navigationController setViewControllers:newviewControlles animated:YES]; + +} + + +- (void)setData{ + [HttpManager getPhotos:[Pub getApp].sysinfo.username Token:[Pub getApp].sysinfo.token Equid:self.equid HttpResultHandler:^(NSDictionary *json) { + _dataArray = [[NSMutableArray alloc]init]; + if([[json objectForKey:@"result"] isEqualToString:@"ok"]){ + //{"no":5,"username":"13430525341","stime":"2022-11-08 09:58","photo":""} + + NSArray *arr = [json objectForKey:@"data"]; + + for(int i=0;i= _dataArray.count){ + return nil; + } + else{ + return _dataArray[index+1]; + } + + +// if (index==9) { +// return nil; +// }else{ +// if (_dataArray.count-1>=(index+1)) { +// return _dataArray[index+1]; +// }else{ +// FaceSubPage * item = [[FaceSubPage alloc] init]; +// item.hit.text = [[NSString alloc] initWithFormat:@"%d"] +// [_dataArray addObject:item]; +// return item; +// } +// } + +} +//屏幕旋转触发的代理方法 +- (UIPageViewControllerSpineLocation) pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation{ + return UIPageViewControllerSpineLocationMin; +} +//设置分页控制器的分页数 +- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController { + + return _dataArray.count; +} +//设置初始的分页点 +- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController{ + int index2 = 0; + if(_index0==-2){ + index2 = _dataArray.count - 2; + if(index2<0)index2 = 0; + } + return index2; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +#pragma mark Property Accessors +- (UIView *)rview +{ + if (!_rview) { + _rview = [[UIView alloc] init]; + _rview.backgroundColor = [UIColor colorWithRed:189/255. green:211/255. blue:194/255. alpha:1]; + } + return _rview; +} + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/OpenPwd.h b/star_lock/ios/Runner/XSTalkManager/NextPage/OpenPwd.h new file mode 100755 index 00000000..b1dc32bc --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/OpenPwd.h @@ -0,0 +1,21 @@ +// +// FirstViewController.h +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import +#import +#import "BaseViewController.h" + +@interface OpenPwd : BaseViewController +@property(nonatomic) UIViewController *parent; + +- (void)setUI; +- (void)focusTextField; + + +@end + diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/OpenPwd.m b/star_lock/ios/Runner/XSTalkManager/NextPage/OpenPwd.m new file mode 100755 index 00000000..8c017cf6 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/OpenPwd.m @@ -0,0 +1,168 @@ +// +// FirstViewController.m +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import "OpenPwd.h" +#import "HKHTextField.h" +//#import "MainTabBar.h" +#import "UI.h" +#import "HttpManager.h" +#import "Msg.h" +#import "Pub.h" +#import "sysInfo.h" +#import "Sformat.h" +#import "EquList.h" +#import "Opendoor.h" + + +@interface OpenPwd () + +@property (nonatomic, strong)UIView *rview; +@property (nonatomic, strong)UILabel *pwdLabel; +@property (nonatomic, strong)HKHTextField *pwdTextField; +@property (nonatomic, strong)NSMutableArray *labels; + + +@end + +@implementation OpenPwd + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. + + [self setupViews]; + [self setUI]; + + + + +} +- (void)setupViews +{ + + + [self.view addSubview:self.rview]; + + for(int i=0;i 6) { + self.pwdTextField.text = [self.pwdTextField.text substringToIndex:6]; + } + for(int i = 0;i < self.pwdTextField.text.length;i++){ + UILabel * label = self.labels[i]; + label.text = @"●"; + label.font = [UIFont systemFontOfSize:15.0f]; + } + for(int i = self.pwdTextField.text.length;i < 6;i++){ + UILabel * label = self.labels[i]; + label.text = @"○"; + label.font = [UIFont systemFontOfSize:15.0f]; + } + if(self.pwdTextField.text.length==6){ + if([@"Call" isEqualToString:NSStringFromClass([self.parent class])]){ + Call *call = (Call *)self.parent; + [call OpenDoorGo:[NSString stringWithFormat:@"%@",self.pwdTextField.text]]; + } + else if([@"Opendoor" isEqualToString:NSStringFromClass([self.parent class])]){ + Opendoor *open = (Opendoor *)self.parent; + [open OpenDoorStep1:self.pwdTextField.text]; + } + //[[Pub getApp].talk openDoor:self.pwdTextField.text]; + } +} +- (void)focusTextField{ + [self.pwdTextField becomeFirstResponder]; +} +#pragma mark Property Accessors +- (UIView *)rview +{ + if (!_rview) { + _rview = [[UIView alloc] init]; + //_rview.backgroundColor = [UI colorWithHex:0xff0000 alpha:1]; + } + return _rview; +} + +- (UILabel *)pwdLabel +{ + if (!_pwdLabel) { + _pwdLabel = [[UILabel alloc] init]; + //_nameLabel.backgroundColor = [UIColor orangeColor]; + //_nameLabel.numberOfLines = 0; + _pwdLabel.font = [UIFont systemFontOfSize:15.0f]; + _pwdLabel.textColor = [UIColor blackColor]; + _pwdLabel.textAlignment = NSTextAlignmentLeft; + _pwdLabel.text = NSLocalizedString(@"设备名称", nil); + } + return _pwdLabel; +} +- (HKHTextField *)pwdTextField +{ + if (!_pwdTextField) { + _pwdTextField = [[HKHTextField alloc] init]; + _pwdTextField.borderStyle = UITextBorderStyleRoundedRect; + //_pwdTextField.placeholder = @"密码"; + _pwdTextField.borderStyle = UITextBorderStyleNone; + _pwdTextField.keyboardType = UIKeyboardTypeNumberPad; + _pwdTextField.textAlignment = NSTextAlignmentCenter; + _pwdTextField.backgroundColor = [UI colorWithHex:0xff0000 alpha:0]; + _pwdTextField.tintColor = [UI colorWithHex:0xff0000 alpha:0]; + _pwdTextField.textColor = [UI colorWithHex:0xff0000 alpha:0]; + } + return _pwdTextField; +} +- (NSMutableArray *)labels{ + if (!_labels) { + _labels = [[NSMutableArray alloc] initWithCapacity:0]; + + + for(int i=0;i<6;i++){ + UILabel * label = [[UILabel alloc] init]; + label.font = [UIFont systemFontOfSize:15.0f]; + label.textColor = [UIColor blackColor]; + label.textAlignment = NSTextAlignmentCenter; + label.text = NSLocalizedString(@"○", nil); + + [_labels addObject:label]; + } + + } + return _labels; +} + + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/P2pTest.h b/star_lock/ios/Runner/XSTalkManager/NextPage/P2pTest.h new file mode 100755 index 00000000..c1e7afd2 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/P2pTest.h @@ -0,0 +1,20 @@ +// +// FirstViewController.h +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import +#import "BaseViewController.h" + +@interface P2pTest : BaseViewController + +- (void)GotMyPortInServer:(Byte *)bb Len:(int)bblen Formip:(NSString *)ip fromport:(int)port; +- (void)GotRemoteIp:(Byte *)bb Len:(int)bblen Formip:(NSString *)ip fromport:(int)port; +- (void)GotCall:(Byte *)bb Len:(int)bblen Formip:(NSString *)ip fromport:(int)port; +- (void)GotDadong:(Byte *)bb Len:(int)bblen Formip:(NSString *)ip fromport:(int)port; +- (void)GotNSAsk:(Byte *)bb Len:(int)bblen Formip:(NSString *)ip fromport:(int)port ; +@end + diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/P2pTest.m b/star_lock/ios/Runner/XSTalkManager/NextPage/P2pTest.m new file mode 100755 index 00000000..aeb158f3 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/P2pTest.m @@ -0,0 +1,583 @@ +// +// FirstViewController.m +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import "P2pTest.h" +#import "UI.h" +#import "HttpManager.h" +#import "Msg.h" +#import "Pub.h" +#import "sysInfo.h" +#import "EquList.h" +#import "HttpManager.h" +#import "Sformat.h" +#import + +@interface P2pTest () + +@property (nonatomic, strong)UIView *rview; +@property (nonatomic, strong)NSArray *cells; +@property (nonatomic, strong)UILabel *hitLabel; +@property (nonatomic, strong)AppDelegate *app; +@property (nonatomic, strong)NSString *remote_ipv6; +@property (nonatomic)int remote_portv6; + +@property (nonatomic)int get_Address_type; +@property (nonatomic)int get_Address_num; +@property (nonatomic, strong)NSString *got_address; +@property (nonatomic, strong)NSString *got_port; + +@end + +@implementation P2pTest + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. + + [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent; + self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:55/255. green:143/255. blue:232/255. alpha:1];//#378fe8 + self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent; + + [self setNavTitle:@"调试"]; + [self setupViews]; + [self setUI]; + self.app = [Pub getApp]; + +} +- (void)setupViews +{ + + + [self.view addSubview:self.rview]; + [self.rview addSubview:self. hitLabel]; + for(int i=0;i-1){ + + + [_app.talk SetRemoteIp:[_app.talk getIpFromBtye:bb At:57]]; + [_app.talk SetRemotePort:[_app.talk getPortFromBtye:bb At:73] ]; + + self.hitLabel.text = [[NSString alloc] initWithFormat:@"%@\n解析成功:%@:%d" ,self.hitLabel.text,[_app.talk getRemoteIp],[_app.talk getRemotePort]]; + + [self Dadong1_wait]; + } + } + + + } + else{ + if(bb[7]==1){// + Byte bb0[1]; + bb0[0]=0x30; + NSData *data0 = [[NSData alloc] initWithBytes:bb length:1]; + + bb[7]=2; + NSData *data = [[NSData alloc] initWithBytes:bb length:bblen]; + [_app.udp.udp sendData:data0 + toHost:@"2408:4003:10d1:8364:437c:392:f6c9:4ae7" + port:8368 + withTimeout:-1 + tag:0]; + [_app.udp.udp sendData:data + toHost:@"2408:4003:10d1:8364:437c:392:f6c9:4ae7" + port:8368 + withTimeout:-1 + tag:0]; + + _remote_ipv6 = [_app.talk getIpv6FromBtye:bb At:57]; + _remote_portv6 = [_app.talk getPortFromBtye:bb At:73]; + self.hitLabel.text = [[NSString alloc] initWithFormat:@"收到解析:%@:%d",_remote_ipv6,_remote_portv6]; + // [_app.udp.udp sendData:data0 + // toHost:_remote_ipv6 + // port:_remote_portv6 + // withTimeout:-1 + // tag:0]; + // [_app.udp.udp sendData:data0 + // toHost:_remote_ipv6 + // port:_remote_portv6 + // withTimeout:-1 + // tag:0]; + [[Pub getApp].udp senddataInThr:data0 toHost:_remote_ipv6 toPort:_remote_portv6 at:4 setTag:0]; + } + else{ + + if([_app.udp stopSend:@"" rr6:bb[6] rr8:bb[8]]>-1){ + + + _remote_ipv6 = [_app.talk getIpv6FromBtye:bb At:57]; + _remote_portv6 = [_app.talk getPortFromBtye:bb At:73]; + + self.hitLabel.text = [[NSString alloc] initWithFormat:@"%@\n解析成功:%@:%d" ,self.hitLabel.text,_remote_ipv6,_remote_portv6]; + + Byte bb[512]; + [_app.talk addHead:@"XXXCID" toByte:bb]; + bb[6]=150; + bb[7]=1; + bb[8]=142; + [_app.talk addEquid:[Pub getApp].sysinfo.equid addIp:[Pub getLocalIP] toByte:bb at:9]; + [_app.talk addEquid:[_app.talk getRemoteEqu] addIp:[_app.talk getRemoteIp] toByte:bb at:33]; + NSData *data = [[NSData alloc] initWithBytes:bb length:512]; + + [[Pub getApp].udp senddataInThr:data toHost:_remote_ipv6 toPort:_remote_portv6 at:3 setTag:0]; + } + } + + } + + + +} +-(void)Talk1{ + self.hitLabel.text = [[NSString alloc] initWithFormat:@"呼叫%@:%d",[_app.talk getRemoteIp],[_app.talk getRemotePort]]; + Byte bb[512]; + [_app.talk addHead:@"XXXCID" toByte:bb]; + bb[6]=150; + bb[7]=1; + bb[8]=142; + [_app.talk addEquid:[Pub getApp].sysinfo.equid addIp:[Pub getLocalIP] toByte:bb at:9]; + [_app.talk addEquid:[_app.talk getRemoteEqu] addIp:[_app.talk getRemoteIp] toByte:bb at:33]; + NSData *data = [[NSData alloc] initWithBytes:bb length:512]; + //[app senddataInThr:data toHost:remoteIp byPort:8302]; + + [[Pub getApp].udp senddataInThr:data toHost:[_app.talk getRemoteIp] toPort:[_app.talk getRemotePort] at:3 setTag:0]; + //[Pub getApp].udp senddataInThr:data toHost:self.remote_ipv6 toPort:self.remote_portv6 at:3 setTag:0]; +} + +- (void)GotCall:(Byte *)bb Len:(int)bblen Formip:(NSString *)ip fromport:(int)port { + if(bb[7]==1){ + [_app.udp stopSendDadong]; + self.hitLabel.text = [[NSString alloc] initWithFormat:@"%@\n被叫%@:%d",self.hitLabel.text,ip,port ]; + bb[7]=2; + NSData *data = [[NSData alloc] initWithBytes:bb length:bblen]; + [_app.udp.udp sendData:data + toHost:ip + port:port + withTimeout:-1 + tag:0]; + } + else{ + self.hitLabel.text = [[NSString alloc] initWithFormat:@"%@\n呼通%@:%d",self.hitLabel.text,ip,port ]; + [_app.udp stopSend:ip rr6:bb[6] rr8:bb[8]]; + } +} + + +- (void)GotDadong:(Byte *)bb Len:(int)bblen Formip:(NSString *)ip fromport:(int)port { + if([ip componentsSeparatedByString:@"."].count==4){ + self.hitLabel.text = [[NSString alloc] initWithFormat:@"%@\n被打洞(%d)%@:%d",self.hitLabel.text,bb[0],ip,port ]; + [_app.talk SetRemoteIp:ip]; + [_app.talk SetRemotePort:port ]; + if(bb[0]==0x30){ + bb[0] = 0x31; + NSData *data = [[NSData alloc] initWithBytes:bb length:bblen]; + [_app.udp.udp sendData:data + toHost:ip + port:port + withTimeout:-1 + tag:0]; + } + else{ + [self Talk1]; + } + } + else{ + self.hitLabel.text = [[NSString alloc] initWithFormat:@"%@\n被打洞%@:%d",self.hitLabel.text,ip,port ]; + _remote_ipv6 = ip; + _remote_portv6 = port; + [_app.udp ChgSendIp:ip rr6:150 rr8:142 Port:port]; + } + +} +- (void)Dadong1_wait{ + [NSThread detachNewThreadSelector:@selector(Dadong1_thr) toTarget:self withObject:nil]; +} +-(void)Dadong1_thr{ + sleep(2); + dispatch_async(dispatch_get_main_queue(), ^{//转到主线程处理 + + [self Dadong1]; + }); +} + +-(void)Dadong1{ + self.hitLabel.text = [[NSString alloc] initWithFormat:@"打洞%@:%d~%d",[_app.talk getRemoteIp],MAX(1000,[_app.talk getRemotePort]),MIN(65535,[_app.talk getRemotePort]+500)]; + Byte bb[1]; + bb[0]=0x30; + NSData *data = [[NSData alloc] initWithBytes:bb length:1]; + //[[Pub getApp].udp senddataInThr:data toHost:[_app.talk getRemoteIp] toPort:[_app.talk getRemotePort]+1 at:3 setTag:0]; +// [_app.udp.udp sendData:data +// toHost:self.remote_ipv6 +// +// port:800 +// withTimeout:-1 +// tag:0]; + for(int i= MAX(1000,[_app.talk getRemotePort]);i" Color:[UIColor grayColor] Size:15. Align:(NSTextAlignmentRight)]]; + + UIView *cell2 = [[UIView alloc] init]; + cell2.backgroundColor = [UIColor whiteColor]; + [cell2 addSubview:[UI NewLabel:@"对方环境" Color:[UIColor blackColor] Size:15. Align:(NSTextAlignmentLeft)]]; + [cell2 addSubview:[UI NewLabel:@">" Color:[UIColor grayColor] Size:15. Align:(NSTextAlignmentRight)]]; + + + UIView *cell3 = [[UIView alloc] init]; + cell3.backgroundColor = [UIColor whiteColor]; + [cell3 addSubview:[UI NewLabel:@"呼叫模式1" Color:[UIColor blackColor] Size:15. Align:(NSTextAlignmentLeft)]]; + [cell3 addSubview:[UI NewLabel:@">" Color:[UIColor grayColor] Size:15. Align:(NSTextAlignmentRight)]]; + + UIView *cell4 = [[UIView alloc] init]; + cell4.backgroundColor = [UIColor whiteColor]; + [cell4 addSubview:[UI NewLabel:@"打洞模式1" Color:[UIColor blackColor] Size:15. Align:(NSTextAlignmentLeft)]]; + [cell4 addSubview:[UI NewLabel:@">" Color:[UIColor grayColor] Size:15. Align:(NSTextAlignmentRight)]]; + + UIView *cell5 = [[UIView alloc] init]; + cell5.backgroundColor = [UIColor whiteColor]; + [cell5 addSubview:[UI NewLabel:@"网络环境2" Color:[UIColor blackColor] Size:15. Align:(NSTextAlignmentLeft)]]; + [cell5 addSubview:[UI NewLabel:@">" Color:[UIColor grayColor] Size:15. Align:(NSTextAlignmentRight)]]; + + UIView *cell6 = [[UIView alloc] init]; + cell6.backgroundColor = [UIColor whiteColor]; + [cell6 addSubview:[UI NewLabel:@"ipv4一键呼叫" Color:[UIColor blackColor] Size:15. Align:(NSTextAlignmentLeft)]]; + [cell6 addSubview:[UI NewLabel:@">" Color:[UIColor grayColor] Size:15. Align:(NSTextAlignmentRight)]]; + + UIView *cell7 = [[UIView alloc] init]; + cell7.backgroundColor = [UIColor whiteColor]; + [cell7 addSubview:[UI NewLabel:@"ipv6一键呼叫" Color:[UIColor blackColor] Size:15. Align:(NSTextAlignmentLeft)]]; + [cell7 addSubview:[UI NewLabel:@">" Color:[UIColor grayColor] Size:15. Align:(NSTextAlignmentRight)]]; + + _cells = @[cell1,cell2,cell3,cell4,cell5,cell6,cell7]; + } + return _cells; +} +- (UILabel *) hitLabel +{ + if (!_hitLabel) { + _hitLabel = [[UILabel alloc] init]; + //_webView.backgroundColor = [UIColor colorWithRed:241/255. green:241/255. blue:241/255. alpha:1]; + _hitLabel.font = [UIFont systemFontOfSize:13.0f]; + _hitLabel.textColor = [UIColor blackColor]; + _hitLabel.textAlignment = NSTextAlignmentLeft; + _hitLabel.text = NSLocalizedString(@"", nil); + _hitLabel.numberOfLines = 0; + } + return _hitLabel; +} + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/Setting.h b/star_lock/ios/Runner/XSTalkManager/NextPage/Setting.h new file mode 100755 index 00000000..c1a372e8 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/Setting.h @@ -0,0 +1,18 @@ +// +// FirstViewController.h +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import +#import "BaseViewController.h" +//#import "My.h" + +@interface Setting : BaseViewController + +//@property(nonatomic) My *parent; + +@end + diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/Setting.m b/star_lock/ios/Runner/XSTalkManager/NextPage/Setting.m new file mode 100755 index 00000000..8c6b1b3b --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/Setting.m @@ -0,0 +1,154 @@ +// +// FirstViewController.m +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import "Setting.h" +#import "UI.h" +#import "HttpManager.h" +#import "Msg.h" +#import "Pub.h" +#import "sysInfo.h" +#import "EquList.h" + +@interface Setting () + +@property (nonatomic, strong)UIView *rview; +@property (nonatomic, strong)NSArray *cells; +@end + +@implementation Setting + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. +// [self setNavTitle:@"系统设置"]; +// [self setupViews]; +// [self setUI]; +// [self setData]; +} +/* +- (void)setupViews +{ + + [self.view addSubview:self.rview]; + + for(int i=0;i +#import "BaseViewController.h" + +@interface Web : BaseViewController + + +@end + diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/Web.m b/star_lock/ios/Runner/XSTalkManager/NextPage/Web.m new file mode 100755 index 00000000..51f90402 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/Web.m @@ -0,0 +1,130 @@ +// +// FirstViewController.m +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import "Web.h" +#import "UI.h" +#import "HttpManager.h" +#import "Msg.h" +#import "Pub.h" +#import "sysInfo.h" +#import "EquList.h" +#import "HttpManager.h" + +@interface Web () + +@property (nonatomic, strong)UIView *rview; +@property (nonatomic, strong)UIScrollView *scrollView; +@property (nonatomic, strong)UILabel *webLabel; +@end + +@implementation Web + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. + + [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent; + self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:55/255. green:143/255. blue:232/255. alpha:1];//#378fe8 + self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent; + + [self setNavTitle:@"用户隐私协议"]; + [self setNavLeft:@"back" action:@selector(pageBack2)]; + [self setupViews]; + [self setUI]; + + [HttpManager loadPage:@"http://47.107.109.110/app/privacy1.aspx" HttpResultHandler:^(NSData * data) {// + //NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + //ret = [ret stringByAppendingFormat:@"



















"]; + + NSDictionary *options = @{ NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute :@(NSUTF8StringEncoding) }; + NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithData:data options:options documentAttributes:nil error:nil]; + + NSMutableParagraphStyle *para = [[NSMutableParagraphStyle alloc] init]; + para.lineSpacing = 7; + para.paragraphSpacing = 10; + [attStr addAttribute:NSParagraphStyleAttributeName value:para range:NSMakeRange(0, attStr.length)]; + + + self.webLabel.attributedText = attStr; + //NSLog(@"%@",self.webLabel.attributedText); + + CGRect desRect = [attStr boundingRectWithSize:CGSizeMake([UI getScreenWidth]-20, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin context:nil]; + self.scrollView.contentSize=CGSizeMake( [UI getScreenWidth],desRect.size.height + 100); + self.webLabel.frame = CGRectMake(10,0,[UI getScreenWidth]-20, desRect.size.height + 40); + }]; + +} +- (void)pageBack2{ + [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; +} +- (void)setupViews +{ + self.edgesForExtendedLayout = UIRectEdgeNone; + self.extendedLayoutIncludesOpaqueBars = NO; + self.modalPresentationCapturesStatusBarAppearance = NO; + self.automaticallyAdjustsScrollViewInsets = NO; + + [self.view addSubview:self.rview]; + [self.rview addSubview:self.scrollView]; + [self.scrollView addSubview:self.webLabel]; + + +} +- (void)setUI{ + + + + [UI SetRView:self.rview Top:@"0" Right:@"0" Bottom:@"0" Left:@"0"]; + + //self.scrollView.contentSize=CGSizeMake( [UI getScreenWidth],4000); + //self.webLabel.frame = CGRectMake(0,0,[UI getScreenWidth], 4000); + + +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +#pragma mark Property Accessors +- (UIView *)rview +{ + if (!_rview) { + _rview = [[UIView alloc] init]; + _rview.backgroundColor = [UIColor colorWithRed:241/255. green:241/255. blue:241/255. alpha:1]; + } + return _rview; +} + + +- (UIScrollView *)scrollView{ + if(!_scrollView){ + _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, [UI getScreenWidth], [UI getScreenHeight])]; + _scrollView.pagingEnabled = NO; + _scrollView.showsHorizontalScrollIndicator = NO; + _scrollView.showsVerticalScrollIndicator = YES; + _scrollView.delegate = self; + } + return _scrollView; +} +- (UILabel *)webLabel +{ + if (!_webLabel) { + _webLabel = [[UILabel alloc] init]; + //_webView.backgroundColor = [UIColor colorWithRed:241/255. green:241/255. blue:241/255. alpha:1]; + _webLabel.font = [UIFont systemFontOfSize:13.0f]; + _webLabel.textColor = [UIColor blackColor]; + _webLabel.textAlignment = NSTextAlignmentLeft; + _webLabel.text = NSLocalizedString(@"", nil); + _webLabel.numberOfLines = 0; + } + return _webLabel; +} + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/WifiList.h b/star_lock/ios/Runner/XSTalkManager/NextPage/WifiList.h new file mode 100755 index 00000000..46fe36d0 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/WifiList.h @@ -0,0 +1,16 @@ +// +// FirstViewController.h +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import +#import "BaseTableViewController.h" + +@interface WifiList : BaseTableViewController + +- (void)setData; +@end + diff --git a/star_lock/ios/Runner/XSTalkManager/NextPage/WifiList.m b/star_lock/ios/Runner/XSTalkManager/NextPage/WifiList.m new file mode 100755 index 00000000..521c29c6 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/NextPage/WifiList.m @@ -0,0 +1,130 @@ +// +// FirstViewController.m +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import "WifiList.h" +#import "UI.h" +#import "HttpManager.h" +#import "Msg.h" +#import "Pub.h" +#import "sysInfo.h" +//#import "EquListCell.h" +#import "Opendoor.h" +#import "EquAdd.h" +#import "EquConfig.h" + +@interface WifiList () +@property (nonatomic, strong)UIView *rview; + +@end + +@implementation WifiList +NSMutableArray *_dataArray; + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. +// [self setNavTitle:@"选择WIFI"]; +// [self setUI]; +// [self setData]; +} +/* +- (void)setData{ + _dataArray = [[NSMutableArray alloc] initWithCapacity:0]; + [_dataArray addObjectsFromArray:[Opendoor getEqulist]]; + [self.tableView reloadData]; + +} +- (void)setUI{ + + + + self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 70, [UI getScreenWidth], [UI getScreenHeight]-60) style:UITableViewStylePlain]; + [self.tableView registerClass:[EquListCell class] forCellReuseIdentifier:@"EquListCell"]; + self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + self.tableView.delegate = self; + self.tableView.dataSource = self; + + NSLog(@"table:%f,%f,%f,%f",self.tableView.frame.origin.x,self.tableView.frame.origin.y,self.tableView.frame.size.width,self.tableView.frame.size.height); + + +} + +- (void)AddEqu{ + EquAdd *equadd = [[EquAdd alloc] init]; + equadd.parent = self; + [self.navigationController pushViewController:equadd animated:YES]; +} + +#pragma mark 返回分组数 +-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ + //NSLog(@"计算分组数"); + return 1; +} + +#pragma mark 返回每组行数 +-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ + //NSLog(@"计算每组(组%li)行数",(long)section); + return _dataArray.count; +} + +- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + return 60; +} +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + NSLog(@"cellForRowAtIndexPath:%ld",indexPath.row); + //EquListCell *cell = [tableView dequeueReusableCellWithIdentifier:@"EquListCell" forIndexPath:indexPath]; + EquListCell *cell = [tableView dequeueReusableCellWithIdentifier:@"EquListCell"]; + + if (cell == nil) { + cell = [[EquListCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"EquListCell"]; + } + if(indexPath.row<_dataArray.count){ + cell.titleLabel.text = [_dataArray[indexPath.row] valueForKey:@"name"]; + cell.contentLabel.text = [_dataArray[indexPath.row] valueForKey:@"equid"]; + } + + +// if (indexPath.row == self.timeListenData.count - 1) { +// [tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; +// } + return cell; +} +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + //NSLog(@"didSelectRowAtIndexPath:%ld",indexPath.row); + if(indexPath.row<_dataArray.count){ + NSArray * options = @[@"命名设备",@"配置网关",@"删除"]; + + [Msg Select:self SourceView:[tableView cellForRowAtIndexPath:indexPath] Title:@"请选择" Options:options SelectedHandler:^(int index) { + if(index==0){ + EquAdd *equadd = [[EquAdd alloc] init]; + equadd.parent = self; + equadd.equid = [_dataArray[indexPath.row] valueForKey:@"equid"]; + equadd.name = [_dataArray[indexPath.row] valueForKey:@"name"]; + [self.navigationController pushViewController:equadd animated:YES]; + } + else if(index==1){ + + EquConfig *equconfig = [[EquConfig alloc] init]; + [self.navigationController pushViewController:equconfig animated:YES]; + } + else if(index==2){ + + } + }]; + } + +} +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} +*/ + + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/HttpManager.h b/star_lock/ios/Runner/XSTalkManager/Utils/HttpManager.h new file mode 100755 index 00000000..dc927c4e --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/HttpManager.h @@ -0,0 +1,26 @@ +// +// HttpManager.h +// myhome +// +// Created by hkh on 16/11/6. +// +#import + + +@interface HttpManager: NSObject ++ (void)SendSmsCode:(NSString *)username HttpResultHandler:(void (^)(NSDictionary *json)) handler; ++ (void)Login:(NSString *)username Code:(NSString *)code HttpResultHandler:(void (^)(NSDictionary *json)) handler; ++ (void)CheckLoginStatu:(NSString *)username Token:(NSString *)token HttpResultHandler:(void (^)(NSDictionary *json)) handler; ++ (void)BindEquSucc:(NSString *)username Token:(NSString *)token Equid:(NSString *)equid Name:(NSString *)name HttpResultHandler:(void (^)(NSDictionary *json)) handler; ++ (void)EquList:(NSString *)username Token:(NSString *)token HttpResultHandler:(void (^)(NSDictionary *json)) handler; ++ (void)DelEqu:(NSString *)username Token:(NSString *)token Equid:(NSString *)equid HttpResultHandler:(void (^)(NSDictionary *json)) handler; ++ (void)Gzh_Qrcode:(NSString *)username Token:(NSString *)token HttpResultHandler:(void (^)(NSDictionary *json)) handler; ++ (void)HasBindGzh:(NSString *)username Token:(NSString *)token HttpResultHandler:(void (^)(NSDictionary *json)) handler; ++ (void)UnbindGzh:(NSString *)username Token:(NSString *)token HttpResultHandler:(void (^)(NSDictionary *json)) handler; ++ (void)GetLatestVersionCode:(NSString *)username Token:(NSString *)token HttpResultHandler:(void (^)(NSDictionary *json)) handler; ++ (void)UpPhoto:(NSString *)username Token:(NSString *)token Equid:(NSString *)equid Imgdata:(NSData*) data HttpResultHandler:(void (^)(NSDictionary *json)) handler; ++ (void)getPhotos:(NSString *)username Token:(NSString *)token Equid:(NSString *)equid HttpResultHandler:(void (^)(NSDictionary *json)) handler; ++ (void)delPhoto:(NSString *)username Token:(NSString *)token No:(NSString *)no HttpResultHandler:(void (^)(NSDictionary *json)) handler; ++ (void)postPushkitToken:(NSString *)username Token:(NSString *)token PushkitToken:(NSString *)pushkitToken Push:(NSString *)push IsSandbox:(NSString *)sandbox HttpResultHandler:(void (^)(NSDictionary *json)) handler; ++ (void)loadPage:(NSString *)url HttpResultHandler:(void (^)(NSData * data)) handler; +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/HttpManager.m b/star_lock/ios/Runner/XSTalkManager/Utils/HttpManager.m new file mode 100755 index 00000000..dc549c1a --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/HttpManager.m @@ -0,0 +1,310 @@ +// +// HttpManager.m +// myhome +// +// Created by hkh on 16/11/6. +// + +#import "HttpManager.h" +#import "Pub.h" +#import "Sformat.h" +#define Share_AppDelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate]) +@interface HttpManager (){ +} + + +@end +@implementation HttpManager{ + +} + ++ (NSString *)InitUrl{ + NSString *url = [@"http://" stringByAppendingString:[Pub getSysInfo].server_wan]; + url = [url stringByAppendingString:@"/TalkApp/api.aspx"]; + return url; +} ++ (void)SendSmsCode:(NSString *)username HttpResultHandler:(void (^)(NSDictionary *json)) handler{ + NSMutableDictionary *paramDic = [NSMutableDictionary dictionary]; + [paramDic setObject:@"SendSmsCode" forKey:@"op"]; + [paramDic setObject:username forKey:@"username"]; + paramDic = [self AddSign:paramDic WithKey:[[NSString alloc] initWithFormat:@"talkapp%@",[Sformat yyyy_MM_dd]] Field:@[@"op",@"username"]]; + [self Post:[self InitUrl] WithData:paramDic HttpResultHandler:handler]; +} ++ (void)Login:(NSString *)username Code:(NSString *)code HttpResultHandler:(void (^)(NSDictionary *json)) handler{ + + NSMutableDictionary *paramDic = [NSMutableDictionary dictionary]; + [paramDic setObject:@"Login" forKey:@"op"]; + [paramDic setObject:username forKey:@"username"]; + [paramDic setObject:code forKey:@"code"]; + paramDic = [self AddSign:paramDic WithKey:[[NSString alloc] initWithFormat:@"talkapp%@",[Sformat yyyy_MM_dd]] Field:@[@"op",@"username",@"code"]]; + + + +// [self Post:url WithData:paramDic completionHandler:^(NSURLResponse * response, NSData * data, NSError * connectionError) { +// NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; +// NSLog(@"%@",ret); +// +// }]; + [self Post:[self InitUrl] WithData:paramDic HttpResultHandler:handler]; + +} + ++ (void)CheckLoginStatu:(NSString *)username Token:(NSString *)token HttpResultHandler:(void (^)(NSDictionary *json)) handler{ + + NSMutableDictionary *paramDic = [NSMutableDictionary dictionary]; + [paramDic setObject:@"CheckLoginStatu" forKey:@"op"]; + [paramDic setObject:username forKey:@"username"]; + [paramDic setObject:token forKey:@"token"]; + paramDic = [self AddSign:paramDic WithKey:[[NSString alloc] initWithFormat:@"talkapp%@",[Sformat yyyy_MM_dd]] Field:@[@"op",@"username",@"token"]]; + + + [self Post:[self InitUrl] WithData:paramDic HttpResultHandler:handler]; + +} ++ (void)BindEquSucc:(NSString *)username Token:(NSString *)token Equid:(NSString *)equid Name:(NSString *)name HttpResultHandler:(void (^)(NSDictionary *json)) handler{ + //NSString *name_encode = [name stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + //解码 stringByReplacingPercentEscapesUsingEncoding + + NSMutableDictionary *paramDic = [NSMutableDictionary dictionary]; + + [paramDic setValue:@"BindEquSucc" forKey:@"op"]; + [paramDic setValue:username forKey:@"username"]; + [paramDic setValue:token forKey:@"token"]; + [paramDic setValue:equid forKey:@"equid"]; + [paramDic setValue:name forKey:@"name"]; + paramDic = [self AddSign:paramDic WithKey:[[NSString alloc] initWithFormat:@"talkapp%@",[Sformat yyyy_MM_dd]] Field:@[@"op",@"username",@"token",@"equid",@"name"]]; + + + [self Post:[self InitUrl] WithData:paramDic HttpResultHandler:handler]; + +} ++ (void)EquList:(NSString *)username Token:(NSString *)token HttpResultHandler:(void (^)(NSDictionary *json)) handler{ + + NSMutableDictionary *paramDic = [NSMutableDictionary dictionary]; + [paramDic setObject:@"EquList" forKey:@"op"]; + [paramDic setObject:username forKey:@"username"]; + [paramDic setObject:token forKey:@"token"]; + + paramDic = [self AddSign:paramDic WithKey:[[NSString alloc] initWithFormat:@"talkapp%@",[Sformat yyyy_MM_dd]] Field:@[@"op",@"username",@"token"]]; + + + [self Post:[self InitUrl] WithData:paramDic HttpResultHandler:handler]; + +} ++ (void)DelEqu:(NSString *)username Token:(NSString *)token Equid:(NSString *)equid HttpResultHandler:(void (^)(NSDictionary *json)) handler{ + + NSMutableDictionary *paramDic = [NSMutableDictionary dictionary]; + [paramDic setObject:@"DelEqu" forKey:@"op"]; + [paramDic setObject:username forKey:@"username"]; + [paramDic setObject:token forKey:@"token"]; + [paramDic setObject:equid forKey:@"equid"]; + paramDic = [self AddSign:paramDic WithKey:[[NSString alloc] initWithFormat:@"talkapp%@",[Sformat yyyy_MM_dd]] Field:@[@"op",@"username",@"token",@"equid"]]; + + + [self Post:[self InitUrl] WithData:paramDic HttpResultHandler:handler]; + +} ++ (void)Gzh_Qrcode:(NSString *)username Token:(NSString *)token HttpResultHandler:(void (^)(NSDictionary *json)) handler{ + + NSMutableDictionary *paramDic = [NSMutableDictionary dictionary]; + [paramDic setObject:@"Gzh_Qrcode" forKey:@"op"]; + [paramDic setObject:username forKey:@"username"]; + [paramDic setObject:token forKey:@"token"]; + paramDic = [self AddSign:paramDic WithKey:[[NSString alloc] initWithFormat:@"talkapp%@",[Sformat yyyy_MM_dd]] Field:@[@"op",@"username",@"token"]]; + + + [self Post:[self InitUrl] WithData:paramDic HttpResultHandler:handler]; + +} ++ (void)HasBindGzh:(NSString *)username Token:(NSString *)token HttpResultHandler:(void (^)(NSDictionary *json)) handler{ + + NSMutableDictionary *paramDic = [NSMutableDictionary dictionary]; + [paramDic setObject:@"HasBindGzh" forKey:@"op"]; + [paramDic setObject:username forKey:@"username"]; + [paramDic setObject:token forKey:@"token"]; + paramDic = [self AddSign:paramDic WithKey:[[NSString alloc] initWithFormat:@"talkapp%@",[Sformat yyyy_MM_dd]] Field:@[@"op",@"username",@"token"]]; + + + [self Post:[self InitUrl] WithData:paramDic HttpResultHandler:handler]; + +} ++ (void)UnbindGzh:(NSString *)username Token:(NSString *)token HttpResultHandler:(void (^)(NSDictionary *json)) handler{ + + NSMutableDictionary *paramDic = [NSMutableDictionary dictionary]; + [paramDic setObject:@"UnbindGzh" forKey:@"op"]; + [paramDic setObject:username forKey:@"username"]; + [paramDic setObject:token forKey:@"token"]; + paramDic = [self AddSign:paramDic WithKey:[[NSString alloc] initWithFormat:@"talkapp%@",[Sformat yyyy_MM_dd]] Field:@[@"op",@"username",@"token"]]; + + + [self Post:[self InitUrl] WithData:paramDic HttpResultHandler:handler]; + +} + ++ (void)GetLatestVersionCode:(NSString *)username Token:(NSString *)token HttpResultHandler:(void (^)(NSDictionary *json)) handler{ + + NSMutableDictionary *paramDic = [NSMutableDictionary dictionary]; + [paramDic setObject:@"GetLatestVersionCode" forKey:@"op"]; + [paramDic setObject:username forKey:@"username"]; + [paramDic setObject:token forKey:@"token"]; + paramDic = [self AddSign:paramDic WithKey:[[NSString alloc] initWithFormat:@"talkapp%@",[Sformat yyyy_MM_dd]] Field:@[@"op",@"username",@"token"]]; + + + [self Post:[self InitUrl] WithData:paramDic HttpResultHandler:handler]; + +} ++ (void)UpPhoto:(NSString *)username Token:(NSString *)token Equid:(NSString *)equid Imgdata:(NSData*) data HttpResultHandler:(void (^)(NSDictionary *json)) handler{ + + NSMutableDictionary *paramDic = [NSMutableDictionary dictionary]; + [paramDic setObject:@"UpPhoto" forKey:@"op"]; + [paramDic setObject:username forKey:@"username"]; + [paramDic setObject:token forKey:@"token"]; + [paramDic setObject:equid forKey:@"equid"]; + + NSData *data1 = [data base64EncodedDataWithOptions:(0)]; + NSString * imgdata = [[NSString alloc] initWithData:data1 encoding:NSUTF8StringEncoding]; + + [paramDic setObject:imgdata forKey:@"imgdata"]; + paramDic = [self AddSign:paramDic WithKey:[[NSString alloc] initWithFormat:@"talkapp%@",[Sformat yyyy_MM_dd]] Field:@[@"op",@"username",@"token",@"equid",@"imgdata"]]; + + + [self Post:[self InitUrl] WithData:paramDic HttpResultHandler:handler]; + +} ++ (void)delPhoto:(NSString *)username Token:(NSString *)token No:(NSString *)no HttpResultHandler:(void (^)(NSDictionary *json)) handler{ + + + NSMutableDictionary *paramDic = [NSMutableDictionary dictionary]; + [paramDic setObject:@"delPhoto" forKey:@"op"]; + [paramDic setObject:username forKey:@"username"]; + [paramDic setObject:token forKey:@"token"]; + [paramDic setObject:no forKey:@"no"]; + + paramDic = [self AddSign:paramDic WithKey:[[NSString alloc] initWithFormat:@"talkapp%@",[Sformat yyyy_MM_dd]] Field:@[@"op",@"username",@"token",@"no"]]; + + + [self Post:[self InitUrl] WithData:paramDic HttpResultHandler:handler]; + +} + ++ (void)getPhotos:(NSString *)username Token:(NSString *)token Equid:(NSString *)equid HttpResultHandler:(void (^)(NSDictionary *json)) handler{ + + NSMutableDictionary *paramDic = [NSMutableDictionary dictionary]; + [paramDic setObject:@"getPhotos" forKey:@"op"]; + [paramDic setObject:username forKey:@"username"]; + [paramDic setObject:token forKey:@"token"]; + [paramDic setObject:equid forKey:@"equid"]; + paramDic = [self AddSign:paramDic WithKey:[[NSString alloc] initWithFormat:@"talkapp%@",[Sformat yyyy_MM_dd]] Field:@[@"op",@"username",@"token",@"equid"]]; + + + [self Post:[self InitUrl] WithData:paramDic HttpResultHandler:handler]; + +} + ++ (void)postPushkitToken:(NSString *)username Token:(NSString *)token PushkitToken:(NSString *)pushkitToken Push:(NSString *)push IsSandbox:(NSString *)sandbox HttpResultHandler:(void (^)(NSDictionary *json)) handler{ + + NSMutableDictionary *paramDic = [NSMutableDictionary dictionary]; + [paramDic setObject:@"postPushkitToken" forKey:@"op"]; + [paramDic setObject:username forKey:@"username"]; + [paramDic setObject:token forKey:@"token"]; + [paramDic setObject:pushkitToken forKey:@"pushkitToken"]; + [paramDic setObject:push forKey:@"push"]; + [paramDic setObject:sandbox forKey:@"sandbox"]; + paramDic = [self AddSign:paramDic WithKey:[[NSString alloc] initWithFormat:@"talkapp%@",[Sformat yyyy_MM_dd]] Field:@[@"op",@"username",@"token",@"pushkitToken"]]; + + + [self Post:[self InitUrl] WithData:paramDic HttpResultHandler:handler]; + +} + ++ (void)loadPage:(NSString *)url HttpResultHandler:(void (^)(NSData * data)) handler{ + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; + request.HTTPMethod = @"POST"; + NSString *body = @"ios=1"; + + [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]]; + [NSURLConnection sendAsynchronousRequest:request queue: [[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * response, NSData * data, NSError * connectionError) { + //NSLog(@"ret :%@",connectionError); + dispatch_async(dispatch_get_main_queue(), ^{//转到主线程处理 + //[Msg Alert:self Msg:ret]; + //NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + handler(data); + }); + }]; +} + + + ++(NSMutableDictionary *)AddSign:(NSMutableDictionary *)paramDic WithKey:(NSString *) key Field:(NSArray *)field{ + NSString *str4sign = @""; +// for(id key in paramDic){ +// str4sign = [str4sign stringByAppendingString:key]; +// str4sign = [str4sign stringByAppendingString:[paramDic objectForKey:key] ]; +// } + for(id item in field){ + //NSLog(@"AddSign:item=%@",item); + //NSLog(@"AddSign:value=%@",[paramDic objectForKey:item] ); + str4sign = [str4sign stringByAppendingString:item]; + str4sign = [str4sign stringByAppendingString:[paramDic objectForKey:item] ]; + } + str4sign = [str4sign stringByAppendingString:key]; + //NSLog(@"AddSign:%@",str4sign); + [paramDic setObject:[Pub md5_:str4sign] forKey:@"sign"]; + return paramDic; +} + ++ (void)Post:(NSString *)url WithData:(NSMutableDictionary *)paramDic HttpResultHandler:(void (^)(NSDictionary *json)) handler { + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; + request.HTTPMethod = @"POST"; + + NSString *body = @"ios=1"; + NSString *str4sign = @""; + for(id key in paramDic){ + body = [body stringByAppendingString:[[NSString alloc] initWithFormat:@"&%@=",key]]; + body = [body stringByAppendingString:[paramDic objectForKey:key] ]; + } + [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]]; + //NSLog(@"body :%@",body); + if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) { + //NSLog(@"systemVersion :%f",[[UIDevice currentDevice].systemVersion floatValue]); + + NSURLSession *session = [NSURLSession sharedSession]; + NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request + completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) + { + //NSLog(@"ret :%@",error); + dispatch_async(dispatch_get_main_queue(), ^{//转到主线程处理 + //[Msg Alert:self Msg:ret]; + NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + //NSLog(@"ret :%@",ret); + NSDictionary * json = [Pub DictionaryWithJsonString:ret]; + if(!json){ + json = [Pub DictionaryWithJsonString:@"{\"result\":\"网络异常\"}"]; + } + handler(json); + }); + }]; + [dataTask resume]; + + } + else{ + //[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:handler]; + [NSURLConnection sendAsynchronousRequest:request queue: [[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * response, NSData * data, NSError * connectionError) { + //NSLog(@"ret :%@",connectionError); + dispatch_async(dispatch_get_main_queue(), ^{//转到主线程处理 + //[Msg Alert:self Msg:ret]; + NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + //NSLog(@"ret :%@",ret); + NSDictionary * json = [Pub DictionaryWithJsonString:ret]; + if(!json){ + json = [Pub DictionaryWithJsonString:@"{\"result\":\"网络异常\"}"]; + } + handler(json); + }); + }]; + } + + +} + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/Msg.h b/star_lock/ios/Runner/XSTalkManager/Utils/Msg.h new file mode 100755 index 00000000..8ca1818b --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/Msg.h @@ -0,0 +1,17 @@ +// +// HttpManager.h +// myhome +// +// Created by hkh on 16/11/6. +// +#import +#import + +@interface Msg: NSObject ++ (void)alert:(NSString *)msg; ++ (void)Alert:(UIViewController *)page Msg:(NSString *)msg; ++ (UIAlertController *)Waiting:(UIViewController *)page Msg:(NSString *)msg SelectedHandler:(void (^)(void)) handler; ++ (void)MessageBox:(UIViewController *)page Msg:(NSString *)msg SelectedHandler:(void (^)(int index)) handler; ++ (UIAlertController *)OpendoorByPwd:(UIViewController *)page SelectedHandler:(void (^)(int index)) handler ; ++ (void)Select:(UIViewController *)page SourceView:(UIView *)view Title:(NSString *)title Options:(NSArray *)arr SelectedHandler:(void (^)(int index)) handler; +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/Msg.m b/star_lock/ios/Runner/XSTalkManager/Utils/Msg.m new file mode 100755 index 00000000..596cc83b --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/Msg.m @@ -0,0 +1,152 @@ +// +// HttpManager.m +// myhome +// +// Created by hkh on 16/11/6. +// + +#import "Msg.h" +#import "Pub.h" +//#import "HKHTextField.h" +#import "BaseViewController.h" +#import "OpenPwd.h" +#import "UI.h" + + +@interface Msg (){ +} + + +@end +@implementation Msg{ + +} ++ (void)alert:(NSString *)msg{ + @try + { + + if([@"MainTabBar" isEqualToString:NSStringFromClass([[Pub getApp].window.rootViewController class])]){ + UITabBarController *tab = (UITabBarController *)[Pub getApp].window.rootViewController; + UINavigationController *nav = tab.viewControllers[tab.selectedIndex]; + BaseViewController *v = (BaseViewController *)nav.viewControllers[nav.viewControllers.count-1]; + [v alert:msg]; + + + } + + } @catch (NSException * e) { + NSLog(@"%@",e); + } + +} ++ (void)Alert:(UIViewController *)page Msg:(NSString *)msg{ + UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提⽰" message:msg preferredStyle:UIAlertControllerStyleAlert]; + UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { + + NSLog(@"无需处理"); + }]; + [alertController addAction:okAction]; + [page presentViewController:alertController animated:YES completion:nil]; +} + + ++ (UIAlertController *)Waiting:(UIViewController *)page Msg:(NSString *)msg SelectedHandler:(void (^)(void)) handler { + UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提⽰" message:msg preferredStyle:UIAlertControllerStyleAlert]; + UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { + + if(handler)handler(); + }]; + [alertController addAction:cancelAction]; + [page presentViewController:alertController animated:YES completion:nil]; + return alertController; +} + ++ (void)MessageBox:(UIViewController *)page Msg:(NSString *)msg SelectedHandler:(void (^)(int index)) handler { + UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提⽰" message:msg preferredStyle:UIAlertControllerStyleAlert]; + UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]; + UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { + handler(1); + NSLog(@"确定"); + }]; + [alertController addAction:cancelAction]; + [alertController addAction:okAction]; + [page presentViewController:alertController animated:YES completion:nil]; +} ++ (UIAlertController *)OpendoorByPwd:(UIViewController *)page SelectedHandler:(void (^)(int index)) handler { + UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"请输入开门密码" message:@"\n\n\n" preferredStyle:UIAlertControllerStyleAlert]; + UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]; + UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { + handler(1); + NSLog(@"确定"); + }]; + [alertController addAction:cancelAction]; + [alertController addAction:okAction]; + + OpenPwd *open = [[OpenPwd alloc] init]; + open.parent = page; + [alertController addChildViewController:open]; + [alertController.view addSubview:open.view]; + open.view.frame = CGRectMake(0, 50, 270, 50); + [open setUI]; + + + [page presentViewController:alertController animated:YES completion:^{ + [open focusTextField]; + }]; + //[alertController dismissViewControllerAnimated:YES completion:nil]; + return alertController; +} + ++ (void)Select:(UIViewController *)page SourceView:(UIView *)view Title:(NSString *)title Options:(NSArray *)arr SelectedHandler:(void (^)(int index)) handler { + + UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:title message:nil preferredStyle:UIAlertControllerStyleActionSheet]; + NSLog(@"Select1"); + actionSheet.popoverPresentationController.sourceView = page.view; + NSLog(@"Select2"); + @try + { + actionSheet.popoverPresentationController.sourceRect = CGRectMake(view.frame.origin.x + (view.frame.size.width-200)/2, view.frame.origin.y + 50, 200, 100); + + } @catch (NSException * e) { + actionSheet.popoverPresentationController.sourceRect = CGRectMake([UI getScreenWidth] - 200, 0, 200, 100); + } + + //actionSheet.popoverPresentationController.sourceRect = page.view.frame; + NSLog(@"Select3"); + for (int i=0;i +#import "sysinfo.h" +#include +#include +#include // Per msqr +#include +#import +#import +#import +#import +#import "AppDelegate.h" +#import "BaseNavigationController.h" + +#ifndef Talk_Pub_h +#define Talk_Pub_h + + + +#endif + +@interface Pub: NSObject ++ (AppDelegate *)getApp; ++ (sysInfo *)getSysInfo; ++ (NSString *)MD5:(NSString *)input; ++ (NSString *)md5_:(NSString *)input; ++ (NSDictionary *)DictionaryWithJsonString:(NSString *)jsonString; ++ (BaseNavigationController *)getNav; ++ (void)addHead:(NSString *)head toByte:(Byte *)bb; ++ (void)addEquid:(NSString *)equId toByte:(Byte *)bb at:(int)pos; ++ (int)getBBlen:(Byte *)bb Len:(int)len; ++ (int)addGKB:(NSString *)equId toByte:(Byte *)bb at:(int)pos; ++ (void)addIp:(NSString *)ip toByte:(Byte *)bb at:(int)pos; ++ (void)addMac:(NSString *)mac toByte:(Byte *)bb at:(int)pos; ++ (void)addInt:(int)port toByte:(Byte *)bb at:(int)pos; ++ (void)addShort:(int)port toByte:(Byte *)bb at:(int)pos; ++ (short)getShortFromByte:(Byte *)bb at:(int)pos; ++ (int)Ox:(NSString *)v; ++ (NSString *)getLocalIP; ++ (NSString *)getMac; ++ (NSString *)getEquidFrombb:(Byte *)bb at:(int)pos; ++ (NSString *)NSdata2String:(NSData *)data; ++ (NSData *)AES128_Encrypt:(NSString *)key encryptData:(NSData *)data; ++ (NSData *)AES128_Decrypt:(NSString *)key encryptData:(NSData *)data; +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/Pub.m b/star_lock/ios/Runner/XSTalkManager/Utils/Pub.m new file mode 100755 index 00000000..ead2d138 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/Pub.m @@ -0,0 +1,356 @@ +// +// HttpManager.m +// myhome +// +// Created by hkh on 16/11/6. +// + +#import "Pub.h" +#import + +@interface Pub (){ +} + + +@end +@implementation Pub{ + +} ++ (AppDelegate *)getApp{ + AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication]delegate]; + return app; +} ++ (sysInfo *)getSysInfo{ + AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication]delegate]; + return app.sysinfo; +} ++ (BaseNavigationController*)getNav{ + UITabBarController *tab = (UITabBarController *)[Pub getApp].window.rootViewController; + if(tab){ + UINavigationController *nav = tab.viewControllers[tab.selectedIndex]; + return nav; + } + return nil; +} + ++ (NSString *)MD5:(NSString *)input //大写 +{ + const char *cStr = [input UTF8String]; + unsigned char digest[16]; + CC_MD5( cStr, (CC_LONG)strlen(cStr), digest ); // This is the md5 call + + NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; + + for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) + [output appendFormat:@"%02X", digest[i]]; + + return output; +} + ++ (NSString *)md5_:(NSString *)input //大写 +{ + const char *cStr = [input UTF8String]; + unsigned char digest[16]; + CC_MD5( cStr, (CC_LONG)strlen(cStr), digest ); // This is the md5 call + + NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; + + for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) + [output appendFormat:@"%02x", digest[i]]; + + return output; +} + ++ (NSDictionary *)DictionaryWithJsonString:(NSString *)jsonString { + if (jsonString == nil) { return nil; } + NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; + NSError *err; + NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err]; + if(err) { + NSLog(@"json解析失败:%@",err); + return nil; + } + return dic; +} + ++ (void)addHead:(NSString *)head toByte:(Byte *)bb +{ + Byte *tempbb; + NSString *tempS; + NSData *tempData; + tempS = @"XXXCID"; + tempData = [tempS dataUsingEncoding:NSUTF8StringEncoding]; + tempbb = (Byte *)[tempData bytes]; + memcpy(bb, tempbb, 6); +} + ++ (void)addEquid:(NSString *)equId toByte:(Byte *)bb at:(int)pos +{ + Byte *tempbb; + NSString *tempS; + NSData *tempData; + //本地 + tempS = equId; + tempData = [tempS dataUsingEncoding:NSUTF8StringEncoding]; + tempbb = (Byte *)[tempData bytes]; + memcpy(bb+pos, tempbb, [tempData length]); + for (int i=(int)[tempData length]; i<20; i++){ + bb[i+pos] = 0; + } +} + ++ (int)getBBlen:(Byte *)bb Len:(int)len{ + for(int i=0; i> 24); + bb[pos+2] = (Byte)((port & 0x00FF0000) >> 16); + bb[pos+1] = (Byte)((port & 0x0000FF00) >> 8); + bb[pos] = (Byte)((port & 0x000000FF) ); + +} ++ (void)addShort:(int)port toByte:(Byte *)bb at:(int)pos +{ + bb[pos+1] = (Byte)((port & 0x0000FF00) >> 8); + bb[pos] = (Byte)((port & 0x000000FF) ); + +} ++ (short)getShortFromByte:(Byte *)bb at:(int)pos +{ + return bb[pos] + bb[pos+1]*256; +} + ++ (int)Ox:(NSString *)v +{ + int n = 0; + int p = 0; + NSString *s; + for (int i=0; iifa_addr->sa_family == AF_INET) { + // Check if interface is en0 which is the wifi connection on the iPhone + if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) { + // Get NSString from C String + address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]; + } + } + temp_addr = temp_addr->ifa_next; + } + } + // Free memory + freeifaddrs(interfaces); + [Pub getApp].sysinfo.equip = address; + }); + return [Pub getApp].sysinfo.equip; + +} + +//针对ipv6网络环境下适配,ipv4环境直接使用原来的地址 + ++ (NSString *)getMac +{ + int mib[6]; + size_t len; + char *buf; + unsigned char *ptr; + struct if_msghdr *ifm; + struct sockaddr_dl *sdl; + + mib[0] = CTL_NET; + mib[1] = AF_ROUTE; + mib[2] = 0; + mib[3] = AF_LINK; + mib[4] = NET_RT_IFLIST; + + if ((mib[5] = if_nametoindex("en0")) == 0) { + printf("Error: if_nametoindex error/n"); + return NULL; + } + if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) { + printf("Error: sysctl, take 1/n"); + return NULL; + } + buf = malloc(len); + if (buf == NULL) { + printf("Could not allocate memory. error!/n"); + return NULL; + } + if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) { + //printf("Error: sysctl, take 2"); + free(buf); + return NULL; + } + ifm = (struct if_msghdr *)buf; + sdl = (struct sockaddr_dl *)(ifm + 1); + ptr = (unsigned char *)LLADDR(sdl); + NSString *outstring = [NSString stringWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)]; + free(buf); + return [outstring uppercaseString]; +} ++ (NSString *)getEquidFrombb:(Byte *)bb at:(int)pos { + NSString *equid = nil; + int equlen=8; + if (bb[pos]==77) {//M + equlen=8; + } + else if(bb[pos]==87) {//W + equlen=5; + } + else if(bb[pos]==72){//H + equlen=12; + } + else if(bb[pos]==83){//S + equlen=12; + } + else if(bb[pos]==0x50){//P + equlen=12; + } + else if(bb[pos]==0x54){//T + equlen=16; + } + else{ + equlen=12; + } + + Byte tempbb[equlen]; + memcpy(tempbb, bb+pos, equlen); + NSData *aadata = [[NSData alloc] initWithBytes:tempbb length:equlen]; + NSStringEncoding gbkEncoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); + equid = [[NSString alloc] initWithData:aadata encoding:gbkEncoding]; + return equid; +} ++ (NSString *)NSdata2String:(NSData *)data{ + NSStringEncoding gbkEncoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); + return [[NSString alloc] initWithData:data encoding:gbkEncoding]; +} ++ (NSData *)AES128_Encrypt:(NSString *)key encryptData:(NSData *)data{ + + char keyPtr[kCCKeySizeAES128+1]; + bzero(keyPtr, sizeof(keyPtr)); + [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; + + //无向量 +// char ivPtr[kCCKeySizeAES128+1]; +// memset(ivPtr, 0, sizeof(ivPtr)); +// [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; + + NSUInteger dataLength = [data length]; + size_t bufferSize = dataLength + kCCBlockSizeAES128; + void *buffer = malloc(bufferSize); + size_t numBytesEncrypted = 0; + CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, + kCCAlgorithmAES128, + kCCOptionPKCS7Padding, + keyPtr, + kCCBlockSizeAES128, + nil, + [data bytes], + dataLength, + buffer, + bufferSize, + &numBytesEncrypted); + if (cryptStatus == kCCSuccess) { + return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; + } + free(buffer); + return nil; +} ++ (NSData *)AES128_Decrypt:(NSString *)key encryptData:(NSData *)data{ + char keyPtr[kCCKeySizeAES128+1]; + bzero(keyPtr, sizeof(keyPtr)); + [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; + + //无向量 +// char ivPtr[kCCKeySizeAES128+1]; +// memset(ivPtr, 0, sizeof(ivPtr)); +// [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; + + NSUInteger dataLength = [data length]; + size_t bufferSize = dataLength + kCCBlockSizeAES128; + void *buffer = malloc(bufferSize); + size_t numBytesDecrypted = 0; + CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, + kCCAlgorithmAES128, + kCCOptionPKCS7Padding, + keyPtr, + kCCBlockSizeAES128, + nil, + [data bytes], + dataLength, + buffer, + bufferSize, + &numBytesDecrypted); + if (cryptStatus == kCCSuccess) { + return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; + } + free(buffer); + return nil; +} + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/Sformat.h b/star_lock/ios/Runner/XSTalkManager/Utils/Sformat.h new file mode 100755 index 00000000..67e6e69d --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/Sformat.h @@ -0,0 +1,22 @@ +// +// HttpManager.h +// myhome +// +// Created by hkh on 16/11/6. +// +#import + +@interface Sformat: NSObject + ++ (NSString *)yyyy_MM_dd; ++ (long)timestamp; ++ (long)timestamp:(NSDate *)date; ++ (NSString *)Hex:(NSData *)data; ++ (NSDate *)DateByTimestamp:(NSString *)timestamp; ++ (NSString *)yyyy_MM_dd_HH_mm:(NSString *)timestamp; ++ (NSString *)yyyy_MM_dd_HH_mm_cn:(NSString *)timestamp; ++ (NSDate *)dateWithYearsBeforeNow:(NSInteger)year; ++ (NSDate *)dateWithMonthBeforeNow:(NSInteger)month; ++ (NSDate *)dateWithDayBeforeNow:(NSInteger)day; + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/Sformat.m b/star_lock/ios/Runner/XSTalkManager/Utils/Sformat.m new file mode 100755 index 00000000..670b7db2 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/Sformat.m @@ -0,0 +1,127 @@ +// +// HttpManager.m +// myhome +// +// Created by hkh on 16/11/6. +// + +#import "Sformat.h" + + +@interface Sformat (){ +} + + +@end +@implementation Sformat{ + +} ++ (NSString *)yyyy_MM_dd{ + NSDate *now = [NSDate date]; + + NSCalendar *calendar = [NSCalendar currentCalendar]; + NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; + NSDateComponents *dateComponent = [calendar components:unitFlags fromDate:now]; + + int year = [dateComponent year]; + int month = [dateComponent month]; + int day = [dateComponent day]; + + return [[NSString alloc] initWithFormat:@"%04d-%02d-%02d",year,month,day]; +} ++ (long)timestamp{ + NSDate *now = [NSDate date]; + return [now timeIntervalSince1970]*1000; +} ++ (long)timestamp:(NSDate *)date{ + return [date timeIntervalSince1970]*1000; +} + ++ (NSDate *)DateByTimestamp:(NSString *)timestamp{ + NSTimeInterval time = [timestamp floatValue] / 1000; + return [NSDate dateWithTimeIntervalSince1970:time]; +} + ++ (NSString *)yyyy_MM_dd_HH_mm:(NSString *)timestamp{ + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"]; + return [dateFormatter stringFromDate:[self DateByTimestamp:timestamp]]; +} ++ (NSString *)yyyy_MM_dd_HH_mm_cn:(NSString *)timestamp{ + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + [dateFormatter setDateFormat:@"yyyy年MM月dd日 HH:mm"]; + return [dateFormatter stringFromDate:[self DateByTimestamp:timestamp]]; +} + ++ (NSDate *)dateWithYearsBeforeNow:(NSInteger)year{ + NSDate *currentDate = [NSDate date]; + NSCalendar *calendar = nil; + if (FALSE) {//IOS8Higher + calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; + } else { + calendar = [NSCalendar currentCalendar]; + } + NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; + NSDateComponents *dateComponent = [calendar components:unitFlags fromDate:currentDate]; + [dateComponent setYear:year * -1]; + + return [calendar dateFromComponents:dateComponent]; +} ++ (NSDate *)dateWithMonthBeforeNow:(NSInteger)month{ + NSDate *currentDate = [NSDate date]; + NSCalendar *calendar = nil; + //calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; + calendar = [NSCalendar currentCalendar]; + NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ; + NSDateComponents *dateComponent = [calendar components:unitFlags fromDate:currentDate]; + [dateComponent setMonth:-1*month]; + + return [calendar dateFromComponents:dateComponent]; +} ++ (NSDate *)dateWithDayBeforeNow:(NSInteger)day{ + NSDate *currentDate = [NSDate date]; + NSCalendar *calendar = nil; + if (FALSE) {//IOS8Higher + calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; + } else { + calendar = [NSCalendar currentCalendar]; + } + NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; + NSDateComponents *dateComponent = [calendar components:unitFlags fromDate:currentDate]; + [dateComponent setDay:-1*day]; + + return [calendar dateFromComponents:dateComponent]; +} + ++ (NSString *)Hex:(NSData *)data { + if (!data || [data length] == 0) { + return @""; + + } + + NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]]; + + [data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) { + unsigned char *dataBytes = (unsigned char*)bytes; + + for (NSInteger i = 0; i < byteRange.length; i++) { + NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff]; + + if ([hexStr length] == 2) { + [string appendString:hexStr]; + + } else { + [string appendFormat:@"0%@", hexStr]; + + } + if(i < byteRange.length-1){ + [string appendString:@" "]; + } + } + + }]; + + return string; + +} +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/Talk/IframeInfo.h b/star_lock/ios/Runner/XSTalkManager/Utils/Talk/IframeInfo.h new file mode 100755 index 00000000..f622f060 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/Talk/IframeInfo.h @@ -0,0 +1,22 @@ +// +// IframeInfo.h +// myhome +// +// Created by user on 13-2-19. +// +// + +#import + +@interface IframeInfo : NSObject +@property (nonatomic,assign) int iframe_index; +@property (nonatomic,assign) int iframe_time; +@property (nonatomic,assign) long long bag_num; +@property (nonatomic,assign) long long bag_receive; +@property (nonatomic,assign) Boolean isFull; +@property (nonatomic,assign) int cur_len; +@property (nonatomic,assign) int bb_len; +@property (nonatomic,assign) Byte *bb; +@property (nonatomic, assign) int codecMode; + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/Talk/IframeInfo.m b/star_lock/ios/Runner/XSTalkManager/Utils/Talk/IframeInfo.m new file mode 100755 index 00000000..bfb3037f --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/Talk/IframeInfo.m @@ -0,0 +1,29 @@ +// +// IframeInfo.m +// myhome +// +// Created by user on 13-2-19. +// +// + +#import "IframeInfo.h" + +@implementation IframeInfo +@synthesize iframe_index; +@synthesize iframe_time; +@synthesize bag_num; +@synthesize bag_receive; +@synthesize isFull; +@synthesize cur_len; +@synthesize bb; +@synthesize codecMode; + +-(id)init{ + iframe_index = -1; + bag_num = 0; + bag_receive = 0; + isFull = NO; + cur_len = 0; + return self; +} +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/Talk/playAudio.h b/star_lock/ios/Runner/XSTalkManager/Utils/Talk/playAudio.h new file mode 100755 index 00000000..f2dc98f3 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/Talk/playAudio.h @@ -0,0 +1,50 @@ +// +// playAudio.h +// myhome +// +// Created by user on 12-11-20. +// Copyright (c) 2012年 __MyCompanyName__. All rights reserved. +// + +#import +#import + +#define NUM_BUFFERS 10 +#define ABUF_NUM 100 +#define ISAC_SIZE (240) + +typedef NS_ENUM(NSInteger, EquType) { + k8126, + k8130, + kWebrtc +}; + +typedef NS_ENUM(NSInteger, AudiodecodeType) { + k711, + k722, + kIsac +}; + +@interface playAudio : NSObject { + AudioQueueRef queue; + AudioQueueBufferRef buffers[NUM_BUFFERS]; + AudioStreamBasicDescription dataformat; +} + +@property Byte *Abuf; +@property int Abuf_p; +@property int Abuf_len; +@property int Version; +@property float vol; +@property int EuqAudioType; +@property int AudiodecodeType; + +- (void)AudioPlayStartWithMode:(int)mod; +- (void)AudioEnd; +- (int)AudioStartWithRate:(int)rate setChannels:(int)channels setSamples:(int)samples setBuf_samples:(int)buf_samples setVersion:(int)v; +- (void)audioQueueOutputWithQueue:(AudioQueueRef)q queueBuffer:(AudioQueueBufferRef)buf; +- (void)setVolume:(float)v; + ++ (void)initAudioSession; + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/Talk/playAudio.m b/star_lock/ios/Runner/XSTalkManager/Utils/Talk/playAudio.m new file mode 100755 index 00000000..9661a6cc --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/Talk/playAudio.m @@ -0,0 +1,240 @@ +// +// playAudio.m +// myhome +// +// Created by user on 12-11-20. +// Copyright (c) 2012年 __MyCompanyName__. All rights reserved. +// + +#import "playAudio.h" +#import "AppDelegate.h" + +#define SAMPLE_RATE (8000) +#define WEBRTC_AUDIO_BUF_SIZE (160*3*2) //30ms (10ms=160samples) + +@implementation playAudio { + AppDelegate * app; +} + +@synthesize Abuf; +@synthesize Abuf_p; +@synthesize Abuf_len; +@synthesize Version; +@synthesize vol; + +static int BYTES_PER_SAMPLES; +static bool isAudioStop; + +- (id)init { + Abuf_p = 0; + Abuf_len = 0; + Abuf = (Byte*)malloc(ABUF_NUM * 64); + if ( self = [super init] ) { + + } + return self; +} + +/* max number of samples per frame (= 60 ms frame) */ + +//回调 每当一组音频数据读取完毕之后会自动触发回调方法,读取下一帧数据 +void buffer_callback(void *inUserData, AudioQueueRef q, AudioQueueBufferRef buf) { + //__bridge + //NSLog(@"buffer_callback"); + playAudio* player = (__bridge playAudio*)inUserData; + [player audioQueueOutputWithQueue:q queueBuffer:buf]; +} + +- (short)G711Decode_u_law_2_linear:(Byte)b { + //u律 8126 + short t; + b = ~b; + t = ((b&0xf)<<3)+0x84; + t <<= ((unsigned)b&0x70)>>4; + return ((b&0x80)?(0x84-t):(t-0x84)); +} + +- (short)G711Decode_a_law_2_linear:(Byte)b { + //a律 8300 + int t; + int seg; + b ^= 0x55; + t = (b&0xf)<<4; + seg = ((unsigned)b&0x70)>>4;//seg=((unsigned)b&0x70)>>4; + switch (seg){ + case 0:{ + t += 8; + } + break; + case 1:{ + t += 0x108; + } + break; + default:{ + t += 0x108; + t <<= seg-1; + } + break; + } + return ((b&0x80)?t:-t); +} + +- (void)audioQueueOutputWithQueue:(AudioQueueRef)q queueBuffer:(AudioQueueBufferRef)buf { + //NSLog(@"audioQueueOutputWithQueue: _AudiodecodeType = %d", _AudiodecodeType); + if (_AudiodecodeType == k711) { + buf->mAudioDataByteSize = BYTES_PER_SAMPLES; + short *b = buf->mAudioData; + if (Abuf_len>0) { + //NSLog(@"8130 audio play ..."); + int pos = Abuf_p*64; + for (int i=0; i//kAudioUnitSubType +#import +#import +#import +#import +//#import "smbPitchShift.h" + + +#define NUM_BUFFERS 10 +#define ABUF_NUM 100 +#define RECORD_SIZE (160) +#define RECORD_ISAC_SIZE (240) +#define RECORD_FRAME_BUF (320) +#define RECORD_SAMPLES (160) + +/* +typedef NS_ENUM(NSInteger, AudioEncodeType) { + k8126, + k8130, + k711, + k722, + kIsac +}; +*/ +@interface recordAudio : NSObject{ + AudioQueueRef queue; + AudioQueueBufferRef buffers[NUM_BUFFERS]; + AudioStreamBasicDescription dataformat; + AudioQueueLevelMeterState *levels; +} + +@property Byte *Abuf; +@property int Abuf_p; +@property int Abuf_len; +@property int Version; +@property int firstopen; +@property int AudioEncodeType; +@property int EuqAudioType; +//@property (nonatomic, strong) webrtc_audio_processing* audio_process; + +//- (void)AudioRecordStart; +- (int)AudioRecordStartWithMode:(int)mod; +- (void)AudioEnd; +- (int)AudioStartWithRate:(int)rate setChannels:(int)channels setSamples:(int)samples setBuf_samples:(int)buf_samples setVersion:(int)v; +- (void)audioQueueInputWithQueue:(AudioQueueRef)q queueBuffer:(AudioQueueBufferRef)buf; + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/Talk/recordAudio.m b/star_lock/ios/Runner/XSTalkManager/Utils/Talk/recordAudio.m new file mode 100755 index 00000000..8b6488b3 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/Talk/recordAudio.m @@ -0,0 +1,763 @@ +// +// playAudio.m +// myhome +// +// Created by user on 12-11-20. +// Copyright (c) 2012年 __MyCompanyName__. All rights reserved. +// + +#import "recordAudio.h" +#import "AppDelegate.h" + +#define SAMPLE_RATE (8000) + +@implementation recordAudio{ + AppDelegate * app; +} + +@synthesize Abuf; +@synthesize Abuf_p; +@synthesize Abuf_len; +@synthesize firstopen; +@synthesize Version; +static int BYTES_PER_SAMPLES; +static bool isRecordAudioStop; + +uint8_t encodeBuff[RECORD_FRAME_BUF*2]; + +AudioUnit *audioUnit = NULL; +AudioUnit _auVoiceProcessing; + +SInt16 captureBuff[240]; +// The sampling rate to use with Audio Device Buffer +uint32_t _adbSampFreq; + +static short seg_end[8] = {0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff, 0x3fff, 0x7fff}; +static short search(short val, short *table, short size) { + short i; + for (i=0; i=8) { + //NSLog(@"a%d",0x7f^mask); + return(0x7f^mask); + } else { + uval=(seg<<4)|((p>>(seg+3))&0xf); + //NSLog(@"b%d",uval^mask); + return(uval^mask); + } + +} + +- (Byte)G711Encode_linear_2_a_law:(short)p { + //a律 8130 + short mask; + short seg; + Byte aval; + if (p>=0) { + mask = 0xD5; + } else { + mask = 0x55; + p = (short)(-p-1); + if(p<0) p = 32767; + } + + seg = search(p,seg_end,(short)8); + if (seg>=8) { + //NSLog(@"a%d",0x7f^mask); + return(0x7f^mask); + } else { + aval = seg<<4; + if(seg<2) + aval |= (p>>4)&0xf; + else + aval |= (p>>(seg+3))&0xf; + return(aval^mask); + } + +} + +void Buffer_callback(void *inUserData, AudioQueueRef q, AudioQueueBufferRef buf, const AudioTimeStamp *inStartTime, UInt32 inNumPackets, const AudioStreamPacketDescription *inPacketDesc) { + //NSLog(@"Buffer_callback:%d, %d, %d, %d", inStartTime->mSampleTime, inStartTime->mRateScalar, inStartTime->mHostTime, inNumPackets); + recordAudio* player = (__bridge recordAudio*)inUserData; + [player audioQueueInputWithQueue:q queueBuffer:buf]; +} + +- (void)audioQueueInputWithQueue:(AudioQueueRef)q queueBuffer:(AudioQueueBufferRef)buf { + if (isRecordAudioStop == YES) {//操作停止录音后,还会继续回调 所以在停止过程中不执行 + return; + } + //NSLog(@"record Buffer_callback"); + short *b = buf->mAudioData; + + if (Abuf_lenmAudioDataBytesCapacity; i++) { + buffer->mAudioDataByteSize = buffer->mAudioDataBytesCapacity; + UInt8 *samples = (UInt8 *)buffer->mAudioData; + samples[i] = 0; + } +} + +- (void)setupBuffers { + for (NSInteger i = 0; i < NUM_BUFFERS; i++) { + //AudioQueueAllocateBuffer(queue, 735, &buffers[i]); + //AudioQueueEnqueueBuffer(queue, buffers[i], 0, NULL); + int err = AudioQueueAllocateBuffer(queue, BYTES_PER_SAMPLES, &buffers[i]); + if (err) { + NSLog(@"AudioQueueAllcateBuffer error:%d",err); + return ; + } + [self audioQueueInputWithQueue:queue queueBuffer:buffers[i]]; + } +} + +- (void)setupMetering { + levels = (AudioQueueLevelMeterState *)calloc(sizeof(AudioQueueLevelMeterState), dataformat.mChannelsPerFrame); + UInt32 trueValue = true; + AudioQueueSetProperty(queue, kAudioQueueProperty_EnableLevelMetering, &trueValue, sizeof(UInt32)); +} + +- (void)AudioEnd { + + NSLog(@"AudioEnd ..."); + Abuf_p = 0; + Abuf_len = 0; + //unsigned int err = AudioQueueStop(queue, NULL); //什么为null就不崩溃呢? + isRecordAudioStop = YES; + unsigned int err = AudioQueueStop(queue, TRUE); + for (NSInteger i = 0; i < NUM_BUFFERS; i++) { + AudioQueueFreeBuffer(queue, buffers[i]); + } + AudioQueueDispose(queue, TRUE); + free(Abuf); + if (err) { + NSLog(@"AudioQueue2End error"); + } + //[_audio_process WebRtcProcess_Free]; +} + + +//======================================================================================================================= +//以下属于底层,没事不要乱动 +int initAudioSession() { + audioUnit = (AudioUnit*)malloc(sizeof(AudioUnit)); + + if(AudioSessionInitialize(NULL, NULL, NULL, NULL) != noErr) { + return 1; + } + + if(AudioSessionSetActive(true) != noErr) { + return 1; + } + + UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord; + if(AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, + sizeof(UInt32), &sessionCategory) != noErr) { + return 1; + } + + Float32 bufferSizeInSec = 0.02f; + if(AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, + sizeof(Float32), &bufferSizeInSec) != noErr) { + return 1; + } + + UInt32 overrideCategory = 1; + if(AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, + sizeof(UInt32), &overrideCategory) != noErr) { + return 1; + } + + // There are many properties you might want to provide callback functions for: + // kAudioSessionProperty_AudioRouteChange + // kAudioSessionProperty_OverrideCategoryEnableBluetoothInput + // etc. + + return 0; +} + +- (int)initAudioStreams { + //return initAudioStreams(NULL); + initAudioSession(); + initAudioStreams(audioUnit); + startAudioUnit(audioUnit); + return noErr; +} + +int initAudioStreams(AudioUnit *audioUnit) { +#if 1 + UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord; + if(AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, + sizeof(UInt32), &audioCategory) != noErr) { + return 1; + } + + UInt32 overrideCategory = 1; + if(AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, + sizeof(UInt32), &overrideCategory) != noErr) { + // Less serious error, but you may want to handle it and bail here + } + + AudioComponentDescription componentDescription; + componentDescription.componentType = kAudioUnitType_Output; + componentDescription.componentSubType = kAudioUnitSubType_RemoteIO; + componentDescription.componentManufacturer = kAudioUnitManufacturer_Apple; + componentDescription.componentFlags = 0; + componentDescription.componentFlagsMask = 0; + AudioComponent component = AudioComponentFindNext(NULL, &componentDescription); + if(AudioComponentInstanceNew(component, audioUnit) != noErr) { + return 1; + } + + UInt32 enable = 1; + if(AudioUnitSetProperty(*audioUnit, kAudioOutputUnitProperty_EnableIO, + kAudioUnitScope_Input, 1, &enable, sizeof(UInt32)) != noErr) { + return 1; + } + + AURenderCallbackStruct callbackStruct; + callbackStruct.inputProc = renderCallback; // Render function + callbackStruct.inputProcRefCon = NULL; + if(AudioUnitSetProperty(*audioUnit, kAudioUnitProperty_SetRenderCallback, + kAudioUnitScope_Input, 0, &callbackStruct, + sizeof(AURenderCallbackStruct)) != noErr) { + return 1; + } + + AudioStreamBasicDescription streamDescription; + // You might want to replace this with a different value, but keep in mind that the + // iPhone does not support all sample rates. 8kHz, 22kHz, and 44.1kHz should all work. + streamDescription.mSampleRate = 16000;//44100; + // Yes, I know you probably want floating point samples, but the iPhone isn't going + // to give you floating point data. You'll need to make the conversion by hand from + // linear PCM <-> float. + streamDescription.mFormatID = kAudioFormatLinearPCM; + // This part is important! + streamDescription.mFormatFlags = kAudioFormatFlagIsSignedInteger | + kAudioFormatFlagsNativeEndian | + kAudioFormatFlagIsPacked; + // Not sure if the iPhone supports recording >16-bit audio, but I doubt it. + streamDescription.mBitsPerChannel = 16; + // 1 sample per frame, will always be 2 as long as 16-bit samples are being used + streamDescription.mBytesPerFrame = 2; + // Record in mono. Use 2 for stereo, though I don't think the iPhone does true stereo recording + streamDescription.mChannelsPerFrame = 1; + streamDescription.mBytesPerPacket = streamDescription.mBytesPerFrame * + streamDescription.mChannelsPerFrame; + // Always should be set to 1 + streamDescription.mFramesPerPacket = 1; + // Always set to 0, just to be sure + streamDescription.mReserved = 0; + + // Set up input stream with above properties + + if(AudioUnitSetProperty(*audioUnit, kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Input, 0, &streamDescription, sizeof(streamDescription)) != noErr) { + return 1; + } + + // Ditto for the output stream, which we will be sending the processed audio to + + if(AudioUnitSetProperty(*audioUnit, kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Output, 1, &streamDescription, sizeof(streamDescription)) != noErr) { + return 1; + } + + return 0; +#endif + OSStatus result = -1; + + // Create Voice Processing Audio Unit + AudioComponentDescription desc; + AudioComponent comp; + + desc.componentType = kAudioUnitType_Output; + desc.componentSubType = kAudioUnitSubType_VoiceProcessingIO; + desc.componentManufacturer = kAudioUnitManufacturer_Apple; + desc.componentFlags = 0; + desc.componentFlagsMask = 0; + + comp = AudioComponentFindNext(NULL, &desc); + if (NULL == comp) { + NSLog(@"Could not find audio component for Audio Unit"); + return -1; + } + + result = AudioComponentInstanceNew(comp, &_auVoiceProcessing); + if (0 != result) { + NSLog(@"Could not create Audio Unit instance (result=%d)"); + return -1; + } + + // Set preferred hardware sample rate to 16 kHz + NSError* error = nil; + AVAudioSession* session = [AVAudioSession sharedInstance]; + Float64 preferredSampleRate = 16000.0; + [session setPreferredSampleRate:preferredSampleRate + error:&error]; + if (error != nil) { + const char* errorString = [[error localizedDescription] UTF8String]; + NSLog(@"Could not set preferred sample rate: %s", errorString); + } + error = nil; + error = nil; + // Make the setMode:error: and setCategory:error: calls only if necessary. + // Non-obviously, setting them to the value they already have will clear + // transient properties (such as PortOverride) that some other component may + // have set up. + if (session.mode != AVAudioSessionModeVoiceChat) { + [session setMode:AVAudioSessionModeVoiceChat error:&error]; + if (error != nil) { + const char* errorString = [[error localizedDescription] UTF8String]; + NSLog(@"Could not set mode: %s", errorString); + } + } + error = nil; + if (session.category != AVAudioSessionCategoryPlayAndRecord) { + [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error]; + if (error != nil) { + const char* errorString = [[error localizedDescription] UTF8String]; + NSLog(@"Could not set category: %s", errorString); + } + } + + ////////////////////// + // Setup Voice Processing Audio Unit + + // Note: For Signal Processing AU element 0 is output bus, element 1 is + // input bus for global scope element is irrelevant (always use + // element 0) + + // Enable IO on both elements + + // todo: Below we just log and continue upon error. We might want + // to close AU and return error for some cases. + // todo: Log info about setup. + + UInt32 enableIO = 1; + result = AudioUnitSetProperty(_auVoiceProcessing, + kAudioOutputUnitProperty_EnableIO, + kAudioUnitScope_Input, + 1, // input bus + &enableIO, + sizeof(enableIO)); + if (0 != result) { + NSLog(@"Could not enable IO on input (result=%d)", result); + } + + result = AudioUnitSetProperty(_auVoiceProcessing, + kAudioOutputUnitProperty_EnableIO, + kAudioUnitScope_Output, + 0, // output bus + &enableIO, + sizeof(enableIO)); + if (0 != result) { + NSLog(@"Could not enable IO on output (result=%d)", (int)result); + } + + // Disable AU buffer allocation for the recorder, we allocate our own + UInt32 flag = 0; + result = AudioUnitSetProperty( + _auVoiceProcessing, kAudioUnitProperty_ShouldAllocateBuffer, + kAudioUnitScope_Output, 1, &flag, sizeof(flag)); + if (0 != result) { + NSLog(@"Could not disable AU buffer allocation (result=%d)", result); + // Should work anyway + } + + // Set recording callback + AURenderCallbackStruct auCbS; + memset(&auCbS, 0, sizeof(auCbS)); + auCbS.inputProc = renderCallback; + auCbS.inputProcRefCon = NULL;//this; + result = AudioUnitSetProperty(_auVoiceProcessing, + kAudioOutputUnitProperty_SetInputCallback, + kAudioUnitScope_Global, 1, + &auCbS, sizeof(auCbS)); + if (0 != result) { + NSLog(@"Could not set record callback for Audio Unit (result=%d)",result); + } + + // Set playout callback + memset(&auCbS, 0, sizeof(auCbS)); + auCbS.inputProc = PlayoutProcess; + auCbS.inputProcRefCon = NULL;//this; + result = AudioUnitSetProperty(_auVoiceProcessing, + kAudioUnitProperty_SetRenderCallback, + kAudioUnitScope_Global, 0, + &auCbS, sizeof(auCbS)); + if (0 != result) { + NSLog(@"Could not set play callback for Audio Unit (result=%d)", result); + } + + // Get stream format for out/0 + AudioStreamBasicDescription playoutDesc; + UInt32 size = sizeof(playoutDesc); + result = AudioUnitGetProperty(_auVoiceProcessing, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Output, 0, &playoutDesc, + &size); + if (0 != result) { + NSLog(@"Could not get stream format Audio Unit out/0 (result=%d)", result); + } + NSLog(@"Audio Unit playout opened in sampling rate %f", playoutDesc.mSampleRate); + + playoutDesc.mSampleRate = preferredSampleRate; + + _adbSampFreq = 16000; + // Set the audio device buffer sampling rate, + // we assume we get the same for play and record + //暂时不 + // Set stream format for in/0 (use same sampling frequency as for out/0) + playoutDesc.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger + | kLinearPCMFormatFlagIsPacked + | kLinearPCMFormatFlagIsNonInterleaved; + playoutDesc.mBytesPerPacket = 2; + playoutDesc.mFramesPerPacket = 1; + playoutDesc.mBytesPerFrame = 2; + playoutDesc.mChannelsPerFrame = 1; + playoutDesc.mBitsPerChannel = 16; + result = AudioUnitSetProperty(_auVoiceProcessing, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Input, 0, &playoutDesc, size); + if (0 != result) { + NSLog(@"Could not set stream format Audio Unit in/0 (result=%d)", result); + } + + // Get stream format for in/1 + AudioStreamBasicDescription recordingDesc; + size = sizeof(recordingDesc); + result = AudioUnitGetProperty(_auVoiceProcessing, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Input, 1, &recordingDesc, + &size); + if (0 != result) { + NSLog(@"Could not get stream format Audio Unit in/1 (result=%d)", result); + } + NSLog(@"Audio Unit recording opened in sampling rate %f", recordingDesc.mSampleRate); + + recordingDesc.mSampleRate = preferredSampleRate; + + // Set stream format for out/1 (use same sampling frequency as for in/1) + recordingDesc.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger + | kLinearPCMFormatFlagIsPacked + | kLinearPCMFormatFlagIsNonInterleaved; + + recordingDesc.mBytesPerPacket = 2; + recordingDesc.mFramesPerPacket = 1; + recordingDesc.mBytesPerFrame = 2; + recordingDesc.mChannelsPerFrame = 1; + recordingDesc.mBitsPerChannel = 16; + result = AudioUnitSetProperty(_auVoiceProcessing, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Output, 1, &recordingDesc, + size); + if (0 != result) { + NSLog(@"Could not set stream format Audio Unit out/1 (result=%d)", result); + } + + // Initialize here already to be able to get/set stream properties. + result = AudioUnitInitialize(_auVoiceProcessing); + if (0 != result) { + NSLog(@"Could not init Audio Unit (result=%d)", result); + } + +} + +int startAudioUnit(AudioUnit *audioUnit) { + if(AudioUnitInitialize(*audioUnit) != noErr) { + return 1; + } + + if(AudioOutputUnitStart(*audioUnit) != noErr) { + return 1; + } + + return 0; +} + +OSStatus renderCallback(void *userData, AudioUnitRenderActionFlags *actionFlags, + const AudioTimeStamp *audioTimeStamp, UInt32 busNumber, + UInt32 numFrames, AudioBufferList *buffers) { + + // Get data from mic + OSStatus status = AudioUnitRender(*audioUnit, actionFlags, audioTimeStamp, + 1, numFrames, buffers); + if(status != noErr) { + return status; + } + + //if(convertedSampleBuffer == NULL) { + // Lazy initialization of this buffer is necessary because we don't + // know the frame count until the first callback + //convertedSampleBuffer = (float*)malloc(sizeof(float) * numFrames); + //} + + SInt16 *inputFrames = (SInt16*)(buffers->mBuffers->mData); + + // If your DSP code can use integers, then don't bother converting to + // floats here, as it just wastes CPU. However, most DSP algorithms rely + // on floating point, and this is especially true if you are porting a + // VST/AU to iOS. + for(int i = 0; i < numFrames; i++) { + // convertedSampleBuffer[i] = (float)inputFrames[i] / 32768.0f; + } + + // Now we have floating point sample data from the render callback! We + // can send it along for further processing, for example: + // plugin->processReplacing(convertedSampleBuffer, NULL, sampleFrames); + + // Assuming that you have processed in place, we can now write the + // floating point data back to the input buffer. + for(int i = 0; i < numFrames; i++) { + // Note that we multiply by 32767 here, NOT 32768. This is to avoid + // overflow errors (and thus clipping). + //inputFrames[i] = (SInt16)(convertedSampleBuffer[i] * 32767.0f); + } + + NSLog(@"renderCallback numFrames = %d", (unsigned int)numFrames); + return noErr; +} + +OSStatus PlayoutProcess(void *inRefCon, + AudioUnitRenderActionFlags *ioActionFlags, + const AudioTimeStamp *inTimeStamp, + UInt32 inBusNumber, + UInt32 inNumberFrames, + AudioBufferList *ioData) { + //AudioDeviceIOS* ptrThis = static_cast(inRefCon); + + //return ptrThis->PlayoutProcessImpl(inNumberFrames, ioData); + NSLog(@"PlayoutProcess ..."); + return noErr; +} + +int stopProcessingAudio(AudioUnit *audioUnit) { + if(AudioOutputUnitStop(*audioUnit) != noErr) { + return 1; + } + + if(AudioUnitUninitialize(*audioUnit) != noErr) { + return 1; + } + + *audioUnit = NULL; + return 0; +} + + + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/Talk/talk_Class.h b/star_lock/ios/Runner/XSTalkManager/Utils/Talk/talk_Class.h new file mode 100755 index 00000000..f60ce70c --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/Talk/talk_Class.h @@ -0,0 +1,101 @@ +// +// talk_Class.h +// myhome +// +// Created by user on 12-11-15. +// Copyright (c) 2012年 __MyCompanyName__. All rights reserved. +// + +#import + +//#import "myPlayer.h" +#import "playAudio.h" +#import "recordAudio.h" +#import "IframeInfo.h" +//#import "recordAndplayAudio.h" +//#import "g722_interface.h" + + +#define ABUF_NUM 100 +#define POS_iframe_index 63 +#define POS_alen 65 +#define POS_blen 73 +#define POS_bag_index 71 +#define POS_bag_num 69 +#define POS_data 77 +#define FIRSTINDEX 1 + + +@interface talk_Class : NSObject{ + NSTimer *timer; + NSData *connect_data; + NSString *remoteEquid; + NSString *remoteIp; + int remotePort; + IframeInfo *iframe; + //NSString *groupIp; + + //BOOL isShort; + playAudio *audio; + recordAudio *arecord; + //recordAndplayAudio *recordAndPaly; + //int status;//0:初始状态 1:等待监视 2:等待呼叫 3:监视中 4:呼叫成功 5:主角通话中 6:被叫通话 8:被叫通话中 +} + +@property (nonatomic, retain) NSString *groupIp; +@property (nonatomic, retain) playAudio *audio; +@property (nonatomic, retain) recordAudio *arecord; +@property (nonatomic, retain) IframeInfo *iframe; +@property int status;//0:初始状态 1:等待监视 2: 3:监视中 4:呼叫成功 5:主角通话中 6:被叫通话 8:被叫通话中 +@property int Version; +@property BOOL isShort; +@property (nonatomic) int vedioCodecMode; //1: 8130 2: h264视频编码 +@property (nonatomic) int audioEquMode; +@property (nonatomic) long connect_reg_time; +@property (nonatomic) long talkOnTime; +//@property BOOL isAudioInit; + +- (void)status_ini; +- (void)status_ini_onMain; + +- (void)connect_rec; +- (void)watch; +- (void)watchByServer; +- (void)watchSucc:(Byte *)bb Len:(int)bblen Formip:(NSString *)ip fromport:(int)port; +- (void)watchEnd; +- (void)talkOn; +- (void)talkEnd; +- (void)talkOnByRemote; +- (void)getImgData:(Byte *)bb len:(int)l; +- (void)getAVData:(Byte *)bb; +- (void)getAVData:(Byte *)bb length:(int)blen; +- (void)openDoor:(NSString *)pwd; +- (void) showplayer; +- (void)NSAsk:(Byte *)bb Len:(int)bblen Formip:(NSString *)ip fromport:(int)port; +//-(void)RecvNSReply:(NSData *)data fromHost:(NSString *)host fromPort:(NSString *)port; +//-(void)getdadong:(NSData *)data fromHost:(NSString *)host fromPort:(NSString *)port; +- (void)RecvNSReply:(NSData *)data fromHost:(NSString *)host fromPort:(int)port; +- (void)getdadong:(NSData *)data fromHost:(NSString *)host fromPort:(int)port; +- (void)WatchCallAnswer:(NSData *)data fromHost:(NSString *)host; +- (void)BeCall:(Byte *)bb Len:(int)bblen Formip:(NSString *)ip fromport:(int)port;//收到呼叫 +- (void)talkOnRec:(Byte *)bb; +- (void)NSToServer; +//- (void)getH264AVData:(Byte *)bb length:(int)blen; +- (void)getAVData:(Byte *)bb withLength:(unsigned long)blen; + +- (void)audioStartWithMode:(int)mod; +- (void)audioEnd; + +- (BOOL)isVideoPlaying; +- (NSString *)getRemoteEqu; +- (void)SetRemoteEqu:(NSString *)equid; +- (void)addHead:(NSString *)head toByte:(Byte *)bb; +- (void)addEquid:(NSString *)equid addIp:(NSString *)ip toByte:(Byte *)bb at:(int)pos; +- (NSString *)getIpv6FromBtye:(Byte *)bb At:(int)pos; +- (NSString *)getIpFromBtye:(Byte *)bb At:(int)pos; +- (int)getPortFromBtye:(Byte *)bb At:(int)pos; +- (NSString *)getRemoteIp; +- (void)SetRemoteIp:(NSString *)ip; +- (int)getRemotePort; +- (void)SetRemotePort:(int)port; +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/Talk/talk_Class.m b/star_lock/ios/Runner/XSTalkManager/Utils/Talk/talk_Class.m new file mode 100755 index 00000000..ea522176 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/Talk/talk_Class.m @@ -0,0 +1,1037 @@ +// +// talk_Class.m +// myhome +// +// Created by user on 12-11-15. +// Copyright (c) 2012年 __MyCompanyName__. All rights reserved. +// + +#import "talk_Class.h" +#import "AppDelegate.h" +#import "Pub.h" +#import "UdpHelper.h" +#import "Call.h" +#import "Pub.h" +#import "Sformat.h" + +//#import "mainViewController.h" + +#define k + +@implementation talk_Class{ + NSData *adata; + int fno; + int send_num; + AppDelegate *app; + int iframe_index,alen,blen,bag_index,bag_num,BAGLEN; +} +@synthesize status; +@synthesize audio; +@synthesize arecord; +@synthesize iframe; + +static bool isTalkStop; +static bool isVedioStop; + +- (id)init { + app = [Pub getApp]; + remotePort = 8302; + self.status = 0; + _audioEquMode = k8130; + + [playAudio initAudioSession]; + isTalkStop = YES; + /* + audio = [[playAudio alloc] init]; + [NSThread detachNewThreadSelector:@selector(audio_open_thr) toTarget:self withObject:nil]; + */ + //arecord = [[recordAudio alloc] init]; + //arecord.audio_process = [[webrtc_audio_processing alloc] init]; + //[NSThread detachNewThreadSelector:@selector(arecord_open_thr) toTarget:self withObject:nil]; + iframe = [[IframeInfo alloc] init]; + return self; +} + + +- (void)audioStartWithMode:(int)mod { +// app.audio_process = [[webrtc_audio_processing alloc] init]; +// [app.audio_process WebRtcProcess_Init]; + + arecord = [[recordAudio alloc] init]; + [arecord AudioRecordStartWithMode:mod]; + //[arecord AudioRecordStart]; + //f[arecord AudioStartWithRate:8000 setChannels:1 setSamples:8000 setBuf_samples:64 setVersion:self.Version]; + + audio = [[playAudio alloc] init]; + [audio AudioPlayStartWithMode:mod]; + isTalkStop = NO; + //arecord = [[recordAudio alloc] init]; + //arecord.audio_process = [[webrtc_audio_processing alloc] init]; + //[self arecord_open_thr]; +} + +- (void)audioEnd { + if(audio) + [audio AudioEnd]; + audio = nil; + if(arecord) + [arecord AudioEnd]; + arecord = nil; + +// [app.audio_process WebRtcProcess_Free]; +// app.audio_process = nil; + isTalkStop = YES; + isVedioStop = YES; +} + +- (void)audio_open_thr { + [audio AudioStartWithRate:8000 setChannels:1 setSamples:8000 setBuf_samples:64 setVersion:self.Version]; + [audio AudioEnd]; +} + +- (void)arecord_open_thr { + //int mod = kWebrtc; + //arecord = [[recordAudio alloc] init]; + //[arecord AudioRecordStartWithMode:mod]; + [arecord AudioStartWithRate:8000 setChannels:1 setSamples:8000 setBuf_samples:64 setVersion:self.Version]; + [arecord AudioEnd]; +} + +- (void)connect_ini { + _connect_reg_time = [Sformat timestamp]; + Byte connect_bb[512]; + [self addHead:@"XXXCID" toByte:connect_bb]; + + connect_bb[6] = 150; + if(status==3){ + connect_bb[6] = 152; + } + connect_bb[7] = 1; + connect_bb[8] = 9; + //本地 + [self addEquid:remoteEquid addIp:remoteIp toByte:connect_bb at:9]; + //远程 + [self addEquid:@"P18682150237" addIp:@"192.168.9.7" toByte:connect_bb at:33]; +// [self addEquid:[Pub getApp].sysinfo.equid addIp:[Pub getLocalIP] toByte:connect_bb at:33]; + connect_data=[[NSData alloc] initWithBytes:connect_bb length:100]; +} + +- (void)connect { +// if ([Sformat timestamp] - _connect_reg_time >= 5000) {//5s没有保持连接命令 +// if (status==3) { +// NSLog(@"对方掉线,停止监视:%ld",[Sformat timestamp] - _connect_reg_time); +// [self watchEnd]; +// if([Pub getApp].callOut){ +// [[Pub getApp].callOut UIClose]; +// } +// return; +// } else if ((status==8)|(status==6)) {//| +// NSLog(@"对方掉线,停止对讲:%ld",[Sformat timestamp] - _connect_reg_time); +// [self talkEnd]; +// if([Pub getApp].callOut){ +// [[Pub getApp].callOut UIClose]; +// } +// return; +// } +// } + + //NSLog(@"connect remoteip=%@;port=%d",remoteIp,remotePort); + //NSLog(@"connect %@",[Sformat Hex:connect_data]); + [[Pub getApp].udp.udp sendData:connect_data + toHost:remoteIp + port:remotePort + withTimeout:-1 + tag:0]; + + if([Pub getApp].callOut && (status==8 || status==3) ){ + [[Pub getApp].callOut setTime:_talkOnTime]; + } +} + + + + +- (void)WatchCallAnswer:(NSData *)data fromHost:(NSString *)host { + +// NSLog(@"%s", __FUNCTION__); +// if (status==1) { +// status=3; +// //bb[6]=152;//监视 +// [self connect_ini]; +// timer = [NSTimer scheduledTimerWithTimeInterval:3 +// target:self selector:@selector(connect) +// userInfo:nil repeats:YES]; +// //打开播放界面 +// //[self performSelectorOnMainThread:@selector(showplayer) withObject:nil waitUntilDone:YES]; +// //tiaoshi[self showplayer]; +// [player1 setviewsWithMode:_vedioCodecMode]; +// //打开 视频解码,视频播放 线程 +// } else if ((status==2)|(status==22)) { +// status=4; +// //bb[6]=150;//呼叫 +// [self check_connect_ini]; +// timer = [NSTimer scheduledTimerWithTimeInterval:1 +// target:self selector:@selector(check_connect) +// userInfo:nil repeats:YES]; +// [app ring]; +// //tiaoshi[self showplayer]; +// [player1 setviewsWithMode:_vedioCodecMode]; +// } else { +// return; +// } +} + +- (void)getdadong:(NSData *)data fromHost:(NSString *)host fromPort:(int)port { + remoteIp = [NSString stringWithFormat:@"%@", host];//[[NSString alloc]initWithFormat:host]; + remotePort = port; +} + +- (void)RecvNSReply:(NSData *)data fromHost:(NSString *)host fromPort:(int)port { + +// Byte *rr = (Byte *)[data bytes]; +// +// Byte *tempbb; +// NSString *tempS; +// NSData *tempData; +// int bblen=100;//512 +// Byte bb[bblen]; +// NSArray *tempA; +// +// tempS=@"XXXCID"; +// tempData=[tempS dataUsingEncoding:NSUTF8StringEncoding]; +// tempbb = (Byte *)[tempData bytes]; +// for (int i=0;i<6;i++) { +// bb[i]=tempbb[i]; +// } +// if (status==1) { +// remoteIp = [[NSString alloc]initWithFormat:@"%@",host]; +// remotePort = port; +// NSLog(@"%@", remoteIp); +// bb[6]=152;//监视 +// /*status=3; +// [self connect_ini]; +// timer = [NSTimer scheduledTimerWithTimeInterval:3 +// target:self selector:@selector(connect) +// userInfo:nil repeats:YES]; +// //打开播放界面 +// //[self performSelectorOnMainThread:@selector(showplayer) withObject:nil waitUntilDone:YES]; +// [self showplayer]; +// //打开 视频解码,视频播放 线程*/ +// } else if (status==2) { +// status=22; +// +// remoteIp = [NSString stringWithFormat:@"%@", host];//[[NSString alloc]initWithFormat:host]; +// remotePort = port; +// NSLog(@"%@", remoteIp); +// bb[6] = 150;//呼叫 +// +// /*status=4; +// [self check_connect_ini]; +// timer = [NSTimer scheduledTimerWithTimeInterval:1 +// target:self selector:@selector(check_connect) +// userInfo:nil repeats:YES]; +// +// */ +// } +// else { +// return; +// } +// bb[7] = 1; +// bb[8] = 1; +// //bb[22] = 3; +// //本地 +// tempS = app.localequid; +// tempData = [tempS dataUsingEncoding:NSUTF8StringEncoding]; +// tempbb = (Byte *)[tempData bytes]; +// memcpy(bb+9, tempbb, [tempData length]); +// for (int i=(int)[tempData length];i<20;i++) { +// bb[i+9] = 0; +// } +// /// +// tempA = [app.localip componentsSeparatedByString:@"."]; +// for (int i=0;i=5) { + //NSLog(@"_audioEquMode = %d", _audioEquMode); + if (false) {//_isShort + if (_audioEquMode == k8130) { + memcpy(bb+9, arecord.Abuf+64*arecord.Abuf_p, 64); + bb[8]=17; + + adata = [[NSData alloc] initWithBytes:bb length:73]; + //NSLog(@"------"); + send_num++; + if (send_num>1) { + //[self performSelectorOnMainThread:@selector(sendDataInMain) withObject:nil waitUntilDone:YES]; + } + } + + if (_audioEquMode == kWebrtc) { + int pos = 240*arecord.Abuf_p; + int len = arecord.Abuf[pos]; + memcpy(bb+21, &arecord.Abuf[pos+1], len); + bb[8] = 22; + + bb[9] = 0x80; + bb[10] = 103;//80 67 7a d5 e5 72 77 7e 58 3c bf 1 + bb[11] = 0x7a; + bb[12] = 0xd5; + bb[13] = (cnt++)&0xff; + bb[14] = 0x72; + bb[15] = 0x77; + bb[16] = 0x7e; + bb[17] = 0x58; + bb[18] = 0x3c; + bb[19] = 0xbf; + bb[20] = 0x1; + + bb[13] = (cnt++)&0xff; + adata = [[NSData alloc] initWithBytes:bb length:21+len]; + } + + send_num ++; + if (send_num>1) { + //NSLog(@"record send ..."); + //[self performSelectorOnMainThread:@selector(sendDataInMain) withObject:nil waitUntilDone:YES]; + send_num--; + } + + } else { + // if (self.Version==8130) { + // memcpy(bb+86, arecord.Abuf+64*arecord.Abuf_p, 64); + // } else { + // memcpy(bb+77, arecord.Abuf+64*arecord.Abuf_p, 64); + // } + // + // fno++; + // if (fno>=65536)fno=1; + // bb[64] = (fno&0x0000ff00)>>8; + // bb[63] = (fno&0x000000ff); + // adata = [[NSData alloc] initWithBytes:bb length:150]; + // //NSLog(@"------"); + // send_num++; + // if (send_num>1) { + // //[self performSelectorOnMainThread:@selector(sendDataInMain) withObject:nil waitUntilDone:YES]; + // send_num--; + // } + + bb[73]=0x40; bb[74]=1; + fno++; + if (fno>=65536)fno=1; + [Pub addShort:fno toByte:bb at:63]; + for(int p=0;p<5;p++){ + memcpy(bb+77+64*p, arecord.Abuf+64*arecord.Abuf_p, 64); + arecord.Abuf_len -=1 ; + arecord.Abuf_p = (arecord.Abuf_p+1)%ABUF_NUM; + } + if(app.TalkSendAudio) + [app.udp sendDataInMain:bb length:512 toHost:remoteIp toPort:remotePort]; + //[self performSelectorOnMainThread:@selector(sendDataInMain) withObject:nil waitUntilDone:YES]; + } + + } + + } @catch (NSException * ex) { + NSLog(@"%@",ex); + } + + + } +} + + +- (void)getImgData:(Byte *)bb len:(int)l { + //[player1 getImg:bb len:l]; +} + + + +- (void)getAVData:(Byte *)bb withLength:(unsigned long)len { + //NSLog(@"get audio data ..."); + if (bb[61]==1){//音频数据 +// audio.EuqAudioType = kWebrtc; +// audio.AudiodecodeType = kIsac; +// if ((audio.Abuf_len99){ + audio.Abuf_p=(audio.Abuf_p+1)%100; + } + else { + audio.Abuf_len++; + } + } + } + + } + else{//视频数据 + BAGLEN = [Pub getShortFromByte:bb at:POS_blen + 2]; + iframe_index = [Pub getShortFromByte:bb at:POS_iframe_index]; + alen = [Pub getShortFromByte:bb at:POS_alen]; + blen = [Pub getShortFromByte:bb at:POS_blen]; + bag_index = bb[POS_bag_index]&0xff ; + bag_num = bb[POS_bag_num]&0xff; + + if(iframe_index != iframe.iframe_index){ + iframe = [[IframeInfo alloc] init]; + iframe.iframe_index = iframe_index; + iframe.bag_num = bag_num; + iframe.cur_len = alen; + iframe.bb = (Byte*)malloc(alen); + } + iframe.bag_receive ++; + memcpy(iframe.bb + BAGLEN*(bag_index-FIRSTINDEX), bb + POS_data, blen); + + if(iframe.bag_num == iframe.bag_receive){ + //NSLog(@"播放第%d帧",iframe.iframe_index); + if([Pub getApp].callOut){ + [[Pub getApp].callOut RefImg:[[NSData alloc] initWithBytes:iframe.bb length:iframe.cur_len]]; + } + } + + } + +} + +- (void)getAVData:(Byte *)bb length:(int)blen { + if (isVedioStop == NO) { + //[player1 getH264AVData:bb length:blen]; + } + +} + +- (void)addbbToBuf:(Byte *)bb bblen:(int)len outp:(int)p bbnum:(int)num to:(Byte *)buf { + +} + +- (void)G711Decode:(Byte *)bb to:(Byte *)bb_de { + +} + +- (void)status_ini_onMain { + [self performSelectorOnMainThread:@selector(status_ini) withObject:nil waitUntilDone:YES]; +} + +- (void)NSToServer { +// if (status==1){//watch +// [self status_ini]; +// [app alertInMain:@"找不到设备"]; +// return; +// } +// NSLog(@"向服务器解析"); +// Byte *tempbb; +// NSString *tempS; +// +// NSData *tempData; +// int bblen=100;//512 +// Byte bb[bblen]; +// //NSArray *tempA; +// +// tempS=@"XXXCID"; +// tempData=[tempS dataUsingEncoding:NSUTF8StringEncoding]; +// tempbb = (Byte *)[tempData bytes]; +// for (int i=0;i<6;i++){ +// bb[i]=tempbb[i]; +// } +// bb[6]=155;//主机名yuanc解析 +// bb[7]=1; +// //本地 +// /// +// [self addEquid:app.localequid addIp:app.localip toByte:bb at:8]; +// //远程 +// [self addEquid:[app.equtype stringByAppendingString:app.equid] addIp:app.localip toByte:bb at:32]; +// [self addInt:app.sysinfo._areaid toByte:bb at:52]; +// +// app.talk_class.status=2;//等待呼叫 +// NSData *data = [[NSData alloc] initWithBytes:bb length:bblen]; +// +// NSString *temps=[app getServerIp]; +// [app senddataInThr:data toHost:temps toPort:8302 byPort:8302 at:3 setTag:0]; + +} + +- (void)addInt:(int)port toByte:(Byte *)bb at:(int)pos { + + bb[pos+3]=(Byte)((port & 0xFF000000) >> 24); + bb[pos+2]= (Byte)((port & 0x00FF0000) >> 16); + bb[pos+1]=(Byte)((port & 0x0000FF00) >> 8); + bb[pos]= (Byte)((port & 0x000000FF) ); + +} + +- (void)status_ini { + + NSLog(@"status=%d返回初始状态",status); + if(timer){ + [timer invalidate]; + timer = nil; + } + if(status>0){ + iframe = [[IframeInfo alloc] init]; + if (status==8 || status==5) { + [self audioEnd]; + } + else if(status==6){ + [[Pub getApp] ring_stop]; + } + } +// if (status==1){//等待监视 +// [player1 close]; +// //[player1 release]; +// status=0; +// +// } else if ((status==2)|(status==22)) {//等待呼叫 +// [player1 close]; +// //[player1 release]; +// status=0; +// +// } else if (status==3) {//监视中 +// [timer invalidate]; +// [player1 close]; +// //[player1 release]; +// status=0; +// //结束 视频编码,视频播放线程 +// } else if (status==4) {//呼叫成功 +// [timer invalidate]; +// status=0; +// [player1 close]; +// //[player1 release]; +// [app ring_stop]; +// } else if (status==5) {//主叫通话中 +// [timer invalidate]; +// [player1 close]; +// //[player1 release]; +// status=0; +// //结束 音频编码,音频播放,视频编码,视频播放线程 +// [self audioEnd]; +// //[audio AudioEnd]; +// //[arecord AudioEnd]; +// +// } else if (status==6) {//被呼叫 +// [timer invalidate]; +// status=0; +// [player1 close]; +// //[player1 release]; +// [app ring_stop]; +// } +// else if (status==8) {//被叫通话中 +// [timer invalidate]; +// NSLog(@"被叫通话中"); +// [player1 close]; +// //[player1 release]; +// status=0; +// //结束 音频编码,音频播放,视频编码,视频播放线程 +// //[audio AudioEnd]; +// [self audioEnd]; +// //[arecord AudioEnd]; +// } + /*AVAudioSession *session = [AVAudioSession sharedInstance]; + [session setActive:YES error:nil]; + [session setCategory:AVAudioSessionCategoryPlayback error:nil];*/ + status=0; + } + +- (BOOL)isVideoPlaying { +// if (player1 == nil) { +// return NO; +// } +// +// return !player1.isExitH264Play; + return NO; +} +- (NSString *)getRemoteEqu{ + return remoteEquid; +} + +- (void)SetRemoteEqu:(NSString *)equid{ + remoteEquid = equid; +} +- (NSString *)getRemoteIp{ + return remoteIp; +} + +- (void)SetRemoteIp:(NSString *)ip{ + remoteIp = ip; +} +- (int)getRemotePort{ + return remotePort; +} + +- (void)SetRemotePort:(int)port{ + remotePort = port; +} +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/UDP/UdpHelper.h b/star_lock/ios/Runner/XSTalkManager/Utils/UDP/UdpHelper.h new file mode 100755 index 00000000..782bb293 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/UDP/UdpHelper.h @@ -0,0 +1,40 @@ +// +// udp_data_class.h +// myhome +// +// Created by user on 12-10-31. +// Copyright (c) 2012年 __MyCompanyName__. All rights reserved. +// + +#import +#import +#import "udp_data_class.h" +#import "AsyncUdpSocket.h" +#import "sysInfo.h" + +#define BUFNUM 100 + +@interface UdpHelper : NSObject +@property (nonatomic, retain)AsyncUdpSocket *udp; +@property (nonatomic, retain) sysInfo* sysinfo; +@property (nonatomic, retain)NSTimer *timer; +//发送udp线程 +@property BOOL udp_send_tag; +@property (nonatomic, retain)NSCondition *udp_send_Condition; +@property (nonatomic, retain)NSCondition *udp_open_Condition; +@property int udp_send_time; +@property (nonatomic, retain)NSMutableArray *udp_datas; +@property (nonatomic, retain)udp_data_class *udp_list; +@property long udp_last_report_time; +@property long udp_last_replay_time; +@property BOOL online; + +- (void)Open; +- (void)Resume; +- (void)sendDataInMain:(Byte *)rr length:(int)len toHost:(NSString *)host toPort:(int)port; +- (void)senddataInThr:(NSData *)data toHost:(NSString *)host toPort:(int)port at:(int)second setTag:(int)tag; +- (int)stopSend:(NSString *)host rr6:(int)r6 rr8:(int)r8; +- (int)stopSend:(NSString *)host rr6:(int)r6 rr8:(int)r8 Port:(int)port; +- (int)ChgSendIp:(NSString *)host rr6:(int)r6 rr8:(int)r8 Port:(int)port; +- (int)stopSendDadong; +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/UDP/UdpHelper.m b/star_lock/ios/Runner/XSTalkManager/Utils/UDP/UdpHelper.m new file mode 100755 index 00000000..81bcd528 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/UDP/UdpHelper.m @@ -0,0 +1,734 @@ +// +// udp_data_class.m +// myhome +// +// Created by user on 12-10-31. +// Copyright (c) 2012年 __MyCompanyName__. All rights reserved. +// + +#import "UdpHelper.h" +#import "Sformat.h" +#import "Pub.h" +#import "Msg.h" + +@interface UdpHelper (){ + +} + + +@end +@implementation UdpHelper{ + +} + +- (void)Open{ + _sysinfo = [Pub getApp].sysinfo; + _udp = [[AsyncUdpSocket alloc] initWithDelegate:self]; + //NSError *err = nil; + //[_udp bindToPort:8366 error:&err]; + [_udp receiveWithTimeout:-1 tag:0]; + [self udp_send_thr_begin]; + _timer = [NSTimer scheduledTimerWithTimeInterval:1 + target:self selector:@selector(HeartBeat) + userInfo:nil repeats:YES]; +} + +- (void)Resume{ + + _udp = [[AsyncUdpSocket alloc] initWithDelegate:self]; + [_udp receiveWithTimeout:-1 tag:0]; +} +- (void)udp_send_thr_begin +{ + _udp_datas = [[NSMutableArray alloc] init]; + udp_data_class *list; + _udp_list = [[udp_data_class alloc] init]; + + for (int i=0; i _sysinfo.reporttime)) {//心跳包时间 如果没有收到_udp回应 则继续发 + _udp_last_report_time = [Sformat timestamp]; + Byte bb[110]; + /* + memset(bb, 0, 101); + [Pub addHead:@"XXXCID" toByte:bb]; + bb[6] = 4; + bb[7] = 1; + [Pub addEquid:@"P18682150237" toByte:bb at:8]; + // [Pub addEquid:_sysinfo.equid toByte:bb at:8]; + bb[20] = 0; + [Pub addMac:[Pub getMac] toByte:bb at:28]; + [Pub addInt:0 toByte:bb at:34]; + [Pub addEquid:[Pub getLocalIP] toByte:bb at:38]; + //与协议区别 + [Pub addGKB:@"token" toByte:bb at:50]; + int len = [Pub addGKB:_sysinfo.token toByte:bb at:60]; + [Pub addInt:len toByte:bb at:43]; + NSData *data = [[NSData alloc] initWithBytes:bb length:60+len]; + + //NSLog(@"HeartBeat: length = %ld , %@", data.length, [Sformat Hex:data]); + self.sysinfo.server_wan = @"192.168.254.23";//测试葛工地址 + self.sysinfo.server_port = 8366; + NSLog(@"HeartBeat: 服务器=%@:%d; 本地端口 = %d ",self.sysinfo.server_wan,self.sysinfo.server_port, _udp.localPort);] + */ + memset(bb, 0, 101); + [Pub addHead:@"XXXCID" toByte:bb]; + bb[6] = 4; + bb[7] = 1; + [Pub addEquid:@"P18682150237" toByte:bb at:8]; + // [Pub addEquid:_sysinfo.equid toByte:bb at:8]; + bb[20] = 0; + [Pub addMac:@"02:00:00:00:00:00" toByte:bb at:28]; + // [Pub addMac:[Pub getMac] toByte:bb at:28]; + [Pub addInt:0 toByte:bb at:34]; + [Pub addEquid:@"192.168.9.7" toByte:bb at:38]; + // [Pub addEquid:[Pub getLocalIP] toByte:bb at:38]; + //与协议区别 + [Pub addGKB:@"token" toByte:bb at:50]; + int len = [Pub addGKB:@"b989fa15f75c2ac02718b7c9bb64f80e" toByte:bb at:60]; + // int len = [Pub addGKB:_sysinfo.token toByte:bb at:60]; + + [Pub addInt:len toByte:bb at:43]; + NSData *data = [[NSData alloc] initWithBytes:bb length:60+len]; + + //打印数据 + NSMutableString *str = [[NSMutableString alloc] init]; + for (int i = 0; i < sizeof(bb); i++) { + [str appendFormat:@"%@", [NSString stringWithFormat:@"%d ", bb[i]]]; + } + NSLog(@"\n%@", str); + + /* + storeDataInByteArray(bb, @"XXXCID", 0);//包头 + storeDataInByteArray(bb, @(4), 6);//命令4 + storeDataInByteArray(bb, @(1), 7);//命令类型1 + storeDataInByteArray(bb, @"P18682150237", 8);//用户名 + storeDataInByteArray(bb, @(0), 20); + storeDataInByteArray(bb, @(0), 28);//Mac地址 + storeDataInByteArray(bb, @"0.0.0.0", 38);//IP地址 + storeDataInByteArray(bb, @"token", 50);//Token + storeDataInByteArray(bb, @"34237b42ae0ef7eb8fa6c1adf3ccfabb", 60);//Token值 + storeDataInByteArray(bb, @(32), 43);//Token值length + + NSMutableString *str = [[NSMutableString alloc] init]; + for (int i = 0; i < sizeof(bb); i++) { + [str appendFormat:@"%@", [NSString stringWithFormat:@"%d ", bb[i]]]; + } + NSLog(@"\n%@", str); + + NSData *data = [[NSData alloc] initWithBytes:bb length:60+32]; + */ + + [_udp sendData:data toHost:@"192.168.254.23" port:8366 withTimeout:-1 tag:0]; + + // if([Pub getApp].p2ptest){ + // [_udp sendData:data toHost:@"47.107.109.110" port:self.sysinfo.server_port withTimeout:-1 tag:0]; + // } + //[_udp sendData:data toHost:self.sysinfo.server_wan port:self.sysinfo.server_port withTimeout:-1 tag:0]; + } + + if (_online == YES && ([Sformat timestamp] - _udp_last_replay_time )/1000 > 3*_sysinfo.reporttime) { + //[Msg alert:@"离线"]; + _online = NO; + } + } + + } @catch (NSException * ex) { + NSLog(@"心跳包错误"); + } + +} + +void storeDataInByteArray(Byte a[], id data, NSUInteger index) { + // if (index >= sizeof(a)) { + // NSLog(@"索引超出数组容量。"); + // return; + // } + + if ([data isKindOfClass:[NSString class]]) { + NSString *stringValue = (NSString *)data; + const char *utf8String = [stringValue UTF8String]; + NSUInteger stringLength = [stringValue lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + memcpy(a + index, utf8String, stringLength); + } else if ([data isKindOfClass:[NSNumber class]]) { + NSNumber *numberValue = (NSNumber *)data; + a[index] = [numberValue unsignedCharValue]; + } else { + NSLog(@"不支持的数据类型。"); + } +} + + +- (BOOL)sendDataInMain +{ + //BOOL res = + NSLog(@"sendDataInMain remoteip=%@;port=%d",_udp_list.toHost,_udp_list.port); + //NSLog(@"sendDataInMain %@",[Sformat Hex:_udp_list.data]); + //NSLog(@"sendDataInMain: 本地端口 = %d ", _udp.localPort); + [_udp sendData:_udp_list.data + toHost:_udp_list.toHost + port:_udp_list.port + withTimeout:-1 + tag:0]; + //NSLog(@"数据长度:%lu",(unsigned long)_udp_list.data.length); + //NSLog(@"%@:%d", _udp_list.toHost, _udp_list.port); + return YES; +} +- (void)senddataInThr:(NSData *)data toHost:(NSString *)host toPort:(int)port at:(int)second setTag:(int)tag +{ + + for (int i=0; i-1){ + [[Pub getApp] OpenDoorSucc:[Pub getEquidFrombb:bb at:9]]; + } + + } + else{ + if([self stopSend:@"" rr6:150 rr8:10]>-1){ + [[Pub getApp] OpenDoorFail:[Pub getEquidFrombb:bb at:9]]; + } + + } + } + break; + case 30:{//对讲结束 + if((bb[7]&0x3)==1){//对方结束对讲 + NSLog(@"对方结束对讲"); + bb[7] = 2; + [[Pub getApp].udp.udp sendData:[[NSData alloc] initWithBytes:bb length:100] + toHost:host + port:port + withTimeout:-1 + tag:0]; + [[Pub getApp].talk status_ini]; + if([Pub getApp].callOut){ + [[Pub getApp].callOut UIClose]; + } + } + else{//结束对讲反馈 + NSLog(@"结束对讲反馈"); + [self stopSend:@"" rr6:150 rr8:30]; + } + } + break; + case 140:{//p2p测试 + if([Pub getApp].p2ptest) + [[Pub getApp].p2ptest GotMyPortInServer:bb Len:data.length Formip:host fromport:port]; + } + break; + case 141:{//p2p测试 + if([Pub getApp].p2ptest) + [[Pub getApp].p2ptest GotRemoteIp:bb Len:data.length Formip:host fromport:port]; + } + break; + case 142:{//p2p测试 + NSLog(@"p2p被叫"); + if([Pub getApp].p2ptest) + [[Pub getApp].p2ptest GotCall:bb Len:data.length Formip:host fromport:port]; + } + break; + case 144: + case 143:{//p2p测试 NSAsk + NSLog(@"p2pNSAskNSAsk"); + if([Pub getApp].p2ptest) + [[Pub getApp].p2ptest GotNSAsk:bb Len:data.length Formip:host fromport:port]; + } + break; + default: + break; + } + } + else if(bb[6] == 152){ + + switch (bb[8]&0xff) { + case 2://被叫 + NSLog(@"对方忙"); + [self stopSend:@"" rr6:152 rr8:1]; + if([Pub getApp].callOut){ + [[Pub getApp].callOut UIClose]; + } + break; + + case 4:{//监视成功 + NSLog(@"监视成功"); + [self stopSend:@"" rr6:152 rr8:1]; + if([Pub getApp].callOut){ + [[Pub getApp].talk watchSucc:bb Len:data.length Formip:host fromport:port]; + } + else if([Pub getApp].main){ + // [[Pub getApp].main OpendoorGo]; + [[Pub getApp].main OpenDoorStep2]; + } + + + } + break; + case 7: + case 8:{//音视频数据 + //NSLog(@"音视频数据"); + [[Pub getApp].talk getAVData:bb withLength:data.length]; + } + break; + case 9:{//保持连接 + if((bb[7]&0x3)==1){//对方保持连接 + //NSLog(@"对方保持连接"); + bb[7] = 2; + [[Pub getApp].udp.udp sendData:[[NSData alloc] initWithBytes:bb length:100] + toHost:host + port:port + withTimeout:-1 + tag:0]; + [Pub getApp].talk.connect_reg_time = [Sformat timestamp]; + } + else{ + //NSLog(@"保持连接反馈"); + [Pub getApp].talk.connect_reg_time = [Sformat timestamp]; + } + } + break; + case 10:{//开门反馈 + if((bb[7]&0x3)==2){ + NSLog(@"开门成功"); + if([self stopSend:@"" rr6:152 rr8:10]>-1){ + [[Pub getApp] OpenDoorSucc:[Pub getEquidFrombb:bb at:9]]; + + + } + } + else{ + if([self stopSend:@"" rr6:152 rr8:10]>-1){ + [[Pub getApp] OpenDoorFail:[Pub getEquidFrombb:bb at:9]]; + + } + + } + } + break; + case 30:{//监视结束 + if((bb[7]&0x3)==1){//对方结束监视 + NSLog(@"对方结束监视"); + bb[7] = 2; + [[Pub getApp].udp.udp sendData:[[NSData alloc] initWithBytes:bb length:100] + toHost:host + port:port + withTimeout:-1 + tag:0]; + [[Pub getApp].talk status_ini]; + if([Pub getApp].callOut){ + [[Pub getApp].callOut UIClose]; + } + } + else{//结束监视反馈 + NSLog(@"结束监视反馈"); + [self stopSend:@"" rr6:150 rr8:30]; + } + } + break; + default: + break; + } + + } + } @catch (NSException * ex) { + NSLog(@"心跳包错误"); + } + + + [_udp receiveWithTimeout:-1 tag:0]; + return YES; +} +- (int)stopSend:(NSString *)host rr6:(int)r6 rr8:(int)r8 +{ + + for (int i=0; i + +@interface udp_data_class : NSObject +@property (nonatomic,assign) BOOL isUsed; +@property (nonatomic,retain) NSData *data; +@property (nonatomic,strong) NSString *toHost; +@property (nonatomic,assign) int tag; +@property (nonatomic,assign) int port; +@property (nonatomic,assign) int byport; +@property (nonatomic,assign) int sendtimes; +@property (nonatomic,assign) int sendtimesneed; +@property (nonatomic,assign) int res; +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/UDP/udp_data_class.m b/star_lock/ios/Runner/XSTalkManager/Utils/UDP/udp_data_class.m new file mode 100755 index 00000000..368d98f5 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/UDP/udp_data_class.m @@ -0,0 +1,21 @@ +// +// udp_data_class.m +// myhome +// +// Created by user on 12-10-31. +// Copyright (c) 2012年 __MyCompanyName__. All rights reserved. +// + +#import "udp_data_class.h" + +@implementation udp_data_class +@synthesize isUsed; +@synthesize data; +@synthesize toHost; +@synthesize tag; +@synthesize port; +@synthesize byport; +@synthesize sendtimes; +@synthesize sendtimesneed; +@synthesize res; +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/UI.h b/star_lock/ios/Runner/XSTalkManager/Utils/UI.h new file mode 100755 index 00000000..ede4e6d7 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/UI.h @@ -0,0 +1,86 @@ +// +// sysInfo.h +// myhome +// +// Created by hkh on 15/10/31. +// +// + +#import +#import + +#ifndef Talk_UI_h +#define Talk_UI_h + +#define kIs_iphone (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) +#define kIs_iPhoneX ScreenWidth >=375.0f && ScreenHeight >=812.0f&& kIs_iphone + +#define ScreenWidth ([UIScreen mainScreen].bounds.size.width) +#define ScreenHeight ([UIScreen mainScreen].bounds.size.height) + +//#define KstatusHeight (20.0) +//#define KnavigationHeight (44.0) +//#define KstatusAndNavHeight (64.0) +#define TabBarHeight (49.0) + +#define KScreenWidth (ScreenWidth) +//#define KScreenHeight (ScreenHeight - KstatusHeight- KnavigationHeight) +#define kBottomSafeHeight (CGFloat)(kIs_iPhoneX?(34.0):(0)) + +#define KScreenOriginX 0 +#define KScreenOriginY (KstatusHeight) + + +#endif +typedef NS_ENUM(NSInteger, UIPosition) { + UIAabsolute = 0, + UIRelative = 1, +}; + +typedef NS_ENUM(NSInteger, UIPositionInParent) { + UITopLeft = 0, + UITopMid = 1, + UITopRight = 2, + UIMidLeft = 3, + UICenter = 4, + UIMidRight = 5, + UIBottomLeft = 6, + UIBottomMid = 7, + UIBottomRight = 8, +}; +typedef NS_ENUM(NSInteger, UIPositionByView) { + TopAlignLeft = 0, + TopAlignCenter = 1, + TopAlignRight = 2, + RightAlignTop = 3, + RightAlignCenter = 4, + RightAlignBottom = 5, + BottomAlignLeft = 6, + BottomAlignCenter = 7, + BottomAlignRight = 8, + LeftAlignTop = 9, + LeftAlignCenter = 10, + LeftAlignBottom = 11, + +}; + +@interface UI : NSObject + ++ (CGFloat)getScreenWidth; ++ (CGFloat)getScreenHeight; ++ (void)SetRView:(UIView *) view Top:(NSString *) t Right:(NSString *) r Bottom:(NSString *) b Left:(NSString *) l; ++ (void)setFrame:(UIView *) view Width:(NSString *) w Height:(NSString *) h Left:(NSString *) x Top:(NSString *) y; ++ (void)setFrameInView:(UIView *) view Width:(NSString *) w Height:(NSString *) h TranslateX:(NSString *) x TranslateY:(NSString *) y InView:(UIView *) parent Position:(UIPositionInParent)pos; ++ (void)setFrameByView:(UIView *) view Width:(NSString *) w Height:(NSString *) h TranslateX:(NSString *) x TranslateY:(NSString *) y ByView:(UIView *) brother Position:(UIPositionByView)pos; ++ (void)chgMargin:(UIView *) view Css:(NSString *) css; ++ (void)setCornerRadius:(UIView *) view; ++ (void)setGradientBorder:(UIView *)view withColor:(NSInteger)color; ++ (UIImage *)reSizeImage:(UIImage *)image toSize:(CGSize)reSize; ++ (UILabel *)NewLabel:(NSString *) text Color:(UIColor *)color Size:(CGFloat)size Align:(NSTextAlignment) align; ++ (UIColor *)colorWithHex:(NSInteger)hexValue; ++ (UIColor *)colorWithHex:(NSInteger)hexValue alpha:(CGFloat)alphaValue; ++ (CGFloat)getNavHeight; ++ (CGFloat)getStatuHeight; ++ (CGFloat)getStatuAndStatuHeight; ++ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size; +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/UI.m b/star_lock/ios/Runner/XSTalkManager/Utils/UI.m new file mode 100755 index 00000000..895672da --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/UI.m @@ -0,0 +1,356 @@ +// +// sysInfo.m +// myhome +// +// Created by hkh on 15/10/31. +// +// + +#import "UI.h" +#import +#import "Pub.h" + +@interface UI () + +@end +@implementation UI{ + +} + ++ (CGFloat)getScreenWidth{ + CGRect screenRect = [[UIScreen mainScreen] bounds]; + return screenRect.size.width; +} ++ (CGFloat)getScreenHeight{ + CGRect screenRect = [[UIScreen mainScreen] bounds]; + return screenRect.size.height; +} + ++ (void)SetRView:(UIView *) view Top:(NSString *) t Right:(NSString *) r Bottom:(NSString *) b Left:(NSString *) l{ + CGRect screenRect = [[UIScreen mainScreen] bounds]; + CGFloat t1 = [UI String2Float:t ULen:screenRect.size.height]; + CGFloat r1 = [UI String2Float:r ULen:screenRect.size.width]; + CGFloat b1 = [UI String2Float:b ULen:screenRect.size.height]; + CGFloat l1 = [UI String2Float:l ULen:screenRect.size.width]; + + CGFloat w1 = screenRect.size.width - l1 - r1; + CGFloat h1 = screenRect.size.height - t1 - b1; + CGFloat x1 = l1; + CGFloat y1 = t1; + + //NSLog(@"SetRView:%f,%f,%f,%f",x1, y1, w1, h1); + view.frame = CGRectMake(x1, y1, w1, h1); +} + ++ (CGFloat)String2Float:(NSString *) str ULen:(CGFloat) l{ + CGFloat v = 0; + //判断宽度是值还是百分比 + if([str containsString:@"%"]){ + v = [[str stringByReplacingOccurrencesOfString:@"%" withString:@""] floatValue]; + v = v * l/100; + } + else if([str containsString:@"v"]){ + CGRect screenRect = [[UIScreen mainScreen] bounds]; + if([str containsString:@"vw"]){ + v = [[str stringByReplacingOccurrencesOfString:@"vw" withString:@""] floatValue]; + v = v * screenRect.size.width/100; + } + else if([str containsString:@"vh"]){ + v = [[str stringByReplacingOccurrencesOfString:@"vw" withString:@""] floatValue]; + v = v * screenRect.size.height/100; + } + else if([str containsString:@"vmin"]){ + v = [[str stringByReplacingOccurrencesOfString:@"vw" withString:@""] floatValue]; + v = v * MIN(screenRect.size.width, screenRect.size.height) /100; + } + else if([str containsString:@"vmax"]){ + v = [[str stringByReplacingOccurrencesOfString:@"vw" withString:@""] floatValue]; + v = v * MAX(screenRect.size.width, screenRect.size.height) /100; + } + + } + else{ + v = [[str stringByReplacingOccurrencesOfString:@"dp" withString:@""] floatValue]; + } + + return v; +} ++ (void)setFrame:(UIView *) view Width:(NSString *) w Height:(NSString *) h Left:(NSString *) x Top:(NSString *) y{ + CGRect screenRect = [[UIScreen mainScreen] bounds]; + CGFloat w1 = [UI String2Float:w ULen:screenRect.size.width]; + CGFloat h1 = [UI String2Float:h ULen:screenRect.size.height]; + CGFloat x1 = [UI String2Float:x ULen:screenRect.size.width]; + CGFloat y1 = [UI String2Float:y ULen:screenRect.size.height]; + + //NSLog(@"setFrame:%f,%f,%f,%f",x1, y1, w1, h1); + view.frame = CGRectMake(x1, y1, w1, h1); +} ++ (void)setFrameInView:(UIView *) view Width:(NSString *) w Height:(NSString *) h TranslateX:(NSString *) x TranslateY:(NSString *) y InView:(UIView *) parent Position:(UIPositionInParent)pos{ + if(!parent)parent = (UIView *)[view nextResponder]; + CGFloat w1 = [UI String2Float:w ULen:parent.frame.size.width]; + CGFloat h1 = [UI String2Float:h ULen:parent.frame.size.height]; + CGFloat x1 = [UI String2Float:x ULen:parent.frame.size.width]; + CGFloat y1 = [UI String2Float:y ULen:parent.frame.size.height]; + + + switch (pos) { + case UITopLeft: + //y1 = y1; + //x1 = x1; + break; + case UITopMid: + //y1 = y1; + x1 += (parent.frame.size.width - w1)/2; + break; + case UITopRight: + //y1 = y1; + x1 = parent.frame.size.width - w1 - x1; + break; + case UIMidLeft: + y1 += (parent.frame.size.height - h1)/2; + //x1 = x1; + break; + case UICenter: + y1 += (parent.frame.size.height - h1)/2; + x1 += (parent.frame.size.width - w1)/2; + break; + case UIMidRight: + y1 += (parent.frame.size.height - h1)/2; + x1 = parent.frame.size.width - w1 - x1; + break; + case UIBottomLeft: + y1 = parent.frame.size.height - h1 - y1; + //x1 = x1; + break; + case UIBottomMid: + y1 = parent.frame.size.height - h1 - y1; + x1 += (parent.frame.size.width - w1)/2; + break; + case UIBottomRight: + y1 = parent.frame.size.height - h1 - y1; + x1 = parent.frame.size.width - w1 - x1; + break; + default: + + break; + } + //NSLog(@"setFrameInView:%f,%f,%f,%f",x1, y1, w1, h1); + view.frame = CGRectMake(x1, y1, w1, h1); +} + ++ (void)setFrameByView:(UIView *) view Width:(NSString *) w Height:(NSString *) h TranslateX:(NSString *) x TranslateY:(NSString *) y ByView:(UIView *) brother Position:(UIPositionByView)pos{ + UIView * parent = (UIView *)[view nextResponder]; + CGFloat w1 = [UI String2Float:w ULen:parent.frame.size.width]; + CGFloat h1 = [UI String2Float:h ULen:parent.frame.size.height]; + CGFloat x1 = [UI String2Float:x ULen:parent.frame.size.width]; + CGFloat y1 = [UI String2Float:y ULen:parent.frame.size.height]; + + switch (pos) { + case TopAlignLeft: + y1 = brother.frame.origin.y - h1 - y1; + x1 += brother.frame.origin.x; + break; + case TopAlignCenter: + y1 = brother.frame.origin.y - h1 - y1; + x1 += brother.frame.origin.x + (brother.frame.size.width - w1)/2 ; + break; + case TopAlignRight: + y1 = brother.frame.origin.y - h1 - y1; + x1 += brother.frame.size.width + brother.frame.origin.x - w1; + break; + case RightAlignTop: + x1 += brother.frame.size.width + brother.frame.origin.x ; + y1 += brother.frame.origin.y; + break; + case RightAlignCenter: + x1 += brother.frame.size.width + brother.frame.origin.x ; + y1 += brother.frame.origin.y + (brother.frame.size.height - h1)/2 ; + break; + case RightAlignBottom: + x1 += brother.frame.size.width + brother.frame.origin.x ; + y1 += brother.frame.size.height + brother.frame.origin.y - h1; + break; + case BottomAlignLeft: + y1 += brother.frame.size.height + brother.frame.origin.y; + x1 += brother.frame.origin.x; + break; + case BottomAlignCenter: + y1 += brother.frame.size.height + brother.frame.origin.y; + x1 += brother.frame.origin.x + (brother.frame.size.width - w1)/2 ; + break; + case BottomAlignRight: + y1 += brother.frame.size.height + brother.frame.origin.y; + x1 += brother.frame.size.width + brother.frame.origin.x - w1; + break; + case LeftAlignTop: + x1 = brother.frame.origin.x - w1 - x1; + y1 += brother.frame.origin.y; + break; + case LeftAlignCenter: + x1 += brother.frame.origin.x - w1 - x1; + y1 += brother.frame.origin.y + (brother.frame.size.height - h1)/2 ; + break; + case LeftAlignBottom: + x1 += brother.frame.origin.x - w1 - x1; + y1 += brother.frame.size.height + brother.frame.origin.y - h1; + break; + default: + + break; + } + //NSLog(@"setFrameInView:%f,%f,%f,%f",x1, y1, w1, h1); + view.frame = CGRectMake(x1, y1, w1, h1); +} +/**不能对最上层控件使用*/ ++ (void)chgMargin:(UIView *) view Css:(NSString *) css{ + UIView * parent = (UIView *)[view nextResponder]; + CGFloat w1 = view.frame.size.width; + CGFloat h1 = view.frame.size.height; + CGFloat x1 = view.frame.origin.x; + CGFloat y1 = view.frame.origin.y; + NSArray *array = [css componentsSeparatedByString:@" "]; + if(array.count>0){//上 + CGFloat minus = [UI String2Float:array[0] ULen:parent.frame.size.height]; + if(minus < h1){ + y1 += minus; + h1 -= minus; + } + } + if(array.count>1){//右 + CGFloat minus = [UI String2Float:array[1] ULen:parent.frame.size.width]; + if(minus < w1){ + w1 -= minus; + //y1不变 + } + } + if(array.count>2){//下 + CGFloat minus = [UI String2Float:array[2] ULen:parent.frame.size.height]; + if(minus < h1){ + //x1不变; + h1 -= minus; + } + } + if(array.count>3){//左 + CGFloat minus = [UI String2Float:array[3] ULen:parent.frame.size.width]; + if(minus < w1){ + x1 += minus; + w1 -= minus; + } + } + view.frame = CGRectMake(x1, y1, w1, h1); +} + ++ (void)setCornerRadius:(UIView *) view{ + CGFloat w1 = view.frame.size.width; + CGFloat h1 = view.frame.size.height; + //NSLog(@"setCornerRadius: %f,%f", w1, h1); + [view.layer setCornerRadius:MIN(w1,h1)/2]; //设置矩形四个圆角半径 +} + ++ (void)setGradientBorder:(UIView *)view withColor:(NSInteger)color{ + view.backgroundColor = [UI colorWithHex:color alpha:0.5] ; + + + CAGradientLayer *layer1 = [[CAGradientLayer alloc] init]; + layer1.frame = view.bounds; + layer1.colors = @[(__bridge id)[UI colorWithHex:color].CGColor,(__bridge id)[UI colorWithHex:0xffffff].CGColor]; + layer1.startPoint = CGPointMake(0.3, 0.3); + layer1.endPoint = CGPointMake(1, 1); + [layer1 setCornerRadius:MIN(view.frame.size.width,view.frame.size.height)/2]; + + + CAShapeLayer *layer2 = [[CAShapeLayer alloc] init]; + layer2.lineWidth = 0; + //maskLayer.path = [UIBezierPath bezierPathWithRect:self.openView.bounds].CGPath; + + CGPoint center = CGPointMake(view.frame.size.width * 0.5, view.frame.size.height * 0.5); + CGFloat radius = view.frame.size.height * 0.44; + layer2.path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:0 endAngle:M_PI * 2 clockwise:YES].CGPath; + + layer2.fillColor = [UI colorWithHex:color].CGColor; + layer2.strokeColor = nil; + + + + [view.layer addSublayer:layer1]; + [view.layer addSublayer:layer2]; +} + + ++ (UIImage *)reSizeImage:(UIImage *)image toSize:(CGSize)reSize +{ + UIGraphicsBeginImageContext(CGSizeMake(reSize.width, reSize.height)); + [image drawInRect:CGRectMake(0, 0, reSize.width, reSize.height)]; + UIImage *reSizeImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return reSizeImage; +} ++ (UILabel *)NewLabel:(NSString *) text Color:(UIColor *)color Size:(CGFloat)size Align:(NSTextAlignment) align{ + UILabel *label = [[UILabel alloc] init]; + label.font = [UIFont systemFontOfSize:size]; + label.textColor = color; + label.textAlignment = align; + label.text = NSLocalizedString(text, nil); + return label; +} + ++ (CGFloat)getNavHeight{ + @try + { + if([@"MainTabBar" isEqualToString:NSStringFromClass([[Pub getApp].window.rootViewController class])]){ + UITabBarController *tab = (UITabBarController *)[Pub getApp].window.rootViewController; + UINavigationController *nav = tab.viewControllers[tab.selectedIndex]; + return nav.navigationBar.frame.size.height; + } + } @catch (NSException * e) { + + } + + return 44.; +} +//颜色处理 ++ (UIColor *)colorWithHex:(NSInteger)hexValue +{ + return [self colorWithHex:hexValue alpha:1.0]; +} + ++ (UIColor *)colorWithHex:(NSInteger)hexValue alpha:(CGFloat)alphaValue +{ + return [UIColor colorWithRed:((float)((hexValue & 0xFF0000) >> 16)) / 255.0 + green:((float)((hexValue & 0xFF00) >> 8)) / 255.0 + blue:((float)(hexValue & 0xFF)) / 255.0 + alpha:alphaValue]; +} + + ++ (CGFloat)getStatuHeight{ + if(@available(ios 13.0,*)){ + NSSet *set = [UIApplication sharedApplication].connectedScenes; + UIWindowScene * windowScene = [set anyObject]; + UIStatusBarManager *statusBarManager = windowScene.statusBarManager; + return statusBarManager.statusBarFrame.size.height; + + } + else{ + return [UIApplication sharedApplication].statusBarFrame.size.height; + } + +} + ++ (CGFloat)getStatuAndStatuHeight{ + return [self getStatuHeight]+[self getNavHeight]; +} ++ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size +{ + CGRect rect = CGRectMake(0, 0, size.width, size.height); + UIGraphicsBeginImageContext(rect.size); + CGContextRef context = UIGraphicsGetCurrentContext(); + CGContextSetFillColorWithColor(context,color.CGColor); + CGContextFillRect(context, rect); + UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + return img; +} +@end + diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/sysInfo.h b/star_lock/ios/Runner/XSTalkManager/Utils/sysInfo.h new file mode 100755 index 00000000..44df0d16 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/sysInfo.h @@ -0,0 +1,57 @@ +// +// sysInfo.h +// myhome +// +// Created by hkh on 15/10/31. +// +// + +#import +#import +//#import "ServicesModel.h" + +@interface sysInfo : NSObject + +@property sqlite3 *db; +@property (nonatomic,copy) NSString *token; +@property (nonatomic,copy) NSString *pushkitToken; +@property (nonatomic,copy) NSString *equid; +@property (nonatomic,copy) NSString *equip; +@property (nonatomic,copy) NSString *equmac; +@property (nonatomic,assign) long launchtime; +@property (nonatomic,assign) int port; +@property (nonatomic,copy) NSString *server;//url +@property (nonatomic,strong) NSString * server_wan; +@property (nonatomic,assign) int server_port; +@property (nonatomic,assign) int equ_server; +@property (nonatomic,assign) int code_mode; +@property (nonatomic,assign) int user; +@property (nonatomic,copy) NSString *lasttime; +@property (nonatomic,assign) int maxid; +@property (nonatomic,assign) int _areaid; +@property (nonatomic,copy) NSString *areaname; +@property (nonatomic,assign) int reporttime; +@property (nonatomic,assign) long smscodetime; +@property (nonatomic,copy) NSString *tserver; +@property (nonatomic,copy) NSString *tserver_wan; +@property (nonatomic,copy) NSString *tserver_lan; +@property (nonatomic,copy) NSString *areaid; +@property (nonatomic,copy) NSString *username; +@property (nonatomic,assign) int subequid; +@property (nonatomic,copy) NSString *sysver; + +@property (nonatomic, strong) NSString *reftime; // +@property (nonatomic, strong) NSString *span; // +@property (nonatomic, strong) NSString *services; //服务开通 + +@property (nonatomic,assign) int sandbox; +@property (nonatomic,assign) int push; +@property (nonatomic,assign) int HF; +- (void)readSystemInfo; +- (Boolean)initDB; +- (void)sqlexe:(NSString *)sql; +- (void)setSystemInfo:(NSString *)key WithValue:(NSString *)value; +- (void)SaveRecord:(long)time Type:(NSString *)type Equ:(NSString *)equid Img:(NSString *)img Note:(NSString *)note; +- (NSMutableArray *)readRecord:(NSString *)no; +- (void)delRecord:(NSString *)condition; +@end diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/sysInfo.m b/star_lock/ios/Runner/XSTalkManager/Utils/sysInfo.m new file mode 100755 index 00000000..b69d9c6c --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/Utils/sysInfo.m @@ -0,0 +1,225 @@ +// +// sysInfo.m +// myhome +// +// Created by hkh on 15/10/31. +// +// + +#import "sysInfo.h" +#import "Opendoor.h" + +@interface sysInfo () + +@end +@implementation sysInfo{ + +} + +@synthesize db = db; + +- (Boolean)initDB{ + //打开数据库 + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //获取应用程序生成一个私有目录/Users/apple/Library/Application Support/iPhone Simulator/4.3/Applications/550AF26D-174B-42E6-881B-B7499FAA32B7/Documents + NSString *documentsDirectory = [paths objectAtIndex:0]; // + NSString *path = [documentsDirectory stringByAppendingPathComponent:@"linetsql.sqlite"]; + + if (sqlite3_open([path UTF8String], &db) != SQLITE_OK) { + sqlite3_close(db); + NSLog(@"数据库打开失败"); + return FALSE; + } + else { + NSLog(@"数据库打开成功"); + return TRUE; + + } +} + +- (void)sqlexe:(NSString *)sql +{ + char *err; + int ret = sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err); + + NSLog(@"数据库操作结果!%d",ret); + if ( ret!= SQLITE_OK) { + sqlite3_close(db); + NSLog(@"数据库操作数据失败!%@",[NSString stringWithUTF8String:err]); + } +} + + +- (void)readSystemInfo +{ + self.equid = @""; + self.username = @""; + self.server_wan = @"8.129.71.206"; + self.server_port = 8367; + self.port = 8366; + self.equip = @"0.0.0.0"; + self.reporttime = 15; + self.smscodetime = 0; + self.pushkitToken = @""; + self.push = 1; + self.HF = 0; + self.sandbox = 0; + + NSString *sql = @"SELECT * FROM linet_sysinfo"; + sqlite3_stmt * statement; + + if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) { + NSLog(@"sqlite3_prepare_v2 OK"); + while(sqlite3_step(statement) == SQLITE_ROW) { + NSString *key = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0) ]; + if( [@"equid" isEqualToString: key]){ + self.equid = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; + } + else if([@"push" isEqualToString: key]){ + self.push = [[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)] intValue]; + } + else if([@"HF" isEqualToString: key]){ + self.HF = [[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)] intValue]; + } + +// else if( [@"equip" isEqualToString: key]){ +// self.equip = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; +// } +// else if([@"equmac" isEqualToString: key]){ +// self.equmac = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; +// } +// else if([@"port" isEqualToString: key]){ +// self.port = [[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)] intValue]; +// } +// else if([@"server" isEqualToString: key]){ +// self.server = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; +// } +// else if([@"server_wan" isEqualToString: key]){ +// self.server_wan = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; +// } +// else if([@"server_port" isEqualToString: key]){ +// self.server_port = [[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)] intValue]; +// } + else if([@"lasttime" isEqualToString: key]){ + self.lasttime = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; + } + else if([@"username" isEqualToString: key]){ + self.username = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; + } + else if([@"token" isEqualToString: key]){ + self.token = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; + } + else if([@"smscodetime" isEqualToString: key]){ + self.smscodetime = [[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)] longLongValue]; + } + } + } + else{ + //没有linet_sysinfo,初始化数据库 + + NSLog(@"sysinfo不存在,创建表并初始化数据库"); + //创建系统参数表 + sql=@"DROP TABLE if exists linet_sysinfo"; + NSLog(@"drop"); + [self sqlexe:sql]; + + sql =@"create table linet_sysinfo(pname string primary key,pvalue string)"; + [self sqlexe:sql]; + + sql =@"create table record(no integer PRIMARY KEY AUTOINCREMENT,stime long,type string,username string,equid string,name string,img string,note string)"; + [self sqlexe:sql]; + + } +} + + + + +- (void)SaveRecord:(long)time Type:(NSString *)type Equ:(NSString *)equid Img:(NSString *)img Note:(NSString *)note{ + NSString *name = [Opendoor EquNameById:equid]; + NSString *sql = [[NSString alloc] initWithFormat: @"insert into record(stime,type,username,equid,name,img,note) values (%ld,'%@','%@','%@','%@','%@','%@')",time,type,self.username,equid,name,img,note] ; + NSLog(sql); + [self sqlexe:sql]; +} +- (NSMutableArray *)readRecord:(NSString *)no{ + NSMutableArray *ret = [[NSMutableArray alloc] initWithCapacity:0]; + NSString *sql; + if(no){ + sql = [[NSString alloc] initWithFormat:@"SELECT no,stime,type,equid,name,img,note FROM record where username='%@' and no<%@ order by no desc limit 0,20",self.username,no] ; + } + else{ + sql = [[NSString alloc] initWithFormat:@"SELECT no,stime,type,equid,name,img,note FROM record where username='%@' order by no desc limit 0,20",self.username] ; + } + //sql = @"SELECT no,stime,type,equid,name,img,note FROM record order by no desc" ; + NSLog(sql); + sqlite3_stmt * statement; + if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) { + NSLog(@"sqlite3_prepare_v2 OK"); + while(sqlite3_step(statement) == SQLITE_ROW) { + + NSDictionary *dic = [[NSDictionary alloc] initWithObjects:@[ + [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0) ], + [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1) ], + [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 2) ], + [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 3) ], + [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 4) ], + [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 5) ], + [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 6) ] + ] + forKeys:@[@"no",@"stime",@"type",@"equid",@"name",@"img",@"note"]]; + +// for (id key in dic) { +// id value=[dic objectForKey:key]; +// NSLog(@"readRecord:%@:%@",key,value); +// +// } + [ret addObject:dic]; + } + } + return ret; +} +- (void)delRecord:(NSString *)condition{ + NSString *sql = [[NSString alloc] initWithFormat:@"select img FROM record where username='%@' and type='截图' %@",self.username,condition] ; + sqlite3_stmt * statement; + if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) { + NSLog(@"sqlite3_prepare_v2 OK"); + while(sqlite3_step(statement) == SQLITE_ROW) { + NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; + NSString *imageFilePath = [path stringByAppendingPathComponent:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0) ]]; + [[NSFileManager defaultManager] removeItemAtPath:imageFilePath error:nil]; + } + } + + sql = [[NSString alloc] initWithFormat:@"delete FROM record where username='%@' %@",self.username,condition] ; + NSLog(sql); + [self sqlexe:sql]; +} +- (void)setSystemInfo:(NSString *)key WithValue:(NSString *)value +{ + + NSString *sql = [[NSString alloc] initWithFormat: @"SELECT * FROM linet_sysinfo where pname='%@'",key] ; + sqlite3_stmt * statement; + + int ret = sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil); + if(ret == SQLITE_OK) { + if(sqlite3_step(statement) == SQLITE_ROW) { + sql = [[NSString alloc] initWithFormat: @"update linet_sysinfo set pvalue='%@' where pname='%@'",value,key] ; + } + else{ + sql = [[NSString alloc] initWithFormat: @"insert into linet_sysinfo(pname,pvalue) values('%@','%@')",key,value] ; + } + NSLog(@"%@",sql); + [self sqlexe:sql]; + + } + else{ + NSLog(@"setSystemInfo 失败:%d",ret); + } + +// NSString *sql = [[NSString alloc] initWithFormat:@"update linet_sysinfo set equid='%@',equip='%@',equmac='%@',port=%d,server='%@',server_wan='%@',server_lan='%@',equ_server=%d,code_mode=%d,subequid=%d",sysinfo.equid,sysinfo.equip,sysinfo.equmac,sysinfo.port,sysinfo.server,sysinfo.server_wan,sysinfo.server_lan,sysinfo.equ_server,sysinfo.code_mode,sysinfo.subequid]; +// NSLog(@"%@",sql); +// [self sqlexe:sql]; + + +} +@end + diff --git a/star_lock/ios/Runner/XSTalkManager/mainPage/Opendoor.h b/star_lock/ios/Runner/XSTalkManager/mainPage/Opendoor.h new file mode 100755 index 00000000..102cee55 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/mainPage/Opendoor.h @@ -0,0 +1,25 @@ +// +// FirstViewController.h +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import +#import "BaseViewController.h" + +@interface Opendoor : BaseViewController + ++ (void)refEqulist:(void (^)(void)) handler; ++ (NSArray *)getEqulist; ++ (NSString *)EquNameById:(NSString *)equid; +- (void)OpenDoorStep1:(NSString *)pwd; +- (void)OpenDoorStep2; +- (void)OpenDoorEnd; +//- (void)OpendoorGo; +//- (void)OpenEnd:(NSString *)msg; +//- (void)alert:(NSString *)msg; + +@end + diff --git a/star_lock/ios/Runner/XSTalkManager/mainPage/Opendoor.m b/star_lock/ios/Runner/XSTalkManager/mainPage/Opendoor.m new file mode 100755 index 00000000..48c025e9 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/mainPage/Opendoor.m @@ -0,0 +1,413 @@ +// +// FirstViewController.m +// Talk +// +// Created by xuzs on 22/10/11. +// Copyright (c) 2022年 xuzs. All rights reserved. +// + +#import "Opendoor.h" +#import "UI.h" +#import "HttpManager.h" +#import "Msg.h" +#import "Pub.h" +#import "sysInfo.h" +#import "Call.h" +#import "EquAdd.h" +#import "EquConfig.h" +#import "P2pTest.h" +#import "Sformat.h" + +@interface Opendoor () + +@property (nonatomic, strong)UIView *rview,*headView,*topView,*bottomView,*openView,*openBgView; +@property (nonatomic, strong)UILabel *titleLabel; +@property (nonatomic, strong)UIImageView *rightImage,*watchImage,*openImage,*wave1Image,*wave2Image,*wave3Image; +@property (nonatomic, strong)UIButton *selequButton; +@property (nonatomic, strong)UIAlertController *openAlert; +@property NSArray *equlist; +@property int selIndex; +@property NSString *pwd; + +@property long p2p_click_times; +@property long p2p_click_time; + +@end + +@implementation Opendoor + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. + [self setNavTitle:@"手机开门"]; + [self setNavRight:@"setting" action:@selector(ConfigEqu) ]; + [self setNavLeft:@"blank" action:@selector(P2ptest) ]; + [self setupViews]; + [self setUI]; + [Opendoor refEqulist:nil]; + self.p2p_click_time = 0; +} +- (void)setupViews +{ + + + [self.view addSubview:self.rview]; + //[self.rview addSubview:self.headView]; + [self.rview addSubview:self.topView]; + [self.rview addSubview:self.bottomView]; + + + //[self.headView addSubview:self.titleLabel]; + //[self.headView addSubview:self.rightImage]; + + + [self.topView addSubview:self.selequButton]; + [self.topView addSubview:self.watchImage]; + [self.topView addSubview:self.wave1Image]; + [self.topView addSubview:self.wave2Image]; + [self.topView addSubview:self.wave3Image]; + + + [self.bottomView addSubview:self.openView]; + [self.openView addSubview:self.openBgView]; + [self.openView addSubview:self.openImage]; + + + [self.watchImage addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Watch)]]; + [self.selequButton addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(SelEqu)]]; + [self.openView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(OpenDoor)]]; +} +- (void)setUI{ + [UI SetRView:self.rview Top:@"0" Right:@"0" Bottom:@"0" Left:@"0"]; + + + //[UI setFrameInView:self.headView Width:@"100vw" Height:@"70" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UITopMid]; + [UI setFrameInView:self.topView Width:@"100vw" Height:@"55vh" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UITopMid]; + [UI setFrameInView:self.bottomView Width:@"100vw" Height:@"45vh" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UIBottomMid]; + [UI chgMargin:self.topView Css:[[NSString alloc] initWithFormat:@"%f 0 0 0",[UI getStatuAndStatuHeight]]]; + + + + //[UI setFrameInView:self.titleLabel Width:@"100vw" Height:@"50" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UIBottomMid]; + //[UI chgMargin:self.titleLabel Css:@"0 50 0 50"]; + //[UI setFrameInView:self.rightImage Width:@"20" Height:@"20" TranslateX:@"15" TranslateY:@"15" InView:nil Position:UIBottomRight]; + + [UI setFrameInView:self.selequButton Width:@"70vw" Height:@"50" TranslateX:@"0" TranslateY:@"30%" InView:nil Position:UITopMid]; + [UI chgMargin:self.selequButton Css:@"0 55 0 0"]; + [UI setFrameByView:self.watchImage Width:@"50" Height:@"50" TranslateX:@"5" TranslateY:@"0" ByView:self.selequButton Position:RightAlignCenter]; + + + [UI setFrameInView:self.wave1Image Width:@"122vw" Height:@"66" TranslateX:@"0" TranslateY:@"-6" InView:nil Position:UIBottomMid]; + [UI setFrameInView:self.wave2Image Width:@"112vw" Height:@"68" TranslateX:@"8vw" TranslateY:@"-4" InView:nil Position:UIBottomMid]; + [UI setFrameInView:self.wave3Image Width:@"104vw" Height:@"70" TranslateX:@"0" TranslateY:@"-2" InView:nil Position:UIBottomMid]; + + + [UI setFrameInView:self.openView Width:@"35vw" Height:@"35vw" TranslateX:@"0" TranslateY:@"-20%" InView:nil Position:UICenter]; + [UI setFrameInView:self.openBgView Width:@"35vw" Height:@"35vw" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter]; + [UI setFrameInView:self.openImage Width:@"35%" Height:@"35%" TranslateX:@"0" TranslateY:@"0" InView:nil Position:UICenter]; + + //设置圆角 + [UI setCornerRadius:self.openView]; + [UI setCornerRadius:self.openBgView]; + [UI setGradientBorder:self.openBgView withColor:0x378fe8]; + + +} + + + +- (void)SelEqu{ + if([self hasEqu]==NO)return; + [Msg Select:self SourceView:self.selequButton Title:@"选择设备" Options:self.equlist SelectedHandler:^(int index) { + if(index>0){ + self.selIndex = index; + [_selequButton setTitle:[self.equlist[index] valueForKey:@"name"] forState:UIControlStateNormal]; + } + }]; +} +- (BOOL)hasEqu{ + BOOL ret = YES; + if(self.selIndex==-2){ + ret = NO; + // + [self alert:@"正在获取设备,请稍候"]; + } + else if(self.selIndex==-1){ + ret = NO; + ////是否添加设备 + [Msg MessageBox:self Msg:@"您尚未添加设备,是否立即添加?" SelectedHandler:^(int index) { + + EquAdd *equadd = [[EquAdd alloc] init]; + [self.navigationController pushViewController:equadd animated:YES]; + + }]; + + } + + return ret; +} +- (void)Watch{ + if([self hasEqu]==NO)return; + [Pub getApp].callOut = [[Call alloc] init]; + [Pub getApp].callOut.CallTag = @"WATCH"; + [[Pub getApp].talk SetRemoteEqu:[self.equlist[self.selIndex] valueForKey:@"equid"]]; + UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:[Pub getApp].callOut]; + nav.modalPresentationStyle = UIModalPresentationFullScreen; + [[Pub getApp].window.rootViewController presentViewController:nav animated:YES completion:nil]; +} +- (void)ConfigEqu{ + NSLog(@"ConfigEqu"); + if([self hasEqu]==NO)return; + EquConfig *equconfig = [[EquConfig alloc] init]; + equconfig.equid = [self.equlist[self.selIndex] valueForKey:@"equid"]; + [self.navigationController pushViewController:equconfig animated:YES]; +} +- (void)P2ptest{ + if([Sformat timestamp] - self.p2p_click_time<=1000){ + self.p2p_click_times ++; + } + else{ + self.p2p_click_times = 0; + } + self.p2p_click_time = [Sformat timestamp]; + if(self.p2p_click_times>5){ + [Pub getApp].p2ptest = [[P2pTest alloc] init]; + [self.navigationController pushViewController:[Pub getApp].p2ptest animated:YES]; + } + +} +- (void)OpenDoor{ + if([self hasEqu]==NO)return; + + [[Pub getApp].talk SetRemoteEqu:[self.equlist[self.selIndex] valueForKey:@"equid"]]; + self.openAlert = [Msg OpendoorByPwd:self SelectedHandler:^(int index) { + [self alert:@"请输入6位数字密码"]; + }]; + + + +} +- (void)OpenDoorStep1:(NSString *)pwd{ + if(self.openAlert){ + [self.openAlert dismissViewControllerAnimated:YES completion:nil]; + //[[Pub getApp].talk openDoor:pwd]; + self.pwd = pwd; + [[Pub getApp].talk watchByServer]; + + CABasicAnimation* rotationAnimation; + rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; + rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 /* full rotation*/ * 1 * 1 ]; + rotationAnimation.duration = 1; + rotationAnimation.cumulative = YES; + rotationAnimation.repeatCount = 15.0; + rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; + + self.openBgView.hidden = NO; + [self.openBgView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; + + } +} + +- (void)OpenDoorStep2{ + [[Pub getApp].talk openDoor:self.pwd]; +} +- (void)OpenDoorEnd{ + NSLog(@"OpenDoorEnd11"); + dispatch_async(dispatch_get_main_queue(), ^{//转到主线程处理 + //[self.openBgView.layer removeAllAnimations]; + [self.openBgView.layer removeAnimationForKey:@"transform.rotation.z"]; + self.openBgView.hidden = YES; + }); + + +} + ++ (void)refEqulist:(void (^)(void)) handler{ + UITabBarController *tab = (UITabBarController *)[Pub getApp].window.rootViewController; + if(tab){ + BaseNavigationController *nav = tab.viewControllers[1] ; + Opendoor *opendoor = nav.childViewControllers[0]; + if(opendoor){ + opendoor.selIndex = -2;//未获取到设备 + [HttpManager EquList:[Pub getSysInfo].username Token:[Pub getSysInfo].token HttpResultHandler:^(NSDictionary *json) { + if([[json objectForKey:@"result"] isEqualToString:@"ok"]){ + opendoor.equlist = [json objectForKey:@"data"]; + NSLog(@"设备数:%lu",(unsigned long)opendoor.equlist.count); + if(opendoor.equlist.count>0){ + opendoor.selIndex = 0; + [opendoor.selequButton setTitle:[opendoor.equlist[0] valueForKey:@"name"] forState:UIControlStateNormal]; + } + else{ + opendoor.selIndex = -1;//没有设备 + [opendoor.selequButton setTitle:@"无设备" forState:UIControlStateNormal]; + } + if(handler){ + handler(); + } + + } + }]; + } + } + + +} + ++ (NSArray *)getEqulist{ + UITabBarController *tab = (UITabBarController *)[Pub getApp].window.rootViewController; + if(tab){ + BaseNavigationController *nav = tab.viewControllers[1] ; + Opendoor *opendoor = nav.childViewControllers[0]; + if(opendoor){ + return opendoor.equlist; + } + } + return nil; +} + ++ (NSString *)EquNameById:(NSString *)equid{ + NSArray *list = [Opendoor getEqulist]; + if(list){ + for(int i=0;i +#import + +@interface RingCall : NSObject ++ (instancetype)sharedMCCall; +- (void)regsionPush; +- (void)onCancelRing; +- (void)onCallRing:(NSString *)CallerName; +@end diff --git a/star_lock/ios/Runner/XSTalkManager/pushkit/RingCall.m b/star_lock/ios/Runner/XSTalkManager/pushkit/RingCall.m new file mode 100755 index 00000000..64fab409 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/pushkit/RingCall.m @@ -0,0 +1,89 @@ +// +// RingCall.m +// VoIPTest +// +// Created by Tg W on 17/2/21. +// Copyright © 2017年 oopsr. All rights reserved. +// +#import "RingCall.h" +#import "VideoTalkManager.h" +#import + +@interface RingCall (){ + UILocalNotification *callNotification; + UNNotificationRequest *request;//ios 10 +} +@end + +@implementation RingCall ++ (instancetype)sharedMCCall { + + static RingCall *callInstane; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + if (callInstane == nil) { + callInstane = [[RingCall alloc] init]; + [[VideoTalkManager sharedClinet] setDelegate:callInstane]; + } + }); + return callInstane; +} + +- (void)regsionPush { + //iOS 10 + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) { + if (!error) { + NSLog(@"request authorization succeeded!"); + } + }]; + [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { + NSLog(@"%@",settings); + }]; + +} + +#pragma mark-VideoCallbackDelegate +//铃声呼叫 +- (void)onCallRing:(NSString *)CallerName { + if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) { + UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter]; + UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init]; + content.body =[NSString localizedUserNotificationStringForKey:[NSString + stringWithFormat:@"%@", CallerName] arguments:nil];; + UNNotificationSound *customSound = [UNNotificationSound soundNamed:@"voip_call.caf"]; + content.sound = customSound; + UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger + triggerWithTimeInterval:1 repeats:NO]; + request = [UNNotificationRequest requestWithIdentifier:@"Voip_Push" + content:content trigger:trigger]; + [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { + + }]; + }else { + + callNotification = [[UILocalNotification alloc] init]; + callNotification.alertBody = [NSString + stringWithFormat:@"%@", CallerName]; + //@"邀请你进行通话。。。。"]; + + callNotification.soundName = @"voip_call.caf"; + [[UIApplication sharedApplication] + presentLocalNotificationNow:callNotification]; + + } + +} + +- (void)onCancelRing { + //取消通知栏 + if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) { + NSMutableArray *arraylist = [[NSMutableArray alloc]init]; + [arraylist addObject:@"Voip_Push"]; + [[UNUserNotificationCenter currentNotificationCenter] removeDeliveredNotificationsWithIdentifiers:arraylist]; + }else { + [[UIApplication sharedApplication] cancelLocalNotification:callNotification]; + } + +} +@end diff --git a/star_lock/ios/Runner/XSTalkManager/pushkit/VideoTalkManager.h b/star_lock/ios/Runner/XSTalkManager/pushkit/VideoTalkManager.h new file mode 100755 index 00000000..e8f0e625 --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/pushkit/VideoTalkManager.h @@ -0,0 +1,41 @@ +// +// VideoTalkManager.h +// VoIPTest +// +// Created by Tg W on 17/2/21. +// Copyright © 2017年 oopsr. All rights reserved. +// + +#import +#import + +@protocol VideoCallbackDelegate + +/** + * 当APP收到呼叫、处于后台时调用、用来处理通知栏类型和铃声。 + * + * @param name 呼叫者的名字 + */ +- (void)onCallRing:(NSString*)name; +/** + * 呼叫取消调用、取消通知栏 + */ +- (void)onCancelRing; +/** + * APP收到呼叫、从后台回到前台时或者APP就在前台会调用、用于弹出呼叫界面。 + * + * @param aSession 会话实体 + * @param Callername 呼叫者名字 + */ + +@end + +@interface VideoTalkManager : NSObject + ++ (VideoTalkManager *)sharedClinet; + +- (void)initWithSever; + +- (void)setDelegate:(id)delegate; + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/pushkit/VideoTalkManager.m b/star_lock/ios/Runner/XSTalkManager/pushkit/VideoTalkManager.m new file mode 100755 index 00000000..da4977ef --- /dev/null +++ b/star_lock/ios/Runner/XSTalkManager/pushkit/VideoTalkManager.m @@ -0,0 +1,131 @@ +// +// VideoTalkManager.m +// VoIPTest +// +// Created by Tg W on 17/2/21. +// Copyright © 2017年 oopsr. All rights reserved. +// + +#import "VideoTalkManager.h" +#import +#import "RingCall.h" +#import "AppDelegate.h" +#import "Pub.h" +#import "HttpManager.h" +/**************注意事项****** +1、证书制作是否完成 +2、APP bundle identity是否替换成自己的 +3、测试推送时确保推送的设备token跟上传的设备token一致 +*************/ +@interface VideoTalkManager (){ + + NSString *token; + AppDelegate *app; +} + +@property (nonatomic,strong)idmydelegate; + +@end + +@implementation VideoTalkManager + +static VideoTalkManager *instance = nil; + ++ (VideoTalkManager *)sharedClinet { + + if (instance == nil) { + + instance = [[super allocWithZone:NULL] init]; + } + return instance; +} + +-(void)initWithSever { + NSLog(@"initWithSever"); + //voip delegate + app = (AppDelegate *)[[UIApplication sharedApplication]delegate]; + PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()]; + pushRegistry.delegate = self; + pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP]; + + //ios10注册本地通知 + if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) { + + [[RingCall sharedMCCall] regsionPush]; + } + +} + +- (void)setDelegate:(id)delegate { + + self.mydelegate = delegate; +} + + +#pragma mark -pushkitDelegate + +- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type{ + NSLog(@"didUpdatePushCredentials"); + if([credentials.token length] == 0) { + NSLog(@"voip token NULL"); + return; + } + //应用启动获取token,并上传服务器 + NSLog(@"didUpdatePushCredentials:%@",credentials.token); + token = [[[[credentials.token description] stringByReplacingOccurrencesOfString:@"<"withString:@""] + stringByReplacingOccurrencesOfString:@">" withString:@""] + stringByReplacingOccurrencesOfString:@" " withString:@""]; + //token上传服务器 + //[self uploadToken]; + [Pub getApp].sysinfo.pushkitToken = token; + NSLog(@"didUpdatePushCredentials:%@",[Pub getApp].sysinfo.pushkitToken); +// [HttpManager postPushkitToken:[Pub getApp].sysinfo.username Token:[Pub getApp].sysinfo.token PushkitToken:token HttpResultHandler:^(NSDictionary *json) { +// NSLog(@"上传token成功"); +// }]; + //[app uploadTokenWithToken:token]; + //app.pushkitToken = [NSString stringWithFormat:@"%@", token]; + //NSLog(@"get pushkit token:%@", token); +} + +- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type{ + NSLog(@"didReceiveIncomingPushWithPayload"); +#if 1 + BOOL isCalling = false; + switch ([UIApplication sharedApplication].applicationState) { + case UIApplicationStateActive: { + //isCalling = false; + //[app onCallRing:@"jjfj"]; + isCalling = true; + } + break; + case UIApplicationStateInactive: { + //isCalling = false; + isCalling = true; + } + break; + case UIApplicationStateBackground: { + isCalling = true; + } + break; + default: + isCalling = true; + break; + } + NSDictionary *dic = [payload.dictionaryPayload objectForKey:@"aps"]; + NSString *info = [dic objectForKey:@"alert"]; + if (isCalling){ + //本地通知,实现响铃效果 + //NSLog(@"%@", [dic objectForKey:@"alert"]); + [self.mydelegate onCallRing:info]; + } + else { + [[RingCall sharedMCCall] onCallRing:info]; + } +#endif + + +} + + + +@end diff --git a/star_lock/ios/Runner/XSTalkManager/pushkit/voip_call.caf b/star_lock/ios/Runner/XSTalkManager/pushkit/voip_call.caf new file mode 100755 index 0000000000000000000000000000000000000000..f316df2224f8dbf620b96ac30f9bef7d5ad01930 GIT binary patch literal 755200 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%0AX@O8 zKbUXk9p)*xA}*Vgi_c&g7)LN6eJ8CR*2_>*fA>LWzTIIB1OLtogFwGPdqZ8P9Hr38 zPPY$f8zOzyI;XXN>*&_Ctw&ogwVrO>(z+d-0r#Zu+pO(l4-s9{Pj*hdAd!DL%bI}Ej=@txt4JXyH9_Eo~Mna3K1Q!g3UxI@sIl&a0y2_^BjF0U+r`45q6iY z-BxF71`^sm`z#03`QEwBmE_KJ&n41Gqu^<2kZ@WQ^vs>aOpIt&cf2E8$=(ijsfFA^ z?hsxjZwCJZpDq|9SR)uIP{aIN#)Hg1%)V}TSJp7*7)BIUj!vMxf-~~JBocAkwbq&H z_-%`^?ls$tdku+tx3(5I{1<@_J`>ifwX#p`LG5p#qitc^%C;+QWo_EF=C%U(>Dz8? z$K;b0b;=X!ZraPb-+G6kt7)}4(=yf;;qZ2u-G@k0aB`GV$D?QIA21ao1jvmpd=qdD zoopV5V7I}qgECey& zyUI{7{csO?@hRt_0Z*vAGFcU@mZ~pl_G+K&Ec(Gl$V6H;SS_~oK;^E2exsMfdeSWN zWlA9R1FbiG2R5Bi#_(beXRZM2MjLYg>o9mXZn74!B3M*b8}k8k6jQ-i!N|iHSZDfF zbQ|psSeoRNo|Go?ZE_NM6_B1Mx|g}Kom-r{oY~HS;A~*HS#FA31Z2Rs?q1;I*g_ge zjt4TS9Lc3V1seYndKwnN@Mi|HF#I*1%)SSd)YF_GAQi9Y>3A6bF3-YE=5FUyvB$96 z@!R-9T+5Px`{N)MPJct|O8r4uOzuvKArSW)=ORa_J>NPP^3$)3hYjg)n--!igt)4& zvcKZ4e2RRKe1JSwZk9cf&4+%up|b5Vlk63AbzV^}Q~9aCtJiDBfJI=d{w0j34we*K zyrUzGrj?|J zlE=A!xz`XFDIGYOpTKg_N;!&5q7I?WLDT7Hu}6$Q%Luo<2(VFN+#&(t;>nAoAy+NBt|BC&f&jbs} z9_%CY9WKSw@B}!Ej$>}cZqRUQ2hs;OPU(#tr|PJy$PXxSw0LA7q9Foo2Q0;=j^>ND zCUcVM3^*NTyGD@@1Fv^EcuJ;_Pm-eDQ=C(6TOA|ZF85DzE~SF94L!sh3c1eB_$wI4 z2>ykmX72_PWY+92%`a2pOaTJ)dPBjx-y zZ?LF7l>L-_Xit`5>b?54=9AVqbGT`XdAEgPyK2dX4EGenNb`OBPawYj>)t|Mg+5~3 zX4vW7(En(j=mhjURYY!d&m`7U($Hw^4fYKqGcs8|oL=}S>=qJDdI_f&lk0%Z$E3>2DdWLoT=^r z_ZNo{n8*#z#iW^(aG;fsrLAXr@Nxt{gwsSWQGX99^a#!oSMpEssDhJ1RQy0p1&dlY zuK?c#{(b#$@5P=j$#8L;@CD})Lx2vZN`b1ngL)IF>@4aypqyj02k5c%0*-DA`4zQ0y*s8sskC$?2nnR- zB5%lTgw;Kagdt(HuJlWofuYCmz&fPldUC???yM7F2bzz)fiCN* ziiBChK*42>H<11L3=ZTs4b%nHJQ_jwVm2~wGGZ{4&PNs0r{rvB6x=pUH9s~_HvQ6P z=yJ4ob%PDn(8qmESq6QvOr=PErfo}0baQJ=zvmop~-5X(<%}AL%Ii2y`Gs$S0VcS?id&%qG?u4#95|6botv zHG=h`1>!-X9|8q;7eoo)*)!Pxfa6QV8jBBwxXXa=V1B{c=_}}4X+D&5L@2O}QTI#8 z=q(0%akLY6pNF@=chVhX#{`Ge!Ek7;eXP@L6%Mi6+bwh5bhAkeB%Rg*-1}a%Bs2$$ zV9FU)*lPMEV7WeFo?^8#4UCt}bi9oHlx<@bGuC2T!F4eaZmyKTzh6ySNurScbKi2J z;8C0INO3H&8O$UT!)P~LGAsw1@EA>_TA|sg&C>j%PF77*El}IlZgnrUm#U*`wR(r< zibe=FpQ&1l?u22MaS$+{-x)p4S>TpJYzu5N?OmPY-Tx8YNV`eB$t1)FdJ-p~{^%Uo zg>C{zcRltWeLH;()}J|u^_sbdk&cbSim*cLBfXjC3Fihf)r=sra(CZ4*}+)+dr z`6v*HM}Xl_LG^+x@kholMm+O4>j*oEOK>B2eRu}me8C~%2Dr6~66}WD-Wt(X(P`m4 zK|cR8{}%rvkIg;L{*DLW16eZ}dr=X!3&lYSB+Yi$fr0C$<*iv{{?C}Ff27S-lhkij zHsxx#2VC0TqkU@o{Pw?X`O?$U3vFv;eu`BJot%&}m0DGa=DPN(wqEP6?`KRk2Utdf zDS>bEbBuT8yJLuWqKNpHyd9ZAWl&EbUm?G?3tbKL`RnLVRE;|6>#zuH8(j$Yj!pE< z^mpiJS~QhRy-AIy<$#5yFL0chlmV1mV1o!IYTRoH2hl=|Clu~31etUPIM;_s%fV*x zoqUr*gP8stB?37~?S*at`+@>0Y=8D>HZI{H>5>M3>Zp- zM&DI8N#mt10*~@u)n;XkqMO`DK24q?pDqh)U)`3~_N;xWY^hA%{b)ymh&HA(&lcrVW-4P|2YMXG{~^W%WQ(X>ZU=V8A=f2xe8_OrXBAxwE-V+|9fP zyrn#EaQt-#*Pojk1UEBX*iXPYv>(=%{tOBhLw|^hfMTpeq?Bl26AT~^2VPEtYq@Ko ztAlGdWI?^bx%US+#re){PM3oQvFJ&c$W4dYHvo9oBGOxuisVnOA@@NlsSes~bUly+ zF4CWYucwM}i?M@I&Nu_Ms(CC1YbSFMa|tt@*%cy|6>vi6LjQ<!P)*H61n6G@ms}O}oYg4vHk5K>rB%5OId{ zhDF9zP^Z+@qJlf_a$6-Zk7J!roSR(-+!u+pq-qjQ-bU_0iG~=kH;_Wev@5h!^f)ew0t2N$*RqKxd%C(PQXARDgB|?l_YgM;$^{BPL2ESO`x+EX5;KE~#_6v!fGn zZguRpU$D_^gmpGh|Kn_@t?|||*6&s_+}d0Oi$jKu;aCZV3Lp0ucNW1X4}*+^>W!aeU*Zhs{^m~LMewEk0WkO8@)yD92(0sQ{8_w%Tm$DKCyBF- zeG0z|%&lJF`0IonM8AM3rwmB+Qt(4L=?Uv1OMxlSn5%El33MjS9(96hn6g;0 zOz~5W%P-5`$tHs(b)X_mF+x$Ic&&V>I;|e1(P&Dw;lO|CZrWhpWI17_*o%Q%aSF~C z0T4HTqL`5*)HBqhR3VLvn$T(Bl`2EC(FFP(`e}MCO3>EPdea27t<N3W@7PB_StP6PMi#_-t_7-TjG)#7=@rY9f6hdsDa+K4k@^8{z>Tlatf~R5?{a z>qPH^HDkjWEsT6-4eLMLk39j_?XfVLr*XZx4>@N!eC}H=nfDY7BER8u6A4CxNt|T1 z51z!@$~?tLz|NvQXtSudkuwxJxifLcbY;>94niFBg z-Dex+a5=^9I(Hp0kvtfQq%B1Q=r`!Qu@=S<))4$F-hjt}eexrmRsZFVgOjq1yMQ+z zV&%)6U+jtC?LLN2WJwv1F$#8(ZbenJ1Jtg_L|`wpkbc1Z!vdGxndMyR{N$*!_qBJo z|Fq9>90Gc~0jgZ`9p@lhHOsXNxZ!=lONWsskv~HOtAx|Co0bf#V*}JGNErVyPB20k zaR};#yv(6;|O>fZ_t0EE75tVHyS{DfGnbvz-cO+Y#_$E>%k6Ck-w7tom?0Dm-an5w#CT5c|Nprzpf`NtUf2NXuX?zr=XVaNj1N}a|j6ML{5AM7* z^c(1W^fr9=i|BiBDEUw|NIf{(hEV!JPU;ZpGN~(R2$AUi#}(lUg*%5%&Seg(y`$qE z#Gu_B)9q&4P`k^1#BsnOa#Y*XAe*q$xz@SB`O$d?viU1Xoycp+kI73Y&k;Mdp4JmR zgYKcDjO)y&EKht2UWfmJdyt!4H@6>eKaa=1!au=R!K%3$)_q?di#Lu-=j6fOca`;* zIh%1143MQ%BSJ=2l9v-VTw|R(9QW;mZFel)%}d~vl3|RZ4tN>v$@ zeyUNbaMe%cQ)R3wR^3JOT~nbkYxZcb>#FtN4daZzjJHhDmO7~R`U>dGAxd>myZ z#X|NZcLvX4ArS*6&M!nSB9_P@ZjlC)kCL~O&y!OrBIFZdL zNOL0{kmHm>@+Z=IVx{|si|&#`HgB<&WQj9hGBq1-7y|Sp-FU4+vp_Rj9iy726f0Ad zvz1}Wi;8fCk7Bn1*p5m<(N~G7Ca9llwrXE%HQHM`lYX`FhH0mHv}L>1&;G?>bC!WI zs+KrO?h84!?KH4rp;YkB-DG4l-ZMfW!b}7U>{{5tgV^Ehh3r%89AZ|M4N`Oo#+x5jc0%CcN^OUob z>zHem%LD%OxofRE97y~!;s|L2c{!y6vIe;cD|`fP1e!!YOutPprjNyhjP>wzeqwX6 zU6>sVwK}W=xa%@t&)o=KputEV%3Jaravmw0nB{f?H~xqt#<3lYZUZ5!@Y_7u+-UNJ z%D1nEcLs&QXn10nXBZDI5zIK=*vUvX_BN7CJhRz6-?Gc{$TGpY(RRW<(IIzSc3yM+ zb(a&1z;EI~wva^#hx(9O3+JXtS|-?Xf1p3nSKz{4OvkV(m^XHgKAt{^?nA$TX3~t* zz0{@DG1SkH4_-(G1nD z+cj`v;NTp13)LGFoQJ{Jvc>(1I6>-4ZXmy++())iQSiNerd>pT(wnh|U_>0syw4mB z*)k`-oc)e1jxS%hBZdL@rQ|I8EIW(8)VP1PjU2d&U7tvM-xwo9waI09`H7PLO!Ms z@)j9Q{R+OfJnCEcwTW6uJw}yK4Zi`au)4XY9c9GRzB8sjoU%IMB4XFgy} zz~AF-kWuN%KFc<-MVvhLMsRJ6XD7pb$4LAEiwpd~0>%gIFg+c;L$kstUXM(n*kBha zge-owGv9HiOzY)i71NvKUUrqg6*$ zzf`Dty811glwqoV?lm(-LKyYhUA7;XL5Vh0|9jxGSlKY6>Y3 zqyp$7OpRqS_A?W}UHywy%M#&ha4SBV-5XqAqwzM@J=Q-g3hN*fV_stPhOAx+wi7ZR z2s)6qm-+c*ly@=7-YC; z&>5nQla2fS-$AG`oik6ggjq#4!uG{J!IA42>2$-|ROtReoCT|oFQpc;{xo;>Z_S8AnIh^*F_VxDuc9#7W*wJR&HrfhoUiLV9f<4u~#V)tcbvPY2z$+5xu7Wu3 z6%hiKJ}Fs@jDnmV7cE3j(`RFR#$JXFoV)^-j&%<*>nGTGYz8M3a`{i$v)FO$6uAB9 z#x~&-@XIVaL=P2=6vjI2EH6xr>o(~E^_BWP5IGo)Z%jwcGcB=J zt@WvGzkRu5BACdS?*H5q2`6!dl(H3aCM&5ssI#eI)K=sf%(jk56Xg+Q zKV>3?M!5lY6fd$LIR$>Q!CmAa-Vl3<1;k`x1ThH=IRvqkltm)J3Fj2Ko}5V8NXeuO zM(oII>Ll<0@zE9F%-chcg8bJcn0@1!&zLr57uInW72k{7@MyLVy9Rtk>+xe?dAoFv7Fx-Z(!z|tC_sZ$S7zgEpuO;#OK<*TUbzUnLL4w`Zx$^EA#L%xNgFVmMA)J7|G zs$8=4u^Oy7w&(W8j;~I+%a;fvwUTy#%~yhSh8utwSkKSUJ7e$R-S%dzV-zxaGw(79 z<`|fZ<*X*wU)DLeAHB&GGcSW1%a4%{d*3$t6UZ13p}his+ivhDZl&aqHDEbQCUV?o zz_>FBa_M=lN3N@`%dS(dec-x!4Yyi--N)QI_hO=f=uFx~dPyRH$|j_IrffqbkcG;i zo`5;%M_W$2M7s}e&s((pw0<;{Rzv*_>tz!)6W*Z=8HIeOBvWpaE#S`HOb~ESHp>0i z73(_aR6;y=$SwsVkllI>vOP7Hu@HwQm|IMxCb_BIRBfs-m76L}jV8S*5zIvimcN!M zU@{$ArLf81qqSl74)*c(6Lz(IlOr6?$}3zfcuHpXDB=s;C|gKdVHe&{83J!AkXA?A zj>ghe^!wlhHZhJdqgZ!XWXR{IKx8ruKZ_H1H+BM>fKfIKx3KoIG|bN6%zlPx;JYHI zl3IzhQ`nTAV3{34jB;ndy1;Of9ItE(tRpR3&4s3D(*$0Qbxgw@=m2(;w8o z)aU8{>Pz))`T($!Sq#&S-;60x`SrrQ#=^CxTU)LF*lf1T_Wq7mZ~?A$b#?!7#}nI# zHsb$tSFk2&DV|{W^F_j8-bEtG$SmX>@)}~E4M=y0h4Wz^dQvWsJCmJo!pk9DBK0Aa z5qpRY#AEn70!SlBi%DlmuOMIWne>C?A{`|UrC`W41cf)lgs9{+-1NPqM`LfX1q?Cs z5|au${&!X+z8mhZzu`r=0(axJ_%57`&w+FBA?9c%k9n4%z&c_7(reJJ=rYKUY# z5(~Gp-lP)uUDpRV`*9q6JITg_s`w-3CR4a+C}b4g>oNTT-8XHZ_5>I%^VDb5Gu3J8 zq3Yd`+uN(5Yo}{>YCmeb>Xf=?`Z?fj;+g!-ah7DOzfEjUb*yvVa@_(8-Aqy%M9|@g z1NlUq4HoS)V9>^}?^r*^MMf?|%Lr%oW_DvHFjL?TYY3A9r&C|JaX*61#=@{_$ohrS zzoI=*xCMjLPH$=^#-*ug!14%WducZvIfdmfm;Jly{7B==zV zBKJcuU>yV77(yBXF`k&bfqaGh7S^@iup6I+DD*VdLG1&!&@?cG-l2}8&H%S!HAH_E z=zVMf%Z@H}KXQXQw4c?Ah$7}lk2ldH`_)g{G!+}Z zvdh~b;5ZQ7w1TEvwX@s5xR(fveeZY=68fTbjW} z>@%=E&DrZfYG}+9-Zk4}gUsHHo%cBIHz=SscxcqMm}`D{NQ*qba$n(@f~y4;U@5xQ zFvYTxzJifXS!ubYUL$XAiLcHnnv!2twp9Uzdh7^6C3Kmr6+EE-vKrerRhw#1H3w0O zf`TluhHhK>JxlXXUf}zHcEVO`>|~gx{h>YVh{8*KPlulm4i>+neKxl%Saq}hJo#$> zy#7z0`hS$u^wH+y)>FXVT+rV5_vV-KHxZxLk@@R{Vbj2U9Lc<9ypAV&fyao==PJPwG`4|1#i#a4JtA*eK{N4D>Mg-w*#5 zRUNw0BMbdy!IhLoYT2KH9fdc_KQ$jyPd5HBh&9V(ryIp(slQfzNPPMJ)$-4txu?pH zHBD328`B;6&LieND&KYr5UU6i(qs=a*#u?9f;~N@L*I{<2@Psk(FQOj@t9{&F z?|ch`J4RQ>g(OvUIo$PCXWxz~K_!A_+8k$q`HTL#uD~$VHlAn&Tktq1Uw^R8RLd&) z^*j6fvF}@c@rys!G`Aj7tk-1eI_owl4K3&E3+fIxjZ=`VUub(p<-sT75>pnYrgh=O zZ;I#~DDmy=-ROPSe_mKd$F-ezbnV$Wx+4}E=-G{_c5?J{$onQgowzs-dtQoOgGQfe1;SHFJ-W{ z+~6>-)g6^zY^*96P21|sRgCJgdWNjQ zw1V10NDDq2H>T_89`bIzx_s+&E!G&hGGb8VmDov1)E)=>_8f4i-;hEiRsKzQ+syCY=$>rQ(0k=DBP7UdIeDI(ljRTCmKc*&j9+>1z@<^%bajoCc zA^#3vH!Nh}%N|!cT?~05KF_d_5}h0DevV15&csdkKF2%bB6&safx>@(1bhg3-TU>V z_s_mw{&l!8q`Y%=Q}wIL^3oB-yrP4}b!EkMN%BzZCsZm-_UDEzj9d}fJN#Jib^j>e zO}_SkPGKLTz2dtjEl>WFa4@zmxLR_7SwQT!gzF=>boADz$$?T4b=_N`V8LLuNY(YiFnhW?2uIR_T5# zy0$b|)fO(uKJ}&YeZjkg505`x{B}MoCHHXt{=$@^oWc!-pNjgGYO2bb49b~S3lhnt zc{K*k3!f5oJlYlAHRg4UA$E9NRf4%QquZLE4ZRdSdEJM1Srbo<3=in<(ZaK{?qbPk z0Cg#480m-8+mfy!wT-S5m!Sojzh7kWvgT&HekbHjD$FS!QbH-6SlU?1DPK~#r1p99 zeC0KBEZNDtEUffC8`v-ON!Z0O&#*pWZ^B1J?Tz(}f1ZeT$w~R!B`(R)!4$ULufO;N zTR`tY8BAzgR9B_rq;0P0Kh3Q6@_O&`f_!E6g3L$X?tg#s^VILcyrQD$($D3N3as*0 z1-CMsX%d$iu-oQ|CmX83grYmHLIbdJ3jgT~mRePg$Dly<5~uIp;)UfknXH(nQU ze7^{(pI-Cw-;TGL$ZAlci7du0iK*qQ%+ta)4aM)&s7hm&6lGS_BL z{XO#c{9kXgX}>z<{K~H?olwtEbhB=wjo>$UKMBeV^NhR{RUDlX`>vxtfzx$aZ|OkR zi008rW3{8lkC;E`VQ*22B)%f*bJ*#Sk-?&%@BpWeS@M^=5lwLP)L5JERlWS1RABhC z^-pwOw|r~<_WY-R{`@|hmGFa^`7rZKR^LB@l6|!^+BRytTh{`f<_FDIDe`Mfbqp)2Pv|lKOP(IWvz(Ev<%~DjdaRKifPSQ;yY`u9sb9B_tBosb zE8L#P{4?Q?HqWaNFW&XHf64rkekExo`6XFpvZ|EE88VXLmTNEeRItuxQgBj4R`lf# z);LkZ`6Mi5L-*%>Dh3#aEFC_7#KYnCAu|UI?48lIG$Ai`dqhrfo`1B@Fb{*^F?$OA z9r)gqN^?_YWkJ#6+zVN=GB1B)ee3jX zRkq376@xU=x3K1N`t!ewetRbPIfKX%s+g7Wd5K$+yCo+lI^$YnZbTdp`5AEBcanFl zXPSpyw4Hw(pNVcI;;mh^g7)TyE7emfipq|a<&-s)k;)^>>&kScPfLpbHvD~1y0KDH zA0{2Gj4mp!k+Yp4T1U;=q346Jx~*rJawal6ySwv7>u> z*O26;@#NTHk)y)i1kVZV>u>RS>B$k@XJ^uaTt|(!li<+J%4e2YOJ$`)O1ULt zi#Hbj%umVd{pb6iu!5?;$E$cvCuI%VY75^jM(&`4853DY+1b1b(RQzC{(D0nL=Nh( zG5&2QSN!shAu*RC;zJdIdcQ+HZC+AOm4{p0OAx}2r0*b2w7t`DHn?XXuh2nIEJo%g3c|!W9wMKI z0X3mxq7KK7>G-arPsfbdA5mArG6OI8Uhs6+t8oa8f zm#r_pSU}BRlXoHSb>7sx>_2b*oX!&$I1A_fEh^hpeY~--eU&!T^4h(W_K?+s&y)1? zj`yD*JU8NA?Cnm2IzLZ+)-$uuo4&sNn$y9w#s`oZ- zZo8;FuPrv*HV=bdzEOmoGMwH4pU3~xFq12U!uy*zL3&(UFv=+P1b_X}a9lqp^EqdgE{CHyP6~wf=LRx^7fMebYnf7e$i( zko2aAV zmqL~Y()^;l4vA_xzv&r7wz;D^Q97yqzsh-~gNuoR)%j@Nkle)I=B&&gU%m^!C4Vja z8lO2O+c&TFFItT?ZD@~D|Ix27pR$!YACS7!mN7kf(UQf!Cxa6r*TrUaTo9Mrabkz% zF-M|Uk-6bbVGF~gp*us2fz$mycy<)lROZNS0N!U6h(zikgNtJgx0k z?N`}Ue!P5O#i6R8x-(4`ZPQdM^%nChdyDHoQZ(X^-e+X6Jp?fxYM&8-T|y^Dyo~x8 z{UO>OH88SI_|nkx!6kvA0mJ;J`s8|si_>|(n9HdS*D6b>ZlhwL)Y|yGE~tiC#i%GR zUH-SKa7KRmA3S$TPKVqLdA7o|(txVT_1P_v@?Dxu#xK?aX90;%d(Jq)$r4TjKIN^@ z%Ba!~$K&G?j0vL?8Ht_=CGj)kOdTG@c8p1j+7`Yg_y!Ou|MD5E6zVJ2cgw$eo_d_T zP`bDIYJ;tIc6Cj~tTN+Yd(pSTV}(bGzWt3Z-&P&iaHGZ2jsrs~+@!XiaCRa2Q_o}9 z*<#@#&y9XXL7T&j5h+nuq9#Y(hA9lc|pu53mg6{?m2~_!i@(cAV_l@&i=CcY62iL@Z`6YNR zI+wJ<9%)*oJ*s>pJJ~i|I-^z5T+!IAKD{QjD!pRE|EL8Osa5T@2b+$yO;Q$Wy-h*3 zd?%aai3~tfnVq--@d%%BL7MQmSZ91@Qeu~0DWnv?E)zN*O1=orq}0SM2_Bt3b?g$; zEnFVZ=9$4yWOhch&J0V7{+rrI@vW^(OMJtB)nVn=ipS@xbN2l5%l69t_t*WL{&^D% zcmDkc+`C(=AJ*Qi$D2Z1tJ`O)8uU%z5wlWg65n zbJQoy=cHGeL?lGGUMx4Nri>uQI>q+G);X326Ui8KB3$p-_<_8?PyzfS+3%x zx?VTiB(rvM#sL}P60(yfr*m2Va(W4lOC&xU1I~m*MWjd7MNf(u98(`{jjD}25iu@2 zBdjnqBV#=xT#1|KWX_$fvXgwnR3ruFI$nuGm)+P}DD<{^wE7 z)|}AXb$?#x8;cH=)>qV5H`i4(7Pm0lHz}x^2*Y;kb@w~!P$t}Si{5xH_w5}Z2||LO z2A>Vd21fQlU<~z-FonMc*Gp+Yp3iO%rNDJJxJh|~c4c|+zKHI7KKCj0OAYuN zurHv*pW)xn@4BzV_o$E5`>xk9j|ZYE-dKDRy^h?^36+cbTN;yck36-V3na4erZdT01&xNVCxyc&H%2V}y^? z|9#NAklUdTL+6LC52c5dh0O||5$+5d92Oml1kd-s?A1r4;qaIzX+z1YUDNIU)C_A276ADlna;f`r}3PHONlF#~BT^ zylKW+dYAT%#;wX%jF(kPZ?*`V`!uneHZ?h$w@F9IqLpOLSKTC|z+$(3c5WeFQgYD@ zRtE2+c)oX?KN6A?u8iWuPVA7>@kPgmjz2oi>-f9_wZr(>VKFsJGPWSMS&zSvM_im*o5uQ+7R zW$rGdWJ)*cGSrtb8z0OYEh2k%0AH^y;91b4;7`GQf*%H@1my*$1^ycl>_5Uc(t8~k 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�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

hzRU$yo?|u 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�J*EA>biCufrG41*h4gzsS&xddm71!#b@8o5 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

?2qgP-P*Q1aH#3)i%_9(`IY>s>dj! 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�C$jTb)Fy)3$!O7+PZXkFC7m2{Jsg(3u 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]FM0y3{hoY?uK+zWXr4)e=sYeD8S60WCKLhC% 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

    3v=oU%NtzsOJa0K1r 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