In my last entry, I mentioned the idea of making a J2ME-compliant cell phone "game" that is actually a better UI to the phone. The idea is dead, I'm afraid. It seems phones do not really provide an API to the phone bits. Which makes sense, I suppose - a malicious program could run up a huge bill. So I've just looked around a bit more and discovered that the LG phones have relatively good UIs. Not as good as I'd like but far better than the rest. I've bought a LG VX3200, with Verizon service. It works fairly well.
OpenSSL gotchas
A while ago, I complained a lot about OpenSSL. I've softened on it, but anyone uses it should know about some counterintuitive things it does by default and how to turn them off. I do this at SSL_CTX initialization:
/*
* Enable partial writes.
* Otherwise, SSL_write may return error with part of the data written; it
* will then expect the next call to have identical arguments (it will
* resume the write). That's completely against our calling conventions
* for Stream::write.
*/
SSL_CTX_set_options(me, SSL_MODE_ENABLE_PARTIAL_WRITE);
/*
* Enable auto-retry.
* Otherwise, SSL_read and SSL_write may return WANT_xxx in blocking mode.
* We don't throw IOBlockErrors when blocking; that's just weird.
*/
SSL_CTX_set_options(me, SSL_MODE_AUTO_RETRY);
/*
* Tell SSL to read always read as much into its buffer as possible to
* avoid unnecessary system calls.
*/
SSL_CTX_set_read_ahead(me, 1);
Also, very important: if you use it in multiple threads, you're expected to supply locking callbacks. Otherwise, it is not threadsafe! You need to use CRYPTO_set_locking_callback and CRYPTO_set_id_callback. You should also check how this interacts with whatever SSL-using libraries you may be using: libpq, neon, etc. And each thread should perform ERR_remove_state(0) at thread exit time.
Lastly, if you're doing non-blocking IO, you have to realize that SSL_write can return with an SSL_ERROR_WANT_READ and SSL_read can return with an SSL_ERROR_WANT_WRITE. That's because it can renegotiate at any time, so a logical read operation can involve an actual write operation, or vice versa. You have to take care to add the SSL descriptor to the correct FD_SET in select (or whatever mechanism you use).
Programming
...goes slowly. Life interferes, and I haven't been feeling motivated. Maybe things will pick up soon.
