summaryrefslogtreecommitdiff
path: root/py/python/Ice.py
diff options
context:
space:
mode:
authorMatthew Newhook <matthew@zeroc.com>2015-03-21 15:35:40 -0230
committerMatthew Newhook <matthew@zeroc.com>2015-03-21 15:35:40 -0230
commit630a37d2fe66f24518299e705f958b571803c522 (patch)
tree969723791bdc4d73bb099c19d45554d0ca241ad9 /py/python/Ice.py
parentFix some README.md markdown formatting (diff)
downloadice-630a37d2fe66f24518299e705f958b571803c522.tar.bz2
ice-630a37d2fe66f24518299e705f958b571803c522.tar.xz
ice-630a37d2fe66f24518299e705f958b571803c522.zip
py -> python
rb -> ruby objc -> objective-c cs -> csharp
Diffstat (limited to 'py/python/Ice.py')
-rw-r--r--py/python/Ice.py1588
1 files changed, 0 insertions, 1588 deletions
diff --git a/py/python/Ice.py b/py/python/Ice.py
deleted file mode 100644
index b8c9f0a8721..00000000000
--- a/py/python/Ice.py
+++ /dev/null
@@ -1,1588 +0,0 @@
-# **********************************************************************
-#
-# Copyright (c) 2003-2015 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.
-#
-# **********************************************************************
-
-"""
-Ice module
-"""
-
-import sys, string, imp, os, threading, warnings, datetime
-
-#
-# RTTI problems can occur in C++ code unless we modify Python's dlopen flags.
-# Note that changing these flags might cause problems for other extensions
-# loaded by the application (see bug 3660), so we restore the original settings
-# after loading IcePy.
-#
-_dlopenflags = -1
-try:
- _dlopenflags = sys.getdlopenflags()
-
- try:
- import dl
- sys.setdlopenflags(dl.RTLD_NOW|dl.RTLD_GLOBAL)
- except ImportError:
- #
- # If the dl module is not available and we're running on a Linux
- # platform, use the hard coded value of RTLD_NOW|RTLD_GLOBAL.
- #
- if sys.platform.startswith("linux"):
- sys.setdlopenflags(258)
- pass
-
-except AttributeError:
- #
- # sys.getdlopenflags() is not supported (we're probably running on Windows).
- #
- pass
-
-#
-# Import the Python extension.
-#
-import IcePy
-
-#
-# Restore the dlopen flags.
-#
-if _dlopenflags >= 0:
- sys.setdlopenflags(_dlopenflags)
-
-#
-# Give the extension an opportunity to clean up before a graceful exit.
-#
-import atexit
-atexit.register(IcePy.cleanup)
-
-#
-# Add some symbols to the Ice module.
-#
-ObjectPrx = IcePy.ObjectPrx
-stringVersion = IcePy.stringVersion
-intVersion = IcePy.intVersion
-currentProtocol = IcePy.currentProtocol
-currentProtocolEncoding = IcePy.currentProtocolEncoding
-currentEncoding = IcePy.currentEncoding
-stringToProtocolVersion = IcePy.stringToProtocolVersion
-protocolVersionToString = IcePy.protocolVersionToString
-stringToEncodingVersion = IcePy.stringToEncodingVersion
-encodingVersionToString = IcePy.encodingVersionToString
-generateUUID = IcePy.generateUUID
-loadSlice = IcePy.loadSlice
-AsyncResult = IcePy.AsyncResult
-Unset = IcePy.Unset
-
-#
-# This value is used as the default value for struct types in the constructors
-# of user-defined types. It allows us to determine whether the application has
-# supplied a value. (See bug 3676)
-#
-_struct_marker = object()
-
-#
-# Core Ice types.
-#
-class Object(object):
- def ice_isA(self, id, current=None):
- '''Determines whether the target object supports the interface denoted
-by the given Slice type id.
-Arguments:
- id The Slice type id
-Returns:
- True if the target object supports the interface, or false otherwise.
-'''
- return id in self.ice_ids(current)
-
- def ice_ping(self, current=None):
- '''A reachability test for the target object.'''
- pass
-
- def ice_ids(self, current=None):
- '''Obtains the type ids corresponding to the Slice interface
-that are supported by the target object.
-Returns:
- A list of type ids.
-'''
- return [ self.ice_id(current) ]
-
- def ice_id(self, current=None):
- '''Obtains the type id corresponding to the most-derived Slice
-interface supported by the target object.
-Returns:
- The type id.
-'''
- return '::Ice::Object'
-
- def ice_staticId():
- '''Obtains the type id of this Slice class or interface.
-Returns:
- The type id.
-'''
- return '::Ice::Object'
- ice_staticId = staticmethod(ice_staticId)
-
- #
- # Do not define these here. They will be invoked if defined by a subclass.
- #
- #def ice_preMarshal(self):
- # pass
- #
- #def ice_postUnmarshal(self):
- # pass
-
-#
-# LocalObject is deprecated; use the Python base 'object' type instead.
-#
-class LocalObject(object):
- pass
-
-class Blobject(Object):
- '''Special-purpose servant base class that allows a subclass to
-handle synchronous Ice invocations as "blobs" of bytes.'''
-
- def ice_invoke(self, bytes, current):
- '''Dispatch a synchronous Ice invocation. The operation's
-arguments are encoded in the bytes argument. The return
-value must be a tuple of two values: the first is a
-boolean indicating whether the operation succeeded (True)
-or raised a user exception (False), and the second is
-the encoded form of the operation's results or the user
-exception.
-'''
- pass
-
-class BlobjectAsync(Object):
- '''Special-purpose servant base class that allows a subclass to
-handle asynchronous Ice invocations as "blobs" of bytes.'''
-
- def ice_invoke_async(self, cb, bytes, current):
- '''Dispatch an asynchronous Ice invocation. The operation's
-arguments are encoded in the bytes argument. When the
-dispatch is complete, the subclass can invoke either
-ice_response or ice_exception on the supplied callback
-object.
-'''
- pass
-
-#
-# Exceptions.
-#
-class Exception(Exception): # Derives from built-in base 'Exception' class.
- '''The base class for all Ice exceptions.'''
- def __str__(self):
- return self.__class__.__name__
-
- def ice_name(self):
- '''Returns the type name of this exception.'''
- return self._ice_name
-
-class LocalException(Exception):
- '''The base class for all Ice run-time exceptions.'''
- def __init__(self, args=''):
- self.args = args
-
-class UserException(Exception):
- '''The base class for all user-defined exceptions.'''
- pass
-
-class EnumBase(object):
- def __init__(self, _n, _v):
- self._name = _n
- self._value = _v
-
- def __str__(self):
- return self._name
-
- __repr__ = __str__
-
- def __hash__(self):
- return self._value
-
- def __lt__(self, other):
- if isinstance(other, self.__class__):
- return self._value < other._value;
- elif other == None:
- return False
- return NotImplemented
-
- def __le__(self, other):
- if isinstance(other, self.__class__):
- return self._value <= other._value;
- elif other == None:
- return False
- return NotImplemented
-
- def __eq__(self, other):
- if isinstance(other, self.__class__):
- return self._value == other._value;
- elif other == None:
- return False
- return NotImplemented
-
- def __ne__(self, other):
- if isinstance(other, self.__class__):
- return self._value != other._value;
- elif other == None:
- return False
- return NotImplemented
-
- def __gt__(self, other):
- if isinstance(other, self.__class__):
- return self._value > other._value;
- elif other == None:
- return False
- return NotImplemented
-
- def __ge__(self, other):
- if isinstance(other, self.__class__):
- return self._value >= other._value;
- elif other == None:
- return False
- return NotImplemented
-
- def _getName(self):
- return self._name
-
- def _getValue(self):
- return self._value
-
- name = property(_getName)
- value = property(_getValue)
-
-class SlicedData(object):
- #
- # Members:
- #
- # slices - tuple of SliceInfo
- #
- pass
-
-class SliceInfo(object):
- #
- # Members:
- #
- # typeId - string
- # compactId - int
- # bytes - string
- # objects - tuple of Ice.Object
- pass
-
-#
-# Native PropertiesAdmin admin facet.
-#
-NativePropertiesAdmin = IcePy.NativePropertiesAdmin
-
-class PropertiesAdminUpdateCallback(object):
- '''Callback class to get notifications of property updates passed
- through the Properties admin facet'''
-
- def updated(self, props):
- pass
-
-class UnknownSlicedObject(Object):
- #
- # Members:
- #
- # unknownTypeId - string
- pass
-
-def getSliceDir():
- '''Convenience function for locating the directory containing the Slice files.'''
-
- #
- # Detect setup.py installation in site-packages. The slice
- # files live along side Ice.py
- #
- dir = os.path.join(os.path.dirname(__file__), "slice")
- if os.path.isdir(dir):
- return dir
-
- #
- # Get the parent of the directory containing this file (Ice.py).
- #
- pyHome = os.path.join(os.path.dirname(__file__), "..")
-
- #
- # For an installation from a source distribution, a binary tarball, or a
- # Windows installer, the "slice" directory is a sibling of the "python"
- # directory.
- #
- dir = os.path.join(pyHome, "slice")
- if os.path.exists(dir):
- return os.path.normpath(dir)
-
- #
- # In a source distribution, the "slice" directory is one level higher.
- #
- dir = os.path.join(pyHome, "..", "slice")
- if os.path.exists(dir):
- return os.path.normpath(dir)
-
- iceVer = stringVersion()
-
- if sys.platform[:5] == "linux":
- #
- # Check the default RPM location.
- #
- dir = os.path.join("/", "usr", "share", "Ice-" + iceVer, "slice")
- if os.path.exists(dir):
- return dir
-
- elif sys.platform == "darwin":
- #
- # Check the default OS X location.
- #
- dir = os.path.join("/", "Library", "Developer", "Ice-" + iceVer, "slice")
- if os.path.exists(dir):
- return dir
-
- return None
-
-#
-# Utilities for use by generated code.
-#
-
-_pendingModules = {}
-
-def openModule(name):
- global _pendingModules
- if name in sys.modules:
- result = sys.modules[name]
- elif name in _pendingModules:
- result = _pendingModules[name]
- else:
- result = createModule(name)
-
- return result
-
-def createModule(name):
- global _pendingModules
- l = name.split(".")
- curr = ''
- mod = None
-
- for s in l:
- curr = curr + s
-
- if curr in sys.modules:
- mod = sys.modules[curr]
- elif curr in _pendingModules:
- mod = _pendingModules[curr]
- else:
- nmod = imp.new_module(curr)
- _pendingModules[curr] = nmod
- mod = nmod
-
- curr = curr + "."
-
- return mod
-
-def updateModule(name):
- global _pendingModules
- if name in _pendingModules:
- pendingModule = _pendingModules[name]
- mod = sys.modules[name]
- mod.__dict__.update(pendingModule.__dict__)
- del _pendingModules[name]
-
-def updateModules():
- global _pendingModules
- for name in _pendingModules.keys():
- if name in sys.modules:
- sys.modules[name].__dict__.update(_pendingModules[name].__dict__)
- else:
- sys.modules[name] = _pendingModules[name]
- _pendingModules = {}
-
-def createTempClass():
- class __temp: pass
- return __temp
-
-class FormatType(object):
- def __init__(self, val):
- assert(val >= 0 and val < 3)
- self.value = val
-
-FormatType.DefaultFormat = FormatType(0)
-FormatType.CompactFormat = FormatType(1)
-FormatType.SlicedFormat = FormatType(2)
-
-#
-# Forward declarations.
-#
-IcePy._t_Object = IcePy.declareClass('::Ice::Object')
-IcePy._t_ObjectPrx = IcePy.declareProxy('::Ice::Object')
-IcePy._t_LocalObject = IcePy.declareClass('::Ice::LocalObject')
-
-#
-# Sequence mappings.
-#
-IcePy.SEQ_DEFAULT = 0
-IcePy.SEQ_TUPLE = 1
-IcePy.SEQ_LIST = 2
-#IcePy.SEQ_ARRAY = 3
-
-#
-# Slice checksum dictionary.
-#
-sliceChecksums = {}
-
-#
-# Import generated Ice modules.
-#
-import Ice_BuiltinSequences_ice
-import Ice_Communicator_ice
-import Ice_Current_ice
-import Ice_ImplicitContext_ice
-import Ice_Endpoint_ice
-import Ice_EndpointTypes_ice
-import Ice_Identity_ice
-import Ice_LocalException_ice
-import Ice_Locator_ice
-import Ice_Logger_ice
-import Ice_ObjectAdapter_ice
-import Ice_ObjectFactory_ice
-import Ice_Process_ice
-import Ice_Properties_ice
-import Ice_Router_ice
-import Ice_ServantLocator_ice
-import Ice_Connection_ice
-import Ice_Version_ice
-import Ice_Instrumentation_ice
-import Ice_Metrics_ice
-
-#
-# Replace EndpointInfo with our implementation.
-#
-del EndpointInfo
-EndpointInfo = IcePy.EndpointInfo
-del IPEndpointInfo
-IPEndpointInfo = IcePy.IPEndpointInfo
-del TCPEndpointInfo
-TCPEndpointInfo = IcePy.TCPEndpointInfo
-del UDPEndpointInfo
-UDPEndpointInfo = IcePy.UDPEndpointInfo
-del WSEndpointInfo
-WSEndpointInfo = IcePy.WSEndpointInfo
-del OpaqueEndpointInfo
-OpaqueEndpointInfo = IcePy.OpaqueEndpointInfo
-
-#
-# Replace ConnectionInfo with our implementation.
-#
-del ConnectionInfo
-ConnectionInfo = IcePy.ConnectionInfo
-del IPConnectionInfo
-IPConnectionInfo = IcePy.IPConnectionInfo
-del TCPConnectionInfo
-TCPConnectionInfo = IcePy.TCPConnectionInfo
-del UDPConnectionInfo
-UDPConnectionInfo = IcePy.UDPConnectionInfo
-del WSConnectionInfo
-WSConnectionInfo = IcePy.WSConnectionInfo
-
-class ThreadNotification(object):
- '''Base class for thread notification callbacks. A subclass must
-define the start and stop methods.'''
-
- def __init__(self):
- pass
-
- def start():
- '''Invoked in the context of a thread created by the Ice run time.'''
- pass
-
- def stop():
- '''Invoked in the context of an Ice run-time thread that is about
-to terminate.'''
- pass
-
-class BatchRequest(object):
- '''Base class for batch request interceptor. A subclass must
-define the enqueue method.'''
- def __init__(self, size, operation, proxy):
- self._size = size
- self._operation = operation
- self._proxy = proxy
-
- def getSize():
- return self._size
-
- def getOperation():
- return self._operation
-
- def getProxy():
- return self._proxy
-
- def enqueue():
- '''Call enqueue from the batch request interceptor enqueue
-implementation to confirm the batching a this request.'''
- pass
-
-class BatchRequestInterceptor(object):
- '''Base class for batch request interceptor. A subclass must
-define the enqueue method.'''
-
- def __init__(self):
- pass
-
- def enqueue(request, queueCount, queueSize):
- '''Invoked when a request is batched.'''
- pass
-
-#
-# Initialization data.
-#
-class InitializationData(object):
- '''The attributes of this class are used to initialize a new
-communicator instance. The supported attributes are as follows:
-
-properties: An instance of Ice.Properties. You can use the
- Ice.createProperties function to create a new property set.
-
-logger: An instance of Ice.Logger.
-
-threadHook: An object that implements ThreadNotification.
-'''
- def __init__(self):
- self.properties = None
- self.logger = None
- self.threadHook = None
- self.batchRequestInterceptor = None
-
-#
-# Communicator wrapper.
-#
-class CommunicatorI(Communicator):
- def __init__(self, impl):
- self._impl = impl
- impl._setWrapper(self)
-
- def destroy(self):
- self._impl.destroy()
-
- def shutdown(self):
- self._impl.shutdown()
-
- def waitForShutdown(self):
- #
- # If invoked by the main thread, waitForShutdown only blocks for
- # the specified timeout in order to give us a chance to handle
- # signals.
- #
- while not self._impl.waitForShutdown(500):
- pass
-
- def isShutdown(self):
- return self._impl.isShutdown()
-
- def stringToProxy(self, str):
- return self._impl.stringToProxy(str)
-
- def proxyToString(self, obj):
- return self._impl.proxyToString(obj)
-
- def propertyToProxy(self, str):
- return self._impl.propertyToProxy(str)
-
- def proxyToProperty(self, obj, str):
- return self._impl.proxyToProperty(obj, str)
-
- def stringToIdentity(self, str):
- return self._impl.stringToIdentity(str)
-
- def identityToString(self, ident):
- return self._impl.identityToString(ident)
-
- def createObjectAdapter(self, name):
- adapter = self._impl.createObjectAdapter(name)
- return ObjectAdapterI(adapter)
-
- def createObjectAdapterWithEndpoints(self, name, endpoints):
- adapter = self._impl.createObjectAdapterWithEndpoints(name, endpoints)
- return ObjectAdapterI(adapter)
-
- def createObjectAdapterWithRouter(self, name, router):
- adapter = self._impl.createObjectAdapterWithRouter(name, router)
- return ObjectAdapterI(adapter)
-
- def addObjectFactory(self, factory, id):
- self._impl.addObjectFactory(factory, id)
-
- def findObjectFactory(self, id):
- return self._impl.findObjectFactory(id)
-
- def getImplicitContext(self):
- context = self._impl.getImplicitContext()
- if context == None:
- return None;
- else:
- return ImplicitContextI(context)
-
- def getProperties(self):
- properties = self._impl.getProperties()
- return PropertiesI(properties)
-
- def getLogger(self):
- logger = self._impl.getLogger()
- if isinstance(logger, Logger):
- return logger
- else:
- return LoggerI(logger)
-
- def getStats(self):
- raise RuntimeError("operation `getStats' not implemented")
-
- def getDefaultRouter(self):
- return self._impl.getDefaultRouter()
-
- def setDefaultRouter(self, rtr):
- self._impl.setDefaultRouter(rtr)
-
- def getDefaultLocator(self):
- return self._impl.getDefaultLocator()
-
- def setDefaultLocator(self, loc):
- self._impl.setDefaultLocator(loc)
-
- def getPluginManager(self):
- raise RuntimeError("operation `getPluginManager' not implemented")
-
- def flushBatchRequests(self):
- self._impl.flushBatchRequests()
-
- def begin_flushBatchRequests(self, _ex=None, _sent=None):
- return self._impl.begin_flushBatchRequests(_ex, _sent)
-
- def end_flushBatchRequests(self, r):
- return self._impl.end_flushBatchRequests(r)
-
- def createAdmin(self, adminAdapter, adminIdentity):
- return self._impl.createAdmin(adminAdapter, adminIdentity)
-
- def getAdmin(self):
- return self._impl.getAdmin()
-
- def addAdminFacet(self, servant, facet):
- self._impl.addAdminFacet(servant, facet)
-
- def findAdminFacet(self, facet):
- return self._impl.findAdminFacet(facet)
-
- def findAllAdminFacets(self):
- return self._impl.findAllAdminFacets()
-
- def removeAdminFacet(self, facet):
- return self._impl.removeAdminFacet(facet)
-
-#
-# Ice.initialize()
-#
-def initialize(args=None, data=None):
- '''Initializes a new communicator. The optional arguments represent
-an argument list (such as sys.argv) and an instance of InitializationData.
-You can invoke this function as follows:
-
-Ice.initialize()
-Ice.initialize(args)
-Ice.initialize(data)
-Ice.initialize(args, data)
-
-If you supply an argument list, the function removes those arguments from
-the list that were recognized by the Ice run time.
-'''
- communicator = IcePy.Communicator(args, data)
- return CommunicatorI(communicator)
-
-#
-# ObjectAdapter wrapper.
-#
-class ObjectAdapterI(ObjectAdapter):
- def __init__(self, impl):
- self._impl = impl
-
- def getName(self):
- return self._impl.getName()
-
- def getCommunicator(self):
- communicator = self._impl.getCommunicator()
- return communicator._getWrapper()
-
- def activate(self):
- self._impl.activate()
-
- def hold(self):
- self._impl.hold()
-
- def waitForHold(self):
- #
- # If invoked by the main thread, waitForHold only blocks for
- # the specified timeout in order to give us a chance to handle
- # signals.
- #
- while not self._impl.waitForHold(1000):
- pass
-
- def deactivate(self):
- self._impl.deactivate()
-
- def waitForDeactivate(self):
- #
- # If invoked by the main thread, waitForDeactivate only blocks for
- # the specified timeout in order to give us a chance to handle
- # signals.
- #
- while not self._impl.waitForDeactivate(1000):
- pass
-
- def isDeactivated(self):
- self._impl.isDeactivated()
-
- def destroy(self):
- self._impl.destroy()
-
- def add(self, servant, id):
- return self._impl.add(servant, id)
-
- def addFacet(self, servant, id, facet):
- return self._impl.addFacet(servant, id, facet)
-
- def addWithUUID(self, servant):
- return self._impl.addWithUUID(servant)
-
- def addFacetWithUUID(self, servant, facet):
- return self._impl.addFacetWIthUUID(servant, facet)
-
- def addDefaultServant(self, servant, category):
- self._impl.addDefaultServant(servant, category)
-
- def remove(self, id):
- return self._impl.remove(id)
-
- def removeFacet(self, id, facet):
- return self._impl.removeFacet(id, facet)
-
- def removeAllFacets(self, id):
- return self._impl.removeAllFacets(id)
-
- def removeDefaultServant(self, category):
- return self._impl.removeDefaultServant(category)
-
- def find(self, id):
- return self._impl.find(id)
-
- def findFacet(self, id, facet):
- return self._impl.findFacet(id, facet)
-
- def findAllFacets(self, id):
- return self._impl.findAllFacets(id)
-
- def findByProxy(self, proxy):
- return self._impl.findByProxy(proxy)
-
- def findDefaultServant(self, category):
- return self._impl.findDefaultServant(category)
-
- def addServantLocator(self, locator, category):
- self._impl.addServantLocator(locator, category)
-
- def removeServantLocator(self, category):
- return self._impl.removeServantLocator(category)
-
- def findServantLocator(self, category):
- return self._impl.findServantLocator(category)
-
- def createProxy(self, id):
- return self._impl.createProxy(id)
-
- def createDirectProxy(self, id):
- return self._impl.createDirectProxy(id)
-
- def createIndirectProxy(self, id):
- return self._impl.createIndirectProxy(id)
-
- def createReverseProxy(self, id):
- return self._impl.createReverseProxy(id)
-
- def setLocator(self, loc):
- self._impl.setLocator(loc)
-
- def getLocator(self):
- return self._impl.getLocator()
-
- def refreshPublishedEndpoints(self):
- self._impl.refreshPublishedEndpoints()
-
- def getEndpoints(self):
- return self._impl.getEndpoints()
-
- def getPublishedEndpoints(self):
- return self._impl.getPublishedEndpoints()
-
-#
-# Logger wrapper.
-#
-class LoggerI(Logger):
- def __init__(self, impl):
- self._impl = impl
-
- def _print(self, message):
- return self._impl._print(message)
-
- def trace(self, category, message):
- return self._impl.trace(category, message)
-
- def warning(self, message):
- return self._impl.warning(message)
-
- def error(self, message):
- return self._impl.error(message)
-
- def getPrefix(self):
- return self._impl.getPrefix()
-
- def cloneWithPrefix(self, prefix):
- logger = self._impl.cloneWithPrefix(prefix)
- return LoggerI(logger)
-
-#
-# Properties wrapper.
-#
-class PropertiesI(Properties):
- def __init__(self, impl):
- self._impl = impl
-
- def getProperty(self, key):
- return self._impl.getProperty(key)
-
- def getPropertyWithDefault(self, key, value):
- return self._impl.getPropertyWithDefault(key, value)
-
- def getPropertyAsInt(self, key):
- return self._impl.getPropertyAsInt(key)
-
- def getPropertyAsIntWithDefault(self, key, value):
- return self._impl.getPropertyAsIntWithDefault(key, value)
-
- def getPropertyAsList(self, key):
- return self._impl.getPropertyAsList(key)
-
- def getPropertyAsListWithDefault(self, key, value):
- return self._impl.getPropertyAsListWithDefault(key, value)
-
- def getPropertiesForPrefix(self, prefix):
- return self._impl.getPropertiesForPrefix(prefix)
-
- def setProperty(self, key, value):
- self._impl.setProperty(key, value)
-
- def getCommandLineOptions(self):
- return self._impl.getCommandLineOptions()
-
- def parseCommandLineOptions(self, prefix, options):
- return self._impl.parseCommandLineOptions(prefix, options)
-
- def parseIceCommandLineOptions(self, options):
- return self._impl.parseIceCommandLineOptions(options)
-
- def load(self, file):
- self._impl.load(file)
-
- def clone(self):
- properties = self._impl.clone()
- return PropertiesI(properties)
-
- def __iter__(self):
- dict = self._impl.getPropertiesForPrefix('')
- return iter(dict)
-
- def __str__(self):
- return str(self._impl)
-
-#
-# Ice.createProperties()
-#
-def createProperties(args=None, defaults=None):
- '''Creates a new property set. The optional arguments represent
-an argument list (such as sys.argv) and a property set that supplies
-default values. You can invoke this function as follows:
-
-Ice.createProperties()
-Ice.createProperties(args)
-Ice.createProperties(defaults)
-Ice.createProperties(args, defaults)
-
-If you supply an argument list, the function removes those arguments
-from the list that were recognized by the Ice run time.
-'''
-
- properties = IcePy.createProperties(args, defaults)
- return PropertiesI(properties)
-
-#
-# Ice.getProcessLogger()
-# Ice.setProcessLogger()
-#
-def getProcessLogger():
- '''Returns the default logger object.'''
- logger = IcePy.getProcessLogger()
- if isinstance(logger, Logger):
- return logger
- else:
- return LoggerI(logger)
-
-def setProcessLogger(logger):
- '''Sets the default logger object.'''
- IcePy.setProcessLogger(logger)
-
-#
-# ImplicitContext wrapper
-#
-class ImplicitContextI(ImplicitContext):
- def __init__(self, impl):
- self._impl = impl
-
- def setContext(self, ctx):
- self._impl.setContext(ctx)
-
- def getContext(self):
- return self._impl.getContext()
-
- def containsKey(self, key):
- return self._impl.containsKey(key)
-
- def get(self, key):
- return self._impl.get(key)
-
- def put(self, key, value):
- return self._impl.put(key, value)
-
- def remove(self, key):
- return self._impl.remove(key)
-
-
-#
-# Its not possible to block in a python signal handler since this
-# blocks the main thread from doing further work. As such we queue the
-# signal with a worker thread which then "dispatches" the signal to
-# the registered callback object.
-#
-# Note the interface is the same as the C++ CtrlCHandler
-# implementation, however, the implementation is different.
-#
-class CtrlCHandler(threading.Thread):
- # Class variable referring to the one and only handler for use
- # from the signal handling callback.
- _self = None
-
- def __init__(self):
- threading.Thread.__init__(self)
-
- if CtrlCHandler._self != None:
- raise RuntimeError("Only a single instance of a CtrlCHandler can be instantiated.")
- CtrlCHandler._self = self
-
- # State variables. These are not class static variables.
- self._condVar = threading.Condition()
- self._queue = []
- self._done = False
- self._callback = None
-
- #
- # Setup and install signal handlers
- #
- if 'SIGHUP' in signal.__dict__:
- signal.signal(signal.SIGHUP, CtrlCHandler.signalHandler)
- if 'SIGBREAK' in signal.__dict__:
- signal.signal(signal.SIGBREAK, CtrlCHandler.signalHandler)
- signal.signal(signal.SIGINT, CtrlCHandler.signalHandler)
- signal.signal(signal.SIGTERM, CtrlCHandler.signalHandler)
-
- # Start the thread once everything else is done.
- self.start()
-
- # Dequeue and dispatch signals.
- def run(self):
- while True:
- self._condVar.acquire()
- while len(self._queue) == 0 and not self._done:
- self._condVar.wait()
- if self._done:
- self._condVar.release()
- break
- sig, callback = self._queue.pop()
- self._condVar.release()
- if callback:
- callback(sig)
-
- # Destroy the object. Wait for the thread to terminate and cleanup
- # the internal state.
- def destroy(self):
- self._condVar.acquire()
- self._done = True
- self._condVar.notify()
- self._condVar.release()
-
- # Wait for the thread to terminate
- self.join()
- #
- # Cleanup any state set by the CtrlCHandler.
- #
- if 'SIGHUP' in signal.__dict__:
- signal.signal(signal.SIGHUP, signal.SIG_DFL)
- if 'SIGBREAK' in signal.__dict__:
- signal.signal(signal.SIGBREAK, signal.SIG_DFL)
- signal.signal(signal.SIGINT, signal.SIG_DFL)
- signal.signal(signal.SIGTERM, signal.SIG_DFL)
- CtrlCHandler._self = None
-
- def setCallback(self, callback):
- self._condVar.acquire()
- self._callback = callback
- self._condVar.release()
-
- def getCallback(self):
- self._condVar.acquire()
- callback = self._callback
- self._condVar.release()
- return callback
-
- # Private. Only called by the signal handling mechanism.
- def signalHandler(self, sig, frame):
- self._self._condVar.acquire()
- #
- # The signal AND the current callback are queued together.
- #
- self._self._queue.append([sig, self._self._callback])
- self._self._condVar.notify()
- self._self._condVar.release()
- signalHandler = classmethod(signalHandler)
-
-#
-# Application logger.
-#
-class _ApplicationLoggerI(Logger):
- def __init__(self, prefix):
- if len(prefix) > 0:
- self._prefix = prefix + ": "
- else:
- self._prefix = ""
- self._outputMutex = threading.Lock()
-
- def _print(self, message):
- s = "[ " + str(datetime.datetime.now()) + " " + self._prefix
- self._outputMutex.acquire()
- sys.stderr.write(message + "\n")
- self._outputMutex.release()
-
- def trace(self, category, message):
- s = "[ " + str(datetime.datetime.now()) + " " + self._prefix
- if len(category) > 0:
- s += category + ": "
- s += message + " ]"
-
- s = s.replace("\n", "\n ")
-
- self._outputMutex.acquire()
- sys.stderr.write(s + "\n")
- self._outputMutex.release()
-
- def warning(self, message):
- self._outputMutex.acquire()
- sys.stderr.write(str(datetime.datetime.now()) + " " + self._prefix + "warning: " + message + "\n")
- self._outputMutex.release()
-
- def error(self, message):
- self._outputMutex.acquire()
- sys.stderr.write(str(datetime.datetime.now()) + " " + self._prefix + "error: " + message + "\n")
- self._outputMutex.release()
-
-#
-# Application class.
-#
-import signal, traceback
-class Application(object):
- '''Convenience class that initializes a communicator and reacts
-gracefully to signals. An application must define a subclass
-of this class and supply an implementation of the run method.
-'''
-
- def __init__(self, signalPolicy=0): # HandleSignals=0
- '''The constructor accepts an optional argument indicating
-whether to handle signals. The value should be either
-Application.HandleSignals (the default) or
-Application.NoSignalHandling.
-'''
- if type(self) == Application:
- raise RuntimeError("Ice.Application is an abstract class")
- Application._signalPolicy = signalPolicy
-
- def main(self, args, configFile=None, initData=None):
- '''The main entry point for the Application class. The arguments
-are an argument list (such as sys.argv), the name of an Ice
-configuration file (optional), and an instance of
-InitializationData (optional). This method does not return
-until after the completion of the run method. The return
-value is an integer representing the exit status.
-'''
-
- if Application._communicator:
- getProcessLogger().error(args[0] + ": only one instance of the Application class can be used")
- return 1
-
- #
- # We parse the properties here to extract Ice.ProgramName.
- #
- if not initData:
- initData = InitializationData()
- if configFile:
- try:
- initData.properties = createProperties(None, initData.properties)
- initData.properties.load(configFile)
- except:
- getProcessLogger().error(traceback.format_exc())
- return 1
- initData.properties = createProperties(args, initData.properties)
-
- #
- # If the process logger is the default logger, we replace it with a
- # a logger which is using the program name for the prefix.
- #
- if isinstance(getProcessLogger(), LoggerI):
- setProcessLogger(_ApplicationLoggerI(initData.properties.getProperty("Ice.ProgramName")))
-
- #
- # Install our handler for the signals we are interested in. We assume main()
- # is called from the main thread.
- #
- Application._ctrlCHandler = CtrlCHandler()
-
- try:
- Application._interrupted = False
- Application._appName = initData.properties.getPropertyWithDefault("Ice.ProgramName", args[0])
- Application._application = self
-
- #
- # Used by _destroyOnInterruptCallback and _shutdownOnInterruptCallback.
- #
- Application._nohup = initData.properties.getPropertyAsInt("Ice.Nohup") > 0
-
- #
- # The default is to destroy when a signal is received.
- #
- if Application._signalPolicy == Application.HandleSignals:
- Application.destroyOnInterrupt()
-
- status = self.doMain(args, initData)
- except:
- getProcessLogger().error(traceback.format_exc())
- status = 1
- #
- # Set _ctrlCHandler to 0 only once communicator.destroy() has
- # completed.
- #
- Application._ctrlCHandler.destroy()
- Application._ctrlCHandler = None
-
- return status
-
- def doMain(self, args, initData):
- try:
- Application._communicator = initialize(args, initData)
- Application._destroyed = False
- status = self.run(args)
-
- except:
- getProcessLogger().error(traceback.format_exc())
- status = 1
-
- #
- # Don't want any new interrupt and at this point (post-run),
- # it would not make sense to release a held signal to run
- # shutdown or destroy.
- #
- if Application._signalPolicy == Application.HandleSignals:
- Application.ignoreInterrupt()
-
- Application._condVar.acquire()
- while Application._callbackInProgress:
- Application._condVar.wait()
- if Application._destroyed:
- Application._communicator = None
- else:
- Application._destroyed = True
- #
- # And _communicator != 0, meaning will be destroyed
- # next, _destroyed = true also ensures that any
- # remaining callback won't do anything
- #
- Application._application = None
- Application._condVar.release()
-
- if Application._communicator:
- try:
- Application._communicator.destroy()
- except:
- getProcessLogger().error(traceback.format_exc())
- status = 1
- Application._communicator = None
- return status
-
- def run(self, args):
- '''This method must be overridden in a subclass. The base
-class supplies an argument list from which all Ice arguments
-have already been removed. The method returns an integer
-exit status (0 is success, non-zero is failure).
-'''
- raise RuntimeError('run() not implemented')
-
- def interruptCallback(self, sig):
- '''Subclass hook to intercept an interrupt.'''
- pass
-
- def appName(self):
- '''Returns the application name (the first element of
-the argument list).'''
- return self._appName
- appName = classmethod(appName)
-
- def communicator(self):
- '''Returns the communicator that was initialized for
-the application.'''
- return self._communicator
- communicator = classmethod(communicator)
-
- def destroyOnInterrupt(self):
- '''Configures the application to destroy its communicator
-when interrupted by a signal.'''
- if Application._signalPolicy == Application.HandleSignals:
- self._condVar.acquire()
- if self._ctrlCHandler.getCallback() == self._holdInterruptCallback:
- self._released = True
- self._condVar.notify()
- self._ctrlCHandler.setCallback(self._destroyOnInterruptCallback)
- self._condVar.release()
- else:
- getProcessLogger().error(Application._appName + \
- ": warning: interrupt method called on Application configured to not handle interrupts.")
- destroyOnInterrupt = classmethod(destroyOnInterrupt)
-
- def shutdownOnInterrupt(self):
- '''Configures the application to shutdown its communicator
-when interrupted by a signal.'''
- if Application._signalPolicy == Application.HandleSignals:
- self._condVar.acquire()
- if self._ctrlCHandler.getCallback() == self._holdInterruptCallback:
- self._released = True
- self._condVar.notify()
- self._ctrlCHandler.setCallback(self._shutdownOnInterruptCallback)
- self._condVar.release()
- else:
- getProcessLogger().error(Application._appName + \
- ": warning: interrupt method called on Application configured to not handle interrupts.")
- shutdownOnInterrupt = classmethod(shutdownOnInterrupt)
-
- def ignoreInterrupt(self):
- '''Configures the application to ignore signals.'''
- if Application._signalPolicy == Application.HandleSignals:
- self._condVar.acquire()
- if self._ctrlCHandler.getCallback() == self._holdInterruptCallback:
- self._released = True
- self._condVar.notify()
- self._ctrlCHandler.setCallback(None)
- self._condVar.release()
- else:
- getProcessLogger().error(Application._appName + \
- ": warning: interrupt method called on Application configured to not handle interrupts.")
- ignoreInterrupt = classmethod(ignoreInterrupt)
-
- def callbackOnInterrupt(self):
- '''Configures the application to invoke interruptCallback
-when interrupted by a signal.'''
- if Application._signalPolicy == Application.HandleSignals:
- self._condVar.acquire()
- if self._ctrlCHandler.getCallback() == self._holdInterruptCallback:
- self._released = True
- self._condVar.notify()
- self._ctrlCHandler.setCallback(self._callbackOnInterruptCallback)
- self._condVar.release()
- else:
- getProcessLogger().error(Application._appName + \
- ": warning: interrupt method called on Application configured to not handle interrupts.")
- callbackOnInterrupt = classmethod(callbackOnInterrupt)
-
- def holdInterrupt(self):
- '''Configures the application to queue an interrupt for
-later processing.'''
- if Application._signalPolicy == Application.HandleSignals:
- self._condVar.acquire()
- if self._ctrlCHandler.getCallback() != self._holdInterruptCallback:
- self._previousCallback = self._ctrlCHandler.getCallback()
- self._released = False
- self._ctrlCHandler.setCallback(self._holdInterruptCallback)
- # else, we were already holding signals
- self._condVar.release()
- else:
- getProcessLogger().error(Application._appName + \
- ": warning: interrupt method called on Application configured to not handle interrupts.")
- holdInterrupt = classmethod(holdInterrupt)
-
- def releaseInterrupt(self):
- '''Instructs the application to process any queued interrupt.'''
- if Application._signalPolicy == Application.HandleSignals:
- self._condVar.acquire()
- if self._ctrlCHandler.getCallback() == self._holdInterruptCallback:
- #
- # Note that it's very possible no signal is held;
- # in this case the callback is just replaced and
- # setting _released to true and signalling _condVar
- # do no harm.
- #
- self._released = True
- self._ctrlCHandler.setCallback(self._previousCallback)
- self._condVar.notify()
- # Else nothing to release.
- self._condVar.release()
- else:
- getProcessLogger().error(Application._appName + \
- ": warning: interrupt method called on Application configured to not handle interrupts.")
- releaseInterrupt = classmethod(releaseInterrupt)
-
- def interrupted(self):
- '''Returns True if the application was interrupted by a
-signal, or False otherwise.'''
- self._condVar.acquire()
- result = self._interrupted
- self._condVar.release()
- return result
- interrupted = classmethod(interrupted)
-
- def _holdInterruptCallback(self, sig):
- self._condVar.acquire()
- while not self._released:
- self._condVar.wait()
- if self._destroyed:
- #
- # Being destroyed by main thread
- #
- self._condVar.release()
- return
- callback = self._ctrlCHandler.getCallback()
- self._condVar.release()
- if callback:
- callback(sig)
- _holdInterruptCallback = classmethod(_holdInterruptCallback)
-
- def _destroyOnInterruptCallback(self, sig):
- self._condVar.acquire()
- if self._destroyed or self._nohup and sig == signal.SIGHUP:
- #
- # Being destroyed by main thread, or nohup.
- #
- self._condVar.release()
- return
-
- self._callbackInProcess = True
- self._interrupted = True
- self._destroyed = True
- self._condVar.release()
-
- try:
- self._communicator.destroy()
- except:
- getProcessLogger().error(self._appName + " (while destroying in response to signal " + str(sig) + "):" + \
- traceback.format_exc())
-
- self._condVar.acquire()
- self._callbackInProcess = False
- self._condVar.notify()
- self._condVar.release()
- _destroyOnInterruptCallback = classmethod(_destroyOnInterruptCallback)
-
- def _shutdownOnInterruptCallback(self, sig):
- self._condVar.acquire()
- if self._destroyed or self._nohup and sig == signal.SIGHUP:
- #
- # Being destroyed by main thread, or nohup.
- #
- self._condVar.release()
- return
-
- self._callbackInProcess = True
- self._interrupted = True
- self._condVar.release()
-
- try:
- self._communicator.shutdown()
- except:
- getProcessLogger().error(self._appName + " (while shutting down in response to signal " + str(sig) + \
- "):" + traceback.format_exc())
-
- self._condVar.acquire()
- self._callbackInProcess = False
- self._condVar.notify()
- self._condVar.release()
- _shutdownOnInterruptCallback = classmethod(_shutdownOnInterruptCallback)
-
- def _callbackOnInterruptCallback(self, sig):
- self._condVar.acquire()
- if self._destroyed:
- #
- # Being destroyed by main thread.
- #
- self._condVar.release()
- return
- # For SIGHUP the user callback is always called. It can decide
- # what to do.
-
- self._callbackInProcess = True
- self._interrupted = True
- self._condVar.release()
-
- try:
- self._application.interruptCallback(sig)
- except:
- getProcessLogger().error(self._appName + " (while interrupting in response to signal " + str(sig) + \
- "):" + traceback.format_exc())
-
- self._condVar.acquire()
- self._callbackInProcess = False
- self._condVar.notify()
- self._condVar.release()
-
- _callbackOnInterruptCallback = classmethod(_callbackOnInterruptCallback)
-
- HandleSignals = 0
- NoSignalHandling = 1
-
- _appName = None
- _communicator = None
- _application = None
- _ctrlCHandler = None
- _previousCallback = None
- _interrupted = False
- _released = False
- _destroyed = False
- _callbackInProgress = False
- _condVar = threading.Condition()
- _signalPolicy = HandleSignals
-
-#
-# Define Ice::Object and Ice::ObjectPrx.
-#
-IcePy._t_Object = IcePy.defineClass('::Ice::Object', Object, -1, (), False, False, None, (), ())
-IcePy._t_ObjectPrx = IcePy.defineProxy('::Ice::Object', ObjectPrx)
-Object._ice_type = IcePy._t_Object
-
-Object._op_ice_isA = IcePy.Operation('ice_isA', OperationMode.Idempotent, OperationMode.Nonmutating, False, None, (), (((), IcePy._t_string, False, 0),), (), ((), IcePy._t_bool, False, 0), ())
-Object._op_ice_ping = IcePy.Operation('ice_ping', OperationMode.Idempotent, OperationMode.Nonmutating, False, None, (), (), (), None, ())
-Object._op_ice_ids = IcePy.Operation('ice_ids', OperationMode.Idempotent, OperationMode.Nonmutating, False, None, (), (), (), ((), _t_StringSeq, False, 0), ())
-Object._op_ice_id = IcePy.Operation('ice_id', OperationMode.Idempotent, OperationMode.Nonmutating, False, None, (), (), (), ((), IcePy._t_string, False, 0), ())
-
-IcePy._t_LocalObject = IcePy.defineClass('::Ice::LocalObject', object, -1, (), False, False, None, (), ())
-
-IcePy._t_UnknownSlicedObject = IcePy.defineClass('::Ice::UnknownSlicedObject', UnknownSlicedObject, -1, (), False, True, None, (), ())
-UnknownSlicedObject._ice_type = IcePy._t_UnknownSlicedObject
-
-#
-# Annotate some exceptions.
-#
-def SyscallException__str__(self):
- return "Ice.SyscallException:\n" + os.strerror(self.error)
-SyscallException.__str__ = SyscallException__str__
-del SyscallException__str__
-
-def SocketException__str__(self):
- return "Ice.SocketException:\n" + os.strerror(self.error)
-SocketException.__str__ = SocketException__str__
-del SocketException__str__
-
-def ConnectFailedException__str__(self):
- return "Ice.ConnectFailedException:\n" + os.strerror(self.error)
-ConnectFailedException.__str__ = ConnectFailedException__str__
-del ConnectFailedException__str__
-
-def ConnectionRefusedException__str__(self):
- return "Ice.ConnectionRefusedException:\n" + os.strerror(self.error)
-ConnectionRefusedException.__str__ = ConnectionRefusedException__str__
-del ConnectionRefusedException__str__
-
-def ConnectionLostException__str__(self):
- if self.error == 0:
- return "Ice.ConnectionLostException:\nrecv() returned zero"
- else:
- return "Ice.ConnectionLostException:\n" + os.strerror(self.error)
-ConnectionLostException.__str__ = ConnectionLostException__str__
-del ConnectionLostException__str__
-
-#
-# Proxy comparison functions.
-#
-def proxyIdentityEqual(lhs, rhs):
- '''Determines whether the identities of two proxies are equal.'''
- return proxyIdentityCompare(lhs, rhs) == 0
-
-def proxyIdentityCompare(lhs, rhs):
- '''Compares the identities of two proxies.'''
- if (lhs and not isinstance(lhs, ObjectPrx)) or (rhs and not isinstance(rhs, ObjectPrx)):
- raise ValueError('argument is not a proxy')
- if not lhs and not rhs:
- return 0
- elif not lhs and rhs:
- return -1
- elif lhs and not rhs:
- return 1
- else:
- lid = lhs.ice_getIdentity()
- rid = rhs.ice_getIdentity()
- return (lid > rid) - (lid < rid)
-
-def proxyIdentityAndFacetEqual(lhs, rhs):
- '''Determines whether the identities and facets of two
-proxies are equal.'''
- return proxyIdentityAndFacetCompare(lhs, rhs) == 0
-
-def proxyIdentityAndFacetCompare(lhs, rhs):
- '''Compares the identities and facets of two proxies.'''
- if (lhs and not isinstance(lhs, ObjectPrx)) or (rhs and not isinstance(rhs, ObjectPrx)):
- raise ValueError('argument is not a proxy')
- if not lhs and not rhs:
- return 0
- elif not lhs and rhs:
- return -1
- elif lhs and not rhs:
- return 1
- elif lhs.ice_getIdentity() != rhs.ice_getIdentity():
- lid = lhs.ice_getIdentity()
- rid = rhs.ice_getIdentity()
- return (lid > rid) - (lid < rid)
- else:
- lf = lhs.ice_getFacet()
- rf = rhs.ice_getFacet()
- return (lf > rf) - (lf < rf)
-
-#
-# Used by generated code. Defining these in the Ice module means the generated code
-# can avoid the need to qualify the type() and hash() functions with their module
-# names. Since the functions are in the __builtin__ module (for Python 2.x) and the
-# builtins module (for Python 3.x), it's easier to define them here.
-#
-def getType(o):
- return type(o)
-
-#
-# Used by generated code. Defining this in the Ice module means the generated code
-# can avoid the need to qualify the hash() function with its module name. Since
-# the function is in the __builtin__ module (for Python 2.x) and the builtins
-# module (for Python 3.x), it's easier to define it here.
-#
-def getHash(o):
- return hash(o)
-
-Protocol_1_0 = ProtocolVersion(1, 0)
-Encoding_1_0 = EncodingVersion(1, 0)
-Encoding_1_1 = EncodingVersion(1, 1)