jammin.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import sys
  2. from _pi_cffi import ffi, lib
  3. from pprint import pprint
  4. def get_buffer(buffer, bsize):
  5. string = b""
  6. for x in range(bsize):
  7. string += buffer[x]
  8. # return string.decode('cp437').encode('utf-8')
  9. return string.decode("cp437")
  10. # return string.decode('utf-8')
  11. # return string
  12. def get_bytes(buffer, bsize):
  13. string = b""
  14. for x in range(bsize):
  15. string += buffer[x]
  16. # return string.decode('cp437').encode('utf-8')
  17. return string
  18. def get_subfields(subpacket):
  19. done = 0
  20. fields = {}
  21. subfield = lib.JAM_GetSubfield(subpacket)
  22. if subfield == ffi.NULL:
  23. done = 1
  24. else:
  25. fields[int(subfield[0].LoID)] = get_buffer(subfield.Buffer, subfield.DatLen)
  26. # print("SubField ID:", subfield[0].LoID, " ", end='')
  27. # print_message(subfield.Buffer, subfield.DatLen)
  28. while done == 0:
  29. subfield = lib.JAM_GetSubfield(ffi.NULL)
  30. if subfield == ffi.NULL:
  31. done = 1
  32. else:
  33. fields[int(subfield[0].LoID)] = get_buffer(subfield.Buffer, subfield.DatLen)
  34. # print("SubField ID:", subfield[0].LoID, " ", end='')
  35. # print_message(subfield.Buffer, subfield.DatLen)
  36. return fields
  37. def get_messages(messagebase):
  38. jambase = ffi.new("s_JamBase **")
  39. ret = lib.JAM_OpenMB(messagebase.encode("utf-8"), jambase)
  40. if ret != 0:
  41. return None
  42. # Ok, next!
  43. size = ffi.new("uint32_t *")
  44. ret = lib.JAM_GetMBSize(jambase[0], size)
  45. if ret != 0:
  46. return None
  47. basesize = int(ffi.cast("long", size[0]))
  48. msgheader = ffi.new("s_JamMsgHeader *")
  49. subpacket = ffi.new("s_JamSubPacket **")
  50. subfield = ffi.new("s_JamSubfield *")
  51. messages = []
  52. for msgno in range(basesize):
  53. ret = lib.JAM_ReadMsgHeader(jambase[0], msgno, msgheader, subpacket)
  54. # Not sure if I need to delete subpacket on an error...
  55. if ret == 0:
  56. fields = get_subfields(subpacket[0])
  57. # pprint(fields)
  58. msgdata = {
  59. "subject": fields.get(6, ""),
  60. "from": fields.get(2, "<blank>"),
  61. "to": fields.get(3, "<blank>"),
  62. }
  63. msgdata["MsgNum"] = msgheader[0].MsgNum
  64. msgdata["number"] = msgno
  65. msgdata["written"] = msgheader[0].DateWritten
  66. msgdata["received"] = msgheader[0].DateReceived
  67. msgdata["processed"] = msgheader[0].DateProcessed
  68. messages.append(msgdata)
  69. lib.JAM_DelSubPacket(subpacket[0])
  70. ret = lib.JAM_CloseMB(jambase[0])
  71. lib.free(jambase[0])
  72. jambase = None
  73. return messages
  74. def read_message(base, number):
  75. jambase = ffi.new("s_JamBase **")
  76. ret = lib.JAM_OpenMB(base.encode("utf-8"), jambase)
  77. if ret != 0:
  78. return None
  79. jambaseheader = ffi.new("s_JamBaseHeader *")
  80. ret = lib.JAM_ReadMBHeader(jambase[0], jambaseheader)
  81. if ret != 0:
  82. return None
  83. actual = number - jambaseheader[0].BaseMsgNum
  84. msgheader = ffi.new("s_JamMsgHeader *")
  85. subpacket = ffi.new("s_JamSubPacket **")
  86. subfield = ffi.new("s_JamSubfield *")
  87. ret = lib.JAM_ReadMsgHeader(jambase[0], actual, msgheader, subpacket)
  88. message = {}
  89. # Not sure if I need to delete subpacket on an error...
  90. if ret == 0:
  91. fields = get_subfields(subpacket[0])
  92. message = {
  93. "subject": fields.get(6, ""),
  94. "from": fields.get(2, "<blank>"),
  95. "to": fields.get(3, "<blank>"),
  96. }
  97. message["fields"] = fields
  98. message["number"] = actual
  99. message["MsgNum"] = msgheader[0].MsgNum
  100. message["written"] = msgheader[0].DateWritten
  101. message["received"] = msgheader[0].DateReceived
  102. message["processed"] = msgheader[0].DateProcessed
  103. # message text
  104. buffer = ffi.new("char []", msgheader.TxtLen + 1)
  105. ret = lib.JAM_ReadMsgText(
  106. jambase[0], msgheader.TxtOffset, msgheader.TxtLen, buffer
  107. )
  108. msgtext = get_buffer(buffer, msgheader.TxtLen)
  109. message["text"] = msgtext
  110. message["bytes"] = get_bytes(buffer, msgheader.TxtLen)
  111. buffer = None
  112. lib.JAM_DelSubPacket(subpacket[0])
  113. ret = lib.JAM_CloseMB(jambase[0])
  114. lib.free(jambase[0])
  115. jambase = None
  116. return message