Advertisement
Guest User

Bob Kline

a guest
Jan 15th, 2010
507
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.90 KB | None | 0 0
  1. #!/usr/bin/python
  2.  
  3. #----------------------------------------------------------------------
  4. # Homemade module for pulling fields out of a palm address book
  5. # database.  Had to do some reverse engineering (both of the PalmDB
  6. # module and the address book record structure, so I can't claim
  7. # to understand everything going on here.  String values use latin-1
  8. # encoding, so before you do anything serious (like populate web
  9. # pages or XML files) you'll want to convert the values to unicode.
  10. #
  11. # Bob Kline
  12. #----------------------------------------------------------------------
  13. import struct
  14.  
  15. PHONE_WORK   = 0
  16. PHONE_HOME   = 1
  17. PHONE_FAX    = 2
  18. PHONE_OTHER  = 3
  19. PHONE_EMAIL  = 4
  20. PHONE_MAIN   = 5
  21. PHONE_PAGER  = 6
  22. PHONE_MOBILE = 7
  23.  
  24. class PalmAddress:
  25.     def __init__(self, rec):
  26.         phoneFlags, fieldMap, ignore = struct.unpack(">LLB", rec[:9])
  27.         fields = rec[9:].split('\0')
  28.         self.phoneLabels = []
  29.         for i in range(5):
  30.             self.phoneLabels.append((phoneFlags >> (i * 4)) &0x0f)
  31.         self.dispPhone = (phoneFlags >> 20) & 0x0f
  32.         self.reserved  = (phoneFlags >> 24) & 0xff
  33.         self.surname   = None
  34.         self.forename  = None
  35.         self.company   = None
  36.         self.phones    = [None, None, None, None, None]
  37.         self.address   = None
  38.         self.city      = None
  39.         self.state     = None
  40.         self.zipCode   = None
  41.         self.country   = None
  42.         self.title     = None
  43.         self.custom    = [None, None, None, None]
  44.         self.note      = None
  45.         fields.reverse()
  46.         if fieldMap & 0x00001: self.surname   = fields.pop()
  47.         if fieldMap & 0x00002: self.forename  = fields.pop()
  48.         if fieldMap & 0x00004: self.company   = fields.pop()
  49.         if fieldMap & 0x00008: self.phones[0] = fields.pop()
  50.         if fieldMap & 0x00010: self.phones[1] = fields.pop()
  51.         if fieldMap & 0x00020: self.phones[2] = fields.pop()
  52.         if fieldMap & 0x00040: self.phones[3] = fields.pop()
  53.         if fieldMap & 0x00080: self.phones[4] = fields.pop()
  54.         if fieldMap & 0x00100: self.address   = fields.pop()
  55.         if fieldMap & 0x00200: self.city      = fields.pop()
  56.         if fieldMap & 0x00400: self.state     = fields.pop()
  57.         if fieldMap & 0x00800: self.zipCode   = fields.pop()
  58.         if fieldMap & 0x01000: self.country   = fields.pop()
  59.         if fieldMap & 0x02000: self.title     = fields.pop()
  60.         if fieldMap & 0x04000: self.custom[0] = fields.pop()
  61.         if fieldMap & 0x08000: self.custom[1] = fields.pop()
  62.         if fieldMap & 0x10000: self.custom[2] = fields.pop()
  63.         if fieldMap & 0x20000: self.custom[3] = fields.pop()
  64.         if fieldMap & 0x40000: self.note      = fields.pop()
  65.     phoneLabelStrings = { 0: "work",
  66.                           1: "home",
  67.                           2: "fax",
  68.                           3: "other",
  69.                           4: "email",
  70.                           5: "main",
  71.                           6: "pager",
  72.                           7: "mobile" }
  73.     def phoneString(self, i):
  74.         if self.phones[i]:
  75.             return "%s (%s)" % (self.phones[i],
  76.                                 self.phoneLabelStrings.get(self.phoneLabels[i],
  77.                                                            "???"))
  78.         return "None"
  79.    
  80.     def __str__(self):
  81.         return """\
  82.  surname: %s
  83. forename: %s
  84.  company: %s
  85. phone[1]: %s
  86. phone[2]: %s
  87. phone[3]: %s
  88. phone[4]: %s
  89. phone[5]: %s
  90.  address: %s
  91.     city: %s
  92.    state: %s
  93.  zipCode: %s
  94.  country: %s
  95.    title: %s
  96. custom[1]: %s
  97. custom[2]: %s
  98. custom[3]: %s
  99. custom[4]: %s
  100.     note: %s""" % (self.surname,
  101.                     self.forename,
  102.                     self.company,
  103.                     self.phoneString(0),
  104.                     self.phoneString(1),
  105.                     self.phoneString(2),
  106.                     self.phoneString(3),
  107.                     self.phoneString(4),
  108.                     self.address,
  109.                     self.city,
  110.                     self.state,
  111.                     self.zipCode,
  112.                     self.country,
  113.                     self.title,
  114.                     self.custom[0],
  115.                     self.custom[1],
  116.                     self.custom[2],
  117.                     self.custom[3],
  118.                     self.note)
  119.  
  120. if __name__ == '__main__':
  121.     # Show how to use the module.
  122.     import PalmDB, sys
  123.     if len(sys.argv) != 2:
  124.         sys.stderr.write("usage: PalmAddress.py pdb-filename\n")
  125.         sys.stderr.write(" e.g.: PalmAddress.py AddressDB.pdb\n")
  126.         sys.exit(2)
  127.     name = sys.argv[1]
  128.     db = PalmDB.PalmDatabase.PalmDatabase()
  129.     fp = open(name, 'rb')
  130.     data = fp.read()
  131.     fp.close()
  132.     db.fromByteArray(data)
  133.     nRecs = len(db)
  134.     print nRecs, "records"
  135.     if nRecs:
  136.         contact = PalmAddress(db[-1].toByteArray(0)[1])
  137.         print contact
  138.     else:
  139.         print "no records found in address database\n"
  140.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement