diff options
Diffstat (limited to 'swift/src')
-rw-r--r-- | swift/src/Ice/AdminFacetFactory.swift | 37 | ||||
-rw-r--r-- | swift/src/Ice/Blobject.swift | 4 | ||||
-rw-r--r-- | swift/src/Ice/BlobjectAsync.swift | 4 | ||||
-rw-r--r-- | swift/src/Ice/CommunicatorI.swift | 14 | ||||
-rw-r--r-- | swift/src/Ice/Incoming.swift | 4 | ||||
-rw-r--r-- | swift/src/Ice/Object.swift | 65 | ||||
-rw-r--r-- | swift/src/Ice/ObjectAdapterI.swift | 24 | ||||
-rw-r--r-- | swift/src/Ice/ServantManager.swift | 16 |
8 files changed, 101 insertions, 67 deletions
diff --git a/swift/src/Ice/AdminFacetFactory.swift b/swift/src/Ice/AdminFacetFactory.swift index 9aadd8baa02..e19bc52ef8b 100644 --- a/swift/src/Ice/AdminFacetFactory.swift +++ b/swift/src/Ice/AdminFacetFactory.swift @@ -6,11 +6,11 @@ import IceObjc class AdminFacetFacade: ICEBlobjectFacade { private let communicator: Communicator - let servant: Object + var disp: Disp - init(communicator: Communicator, servant: Object) { + init(communicator: Communicator, disp: Disp) { self.communicator = communicator - self.servant = servant + self.disp = disp } func facadeInvoke(_ adapter: ICEObjectAdapter, inEncaps: Data, con: ICEConnection?, @@ -54,7 +54,7 @@ class AdminFacetFacade: ICEBlobjectFacade { func dispatch(incoming: Incoming, current: Current) { // Dispatch directly to the servant. Do not call invoke on Incoming do { - try servant._iceDispatch(incoming: incoming, current: current) + try disp.dispatch(incoming: incoming, current: current) } catch { incoming.exception(error) } @@ -63,32 +63,47 @@ class AdminFacetFacade: ICEBlobjectFacade { func facadeRemoved() {} } -class UnsupportedAdminFacet: LocalObject<ICEUnsupportedAdminFacet>, Object {} +final class UnsupportedAdminFacet: LocalObject<ICEUnsupportedAdminFacet>, Object { + func ice_id(current: Current) -> String { + return "::Ice::Object" + } + + func ice_ids(current: Current) -> [String] { + return ["::Ice::Object"] + } + + func ice_isA(s: String, current: Current) -> Bool { + return s == "::Ice::Object" + } + + func ice_ping(current: Current) { + } +} class AdminFacetFactory: ICEAdminFacetFactory { static func createProcess(_ communicator: ICECommunicator, handle: ICEProcess) -> ICEBlobjectFacade { let c = communicator.getCachedSwiftObject(CommunicatorI.self) return AdminFacetFacade(communicator: c, - servant: handle.getSwiftObject(ProcessI.self) { + disp: ProcessDisp(handle.getSwiftObject(ProcessI.self) { ProcessI(handle: handle) - }) + })) } static func createProperties(_ communicator: ICECommunicator, handle: ICEPropertiesAdmin) -> ICEBlobjectFacade { let c = communicator.getCachedSwiftObject(CommunicatorI.self) return AdminFacetFacade(communicator: c, - servant: handle.getSwiftObject(PropertiesAdminI.self) { + disp: PropertiesAdminDisp(handle.getSwiftObject(PropertiesAdminI.self) { PropertiesAdminI(communicator: c, handle: handle) - }) + })) } static func createUnsupported(_ communicator: ICECommunicator, handle: ICEUnsupportedAdminFacet) -> ICEBlobjectFacade { let c = communicator.getCachedSwiftObject(CommunicatorI.self) return AdminFacetFacade(communicator: c, - servant: handle.getSwiftObject(UnsupportedAdminFacet.self) { + disp: ObjectDisp(handle.getSwiftObject(UnsupportedAdminFacet.self) { UnsupportedAdminFacet(handle: handle) - }) + })) } } diff --git a/swift/src/Ice/Blobject.swift b/swift/src/Ice/Blobject.swift index 3f80c392a60..23a3cf8ab0c 100644 --- a/swift/src/Ice/Blobject.swift +++ b/swift/src/Ice/Blobject.swift @@ -5,7 +5,7 @@ import Foundation /// Base protocol for dynamic dispatch servants. -public protocol Blobject: Object { +public protocol Blobject: Disp { /// Dispatch an incoming request. /// /// - parameter inEncaps: `Data` - The encoded in-parameters for the operation. @@ -25,7 +25,7 @@ public protocol Blobject: Object { } public extension Blobject { - func _iceDispatch(incoming inS: Incoming, current: Current) throws { + func dispatch(incoming inS: Incoming, current: Current) throws { let inEncaps = try inS.readParamEncaps() let invokeResult = try ice_invoke(inEncaps: inEncaps, current: current) inS.writeParamEncaps(ok: invokeResult.ok, outParams: invokeResult.outParams) diff --git a/swift/src/Ice/BlobjectAsync.swift b/swift/src/Ice/BlobjectAsync.swift index ec9961d4523..037c48d55cd 100644 --- a/swift/src/Ice/BlobjectAsync.swift +++ b/swift/src/Ice/BlobjectAsync.swift @@ -6,7 +6,7 @@ import Foundation import PromiseKit /// Base protocol for dynamic asynchronous dispatch servants. -public protocol BlobjectAsync: Object { +public protocol BlobjectAsync: Disp { /// Dispatch an incoming request. /// /// - parameter inEncaps: `Data` - The encoded in-parameters for the operation. @@ -26,7 +26,7 @@ public protocol BlobjectAsync: Object { } public extension BlobjectAsync { - func _iceDispatch(incoming inS: Incoming, current: Current) throws { + func dispatch(incoming inS: Incoming, current: Current) throws { let inEncaps = try inS.readParamEncaps() firstly { ice_invokeAsync(inEncaps: inEncaps, current: current) diff --git a/swift/src/Ice/CommunicatorI.swift b/swift/src/Ice/CommunicatorI.swift index 8885b2ac497..4bcda8feacf 100644 --- a/swift/src/Ice/CommunicatorI.swift +++ b/swift/src/Ice/CommunicatorI.swift @@ -189,29 +189,29 @@ class CommunicatorI: LocalObject<ICECommunicator>, Communicator { } } - func addAdminFacet(servant: Object, facet: String) throws { + func addAdminFacet(servant disp: Disp, facet: String) throws { try autoreleasepool { - try handle.addAdminFacet(AdminFacetFacade(communicator: self, servant: servant), facet: facet) + try handle.addAdminFacet(AdminFacetFacade(communicator: self, disp: disp), facet: facet) } } - func removeAdminFacet(_ facet: String) throws -> Object { + func removeAdminFacet(_ facet: String) throws -> Disp { return try autoreleasepool { guard let facade = try handle.removeAdminFacet(facet) as? AdminFacetFacade else { preconditionFailure() } - return facade.servant + return facade.disp } } - func findAdminFacet(_ facet: String) -> Object? { + func findAdminFacet(_ facet: String) -> Disp? { do { return try autoreleasepool { guard let facade = try handle.findAdminFacet(facet) as? AdminFacetFacade else { return nil } - return facade.servant + return facade.disp } } catch is CommunicatorDestroyedException { // Ignored @@ -225,7 +225,7 @@ class CommunicatorI: LocalObject<ICECommunicator>, Communicator { do { return try autoreleasepool { try handle.findAllAdminFacets().mapValues { facade in - (facade as! AdminFacetFacade).servant + (facade as! AdminFacetFacade).disp } } } catch is CommunicatorDestroyedException { diff --git a/swift/src/Ice/Incoming.swift b/swift/src/Ice/Incoming.swift index 81f89909f8e..59a4de3a0ce 100644 --- a/swift/src/Ice/Incoming.swift +++ b/swift/src/Ice/Incoming.swift @@ -13,7 +13,7 @@ public final class Incoming { private let responseCallback: ICEBlobjectResponse private let exceptionCallback: ICEBlobjectException - private var servant: Object? + private var servant: Disp? private var locator: ServantLocator? private var cookie: AnyObject? @@ -145,7 +145,7 @@ public final class Incoming { // Dispatch in the incoming call // do { - try s._iceDispatch(incoming: self, current: current) + try s.dispatch(incoming: self, current: current) } catch { exception(error) } diff --git a/swift/src/Ice/Object.swift b/swift/src/Ice/Object.swift index 3ac8f6c2ff5..8fde3038073 100644 --- a/swift/src/Ice/Object.swift +++ b/swift/src/Ice/Object.swift @@ -4,6 +4,15 @@ import IceObjc +public protocol Disp { + func dispatch(incoming: Incoming, current: Current) throws +} + +public protocol InterfaceTraits { + static var staticIds: [String] { get } + static var staticId: String { get } +} + public protocol Object { /// Returns the Slice type ID of the most-derived interface supported by this object. /// @@ -34,27 +43,9 @@ public protocol Object { /// /// - parameter current: The Current object for the invocation. func ice_ping(current: Current) throws - - func _iceDispatch(incoming: Incoming, current: Current) throws } public extension Object { - func ice_id(current _: Current) -> String { - return "::Ice::Object" - } - - func ice_ids(current _: Current) -> [String] { - return ["::Ice::Object"] - } - - func ice_isA(s: String, current _: Current) -> Bool { - return s == "::Ice::Object" - } - - func ice_ping(current _: Current) { - // Do nothing - } - func _iceD_ice_id(incoming inS: Incoming, current: Current) throws { try inS.readEmptyParams() @@ -92,17 +83,45 @@ public extension Object { try ice_ping(current: current) inS.writeEmptyParams() } +} + +public class DefaultObjectImpl<T: InterfaceTraits>: Object { + public init() {} + + public func ice_id(current _: Current) -> String { + return T.staticId + } + + public func ice_ids(current _: Current) -> [String] { + return T.staticIds + } + + public func ice_isA(s: String, current _: Current) -> Bool { + return T.staticIds.contains(s) + } + + public func ice_ping(current _: Current) { + // Do nothing + } +} + +struct ObjectDisp: Disp { + let servant: Object + + init(_ servant: Object) { + self.servant = servant + } - func _iceDispatch(incoming: Incoming, current: Current) throws { + func dispatch(incoming: Incoming, current: Current) throws { switch current.operation { case "ice_id": - try _iceD_ice_id(incoming: incoming, current: current) + try servant._iceD_ice_id(incoming: incoming, current: current) case "ice_ids": - try _iceD_ice_ids(incoming: incoming, current: current) + try servant._iceD_ice_ids(incoming: incoming, current: current) case "ice_isA": - try _iceD_ice_isA(incoming: incoming, current: current) + try servant._iceD_ice_isA(incoming: incoming, current: current) case "ice_ping": - try _iceD_ice_ping(incoming: incoming, current: current) + try servant._iceD_ice_ping(incoming: incoming, current: current) default: throw OperationNotExistException(id: current.id, facet: current.facet, operation: current.operation) } diff --git a/swift/src/Ice/ObjectAdapterI.swift b/swift/src/Ice/ObjectAdapterI.swift index 779a6d62145..350b5309274 100644 --- a/swift/src/Ice/ObjectAdapterI.swift +++ b/swift/src/Ice/ObjectAdapterI.swift @@ -62,33 +62,33 @@ class ObjectAdapterI: LocalObject<ICEObjectAdapter>, ObjectAdapter, ICEBlobjectF return handle.destroy() } - func add(servant: Object, id: Identity) throws -> ObjectPrx { + func add(servant: Disp, id: Identity) throws -> ObjectPrx { return try addFacet(servant: servant, id: id, facet: "") } - func addFacet(servant: Object, id: Identity, facet: String) throws -> ObjectPrx { + func addFacet(servant: Disp, id: Identity, facet: String) throws -> ObjectPrx { precondition(!id.name.isEmpty, "Identity cannot have an empty name") try servantManager.addServant(servant: servant, id: id, facet: facet) return try createProxy(id).ice_facet(facet) } - func addWithUUID(_ servant: Object) throws -> ObjectPrx { + func addWithUUID(_ servant: Disp) throws -> ObjectPrx { return try addFacetWithUUID(servant: servant, facet: "") } - func addFacetWithUUID(servant: Object, facet: String) throws -> ObjectPrx { + func addFacetWithUUID(servant: Disp, facet: String) throws -> ObjectPrx { return try addFacet(servant: servant, id: Identity(name: UUID().uuidString, category: ""), facet: facet) } - func addDefaultServant(servant: Object, category: String) throws { + func addDefaultServant(servant: Disp, category: String) throws { try servantManager.addDefaultServant(servant: servant, category: category) } - func remove(_ id: Identity) throws -> Object { + func remove(_ id: Identity) throws -> Disp { return try removeFacet(id: id, facet: "") } - func removeFacet(id: Identity, facet: String) throws -> Object { + func removeFacet(id: Identity, facet: String) throws -> Disp { precondition(!id.name.isEmpty, "Identity cannot have an empty name") return try servantManager.removeServant(id: id, facet: facet) } @@ -98,15 +98,15 @@ class ObjectAdapterI: LocalObject<ICEObjectAdapter>, ObjectAdapter, ICEBlobjectF return try servantManager.removeAllFacets(id: id) } - func removeDefaultServant(_ category: String) throws -> Object { + func removeDefaultServant(_ category: String) throws -> Disp { return try servantManager.removeDefaultServant(category: category) } - func find(_ id: Identity) -> Object? { + func find(_ id: Identity) -> Disp? { return findFacet(id: id, facet: "") } - func findFacet(id: Identity, facet: String) -> Object? { + func findFacet(id: Identity, facet: String) -> Disp? { return servantManager.findServant(id: id, facet: facet) } @@ -114,7 +114,7 @@ class ObjectAdapterI: LocalObject<ICEObjectAdapter>, ObjectAdapter, ICEBlobjectF return servantManager.findAllFacets(id: id) } - func findByProxy(_ proxy: ObjectPrx) -> Object? { + func findByProxy(_ proxy: ObjectPrx) -> Disp? { return findFacet(id: proxy.ice_getIdentity(), facet: proxy.ice_getFacet()) } @@ -130,7 +130,7 @@ class ObjectAdapterI: LocalObject<ICEObjectAdapter>, ObjectAdapter, ICEBlobjectF return servantManager.findServantLocator(category: category) } - func findDefaultServant(_ category: String) -> Object? { + func findDefaultServant(_ category: String) -> Disp? { return servantManager.findDefaultServant(category: category) } diff --git a/swift/src/Ice/ServantManager.swift b/swift/src/Ice/ServantManager.swift index e66eae1d63d..96c5327efc5 100644 --- a/swift/src/Ice/ServantManager.swift +++ b/swift/src/Ice/ServantManager.swift @@ -6,8 +6,8 @@ class ServantManager { private let adapterName: String private let communicator: Communicator - private var servantMapMap = [Identity: [String: Object]]() - private var defaultServantMap = [String: Object]() + private var servantMapMap = [Identity: [String: Disp]]() + private var defaultServantMap = [String: Disp]() private var locatorMap = [String: ServantLocator]() // This is used to distingish between ObjectNotExistException and FacetNotExistException @@ -21,7 +21,7 @@ class ServantManager { self.communicator = communicator } - func addServant(servant: Object, id ident: Identity, facet: String) throws { + func addServant(servant: Disp, id ident: Identity, facet: String) throws { try mutex.sync { if var m = servantMapMap[ident] { if m[facet] != nil { @@ -39,7 +39,7 @@ class ServantManager { } } - func addDefaultServant(servant: Object, category: String) throws { + func addDefaultServant(servant: Disp, category: String) throws { try mutex.sync { guard defaultServantMap[category] == nil else { throw AlreadyRegisteredException(kindOfObject: "default servant", id: category) @@ -49,7 +49,7 @@ class ServantManager { } } - func removeServant(id ident: Identity, facet: String) throws -> Object { + func removeServant(id ident: Identity, facet: String) throws -> Disp { return try mutex.sync { guard var m = servantMapMap[ident], let obj = m.removeValue(forKey: facet) else { var id = communicator.identityToString(ident) @@ -68,7 +68,7 @@ class ServantManager { } } - func removeDefaultServant(category: String) throws -> Object { + func removeDefaultServant(category: String) throws -> Disp { return try mutex.sync { guard let obj = defaultServantMap.removeValue(forKey: category) else { throw NotRegisteredException(kindOfObject: "default servant", id: category) @@ -88,7 +88,7 @@ class ServantManager { } } - func findServant(id: Identity, facet: String) -> Object? { + func findServant(id: Identity, facet: String) -> Disp? { return mutex.sync { guard let m = servantMapMap[id] else { guard let obj = defaultServantMap[id.category] else { @@ -102,7 +102,7 @@ class ServantManager { } } - func findDefaultServant(category: String) -> Object? { + func findDefaultServant(category: String) -> Disp? { return mutex.sync { defaultServantMap[category] } |