123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- # -*- coding: utf-8 -*-
- """
- Package /home/cpi/games/xxx/yyy.zip ,only support in zip
- com_pkg_info /home/cpi/launcher/Menu/GameShell/xxxx/compkginfo.json
- use https://jsonlint.com/ to validate first in case syntax err
- ```
- {
- "NotFoundMsg":["Please Go to \n|None|varela14|True",
- "https://www.lexaloffle.com/pico-8.php|URL|None|True|True",
- "buy a pico-8 raspi and put zip into \n/home/cpi/games/PICO-8"]
- "MD5":{"pico-8_0.1.11g_raspi.zip":"a3f2995cf117499f880bd964d6a0e1f2","pico-8_0.1.11g_amd64.zip":"6726141c784afd4a41be6b7414c1b932"}
- }
- ```
- """
- import pygame
- #import validators
- import os
- import commands
- from UI.constants import Width,Height,ICON_TYPES,RUNEVT,RESTARTUI
- #from UI.simple_name_space import SimpleNamespace
- from UI.page import Page
- from UI.label import Label
- from UI.fonts import fonts
- from UI.icon_item import IconItem
- from UI.icon_pool import MyIconPool
- from UI.keys_def import CurKeys
- from UI.skin_manager import MySkinManager
- from UI.lang_manager import MyLangManager
- from UI.text_bulletinboard import Textbulletinboard,Text
- from UI.util_funcs import FileExists
- class NotFoundPage(Page):
- _FootMsg = ["Nav","","","Back",""]
- _BG = "pico8_notfound"
- _Leader = None
- _Padding = pygame.Rect(0,20,0,0)
- def Init(self):
- self._PosX = self._Index*self._Screen._Width
- self._Width = self._Screen._Width
- self._Height = self._Screen._Height
-
- self._CanvasHWND = self._Screen._CanvasHWND
- self._BGpng = IconItem()
- self._BGpng._ImgSurf = MyIconPool._Icons[self._BG]
- self._BGpng._MyType = ICON_TYPES["STAT"]
- self._BGpng._Parent = self
- #print( MyIconPool.Width(self._BG),MyIconPool.Height(self._BG) )
- self._BGpng.Adjust(0,0,MyIconPool.Width(self._BG),MyIconPool.Height(self._BG),0)
-
- self._Board = Textbulletinboard()
-
- self._Board._PosX = 4
- self._Board._PosY = 100
- self._Board._Width= self._Width - 4*2
- self._Board._Height = 100
- self._Board._CanvasHWND = self._CanvasHWND
- self._Board._Align = "Center"
- self._Board._RowPitch =30
- self._Board.Init()
-
- if self._Leader!= None and self._Leader._ComPkgInfo != None:
- if "NotFoundMsg" in self._Leader._ComPkgInfo:
- d = []
- for i, v in enumerate(self._Leader._ComPkgInfo["NotFoundMsg"]):
- Color = None
- Font = None
- Bold = False
- Und = False
- Txt = ""
- parts = v.split("|")
- if len(parts) > 0:
- Txt = parts[0]
-
- if len(parts) == 2:
- if parts[1] != "None":
- Color = MySkinManager.GiveColor(parts[1])
- elif len(parts) == 3:
- if parts[1] != "None":
- Color = MySkinManager.GiveColor(parts[1])
- if parts[2] != "None":
- Font = MyLangManager.TrFont(parts[2])
- elif len(parts) == 4:
- if parts[1] != "None":
- Color = MySkinManager.GiveColor(parts[1])
- if parts[2] != "None":
- Font = MyLangManager.TrFont(parts[2])
- if parts[3] == "True":
- Bold = True
- elif len(parts) == 5:
- if parts[1] != "None":
- Color = MySkinManager.GiveColor(parts[1])
- if parts[2] != "None":
- Font = MyLangManager.TrFont(parts[2])
- if parts[3] == "True":
- Bold = True
- if parts[4] == "True":
- Und = True
-
- a = Text(Txt,Color,Font,Bold,Und)
- d = d + a.Words()
-
- self._Board.SetAndBlitText(d)
-
- def KeyDown(self,event):
- if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]:
- self.ReturnToUpLevelPage()
- self._Screen.Draw()
- self._Screen.SwapAndShow()
- return
-
- def Draw(self):
- self.ClearCanvas()
- if self._BGpng != None:
- self._BGpng.NewCoord((self._Width-self._BGpng._Width)/2,self._Padding.y )
- self._BGpng.DrawTopLeft()
- self._Board._PosY = self._BGpng._Height+self._Padding.y
- else:
- self._Board._PosY = self._Padding.y
-
- self._Board.Draw()
-
- class HashErrPage(Page):
- _FootMsg = ["Nav","","","Cancel","Continue"]
- _BG ="pico8_md5_err"
-
- _Leader = None
- _Padding = pygame.Rect(0,20,0,0)
-
- def Init(self):
- self._PosX = self._Index*self._Screen._Width
- self._Width = self._Screen._Width
- self._Height = self._Screen._Height
-
- self._CanvasHWND = self._Screen._CanvasHWND
-
- self._BGpng = IconItem()
- self._BGpng._ImgSurf = MyIconPool._Icons[self._BG]
- self._BGpng._MyType = ICON_TYPES["STAT"]
- self._BGpng._Parent = self
- self._BGpng.Adjust(0,0,MyIconPool.Width(self._BG),MyIconPool.Height(self._BG),0)
-
- self._Board = Textbulletinboard()
-
- self._Board._PosX = 4
- self._Board._PosY = self._Height/2 - 35
- self._Board._Width= self._Width - 4*2
- self._Board._Height = 100
- self._Board._CanvasHWND = self._CanvasHWND
- self._Board._RowPitch =30
- self._Board._Align = "Center"
- self._Board.Init()
- if self._Leader!= None and self._Leader._ComPkgInfo != None:
- if "HashErrMsg" in self._Leader._ComPkgInfo:
- d = []
- for i, v in enumerate(self._Leader._ComPkgInfo["HashErrMsg"]):
- Color = None
- Font = None
- Bold = False
- Und = False
- Txt = ""
- parts = v.split("|")
- if len(parts) > 0:
- Txt = parts[0]
-
- if len(parts) == 2:
- if parts[1] != "None":
- Color = MySkinManager.GiveColor(parts[1])
- elif len(parts) == 3:
- if parts[1] != "None":
- Color = MySkinManager.GiveColor(parts[1])
- if parts[2] != "None":
- Font = MyLangManager.TrFont(parts[2])
- elif len(parts) == 4:
- if parts[1] != "None":
- Color = MySkinManager.GiveColor(parts[1])
- if parts[2] != "None":
- Font = MyLangManager.TrFont(parts[2])
- if parts[3] == "True":
- Bold = True
- elif len(parts) == 5:
- if parts[1] != "None":
- Color = MySkinManager.GiveColor(parts[1])
- if parts[2] != "None":
- Font = MyLangManager.TrFont(parts[2])
- if parts[3] == "True":
- Bold = True
- if parts[4] == "True":
- Und = True
-
- a = Text(Txt,Color,Font,Bold,Und)
- d = d + a.Words()
-
- self._Board.SetAndBlitText(d)
-
- else:
- a = Text("MD5 check Failed!\n",None,MyLangManager.TrFont("varela16"))
- b = Text("Do you want to continue?",None,MyLangManager.TrFont("varela16"))
- self._Board.SetAndBlitText(a.Words()+b.Words())
-
- def KeyDown(self,event):
- if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]:
- self.ReturnToUpLevelPage()
- self._Screen.Draw()
- self._Screen.SwapAndShow()
- return
-
- if event.key == CurKeys["B"]:
- self._Leader.InstallPackage(self._Screen)
- return
-
- def OnLoadCb(self):
- pass
-
- def Draw(self):
- self.ClearCanvas()
- if self._BGpng != None:
- self._BGpng.NewCoord((self._Width-self._BGpng._Width)/2,self._Padding.y)
- self._BGpng.DrawTopLeft()
- self._Board._PosY = self._BGpng._Height+self._Padding.y
- else:
- self._Board._PosY = self._Padding.y
-
- self._Board.Draw()
- class MyCommercialSoftwarePackage(object):
- _ComPkgInfo = None
- _Done = ""
- _InvokeDir = ""
-
- def __init__(self):
- pass
- def InstallPackage(self,main_screen):
- main_screen._MsgBox.SetText("Installing the package")
- main_screen._MsgBox.Draw()
- main_screen.SwapAndShow()
- json_config = self._ComPkgInfo
- cur_dir = os.getcwd()
-
- os.chdir(json_config["GameDir"])
- for i,v in enumerate(json_config["MD5"]):
- os.system("unzip -o %s" %v) ## auto overwrite
-
- if "Post-Up" in json_config:
- if FileExists(self._InvokeDir):
- os.chdir(self._InvokeDir)
-
- os.system(json_config["Post-Up"])
-
-
- os.chdir(cur_dir)
- pygame.time.delay(1000)
-
- main_screen._MsgBox.SetText("Package Installed")
- main_screen._MsgBox.Draw()
- main_screen.SwapAndShow()
- pygame.time.delay(500)
-
- pygame.event.post( pygame.event.Event(RESTARTUI, message=""))
-
- def VerifyPackage(self,main_screen):
- ## do unzip and check md5sum once
-
- main_screen._MsgBox.SetText("Verify the package")
- main_screen._MsgBox.Draw()
- main_screen.SwapAndShow()
- pygame.time.delay(400)
-
- Checked = False
-
- json_config = self._ComPkgInfo
- if json_config == None:
- return
-
- if "MD5" in json_config:
- for i,v in enumerate(json_config["MD5"]):
- print(i,v)
- if FileExists( os.path.join(json_config["GameDir"], v )):
- print( os.path.join(json_config["GameDir"],v ))
- out = commands.getstatusoutput("md5sum %s" % os.path.join(json_config["GameDir"],v))
- ret = out[1]
- ret = ret.split(" ")
- print(ret)
- if ret[0] == json_config["MD5"][v]:
- print("md5 is ok")
- Checked = True
-
- return Checked
-
- return Checked
-
- def Init(self,main_screen):
- self._Page1 = NotFoundPage()
- self._Page1._Name = "Not Found"
- self._Page1._Screen = main_screen
- self._Page1._Leader = self
- self._Page1.Init()
-
- self._Page2 = HashErrPage()
- self._Page2._Name = "Md5sum check failed"
- self._Page2._Screen = main_screen
- self._Page2._Leader = self
- self._Page2.Init()
-
-
- def API(self,main_screen):
- if main_screen !=None:
- if self._Done != "":
- main_screen._MsgBox.SetText("Starting")
- main_screen._MsgBox.Draw()
- main_screen.SwapAndShow()
- pygame.time.delay(300)
- ####
-
- pygame.event.post( pygame.event.Event(RUNEVT, message=self._Done))
- ####
- else:
- print(self._ComPkgInfo)
- if FileExists( os.path.join(self._ComPkgInfo["GameDir"],self._ComPkgInfo["InstallDir"] )) == False:
- main_screen.PushPage(self._Page1)
- main_screen.Draw()
- main_screen.SwapAndShow()
- else:
- if self.VerifyPackage(main_screen) == False:
- main_screen.PushPage(self._Page2)
- main_screen.Draw()
- main_screen.SwapAndShow()
- else:
- self.InstallPackage(main_screen)
-
|