File: ddeconn.py

package info (click to toggle)
boa-constructor 0.3.0-3
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 8,188 kB
  • ctags: 8,857
  • sloc: python: 54,163; sh: 66; makefile: 36
file content (97 lines) | stat: -rw-r--r-- 2,809 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# DDE support for Boa
# Ripped from PythonWin

# Note DDE requires PythonWin

# Add this code snippet to Boa.py to turn Boa into a dde server
##try: 
##    import ddeconn
##    dde = ddeconn.DDEApp('BoaConstructor', startupModules,
##          'sys.boa_ide.openOrGotoModule(%s)')
##    if dde.done:
##        print 'Transfered arguments to running Boa, exiting.'
##        sys.exit()
##except ImportError: 
##    pass

from pywin.mfc import object
from dde import *
import traceback
import string

class DDESystemTopic(object.Object):
    def __init__(self, app):
        self.app = app
        object.Object.__init__(self, CreateServerSystemTopic())
    def Exec(self, data):
        try:
            self.app.OnDDECommand(data)
        except:
            # The DDE Execution failed.
            print "Error executing DDE command."
            traceback.print_exc()
            return 0

class DDEServer(object.Object):
    def __init__(self, app):
        self.app = app
        object.Object.__init__(self, CreateServer())
        self.topic = self.item = None

    def CreateSystemTopic(self):
        return DDESystemTopic(self.app)

    def Shutdown(self):
        self._obj_.Shutdown()
        self._obj_.Destroy()
        if self.topic is not None:
            self.topic.Destroy()
            self.topic = None
        if self.item is not None:
            self.item.Destroy()
            self.item = None

    def OnCreate(self):
        return 1

    def Status(self, msg):
        pass
        #print 'STATUS', msg

class DDEApp:
    def __init__(self, name, args, execStr):
        self.args = args
        self.svrName = name
        self.done = 0
        self.execStr = execStr
        self.InitDDE()

    def MakeExistingDDEConnection(self):
    # Use DDE to connect to an existing instance
    # Return None if no existing instance
        conv = CreateConversation(self.ddeServer)
        try:
            conv.ConnectTo(self.svrName, "System")
            return conv
        except error:
            return None

    def InitDDE(self):
        # Do all the magic DDE handling.
        self.ddeServer = DDEServer(self)
        self.ddeServer.Create(self.svrName, CBF_FAIL_SELFCONNECTIONS )
        try:
        # If there is an existing instance, pump the arguments to it
            dde = self.MakeExistingDDEConnection()
            if dde is not None and self.args:
                for arg in self.args:
                    dde.Exec(self.execStr%`arg`)
                self.done = 1
        except:
            print 'ERROR: There was an error during the DDE conversation.'
            traceback.print_exc()

    def OnDDECommand(self, data):
        import sys
        exec data