33{
34 wxStopWatch sw;
35 wxProgressDialog wait(_("Connecting"), _("Connecting to ATP, please wait."), timeout, nullptr, wxPD_AUTO_HIDE | wxPD_SMOOTH | wxPD_CAN_ABORT);
36
37 while (true)
38 {
39 if (!wait.Update(sw.Time()))
40 return false;
41
42 Disconnect();
43
44#ifdef _WIN32
45
46
47 m_hATPReady = OpenEventW(SYNCHRONIZE, FALSE, ATP_EVENT);
48
49 if (m_hATPReady)
50 {
51
52 m_hPSPReady = OpenEventW(EVENT_MODIFY_STATE | SYNCHRONIZE, FALSE, PSP_EVENT);
53
54 if (m_hPSPReady)
55 {
56
57 m_hMapFile = OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, SHM_NAME);
58
59 if (m_hMapFile)
60 {
61 m_data =
static_cast<SharedData*
>(MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0));
62
63 if (m_data)
64 return true;
65 }
66 }
67 }
68
69#else
70
71
72 m_hATPReady = sem_open(ATP_EVENT, 0);
73
74 if (m_hATPReady != SEM_FAILED)
75 {
76
77 m_hPSPReady = sem_open(PSP_EVENT, 0);
78
79 if (m_hPSPReady != SEM_FAILED)
80 {
81
82 m_hMapFile = shm_open(SHM_NAME, O_RDWR, 0);
83
84 if (m_hMapFile >= 0)
85 {
86 m_data = nullptr;
87 struct stat st;
88 if (fstat(m_hMapFile, &st) == 0)
89 m_data =
static_cast<SharedData*
>(mmap(
nullptr, st.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, m_hMapFile, 0));
90
91 if (m_data != MAP_FAILED)
92 return true;
93
94 m_data = nullptr;
95 }
96 }
97 }
98
99#endif
100
101 Disconnect();
102
103 if (sw.Time() >= timeout)
104 return false;
105
106 wxMilliSleep(retryInterval);
107 wxTheApp->Yield();
108 }
109}