Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- #----------------------------------------------------------------------
- # Homemade module for pulling fields out of a palm address book
- # database. Had to do some reverse engineering (both of the PalmDB
- # module and the address book record structure, so I can't claim
- # to understand everything going on here. String values use latin-1
- # encoding, so before you do anything serious (like populate web
- # pages or XML files) you'll want to convert the values to unicode.
- #
- # Bob Kline
- #----------------------------------------------------------------------
- import struct
- PHONE_WORK = 0
- PHONE_HOME = 1
- PHONE_FAX = 2
- PHONE_OTHER = 3
- PHONE_EMAIL = 4
- PHONE_MAIN = 5
- PHONE_PAGER = 6
- PHONE_MOBILE = 7
- class PalmAddress:
- def __init__(self, rec):
- phoneFlags, fieldMap, ignore = struct.unpack(">LLB", rec[:9])
- fields = rec[9:].split('\0')
- self.phoneLabels = []
- for i in range(5):
- self.phoneLabels.append((phoneFlags >> (i * 4)) &0x0f)
- self.dispPhone = (phoneFlags >> 20) & 0x0f
- self.reserved = (phoneFlags >> 24) & 0xff
- self.surname = None
- self.forename = None
- self.company = None
- self.phones = [None, None, None, None, None]
- self.address = None
- self.city = None
- self.state = None
- self.zipCode = None
- self.country = None
- self.title = None
- self.custom = [None, None, None, None]
- self.note = None
- fields.reverse()
- if fieldMap & 0x00001: self.surname = fields.pop()
- if fieldMap & 0x00002: self.forename = fields.pop()
- if fieldMap & 0x00004: self.company = fields.pop()
- if fieldMap & 0x00008: self.phones[0] = fields.pop()
- if fieldMap & 0x00010: self.phones[1] = fields.pop()
- if fieldMap & 0x00020: self.phones[2] = fields.pop()
- if fieldMap & 0x00040: self.phones[3] = fields.pop()
- if fieldMap & 0x00080: self.phones[4] = fields.pop()
- if fieldMap & 0x00100: self.address = fields.pop()
- if fieldMap & 0x00200: self.city = fields.pop()
- if fieldMap & 0x00400: self.state = fields.pop()
- if fieldMap & 0x00800: self.zipCode = fields.pop()
- if fieldMap & 0x01000: self.country = fields.pop()
- if fieldMap & 0x02000: self.title = fields.pop()
- if fieldMap & 0x04000: self.custom[0] = fields.pop()
- if fieldMap & 0x08000: self.custom[1] = fields.pop()
- if fieldMap & 0x10000: self.custom[2] = fields.pop()
- if fieldMap & 0x20000: self.custom[3] = fields.pop()
- if fieldMap & 0x40000: self.note = fields.pop()
- phoneLabelStrings = { 0: "work",
- 1: "home",
- 2: "fax",
- 3: "other",
- 4: "email",
- 5: "main",
- 6: "pager",
- 7: "mobile" }
- def phoneString(self, i):
- if self.phones[i]:
- return "%s (%s)" % (self.phones[i],
- self.phoneLabelStrings.get(self.phoneLabels[i],
- "???"))
- return "None"
- def __str__(self):
- return """\
- surname: %s
- forename: %s
- company: %s
- phone[1]: %s
- phone[2]: %s
- phone[3]: %s
- phone[4]: %s
- phone[5]: %s
- address: %s
- city: %s
- state: %s
- zipCode: %s
- country: %s
- title: %s
- custom[1]: %s
- custom[2]: %s
- custom[3]: %s
- custom[4]: %s
- note: %s""" % (self.surname,
- self.forename,
- self.company,
- self.phoneString(0),
- self.phoneString(1),
- self.phoneString(2),
- self.phoneString(3),
- self.phoneString(4),
- self.address,
- self.city,
- self.state,
- self.zipCode,
- self.country,
- self.title,
- self.custom[0],
- self.custom[1],
- self.custom[2],
- self.custom[3],
- self.note)
- if __name__ == '__main__':
- # Show how to use the module.
- import PalmDB, sys
- if len(sys.argv) != 2:
- sys.stderr.write("usage: PalmAddress.py pdb-filename\n")
- sys.stderr.write(" e.g.: PalmAddress.py AddressDB.pdb\n")
- sys.exit(2)
- name = sys.argv[1]
- db = PalmDB.PalmDatabase.PalmDatabase()
- fp = open(name, 'rb')
- data = fp.read()
- fp.close()
- db.fromByteArray(data)
- nRecs = len(db)
- print nRecs, "records"
- if nRecs:
- contact = PalmAddress(db[-1].toByteArray(0)[1])
- print contact
- else:
- print "no records found in address database\n"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement