[Telepathy] message received method
George Kiagiadakis
gkiagia at tolabaki.gr
Sat Jul 23 08:09:27 UTC 2016
On 23.07.2016 07:16, Mateus Bellomo wrote:
> George,
>
> I could make it work but for that I have swaped the initiatorHandle and
> targetHandle on the onMessageReceived() method. You could see at [1]
> what I
> did. Doing this, the channel created has the same parameters when I do
> a
> createChannel() [2] operation and the message sent and receive are now
> appearing at same window [3].
>
> I don't know if this implementation is the most suitable, what do you
> think?
>
> [1]
> https://github.com/resiprocate/resiprocate/compare/master...MateusBellomo:mateus-presence-text#diff-82d1d1ba25e34af050fd6a6c5e5311dfR498
> [2]
> https://github.com/resiprocate/resiprocate/compare/master...MateusBellomo:mateus-presence-text#diff-82d1d1ba25e34af050fd6a6c5e5311dfR650
> [3] https://mateusbellomo.wordpress.com/
>
No, this doesn't look correct. First of all, I can see targetHandle is
assigned to the contact from the "to" header, and since this is a
"message received" method, the "to" is your self contact, not the remote
one. In 1-1 channels, TargetHandle must be the remote contact.
I just had a look at how telepathy-qt implements ensureChannel() and now
I fully understand what telepathy-morse is doing there too...
So, ensureChannel() will check if there is already a channel for this
message and if there is, it will use it, otherwise it will create a new
one. When you receive a new message for an existing channel, it is
practically impossible to know who is the "initiator", i.e. who started
the channel. If the channel is already created, then it is the channel
that knows this information, not the message. Therefore, ensureChannel()
does *not* use the "InitiatorHandle" to match an existing channel, it
only uses the "TargetHandleType" and "TargetHandle". But, if the channel
is not already created, then it creates it. In this case, it needs to
know who is the initiator and uses the "InitiatorHandle" property.
What does this mean for your code? It means that "TargetHandleType" and
"TargetHandle" identify your channel and "InitiatorHandle" identify the
contact that would be initiating the channel if it wasn't already
created. To explain it in a simple map:
* Receiving a message from a remote contact on a 1-to-1 chat:
TargetHandleType: contact
TargetHandle: remote contact handle
InitiatorHandle: remote contact handle
* Sending a message to a remote contact on a 1-to-1 chat:
TargetHandleType: contact
TargetHandle: remote contact handle
InitiatorHandle: local 'self' contact handle
* Receiving a message from a remote contact on a room:
TargetHandleType: room
TargetHandle: room handle
InitiatorHandle: remote contact handle
* Sending a message to a remote contact on a room:
TargetHandleType: room
TargetHandle: room handle
InitiatorHandle: local 'self' contact handle
Practically, your onMessageReceived() method falls in the first of the 4
cases above, so "TargetHandle" and "InitiatorHandle" actually need to be
the same contact handle, the one from the h_From header. Telepathy-morse
also tries to cover the 3rd case (room), which is why it is a bit more
confusing.
George
More information about the telepathy
mailing list