########################## # # # XinBox (V.0.9) # # By Stanley87 # # # ####### ####### # # # # # A pop3 email client for XBMC # # # ###################################### def createProgressDialog( __line3__ ): global dialog, pct pct = 0 dialog = xbmcgui.DialogProgress() dialog.create( lang( 0 ) ) updateProgressDialog( __line3__ ) def updateProgressDialog( __line3__ ): global dialog, pct pct += 5 dialog.update( pct, __line1__, __line2__, __line3__ ) def closeProgessDialog(): global dialog dialog.close() import xbmcgui, language, time lang = language.Language().string __line1__ = lang(60) __line2__ = lang(61) createProgressDialog( '%s xbmc' % ( lang( 62 ), )) import xbmc updateProgressDialog( '%s sys' % ( lang( 62 ), )) import sys updateProgressDialog( '%s os' % ( lang( 62 ), )) import os updateProgressDialog( '%s threading' % ( lang( 62 ), )) import threading updateProgressDialog( '%s guibuilder' % ( lang( 62 ), )) import guibuilder updateProgressDialog( '%s xib_util' % ( lang( 62 ), )) import xib_util updateProgressDialog( '%s shutil' % ( lang( 62 ), )) import shutil updateProgressDialog( '%s default' % ( lang( 62 ), )) import default updateProgressDialog( '%s traceback' % ( lang( 62 ), )) import traceback updateProgressDialog( '%s mailchecker' % ( lang( 62 ), )) import mailchecker updateProgressDialog( '%s email' % ( lang( 62 ), )) import email updateProgressDialog( '%s poplib' % ( lang( 62 ), )) import poplib, mimetypes closeProgessDialog() SETTINGDIR = default.__scriptsettings__ SCRIPTSETDIR = SETTINGDIR + default.__scriptname__ + "\\" DATADIR = SCRIPTSETDIR + "data\\" DELETEFOLDER = "deleted\\" IDFOLDER = "ids\\" NEWFOLDER = "new\\" CORFOLDER = "cor\\" MAILFOLDER = "mail\\" SCRITPFOLDER = default.__scriptpath__ MEDIAFOLDER = SCRITPFOLDER + "src//media//" class GUI( xbmcgui.WindowXML ): def __init__(self,strXMLname, strFallbackPath,strDefaultName,bforeFallback=0): self.url = "http://xboxmediacenter.com" def onInit(self): self.setupcontrols() self.createdirs() self.getSettings() self.getmmSettings() self.adjustcontrols() self.setupvars() xbmcgui.unlock() def setupcontrols ( self ): self.list = self.getControl(68) self.txtbox = self.getControl(67) self.xb1butn = self.getControl(61) self.xb2butn = self.getControl(62) self.sebutn = self.getControl(63) self.mmbutn = self.getControl(64) self.title = self.getControl(66) self.bkimage = self.getControl(65) self.xbempty = self.getControl(70) self.fsoverlay = self.getControl(71) self.fsmsgbody = self.getControl(72) self.emailinfo = self.getControl(73) self.emailrec = self.getControl(74) self.attbutn = self.getControl(75) self.delbutn = self.getControl(76) return def setupvars( self ): self.box1 = 0 self.box2 = 0 self.Fullscreen = False self.notread = MEDIAFOLDER + "emailnotread.png" self.read = MEDIAFOLDER + "emailread.png" self.control_action = xib_util.setControllerAction() xbmc.log ("setup variables OK") return def adjustcontrols ( self ): self.delbutn.setVisible( False ) self.attbutn.setVisible( False ) self.fsmsgbody.setVisible( False ) self.emailinfo.setVisible( False ) self.emailrec.setVisible( False ) self.fsoverlay.setVisible( False ) self.xbempty.setVisible( False ) self.list.setVisible( False ) self.mmbutn.setLabel( lang(200) ) self.sebutn.setLabel( lang(201) ) if self.mmsettings.disablemmb: self.mmbutn.setEnabled( False ) if self.settings.disablexb1: self.xb1butn.setEnabled( False ) if self.settings.disablexb2: self.xb2butn.setEnabled( False ) xbmc.log ("adjusted controls OK") return def createdirs( self ): self.dirs = xib_util.createdirs() def getmmSettings( self ): self.mmsettings = xib_util.mmSettings() def getSettings( self ): self.settings = xib_util.Settings() def gettally(self): self.readtally() if self.tally == "-": self.tally = 1 self.tally = int(self.tally) self.writetally() return def readtally(self): try: fh = open(self.emfolder + "tally.sss") for line in fh.readlines(): theLine = line.strip() if theLine.count("") > 0: self.tally = theLine[7:-8] fh.close() return except IOError: self.createtally() self.readtally() return def writetally(self): f = open(self.emfolder + "tally.sss", "wb") f.write("\t"+ str(self.tally) +"\n") f.close() return def createtally(self): f = open(self.emfolder + "tally.sss", "wb") f.write("\t-\n") f.close() return def disablexinbox (self): self.txtbox.reset() self.txtbox.setVisible( False ) self.list.setVisible( False ) self.xbempty.setVisible( True ) self.xbempty.setLabel( lang(58) ) if self.box2 ==1: self.setFocus(self.xb2butn) else: self.setFocus(self.xb1butn) return def openinbox( self , inbox): if inbox == 1: self.box1 = 1 self.box2 = 0 self.title.setLabel( lang(0) + " - " + self.settings.user1) self.xb1butn.setLabel( lang(65)) self.xb2butn.setLabel("XinBox 2") self.emfolder = DATADIR + self.settings.user1 + "@" + self.settings.server1 + "\\" else: self.box2 = 1 self.box1 = 0 self.title.setLabel( lang(0) + " - " + self.settings.user2) self.xb2butn.setLabel( lang(65)) self.xb1butn.setLabel("XinBox 1") self.emfolder = DATADIR + self.settings.user2 + "@" + self.settings.server2 + "\\" if not os.path.exists(self.emfolder): self.disablexinbox() else: self.addme() if self.list.size() == 0: self.disablexinbox() def clearfolder(self, folder): for root, dirs, files in os.walk(folder, topdown=False): for name in files: os.remove(os.path.join(root, name)) def addme( self ): self.xbempty.setVisible( False ) self.txtbox.reset() self.txtbox.setVisible( True ) self.clearfolder(self.emfolder + CORFOLDER) self.list.setVisible( True ) self.list.reset() self.gettally() self.count = 0 self.count2 = 0 self.count3 = self.tally self.emails = [] for self.count in range(self.tally): self.temp2 = self.emfolder + MAILFOLDER + str(self.count3) +".sss" if os.path.exists(self.temp2): fh = open(self.temp2) self.tempStr = fh.read() fh.close() self.getstatus() self.emails.append(email.message_from_string(self.emailbody)) try: temp = self.emails[self.count2].get('subject') if temp == "": self.myemail = xbmcgui.ListItem(lang(22) +" "+ lang(23) + " "+ self.emails[self.count2].get('from')) else: self.myemail = xbmcgui.ListItem(self.emails[self.count2].get('subject') +" "+ lang(23) + " "+ self.emails[self.count2].get('from')) except: try: self.myemail = xbmcgui.ListItem(lang(22) +" "+ lang(23) + " "+ self.emails[self.count2].get('from')) except: self.myemail = xbmcgui.ListItem("BAD EMAIL") if self.readstatus == "UNREAD": self.myemail.setThumbnailImage(self.notread) else: self.myemail.setThumbnailImage(self.read) self.list.addItem(self.myemail) f = open(self.emfolder + CORFOLDER + str(self.list.size()-1) +".cor", "w") f.write(str(self.count3)) f.close() self.count = self.count+1 self.count2 = self.count2+1 self.count3 = self.count3-1 else: self.count = self.count+1 self.count3 = self.count3-1 return def processEmail(self, selected): self.attachments = [] if self.emails[selected].is_multipart(): for part in self.emails[selected].walk(): if part.get_content_type() != "text/plain" and part.get_content_type() != "text/html" and part.get_content_type() != "multipart/mixed" and part.get_content_type() != "multipart/alternative": filename = part.get_filename() if not filename: ext = mimetypes.guess_extension(part.get_type()) if not ext: # Use a generic extension ext = '.bin' filename = 'temp' + ext try: f=open(TEMPFOLDER + filename, "wb") f.write(part.get_payload(decode=1)) f.close() except: print "problem saving attachment " + filename self.attachments.append(filename) if len(self.attachments)==0: self.attbutn.setEnabled( False ) else: self.attbutn.setEnabled( True ) self.printEmail(selected) def parse_email(self, email): self.parsemail = email return str(self.parsemail) def printEmail(self, selected): self.msgText = "" if self.emails[selected].is_multipart(): for part in self.emails[selected].walk(): if part.get_content_type() == "text/plain": print part.get_payload() email = self.parse_email(part.get_payload()) self.msgText = email break else: if self.emails[selected].get_content_type() == "text/html": # email in html only, so strip html tags email2 = self.parse_email(self.emails[selected].get_payload()) self.msgText = email2 else: email3 = self.parse_email(self.emails[selected].get_payload()) self.msgText = email3 print self.msgText self.txtbox.setText(self.msgText) return def getemailinfo(self): self.temp = self.list.getSelectedPosition() self.temp2 = self.list.getSelectedItem() self.temp3 = self.temp2.getLabel() fh = open(self.emfolder + CORFOLDER + str(self.temp)+ ".cor") self.updateme = fh.read() fh.close() fh = open(self.emfolder + MAILFOLDER + str(self.updateme) +".sss") self.tempStr = fh.read() fh.close() return def delemail (self, inbox, emailid): w = mailchecker.Checkemail(inbox, 0, emailid) w.deletemail() del w return def deletemail(self): dialog = xbmcgui.Dialog() ret = dialog.select( lang( 66 ), [ lang( 67 ), lang( 68 ), lang( 69 )]) if ret == 0: os.remove(self.emfolder + MAILFOLDER + str(self.updateme)+".sss") self.addme() self.undoFullscreen() if self.list.size() == 0: self.disablexinbox() else: self.setFocus(self.list) try: self.list.selectItem(self.temp) except:pass self.printEmail(self.list.getSelectedPosition()) elif ret == 1: if self.box1 == 1: self.delemail(1, self.mailid) else: self.delemail(2, self.mailid) self.setFocus(self.delbutn) return elif ret == 2: if self.box1 == 1: self.delemail(1, self.mailid) else: self.delemail(2, self.mailid) self.getemailinfo() os.remove(self.emfolder + MAILFOLDER + str(self.updateme)+".sss") self.addme() self.undoFullscreen() if self.list.size() == 0: self.disablexinbox() else: self.setFocus(self.list) try: self.list.selectItem(self.temp) except:pass self.printEmail(self.list.getSelectedPosition()) else:self.setFocus(self.delbutn) return def checkemail ( self, inbox, minimode): w = mailchecker.Checkemail(inbox, minimode, 0) w.setupemail() self.newmails = w.returnvar del w return def getstatus( self ): s = self.tempStr.split('|') self.readstatus = s[0] self.time = s[1] self.date = s[2] self.mailid = s[3] self.emailbody = s[4] return def goFullscreen(self): self.emailinfo.reset() self.emailrec.reset() self.fsmsgbody.reset() self.getemailinfo() self.getstatus() self.temp2.setThumbnailImage(self.read) self.readstatus = "READ" self.writestatus() self.processEmail(self.temp) self.attbutn.setVisible( True ) self.delbutn.setVisible( True ) self.fsoverlay.setVisible(True) self.fsmsgbody.setVisible(True) self.fsmsgbody.setText(self.msgText) self.setFocus(self.fsmsgbody) self.emailinfo.addLabel(self.temp3) self.emailrec.addLabel( lang( 63 ) + str(self.time) + " - " + str(self.date)) self.emailinfo.setVisible(True) self.emailrec.setVisible(True) self.Fullscreen = True def writestatus (self): f = open(self.emfolder + MAILFOLDER + str(self.updateme) +".sss", "w") f.write(self.readstatus + "|" + self.time + "|" + self.date + "|" + self.mailid + "|" + self.emailbody) f.close() return def undoFullscreen(self): self.attbutn.setVisible( False ) self.delbutn.setVisible( False ) self.fsoverlay.setVisible(False) self.emailinfo.setVisible(False) self.emailrec.setVisible(False) self.fsmsgbody.setVisible(False) self.Fullscreen = False self.setFocus(self.list) return def onFocus(self, controlID): print 'The control with id="5" just got focus' def onClick(self, controlID): if ( controlID == 61): if self.box1 == 1: self.checkemail(1,0) if self.newmails != 0: self.addme() else: self.openinbox(1) elif ( controlID == 62): if self.box2 == 1: self.checkemail(2,0) if self.newmails != 0: self.addme() else: self.openinbox(2) elif ( controlID == 76): self.deletemail() elif ( controlID == 63): try: self.launchsettings() except:traceback.print_exc() def onAction( self, action ): button_key = self.control_action.get( action.getButtonCode(), 'n/a' ) actionID = action.getId() try: control = self.getFocus() except: control = 0 if ( button_key == 'Keyboard ESC Button' or button_key == 'Back Button' or button_key == 'Remote Menu Button' ): if self.Fullscreen == True: self.undoFullscreen() else: self.close() elif ( button_key == 'A Button' or button_key == 'Keyboard Menu Button'): if control == self.list: self.goFullscreen() else: if control == self.list: self.printEmail(self.list.getSelectedPosition()) def launchsettings( self ): ws = Settings("settingss.xml",SCRITPFOLDER + "src","DefaultSkin") ws.doModal() del ws class Settings( xbmcgui.WindowXML ): def __init__(self,strXMLname, strFallbackPath,strDefaultName,bforeFallback=0): print "Hi" def onInit(self): self.xb1butn = self.getControl(61) def onClick(self, controlID): if ( controlID == 61): self.close() def onAction( self, action ): print "hi"