D-Bus crate 0.7 overview
========================
In 0.7 the `Connection` struct has been rewritten (but the old one is still there). The new struct(s) have the following advantages:
* It makes it possible to make a connection `Send`/`Sync`, see `blocking::SyncConnection`.
* The call to `dbus_connection_dispatch` has been removed and what it did has been rewritten in Rust. This means better performance and panic safety.
* The two-layer design (with `Channel` as a low-level connection) makes it easier to write a custom `Connection`, should that be necessary.
* Preparation for a first class async/non-blocking `Connection`. A `nonblock` module is in the works.
* Some preparations for interfacing the `dbus` crate with a native backend instead of relying on `libdbus`, should someone want to write such a backend. There is a lot more to do before that becomes a reality though.
Things that have moved
======================
If you want the quickest upgrade experience, then you can just update your imports:
* The old `Connection` is now at `ffidisp::Connection`, likewise for `ConnPath`, `BusType` and many others. Have a look at the `ffidisp` module to see if your struct has moved there.
* The `stdintf` module is at `ffidisp::stdintf`.
* The old `MessageItem`, should you still need it, is now under `arg::messageitem`. But do use the generic functions instead of `MessageItem` whenever possible. `MessageItem::DictEntry` has changed to `MessageItem::Dict` (which contains the entire dict, not just one entry) to make it less error prone.
Migrating / upgrading
=====================
On a long term, consider migrating / upgrading to `blocking::Connection` or `blocking::SyncConnection`. You would need to make the following adjustments:
* Create and connect your connection easily with just `Connection::new_session()` or `Connection::new_system()`.
* Instead of `ConnPath`, use a `Proxy`. It works approximately the same way.
* `blocking::stdintf` can be helpful to make standard method calls, such as getting and setting properties on a remote peer.
* `Connection::register_name` has been renamed to `request_name`. (This was just a misnaming.)
* Instead of `incoming()` to process incoming messages, use `process()` (which takes a std `Duration`). This will not hand out any messages though, instead register callbacks using (in order from most convenient to most generic): `Proxy::match_signal`, `Proxy::match_start` or `channel::MatchingReceiver::start_receive`.
* For `tree`s, you must now make sure the root path (`/`) is always part of your tree.
* For `tree`s, call `Tree::start_receive()` to attach the tree and the connection, then call `Connection::process()` to process incoming messages.
Have a look at the `client`, `server` and `match_signal` examples to get started.
ReadAll / AppendAll
===================
The `ReadAll` and `AppendAll` traits were present in later 0.6.x versions as well, but are worthy a mention because they can make code more ergonomic in many cases. They are implemented for tuples: the empty tuple `()`, the single-tuple `(TYPE,)`, and usual tuples `(TYPE1, TYPE2)` up to 11. So if you have a method call that takes `STRING arg1, INT32 arg2` and returns a `BOOLEAN`, you can call it like this:
```
let (r,): (bool,) = myProxy.method_call(interface, name, (arg1, arg2))?;
```
...where `arg1` is a `&str` and `arg2` is a `i32`.