#!/usr/bin/python import wxversion #wxversion.select("2.5") from wxPython.wx import * import bsddb import os import re # Constants SMSLEN = 160 DB_PATH = "~/.evolution/addressbook/local/system/addressbook.db" # EvolutionsCells gets cell phone numbers out of the Evolution database class EvolutionCells: def __init__(self): contacts = {} self.contacts = contacts db = bsddb.hashopen(os.path.expanduser(DB_PATH),"r") self.db = db for k in db.keys(): name = "" cell = "" for e in db[k].split('\r\n'): if re.search("^FN:", e): name = re.sub("^FN:", "", e) if re.search("^\.?TEL;TYPE=CELL.*?:", e): cell = re.sub("^\.?TEL;TYPE=CELL.*?:", "", e) if cell != "": contacts[name] = cell db.close def getContacts(self): return self.contacts # SimserFrame is the application class SimserFrame(wxFrame): def __init__(self, parent, id, title): # Create GUI wxFrame.__init__(self, parent, id, title, wxPoint(100, 100), wxSize(450, 70)) panel = wxPanel(self, -1) self.panel = panel wxStaticText(panel, -1, "Text:", wxDLG_PNT(panel, wxPoint(4, 4)), wxDefaultSize) wxStaticText(panel, -1, "Contact:", wxDLG_PNT(panel, wxPoint(4, 20)), wxDefaultSize) self.textCtrl = wxTextCtrl(panel, 20, "", wxDLG_PNT(panel, wxPoint(30, 4)), wxDLG_SZE(panel, wxSize(160, -1))) self.textCtrl.SetMaxLength(SMSLEN); self.textCtrl.SetFocus() self.sendCtrl = wxButton(panel, 10, "Send", wxDLG_PNT(panel, wxPoint(100, 20)), wxDLG_SZE(panel, wxSize(30, -1))) EVT_BUTTON(self, 10, self.OnSendClick) self.zaehler = wxStaticText(panel, -1, str(SMSLEN), wxDLG_PNT(panel, wxPoint(150, 20)), wxDefaultSize) EVT_TEXT(self, 20, self.OnChange) # Get contacts cells = EvolutionCells() self.contacts = cells.getContacts() # Fill contact list and the combobox contactlist = self.contacts.keys() contactlist.sort() self.contactCtrl = wxComboBox(panel, -1, contactlist[0], wxDLG_PNT(panel, wxPoint(30, 20)), wxDLG_SZE(panel, wxSize(60, -1)), contactlist) def OnCloseWindow(self, event): self.Destroy() def OnSendClick(self, event): text = self.textCtrl.GetValue() contact = self.contactCtrl.GetValue() # Figure out if we have a number or a name if re.search('^[+0-9]+$', contact): nr = contact else: if self.contacts.has_key(contact): nr = self.contacts[contact] else: self.foodialog = wxMessageDialog(self.panel, "Contact '" + contact + "' is unknown!", "Erros", wxOK, wxPoint(100, 100)) self.foodialog.Show(true) return # Quote text text = re.sub("'", "''", text) nr = re.sub("'", "''", nr) # Send SMS and report back rc = os.system("echo '" + text + "' | gsmsendsms '" + nr + "'") if(rc == 0): self.foodialog = wxMessageDialog(self.panel, "Message sent to " + nr, "Success", wxOK, wxPoint(100, 100)) else: self.foodialog = wxMessageDialog(self.panel, "gsmsendsms returned error code: " + str(rc >> 8), "Error", wxOK, wxPoint(100, 100)) self.foodialog.Show(true) def OnChange(self, event): self.zaehler.SetLabel(str(SMSLEN-len(self.textCtrl.GetValue()))) class Simser(wxApp): def OnInit(self): frame = SimserFrame(NULL, -1, "Simser") frame.Show(true) self.SetTopWindow(frame) return true smstool=Simser(0) smstool.MainLoop()