summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2016-05-31 08:59:20 +0200
committerBenoit Foucher <benoit@zeroc.com>2016-05-31 08:59:20 +0200
commit9f99bad130508d529814c778852621f6a1b814cc (patch)
tree4fa8328539c80f719cca38a0fb7f67b2995618fc
parentPHP 7 fix for printing Exception info (diff)
downloadice-9f99bad130508d529814c778852621f6a1b814cc.tar.bz2
ice-9f99bad130508d529814c778852621f6a1b814cc.tar.xz
ice-9f99bad130508d529814c778852621f6a1b814cc.zip
Added support for building Xcode SDK, added iAP transport
-rw-r--r--.gitignore6
-rw-r--r--config/Make.project.rules241
-rw-r--r--config/Make.rules13
-rw-r--r--config/Make.rules.AIX8
-rw-r--r--config/Make.rules.Darwin46
-rw-r--r--config/Make.rules.Linux32
-rw-r--r--config/Make.xcodesdk.rules71
-rw-r--r--config/iphoneos-SDKSettings.plist37
-rw-r--r--config/iphonesimulator-SDKSettings.plist25
-rw-r--r--config/macosx-SDKSettings.plist29
-rw-r--r--cpp/Makefile3
-rw-r--r--cpp/config/Make.rules40
-rw-r--r--cpp/config/Make.xcodesdk.rules68
-rw-r--r--cpp/src/Glacier2CryptPermissionsVerifier/Makefile.mk1
-rw-r--r--cpp/src/Ice/ConnectionFactory.cpp10
-rw-r--r--cpp/src/Ice/EventHandler.h2
-rw-r--r--cpp/src/Ice/Exception.cpp2
-rw-r--r--cpp/src/Ice/Makefile.mk15
-rw-r--r--cpp/src/Ice/Selector.cpp14
-rw-r--r--cpp/src/Ice/Selector.h2
-rw-r--r--cpp/src/Ice/Transceiver.h2
-rw-r--r--cpp/src/Ice/ios/Notifications.mm138
-rw-r--r--cpp/src/Ice/ios/RegisterPluginsInit.cpp30
-rw-r--r--cpp/src/Ice/ios/StreamAcceptor.cpp160
-rw-r--r--cpp/src/Ice/ios/StreamAcceptor.h54
-rw-r--r--cpp/src/Ice/ios/StreamConnector.cpp169
-rw-r--r--cpp/src/Ice/ios/StreamConnector.h52
-rw-r--r--cpp/src/Ice/ios/StreamEndpointI.cpp820
-rw-r--r--cpp/src/Ice/ios/StreamEndpointI.h170
-rw-r--r--cpp/src/Ice/ios/StreamTransceiver.cpp793
-rw-r--r--cpp/src/Ice/ios/StreamTransceiver.h102
-rw-r--r--cpp/src/Ice/ios/iAPConnector.h58
-rw-r--r--cpp/src/Ice/ios/iAPConnector.mm153
-rw-r--r--cpp/src/Ice/ios/iAPEndpointI.h109
-rw-r--r--cpp/src/Ice/ios/iAPEndpointI.mm640
-rw-r--r--cpp/src/Ice/ios/iAPTransceiver.h85
-rw-r--r--cpp/src/Ice/ios/iAPTransceiver.mm490
-rw-r--r--cpp/src/IceBT/Makefile.mk4
-rw-r--r--cpp/src/IceSSL/Makefile.mk4
-rw-r--r--cpp/src/IceUtil/Makefile.mk6
-rw-r--r--cpp/test/Common/Makefile.mk6
-rw-r--r--cpp/test/ios/BundleInfo.plist48
-rwxr-xr-xcpp/test/ios/C++ Test Suite.xcodeproj/project.pbxproj743
-rw-r--r--cpp/test/ios/C++ Test Suite.xcodeproj/project.xcworkspace/contents.xcworkspacedata7
-rw-r--r--cpp/test/ios/C++11 Test Suite.plist36
-rw-r--r--cpp/test/ios/C++98 Test Suite-Info.plist36
-rw-r--r--cpp/test/ios/Classes/AppDelegate.h37
-rw-r--r--cpp/test/ios/Classes/AppDelegate.mm216
-rw-r--r--cpp/test/ios/Classes/TestSelectController.h26
-rw-r--r--cpp/test/ios/Classes/TestSelectController.m130
-rw-r--r--cpp/test/ios/Classes/TestUtil.h138
-rw-r--r--cpp/test/ios/Classes/TestUtil.mm296
-rw-r--r--cpp/test/ios/Classes/TestViewController.h30
-rw-r--r--cpp/test/ios/Classes/TestViewController.mm580
-rw-r--r--cpp/test/ios/Default-568h@2x.pngbin0 -> 18594 bytes
-rw-r--r--cpp/test/ios/Images.xcassets/AppIcon.appiconset/Contents.json80
-rw-r--r--cpp/test/ios/Images.xcassets/AppIcon.appiconset/New icon-60@3x.pngbin0 -> 31818 bytes
-rw-r--r--cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76.pngbin0 -> 7728 bytes
-rw-r--r--cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76@2x.pngbin0 -> 23597 bytes
-rw-r--r--cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40.pngbin0 -> 2870 bytes
-rw-r--r--cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-1.pngbin0 -> 8216 bytes
-rw-r--r--cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-2.pngbin0 -> 8216 bytes
-rw-r--r--cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x-1.pngbin0 -> 15766 bytes
-rw-r--r--cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x.pngbin0 -> 15766 bytes
-rw-r--r--cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small.pngbin0 -> 1773 bytes
-rw-r--r--cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-1.pngbin0 -> 5048 bytes
-rw-r--r--cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-2.pngbin0 -> 5048 bytes
-rw-r--r--cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@3x.pngbin0 -> 9409 bytes
-rw-r--r--cpp/test/ios/MainWindow-iPad.xib43
-rw-r--r--cpp/test/ios/MainWindow.xib41
-rw-r--r--cpp/test/ios/README.md6
-rw-r--r--cpp/test/ios/TestSelect-iPad.xib77
-rw-r--r--cpp/test/ios/TestSelect.xib78
-rw-r--r--cpp/test/ios/TestView-iPad.xib59
-rw-r--r--cpp/test/ios/TestView.xib59
-rw-r--r--cpp/test/ios/dummy.ice3
-rw-r--r--cpp/test/ios/main.m17
-rw-r--r--objective-c/Makefile1
-rw-r--r--objective-c/config/Make.rules13
-rw-r--r--objective-c/config/Make.xcodesdk.rules55
-rwxr-xr-xobjective-c/config/makegitignore.py159
-rw-r--r--objective-c/test/Common/Makefile.mk10
-rw-r--r--objective-c/test/Ice/objects/Client.m2
-rw-r--r--objective-c/test/Ice/objects/Server.m2
-rw-r--r--objective-c/test/ios/Classes/AppDelegate.h37
-rw-r--r--objective-c/test/ios/Classes/AppDelegate.m263
-rw-r--r--objective-c/test/ios/Classes/Test.h44
-rw-r--r--objective-c/test/ios/Classes/Test.m88
-rw-r--r--objective-c/test/ios/Classes/TestSelectController.h26
-rw-r--r--objective-c/test/ios/Classes/TestSelectController.m135
-rw-r--r--objective-c/test/ios/Classes/TestViewController.h37
-rw-r--r--objective-c/test/ios/Classes/TestViewController.m515
-rw-r--r--objective-c/test/ios/Default-568h@2x.pngbin0 -> 18594 bytes
-rw-r--r--objective-c/test/ios/Images.xcassets/AppIcon.appiconset/Contents.json80
-rw-r--r--objective-c/test/ios/Images.xcassets/AppIcon.appiconset/New icon-60@3x.pngbin0 -> 31818 bytes
-rw-r--r--objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76.pngbin0 -> 7728 bytes
-rw-r--r--objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76@2x.pngbin0 -> 23597 bytes
-rw-r--r--objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40.pngbin0 -> 2870 bytes
-rw-r--r--objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-1.pngbin0 -> 8216 bytes
-rw-r--r--objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-2.pngbin0 -> 8216 bytes
-rw-r--r--objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x-1.pngbin0 -> 15766 bytes
-rw-r--r--objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x.pngbin0 -> 15766 bytes
-rw-r--r--objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small.pngbin0 -> 1773 bytes
-rw-r--r--objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-1.pngbin0 -> 5048 bytes
-rw-r--r--objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-2.pngbin0 -> 5048 bytes
-rw-r--r--objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@3x.pngbin0 -> 9409 bytes
-rw-r--r--objective-c/test/ios/Info-ARC.plist32
-rw-r--r--objective-c/test/ios/Info.plist32
-rw-r--r--objective-c/test/ios/MainWindow-iPad.xib43
-rw-r--r--objective-c/test/ios/MainWindow.xib41
-rwxr-xr-xobjective-c/test/ios/Objective-C Test Suite.xcodeproj/project.pbxproj1778
-rw-r--r--objective-c/test/ios/Objective-C Test Suite.xcodeproj/project.xcworkspace/contents.xcworkspacedata7
-rw-r--r--objective-c/test/ios/TestSelect-iPad.xib77
-rw-r--r--objective-c/test/ios/TestSelect.xib78
-rw-r--r--objective-c/test/ios/TestView-iPad.xib60
-rw-r--r--objective-c/test/ios/TestView.xib59
-rw-r--r--objective-c/test/ios/main.m20
-rwxr-xr-xscripts/TestUtil.py2
-rw-r--r--slice/Ice/Endpoint.ice14
-rw-r--r--slice/Ice/LocalException.ice2
120 files changed, 10820 insertions, 388 deletions
diff --git a/.gitignore b/.gitignore
index ac4418a367f..7d0920cc63e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -44,6 +44,7 @@ sgenerated
/cppe/lib
/csharp/bin
/csharp/Assemblies
+/objective-c/lib
*#
.#*
*~
@@ -346,3 +347,8 @@ IceBuilder.d
# Logger test
#
cpp/test/Ice/logger/*.log
+
+xcuserdata
+xcshareddata
+IceSDK
+cpp/test/ios/Bundles*
diff --git a/config/Make.project.rules b/config/Make.project.rules
index 776a99f0dbf..41d59181c69 100644
--- a/config/Make.project.rules
+++ b/config/Make.project.rules
@@ -45,6 +45,18 @@ component-configs = $(call unique,$(foreach c,$(configs),\
$(filter $($s_projects),$1))),,$s))),,\
$(strip $c))))
+#
+# Some variables for utilities
+#
+INSTALL = cp -fp
+MV = mv -f
+RM = rm -f
+MKDIR = mkdir
+CHMOD = chmod
+
+Q := $(if $(V),,@)
+E := $(if $(V),@:,@echo)
+
# $(call install-data,$1=filename,$2=srcdir,$3=destdist)
install-data = $(INSTALL) $2/$1 $(DESTDIR)$3/$1; $(CHMOD) a+r $(DESTDIR)$(3)/$(1)
@@ -88,8 +100,6 @@ $(addprefix $3/,$(call source-to-object,$4)): $(addprefix $2/,$(call generated-t
$(foreach d,$5,$($d_targets))
endif
-$3/%.d: ;
-
.PRECIOUS: $3/%.d
ifeq ($(filter %clean,$(MAKECMDGOALS)),)
@@ -100,36 +110,40 @@ endif
ifneq ($(filter %.ice $2/%.$7,$4),)
# Rules to build generated sources from <srcdir>/generated
$3/%.o: $2/%.$7
-$3/%.o: $2/%.$7 $3/%.$7.d
+$3/%.o: $2/%.$7
$(E) "Compiling [$8-$9] $$<"
- $(Q)$(or $($8_cxx),$(platform_cxx)) $(strip $6) $(call depend-cppflags,$3/$$*.Td,$$@) $(CXXFLAGS) $(CPPFLAGS) -c $$< -o $$@
+ $(Q)$(or $($8_cxx),$(platform_cxx)) $(strip $6) $(call depend-cppflags,$3/$$*.Td,$$@) \
+ $(CXXFLAGS) $(CPPFLAGS) -c $$< -o $$@
$(Q)$(MV) $3/$$*.Td $3/$$*.$7.d
endif
ifneq ($(filter %.cpp,$4),)
# Rules to build C++ sources from <srcdir>
$3/%.o: $1/%.cpp
-$3/%.o: $1/%.cpp $3/%.cpp.d
+$3/%.o: $1/%.cpp
$(E) "Compiling [$8-$9] $$<"
- $(Q)$(or $($8_cxx),$(platform_cxx)) $(strip $6) $(call depend-cppflags,$3/$$*.Td,$$@) $(CXXFLAGS) $(CPPFLAGS) -c $$< -o $$@
+ $(Q)$(or $($8_cxx),$(platform_cxx)) $(strip $6) $(call depend-cppflags,$3/$$*.Td,$$@) \
+ $(CXXFLAGS) $(CPPFLAGS) -c $$< -o $$@
$(Q)$(MV) $3/$$*.Td $3/$$*.cpp.d
endif
ifneq ($(filter %.mm,$4),)
# Rules to build Objective-C++ sources from <srcdir>
$3/%.o: $1/%.mm
-$3/%.o: $1/%.mm $3/%.mm.d
+$3/%.o: $1/%.mm
$(E) "Compiling [$8-$9] $$<"
- $(Q)$(or $($8_cxx),$(platform_cxx)) $(strip $6) $(call depend-cppflags,$3/$$*.Td,$$@) $(CXXFLAGS) $(CPPFLAGS) -c $$< -o $$@
+ $(Q)$(or $($8_cxx),$(platform_cxx)) $(strip $6) $(call depend-cppflags,$3/$$*.Td,$$@) \
+ $(CXXFLAGS) $(CPPFLAGS) -c $$< -o $$@
$(Q)$(MV) $3/$$*.Td $3/$$*.mm.d
endif
ifneq ($(filter %.m,$4),)
# Rules to build Objetive-C sources from <srcdir>
$3/%.o: $1/%.m
-$3/%.o: $1/%.m $3/%.m.d
+$3/%.o: $1/%.m
$(E) "Compiling [$8-$9] $$<"
- $(Q)$(or $($8_cxx),$(platform_cxx)) $(strip $6) $(call depend-cppflags,$3/$$*.Td,$$@) $(CXXFLAGS) $(CPPFLAGS) -c $$< -o $$@
+ $(Q)$(or $($8_cxx),$(platform_cxx)) $(strip $6) $(call depend-cppflags,$3/$$*.Td,$$@) \
+ $(CXXFLAGS) $(CPPFLAGS) -c $$< -o $$@
$(Q)$(MV) $3/$$*.Td $3/$$*.m.d
endif
@@ -142,8 +156,6 @@ endef
#
define make-slices
-$2/%.ice.d: ;
-
.PRECIOUS: $2/%.ice.d
ifeq ($(filter %clean,$(MAKECMDGOALS)),)
@@ -151,7 +163,7 @@ ifeq ($(filter %clean,$(MAKECMDGOALS)),)
-include $(addprefix $2/,$(call source-to-dependency,$4))
endif
-$3/%.h $2/%.$($6_targetext): $1/%.ice $2/%.ice.d $($6_path) | $3
+$3/%.h $2/%.$($6_targetext): $1/%.ice $($6_path) | $3
$(E) "Compiling $$<"
$(Q)$(RM) $3/$$*.h $2/$$*.$($6_targetext)
$(Q)$($6_path) $(strip $5) --depend $$< > $2/$$*.ice.d
@@ -311,36 +323,32 @@ get-program-targets = $2/$1$(EXE_EXT)
define create-component-with-config-targets
#
-# Transform the dependencies to [platform-configuration] specific dependencies.
-#
-$5_dependencies = $$(foreach d,$$(call platform-and-config-var,dependencies,$2,$3,$4),$$(call make-dependency,$$d,$2,$3,$4))
-$5_dependencies += $$(foreach d,$$($2_dependencies),$$(call make-dependency,$$d,$2,$3,$4))
-
-$5_libs := $$($2_libs)
-$5_system_libs := $$($2_system_libs)
-
-#
-# The installation directory
+# Compute the target and installation directories.
#
+$5_targetdir := $$(call var-value,targetdir,$1,$2,$3,$4,make-dirwsuffix)
ifndef $1_noinstall
-$5_installdir := $$($2_installdir)$$(call platform-var,installdir,$2,$3,$4)
+$5_installdir := $$(call var-value,installdir,$1,$2,$3,$4,make-dirwsuffix)
endif
#
# Compute the target rule and name for this platform/configuration combination.
#
-$5_targetrule := $$(call platform-and-config-var,targetrule,$2,$3,$4)$$($2_target)
-$5_targetname := $$($2_targetname)$$(subst $$(space),,$$(or $$(call platform-and-config-var,targetname,$2,$3,$4)))
+$5_targetrule := $$(call var-value,target,$1,$2,$3,$4,make-targetrule)
+$5_targetname := $$(call var-value,targetname,$1,$2,$3,$4,make-targetname)
+$5_version := $$(call var-value,version,$1,$2,$3,$4)
+$5_soversion := $$(call var-value,soversion,$1,$2,$3,$4)
#
-# Compute the target directory. If this is a project from src/ the target goes
-# either to the lib or bin directory instead of a sub-directory of the project.
+# Transform the dependencies to [platform-configuration] specific dependencies.
#
-$5_targetdir := $$($2_targetdir)
-$5_targetdir := $$($5_targetdir)$$(call platform-var,targetdir,$2,$3,$4)
-$5_targetdir := $$($5_targetdir)$$(patsubst %/,%,/$$(subst $$(space),-,$$(call config-var,targetdir,$2,$3,$4)))
+$5_dependencies := $$(call var-compound,dependencies,$1,$2,$3,$4,make-deps)
+$5_libs := $$(call var-compound,libs,$1,$2,$3,$4,make-unique)
+$5_system_libs := $$(call var-compound,system_libs,$1,$2,$3,$4)
-$5_targets := $$(call get-$$($5_targetrule)-targets,$$($5_targetname),$$($5_targetdir),$$($2_version),$$($2_soversion))
+#
+# The targets to build
+#
+$5_targets := $$(call get-$$($5_targetrule)-targets,$$($5_targetname),$$($5_targetdir),$$($5_version),$$($5_soversion))
#
# We define a secondary target for component[platform-config]. This is necessary
@@ -348,7 +356,7 @@ $5_targets := $$(call get-$$($5_targetrule)-targets,$$($5_targetname),$$($5_tar
# IceSSL[osx-shared] depend on Ice[osx-shared], see make-objects.
#
.PHONY: $5
-$5: $$($5_targets)
+$5:: $$($5_targets)
endef
@@ -363,9 +371,6 @@ $2_project := $1
$2_target := $$(call var-with-default,$2_target,$3)
$2_targetname := $$(call var-with-default,$2_targetname,$(patsubst $1_%,%,$2))
-$2_targetdir := $$(call var-with-default,$2_targetdir,$$($1_targetdir))
-$2_version := $$(call var-with-default,$2_version,$$($1_version))
-$2_soversion := $$(call var-with-default,$2_soversion,$$($1_soversion))
$2_platforms := $$(call unique,$$(or $$($2_platforms),$$($1_platforms),$(call component-platforms,$1,$2)))
$2_configs := $$(call unique,$$(or $$($2_configs),$$($1_configs),$(call component-configs,$1,$2)))
@@ -414,41 +419,47 @@ $5_platform := $3
$5_config := $4
#
-# The object directory <component-objdir>/<platform-objdir>/<config-objdir>.
-# We also append the directory to the project's object directories.
+# Compute the path of the object directory and add it to the project's
+# list of object directories.
#
-$5_objdir := $$($2_objdir)
-$5_objdir := $$($5_objdir)$$(patsubst %/,%,/$$(call platform-var,objdir,$2,$3,$4))
-$5_objdir := $$($5_objdir)$$(patsubst %/,%,/$$(subst $$(space),-,$$(call config-var,objdir,$2,$3,$4)))
+$5_objdir := $$(call var-value,objdir,$1,$2,$3,$4,make-dirwsuffix)
$1_objdirs += $$($5_objdir)
#
-# Add platform/configuration specific cppflags and ldflags.
+# Compute the compiler/linker flags.
#
-$5_cppflags = $$($2_cppflags) $$(call platform-and-config-var,cppflags,$2,$3,$4,$5)
-$5_ldflags = $$($2_ldflags) $$(call platform-and-config-var,ldflags,$2,$3,$4,$5)
+$5_cppflags := $$(call var-compound,cppflags,$1,$2,$3,$4,make-flags)
+$5_ldflags := $$(call var-compound,ldflags,$1,$2,$3,$4,make-flags)
+
+$5_sources := $$(patsubst $(lang_srcdir)/%,%,$$(call unique,$$(call var-compound,extra_sources,$1,$2,$3,$4) \
+ $$(call var-compound,sources,$1,$2,$3,$4)))
+$5_sources := $$(filter-out $$(patsubst $(lang_srcdir)/%,%,$$(call var-compound,excludes,$1,$2,$3,$4)),$$($5_sources))
#
# Computes the list of objects to build based on the sources.
#
-$5_objects := $$(call unique,$$(addprefix $$($5_objdir)/,$$(call source-to-object,$$($2_sources))))
+$5_objects := $$(call unique,$$(addprefix $$($5_objdir)/,$$(call source-to-object,$$($5_sources))))
+
+ifneq ($$($1_component_with_config_extensions),)
+$$(foreach e,$$($1_component_with_config_extensions),$$(eval $$(call $$e,$1,$2,$3,$4,$5)))
+endif
#
# Order only prerequisties to ensure the object directory is created
# before we start building the objects
#
-$$($5_objdir)/$$(call source-to-dependency,$$($2_sources)): | $$($5_objdir)
+$$($5_objdir)/$$(call source-to-dependency,$$($5_sources)): | $$($5_objdir)
#
# Object rules
#
-$$(foreach d,$$($2_srcdirs),$$(eval $$(call make-objects,$$d,$$($1_generated_srcdir),$$($5_objdir),\
- $$($2_sources),$$($5_dependencies),$$($5_cppflags),$$($$($1_slicecompiler)_targetext),$3,$4)))
+$$(foreach d,$$(call files-to-dirs,$$($5_sources)),$$(eval $$(call make-objects,$$d,$$($1_generated_srcdir),\
+ $$($5_objdir),$$($5_sources),$$($5_dependencies),$$($5_cppflags),$$($$($1_slicecompiler)_targetext),$3,$4)))
#
# Target rule
#
-$$(eval $$(call make-$$($5_targetrule),$$($5_targetname),$$($5_targetdir),$$($2_version),$$($2_soversion),\
+$$(eval $$(call make-$$($5_targetrule),$$($5_targetname),$$($5_targetdir),$$($5_version),$$($5_soversion),\
$$($5_objects),$$($5_dependencies),$$($5_ldflags),$3,$4))
#
@@ -460,7 +471,7 @@ $$(eval $$(call make-$$($5_targetrule),$$($5_targetname),$$($5_targetdir),$$($2_
$2:: $5
-$5_clean:
+$5_clean::
$(Q)$(RM) -r $$($5_objdir)
$(Q)$(RM) $$($5_targets)
@@ -482,9 +493,9 @@ $(DESTDIR)$$($5_installdir):
$(Q)$(MKDIR) -p $$@
endif
-$5_install: $$(patsubst $$($5_targetdir)/%,$(DESTDIR)$$($5_installdir)/%,$$($5_targets))
+$5_install:: $$(patsubst $$($5_targetdir)/%,$(DESTDIR)$$($5_installdir)/%,$$($5_targets))
-$$(eval $$(call install-$$($5_targetrule),$$($5_targetname),$$($5_targetdir),$$($2_version),$$($2_soversion),$$($5_installdir)))
+$$(eval $$(call install-$$($5_targetrule),$$($5_targetname),$$($5_targetdir),$$($5_version),$$($5_soversion),$$($5_installdir)))
ifneq ($$(and $$(filter $3,$$($2_install_platforms)),$$(filter $4,$$($2_install_configs))),)
$2_install:: $5_install
@@ -530,12 +541,7 @@ $2_srcdir := $$(or $$($2_srcdir),$$($1_srcdir))
#
# Combine settings set at the project and component levels.
#
-$2_dependencies := $$(call unique,$$($2_dependencies) $$($1_dependencies))
-$2_libs := $$(call unique,$$($2_libs) $$($1_libs))
-$2_system_libs := $$($2_system_libs) $$($1_system_libs)
$2_sliceflags := $$($2_sliceflags) $$($1_sliceflags)
-$2_cppflags := $$($2_cppflags) $$($1_cppflags)
-$2_ldflags := $$($2_ldflags) $$($1_ldflags)
#
# If we're compiling a library, we check for a ../slice/<component> directory.
@@ -564,11 +570,8 @@ $2_sources := $$(foreach e,$(source-extensions),$$(wildcard $$($2_srcdir)/*.$$(
ifneq ($$($2_slicedir),)
$2_sources += $$(wildcard $$($2_slicedir)/*.ice)
endif
-$2_sources += $$($2_extra_sources)
-$2_sources := $$(call unique,$$($2_sources))
endif
$2_sources := $$(filter-out $$(patsubst $(lang_srcdir)/%,%,$$($2_excludes)),$$($2_sources))
-$2_srcdirs := $$(call files-to-dirs,$$($2_sources))
#
# Compute the list of slice files from the sources and gather the location
@@ -668,6 +671,9 @@ $1_generated_includedir := $$(or $$($1_generated_includedir),$1/generated)
# Is this a multi-component project?
$1_multicomp := $(word 2,$($1_programs) $($1_libraries))
+$1_component_extensions := $$(1_component_extensions) $(component_extensions)
+$1_component_with_config_extensions := $$(1_component_with_config_extensions) $(component_with_config_extensions)
+
#
# Components add slice and object directories, slice files, generated
# header files to these variables. This is used to collect the slice
@@ -828,12 +834,12 @@ make-projects = $(foreach p,$1,$(eval $(call $(or $3,create-project-targets),$p)
#
# $(call depend_cppflags,$1=dependencyfile,$2=targetfile)
#
-depend-cppflags ?= -MT $2 -MMD -MP -MF $1
+depend-cppflags ?= -MT $2 -MMD -MP -MF $1
#
# $(call rpath-ldflag,$1=rpath)
#
-rpath-ldflag ?= -Wl,-rpath,$1
+rpath-ldflag ?= -Wl,-rpath,$1
#
# Helper functions
@@ -848,23 +854,46 @@ space := $(empty) $(empty)
comma := ,
mappings = cpp objective-c python ruby php
-mappingdir3 = $(if $(filter $(mappings),$(notdir $1)),$1,$(call mappingdir3,$(call dirname,$1)))
+mappingdir3 = $(if $(filter $(mappings),$(notdir $1)),$1,$(if $1,$(call mappingdir3,$(call dirname,$1))))
mappingdir2 = $(if $(filter ../%,$1),$(call mappingdir2,$(patsubst ../%,%,$1)),$(call mappingdir3,$1))
mappingdir = $(patsubst $(lang_srcdir)/%,%,$(if $(filter-out ../%,$1),$2,$(top_srcdir)/$(call mappingdir2,$1)/$2))
+# $(call subconfigs,$1=config)
+subconfigs = $(subst -,$(space),$1)
+
+var-names = $3[$4-$5]_$1 $3[$4]_$1 $(foreach c,$(call subconfigs,$5),$3[$c]_$1) $3_$1 \
+ $2[$4-$5]_$1 $2[$4]_$1 $(foreach c,$(call subconfigs,$5),$2[$c]_$1) $2_$1
+
#
-# $(call make-dependency,$1=dependency,$2=component,$3=platform,$4=config)
+# $(call var-value,$1=varname,$2=project,$3=component,$4=platform,$5=config,$6=fn)
#
-# Computes dependency[config-platform] for given component.
+# Returns the value of the given varible name for the given project/component/platform/configuration.
+# It returns the first defined variable from the set of variables returned by var-names defined above.
+# This checks first for component[platform-config]_varname, next for component[platform]_varname,
+# component[subconfig]_varname, ...
#
-make-dependency = $1[$(subst $(space),-,$(call platform-and-config-var,dependency,$2,$3,$4))]
+var-valu1 = $(if $(and $1,$(filter undefined,$(origin $(firstword $1)))),$(call var-valu1,$(wordlist 2,$(words $1),$1)),$($(firstword $1)))
+var-valu2 = $6
+var-value = $(call $(or $6,var-valu2),$1,$3,$4,$5,$3[$4-$5],$(call var-valu1,$(var-names)))
#
-# $(call get-all-deps,component)
+# $(call var-compound,$1=varname,$2=project,$3=component,$4=platform,$5=config,$6=fn)
+# Returns the combination of all the values for the given variable name defined at the
+# project/component /platform/configuration level.
#
-# Get direct and transitive dependencies
+var-compound = $(call $(or $6,var-valu2),$1,$3,$4,$5,$3[$4-$5],$(strip $(foreach v,$(var-names),$($v))))
+
#
-get-all-deps = $(call unique,$(if $($1_dependencies),$(foreach d,$($1_dependencies),$d $(call get-all-deps,$d)),$1))
+# Return the given value after applying platform/configuration customization.
+#
+# $(call make-xxx,$1=varname,$2=component,$3=platform,$4=config,$5=$2[$3-$4],$6=value)
+#
+make-dirwsuffix = $(patsubst %/,%,$6$(platform-var)/$(subst $(space),-,$(config-var)))
+make-targetrule = $(patsubst -%,%,$(subst $(space),-,$(call platform-and-config-var,targetrule,$2,$3,$4,$5,$6))-$6)
+make-targetname = $6$(subst $(space),,$(platform-and-config-var))
+make-unique = $(call unique,$6)
+make-flags = $6 $(platform-and-config-var)
+make-deps = $(foreach d,$(call unique,$6),$d[$(subst $(space),-,$(call platform-and-config-var,dependency,$2,$3,$4,$5))])
#
# $(call var-with-default,varname,defaultvarname)
@@ -874,6 +903,13 @@ get-all-deps = $(call unique,$(if $($1_dependencies),$(foreach d,$($1_dependenci
var-with-default = $(if $(filter undefined,$(origin $1)),$2,$($1))
#
+# $(call get-all-deps,$1=component[platform-config])
+#
+# Get direct and transitive dependencies of the given component
+#
+get-all-deps = $(call unique,$($1_dependencies) $(foreach d,$($1_dependencies),$d $(call get-all-deps,$d)),$1)
+
+#
# Helpers to compute cppflags/ldflags for dependencies, libraries and system libraries
#
ifeq ($(embedded_runpath),yes)
@@ -896,8 +932,25 @@ endif
make-static-dep-ldflags = $($1_targetdir)/$(call mklibname,$($1_targetname))
make-system-lib-ldflags = $($1_system_libs)
-make-lib-ldflags = $(foreach l,$($1_libs),$(if $($l_libdir),-L$(call $l_libdir,$l,$2,$3)) $($l_ldflags))
-make-lib-cppflags = $(foreach l,$($1_libs),$(if $($l_includedir),-I$(call $l_includedir,$l,$2,$3)) $($l_cppflags))
+make-lib-ldflags = $(foreach l,$($1_libs),$(if $($l_libdir),-L$(call $l_libdir,$l,$1)) $($l_ldflags))
+make-lib-cppflags = $(foreach l,$($1_libs),$(if $($l_includedir),-I$(call $l_includedir,$l,$1)) $($l_cppflags))
+
+#
+# Helper to define third-party library flags
+#
+# $(call makelib,$1=libname,$2=component[platform-config])
+#
+define make-lib
+ifneq ($($1_home),)
+# Check for 3rd party libraries either in home/lib<platform specific subdir> or home/lib
+$1_libdir ?= $$(strip \
+ $$(if $$(wildcard $$($1_home)/lib$$(call platform-var,installdir,$$1,$$($2_platform),$$($2_config))),\
+ $$($1_home)/lib$$(call platform-var,installdir,$$1,$$($2_platform),$$($2_config)),\
+ $$($1_home)/lib))
+$1_includedir ?= $$($1_home)/include
+endif
+$1_ldflags ?= -l$1
+endef
#
# $(call repathfromdir,path)
@@ -908,7 +961,7 @@ make-lib-cppflags = $(foreach l,$($1_libs),$(if $($l_includedir),-I$(call $l_in
relpathfromdir = $(if $(findstring /,$1),$(call relpathfromdir,$(call dirname,$1))/..,..)
#
-# $(call platform-and-config-var,$1=variable,$2=component,$3=platform,$4=configuration)
+# $(call platform-and-config-var,$1=varname,$2=component,$3=platform,$4=config,$5=comp[platform-config],$6=value)
#
# Check for platform and configuration specific variable. For example, if variable
# is `objdir', for the configuration `cpp11-static' and the `osx' platform, the
@@ -927,9 +980,9 @@ var-or-dflt = $(call $(if $(filter-out undefined,$(origin $1_$3[$4])),$1_$3[$4]
$(if $(filter-out undefined,$(origin $1_$3[$($4_project)])),$1_$3[$($4_project)],\
$(if $(filter-out undefined,$(origin $2_$3[$($4_project)])),$2_$3[$($4_project)],\
$(if $(filter-out undefined,$(origin $1_$3)),$1_$3,\
- $2_$3))))),$4,$5,$6,$7,$8)
-platform-var = $(strip $(foreach c,$3,$(call var-or-dflt,$c,platform,$1,$2,$3,$4,$5)))
-config-var = $(strip $(foreach c,$(subst -,$(space),$4),$(call var-or-dflt,$c,config,$1,$2,$3,$4,$5,$c)))
+ $2_$3))))),$4,$5,$6,$7,$8,$9)
+platform-var = $(strip $(call var-or-dflt,$3,platform,$1,$2,$3,$4,$5,$6))
+config-var = $(strip $(foreach c,$(call subconfigs,$4),$(call var-or-dflt,$c,config,$1,$2,$3,$4,$5,$6,$c)))
platform-and-config-var = $(strip $(platform-var) $(config-var))
#
@@ -946,29 +999,29 @@ source-to-dependency = $(patsubst %,%.d,$(notdir $1))
#
# Configuration variables
#
-# The variables defined below are called with ($1=component,$2=platform,$3=config,$4=$1[$2-$3][,$5=subconfig])
+# The variables defined below are called with ($1=component,$2=platform,$3=config,$4=$1[$2-$3],$5=value[,$6=subconfig])
#
# Defaults for configurations which don't override the specified variable
-config_targetdir = $(if $(filter %/build,$($1_targetdir)),$5)
-config_objdir = $5
-config_dependency = $5
+config_targetdir = $(if $(filter %/build,$5),$6)
+config_objdir = $6
+config_dependency = $6
# Static configuration for static builds
-static_targetrule = $(if $(filter-out program,$($1_target)),static-)
-static_cppflags += $$(strip $$(call make-lib-cppflags,$1,$2,$3)) -DICE_STATIC_LIBS
+static_targetrule = $(if $(filter-out program,$($1_target)),static)
+static_cppflags += $$(strip $$(call make-lib-cppflags,$4)) -DICE_STATIC_LIBS
static_ldflags += $$(call unique,$$(foreach d,$$(call get-all-deps,$4),$$(call make-static-dep-ldflags,$$d)))\
- $$(strip $$(foreach d,$$(call get-all-deps,$4) $1,$$(call make-lib-ldflags,$$d,$2,$3)))\
- $$(strip $$(foreach d,$$(call get-all-deps,$4) $1,$$(call make-system-lib-ldflags,$$d,$2,$3)))
+ $$(strip $$(foreach d,$$(call get-all-deps,$4) $4,$$(call make-lib-ldflags,$$d)))\
+ $$(strip $$(foreach d,$$(call get-all-deps,$4) $4,$$(call make-system-lib-ldflags,$$d)))
# Shared configuration for shared builds
shared_projects = %
shared_objdir = $(if $(filter-out program,$($1_target)),shared/pic,shared/nopic)
-shared_targetrule = $(if $(filter-out program,$($1_target)),shared-)
-shared_cppflags += $$(strip $$(call make-lib-cppflags,$1,$2,$3))
+shared_targetrule = $(if $(filter-out program,$($1_target)),shared)
+shared_cppflags += $$(strip $$(call make-lib-cppflags,$4))
shared_ldflags += $$(call unique,$$(foreach d,$$($4_dependencies),$$(call make-shared-dep-ldflags,$$d,$4)))\
- $$(strip $$(call make-lib-ldflags,$1,$2,$3))\
- $$(strip $$(call make-system-lib-ldflags,$1,$2,$3))
+ $$(strip $$(call make-lib-ldflags,$4))\
+ $$(strip $$(call make-system-lib-ldflags,$4))
#
# Platform variables
@@ -981,7 +1034,7 @@ platform_cc ?= $(CC)
platform_cxx ?= $(CXX)
platform_ld ?= $(CXX)
platform_ar ?= $(AR)
-platform_objdir ?= $2
+platform_objdir ?= /$2
platform_targetdir ?= /$2
platform_installdir ?=
platform_dependency ?= $2
@@ -992,18 +1045,6 @@ platform_dependency ?= $2
projects :=
#
-# Some variables for utilities
-#
-INSTALL = cp -fp
-MV = mv -f
-RM = rm -f
-MKDIR = mkdir
-CHMOD = chmod
-
-Q := $(if $(V),,@)
-E := $(if $(V),@:,@echo)
-
-#
# Global targets
#
.PHONY: all
diff --git a/config/Make.rules b/config/Make.rules
index 9d28dfe323d..1bc3fcec1a1 100644
--- a/config/Make.rules
+++ b/config/Make.rules
@@ -60,7 +60,7 @@ CONFIGS ?= $(firstword $(supported-configs))
#
# Third-party libraries
#
-# If a third-party library is not installed in a standard location
+# If a third-party library is not inlled in a standard location
# where the compiler can find it, set the corresponding variable
# below to the installation directory of the library.
#
@@ -118,16 +118,7 @@ expat_home := $(EXPAT_HOME)
bz2_home := $(BZ2_HOME)
lmdb_home := $(LMDB_HOME)
-define make-thirdparty
-ifneq ($($1_home),)
-# Check for 3rd party libraries either in home/lib<platform specific subdir> or home/lib
-$1_libdir ?= $$(strip $$(if $$(wildcard $$($1_home)/lib$$(call platform-var,installdir,$$1,$$2,$$3)),\
- $$($1_home)/lib$$(call platform-var,installdir,$$1,$$2,$$3),$$($1_home)/lib))
-$1_includedir ?= $$($1_home)/include
-endif
-$1_ldflags ?= -l$1
-endef
-$(foreach l,$(thirdparties),$(eval $(call make-thirdparty,$l)))
+$(foreach l,$(thirdparties),$(eval $(call make-lib,$l)))
#
# Languages, platforms and configurations to build
diff --git a/config/Make.rules.AIX b/config/Make.rules.AIX
index c7ec29dd3ee..e2c8f64feaf 100644
--- a/config/Make.rules.AIX
+++ b/config/Make.rules.AIX
@@ -63,7 +63,7 @@ mkshlibfilename = lib$(1).a
mkpymodulename = $(1).so
-ICEUTIL_OS_LIBS = -lcrypto
-ICE_OS_LIBS = $(ICEUTIL_OS_LIBS)
-CRYPT_OS_LIBS = -lcrypt
-SSL_OS_LIBS = -lssl -lcrypto
+IceUtil_system_libs = -lcrypto
+Ice_system_libs = $(IceUtil_system_libs)
+IceSSL_system_libs = -lssl -lcrypto
+Glacier2CryptPermissionsVerifier_system_libs = -lcrypt
diff --git a/config/Make.rules.Darwin b/config/Make.rules.Darwin
index c4b285a3457..065d5670e26 100644
--- a/config/Make.rules.Darwin
+++ b/config/Make.rules.Darwin
@@ -7,44 +7,33 @@
#
# **********************************************************************
-supported-platforms = osx iphoneos iphonesimulator
+supported-platforms = macosx iphoneos iphonesimulator
supported-languages = cpp java python js ruby php objective-c
-osx_ar = libtool
-osx_cppflags = -mmacosx-version-min=10.9 -arch x86_64
-osx_ldflags = $(osx_cppflags)
-osx_targetdir = $(if $(filter %/build,$($1_targetdir)),/osx)
+macosx_ar = libtool
+macosx_cppflags = -mmacosx-version-min=10.9 -arch x86_64
+macosx_ldflags = $(macosx_cppflags)
+macosx_targetdir = $(if $(filter %/build,$5),/macosx)
iphoneos_ar = libtool
iphoneos_cc = xcrun -sdk iphoneos clang
iphoneos_cxx = xcrun -sdk iphoneos clang++
-iphoneos_cppflags = -miphoneos-version-min=7.1 -arch armv7 -arch armv7s -arch arm64
+iphoneos_cppflags = -miphoneos-version-min=7.1 -arch armv7 -arch arm64
iphoneos_ldflags = $(iphoneos_cppflags)
-iphoneos_configs = xcodesdk
-iphoneos_projects = src/%
+iphoneos_configs = %xcodesdk
+iphoneos_targetdir = $(if $(filter %/build,$5),/iphoneos)
iphonesimulator_ar = libtool
iphonesimulator_cc = xcrun -sdk iphonesimulator clang
iphonesimulator_cxx = xcrun -sdk iphonesimulator clang++
iphonesimulator_cppflags = -mios-simulator-version-min=7.1 -arch i386 -arch x86_64
iphonesimulator_ldflags = $(iphonesimulator_cppflags)
-iphonesimulator_configs = xcodesdk
-iphonesimulator_projects = src/%
+iphonesimulator_configs = %xcodesdk
+iphonesimulator_targetdir = $(if $(filter %/build,$5),/iphonesimulator)
# If building objects for a shared library, enable fPIC
shared_cppflags = $(if $(filter-out program,$($1_target)),-fPIC)
-#
-# Xcode configuration to build Xcode SDKs.
-#
-xcodesdk_targetdir = $(if $(filter program,$($1_target)),SDKs/bin,SDKs/$2.sdk/usr/lib)
-xcodesdk_components = slice2cpp Ice Glacier2 IceStorm IceGrid
-xcodesdk_cppflags += $$(strip $$(call make-lib-cppflags,$1,$2,$3))
-xcodesdk_targetrule = $(if $(filter-out program,$($1_target)),static-)
-xcodesdk_ldflags += $$(call unique,$$(foreach d,$$(call get-all-deps,$4),$$(call make-static-dep-ldflags,$$d)))\
- $$(strip $$(foreach d,$$(call get-all-deps,$4) $1,$$(call make-lib-ldflags,$$d,$2,$3)))\
- $$(strip $$(foreach d,$$(call get-all-deps,$4) $1,$$(call make-system-lib-ldflags,$$d,$2,$3)))
-
CXXFLAGS += -fvisibility=hidden -Wall -Werror -pthread
ifeq ($(MAXWARN),yes)
@@ -82,10 +71,13 @@ mkphpmodulename = $1.dy
#
# System libraries
#
-ICEUTIL_OS_LIBS =
-ICE_OS_LIBS = -ldl
-CRYPT_OS_LIBS = -framework Security -framework CoreFoundation
-SSL_OS_LIBS = $(CRYPT_OS_LIBS)
+Ice_system_libs := -ldl
+
+IceSSL[macosx]_system_libs := -framework Security -framework CoreFoundation
+IceSSL[iphoneos]_system_libs := -framework ExternalAccessory \
+ -framework UIKit -framework CFNetwork -framework Security -framework Foundation
+IceSSL[iphonesimulator]_system_libs := $(IceSSL[iphoneos]_system_libs)
-# clean::
-# rm -f *.keychain *.fl*
+Glacier2CryptPermissionsVerifier[macosx]_system_libs := $(IceSSL[macosx]_system_libs)
+Glacier2CryptPermissionsVerifier[iphoneos]_system_libs := $(IceSSL[iphoneos]_system_libs)
+Glacier2CryptPermissionsVerifier[iphonesimulator]_system_libs := $(IceSSL[iphonesimulator]_system_libs)
diff --git a/config/Make.rules.Linux b/config/Make.rules.Linux
index fc3329bf841..f155ba76d96 100644
--- a/config/Make.rules.Linux
+++ b/config/Make.rules.Linux
@@ -9,7 +9,8 @@
linux_id = $(shell . /etc/os-release && echo $${ID})
-is-bin-program = $(and $(filter-out %/build,$($1_targetdir)),$(filter $($1_target),program))
+is-bin-program = $(and $(filter-out %/build,$(or $($1_targetdir),$($($1_project)_targetdir))),\
+ $(filter $($1_target),program))
ifneq ($(filter centos rhel fedora,$(linux_id)),)
@@ -21,13 +22,13 @@ multilib-platform = yes
x64_cppflags = -m64
x64_ldflags = $(x64_cppflags)
-x64_targetdir = $(if $(filter %/build,$($1_targetdir)),/x64,$(if $(filter-out $($1_target),program),64))
-x64_installdir = $(if $(and $(filter-out $($1_target),program),$(filter-out %64,$($1_installdir))),64)
+x64_targetdir = $(if $(filter %/build,$5),/x64,$(if $(filter-out $($1_target),program),64))
+x64_installdir = $(if $(and $(filter-out $($1_target),program),$(filter-out %64,$5)),64)
x86_cppflags = -m32
x86_ldflags = $(x86_cppflags)
-x86_targetdir = $(if $(filter %/build,$($1_targetdir)),/x86)
-x86_targetname = $(if $(call is-bin-program,$1),32)
+x86_targetdir = $(if $(filter %/build,$5),/x86)
+x86_targetname = $(if $(is-bin-program),32)
else ifneq ($(filter debian ubuntu,$(linux_id)),)
@@ -51,8 +52,7 @@ $1_cc = $$($1_gnu_type)-$(CC)
$1_cxx = $$($1_gnu_type)-$(CXX)
$1_libtool = $$($1_gnu_type)-$(AR)
$1_targetdir = /$$($1_multiarch)
-$1_installdir = /$$($1_multiarch)
-$1_installdir = $$(if $$(and $(call is-bin-program,$1),$(usr_dir_install)),,/$$($1_multiarch))
+$1_installdir = $$(if $$(and $(is-bin-program),$(usr_dir_install)),,/$$($1_multiarch))
$1_excludes = $(if $(filter-out $1,$(build-platform)),Slice)
endef
@@ -60,8 +60,8 @@ endef
$(foreach p,$(supported-platforms),$(eval $(call make-platform-config,$p)))
# For the build platform architecture, build and install executables in bin, libraries in lib/<arch>
-$(build-platform)_targetdir = $(if $(call is-bin-program,$1),,/$($(build-platform)_multiarch))
-$(build-platform)_installdir = $(if $(call is-bin-program,$1),,/$($(build-platform)_multiarch))
+$(build-platform)_targetdir = $(if $(is-bin-program),,/$($(build-platform)_multiarch))
+$(build-platform)_installdir = $(if $(is-bin-program),,/$($(build-platform)_multiarch))
else
@@ -119,13 +119,7 @@ ifneq ($(libbacktrace_fullpath),libbacktrace.a)
libbacktrace = yes
endif
-ICEUTIL_OS_LIBS = -lrt -lcrypto
-
-ifeq ($(libbacktrace),yes)
-ICEUTIL_OS_LIBS += -lbacktrace
-endif
-
-ICE_OS_LIBS = -ldl $(ICEUTIL_OS_LIBS)
-
-CRYPT_OS_LIBS = -lcrypt
-SSL_OS_LIBS = -lssl -lcrypto
+IceUtil_system_libs = -lrt -lcrypto $(if $(filter yes,$(libbacktrace)),-lbacktrace)
+Ice_system_libs = -ldl $(IceUtil_system_libs)
+IceSSL_system_libs = -lssl -lcrypto
+Glacier2CryptPermissionsVerifier_system_libs = -lcrypt
diff --git a/config/Make.xcodesdk.rules b/config/Make.xcodesdk.rules
new file mode 100644
index 00000000000..be2e6f31db8
--- /dev/null
+++ b/config/Make.xcodesdk.rules
@@ -0,0 +1,71 @@
+# **********************************************************************
+#
+# Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+#
+# This copy of Ice is licensed to you under the terms described in the
+# ICE_LICENSE file included in this distribution.
+#
+# **********************************************************************
+
+#
+# Xcode configuration to build Xcode IceSDK.
+#
+xcodesdk_objdir = static
+xcodesdk_cppflags = $(static_cppflags)
+xcodesdk_ldflags = $(static_ldflags)
+
+ifneq ($(USE_BIN_DIST),yes)
+$(foreach d,Ice IceSSL Glacier2 IceStorm IceGrid IceDiscovery IceLocatorDiscovery \
+ IceObjC IceSSLObjC Glacier2ObjC IceStormObjC IceGridObjC,$(eval $d[xcodesdk]_targetdir := $(top_srcdir)))
+endif
+
+#
+# $(call make-xcodesdk,$1=translator)
+#
+define make-xcodesdk
+
+$(install_libdir)/IceSDK/%.sdk/SDKSettings.plist $(top_srcdir)/IceSDK/%.sdk/SDKSettings.plist: \
+ $(top_srcdir)/config/%-SDKSettings.plist
+ $(Q)$(MKDIR) -p $$(@D)
+ $(Q)$(INSTALL) $$< $$@
+
+$(install_libdir)/IceSDK/bin/$(notdir $1) $(top_srcdir)/IceSDK/bin/$(notdir $1): $1
+ $(Q)$(MKDIR) -p $$(dir $$@)
+ $(Q)$(INSTALL) $1 $$@
+
+$$(eval $$(call install-data-files,\
+ $$(wildcard $(top_srcdir)/slice/*/*.ice),$(top_srcdir)/slice,$(top_srcdir)/IceSDK/slice,all))
+
+$$(eval $$(call install-data-files,\
+ $$(wildcard $(top_srcdir)/slice/*/*.ice),$(top_srcdir)/slice,$(install_libdir)/IceSDK/slice,install))
+
+all:: $$(foreach p,$$(platforms),$(top_srcdir)/IceSDK/$$p.sdk/SDKSettings.plist) \
+ $(top_srcdir)/IceSDK/bin/$(notdir $1)
+
+install:: $$(foreach p,$$(platforms),$(install_libdir)/IceSDK/$$p.sdk/SDKSettings.plist) \
+ $(install_libdir)/IceSDK/bin/$(notdir $1)
+
+clean::
+ $(Q)$(RM) $(top_srcdir)/IceSDK/bin/$(notdir $1)
+
+distclean::
+ $(Q)$(RM) -r $(top_srcdir)/IceSDK
+
+endef
+
+#
+# $(call make-xcodesdk-component-with-config,$1=project,$2=component,$3=platform,$4=config,$5=comp[platform-config])
+#
+define make-xcodesdk-component-with-config
+
+$$(eval $$(call install-data-files,$$(wildcard $$($2_includedir)/*.h),include,\
+ $(top_srcdir)/IceSDK/$3.sdk/usr/include,$5))
+$$(eval $$(call install-data-files,$$(filter include/generated/%,$$($2_generated_headers)),include/generated,\
+ $(top_srcdir)/IceSDK/$3.sdk/usr/include,$5))
+
+$$(eval $$(call install-data-files,$$(wildcard $$($2_includedir)/*.h),include,\
+ $(install_libdir)/IceSDK/$3.sdk/usr/include,$5_install))
+$$(eval $$(call install-data-files,$$(filter include/generated/%,$$($2_generated_headers)),include/generated,\
+ $(install_libdir)/IceSDK/$3.sdk/usr/include,$5_install))
+
+endef
diff --git a/config/iphoneos-SDKSettings.plist b/config/iphoneos-SDKSettings.plist
new file mode 100644
index 00000000000..c5c41e4faee
--- /dev/null
+++ b/config/iphoneos-SDKSettings.plist
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>AlternateSDK</key>
+ <string>Ice SDK 3.6.0</string>
+ <key>CanonicalName</key>
+ <string>Ice SDK 3.7.0</string>
+ <key>CustomProperties</key>
+ <dict/>
+ <key>DefaultProperties</key>
+ <dict>
+ <key>IPHONEOS_DEPLOYMENT_TARGET</key>
+ <string>7.1</string>
+ <key>MACOSX_DEPLOYMENT_TARGET</key>
+ <string>10.9</string>
+ <key>PLATFORM_NAME</key>
+ <string>iphoneos</string>
+ </dict>
+ <key>DisplayName</key>
+ <string>Ice SDK 3.7.0</string>
+ <key>FamilyIdentifier</key>
+ <string>iphoneos</string>
+ <key>FamilyName</key>
+ <string>iPhone OS</string>
+ <key>IsBaseSDK</key>
+ <string>NO</string>
+ <key>MaximumOSDeploymentTarget</key>
+ <string>10.10</string>
+ <key>MinimalDisplayName</key>
+ <string>Device</string>
+ <key>MinimumSupportedToolsVersion</key>
+ <string>6.0</string>
+ <key>Version</key>
+ <string>3.7.0</string>
+</dict>
+</plist>
diff --git a/config/iphonesimulator-SDKSettings.plist b/config/iphonesimulator-SDKSettings.plist
new file mode 100644
index 00000000000..00db9ebcd99
--- /dev/null
+++ b/config/iphonesimulator-SDKSettings.plist
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>AlternateSDK</key>
+ <string>Ice SDK 3.7.0</string>
+ <key>CanonicalName</key>
+ <string>Ice SDK 3.7.0</string>
+ <key>CustomProperties</key>
+ <dict/>
+ <key>DefaultProperties</key>
+ <dict>
+ <key>PLATFORM_NAME</key>
+ <string>iPhoneSimulator</string>
+ </dict>
+ <key>DisplayName</key>
+ <string>Ice SDK 3.7.0</string>
+ <key>IsBaseSDK</key>
+ <string>NO</string>
+ <key>MinimumSupportedToolsVersion</key>
+ <string>6.0</string>
+ <key>Version</key>
+ <string>3.7.0</string>
+</dict>
+</plist>
diff --git a/config/macosx-SDKSettings.plist b/config/macosx-SDKSettings.plist
new file mode 100644
index 00000000000..c8af74780fb
--- /dev/null
+++ b/config/macosx-SDKSettings.plist
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CanonicalName</key>
+ <string>Ice SDK 3.7.0</string>
+ <key>DefaultProperties</key>
+ <dict>
+ <key>MACOSX_DEPLOYMENT_TARGET</key>
+ <string>10.9</string>
+ <key>PLATFORM_NAME</key>
+ <string>macosx</string>
+ </dict>
+ <key>DisplayName</key>
+ <string>Ice SDK 3.7.0</string>
+ <key>FamilyIdentifier</key>
+ <string>macosx</string>
+ <key>FamilyName</key>
+ <string>Mac OS X</string>
+ <key>MinimalDisplayName</key>
+ <string>10.10</string>
+ <key>MinimumSupportedToolsVersion</key>
+ <string>6.1</string>
+ <key>Version</key>
+ <string>3.7.0</string>
+ <key>IsBaseSDK</key>
+ <string>NO</string>
+</dict>
+</plist>
diff --git a/cpp/Makefile b/cpp/Makefile
index 75d3b52b04f..4da978a6091 100644
--- a/cpp/Makefile
+++ b/cpp/Makefile
@@ -17,8 +17,8 @@ include $(lang_srcdir)/config/Make.rules
# Create projects for all the Slice translators from src/slice2* and load source projects.
#
projects :=
-include $(shell find $(lang_srcdir)/src -name Makefile.mk)
$(foreach t,$(wildcard $(lang_srcdir)/src/slice2*),$(eval $(call create-translator-project,$(call project,$t))))
+include $(shell find $(lang_srcdir)/src -name Makefile.mk)
$(call make-projects,$(projects),make-cpp-src-project)
#
@@ -32,4 +32,3 @@ $(call make-projects,$(projects),make-cpp-test-project)
install:: | $(DESTDIR)$(install_configdir)
$(Q)$(INSTALL) $(lang_srcdir)/config/templates.xml $(DESTDIR)$(install_configdir)
-
diff --git a/cpp/config/Make.rules b/cpp/config/Make.rules
index 257b922ce5f..af13caafc32 100644
--- a/cpp/config/Make.rules
+++ b/cpp/config/Make.rules
@@ -11,17 +11,19 @@
# Don't change anything below this line!
# ----------------------------------------------------------------------
--include $(lang_srcdir)/config/Make.rules.$(os)
-
#
# Supported configurations
#
supported-configs = shared static cpp11-shared cpp11-static
+-include $(lang_srcdir)/config/Make.rules.$(os)
+ifeq ($(os),Darwin)
+include $(lang_srcdir)/config/Make.xcodesdk.rules
+endif
+
#
# Define which projects to build for the different configurations.
#
-
coreandstub_components = IceUtil \
Ice \
IceSSL \
@@ -95,21 +97,13 @@ cpp11_targetname = $(if $(or $(filter-out $($1_target),program),$(filter-out %/
cpp11_targetdir = $(if $(filter %/build,$($1_targetdir)),cpp11)
#
-# Create top-level include/config dir
-#
-$(DESTDIR)$(install_includedir) $(DESTDIR)$(install_configdir):
- $(Q)$(MKDIR) $@
-
-#
# $(call make-cpp-src-project,$1=project)
#
define make-cpp-src-project
-ifeq ($(USE_BIN_DIST),yes)
-$(create-project-targets)
-else
+ifneq ($(USE_BIN_DIST),yes)
$1_slicecompiler := slice2cpp
$1_sliceflags += --ice -I$(slicedir)
-$1_cppflags += -Isrc -I$1/generated -I$(includedir) -I$(includedir)/generated
+$1_cppflags += -Isrc -I$1/generated -I$(includedir) -I$(includedir)/generated
$(make-project)
srcs:: $1
endif
@@ -120,12 +114,11 @@ endef
#
define make-cpp-test-project
$1_slicecompiler := slice2cpp
-$1_sliceflags := -I$(slicedir) $$($1_sliceflags)
-$1_cppflags := -I$(includedir) -Itest/include -I$1 -I$1/generated $$($1_cppflags)
+$1_sliceflags += -I$(slicedir)
+$1_cppflags += -I$1/generated -I$1 -Itest/include -I$(includedir)
ifneq ($(USE_BIN_DIST),yes)
$1_cppflags += -I$(includedir)/generated
endif
-
$(make-project)
tests:: $1
endef
@@ -138,7 +131,20 @@ $1_srcext := cpp
$1_dependencies := $$(or $$($1_dependencies),TestCommon Ice)
# Also link with IceSSL and IceBT (Debian/Ubuntu) when compiling the project with the static configuration
-static_dependencies[$1] := $$(or $$($1_dependencies[static]),IceSSL $(if $(filter debian ubuntu,$(linux_id)),IceBT))
+$1[static]_dependencies := IceSSL $(if $(filter debian ubuntu,$(linux_id)),IceBT)
+
+# Dependencies and target dirs for Xcode SDK test projects
+$1[xcodesdk]_dependencies := IceSSL
+$1[iphoneos-xcodesdk]_targetdir := test/ios/Bundles-iphoneos/$(subst /,_,$1)
+$1[iphonesimulator-xcodesdk]_targetdir := test/ios/Bundles-iphonesimulator/$(subst /,_,$1)
+$1[iphoneos-cpp11-xcodesdk]_targetdir := test/ios/Bundles++11-iphoneos/$(subst /,_,$1)
+$1[iphonesimulator-cpp11-xcodesdk]_targetdir := test/ios/Bundles++11-iphonesimulator/$(subst /,_,$1)
$(create-test-project)
endef
+
+#
+# Create top-level include/config dir
+#
+$(DESTDIR)$(install_includedir) $(DESTDIR)$(install_configdir):
+ $(Q)$(MKDIR) $@
diff --git a/cpp/config/Make.xcodesdk.rules b/cpp/config/Make.xcodesdk.rules
new file mode 100644
index 00000000000..de62fcee103
--- /dev/null
+++ b/cpp/config/Make.xcodesdk.rules
@@ -0,0 +1,68 @@
+# **********************************************************************
+#
+# Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+#
+# This copy of Ice is licensed to you under the terms described in the
+# ICE_LICENSE file included in this distribution.
+#
+# **********************************************************************
+
+include $(top_srcdir)/config/Make.xcodesdk.rules
+
+supported-configs += xcodesdk cpp11-xcodesdk
+
+is-iostest-program = $(and $(filter-out macosx,$2),$(filter program,$($1_target)))
+
+#
+# Xcode configuration to build Xcode IceSDK.
+#
+xcodesdk_targetdir = $(if $(filter %/build,$5),xcodesdk,$(if $(is-iostest-program),,IceSDK/$2.sdk/usr/lib))
+xcodesdk_installdir = $(if $(filter %/build,$5),xcodesdk,$(if $(is-iostest-program),,IceSDK/$2.sdk/usr/lib))
+xcodesdk_targetrule = $(if $(is-iostest-program),iostest,$(if $(filter-out program,$($1_target)),static))
+
+xcodesdk_components = Ice IceSSL Glacier2 IceStorm IceGrid IceDiscovery IceLocatorDiscovery TestCommon
+xcodesdk_projects = test/Ice/% test/IceDiscovery/simple
+xcodesdk_excludes = $(addprefix test/Ice/,background \
+ faultTolerance \
+ gc \
+ logger \
+ properties \
+ stringConverter \
+ threadPoolPriority)
+
+
+#
+# Rule to build an iOS bundle for testing (this is used for packaging client/server programs)
+#
+define make-iostest-program
+$2/$1.bundle/$1.dylib: $5 $(foreach d,$6,$($d_targets))
+ $(E) "Linking [$8-$9] $$@"
+ $(Q)if [ ! -f $2/$1.bundle/Info.plist ] ; \
+ then \
+ $(MKDIR) -p $2/$1.bundle ; \
+ sed "s/NAME/$1/" test/ios/BundleInfo.plist > $2/$1.bundle/Info.plist ; \
+ fi
+ $(Q)$(RM) $2/$1.bundle/$1.dylib
+ $(Q)$(or $($8_cxx),$(platform_cxx)) -bundle $(LDFLAGS) -o $2/$1.bundle/$1.dylib $5 $(strip $7)
+endef
+
+get-iostest-program-targets = $2/$1.bundle/$1.dylib
+
+ifneq ($(findstring xcodesdk,$(configs)),)
+$(eval $(call make-xcodesdk,bin/slice2cpp))
+component_with_config_extensions := make-cpp-xcodesdk-component-with-config
+endif
+
+#
+# $(call make-xcodesdk-component-with-config,$1=project,$2=component,$3=platform,$4=config,$5=comp[platform-config])
+#
+define make-cpp-xcodesdk-component-with-config
+ifneq ($(filter src/%,$1),)
+
+$(make-xcodesdk-component-with-config)
+
+$5_clean::
+ $(Q)$(RM) -r $(top_srcdir)/IceSDK/$3.sdk/usr/include/$2
+
+endif
+endef
diff --git a/cpp/src/Glacier2CryptPermissionsVerifier/Makefile.mk b/cpp/src/Glacier2CryptPermissionsVerifier/Makefile.mk
index 97980df7750..62d37067f28 100644
--- a/cpp/src/Glacier2CryptPermissionsVerifier/Makefile.mk
+++ b/cpp/src/Glacier2CryptPermissionsVerifier/Makefile.mk
@@ -11,7 +11,6 @@ $(project)_libraries += Glacier2CryptPermissionsVerifier
Glacier2CryptPermissionsVerifier_targetdir := $(libdir)
Glacier2CryptPermissionsVerifier_dependencies := Glacier2 Ice
-Glacier2CryptPermissionsVerifier_system_libs := $(CRYPT_OS_LIBS)
Glacier2CryptPermissionsVerifier_cppflags := -DCRYPT_PERMISSIONS_VERIFIER_API_EXPORTS
projects += $(project)
diff --git a/cpp/src/Ice/ConnectionFactory.cpp b/cpp/src/Ice/ConnectionFactory.cpp
index 43dc7f670ce..dbfc20e9a94 100644
--- a/cpp/src/Ice/ConnectionFactory.cpp
+++ b/cpp/src/Ice/ConnectionFactory.cpp
@@ -32,8 +32,8 @@
namespace IceInternal
{
-bool registerForBackgroundNotification(IceInternal::IncomingConnectionFactory*);
-void unregisterForBackgroundNotification(IceInternal::IncomingConnectionFactory*);
+bool registerForBackgroundNotification(const IceInternal::IncomingConnectionFactoryPtr&);
+void unregisterForBackgroundNotification(const IceInternal::IncomingConnectionFactoryPtr&);
}
#endif
@@ -1461,7 +1461,7 @@ IceInternal::IncomingConnectionFactory::finished(ThreadPoolCurrent&, bool close)
#if TARGET_OS_IPHONE != 0
sync.release();
- unregisterForBackgroundNotification(this);
+ unregisterForBackgroundNotification(shared_from_this());
#endif
}
@@ -1581,7 +1581,7 @@ IceInternal::IncomingConnectionFactory::stopAcceptor()
return;
}
- if(_adapter->getThreadPool()->finish(this, true))
+ if(_adapter->getThreadPool()->finish(shared_from_this(), true))
{
_acceptorStarted = false;
closeAcceptor();
@@ -1625,7 +1625,7 @@ IceInternal::IncomingConnectionFactory::initialize()
// start the acceptor if necessary.
//
_acceptorStarted = false;
- registerForBackgroundNotification(this);
+ registerForBackgroundNotification(shared_from_this());
#else
createAcceptor();
#endif
diff --git a/cpp/src/Ice/EventHandler.h b/cpp/src/Ice/EventHandler.h
index f77e61039cd..ced022ed06a 100644
--- a/cpp/src/Ice/EventHandler.h
+++ b/cpp/src/Ice/EventHandler.h
@@ -20,7 +20,7 @@
namespace IceInternal
{
-class ICE_API EventHandler :
+class ICE_API EventHandler :
#ifdef ICE_CPP11_MAPPING
public virtual Ice::VirtualEnableSharedFromThisBase
#else
diff --git a/cpp/src/Ice/Exception.cpp b/cpp/src/Ice/Exception.cpp
index dc5e94f852a..0dd364ca01b 100644
--- a/cpp/src/Ice/Exception.cpp
+++ b/cpp/src/Ice/Exception.cpp
@@ -803,11 +803,9 @@ Ice::ResponseSentException::ice_print(ostream& out) const
out << ":\nresponse sent exception";
}
-#ifdef ICE_USE_CFSTREAM
void
Ice::CFNetworkException::ice_print(ostream& out) const
{
Exception::ice_print(out);
out << ":\nnetwork exception: domain: " << domain << " error: " << error;
}
-#endif
diff --git a/cpp/src/Ice/Makefile.mk b/cpp/src/Ice/Makefile.mk
index f37b987a708..82161acbdce 100644
--- a/cpp/src/Ice/Makefile.mk
+++ b/cpp/src/Ice/Makefile.mk
@@ -10,25 +10,20 @@
$(project)_libraries = Ice
Ice_targetdir := $(libdir)
-Ice_cppflags = -DICE_API_EXPORTS
+Ice_cppflags = -DICE_API_EXPORTS $(IceUtil_cppflags)
ifeq ($(DEFAULT_MUTEX_PROTOCOL), PrioInherit)
Ice_cppflags += -DICE_PRIO_INHERIT
endif
-ifeq ($(libbacktrace),yes)
- Ice_cppflags += -DICE_LIBBACKTRACE
-endif
-
Ice_sliceflags := --include-dir Ice --dll-export ICE_API
Ice_libs := bz2
-Ice_system_libs := $(ICE_OS_LIBS)
Ice_extra_sources := $(wildcard src/IceUtil/*.cpp)
Ice_excludes := $(currentdir)/DLLMain.cpp
-Ice_extra_sources[iphoneos] := $(wildcard $(addprefix $(currentdir)/ios/,*.cpp *.mm))
-#Ice_excludes[iphoneos] := $(wildcard $(addprefix $(currentdir)/RegistryPlugins.cpp))
-Ice_extra_sources[iphonesimulator] := $(wildcard $(addprefix $(currentdir)/ios/,*.cpp *.mm))
-#Ice_excludes[iphonesimulator] := $(wildcard $(addprefix $(currentdir)/RegistryPlugins.cpp))
+Ice[iphoneos]_extra_sources := $(wildcard $(addprefix $(currentdir)/ios/,*.cpp *.mm))
+Ice[iphoneos]_excludes := $(currentdir)/RegisterPluginsInit.cpp
+Ice[iphonesimulator]_extra_sources = $(Ice[iphoneos]_extra_sources)
+Ice[iphonesimulator]_excludes = $(Ice[iphoneos]_excludes)
projects += $(project)
diff --git a/cpp/src/Ice/Selector.cpp b/cpp/src/Ice/Selector.cpp
index 9b52c0d7eb4..580d51d74fe 100644
--- a/cpp/src/Ice/Selector.cpp
+++ b/cpp/src/Ice/Selector.cpp
@@ -552,8 +552,8 @@ Selector::finish(EventHandler* handler, bool closeNow)
{
return false;
}
-#endif
-
+#endif
+
return closeNow;
}
@@ -844,7 +844,7 @@ Selector::checkReady(EventHandler* handler)
if(handler->_ready & ~handler->_disabled & handler->_registered)
{
#ifdef ICE_CPP11_MAPPING
- _readyHandlers.insert(make_pair(dynamic_pointer_cast<EventHandler>(handler->shared_from_this()),
+ _readyHandlers.insert(make_pair(dynamic_pointer_cast<EventHandler>(handler->shared_from_this()),
SocketOperationNone));
#else
_readyHandlers.insert(make_pair(handler, SocketOperationNone));
@@ -854,7 +854,7 @@ Selector::checkReady(EventHandler* handler)
else
{
#ifdef ICE_CPP11_MAPPING
- map<EventHandlerPtr, SocketOperation>::iterator p =
+ map<EventHandlerPtr, SocketOperation>::iterator p =
_readyHandlers.find(dynamic_pointer_cast<EventHandler>(handler->shared_from_this()));
#else
map<EventHandlerPtr, SocketOperation>::iterator p = _readyHandlers.find(handler);
@@ -1038,8 +1038,12 @@ toCFCallbacks(SocketOperation op)
}
-EventHandlerWrapper::EventHandlerWrapper(const EventHandlerPtr& handler, Selector& selector) :
+EventHandlerWrapper::EventHandlerWrapper(EventHandler* handler, Selector& selector) :
+#ifdef ICE_CPP11_MAPPING
+ _handler(std::dynamic_pointer_cast<EventHandler>(handler->shared_from_this())),
+#else
_handler(handler),
+#endif
_streamNativeInfo(StreamNativeInfoPtr::dynamicCast(handler->getNativeInfo())),
_selector(selector),
_ready(SocketOperationNone),
diff --git a/cpp/src/Ice/Selector.h b/cpp/src/Ice/Selector.h
index dd8b8b3ac9c..4f433c32aa4 100644
--- a/cpp/src/Ice/Selector.h
+++ b/cpp/src/Ice/Selector.h
@@ -227,7 +227,7 @@ class EventHandlerWrapper : public SelectorReadyCallback
{
public:
- EventHandlerWrapper(const EventHandlerPtr&, Selector&);
+ EventHandlerWrapper(EventHandler*, Selector&);
~EventHandlerWrapper();
void updateRunLoop();
diff --git a/cpp/src/Ice/Transceiver.h b/cpp/src/Ice/Transceiver.h
index 452b4afd6a1..a0f14ce7ad7 100644
--- a/cpp/src/Ice/Transceiver.h
+++ b/cpp/src/Ice/Transceiver.h
@@ -49,7 +49,7 @@ public:
virtual std::string toDetailedString() const = 0;
virtual Ice::ConnectionInfoPtr getInfo() const = 0;
virtual void checkSendSize(const Buffer&) = 0;
- virtual void setBufferSize(int rcvSize, int sndSize) = 0;
+ virtual void setBufferSize(int, int) = 0;
};
}
diff --git a/cpp/src/Ice/ios/Notifications.mm b/cpp/src/Ice/ios/Notifications.mm
new file mode 100644
index 00000000000..bab9a73824c
--- /dev/null
+++ b/cpp/src/Ice/ios/Notifications.mm
@@ -0,0 +1,138 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <Ice/Config.h>
+
+#if TARGET_OS_IPHONE != 0
+
+#import <Foundation/NSObject.h>
+#import <Foundation/NSNotification.h>
+#import <UIKit/UIApplication.h>
+
+#include <Ice/ConnectionFactory.h>
+
+#include <set>
+
+using namespace std;
+using namespace IceInternal;
+
+namespace IceInternal
+{
+
+bool registerForBackgroundNotification(const IncomingConnectionFactoryPtr&);
+void unregisterForBackgroundNotification(const IncomingConnectionFactoryPtr&);
+
+}
+
+namespace
+{
+
+class Observer
+{
+public:
+
+ Observer() : _background(false)
+ {
+ [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification
+ object:nil
+ queue:nil
+ usingBlock:^(NSNotification*)
+ {
+ didEnterBackground();
+ }];
+
+ [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillEnterForegroundNotification
+ object:nil
+ queue:nil
+ usingBlock:^(NSNotification*)
+ {
+ willEnterForeground();
+ }];
+ }
+
+ bool
+ add(const IncomingConnectionFactoryPtr& factory)
+ {
+ IceUtil::Mutex::Lock sync(_mutex);
+ _factories.insert(factory);
+ if(_background)
+ {
+ factory->stopAcceptor();
+ }
+ else
+ {
+ factory->startAcceptor();
+ }
+ return _background;
+ }
+
+ void
+ remove(const IncomingConnectionFactoryPtr& factory)
+ {
+ IceUtil::Mutex::Lock sync(_mutex);
+ _factories.erase(factory);
+ }
+
+ void
+ didEnterBackground()
+ {
+ IceUtil::Mutex::Lock sync(_mutex);
+
+ //
+ // Notify all the incoming connection factories that we are
+ // entering the background mode.
+ //
+ for(set<IncomingConnectionFactoryPtr>::const_iterator p = _factories.begin(); p != _factories.end(); ++p)
+ {
+ (*p)->stopAcceptor();
+ }
+ _background = true;
+ }
+
+ void
+ willEnterForeground()
+ {
+ IceUtil::Mutex::Lock sync(_mutex);
+
+ //
+ // Notify all the incoming connection factories that we are
+ // entering the foreground mode.
+ //
+ _background = false;
+ for(set<IncomingConnectionFactoryPtr>::const_iterator p = _factories.begin(); p != _factories.end(); ++p)
+ {
+ (*p)->startAcceptor();
+ }
+ }
+
+private:
+
+ IceUtil::Mutex _mutex;
+ bool _background;
+ set<IncomingConnectionFactoryPtr> _factories;
+};
+
+
+}
+
+static Observer* observer = new Observer();
+
+bool
+IceInternal::registerForBackgroundNotification(const IncomingConnectionFactoryPtr& factory)
+{
+ return observer->add(factory);
+}
+
+void
+IceInternal::unregisterForBackgroundNotification(const IncomingConnectionFactoryPtr& factory)
+{
+ observer->remove(factory);
+}
+
+#endif
diff --git a/cpp/src/Ice/ios/RegisterPluginsInit.cpp b/cpp/src/Ice/ios/RegisterPluginsInit.cpp
new file mode 100644
index 00000000000..712f4dcc765
--- /dev/null
+++ b/cpp/src/Ice/ios/RegisterPluginsInit.cpp
@@ -0,0 +1,30 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Ice/RegisterPluginsInit.h>
+#include <Ice/CommunicatorF.h>
+#include <Ice/Initialize.h>
+
+extern "C"
+{
+
+Ice::Plugin* createIceUDP(const Ice::CommunicatorPtr&, const std::string&, const Ice::StringSeq&);
+Ice::Plugin* createIceTCP(const Ice::CommunicatorPtr&, const std::string&, const Ice::StringSeq&);
+Ice::Plugin* createIceSSL(const Ice::CommunicatorPtr&, const std::string&, const Ice::StringSeq&);
+Ice::Plugin* createIceIAP(const Ice::CommunicatorPtr&, const std::string&, const Ice::StringSeq&);
+
+};
+
+IceInternal::RegisterPluginsInit::RegisterPluginsInit()
+{
+ Ice::registerPluginFactory("IceUDP", createIceUDP, true);
+ Ice::registerPluginFactory("IceTCP", createIceTCP, true);
+ Ice::registerPluginFactory("IceSSL", createIceSSL, true);
+ Ice::registerPluginFactory("IceIAP", createIceIAP, true);
+}
diff --git a/cpp/src/Ice/ios/StreamAcceptor.cpp b/cpp/src/Ice/ios/StreamAcceptor.cpp
new file mode 100644
index 00000000000..3d1a4a956b0
--- /dev/null
+++ b/cpp/src/Ice/ios/StreamAcceptor.cpp
@@ -0,0 +1,160 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include "StreamTransceiver.h"
+#include "StreamEndpointI.h"
+#include "StreamAcceptor.h"
+
+#include <IceUtil/StringUtil.h>
+
+#include <Ice/Instance.h>
+#include <Ice/Network.h>
+#include <Ice/Exception.h>
+#include <Ice/Properties.h>
+
+#include <CoreFoundation/CoreFoundation.h>
+
+using namespace std;
+using namespace Ice;
+using namespace IceInternal;
+
+NativeInfoPtr
+IceObjC::StreamAcceptor::getNativeInfo()
+{
+ return this;
+}
+
+void
+IceObjC::StreamAcceptor::close()
+{
+ if(_fd != INVALID_SOCKET)
+ {
+ closeSocketNoThrow(_fd);
+ _fd = INVALID_SOCKET;
+ }
+}
+
+EndpointIPtr
+IceObjC::StreamAcceptor::listen()
+{
+ try
+ {
+ const_cast<Address&>(_addr) = doBind(_fd, _addr);
+ doListen(_fd, _backlog);
+ }
+ catch(...)
+ {
+ _fd = INVALID_SOCKET;
+ throw;
+ }
+
+ _endpoint = _endpoint->endpoint(this);
+ return _endpoint;
+}
+
+TransceiverPtr
+IceObjC::StreamAcceptor::accept()
+{
+ SOCKET fd = doAccept(_fd);
+ setBlock(fd, false);
+ setTcpBufSize(fd, _instance);
+
+ //
+ // Create the read/write streams
+ //
+ CFReadStreamRef readStream = nil;
+ CFWriteStreamRef writeStream = nil;
+ try
+ {
+ CFStreamCreatePairWithSocket(NULL, fd, &readStream, &writeStream);
+ _instance->setupStreams(readStream, writeStream, true, "");
+ return new StreamTransceiver(_instance, readStream, writeStream, fd);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ if(fd != INVALID_SOCKET)
+ {
+ closeSocketNoThrow(fd);
+ }
+ if(readStream)
+ {
+ CFRelease(readStream);
+ }
+ if(writeStream)
+ {
+ CFRelease(writeStream);
+ }
+ throw;
+ }
+}
+
+string
+IceObjC::StreamAcceptor::protocol() const
+{
+ return _instance->protocol();
+}
+
+string
+IceObjC::StreamAcceptor::toString() const
+{
+ return addrToString(_addr);
+}
+
+string
+IceObjC::StreamAcceptor::toDetailedString() const
+{
+ ostringstream os;
+ os << "local address = " << toString();
+ vector<string> intfs = getHostsForEndpointExpand(inetAddrToString(_addr), _instance->protocolSupport(), true);
+ if(!intfs.empty())
+ {
+ os << "\nlocal interfaces = ";
+ os << IceUtilInternal::joinString(intfs, ", ");
+ }
+ return os.str();
+}
+
+int
+IceObjC::StreamAcceptor::effectivePort() const
+{
+ return getPort(_addr);
+}
+
+IceObjC::StreamAcceptor::StreamAcceptor(const StreamEndpointIPtr& endpoint,
+ const InstancePtr& instance,
+ const string& host,
+ int port) :
+ _endpoint(endpoint),
+ _instance(instance),
+ _addr(getAddressForServer(host, port, instance->protocolSupport(), instance->preferIPv6()))
+{
+#ifdef SOMAXCONN
+ _backlog = instance->properties()->getPropertyAsIntWithDefault("Ice.TCP.Backlog", SOMAXCONN);
+#else
+ _backlog = instance->properties()->getPropertyAsIntWithDefault("Ice.TCP.Backlog", 511);
+#endif
+
+ try
+ {
+ _fd = createSocket(false, _addr);
+ setBlock(_fd, false);
+ setTcpBufSize(_fd, _instance);
+ setReuseAddress(_fd, true);
+ }
+ catch(...)
+ {
+ _fd = INVALID_SOCKET;
+ throw;
+ }
+}
+
+IceObjC::StreamAcceptor::~StreamAcceptor()
+{
+ assert(_fd == INVALID_SOCKET);
+}
diff --git a/cpp/src/Ice/ios/StreamAcceptor.h b/cpp/src/Ice/ios/StreamAcceptor.h
new file mode 100644
index 00000000000..5997ac7c6db
--- /dev/null
+++ b/cpp/src/Ice/ios/StreamAcceptor.h
@@ -0,0 +1,54 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef ICE_STREAM_ACCEPTOR_H
+#define ICE_STREAM_ACCEPTOR_H
+
+#include <Ice/TransceiverF.h>
+#include <Ice/Acceptor.h>
+
+namespace IceObjC
+{
+
+class StreamEndpointI;
+#ifdef ICE_CPP11_MAPPING // C++11 mapping
+typedef ::std::shared_ptr<StreamEndpointI> StreamEndpointIPtr;
+#else
+typedef IceUtil::Handle<StreamEndpointI> StreamEndpointIPtr;
+#endif
+
+class StreamAcceptor : public IceInternal::Acceptor, public IceInternal::NativeInfo
+{
+public:
+
+ virtual IceInternal::NativeInfoPtr getNativeInfo();
+ virtual void close();
+ virtual IceInternal::EndpointIPtr listen();
+ virtual IceInternal::TransceiverPtr accept();
+ virtual std::string protocol() const;
+ virtual std::string toString() const;
+ virtual std::string toDetailedString() const;
+
+ int effectivePort() const;
+
+private:
+
+ StreamAcceptor(const StreamEndpointIPtr&, const InstancePtr&, const std::string&, int);
+ virtual ~StreamAcceptor();
+ friend class StreamEndpointI;
+
+ StreamEndpointIPtr _endpoint;
+ InstancePtr _instance;
+ int _backlog;
+ IceInternal::Address _addr;
+};
+
+}
+
+#endif
diff --git a/cpp/src/Ice/ios/StreamConnector.cpp b/cpp/src/Ice/ios/StreamConnector.cpp
new file mode 100644
index 00000000000..a5b87b07db0
--- /dev/null
+++ b/cpp/src/Ice/ios/StreamConnector.cpp
@@ -0,0 +1,169 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include "StreamTransceiver.h"
+#include "StreamEndpointI.h"
+#include "StreamConnector.h"
+
+#include <Ice/Network.h>
+#include <Ice/Exception.h>
+#include <Ice/Properties.h>
+#include <Ice/NetworkProxy.h>
+
+#include <CoreFoundation/CoreFoundation.h>
+
+using namespace std;
+using namespace Ice;
+using namespace IceInternal;
+
+TransceiverPtr
+IceObjC::StreamConnector::connect()
+{
+ CFReadStreamRef readStream = nil;
+ CFWriteStreamRef writeStream = nil;
+ try
+ {
+ CFStringRef h = CFStringCreateWithCString(NULL, _host.c_str(), kCFStringEncodingUTF8);
+ CFHostRef host = CFHostCreateWithName(NULL, h);
+ CFRelease(h);
+ CFStreamCreatePairWithSocketToCFHost(NULL, host, _port, &readStream, &writeStream);
+ CFRelease(host);
+
+ _instance->setupStreams(readStream, writeStream, false, _host);
+ return new StreamTransceiver(_instance, readStream, writeStream, _host, _port);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ if(readStream)
+ {
+ CFRelease(readStream);
+ }
+ if(writeStream)
+ {
+ CFRelease(writeStream);
+ }
+ throw;
+ }
+}
+
+Short
+IceObjC::StreamConnector::type() const
+{
+ return _instance->type();
+}
+
+string
+IceObjC::StreamConnector::toString() const
+{
+ string proxyHost = _instance->proxyHost();
+ ostringstream os;
+ if(!proxyHost.empty())
+ {
+ os << proxyHost << ":" << _instance->proxyPort();
+ }
+ else
+ {
+ os << _host << ":" << _port;
+ }
+ return os.str();
+}
+
+bool
+IceObjC::StreamConnector::operator==(const IceInternal::Connector& r) const
+{
+ const StreamConnector* p = dynamic_cast<const StreamConnector*>(&r);
+ if(!p)
+ {
+ return false;
+ }
+
+ if(_timeout != p->_timeout)
+ {
+ return false;
+ }
+
+ if(_connectionId != p->_connectionId)
+ {
+ return false;
+ }
+
+ if(_host != p->_host)
+ {
+ return false;
+ }
+
+ if(_port != p->_port)
+ {
+ return false;
+ }
+
+ return true;
+}
+
+bool
+IceObjC::StreamConnector::operator!=(const IceInternal::Connector& r) const
+{
+ return !operator==(r);
+}
+
+bool
+IceObjC::StreamConnector::operator<(const IceInternal::Connector& r) const
+{
+ const StreamConnector* p = dynamic_cast<const StreamConnector*>(&r);
+ if(!p)
+ {
+ return type() < r.type();
+ }
+
+ if(_timeout < p->_timeout)
+ {
+ return true;
+ }
+ else if(p->_timeout < _timeout)
+ {
+ return false;
+ }
+
+ if(_connectionId < p->_connectionId)
+ {
+ return true;
+ }
+ else if(p->_connectionId < _connectionId)
+ {
+ return false;
+ }
+
+ if(_host < p->_host)
+ {
+ return true;
+ }
+ else if(p->_host < _host)
+ {
+ return false;
+ }
+
+ return _port < p->_port;
+}
+
+IceObjC::StreamConnector::StreamConnector(const InstancePtr& instance,
+ const string& host,
+ Ice::Int port,
+ Ice::Int timeout,
+ const string& connectionId) :
+ _instance(instance),
+ _host(host.empty() ? string("127.0.0.1") : host),
+ _port(port),
+ _timeout(timeout),
+ _connectionId(connectionId)
+{
+}
+
+IceObjC::StreamConnector::~StreamConnector()
+{
+}
diff --git a/cpp/src/Ice/ios/StreamConnector.h b/cpp/src/Ice/ios/StreamConnector.h
new file mode 100644
index 00000000000..91d806fd707
--- /dev/null
+++ b/cpp/src/Ice/ios/StreamConnector.h
@@ -0,0 +1,52 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef ICE_STREAM_CONNECTOR_H
+#define ICE_STREAM_CONNECTOR_H
+
+#include <Ice/TransceiverF.h>
+#include <Ice/Connector.h>
+
+namespace IceObjC
+{
+
+class StreamEndpointI;
+
+class Instance;
+typedef IceUtil::Handle<Instance> InstancePtr;
+
+class StreamConnector : public IceInternal::Connector
+{
+public:
+
+ virtual IceInternal::TransceiverPtr connect();
+
+ virtual Ice::Short type() const;
+ virtual std::string toString() const;
+
+ virtual bool operator==(const IceInternal::Connector&) const;
+ virtual bool operator!=(const IceInternal::Connector&) const;
+ virtual bool operator<(const IceInternal::Connector&) const;
+
+private:
+
+ StreamConnector(const InstancePtr&, const std::string&, Ice::Int, Ice::Int, const std::string&);
+ virtual ~StreamConnector();
+ friend class StreamEndpointI;
+
+ const InstancePtr _instance;
+ const std::string _host;
+ const Ice::Int _port;
+ const Ice::Int _timeout;
+ const std::string _connectionId;
+};
+
+}
+
+#endif
diff --git a/cpp/src/Ice/ios/StreamEndpointI.cpp b/cpp/src/Ice/ios/StreamEndpointI.cpp
new file mode 100644
index 00000000000..0be2584140c
--- /dev/null
+++ b/cpp/src/Ice/ios/StreamEndpointI.cpp
@@ -0,0 +1,820 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include "StreamEndpointI.h"
+#include "StreamAcceptor.h"
+#include "StreamConnector.h"
+
+#include <IceUtil/StringUtil.h>
+
+#include <Ice/Network.h>
+#include <Ice/InputStream.h>
+#include <Ice/OutputStream.h>
+#include <Ice/LocalException.h>
+#include <Ice/Communicator.h>
+#include <Ice/EndpointFactoryManager.h>
+#include <Ice/Properties.h>
+#include <Ice/HashUtil.h>
+#include <Ice/NetworkProxy.h>
+
+#include <IceSSL/EndpointInfo.h>
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/Security.h>
+
+#include <fstream>
+
+using namespace std;
+using namespace Ice;
+using namespace IceInternal;
+
+extern "C"
+{
+
+Plugin*
+createIceTCP(const CommunicatorPtr& com, const string&, const StringSeq&)
+{
+ IceObjC::InstancePtr tcpInstance = new IceObjC::Instance(com, TCPEndpointType, "tcp", false);
+ return new EndpointFactoryPlugin(com, new IceObjC::StreamEndpointFactory(tcpInstance));
+}
+
+Plugin*
+createIceSSL(const CommunicatorPtr& com, const string&, const StringSeq&)
+{
+ IceObjC::InstancePtr sslInstance = new IceObjC::Instance(com, SSLEndpointType, "ssl", true);
+ return new EndpointFactoryPlugin(com, new IceObjC::StreamEndpointFactory(sslInstance));
+}
+
+}
+
+namespace Ice
+{
+
+void
+registerIceSSL(bool)
+{
+ // Nothing to do, we always register IceSSL
+}
+
+}
+
+inline CFStringRef
+toCFString(const string& s)
+{
+ return CFStringCreateWithCString(NULL, s.c_str(), kCFStringEncodingUTF8);
+}
+
+inline int
+hexValue(char c)
+{
+ if(c >= '0' && c <= '9')
+ {
+ return c - '0';
+ }
+ else if(c >= 'A' && c <= 'F')
+ {
+ return (c - 'A') + 10;
+ }
+ else if(c >= 'a' && c <= 'f')
+ {
+ return (c - 'a') + 10;
+ }
+ return -1;
+}
+
+inline CFDataRef
+parseKey(const string& keyStr)
+{
+ int i = 0, j = 0;
+ const char* m = keyStr.c_str();
+ CFMutableDataRef data = CFDataCreateMutable(0, 160);
+ unsigned char buf[160];
+ while(i < (int)keyStr.size())
+ {
+ if(isspace(m[i]) || m[i] == ':')
+ {
+ ++i;
+ continue;
+ }
+ else if(i == (int)keyStr.size() - 1)
+ {
+ CFRelease(data);
+ return 0; // Not enough bytes.
+ }
+
+ int vh = hexValue(m[i++]);
+ int vl = hexValue(m[i++]);
+ if(vh < 0 || vl < 0)
+ {
+ CFRelease(data);
+ return 0;
+ }
+ buf[j] = vh << 4;
+ buf[j++] += vl;
+
+ if(j == sizeof(buf))
+ {
+ CFDataAppendBytes(data, (UInt8*)buf, j);
+ j = 0;
+ }
+ }
+
+ if(j > 0)
+ {
+ CFDataAppendBytes(data, buf, j);
+ }
+
+ return data;
+}
+
+namespace
+{
+
+CFDataRef
+readCert(const string& defaultDir, const string& certFile)
+{
+ string path;
+ CFURLRef url = 0;
+ CFBundleRef bundle = CFBundleGetMainBundle();
+ if(bundle)
+ {
+ CFStringRef resourceName = toCFString(certFile);
+ CFStringRef subDirName = toCFString(defaultDir);
+ url = CFBundleCopyResourceURL(bundle, resourceName, 0, subDirName);
+ CFRelease(resourceName);
+ CFRelease(subDirName);
+
+ UInt8 filePath[PATH_MAX];
+ if(CFURLGetFileSystemRepresentation(url, true, filePath, sizeof(filePath)))
+ {
+ path = string(reinterpret_cast<char*>(filePath));
+ }
+ }
+
+ if(!url || path.empty())
+ {
+ path = defaultDir.empty() ? certFile : defaultDir + "/" + certFile;
+ }
+
+ FILE *file = fopen(path.c_str(), "rb");
+ if(!file)
+ {
+ ostringstream os;
+ os << "IceSSL: unable to open file " << certFile << " (error = " << IceUtilInternal::lastErrorToString() << ")";
+ throw InitializationException(__FILE__, __LINE__, os.str());
+ }
+
+ fseek(file, 0, SEEK_END);
+ unsigned long size = ftell(file);
+ fseek(file, 0, SEEK_SET);
+ CFMutableDataRef data = CFDataCreateMutable(kCFAllocatorDefault, size);
+ CFDataSetLength(data, size);
+ if(fread(CFDataGetMutableBytePtr(data), 1, size, file) != size)
+ {
+ CFRelease(data);
+ ostringstream os;
+ os << "IceSSL: error while reading file " << certFile;
+ throw InitializationException(__FILE__, __LINE__, os.str());
+ }
+ fclose(file);
+ return data;
+}
+
+}
+
+IceObjC::Instance::Instance(const Ice::CommunicatorPtr& com, Short type, const string& protocol, bool secure) :
+ ProtocolInstance(com, type, protocol, secure),
+ _voip(com->getProperties()->getPropertyAsIntWithDefault("Ice.Voip", 0) > 0),
+ _communicator(com),
+ _serverSettings(0),
+ _clientSettings(0),
+ _proxySettings(0),
+ _certificateAuthorities(0),
+ _trustOnlyKeyID(0)
+{
+ const Ice::PropertiesPtr properties = com->getProperties();
+ if(secure)
+ {
+ _clientSettings = CFDictionaryCreateMutable(0, 1, &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks);
+
+ string defaultDir = properties->getProperty("IceSSL.DefaultDir");
+ string certAuthFile = properties->getProperty("IceSSL.CAs");
+ if(certAuthFile.empty())
+ {
+ certAuthFile = properties->getProperty("IceSSL.CertAuthFile");
+ }
+ string certFile = properties->getProperty("IceSSL.CertFile");
+
+ OSStatus err;
+ if(!certAuthFile.empty())
+ {
+ CFDataRef cert = readCert(defaultDir, certAuthFile);
+ if(!cert)
+ {
+ InitializationException ex(__FILE__, __LINE__);
+ ex.reason = "IceSSL: unable to open file " + certAuthFile;
+ throw ex;
+ }
+
+ SecCertificateRef result = SecCertificateCreateWithData(0, cert);
+ CFRelease(cert);
+ if(!result)
+ {
+ InitializationException ex(__FILE__, __LINE__);
+ ex.reason = "IceSSL: certificate " + certAuthFile + " is not a valid DER-encoded certificate";
+ throw ex;
+ }
+
+ SecCertificateRef certs[] = { result };
+ _certificateAuthorities = CFArrayCreate(0, (const void**)certs, 1, &kCFTypeArrayCallBacks);
+ CFRelease(result);
+
+ // The root CA will be validated by the transceiver.
+ // NOTE: on the iPhone, setting kCFStreamSSLAllowsAnyRoot = true isn't enough.
+ //CFDictionarySetValue(_clientSettings, kCFStreamSSLAllowsAnyRoot, kCFBooleanTrue);
+ CFDictionarySetValue(_clientSettings, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse);
+ }
+ else if(properties->getPropertyAsInt("IceSSL.UsePlatformCAs") <= 0)
+ {
+ // Setup an empty list of Root CAs to not use the system root CAs.
+ _certificateAuthorities = CFArrayCreate(0, 0, 0, 0);
+ }
+
+ if(!certFile.empty())
+ {
+ CFDataRef cert = readCert(defaultDir, certFile);
+ if(!cert)
+ {
+ InitializationException ex(__FILE__, __LINE__);
+ ex.reason = "IceSSL: unable to open file " + certFile;
+ throw ex;
+ }
+
+ CFMutableDictionaryRef settings = CFDictionaryCreateMutable(0, 1, &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks);
+ CFStringRef password = toCFString(properties->getProperty("IceSSL.Password"));
+ CFDictionarySetValue(settings, kSecImportExportPassphrase, password);
+ CFRelease(password);
+
+ CFArrayRef items = 0;
+ err = SecPKCS12Import(cert, settings, &items);
+ CFRelease(cert);
+ CFRelease(settings);
+ if(err != noErr)
+ {
+ ostringstream os;
+ os << "IceSSL: unable to import certificate from file " << certFile << " (error = " << err << ")";
+ throw InitializationException(__FILE__, __LINE__, os.str());
+ }
+
+ SecIdentityRef identity = 0;
+ if(CFArrayGetCount(items) > 0)
+ {
+ identity = (SecIdentityRef)CFDictionaryGetValue((CFDictionaryRef)CFArrayGetValueAtIndex(items, 0),
+ kSecImportItemIdentity);
+ }
+ if(identity == 0)
+ {
+ ostringstream os;
+ os << "IceSSL: couldn't find identity in file " << certFile << " (error = " << err << ")";
+ throw InitializationException(__FILE__, __LINE__, os.str());
+ }
+ CFRetain(identity);
+ CFRelease(items);
+
+ SecIdentityRef identities[] = { identity };
+ items = CFArrayCreate(0, (const void**)identities, 1, &kCFTypeArrayCallBacks);
+ CFDictionarySetValue(_clientSettings, kCFStreamSSLCertificates, items);
+ CFRelease(identity);
+ CFRelease(items);
+ }
+
+ string trustOnly = properties->getProperty("IceSSL.TrustOnly.Client");
+ if(!trustOnly.empty())
+ {
+ _trustOnlyKeyID = parseKey(trustOnly);
+ if(!_trustOnlyKeyID)
+ {
+ ostringstream os;
+ os << "IceSSL: invalid `IceSSL.TrustOnly.Client' property value";
+ throw InitializationException(__FILE__, __LINE__, os.str());
+ }
+ }
+
+ _serverSettings = CFDictionaryCreateMutableCopy(0, 0, _clientSettings);
+ CFDictionarySetValue(_serverSettings, kCFStreamSSLIsServer, kCFBooleanTrue);
+ }
+
+ //
+ // Proxy settings
+ //
+ _proxyHost = properties->getProperty("Ice.SOCKSProxyHost");
+ if(!_proxyHost.empty())
+ {
+#if TARGET_IPHONE_SIMULATOR != 0
+ throw Ice::FeatureNotSupportedException(__FILE__, __LINE__, "SOCKS proxy not supported");
+#endif
+ _proxySettings = CFDictionaryCreateMutable(0, 3, &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks);
+
+ _proxyPort = properties->getPropertyAsIntWithDefault("Ice.SOCKSProxyPort", 1080);
+
+ CFStringRef host = toCFString(_proxyHost);
+ CFDictionarySetValue(_proxySettings, kCFStreamPropertySOCKSProxyHost, host);
+ CFRelease(host);
+
+ CFNumberRef port = CFNumberCreate(0, kCFNumberSInt32Type, &_proxyPort);
+ CFDictionarySetValue(_proxySettings, kCFStreamPropertySOCKSProxyPort, port);
+ CFRelease(port);
+
+ CFDictionarySetValue(_proxySettings, kCFStreamPropertySOCKSVersion, kCFStreamSocketSOCKSVersion4);
+ }
+}
+
+IceObjC::Instance::~Instance()
+{
+ if(_trustOnlyKeyID)
+ {
+ CFRelease(_trustOnlyKeyID);
+ }
+ if(_serverSettings)
+ {
+ CFRelease(_serverSettings);
+ }
+ if(_clientSettings)
+ {
+ CFRelease(_clientSettings);
+ }
+ if(_certificateAuthorities)
+ {
+ CFRelease(_certificateAuthorities);
+ }
+ if(_proxySettings)
+ {
+ CFRelease(_proxySettings);
+ }
+}
+
+void
+IceObjC::Instance::setupStreams(CFReadStreamRef readStream,
+ CFWriteStreamRef writeStream,
+ bool server,
+ const string& host) const
+{
+ if(_voip)
+ {
+#if TARGET_IPHONE_SIMULATOR == 0
+ if(!CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP) ||
+ !CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP))
+ {
+ throw Ice::SyscallException(__FILE__, __LINE__);
+ }
+#endif
+ }
+
+ if(!server && _proxySettings)
+ {
+ if(!CFReadStreamSetProperty(readStream, kCFStreamPropertySOCKSProxy, _proxySettings) ||
+ !CFWriteStreamSetProperty(writeStream, kCFStreamPropertySOCKSProxy, _proxySettings))
+ {
+ throw Ice::SyscallException(__FILE__, __LINE__);
+ }
+ }
+
+ if(secure())
+ {
+ CFDictionaryRef settings = server ? _serverSettings : _clientSettings;
+
+ if(!CFReadStreamSetProperty(readStream, kCFStreamPropertySocketSecurityLevel,
+ kCFStreamSocketSecurityLevelNegotiatedSSL) ||
+ !CFWriteStreamSetProperty(writeStream, kCFStreamPropertySocketSecurityLevel,
+ kCFStreamSocketSecurityLevelNegotiatedSSL))
+ {
+ throw Ice::SecurityException(__FILE__, __LINE__, "couldn't set security level");
+ }
+
+ if(!server && properties()->getPropertyAsIntWithDefault("IceSSL.CheckCertName", 1))
+ {
+ settings = CFDictionaryCreateMutableCopy(0, 0, settings);
+
+ CFStringRef h = toCFString(host);
+ CFDictionarySetValue((CFMutableDictionaryRef)settings, kCFStreamSSLPeerName, h);
+ CFRelease(h);
+ }
+ else
+ {
+ CFRetain(settings);
+ }
+
+ if(!CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, settings) ||
+ !CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, settings))
+ {
+ CFRelease(settings);
+ throw Ice::SecurityException(__FILE__, __LINE__, "couldn't set security options");
+ }
+ CFRelease(settings);
+ }
+}
+
+IceObjC::Instance*
+IceObjC::Instance::clone(const ProtocolInstancePtr& instance)
+{
+ return new Instance(_communicator, instance->type(), instance->protocol(), instance->secure());
+}
+
+IceObjC::StreamEndpointI::StreamEndpointI(const InstancePtr& instance, const string& ho, Int po,
+ const Address& sourceAddr, Int ti, const string& conId, bool co) :
+ IceInternal::IPEndpointI(instance, ho, po, sourceAddr, conId),
+ _instance(instance),
+ _timeout(ti),
+ _compress(co)
+{
+}
+
+IceObjC::StreamEndpointI::StreamEndpointI(const InstancePtr& instance) :
+ IceInternal::IPEndpointI(instance),
+ _instance(instance),
+ _timeout(instance->defaultTimeout()),
+ _compress(false)
+{
+}
+
+IceObjC::StreamEndpointI::StreamEndpointI(const InstancePtr& instance, Ice::InputStream* s) :
+ IPEndpointI(instance, s),
+ _instance(instance),
+ _timeout(-1),
+ _compress(false)
+{
+ s->read(const_cast<Int&>(_timeout));
+ s->read(const_cast<bool&>(_compress));
+}
+
+EndpointInfoPtr
+IceObjC::StreamEndpointI::getInfo() const
+{
+ IPEndpointInfoPtr info;
+ if(_instance->secure())
+ {
+ info = ICE_MAKE_SHARED(InfoI<IceSSL::EndpointInfo>, ICE_DYNAMIC_CAST(StreamEndpointI, shared_from_this()));
+ }
+ else
+ {
+ info = ICE_MAKE_SHARED(InfoI<Ice::TCPEndpointInfo>, ICE_DYNAMIC_CAST(StreamEndpointI, shared_from_this()));
+ }
+ fillEndpointInfo(info.get());
+ return info;
+}
+
+EndpointInfoPtr
+IceObjC::StreamEndpointI::getWSInfo(const string& resource) const
+{
+ IPEndpointInfoPtr info;
+ if(_instance->secure())
+ {
+ IceSSL::WSSEndpointInfoPtr i;
+ i = ICE_MAKE_SHARED(InfoI<IceSSL::WSSEndpointInfo>, ICE_DYNAMIC_CAST(StreamEndpointI, shared_from_this()));
+ i->resource = resource;
+ info = i;
+ }
+ else
+ {
+ Ice::WSEndpointInfoPtr i;
+ i = ICE_MAKE_SHARED(InfoI<Ice::WSEndpointInfo>, ICE_DYNAMIC_CAST(StreamEndpointI, shared_from_this()));
+ i->resource = resource;
+ info = i;
+ }
+ fillEndpointInfo(info.get());
+ return info;
+}
+
+Int
+IceObjC::StreamEndpointI::timeout() const
+{
+ return _timeout;
+}
+
+EndpointIPtr
+IceObjC::StreamEndpointI::timeout(Int t) const
+{
+ if(t == _timeout)
+ {
+ return shared_from_this();
+ }
+ else
+ {
+ return ICE_MAKE_SHARED(StreamEndpointI, _instance, _host, _port, _sourceAddr, t, _connectionId, _compress);
+ }
+}
+
+bool
+IceObjC::StreamEndpointI::compress() const
+{
+ return _compress;
+}
+
+EndpointIPtr
+IceObjC::StreamEndpointI::compress(bool c) const
+{
+ if(c == _compress)
+ {
+ return shared_from_this();
+ }
+ else
+ {
+ return ICE_MAKE_SHARED(StreamEndpointI, _instance, _host, _port, _sourceAddr, _timeout, _connectionId, c);
+ }
+}
+
+bool
+IceObjC::StreamEndpointI::datagram() const
+{
+ return false;
+}
+
+bool
+IceObjC::StreamEndpointI::secure() const
+{
+ return _instance->secure();
+}
+
+void
+IceObjC::StreamEndpointI::connectors_async(Ice::EndpointSelectionType selType, const EndpointI_connectorsPtr& cb) const
+{
+ vector<ConnectorPtr> connectors;
+ connectors.push_back(new StreamConnector(_instance, _host, _port, _timeout, _connectionId));
+ cb->connectors(connectors);
+}
+
+TransceiverPtr
+IceObjC::StreamEndpointI::transceiver() const
+{
+ return 0;
+}
+
+AcceptorPtr
+IceObjC::StreamEndpointI::acceptor(const string&) const
+{
+ return new StreamAcceptor(ICE_DYNAMIC_CAST(StreamEndpointI, shared_from_this()), _instance, _host, _port);
+}
+
+IceObjC::StreamEndpointIPtr
+IceObjC::StreamEndpointI::endpoint(const StreamAcceptorPtr& a) const
+{
+ return ICE_MAKE_SHARED(StreamEndpointI, _instance, _host, a->effectivePort(), _sourceAddr, _timeout, _connectionId,
+ _compress);
+}
+
+string
+IceObjC::StreamEndpointI::options() const
+{
+ //
+ // WARNING: Certain features, such as proxy validation in Glacier2,
+ // depend on the format of proxy strings. Changes to toString() and
+ // methods called to generate parts of the reference string could break
+ // these features. Please review for all features that depend on the
+ // format of proxyToString() before changing this and related code.
+ //
+ ostringstream s;
+
+ s << IPEndpointI::options();
+
+ if(_timeout == -1)
+ {
+ s << " -t infinite";
+ }
+ else
+ {
+ s << " -t " << _timeout;
+ }
+
+ if(_compress)
+ {
+ s << " -z";
+ }
+
+ return s.str();
+}
+
+bool
+#ifdef ICE_CPP11_MAPPING
+IceObjC::StreamEndpointI::operator==(const Endpoint& r) const
+#else
+IceObjC::StreamEndpointI::operator==(const LocalObject& r) const
+#endif
+{
+ if(!IPEndpointI::operator==(r))
+ {
+ return false;
+ }
+
+ const StreamEndpointI* p = dynamic_cast<const StreamEndpointI*>(&r);
+ if(!p)
+ {
+ return false;
+ }
+
+ if(this == p)
+ {
+ return true;
+ }
+
+ if(_timeout != p->_timeout)
+ {
+ return false;
+ }
+
+ if(_compress != p->_compress)
+ {
+ return false;
+ }
+
+ return true;
+}
+
+bool
+#ifdef ICE_CPP11_MAPPING
+IceObjC::StreamEndpointI::operator<(const Endpoint& r) const
+#else
+IceObjC::StreamEndpointI::operator<(const LocalObject& r) const
+#endif
+{
+ const StreamEndpointI* p = dynamic_cast<const StreamEndpointI*>(&r);
+ if(!p)
+ {
+ const IceInternal::EndpointI* e = dynamic_cast<const IceInternal::EndpointI*>(&r);
+ if(!e)
+ {
+ return false;
+ }
+ return type() < e->type();
+ }
+
+ if(this == p)
+ {
+ return false;
+ }
+
+ if(_timeout < p->_timeout)
+ {
+ return true;
+ }
+ else if(p->_timeout < _timeout)
+ {
+ return false;
+ }
+
+ if(!_compress && p->_compress)
+ {
+ return true;
+ }
+ else if(p->_compress < _compress)
+ {
+ return false;
+ }
+
+ return IPEndpointI::operator<(r);
+}
+
+void
+IceObjC::StreamEndpointI::streamWriteImpl(Ice::OutputStream* s) const
+{
+ IPEndpointI::streamWriteImpl(s);
+ s->write(_timeout);
+ s->write(_compress);
+}
+
+void
+IceObjC::StreamEndpointI::hashInit(Ice::Int& h) const
+{
+ IPEndpointI::hashInit(h);
+ hashAdd(h, _timeout);
+ hashAdd(h, _compress);
+}
+
+void
+IceObjC::StreamEndpointI::fillEndpointInfo(IPEndpointInfo* info) const
+{
+ IPEndpointI::fillEndpointInfo(info);
+ info->timeout = _timeout;
+ info->compress = _compress;
+}
+
+bool
+IceObjC::StreamEndpointI::checkOption(const string& option, const string& argument, const string& endpoint)
+{
+ if(IPEndpointI::checkOption(option, argument, endpoint))
+ {
+ return true;
+ }
+
+ switch(option[1])
+ {
+ case 't':
+ {
+ if(argument.empty())
+ {
+ EndpointParseException ex(__FILE__, __LINE__);
+ ex.str = "no argument provided for -t option in endpoint " + endpoint;
+ throw ex;
+ }
+
+ if(argument == "infinite")
+ {
+ const_cast<Int&>(_timeout) = -1;
+ }
+ else
+ {
+ istringstream t(argument);
+ if(!(t >> const_cast<Int&>(_timeout)) || !t.eof() || _timeout < 1)
+ {
+ EndpointParseException ex(__FILE__, __LINE__);
+ ex.str = "invalid timeout value `" + argument + "' in endpoint " + endpoint;
+ throw ex;
+ }
+ }
+ return true;
+ }
+
+ case 'z':
+ {
+ if(!argument.empty())
+ {
+ EndpointParseException ex(__FILE__, __LINE__);
+ ex.str = "unexpected argument `" + argument + "' provided for -z option in " + endpoint;
+ throw ex;
+ }
+ const_cast<bool&>(_compress) = true;
+ return true;
+ }
+
+ default:
+ {
+ return false;
+ }
+ }
+}
+
+ConnectorPtr
+IceObjC::StreamEndpointI::createConnector(const Address& address, const NetworkProxyPtr& proxy) const
+{
+ assert(false);
+}
+
+IPEndpointIPtr
+IceObjC::StreamEndpointI::createEndpoint(const string& host, int port, const string& connectionId) const
+{
+ return ICE_MAKE_SHARED(StreamEndpointI, _instance, host, port, _sourceAddr, _timeout, connectionId, _compress);
+}
+
+IceObjC::StreamEndpointFactory::StreamEndpointFactory(const InstancePtr& instance) : _instance(instance)
+{
+}
+
+IceObjC::StreamEndpointFactory::~StreamEndpointFactory()
+{
+}
+
+Short
+IceObjC::StreamEndpointFactory::type() const
+{
+ return _instance->type();
+}
+
+string
+IceObjC::StreamEndpointFactory::protocol() const
+{
+ return _instance->protocol();
+}
+
+EndpointIPtr
+IceObjC::StreamEndpointFactory::create(vector<string>& args, bool oaEndpoint) const
+{
+ IPEndpointIPtr endpt = ICE_MAKE_SHARED(StreamEndpointI, _instance);
+ endpt->initWithOptions(args, oaEndpoint);
+ return endpt;
+}
+
+EndpointIPtr
+IceObjC::StreamEndpointFactory::read(Ice::InputStream* s) const
+{
+ return ICE_MAKE_SHARED(StreamEndpointI, _instance, s);
+}
+
+void
+IceObjC::StreamEndpointFactory::destroy()
+{
+ _instance = 0;
+}
+
+EndpointFactoryPtr
+IceObjC::StreamEndpointFactory::clone(const ProtocolInstancePtr& instance) const
+{
+ return new StreamEndpointFactory(_instance->clone(instance));
+}
diff --git a/cpp/src/Ice/ios/StreamEndpointI.h b/cpp/src/Ice/ios/StreamEndpointI.h
new file mode 100644
index 00000000000..8e45febc64b
--- /dev/null
+++ b/cpp/src/Ice/ios/StreamEndpointI.h
@@ -0,0 +1,170 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef ICE_STREAM_ENDPOINT_I_H
+#define ICE_STREAM_ENDPOINT_I_H
+
+#include <Ice/ProtocolInstance.h>
+#include <Ice/IPEndpointI.h>
+#include <Ice/WSEndpoint.h>
+#include <Ice/EndpointFactory.h>
+#include <Ice/InstanceF.h>
+
+#include <CoreFoundation/CFDictionary.h>
+#include <CFNetwork/CFNetwork.h>
+
+namespace Ice
+{
+
+class OutputStream;
+class InputStream;
+
+}
+
+namespace IceObjC
+{
+
+class Instance : public IceInternal::ProtocolInstance
+{
+public:
+
+ Instance(const Ice::CommunicatorPtr&, Ice::Short, const std::string&, bool);
+ virtual ~Instance();
+
+ CFArrayRef certificateAuthorities() const
+ {
+ return _certificateAuthorities;
+ }
+
+ CFDataRef trustOnlyKeyID() const
+ {
+ return _trustOnlyKeyID;
+ }
+
+ const std::string& proxyHost() const
+ {
+ return _proxyHost;
+ }
+
+ int proxyPort() const
+ {
+ return _proxyPort;
+ }
+
+ void setupStreams(CFReadStreamRef, CFWriteStreamRef, bool, const std::string&) const;
+
+ Instance* clone(const IceInternal::ProtocolInstancePtr&);
+
+private:
+
+ const bool _voip;
+ const Ice::CommunicatorPtr _communicator;
+ CFMutableDictionaryRef _serverSettings;
+ CFMutableDictionaryRef _clientSettings;
+ CFMutableDictionaryRef _proxySettings;
+ CFArrayRef _certificateAuthorities;
+ CFDataRef _trustOnlyKeyID;
+
+ std::string _proxyHost;
+ int _proxyPort;
+};
+typedef IceUtil::Handle<Instance> InstancePtr;
+
+class StreamAcceptor;
+typedef IceUtil::Handle<StreamAcceptor> StreamAcceptorPtr;
+
+class StreamEndpointI;
+#ifdef ICE_CPP11_MAPPING // C++11 mapping
+typedef ::std::shared_ptr<StreamEndpointI> StreamEndpointIPtr;
+#else
+typedef IceUtil::Handle<StreamEndpointI> StreamEndpointIPtr;
+#endif
+
+class StreamEndpointI : public IceInternal::IPEndpointI, public IceInternal::WSEndpointDelegate
+{
+public:
+
+ StreamEndpointI(const InstancePtr&, const std::string&, Ice::Int, const IceInternal::Address&, Ice::Int,
+ const std::string&, bool);
+ StreamEndpointI(const InstancePtr&);
+ StreamEndpointI(const InstancePtr&, Ice::InputStream*);
+
+ virtual Ice::EndpointInfoPtr getInfo() const;
+ virtual Ice::EndpointInfoPtr getWSInfo(const std::string&) const;
+
+ virtual Ice::Int timeout() const;
+ virtual IceInternal::EndpointIPtr timeout(Ice::Int) const;
+ virtual bool compress() const;
+ virtual IceInternal::EndpointIPtr compress(bool) const;
+ virtual bool datagram() const;
+ virtual bool secure() const;
+
+ virtual void connectors_async(Ice::EndpointSelectionType, const IceInternal::EndpointI_connectorsPtr&) const;
+ virtual IceInternal::TransceiverPtr transceiver() const;
+ virtual IceInternal::AcceptorPtr acceptor(const std::string&) const;
+ virtual std::string options() const;
+
+#ifdef ICE_CPP11_MAPPING
+ virtual bool operator==(const Ice::Endpoint&) const;
+ virtual bool operator<(const Ice::Endpoint&) const;
+#else
+ virtual bool operator==(const Ice::LocalObject&) const;
+ virtual bool operator<(const Ice::LocalObject&) const;
+#endif
+
+ StreamEndpointIPtr endpoint(const StreamAcceptorPtr&) const;
+
+ using IPEndpointI::connectionId;
+
+protected:
+
+ virtual void streamWriteImpl(Ice::OutputStream*) const;
+ virtual void hashInit(Ice::Int&) const;
+ virtual void fillEndpointInfo(Ice::IPEndpointInfo*) const;
+ virtual bool checkOption(const std::string&, const std::string&, const std::string&);
+
+ virtual IceInternal::ConnectorPtr createConnector(const IceInternal::Address&,
+ const IceInternal::NetworkProxyPtr&) const;
+ virtual IceInternal::IPEndpointIPtr createEndpoint(const std::string&, int, const std::string&) const;
+
+private:
+
+ const InstancePtr _instance;
+
+ //
+ // All members are const, because endpoints are immutable.
+ //
+ const Ice::Int _timeout;
+ const bool _compress;
+};
+
+class StreamEndpointFactory : public IceInternal::EndpointFactory
+{
+public:
+
+ StreamEndpointFactory(const InstancePtr&);
+
+ virtual ~StreamEndpointFactory();
+
+ virtual Ice::Short type() const;
+ virtual std::string protocol() const;
+ virtual IceInternal::EndpointIPtr create(std::vector<std::string>&, bool) const;
+ virtual IceInternal::EndpointIPtr read(Ice::InputStream*) const;
+ virtual void destroy();
+
+ virtual IceInternal::EndpointFactoryPtr clone(const IceInternal::ProtocolInstancePtr&) const;
+
+private:
+
+ InstancePtr _instance;
+};
+
+}
+
+#endif
diff --git a/cpp/src/Ice/ios/StreamTransceiver.cpp b/cpp/src/Ice/ios/StreamTransceiver.cpp
new file mode 100644
index 00000000000..90e500eed85
--- /dev/null
+++ b/cpp/src/Ice/ios/StreamTransceiver.cpp
@@ -0,0 +1,793 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include "StreamTransceiver.h"
+#include "StreamEndpointI.h"
+
+#include <Ice/Properties.h>
+#include <Ice/TraceLevels.h>
+#include <Ice/Connection.h>
+#include <Ice/LoggerUtil.h>
+#include <Ice/Buffer.h>
+#include <Ice/Network.h>
+#include <IceSSL/ConnectionInfo.h>
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/Security.h>
+
+using namespace std;
+using namespace Ice;
+using namespace IceInternal;
+
+namespace
+{
+
+void selectorReadCallback(CFReadStreamRef, CFStreamEventType event, void* info)
+{
+ SelectorReadyCallback* callback = reinterpret_cast<SelectorReadyCallback*>(info);
+ switch(event)
+ {
+ case kCFStreamEventOpenCompleted:
+ callback->readyCallback(static_cast<SocketOperation>(SocketOperationConnect | SocketOperationRead));
+ break;
+ case kCFStreamEventHasBytesAvailable:
+ callback->readyCallback(SocketOperationRead);
+ break;
+ default:
+ callback->readyCallback(SocketOperationRead, -1); // Error
+ break;
+ }
+}
+
+void selectorWriteCallback(CFWriteStreamRef, CFStreamEventType event, void* info)
+{
+ SelectorReadyCallback* callback = reinterpret_cast<SelectorReadyCallback*>(info);
+ switch(event)
+ {
+ case kCFStreamEventOpenCompleted:
+ callback->readyCallback(static_cast<SocketOperation>(SocketOperationConnect | SocketOperationWrite));
+ break;
+ case kCFStreamEventCanAcceptBytes:
+ callback->readyCallback(SocketOperationWrite);
+ break;
+ default:
+ callback->readyCallback(SocketOperationWrite, -1); // Error
+ break;
+ }
+}
+
+}
+
+static inline string
+fromCFString(CFStringRef ref)
+{
+ const char* s = CFStringGetCStringPtr(ref, kCFStringEncodingUTF8);
+ if(s)
+ {
+ return string(s);
+ }
+
+ // Not great, but is good enough for this purpose.
+ char buf[1024];
+ CFStringGetCString(ref, buf, sizeof(buf), kCFStringEncodingUTF8);
+ return string(buf);
+}
+
+IceInternal::NativeInfoPtr
+IceObjC::StreamTransceiver::getNativeInfo()
+{
+ return this;
+}
+
+void
+IceObjC::StreamTransceiver::initStreams(SelectorReadyCallback* callback)
+{
+ CFOptionFlags events;
+ CFStreamClientContext ctx = { 0, callback, 0, 0, 0 };
+ events = kCFStreamEventOpenCompleted | kCFStreamEventCanAcceptBytes | kCFStreamEventErrorOccurred |
+ kCFStreamEventEndEncountered;
+ CFWriteStreamSetClient(_writeStream, events, selectorWriteCallback, &ctx);
+
+ events = kCFStreamEventOpenCompleted | kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred |
+ kCFStreamEventEndEncountered;
+ CFReadStreamSetClient(_readStream, events, selectorReadCallback, &ctx);
+}
+
+SocketOperation
+IceObjC::StreamTransceiver::registerWithRunLoop(SocketOperation op)
+{
+ IceUtil::Mutex::Lock sync(_mutex);
+ SocketOperation readyOp = SocketOperationNone;
+ if(op & SocketOperationConnect)
+ {
+ if(CFWriteStreamGetStatus(_writeStream) != kCFStreamStatusNotOpen ||
+ CFReadStreamGetStatus(_readStream) != kCFStreamStatusNotOpen)
+ {
+ return SocketOperationConnect;
+ }
+
+ _opening = true;
+
+ CFWriteStreamScheduleWithRunLoop(_writeStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+ CFReadStreamScheduleWithRunLoop(_readStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+
+ _writeStreamRegistered = true; // Note: this must be set after the schedule call
+ _readStreamRegistered = true; // Note: this must be set after the schedule call
+
+ CFReadStreamOpen(_readStream);
+ CFWriteStreamOpen(_writeStream);
+ }
+ else
+ {
+ if(op & SocketOperationWrite)
+ {
+ if(CFWriteStreamCanAcceptBytes(_writeStream))
+ {
+ readyOp = static_cast<SocketOperation>(readyOp | SocketOperationWrite);
+ }
+ else if(!_writeStreamRegistered)
+ {
+ CFWriteStreamScheduleWithRunLoop(_writeStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+ _writeStreamRegistered = true; // Note: this must be set after the schedule call
+ if(CFWriteStreamCanAcceptBytes(_writeStream))
+ {
+ readyOp = static_cast<SocketOperation>(readyOp | SocketOperationWrite);
+ }
+ }
+ }
+
+ if(op & SocketOperationRead)
+ {
+ if(CFReadStreamHasBytesAvailable(_readStream))
+ {
+ readyOp = static_cast<SocketOperation>(readyOp | SocketOperationRead);
+ }
+ else if(!_readStreamRegistered)
+ {
+ CFReadStreamScheduleWithRunLoop(_readStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+ _readStreamRegistered = true; // Note: this must be set after the schedule call
+ if(CFReadStreamHasBytesAvailable(_readStream))
+ {
+ readyOp = static_cast<SocketOperation>(readyOp | SocketOperationRead);
+ }
+ }
+ }
+ }
+ return readyOp;
+}
+
+SocketOperation
+IceObjC::StreamTransceiver::unregisterFromRunLoop(SocketOperation op, bool error)
+{
+ IceUtil::Mutex::Lock sync(_mutex);
+ _error |= error;
+
+ if(_opening)
+ {
+ // Wait for the stream to be ready for write
+ if(op == SocketOperationWrite)
+ {
+ _writeStreamRegistered = false;
+ }
+
+ //
+ // We don't wait for the stream to be ready for read (even if
+ // it's a client connection) because there's no guarantees that
+ // the server might actually send data right away. If we use
+ // the WebSocket transport, the server actually waits for the
+ // client to write the HTTP upgrade request.
+ //
+ //if(op & SocketOperationRead && (_fd != INVALID_SOCKET || !(op & SocketOperationConnect)))
+ if(op == (SocketOperationRead | SocketOperationConnect))
+ {
+ _readStreamRegistered = false;
+ }
+
+ if(error || (!_readStreamRegistered && !_writeStreamRegistered))
+ {
+ CFWriteStreamUnscheduleFromRunLoop(_writeStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+ CFReadStreamUnscheduleFromRunLoop(_readStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+ _opening = false;
+ return SocketOperationConnect;
+ }
+ else
+ {
+ return SocketOperationNone;
+ }
+ }
+ else
+ {
+ if(op & SocketOperationWrite && _writeStreamRegistered)
+ {
+ CFWriteStreamUnscheduleFromRunLoop(_writeStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+ _writeStreamRegistered = false;
+ }
+
+ if(op & SocketOperationRead && _readStreamRegistered)
+ {
+ CFReadStreamUnscheduleFromRunLoop(_readStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+ _readStreamRegistered = false;
+ }
+ }
+ return op;
+}
+
+void
+IceObjC::StreamTransceiver::closeStreams()
+{
+ CFReadStreamSetClient(_readStream, kCFStreamEventNone, 0, 0);
+ CFWriteStreamSetClient(_writeStream, kCFStreamEventNone, 0, 0);
+
+ CFReadStreamClose(_readStream);
+ CFWriteStreamClose(_writeStream);
+}
+
+SocketOperation
+IceObjC::StreamTransceiver::initialize(Buffer& readBuffer, Buffer& writeBuffer)
+{
+ IceUtil::Mutex::Lock sync(_mutex);
+ if(_state == StateNeedConnect)
+ {
+ _state = StateConnectPending;
+ return SocketOperationConnect;
+ }
+
+ if(_state <= StateConnectPending)
+ {
+ if(_error)
+ {
+ CFErrorRef err = NULL;
+ if(CFWriteStreamGetStatus(_writeStream) == kCFStreamStatusError)
+ {
+ err = CFWriteStreamCopyError(_writeStream);
+ }
+ else if(CFReadStreamGetStatus(_readStream) == kCFStreamStatusError)
+ {
+ err = CFReadStreamCopyError(_readStream);
+ }
+ checkError(err, __FILE__, __LINE__);
+ }
+
+ _state = StateConnected;
+
+ if(_fd == INVALID_SOCKET)
+ {
+ if(!CFReadStreamSetProperty(_readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse) ||
+ !CFWriteStreamSetProperty(_writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse))
+ {
+ throw Ice::SocketException(__FILE__, __LINE__, 0);
+ }
+
+ CFDataRef d = (CFDataRef)CFReadStreamCopyProperty(_readStream, kCFStreamPropertySocketNativeHandle);
+ CFDataGetBytes(d, CFRangeMake(0, sizeof(SOCKET)), reinterpret_cast<UInt8*>(&_fd));
+ CFRelease(d);
+ }
+
+ ostringstream s;
+ Address localAddr;
+ fdToLocalAddress(_fd, localAddr);
+ s << "local address = " << addrToString(localAddr);
+ string proxyHost = _instance->proxyHost();
+ if(!proxyHost.empty())
+ {
+ s << "\nSOCKS proxy address = " << proxyHost << ":" << _instance->proxyPort();
+ }
+ Address remoteAddr;
+ bool peerConnected = fdToRemoteAddress(_fd, remoteAddr);
+ if(peerConnected)
+ {
+ s << "\nremote address = " << addrToString(remoteAddr);
+ }
+ else
+ {
+ s << "\nremote address = " << _host << ":" << _port;
+ }
+ _desc = s.str();
+
+ setBlock(_fd, false);
+ setTcpBufSize(_fd, _instance);
+
+ //
+ // Limit the size of packets passed to SSLWrite/SSLRead to avoid
+ // blocking and holding too much memory.
+ //
+ _maxSendPacketSize = std::max(512, getSendBufferSize(_fd));
+ _maxRecvPacketSize = std::max(512, getRecvBufferSize(_fd));
+ }
+ assert(_state == StateConnected);
+ return SocketOperationNone;
+}
+
+SocketOperation
+#ifdef ICE_CPP11_MAPPING
+IceObjC::StreamTransceiver::closing(bool initiator, exception_ptr)
+#else
+IceObjC::StreamTransceiver::closing(bool initiator, const Ice::LocalException&)
+#endif
+{
+ // If we are initiating the connection closure, wait for the peer
+ // to close the TCP/IP connection. Otherwise, close immediately.
+ return initiator ? SocketOperationRead : SocketOperationNone;
+}
+
+void
+IceObjC::StreamTransceiver::close()
+{
+ if(_fd != INVALID_SOCKET)
+ {
+ try
+ {
+ closeSocket(_fd);
+ _fd = INVALID_SOCKET;
+ }
+ catch(const SocketException&)
+ {
+ _fd = INVALID_SOCKET;
+ throw;
+ }
+ }
+}
+
+SocketOperation
+IceObjC::StreamTransceiver::write(Buffer& buf)
+{
+ IceUtil::Mutex::Lock sync(_mutex);
+ if(_error)
+ {
+ assert(CFWriteStreamGetStatus(_writeStream) == kCFStreamStatusError);
+ checkError(CFWriteStreamCopyError(_writeStream), __FILE__, __LINE__);
+ }
+
+ // Its impossible for the packetSize to be more than an Int.
+ size_t packetSize = std::min(static_cast<size_t>(buf.b.end() - buf.i), _maxSendPacketSize);
+ while(buf.i != buf.b.end())
+ {
+ if(!CFWriteStreamCanAcceptBytes(_writeStream))
+ {
+ return SocketOperationWrite;
+ }
+
+ if(_checkCertificates)
+ {
+ _checkCertificates = false;
+ checkCertificates();
+ }
+
+ assert(_fd != INVALID_SOCKET);
+ CFIndex ret = CFWriteStreamWrite(_writeStream, reinterpret_cast<const UInt8*>(&*buf.i), packetSize);
+
+ if(ret == SOCKET_ERROR)
+ {
+ if(CFWriteStreamGetStatus(_writeStream) == kCFStreamStatusAtEnd)
+ {
+ ConnectionLostException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+
+ assert(CFWriteStreamGetStatus(_writeStream) == kCFStreamStatusError);
+ checkError(CFWriteStreamCopyError(_writeStream), __FILE__, __LINE__);
+ if(noBuffers() && packetSize > 1024)
+ {
+ packetSize /= 2;
+ }
+ continue;
+ }
+
+ buf.i += ret;
+
+ if(packetSize > buf.b.end() - buf.i)
+ {
+ packetSize = static_cast<int>(buf.b.end() - buf.i);
+ }
+ }
+ return SocketOperationNone;
+}
+
+SocketOperation
+IceObjC::StreamTransceiver::read(Buffer& buf)
+{
+ IceUtil::Mutex::Lock sync(_mutex);
+ if(_error)
+ {
+ assert(CFReadStreamGetStatus(_readStream) == kCFStreamStatusError);
+ checkError(CFReadStreamCopyError(_readStream), __FILE__, __LINE__);
+ }
+
+ // Its impossible for the packetSize to be more than an Int.
+ size_t packetSize = std::min(static_cast<size_t>(buf.b.end() - buf.i), _maxRecvPacketSize);
+ while(buf.i != buf.b.end())
+ {
+ if(!CFReadStreamHasBytesAvailable(_readStream))
+ {
+ return SocketOperationRead;
+ }
+
+ if(_checkCertificates)
+ {
+ _checkCertificates = false;
+ checkCertificates();
+ }
+
+ assert(_fd != INVALID_SOCKET);
+ CFIndex ret = CFReadStreamRead(_readStream, reinterpret_cast<UInt8*>(&*buf.i), packetSize);
+
+ if(ret == 0)
+ {
+ ConnectionLostException ex(__FILE__, __LINE__);
+ ex.error = 0;
+ throw ex;
+ }
+
+ if(ret == SOCKET_ERROR)
+ {
+ if(CFReadStreamGetStatus(_readStream) == kCFStreamStatusAtEnd)
+ {
+ ConnectionLostException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+
+ assert(CFReadStreamGetStatus(_readStream) == kCFStreamStatusError);
+ checkError(CFReadStreamCopyError(_readStream), __FILE__, __LINE__);
+ if(noBuffers() && packetSize > 1024)
+ {
+ packetSize /= 2;
+ }
+ continue;
+ }
+
+ buf.i += ret;
+
+ if(packetSize > buf.b.end() - buf.i)
+ {
+ packetSize = static_cast<int>(buf.b.end() - buf.i);
+ }
+ }
+
+ return SocketOperationNone;
+}
+
+string
+IceObjC::StreamTransceiver::protocol() const
+{
+ return _instance->protocol();
+}
+
+string
+IceObjC::StreamTransceiver::toString() const
+{
+ return _desc;
+}
+
+string
+IceObjC::StreamTransceiver::toDetailedString() const
+{
+ return _desc;
+}
+
+Ice::ConnectionInfoPtr
+IceObjC::StreamTransceiver::getInfo() const
+{
+ if(_instance->secure())
+ {
+ IceSSL::ConnectionInfoPtr info = ICE_MAKE_SHARED(IceSSL::ConnectionInfo);
+ fillConnectionInfo(info);
+ info->verified = _state == StateConnected;
+ return info;
+ }
+ else
+ {
+ Ice::TCPConnectionInfoPtr info = ICE_MAKE_SHARED(Ice::TCPConnectionInfo);
+ fillConnectionInfo(info);
+ return info;
+ }
+}
+
+Ice::ConnectionInfoPtr
+IceObjC::StreamTransceiver::getWSInfo(const Ice::HeaderDict& headers) const
+{
+ if(_instance->secure())
+ {
+ IceSSL::WSSConnectionInfoPtr info = ICE_MAKE_SHARED(IceSSL::WSSConnectionInfo);
+ fillConnectionInfo(info);
+ info->verified = _state == StateConnected;
+ info->headers = headers;
+ return info;
+ }
+ else
+ {
+ Ice::WSConnectionInfoPtr info = ICE_MAKE_SHARED(Ice::WSConnectionInfo);
+ fillConnectionInfo(info);
+ info->headers = headers;
+ return info;
+ }
+}
+
+void
+IceObjC::StreamTransceiver::checkSendSize(const Buffer& buf)
+{
+}
+
+void
+IceObjC::StreamTransceiver::setBufferSize(int rcvSize, int sndSize)
+{
+ setTcpBufSize(_fd, rcvSize, sndSize, _instance);
+}
+
+IceObjC::StreamTransceiver::StreamTransceiver(const InstancePtr& instance,
+ CFReadStreamRef readStream,
+ CFWriteStreamRef writeStream,
+ const string& host,
+ Ice::Int port) :
+ StreamNativeInfo(INVALID_SOCKET),
+ _instance(instance),
+ _host(host),
+ _port(port),
+ _readStream(readStream),
+ _writeStream(writeStream),
+ _readStreamRegistered(false),
+ _writeStreamRegistered(false),
+ _opening(false),
+ _checkCertificates(instance->secure()),
+ _error(false),
+ _state(StateNeedConnect)
+{
+ ostringstream s;
+ s << "local address = <not available>";
+ string proxyHost = instance->proxyHost();
+ if(!proxyHost.empty())
+ {
+ s << "\nSOCKS proxy address = " << proxyHost << ":" << instance->proxyPort();
+ }
+ s << "\nremote address = " << host << ":" << port;
+ _desc = s.str();
+}
+
+IceObjC::StreamTransceiver::StreamTransceiver(const InstancePtr& instance,
+ CFReadStreamRef readStream,
+ CFWriteStreamRef writeStream,
+ SOCKET fd) :
+ StreamNativeInfo(fd),
+ _instance(instance),
+ _port(0),
+ _readStream(readStream),
+ _writeStream(writeStream),
+ _readStreamRegistered(false),
+ _writeStreamRegistered(false),
+ _opening(false),
+ _checkCertificates(false),
+ _error(false),
+ _state(StateNeedConnect),
+ _desc(fdToString(fd))
+{
+}
+
+IceObjC::StreamTransceiver::~StreamTransceiver()
+{
+ assert(_fd == INVALID_SOCKET);
+ CFRelease(_readStream);
+ CFRelease(_writeStream);
+}
+
+void
+IceObjC::StreamTransceiver::checkCertificates()
+{
+ SecTrustRef trust = (SecTrustRef)CFWriteStreamCopyProperty(_writeStream, kCFStreamPropertySSLPeerTrust);
+ if(!trust)
+ {
+ throw Ice::SecurityException(__FILE__, __LINE__, "unable to obtain trust object");
+ }
+
+ try
+ {
+ SecPolicyRef policy = 0;
+ if(_host.empty() || _instance->properties()->getPropertyAsIntWithDefault("IceSSL.CheckCertName", 1) == 0)
+ {
+ policy = SecPolicyCreateBasicX509();
+ }
+ else
+ {
+ CFStringRef h = CFStringCreateWithCString(NULL, _host.c_str(), kCFStringEncodingUTF8);
+ policy = SecPolicyCreateSSL(false, h);
+ CFRelease(h);
+ }
+
+ OSStatus err = SecTrustSetPolicies(trust, policy);
+ CFRelease(policy);
+ if(err != noErr)
+ {
+ ostringstream os;
+ os << "unable to set trust object policy (error = " << err << ")";
+ throw Ice::SecurityException(__FILE__, __LINE__, os.str());
+ }
+
+ //
+ // If IceSSL.CertAuthFile is set, we use the certificate authorities from this file
+ // instead of the ones from the keychain.
+ //
+ if((err = SecTrustSetAnchorCertificates(trust, _instance->certificateAuthorities())) != noErr)
+ {
+ ostringstream os;
+ os << "couldn't set root CA certificates with trust object (error = " << err << ")";
+ throw Ice::SecurityException(__FILE__, __LINE__, os.str());
+ }
+
+ SecTrustResultType result = kSecTrustResultInvalid;
+ if((err = SecTrustEvaluate(trust, &result)) != noErr)
+ {
+ ostringstream os;
+ os << "unable to evaluate the peer certificate trust (error = " << err << ")";
+ throw Ice::SecurityException(__FILE__, __LINE__, os.str());
+ }
+
+ //
+ // The kSecTrustResultUnspecified result indicates that the user didn't set any trust
+ // settings for the root CA. This is expected if the root CA is provided by the user
+ // with IceSSL.CertAuthFile or if the user didn't explicitly set any trust settings
+ // for the certificate.
+ //
+ if(result != kSecTrustResultProceed && result != kSecTrustResultUnspecified)
+ {
+ ostringstream os;
+ os << "certificate validation failed (result = " << result << ")";
+ throw Ice::SecurityException(__FILE__, __LINE__, os.str());
+ }
+
+ if(_instance->trustOnlyKeyID())
+ {
+ if(SecTrustGetCertificateCount(trust) < 0)
+ {
+ throw Ice::SecurityException(__FILE__, __LINE__, "unable to obtain peer certificate");
+ }
+
+ SecCertificateRef cert = SecTrustGetCertificateAtIndex(trust, 0);
+
+ //
+ // To check the subject key ID, we add the peer certificate to the keychain with SetItemAdd,
+ // then we lookup for the cert using the kSecAttrSubjectKeyID. Then we remove the cert from
+ // the keychain. NOTE: according to the Apple documentation, it should in theory be possible
+ // to not add/remove the item to the keychain by specifying the kSecMatchItemList key (or
+ // kSecUseItemList?) when calling SecItemCopyMatching. Unfortunately this doesn't appear to
+ // work. Similarly, it should be possible to get back the attributes of the certificate
+ // once it added by setting kSecReturnAttributes in the add query, again this doesn't seem
+ // to work.
+ //
+ CFMutableDictionaryRef query;
+ query = CFDictionaryCreateMutable(0, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+ CFDictionarySetValue(query, kSecClass, kSecClassCertificate);
+ CFDictionarySetValue(query, kSecValueRef, cert);
+ err = SecItemAdd(query, 0);
+ if(err != noErr && err != errSecDuplicateItem)
+ {
+ CFRelease(query);
+ ostringstream os;
+ os << "unable to add peer certificate to keychain (error = " << err << ")";
+ throw Ice::SecurityException(__FILE__, __LINE__, os.str());
+ }
+ CFRelease(query);
+
+ query = CFDictionaryCreateMutable(0, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+ CFDictionarySetValue(query, kSecClass, kSecClassCertificate);
+ CFDictionarySetValue(query, kSecValueRef, cert);
+ CFDictionarySetValue(query, kSecAttrSubjectKeyID, _instance->trustOnlyKeyID());
+ err = SecItemCopyMatching(query, 0);
+ OSStatus foundErr = err;
+ CFRelease(query);
+
+ query = CFDictionaryCreateMutable(0, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+ CFDictionarySetValue(query, kSecClass, kSecClassCertificate);
+ CFDictionarySetValue(query, kSecValueRef, cert);
+ err = SecItemDelete(query);
+ if(err != noErr)
+ {
+ CFRelease(query);
+ ostringstream os;
+ os << "unable to remove peer certificate from keychain (error = " << err << ")";
+ throw Ice::SecurityException(__FILE__, __LINE__, os.str());
+ }
+ CFRelease(query);
+
+ if(foundErr != noErr)
+ {
+ ostringstream os;
+ os << "the certificate subject key ID doesn't match the `IceSSL.TrustOnly.Client' property ";
+ os << "(error = " << foundErr << ")";
+ throw Ice::SecurityException(__FILE__, __LINE__, os.str());
+ }
+ }
+ CFRelease(trust);
+ }
+ catch(...)
+ {
+ if(trust)
+ {
+ CFRelease(trust);
+ }
+ throw;
+ }
+}
+
+void
+IceObjC::StreamTransceiver::checkError(CFErrorRef err, const char* file, int line)
+{
+ assert(err);
+ CFStringRef domain = CFErrorGetDomain(err);
+ if(CFStringCompare(domain, kCFErrorDomainPOSIX, 0) == kCFCompareEqualTo)
+ {
+ errno = CFErrorGetCode(err);
+ CFRelease(err);
+ if(interrupted() || noBuffers())
+ {
+ return;
+ }
+
+ if(connectionLost())
+ {
+ ConnectionLostException ex(file, line);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ else if(connectionRefused())
+ {
+ ConnectionRefusedException ex(file, line);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ else if(connectFailed())
+ {
+ ConnectFailedException ex(file, line);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ else
+ {
+ SocketException ex(file, line);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ }
+
+ int error = CFErrorGetCode(err);
+ if(error == kCFHostErrorHostNotFound || error == kCFHostErrorUnknown)
+ {
+ int rs = 0;
+ if(error == kCFHostErrorUnknown)
+ {
+ CFDictionaryRef dict = CFErrorCopyUserInfo(err);
+ CFNumberRef d = (CFNumberRef)CFDictionaryGetValue(dict, kCFGetAddrInfoFailureKey);
+ if(d != 0)
+ {
+ CFNumberGetValue(d, kCFNumberSInt32Type, &rs);
+ }
+ CFRelease(dict);
+ }
+
+ CFRelease(err);
+
+ DNSException ex(file, line);
+ ex.error = rs;
+ ex.host = _host;
+ throw ex;
+ }
+
+ CFNetworkException ex(file, line);
+ ex.domain = fromCFString(domain);
+ ex.error = CFErrorGetCode(err);
+ CFRelease(err);
+ throw ex;
+}
+
+void
+IceObjC::StreamTransceiver::fillConnectionInfo(const Ice::IPConnectionInfoPtr& info) const
+{
+ fdToAddressAndPort(_fd, info->localAddress, info->localPort, info->remoteAddress, info->remotePort);
+ info->rcvSize = getRecvBufferSize(_fd);
+ info->sndSize = getSendBufferSize(_fd);
+}
diff --git a/cpp/src/Ice/ios/StreamTransceiver.h b/cpp/src/Ice/ios/StreamTransceiver.h
new file mode 100644
index 00000000000..088001887e2
--- /dev/null
+++ b/cpp/src/Ice/ios/StreamTransceiver.h
@@ -0,0 +1,102 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef ICE_STREAM_TRANSCEIVER_H
+#define ICE_STREAM_TRANSCEIVER_H
+
+#include <Ice/WSTransceiver.h>
+#include <Ice/Network.h>
+#include <Ice/Selector.h>
+
+struct __CFError;
+typedef struct __CFError * CFErrorRef;
+
+struct __CFWriteStream;
+typedef struct __CFWriteStream * CFWriteStreamRef;
+
+struct __CFReadStream;
+typedef struct __CFReadStream * CFReadStreamRef;
+
+namespace IceObjC
+{
+
+class Instance;
+typedef IceUtil::Handle<Instance> InstancePtr;
+
+class StreamTransceiver : public IceInternal::Transceiver, public IceInternal::StreamNativeInfo,
+ public IceInternal::WSTransceiverDelegate
+{
+ enum State
+ {
+ StateNeedConnect,
+ StateConnectPending,
+ StateConnected
+ };
+
+public:
+
+ StreamTransceiver(const InstancePtr&, CFReadStreamRef, CFWriteStreamRef, const std::string&, Ice::Int);
+ StreamTransceiver(const InstancePtr&, CFReadStreamRef, CFWriteStreamRef, SOCKET);
+ virtual ~StreamTransceiver();
+
+ virtual IceInternal::NativeInfoPtr getNativeInfo();
+
+ virtual void initStreams(IceInternal::SelectorReadyCallback*);
+ virtual IceInternal::SocketOperation registerWithRunLoop(IceInternal::SocketOperation);
+ virtual IceInternal::SocketOperation unregisterFromRunLoop(IceInternal::SocketOperation, bool);
+ virtual void closeStreams();
+
+ virtual IceInternal::SocketOperation initialize(IceInternal::Buffer&, IceInternal::Buffer&);
+#ifdef ICE_CPP11_MAPPING
+ virtual IceInternal::SocketOperation closing(bool initiator, std::exception_ptr);
+#else
+ virtual IceInternal::SocketOperation closing(bool, const Ice::LocalException&);
+#endif
+ virtual void close();
+
+ virtual IceInternal::SocketOperation write(IceInternal::Buffer&);
+ virtual IceInternal::SocketOperation read(IceInternal::Buffer&);
+
+ virtual std::string protocol() const;
+ virtual std::string toString() const;
+ virtual std::string toDetailedString() const;
+ virtual Ice::ConnectionInfoPtr getInfo() const;
+ virtual Ice::ConnectionInfoPtr getWSInfo(const Ice::HeaderDict&) const;
+ virtual void checkSendSize(const IceInternal::Buffer&);
+ virtual void setBufferSize(int, int);
+
+private:
+
+ void checkCertificates();
+ void checkError(CFErrorRef, const char*, int);
+ void fillConnectionInfo(const Ice::IPConnectionInfoPtr&) const;
+
+ const InstancePtr _instance;
+ const std::string _host;
+ const Ice::Int _port;
+ CFReadStreamRef _readStream;
+ CFWriteStreamRef _writeStream;
+ bool _readStreamRegistered;
+ bool _writeStreamRegistered;
+ bool _opening;
+ bool _checkCertificates;
+
+ IceUtil::Mutex _mutex;
+ bool _error;
+
+ State _state;
+ std::string _desc;
+
+ size_t _maxSendPacketSize;
+ size_t _maxRecvPacketSize;
+};
+
+}
+
+#endif
diff --git a/cpp/src/Ice/ios/iAPConnector.h b/cpp/src/Ice/ios/iAPConnector.h
new file mode 100644
index 00000000000..42fe9f9029e
--- /dev/null
+++ b/cpp/src/Ice/ios/iAPConnector.h
@@ -0,0 +1,58 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_TOUCH_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef ICE_IAP_CONNECTOR_H
+#define ICE_IAP_CONNECTOR_H
+
+#include <Ice/TransceiverF.h>
+#include <Ice/ProtocolInstanceF.h>
+#include <Ice/TraceLevelsF.h>
+#include <Ice/LoggerF.h>
+#include <Ice/Connector.h>
+
+#import <Foundation/Foundation.h>
+#import <ExternalAccessory/ExternalAccessory.h>
+
+namespace IceObjC
+{
+
+class iAPEndpointI;
+
+class Instance;
+typedef IceUtil::Handle<Instance> InstancePtr;
+
+class iAPConnector : public IceInternal::Connector
+{
+public:
+
+ virtual IceInternal::TransceiverPtr connect();
+
+ virtual Ice::Short type() const;
+ virtual std::string toString() const;
+
+ virtual bool operator==(const IceInternal::Connector&) const;
+ virtual bool operator!=(const IceInternal::Connector&) const;
+ virtual bool operator<(const IceInternal::Connector&) const;
+
+private:
+
+ iAPConnector(const IceInternal::ProtocolInstancePtr&, Ice::Int, const std::string&, NSString*, EAAccessory*);
+ virtual ~iAPConnector();
+ friend class iAPEndpointI;
+
+ const IceInternal::ProtocolInstancePtr _instance;
+ const Ice::Int _timeout;
+ const std::string _connectionId;
+ NSString* _protocol;
+ EAAccessory* _accessory;
+};
+
+}
+
+#endif
diff --git a/cpp/src/Ice/ios/iAPConnector.mm b/cpp/src/Ice/ios/iAPConnector.mm
new file mode 100644
index 00000000000..37b2b7fc2dc
--- /dev/null
+++ b/cpp/src/Ice/ios/iAPConnector.mm
@@ -0,0 +1,153 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_TOUCH_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include "iAPTransceiver.h"
+#include "iAPEndpointI.h"
+#include "iAPConnector.h"
+
+#include <Ice/ProtocolInstance.h>
+#include <Ice/Exception.h>
+
+using namespace std;
+using namespace Ice;
+using namespace IceInternal;
+
+TransceiverPtr
+IceObjC::iAPConnector::connect()
+{
+ EASession* session = [[EASession alloc] initWithAccessory:_accessory forProtocol:_protocol];
+ if(!session)
+ {
+ throw Ice::ConnectFailedException(__FILE__, __LINE__, 0);
+ }
+ return new iAPTransceiver(_instance, session);
+}
+
+Short
+IceObjC::iAPConnector::type() const
+{
+ return _instance->type();
+}
+
+string
+IceObjC::iAPConnector::toString() const
+{
+ ostringstream os;
+ os << [_accessory.name UTF8String];
+ os << " model `" << [_accessory.modelNumber UTF8String] << "'";
+ os << " made by `" << [_accessory.manufacturer UTF8String] << "'";
+ os << " protocol `" << [_protocol UTF8String] << "'";
+ return os.str();
+}
+
+bool
+IceObjC::iAPConnector::operator==(const IceInternal::Connector& r) const
+{
+ const iAPConnector* p = dynamic_cast<const iAPConnector*>(&r);
+ if(!p)
+ {
+ return false;
+ }
+
+ if(_timeout != p->_timeout)
+ {
+ return false;
+ }
+
+ if(_connectionId != p->_connectionId)
+ {
+ return false;
+ }
+
+ if(![_accessory isEqual:p->_accessory])
+ {
+ return false;
+ }
+
+ if(![_protocol isEqual:p->_protocol])
+ {
+ return false;
+ }
+
+ return true;
+}
+
+bool
+IceObjC::iAPConnector::operator!=(const IceInternal::Connector& r) const
+{
+ return !operator==(r);
+}
+
+bool
+IceObjC::iAPConnector::operator<(const IceInternal::Connector& r) const
+{
+ const iAPConnector* p = dynamic_cast<const iAPConnector*>(&r);
+ if(!p)
+ {
+ return type() < r.type();
+ }
+
+ if(_timeout < p->_timeout)
+ {
+ return true;
+ }
+ else if(p->_timeout < _timeout)
+ {
+ return false;
+ }
+
+ if(_connectionId < p->_connectionId)
+ {
+ return true;
+ }
+ else if(p->_connectionId < _connectionId)
+ {
+ return false;
+ }
+
+ if([_accessory hash] < [p->_accessory hash])
+ {
+ return true;
+ }
+ else if([p->_accessory hash] < [_accessory hash])
+ {
+ return false;
+ }
+
+ NSInteger order = [_protocol compare:p->_protocol];
+ if(order == NSOrderedAscending)
+ {
+ return true;
+ }
+ else if(order == NSOrderedDescending)
+ {
+ return false;
+ }
+
+ return false;
+}
+
+IceObjC::iAPConnector::iAPConnector(const ProtocolInstancePtr& instance,
+ Ice::Int timeout,
+ const string& connectionId,
+ NSString* protocol,
+ EAAccessory* accessory) :
+ _instance(instance),
+ _timeout(timeout),
+ _connectionId(connectionId),
+ _protocol([protocol retain]),
+ _accessory([accessory retain])
+{
+}
+
+IceObjC::iAPConnector::~iAPConnector()
+{
+ [_protocol release];
+ [_accessory release];
+}
diff --git a/cpp/src/Ice/ios/iAPEndpointI.h b/cpp/src/Ice/ios/iAPEndpointI.h
new file mode 100644
index 00000000000..242574d0edb
--- /dev/null
+++ b/cpp/src/Ice/ios/iAPEndpointI.h
@@ -0,0 +1,109 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_TOUCH_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef ICE_IAP_ENDPOINT_I_H
+#define ICE_IAP_ENDPOINT_I_H
+
+#include <Ice/ProtocolInstanceF.h>
+#include <Ice/EndpointI.h>
+#include <Ice/EndpointFactory.h>
+
+namespace IceObjC
+{
+
+class iAPEndpointI;
+#ifdef ICE_CPP11_MAPPING // C++11 mapping
+typedef ::std::shared_ptr<iAPEndpointI> iAPEndpointIPtr;
+#else
+typedef IceUtil::Handle<iAPEndpointI> iAPEndpointIPtr;
+#endif
+
+class iAPEndpointI : public IceInternal::EndpointI, public Ice::EnableSharedFromThis<iAPEndpointI>
+{
+public:
+
+ iAPEndpointI(const IceInternal::ProtocolInstancePtr&, const std::string&, const std::string&, const std::string&,
+ const std::string&, Ice::Int, const std::string&, bool);
+ iAPEndpointI(const IceInternal::ProtocolInstancePtr&);
+ iAPEndpointI(const IceInternal::ProtocolInstancePtr&, Ice::InputStream*);
+
+ virtual void streamWrite(Ice::OutputStream*) const;
+
+ virtual Ice::EndpointInfoPtr getInfo() const;
+ virtual Ice::Short type() const;
+ virtual const std::string& protocol() const;
+ virtual bool datagram() const;
+ virtual bool secure() const;
+
+ virtual Ice::Int timeout() const;
+ virtual IceInternal::EndpointIPtr timeout(Ice::Int) const;
+ virtual const std::string& connectionId() const;
+ virtual IceInternal::EndpointIPtr connectionId(const std::string&) const;
+ virtual bool compress() const;
+ virtual IceInternal::EndpointIPtr compress(bool) const;
+
+ virtual IceInternal::TransceiverPtr transceiver() const;
+ virtual void connectors_async(Ice::EndpointSelectionType, const IceInternal::EndpointI_connectorsPtr&) const;
+ virtual IceInternal::AcceptorPtr acceptor(const std::string&) const;
+
+ virtual std::vector<IceInternal::EndpointIPtr> expand() const;
+ virtual bool equivalent(const IceInternal::EndpointIPtr&) const;
+
+#ifdef ICE_CPP11_MAPPING
+ virtual bool operator==(const Ice::Endpoint&) const;
+ virtual bool operator<(const Ice::Endpoint&) const;
+#else
+ virtual bool operator==(const Ice::LocalObject&) const;
+ virtual bool operator<(const Ice::LocalObject&) const;
+#endif
+
+ virtual std::string options() const;
+ virtual ::Ice::Int hash() const;
+
+private:
+
+ virtual bool checkOption(const std::string&, const std::string&, const std::string&);
+
+ //
+ // All members are const, because endpoints are immutable.
+ //
+ const IceInternal::ProtocolInstancePtr _instance;
+ const std::string _manufacturer;
+ const std::string _modelNumber;
+ const std::string _name;
+ const std::string _protocol;
+ const Ice::Int _timeout;
+ const std::string _connectionId;
+ const bool _compress;
+};
+
+class iAPEndpointFactory : public IceInternal::EndpointFactory
+{
+public:
+
+ iAPEndpointFactory(const IceInternal::ProtocolInstancePtr&);
+
+ virtual ~iAPEndpointFactory();
+
+ virtual Ice::Short type() const;
+ virtual std::string protocol() const;
+ virtual IceInternal::EndpointIPtr create(std::vector<std::string>&, bool) const;
+ virtual IceInternal::EndpointIPtr read(Ice::InputStream*) const;
+ virtual void destroy();
+
+ virtual IceInternal::EndpointFactoryPtr clone(const IceInternal::ProtocolInstancePtr&) const;
+
+private:
+
+ IceInternal::ProtocolInstancePtr _instance;
+};
+
+}
+
+#endif
diff --git a/cpp/src/Ice/ios/iAPEndpointI.mm b/cpp/src/Ice/ios/iAPEndpointI.mm
new file mode 100644
index 00000000000..c6bc8dc66fb
--- /dev/null
+++ b/cpp/src/Ice/ios/iAPEndpointI.mm
@@ -0,0 +1,640 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include "iAPEndpointI.h"
+#include "iAPConnector.h"
+
+#include <Ice/Network.h>
+#include <Ice/InputStream.h>
+#include <Ice/OutputStream.h>
+#include <Ice/LocalException.h>
+#include <Ice/ProtocolInstance.h>
+#include <Ice/DefaultsAndOverrides.h>
+#include <Ice/Initialize.h>
+#include <Ice/EndpointFactoryManager.h>
+#include <Ice/Properties.h>
+#include <Ice/HashUtil.h>
+
+#include <CoreFoundation/CoreFoundation.h>
+
+#include <fstream>
+
+using namespace std;
+using namespace Ice;
+using namespace IceInternal;
+
+extern "C"
+{
+
+Plugin*
+createIceIAP(const CommunicatorPtr& com, const string&, const StringSeq&)
+{
+ ProtocolInstancePtr instance = new ProtocolInstance(com, iAPEndpointType, "iap", false);
+ return new EndpointFactoryPlugin(com, new IceObjC::iAPEndpointFactory(instance));
+}
+
+}
+
+IceObjC::iAPEndpointI::iAPEndpointI(const ProtocolInstancePtr& instance, const string& m,
+ const string& o, const string& n, const string& p, Int ti,
+ const string& conId, bool co) :
+ _instance(instance),
+ _manufacturer(m),
+ _modelNumber(o),
+ _name(n),
+ _protocol(p),
+ _timeout(ti),
+ _connectionId(conId),
+ _compress(co)
+{
+}
+
+IceObjC::iAPEndpointI::iAPEndpointI(const ProtocolInstancePtr& instance) :
+ _instance(instance),
+ _timeout(-1),
+ _compress(false)
+{
+}
+
+IceObjC::iAPEndpointI::iAPEndpointI(const ProtocolInstancePtr& instance, InputStream* s) :
+ _instance(instance),
+ _timeout(-1),
+ _compress(false)
+{
+ s->read(const_cast<string&>(_manufacturer), false);
+ s->read(const_cast<string&>(_modelNumber), false);
+ s->read(const_cast<string&>(_name), false);
+ s->read(const_cast<Int&>(_timeout));
+ s->read(const_cast<bool&>(_compress));
+}
+
+void
+IceObjC::iAPEndpointI::streamWrite(OutputStream* s) const
+{
+ s->startEncapsulation();
+ s->write(_manufacturer, false);
+ s->write(_modelNumber, false);
+ s->write(_name, false);
+ s->write(_timeout);
+ s->write(_compress);
+ s->endEncapsulation();
+}
+
+EndpointInfoPtr
+IceObjC::iAPEndpointI::getInfo() const
+{
+ return 0;
+}
+
+Short
+IceObjC::iAPEndpointI::type() const
+{
+ return _instance->type();
+}
+
+const string&
+IceObjC::iAPEndpointI::protocol() const
+{
+ return _instance->protocol();
+}
+
+bool
+IceObjC::iAPEndpointI::datagram() const
+{
+ return false;
+}
+
+bool
+IceObjC::iAPEndpointI::secure() const
+{
+ return _instance->secure();
+}
+
+Int
+IceObjC::iAPEndpointI::timeout() const
+{
+ return _timeout;
+}
+
+EndpointIPtr
+IceObjC::iAPEndpointI::timeout(Int t) const
+{
+ if(t == _timeout)
+ {
+ return shared_from_this();
+ }
+ else
+ {
+ return ICE_MAKE_SHARED(iAPEndpointI, _instance, _manufacturer, _modelNumber, _name, _protocol, t, _connectionId, _compress);
+ }
+}
+
+const string&
+IceObjC::iAPEndpointI::connectionId() const
+{
+ return _connectionId;
+}
+
+EndpointIPtr
+IceObjC::iAPEndpointI::connectionId(const string& cId) const
+{
+ if(cId == _connectionId)
+ {
+ return shared_from_this();
+ }
+ else
+ {
+ return ICE_MAKE_SHARED(iAPEndpointI, _instance, _manufacturer, _modelNumber, _name, _protocol, _timeout, cId, _compress);
+ }
+}
+
+bool
+IceObjC::iAPEndpointI::compress() const
+{
+ return _compress;
+}
+
+EndpointIPtr
+IceObjC::iAPEndpointI::compress(bool c) const
+{
+ if(c == _compress)
+ {
+ return shared_from_this();
+ }
+ else
+ {
+ return ICE_MAKE_SHARED(iAPEndpointI, _instance, _manufacturer, _modelNumber, _name, _protocol, _timeout, _connectionId, c);
+ }
+}
+
+TransceiverPtr
+IceObjC::iAPEndpointI::transceiver() const
+{
+ return 0;
+}
+
+void
+IceObjC::iAPEndpointI::connectors_async(Ice::EndpointSelectionType selType,
+ const EndpointI_connectorsPtr& callback) const
+{
+ try
+ {
+ vector<ConnectorPtr> c;
+
+ EAAccessoryManager* manager = [EAAccessoryManager sharedAccessoryManager];
+ if(manager == nil)
+ {
+ throw Ice::ConnectFailedException(__FILE__, __LINE__, 0);
+ }
+
+ NSString* protocol = _protocol.empty() ? @"com.zeroc.ice" : [[NSString alloc] initWithUTF8String:_protocol.c_str()];
+ NSArray* array = [manager connectedAccessories];
+ NSEnumerator* enumerator = [array objectEnumerator];
+ EAAccessory* accessory = nil;
+ int lastError = 0;
+ while((accessory = [enumerator nextObject]))
+ {
+ if(!accessory.connected)
+ {
+ lastError = 1;
+ continue;
+ }
+
+ if(!_manufacturer.empty() && _manufacturer != [accessory.manufacturer UTF8String])
+ {
+ lastError = 2;
+ continue;
+ }
+ if(!_modelNumber.empty() && _modelNumber != [accessory.modelNumber UTF8String])
+ {
+ lastError = 3;
+ continue;
+ }
+ if(!_name.empty() && _name != [accessory.name UTF8String])
+ {
+ lastError = 4;
+ continue;
+ }
+
+ if(![accessory.protocolStrings containsObject:protocol])
+ {
+ lastError = 5;
+ continue;
+ }
+
+ c.push_back(new iAPConnector(_instance, _timeout, _connectionId, protocol, accessory));
+ }
+ [protocol release];
+ if(c.empty())
+ {
+ throw Ice::ConnectFailedException(__FILE__, __LINE__, 0);
+ }
+ callback->connectors(c);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ callback->exception(ex);
+ }
+}
+
+AcceptorPtr
+IceObjC::iAPEndpointI::acceptor(const string&) const
+{
+ assert(false);
+ return 0;
+}
+
+vector<EndpointIPtr>
+IceObjC::iAPEndpointI::expand() const
+{
+ vector<EndpointIPtr> endps;
+ endps.push_back(shared_from_this());
+ return endps;
+}
+
+bool
+IceObjC::iAPEndpointI::equivalent(const EndpointIPtr& endpoint) const
+{
+ const iAPEndpointI* endpointI = dynamic_cast<const iAPEndpointI*>(endpoint.get());
+ if(!endpointI)
+ {
+ return false;
+ }
+ return endpointI->_manufacturer == _manufacturer &&
+ endpointI->_modelNumber == _modelNumber &&
+ endpointI->_name == _name;
+}
+
+bool
+#ifdef ICE_CPP11_MAPPING
+IceObjC::iAPEndpointI::operator==(const Ice::Endpoint& r) const
+#else
+IceObjC::iAPEndpointI::operator==(const Ice::LocalObject& r) const
+#endif
+{
+ const iAPEndpointI* p = dynamic_cast<const iAPEndpointI*>(&r);
+ if(!p)
+ {
+ return false;
+ }
+
+ if(this == p)
+ {
+ return true;
+ }
+
+ if(_manufacturer != p->_manufacturer)
+ {
+ return false;
+ }
+
+ if(_modelNumber != p->_modelNumber)
+ {
+ return false;
+ }
+
+ if(_name != p->_name)
+ {
+ return false;
+ }
+
+ if(_timeout != p->_timeout)
+ {
+ return false;
+ }
+
+ if(_connectionId != p->_connectionId)
+ {
+ return false;
+ }
+
+ if(_compress != p->_compress)
+ {
+ return false;
+ }
+
+ return true;
+}
+
+bool
+#ifdef ICE_CPP11_MAPPING
+IceObjC::iAPEndpointI::operator<(const Ice::Endpoint& r) const
+#else
+IceObjC::iAPEndpointI::operator<(const Ice::LocalObject& r) const
+#endif
+{
+ const iAPEndpointI* p = dynamic_cast<const iAPEndpointI*>(&r);
+ if(!p)
+ {
+ const IceInternal::EndpointI* e = dynamic_cast<const IceInternal::EndpointI*>(&r);
+ if(!e)
+ {
+ return false;
+ }
+ return type() < e->type();
+ }
+
+ if(this == p)
+ {
+ return false;
+ }
+
+ if(_manufacturer < p->_manufacturer)
+ {
+ return true;
+ }
+ else if(p->_manufacturer < _manufacturer)
+ {
+ return false;
+ }
+
+ if(_modelNumber < p->_modelNumber)
+ {
+ return true;
+ }
+ else if(p->_modelNumber < _modelNumber)
+ {
+ return false;
+ }
+
+ if(_name < p->_name)
+ {
+ return true;
+ }
+ else if(p->_name < _name)
+ {
+ return false;
+ }
+
+ if(_timeout < p->_timeout)
+ {
+ return true;
+ }
+ else if(p->_timeout < _timeout)
+ {
+ return false;
+ }
+
+ if(_connectionId < p->_connectionId)
+ {
+ return true;
+ }
+ else if(p->_connectionId < _connectionId)
+ {
+ return false;
+ }
+
+ if(!_compress && p->_compress)
+ {
+ return true;
+ }
+ else if(p->_compress < _compress)
+ {
+ return false;
+ }
+
+ return false;
+}
+
+string
+IceObjC::iAPEndpointI::options() const
+{
+ //
+ // WARNING: Certain features, such as proxy validation in Glacier2,
+ // depend on the format of proxy strings. Changes to toString() and
+ // methods called to generate parts of the reference string could break
+ // these features. Please review for all features that depend on the
+ // format of proxyToString() before changing this and related code.
+ //
+ ostringstream s;
+ if(!_manufacturer.empty())
+ {
+ s << " -m ";
+ bool addQuote = _manufacturer.find(':') != string::npos;
+ if(addQuote)
+ {
+ s << "\"";
+ }
+ s << _manufacturer;
+ if(addQuote)
+ {
+ s << "\"";
+ }
+ }
+
+ if(!_modelNumber.empty())
+ {
+ s << " -o ";
+ bool addQuote = _modelNumber.find(':') != string::npos;
+ if(addQuote)
+ {
+ s << "\"";
+ }
+ s << _modelNumber;
+ if(addQuote)
+ {
+ s << "\"";
+ }
+ }
+
+ if(!_name.empty())
+ {
+ s << " -n ";
+ bool addQuote = _name.find(':') != string::npos;
+ if(addQuote)
+ {
+ s << "\"";
+ }
+ s << _name;
+ if(addQuote)
+ {
+ s << "\"";
+ }
+ }
+
+ if(!_protocol.empty())
+ {
+ s << " -p ";
+ bool addQuote = _protocol.find(':') != string::npos;
+ if(addQuote)
+ {
+ s << "\"";
+ }
+ s << _protocol;
+ if(addQuote)
+ {
+ s << "\"";
+ }
+ }
+
+ if(_timeout != -1)
+ {
+ s << " -t " << _timeout;
+ }
+ if(_compress)
+ {
+ s << " -z";
+ }
+ return s.str();
+}
+
+Ice::Int
+IceObjC::iAPEndpointI::hash() const
+{
+ Ice::Int h = 5381;
+ hashAdd(h, _manufacturer);
+ hashAdd(h, _modelNumber);
+ hashAdd(h, _name);
+ hashAdd(h, _timeout);
+ hashAdd(h, _connectionId);
+ return h;
+}
+
+bool
+IceObjC::iAPEndpointI::checkOption(const string& option, const string& argument, const string& endpoint)
+{
+ switch(option[1])
+ {
+ case 'm':
+ {
+ if(argument.empty())
+ {
+ EndpointParseException ex(__FILE__, __LINE__);
+ ex.str = "no argument provided for -h option in endpoint " + endpoint;
+ throw ex;
+ }
+ const_cast<string&>(_manufacturer) = argument;
+ break;
+ }
+
+ case 'o':
+ {
+ if(argument.empty())
+ {
+ EndpointParseException ex(__FILE__, __LINE__);
+ ex.str = "no argument provided for -h option in endpoint " + endpoint;
+ throw ex;
+ }
+ const_cast<string&>(_modelNumber) = argument;
+ break;
+ }
+
+ case 'n':
+ {
+ if(argument.empty())
+ {
+ EndpointParseException ex(__FILE__, __LINE__);
+ ex.str = "no argument provided for -h option in endpoint " + endpoint;
+ throw ex;
+ }
+ const_cast<string&>(_name) = argument;
+ break;
+ }
+
+ case 'p':
+ {
+ if(argument.empty())
+ {
+ EndpointParseException ex(__FILE__, __LINE__);
+ ex.str = "no argument provided for -h option in endpoint " + endpoint;
+ throw ex;
+ }
+ const_cast<string&>(_protocol) = argument;
+ break;
+ }
+
+ case 't':
+ {
+ if(argument == "infinite")
+ {
+ const_cast<Int&>(_timeout) = -1;
+ }
+ else
+ {
+ istringstream t(argument);
+ if(!(t >> const_cast<Int&>(_timeout)) || !t.eof() || _timeout < 1)
+ {
+ EndpointParseException ex(__FILE__, __LINE__);
+ ex.str = "invalid timeout value `" + argument + "' in endpoint " + endpoint;
+ throw ex;
+ }
+ }
+ break;
+ }
+
+ case 'z':
+ {
+ if(!argument.empty())
+ {
+ EndpointParseException ex(__FILE__, __LINE__);
+ ex.str = "no argument provided for -h option in endpoint " + endpoint;
+ throw ex;
+ }
+ const_cast<bool&>(_compress) = true;
+ break;
+ }
+
+ default:
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+IceObjC::iAPEndpointFactory::iAPEndpointFactory(const ProtocolInstancePtr& instance) :
+ _instance(instance)
+{
+}
+
+IceObjC::iAPEndpointFactory::~iAPEndpointFactory()
+{
+}
+
+Short
+IceObjC::iAPEndpointFactory::type() const
+{
+ return _instance->type();
+}
+
+string
+IceObjC::iAPEndpointFactory::protocol() const
+{
+ return _instance->protocol();
+}
+
+EndpointIPtr
+IceObjC::iAPEndpointFactory::create(vector<string>& args, bool oaEndpoint) const
+{
+ if(oaEndpoint)
+ {
+ return 0;
+ }
+ EndpointIPtr endpt = ICE_MAKE_SHARED(iAPEndpointI, _instance);
+ endpt->initWithOptions(args);
+ return endpt;
+}
+
+EndpointIPtr
+IceObjC::iAPEndpointFactory::read(InputStream* s) const
+{
+ return ICE_MAKE_SHARED(iAPEndpointI, _instance, s);
+}
+
+void
+IceObjC::iAPEndpointFactory::destroy()
+{
+ _instance = 0;
+}
+
+EndpointFactoryPtr
+IceObjC::iAPEndpointFactory::clone(const ProtocolInstancePtr& instance) const
+{
+ return new iAPEndpointFactory(instance);
+}
diff --git a/cpp/src/Ice/ios/iAPTransceiver.h b/cpp/src/Ice/ios/iAPTransceiver.h
new file mode 100644
index 00000000000..b5e10c80f1e
--- /dev/null
+++ b/cpp/src/Ice/ios/iAPTransceiver.h
@@ -0,0 +1,85 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_TOUCH_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef ICE_IAP_TRANSCEIVER_H
+#define ICE_IAP_TRANSCEIVER_H
+
+#include <Ice/ProtocolInstanceF.h>
+#include <Ice/Transceiver.h>
+#include <Ice/Network.h>
+#include <Ice/Selector.h>
+
+#import <Foundation/Foundation.h>
+#import <ExternalAccessory/ExternalAccessory.h>
+
+@class iAPTransceiverCallback;
+
+namespace IceObjC
+{
+
+class iAPTransceiver : public IceInternal::Transceiver, public IceInternal::StreamNativeInfo
+{
+ enum State
+ {
+ StateNeedConnect,
+ StateConnectPending,
+ StateConnected
+ };
+
+public:
+
+ iAPTransceiver(const IceInternal::ProtocolInstancePtr&, EASession*);
+ virtual ~iAPTransceiver();
+
+ virtual void initStreams(IceInternal::SelectorReadyCallback*);
+ virtual IceInternal::SocketOperation registerWithRunLoop(IceInternal::SocketOperation);
+ virtual IceInternal::SocketOperation unregisterFromRunLoop(IceInternal::SocketOperation, bool);
+ virtual void closeStreams();
+
+ virtual IceInternal::NativeInfoPtr getNativeInfo();
+
+ virtual IceInternal::SocketOperation initialize(IceInternal::Buffer&, IceInternal::Buffer&);
+#ifdef ICE_CPP11_MAPPING
+ virtual IceInternal::SocketOperation closing(bool, std::exception_ptr);
+#else
+ virtual IceInternal::SocketOperation closing(bool, const Ice::LocalException&);
+#endif
+ virtual void close();
+ virtual IceInternal::SocketOperation write(IceInternal::Buffer&);
+ virtual IceInternal::SocketOperation read(IceInternal::Buffer&);
+
+ virtual std::string protocol() const;
+ virtual std::string toString() const;
+ virtual std::string toDetailedString() const;
+ virtual Ice::ConnectionInfoPtr getInfo() const;
+ virtual void checkSendSize(const IceInternal::Buffer&);
+ virtual void setBufferSize(int, int);
+
+private:
+
+ void checkError(NSError*, const char*, int);
+
+ IceInternal::ProtocolInstancePtr _instance;
+ NSInputStream* _readStream;
+ NSOutputStream* _writeStream;
+ iAPTransceiverCallback* _callback;
+ bool _readStreamRegistered;
+ bool _writeStreamRegistered;
+ bool _opening;
+
+ IceUtil::Mutex _mutex;
+ bool _error;
+
+ State _state;
+ std::string _desc;
+};
+
+}
+
+#endif
diff --git a/cpp/src/Ice/ios/iAPTransceiver.mm b/cpp/src/Ice/ios/iAPTransceiver.mm
new file mode 100644
index 00000000000..1e7b989f8e1
--- /dev/null
+++ b/cpp/src/Ice/ios/iAPTransceiver.mm
@@ -0,0 +1,490 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include "iAPTransceiver.h"
+#include "iAPEndpointI.h"
+
+#include <Ice/LocalException.h>
+#include <Ice/ProtocolInstance.h>
+#include <Ice/Buffer.h>
+
+#import <Foundation/NSRunLoop.h>
+#import <Foundation/NSError.h>
+#import <Foundation/NSString.h>
+
+using namespace std;
+using namespace Ice;
+using namespace IceInternal;
+
+@interface iAPTransceiverCallback : NSObject<NSStreamDelegate>
+{
+@private
+
+ SelectorReadyCallback* callback;
+}
+-(id) init:(SelectorReadyCallback*)cb;
+@end
+
+@implementation iAPTransceiverCallback
+-(id) init:(SelectorReadyCallback*)cb;
+{
+ if(![super init])
+ {
+ return nil;
+ }
+ callback = cb;
+ return self;
+}
+
+- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
+{
+ switch(eventCode)
+ {
+ case NSStreamEventHasBytesAvailable:
+ callback->readyCallback(SocketOperationRead);
+ break;
+ case NSStreamEventHasSpaceAvailable:
+ callback->readyCallback(SocketOperationWrite);
+ break;
+ case NSStreamEventOpenCompleted:
+ if([[stream class] isSubclassOfClass:[NSInputStream class]])
+ {
+ callback->readyCallback(static_cast<SocketOperation>(SocketOperationConnect | SocketOperationRead));
+ }
+ else
+ {
+ callback->readyCallback(static_cast<SocketOperation>(SocketOperationConnect | SocketOperationWrite));
+ }
+ break;
+ case NSStreamEventEndEncountered:
+ case NSStreamEventErrorOccurred:
+ if([[stream class] isSubclassOfClass:[NSInputStream class]])
+ {
+ callback->readyCallback(SocketOperationRead, -1); // Error
+ }
+ else
+ {
+ callback->readyCallback(SocketOperationWrite, -1); // Error
+ }
+ }
+}
+@end
+
+void
+IceObjC::iAPTransceiver::initStreams(SelectorReadyCallback* callback)
+{
+ _callback = [[iAPTransceiverCallback alloc] init:callback];
+ [_writeStream setDelegate:_callback];
+ [_readStream setDelegate:_callback];
+}
+
+SocketOperation
+IceObjC::iAPTransceiver::registerWithRunLoop(SocketOperation op)
+{
+ IceUtil::Mutex::Lock sync(_mutex);
+
+ SocketOperation readyOp = SocketOperationNone;
+ if(op & SocketOperationConnect)
+ {
+ if([_writeStream streamStatus] != NSStreamStatusNotOpen || [_readStream streamStatus] != NSStreamStatusNotOpen)
+ {
+ return SocketOperationConnect;
+ }
+
+ _opening = true;
+
+ [_writeStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+ [_readStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+
+ _writeStreamRegistered = true; // Note: this must be set after the schedule call
+ _readStreamRegistered = true; // Note: this must be set after the schedule call
+
+ [_writeStream open];
+ [_readStream open];
+ }
+ else
+ {
+ if(op & SocketOperationWrite)
+ {
+ if([_writeStream hasSpaceAvailable])
+ {
+ readyOp = static_cast<SocketOperation>(readyOp | SocketOperationWrite);
+ }
+ else if(!_writeStreamRegistered)
+ {
+ [_writeStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+ _writeStreamRegistered = true; // Note: this must be set after the schedule call
+ if([_writeStream hasSpaceAvailable])
+ {
+ readyOp = static_cast<SocketOperation>(readyOp | SocketOperationWrite);
+ }
+ }
+ }
+
+ if(op & SocketOperationRead)
+ {
+ if([_readStream hasBytesAvailable])
+ {
+ readyOp = static_cast<SocketOperation>(readyOp | SocketOperationRead);
+ }
+ else if(!_readStreamRegistered)
+ {
+ [_readStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+ _readStreamRegistered = true; // Note: this must be set after the schedule call
+ if([_readStream hasBytesAvailable])
+ {
+ readyOp = static_cast<SocketOperation>(readyOp | SocketOperationRead);
+ }
+ }
+ }
+ }
+ return readyOp;
+}
+
+SocketOperation
+IceObjC::iAPTransceiver::unregisterFromRunLoop(SocketOperation op, bool error)
+{
+ IceUtil::Mutex::Lock sync(_mutex);
+ _error |= error;
+
+ if(_opening)
+ {
+ // Wait for the stream to be ready for write
+ if(op == SocketOperationWrite)
+ {
+ _writeStreamRegistered = false;
+ }
+
+ //
+ // We don't wait for the stream to be ready for read (even if
+ // it's a client connection) because there's no guarantees that
+ // the server might actually send data right away. If we use
+ // the WebSocket transport, the server actually waits for the
+ // client to write the HTTP upgrade request.
+ //
+ //if(op & SocketOperationRead && (_fd != INVALID_SOCKET || !(op & SocketOperationConnect)))
+ if(op == (SocketOperationRead | SocketOperationConnect))
+ {
+ _readStreamRegistered = false;
+ }
+
+ if(error || (!_readStreamRegistered && !_writeStreamRegistered))
+ {
+ [_writeStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+ [_readStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+ _opening = false;
+ return SocketOperationConnect;
+ }
+ else
+ {
+ return SocketOperationNone;
+ }
+ }
+ else
+ {
+ if(op & SocketOperationWrite && _writeStreamRegistered)
+ {
+ [_writeStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+ _writeStreamRegistered = false;
+ }
+
+ if(op & SocketOperationRead && _readStreamRegistered)
+ {
+ [_readStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+ _readStreamRegistered = false;
+ }
+ }
+ return op;
+}
+
+void
+IceObjC::iAPTransceiver::closeStreams()
+{
+ [_writeStream setDelegate:nil];
+ [_readStream setDelegate:nil];
+
+ [_callback release];
+ _callback = 0;
+
+ [_writeStream close];
+ [_readStream close];
+}
+
+IceInternal::NativeInfoPtr
+IceObjC::iAPTransceiver::getNativeInfo()
+{
+ return this;
+}
+
+SocketOperation
+IceObjC::iAPTransceiver::initialize(Buffer& readBuffer, Buffer& writeBuffer)
+{
+ IceUtil::Mutex::Lock sync(_mutex);
+ if(_state == StateNeedConnect)
+ {
+ _state = StateConnectPending;
+ return SocketOperationConnect;
+ }
+
+ if(_state <= StateConnectPending)
+ {
+ if(_error)
+ {
+ assert([_writeStream streamStatus] == NSStreamStatusError);
+ NSError* err = [_writeStream streamError];
+ NSString* domain = [err domain];
+ if([domain compare:NSPOSIXErrorDomain] == NSOrderedSame)
+ {
+ errno = [err code];
+ [err release];
+ if(connectionRefused())
+ {
+ ConnectionRefusedException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ else if(connectFailed())
+ {
+ ConnectFailedException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ else
+ {
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ }
+
+ // Otherwise throw a generic exception.
+ CFNetworkException ex(__FILE__, __LINE__);
+ ex.domain = [domain UTF8String];
+ ex.error = [err code];
+ [err release];
+ throw ex;
+ }
+ _state = StateConnected;
+ }
+ assert(_state == StateConnected);
+ return SocketOperationNone;
+}
+
+SocketOperation
+#ifdef ICE_CPP11_MAPPING
+IceObjC::iAPTransceiver::closing(bool initiator, exception_ptr)
+#else
+IceObjC::iAPTransceiver::closing(bool initiator, const Ice::LocalException&)
+#endif
+{
+ // If we are initiating the connection closure, wait for the peer
+ // to close the TCP/IP connection. Otherwise, close immediately.
+ return initiator ? SocketOperationRead : SocketOperationNone;
+}
+
+void
+IceObjC::iAPTransceiver::close()
+{
+}
+
+SocketOperation
+IceObjC::iAPTransceiver::write(Buffer& buf)
+{
+ IceUtil::Mutex::Lock sync(_mutex);
+ if(_error)
+ {
+ assert([_writeStream streamStatus] == NSStreamStatusError);
+ checkError([_writeStream streamError], __FILE__, __LINE__);
+ }
+
+ // Its impossible for the packetSize to be more than an Int.
+ int packetSize = static_cast<int>(buf.b.end() - buf.i);
+ while(buf.i != buf.b.end())
+ {
+ if(![_writeStream hasSpaceAvailable])
+ {
+ return SocketOperationWrite;
+ }
+ assert([_writeStream streamStatus] >= NSStreamStatusOpen);
+
+ NSInteger ret = [_writeStream write:reinterpret_cast<const UInt8*>(&*buf.i) maxLength:packetSize];
+ if(ret == SOCKET_ERROR)
+ {
+ if([_writeStream streamStatus] == NSStreamStatusAtEnd)
+ {
+ ConnectionLostException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+
+ assert([_writeStream streamStatus] == NSStreamStatusError);
+ checkError([_writeStream streamError], __FILE__, __LINE__);
+ if(noBuffers() && packetSize > 1024)
+ {
+ packetSize /= 2;
+ }
+ continue;
+ }
+
+ buf.i += ret;
+
+ if(packetSize > buf.b.end() - buf.i)
+ {
+ packetSize = static_cast<int>(buf.b.end() - buf.i);
+ }
+ }
+
+ return SocketOperationNone;
+}
+
+SocketOperation
+IceObjC::iAPTransceiver::read(Buffer& buf)
+{
+ IceUtil::Mutex::Lock sync(_mutex);
+ if(_error)
+ {
+ assert([_readStream streamStatus] == NSStreamStatusError);
+ checkError([_readStream streamError], __FILE__, __LINE__);
+ }
+
+ // Its impossible for the packetSize to be more than an Int.
+ int packetSize = static_cast<int>(buf.b.end() - buf.i);
+ while(buf.i != buf.b.end())
+ {
+ if(![_readStream hasBytesAvailable] && [_readStream streamStatus] != NSStreamStatusError)
+ {
+ return SocketOperationRead;
+ }
+ assert([_readStream streamStatus] >= NSStreamStatusOpen);
+
+ NSInteger ret = [_readStream read:reinterpret_cast<UInt8*>(&*buf.i) maxLength:packetSize];
+ if(ret == 0)
+ {
+ ConnectionLostException ex(__FILE__, __LINE__);
+ ex.error = 0;
+ throw ex;
+ }
+
+ if(ret == SOCKET_ERROR)
+ {
+ if([_readStream streamStatus] == NSStreamStatusAtEnd)
+ {
+ ConnectionLostException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+
+ assert([_readStream streamStatus] == NSStreamStatusError);
+ checkError([_readStream streamError], __FILE__, __LINE__);
+ if(noBuffers() && packetSize > 1024)
+ {
+ packetSize /= 2;
+ }
+ continue;
+ }
+
+ buf.i += ret;
+
+ if(packetSize > buf.b.end() - buf.i)
+ {
+ packetSize = static_cast<int>(buf.b.end() - buf.i);
+ }
+ }
+
+ return SocketOperationNone;
+}
+
+string
+IceObjC::iAPTransceiver::protocol() const
+{
+ return _instance->protocol();
+}
+
+string
+IceObjC::iAPTransceiver::toString() const
+{
+ return _desc;
+}
+
+string
+IceObjC::iAPTransceiver::toDetailedString() const
+{
+ return toString();
+}
+
+Ice::ConnectionInfoPtr
+IceObjC::iAPTransceiver::getInfo() const
+{
+ return 0;
+}
+
+void
+IceObjC::iAPTransceiver::checkSendSize(const Buffer& buf)
+{
+}
+
+void
+IceObjC::iAPTransceiver::setBufferSize(int, int)
+{
+}
+
+IceObjC::iAPTransceiver::iAPTransceiver(const ProtocolInstancePtr& instance, EASession* session) :
+ StreamNativeInfo(INVALID_SOCKET),
+ _instance(instance),
+ _readStream([[session inputStream] retain]),
+ _writeStream([[session outputStream] retain]),
+ _readStreamRegistered(false),
+ _writeStreamRegistered(false),
+ _error(false),
+ _state(StateNeedConnect)
+{
+ _desc = string("name = ") + [session.accessory.name UTF8String];
+}
+
+IceObjC::iAPTransceiver::~iAPTransceiver()
+{
+ [_readStream release];
+ [_writeStream release];
+}
+
+void
+IceObjC::iAPTransceiver::checkError(NSError* err, const char* file, int line)
+{
+ NSString* domain = [err domain];
+ if([domain compare:NSPOSIXErrorDomain] == NSOrderedSame)
+ {
+ errno = [err code];
+ [err release];
+ if(connectionRefused())
+ {
+ ConnectionRefusedException ex(file, line);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ else if(connectFailed())
+ {
+ ConnectFailedException ex(file, line);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ else
+ {
+ SocketException ex(file, line);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ }
+
+ // Otherwise throw a generic exception.
+ CFNetworkException ex(file, line);
+ ex.domain = [domain UTF8String];
+ ex.error = [err code];
+ [err release];
+ throw ex;
+}
diff --git a/cpp/src/IceBT/Makefile.mk b/cpp/src/IceBT/Makefile.mk
index d56d94486a7..20b06076caa 100644
--- a/cpp/src/IceBT/Makefile.mk
+++ b/cpp/src/IceBT/Makefile.mk
@@ -13,8 +13,8 @@ $(project)_libraries := IceBT
IceBT_targetdir := $(libdir)
IceBT_dependencies := IceXML Ice
-IceBT_cppflags := -DICEBT_API_EXPORTS `pkg-config --cflags dbus-1`
-IceBT_system_libs := $(SSL_OS_LIBS) `pkg-config --libs dbus-1`
+IceBT_cppflags := -DICEBT_API_EXPORTS $(shell pkg-config --cflags dbus-1)
+IceBT_system_libs = $(IceSSL_system_libs) $(shell pkg-config --libs dbus-1)
IceBT_sliceflags := --include-dir IceBT --dll-export ICESSL_API
projects += $(project)
diff --git a/cpp/src/IceSSL/Makefile.mk b/cpp/src/IceSSL/Makefile.mk
index d9616562624..69c0af65de7 100644
--- a/cpp/src/IceSSL/Makefile.mk
+++ b/cpp/src/IceSSL/Makefile.mk
@@ -12,7 +12,9 @@ $(project)_libraries := IceSSL
IceSSL_targetdir := $(libdir)
IceSSL_dependencies := Ice
IceSSL_cppflags := -DICESSL_API_EXPORTS
-IceSSL_system_libs := $(SSL_OS_LIBS)
IceSSL_sliceflags := --include-dir IceSSL --dll-export ICESSL_API
+IceSSL[iphoneos]_excludes := $(wildcard $(addprefix $(currentdir)/,*.cpp))
+IceSSL[iphonesimulator]_excludes = $(IceSSL[iphoneos]_excludes)
+
projects += $(project)
diff --git a/cpp/src/IceUtil/Makefile.mk b/cpp/src/IceUtil/Makefile.mk
index 613f66a2cd8..9953c73d8ad 100644
--- a/cpp/src/IceUtil/Makefile.mk
+++ b/cpp/src/IceUtil/Makefile.mk
@@ -10,13 +10,9 @@
$(project)_libraries = IceUtil
IceUtil_targetdir := $(libdir)
-IceUtil_system_libs := $(ICEUTIL_OS_LIBS)
+IceUtil_cppflags := $(if $(filter yes,$(libbacktrace)),-DICE_LIBBACKTRACE)
# Always enable the static configuration for the IceUtil library
IceUtil_always_enable_configs := static
-ifeq ($(libbacktrace),yes)
- IceUtil_cppflags += -DICE_LIBBACKTRACE
-endif
-
projects += $(project)
diff --git a/cpp/test/Common/Makefile.mk b/cpp/test/Common/Makefile.mk
index 6403a45309a..3afc960f5ba 100644
--- a/cpp/test/Common/Makefile.mk
+++ b/cpp/test/Common/Makefile.mk
@@ -10,7 +10,11 @@
$(project)_libraries = TestCommon
$(project)_noinstall := 1
-TestCommon_targetdir := lib
+#
+# Put the shared TestCommon library in the lib directory for convenience on platforms
+# which don't support something like @loader_path.
+#
+TestCommon[shared]_targetdir := lib
TestCommon_dependencies := Ice
TestCommon_sliceflags := --dll-export TEST_API
TestCommon_cppflags := -DTEST_API_EXPORTS -I$(includedir) -I$(project) -Itest/include
diff --git a/cpp/test/ios/BundleInfo.plist b/cpp/test/ios/BundleInfo.plist
new file mode 100644
index 00000000000..eefb65fecea
--- /dev/null
+++ b/cpp/test/ios/BundleInfo.plist
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>BuildMachineOSBuild</key>
+ <string>12C60</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>NAME.dylib</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.zeroc.NAME</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>NAME</string>
+ <key>CFBundlePackageType</key>
+ <string>BNDL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1</string>
+ <key>CFPlugInDynamicRegisterFunction</key>
+ <string></string>
+ <key>CFPlugInDynamicRegistration</key>
+ <string>NO</string>
+ <key>CFPlugInUnloadFunction</key>
+ <string></string>
+ <key>DTCompiler</key>
+ <string></string>
+ <key>DTPlatformBuild</key>
+ <string>4H127</string>
+ <key>DTPlatformVersion</key>
+ <string>GM</string>
+ <key>DTSDKBuild</key>
+ <string>12C37</string>
+ <key>DTSDKName</key>
+ <string>macosx10.8</string>
+ <key>DTXcode</key>
+ <string>0460</string>
+ <key>DTXcodeBuild</key>
+ <string>4H127</string>
+ <key>NSHumanReadableCopyright</key>
+ <string>Copyright © 2013 ZeroC. All rights reserved.</string>
+</dict>
+</plist>
diff --git a/cpp/test/ios/C++ Test Suite.xcodeproj/project.pbxproj b/cpp/test/ios/C++ Test Suite.xcodeproj/project.pbxproj
new file mode 100755
index 00000000000..497f4f097c9
--- /dev/null
+++ b/cpp/test/ios/C++ Test Suite.xcodeproj/project.pbxproj
@@ -0,0 +1,743 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 47;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 14103B101CFC5E0E0097DE5A /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; };
+ 14103B111CFC5E0E0097DE5A /* TestSelect.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34B7662B0E8D55FE00CE4701 /* TestSelect.xib */; };
+ 14103B121CFC5E0E0097DE5A /* server.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 342EBA880E926E9F000051FA /* server.p12 */; };
+ 14103B131CFC5E0E0097DE5A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D8842ED91BFF87E700A8B607 /* Images.xcassets */; };
+ 14103B141CFC5E0E0097DE5A /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D8842EDB1BFF885600A8B607 /* Default-568h@2x.png */; };
+ 14103B151CFC5E0E0097DE5A /* client.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 1450A10B1ABC5E9C00A71895 /* client.p12 */; };
+ 14103B161CFC5E0E0097DE5A /* cacert.der in Resources */ = {isa = PBXBuildFile; fileRef = 342EBA8A0E926F90000051FA /* cacert.der */; };
+ 14103B171CFC5E0E0097DE5A /* TestSelect-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34730A10122BF6C300D293CC /* TestSelect-iPad.xib */; };
+ 14103B181CFC5E0E0097DE5A /* MainWindow-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34C618AE122C035000F60A28 /* MainWindow-iPad.xib */; };
+ 14103B191CFC5E0E0097DE5A /* TestView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 82CD7277145795AA008B9128 /* TestView.xib */; };
+ 14103B1A1CFC5E0E0097DE5A /* TestView-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 82F883221461D37000FC801E /* TestView-iPad.xib */; };
+ 14103B1C1CFC5E0E0097DE5A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 820C84641455AC460091443F /* main.m */; };
+ 14103B1D1CFC5E0E0097DE5A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 82601FF314564F5500B09B8F /* AppDelegate.mm */; };
+ 14103B1E1CFC5E0E0097DE5A /* TestViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 827BCF99145778A5003AD3FA /* TestViewController.mm */; };
+ 14103B1F1CFC5E0E0097DE5A /* TestSelectController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8214397917024FDF0016E162 /* TestSelectController.m */; };
+ 14103B201CFC5E0E0097DE5A /* TestUtil.mm in Sources */ = {isa = PBXBuildFile; fileRef = 821439B61704E6960016E162 /* TestUtil.mm */; };
+ 14103B221CFC5E0E0097DE5A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
+ 14103B231CFC5E0E0097DE5A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
+ 14103B241CFC5E0E0097DE5A /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 344126360FD8E8EA00C8D69C /* Security.framework */; };
+ 14103B251CFC5E0E0097DE5A /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 344126370FD8E8EA00C8D69C /* CFNetwork.framework */; };
+ 14103B261CFC5E0E0097DE5A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34E396620FF1D71400FBACD6 /* CoreGraphics.framework */; };
+ 142B83841B6BA7A600E28347 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; };
+ 142B83851B6BA7A600E28347 /* TestSelect.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34B7662B0E8D55FE00CE4701 /* TestSelect.xib */; };
+ 142B83871B6BA7A600E28347 /* server.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 342EBA880E926E9F000051FA /* server.p12 */; };
+ 142B83881B6BA7A600E28347 /* client.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 1450A10B1ABC5E9C00A71895 /* client.p12 */; };
+ 142B83891B6BA7A600E28347 /* cacert.der in Resources */ = {isa = PBXBuildFile; fileRef = 342EBA8A0E926F90000051FA /* cacert.der */; };
+ 142B838A1B6BA7A600E28347 /* TestSelect-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34730A10122BF6C300D293CC /* TestSelect-iPad.xib */; };
+ 142B838B1B6BA7A600E28347 /* MainWindow-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34C618AE122C035000F60A28 /* MainWindow-iPad.xib */; };
+ 142B838C1B6BA7A600E28347 /* TestView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 82CD7277145795AA008B9128 /* TestView.xib */; };
+ 142B838D1B6BA7A600E28347 /* TestView-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 82F883221461D37000FC801E /* TestView-iPad.xib */; };
+ 142B83911B6BA7A600E28347 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 820C84641455AC460091443F /* main.m */; };
+ 142B83921B6BA7A600E28347 /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 82601FF314564F5500B09B8F /* AppDelegate.mm */; };
+ 142B83931B6BA7A600E28347 /* TestViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 827BCF99145778A5003AD3FA /* TestViewController.mm */; };
+ 142B83941B6BA7A600E28347 /* TestSelectController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8214397917024FDF0016E162 /* TestSelectController.m */; };
+ 142B83951B6BA7A600E28347 /* TestUtil.mm in Sources */ = {isa = PBXBuildFile; fileRef = 821439B61704E6960016E162 /* TestUtil.mm */; };
+ 142B83971B6BA7A600E28347 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
+ 142B83981B6BA7A600E28347 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
+ 142B83991B6BA7A600E28347 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 344126360FD8E8EA00C8D69C /* Security.framework */; };
+ 142B839A1B6BA7A600E28347 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 344126370FD8E8EA00C8D69C /* CFNetwork.framework */; };
+ 142B839B1B6BA7A600E28347 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34E396620FF1D71400FBACD6 /* CoreGraphics.framework */; };
+ 144B48261A78F71F00C0E06B /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; };
+ 144B48271A78F71F00C0E06B /* TestSelect.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34B7662B0E8D55FE00CE4701 /* TestSelect.xib */; };
+ 144B482A1A78F71F00C0E06B /* server.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 342EBA880E926E9F000051FA /* server.p12 */; };
+ 144B482B1A78F71F00C0E06B /* cacert.der in Resources */ = {isa = PBXBuildFile; fileRef = 342EBA8A0E926F90000051FA /* cacert.der */; };
+ 144B482C1A78F71F00C0E06B /* TestSelect-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34730A10122BF6C300D293CC /* TestSelect-iPad.xib */; };
+ 144B482D1A78F71F00C0E06B /* MainWindow-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34C618AE122C035000F60A28 /* MainWindow-iPad.xib */; };
+ 144B482E1A78F71F00C0E06B /* TestView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 82CD7277145795AA008B9128 /* TestView.xib */; };
+ 144B482F1A78F71F00C0E06B /* TestView-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 82F883221461D37000FC801E /* TestView-iPad.xib */; };
+ 144B48331A78F71F00C0E06B /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 820C84641455AC460091443F /* main.m */; };
+ 144B48341A78F71F00C0E06B /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 82601FF314564F5500B09B8F /* AppDelegate.mm */; };
+ 144B48351A78F71F00C0E06B /* TestViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 827BCF99145778A5003AD3FA /* TestViewController.mm */; };
+ 144B48361A78F71F00C0E06B /* TestSelectController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8214397917024FDF0016E162 /* TestSelectController.m */; };
+ 144B48371A78F71F00C0E06B /* TestUtil.mm in Sources */ = {isa = PBXBuildFile; fileRef = 821439B61704E6960016E162 /* TestUtil.mm */; };
+ 144B48391A78F71F00C0E06B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
+ 144B483A1A78F71F00C0E06B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
+ 144B483B1A78F71F00C0E06B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 344126360FD8E8EA00C8D69C /* Security.framework */; };
+ 144B483C1A78F71F00C0E06B /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 344126370FD8E8EA00C8D69C /* CFNetwork.framework */; };
+ 144B483D1A78F71F00C0E06B /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34E396620FF1D71400FBACD6 /* CoreGraphics.framework */; };
+ 1450A10C1ABC5E9C00A71895 /* client.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 1450A10B1ABC5E9C00A71895 /* client.p12 */; };
+ D837179F1BFFC25C005D65BC /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D8842ED91BFF87E700A8B607 /* Images.xcassets */; };
+ D8842EDA1BFF87E700A8B607 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D8842ED91BFF87E700A8B607 /* Images.xcassets */; };
+ D8842EDC1BFF885600A8B607 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D8842EDB1BFF885600A8B607 /* Default-568h@2x.png */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 14103B2B1CFC5E0E0097DE5A /* C++11 Test Suite.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "C++11 Test Suite.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 14103B2C1CFC5E0E0097DE5A /* C++11 Test Suite.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "C++11 Test Suite.plist"; path = "/Users/benoit/Devel/GitHub/ice/cpp/test/ios/C++11 Test Suite.plist"; sourceTree = "<absolute>"; };
+ 142B83A01B6BA7A600E28347 /* C++ Test Suite.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "C++ Test Suite.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 144B48931A78F71F00C0E06B /* C++ Test Suite.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "C++ Test Suite.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 1450A10B1ABC5E9C00A71895 /* client.p12 */ = {isa = PBXFileReference; lastKnownFileType = file; name = client.p12; path = ../../../../ice/certs/client.p12; sourceTree = "<group>"; };
+ 1477FACD1A652B7E00BC2890 /* C++98 Test Suite-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "C++98 Test Suite-Info.plist"; sourceTree = "<group>"; };
+ 148668D31B6BAFD300234C12 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
+ 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = "<group>"; };
+ 342EBA880E926E9F000051FA /* server.p12 */ = {isa = PBXFileReference; lastKnownFileType = file; name = server.p12; path = ../../../certs/server.p12; sourceTree = SOURCE_ROOT; };
+ 342EBA8A0E926F90000051FA /* cacert.der */ = {isa = PBXFileReference; lastKnownFileType = file; name = cacert.der; path = ../../../certs/cacert.der; sourceTree = SOURCE_ROOT; };
+ 344126360FD8E8EA00C8D69C /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
+ 344126370FD8E8EA00C8D69C /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; };
+ 34730A10122BF6C300D293CC /* TestSelect-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "TestSelect-iPad.xib"; sourceTree = "<group>"; };
+ 34885BE11227F66E0060DE41 /* ExternalAccessory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ExternalAccessory.framework; path = System/Library/Frameworks/ExternalAccessory.framework; sourceTree = SDKROOT; };
+ 34B7662B0E8D55FE00CE4701 /* TestSelect.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TestSelect.xib; sourceTree = "<group>"; };
+ 34C618AE122C035000F60A28 /* MainWindow-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "MainWindow-iPad.xib"; sourceTree = "<group>"; };
+ 34E396620FF1D71400FBACD6 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ 820C84641455AC460091443F /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ 8214397917024FDF0016E162 /* TestSelectController.m */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = TestSelectController.m; sourceTree = "<group>"; };
+ 821439B51704E6950016E162 /* TestUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestUtil.h; sourceTree = "<group>"; };
+ 821439B61704E6960016E162 /* TestUtil.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TestUtil.mm; sourceTree = "<group>"; };
+ 82601FE71456320100B09B8F /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+ 82601FEA14563AFE00B09B8F /* TestSelectController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestSelectController.h; sourceTree = "<group>"; };
+ 82601FEC14563AFF00B09B8F /* TestViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestViewController.h; sourceTree = "<group>"; };
+ 82601FF314564F5500B09B8F /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AppDelegate.mm; sourceTree = "<group>"; };
+ 827BCF99145778A5003AD3FA /* TestViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TestViewController.mm; sourceTree = "<group>"; };
+ 82CD7277145795AA008B9128 /* TestView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TestView.xib; sourceTree = "<group>"; };
+ 82F883221461D37000FC801E /* TestView-iPad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "TestView-iPad.xib"; sourceTree = "<group>"; };
+ D8842ED91BFF87E700A8B607 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
+ D8842EDB1BFF885600A8B607 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 14103B211CFC5E0E0097DE5A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 14103B221CFC5E0E0097DE5A /* Foundation.framework in Frameworks */,
+ 14103B231CFC5E0E0097DE5A /* UIKit.framework in Frameworks */,
+ 14103B241CFC5E0E0097DE5A /* Security.framework in Frameworks */,
+ 14103B251CFC5E0E0097DE5A /* CFNetwork.framework in Frameworks */,
+ 14103B261CFC5E0E0097DE5A /* CoreGraphics.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 142B83961B6BA7A600E28347 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 142B83971B6BA7A600E28347 /* Foundation.framework in Frameworks */,
+ 142B83981B6BA7A600E28347 /* UIKit.framework in Frameworks */,
+ 142B83991B6BA7A600E28347 /* Security.framework in Frameworks */,
+ 142B839A1B6BA7A600E28347 /* CFNetwork.framework in Frameworks */,
+ 142B839B1B6BA7A600E28347 /* CoreGraphics.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 144B48381A78F71F00C0E06B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 144B48391A78F71F00C0E06B /* Foundation.framework in Frameworks */,
+ 144B483A1A78F71F00C0E06B /* UIKit.framework in Frameworks */,
+ 144B483B1A78F71F00C0E06B /* Security.framework in Frameworks */,
+ 144B483C1A78F71F00C0E06B /* CFNetwork.framework in Frameworks */,
+ 144B483D1A78F71F00C0E06B /* CoreGraphics.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 080E96DDFE201D6D7F000001 /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ 821439B51704E6950016E162 /* TestUtil.h */,
+ 821439B61704E6960016E162 /* TestUtil.mm */,
+ 8214397917024FDF0016E162 /* TestSelectController.m */,
+ 827BCF99145778A5003AD3FA /* TestViewController.mm */,
+ 82601FF314564F5500B09B8F /* AppDelegate.mm */,
+ 82601FEA14563AFE00B09B8F /* TestSelectController.h */,
+ 82601FEC14563AFF00B09B8F /* TestViewController.h */,
+ 82601FE71456320100B09B8F /* AppDelegate.h */,
+ );
+ path = Classes;
+ sourceTree = "<group>";
+ };
+ 19C28FACFE9D520D11CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 144B48931A78F71F00C0E06B /* C++ Test Suite.app */,
+ 142B83A01B6BA7A600E28347 /* C++ Test Suite.app */,
+ 14103B2B1CFC5E0E0097DE5A /* C++11 Test Suite.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {
+ isa = PBXGroup;
+ children = (
+ 148668D31B6BAFD300234C12 /* README.md */,
+ 080E96DDFE201D6D7F000001 /* Classes */,
+ 29B97315FDCFA39411CA2CEA /* Other Sources */,
+ 29B97317FDCFA39411CA2CEA /* Resources */,
+ 34730A09122BF68100D293CC /* Resources-iPad */,
+ 29B97323FDCFA39411CA2CEA /* Frameworks */,
+ 19C28FACFE9D520D11CA2CBB /* Products */,
+ 1477FACD1A652B7E00BC2890 /* C++98 Test Suite-Info.plist */,
+ 14103B2C1CFC5E0E0097DE5A /* C++11 Test Suite.plist */,
+ );
+ name = CustomTemplate;
+ sourceTree = "<group>";
+ };
+ 29B97315FDCFA39411CA2CEA /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 820C84641455AC460091443F /* main.m */,
+ );
+ name = "Other Sources";
+ sourceTree = "<group>";
+ };
+ 29B97317FDCFA39411CA2CEA /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 342EBA8A0E926F90000051FA /* cacert.der */,
+ 1450A10B1ABC5E9C00A71895 /* client.p12 */,
+ D8842EDB1BFF885600A8B607 /* Default-568h@2x.png */,
+ D8842ED91BFF87E700A8B607 /* Images.xcassets */,
+ 28AD733E0D9D9553002E5188 /* MainWindow.xib */,
+ 342EBA880E926E9F000051FA /* server.p12 */,
+ 34B7662B0E8D55FE00CE4701 /* TestSelect.xib */,
+ 82CD7277145795AA008B9128 /* TestView.xib */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 34885BE11227F66E0060DE41 /* ExternalAccessory.framework */,
+ 34E396620FF1D71400FBACD6 /* CoreGraphics.framework */,
+ 344126360FD8E8EA00C8D69C /* Security.framework */,
+ 344126370FD8E8EA00C8D69C /* CFNetwork.framework */,
+ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
+ 1D30AB110D05D00D00671497 /* Foundation.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ 34730A09122BF68100D293CC /* Resources-iPad */ = {
+ isa = PBXGroup;
+ children = (
+ 82F883221461D37000FC801E /* TestView-iPad.xib */,
+ 34C618AE122C035000F60A28 /* MainWindow-iPad.xib */,
+ 34730A10122BF6C300D293CC /* TestSelect-iPad.xib */,
+ );
+ name = "Resources-iPad";
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 14103B0E1CFC5E0E0097DE5A /* C++11 Test Suite */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 14103B281CFC5E0E0097DE5A /* Build configuration list for PBXNativeTarget "C++11 Test Suite" */;
+ buildPhases = (
+ 14103B0F1CFC5E0E0097DE5A /* Resources */,
+ 14103B1B1CFC5E0E0097DE5A /* Sources */,
+ 14103B211CFC5E0E0097DE5A /* Frameworks */,
+ 14103B271CFC5E0E0097DE5A /* Run Script */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "C++11 Test Suite";
+ productName = container;
+ productReference = 14103B2B1CFC5E0E0097DE5A /* C++11 Test Suite.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 142B83821B6BA7A600E28347 /* C++98 Test Suite iOS 7 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 142B839D1B6BA7A600E28347 /* Build configuration list for PBXNativeTarget "C++98 Test Suite iOS 7" */;
+ buildPhases = (
+ 142B83831B6BA7A600E28347 /* Resources */,
+ 142B83901B6BA7A600E28347 /* Sources */,
+ 142B83961B6BA7A600E28347 /* Frameworks */,
+ 142B839C1B6BA7A600E28347 /* Run Script */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "C++98 Test Suite iOS 7";
+ productName = container;
+ productReference = 142B83A01B6BA7A600E28347 /* C++ Test Suite.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 144B48241A78F71F00C0E06B /* C++98 Test Suite */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 144B48901A78F71F00C0E06B /* Build configuration list for PBXNativeTarget "C++98 Test Suite" */;
+ buildPhases = (
+ 144B48251A78F71F00C0E06B /* Resources */,
+ 144B48321A78F71F00C0E06B /* Sources */,
+ 144B48381A78F71F00C0E06B /* Frameworks */,
+ 144B488F1A78F71F00C0E06B /* Run Script */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "C++98 Test Suite";
+ productName = container;
+ productReference = 144B48931A78F71F00C0E06B /* C++ Test Suite.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 29B97313FDCFA39411CA2CEA /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0710;
+ };
+ buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "C++ Test Suite" */;
+ compatibilityVersion = "Xcode 6.3";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 144B48241A78F71F00C0E06B /* C++98 Test Suite */,
+ 142B83821B6BA7A600E28347 /* C++98 Test Suite iOS 7 */,
+ 14103B0E1CFC5E0E0097DE5A /* C++11 Test Suite */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 14103B0F1CFC5E0E0097DE5A /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 14103B101CFC5E0E0097DE5A /* MainWindow.xib in Resources */,
+ 14103B111CFC5E0E0097DE5A /* TestSelect.xib in Resources */,
+ 14103B121CFC5E0E0097DE5A /* server.p12 in Resources */,
+ 14103B131CFC5E0E0097DE5A /* Images.xcassets in Resources */,
+ 14103B141CFC5E0E0097DE5A /* Default-568h@2x.png in Resources */,
+ 14103B151CFC5E0E0097DE5A /* client.p12 in Resources */,
+ 14103B161CFC5E0E0097DE5A /* cacert.der in Resources */,
+ 14103B171CFC5E0E0097DE5A /* TestSelect-iPad.xib in Resources */,
+ 14103B181CFC5E0E0097DE5A /* MainWindow-iPad.xib in Resources */,
+ 14103B191CFC5E0E0097DE5A /* TestView.xib in Resources */,
+ 14103B1A1CFC5E0E0097DE5A /* TestView-iPad.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 142B83831B6BA7A600E28347 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 142B83841B6BA7A600E28347 /* MainWindow.xib in Resources */,
+ D837179F1BFFC25C005D65BC /* Images.xcassets in Resources */,
+ 142B83851B6BA7A600E28347 /* TestSelect.xib in Resources */,
+ 142B83871B6BA7A600E28347 /* server.p12 in Resources */,
+ 142B83881B6BA7A600E28347 /* client.p12 in Resources */,
+ 142B83891B6BA7A600E28347 /* cacert.der in Resources */,
+ 142B838A1B6BA7A600E28347 /* TestSelect-iPad.xib in Resources */,
+ 142B838B1B6BA7A600E28347 /* MainWindow-iPad.xib in Resources */,
+ 142B838C1B6BA7A600E28347 /* TestView.xib in Resources */,
+ 142B838D1B6BA7A600E28347 /* TestView-iPad.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 144B48251A78F71F00C0E06B /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 144B48261A78F71F00C0E06B /* MainWindow.xib in Resources */,
+ 144B48271A78F71F00C0E06B /* TestSelect.xib in Resources */,
+ 144B482A1A78F71F00C0E06B /* server.p12 in Resources */,
+ D8842EDA1BFF87E700A8B607 /* Images.xcassets in Resources */,
+ D8842EDC1BFF885600A8B607 /* Default-568h@2x.png in Resources */,
+ 1450A10C1ABC5E9C00A71895 /* client.p12 in Resources */,
+ 144B482B1A78F71F00C0E06B /* cacert.der in Resources */,
+ 144B482C1A78F71F00C0E06B /* TestSelect-iPad.xib in Resources */,
+ 144B482D1A78F71F00C0E06B /* MainWindow-iPad.xib in Resources */,
+ 144B482E1A78F71F00C0E06B /* TestView.xib in Resources */,
+ 144B482F1A78F71F00C0E06B /* TestView-iPad.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 14103B271CFC5E0E0097DE5A /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 12;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "#\n# We don't use a CopyFile build phase here to copy the test bundles because the test\n# bundles are located in different location depending on the platform. This script\n# copies the bundles if updated and sign them.\n#\n\nFRAMEWORKS_PATH=\"${TARGET_BUILD_DIR}\"/\"${FRAMEWORKS_FOLDER_PATH}\"\ncd \"Bundles++11-${PLATFORM_NAME}\"\nif [ ! -d \"$FRAMEWORKS_PATH\" ]; then\n mkdir -p \"$FRAMEWORKS_PATH\"\nfi;\nfor i in `ls -d */*.bundle`;\ndo\n if [ ! -d \"$FRAMEWORKS_PATH/$i\" -o \"$i\" -nt \"$FRAMEWORKS_PATH/$i\" ]; then\n echo \"Copying $i\"\n mkdir -p \"$FRAMEWORKS_PATH/$(dirname $i)\"\n cp -rf $i \"$FRAMEWORKS_PATH/$(dirname $i)\"\n if [ -n \"${EXPANDED_CODE_SIGN_IDENTITY_NAME}\" ]; then\n codesign --force --sign \"${EXPANDED_CODE_SIGN_IDENTITY}\" --preserve-metadata=identifier,entitlements \"${FRAMEWORKS_PATH}/$i\"\n fi;\n fi;\ndone\n\n";
+ };
+ 142B839C1B6BA7A600E28347 /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 12;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "#\n# We don't use a CopyFile build phase here to copy the test bundles because the test\n# bundles are located in different location depending on the platform. This script\n# copies the bundles if updated and sign them.\n#\nFRAMEWORKS_PATH=\"${TARGET_BUILD_DIR}\"/\"${FRAMEWORKS_FOLDER_PATH}\"\ncd \"Bundles-${PLATFORM_NAME}\"\nif [ ! -d \"$FRAMEWORKS_PATH\" ]; then\n mkdir -p \"$FRAMEWORKS_PATH\"\nfi;\nfor i in `ls -d *.bundle`;\ndo\n if [ ! -d \"$FRAMEWORKS_PATH/$i\" -o \"$i\" -nt \"$FRAMEWORKS_PATH/$i\" ];\n then\n echo \"Copying $i\";\n cp -rf $i \"$FRAMEWORKS_PATH\"/;\n fi;\ndone\n\n";
+ };
+ 144B488F1A78F71F00C0E06B /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 12;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "#\n# We don't use a CopyFile build phase here to copy the test bundles because the test\n# bundles are located in different location depending on the platform. This script\n# copies the bundles if updated and sign them.\n#\n\nFRAMEWORKS_PATH=\"${TARGET_BUILD_DIR}\"/\"${FRAMEWORKS_FOLDER_PATH}\"\ncd \"Bundles-${PLATFORM_NAME}\"\nif [ ! -d \"$FRAMEWORKS_PATH\" ]; then\n mkdir -p \"$FRAMEWORKS_PATH\"\nfi;\nfor i in `ls -d */*.bundle`;\ndo\n if [ ! -d \"$FRAMEWORKS_PATH/$i\" -o \"$i\" -nt \"$FRAMEWORKS_PATH/$i\" ]; then\n echo \"Copying $i\"\n mkdir -p \"$FRAMEWORKS_PATH/$(dirname $i)\"\n cp -rf $i \"$FRAMEWORKS_PATH/$(dirname $i)\"\n if [ -n \"${EXPANDED_CODE_SIGN_IDENTITY_NAME}\" ]; then\n codesign --force --sign \"${EXPANDED_CODE_SIGN_IDENTITY}\" --preserve-metadata=identifier,entitlements \"${FRAMEWORKS_PATH}/$i\"\n fi;\n fi;\ndone\n\n";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 14103B1B1CFC5E0E0097DE5A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 14103B1C1CFC5E0E0097DE5A /* main.m in Sources */,
+ 14103B1D1CFC5E0E0097DE5A /* AppDelegate.mm in Sources */,
+ 14103B1E1CFC5E0E0097DE5A /* TestViewController.mm in Sources */,
+ 14103B1F1CFC5E0E0097DE5A /* TestSelectController.m in Sources */,
+ 14103B201CFC5E0E0097DE5A /* TestUtil.mm in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 142B83901B6BA7A600E28347 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 142B83911B6BA7A600E28347 /* main.m in Sources */,
+ 142B83921B6BA7A600E28347 /* AppDelegate.mm in Sources */,
+ 142B83931B6BA7A600E28347 /* TestViewController.mm in Sources */,
+ 142B83941B6BA7A600E28347 /* TestSelectController.m in Sources */,
+ 142B83951B6BA7A600E28347 /* TestUtil.mm in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 144B48321A78F71F00C0E06B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 144B48331A78F71F00C0E06B /* main.m in Sources */,
+ 144B48341A78F71F00C0E06B /* AppDelegate.mm in Sources */,
+ 144B48351A78F71F00C0E06B /* TestViewController.mm in Sources */,
+ 144B48361A78F71F00C0E06B /* TestSelectController.m in Sources */,
+ 144B48371A78F71F00C0E06B /* TestUtil.mm in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 14103B291CFC5E0E0097DE5A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "C++ Test Suite_Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = "";
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = "";
+ HEADER_SEARCH_PATHS = (
+ ..,
+ Classes,
+ ../../../../ice/cpp/test/include/,
+ );
+ INFOPLIST_FILE = "$(SRCROOT)/C++11 Test Suite.plist";
+ OTHER_CFLAGS = "";
+ OTHER_CPLUSPLUSFLAGS = (
+ "-DICE_CPP11_MAPPING",
+ "$(OTHER_CFLAGS)",
+ );
+ OTHER_LDFLAGS = "";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.zeroc.IceTouch-Cpp-Test-Suite";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos;
+ SLICE_CPP_FLAG = "";
+ SLICE_INCLUDE_PATH = "";
+ STRIP_STYLE = debugging;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 14103B2A1CFC5E0E0097DE5A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "C++ Test Suite_Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = "";
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = "";
+ HEADER_SEARCH_PATHS = (
+ ..,
+ Classes,
+ ../../../../ice/cpp/test/include/,
+ );
+ INFOPLIST_FILE = "$(SRCROOT)/C++11 Test Suite.plist";
+ OTHER_CFLAGS = "";
+ OTHER_CPLUSPLUSFLAGS = (
+ "-DICE_CPP11_MAPPING",
+ "$(OTHER_CFLAGS)",
+ );
+ OTHER_LDFLAGS = "";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.zeroc.IceTouch-Cpp-Test-Suite";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos;
+ SLICE_CPP_FLAG = "";
+ SLICE_INCLUDE_PATH = "";
+ STRIP_STYLE = debugging;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+ 142B839E1B6BA7A600E28347 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "C++ Test Suite_Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = "";
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = "";
+ HEADER_SEARCH_PATHS = (
+ ..,
+ Classes,
+ ../../../../ice/cpp/test/include/,
+ );
+ INFOPLIST_FILE = "$(SRCROOT)/C++98 Test Suite-Info.plist";
+ OTHER_CFLAGS = "";
+ OTHER_LDFLAGS = "";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.zeroc.IceTouch-Cpp-Test-Suite";
+ PRODUCT_NAME = "C++ Test Suite";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos;
+ SLICE_CPP_FLAG = "";
+ SLICE_INCLUDE_PATH = "";
+ STRIP_STYLE = debugging;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 142B839F1B6BA7A600E28347 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "C++ Test Suite_Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = "";
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = "";
+ HEADER_SEARCH_PATHS = (
+ ..,
+ Classes,
+ ../../../../ice/cpp/test/include/,
+ );
+ INFOPLIST_FILE = "$(SRCROOT)/C++98 Test Suite-Info.plist";
+ OTHER_CFLAGS = "";
+ OTHER_LDFLAGS = "";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.zeroc.IceTouch-Cpp-Test-Suite";
+ PRODUCT_NAME = "C++ Test Suite";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos;
+ SLICE_CPP_FLAG = "";
+ SLICE_INCLUDE_PATH = "";
+ STRIP_STYLE = debugging;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+ 144B48911A78F71F00C0E06B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "C++ Test Suite_Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = "";
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = "";
+ HEADER_SEARCH_PATHS = (
+ ..,
+ Classes,
+ ../../../../ice/cpp/test/include/,
+ );
+ INFOPLIST_FILE = "$(SRCROOT)/C++98 Test Suite-Info.plist";
+ OTHER_CFLAGS = "";
+ OTHER_LDFLAGS = "";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.zeroc.IceTouch-Cpp-Test-Suite";
+ PRODUCT_NAME = "C++ Test Suite";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos;
+ SLICE_CPP_FLAG = "";
+ SLICE_INCLUDE_PATH = "";
+ STRIP_STYLE = debugging;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 144B48921A78F71F00C0E06B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "C++ Test Suite_Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = "";
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = "";
+ HEADER_SEARCH_PATHS = (
+ ..,
+ Classes,
+ ../../../../ice/cpp/test/include/,
+ );
+ INFOPLIST_FILE = "$(SRCROOT)/C++98 Test Suite-Info.plist";
+ OTHER_CFLAGS = "";
+ OTHER_LDFLAGS = "";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.zeroc.IceTouch-Cpp-Test-Suite";
+ PRODUCT_NAME = "C++ Test Suite";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos;
+ SLICE_CPP_FLAG = "";
+ SLICE_INCLUDE_PATH = "";
+ STRIP_STYLE = debugging;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+ C01FCF4F08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "$(IDENTIFIER)";
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 7.0;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ C01FCF5008A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 7.0;
+ SDKROOT = iphoneos;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 14103B281CFC5E0E0097DE5A /* Build configuration list for PBXNativeTarget "C++11 Test Suite" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 14103B291CFC5E0E0097DE5A /* Debug */,
+ 14103B2A1CFC5E0E0097DE5A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 142B839D1B6BA7A600E28347 /* Build configuration list for PBXNativeTarget "C++98 Test Suite iOS 7" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 142B839E1B6BA7A600E28347 /* Debug */,
+ 142B839F1B6BA7A600E28347 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 144B48901A78F71F00C0E06B /* Build configuration list for PBXNativeTarget "C++98 Test Suite" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 144B48911A78F71F00C0E06B /* Debug */,
+ 144B48921A78F71F00C0E06B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C01FCF4E08A954540054247B /* Build configuration list for PBXProject "C++ Test Suite" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4F08A954540054247B /* Debug */,
+ C01FCF5008A954540054247B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
+}
diff --git a/cpp/test/ios/C++ Test Suite.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/cpp/test/ios/C++ Test Suite.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000000..0e7018e8c78
--- /dev/null
+++ b/cpp/test/ios/C++ Test Suite.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+ version = "1.0">
+ <FileRef
+ location = "self:/Users/benoit/Devel/GitHub/ice/cpp/test/ios/C++ Test Suite.xcodeproj">
+ </FileRef>
+</Workspace>
diff --git a/cpp/test/ios/C++11 Test Suite.plist b/cpp/test/ios/C++11 Test Suite.plist
new file mode 100644
index 00000000000..dd48f53e201
--- /dev/null
+++ b/cpp/test/ios/C++11 Test Suite.plist
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>Test Suite</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIcons</key>
+ <dict/>
+ <key>CFBundleIcons~ipad</key>
+ <dict/>
+ <key>CFBundleIdentifier</key>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>NSMainNibFile</key>
+ <string>MainWindow</string>
+ <key>NSMainNibFile~ipad</key>
+ <string>MainWindow-iPad</string>
+ <key>UIRequiresFullScreen</key>
+ <true/>
+</dict>
+</plist>
diff --git a/cpp/test/ios/C++98 Test Suite-Info.plist b/cpp/test/ios/C++98 Test Suite-Info.plist
new file mode 100644
index 00000000000..dd48f53e201
--- /dev/null
+++ b/cpp/test/ios/C++98 Test Suite-Info.plist
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>Test Suite</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIcons</key>
+ <dict/>
+ <key>CFBundleIcons~ipad</key>
+ <dict/>
+ <key>CFBundleIdentifier</key>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>NSMainNibFile</key>
+ <string>MainWindow</string>
+ <key>NSMainNibFile~ipad</key>
+ <string>MainWindow-iPad</string>
+ <key>UIRequiresFullScreen</key>
+ <true/>
+</dict>
+</plist>
diff --git a/cpp/test/ios/Classes/AppDelegate.h b/cpp/test/ios/Classes/AppDelegate.h
new file mode 100644
index 00000000000..46a667b55c9
--- /dev/null
+++ b/cpp/test/ios/Classes/AppDelegate.h
@@ -0,0 +1,37 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <UIKit/UIKit.h>
+
+@class TestViewController;
+
+@interface AppDelegate : NSObject <UIApplicationDelegate>
+{
+@private
+ UIWindow *window;
+ IBOutlet UINavigationController *navigationController;
+ NSArray* tests;
+ NSInteger currentTest;
+ NSString* protocol;
+ BOOL loop;
+ BOOL runAll;
+}
+
+@property (nonatomic, retain) IBOutlet UIWindow *window;
+@property (nonatomic, retain) IBOutlet UINavigationController* navigationController;
+@property (nonatomic, readonly) NSArray* tests;
+@property (nonatomic) NSInteger currentTest;
+@property (nonatomic, retain) NSString* protocol;
+@property (nonatomic) BOOL loop;
+@property (readonly) BOOL runAll;
+
+-(BOOL)testCompleted:(BOOL)success;
+
+@end
+
diff --git a/cpp/test/ios/Classes/AppDelegate.mm b/cpp/test/ios/Classes/AppDelegate.mm
new file mode 100644
index 00000000000..e22648a6778
--- /dev/null
+++ b/cpp/test/ios/Classes/AppDelegate.mm
@@ -0,0 +1,216 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <AppDelegate.h>
+#import <TestViewController.h>
+#import <TestUtil.h>
+
+struct TestData
+{
+ NSString* name;
+ NSString* prefix;
+ NSString* client;
+ NSString* server;
+ NSString* serverAMD;
+ NSString* collocated;
+ bool sslSupport;
+ bool wsSupport;
+ bool runWithSlicedFormat;
+ bool runWith10Encoding;
+ bool cpp11Support;
+};
+
+static NSString* protocols[] = { @"tcp", @"ssl", @"ws", @"wss" };
+const int nProtocols = sizeof(protocols) / sizeof(NSString*);
+
+static const struct TestData alltests[] =
+{
+//
+// | Name | lib base name | client | server | amdserver | collocated | ssl support | ws support | sliced | encoding 1.0 | cpp11 |
+//
+{ @"proxy", @"Ice_proxy", @"client.bundle", @"server.bundle", @"serveramd.bundle", @"collocated.bundle", true, true, false, false, true },
+{ @"operations", @"Ice_operations", @"client.bundle", @"server.bundle", @"serveramd.bundle", @"collocated.bundle", true, true, false, false, true },
+{ @"exceptions", @"Ice_exceptions", @"client.bundle", @"server.bundle", @"serveramd.bundle", @"collocated.bundle", true, true, true, true, true },
+{ @"ami", @"Ice_ami", @"client.bundle", @"server.bundle", 0, 0, true, true, false, false, true },
+{ @"info", @"Ice_info", @"client.bundle", @"server.bundle", 0, 0, true, true, false, false, true },
+{ @"inheritance", @"Ice_inheritance", @"client.bundle", @"server.bundle", 0, @"collocated.bundle", true, true, false, false, true},
+{ @"facets", @"Ice_facets", @"client.bundle", @"server.bundle", 0, @"collocated.bundle", true, true, false, false, true },
+{ @"objects", @"Ice_objects", @"client.bundle", @"server.bundle", 0, @"collocated.bundle", true, true, true, true, true },
+{ @"optional", @"Ice_optional", @"client.bundle", @"server.bundle", 0, 0, true, true, true, false, false },
+{ @"binding", @"Ice_binding", @"client.bundle", @"server.bundle", 0, 0, true, true, false, false, true },
+{ @"location", @"Ice_location", @"client.bundle", @"server.bundle", 0, 0, true, true, false, false, true },
+{ @"adapterDeactivation", @"Ice_adapterDeactivation", @"client.bundle", @"server.bundle", 0, @"collocated.bundle", true, true, false, false, true },
+{ @"slicing/exceptions", @"Ice_slicing_exceptions", @"client.bundle", @"server.bundle", @"serveramd.bundle", 0, true, true, false, true, true },
+{ @"slicing/objects", @"Ice_slicing_objects", @"client.bundle", @"server.bundle", @"serveramd.bundle", 0, true, true, false, true, true },
+{ @"dispatcher", @"Ice_dispatcher", @"client.bundle", @"server.bundle", 0, 0, true, true, false, false, true },
+{ @"stream", @"Ice_stream", @"client.bundle", 0, 0, 0, true, true, false, false, true },
+{ @"hold", @"Ice_hold", @"client.bundle", @"server.bundle", 0, 0, true, true, false, false, true },
+{ @"custom", @"Ice_custom", @"client.bundle", @"server.bundle", @"serveramd.bundle", @"collocated.bundle", true, true, false, false, false },
+{ @"retry", @"Ice_retry", @"client.bundle", @"server.bundle", 0, 0, true, true, false, false, true },
+{ @"timeout", @"Ice_timeout", @"client.bundle", @"server.bundle", 0, 0, true, true, false, false, true },
+{ @"interceptor", @"Ice_interceptor", @"client.bundle", 0, 0, 0, true, true, false, false, true },
+{ @"udp", @"Ice_udp", @"client.bundle", @"server.bundle", 0, 0, true, true, false, false, true },
+{ @"defaultServant", @"Ice_defaultServant", @"client.bundle", 0, 0, 0, true, true, false, false, true },
+{ @"defaultValue", @"Ice_defaultValue", @"client.bundle", 0, 0, 0, true, true, false, false, true },
+{ @"servantLocator", @"Ice_servantLocator", @"client.bundle", @"server.bundle", @"serveramd.bundle", @"collocated.bundle", true, true, false, false, true },
+{ @"invoke", @"Ice_invoke", @"client.bundle", @"server.bundle", 0, 0, true, true, false, false, true },
+{ @"hash", @"Ice_hash", @"client.bundle", 0, 0, 0, true, true, false, false, true },
+{ @"admin", @"Ice_admin", @"client.bundle", @"server.bundle", 0, 0, true, true, false, false, true },
+{ @"metrics", @"Ice_metrics", @"client.bundle", @"server.bundle", 0, 0, false, false, false, false, true },
+{ @"enums", @"Ice_enums", @"client.bundle", @"server.bundle", 0, 0, true, true, false, true, true },
+{ @"services", @"Ice_services", @"client.bundle", 0, 0, 0, true, true, false, false, true },
+};
+
+@implementation AppDelegate
+
+@synthesize window;
+@synthesize navigationController;
+@synthesize tests;
+@synthesize currentTest;
+@synthesize loop;
+@synthesize runAll;
+
+static NSString* currentTestKey = @"currentTestKey";
+static NSString* protocolKey = @"protocolKey";
+
++(void)initialize
+{
+ NSDictionary* appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
+ @"0", currentTestKey,
+ @"tcp", protocolKey,
+ nil];
+ [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
+}
+
+-(id)init
+{
+ if(self = [super init])
+ {
+ self->runAll = getenv("RUNALL") != NULL;
+
+ NSMutableArray* theTests = [NSMutableArray array];
+ for(int i = 0; i < sizeof(alltests)/sizeof(alltests[0]); ++i)
+ {
+ TestCase* test = [TestCase testWithName:alltests[i].name
+ prefix:alltests[i].prefix
+ client:alltests[i].client
+ server:alltests[i].server
+ serveramd:alltests[i].serverAMD
+ collocated:alltests[i].collocated
+ sslSupport:alltests[i].sslSupport
+ wsSupport:alltests[i].wsSupport
+ runWithSlicedFormat:alltests[i].runWithSlicedFormat
+ runWith10Encoding:alltests[i].runWith10Encoding
+ cpp11Support:alltests[i].cpp11Support];
+ [theTests addObject:test];
+ }
+ tests = [[theTests copy] retain];
+
+ // Initialize the application defaults.
+ currentTest = [[NSUserDefaults standardUserDefaults] integerForKey:currentTestKey];
+ if(runAll || currentTest < 0 || currentTest > tests.count)
+ {
+ currentTest = 0;
+ }
+
+ protocol = [[NSUserDefaults standardUserDefaults] stringForKey:protocolKey];
+ int i = 0;
+ for(; i < nProtocols; ++i)
+ {
+ if([protocols[i] isEqualToString:protocol])
+ {
+ break;
+ }
+ }
+ if(i == nProtocols)
+ {
+ protocol = @"tcp";
+ }
+
+ loop = NO;
+ }
+ return self;
+}
+
+- (void)applicationDidFinishLaunching:(UIApplication *)application
+{
+
+ // Override point for customization after app launch
+ [window setRootViewController:navigationController];
+ [window makeKeyAndVisible];
+}
+
+- (void)dealloc
+{
+ [tests release];
+ [protocol release];
+ [navigationController release];
+ [window release];
+ [super dealloc];
+}
+
+-(NSInteger)currentTest
+{
+ return currentTest;
+}
+
+-(void)setCurrentTest:(NSInteger)test
+{
+ currentTest = test;
+
+ [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInteger:currentTest] forKey:currentTestKey];
+}
+
+-(NSString*)protocol
+{
+ return protocol;
+}
+
+-(void)setProtocol:(NSString*)v
+{
+ protocol = [v retain];
+ [[NSUserDefaults standardUserDefaults] setObject:v forKey:protocolKey];
+}
+
+-(BOOL)testCompleted:(BOOL)success
+{
+ if(success)
+ {
+ self.currentTest = (currentTest+1) % tests.count;
+ if(runAll || loop)
+ {
+ if(self.currentTest == 0)
+ {
+ int i = 0;
+ for(; i < nProtocols; ++i)
+ {
+ if([protocols[i] isEqualToString:protocol])
+ {
+ break;
+ }
+ }
+
+ if(++i == nProtocols && !loop)
+ {
+ std::cout << "\n*** Finished running all tests" << std::endl;
+ return NO;
+ }
+ else
+ {
+ protocol = protocols[i % nProtocols];
+ return YES;
+ }
+ }
+ return YES;
+ }
+ }
+ return NO;
+}
+
+@end
diff --git a/cpp/test/ios/Classes/TestSelectController.h b/cpp/test/ios/Classes/TestSelectController.h
new file mode 100644
index 00000000000..97aac1a8fc3
--- /dev/null
+++ b/cpp/test/ios/Classes/TestSelectController.h
@@ -0,0 +1,26 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <UIKit/UIKit.h>
+
+@class TestViewController;
+
+@interface TestSelectController : UIViewController<UIPickerViewDataSource, UIPickerViewDelegate>
+{
+@private
+ IBOutlet UIPickerView* pickerView;
+ IBOutlet UISegmentedControl* protocol;
+ IBOutlet UISwitch* loopSwitch;
+ NSArray* tests;
+ TestViewController *testViewController;
+}
+
+-(IBAction)runTest:(id)sender;
+
+@end
diff --git a/cpp/test/ios/Classes/TestSelectController.m b/cpp/test/ios/Classes/TestSelectController.m
new file mode 100644
index 00000000000..1213096b0ec
--- /dev/null
+++ b/cpp/test/ios/Classes/TestSelectController.m
@@ -0,0 +1,130 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <TestSelectController.h>
+#import <TestUtil.h>
+#import <AppDelegate.h>
+#import <TestViewController.h>
+
+@interface TestSelectController()
+
+@property (nonatomic, retain) NSArray* tests;
+@property (nonatomic, retain) UIPickerView* pickerView;
+@property (nonatomic, retain) UISegmentedControl* protocol;
+@property (nonatomic, retain) TestViewController* testViewController;
+
+@end
+
+@implementation TestSelectController
+
+@synthesize tests;
+@synthesize pickerView;
+@synthesize protocol;
+@synthesize testViewController;
+
+- (void)viewDidLoad
+{
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ self.tests = appDelegate.tests;
+ [super viewDidLoad];
+}
+
+-(void)viewWillAppear:(BOOL)animated
+{
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ [pickerView selectRow:appDelegate.currentTest inComponent:0 animated:NO];
+ for (int i = 0; i != [self.protocol numberOfSegments]; ++i) {
+ if([[self.protocol titleForSegmentAtIndex:i] isEqualToString:[appDelegate.protocol uppercaseString]])
+ {
+ self.protocol.selectedSegmentIndex = i;
+ break;
+ }
+ }
+ if(appDelegate.runAll)
+ {
+ [self.navigationController pushViewController:self.testViewController animated:YES];
+ }
+ }
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
+{
+ // Return YES for supported orientations
+ return (interfaceOrientation == UIInterfaceOrientationPortrait);
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
+ // Release anything that's not essential, such as cached data
+}
+
+- (void)dealloc
+{
+ [tests release];
+ [pickerView release];
+ [protocol release];
+ [loopSwitch release];
+ [testViewController release];
+
+ [super dealloc];
+}
+
+-(TestViewController*)testViewController
+{
+ // Instantiate the test view controller if necessary.
+ if (testViewController == nil)
+ {
+ NSString* nib;
+ if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
+ {
+ nib = @"TestView-iPad";
+ }
+ else
+ {
+ nib = @"TestView";
+ }
+ testViewController = [[TestViewController alloc] initWithNibName:nib bundle:nil];
+ }
+ return testViewController;
+}
+
+#pragma mark -
+
+-(IBAction)runTest:(id)sender
+{
+ NSInteger row = [pickerView selectedRowInComponent:0];
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ appDelegate.currentTest = row;
+ appDelegate.protocol = [[protocol titleForSegmentAtIndex:[protocol selectedSegmentIndex]] lowercaseString];
+ appDelegate.loop = loopSwitch.isOn;
+
+ TestViewController* controller = self.testViewController;
+ [self.navigationController pushViewController:controller animated:YES];
+}
+
+#pragma mark UIPickerViewDelegate
+
+- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
+{
+ TestCase* test = (TestCase*)[tests objectAtIndex:row];
+ return test.name;
+}
+
+#pragma mark UIPickerViewDataSource
+
+- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
+{
+ return 1;
+}
+
+- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)componen
+{
+ return tests.count;
+}
+@end
diff --git a/cpp/test/ios/Classes/TestUtil.h b/cpp/test/ios/Classes/TestUtil.h
new file mode 100644
index 00000000000..07052aef28f
--- /dev/null
+++ b/cpp/test/ios/Classes/TestUtil.h
@@ -0,0 +1,138 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef TEST_UTIL_H
+#define TEST_UTIL_H
+
+#include <TestHelper.h>
+#include <UIKit/UIKit.h>
+#include <Foundation/NSString.h>
+
+@interface TestCase : NSObject
+{
+@private
+
+ NSString* name;
+ NSString* prefix;
+ NSString* client;
+ NSString* server;
+ NSString* serveramd;
+ NSString* collocated;
+ BOOL sslSupport;
+ BOOL wsSupport;
+ BOOL runWithSlicedFormat;
+ BOOL runWith10Encoding;
+ BOOL cpp11Support;
+}
+
++(id) testWithName:(NSString*)name
+ prefix:(NSString*) prefix
+ client:(NSString*) client
+ server:(NSString*) server
+ serveramd:(NSString*) serveramd
+ collocated:(NSString*) collocated
+ sslSupport:(BOOL) sslSupport
+ wsSupport:(BOOL) wsSupport
+ runWithSlicedFormat:(BOOL)runWithSlicedFormat
+ runWith10Encoding:(BOOL)runWith10Encoding
+ cpp11Support:(BOOL)cpp11Support;
+
+-(BOOL)hasServer;
+-(BOOL)hasAMDServer;
+-(BOOL)hasCollocated;
+-(BOOL)isProtocolSupported:(NSString*)protocol;
+
+@property (readonly) NSString* name;
+@property (readonly) NSString* prefix;
+@property (readonly) NSString* client;
+@property (readonly) NSString* server;
+@property (readonly) NSString* serveramd;
+@property (readonly) NSString* collocated;
+@property (readonly) BOOL sslSupport;
+@property (readonly) BOOL wsSupport;
+@property (readonly) BOOL runWithSlicedFormat;
+@property (readonly) BOOL runWith10Encoding;
+@property (readonly) BOOL cpp11Support;
+
+@end
+
+typedef int (*MAIN_ENTRY_POINT)(int argc, char** argv, Test::MainHelper* helper);
+typedef int (*SHUTDOWN_ENTRY_POINT)();
+
+enum TestConfigType { TestConfigTypeClient, TestConfigTypeServer, TestConfigTypeColloc };
+enum TestConfigOption {TestConfigOptionDefault, TestConfigOptionSliced, TestConfigOptionEncoding10 };
+
+struct TestConfig
+{
+ TestConfigType type;
+ TestConfigOption option;
+ std::string protocol;
+ bool hasServer;
+};
+
+class MainHelperI : public Test::MainHelper
+{
+public:
+
+ MainHelperI(const std::string& test, const std::string& libName, TestConfig config,
+ id target, SEL output, SEL ready) :
+ _test(test),
+ _libName(libName),
+ _config(config),
+ _completed(false),
+ _status(0),
+ _target(target),
+ _output(output),
+ _ready(ready)
+ {
+ }
+
+ virtual ~MainHelperI();
+
+ virtual void run();
+
+ virtual void serverReady();
+
+ virtual void shutdown();
+
+ virtual void waitForCompleted(){};
+
+ virtual bool redirect();
+
+ virtual void print(const std::string&);
+
+ int
+ status()
+ {
+ return _status;
+ }
+
+private:
+
+ void
+ completed(int status)
+ {
+ _completed = true;
+ _status = status;
+ }
+
+ std::string _test;
+ std::string _libName;
+ TestConfig _config;
+ CFBundleRef _handle;
+ SHUTDOWN_ENTRY_POINT _dllTestShutdown;
+ bool _completed;
+ int _status;
+
+ id _target;
+ SEL _ready;
+ SEL _output;
+};
+
+#endif
diff --git a/cpp/test/ios/Classes/TestUtil.mm b/cpp/test/ios/Classes/TestUtil.mm
new file mode 100644
index 00000000000..d94fc1ce62b
--- /dev/null
+++ b/cpp/test/ios/Classes/TestUtil.mm
@@ -0,0 +1,296 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <TestUtil.h>
+#include <dlfcn.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include <vector>
+#include <string>
+
+#import <Foundation/NSString.h>
+#import <Foundation/NSObject.h>
+#import <Foundation/NSThread.h>
+
+@implementation TestCase
+
+@synthesize name;
+@synthesize prefix;
+@synthesize server;
+@synthesize client;
+@synthesize serveramd;
+@synthesize collocated;
+@synthesize sslSupport;
+@synthesize wsSupport;
+@synthesize runWithSlicedFormat;
+@synthesize runWith10Encoding;
+@synthesize cpp11Support;
+
++(id)testWithName:(NSString*)name
+ prefix:(NSString*) prefix
+ client:(NSString*) client
+ server:(NSString*) server
+ serveramd:(NSString*) serveramd
+ collocated:(NSString*) collocated
+ sslSupport:(BOOL) sslSupport
+ wsSupport:(BOOL) wsSupport
+ runWithSlicedFormat:(BOOL)runWithSlicedFormat
+ runWith10Encoding:(BOOL)runWith10Encoding
+ cpp11Support:(BOOL)cpp11Support
+{
+ TestCase* t = [[TestCase alloc] init];
+ if(t != nil)
+ {
+ t->name = name;
+ t->prefix = prefix;
+ t->client = client;
+ t->server = server;
+ t->serveramd = serveramd;
+ t->collocated = collocated;
+ t->sslSupport = sslSupport;
+ t->wsSupport = wsSupport;
+ t->runWithSlicedFormat = runWithSlicedFormat;
+ t->runWith10Encoding = runWith10Encoding;
+ t->cpp11Support = cpp11Support;
+ }
+ return [t autorelease];
+}
+
+-(BOOL) hasServer
+{
+ return server != 0;
+}
+
+-(BOOL) hasAMDServer
+{
+ return serveramd != 0;
+}
+
+-(BOOL) hasCollocated
+{
+ return collocated != 0;
+}
+
+-(BOOL)isProtocolSupported:(NSString*)protocol
+{
+ BOOL supported = YES;
+ if(!sslSupport)
+ {
+ supported &= [protocol isEqualToString:@"tcp"] || [protocol isEqualToString:@"ws"];
+ }
+ if(!wsSupport)
+ {
+ supported &= [protocol isEqualToString:@"tcp"] || [protocol isEqualToString:@"ssl"];
+ }
+ return supported;
+}
+-(void)dealloc
+{
+ [name release];
+ [prefix release];
+ [client release];
+ [server release];
+ [serveramd release];
+ [collocated release];
+ [super dealloc];
+}
+
+@end
+
+MainHelperI::~MainHelperI()
+{
+ if(_handle)
+ {
+ CFBundleUnloadExecutable(_handle);
+ }
+}
+
+void
+MainHelperI::run()
+{
+ //
+ // Compose the path of the Test.bundle resources folder
+ //
+ NSString* bundlePath = [[NSBundle mainBundle] privateFrameworksPath];
+
+ bundlePath = [bundlePath stringByAppendingPathComponent:[NSString stringWithUTF8String:_libName.c_str()]];
+
+ NSURL* bundleURL = [NSURL fileURLWithPath:bundlePath];
+ _handle = CFBundleCreate(NULL, (CFURLRef)bundleURL);
+
+ int status = EXIT_FAILURE;
+ NSError* error = nil;
+ Boolean loaded = CFBundleLoadExecutableAndReturnError(_handle, (CFErrorRef*)&error);
+ if(error != nil || !loaded)
+ {
+ print([[error description] UTF8String]);
+ completed(status);
+ return;
+ }
+
+ void* sym = dlsym(_handle, "dllTestShutdown");
+ sym = CFBundleGetFunctionPointerForName(_handle, CFSTR("dllTestShutdown"));
+ if(sym == 0)
+ {
+ NSString* err = [NSString stringWithFormat:@"Could not get function pointer dllTestShutdown from bundle %@",
+ bundlePath];
+ print([err UTF8String]);
+ completed(status);
+ return;
+ }
+ _dllTestShutdown = (SHUTDOWN_ENTRY_POINT)sym;
+
+ sym = CFBundleGetFunctionPointerForName(_handle, CFSTR("dllMain"));
+ if(sym == 0)
+ {
+ NSString* err = [NSString stringWithFormat:@"Could not get function pointer dllMain from bundle %@",
+ bundlePath];
+ print([err UTF8String]);
+ completed(status);
+ return;
+ }
+
+ MAIN_ENTRY_POINT dllMain = (MAIN_ENTRY_POINT)sym;
+
+ std::vector<std::string> args;
+ if(_config.type == TestConfigTypeServer)
+ {
+ args.push_back("server");
+ }
+ else
+ {
+ args.push_back("client");
+ }
+ args.push_back("--Ice.NullHandleAbort=1");
+ args.push_back("--Ice.Warn.Connections=1");
+ args.push_back("--Ice.Default.Host=127.0.0.1");
+ args.push_back("--Ice.Trace.Network=0");
+ args.push_back("--Ice.Trace.Protocol=0");
+
+ if(_config.type == TestConfigTypeServer)
+ {
+ args.push_back("--Ice.ThreadPool.Server.Size=1");
+ args.push_back("--Ice.ThreadPool.Server.SizeMax=3");
+ args.push_back("--Ice.ThreadPool.Server.SizeWarn=0");
+ //args.push_back("--Ice.PrintAdapterReady=1");
+ args.push_back("--Ice.ServerIdleTime=30");
+ }
+
+ args.push_back("--Ice.Default.Protocol=" + _config.protocol);
+ if(_config.protocol == "ssl" || _config.protocol == "wss")
+ {
+ args.push_back("--IceSSL.CAs=cacert.der");
+ args.push_back("--IceSSL.CheckCertName=0");
+ if(_config.type == TestConfigTypeServer)
+ {
+ args.push_back("--IceSSL.CertFile=server.p12");
+ }
+ else
+ {
+ args.push_back("--IceSSL.CertFile=client.p12");
+ }
+ args.push_back("--IceSSL.Password=password");
+ args.push_back("--Ice.Override.ConnectTimeout=10000"); // COMPILERFIX: Workaround for SSL hang on iOS devices
+ }
+
+ if(_config.option == TestConfigOptionSliced)
+ {
+ args.push_back("--Ice.Default.SlicedFormat");
+ }
+ else if(_config.option == TestConfigOptionEncoding10)
+ {
+ args.push_back("--Ice.Default.EncodingVersion=1.0");
+ }
+
+ if(_config.type == TestConfigTypeServer)
+ {
+ if(_libName.find("serveramd") != std::string::npos)
+ {
+ print("Running test with AMD server & ");
+ }
+ else
+ {
+ print("Running test with ");
+ }
+ }
+ else if(_config.type == TestConfigTypeClient || _config.type == TestConfigTypeColloc)
+ {
+ if(_config.type == TestConfigTypeColloc)
+ {
+ print("Running collocated test with ");
+ }
+ else if(!_config.hasServer)
+ {
+ print("Running test with ");
+ }
+ print(_config.protocol + " and ");
+ if(_config.option == TestConfigOptionDefault)
+ {
+ print("default format.\n");
+ }
+ else if(_config.option == TestConfigOptionSliced)
+ {
+ print("sliced format.\n");
+ }
+ else if(_config.option == TestConfigOptionEncoding10)
+ {
+ print("1.0 encoding.\n");
+ }
+ }
+
+ char** argv = new char*[args.size() + 1];
+ for(unsigned int i = 0; i < args.size(); ++i)
+ {
+ argv[i] = const_cast<char*>(args[i].c_str());
+ }
+ argv[args.size()] = 0;
+ try
+ {
+ status = dllMain(static_cast<int>(args.size()), argv, this);
+ }
+ catch(const std::exception& ex)
+ {
+ print("unexpected exception while running `" + _test + "':\n" + ex.what());
+ }
+ catch(...)
+ {
+ print("unexpected unknown exception while running `" + _test + "'");
+ }
+ completed(status);
+ delete[] argv;
+}
+
+void
+MainHelperI::serverReady()
+{
+ [_target performSelectorOnMainThread:_ready withObject:nil waitUntilDone:NO];
+}
+
+void
+MainHelperI::shutdown()
+{
+ if(_dllTestShutdown)
+ {
+ _dllTestShutdown();
+ }
+}
+
+bool
+MainHelperI::redirect()
+{
+ return _config.type == TestConfigTypeClient || _config.type == TestConfigTypeColloc;
+}
+
+void
+MainHelperI::print(const std::string& msg)
+{
+ [_target performSelectorOnMainThread:_output withObject:[NSString stringWithUTF8String: msg.c_str()]
+ waitUntilDone:NO];
+}
diff --git a/cpp/test/ios/Classes/TestViewController.h b/cpp/test/ios/Classes/TestViewController.h
new file mode 100644
index 00000000000..697e274f583
--- /dev/null
+++ b/cpp/test/ios/Classes/TestViewController.h
@@ -0,0 +1,30 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <UIKit/UIKit.h>
+#import <TestUtil.h>
+
+@interface TestViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>
+{
+@private
+ IBOutlet UITableView* output;
+ IBOutlet UIActivityIndicatorView* activity;
+ IBOutlet UIButton* nextButton;
+
+ NSMutableString* currentMessage;
+ NSMutableArray* messages;
+ NSOperationQueue* queue;
+ TestCase* test;
+ NSEnumerator* testRunEnumator;
+ bool reloadScheduled;
+}
+-(IBAction)next:(id)sender;
+-(NSOperationQueue*) queue;
+@end
+
diff --git a/cpp/test/ios/Classes/TestViewController.mm b/cpp/test/ios/Classes/TestViewController.mm
new file mode 100644
index 00000000000..d6e68e06ef1
--- /dev/null
+++ b/cpp/test/ios/Classes/TestViewController.mm
@@ -0,0 +1,580 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <TestViewController.h>
+#import <TestUtil.h>
+#import <AppDelegate.h>
+//
+// Avoid warning for undocumented method.
+//
+@interface UIApplication(UndocumentedAPI)
+-(void)launchApplicationWithIdentifier:(NSString*)id suspended:(BOOL)flag;
+@end
+
+// TODO: Would be nice to have a red font for fatal, and error messages.
+@interface MessageCell : UITableViewCell
+{
+@private
+ UILabel* body;
+}
+
+@property (nonatomic, retain) UILabel* body;
+
++(CGFloat)heightForMessage:(NSString*)messsage;
+
+@end
+
+@implementation MessageCell
+@synthesize body;
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
+{
+ if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])
+ {
+ body = [[UILabel alloc] initWithFrame:CGRectZero];
+ body.textColor = [UIColor blackColor];
+ body.font = [UIFont boldSystemFontOfSize:14];
+ body.numberOfLines = 0;
+
+ [self.contentView addSubview:self.body];
+ }
+
+ return self;
+}
+
++(CGFloat)heightForMessage:(NSString*)text
+{
+ // The header is always one line, the body is multiple lines.
+ // The width of the table is 320 - 20px of left & right padding. We don't want to let the body
+ // text go past 200px.
+ CGRect body = [text boundingRectWithSize:CGSizeMake(300.f, 200.0f) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:14] } context:nil];
+ return body.size.height + 20.f;
+}
+
+- (void)layoutSubviews
+{
+ [super layoutSubviews];
+
+ CGRect contentRect = self.contentView.bounds;
+
+ CGRect bodyFrame = CGRectMake(10.f, 0.f, CGRectGetWidth(contentRect)-20.f, CGRectGetHeight(contentRect));
+
+ self.body.frame = bodyFrame;
+}
+
+- (void)dealloc
+{
+ [body release];
+ [super dealloc];
+}
+
+-(void)setMessage:(NSString*)m
+{
+ self.body.text = m;
+}
+
+@end
+
+@interface TestViewController()
+
+@property (nonatomic, retain) UITableView* output;
+@property (nonatomic, retain) UIActivityIndicatorView* activity;
+@property (nonatomic, retain) UIButton* nextButton;
+
+@property (nonatomic, retain) NSMutableString* currentMessage;
+@property (nonatomic, retain) NSMutableArray* messages;
+@property (nonatomic, retain) NSOperationQueue* queue;
+@property (retain) TestCase* test;
+
+-(void)add:(NSString*)d;
+-(void)startTest;
+@end
+
+@interface TestRun : NSObject
+{
+ TestConfigOption option;
+ TestCase* test;
+ NSString* server;
+ NSString* client;
+ BOOL collocated;
+
+ int completed;
+ int running;
+ int error;
+ MainHelperI* clientHelper;
+ MainHelperI* serverHelper;
+ TestViewController* viewController;
+}
+
++(id) testRunClient:(TestCase*)test;
++(id) testRunCollocated:(TestCase*)test;
++(id) testRunClientAMDServer:(TestCase*)test;
++(id) testRunClientServer:(TestCase*)test;
++(id) testRunClientServerWithConfigOption:(TestCase*)test option:(TestConfigOption)option;
++(id) testRunClientAMDServerWithConfigOption:(TestCase*)test option:(TestConfigOption)option;
+
+-(NSInvocationOperation*) runInvocation:(TestViewController*)callback;
+@end
+
+@implementation TestViewController
+
+@synthesize output;
+@synthesize activity;
+@synthesize nextButton;
+@synthesize currentMessage;
+@synthesize messages;
+@synthesize queue;
+@synthesize test;
+
+- (void)viewDidLoad
+{
+ self.currentMessage = [NSMutableString string];
+ self.messages = [NSMutableArray array];
+ queue = [[NSOperationQueue alloc] init];
+ self.queue.maxConcurrentOperationCount = 2; // We need at least 2 concurrent operations.
+
+ [super viewDidLoad];
+}
+
+-(void)viewWillAppear:(BOOL)animated
+{
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ self.test = (TestCase*)[appDelegate.tests objectAtIndex:appDelegate.currentTest];
+ [self startTest];
+}
+
+-(void)viewWillDisappear:(BOOL)animated
+{
+ // TODO: Waiting isn't possible until the tests periodically find out whether
+ // they should terminate.
+ // Wait until the tests are complete.
+ //[queue waitUntilAllOperationsAreFinished];
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
+{
+ // Return YES for supported orientations
+ return (interfaceOrientation == UIInterfaceOrientationPortrait);
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
+ // Release anything that's not essential, such as cached data
+}
+
+- (void)dealloc
+{
+ [output release];
+ [activity release];
+ [nextButton release];
+
+ [currentMessage release];
+ [messages release];
+ [queue release];
+ [test release];
+
+ [super dealloc];
+}
+
+#pragma mark -
+
+-(void)startTest
+{
+ self.title = test.name;
+ [self.navigationItem setHidesBackButton:YES animated:YES];
+
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ if(appDelegate.loop)
+ {
+ [nextButton setTitle:@"Stop running" forState:UIControlStateNormal];
+ }
+ else
+ {
+ nextButton.enabled = NO;
+ [nextButton setAlpha:0.5];
+ [nextButton setTitle:@"Test is running" forState:UIControlStateDisabled];
+ }
+
+ [currentMessage deleteCharactersInRange:NSMakeRange(0, currentMessage.length)];
+ [messages removeAllObjects];
+ [output reloadData];
+
+ [activity startAnimating];
+ if(![test isProtocolSupported:appDelegate.protocol])
+ {
+ [self testComplete:YES];
+ return;
+ }
+#ifdef ICE_CPP11_MAPPING
+ if(!test.cpp11Support)
+ {
+ [self add:@"C++11 not supported by this test\n"];
+ [self testComplete:YES];
+ return;
+ }
+#endif
+
+ NSMutableArray* testRuns = [NSMutableArray array];
+ if([test hasServer])
+ {
+ [testRuns addObject:[TestRun testRunClientServer:test]];
+ if([test hasAMDServer])
+ {
+ [testRuns addObject:[TestRun testRunClientAMDServer:test]];
+ }
+ if(test.runWithSlicedFormat)
+ {
+ [testRuns addObject:[TestRun testRunClientServerWithConfigOption:test option:TestConfigOptionSliced]];
+ if([test hasAMDServer])
+ {
+ [testRuns addObject:[TestRun testRunClientAMDServerWithConfigOption:test option:TestConfigOptionSliced]];
+ }
+ }
+ if(test.runWith10Encoding)
+ {
+ [testRuns addObject:[TestRun testRunClientServerWithConfigOption:test option:TestConfigOptionEncoding10]];
+ if([test hasAMDServer])
+ {
+ [testRuns addObject:[TestRun testRunClientAMDServerWithConfigOption:test option:TestConfigOptionEncoding10]];
+ }
+ }
+ }
+ else
+ {
+ [testRuns addObject:[TestRun testRunClient:test]];
+ }
+ if([test hasCollocated])
+ {
+ [testRuns addObject:[TestRun testRunCollocated:test]];
+ }
+
+ testRunEnumator = [[testRuns objectEnumerator] retain];
+ id testRun = [testRunEnumator nextObject];
+ [queue addOperation:[testRun runInvocation:self]];
+}
+-(void)testRunComplete:(BOOL)success
+{
+ if(!success)
+ {
+ [self testComplete:NO];
+ return;
+ }
+
+ id testRun = [testRunEnumator nextObject];
+ if(testRun == nil)
+ {
+ [self testComplete:YES];
+ }
+ else
+ {
+ [queue addOperation:[testRun runInvocation:self]];
+ }
+}
+
+-(void)testComplete:(BOOL)success
+{
+ [activity stopAnimating];
+
+ nextButton.enabled = YES;
+ [nextButton setAlpha:1.0];
+ [self.navigationItem setHidesBackButton:NO animated:YES];
+
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ TestCase* nextTest = (TestCase*)[appDelegate.tests objectAtIndex:(appDelegate.currentTest+1)%(appDelegate.tests.count)];
+ NSString* buttonTitle = [NSString stringWithFormat:@"Run %@", nextTest.name];
+ [nextButton setTitle:buttonTitle forState:UIControlStateNormal];
+ self.test = nil;
+ [testRunEnumator release];
+ testRunEnumator = nil;
+
+ if([appDelegate testCompleted:success])
+ {
+ NSAssert(test == nil, @"test == nil");
+ self.test = (TestCase*)[appDelegate.tests objectAtIndex:appDelegate.currentTest];
+ [self startTest];
+ }
+}
+
+-(IBAction)next:(id)sender
+{
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ if(appDelegate.loop)
+ {
+ appDelegate.loop = NO;
+ nextButton.enabled = NO;
+ [nextButton setAlpha:0.5];
+ [nextButton setTitle:@"Waiting..." forState:UIControlStateDisabled];
+ }
+ else
+ {
+ NSAssert(test == nil, @"test == nil");
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ self.test = (TestCase*)[appDelegate.tests objectAtIndex:appDelegate.currentTest];
+ [self startTest];
+ }
+}
+-(NSOperationQueue*) queue
+{
+ return queue;
+}
+-(void)add:(NSString*)s
+{
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ if(appDelegate.runAll)
+ {
+ printf("%s", [s UTF8String]);
+ }
+
+ [currentMessage appendString:s];
+ NSRange range = [currentMessage rangeOfString:@"\n" options:NSBackwardsSearch];
+ if(range.location != NSNotFound)
+ {
+ [messages addObject:[[currentMessage copy] autorelease]];
+ [currentMessage deleteCharactersInRange:NSMakeRange(0, currentMessage.length)];
+
+ // reloadData hangs if called too rapidly... we call at most every 100ms.
+ if(!reloadScheduled) {
+ reloadScheduled = TRUE;
+ [self performSelector:@selector(reloadOutput) withObject:nil afterDelay:0.1];
+ }
+ }
+}
+-(void) reloadOutput
+{
+ reloadScheduled = FALSE;
+ [output reloadData];
+
+ if(messages.count == 0)
+ {
+ return;
+ }
+
+ NSUInteger path[] = {0, messages.count -1};
+ [output scrollToRowAtIndexPath:[NSIndexPath indexPathWithIndexes:path length:2]
+ atScrollPosition:UITableViewScrollPositionBottom
+ animated:NO];
+
+}
+
+#pragma mark <UITableViewDelegate, UITableViewDataSource> Methods
+
+-(NSInteger)numberOfSectionsInTableView:(UITableView *)tv
+{
+ return 1;
+}
+
+-(NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section
+{
+ return messages.count;
+}
+
+-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+ if([messages count] <= indexPath.row)
+ {
+ return [MessageCell heightForMessage:@""];
+ }
+ return [MessageCell heightForMessage:[messages objectAtIndex:indexPath.row]];
+}
+
+-(UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+ MessageCell *cell = (MessageCell*)[output dequeueReusableCellWithIdentifier:@"MessageCell"];
+ if(cell == nil)
+ {
+ cell = [[[MessageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MessageCell"] autorelease];
+ }
+ [cell setMessage:[messages objectAtIndex:indexPath.row]];
+ return cell;
+}
+
+-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+ return nil;
+}
+
+@end
+
+@implementation TestRun
+-(id) init:(TestCase*)t client:(NSString*)cl server:(NSString*)srv option:(TestConfigOption)opt
+{
+ self = [super init];
+ if(!self)
+ {
+ return nil;
+ }
+ self->test = t;
+ self->client = cl;
+ self->server = srv;
+ self->option = opt;
+ self->clientHelper = 0;
+ self->serverHelper = 0;
+ self->completed = 0;
+ self->error = 0;
+ self->running = 0;
+ self->collocated = NO;
+ return self;
+}
+
++(id) testRunCollocated:(TestCase*)test
+{
+ TestRun* r;
+ r = [[[TestRun alloc] init:test client:test.collocated server:nil option:TestConfigOptionDefault] autorelease];
+ r->collocated = YES;
+ return r;
+}
++(id) testRunClient:(TestCase*)test
+{
+ return [[[TestRun alloc] init:test client:test.client server:nil option:TestConfigOptionDefault] autorelease];
+}
++(id) testRunClientServer:(TestCase*)test
+{
+ return [[[TestRun alloc] init:test client:test.client server:test.server option:TestConfigOptionDefault] autorelease];
+}
++(id) testRunClientAMDServer:(TestCase*)test
+{
+ return [[[TestRun alloc] init:test client:test.client server:test.serveramd option:TestConfigOptionDefault] autorelease];
+}
++(id) testRunClientServerWithConfigOption:(TestCase*)test option:(TestConfigOption)option
+{
+ return [[[TestRun alloc] init:test client:test.client server:test.server option:option] autorelease];
+}
++(id) testRunClientAMDServerWithConfigOption:(TestCase*)test option:(TestConfigOption)option
+{
+ return [[[TestRun alloc] init:test client:test.client server:test.serveramd option:option] autorelease];
+}
+
+-(NSInvocationOperation*) runInvocation:(TestViewController*)ctl
+{
+ viewController = ctl;
+ return [[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil] autorelease];
+}
+-(void)run
+{
+ AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
+ if(appDelegate.runAll)
+ {
+ printf("\n*** running %s test %ld/%lu ...\n", [test.name UTF8String], (long)appDelegate.currentTest + 1,
+ (unsigned long)[appDelegate.tests count]);
+ printf("*** protocol: %s\n", [appDelegate.protocol UTF8String]);
+ fflush(stdout);
+ }
+ if(server)
+ {
+ [self runServer];
+ }
+ else
+ {
+ [self runClient];
+ }
+}
+-(void)add:(NSString*)s
+{
+ [viewController add:s];
+}
+
+-(void)clientComplete:(NSNumber*)rc
+{
+ if(clientHelper)
+ {
+ delete clientHelper;
+ clientHelper = 0;
+ }
+
+ if([rc intValue] != 0)
+ {
+ [viewController add:[NSString stringWithFormat:@"client error: %@!\n", rc]];
+ if(serverHelper)
+ {
+ serverHelper->shutdown();
+ }
+ ++error;
+ }
+
+ completed++;
+ if(!server || completed == 2)
+ {
+ [viewController testRunComplete:error == 0];
+ }
+}
+
+// Run in a separate thread.
+-(void)runClient
+{
+ AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
+ running++;
+
+ std::string name = [[test name] UTF8String];
+ std::string prefix = std::string("test_") + [[test prefix] UTF8String];
+ std::string clt = [client UTF8String];
+
+ TestConfig config;
+ config.protocol = [[appDelegate protocol] UTF8String];
+ config.type = collocated ? TestConfigTypeColloc : TestConfigTypeClient;
+ config.option = option;
+ config.hasServer = [test hasServer];
+
+ clientHelper = new MainHelperI(name, prefix + "/" + clt, config, self, @selector(add:), @selector(serverReady));
+ clientHelper->run();
+ int rc = clientHelper->status();
+ [self performSelectorOnMainThread:@selector(clientComplete:) withObject:[NSNumber numberWithInt:rc] waitUntilDone:NO];
+}
+
+-(void)serverComplete:(NSNumber*)rc
+{
+ if(serverHelper)
+ {
+ delete serverHelper;
+ serverHelper = 0;
+ }
+
+ if([rc intValue] != 0)
+ {
+ [viewController add:[NSString stringWithFormat:@"server error: %@!\n", rc]];
+ ++error;
+ }
+ completed++;
+ if(completed == 2)
+ {
+ [viewController testRunComplete:error == 0];
+ }
+}
+
+// Run in a separate thread.
+-(void)runServer
+{
+ AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
+ running++;
+ std::string name = [[test name] UTF8String];
+ std::string prefix = std::string("test_") + [[test prefix] UTF8String];
+ std::string srv = [server UTF8String];
+
+ TestConfig config;
+ config.protocol = [[appDelegate protocol] UTF8String];
+ config.type = TestConfigTypeServer;
+ config.option = option;
+ config.hasServer = true;
+
+ serverHelper = new MainHelperI(name, prefix + "/" + srv, config, self, @selector(add:), @selector(serverReady));
+ serverHelper->run();
+ int rc = serverHelper->status();
+ [self performSelectorOnMainThread:@selector(serverComplete:) withObject:[NSNumber numberWithInt:rc] waitUntilDone:NO];
+}
+
+// Kick off the client.
+-(void)serverReady
+{
+ [[viewController queue] addOperation:[[[NSInvocationOperation alloc]
+ initWithTarget:self
+ selector:@selector(runClient)
+ object:nil] autorelease]];
+}
+
+@end
diff --git a/cpp/test/ios/Default-568h@2x.png b/cpp/test/ios/Default-568h@2x.png
new file mode 100644
index 00000000000..0891b7aabfc
--- /dev/null
+++ b/cpp/test/ios/Default-568h@2x.png
Binary files differ
diff --git a/cpp/test/ios/Images.xcassets/AppIcon.appiconset/Contents.json b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000000..93f4f1ff22c
--- /dev/null
+++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,80 @@
+{
+ "images" : [
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "test_suite-Small@2x-1.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "test_suite-Small@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "test_suite-Small-40@2x-1.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "test_suite-Small-40@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "test_suite-Small-40@3x-1.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "New icon-60@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "test_suite-Small.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "test_suite-Small@2x-2.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "test_suite-Small-40.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "test_suite-Small-40@2x-2.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "test_suite-76.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "test_suite-76@2x.png",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/cpp/test/ios/Images.xcassets/AppIcon.appiconset/New icon-60@3x.png b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/New icon-60@3x.png
new file mode 100644
index 00000000000..a37f851e642
--- /dev/null
+++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/New icon-60@3x.png
Binary files differ
diff --git a/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76.png b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76.png
new file mode 100644
index 00000000000..2855a8b674b
--- /dev/null
+++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76.png
Binary files differ
diff --git a/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76@2x.png b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76@2x.png
new file mode 100644
index 00000000000..29047dc5a52
--- /dev/null
+++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76@2x.png
Binary files differ
diff --git a/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40.png b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40.png
new file mode 100644
index 00000000000..e76086fb3d6
--- /dev/null
+++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40.png
Binary files differ
diff --git a/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-1.png b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-1.png
new file mode 100644
index 00000000000..7615d3255bc
--- /dev/null
+++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-1.png
Binary files differ
diff --git a/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-2.png b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-2.png
new file mode 100644
index 00000000000..7615d3255bc
--- /dev/null
+++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-2.png
Binary files differ
diff --git a/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x-1.png b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x-1.png
new file mode 100644
index 00000000000..f04f442176a
--- /dev/null
+++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x-1.png
Binary files differ
diff --git a/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x.png b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x.png
new file mode 100644
index 00000000000..f04f442176a
--- /dev/null
+++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x.png
Binary files differ
diff --git a/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small.png b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small.png
new file mode 100644
index 00000000000..d57695edc28
--- /dev/null
+++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small.png
Binary files differ
diff --git a/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-1.png b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-1.png
new file mode 100644
index 00000000000..79edc547e2c
--- /dev/null
+++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-1.png
Binary files differ
diff --git a/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-2.png b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-2.png
new file mode 100644
index 00000000000..79edc547e2c
--- /dev/null
+++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-2.png
Binary files differ
diff --git a/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@3x.png b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@3x.png
new file mode 100644
index 00000000000..49cdc033096
--- /dev/null
+++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@3x.png
Binary files differ
diff --git a/cpp/test/ios/MainWindow-iPad.xib b/cpp/test/ios/MainWindow-iPad.xib
new file mode 100644
index 00000000000..1313995e567
--- /dev/null
+++ b/cpp/test/ios/MainWindow-iPad.xib
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="UIApplication">
+ <connections>
+ <outlet property="delegate" destination="3" id="4"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <customObject id="3" userLabel="container App Delegate" customClass="AppDelegate">
+ <connections>
+ <outlet property="navigationController" destination="17" id="21"/>
+ <outlet property="window" destination="12" id="14"/>
+ </connections>
+ </customObject>
+ <navigationController id="17">
+ <extendedEdge key="edgesForExtendedLayout"/>
+ <navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="19">
+ <autoresizingMask key="autoresizingMask"/>
+ <animations/>
+ </navigationBar>
+ <viewControllers>
+ <viewController nibName="TestSelect-iPad" id="18" customClass="TestSelectController">
+ <extendedEdge key="edgesForExtendedLayout"/>
+ <navigationItem key="navigationItem" title="Ice Test Suite" id="20"/>
+ </viewController>
+ </viewControllers>
+ <metadata/>
+ </navigationController>
+ <window opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="12">
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ <metadata/>
+ </window>
+ </objects>
+</document>
diff --git a/cpp/test/ios/MainWindow.xib b/cpp/test/ios/MainWindow.xib
new file mode 100644
index 00000000000..c555914dca2
--- /dev/null
+++ b/cpp/test/ios/MainWindow.xib
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="UIApplication">
+ <connections>
+ <outlet property="delegate" destination="3" id="4"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <customObject id="3" userLabel="container App Delegate" customClass="AppDelegate">
+ <connections>
+ <outlet property="navigationController" destination="17" id="21"/>
+ <outlet property="window" destination="12" id="14"/>
+ </connections>
+ </customObject>
+ <navigationController id="17">
+ <extendedEdge key="edgesForExtendedLayout"/>
+ <navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="19">
+ <autoresizingMask key="autoresizingMask"/>
+ <animations/>
+ </navigationBar>
+ <viewControllers>
+ <viewController nibName="TestSelect" wantsFullScreenLayout="YES" id="18" customClass="TestSelectController">
+ <extendedEdge key="edgesForExtendedLayout"/>
+ <navigationItem key="navigationItem" title="Ice C++ Test Suite" id="20"/>
+ </viewController>
+ </viewControllers>
+ </navigationController>
+ <window opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="12">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ </window>
+ </objects>
+</document>
diff --git a/cpp/test/ios/README.md b/cpp/test/ios/README.md
new file mode 100644
index 00000000000..32aa3ae9232
--- /dev/null
+++ b/cpp/test/ios/README.md
@@ -0,0 +1,6 @@
+This project builds the IceTouch C++ Test Suite application for running tests with the
+iOS simulator or on an iOS device.
+
+You should use the "IceTouch C++ Test Suite iOS 7" target if you plan to run the tests on
+an iOS 7.x device, use the "IceTouch C++ Test Suite" target otherwise. Bundles are not signed
+with the iOS 7 target (iOS 7.x doesn't support loading signed bundles).
diff --git a/cpp/test/ios/TestSelect-iPad.xib b/cpp/test/ios/TestSelect-iPad.xib
new file mode 100644
index 00000000000..77817e380d6
--- /dev/null
+++ b/cpp/test/ios/TestSelect-iPad.xib
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="TestSelectController">
+ <connections>
+ <outlet property="loopSwitch" destination="13" id="15"/>
+ <outlet property="pickerView" destination="3" id="9"/>
+ <outlet property="protocol" destination="18" id="19"/>
+ <outlet property="view" destination="1" id="8"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view contentMode="scaleToFill" id="1">
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <pickerView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="3">
+ <rect key="frame" x="20" y="20" width="728" height="216"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <connections>
+ <outlet property="dataSource" destination="-1" id="5"/>
+ <outlet property="delegate" destination="-1" id="6"/>
+ </connections>
+ </pickerView>
+ <button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="4">
+ <rect key="frame" x="326" y="373" width="117" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Execute Test">
+ <color key="titleShadowColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="disabled" title="Execute Test"/>
+ <state key="selected" title="Execute Test"/>
+ <state key="highlighted" title="Execute Test">
+ <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ </state>
+ <connections>
+ <action selector="runTest:" destination="-1" eventType="touchUpInside" id="7"/>
+ </connections>
+ </button>
+ <switch opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" id="13">
+ <rect key="frame" x="381" y="321" width="51" height="31"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ </switch>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" text="Loop" lineBreakMode="tailTruncation" minimumFontSize="10" id="14">
+ <rect key="frame" x="310" y="324" width="42" height="21"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" id="18">
+ <rect key="frame" x="279" y="256" width="210" height="29"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <segments>
+ <segment title="TCP"/>
+ <segment title="SSL"/>
+ <segment title="WS"/>
+ <segment title="WSS"/>
+ </segments>
+ </segmentedControl>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ </view>
+ </objects>
+</document>
diff --git a/cpp/test/ios/TestSelect.xib b/cpp/test/ios/TestSelect.xib
new file mode 100644
index 00000000000..1db89250692
--- /dev/null
+++ b/cpp/test/ios/TestSelect.xib
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="TestSelectController">
+ <connections>
+ <outlet property="loopSwitch" destination="13" id="15"/>
+ <outlet property="pickerView" destination="3" id="9"/>
+ <outlet property="protocol" destination="16" id="18"/>
+ <outlet property="view" destination="1" id="19"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view contentMode="scaleToFill" id="1">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <pickerView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="3">
+ <rect key="frame" x="-1" y="0.0" width="320" height="216"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <connections>
+ <outlet property="dataSource" destination="-1" id="5"/>
+ <outlet property="delegate" destination="-1" id="6"/>
+ </connections>
+ </pickerView>
+ <button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="4">
+ <rect key="frame" x="100" y="368" width="117" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Execute Test">
+ <color key="titleShadowColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="disabled" title="Execute Test"/>
+ <state key="selected" title="Execute Test"/>
+ <state key="highlighted" title="Execute Test">
+ <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ </state>
+ <connections>
+ <action selector="runTest:" destination="-1" eventType="touchUpInside" id="7"/>
+ </connections>
+ </button>
+ <switch opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" id="13">
+ <rect key="frame" x="154" y="293" width="51" height="31"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ </switch>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" text="Loop" lineBreakMode="tailTruncation" minimumFontSize="10" id="14">
+ <rect key="frame" x="83" y="296" width="42" height="21"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" id="16">
+ <rect key="frame" x="53" y="233" width="210" height="29"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <segments>
+ <segment title="TCP"/>
+ <segment title="SSL"/>
+ <segment title="WS"/>
+ <segment title="WSS"/>
+ </segments>
+ </segmentedControl>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ </view>
+ </objects>
+</document>
diff --git a/cpp/test/ios/TestView-iPad.xib b/cpp/test/ios/TestView-iPad.xib
new file mode 100644
index 00000000000..309191a0c2a
--- /dev/null
+++ b/cpp/test/ios/TestView-iPad.xib
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="TestViewController">
+ <connections>
+ <outlet property="activity" destination="16" id="18"/>
+ <outlet property="nextButton" destination="17" id="20"/>
+ <outlet property="output" destination="9" id="12"/>
+ <outlet property="view" destination="6" id="8"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="6">
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <tableView opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" bouncesZoom="NO" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="27" sectionFooterHeight="27" id="9">
+ <rect key="frame" x="20" y="20" width="728" height="939"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ <connections>
+ <outlet property="dataSource" destination="-1" id="10"/>
+ <outlet property="delegate" destination="-1" id="11"/>
+ </connections>
+ </tableView>
+ <activityIndicatorView hidden="YES" opaque="NO" clearsContextBeforeDrawing="NO" userInteractionEnabled="NO" contentMode="scaleToFill" hidesWhenStopped="YES" style="whiteLarge" id="16">
+ <rect key="frame" x="246" y="967" width="37" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <animations/>
+ </activityIndicatorView>
+ <button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="17">
+ <rect key="frame" x="20" y="967" width="214" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Launch Next Test">
+ <color key="titleShadowColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="disabled" title="Launch Next Test"/>
+ <state key="selected" title="Launch Next Test"/>
+ <state key="highlighted" title="Launch Next Test">
+ <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ </state>
+ <connections>
+ <action selector="next:" destination="-1" eventType="touchUpInside" id="21"/>
+ </connections>
+ </button>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="0.75" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ </view>
+ </objects>
+</document>
diff --git a/cpp/test/ios/TestView.xib b/cpp/test/ios/TestView.xib
new file mode 100644
index 00000000000..affe669bf13
--- /dev/null
+++ b/cpp/test/ios/TestView.xib
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="TestViewController">
+ <connections>
+ <outlet property="activity" destination="16" id="18"/>
+ <outlet property="nextButton" destination="17" id="20"/>
+ <outlet property="output" destination="9" id="12"/>
+ <outlet property="view" destination="6" id="8"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="6">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="460"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <tableView opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" bouncesZoom="NO" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="27" sectionFooterHeight="27" id="9">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="395"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ <connections>
+ <outlet property="dataSource" destination="-1" id="10"/>
+ <outlet property="delegate" destination="-1" id="11"/>
+ </connections>
+ </tableView>
+ <activityIndicatorView hidden="YES" opaque="NO" clearsContextBeforeDrawing="NO" userInteractionEnabled="NO" contentMode="scaleToFill" hidesWhenStopped="YES" style="whiteLarge" id="16">
+ <rect key="frame" x="242" y="408" width="37" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <animations/>
+ </activityIndicatorView>
+ <button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="17">
+ <rect key="frame" x="20" y="409" width="214" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Launch Next Test">
+ <color key="titleShadowColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="disabled" title="Launch Next Test"/>
+ <state key="selected" title="Launch Next Test"/>
+ <state key="highlighted" title="Launch Next Test">
+ <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ </state>
+ <connections>
+ <action selector="next:" destination="-1" eventType="touchUpInside" id="21"/>
+ </connections>
+ </button>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="0.75" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ </view>
+ </objects>
+</document>
diff --git a/cpp/test/ios/dummy.ice b/cpp/test/ios/dummy.ice
new file mode 100644
index 00000000000..7f9b5ae69a3
--- /dev/null
+++ b/cpp/test/ios/dummy.ice
@@ -0,0 +1,3 @@
+//
+// Dummy Slice file to enable Slice Xcode Plug-in
+// \ No newline at end of file
diff --git a/cpp/test/ios/main.m b/cpp/test/ios/main.m
new file mode 100644
index 00000000000..d42c12f7206
--- /dev/null
+++ b/cpp/test/ios/main.m
@@ -0,0 +1,17 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <UIKit/UIKit.h>
+
+int main(int argc, char *argv[]) {
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+ int retVal = UIApplicationMain(argc, argv, nil, nil);
+ [pool release];
+ return retVal;
+}
diff --git a/objective-c/Makefile b/objective-c/Makefile
index a524fbe2224..fe15b5fffc2 100644
--- a/objective-c/Makefile
+++ b/objective-c/Makefile
@@ -34,4 +34,3 @@ tests := $(tests-without-project-makefile)
include $(shell find $(lang_srcdir)/test -name Makefile.mk)
$(foreach t,$(tests),$(eval $(call create-objc-test-project,$(t))))
$(call make-projects,$(projects),make-objc-test-project)
-
diff --git a/objective-c/config/Make.rules b/objective-c/config/Make.rules
index 55160c2f7f2..98e7a51fa8a 100644
--- a/objective-c/config/Make.rules
+++ b/objective-c/config/Make.rules
@@ -16,6 +16,10 @@
#
supported-configs = shared static arc-shared arc-static
+ifeq ($(os),Darwin)
+include $(lang_srcdir)/config/Make.xcodesdk.rules
+endif
+
ifneq ($(filter arc-%,$(CONFIGS)),)
# Make sure that the non-ARC configuration is also enabled
override CONFIGS := $(call unique,$(CONFIGS) $(patsubst arc-%,%,$(CONFIGS)))
@@ -26,6 +30,7 @@ endif
#
static_components = Ice IceObjC IceSSLObjC Glacier2ObjC IceStormObjC IceGridObjC
static_projects = test/%
+static_ldflags += $(if $(filter program,$($1_target)),-ObjC)
#
# Build only the tests with the ARC configuration
@@ -55,17 +60,15 @@ ifneq ($(USE_BIN_DIST),yes)
$(DESTDIR)$(install_includedir)/objc:
$(Q)$(MKDIR) -p $(DESTDIR)$(install_includedir)/objc
-$(DESTDIR)$(install_includedir)/objc/%.h: $(includedir)/objc/%.h | $(DESTDIR)$(install_includedir)/objc
- $(Q)$(call install-data,objc/$(*).h,$(includedir),$(DESTDIR)$(install_includedir))
+$(DESTDIR)$(install_includedir)/objc/%.h: include/objc/%.h | $(DESTDIR)$(install_includedir)/objc
+ $(Q)$(call install-data,objc/$(*).h,include,$(DESTDIR)$(install_includedir))
endif
#
# $(make-objc-src-project $1=project)
#
define make-objc-src-project
-ifeq ($(USE_BIN_DIST),yes)
-$(create-project-targets)
-else
+ifneq ($(USE_BIN_DIST),yes)
$1_slicecompiler := slice2objc
$1_sliceflags += --ice -I$(slicedir)
$1_cppflags += -I$(includedir) -I$(includedir)/generated
diff --git a/objective-c/config/Make.xcodesdk.rules b/objective-c/config/Make.xcodesdk.rules
new file mode 100644
index 00000000000..0af804aa965
--- /dev/null
+++ b/objective-c/config/Make.xcodesdk.rules
@@ -0,0 +1,55 @@
+# **********************************************************************
+#
+# Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+#
+# This copy of Ice is licensed to you under the terms described in the
+# ICE_LICENSE file included in this distribution.
+#
+# **********************************************************************
+
+include $(top_srcdir)/config/Make.xcodesdk.rules
+
+supported-configs += xcodesdk
+
+#
+# Xcode configuration to build Xcode IceSDK.
+#
+xcodesdk_targetdir = $(if $(filter %/build,$5),xcodesdk,IceSDK/$2.sdk/usr/lib)
+xcodesdk_installdir = $(if $(filter %/build,$5),xcodesdk,IceSDK/$2.sdk/usr/lib)
+xcodesdk_targetrule = $(if $(filter-out program,$($1_target)),static)
+
+xcodesdk_components = Ice IceObjC IceSSLObjC Glacier2ObjC IceStormObjC IceGridObjC TestCommonObjC
+xcodesdk_projects = test/Ice/%
+
+iphoneos_excludes = test/%
+iphonesimulator_excludes = test/%
+
+ifneq ($(findstring xcodesdk,$(configs)),)
+$(eval $(call make-xcodesdk,../cpp/bin/slice2objc))
+component_with_config_extensions := make-objc-xcodesdk-component-with-config
+endif
+
+#
+# $(call make-xcodesdk-component-with-config,$1=project,$2=component,$3=platform,$4=config,$5=comp[platform-config])
+#
+define make-objc-xcodesdk-component-with-config
+ifneq ($(filter src/%,$1),)
+
+$(make-xcodesdk-component-with-config)
+
+$(top_srcdir)/IceSDK/$3.sdk/usr/include/objc/%.h: include/objc/%.h
+ $(Q)$(call install-data,objc/$$(*).h,include,$(top_srcdir)/IceSDK/$3.sdk/usr/include)
+
+$(install_libdir)/IceSDK/$3.sdk/usr/include/objc/%.h: include/objc/%.h
+ $(Q)$(call install-data,objc/$$(*).h,include,$(install_libdir)/IceSDK/$3.sdk/usr/include)
+
+$5:: $(top_srcdir)/IceSDK/$3.sdk/usr/include/objc/$(subst ObjC,,$2).h
+
+$5_install:: $(install_libdir)/IceSDK/$3.sdk/usr/include/objc/$(subst ObjC,,$2).h
+
+$5_clean::
+ $(Q)$(RM) $(top_srcdir)/IceSDK/$3.sdk/usr/include/objc/$(subst ObjC,,$2).h
+ $(Q)$(RM) -r $(top_srcdir)/IceSDK/$3.sdk/usr/include/objc/$(subst ObjC,,$2)
+
+endif
+endef
diff --git a/objective-c/config/makegitignore.py b/objective-c/config/makegitignore.py
deleted file mode 100755
index a7414c3c2cb..00000000000
--- a/objective-c/config/makegitignore.py
+++ /dev/null
@@ -1,159 +0,0 @@
-#!/usr/bin/env python
-# **********************************************************************
-#
-# Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
-#
-# This copy of Ice is licensed to you under the terms described in the
-# ICE_LICENSE file included in this distribution.
-#
-# **********************************************************************
-
-import os, sys, shutil, fnmatch, re, time, getopt
-
-#
-# NOTE: This scripts generates .gitignore files in directories
-# containing Makefile files with targets. The content of the
-# .gitignore file is generated by parsing the output of make -n
-# clean.
-#
-# In other words, the .gitignore file contains ignore rules for files
-# produced by the Makefile and supposed to be cleaned by make clean.
-#
-
-progname = os.path.basename(sys.argv[0])
-preamble = "// Generated by " + progname
-preamble = preamble + """
-
-// IMPORTANT: Do not edit this file -- any edits made here will be lost!
-"""
-
-#
-# Find files matching a pattern.
-#
-def find(path, patt):
- result = [ ]
- files = os.listdir(path)
- for x in files:
- fullpath = os.path.join(path, x);
- if os.path.isdir(fullpath) and not os.path.islink(fullpath):
- result.extend(find(fullpath, patt))
- elif fnmatch.fnmatch(x, patt):
- result.append(fullpath)
- return result
-
-
-def createGitIgnore(filename, gitIgnoreFiles):
- file = open(filename, "r")
- lines = file.readlines()
- cwd = os.getcwd()
- cwdStack = [] # Working directory stack
- newLines = [ ]
- ignore = ["*.o", "*.bak", "core"]
-
- for x in lines:
- x = x.strip()
- if x.startswith("rm -f"):
- x = x.replace("rm -f", "", 1)
- elif x.startswith("rm -rf"):
- x = x.replace("rm -rf", "", 1)
- elif x.startswith("making clean in"):
- # Don't clean sub-directories
- break
- else:
- continue
-
- if len(x) == 0:
- continue
-
- files = x.split()
- for f in files:
- if f in ignore:
- continue
-
- if f.startswith(".."):
- k = os.path.join(cwd, os.path.dirname(f), ".gitignore")
- v = os.path.basename(f) + "\n"
- else:
- k = os.path.join(cwd, ".gitignore")
- v = f + "\n"
-
- if v.find(".so.") > 0:
- continue
- elif v.endswith(".so\n"):
- v = v.replace(".so", ".*")
- elif v.endswith(".dylib\n"):
- v = v.replace(".dylib", ".*")
- if v.find('.', 0, len(v) - 3) > 0:
- continue
-
- k = os.path.normpath(k)
- if not gitIgnoreFiles.has_key(k):
- gitIgnoreFiles[k] = [ ]
- gitIgnoreFiles[k].append(v)
-
- file.close()
-
-def usage():
- print "Usage: " + sys.argv[0] + " [options]"
- print
- print "Options:"
- print "-e Run for Ice-E."
- print "-h Show this message."
- print
-
-icee = False
-try:
- opts, args = getopt.getopt(sys.argv[1:], "he")
-except getopt.GetoptError:
- usage()
- sys.exit(1)
-for o, a in opts:
- if o == "-h":
- usage()
- sys.exit(0)
- elif o == "-e":
- icee = True
-if len(args) != 0:
- usage()
- sys.exit(1)
-
-
-#
-# Find where the root of the tree is.
-#
-for toplevel in [".", "..", "../..", "../../..", "../../../.."]:
- toplevel = os.path.abspath(toplevel)
- if os.path.exists(os.path.join(toplevel, "objective-c", "config", "makegitignore.py")):
- break
-else:
- print("cannot find top-level directory")
- sys.exit(1)
-
-makefiles = find(os.path.join(toplevel, "objective-c"), "Makefile")
-cwd = os.getcwd()
-gitIgnoreFiles = { }
-for i in makefiles:
- os.chdir(os.path.dirname(i))
- if not os.system('grep -q TARGETS Makefile'):
- try:
- os.system("make -n clean > .tmp-gitignore")
- createGitIgnore(".tmp-gitignore", gitIgnoreFiles)
- os.remove(".tmp-gitignore")
- except:
- os.remove(".tmp-gitignore")
- raise
- os.chdir(cwd)
-
-os.chdir(cwd)
-
-excludePath = [ os.path.join(toplevel, "objective-c", "bin"), os.path.join(toplevel, "objective-c", "lib") ]
-for (path, files) in gitIgnoreFiles.iteritems():
- if os.path.dirname(path) in excludePath:
- continue
- if not os.path.exists(path):
- print files
- gitIgnore = open(path, "w")
- gitIgnore.write(preamble);
- gitIgnore.writelines(files)
- gitIgnore.close()
-
diff --git a/objective-c/test/Common/Makefile.mk b/objective-c/test/Common/Makefile.mk
index 93c43ff890c..479db8fbfb7 100644
--- a/objective-c/test/Common/Makefile.mk
+++ b/objective-c/test/Common/Makefile.mk
@@ -10,8 +10,12 @@
$(project)_libraries = TestCommonObjC
$(project)_noinstall = 1
-TestCommonObjC_targetdir := $(libdir)
-TestCommonObjC_dependencies := IceObjC
-TestCommonObjC_cppflags := -DTEST_API_EXPORTS -I$(includedir) -Itest/include
+#
+# Put the shared TestCommon library in the lib directory for convenience on platforms
+# which don't support something like @loader_path.
+#
+TestCommonObjC[shared]_targetdir := $(libdir)
+TestCommonObjC_dependencies := IceObjC
+TestCommonObjC_cppflags := -DTEST_API_EXPORTS -I$(includedir) -Itest/include
projects += $(project)
diff --git a/objective-c/test/Ice/objects/Client.m b/objective-c/test/Ice/objects/Client.m
index d7a0934050f..cf6714e3859 100644
--- a/objective-c/test/Ice/objects/Client.m
+++ b/objective-c/test/Ice/objects/Client.m
@@ -17,7 +17,7 @@
// Note that the factory must not autorelease the
// returned objects.
-ICEValueFactory factory = ^ICEObject* (NSString* type)
+static ICEValueFactory factory = ^ICEObject* (NSString* type)
{
if([type isEqualToString:@"::Test::B"])
{
diff --git a/objective-c/test/Ice/objects/Server.m b/objective-c/test/Ice/objects/Server.m
index 87b1ac3fa85..1c4eddcc377 100644
--- a/objective-c/test/Ice/objects/Server.m
+++ b/objective-c/test/Ice/objects/Server.m
@@ -13,7 +13,7 @@
// Note that the factory must not autorelease the
// returned objects.
-ICEValueFactory factory = ^ICEObject* (NSString* type)
+static ICEValueFactory factory = ^ICEObject* (NSString* type)
{
if([type isEqualToString:@"::Test::I"])
{
diff --git a/objective-c/test/ios/Classes/AppDelegate.h b/objective-c/test/ios/Classes/AppDelegate.h
new file mode 100644
index 00000000000..46a667b55c9
--- /dev/null
+++ b/objective-c/test/ios/Classes/AppDelegate.h
@@ -0,0 +1,37 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <UIKit/UIKit.h>
+
+@class TestViewController;
+
+@interface AppDelegate : NSObject <UIApplicationDelegate>
+{
+@private
+ UIWindow *window;
+ IBOutlet UINavigationController *navigationController;
+ NSArray* tests;
+ NSInteger currentTest;
+ NSString* protocol;
+ BOOL loop;
+ BOOL runAll;
+}
+
+@property (nonatomic, retain) IBOutlet UIWindow *window;
+@property (nonatomic, retain) IBOutlet UINavigationController* navigationController;
+@property (nonatomic, readonly) NSArray* tests;
+@property (nonatomic) NSInteger currentTest;
+@property (nonatomic, retain) NSString* protocol;
+@property (nonatomic) BOOL loop;
+@property (readonly) BOOL runAll;
+
+-(BOOL)testCompleted:(BOOL)success;
+
+@end
+
diff --git a/objective-c/test/ios/Classes/AppDelegate.m b/objective-c/test/ios/Classes/AppDelegate.m
new file mode 100644
index 00000000000..03fb48ca419
--- /dev/null
+++ b/objective-c/test/ios/Classes/AppDelegate.m
@@ -0,0 +1,263 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <AppDelegate.h>
+#import <TestViewController.h>
+#import <Test.h>
+
+struct TestCases
+{
+ NSString* __unsafe_unretained name;
+ int (*startServer)(int, char**);
+ int (*startClient)(int, char**);
+ bool sslSupport;
+ bool wsSupport;
+ bool runWithSlicedFormat;
+ bool runWith10Encoding;
+};
+
+static NSString* protocols[] = { @"tcp", @"ssl", @"ws", @"wss" };
+const int nProtocols = sizeof(protocols) / sizeof(NSString*);
+
+int adapterDeactivationServer(int, char**);
+int adapterDeactivationClient(int, char**);
+int adminServer(int, char**);
+int adminClient(int, char**);
+int amiServer(int, char**);
+int amiClient(int, char**);
+int bindingServer(int, char**);
+int bindingClient(int, char**);
+int defaultServantServer(int, char**);
+int defaultServantClient(int, char**);
+int defaultValueClient(int, char**);
+int dispatcherServer(int, char**);
+int dispatcherClient(int, char**);
+int enumServer(int, char**);
+int enumClient(int, char**);
+int exceptionsServer(int, char**);
+int exceptionsClient(int, char**);
+int facetsServer(int, char**);
+int facetsClient(int, char**);
+int holdServer(int, char**);
+int holdClient(int, char**);
+int inheritanceServer(int, char**);
+int inheritanceClient(int, char**);
+int interceptorServer(int, char**);
+int interceptorClient(int, char**);
+int invokeServer(int, char**);
+int invokeClient(int, char**);
+int locationServer(int, char**);
+int locationClient(int, char**);
+int objectsServer(int, char**);
+int objectsClient(int, char**);
+int operationsServer(int, char**);
+int operationsClient(int, char**);
+int optionalServer(int, char**);
+int optionalClient(int, char**);
+int proxyServer(int, char**);
+int proxyClient(int, char**);
+int retryServer(int, char**);
+int retryClient(int, char**);
+int streamClient(int, char**);
+int timeoutServer(int, char**);
+int timeoutClient(int, char**);
+int slicingExceptionsServer(int, char**);
+int slicingExceptionsClient(int, char**);
+int hashClient(int, char**);
+int infoServer(int, char**);
+int infoClient(int, char**);
+int metricsServer(int, char**);
+int metricsClient(int, char**);
+int servicesClient(int, char**);
+
+static const struct TestCases alltests[] =
+{
+//
+// Name | Server | Client | SSL Support | WS Support | Sliced | 1.0 Encoding |
+//
+{ @"proxy", proxyServer, proxyClient, true, true, false, false },
+{ @"admin", adminServer, adminClient, true, true, false, false },
+{ @"ami", amiServer, amiClient, true, true, false, false },
+{ @"operations", operationsServer, operationsClient, true, true, false, false },
+{ @"exceptions", exceptionsServer, exceptionsClient, true, true, true, true },
+{ @"inheritance", inheritanceServer, inheritanceClient, true, true, false, false },
+{ @"invoke", invokeServer, invokeClient, true, true, false, false },
+{ @"metrics", metricsServer, metricsClient, false, false, false, false},
+{ @"facets", facetsServer, facetsClient, true, true, false, false },
+{ @"objects", objectsServer, objectsClient, true, true, true, true },
+{ @"optional", optionalServer, optionalClient, true, true, true, false },
+{ @"interceptor", interceptorServer, interceptorClient, true, true, false, false },
+{ @"dispatcher", dispatcherServer, dispatcherClient, true, true, false, false },
+{ @"defaultServant", defaultServantServer, defaultServantClient, true, true, false, false },
+{ @"defaultValue", 0, defaultValueClient, true, true, false, false },
+{ @"binding", bindingServer, bindingClient, true, true, false, false },
+{ @"hold", holdServer, holdClient, true, true, false, false },
+{ @"location", locationServer, locationClient, true, true, false, false },
+{ @"adapterDeactivation", adapterDeactivationServer, adapterDeactivationClient, true, true, false, false },
+{ @"stream", 0, streamClient, true, true, false, true },
+{ @"slicing/exceptions", slicingExceptionsServer, slicingExceptionsClient, true, true, false, true },
+//
+// Slicing objects will not work as both applications are linked in the same executable
+// and have knowledge of the same Slice types.
+//
+//{ @"slicing/objects",slicingObjectsServer, slicingObjectsClient, true, false, true },
+{ @"retry",retryServer, retryClient, true, true, false, false },
+{ @"timeout",timeoutServer, timeoutClient, true, true, false, false },
+{ @"hash", 0, hashClient, true, true, false, false },
+{ @"info",infoServer, infoClient, true, true, false , false },
+{ @"enums", enumServer, enumClient, true, true, false, true },
+{ @"services", 0, servicesClient, true, true, false, false }
+};
+
+@implementation AppDelegate
+
+@synthesize window;
+@synthesize navigationController;
+@synthesize tests;
+@synthesize currentTest;
+@synthesize protocol;
+@synthesize loop;
+@synthesize runAll;
+
+static NSString* currentTestKey = @"currentTestKey";
+static NSString* protocolKey = @"protocolKey";
+
++(void)initialize
+{
+ NSDictionary* appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
+ @"0", currentTestKey,
+ @"tcp", protocolKey,
+ nil];
+ [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
+}
+
+-(id)init
+{
+ if(self = [super init])
+ {
+ self->runAll = getenv("RUNALL") != NULL;
+
+ NSMutableArray* theTests = [NSMutableArray array];
+ for(int i = 0; i < sizeof(alltests)/sizeof(alltests[0]); ++i)
+ {
+ Test* test = [Test testWithName:alltests[i].name
+ server:alltests[i].startServer
+ client:alltests[i].startClient
+ sslSupport:alltests[i].sslSupport
+ wsSupport:alltests[i].wsSupport
+ runWithSlicedFormat:alltests[i].runWithSlicedFormat
+ runWith10Encoding:alltests[i].runWith10Encoding];
+ [theTests addObject:test];
+ }
+ tests = [theTests copy];
+#if defined(__clang__) && !__has_feature(objc_arc)
+ [tests retain];
+#endif
+ // Initialize the application defaults.
+ currentTest = [[NSUserDefaults standardUserDefaults] integerForKey:currentTestKey];
+ if(runAll || currentTest < 0 || currentTest > tests.count)
+ {
+ currentTest = 0;
+ }
+
+ protocol = [[NSUserDefaults standardUserDefaults] stringForKey:protocolKey];
+ int i = 0;
+ for(; i < nProtocols; ++i)
+ {
+ if([protocols[i] isEqualToString:protocol])
+ {
+ break;
+ }
+ }
+ if(i == nProtocols)
+ {
+ protocol = @"tcp";
+ }
+
+ loop = NO;
+ }
+ return self;
+}
+
+- (void)applicationDidFinishLaunching:(UIApplication *)application
+{
+
+ // Override point for customization after app launch
+ [window setRootViewController:navigationController];
+ [window makeKeyAndVisible];
+}
+
+#if defined(__clang__) && !__has_feature(objc_arc)
+- (void)dealloc
+{
+ [tests release];
+ [protocol release];
+ [navigationController release];
+ [window release];
+ [super dealloc];
+}
+#endif
+
+-(NSInteger)currentTest
+{
+ return currentTest;
+}
+
+-(void)setCurrentTest:(NSInteger)test
+{
+ currentTest = test;
+
+ [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInteger:currentTest] forKey:currentTestKey];
+}
+
+-(NSString*)protocol
+{
+ return protocol;
+}
+
+-(void)setprotocol:(NSString*)v
+{
+ protocol = v;
+ [[NSUserDefaults standardUserDefaults] setObject:protocol forKey:protocolKey];
+}
+
+-(BOOL)testCompleted:(BOOL)success
+{
+ if(success)
+ {
+ self.currentTest = (currentTest+1) % tests.count;
+ if(runAll || loop)
+ {
+ if(self.currentTest == 0)
+ {
+ int i = 0;
+ for(; i < nProtocols; ++i)
+ {
+ if([protocols[i] isEqualToString:protocol])
+ {
+ break;
+ }
+ }
+
+ if(++i == nProtocols && !loop)
+ {
+ return NO;
+ }
+ else
+ {
+ protocol = protocols[i % nProtocols];
+ }
+ }
+ return YES;
+ }
+ }
+ return NO;
+}
+
+@end
diff --git a/objective-c/test/ios/Classes/Test.h b/objective-c/test/ios/Classes/Test.h
new file mode 100644
index 00000000000..88b241d9fc6
--- /dev/null
+++ b/objective-c/test/ios/Classes/Test.h
@@ -0,0 +1,44 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <UIKit/UIKit.h>
+
+
+@interface Test : NSObject
+{
+@private
+ int (*server)(int,char**);
+ int (*client)(int,char**);
+ NSString* name;
+ BOOL sslSupport;
+ BOOL wsSupport;
+ BOOL runWithSlicedFormat;
+ BOOL runWith10Encoding;
+}
+
++(id) testWithName:(const NSString*)name
+ server:(int (*)(int, char**))server
+ client:(int (*)(int, char**))client
+ sslSupport:(BOOL)sslSupport
+ wsSupport:(BOOL)wsSupport
+ runWithSlicedFormat:(BOOL)runWithSlicedFormat
+ runWith10Encoding:(BOOL)runWith10Encoding;
+
+-(BOOL)hasServer;
+-(BOOL)isProtocolSupported:(NSString*)protocol;
+-(int)server;
+-(int)client;
+
+@property (readonly) NSString* name;
+@property (readonly) BOOL sslSupport;
+@property (readonly) BOOL wsSupport;
+@property (readonly) BOOL runWithSlicedFormat;
+@property (readonly) BOOL runWith10Encoding;
+
+@end
diff --git a/objective-c/test/ios/Classes/Test.m b/objective-c/test/ios/Classes/Test.m
new file mode 100644
index 00000000000..e3241d45a3a
--- /dev/null
+++ b/objective-c/test/ios/Classes/Test.m
@@ -0,0 +1,88 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <Test.h>
+#include <dlfcn.h>
+
+@implementation Test
+
+@synthesize name;
+@synthesize sslSupport;
+@synthesize wsSupport;
+@synthesize runWithSlicedFormat;
+@synthesize runWith10Encoding;
+
++(id)testWithName:(NSString*)name
+ server:(int (*)(int, char**))server
+ client:(int (*)(int, char**))client
+ sslSupport:(BOOL)sslSupport
+ wsSupport:(BOOL)wsSupport
+ runWithSlicedFormat:(BOOL)runWithSlicedFormat
+ runWith10Encoding:(BOOL)runWith10Encoding
+{
+ Test* t = [[Test alloc] init];
+ if(t != nil)
+ {
+ t->name = name;
+ t->server = server;
+ t->client = client;
+ t->sslSupport = sslSupport;
+ t->wsSupport = wsSupport;
+ t->runWithSlicedFormat = runWithSlicedFormat;
+ t->runWith10Encoding = runWith10Encoding;
+ }
+#if defined(__clang__) && !__has_feature(objc_arc)
+ return [t autorelease];
+#else
+ return t;
+#endif
+}
+-(BOOL) hasServer
+{
+ return server != 0;
+}
+-(BOOL)isProtocolSupported:(NSString*)protocol
+{
+ BOOL supported = YES;
+ if(!sslSupport)
+ {
+ supported &= [protocol isEqualToString:@"tcp"] || [protocol isEqualToString:@"ws"];
+ }
+ if(!wsSupport)
+ {
+ supported &= [protocol isEqualToString:@"tcp"] || [protocol isEqualToString:@"ssl"];
+ }
+ return supported;
+}
+-(int)server
+{
+ NSAssert(server != 0, @"server != 0");
+ int argc = 0;
+ char** argv = 0;
+ return (*server)(argc, argv);
+}
+
+-(int)client
+{
+ int argc = 0;
+ char** argv = 0;
+
+ NSAssert(client != 0, @"client != 0");
+ return (*client)(argc, argv);
+}
+
+#if defined(__clang__) && !__has_feature(objc_arc)
+-(void)dealloc
+{
+ [name release];
+ [super dealloc];
+}
+#endif
+
+@end
diff --git a/objective-c/test/ios/Classes/TestSelectController.h b/objective-c/test/ios/Classes/TestSelectController.h
new file mode 100644
index 00000000000..97aac1a8fc3
--- /dev/null
+++ b/objective-c/test/ios/Classes/TestSelectController.h
@@ -0,0 +1,26 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <UIKit/UIKit.h>
+
+@class TestViewController;
+
+@interface TestSelectController : UIViewController<UIPickerViewDataSource, UIPickerViewDelegate>
+{
+@private
+ IBOutlet UIPickerView* pickerView;
+ IBOutlet UISegmentedControl* protocol;
+ IBOutlet UISwitch* loopSwitch;
+ NSArray* tests;
+ TestViewController *testViewController;
+}
+
+-(IBAction)runTest:(id)sender;
+
+@end
diff --git a/objective-c/test/ios/Classes/TestSelectController.m b/objective-c/test/ios/Classes/TestSelectController.m
new file mode 100644
index 00000000000..911fdd9bb10
--- /dev/null
+++ b/objective-c/test/ios/Classes/TestSelectController.m
@@ -0,0 +1,135 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <TestSelectController.h>
+#import <Test.h>
+#import <AppDelegate.h>
+#import <TestViewController.h>
+
+@interface TestSelectController()
+
+@property (nonatomic, retain) NSArray* tests;
+@property (nonatomic, retain) UIPickerView* pickerView;
+@property (nonatomic, retain) UISwitch* sslSwitch;
+@property (nonatomic, retain) UISegmentedControl* protocol;
+@property (nonatomic, retain) TestViewController* testViewController;
+
+@end
+
+@implementation TestSelectController
+
+@synthesize tests;
+@synthesize pickerView;
+@synthesize protocol;
+@synthesize testViewController;
+
+- (void)viewDidLoad
+{
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ self.tests = appDelegate.tests;
+ [super viewDidLoad];
+}
+
+-(void)viewWillAppear:(BOOL)animated
+{
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ [pickerView selectRow:appDelegate.currentTest inComponent:0 animated:NO];
+ for (int i = 0; i != [self.protocol numberOfSegments]; ++i)
+ {
+ if([[self.protocol titleForSegmentAtIndex:i] isEqualToString:[appDelegate.protocol uppercaseString]])
+ {
+ self.protocol.selectedSegmentIndex = i;
+ break;
+ }
+ }
+
+ if(appDelegate.runAll)
+ {
+ [self.navigationController pushViewController:self.testViewController animated:YES];
+ }
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
+{
+ // Return YES for supported orientations
+ return (interfaceOrientation == UIInterfaceOrientationPortrait);
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
+ // Release anything that's not essential, such as cached data
+}
+
+#if defined(__clang__) && !__has_feature(objc_arc)
+- (void)dealloc
+{
+ [tests release];
+ [pickerView release];
+ [protocol release];
+ [loopSwitch release];
+ [testViewController release];
+
+ [super dealloc];
+}
+#endif
+
+-(TestViewController*)testViewController
+{
+ // Instantiate the test view controller if necessary.
+ if (testViewController == nil)
+ {
+ NSString* nib;
+ if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
+ {
+ nib = @"TestView-iPad";
+ }
+ else
+ {
+ nib = @"TestView";
+ }
+ testViewController = [[TestViewController alloc] initWithNibName:nib bundle:nil];
+ }
+ return testViewController;
+}
+
+#pragma mark -
+
+-(IBAction)runTest:(id)sender
+{
+ NSUInteger row = [pickerView selectedRowInComponent:0];
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ appDelegate.currentTest = row;
+ appDelegate.protocol = [[protocol titleForSegmentAtIndex:[protocol selectedSegmentIndex]] lowercaseString];
+ appDelegate.loop = loopSwitch.isOn;
+
+ TestViewController* controller = self.testViewController;
+ [self.navigationController pushViewController:controller animated:YES];
+}
+
+#pragma mark UIPickerViewDelegate
+
+- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
+{
+ Test* test = (Test*)[tests objectAtIndex:row];
+ return test.name;
+}
+
+#pragma mark UIPickerViewDataSource
+
+- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
+{
+ return 1;
+}
+
+- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)componen
+{
+ return tests.count;
+}
+@end
diff --git a/objective-c/test/ios/Classes/TestViewController.h b/objective-c/test/ios/Classes/TestViewController.h
new file mode 100644
index 00000000000..59b3ecb220a
--- /dev/null
+++ b/objective-c/test/ios/Classes/TestViewController.h
@@ -0,0 +1,37 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <UIKit/UIKit.h>
+
+typedef enum
+{
+ TestConfigOptionDefault,
+ TestConfigOptionSliced,
+ TestConfigOptionEncoding10
+} TestConfigOption;
+
+@class Test;
+
+@interface TestViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>
+{
+@private
+ IBOutlet UITableView* output;
+ IBOutlet UIActivityIndicatorView* activity;
+ IBOutlet UIButton* nextButton;
+
+ NSMutableString* currentMessage;
+ NSMutableArray* messages;
+ NSOperationQueue* queue;
+ Test* test;
+ NSEnumerator* testRunEnumerator;
+}
+-(IBAction)next:(id)sender;
+-(NSOperationQueue*) queue;
+@end
+
diff --git a/objective-c/test/ios/Classes/TestViewController.m b/objective-c/test/ios/Classes/TestViewController.m
new file mode 100644
index 00000000000..6b6f44a1d21
--- /dev/null
+++ b/objective-c/test/ios/Classes/TestViewController.m
@@ -0,0 +1,515 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <TestViewController.h>
+#import <Test.h>
+#import <AppDelegate.h>
+
+#import <TestCommon.h>
+
+//
+// Avoid warning for undocumented method.
+//
+@interface UIApplication(UndocumentedAPI)
+-(void)launchApplicationWithIdentifier:(NSString*)id suspended:(BOOL)flag;
+@end
+
+// TODO: Would be nice to have a red font for fatal, and error messages.
+@interface MessageCell : UITableViewCell
+{
+@private
+ UILabel* body;
+}
+
+@property (nonatomic, retain) UILabel* body;
+
++(CGFloat)heightForMessage:(NSString*)messsage;
+
+@end
+
+@implementation MessageCell
+@synthesize body;
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
+{
+ if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])
+ {
+ body = [[UILabel alloc] initWithFrame:CGRectZero];
+ body.textColor = [UIColor blackColor];
+ body.font = [UIFont boldSystemFontOfSize:14];
+ body.numberOfLines = 0;
+
+ [self.contentView addSubview:self.body];
+ }
+
+ return self;
+}
+
++(CGFloat)heightForMessage:(NSString*)text
+{
+ // The header is always one line, the body is multiple lines.
+ // The width of the table is 320 - 20px of left & right padding. We don't want to let the body
+ // text go past 200px.
+ CGRect body = [text boundingRectWithSize:CGSizeMake(300.f, 200.0f) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:14] } context:nil];
+ return body.size.height + 20.f;
+}
+
+- (void)layoutSubviews
+{
+ [super layoutSubviews];
+
+ CGRect contentRect = self.contentView.bounds;
+
+ CGRect bodyFrame = CGRectMake(10.f, 0.f, CGRectGetWidth(contentRect)-20.f, CGRectGetHeight(contentRect));
+
+ self.body.frame = bodyFrame;
+}
+
+#if defined(__clang__) && !__has_feature(objc_arc)
+- (void)dealloc
+{
+ [body release];
+ [super dealloc];
+}
+#endif
+
+-(void)setMessage:(NSString*)m
+{
+ self.body.text = m;
+}
+
+@end
+
+@interface TestViewController()
+
+@property (nonatomic, retain) UITableView* output;
+@property (nonatomic, retain) UIActivityIndicatorView* activity;
+@property (nonatomic, retain) UIButton* nextButton;
+
+@property (nonatomic, retain) NSMutableString* currentMessage;
+@property (nonatomic, retain) NSMutableArray* messages;
+@property (nonatomic, retain) NSOperationQueue* queue;
+@property (retain) Test* test;
+
+-(void)add:(NSString*)d;
+-(void)startTest;
+@end
+
+@interface TestRun : NSObject
+{
+ TestConfigOption option;
+ Test* test;
+ int completed;
+ int error;
+ TestViewController* viewController;
+}
+
++(id) testRun:(Test*)test;
++(id) testRunWithConfigOption:(Test*)test option:(TestConfigOption)option;
+
+-(NSInvocationOperation*) runInvocation:(TestViewController*)callback;
+@end
+
+@implementation TestViewController
+
+@synthesize output;
+@synthesize activity;
+@synthesize nextButton;
+@synthesize currentMessage;
+@synthesize messages;
+@synthesize queue;
+@synthesize test;
+
+- (void)viewDidLoad
+{
+ self.currentMessage = [NSMutableString string];
+ self.messages = [NSMutableArray array];
+ queue = [[NSOperationQueue alloc] init];
+ self.queue.maxConcurrentOperationCount = 2; // We need at least 2 concurrent operations.
+ TestCommonInit(self, @selector(add:));
+ [super viewDidLoad];
+}
+
+-(void)viewWillAppear:(BOOL)animated
+{
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ self.test = (Test*)[appDelegate.tests objectAtIndex:appDelegate.currentTest];
+ [self startTest];
+}
+
+-(void)viewWillDisappear:(BOOL)animated
+{
+ // TODO: Waiting isn't possible until the tests periodically find out whether
+ // they should terminate.
+ // Wait until the tests are complete.
+ //[queue waitUntilAllOperationsAreFinished];
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
+{
+ // Return YES for supported orientations
+ return (interfaceOrientation == UIInterfaceOrientationPortrait);
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
+ // Release anything that's not essential, such as cached data
+}
+
+#if defined(__clang__) && !__has_feature(objc_arc)
+- (void)dealloc
+{
+ [output release];
+ [activity release];
+ [nextButton release];
+
+ [currentMessage release];
+ [messages release];
+ [queue release];
+ [test release];
+
+ [super dealloc];
+}
+#endif
+
+#pragma mark -
+
+-(void)startTest
+{
+ self.title = test.name;
+ [self.navigationItem setHidesBackButton:YES animated:YES];
+
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ if(appDelegate.loop)
+ {
+ [nextButton setTitle:@"Stop running" forState:UIControlStateNormal];
+ }
+ else
+ {
+ nextButton.enabled = NO;
+ [nextButton setAlpha:0.5];
+ [nextButton setTitle:@"Test is running" forState:UIControlStateDisabled];
+ }
+
+ // Clear the current message, and the the table log.
+ [currentMessage deleteCharactersInRange:NSMakeRange(0, currentMessage.length)];
+ [messages removeAllObjects];
+ [output reloadData];
+ [activity startAnimating];
+
+ if(![test isProtocolSupported:appDelegate.protocol])
+ {
+ tprintf("Test not supported with %s\n", [appDelegate.protocol UTF8String]);
+ [self testComplete:YES];
+ return;
+ }
+
+ NSMutableArray* testRuns = [NSMutableArray array];
+ [testRuns addObject:[TestRun testRun:test]];
+ if(test.runWithSlicedFormat)
+ {
+ [testRuns addObject:[TestRun testRunWithConfigOption:test option:TestConfigOptionSliced]];
+ }
+ if(test.runWith10Encoding)
+ {
+ [testRuns addObject:[TestRun testRunWithConfigOption:test option:TestConfigOptionEncoding10]];
+ }
+ testRunEnumerator = [testRuns objectEnumerator];
+#if defined(__clang__) && !__has_feature(objc_arc)
+ [testRunEnumerator retain];
+#endif
+ id testRun = [testRunEnumerator nextObject];
+ [queue addOperation:[testRun runInvocation:self]];
+}
+
+-(void)testRunComplete:(BOOL)success
+{
+ if(!success)
+ {
+ [self testComplete:NO];
+ return;
+ }
+
+ id testRun = [testRunEnumerator nextObject];
+ if(testRun == nil)
+ {
+ [self testComplete:YES];
+ }
+ else
+ {
+ [queue addOperation:[testRun runInvocation:self]];
+ }
+}
+
+-(void)testComplete:(BOOL)success
+{
+ [activity stopAnimating];
+
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ Test* nextTest = (Test*)[appDelegate.tests objectAtIndex:(appDelegate.currentTest+1)%(appDelegate.tests.count)];
+ NSString* buttonTitle = [NSString stringWithFormat:@"Run %@", nextTest.name];
+ [nextButton setTitle:buttonTitle forState:UIControlStateNormal];
+
+ nextButton.enabled = YES;
+ [nextButton setAlpha:1.0];
+ [self.navigationItem setHidesBackButton:NO animated:YES];
+
+ self.test = nil;
+#if defined(__clang__) && !__has_feature(objc_arc)
+ [testRunEnumerator release];
+#endif
+ testRunEnumerator = nil;
+
+ // For memory leak testing comment the following line out.
+ if([appDelegate testCompleted:success])
+ {
+ self.test = (Test*)[appDelegate.tests objectAtIndex:appDelegate.currentTest];
+ [self startTest];
+ }
+}
+
+-(IBAction)next:(id)sender
+{
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ if(appDelegate.loop)
+ {
+ appDelegate.loop = NO;
+ nextButton.enabled = NO;
+ [nextButton setAlpha:0.5];
+ [nextButton setTitle:@"Waiting..." forState:UIControlStateDisabled];
+ }
+ else
+ {
+ NSAssert(test == nil, @"test == nil");
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ self.test = (Test*)[appDelegate.tests objectAtIndex:appDelegate.currentTest];
+ [self startTest];
+ }
+}
+
+-(NSOperationQueue*) queue
+{
+ return queue;
+}
+
+-(void)add:(NSString*)s
+{
+ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+ if(appDelegate.runAll)
+ {
+ printf("%s", [s UTF8String]);
+ }
+
+ [currentMessage appendString:s];
+ NSRange range = [currentMessage rangeOfString:@"\n" options:NSBackwardsSearch];
+ if(range.location != NSNotFound)
+ {
+#if defined(__clang__) && !__has_feature(objc_arc)
+ [messages addObject:[[currentMessage copy] autorelease]];
+#else
+ [messages addObject:[currentMessage copy]];
+#endif
+ [currentMessage deleteCharactersInRange:NSMakeRange(0, currentMessage.length)];
+ [output reloadData];
+ NSUInteger path[] = {0, messages.count-1};
+ [output scrollToRowAtIndexPath:[NSIndexPath indexPathWithIndexes:path length:2]
+ atScrollPosition:UITableViewScrollPositionBottom
+ animated:NO];
+ }
+}
+
+#pragma mark <UITableViewDelegate, UITableViewDataSource> Methods
+
+-(NSInteger)numberOfSectionsInTableView:(UITableView *)tv
+{
+ return 1;
+}
+
+-(NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section
+{
+ return messages.count;
+}
+
+-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+ if([messages count] <= indexPath.row)
+ {
+ return [MessageCell heightForMessage:@""];
+ }
+ return [MessageCell heightForMessage:[messages objectAtIndex:indexPath.row]];
+}
+
+-(UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+ MessageCell *cell = (MessageCell*)[output dequeueReusableCellWithIdentifier:@"MessageCell"];
+ if(cell == nil)
+ {
+#if defined(__clang__) && !__has_feature(objc_arc)
+ cell = [[[MessageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MessageCell"] autorelease];
+#else
+ cell = [[MessageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MessageCell"];
+#endif
+ }
+ [cell setMessage:[messages objectAtIndex:indexPath.row]];
+ return cell;
+}
+
+-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+ return nil;
+}
+
+@end
+
+@implementation TestRun
+-(id) init:(Test*)t option:(TestConfigOption)opt
+{
+ self = [super init];
+ if(!self)
+ {
+ return nil;
+ }
+ self->test = t;
+ self->option = opt;
+ self->completed = 0;
+ self->error = 0;
+ return self;
+}
+
++(id) testRun:(Test*)test
+{
+ TestRun* run = [[TestRun alloc] init:test option:TestConfigOptionDefault];
+#if defined(__clang__) && !__has_feature(objc_arc)
+ [run autorelease];
+#endif
+ return run;
+}
++(id) testRunWithConfigOption:(Test*)test option:(TestConfigOption)option
+{
+ TestRun* run = [[TestRun alloc] init:test option:option];
+#if defined(__clang__) && !__has_feature(objc_arc)
+ [run autorelease];
+#endif
+ return run;
+}
+
+-(NSInvocationOperation*) runInvocation:(TestViewController*)ctl
+{
+ viewController = ctl;
+#if defined(__clang__) && !__has_feature(objc_arc)
+ return [[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil] autorelease];
+#else
+ return [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
+#endif
+
+}
+
+-(void) run
+{
+ // Initialize testCommon.
+ AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
+ if(appDelegate.runAll)
+ {
+ printf("\n*** running %s test %ld/%lu ...\n", [test.name UTF8String], (long)appDelegate.currentTest + 1,
+ (unsigned long)[appDelegate.tests count]);
+ printf("*** protocol: %s\n", [appDelegate.protocol UTF8String]);
+ fflush(stdout);
+ }
+
+ TestCommonTestInit(self,
+ @selector(serverReady),
+ appDelegate.protocol,
+ option == TestConfigOptionSliced,
+ option == TestConfigOptionEncoding10);
+
+ if(option == TestConfigOptionSliced)
+ {
+ tprintf("Running test with %s and sliced format.\n", [appDelegate.protocol UTF8String]);
+ }
+ else if(option == TestConfigOptionEncoding10)
+ {
+ tprintf("Running test with %s and 1.0 encoding.\n", [appDelegate.protocol UTF8String]);
+ }
+ else
+ {
+ tprintf("Running test with %s and default format.\n", [appDelegate.protocol UTF8String]);
+ }
+
+ if([test hasServer])
+ {
+ [self runServer];
+ }
+ else
+ {
+ [self runClient];
+ }
+}
+
+-(void)clientComplete:(NSNumber*)rc
+{
+ if([rc intValue] != 0)
+ {
+ [viewController add:[NSString stringWithFormat:@"client error: %@!\n", rc]];
+ if([test hasServer])
+ {
+ serverStop();
+ }
+ ++error;
+ }
+
+ if(![test hasServer] || ++completed == 2)
+ {
+ [viewController testRunComplete:error == 0];
+ }
+}
+
+// Run in a separate thread.
+-(void)runClient
+{
+ int rc = [test client];
+ [self performSelectorOnMainThread:@selector(clientComplete:) withObject:[NSNumber numberWithInt:rc] waitUntilDone:NO];
+}
+
+-(void)serverComplete:(NSNumber*)rc
+{
+ if([rc intValue] != 0)
+ {
+ [viewController add:[NSString stringWithFormat:@"server error: %@!\n", rc]];
+ ++error;
+ }
+
+ if(++completed == 2)
+ {
+ [viewController testRunComplete:error == 0];
+ }
+}
+
+// Run in a separate thread.
+-(void)runServer
+{
+ int rc = [test server];
+ [self performSelectorOnMainThread:@selector(serverComplete:) withObject:[NSNumber numberWithInt:rc] waitUntilDone:NO];
+}
+
+// Kick off the client.
+-(void)serverReady
+{
+ NSInvocationOperation* invocation = [[NSInvocationOperation alloc]
+ initWithTarget:self
+ selector:@selector(runClient)
+ object:nil];
+#if defined(__clang__) && !__has_feature(objc_arc)
+ [invocation autorelease];
+#endif
+ [[viewController queue] addOperation:invocation];
+}
+@end
+
+
diff --git a/objective-c/test/ios/Default-568h@2x.png b/objective-c/test/ios/Default-568h@2x.png
new file mode 100644
index 00000000000..0891b7aabfc
--- /dev/null
+++ b/objective-c/test/ios/Default-568h@2x.png
Binary files differ
diff --git a/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/Contents.json b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000000..93f4f1ff22c
--- /dev/null
+++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,80 @@
+{
+ "images" : [
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "test_suite-Small@2x-1.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "test_suite-Small@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "test_suite-Small-40@2x-1.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "test_suite-Small-40@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "test_suite-Small-40@3x-1.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "New icon-60@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "test_suite-Small.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "test_suite-Small@2x-2.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "test_suite-Small-40.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "test_suite-Small-40@2x-2.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "test_suite-76.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "test_suite-76@2x.png",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/New icon-60@3x.png b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/New icon-60@3x.png
new file mode 100644
index 00000000000..a37f851e642
--- /dev/null
+++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/New icon-60@3x.png
Binary files differ
diff --git a/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76.png b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76.png
new file mode 100644
index 00000000000..2855a8b674b
--- /dev/null
+++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76.png
Binary files differ
diff --git a/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76@2x.png b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76@2x.png
new file mode 100644
index 00000000000..29047dc5a52
--- /dev/null
+++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76@2x.png
Binary files differ
diff --git a/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40.png b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40.png
new file mode 100644
index 00000000000..e76086fb3d6
--- /dev/null
+++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40.png
Binary files differ
diff --git a/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-1.png b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-1.png
new file mode 100644
index 00000000000..7615d3255bc
--- /dev/null
+++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-1.png
Binary files differ
diff --git a/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-2.png b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-2.png
new file mode 100644
index 00000000000..7615d3255bc
--- /dev/null
+++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-2.png
Binary files differ
diff --git a/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x-1.png b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x-1.png
new file mode 100644
index 00000000000..f04f442176a
--- /dev/null
+++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x-1.png
Binary files differ
diff --git a/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x.png b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x.png
new file mode 100644
index 00000000000..f04f442176a
--- /dev/null
+++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x.png
Binary files differ
diff --git a/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small.png b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small.png
new file mode 100644
index 00000000000..d57695edc28
--- /dev/null
+++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small.png
Binary files differ
diff --git a/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-1.png b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-1.png
new file mode 100644
index 00000000000..79edc547e2c
--- /dev/null
+++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-1.png
Binary files differ
diff --git a/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-2.png b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-2.png
new file mode 100644
index 00000000000..79edc547e2c
--- /dev/null
+++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-2.png
Binary files differ
diff --git a/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@3x.png b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@3x.png
new file mode 100644
index 00000000000..49cdc033096
--- /dev/null
+++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@3x.png
Binary files differ
diff --git a/objective-c/test/ios/Info-ARC.plist b/objective-c/test/ios/Info-ARC.plist
new file mode 100644
index 00000000000..0ea4d4dda39
--- /dev/null
+++ b/objective-c/test/ios/Info-ARC.plist
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>Test Suite ARC</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIdentifier</key>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>NSMainNibFile</key>
+ <string>MainWindow</string>
+ <key>NSMainNibFile~ipad</key>
+ <string>MainWindow-iPad</string>
+ <key>UIRequiresFullScreen</key>
+ <true/>
+</dict>
+</plist>
diff --git a/objective-c/test/ios/Info.plist b/objective-c/test/ios/Info.plist
new file mode 100644
index 00000000000..1b22d5d881c
--- /dev/null
+++ b/objective-c/test/ios/Info.plist
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>Test Suite</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIdentifier</key>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>NSMainNibFile</key>
+ <string>MainWindow</string>
+ <key>NSMainNibFile~ipad</key>
+ <string>MainWindow-iPad</string>
+ <key>UIRequiresFullScreen</key>
+ <true/>
+</dict>
+</plist>
diff --git a/objective-c/test/ios/MainWindow-iPad.xib b/objective-c/test/ios/MainWindow-iPad.xib
new file mode 100644
index 00000000000..1313995e567
--- /dev/null
+++ b/objective-c/test/ios/MainWindow-iPad.xib
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="UIApplication">
+ <connections>
+ <outlet property="delegate" destination="3" id="4"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <customObject id="3" userLabel="container App Delegate" customClass="AppDelegate">
+ <connections>
+ <outlet property="navigationController" destination="17" id="21"/>
+ <outlet property="window" destination="12" id="14"/>
+ </connections>
+ </customObject>
+ <navigationController id="17">
+ <extendedEdge key="edgesForExtendedLayout"/>
+ <navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="19">
+ <autoresizingMask key="autoresizingMask"/>
+ <animations/>
+ </navigationBar>
+ <viewControllers>
+ <viewController nibName="TestSelect-iPad" id="18" customClass="TestSelectController">
+ <extendedEdge key="edgesForExtendedLayout"/>
+ <navigationItem key="navigationItem" title="Ice Test Suite" id="20"/>
+ </viewController>
+ </viewControllers>
+ <metadata/>
+ </navigationController>
+ <window opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="12">
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ <metadata/>
+ </window>
+ </objects>
+</document>
diff --git a/objective-c/test/ios/MainWindow.xib b/objective-c/test/ios/MainWindow.xib
new file mode 100644
index 00000000000..8dd1820b23b
--- /dev/null
+++ b/objective-c/test/ios/MainWindow.xib
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="UIApplication">
+ <connections>
+ <outlet property="delegate" destination="3" id="4"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <customObject id="3" userLabel="container App Delegate" customClass="AppDelegate">
+ <connections>
+ <outlet property="navigationController" destination="17" id="21"/>
+ <outlet property="window" destination="12" id="14"/>
+ </connections>
+ </customObject>
+ <navigationController id="17">
+ <extendedEdge key="edgesForExtendedLayout"/>
+ <navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="19">
+ <autoresizingMask key="autoresizingMask"/>
+ <animations/>
+ </navigationBar>
+ <viewControllers>
+ <viewController nibName="TestSelect" id="18" customClass="TestSelectController">
+ <extendedEdge key="edgesForExtendedLayout"/>
+ <navigationItem key="navigationItem" title="Ice Test Suite" id="20"/>
+ </viewController>
+ </viewControllers>
+ </navigationController>
+ <window opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="12">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ </window>
+ </objects>
+</document>
diff --git a/objective-c/test/ios/Objective-C Test Suite.xcodeproj/project.pbxproj b/objective-c/test/ios/Objective-C Test Suite.xcodeproj/project.pbxproj
new file mode 100755
index 00000000000..1ea8bb86d52
--- /dev/null
+++ b/objective-c/test/ios/Objective-C Test Suite.xcodeproj/project.pbxproj
@@ -0,0 +1,1778 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 47;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1400641A1234DFE800249AA4 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 140064131234DFE800249AA4 /* Server.m */; };
+ 1400641B1234DFE800249AA4 /* InvokeTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 140064141234DFE800249AA4 /* InvokeTest.ice */; };
+ 1400641C1234DFE800249AA4 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 140064151234DFE800249AA4 /* Client.m */; };
+ 1400641D1234DFE800249AA4 /* BlobjectI.m in Sources */ = {isa = PBXBuildFile; fileRef = 140064161234DFE800249AA4 /* BlobjectI.m */; };
+ 1400641E1234DFE800249AA4 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 140064181234DFE800249AA4 /* AllTests.m */; };
+ 1400642B1234E0E900249AA4 /* TwowaysNewAMI.m in Sources */ = {isa = PBXBuildFile; fileRef = 140064291234E0E900249AA4 /* TwowaysNewAMI.m */; };
+ 1400642C1234E0E900249AA4 /* OnewaysNewAMI.m in Sources */ = {isa = PBXBuildFile; fileRef = 1400642A1234E0E900249AA4 /* OnewaysNewAMI.m */; };
+ 140157C1123645D0007C165E /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 140157BA123645D0007C165E /* TestI.m */; };
+ 140157C2123645D0007C165E /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 140157BB123645D0007C165E /* AllTests.m */; };
+ 140157C3123645D0007C165E /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 140157BC123645D0007C165E /* Client.m */; };
+ 140157C5123645D0007C165E /* DispatcherTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 140157BE123645D0007C165E /* DispatcherTest.ice */; };
+ 140157C6123645D0007C165E /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 140157BF123645D0007C165E /* Server.m */; };
+ 140A392D122CF11300E1931D /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 140A3927122CF11300E1931D /* TestI.m */; };
+ 140A392E122CF11300E1931D /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 140A3929122CF11300E1931D /* Client.m */; };
+ 140A392F122CF11300E1931D /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 140A392A122CF11300E1931D /* Server.m */; };
+ 140A3930122CF11300E1931D /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 140A392B122CF11300E1931D /* AllTests.m */; };
+ 140A3931122CF11300E1931D /* AMITest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 140A392C122CF11300E1931D /* AMITest.ice */; };
+ 14103B0C1CF892720097DE5A /* ExternalAccessory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 14103B0B1CF892720097DE5A /* ExternalAccessory.framework */; };
+ 14103B0D1CF8927D0097DE5A /* ExternalAccessory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 14103B0B1CF892720097DE5A /* ExternalAccessory.framework */; };
+ 1450A1091ABC09B400A71895 /* BatchOnewaysAMI.m in Sources */ = {isa = PBXBuildFile; fileRef = 1450A1081ABC09B400A71895 /* BatchOnewaysAMI.m */; };
+ 1450A10A1ABC09B400A71895 /* BatchOnewaysAMI.m in Sources */ = {isa = PBXBuildFile; fileRef = 1450A1081ABC09B400A71895 /* BatchOnewaysAMI.m */; };
+ 14532D321761D39700176FE1 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; };
+ 14532D331761D39700176FE1 /* TestView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2899E5210DE3E06400AC0155 /* TestView.xib */; };
+ 14532D341761D39700176FE1 /* TestSelect.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34B7662B0E8D55FE00CE4701 /* TestSelect.xib */; };
+ 14532D361761D39700176FE1 /* server.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 342EBA860E926E98000051FA /* server.p12 */; };
+ 14532D371761D39700176FE1 /* client.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 342EBA880E926E9F000051FA /* client.p12 */; };
+ 14532D381761D39700176FE1 /* cacert.der in Resources */ = {isa = PBXBuildFile; fileRef = 342EBA8A0E926F90000051FA /* cacert.der */; };
+ 14532D391761D39700176FE1 /* TestSelect-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34730A10122BF6C300D293CC /* TestSelect-iPad.xib */; };
+ 14532D3A1761D39700176FE1 /* TestView-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34730A14122BF6ED00D293CC /* TestView-iPad.xib */; };
+ 14532D3B1761D39700176FE1 /* MainWindow-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34C618AE122C035000F60A28 /* MainWindow-iPad.xib */; };
+ 14532D3C1761D39700176FE1 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 14934E64161AFC8C00348FC2 /* Default-568h@2x.png */; };
+ 14532D3E1761D39700176FE1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
+ 14532D3F1761D39700176FE1 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* AppDelegate.m */; };
+ 14532D401761D39700176FE1 /* TestViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* TestViewController.m */; };
+ 14532D411761D39700176FE1 /* TestSelectController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B766290E8D55E700CE4701 /* TestSelectController.m */; };
+ 14532D421761D39700176FE1 /* Test.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B766330E8D56C700CE4701 /* Test.m */; };
+ 14532D431761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B4AA0FD7A7700018C227 /* AllTests.m */; };
+ 14532D441761D39700176FE1 /* BatchOneways.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B4AB0FD7A7700018C227 /* BatchOneways.m */; };
+ 14532D451761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B4AC0FD7A7700018C227 /* Client.m */; };
+ 14532D461761D39700176FE1 /* Oneways.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B4AD0FD7A7700018C227 /* Oneways.m */; };
+ 14532D471761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B4AF0FD7A7700018C227 /* Server.m */; };
+ 14532D481761D39700176FE1 /* Twoways.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B4B30FD7A7700018C227 /* Twoways.m */; };
+ 14532D491761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B4F10FD7A9660018C227 /* TestI.m */; };
+ 14532D4A1761D39700176FE1 /* TestCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5000FD7AB5C0018C227 /* TestCommon.m */; };
+ 14532D4B1761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5180FD7E7740018C227 /* AllTests.m */; };
+ 14532D4C1761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5190FD7E7740018C227 /* Client.m */; };
+ 14532D4D1761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B51C0FD7E7740018C227 /* Server.m */; };
+ 14532D4E1761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B51F0FD7E7740018C227 /* TestI.m */; };
+ 14532D4F1761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5260FD7E78B0018C227 /* AllTests.m */; };
+ 14532D501761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5270FD7E78B0018C227 /* Client.m */; };
+ 14532D511761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5280FD7E78B0018C227 /* Server.m */; };
+ 14532D521761D39700176FE1 /* BindingTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5290FD7E78B0018C227 /* BindingTest.ice */; };
+ 14532D531761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B52B0FD7E78B0018C227 /* TestI.m */; };
+ 14532D541761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5320FD7E7BD0018C227 /* Client.m */; };
+ 14532D551761D39700176FE1 /* DefaultServantTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5330FD7E7BD0018C227 /* DefaultServantTest.ice */; };
+ 14532D571761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5380FD7E7CA0018C227 /* Client.m */; };
+ 14532D581761D39700176FE1 /* ExceptionsTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5390FD7E7CA0018C227 /* ExceptionsTest.ice */; };
+ 14532D591761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B53A0FD7E7CA0018C227 /* TestI.m */; };
+ 14532D5A1761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B53B0FD7E7CA0018C227 /* AllTests.m */; };
+ 14532D5B1761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B53D0FD7E7CA0018C227 /* Server.m */; };
+ 14532D5C1761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5430FD7E7E60018C227 /* TestI.m */; };
+ 14532D5D1761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5440FD7E7E60018C227 /* AllTests.m */; };
+ 14532D5E1761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5450FD7E7E60018C227 /* Client.m */; };
+ 14532D5F1761D39700176FE1 /* FacetsTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5460FD7E7E60018C227 /* FacetsTest.ice */; };
+ 14532D601761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5480FD7E7E60018C227 /* Server.m */; };
+ 14532D611761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B54F0FD7E7FB0018C227 /* AllTests.m */; };
+ 14532D621761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5500FD7E7FB0018C227 /* TestI.m */; };
+ 14532D631761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5510FD7E7FB0018C227 /* Server.m */; };
+ 14532D641761D39700176FE1 /* InheritanceTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5520FD7E7FB0018C227 /* InheritanceTest.ice */; };
+ 14532D651761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5530FD7E7FB0018C227 /* Client.m */; };
+ 14532D661761D39700176FE1 /* InterceptorTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5590FD7E8080018C227 /* InterceptorTest.ice */; };
+ 14532D671761D39700176FE1 /* MyObjectI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B55B0FD7E8080018C227 /* MyObjectI.m */; };
+ 14532D681761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B55C0FD7E8080018C227 /* Client.m */; };
+ 14532D691761D39700176FE1 /* InterceptorI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B55D0FD7E8080018C227 /* InterceptorI.m */; };
+ 14532D6A1761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5630FD7E81B0018C227 /* Client.m */; };
+ 14532D6B1761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5650FD7E81B0018C227 /* Server.m */; };
+ 14532D6C1761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5660FD7E81B0018C227 /* TestI.m */; };
+ 14532D6D1761D39700176FE1 /* LocationTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5670FD7E81B0018C227 /* LocationTest.ice */; };
+ 14532D6E1761D39700176FE1 /* ServerLocator.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5680FD7E81B0018C227 /* ServerLocator.m */; };
+ 14532D6F1761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B56A0FD7E81B0018C227 /* AllTests.m */; };
+ 14532D701761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5710FD7E8270018C227 /* Client.m */; };
+ 14532D711761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5720FD7E8270018C227 /* TestI.m */; };
+ 14532D721761D39700176FE1 /* ObjectsTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5730FD7E8270018C227 /* ObjectsTest.ice */; };
+ 14532D731761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5740FD7E8270018C227 /* Server.m */; };
+ 14532D741761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5760FD7E8270018C227 /* AllTests.m */; };
+ 14532D751761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B57D0FD7E8390018C227 /* Client.m */; };
+ 14532D761761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B57E0FD7E8390018C227 /* Server.m */; };
+ 14532D771761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B57F0FD7E8390018C227 /* TestI.m */; };
+ 14532D781761D39700176FE1 /* ProxyTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5800FD7E8390018C227 /* ProxyTest.ice */; };
+ 14532D791761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5810FD7E8390018C227 /* AllTests.m */; };
+ 14532D7A1761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5870FD7E8440018C227 /* TestI.m */; };
+ 14532D7B1761D39700176FE1 /* RetryTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5880FD7E8440018C227 /* RetryTest.ice */; };
+ 14532D7C1761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B58A0FD7E8440018C227 /* AllTests.m */; };
+ 14532D7D1761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B58B0FD7E8440018C227 /* Client.m */; };
+ 14532D7E1761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B58C0FD7E8440018C227 /* Server.m */; };
+ 14532D7F1761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5920FD7E8560018C227 /* AllTests.m */; };
+ 14532D801761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5930FD7E8560018C227 /* Client.m */; };
+ 14532D811761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5940FD7E8560018C227 /* Server.m */; };
+ 14532D821761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5950FD7E8560018C227 /* TestI.m */; };
+ 14532D831761D39700176FE1 /* TimeoutTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5960FD7E8560018C227 /* TimeoutTest.ice */; };
+ 14532D841761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B59D0FD7E8640018C227 /* AllTests.m */; };
+ 14532D851761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B59E0FD7E8640018C227 /* Client.m */; };
+ 14532D861761D39700176FE1 /* SlicingExceptionsTestServer.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B59F0FD7E8640018C227 /* SlicingExceptionsTestServer.ice */; };
+ 14532D871761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5A00FD7E8640018C227 /* TestI.m */; };
+ 14532D881761D39700176FE1 /* SlicingExceptionsTestClient.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5A20FD7E8640018C227 /* SlicingExceptionsTestClient.ice */; };
+ 14532D891761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5A30FD7E8640018C227 /* Server.m */; };
+ 14532D8A1761D39700176FE1 /* AdapterDeactivationTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B6020FD7EFCC0018C227 /* AdapterDeactivationTest.ice */; };
+ 14532D8B1761D39700176FE1 /* OperationsTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B66A0FD7F41C0018C227 /* OperationsTest.ice */; };
+ 14532D8C1761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 146B33FF0FE8BC61009C6199 /* AllTests.m */; };
+ 14532D8D1761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 146B34000FE8BC61009C6199 /* Client.m */; };
+ 14532D8E1761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 146B34010FE8BC61009C6199 /* Server.m */; };
+ 14532D8F1761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 146B34040FE8BC61009C6199 /* TestI.m */; };
+ 14532D901761D39700176FE1 /* HoldTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 146B340A0FE8BD58009C6199 /* HoldTest.ice */; };
+ 14532D911761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 140A3927122CF11300E1931D /* TestI.m */; };
+ 14532D921761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 140A3929122CF11300E1931D /* Client.m */; };
+ 14532D931761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 140A392A122CF11300E1931D /* Server.m */; };
+ 14532D941761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 140A392B122CF11300E1931D /* AllTests.m */; };
+ 14532D951761D39700176FE1 /* AMITest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 140A392C122CF11300E1931D /* AMITest.ice */; };
+ 14532D961761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 140064131234DFE800249AA4 /* Server.m */; };
+ 14532D971761D39700176FE1 /* InvokeTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 140064141234DFE800249AA4 /* InvokeTest.ice */; };
+ 14532D981761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 140064151234DFE800249AA4 /* Client.m */; };
+ 14532D991761D39700176FE1 /* BlobjectI.m in Sources */ = {isa = PBXBuildFile; fileRef = 140064161234DFE800249AA4 /* BlobjectI.m */; };
+ 14532D9A1761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 140064181234DFE800249AA4 /* AllTests.m */; };
+ 14532D9B1761D39700176FE1 /* TwowaysNewAMI.m in Sources */ = {isa = PBXBuildFile; fileRef = 140064291234E0E900249AA4 /* TwowaysNewAMI.m */; };
+ 14532D9C1761D39700176FE1 /* OnewaysNewAMI.m in Sources */ = {isa = PBXBuildFile; fileRef = 1400642A1234E0E900249AA4 /* OnewaysNewAMI.m */; };
+ 14532D9D1761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 140157BA123645D0007C165E /* TestI.m */; };
+ 14532D9E1761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 140157BB123645D0007C165E /* AllTests.m */; };
+ 14532D9F1761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 140157BC123645D0007C165E /* Client.m */; };
+ 14532DA01761D39700176FE1 /* DispatcherTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 140157BE123645D0007C165E /* DispatcherTest.ice */; };
+ 14532DA11761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 140157BF123645D0007C165E /* Server.m */; };
+ 14532DA21761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 14D5BF951240C61900A19716 /* AllTests.m */; };
+ 14532DA31761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 14D5BF961240C61900A19716 /* Client.m */; };
+ 14532DA41761D39700176FE1 /* DefaultValueTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 14D5BF971240C61900A19716 /* DefaultValueTest.ice */; };
+ 14532DA51761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 820AA55E170D92D6000DD016 /* AllTests.m */; };
+ 14532DA61761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 820AA55F170D92D6000DD016 /* Client.m */; };
+ 14532DA71761D39700176FE1 /* HashTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 820AA560170D92D6000DD016 /* HashTest.ice */; };
+ 14532DA81761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F4E87F17328C7400920D6D /* AllTests.m */; };
+ 14532DA91761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F4E88017328C7400920D6D /* Client.m */; };
+ 14532DAA1761D39700176FE1 /* EnumTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 82F4E88117328C7400920D6D /* EnumTest.ice */; };
+ 14532DAB1761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F4E88417328C7400920D6D /* Server.m */; };
+ 14532DAC1761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F4E88617328C7400920D6D /* TestI.m */; };
+ 14532DAD1761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 82E5DA77173C1993007C2602 /* AllTests.m */; };
+ 14532DAE1761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 82E5DA7A173C1993007C2602 /* Client.m */; };
+ 14532DAF1761D39700176FE1 /* InfoTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 82E5DA7D173C1993007C2602 /* InfoTest.ice */; };
+ 14532DB01761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 82E5DA83173C1993007C2602 /* Server.m */; };
+ 14532DB11761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 82E5DA86173C1993007C2602 /* TestI.m */; };
+ 14532DB21761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8291AC031744E0C600A5CEFE /* AllTests.m */; };
+ 14532DB31761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 8291AC061744E0C600A5CEFE /* Client.m */; };
+ 14532DB41761D39700176FE1 /* MetricsTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 8291AC0A1744E0C600A5CEFE /* MetricsTest.ice */; };
+ 14532DB51761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 8291AC0F1744E0C600A5CEFE /* Server.m */; };
+ 14532DB61761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 8291AC121744E0C600A5CEFE /* TestI.m */; };
+ 14532DB71761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 82591289174D147C00B3F597 /* AllTests.m */; };
+ 14532DB81761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 8259128A174D147C00B3F597 /* Client.m */; };
+ 14532DB91761D39700176FE1 /* ServicesTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 8259128D174D147C00B3F597 /* ServicesTest.ice */; };
+ 14532DBA1761D39700176FE1 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 14B5567E1753721F00FDA693 /* AllTests.m */; };
+ 14532DBB1761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 14B5567F1753721F00FDA693 /* Client.m */; };
+ 14532DBC1761D39700176FE1 /* OptionalTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 14B556801753721F00FDA693 /* OptionalTest.ice */; };
+ 14532DBD1761D39700176FE1 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 14B556811753721F00FDA693 /* Server.m */; };
+ 14532DBE1761D39700176FE1 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 14B556831753721F00FDA693 /* TestI.m */; };
+ 14532DBF1761D39700176FE1 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 14CBD36B17588C51000D3373 /* Client.m */; };
+ 14532DC01761D39700176FE1 /* StreamTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 14CBD36C17588C51000D3373 /* StreamTest.ice */; };
+ 14532DC31761D39700176FE1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
+ 14532DC41761D39700176FE1 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 344126360FD8E8EA00C8D69C /* Security.framework */; };
+ 14532DC51761D39700176FE1 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 344126370FD8E8EA00C8D69C /* CFNetwork.framework */; };
+ 14532DC61761D39700176FE1 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34E396620FF1D71400FBACD6 /* CoreGraphics.framework */; };
+ 1469025C1CF7228100DE11F2 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 1469025B1CF7228100DE11F2 /* TestI.m */; };
+ 1469025D1CF7228100DE11F2 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 1469025B1CF7228100DE11F2 /* TestI.m */; };
+ 146B34050FE8BC61009C6199 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 146B33FF0FE8BC61009C6199 /* AllTests.m */; };
+ 146B34060FE8BC61009C6199 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 146B34000FE8BC61009C6199 /* Client.m */; };
+ 146B34070FE8BC61009C6199 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 146B34010FE8BC61009C6199 /* Server.m */; };
+ 146B34090FE8BC61009C6199 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 146B34040FE8BC61009C6199 /* TestI.m */; };
+ 146B340B0FE8BD58009C6199 /* HoldTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 146B340A0FE8BD58009C6199 /* HoldTest.ice */; };
+ 146D4AB21A77D82000930925 /* AdminTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 14F560DF1A7010B80028417F /* AdminTest.ice */; };
+ 146D4AB31A77D82000930925 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 14F560E01A7010B80028417F /* AllTests.m */; };
+ 146D4AB41A77D82000930925 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 14F560E11A7010B80028417F /* Client.m */; };
+ 146D4AB51A77D82000930925 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 14F560E21A7010B80028417F /* Server.m */; };
+ 146D4AB61A77D82000930925 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 14F560E41A7010B80028417F /* TestI.m */; };
+ 14934E65161AFC8C00348FC2 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 14934E64161AFC8C00348FC2 /* Default-568h@2x.png */; };
+ 14B556841753721F00FDA693 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 14B5567E1753721F00FDA693 /* AllTests.m */; };
+ 14B556851753721F00FDA693 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 14B5567F1753721F00FDA693 /* Client.m */; };
+ 14B556861753721F00FDA693 /* OptionalTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 14B556801753721F00FDA693 /* OptionalTest.ice */; };
+ 14B556871753721F00FDA693 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 14B556811753721F00FDA693 /* Server.m */; };
+ 14B556881753721F00FDA693 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 14B556831753721F00FDA693 /* TestI.m */; };
+ 14CBD36D17588C51000D3373 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 14CBD36B17588C51000D3373 /* Client.m */; };
+ 14CBD36E17588C51000D3373 /* StreamTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 14CBD36C17588C51000D3373 /* StreamTest.ice */; };
+ 14D5BF981240C61900A19716 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 14D5BF951240C61900A19716 /* AllTests.m */; };
+ 14D5BF991240C61900A19716 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 14D5BF961240C61900A19716 /* Client.m */; };
+ 14D5BF9A1240C61900A19716 /* DefaultValueTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 14D5BF971240C61900A19716 /* DefaultValueTest.ice */; };
+ 14F560E51A7010B80028417F /* AdminTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 14F560DF1A7010B80028417F /* AdminTest.ice */; };
+ 14F560E61A7010B80028417F /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 14F560E01A7010B80028417F /* AllTests.m */; };
+ 14F560E71A7010B80028417F /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 14F560E11A7010B80028417F /* Client.m */; };
+ 14F560E81A7010B80028417F /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 14F560E21A7010B80028417F /* Server.m */; };
+ 14F560E91A7010B80028417F /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 14F560E41A7010B80028417F /* TestI.m */; };
+ 1D3623260D0F684500981E51 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* AppDelegate.m */; };
+ 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
+ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
+ 2899E5220DE3E06400AC0155 /* TestView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2899E5210DE3E06400AC0155 /* TestView.xib */; };
+ 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; };
+ 28D7ACF80DDB3853001CB0EB /* TestViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* TestViewController.m */; };
+ 342EBA870E926E98000051FA /* server.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 342EBA860E926E98000051FA /* server.p12 */; };
+ 342EBA890E926E9F000051FA /* client.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 342EBA880E926E9F000051FA /* client.p12 */; };
+ 342EBA8B0E926F90000051FA /* cacert.der in Resources */ = {isa = PBXBuildFile; fileRef = 342EBA8A0E926F90000051FA /* cacert.der */; };
+ 344126380FD8E8EA00C8D69C /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 344126360FD8E8EA00C8D69C /* Security.framework */; };
+ 344126390FD8E8EA00C8D69C /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 344126370FD8E8EA00C8D69C /* CFNetwork.framework */; };
+ 34730A11122BF6C300D293CC /* TestSelect-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34730A10122BF6C300D293CC /* TestSelect-iPad.xib */; };
+ 34730A15122BF6ED00D293CC /* TestView-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34730A14122BF6ED00D293CC /* TestView-iPad.xib */; };
+ 34B3B4B50FD7A7700018C227 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B4AA0FD7A7700018C227 /* AllTests.m */; };
+ 34B3B4B60FD7A7700018C227 /* BatchOneways.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B4AB0FD7A7700018C227 /* BatchOneways.m */; };
+ 34B3B4B70FD7A7700018C227 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B4AC0FD7A7700018C227 /* Client.m */; };
+ 34B3B4B80FD7A7700018C227 /* Oneways.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B4AD0FD7A7700018C227 /* Oneways.m */; };
+ 34B3B4BA0FD7A7700018C227 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B4AF0FD7A7700018C227 /* Server.m */; };
+ 34B3B4BD0FD7A7700018C227 /* Twoways.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B4B30FD7A7700018C227 /* Twoways.m */; };
+ 34B3B4F30FD7A9660018C227 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B4F10FD7A9660018C227 /* TestI.m */; };
+ 34B3B5010FD7AB5C0018C227 /* TestCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5000FD7AB5C0018C227 /* TestCommon.m */; };
+ 34B3B5200FD7E7740018C227 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5180FD7E7740018C227 /* AllTests.m */; };
+ 34B3B5210FD7E7740018C227 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5190FD7E7740018C227 /* Client.m */; };
+ 34B3B5230FD7E7740018C227 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B51C0FD7E7740018C227 /* Server.m */; };
+ 34B3B5250FD7E7740018C227 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B51F0FD7E7740018C227 /* TestI.m */; };
+ 34B3B52C0FD7E78B0018C227 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5260FD7E78B0018C227 /* AllTests.m */; };
+ 34B3B52D0FD7E78B0018C227 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5270FD7E78B0018C227 /* Client.m */; };
+ 34B3B52E0FD7E78B0018C227 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5280FD7E78B0018C227 /* Server.m */; };
+ 34B3B52F0FD7E78B0018C227 /* BindingTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5290FD7E78B0018C227 /* BindingTest.ice */; };
+ 34B3B5300FD7E78B0018C227 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B52B0FD7E78B0018C227 /* TestI.m */; };
+ 34B3B5350FD7E7BD0018C227 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5320FD7E7BD0018C227 /* Client.m */; };
+ 34B3B5360FD7E7BD0018C227 /* DefaultServantTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5330FD7E7BD0018C227 /* DefaultServantTest.ice */; };
+ 34B3B53E0FD7E7CA0018C227 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5380FD7E7CA0018C227 /* Client.m */; };
+ 34B3B53F0FD7E7CA0018C227 /* ExceptionsTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5390FD7E7CA0018C227 /* ExceptionsTest.ice */; };
+ 34B3B5400FD7E7CA0018C227 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B53A0FD7E7CA0018C227 /* TestI.m */; };
+ 34B3B5410FD7E7CA0018C227 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B53B0FD7E7CA0018C227 /* AllTests.m */; };
+ 34B3B5420FD7E7CA0018C227 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B53D0FD7E7CA0018C227 /* Server.m */; };
+ 34B3B5490FD7E7E60018C227 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5430FD7E7E60018C227 /* TestI.m */; };
+ 34B3B54A0FD7E7E60018C227 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5440FD7E7E60018C227 /* AllTests.m */; };
+ 34B3B54B0FD7E7E60018C227 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5450FD7E7E60018C227 /* Client.m */; };
+ 34B3B54C0FD7E7E60018C227 /* FacetsTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5460FD7E7E60018C227 /* FacetsTest.ice */; };
+ 34B3B54D0FD7E7E60018C227 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5480FD7E7E60018C227 /* Server.m */; };
+ 34B3B5540FD7E7FB0018C227 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B54F0FD7E7FB0018C227 /* AllTests.m */; };
+ 34B3B5550FD7E7FB0018C227 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5500FD7E7FB0018C227 /* TestI.m */; };
+ 34B3B5560FD7E7FB0018C227 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5510FD7E7FB0018C227 /* Server.m */; };
+ 34B3B5570FD7E7FB0018C227 /* InheritanceTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5520FD7E7FB0018C227 /* InheritanceTest.ice */; };
+ 34B3B5580FD7E7FB0018C227 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5530FD7E7FB0018C227 /* Client.m */; };
+ 34B3B55F0FD7E8080018C227 /* InterceptorTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5590FD7E8080018C227 /* InterceptorTest.ice */; };
+ 34B3B5600FD7E8080018C227 /* MyObjectI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B55B0FD7E8080018C227 /* MyObjectI.m */; };
+ 34B3B5610FD7E8080018C227 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B55C0FD7E8080018C227 /* Client.m */; };
+ 34B3B5620FD7E8080018C227 /* InterceptorI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B55D0FD7E8080018C227 /* InterceptorI.m */; };
+ 34B3B56B0FD7E81B0018C227 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5630FD7E81B0018C227 /* Client.m */; };
+ 34B3B56C0FD7E81B0018C227 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5650FD7E81B0018C227 /* Server.m */; };
+ 34B3B56D0FD7E81B0018C227 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5660FD7E81B0018C227 /* TestI.m */; };
+ 34B3B56E0FD7E81B0018C227 /* LocationTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5670FD7E81B0018C227 /* LocationTest.ice */; };
+ 34B3B56F0FD7E81B0018C227 /* ServerLocator.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5680FD7E81B0018C227 /* ServerLocator.m */; };
+ 34B3B5700FD7E81B0018C227 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B56A0FD7E81B0018C227 /* AllTests.m */; };
+ 34B3B5770FD7E8270018C227 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5710FD7E8270018C227 /* Client.m */; };
+ 34B3B5780FD7E8270018C227 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5720FD7E8270018C227 /* TestI.m */; };
+ 34B3B5790FD7E8270018C227 /* ObjectsTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5730FD7E8270018C227 /* ObjectsTest.ice */; };
+ 34B3B57A0FD7E8270018C227 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5740FD7E8270018C227 /* Server.m */; };
+ 34B3B57B0FD7E8270018C227 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5760FD7E8270018C227 /* AllTests.m */; };
+ 34B3B5820FD7E8390018C227 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B57D0FD7E8390018C227 /* Client.m */; };
+ 34B3B5830FD7E8390018C227 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B57E0FD7E8390018C227 /* Server.m */; };
+ 34B3B5840FD7E8390018C227 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B57F0FD7E8390018C227 /* TestI.m */; };
+ 34B3B5850FD7E8390018C227 /* ProxyTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5800FD7E8390018C227 /* ProxyTest.ice */; };
+ 34B3B5860FD7E8390018C227 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5810FD7E8390018C227 /* AllTests.m */; };
+ 34B3B58D0FD7E8440018C227 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5870FD7E8440018C227 /* TestI.m */; };
+ 34B3B58E0FD7E8440018C227 /* RetryTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5880FD7E8440018C227 /* RetryTest.ice */; };
+ 34B3B58F0FD7E8440018C227 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B58A0FD7E8440018C227 /* AllTests.m */; };
+ 34B3B5900FD7E8440018C227 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B58B0FD7E8440018C227 /* Client.m */; };
+ 34B3B5910FD7E8440018C227 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B58C0FD7E8440018C227 /* Server.m */; };
+ 34B3B5980FD7E8560018C227 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5920FD7E8560018C227 /* AllTests.m */; };
+ 34B3B5990FD7E8560018C227 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5930FD7E8560018C227 /* Client.m */; };
+ 34B3B59A0FD7E8560018C227 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5940FD7E8560018C227 /* Server.m */; };
+ 34B3B59B0FD7E8560018C227 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5950FD7E8560018C227 /* TestI.m */; };
+ 34B3B59C0FD7E8560018C227 /* TimeoutTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5960FD7E8560018C227 /* TimeoutTest.ice */; };
+ 34B3B5A40FD7E8640018C227 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B59D0FD7E8640018C227 /* AllTests.m */; };
+ 34B3B5A50FD7E8640018C227 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B59E0FD7E8640018C227 /* Client.m */; };
+ 34B3B5A60FD7E8640018C227 /* SlicingExceptionsTestServer.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B59F0FD7E8640018C227 /* SlicingExceptionsTestServer.ice */; };
+ 34B3B5A70FD7E8640018C227 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5A00FD7E8640018C227 /* TestI.m */; };
+ 34B3B5A80FD7E8640018C227 /* SlicingExceptionsTestClient.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5A20FD7E8640018C227 /* SlicingExceptionsTestClient.ice */; };
+ 34B3B5A90FD7E8640018C227 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B5A30FD7E8640018C227 /* Server.m */; };
+ 34B3B6030FD7EFCC0018C227 /* AdapterDeactivationTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B6020FD7EFCC0018C227 /* AdapterDeactivationTest.ice */; };
+ 34B3B66B0FD7F41C0018C227 /* OperationsTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 34B3B66A0FD7F41C0018C227 /* OperationsTest.ice */; };
+ 34B7662A0E8D55E700CE4701 /* TestSelectController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B766290E8D55E700CE4701 /* TestSelectController.m */; };
+ 34B7662C0E8D55FE00CE4701 /* TestSelect.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34B7662B0E8D55FE00CE4701 /* TestSelect.xib */; };
+ 34B766340E8D56C700CE4701 /* Test.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B766330E8D56C700CE4701 /* Test.m */; };
+ 34C618AF122C035000F60A28 /* MainWindow-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34C618AE122C035000F60A28 /* MainWindow-iPad.xib */; };
+ 34E396630FF1D71400FBACD6 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34E396620FF1D71400FBACD6 /* CoreGraphics.framework */; };
+ 820AA561170D92D6000DD016 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 820AA55E170D92D6000DD016 /* AllTests.m */; };
+ 820AA562170D92D6000DD016 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 820AA55F170D92D6000DD016 /* Client.m */; };
+ 820AA563170D92D6000DD016 /* HashTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 820AA560170D92D6000DD016 /* HashTest.ice */; };
+ 8259128F174D147C00B3F597 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 82591289174D147C00B3F597 /* AllTests.m */; };
+ 82591290174D147C00B3F597 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 8259128A174D147C00B3F597 /* Client.m */; };
+ 82591293174D147C00B3F597 /* ServicesTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 8259128D174D147C00B3F597 /* ServicesTest.ice */; };
+ 8291AC171744E0C600A5CEFE /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8291AC031744E0C600A5CEFE /* AllTests.m */; };
+ 8291AC1A1744E0C600A5CEFE /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 8291AC061744E0C600A5CEFE /* Client.m */; };
+ 8291AC1D1744E0C600A5CEFE /* MetricsTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 8291AC0A1744E0C600A5CEFE /* MetricsTest.ice */; };
+ 8291AC221744E0C600A5CEFE /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 8291AC0F1744E0C600A5CEFE /* Server.m */; };
+ 8291AC241744E0C600A5CEFE /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 8291AC121744E0C600A5CEFE /* TestI.m */; };
+ 82D53AA71823264600703264 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 82D53AA61823264600703264 /* Images.xcassets */; };
+ 82E5DA8B173C1993007C2602 /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 82E5DA77173C1993007C2602 /* AllTests.m */; };
+ 82E5DA8E173C1993007C2602 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 82E5DA7A173C1993007C2602 /* Client.m */; };
+ 82E5DA90173C1993007C2602 /* InfoTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 82E5DA7D173C1993007C2602 /* InfoTest.ice */; };
+ 82E5DA96173C1993007C2602 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 82E5DA83173C1993007C2602 /* Server.m */; };
+ 82E5DA98173C1993007C2602 /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 82E5DA86173C1993007C2602 /* TestI.m */; };
+ 82F4E88A17328C7400920D6D /* AllTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F4E87F17328C7400920D6D /* AllTests.m */; };
+ 82F4E88B17328C7400920D6D /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F4E88017328C7400920D6D /* Client.m */; };
+ 82F4E88C17328C7400920D6D /* EnumTest.ice in Sources */ = {isa = PBXBuildFile; fileRef = 82F4E88117328C7400920D6D /* EnumTest.ice */; };
+ 82F4E88F17328C7400920D6D /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F4E88417328C7400920D6D /* Server.m */; };
+ 82F4E89017328C7400920D6D /* TestI.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F4E88617328C7400920D6D /* TestI.m */; };
+ D83717A01BFFC5BE005D65BC /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 82D53AA61823264600703264 /* Images.xcassets */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 140064131234DFE800249AA4 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = ../Ice/invoke/Server.m; sourceTree = SOURCE_ROOT; };
+ 140064141234DFE800249AA4 /* InvokeTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = InvokeTest.ice; path = ../Ice/invoke/InvokeTest.ice; sourceTree = SOURCE_ROOT; };
+ 140064151234DFE800249AA4 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/invoke/Client.m; sourceTree = SOURCE_ROOT; };
+ 140064161234DFE800249AA4 /* BlobjectI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BlobjectI.m; path = ../Ice/invoke/BlobjectI.m; sourceTree = SOURCE_ROOT; };
+ 140064171234DFE800249AA4 /* BlobjectI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BlobjectI.h; path = ../Ice/invoke/BlobjectI.h; sourceTree = SOURCE_ROOT; };
+ 140064181234DFE800249AA4 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/invoke/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 140064291234E0E900249AA4 /* TwowaysNewAMI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TwowaysNewAMI.m; path = ../Ice/operations/TwowaysNewAMI.m; sourceTree = SOURCE_ROOT; };
+ 1400642A1234E0E900249AA4 /* OnewaysNewAMI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OnewaysNewAMI.m; path = ../Ice/operations/OnewaysNewAMI.m; sourceTree = SOURCE_ROOT; };
+ 140157B9123645D0007C165E /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = ../Ice/dispatcher/TestI.h; sourceTree = SOURCE_ROOT; };
+ 140157BA123645D0007C165E /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = ../Ice/dispatcher/TestI.m; sourceTree = SOURCE_ROOT; };
+ 140157BB123645D0007C165E /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/dispatcher/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 140157BC123645D0007C165E /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/dispatcher/Client.m; sourceTree = SOURCE_ROOT; };
+ 140157BE123645D0007C165E /* DispatcherTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = DispatcherTest.ice; path = ../Ice/dispatcher/DispatcherTest.ice; sourceTree = SOURCE_ROOT; };
+ 140157BF123645D0007C165E /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = ../Ice/dispatcher/Server.m; sourceTree = SOURCE_ROOT; };
+ 140A3927122CF11300E1931D /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = ../Ice/ami/TestI.m; sourceTree = SOURCE_ROOT; };
+ 140A3928122CF11300E1931D /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = ../Ice/ami/TestI.h; sourceTree = SOURCE_ROOT; };
+ 140A3929122CF11300E1931D /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/ami/Client.m; sourceTree = SOURCE_ROOT; };
+ 140A392A122CF11300E1931D /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = ../Ice/ami/Server.m; sourceTree = SOURCE_ROOT; };
+ 140A392B122CF11300E1931D /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/ami/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 140A392C122CF11300E1931D /* AMITest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = AMITest.ice; path = ../Ice/ami/AMITest.ice; sourceTree = SOURCE_ROOT; };
+ 14103B0B1CF892720097DE5A /* ExternalAccessory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ExternalAccessory.framework; path = System/Library/Frameworks/ExternalAccessory.framework; sourceTree = SDKROOT; };
+ 1450A1081ABC09B400A71895 /* BatchOnewaysAMI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BatchOnewaysAMI.m; path = "../../../../ice/objective-c/test/Ice/operations/BatchOnewaysAMI.m"; sourceTree = "<group>"; };
+ 14532DCD1761D39700176FE1 /* Objective-C Test Suite.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Objective-C Test Suite.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 14532DCE1761D39700176FE1 /* Info-ARC.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-ARC.plist"; path = "/Users/joe/Development/ZeroC/icetouch/test/objective-c/iPhone/container/Info-ARC.plist"; sourceTree = "<absolute>"; };
+ 1469025A1CF7228100DE11F2 /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = ../Ice/defaultServant/TestI.h; sourceTree = "<group>"; };
+ 1469025B1CF7228100DE11F2 /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = ../Ice/defaultServant/TestI.m; sourceTree = "<group>"; };
+ 146B33FF0FE8BC61009C6199 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/hold/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 146B34000FE8BC61009C6199 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/hold/Client.m; sourceTree = SOURCE_ROOT; };
+ 146B34010FE8BC61009C6199 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = ../Ice/hold/Server.m; sourceTree = SOURCE_ROOT; };
+ 146B34030FE8BC61009C6199 /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = ../Ice/hold/TestI.h; sourceTree = SOURCE_ROOT; };
+ 146B34040FE8BC61009C6199 /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = ../Ice/hold/TestI.m; sourceTree = SOURCE_ROOT; };
+ 146B340A0FE8BD58009C6199 /* HoldTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = HoldTest.ice; path = ../Ice/hold/HoldTest.ice; sourceTree = SOURCE_ROOT; };
+ 14934E64161AFC8C00348FC2 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
+ 14B5567E1753721F00FDA693 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = "../../../../ice/objective-c/test/Ice/optional/AllTests.m"; sourceTree = "<group>"; };
+ 14B5567F1753721F00FDA693 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = "../../../../ice/objective-c/test/Ice/optional/Client.m"; sourceTree = "<group>"; };
+ 14B556801753721F00FDA693 /* OptionalTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = OptionalTest.ice; path = "../../../../ice/objective-c/test/Ice/optional/OptionalTest.ice"; sourceTree = "<group>"; };
+ 14B556811753721F00FDA693 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = "../../../../ice/objective-c/test/Ice/optional/Server.m"; sourceTree = "<group>"; };
+ 14B556821753721F00FDA693 /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = "../../../../ice/objective-c/test/Ice/optional/TestI.h"; sourceTree = "<group>"; };
+ 14B556831753721F00FDA693 /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = "../../../../ice/objective-c/test/Ice/optional/TestI.m"; sourceTree = "<group>"; };
+ 14CBD36B17588C51000D3373 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = "../../../../ice/objective-c/test/Ice/stream/Client.m"; sourceTree = "<group>"; };
+ 14CBD36C17588C51000D3373 /* StreamTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = StreamTest.ice; path = "../../../../ice/objective-c/test/Ice/stream/StreamTest.ice"; sourceTree = "<group>"; };
+ 14D5BF951240C61900A19716 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/defaultValue/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 14D5BF961240C61900A19716 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/defaultValue/Client.m; sourceTree = SOURCE_ROOT; };
+ 14D5BF971240C61900A19716 /* DefaultValueTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = DefaultValueTest.ice; path = ../Ice/defaultValue/DefaultValueTest.ice; sourceTree = SOURCE_ROOT; };
+ 14F560DF1A7010B80028417F /* AdminTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = AdminTest.ice; path = "../../../../ice/objective-c/test/Ice/admin/AdminTest.ice"; sourceTree = "<group>"; };
+ 14F560E01A7010B80028417F /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = "../../../../ice/objective-c/test/Ice/admin/AllTests.m"; sourceTree = "<group>"; };
+ 14F560E11A7010B80028417F /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = "../../../../ice/objective-c/test/Ice/admin/Client.m"; sourceTree = "<group>"; };
+ 14F560E21A7010B80028417F /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = "../../../../ice/objective-c/test/Ice/admin/Server.m"; sourceTree = "<group>"; };
+ 14F560E31A7010B80028417F /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = "../../../../ice/objective-c/test/Ice/admin/TestI.h"; sourceTree = "<group>"; };
+ 14F560E41A7010B80028417F /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = "../../../../ice/objective-c/test/Ice/admin/TestI.m"; sourceTree = "<group>"; };
+ 1D3623240D0F684500981E51 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+ 1D3623250D0F684500981E51 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+ 1D6058910D05DD3D006BFB54 /* Objective-C Test Suite.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Objective-C Test Suite.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ 2899E5210DE3E06400AC0155 /* TestView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TestView.xib; sourceTree = "<group>"; };
+ 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = "<group>"; };
+ 28D7ACF60DDB3853001CB0EB /* TestViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestViewController.h; sourceTree = "<group>"; };
+ 28D7ACF70DDB3853001CB0EB /* TestViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestViewController.m; sourceTree = "<group>"; };
+ 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ 32CA4F630368D1EE00C91783 /* Objective-C Test Suite_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Objective-C Test Suite_Prefix.pch"; sourceTree = "<group>"; };
+ 342EBA860E926E98000051FA /* server.p12 */ = {isa = PBXFileReference; lastKnownFileType = file; name = server.p12; path = ../../../certs/server.p12; sourceTree = SOURCE_ROOT; };
+ 342EBA880E926E9F000051FA /* client.p12 */ = {isa = PBXFileReference; lastKnownFileType = file; name = client.p12; path = ../../../certs/client.p12; sourceTree = SOURCE_ROOT; };
+ 342EBA8A0E926F90000051FA /* cacert.der */ = {isa = PBXFileReference; lastKnownFileType = file; name = cacert.der; path = ../../../certs/cacert.der; sourceTree = SOURCE_ROOT; };
+ 344126360FD8E8EA00C8D69C /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
+ 344126370FD8E8EA00C8D69C /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; };
+ 34730A10122BF6C300D293CC /* TestSelect-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "TestSelect-iPad.xib"; sourceTree = "<group>"; };
+ 34730A14122BF6ED00D293CC /* TestView-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "TestView-iPad.xib"; sourceTree = "<group>"; };
+ 34B3B4AA0FD7A7700018C227 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/operations/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 34B3B4AB0FD7A7700018C227 /* BatchOneways.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BatchOneways.m; path = ../Ice/operations/BatchOneways.m; sourceTree = SOURCE_ROOT; };
+ 34B3B4AC0FD7A7700018C227 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/operations/Client.m; sourceTree = SOURCE_ROOT; };
+ 34B3B4AD0FD7A7700018C227 /* Oneways.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Oneways.m; path = ../Ice/operations/Oneways.m; sourceTree = SOURCE_ROOT; };
+ 34B3B4AF0FD7A7700018C227 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = ../Ice/operations/Server.m; sourceTree = SOURCE_ROOT; };
+ 34B3B4B30FD7A7700018C227 /* Twoways.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Twoways.m; path = ../Ice/operations/Twoways.m; sourceTree = SOURCE_ROOT; };
+ 34B3B4F00FD7A9660018C227 /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = ../Ice/operations/TestI.h; sourceTree = SOURCE_ROOT; };
+ 34B3B4F10FD7A9660018C227 /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = ../Ice/operations/TestI.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5000FD7AB5C0018C227 /* TestCommon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestCommon.m; path = ../Common/TestCommon.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5180FD7E7740018C227 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/adapterDeactivation/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5190FD7E7740018C227 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/adapterDeactivation/Client.m; sourceTree = SOURCE_ROOT; };
+ 34B3B51C0FD7E7740018C227 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = ../Ice/adapterDeactivation/Server.m; sourceTree = SOURCE_ROOT; };
+ 34B3B51E0FD7E7740018C227 /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = ../Ice/adapterDeactivation/TestI.h; sourceTree = SOURCE_ROOT; };
+ 34B3B51F0FD7E7740018C227 /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = ../Ice/adapterDeactivation/TestI.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5260FD7E78B0018C227 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/binding/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5270FD7E78B0018C227 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/binding/Client.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5280FD7E78B0018C227 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = ../Ice/binding/Server.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5290FD7E78B0018C227 /* BindingTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = BindingTest.ice; path = ../Ice/binding/BindingTest.ice; sourceTree = SOURCE_ROOT; };
+ 34B3B52A0FD7E78B0018C227 /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = ../Ice/binding/TestI.h; sourceTree = SOURCE_ROOT; };
+ 34B3B52B0FD7E78B0018C227 /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = ../Ice/binding/TestI.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5320FD7E7BD0018C227 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/defaultServant/Client.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5330FD7E7BD0018C227 /* DefaultServantTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = DefaultServantTest.ice; path = ../Ice/defaultServant/DefaultServantTest.ice; sourceTree = SOURCE_ROOT; };
+ 34B3B5380FD7E7CA0018C227 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/exceptions/Client.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5390FD7E7CA0018C227 /* ExceptionsTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = ExceptionsTest.ice; path = ../Ice/exceptions/ExceptionsTest.ice; sourceTree = SOURCE_ROOT; };
+ 34B3B53A0FD7E7CA0018C227 /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = ../Ice/exceptions/TestI.m; sourceTree = SOURCE_ROOT; };
+ 34B3B53B0FD7E7CA0018C227 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/exceptions/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 34B3B53C0FD7E7CA0018C227 /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = ../Ice/exceptions/TestI.h; sourceTree = SOURCE_ROOT; };
+ 34B3B53D0FD7E7CA0018C227 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = ../Ice/exceptions/Server.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5430FD7E7E60018C227 /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = ../Ice/facets/TestI.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5440FD7E7E60018C227 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/facets/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5450FD7E7E60018C227 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/facets/Client.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5460FD7E7E60018C227 /* FacetsTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = FacetsTest.ice; path = ../Ice/facets/FacetsTest.ice; sourceTree = SOURCE_ROOT; };
+ 34B3B5470FD7E7E60018C227 /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = ../Ice/facets/TestI.h; sourceTree = SOURCE_ROOT; };
+ 34B3B5480FD7E7E60018C227 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = ../Ice/facets/Server.m; sourceTree = SOURCE_ROOT; };
+ 34B3B54E0FD7E7FB0018C227 /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = ../Ice/inheritance/TestI.h; sourceTree = SOURCE_ROOT; };
+ 34B3B54F0FD7E7FB0018C227 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/inheritance/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5500FD7E7FB0018C227 /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = ../Ice/inheritance/TestI.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5510FD7E7FB0018C227 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = ../Ice/inheritance/Server.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5520FD7E7FB0018C227 /* InheritanceTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = InheritanceTest.ice; path = ../Ice/inheritance/InheritanceTest.ice; sourceTree = SOURCE_ROOT; };
+ 34B3B5530FD7E7FB0018C227 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/inheritance/Client.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5590FD7E8080018C227 /* InterceptorTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = InterceptorTest.ice; path = ../Ice/interceptor/InterceptorTest.ice; sourceTree = SOURCE_ROOT; };
+ 34B3B55A0FD7E8080018C227 /* MyObjectI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyObjectI.h; path = ../Ice/interceptor/MyObjectI.h; sourceTree = SOURCE_ROOT; };
+ 34B3B55B0FD7E8080018C227 /* MyObjectI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MyObjectI.m; path = ../Ice/interceptor/MyObjectI.m; sourceTree = SOURCE_ROOT; };
+ 34B3B55C0FD7E8080018C227 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/interceptor/Client.m; sourceTree = SOURCE_ROOT; };
+ 34B3B55D0FD7E8080018C227 /* InterceptorI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = InterceptorI.m; path = ../Ice/interceptor/InterceptorI.m; sourceTree = SOURCE_ROOT; };
+ 34B3B55E0FD7E8080018C227 /* InterceptorI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = InterceptorI.h; path = ../Ice/interceptor/InterceptorI.h; sourceTree = SOURCE_ROOT; };
+ 34B3B5630FD7E81B0018C227 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/location/Client.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5640FD7E81B0018C227 /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = ../Ice/location/TestI.h; sourceTree = SOURCE_ROOT; };
+ 34B3B5650FD7E81B0018C227 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = ../Ice/location/Server.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5660FD7E81B0018C227 /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = ../Ice/location/TestI.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5670FD7E81B0018C227 /* LocationTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = LocationTest.ice; path = ../Ice/location/LocationTest.ice; sourceTree = SOURCE_ROOT; };
+ 34B3B5680FD7E81B0018C227 /* ServerLocator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ServerLocator.m; path = ../Ice/location/ServerLocator.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5690FD7E81B0018C227 /* ServerLocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ServerLocator.h; path = ../Ice/location/ServerLocator.h; sourceTree = SOURCE_ROOT; };
+ 34B3B56A0FD7E81B0018C227 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/location/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5710FD7E8270018C227 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/objects/Client.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5720FD7E8270018C227 /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = ../Ice/objects/TestI.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5730FD7E8270018C227 /* ObjectsTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = ObjectsTest.ice; path = ../Ice/objects/ObjectsTest.ice; sourceTree = SOURCE_ROOT; };
+ 34B3B5740FD7E8270018C227 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = ../Ice/objects/Server.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5750FD7E8270018C227 /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = ../Ice/objects/TestI.h; sourceTree = SOURCE_ROOT; };
+ 34B3B5760FD7E8270018C227 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/objects/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 34B3B57C0FD7E8390018C227 /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = ../Ice/proxy/TestI.h; sourceTree = SOURCE_ROOT; };
+ 34B3B57D0FD7E8390018C227 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/proxy/Client.m; sourceTree = SOURCE_ROOT; };
+ 34B3B57E0FD7E8390018C227 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = ../Ice/proxy/Server.m; sourceTree = SOURCE_ROOT; };
+ 34B3B57F0FD7E8390018C227 /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = ../Ice/proxy/TestI.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5800FD7E8390018C227 /* ProxyTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = ProxyTest.ice; path = ../Ice/proxy/ProxyTest.ice; sourceTree = SOURCE_ROOT; };
+ 34B3B5810FD7E8390018C227 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/proxy/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5870FD7E8440018C227 /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = ../Ice/retry/TestI.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5880FD7E8440018C227 /* RetryTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = RetryTest.ice; path = ../Ice/retry/RetryTest.ice; sourceTree = SOURCE_ROOT; };
+ 34B3B5890FD7E8440018C227 /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = ../Ice/retry/TestI.h; sourceTree = SOURCE_ROOT; };
+ 34B3B58A0FD7E8440018C227 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/retry/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 34B3B58B0FD7E8440018C227 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/retry/Client.m; sourceTree = SOURCE_ROOT; };
+ 34B3B58C0FD7E8440018C227 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = ../Ice/retry/Server.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5920FD7E8560018C227 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/timeout/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5930FD7E8560018C227 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/timeout/Client.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5940FD7E8560018C227 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = ../Ice/timeout/Server.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5950FD7E8560018C227 /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = ../Ice/timeout/TestI.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5960FD7E8560018C227 /* TimeoutTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = TimeoutTest.ice; path = ../Ice/timeout/TimeoutTest.ice; sourceTree = SOURCE_ROOT; };
+ 34B3B5970FD7E8560018C227 /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = ../Ice/timeout/TestI.h; sourceTree = SOURCE_ROOT; };
+ 34B3B59D0FD7E8640018C227 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = ../Ice/slicing/exceptions/AllTests.m; sourceTree = SOURCE_ROOT; };
+ 34B3B59E0FD7E8640018C227 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = ../Ice/slicing/exceptions/Client.m; sourceTree = SOURCE_ROOT; };
+ 34B3B59F0FD7E8640018C227 /* SlicingExceptionsTestServer.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = SlicingExceptionsTestServer.ice; path = ../Ice/slicing/exceptions/SlicingExceptionsTestServer.ice; sourceTree = SOURCE_ROOT; };
+ 34B3B5A00FD7E8640018C227 /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestI.m; path = ../Ice/slicing/exceptions/TestI.m; sourceTree = SOURCE_ROOT; };
+ 34B3B5A10FD7E8640018C227 /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestI.h; path = ../Ice/slicing/exceptions/TestI.h; sourceTree = SOURCE_ROOT; };
+ 34B3B5A20FD7E8640018C227 /* SlicingExceptionsTestClient.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = SlicingExceptionsTestClient.ice; path = ../Ice/slicing/exceptions/SlicingExceptionsTestClient.ice; sourceTree = SOURCE_ROOT; };
+ 34B3B5A30FD7E8640018C227 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Server.m; path = ../Ice/slicing/exceptions/Server.m; sourceTree = SOURCE_ROOT; };
+ 34B3B6020FD7EFCC0018C227 /* AdapterDeactivationTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = AdapterDeactivationTest.ice; path = ../Ice/adapterDeactivation/AdapterDeactivationTest.ice; sourceTree = SOURCE_ROOT; };
+ 34B3B66A0FD7F41C0018C227 /* OperationsTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = OperationsTest.ice; path = ../Ice/operations/OperationsTest.ice; sourceTree = SOURCE_ROOT; };
+ 34B766280E8D55E700CE4701 /* TestSelectController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestSelectController.h; sourceTree = "<group>"; };
+ 34B766290E8D55E700CE4701 /* TestSelectController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestSelectController.m; sourceTree = "<group>"; };
+ 34B7662B0E8D55FE00CE4701 /* TestSelect.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TestSelect.xib; sourceTree = "<group>"; };
+ 34B766320E8D56C700CE4701 /* Test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Test.h; sourceTree = "<group>"; };
+ 34B766330E8D56C700CE4701 /* Test.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Test.m; sourceTree = "<group>"; };
+ 34C618AE122C035000F60A28 /* MainWindow-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "MainWindow-iPad.xib"; sourceTree = "<group>"; };
+ 34E396620FF1D71400FBACD6 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ 820AA55E170D92D6000DD016 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AllTests.m; path = "../../../../ice/objective-c/test/Ice/hash/AllTests.m"; sourceTree = "<group>"; };
+ 820AA55F170D92D6000DD016 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Client.m; path = "../../../../ice/objective-c/test/Ice/hash/Client.m"; sourceTree = "<group>"; };
+ 820AA560170D92D6000DD016 /* HashTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; name = HashTest.ice; path = "../../../../ice/objective-c/test/Ice/hash/HashTest.ice"; sourceTree = "<group>"; };
+ 82591289174D147C00B3F597 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AllTests.m; sourceTree = "<group>"; };
+ 8259128A174D147C00B3F597 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Client.m; sourceTree = "<group>"; };
+ 8259128D174D147C00B3F597 /* ServicesTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; path = ServicesTest.ice; sourceTree = "<group>"; };
+ 8291AC031744E0C600A5CEFE /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AllTests.m; sourceTree = "<group>"; };
+ 8291AC061744E0C600A5CEFE /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Client.m; sourceTree = "<group>"; };
+ 8291AC0A1744E0C600A5CEFE /* MetricsTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; path = MetricsTest.ice; sourceTree = "<group>"; };
+ 8291AC0F1744E0C600A5CEFE /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Server.m; sourceTree = "<group>"; };
+ 8291AC111744E0C600A5CEFE /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestI.h; sourceTree = "<group>"; };
+ 8291AC121744E0C600A5CEFE /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestI.m; sourceTree = "<group>"; };
+ 82D53AA61823264600703264 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
+ 82E5DA77173C1993007C2602 /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AllTests.m; sourceTree = "<group>"; };
+ 82E5DA7A173C1993007C2602 /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Client.m; sourceTree = "<group>"; };
+ 82E5DA7D173C1993007C2602 /* InfoTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; path = InfoTest.ice; sourceTree = "<group>"; };
+ 82E5DA83173C1993007C2602 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Server.m; sourceTree = "<group>"; };
+ 82E5DA85173C1993007C2602 /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestI.h; sourceTree = "<group>"; };
+ 82E5DA86173C1993007C2602 /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestI.m; sourceTree = "<group>"; };
+ 82F4E87F17328C7400920D6D /* AllTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AllTests.m; sourceTree = "<group>"; };
+ 82F4E88017328C7400920D6D /* Client.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Client.m; sourceTree = "<group>"; };
+ 82F4E88117328C7400920D6D /* EnumTest.ice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.slice; path = EnumTest.ice; sourceTree = "<group>"; };
+ 82F4E88417328C7400920D6D /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Server.m; sourceTree = "<group>"; };
+ 82F4E88517328C7400920D6D /* TestI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestI.h; sourceTree = "<group>"; };
+ 82F4E88617328C7400920D6D /* TestI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestI.m; sourceTree = "<group>"; };
+ 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 14532DC11761D39700176FE1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 14103B0D1CF8927D0097DE5A /* ExternalAccessory.framework in Frameworks */,
+ 14532DC31761D39700176FE1 /* UIKit.framework in Frameworks */,
+ 14532DC41761D39700176FE1 /* Security.framework in Frameworks */,
+ 14532DC51761D39700176FE1 /* CFNetwork.framework in Frameworks */,
+ 14532DC61761D39700176FE1 /* CoreGraphics.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 1D60588F0D05DD3D006BFB54 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 14103B0C1CF892720097DE5A /* ExternalAccessory.framework in Frameworks */,
+ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
+ 344126380FD8E8EA00C8D69C /* Security.framework in Frameworks */,
+ 344126390FD8E8EA00C8D69C /* CFNetwork.framework in Frameworks */,
+ 34E396630FF1D71400FBACD6 /* CoreGraphics.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 080E96DDFE201D6D7F000001 /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ 1D3623240D0F684500981E51 /* AppDelegate.h */,
+ 1D3623250D0F684500981E51 /* AppDelegate.m */,
+ 28D7ACF60DDB3853001CB0EB /* TestViewController.h */,
+ 28D7ACF70DDB3853001CB0EB /* TestViewController.m */,
+ 34B766280E8D55E700CE4701 /* TestSelectController.h */,
+ 34B766290E8D55E700CE4701 /* TestSelectController.m */,
+ 34B766320E8D56C700CE4701 /* Test.h */,
+ 34B766330E8D56C700CE4701 /* Test.m */,
+ );
+ path = Classes;
+ sourceTree = "<group>";
+ };
+ 140064111234DFBF00249AA4 /* invoke */ = {
+ isa = PBXGroup;
+ children = (
+ 140064131234DFE800249AA4 /* Server.m */,
+ 140064141234DFE800249AA4 /* InvokeTest.ice */,
+ 140064151234DFE800249AA4 /* Client.m */,
+ 140064161234DFE800249AA4 /* BlobjectI.m */,
+ 140064171234DFE800249AA4 /* BlobjectI.h */,
+ 140064181234DFE800249AA4 /* AllTests.m */,
+ );
+ name = invoke;
+ sourceTree = "<group>";
+ };
+ 140157B6123645B3007C165E /* dispatcher */ = {
+ isa = PBXGroup;
+ children = (
+ 140157B9123645D0007C165E /* TestI.h */,
+ 140157BA123645D0007C165E /* TestI.m */,
+ 140157BB123645D0007C165E /* AllTests.m */,
+ 140157BC123645D0007C165E /* Client.m */,
+ 140157BE123645D0007C165E /* DispatcherTest.ice */,
+ 140157BF123645D0007C165E /* Server.m */,
+ );
+ name = dispatcher;
+ sourceTree = "<group>";
+ };
+ 140A3926122CF0EC00E1931D /* ami */ = {
+ isa = PBXGroup;
+ children = (
+ 140A3927122CF11300E1931D /* TestI.m */,
+ 140A3928122CF11300E1931D /* TestI.h */,
+ 140A3929122CF11300E1931D /* Client.m */,
+ 140A392A122CF11300E1931D /* Server.m */,
+ 140A392B122CF11300E1931D /* AllTests.m */,
+ 140A392C122CF11300E1931D /* AMITest.ice */,
+ );
+ name = ami;
+ sourceTree = "<group>";
+ };
+ 146B33FE0FE8BBF9009C6199 /* hold */ = {
+ isa = PBXGroup;
+ children = (
+ 146B340A0FE8BD58009C6199 /* HoldTest.ice */,
+ 146B33FF0FE8BC61009C6199 /* AllTests.m */,
+ 146B34000FE8BC61009C6199 /* Client.m */,
+ 146B34010FE8BC61009C6199 /* Server.m */,
+ 146B34030FE8BC61009C6199 /* TestI.h */,
+ 146B34040FE8BC61009C6199 /* TestI.m */,
+ );
+ name = hold;
+ sourceTree = "<group>";
+ };
+ 14B5567D175371DB00FDA693 /* optional */ = {
+ isa = PBXGroup;
+ children = (
+ 14B5567E1753721F00FDA693 /* AllTests.m */,
+ 14B5567F1753721F00FDA693 /* Client.m */,
+ 14B556801753721F00FDA693 /* OptionalTest.ice */,
+ 14B556811753721F00FDA693 /* Server.m */,
+ 14B556821753721F00FDA693 /* TestI.h */,
+ 14B556831753721F00FDA693 /* TestI.m */,
+ );
+ name = optional;
+ sourceTree = "<group>";
+ };
+ 14CBD36817588C16000D3373 /* stream */ = {
+ isa = PBXGroup;
+ children = (
+ 14CBD36B17588C51000D3373 /* Client.m */,
+ 14CBD36C17588C51000D3373 /* StreamTest.ice */,
+ );
+ name = stream;
+ sourceTree = "<group>";
+ };
+ 14D5BF941240C5EB00A19716 /* defaultValue */ = {
+ isa = PBXGroup;
+ children = (
+ 14D5BF951240C61900A19716 /* AllTests.m */,
+ 14D5BF961240C61900A19716 /* Client.m */,
+ 14D5BF971240C61900A19716 /* DefaultValueTest.ice */,
+ );
+ name = defaultValue;
+ sourceTree = "<group>";
+ };
+ 14F560DE1A7010890028417F /* admin */ = {
+ isa = PBXGroup;
+ children = (
+ 14F560DF1A7010B80028417F /* AdminTest.ice */,
+ 14F560E01A7010B80028417F /* AllTests.m */,
+ 14F560E11A7010B80028417F /* Client.m */,
+ 14F560E21A7010B80028417F /* Server.m */,
+ 14F560E31A7010B80028417F /* TestI.h */,
+ 14F560E41A7010B80028417F /* TestI.m */,
+ );
+ name = admin;
+ sourceTree = "<group>";
+ };
+ 19C28FACFE9D520D11CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 1D6058910D05DD3D006BFB54 /* Objective-C Test Suite.app */,
+ 14532DCD1761D39700176FE1 /* Objective-C Test Suite.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {
+ isa = PBXGroup;
+ children = (
+ D83717A11BFFC64D005D65BC /* Tests */,
+ 080E96DDFE201D6D7F000001 /* Classes */,
+ 29B97317FDCFA39411CA2CEA /* Resources */,
+ 29B97315FDCFA39411CA2CEA /* Other Sources */,
+ 34730A09122BF68100D293CC /* Resources-iPad */,
+ 29B97323FDCFA39411CA2CEA /* Frameworks */,
+ 19C28FACFE9D520D11CA2CBB /* Products */,
+ );
+ name = CustomTemplate;
+ sourceTree = "<group>";
+ };
+ 29B97315FDCFA39411CA2CEA /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 32CA4F630368D1EE00C91783 /* Objective-C Test Suite_Prefix.pch */,
+ 29B97316FDCFA39411CA2CEA /* main.m */,
+ );
+ name = "Other Sources";
+ sourceTree = "<group>";
+ };
+ 29B97317FDCFA39411CA2CEA /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 82D53AA61823264600703264 /* Images.xcassets */,
+ 14532DCE1761D39700176FE1 /* Info-ARC.plist */,
+ 342EBA8A0E926F90000051FA /* cacert.der */,
+ 342EBA880E926E9F000051FA /* client.p12 */,
+ 342EBA860E926E98000051FA /* server.p12 */,
+ 2899E5210DE3E06400AC0155 /* TestView.xib */,
+ 28AD733E0D9D9553002E5188 /* MainWindow.xib */,
+ 8D1107310486CEB800E47090 /* Info.plist */,
+ 34B7662B0E8D55FE00CE4701 /* TestSelect.xib */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 14103B0B1CF892720097DE5A /* ExternalAccessory.framework */,
+ 34E396620FF1D71400FBACD6 /* CoreGraphics.framework */,
+ 344126360FD8E8EA00C8D69C /* Security.framework */,
+ 344126370FD8E8EA00C8D69C /* CFNetwork.framework */,
+ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ 34730A09122BF68100D293CC /* Resources-iPad */ = {
+ isa = PBXGroup;
+ children = (
+ 14934E64161AFC8C00348FC2 /* Default-568h@2x.png */,
+ 34C618AE122C035000F60A28 /* MainWindow-iPad.xib */,
+ 34730A14122BF6ED00D293CC /* TestView-iPad.xib */,
+ 34730A10122BF6C300D293CC /* TestSelect-iPad.xib */,
+ );
+ name = "Resources-iPad";
+ sourceTree = "<group>";
+ };
+ 34B3B4A90FD7A7510018C227 /* operations */ = {
+ isa = PBXGroup;
+ children = (
+ 1450A1081ABC09B400A71895 /* BatchOnewaysAMI.m */,
+ 140064291234E0E900249AA4 /* TwowaysNewAMI.m */,
+ 1400642A1234E0E900249AA4 /* OnewaysNewAMI.m */,
+ 34B3B66A0FD7F41C0018C227 /* OperationsTest.ice */,
+ 34B3B4F00FD7A9660018C227 /* TestI.h */,
+ 34B3B4F10FD7A9660018C227 /* TestI.m */,
+ 34B3B4AA0FD7A7700018C227 /* AllTests.m */,
+ 34B3B4AB0FD7A7700018C227 /* BatchOneways.m */,
+ 34B3B4AC0FD7A7700018C227 /* Client.m */,
+ 34B3B4AD0FD7A7700018C227 /* Oneways.m */,
+ 34B3B4AF0FD7A7700018C227 /* Server.m */,
+ 34B3B4B30FD7A7700018C227 /* Twoways.m */,
+ );
+ name = operations;
+ sourceTree = "<group>";
+ };
+ 34B3B4FF0FD7AB4E0018C227 /* Common */ = {
+ isa = PBXGroup;
+ children = (
+ 34B3B5000FD7AB5C0018C227 /* TestCommon.m */,
+ );
+ name = Common;
+ sourceTree = "<group>";
+ };
+ 34B3B5030FD7E6EB0018C227 /* adapterDeactivation */ = {
+ isa = PBXGroup;
+ children = (
+ 34B3B6020FD7EFCC0018C227 /* AdapterDeactivationTest.ice */,
+ 34B3B5180FD7E7740018C227 /* AllTests.m */,
+ 34B3B5190FD7E7740018C227 /* Client.m */,
+ 34B3B51C0FD7E7740018C227 /* Server.m */,
+ 34B3B51E0FD7E7740018C227 /* TestI.h */,
+ 34B3B51F0FD7E7740018C227 /* TestI.m */,
+ );
+ name = adapterDeactivation;
+ sourceTree = "<group>";
+ };
+ 34B3B5040FD7E6F60018C227 /* binding */ = {
+ isa = PBXGroup;
+ children = (
+ 34B3B5260FD7E78B0018C227 /* AllTests.m */,
+ 34B3B5270FD7E78B0018C227 /* Client.m */,
+ 34B3B5280FD7E78B0018C227 /* Server.m */,
+ 34B3B5290FD7E78B0018C227 /* BindingTest.ice */,
+ 34B3B52A0FD7E78B0018C227 /* TestI.h */,
+ 34B3B52B0FD7E78B0018C227 /* TestI.m */,
+ );
+ name = binding;
+ sourceTree = "<group>";
+ };
+ 34B3B5050FD7E6FC0018C227 /* defaultServant */ = {
+ isa = PBXGroup;
+ children = (
+ 1469025A1CF7228100DE11F2 /* TestI.h */,
+ 1469025B1CF7228100DE11F2 /* TestI.m */,
+ 34B3B5320FD7E7BD0018C227 /* Client.m */,
+ 34B3B5330FD7E7BD0018C227 /* DefaultServantTest.ice */,
+ );
+ name = defaultServant;
+ sourceTree = "<group>";
+ };
+ 34B3B5060FD7E7030018C227 /* exceptions */ = {
+ isa = PBXGroup;
+ children = (
+ 34B3B5380FD7E7CA0018C227 /* Client.m */,
+ 34B3B5390FD7E7CA0018C227 /* ExceptionsTest.ice */,
+ 34B3B53A0FD7E7CA0018C227 /* TestI.m */,
+ 34B3B53B0FD7E7CA0018C227 /* AllTests.m */,
+ 34B3B53C0FD7E7CA0018C227 /* TestI.h */,
+ 34B3B53D0FD7E7CA0018C227 /* Server.m */,
+ );
+ name = exceptions;
+ sourceTree = "<group>";
+ };
+ 34B3B5070FD7E7090018C227 /* facets */ = {
+ isa = PBXGroup;
+ children = (
+ 34B3B5430FD7E7E60018C227 /* TestI.m */,
+ 34B3B5440FD7E7E60018C227 /* AllTests.m */,
+ 34B3B5450FD7E7E60018C227 /* Client.m */,
+ 34B3B5460FD7E7E60018C227 /* FacetsTest.ice */,
+ 34B3B5470FD7E7E60018C227 /* TestI.h */,
+ 34B3B5480FD7E7E60018C227 /* Server.m */,
+ );
+ name = facets;
+ sourceTree = "<group>";
+ };
+ 34B3B5080FD7E7130018C227 /* inheritance */ = {
+ isa = PBXGroup;
+ children = (
+ 34B3B54E0FD7E7FB0018C227 /* TestI.h */,
+ 34B3B54F0FD7E7FB0018C227 /* AllTests.m */,
+ 34B3B5500FD7E7FB0018C227 /* TestI.m */,
+ 34B3B5510FD7E7FB0018C227 /* Server.m */,
+ 34B3B5520FD7E7FB0018C227 /* InheritanceTest.ice */,
+ 34B3B5530FD7E7FB0018C227 /* Client.m */,
+ );
+ name = inheritance;
+ sourceTree = "<group>";
+ };
+ 34B3B5090FD7E71D0018C227 /* interceptor */ = {
+ isa = PBXGroup;
+ children = (
+ 34B3B5590FD7E8080018C227 /* InterceptorTest.ice */,
+ 34B3B55A0FD7E8080018C227 /* MyObjectI.h */,
+ 34B3B55B0FD7E8080018C227 /* MyObjectI.m */,
+ 34B3B55C0FD7E8080018C227 /* Client.m */,
+ 34B3B55D0FD7E8080018C227 /* InterceptorI.m */,
+ 34B3B55E0FD7E8080018C227 /* InterceptorI.h */,
+ );
+ name = interceptor;
+ sourceTree = "<group>";
+ };
+ 34B3B50E0FD7E7230018C227 /* location */ = {
+ isa = PBXGroup;
+ children = (
+ 34B3B5630FD7E81B0018C227 /* Client.m */,
+ 34B3B5640FD7E81B0018C227 /* TestI.h */,
+ 34B3B5650FD7E81B0018C227 /* Server.m */,
+ 34B3B5660FD7E81B0018C227 /* TestI.m */,
+ 34B3B5670FD7E81B0018C227 /* LocationTest.ice */,
+ 34B3B5680FD7E81B0018C227 /* ServerLocator.m */,
+ 34B3B5690FD7E81B0018C227 /* ServerLocator.h */,
+ 34B3B56A0FD7E81B0018C227 /* AllTests.m */,
+ );
+ name = location;
+ sourceTree = "<group>";
+ };
+ 34B3B50F0FD7E7280018C227 /* objects */ = {
+ isa = PBXGroup;
+ children = (
+ 34B3B5710FD7E8270018C227 /* Client.m */,
+ 34B3B5720FD7E8270018C227 /* TestI.m */,
+ 34B3B5730FD7E8270018C227 /* ObjectsTest.ice */,
+ 34B3B5740FD7E8270018C227 /* Server.m */,
+ 34B3B5750FD7E8270018C227 /* TestI.h */,
+ 34B3B5760FD7E8270018C227 /* AllTests.m */,
+ );
+ name = objects;
+ sourceTree = "<group>";
+ };
+ 34B3B5110FD7E72F0018C227 /* proxy */ = {
+ isa = PBXGroup;
+ children = (
+ 34B3B57C0FD7E8390018C227 /* TestI.h */,
+ 34B3B57D0FD7E8390018C227 /* Client.m */,
+ 34B3B57E0FD7E8390018C227 /* Server.m */,
+ 34B3B57F0FD7E8390018C227 /* TestI.m */,
+ 34B3B5800FD7E8390018C227 /* ProxyTest.ice */,
+ 34B3B5810FD7E8390018C227 /* AllTests.m */,
+ );
+ name = proxy;
+ sourceTree = "<group>";
+ };
+ 34B3B5120FD7E7340018C227 /* retry */ = {
+ isa = PBXGroup;
+ children = (
+ 34B3B5870FD7E8440018C227 /* TestI.m */,
+ 34B3B5880FD7E8440018C227 /* RetryTest.ice */,
+ 34B3B5890FD7E8440018C227 /* TestI.h */,
+ 34B3B58A0FD7E8440018C227 /* AllTests.m */,
+ 34B3B58B0FD7E8440018C227 /* Client.m */,
+ 34B3B58C0FD7E8440018C227 /* Server.m */,
+ );
+ name = retry;
+ sourceTree = "<group>";
+ };
+ 34B3B5140FD7E73E0018C227 /* timeout */ = {
+ isa = PBXGroup;
+ children = (
+ 34B3B5920FD7E8560018C227 /* AllTests.m */,
+ 34B3B5930FD7E8560018C227 /* Client.m */,
+ 34B3B5940FD7E8560018C227 /* Server.m */,
+ 34B3B5950FD7E8560018C227 /* TestI.m */,
+ 34B3B5960FD7E8560018C227 /* TimeoutTest.ice */,
+ 34B3B5970FD7E8560018C227 /* TestI.h */,
+ );
+ name = timeout;
+ sourceTree = "<group>";
+ };
+ 34B3B5160FD7E7490018C227 /* slicing-exceptions */ = {
+ isa = PBXGroup;
+ children = (
+ 34B3B59D0FD7E8640018C227 /* AllTests.m */,
+ 34B3B59E0FD7E8640018C227 /* Client.m */,
+ 34B3B59F0FD7E8640018C227 /* SlicingExceptionsTestServer.ice */,
+ 34B3B5A00FD7E8640018C227 /* TestI.m */,
+ 34B3B5A10FD7E8640018C227 /* TestI.h */,
+ 34B3B5A20FD7E8640018C227 /* SlicingExceptionsTestClient.ice */,
+ 34B3B5A30FD7E8640018C227 /* Server.m */,
+ );
+ name = "slicing-exceptions";
+ sourceTree = "<group>";
+ };
+ 820AA564170D92EA000DD016 /* hash */ = {
+ isa = PBXGroup;
+ children = (
+ 820AA55E170D92D6000DD016 /* AllTests.m */,
+ 820AA55F170D92D6000DD016 /* Client.m */,
+ 820AA560170D92D6000DD016 /* HashTest.ice */,
+ );
+ name = hash;
+ sourceTree = "<group>";
+ };
+ 82591287174D147C00B3F597 /* services */ = {
+ isa = PBXGroup;
+ children = (
+ 82591289174D147C00B3F597 /* AllTests.m */,
+ 8259128A174D147C00B3F597 /* Client.m */,
+ 8259128D174D147C00B3F597 /* ServicesTest.ice */,
+ );
+ name = services;
+ path = "../../../../ice/objective-c/test/Ice/services";
+ sourceTree = "<group>";
+ };
+ 8291ABFF1744E0C600A5CEFE /* metrics */ = {
+ isa = PBXGroup;
+ children = (
+ 8291AC031744E0C600A5CEFE /* AllTests.m */,
+ 8291AC061744E0C600A5CEFE /* Client.m */,
+ 8291AC0A1744E0C600A5CEFE /* MetricsTest.ice */,
+ 8291AC0F1744E0C600A5CEFE /* Server.m */,
+ 8291AC111744E0C600A5CEFE /* TestI.h */,
+ 8291AC121744E0C600A5CEFE /* TestI.m */,
+ );
+ name = metrics;
+ path = "../../../../ice/objective-c/test/Ice/metrics";
+ sourceTree = "<group>";
+ };
+ 82E5DA73173C1993007C2602 /* info */ = {
+ isa = PBXGroup;
+ children = (
+ 82E5DA77173C1993007C2602 /* AllTests.m */,
+ 82E5DA7A173C1993007C2602 /* Client.m */,
+ 82E5DA7D173C1993007C2602 /* InfoTest.ice */,
+ 82E5DA83173C1993007C2602 /* Server.m */,
+ 82E5DA85173C1993007C2602 /* TestI.h */,
+ 82E5DA86173C1993007C2602 /* TestI.m */,
+ );
+ name = info;
+ path = "../../../../ice/objective-c/test/Ice/info";
+ sourceTree = "<group>";
+ };
+ 82F4E87B17328C7400920D6D /* enums */ = {
+ isa = PBXGroup;
+ children = (
+ 82F4E87F17328C7400920D6D /* AllTests.m */,
+ 82F4E88017328C7400920D6D /* Client.m */,
+ 82F4E88117328C7400920D6D /* EnumTest.ice */,
+ 82F4E88417328C7400920D6D /* Server.m */,
+ 82F4E88517328C7400920D6D /* TestI.h */,
+ 82F4E88617328C7400920D6D /* TestI.m */,
+ );
+ name = enums;
+ path = "../../../../ice/objective-c/test/Ice/enums";
+ sourceTree = "<group>";
+ };
+ D83717A11BFFC64D005D65BC /* Tests */ = {
+ isa = PBXGroup;
+ children = (
+ 14F560DE1A7010890028417F /* admin */,
+ 14CBD36817588C16000D3373 /* stream */,
+ 82591287174D147C00B3F597 /* services */,
+ 8291ABFF1744E0C600A5CEFE /* metrics */,
+ 82E5DA73173C1993007C2602 /* info */,
+ 82F4E87B17328C7400920D6D /* enums */,
+ 14D5BF941240C5EB00A19716 /* defaultValue */,
+ 140157B6123645B3007C165E /* dispatcher */,
+ 140064111234DFBF00249AA4 /* invoke */,
+ 140A3926122CF0EC00E1931D /* ami */,
+ 146B33FE0FE8BBF9009C6199 /* hold */,
+ 34B3B5160FD7E7490018C227 /* slicing-exceptions */,
+ 34B3B5140FD7E73E0018C227 /* timeout */,
+ 34B3B5120FD7E7340018C227 /* retry */,
+ 34B3B5110FD7E72F0018C227 /* proxy */,
+ 34B3B50F0FD7E7280018C227 /* objects */,
+ 34B3B50E0FD7E7230018C227 /* location */,
+ 34B3B5090FD7E71D0018C227 /* interceptor */,
+ 34B3B5080FD7E7130018C227 /* inheritance */,
+ 820AA564170D92EA000DD016 /* hash */,
+ 34B3B5070FD7E7090018C227 /* facets */,
+ 34B3B5060FD7E7030018C227 /* exceptions */,
+ 34B3B5050FD7E6FC0018C227 /* defaultServant */,
+ 34B3B5040FD7E6F60018C227 /* binding */,
+ 34B3B5030FD7E6EB0018C227 /* adapterDeactivation */,
+ 34B3B4FF0FD7AB4E0018C227 /* Common */,
+ 34B3B4A90FD7A7510018C227 /* operations */,
+ 14B5567D175371DB00FDA693 /* optional */,
+ );
+ name = Tests;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 14532D301761D39700176FE1 /* Objective-C Test Suite ARC */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 14532DC81761D39700176FE1 /* Build configuration list for PBXNativeTarget "Objective-C Test Suite ARC" */;
+ buildPhases = (
+ 14532D311761D39700176FE1 /* Resources */,
+ 14532D3D1761D39700176FE1 /* Sources */,
+ 14532DC11761D39700176FE1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Objective-C Test Suite ARC";
+ productName = container;
+ productReference = 14532DCD1761D39700176FE1 /* Objective-C Test Suite.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 1D6058900D05DD3D006BFB54 /* Objective-C Test Suite */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Objective-C Test Suite" */;
+ buildPhases = (
+ 1D60588D0D05DD3D006BFB54 /* Resources */,
+ 1D60588E0D05DD3D006BFB54 /* Sources */,
+ 1D60588F0D05DD3D006BFB54 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Objective-C Test Suite";
+ productName = container;
+ productReference = 1D6058910D05DD3D006BFB54 /* Objective-C Test Suite.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 29B97313FDCFA39411CA2CEA /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0710;
+ };
+ buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Objective-C Test Suite" */;
+ compatibilityVersion = "Xcode 6.3";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 1D6058900D05DD3D006BFB54 /* Objective-C Test Suite */,
+ 14532D301761D39700176FE1 /* Objective-C Test Suite ARC */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 14532D311761D39700176FE1 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 14532D321761D39700176FE1 /* MainWindow.xib in Resources */,
+ 14532D331761D39700176FE1 /* TestView.xib in Resources */,
+ 14532D341761D39700176FE1 /* TestSelect.xib in Resources */,
+ 14532D361761D39700176FE1 /* server.p12 in Resources */,
+ 14532D371761D39700176FE1 /* client.p12 in Resources */,
+ 14532D381761D39700176FE1 /* cacert.der in Resources */,
+ 14532D391761D39700176FE1 /* TestSelect-iPad.xib in Resources */,
+ 14532D3A1761D39700176FE1 /* TestView-iPad.xib in Resources */,
+ 82D53AA71823264600703264 /* Images.xcassets in Resources */,
+ 14532D3B1761D39700176FE1 /* MainWindow-iPad.xib in Resources */,
+ 14532D3C1761D39700176FE1 /* Default-568h@2x.png in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 1D60588D0D05DD3D006BFB54 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */,
+ 2899E5220DE3E06400AC0155 /* TestView.xib in Resources */,
+ 34B7662C0E8D55FE00CE4701 /* TestSelect.xib in Resources */,
+ 342EBA870E926E98000051FA /* server.p12 in Resources */,
+ 342EBA890E926E9F000051FA /* client.p12 in Resources */,
+ 342EBA8B0E926F90000051FA /* cacert.der in Resources */,
+ 34730A11122BF6C300D293CC /* TestSelect-iPad.xib in Resources */,
+ 34730A15122BF6ED00D293CC /* TestView-iPad.xib in Resources */,
+ D83717A01BFFC5BE005D65BC /* Images.xcassets in Resources */,
+ 34C618AF122C035000F60A28 /* MainWindow-iPad.xib in Resources */,
+ 14934E65161AFC8C00348FC2 /* Default-568h@2x.png in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 14532D3D1761D39700176FE1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 146D4AB21A77D82000930925 /* AdminTest.ice in Sources */,
+ 146D4AB31A77D82000930925 /* AllTests.m in Sources */,
+ 146D4AB41A77D82000930925 /* Client.m in Sources */,
+ 146D4AB51A77D82000930925 /* Server.m in Sources */,
+ 146D4AB61A77D82000930925 /* TestI.m in Sources */,
+ 14532D3E1761D39700176FE1 /* main.m in Sources */,
+ 14532D3F1761D39700176FE1 /* AppDelegate.m in Sources */,
+ 14532D401761D39700176FE1 /* TestViewController.m in Sources */,
+ 14532D411761D39700176FE1 /* TestSelectController.m in Sources */,
+ 14532D421761D39700176FE1 /* Test.m in Sources */,
+ 14532D431761D39700176FE1 /* AllTests.m in Sources */,
+ 14532D441761D39700176FE1 /* BatchOneways.m in Sources */,
+ 14532D451761D39700176FE1 /* Client.m in Sources */,
+ 14532D461761D39700176FE1 /* Oneways.m in Sources */,
+ 14532D471761D39700176FE1 /* Server.m in Sources */,
+ 14532D481761D39700176FE1 /* Twoways.m in Sources */,
+ 14532D491761D39700176FE1 /* TestI.m in Sources */,
+ 14532D4A1761D39700176FE1 /* TestCommon.m in Sources */,
+ 14532D4B1761D39700176FE1 /* AllTests.m in Sources */,
+ 14532D4C1761D39700176FE1 /* Client.m in Sources */,
+ 14532D4D1761D39700176FE1 /* Server.m in Sources */,
+ 14532D4E1761D39700176FE1 /* TestI.m in Sources */,
+ 14532D4F1761D39700176FE1 /* AllTests.m in Sources */,
+ 14532D501761D39700176FE1 /* Client.m in Sources */,
+ 14532D511761D39700176FE1 /* Server.m in Sources */,
+ 14532D521761D39700176FE1 /* BindingTest.ice in Sources */,
+ 14532D531761D39700176FE1 /* TestI.m in Sources */,
+ 14532D541761D39700176FE1 /* Client.m in Sources */,
+ 14532D551761D39700176FE1 /* DefaultServantTest.ice in Sources */,
+ 14532D571761D39700176FE1 /* Client.m in Sources */,
+ 14532D581761D39700176FE1 /* ExceptionsTest.ice in Sources */,
+ 14532D591761D39700176FE1 /* TestI.m in Sources */,
+ 14532D5A1761D39700176FE1 /* AllTests.m in Sources */,
+ 14532D5B1761D39700176FE1 /* Server.m in Sources */,
+ 14532D5C1761D39700176FE1 /* TestI.m in Sources */,
+ 14532D5D1761D39700176FE1 /* AllTests.m in Sources */,
+ 14532D5E1761D39700176FE1 /* Client.m in Sources */,
+ 14532D5F1761D39700176FE1 /* FacetsTest.ice in Sources */,
+ 14532D601761D39700176FE1 /* Server.m in Sources */,
+ 14532D611761D39700176FE1 /* AllTests.m in Sources */,
+ 14532D621761D39700176FE1 /* TestI.m in Sources */,
+ 14532D631761D39700176FE1 /* Server.m in Sources */,
+ 14532D641761D39700176FE1 /* InheritanceTest.ice in Sources */,
+ 14532D651761D39700176FE1 /* Client.m in Sources */,
+ 14532D661761D39700176FE1 /* InterceptorTest.ice in Sources */,
+ 14532D671761D39700176FE1 /* MyObjectI.m in Sources */,
+ 14532D681761D39700176FE1 /* Client.m in Sources */,
+ 14532D691761D39700176FE1 /* InterceptorI.m in Sources */,
+ 14532D6A1761D39700176FE1 /* Client.m in Sources */,
+ 14532D6B1761D39700176FE1 /* Server.m in Sources */,
+ 14532D6C1761D39700176FE1 /* TestI.m in Sources */,
+ 14532D6D1761D39700176FE1 /* LocationTest.ice in Sources */,
+ 14532D6E1761D39700176FE1 /* ServerLocator.m in Sources */,
+ 14532D6F1761D39700176FE1 /* AllTests.m in Sources */,
+ 14532D701761D39700176FE1 /* Client.m in Sources */,
+ 14532D711761D39700176FE1 /* TestI.m in Sources */,
+ 14532D721761D39700176FE1 /* ObjectsTest.ice in Sources */,
+ 14532D731761D39700176FE1 /* Server.m in Sources */,
+ 14532D741761D39700176FE1 /* AllTests.m in Sources */,
+ 14532D751761D39700176FE1 /* Client.m in Sources */,
+ 14532D761761D39700176FE1 /* Server.m in Sources */,
+ 14532D771761D39700176FE1 /* TestI.m in Sources */,
+ 14532D781761D39700176FE1 /* ProxyTest.ice in Sources */,
+ 14532D791761D39700176FE1 /* AllTests.m in Sources */,
+ 14532D7A1761D39700176FE1 /* TestI.m in Sources */,
+ 14532D7B1761D39700176FE1 /* RetryTest.ice in Sources */,
+ 14532D7C1761D39700176FE1 /* AllTests.m in Sources */,
+ 14532D7D1761D39700176FE1 /* Client.m in Sources */,
+ 14532D7E1761D39700176FE1 /* Server.m in Sources */,
+ 14532D7F1761D39700176FE1 /* AllTests.m in Sources */,
+ 14532D801761D39700176FE1 /* Client.m in Sources */,
+ 14532D811761D39700176FE1 /* Server.m in Sources */,
+ 14532D821761D39700176FE1 /* TestI.m in Sources */,
+ 14532D831761D39700176FE1 /* TimeoutTest.ice in Sources */,
+ 14532D841761D39700176FE1 /* AllTests.m in Sources */,
+ 14532D851761D39700176FE1 /* Client.m in Sources */,
+ 14532D861761D39700176FE1 /* SlicingExceptionsTestServer.ice in Sources */,
+ 14532D871761D39700176FE1 /* TestI.m in Sources */,
+ 14532D881761D39700176FE1 /* SlicingExceptionsTestClient.ice in Sources */,
+ 14532D891761D39700176FE1 /* Server.m in Sources */,
+ 14532D8A1761D39700176FE1 /* AdapterDeactivationTest.ice in Sources */,
+ 14532D8B1761D39700176FE1 /* OperationsTest.ice in Sources */,
+ 14532D8C1761D39700176FE1 /* AllTests.m in Sources */,
+ 1450A10A1ABC09B400A71895 /* BatchOnewaysAMI.m in Sources */,
+ 14532D8D1761D39700176FE1 /* Client.m in Sources */,
+ 14532D8E1761D39700176FE1 /* Server.m in Sources */,
+ 14532D8F1761D39700176FE1 /* TestI.m in Sources */,
+ 14532D901761D39700176FE1 /* HoldTest.ice in Sources */,
+ 14532D911761D39700176FE1 /* TestI.m in Sources */,
+ 14532D921761D39700176FE1 /* Client.m in Sources */,
+ 14532D931761D39700176FE1 /* Server.m in Sources */,
+ 14532D941761D39700176FE1 /* AllTests.m in Sources */,
+ 14532D951761D39700176FE1 /* AMITest.ice in Sources */,
+ 14532D961761D39700176FE1 /* Server.m in Sources */,
+ 14532D971761D39700176FE1 /* InvokeTest.ice in Sources */,
+ 14532D981761D39700176FE1 /* Client.m in Sources */,
+ 1469025D1CF7228100DE11F2 /* TestI.m in Sources */,
+ 14532D991761D39700176FE1 /* BlobjectI.m in Sources */,
+ 14532D9A1761D39700176FE1 /* AllTests.m in Sources */,
+ 14532D9B1761D39700176FE1 /* TwowaysNewAMI.m in Sources */,
+ 14532D9C1761D39700176FE1 /* OnewaysNewAMI.m in Sources */,
+ 14532D9D1761D39700176FE1 /* TestI.m in Sources */,
+ 14532D9E1761D39700176FE1 /* AllTests.m in Sources */,
+ 14532D9F1761D39700176FE1 /* Client.m in Sources */,
+ 14532DA01761D39700176FE1 /* DispatcherTest.ice in Sources */,
+ 14532DA11761D39700176FE1 /* Server.m in Sources */,
+ 14532DA21761D39700176FE1 /* AllTests.m in Sources */,
+ 14532DA31761D39700176FE1 /* Client.m in Sources */,
+ 14532DA41761D39700176FE1 /* DefaultValueTest.ice in Sources */,
+ 14532DA51761D39700176FE1 /* AllTests.m in Sources */,
+ 14532DA61761D39700176FE1 /* Client.m in Sources */,
+ 14532DA71761D39700176FE1 /* HashTest.ice in Sources */,
+ 14532DA81761D39700176FE1 /* AllTests.m in Sources */,
+ 14532DA91761D39700176FE1 /* Client.m in Sources */,
+ 14532DAA1761D39700176FE1 /* EnumTest.ice in Sources */,
+ 14532DAB1761D39700176FE1 /* Server.m in Sources */,
+ 14532DAC1761D39700176FE1 /* TestI.m in Sources */,
+ 14532DAD1761D39700176FE1 /* AllTests.m in Sources */,
+ 14532DAE1761D39700176FE1 /* Client.m in Sources */,
+ 14532DAF1761D39700176FE1 /* InfoTest.ice in Sources */,
+ 14532DB01761D39700176FE1 /* Server.m in Sources */,
+ 14532DB11761D39700176FE1 /* TestI.m in Sources */,
+ 14532DB21761D39700176FE1 /* AllTests.m in Sources */,
+ 14532DB31761D39700176FE1 /* Client.m in Sources */,
+ 14532DB41761D39700176FE1 /* MetricsTest.ice in Sources */,
+ 14532DB51761D39700176FE1 /* Server.m in Sources */,
+ 14532DB61761D39700176FE1 /* TestI.m in Sources */,
+ 14532DB71761D39700176FE1 /* AllTests.m in Sources */,
+ 14532DB81761D39700176FE1 /* Client.m in Sources */,
+ 14532DB91761D39700176FE1 /* ServicesTest.ice in Sources */,
+ 14532DBA1761D39700176FE1 /* AllTests.m in Sources */,
+ 14532DBB1761D39700176FE1 /* Client.m in Sources */,
+ 14532DBC1761D39700176FE1 /* OptionalTest.ice in Sources */,
+ 14532DBD1761D39700176FE1 /* Server.m in Sources */,
+ 14532DBE1761D39700176FE1 /* TestI.m in Sources */,
+ 14532DBF1761D39700176FE1 /* Client.m in Sources */,
+ 14532DC01761D39700176FE1 /* StreamTest.ice in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 1D60588E0D05DD3D006BFB54 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 1D60589B0D05DD56006BFB54 /* main.m in Sources */,
+ 1D3623260D0F684500981E51 /* AppDelegate.m in Sources */,
+ 28D7ACF80DDB3853001CB0EB /* TestViewController.m in Sources */,
+ 34B7662A0E8D55E700CE4701 /* TestSelectController.m in Sources */,
+ 34B766340E8D56C700CE4701 /* Test.m in Sources */,
+ 34B3B4B50FD7A7700018C227 /* AllTests.m in Sources */,
+ 34B3B4B60FD7A7700018C227 /* BatchOneways.m in Sources */,
+ 34B3B4B70FD7A7700018C227 /* Client.m in Sources */,
+ 34B3B4B80FD7A7700018C227 /* Oneways.m in Sources */,
+ 34B3B4BA0FD7A7700018C227 /* Server.m in Sources */,
+ 34B3B4BD0FD7A7700018C227 /* Twoways.m in Sources */,
+ 34B3B4F30FD7A9660018C227 /* TestI.m in Sources */,
+ 34B3B5010FD7AB5C0018C227 /* TestCommon.m in Sources */,
+ 34B3B5200FD7E7740018C227 /* AllTests.m in Sources */,
+ 34B3B5210FD7E7740018C227 /* Client.m in Sources */,
+ 34B3B5230FD7E7740018C227 /* Server.m in Sources */,
+ 34B3B5250FD7E7740018C227 /* TestI.m in Sources */,
+ 34B3B52C0FD7E78B0018C227 /* AllTests.m in Sources */,
+ 34B3B52D0FD7E78B0018C227 /* Client.m in Sources */,
+ 34B3B52E0FD7E78B0018C227 /* Server.m in Sources */,
+ 34B3B52F0FD7E78B0018C227 /* BindingTest.ice in Sources */,
+ 34B3B5300FD7E78B0018C227 /* TestI.m in Sources */,
+ 34B3B5350FD7E7BD0018C227 /* Client.m in Sources */,
+ 34B3B5360FD7E7BD0018C227 /* DefaultServantTest.ice in Sources */,
+ 34B3B53E0FD7E7CA0018C227 /* Client.m in Sources */,
+ 34B3B53F0FD7E7CA0018C227 /* ExceptionsTest.ice in Sources */,
+ 34B3B5400FD7E7CA0018C227 /* TestI.m in Sources */,
+ 34B3B5410FD7E7CA0018C227 /* AllTests.m in Sources */,
+ 34B3B5420FD7E7CA0018C227 /* Server.m in Sources */,
+ 34B3B5490FD7E7E60018C227 /* TestI.m in Sources */,
+ 34B3B54A0FD7E7E60018C227 /* AllTests.m in Sources */,
+ 34B3B54B0FD7E7E60018C227 /* Client.m in Sources */,
+ 34B3B54C0FD7E7E60018C227 /* FacetsTest.ice in Sources */,
+ 34B3B54D0FD7E7E60018C227 /* Server.m in Sources */,
+ 34B3B5540FD7E7FB0018C227 /* AllTests.m in Sources */,
+ 34B3B5550FD7E7FB0018C227 /* TestI.m in Sources */,
+ 34B3B5560FD7E7FB0018C227 /* Server.m in Sources */,
+ 34B3B5570FD7E7FB0018C227 /* InheritanceTest.ice in Sources */,
+ 34B3B5580FD7E7FB0018C227 /* Client.m in Sources */,
+ 34B3B55F0FD7E8080018C227 /* InterceptorTest.ice in Sources */,
+ 34B3B5600FD7E8080018C227 /* MyObjectI.m in Sources */,
+ 34B3B5610FD7E8080018C227 /* Client.m in Sources */,
+ 34B3B5620FD7E8080018C227 /* InterceptorI.m in Sources */,
+ 34B3B56B0FD7E81B0018C227 /* Client.m in Sources */,
+ 34B3B56C0FD7E81B0018C227 /* Server.m in Sources */,
+ 34B3B56D0FD7E81B0018C227 /* TestI.m in Sources */,
+ 34B3B56E0FD7E81B0018C227 /* LocationTest.ice in Sources */,
+ 34B3B56F0FD7E81B0018C227 /* ServerLocator.m in Sources */,
+ 34B3B5700FD7E81B0018C227 /* AllTests.m in Sources */,
+ 34B3B5770FD7E8270018C227 /* Client.m in Sources */,
+ 34B3B5780FD7E8270018C227 /* TestI.m in Sources */,
+ 34B3B5790FD7E8270018C227 /* ObjectsTest.ice in Sources */,
+ 34B3B57A0FD7E8270018C227 /* Server.m in Sources */,
+ 34B3B57B0FD7E8270018C227 /* AllTests.m in Sources */,
+ 34B3B5820FD7E8390018C227 /* Client.m in Sources */,
+ 34B3B5830FD7E8390018C227 /* Server.m in Sources */,
+ 34B3B5840FD7E8390018C227 /* TestI.m in Sources */,
+ 34B3B5850FD7E8390018C227 /* ProxyTest.ice in Sources */,
+ 34B3B5860FD7E8390018C227 /* AllTests.m in Sources */,
+ 34B3B58D0FD7E8440018C227 /* TestI.m in Sources */,
+ 34B3B58E0FD7E8440018C227 /* RetryTest.ice in Sources */,
+ 34B3B58F0FD7E8440018C227 /* AllTests.m in Sources */,
+ 34B3B5900FD7E8440018C227 /* Client.m in Sources */,
+ 34B3B5910FD7E8440018C227 /* Server.m in Sources */,
+ 34B3B5980FD7E8560018C227 /* AllTests.m in Sources */,
+ 34B3B5990FD7E8560018C227 /* Client.m in Sources */,
+ 34B3B59A0FD7E8560018C227 /* Server.m in Sources */,
+ 34B3B59B0FD7E8560018C227 /* TestI.m in Sources */,
+ 34B3B59C0FD7E8560018C227 /* TimeoutTest.ice in Sources */,
+ 34B3B5A40FD7E8640018C227 /* AllTests.m in Sources */,
+ 34B3B5A50FD7E8640018C227 /* Client.m in Sources */,
+ 34B3B5A60FD7E8640018C227 /* SlicingExceptionsTestServer.ice in Sources */,
+ 34B3B5A70FD7E8640018C227 /* TestI.m in Sources */,
+ 34B3B5A80FD7E8640018C227 /* SlicingExceptionsTestClient.ice in Sources */,
+ 34B3B5A90FD7E8640018C227 /* Server.m in Sources */,
+ 34B3B6030FD7EFCC0018C227 /* AdapterDeactivationTest.ice in Sources */,
+ 34B3B66B0FD7F41C0018C227 /* OperationsTest.ice in Sources */,
+ 14F560E61A7010B80028417F /* AllTests.m in Sources */,
+ 146B34050FE8BC61009C6199 /* AllTests.m in Sources */,
+ 146B34060FE8BC61009C6199 /* Client.m in Sources */,
+ 146B34070FE8BC61009C6199 /* Server.m in Sources */,
+ 146B34090FE8BC61009C6199 /* TestI.m in Sources */,
+ 14F560E91A7010B80028417F /* TestI.m in Sources */,
+ 1450A1091ABC09B400A71895 /* BatchOnewaysAMI.m in Sources */,
+ 146B340B0FE8BD58009C6199 /* HoldTest.ice in Sources */,
+ 140A392D122CF11300E1931D /* TestI.m in Sources */,
+ 140A392E122CF11300E1931D /* Client.m in Sources */,
+ 140A392F122CF11300E1931D /* Server.m in Sources */,
+ 140A3930122CF11300E1931D /* AllTests.m in Sources */,
+ 140A3931122CF11300E1931D /* AMITest.ice in Sources */,
+ 1400641A1234DFE800249AA4 /* Server.m in Sources */,
+ 1400641B1234DFE800249AA4 /* InvokeTest.ice in Sources */,
+ 1400641C1234DFE800249AA4 /* Client.m in Sources */,
+ 1400641D1234DFE800249AA4 /* BlobjectI.m in Sources */,
+ 1400641E1234DFE800249AA4 /* AllTests.m in Sources */,
+ 1400642B1234E0E900249AA4 /* TwowaysNewAMI.m in Sources */,
+ 1469025C1CF7228100DE11F2 /* TestI.m in Sources */,
+ 1400642C1234E0E900249AA4 /* OnewaysNewAMI.m in Sources */,
+ 140157C1123645D0007C165E /* TestI.m in Sources */,
+ 140157C2123645D0007C165E /* AllTests.m in Sources */,
+ 140157C3123645D0007C165E /* Client.m in Sources */,
+ 140157C5123645D0007C165E /* DispatcherTest.ice in Sources */,
+ 140157C6123645D0007C165E /* Server.m in Sources */,
+ 14D5BF981240C61900A19716 /* AllTests.m in Sources */,
+ 14F560E51A7010B80028417F /* AdminTest.ice in Sources */,
+ 14D5BF991240C61900A19716 /* Client.m in Sources */,
+ 14D5BF9A1240C61900A19716 /* DefaultValueTest.ice in Sources */,
+ 820AA561170D92D6000DD016 /* AllTests.m in Sources */,
+ 820AA562170D92D6000DD016 /* Client.m in Sources */,
+ 820AA563170D92D6000DD016 /* HashTest.ice in Sources */,
+ 82F4E88A17328C7400920D6D /* AllTests.m in Sources */,
+ 82F4E88B17328C7400920D6D /* Client.m in Sources */,
+ 82F4E88C17328C7400920D6D /* EnumTest.ice in Sources */,
+ 82F4E88F17328C7400920D6D /* Server.m in Sources */,
+ 82F4E89017328C7400920D6D /* TestI.m in Sources */,
+ 82E5DA8B173C1993007C2602 /* AllTests.m in Sources */,
+ 82E5DA8E173C1993007C2602 /* Client.m in Sources */,
+ 82E5DA90173C1993007C2602 /* InfoTest.ice in Sources */,
+ 82E5DA96173C1993007C2602 /* Server.m in Sources */,
+ 82E5DA98173C1993007C2602 /* TestI.m in Sources */,
+ 8291AC171744E0C600A5CEFE /* AllTests.m in Sources */,
+ 8291AC1A1744E0C600A5CEFE /* Client.m in Sources */,
+ 8291AC1D1744E0C600A5CEFE /* MetricsTest.ice in Sources */,
+ 8291AC221744E0C600A5CEFE /* Server.m in Sources */,
+ 14F560E71A7010B80028417F /* Client.m in Sources */,
+ 8291AC241744E0C600A5CEFE /* TestI.m in Sources */,
+ 14F560E81A7010B80028417F /* Server.m in Sources */,
+ 8259128F174D147C00B3F597 /* AllTests.m in Sources */,
+ 82591290174D147C00B3F597 /* Client.m in Sources */,
+ 82591293174D147C00B3F597 /* ServicesTest.ice in Sources */,
+ 14B556841753721F00FDA693 /* AllTests.m in Sources */,
+ 14B556851753721F00FDA693 /* Client.m in Sources */,
+ 14B556861753721F00FDA693 /* OptionalTest.ice in Sources */,
+ 14B556871753721F00FDA693 /* Server.m in Sources */,
+ 14B556881753721F00FDA693 /* TestI.m in Sources */,
+ 14CBD36D17588C51000D3373 /* Client.m in Sources */,
+ 14CBD36E17588C51000D3373 /* StreamTest.ice in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 14532DC91761D39700176FE1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_OBJC_ARC = NO;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ CODE_SIGN_RESOURCE_RULES_PATH = "$(SDKROOT)/ResourceRules.plist";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Objective-C Test Suite_Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = "";
+ GCC_VERSION = "";
+ HEADER_SEARCH_PATHS = (
+ "../../../../ice/objective-c/test/include",
+ "../../../../ice/objective-c/test/Ice",
+ Classes,
+ generated,
+ );
+ INFOPLIST_FILE = "$(SRCROOT)/Info-ARC.plist";
+ LIBRARY_SEARCH_PATHS = "";
+ OTHER_CFLAGS = "";
+ OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)";
+ OTHER_LDFLAGS = "";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.zeroc.Ice-Touch-Objective-C-Test-Suite-ARC";
+ PRODUCT_NAME = "Objective-C Test Suite";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 14532DCA1761D39700176FE1 /* Debug ARC */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ CODE_SIGN_RESOURCE_RULES_PATH = "$(SDKROOT)/ResourceRules.plist";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Objective-C Test Suite_Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = "";
+ GCC_VERSION = "";
+ HEADER_SEARCH_PATHS = (
+ "../../../../ice/objective-c/test/include",
+ "../../../../ice/objective-c/test/Ice",
+ Classes,
+ generated,
+ );
+ INFOPLIST_FILE = "$(SRCROOT)/Info-ARC.plist";
+ LIBRARY_SEARCH_PATHS = "";
+ OTHER_CFLAGS = "-fobjc-arc-exceptions";
+ OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)";
+ OTHER_LDFLAGS = "";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.zeroc.Ice-Touch-Objective-C-Test-Suite-ARC";
+ PRODUCT_NAME = "Objective-C Test Suite";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = "Debug ARC";
+ };
+ 14532DCB1761D39700176FE1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_OBJC_ARC = NO;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ CODE_SIGN_RESOURCE_RULES_PATH = "$(SDKROOT)/ResourceRules.plist";
+ COPY_PHASE_STRIP = NO;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Objective-C Test Suite_Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = "";
+ GCC_VERSION = "";
+ HEADER_SEARCH_PATHS = (
+ "../../../../ice/objective-c/test/include",
+ "../../../../ice/objective-c/test/Ice",
+ Classes,
+ generated,
+ );
+ INFOPLIST_FILE = "$(SRCROOT)/Info-ARC.plist";
+ LIBRARY_SEARCH_PATHS = "";
+ OTHER_CFLAGS = "";
+ OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)";
+ OTHER_LDFLAGS = "";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.zeroc.Ice-Touch-Objective-C-Test-Suite-ARC";
+ PRODUCT_NAME = "Objective-C Test Suite";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+ 14532DCC1761D39700176FE1 /* Release ARC */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ CODE_SIGN_RESOURCE_RULES_PATH = "$(SDKROOT)/ResourceRules.plist";
+ COPY_PHASE_STRIP = NO;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Objective-C Test Suite_Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = "";
+ GCC_VERSION = "";
+ HEADER_SEARCH_PATHS = (
+ "../../../../ice/objective-c/test/include",
+ "../../../../ice/objective-c/test/Ice",
+ Classes,
+ generated,
+ );
+ INFOPLIST_FILE = "$(SRCROOT)/Info-ARC.plist";
+ LIBRARY_SEARCH_PATHS = "";
+ OTHER_CFLAGS = "-fobjc-arc-exceptions";
+ OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)";
+ OTHER_LDFLAGS = "";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.zeroc.Ice-Touch-Objective-C-Test-Suite-ARC";
+ PRODUCT_NAME = "Objective-C Test Suite";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = "Release ARC";
+ };
+ 1488315C1761CC02007DF8F1 /* Debug ARC */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ADDITIONAL_SDKS = "../../../IceSDK/$(PLATFORM_NAME).sdk";
+ CLANG_ENABLE_OBJC_ARC = NO;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 7.1;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ };
+ name = "Debug ARC";
+ };
+ 1488315D1761CC02007DF8F1 /* Debug ARC */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ CODE_SIGN_RESOURCE_RULES_PATH = "$(SDKROOT)/ResourceRules.plist";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Objective-C Test Suite_Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = ICE_OBJC_NOGC;
+ GCC_VERSION = "";
+ HEADER_SEARCH_PATHS = (
+ "../../../../ice/objective-c/test/include",
+ "../../../../ice/objective-c/test/Ice",
+ Classes,
+ generated,
+ );
+ INFOPLIST_FILE = Info.plist;
+ LIBRARY_SEARCH_PATHS = "";
+ OTHER_CFLAGS = "-fobjc-arc-exceptions";
+ OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)";
+ OTHER_LDFLAGS = "";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.zeroc.Ice-Touch-Objective-C-Test-Suite";
+ PRODUCT_NAME = "Objective-C Test Suite";
+ PROVISIONING_PROFILE = "";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = "Debug ARC";
+ };
+ 1488315E1761CC2B007DF8F1 /* Release ARC */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ADDITIONAL_SDKS = "../../../IceSDK/$(PLATFORM_NAME).sdk";
+ CLANG_ENABLE_OBJC_ARC = NO;
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 7.1;
+ SDKROOT = iphoneos;
+ };
+ name = "Release ARC";
+ };
+ 1488315F1761CC2B007DF8F1 /* Release ARC */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ CODE_SIGN_RESOURCE_RULES_PATH = "$(SDKROOT)/ResourceRules.plist";
+ COPY_PHASE_STRIP = NO;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Objective-C Test Suite_Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = ICE_OBJC_NOGC;
+ GCC_VERSION = "";
+ HEADER_SEARCH_PATHS = (
+ "../../../../ice/objective-c/test/include",
+ "../../../../ice/objective-c/test/Ice",
+ Classes,
+ generated,
+ );
+ INFOPLIST_FILE = Info.plist;
+ LIBRARY_SEARCH_PATHS = "";
+ OTHER_CFLAGS = "-fobjc-arc-exceptions";
+ OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)";
+ OTHER_LDFLAGS = "";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.zeroc.Ice-Touch-Objective-C-Test-Suite";
+ PRODUCT_NAME = "Objective-C Test Suite";
+ PROVISIONING_PROFILE = "";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = "Release ARC";
+ };
+ 1D6058940D05DD3E006BFB54 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_OBJC_ARC = NO;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ CODE_SIGN_RESOURCE_RULES_PATH = "$(SDKROOT)/ResourceRules.plist";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Objective-C Test Suite_Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = ICE_OBJC_NOGC;
+ GCC_VERSION = "";
+ HEADER_SEARCH_PATHS = (
+ "../../../../ice/objective-c/test/include",
+ "../../../../ice/objective-c/test/Ice",
+ Classes,
+ generated,
+ );
+ INFOPLIST_FILE = Info.plist;
+ LIBRARY_SEARCH_PATHS = "";
+ OTHER_CFLAGS = "";
+ OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)";
+ OTHER_LDFLAGS = "";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.zeroc.Ice-Touch-Objective-C-Test-Suite";
+ PRODUCT_NAME = "Objective-C Test Suite";
+ PROVISIONING_PROFILE = "";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 1D6058950D05DD3E006BFB54 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_OBJC_ARC = NO;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ CODE_SIGN_RESOURCE_RULES_PATH = "$(SDKROOT)/ResourceRules.plist";
+ COPY_PHASE_STRIP = NO;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Objective-C Test Suite_Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = ICE_OBJC_NOGC;
+ GCC_VERSION = "";
+ HEADER_SEARCH_PATHS = (
+ "../../../../ice/objective-c/test/include",
+ "../../../../ice/objective-c/test/Ice",
+ Classes,
+ generated,
+ );
+ INFOPLIST_FILE = Info.plist;
+ LIBRARY_SEARCH_PATHS = "";
+ OTHER_CFLAGS = "";
+ OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)";
+ OTHER_LDFLAGS = "";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.zeroc.Ice-Touch-Objective-C-Test-Suite";
+ PRODUCT_NAME = "Objective-C Test Suite";
+ PROVISIONING_PROFILE = "";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+ C01FCF4F08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ADDITIONAL_SDKS = "../../../IceSDK/$(PLATFORM_NAME).sdk";
+ CLANG_ENABLE_OBJC_ARC = NO;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 7.1;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ C01FCF5008A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ADDITIONAL_SDKS = "../../../IceSDK/$(PLATFORM_NAME).sdk";
+ CLANG_ENABLE_OBJC_ARC = NO;
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 7.1;
+ SDKROOT = iphoneos;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 14532DC81761D39700176FE1 /* Build configuration list for PBXNativeTarget "Objective-C Test Suite ARC" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 14532DC91761D39700176FE1 /* Debug */,
+ 14532DCA1761D39700176FE1 /* Debug ARC */,
+ 14532DCB1761D39700176FE1 /* Release */,
+ 14532DCC1761D39700176FE1 /* Release ARC */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Objective-C Test Suite" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1D6058940D05DD3E006BFB54 /* Debug */,
+ 1488315D1761CC02007DF8F1 /* Debug ARC */,
+ 1D6058950D05DD3E006BFB54 /* Release */,
+ 1488315F1761CC2B007DF8F1 /* Release ARC */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Objective-C Test Suite" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4F08A954540054247B /* Debug */,
+ 1488315C1761CC02007DF8F1 /* Debug ARC */,
+ C01FCF5008A954540054247B /* Release */,
+ 1488315E1761CC2B007DF8F1 /* Release ARC */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
+}
diff --git a/objective-c/test/ios/Objective-C Test Suite.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/objective-c/test/ios/Objective-C Test Suite.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000000..6d613748e57
--- /dev/null
+++ b/objective-c/test/ios/Objective-C Test Suite.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+ version = "1.0">
+ <FileRef
+ location = "self:/Users/benoit/Devel/GitHub/ice/objective-c/test/ios/Objective-C Test Suite.xcodeproj">
+ </FileRef>
+</Workspace>
diff --git a/objective-c/test/ios/TestSelect-iPad.xib b/objective-c/test/ios/TestSelect-iPad.xib
new file mode 100644
index 00000000000..90145bdd782
--- /dev/null
+++ b/objective-c/test/ios/TestSelect-iPad.xib
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="TestSelectController">
+ <connections>
+ <outlet property="loopSwitch" destination="13" id="15"/>
+ <outlet property="pickerView" destination="3" id="9"/>
+ <outlet property="protocol" destination="aUX-Gx-Jpg" id="xw4-aM-4dv"/>
+ <outlet property="view" destination="1" id="8"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view contentMode="scaleToFill" id="1">
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <pickerView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="3">
+ <rect key="frame" x="20" y="20" width="728" height="216"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <connections>
+ <outlet property="dataSource" destination="-1" id="5"/>
+ <outlet property="delegate" destination="-1" id="6"/>
+ </connections>
+ </pickerView>
+ <button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="4">
+ <rect key="frame" x="326" y="373" width="117" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Execute Test">
+ <color key="titleShadowColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="disabled" title="Execute Test"/>
+ <state key="selected" title="Execute Test"/>
+ <state key="highlighted" title="Execute Test">
+ <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ </state>
+ <connections>
+ <action selector="runTest:" destination="-1" eventType="touchUpInside" id="7"/>
+ </connections>
+ </button>
+ <switch opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" id="13">
+ <rect key="frame" x="395" y="321" width="51" height="31"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ </switch>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" text="Loop" lineBreakMode="tailTruncation" minimumFontSize="10" id="14">
+ <rect key="frame" x="324" y="324" width="42" height="21"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" id="aUX-Gx-Jpg">
+ <rect key="frame" x="279" y="267" width="210" height="29"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <segments>
+ <segment title="TCP"/>
+ <segment title="SSL"/>
+ <segment title="WS"/>
+ <segment title="WSS"/>
+ </segments>
+ </segmentedControl>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ </view>
+ </objects>
+</document>
diff --git a/objective-c/test/ios/TestSelect.xib b/objective-c/test/ios/TestSelect.xib
new file mode 100644
index 00000000000..17b0b9b7e46
--- /dev/null
+++ b/objective-c/test/ios/TestSelect.xib
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="TestSelectController">
+ <connections>
+ <outlet property="loopSwitch" destination="13" id="15"/>
+ <outlet property="pickerView" destination="3" id="9"/>
+ <outlet property="protocol" destination="16" id="17"/>
+ <outlet property="view" destination="1" id="8"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view contentMode="scaleToFill" id="1">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <pickerView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="3">
+ <rect key="frame" x="-1" y="0.0" width="320" height="216"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <connections>
+ <outlet property="dataSource" destination="-1" id="5"/>
+ <outlet property="delegate" destination="-1" id="6"/>
+ </connections>
+ </pickerView>
+ <button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="4">
+ <rect key="frame" x="100" y="368" width="117" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Execute Test">
+ <color key="titleShadowColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="disabled" title="Execute Test"/>
+ <state key="selected" title="Execute Test"/>
+ <state key="highlighted" title="Execute Test">
+ <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ </state>
+ <connections>
+ <action selector="runTest:" destination="-1" eventType="touchUpInside" id="7"/>
+ </connections>
+ </button>
+ <switch opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" id="13">
+ <rect key="frame" x="154" y="293" width="51" height="31"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ </switch>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" text="Loop" lineBreakMode="tailTruncation" minimumFontSize="10" id="14">
+ <rect key="frame" x="83" y="296" width="42" height="21"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" id="16">
+ <rect key="frame" x="53" y="232" width="210" height="29"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <segments>
+ <segment title="TCP"/>
+ <segment title="SSL"/>
+ <segment title="WS"/>
+ <segment title="WSS"/>
+ </segments>
+ </segmentedControl>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ </view>
+ </objects>
+</document>
diff --git a/objective-c/test/ios/TestView-iPad.xib b/objective-c/test/ios/TestView-iPad.xib
new file mode 100644
index 00000000000..06f8880bf36
--- /dev/null
+++ b/objective-c/test/ios/TestView-iPad.xib
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="TestViewController">
+ <connections>
+ <outlet property="activity" destination="16" id="18"/>
+ <outlet property="nextButton" destination="17" id="20"/>
+ <outlet property="output" destination="9" id="12"/>
+ <outlet property="view" destination="6" id="8"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="6">
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <tableView opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" bouncesZoom="NO" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="27" sectionFooterHeight="27" id="9">
+ <rect key="frame" x="20" y="20" width="728" height="939"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ <inset key="insetFor6xAndEarlier" minX="0.0" minY="20" maxX="0.0" maxY="-20"/>
+ <connections>
+ <outlet property="dataSource" destination="-1" id="10"/>
+ <outlet property="delegate" destination="-1" id="11"/>
+ </connections>
+ </tableView>
+ <activityIndicatorView hidden="YES" opaque="NO" clearsContextBeforeDrawing="NO" userInteractionEnabled="NO" contentMode="scaleToFill" hidesWhenStopped="YES" style="whiteLarge" id="16">
+ <rect key="frame" x="242" y="967" width="37" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <animations/>
+ </activityIndicatorView>
+ <button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="17">
+ <rect key="frame" x="20" y="967" width="214" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Launch Next Test">
+ <color key="titleShadowColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="disabled" title="Launch Next Test"/>
+ <state key="selected" title="Launch Next Test"/>
+ <state key="highlighted" title="Launch Next Test">
+ <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ </state>
+ <connections>
+ <action selector="next:" destination="-1" eventType="touchUpInside" id="21"/>
+ </connections>
+ </button>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="0.75" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ </view>
+ </objects>
+</document>
diff --git a/objective-c/test/ios/TestView.xib b/objective-c/test/ios/TestView.xib
new file mode 100644
index 00000000000..e8919a0a46a
--- /dev/null
+++ b/objective-c/test/ios/TestView.xib
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="TestViewController">
+ <connections>
+ <outlet property="activity" destination="16" id="18"/>
+ <outlet property="nextButton" destination="17" id="20"/>
+ <outlet property="output" destination="9" id="12"/>
+ <outlet property="view" destination="6" id="8"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="6">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="460"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <tableView opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="bottomLeft" bouncesZoom="NO" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="27" sectionFooterHeight="27" id="9">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="403"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ <connections>
+ <outlet property="dataSource" destination="-1" id="10"/>
+ <outlet property="delegate" destination="-1" id="11"/>
+ </connections>
+ </tableView>
+ <activityIndicatorView hidden="YES" opaque="NO" clearsContextBeforeDrawing="NO" userInteractionEnabled="NO" contentMode="bottomRight" hidesWhenStopped="YES" style="whiteLarge" id="16">
+ <rect key="frame" x="242" y="411" width="37" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
+ <animations/>
+ </activityIndicatorView>
+ <button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="17">
+ <rect key="frame" x="10" y="412" width="214" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Launch Next Test">
+ <color key="titleShadowColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="disabled" title="Launch Next Test"/>
+ <state key="selected" title="Launch Next Test"/>
+ <state key="highlighted" title="Launch Next Test">
+ <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ </state>
+ <connections>
+ <action selector="next:" destination="-1" eventType="touchUpInside" id="21"/>
+ </connections>
+ </button>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="0.75" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ </view>
+ </objects>
+</document>
diff --git a/objective-c/test/ios/main.m b/objective-c/test/ios/main.m
new file mode 100644
index 00000000000..554bf56e308
--- /dev/null
+++ b/objective-c/test/ios/main.m
@@ -0,0 +1,20 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice Touch is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#import <UIKit/UIKit.h>
+
+int main(int argc, char *argv[])
+{
+ int retVal = EXIT_FAILURE;
+ @autoreleasepool
+ {
+ retVal = UIApplicationMain(argc, argv, nil, nil);
+ }
+ return retVal;
+}
diff --git a/scripts/TestUtil.py b/scripts/TestUtil.py
index b733fa5b20b..ea2fcbe0e82 100755
--- a/scripts/TestUtil.py
+++ b/scripts/TestUtil.py
@@ -2549,7 +2549,7 @@ def getTestDirectory(name, baseDir = os.getcwd()):
else:
buildDir = "build"
if isDarwin():
- platform = "osx"
+ platform = "macosx"
elif isUbuntu() or isDebian():
platform = "x86_64-linux-gnu" if x64 else "i386-linux-gnu"
elif isAIX():
diff --git a/slice/Ice/Endpoint.ice b/slice/Ice/Endpoint.ice
index ddf9c12525c..f7a6ff708e7 100644
--- a/slice/Ice/Endpoint.ice
+++ b/slice/Ice/Endpoint.ice
@@ -56,6 +56,20 @@ const short WSSEndpointType = 5;
/**
*
+ * Uniquely identifies iAP-based endpoints.
+ *
+ **/
+const short iAPEndpointType = 6;
+
+/**
+ *
+ * Uniquely identifies SSL iAP-based endpoints.
+ *
+ **/
+const short iAPSEndpointType = 7;
+
+/**
+ *
* Base class providing access to the endpoint details.
*
**/
diff --git a/slice/Ice/LocalException.ice b/slice/Ice/LocalException.ice
index 4bb717be23b..39e194a0550 100644
--- a/slice/Ice/LocalException.ice
+++ b/slice/Ice/LocalException.ice
@@ -513,7 +513,6 @@ local exception SocketException extends SyscallException
* This exception indicates CFNetwork errors.
*
**/
-#ifdef ICE_USE_CFSTREAM
["cpp:ice_print"]
local exception CFNetworkException extends SocketException
{
@@ -524,7 +523,6 @@ local exception CFNetworkException extends SocketException
**/
string domain;
};
-#endif
/**
*