Hello, On 02/03/11 20:33, Olli Salli wrote: > In essence, CD would implement a method, say > CD.I.Messages.Send(s:TargetID, s:message, <and perhaps some misc args > for flags, and maybe throw an a{sv} there just for the kicks>), in the > following way: > > - EnsureChannel a suitable text channel for sending the message to the > recipient > - Send the message on the resulting Channel > - If sending failed, which in particular can happen at least when > Yours wasn't true and somebody else Closed it when we tried to send, > just request the channel again, and try sending again
So when considering similar solutions in the past (but not inside MC: that's a new idea!) I was worried about going into a loop. I'm not 100% sure that the above is loop-free in the presence of someone else requesting the channel at the wrong time, and/or a broken observer that closes all your channels. (But in the latter case everyone dies anyway.) > This depends on a few things: > - If it is safe to implement CreateChannel in the CD as Ensure + not > Closing - the CD knows that it's the only other user of the Ensured > channel (unless somebody else is directly poking the Connection, but > that's broken anyway), so it could be the only one Closing it, but it > can avoid that because it knows of the new request Technically this is wrong if it's possible to have >1 separate conversations with a contact on a particular protocol (say, using XMPP threads). MC would have to try to guess whether a 1-1 text channel request was “standard” or not, or something. For instance, check out http://telepathy.freedesktop.org/spec/Channel_Interface_SMS.html — the SMSChannel property allows you to ask for messages to be sent via SMS rather than over the internet on protocols which support both. This is the biggest worry I have with this solution to the problem: right now, MC is completely agnostic of the contents of requests. It just does a{sv} pattern-matching and knows no semantic details. Baking in special knowledge of text channels makes it harder to do clever stuff in future without adding special-cases to MC. > - If it is safe to Close the channel when we're done if nobody > requested it in the meantime: It should be, as if we use Close instead > of Destroy, if there were incoming messages the Channel should then be > closed and redispatched, right? This should be safe. > - If it is problematic that the Channel might be redispatched after > Closing with its pending message queue intact, namely for loggers not > wanting duplicate events? We haven't given the Channel to a Handler > which could ack the messages beforehand, that is. This is the same as a handler closing a channel while it has pending messages, and it respawning. The messages get marked as 'recovered' to make it easier for observers. > Also, do you think this would complicate the CD implementation too > much (or be in fact impossible)? This bit of the channel dispatcher is quite complicated already. I'm a bit scared of baking more magic into it… I believe it's *possible*, but may lead to hard-to-catch bugs. > I'm fine with send-only Channels - > they'd solve the issue equally well, and without any CD changes, but > would in turn require changes in ALL of the CMs, and non-trivial > tp-glib support, which looks problematic at this point to say the > least. Not to mention the fact that "send-only" channels are an > awkward concept at best. I have conceptual issues with send-only channels too: they're a total hack! It's also much harder to explain to a new-comer. There's a certain conceptual simplicity to having an actual JustSendAMessageToAContact() D-Bus method that people can use without having a full Telepathy library to depend on. “dbus-send blah blah blah” is a much nicer answer to “how do I send a IM to f...@bar.com” than “well, you have to ask the account manager for all accounts, and then look at all the contact lists and find f...@bar.com and then be a handler and then request-and-handle a write-only text channel and then you can actually send the message”… But if we took the write-only channels route, we could put the SendAMessage(s: contact_identifier, s: message) magic method on (say) the logger in the future. One doesn't preclude the other. I'd be interested to hear from CM hackers what they think about this. -- Will _______________________________________________ telepathy mailing list telepathy@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/telepathy