Eiffel Media API
Overview Cluster Class Classes Index      Previous Next      Top Features

em.network.multiplayer.net_system_objects

Class EM_NET_2PC_EVENT_OBJECT


Direct ancestors

EM_NET_EVENT_OBJECT

Known direct descendants

EM_NET_JOIN_REQUEST, EM_NET_LEAVE_EVENT, EM_NET_CREATE_OBJECT_RESPONSE, EM_NET_DESTROY_OBJECT_RESPONSE, EM_NET_CREATE_OBJECT_REQUEST, EM_NET_DESTROY_OBJECT_REQUEST, EM_NET_JOIN_RESPONSE

Features

Invariants

indexing

description

Event object that is secured with a two phase commit system.

You may set a success_agent that is called if all remote peers
have sent an acknowledgment. In this case you can assume that all
remote peers that belong to the sending group have taken the appropriate
actions.

You may also set a timeout_agent that is called if at least one
acknowledgement for a remote peer is missing after some period of time.
You'll get a list of clients that have acknowledements missing as argument.
In this case you can not be sure if only the acknowledgement has been
lost, or the remote peer failed to handle the action at all. You'll need
to take an appropriate action, like dropping the non answering client to
make the system consistent again.

If an acknowledgement is missing for a connection after resend_time, the
event will be sent again for at most resends_left times.
If only the acknowledgement was lost in the previous attempt,
then only the acknowledgement will be sent again, but the event will
NOT be fired again on the client side.

The 2PC system relies on the object ID. If you define your own 2PC events
you need to set a unique ID for every instance of an event (use a dedicated
EM_NET_OJBECT_ID_MANAGER, like the one supplied in EM_NET_BASE, for that purpose)
and serialize/unserialize it manually.

date

$Date: 2005/10/26 14:05:23 $

revision

$Revision: 1.6 $

deferred class

EM_NET_2PC_EVENT_OBJECT

inherit

EM_NET_EVENT_OBJECT

feature -- Initialization

init_serialization_byte_count: INTEGER

-- Count of bytes needed for a successful serialization of initialization data.
-- The default behaviour uses the serialize_byte_count feature.
-- If you redefine serialize_init_data, you'll also to redefine this feature.
-- This might be a constant and *could* be a dynamic value.
-- {EM_NET_WORK_CONSTANTS}.max_serialization_byte_count is the limit!

-- (From EM_NET_OBJECT)

make_set_type (a_type_id: INTEGER)

-- Create an instance and set type_id to a_type_id.

-- (From EM_NET_OBJECT)

serialize_init_data (a_serializer: EM_NET_SERIALIZER)

-- Serialize initialization data to the given stream using a_serializer.
-- The default behaviour uses the serialize feature.
-- If you redefine make_from_stream, you'll also have to redefine this feature.
-- Note: There is no need to serialize the type ID, this is done automatically.

-- (From EM_NET_OBJECT)

feature -- Access

resend_time: INTEGER

-- Time in ms after the event is resent if no ACK was received.

resends_left: INTEGER

-- Number of event resends left
-- An event will be resent if no ACK was received after resend_time until
-- resends_left reaches 0.
-- This value will decrease automatically.

success_agent: PROCEDURE[ANY,TUPLE[]]

-- Agent that is called after a successful two phase commit

timeout_agent: PROCEDURE[ANY,TUPLE[DS_LINKED_LIST[EM_NET_CONNECTION]]]

-- Agent that is called after a timeout occurred in a two phase commit

feature {EM_NET_OBJECT_ID_MANAGER, EM_NET_OBJECT_TYPES, EM_NET_CREATE_OBJECT_RESPONSE} -- Element change

set_id (an_id: INTEGER)

-- Set id to an_id.

-- (From EM_NET_OBJECT)

ensure
id_correct_set: an_id = id
set_resend_time (a_time: INTEGER)

-- Set resend_time to a_time.
-- a_time is in milliseconds.

