PK ½†G4xE‹@)@) SharedVmd.pyUT DèCDèCUxxæd#!/usr/bin/python2.3 import os import os.path import sys import socket import threading import time import select import logging import getopt import tempfile if sys.platform == "darwin": import pyGlobus.ioc from AccessGrid import Platform from wxPython.wx import * from AccessGrid import Log from AccessGrid.SharedAppClient import SharedAppClient from AccessGrid.Platform.Config import UserConfig from AccessGrid.ClientProfile import ClientProfile from AccessGrid import DataStoreClient, DataStoreClientUI from AccessGrid import icons from AccessGrid import Toolkit from AccessGrid.Platform.ProcessManager import ProcessManager NEW_MOL = 307 MAX_CONN = 20 TOK_SIZE = 4 TMP_SIZE = 32 MAT_SIZE = 64 STR_SIZE = 255 # Set the path to the vmd executable VMD_PATH = "vmd_AG" SOCK_NAME = "/tmp/ag_vmd_socket" class SharedVmd: def __init__(self, appUrl, venueUrl, name): self.pm = ProcessManager() self.pm.StartProcess("rm", ["-f", SOCK_NAME]) self.InitSharedApp(appUrl, venueUrl, name) self.RegisterCallbackEvent() self.leading = 0 self.InitVmdCom() def InitSharedApp(self, appUrl, venueUrl, name): self.sharedAppClient = SharedAppClient(name) self.userName = "Unknown" self.log = self.sharedAppClient.InitLogging(0, None) try: clientProfileFile = os.path.join(UserConfig.instance().GetConfigDir(), "profile") clientProfile = ClientProfile(clientProfileFile) if not clientProfile.IsDefault(): self.userName = clientProfile.GetName() except: log.exception("Could not load profile") clientProfile = None self.datastore = DataStoreClient.GetVenueDataStore(venueUrl) self.sharedAppClient.Join(appUrl, clientProfile) self.publicId = self.sharedAppClient.GetPublicId() def RegisterCallbackEvent(self): self.sharedAppClient.RegisterEventCallback("newcomm", self.TransferCommand) self.sharedAppClient.RegisterEventCallback("TakeLead", self.RemoteTakeLead) self.sharedAppClient.RegisterEventCallback("RelinquishLead", self.RemoteRelinquishLead) self.sharedAppClient.RegisterEventCallback("Load", self.OnRemoteLoad) def TransferCommand(self, event): (senderId, data) = event.data if not senderId == self.publicId: self.rm.SendCommand(data) def RemoteTakeLead(self, event): if event.data[0] == self.publicId: return leader = event.data[1] if self.leading: self.RelinquishLead(0) self.gui.SetLeaderName(leader) def RemoteRelinquishLead(self, event): if event.data[0] == self.publicId: return self.gui.SetLeaderName("") def OnGUIChangeLead(self): if self.leading: self.RelinquishLead(1) self.gui.SetLeaderName("") else: self.TakeLead(1) self.gui.SetLeaderName(self.userName) def OnGUILoadFile(self, filename): if self.leading: self.LoadFile(filename) self.sharedAppClient.SendEvent("Load", (self.publicId, filename)) self.sharedAppClient.SetData("filename", (self.publicId, filename)) def LoadFile(self, filename): base, suffix = os.path.splitext(filename) local = tempfile.mktemp(suffix) log.info( "Loading file %s from datastore %s to %s", filename, self.datastore, local) self.datastore.Download(filename, local) if os.path.isfile(local): self.rm.loadFile(local) else: log.info( "Can't load file %s", local) def OnRemoteLoad(self, event): if event.data[0] == self.publicId: return f = event.data[1] self.LoadFile(f) def StartVmd(self): self.pm.StartProcess(VMD_PATH, []) def InitVmdCom(self): self.rm = VmdComm(self) def ReceiveCommand(self, cmd): if self.leading: self.sharedAppClient.SendEvent("newcomm", (self.publicId, cmd)) def Shutdown(self): if self.leading: self.RelinquishLead(1) self.leading = 0 self.rm.VmdSocket.close() self.sendQuit() self.pm.StartProcess("rm", ["-f", SOCK_NAME]) self.pm.TerminateAllProcesses() def sendQuit(self): pipe = os.popen("wish", "w") pipe.write("send vmd_LINUX exit\n") pipe.write("exit\n") pipe.flush() pipe.close() def SetGUI(self, gui): self.gui = gui def SyncLeadState(self): leader = self.sharedAppClient.GetData("leader") if leader: self.gui.SetLeaderName(leader) def TakeLead(self, notify): self.leading = 1 self.gui.SetLead(self.leading) if notify: self.sharedAppClient.SetData("leader", self.userName) self.sharedAppClient.SendEvent("TakeLead", [self.publicId, self.userName]) def RelinquishLead(self, notify): self.leading = 0 self.gui.SetLead(self.leading) if notify: self.sharedAppClient.SetData("leader", "") self.sharedAppClient.SendEvent("RelinquishLead", [self.publicId, self.userName]) class VmdFrame(wxFrame): FILE_EXIT = wxNewId() FILE_OPEN = wxNewId() def __init__(self, parent, app): wxFrame.__init__(self, parent, -1, "Shared Vmd", size = wxSize(200,100)) self.parent = parent self.app = app self.panel = VmdPanel(self, -1, app) menubar = wxMenuBar() fileMenu = wxMenu() fileMenu.Append(self.FILE_OPEN,"&Open...", "Open file from venue") fileMenu.Append(self.FILE_EXIT,"&Exit", "Exit SharedVmd") menubar.Append(fileMenu, "&File") self.SetMenuBar(menubar) EVT_MENU(self, self.FILE_OPEN, self.OnLoadFile) EVT_MENU(self, self.FILE_EXIT, self.OnClose) EVT_CLOSE(self, self.OnClose) def OnClose(self, event): self.app.Shutdown() log.info("Close down") self.Destroy() def OnLoadFile(self, event): self.panel.OnLoadFile(event) class VmdPanel(wxPanel): def __init__(self, parent, id, app): wxPanel.__init__(self, parent, id) self.app = app self.sizer = wxBoxSizer(wxVERTICAL) self.leaderText = wxStaticText(self, -1, "Leader: ") self.sizer.Add(self.leaderText, 0, wxEXPAND|wxALL, 4) self.leadControlButton = wxButton(self, -1, "Take lead") self.sizer.Add(self.leadControlButton, 0, wxEXPAND|wxALL, 0) EVT_BUTTON(self, self.leadControlButton.GetId(), self.OnChangeLead) self.SetSizer(self.sizer) self.SetAutoLayout(1) self.Fit() self.SetLead(self.app.leading) def OnChangeLead(self, event): self.app.OnGUIChangeLead() def SetLeaderName(self, name): self.leaderText.SetLabel("Leader: " + name) def SetLead(self, amLeading): if amLeading: self.leadControlButton.SetLabel("Relinquish Lead") else: self.leadControlButton.SetLabel("Take Lead") def OnLoadFile(self, event): self.app.datastore.LoadData(); chooser = DataStoreClientUI.DataStoreFileChooser(self.app.datastore, message = "Pick a molecule file") f = chooser.run() if f is None: return self.app.OnGUILoadFile(f) class VmdComm: def __init__(self, parent): self.parent = parent self.VmdSocket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.binded = 0 self.VmdThread = threading.Thread(target=self.ListenForVmd, args=(self, self.parent)) self.VmdThread.setDaemon(1) self.VmdThread.start() def loadFile(self, fileName): #self.SendCommand(str(NEW_MOL)) #self.SendCommand(fileName) pipe = os.popen("wish", "w") pipe.write("send vmd_LINUX mol new " + fileName + "\n") pipe.write("exit\n") pipe.flush() pipe.close() def SendCommand(self, command): print("send something") if self.binded == 1: sent = self.conn.send(command, 0) if sent == 0: log.exception("socket connection broken") print("pb..."); else: print("command sent to Vmd") def ListenForVmd(self, parent, Parent): while not self.binded: try: parent.VmdSocket.bind(SOCK_NAME) self.binded = 1 except: log.exception("Cannot bind socket") time.sleep(0.3) print("binded"); parent.VmdSocket.listen(MAX_CONN) threading.Thread(target=self.newThread, args=(parent, Parent)).start() def newThread(self, parent, Parent): self.conn, self.addr = parent.VmdSocket.accept() print("connecte") self.Parent = Parent self.exit = 0 while not self.exit: token = self.conn.recv(TOK_SIZE, 0) if token is not None or token != "": self.Parent.ReceiveCommand(token) if token >= str(200) and token < str(300): self.recvMat() elif token >= str(300) and token < str(400): self.recvStr() elif token >= str(400): self.recvTmp() else: self.exit = 1 self.conn.close() def recvTmp(self): print("Check for tmp") rec = self.conn.recv(TMP_SIZE, 0) if rec is not None or rec != "": self.Parent.ReceiveCommand(rec) else: self.exit = 1 def recvMat(self): print("check for mat") rec = self.conn.recv(MAT_SIZE, 0) if rec is not None or rec != "": self.Parent.ReceiveCommand(rec) else: self.exit = 1 def recvStr(self): print("Check for str") rec = self.conn.recv(STR_SIZE, 0) if rec is not None or rec != "": self.Parent.ReceiveCommad(str) else: self.exit = 1 if __name__ == "__main__": if len(sys.argv) != 3: print "Usage: %s venueURL appURL" % (sys.argv[0]) sys.exit(1) name = "SharedVmd" wxapp = wxPySimpleApp() venueURL = sys.argv[1] appURL = sys.argv[2] app = Toolkit.CmdlineApplication.instance() app.Initialize(name) log = app.GetLog() VmdApp = SharedVmd(appURL, venueURL, name) guiFrame = VmdFrame(None, VmdApp) VmdApp.SetGUI(guiFrame.panel) VmdApp.SyncLeadState() guiFrame.Show(1) wxapp.SetTopWindow(guiFrame) VmdApp.StartVmd() wxapp.MainLoop() os._exit(0) PK 1vG4Ör*y¶¶ SharedVmd.appUT Ý&èCZ3èCUxxæd[application] name = Shared Vmd mimetype = application/x-ag-shared-vmd extension = sharedvmd files = SharedVmd.py [commands] Open = %(python)s SharedVmd.py %(venueUrl)s %(appUrl)s PK ½†G4xE‹@)@) ¤SharedVmd.pyUTDèCUxPK 1vG4Ör*y¶¶ ¤)SharedVmd.appUTÝ&èCUxPKu*