5b712a15e5
We currently only have a few devices added to our bluetooth product lookup table. This script is intended to allow user to query the information from device they own and instructs them to send it to a syncevolution devoloper (me for the time being). The goal is to crowd-source sa much phone data as we can.
113 lines
4.4 KiB
Python
113 lines
4.4 KiB
Python
#! /usr/bin/python -u
|
|
|
|
# * Copyright (C) 2011 Intel Corporation
|
|
|
|
# This file is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
# License as published by the Free Software Foundation; either
|
|
# version 2.1 or 3.0 of the License.
|
|
#
|
|
# This library is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# Lesser General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
# License along with this library; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
import dbus
|
|
import string
|
|
import sys
|
|
|
|
# Defines
|
|
SYNCML_UUID = "00000002-0000-1000-8000-0002ee000002"
|
|
PNPINFO_UUID = "00001200-0000-1000-8000-00805f9b34fb"
|
|
PNPINFO_ATTRIB = "0x1200"
|
|
SOURCE_ATTRIB = "0x0205"
|
|
VENDOR_ATTRIB = "0x0201"
|
|
PRODUCT_ATTRIB = "0x0202"
|
|
|
|
def extractValueFromServiceRecord(servRec, attribId):
|
|
|
|
pos = string.find(servRec, attribId)
|
|
|
|
if(pos < 0):
|
|
return ""
|
|
|
|
pos = string.find(servRec, "value", pos + len(attribId))
|
|
pos = string.find(servRec, '"', pos) + 1
|
|
endPos = string.find(servRec,'"', pos)
|
|
return servRec[pos:endPos]
|
|
|
|
def getVendorAndProductId(pnpInfoServRec):
|
|
'''Get the vendor and product ids from xml formatted service record.'''
|
|
|
|
servRec = pnpInfoServRec.values()[0]
|
|
|
|
sourceVal = extractValueFromServiceRecord(servRec, SOURCE_ATTRIB)
|
|
vendorVal = extractValueFromServiceRecord(servRec, VENDOR_ATTRIB)
|
|
productVal = extractValueFromServiceRecord(servRec, PRODUCT_ATTRIB)
|
|
return (sourceVal, vendorVal, productVal)
|
|
|
|
def writeDeviceInfoToFile(ids, vendor, product, hasSyncML):
|
|
|
|
filename = "syncevo-phone-info-[%s].txt" % product
|
|
FILE = open(filename,"w")
|
|
FILE.write("Thanks, for helping us improve phone syncing on Linux.\n")
|
|
FILE.write("Please send this file or its contents to blixtra [at] gmail.com\n\n" )
|
|
FILE.write("SyncML support: %s\n" % hasSyncML)
|
|
if(len(ids) > 0):
|
|
FILE.write("Source: %s\n" % (ids[0]))
|
|
FILE.write("Vendor: %s=%s\n" % (ids[1], vendor))
|
|
FILE.write("product: %s=%s\n\n" % (ids[2], product))
|
|
else:
|
|
FILE.write("Vendor: %s\n" % vendor)
|
|
FILE.write("product: %s\n\n" % product)
|
|
FILE.write("This phone doesn't support the bluetooth Device ID profile.\n" )
|
|
|
|
FILE.close()
|
|
return filename
|
|
|
|
# Start main program
|
|
bus = dbus.SystemBus()
|
|
bluezIface = dbus.Interface(bus.get_object('org.bluez', '/'),
|
|
'org.bluez.Manager')
|
|
|
|
hasSyncmlSupport = False
|
|
hasPnpInfoSupport = False
|
|
ids = {}
|
|
|
|
adapters = bluezIface.ListAdapters()
|
|
for adapter in adapters:
|
|
adapterIface = dbus.Interface(bus.get_object('org.bluez', adapter),
|
|
'org.bluez.Adapter')
|
|
devices = adapterIface.ListDevices()
|
|
for device in devices:
|
|
try:
|
|
deviceIface = dbus.Interface(bus.get_object('org.bluez', device),
|
|
'org.bluez.Device')
|
|
props = deviceIface.GetProperties();
|
|
uuids = props["UUIDs"]
|
|
print "Device name:", props.get("Name", "???")
|
|
print "MAC Address:", props.get("Address", "???")
|
|
for uuid in uuids:
|
|
if SYNCML_UUID == uuid:
|
|
hasSyncmlSupport = True
|
|
print " Supports SyncML."
|
|
if PNPINFO_UUID == uuid:
|
|
hasPnpInfoSupport = True
|
|
print " Looking up device information..."
|
|
sys.stdout.flush()
|
|
serviceRecord = deviceIface.DiscoverServices(PNPINFO_ATTRIB)
|
|
ids = getVendorAndProductId(serviceRecord)
|
|
|
|
vendor = raw_input(" What company makes this phone? (examples: Nokia, Sony Ericsson), empty to skip: ")
|
|
if vendor:
|
|
product = raw_input(" What is the model of this phone? (example: N900, K750i), empty to skip: ")
|
|
if product:
|
|
# Write the results to a file
|
|
filename = writeDeviceInfoToFile(ids, vendor, product, hasSyncmlSupport)
|
|
print "Thanks, please send the file %s to blixtra [at] gmail.com" % filename
|
|
except dbus.exceptions.DBusException, ex:
|
|
print " Failed, skipping device: %s" % ex
|