require
a_time_not_negative: a_time >= 0
set_resends_left (a_number: INTEGER)

-- Set resends_left to a_number.

require
a_number_not_negative: a_number >= 0
set_success_agent (a_success_agent: PROCEDURE[ANY,TUPLE[]])

-- Set success_agent to a_success_agent.
-- a_success_agent is called if 2PC was successful.

set_time_offset (a_time: INTEGER)

-- Set last_update to a_time.

-- (From EM_NET_OBJECT)

ensure
last_update_set: time_offset = a_time
set_timeout_agent (a_timeout_agent: PROCEDURE[ANY,TUPLE[DS_LINKED_LIST[EM_NET_CONNECTION]]])

-- Set timeout_agent to a_timeout_agent.
-- a_timeout_agent is called if 2PC was not successful after
-- some period of time.
-- The handler will get a DS_LINKED_LIST[EM_NET_CONNECTION] as argument that
-- contains a list of connections that did not respond in time.

set_updating_connection (a_connection: EM_NET_CONNECTION)

-- Set updating_connection to a_connection.

-- (From EM_NET_OBJECT)

require
a_connection_not_void: a_connection /= Void
ensure
updating_connection_set: updating_connection = a_connection

feature -- Serialization

serialization_byte_count: INTEGER

-- Count of bytes needed for a successful serialization
-- This might be a constant and *could* be a dynamic value.
-- {EM_NET_WORK_CONSTANTS}.max_serialization_byte_count is the limit!

-- (From EM_NET_OBJECT)

ensure
Result_in_max_serialization_byte_count_range: Result <= max_serialization_byte_count.item
serialize (a_serializer: EM_NET_SERIALIZER)

-- Serialize to the given stream using a_serializer.

-- (From EM_NET_OBJECT)

require
a_serializer_not_void: a_serializer /= Void
require else
a_serializer_not_void: a_serializer /= Void
id_set: id > 0
unserialize (an_unserializer: EM_NET_UNSERIALIZER)

-- Unserialize from a given stream using an_unserializer.

-- (From EM_NET_OBJECT)

require
a_unserializer_not_void: an_unserializer /= Void
ensure then
id_set: id > 0

feature -- Event handling

publish

-- Publish an event to the connections that belong to group.
-- Setup 2PC variables in EM_NET_BASE.

-- (From EM_NET_EVENT_OBJECT)

require
group_set: group /= Void

feature -- Group handling.

set_group (a_group: EM_NET_GROUP)

-- Set group to a_group.
-- This is the group to which this event will be published.

-- (From EM_NET_OBJECT)

require
not_already_added_to_a_group: not a_group.has_object (Current)
ensure
group_set: group = a_group

feature -- Information

group: EM_NET_GROUP

-- Group that contains the current object
-- The object will be synchronized with all clients that are in
-- the same group.

-- (From EM_NET_OBJECT)

id: INTEGER

-- Unique ID that indentifies a single instance of an object

-- (From EM_NET_OBJECT)

is_make_set_type_called: BOOLEAN

-- Has make_set_type been called?

-- (From EM_NET_OBJECT)

is_synchronized: BOOLEAN

-- Is this object currently synchronized over network?
-- True if this object is added to a server or client list for synchronisation.

-- (From EM_NET_OBJECT)

next_sync_frame: INTEGER

-- Next time when object synchronisation occurs

-- (From EM_NET_OBJECT)

time_offset: INTEGER

-- Time in miliseconds of the lastupdate

-- (From EM_NET_OBJECT)

type_id: INTEGER

-- ID that identifies the type of of an on object

-- (From EM_NET_OBJECT)

updating_connection: EM_NET_CONNECTION

-- Connection which sent the last update

-- (From EM_NET_OBJECT)

invariant


type_id_set_by_factory: type_id > 0 and is_make_set_type_called

-- From ANY
reflexive_equality: standard_is_equal (Current)
reflexive_conformance: conforms_to (Current)

end