diff options
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 Binary files differnew file mode 100644 index 00000000000..0891b7aabfc --- /dev/null +++ b/cpp/test/ios/Default-568h@2x.png 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 Binary files differnew file mode 100644 index 00000000000..a37f851e642 --- /dev/null +++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/New icon-60@3x.png 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 Binary files differnew file mode 100644 index 00000000000..2855a8b674b --- /dev/null +++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76.png 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 Binary files differnew file mode 100644 index 00000000000..29047dc5a52 --- /dev/null +++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76@2x.png 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 Binary files differnew file mode 100644 index 00000000000..e76086fb3d6 --- /dev/null +++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40.png 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 Binary files differnew file mode 100644 index 00000000000..7615d3255bc --- /dev/null +++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-1.png 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 Binary files differnew file mode 100644 index 00000000000..7615d3255bc --- /dev/null +++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-2.png 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 Binary files differnew file mode 100644 index 00000000000..f04f442176a --- /dev/null +++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x-1.png 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 Binary files differnew file mode 100644 index 00000000000..f04f442176a --- /dev/null +++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x.png 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 Binary files differnew file mode 100644 index 00000000000..d57695edc28 --- /dev/null +++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small.png 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 Binary files differnew file mode 100644 index 00000000000..79edc547e2c --- /dev/null +++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-1.png 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 Binary files differnew file mode 100644 index 00000000000..79edc547e2c --- /dev/null +++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-2.png 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 Binary files differnew file mode 100644 index 00000000000..49cdc033096 --- /dev/null +++ b/cpp/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@3x.png 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 Binary files differnew file mode 100644 index 00000000000..0891b7aabfc --- /dev/null +++ b/objective-c/test/ios/Default-568h@2x.png 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 Binary files differnew file mode 100644 index 00000000000..a37f851e642 --- /dev/null +++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/New icon-60@3x.png 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 Binary files differnew file mode 100644 index 00000000000..2855a8b674b --- /dev/null +++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76.png 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 Binary files differnew file mode 100644 index 00000000000..29047dc5a52 --- /dev/null +++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-76@2x.png 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 Binary files differnew file mode 100644 index 00000000000..e76086fb3d6 --- /dev/null +++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40.png 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 Binary files differnew file mode 100644 index 00000000000..7615d3255bc --- /dev/null +++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-1.png 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 Binary files differnew file mode 100644 index 00000000000..7615d3255bc --- /dev/null +++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@2x-2.png 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 Binary files differnew file mode 100644 index 00000000000..f04f442176a --- /dev/null +++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x-1.png 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 Binary files differnew file mode 100644 index 00000000000..f04f442176a --- /dev/null +++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small-40@3x.png 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 Binary files differnew file mode 100644 index 00000000000..d57695edc28 --- /dev/null +++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small.png 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 Binary files differnew file mode 100644 index 00000000000..79edc547e2c --- /dev/null +++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-1.png 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 Binary files differnew file mode 100644 index 00000000000..79edc547e2c --- /dev/null +++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@2x-2.png 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 Binary files differnew file mode 100644 index 00000000000..49cdc033096 --- /dev/null +++ b/objective-c/test/ios/Images.xcassets/AppIcon.appiconset/test_suite-Small@3x.png 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 /** * |