Merge pull request #31 from xhaakon/update

Ensure consistency after failed filesystem operations
Fix reporting of dlerror messages
[mtp] Support pathless sd card configuration

The SD card is not always mounted at a predictable place.
Support a blockdev= config option instead of path= for that case.
Fix to blockdev config support: give different names to partitions
add sample sd card config
Merge pull request #32 from amtep/master

Support pathless SD Card configuration
[mtp] Support initiators that leave mtpParentObject blank

When creating files and directories, Nautilus 3.4.2 was putting
the desired parent object in the request parameters, but not in
the accompanying ObjectInfo. Since the fsstorage plugin took the
parent object from the info, they ended up in the root directory.
Merge pull request #34 from amtep/master

[mtp] Support initiators that leave mtpParentObject blank
Don't let DeviceInfoProvider_Test overwrite ~/.cache/mtp/deviceinfo.xml

Fixes mysterious "IAmYourFriend" device name appearing on Windows.
Make StorageFactory destructor dlclose all storage plugins

The code is now generic and will handle situation when we later add more
kinds of storages, other than filesystem. Also fixes possible
application crash when there weren't any plugin loaded.
Merge pull request #37 from xhaakon/test-fix

Don't let DeviceInfoProvider_Test overwrite ~/.cache/mtp/deviceinfo.xml
Make StorageFactory destructor dlclose all storage plugins
[packaging] Require libqt5sparql-tracker-direct

It doesn't get pulled in automatically because it's loaded as
a plugin rather than dynamically linked. Without it, the
QSparqlConnection fails.
[mtp] fix possible null dereference in MTPResponder::getObjectPropListReq()

One shouldn't check wheter QMap contains a key using operator[] since it
inserts a default value for the key if it isn't already there.

In this particular case the excess property codes that
PropertyPod::getObjectPropListReq() could insert into some of the
m_objPropMap* QMaps resulted in excess values to be put into the static
QVectors of PropertyPod::getObjectPropsSupportedByType(), if they were
initialized afterwards.

Consequently, in MTPResponder::getObjectPropListReq() iteration over the
items obtained from getObjectPropsSupportedByType() could lead to a null
pointer returned from PropertyPod::getObjectPropDesc() and its
subsequent dereference on the next line of code.
[propertycache] Abridge ObjectPropertyCache method names

addToCache -> add
removeFromCache -> remove
getFromCache -> get
clearCache -> clear

The class has 'ObjectPropertyCache' written all over itself. Such
awkward method names are just plain redundant.
[storage] Factor out storageOfHandle
[propertycache] Let ObjectPropertyCache manage its own lifetime
[propertycache] Move handling of ObjectPropertyCache to StorageFactory

* Up to now cache had to be updated after each manipulation with object
  handles using StorageFactory API. The operations on the cache are now
  encapsulated into StorageFactory and thus transparent to its users.
* Lessens complexity of MTPResponder, moving the responsibility for the
  cache to a more simple class.
[storage] (get|set)ObjectPropertyValue aren't private in FsStoragePlugin

They implement public abstract methods from StoragePlugin.
[storage] Speculative caching of object properties

When StorageFactory is asked for properties of some object, we retrieve
them not only for the object in question, but for all its siblings as
well. Under assumption that it's likely those values will be requested
by the initiator shortly, the mass caching should improve performance
by minimizing access to Tracker or potential other slow storage that
might be added in the future.
[storage] Remove getFromObjInfo and getDynamically flags from getObjectPropertyValue

These optimizing flags are not used by the new implementation; the
object property cache should ensure access to the properties is
reasonably fast. Also they were rather FsStoragePlugin specific and
likely shouldn't be in the common interface anyway.