summaryrefslogtreecommitdiff
path: root/swift/src
diff options
context:
space:
mode:
Diffstat (limited to 'swift/src')
-rw-r--r--swift/src/Ice/AdminFacetFactory.swift37
-rw-r--r--swift/src/Ice/Blobject.swift4
-rw-r--r--swift/src/Ice/BlobjectAsync.swift4
-rw-r--r--swift/src/Ice/CommunicatorI.swift14
-rw-r--r--swift/src/Ice/Incoming.swift4
-rw-r--r--swift/src/Ice/Object.swift65
-rw-r--r--swift/src/Ice/ObjectAdapterI.swift24
-rw-r--r--swift/src/Ice/ServantManager.swift16
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]
}