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 Python 3.8 Writing an Ice Application with Ruby 3.9 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 Deprecating Slice Definitions 4.19 Using the Slice Compilers 4.20 Slice Checksums 4.21 A Comparison of Slice and CORBA IDL 4.22 Generating Slice Documentation 4.23 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 Customizing the Java Mapping 10.16 slice2java Command-Line Options 10.17 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 C#-Specific Metadata Directives 14.15 slice2cs Command-Line Options 14.16 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-Python Mapping 18.1 Chapter Overview 18.2 Introduction 18.3 Mapping for Identifiers 18.4 Mapping for Modules 18.5 The Ice Module 18.6 Mapping for Simple Built‑In Types 18.7 Mapping for User-Defined Types 18.8 Mapping for Constants 18.9 Mapping for Exceptions 18.10 Mapping for Run-Time Exceptions 18.11 Mapping for Interfaces 18.12 Mapping for Operations 18.13 Exception Handling 18.14 Mapping for Classes 18.15 Code Generation 18.16 Using Slice Checksums Chapter 19 Developing a File System Client in Python 19.1 Chapter Overview 19.2 The Python Client 19.3 Summary Chapter 20 Server-Side Slice-to-Python Mapping 20.1 Chapter Overview 20.2 Introduction 20.3 The Server-Side main Program 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 Python 21.1 Chapter Overview 21.2 Implementing a File System Server 21.3 Thread Safety 21.4 Summary Chapter 22 Client-Side Slice-to-Ruby 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 The main Program 22.17 Using Slice Checksums Chapter 23 Developing a File System Client in Ruby 23.1 Chapter Overview 23.2 The Ruby Client 23.3 Summary Chapter 24 Ice Extension for PHP 24.1 Chapter Overview 24.2 Introduction 24.3 Configuration 24.4 Client-Side Slice-to-PHP Mapping Chapter 25 Developing a File System Client in PHP 25.1 Chapter Overview 25.2 The PHP Client 25.3 Summary Chapter 26 Ice Properties and Configuration 26.1 Chapter Overview 26.2 Properties 26.3 Configuration Files 26.4 Setting Properties on the Command Line 26.5 The Ice.Config Property 26.6 Command-Line Parsing and Initialization 26.7 The Ice.ProgramName property 26.8 Using Properties Programmatically 26.9 Unused Properties 26.10 Summary Chapter 27 Threads and Concurrency with C++ 27.1 Chapter Overview 27.2 Introduction 27.3 Library Overview 27.4 Mutexes 27.5 Recursive Mutexes 27.6 Read-Write Recursive Mutexes 27.7 Timed Locks 27.8 Monitors 27.9 Condition Variables 27.10 Efficiency Considerations 27.11 Threads 27.12 Portable Signal Handling 27.13 Summary Chapter 28 The Ice Run Time in Detail 28.1 Introduction 28.2 Communicators 28.3 Communicator Initialization 28.4 Object Adapters 28.5 Object Identity 28.6 The Ice::Current Object 28.7 Servant Locators 28.8 Server Implementation Techniques 28.9 The Ice Threading Model 28.10 Proxies 28.11 The Ice::Context Parameter 28.12 Connection Timeouts 28.13 Oneway Invocations 28.14 Datagram Invocations 28.15 Batched Invocations 28.16 Testing Proxies for Dispatch Type 28.17 Location Services 28.18 Administrative Facility 28.19 The Ice::Logger Interface 28.20 The Ice::Stats Interface 28.21 Location Transparency 28.22 Dispatch Interceptors 28.23 String Conversion 28.24 Developing a Plugin 28.25 A Comparison of the Ice and CORBA Run Time 28.26 Summary Chapter 29 Asynchronous Programming 29.1 Chapter Overview 29.2 Introduction 29.3 Using AMI 29.4 Using AMD 29.5 Summary Chapter 30 Facets and Versioning 30.1 Introduction 30.2 Concept and APIs 30.3 The Versioning Problem 30.4 Versioning with Facets 30.5 Facet Selection 30.6 Behavioral Versioning 30.7 Design Considerations 30.8 Summary Chapter 31 Object Life Cycle 31.1 Chapter Overview 31.2 Introduction 31.3 Object Existence and Non-Existence 31.4 Life Cycle of Proxies, Servants, and Ice Objects 31.5 Object Creation 31.6 Object Destruction 31.7 Removing Cyclic Dependencies 31.8 Life Cycle and Parallelism 31.9 Object Identity and Uniqueness 31.10 Object Life Cycle for the File System Application 31.11 Avoiding Server-Side Garbage 31.12 Summary Chapter 32 Dynamic Ice 32.1 Chapter Overview 32.2 Streaming Interface 32.3 Dynamic Invocation and Dispatch 32.4 Asynchronous Dynamic Invocation and Dispatch 32.5 Summary Chapter 33 Connection Management 33.1 Chapter Overview 33.2 Introduction 33.3 Connection Establishment 33.4 Active Connection Management 33.5 Obtaining a Connection 33.6 Connection Closure 33.7 Bidirectional Connections 33.8 Summary Chapter 34 The Ice Protocol 34.1 Chapter Overview 34.2 Data Encoding 34.3 Protocol Messages 34.4 Compression 34.5 Protocol and Encoding Versions 34.6 A Comparison with IIOP Chapter 35 IceGrid 35.1 Chapter Overview 35.2 Introduction 35.3 IceGrid Architecture 35.4 Getting Started 35.5 Using Deployment 35.6 Well-known Objects 35.7 Templates 35.8 IceBox Integration 35.9 Object Adapter Replication 35.10 Load Balancing 35.11 Sessions 35.12 Registry Replication 35.13 Application Distribution 35.14 Administrative Sessions 35.15 Glacier2 Integration 35.16 XML Reference 35.17 Variable and Parameter Semantics 35.18 Property Set Semantics 35.19 XML Features 35.20 Server Reference 35.21 Administrative Facility Integration 35.22 Securing IceGrid 35.23 Administrative Utilities 35.24 Server Activation 35.25 Solving Problems 35.26 Summary Chapter 36 Freeze 36.1 Chapter Overview 36.2 Introduction 36.3 The Freeze Map 36.4 Using a Freeze Map in the File System Server 36.5 Freeze Evictors 36.6 Using the Freeze Evictor in a File System Server 36.7 The Freeze Catalog 36.8 Backups 36.9 Summary Chapter 37 FreezeScript 37.1 Chapter Overview 37.2 Introduction 37.3 Database Migration 37.4 Transformation Descriptors 37.5 Using transformdb 37.6 Database Inspection 37.7 Using dumpdb 37.8 Descriptor Expression Language 37.9 Summary Chapter 38 IceSSL 38.1 Chapter Overview 38.2 Introduction 38.3 Using IceSSL 38.4 Configuring IceSSL 38.5 Programming with IceSSL 38.6 Advanced Topics 38.7 Setting up a Certificate Authority 38.8 Summary Chapter 39 Glacier2 39.1 Chapter Overview 39.2 Introduction 39.3 Using Glacier2 39.4 Callbacks 39.5 Router Security 39.6 Session Management 39.7 Dynamic Filtering 39.8 Request Buffering 39.9 Request Contexts 39.10 Firewalls 39.11 Advanced Client Configurations 39.12 IceGrid Integration 39.13 Summary Chapter 40 IceBox 40.1 Chapter Overview 40.2 Introduction 40.3 Developing a Service 40.4 Starting IceBox 40.5 IceBox Administration 40.6 Summary Chapter 41 IceStorm 41.1 Chapter Overview 41.2 Introduction 41.3 Concepts 41.4 IceStorm Interface Overview 41.5 Using IceStorm 41.6 Publishing to a Specific Subscriber 41.7 Highly Available IceStorm 41.8 IceStorm Administration 41.9 Topic Federation 41.10 Quality of Service 41.11 Delivery Mode 41.12 Configuring IceStorm 41.13 Summary Chapter 42 IcePatch2 42.1 Chapter Overview 42.2 Introduction 42.3 Using icepatch2calc 42.4 Running the Server 42.5 Running the Client 42.6 Object Identities 42.7 The IcePatch2 Client Utility Library 42.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 Plugin 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