Table of Contents Chapter 1 Introduction 1.1 Introduction 1.2 The Internet Communications Engine (Ice) 1.3 Organization of this Book 1.4 Typographical Conventions 1.5 Source Code Examples 1.6 Contacting the Authors 1.7 Ice Support Chapter 2 Ice Overview 2.1 Chapter Overview 2.2 The Ice Architecture 2.3 Ice Services 2.4 Architectural Benefits of Ice 2.5 A Comparison with CORBA Chapter 3 A Hello World Application 3.1 Chapter Overview 3.2 Writing a Slice Definition 3.3 Writing an Ice Application with C++ 3.4 Writing an Ice Application with Java 3.5 Writing an Ice Application with C# 3.6 Writing an Ice Application with Visual Basic 3.7 Writing an Ice Application with Objective‑C 3.8 Writing an Ice Application with Python 3.9 Writing an Ice Application with Ruby 3.10 Summary Chapter 4 The Slice Language 4.1 Chapter Overview 4.2 Introduction 4.3 Compilation 4.4 Source Files 4.5 Lexical Rules 4.6 Modules 4.7 The Ice Module 4.8 Basic Slice Types 4.9 User-Defined Types 4.10 Interfaces, Operations, and Exceptions 4.11 Classes 4.12 Forward Declarations 4.13 Type IDs 4.14 Operations on Object 4.15 Local Types 4.16 Names and Scoping 4.17 Metadata 4.18 Serializable Objects 4.19 Deprecating Slice Definitions 4.20 Using the Slice Compilers 4.21 Slice Checksums 4.22 A Comparison of Slice and CORBA IDL 4.23 Generating Slice Documentation 4.24 Summary Chapter 5 Slice for a Simple File System 5.1 Chapter Overview 5.2 The File System Application 5.3 Slice Definitions for the File System 5.4 The Complete Definition Chapter 6 Client-Side Slice-to-C++ Mapping 6.1 Chapter Overview 6.2 Introduction 6.3 Mapping for Identifiers 6.4 Mapping for Modules 6.5 The Ice Namespace 6.6 Mapping for Simple Built-In Types 6.7 Mapping for User-Defined Types 6.8 Mapping for Constants 6.9 Mapping for Exceptions 6.10 Mapping for Run-Time Exceptions 6.11 Mapping for Interfaces 6.12 Mapping for Operations 6.13 Exception Handling 6.14 Mapping for Classes 6.15 slice2cpp Command-Line Options 6.16 Using Slice Checksums 6.17 A Comparison with the CORBA C++ Mapping Chapter 7 Developing a File System Client in C++ 7.1 Chapter Overview 7.2 The C++ Client 7.3 Summary Chapter 8 Server-Side Slice-to-C++ Mapping 8.1 Chapter Overview 8.2 Introduction 8.3 The Server-Side main Function 8.4 Mapping for Interfaces 8.5 Parameter Passing 8.6 Raising Exceptions 8.7 Object Incarnation 8.8 Summary Chapter 9 Developing a File System Server in C++ 9.1 Chapter Overview 9.2 Implementing a File System Server 9.3 Summary Chapter 10 Client-Side Slice-to-Java Mapping 10.1 Chapter Overview 10.2 Introduction 10.3 Mapping for Identifiers 10.4 Mapping for Modules 10.5 The Ice Package 10.6 Mapping for Simple Built-in Types 10.7 Mapping for User-Defined Types 10.8 Mapping for Constants 10.9 Mapping for Exceptions 10.10 Mapping for Run-Time Exceptions 10.11 Mapping for Interfaces 10.12 Mapping for Operations 10.13 Exception Handling 10.14 Mapping for Classes 10.15 Serializable Objects 10.16 Customizing the Java Mapping 10.17 slice2java Command-Line Options 10.18 Using Slice Checksums Chapter 11 Developing a File System Client in Java 11.1 Chapter Overview 11.2 The Java Client 11.3 Summary Chapter 12 Server-Side Slice-to-Java Mapping 12.1 Chapter Overview 12.2 Introduction 12.3 The Server-Side main Function 12.4 Mapping for Interfaces 12.5 Parameter Passing 12.6 Raising Exceptions 12.7 Tie Classes 12.8 Object Incarnation 12.9 Summary Chapter 13 Developing a File System Server in Java 13.1 Chapter Overview 13.2 Implementing a File System Server 13.3 Summary Chapter 14 Client-Side Slice-to-C# Mapping 14.1 Chapter Overview 14.2 Introduction 14.3 Mapping for Identifiers 14.4 Mapping for Modules 14.5 The Ice Namespace 14.6 Mapping for Simple Built-in Types 14.7 Mapping for User-Defined Types 14.8 Mapping for Constants 14.9 Mapping for Exceptions 14.10 Mapping for Interfaces 14.11 Mapping for Operations 14.12 Exception Handling 14.13 Mapping for Classes 14.14 Serializable Objects 14.15 C#-Specific Metadata Directives 14.16 slice2cs Command-Line Options 14.17 Using Slice Checksums Chapter 15 Developing a File System Client in C# 15.1 Chapter Overview 15.2 The C# Client 15.3 Summary Chapter 16 Server-Side Slice-to-C# Mapping 16.1 Chapter Overview 16.2 Introduction 16.3 The Server-Side Main Method 16.4 Mapping for Interfaces 16.5 Parameter Passing 16.6 Raising Exceptions 16.7 Tie Classes 16.8 Object Incarnation 16.9 Summary Chapter 17 Developing a File System Server in C# 17.1 Chapter Overview 17.2 Implementing a File System Server 17.3 Summary Chapter 18 Client-Side Slice-to-Objective-C Mapping 18.1 Chapter Overview 18.2 Introduction 18.3 Mapping for Modules 18.4 The ICE Prefix 18.5 Mapping for Identifiers 18.6 Internal Identifiers 18.7 Mapping for Built-In Types 18.8 Mapping for User-Defined Types 18.9 Mapping for Constants 18.10 Mapping for Exceptions 18.11 Mapping for Interfaces 18.12 Mapping for Operations 18.13 Exception Handling 18.14 Mapping for Local Interfaces 18.15 Mapping for Classes 18.16 Interfaces by Value 18.17 slice2objc Command-Line Options Chapter 19 Developing a File System Client in Objective‑C 19.1 Chapter Overview 19.2 The Objective‑C Client 19.3 Summary Chapter 20 Server-Side Slice-to-Objective‑C Mapping 20.1 Chapter Overview 20.2 Introduction 20.3 The Server-Side main Function 20.4 Mapping for Interfaces 20.5 Parameter Passing 20.6 Raising Exceptions 20.7 Object Incarnation 20.8 Summary Chapter 21 Developing a File System Server in Objective‑C 21.1 Chapter Overview 21.2 Implementing a File System Server 21.3 Summary Chapter 22 Client-Side Slice-to-Python Mapping 22.1 Chapter Overview 22.2 Introduction 22.3 Mapping for Identifiers 22.4 Mapping for Modules 22.5 The Ice Module 22.6 Mapping for Simple Built‑In Types 22.7 Mapping for User-Defined Types 22.8 Mapping for Constants 22.9 Mapping for Exceptions 22.10 Mapping for Run-Time Exceptions 22.11 Mapping for Interfaces 22.12 Mapping for Operations 22.13 Exception Handling 22.14 Mapping for Classes 22.15 Code Generation 22.16 Using Slice Checksums Chapter 23 Developing a File System Client in Python 23.1 Chapter Overview 23.2 The Python Client 23.3 Summary Chapter 24 Server-Side Slice-to-Python Mapping 24.1 Chapter Overview 24.2 Introduction 24.3 The Server-Side main Program 24.4 Mapping for Interfaces 24.5 Parameter Passing 24.6 Raising Exceptions 24.7 Object Incarnation 24.8 Summary Chapter 25 Developing a File System Server in Python 25.1 Chapter Overview 25.2 Implementing a File System Server 25.3 Thread Safety 25.4 Summary Chapter 26 Client-Side Slice-to-Ruby Mapping 26.1 Chapter Overview 26.2 Introduction 26.3 Mapping for Identifiers 26.4 Mapping for Modules 26.5 The Ice Module 26.6 Mapping for Simple Built‑In Types 26.7 Mapping for User-Defined Types 26.8 Mapping for Constants 26.9 Mapping for Exceptions 26.10 Mapping for Run-Time Exceptions 26.11 Mapping for Interfaces 26.12 Mapping for Operations 26.13 Exception Handling 26.14 Mapping for Classes 26.15 Code Generation 26.16 The main Program 26.17 Using Slice Checksums Chapter 27 Developing a File System Client in Ruby 27.1 Chapter Overview 27.2 The Ruby Client 27.3 Summary Chapter 28 Ice Extension for PHP 28.1 Chapter Overview 28.2 Introduction 28.3 Configuration 28.4 Client-Side Slice-to-PHP Mapping Chapter 29 Developing a File System Client in PHP 29.1 Chapter Overview 29.2 The PHP Client 29.3 Summary Chapter 30 Ice Properties and Configuration 30.1 Chapter Overview 30.2 Properties 30.3 Configuration Files 30.4 Setting Properties on the Command Line 30.5 The Ice.Config Property 30.6 Command-Line Parsing and Initialization 30.7 The Ice.ProgramName property 30.8 Using Properties Programmatically 30.9 Unused Properties 30.10 Summary Chapter 31 Threads and Concurrency with C++ 31.1 Chapter Overview 31.2 Introduction 31.3 Library Overview 31.4 Mutexes 31.5 Recursive Mutexes 31.6 Read-Write Recursive Mutexes 31.7 Timed Locks 31.8 Monitors 31.9 Condition Variables 31.10 Efficiency Considerations 31.11 Threads 31.12 Portable Signal Handling 31.13 Summary Chapter 32 The Ice Run Time in Detail 32.1 Introduction 32.2 Communicators 32.3 Communicator Initialization 32.4 Object Adapters 32.5 Object Identity 32.6 The Ice::Current Object 32.7 Servant Locators 32.8 Default Servants 32.9 Server Implementation Techniques 32.10 The Ice Threading Model 32.11 Proxies 32.12 The Ice::Context Parameter 32.13 Connection Timeouts 32.14 Oneway Invocations 32.15 Datagram Invocations 32.16 Batched Invocations 32.17 Testing Proxies for Dispatch Type 32.18 Location Services 32.19 Administrative Facility 32.20 The Ice::Logger Interface 32.21 The Ice::Stats Interface 32.22 Location Transparency 32.23 Automatic Retries 32.24 Dispatch Interceptors 32.25 String Conversion 32.26 Developing a Plug‑In 32.27 A Comparison of the Ice and CORBA Run Time 32.28 Summary Chapter 33 Asynchronous Programming 33.1 Chapter Overview 33.2 Introduction 33.3 Using AMI 33.4 Using AMD 33.5 Summary Chapter 34 Facets and Versioning 34.1 Introduction 34.2 Concept and APIs 34.3 The Versioning Problem 34.4 Versioning with Facets 34.5 Facet Selection 34.6 Behavioral Versioning 34.7 Design Considerations 34.8 Summary Chapter 35 Object Life Cycle 35.1 Chapter Overview 35.2 Introduction 35.3 Object Existence and Non-Existence 35.4 Life Cycle of Proxies, Servants, and Ice Objects 35.5 Object Creation 35.6 Object Destruction 35.7 Removing Cyclic Dependencies 35.8 Life Cycle and Parallelism 35.9 Object Identity and Uniqueness 35.10 Object Life Cycle for the File System Application 35.11 Avoiding Server-Side Garbage 35.12 Summary Chapter 36 Dynamic Ice 36.1 Chapter Overview 36.2 Streaming Interface 36.3 Dynamic Invocation and Dispatch 36.4 Asynchronous Dynamic Invocation and Dispatch 36.5 Summary Chapter 37 Connection Management 37.1 Chapter Overview 37.2 Introduction 37.3 Connection Establishment 37.4 Active Connection Management 37.5 Obtaining a Connection 37.6 Connection Closure 37.7 Bidirectional Connections 37.8 Summary Chapter 38 The Ice Protocol 38.1 Chapter Overview 38.2 Data Encoding 38.3 Protocol Messages 38.4 Compression 38.5 Protocol and Encoding Versions 38.6 A Comparison with IIOP Chapter 39 IceGrid 39.1 Chapter Overview 39.2 Introduction 39.3 IceGrid Architecture 39.4 Getting Started 39.5 Using Deployment 39.6 Well-known Objects 39.7 Templates 39.8 IceBox Integration 39.9 Object Adapter Replication 39.10 Load Balancing 39.11 Sessions 39.12 Registry Replication 39.13 Application Distribution 39.14 Administrative Sessions 39.15 Glacier2 Integration 39.16 XML Reference 39.17 Variable and Parameter Semantics 39.18 Property Set Semantics 39.19 XML Features 39.20 Server Reference 39.21 Administrative Facility Integration 39.22 Securing IceGrid 39.23 Administrative Utilities 39.24 Server Activation 39.25 Solving Problems 39.26 Summary Chapter 40 Freeze 40.1 Chapter Overview 40.2 Introduction 40.3 The Freeze Map 40.4 Using a Freeze Map in the File System Server 40.5 Freeze Evictors 40.6 Using the Freeze Evictor in a File System Server 40.7 The Freeze Catalog 40.8 Backups 40.9 Summary Chapter 41 FreezeScript 41.1 Chapter Overview 41.2 Introduction 41.3 Database Migration 41.4 Transformation Descriptors 41.5 Using transformdb 41.6 Database Inspection 41.7 Using dumpdb 41.8 Descriptor Expression Language 41.9 Summary Chapter 42 IceSSL 42.1 Chapter Overview 42.2 Introduction 42.3 Using IceSSL 42.4 Configuring IceSSL 42.5 Programming with IceSSL 42.6 Advanced Topics 42.7 Setting up a Certificate Authority 42.8 Summary Chapter 43 Glacier2 43.1 Chapter Overview 43.2 Introduction 43.3 Using Glacier2 43.4 Callbacks 43.5 Router Security 43.6 Session Management 43.7 Dynamic Filtering 43.8 Request Buffering 43.9 Request Contexts 43.10 Firewalls 43.11 Advanced Client Configurations 43.12 IceGrid Integration 43.13 Summary Chapter 44 IceBox 44.1 Chapter Overview 44.2 Introduction 44.3 Developing a Service 44.4 Starting IceBox 44.5 IceBox Administration 44.6 Summary Chapter 45 IceStorm 45.1 Chapter Overview 45.2 Introduction 45.3 Concepts 45.4 IceStorm Interface Overview 45.5 Using IceStorm 45.6 Publishing to a Specific Subscriber 45.7 Highly Available IceStorm 45.8 IceStorm Administration 45.9 Topic Federation 45.10 Quality of Service 45.11 Delivery Mode 45.12 Configuring IceStorm 45.13 Summary Chapter 46 IcePatch2 46.1 Chapter Overview 46.2 Introduction 46.3 Using icepatch2calc 46.4 Running the Server 46.5 Running the Client 46.6 Object Identities 46.7 The IcePatch2 Client Utility Library 46.8 Summary Appendix A Slice Keywords Appendix B Slice API Reference Appendix C Properties C.1 Ice Configuration Property C.2 Ice Trace Properties C.3 Ice Warning Properties C.4 Ice Object Adapter Properties C.5 Ice Administrative Properties C.6 Ice Plug‑In Properties C.7 Ice Thread Pool Properties C.8 Ice Default and Override Properties C.9 Ice Proxy Properties C.10 Ice Transport Properties C.11 Ice Miscellaneous Properties C.12 IceSSL Properties C.13 IceBox Properties C.14 IceBoxAdmin Properties C.15 IceGrid Properties C.16 IceGrid Administrative Client Properties C.17 IceStorm Properties C.18 Glacier2 Properties C.19 Freeze Properties C.20 IcePatch2 Properties Appendix D Proxies and Endpoints D.1 Proxies D.2 Endpoints Appendix E The C++ Utility Library E.1 Introduction E.2 AbstractMutex E.3 Cache E.4 CtrlCHandler E.5 Exception E.6 generateUUID E.7 Handle Template E.8 Handle Template Adaptors E.9 Shared and SimpleShared E.10 Threads and Synchronization Primitives E.11 Time E.12 Timer and TimerTask E.13 Unicode and UTF‑8 Conversion Functions E.14 Version Information Appendix F The Java Utility Library F.1 Introduction F.2 The IceUtil Package F.3 The Ice.Util Class Appendix G The .NET Utility Library G.1 Introduction G.2 Communicator Initialization Methods G.3 Identity Conversion G.4 Property Creation Methods G.5 Proxy Comparison Methods G.6 Stream Creation G.7 UUID Generation G.8 Version Information Appendix H Windows Services H.1 Introduction H.2 Installing a Windows Service H.3 The Ice Service Installer H.4 Manual Installation H.5 Troubleshooting Appendix I Binary Distributions I.1 Introduction I.2 Developer Kits I.3 Guidelines Appendix J License Information J.1 Definitions J.2 Fair Use Rights J.3 License Grant J.4 Restrictions J.5 Representations, Warranties and Disclaimer J.6 Limitation on Liability J.7 Termination J.8 Miscellaneous Bibliography