-
Notifications
You must be signed in to change notification settings - Fork 0
/
StdRendezvous.h
104 lines (67 loc) · 3.11 KB
/
StdRendezvous.h
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
98
99
100
101
102
103
104
#ifndef STDRENDEZVOUS_H
#define STDRENDEZVOUS_H
/** @file */
#ifdef QT_GUI_LIB
#include "Qt/QtLocalSocket.h"
#endif /* QT_GUI_LIB */
/* Forward declaration to reduce the # of includes required */
class RApplication;
/**
* Mixin class for indicating when a rendezvous has been received.
* Client code that is interested in receiving callbacks when a rendezvous has been received
* from another process should derive from this class and implement the MesageReceived()
* method. It should then register an instance of the class with the RRendezvous class
* using RRendezvous::SetObserver().
*/
class MRendezvousObserver
{
public:
virtual void RendezvousReceived(const unsigned char *a_pcucData, TInt a_iDataSize) = 0;
};
/**
* A class that allows a program to rendezvous with another instance of itself.
* This class will allow a program to make a rendezvous either with another instance of itself,
* or with a completely different program. This is useful in situations such as when it is desired
* to have only a single instance of a program program running at any given time. If a second
* instance is started, it will not open its window, but will instead rendezvous with the already
* running instance, telling it to bring itself to the front.
*
* An example of this behaviour is executing a text editor with a filename argument on the
* command line. This causes an already running instance of the text editor to load the given
* filename and to bring itself to the front. Meanwhile, the second instance of the text editor
* will quietly exit, making it seem to the user that the two editors have "merged" into one. As
* well as for this purpose, the class can be used any time that one program wants to send a
* message to another application that is running in another address space (as long as the target
* application also has an instance of the RRendezvous class embedded in it).
*/
#ifdef QT_GUI_LIB
class RRendezvous : public MLocalSocketObserver
#else /* ! QT_GUI_LIB */
class RRendezvous
#endif /* ! QT_GUI_LIB */
{
private:
char *m_pcName; /**< Name of this rendezvous port */
MRendezvousObserver *m_poObserver; /**< Pointer to client to notify when rendezvous received */
#ifdef __amigaos__
struct MsgPort *m_poMsgPort; /**< Port used by the server for rendezvous */
TBool m_bPortAdded; /**< ETrue if the port was added to the public message port list */
#elif defined(QT_GUI_LIB)
RApplication *m_poApplication; /**< Pointer to the parent application under which the program is running */
RLocalSocket m_oLocalSocket; /**< Local socket for use in communicating between processes */
#endif /* QT_GUI_LIB */
public:
RRendezvous();
~RRendezvous();
TInt open(RApplication *a_poApplication, const char *a_pccName);
void close();
#ifdef __amigaos__
struct MsgPort *GetMessagePort();
ULONG GetSignal();
#endif /* __amigaos__ */
TBool Rendezvous(const unsigned char *a_pcucData, TInt a_iDataSize);
void MessageReceived(const unsigned char *a_pcucData, TInt a_iDataSize);
void SetObserver(MRendezvousObserver *a_poObserver);
};
extern RRendezvous g_oRendezvous;
#endif /* ! STDRENDEZVOUS_H */