Rev 147 | Rev 164 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 147 | Rev 153 | ||
|---|---|---|---|
| Line 13... | Line 13... | ||
| 13 | 13 | ||
| 14 | 14 | ||
| 15 | // prototypes of local functions |
15 | // prototypes of local functions |
| 16 | static int CALLBACK DialogProc_ThisDialog (HWND hWnd, unsigned int message, WPARAM wParam, LPARAM lParam); |
16 | static int CALLBACK DialogProc_ThisDialog (HWND hWnd, unsigned int message, WPARAM wParam, LPARAM lParam); |
| 17 | static unsigned __int32 RetrieveActivationCode (wchar_t *candidate_email, wchar_t **failure_reason); |
17 | static unsigned __int32 RetrieveActivationCode (wchar_t *candidate_email, wchar_t **failure_reason); |
| 18 | static int recv_with_timeout (int socket_id, float timeout_in_seconds, char *outbuf, size_t outbuf_size, int flags); |
- | |
| 19 | 18 | ||
| 20 | 19 | ||
| 21 | void DialogBox_Registration (void) |
20 | void DialogBox_Registration (void) |
| 22 | { |
21 | { |
| 23 | // helper function to fire up the modal dialog box |
22 | // helper function to fire up the modal dialog box |
| Line 60... | Line 59... | ||
| 60 | SetWindowText (hWnd, LOCALIZE (L"Registration_Title")); |
59 | SetWindowText (hWnd, LOCALIZE (L"Registration_Title")); |
| 61 | 60 | ||
| 62 | // set the static texts |
61 | // set the static texts |
| 63 | Static_SetText (GetDlgItem (hWnd, STATICTEXT_REGISTRATION_QUESTION), LOCALIZE (L"Registration_Question")); |
62 | Static_SetText (GetDlgItem (hWnd, STATICTEXT_REGISTRATION_QUESTION), LOCALIZE (L"Registration_Question")); |
| 64 | Static_SetText (GetDlgItem (hWnd, STATICTEXT_REGISTRATION_INSTRUCTIONS), LOCALIZE (L"Registration_Instructions")); |
63 | Static_SetText (GetDlgItem (hWnd, STATICTEXT_REGISTRATION_INSTRUCTIONS), LOCALIZE (L"Registration_Instructions")); |
| - | 64 | // set email address font |
|
| 65 |
|
65 | SendMessage (GetDlgItem (hWnd, EDITBOX_REGISTRATION_EMAILADDRESS), WM_SETFONT, (WPARAM) GetStockObject (SYSTEM_FONT), 0); |
| 66 | if (options.registration.user_email[0] != 0) |
66 | if (options.registration.user_email[0] != 0) |
| 67 | SetDlgItemText (hWnd, EDITBOX_REGISTRATION_EMAILADDRESS, options.registration.user_email); |
67 | SetDlgItemText (hWnd, EDITBOX_REGISTRATION_EMAILADDRESS, options.registration.user_email); |
| 68 | else |
68 | else |
| 69 | SetDlgItemText (hWnd, EDITBOX_REGISTRATION_EMAILADDRESS, LOCALIZE (L"Registration_YourEmailHere")); |
69 | SetDlgItemText (hWnd, EDITBOX_REGISTRATION_EMAILADDRESS, LOCALIZE (L"Registration_YourEmailHere")); |
| 70 | SetWindowText (GetDlgItem (hWnd, BUTTON_VALIDATECODE), LOCALIZE (L"Registration_ValidateCode")); |
70 | SetWindowText (GetDlgItem (hWnd, BUTTON_VALIDATECODE), LOCALIZE (L"Registration_ValidateCode")); |
| Line 117... | Line 117... | ||
| 117 | // query the remote server for the code associated with this email. If it fails, ask why. |
117 | // query the remote server for the code associated with this email. If it fails, ask why. |
| 118 | candidate_code = RetrieveActivationCode (candidate_email, &failure_reason); |
118 | candidate_code = RetrieveActivationCode (candidate_email, &failure_reason); |
| 119 | 119 | ||
| 120 | // was there a problem retrieving the code ? |
120 | // was there a problem retrieving the code ? |
| 121 | if ((failure_reason != NULL) && (failure_reason[0] != 0)) |
121 | if ((failure_reason != NULL) && (failure_reason[0] != 0)) |
| 122 | MessageBox (hWnd, failure_reason, PROGRAM_NAME, MB_ICONERROR | MB_OK); // registration failed. Display an error and DON'T |
122 | MessageBox (hWnd, failure_reason, PROGRAM_NAME, MB_ICONERROR | MB_OK); // registration failed. Display an error and DON'T make the dialog box disappear |
| 123 | 123 | ||
| 124 | // else is the retrieved data correct ? |
124 | // else is the retrieved data correct ? |
| 125 | else if (IsRegistrationCorrect (candidate_email, candidate_code)) |
125 | else if (IsRegistrationCorrect (candidate_email, candidate_code)) |
| 126 | { |
126 | { |
| 127 | // if so, save activation email and activation code |
127 | // if so, save activation email and activation code |
| 128 | wcscpy_s (options.registration.user_email, WCHAR_SIZEOF (options.registration.user_email), candidate_email); |
128 | wcscpy_s (options.registration.user_email, WCHAR_SIZEOF (options.registration.user_email), candidate_email); |
| 129 | options.registration.activation_code = candidate_code; |
129 | options.registration.activation_code = candidate_code; |
| 130 | MessageBox (hWnd, LOCALIZE (L"Registration_ThankYou"), PROGRAM_NAME, MB_ICONINFORMATION | MB_OK); |
130 | MessageBox (hWnd, LOCALIZE (L"Registration_ThankYou"), PROGRAM_NAME, MB_ICONINFORMATION | MB_OK); |
| 131 | EndDialog (hWnd, 0); // then display a thank you dialog box and |
131 | EndDialog (hWnd, 0); // then display a thank you dialog box and make the dialog box disappear |
| 132 | } |
132 | } |
| 133 | 133 | ||
| 134 | // else the supplied data is wrong |
134 | // else the supplied data is wrong |
| 135 | else |
135 | else |
| 136 | { |
136 | { |
| 137 | swprintf_s (temp_string, WCHAR_SIZEOF (temp_string), LOCALIZE (L"Registration_Error"), AUTHOR_EMAIL); |
137 | swprintf_s (temp_string, WCHAR_SIZEOF (temp_string), LOCALIZE (L"Registration_Error"), AUTHOR_EMAIL); |
| 138 | MessageBox (hWnd, temp_string, PROGRAM_NAME, MB_ICONERROR | MB_OK); // wrong activation. Display an error and DON'T |
138 | MessageBox (hWnd, temp_string, PROGRAM_NAME, MB_ICONERROR | MB_OK); // wrong activation. Display an error and DON'T make the dialog box disappear |
| 139 | } |
139 | } |
| 140 | } |
140 | } |
| 141 | 141 | ||
| 142 | // else was it the PayPal button ? |
142 | // else was it the PayPal button ? |
| 143 | else if (wParam_loword == BUTTON_DONATE) |
143 | else if (wParam_loword == BUTTON_DONATE) |
| 144 | { |
144 | { |
| - | 145 | MessageBox (hWnd, LOCALIZE (L"Registration_DontForget"), PROGRAM_NAME, MB_ICONWARNING | MB_OK); // users need to be reminded that they MUST write their email in the activation form |
|
| - | 146 | ||
| 145 | if (wcscmp (languages[language_id].name, L"French") == 0) |
147 | if (wcscmp (languages[language_id].name, L"French") == 0) |
| 146 | ShellExecute (NULL, L"open", PAYPAL_URL_FR, NULL, NULL, SW_MAXIMIZE); // open PayPal in French in the default browser, maximized |
148 | ShellExecute (NULL, L"open", PAYPAL_URL_FR, NULL, NULL, SW_MAXIMIZE); // open PayPal in French in the default browser, maximized |
| 147 | else |
149 | else |
| 148 | ShellExecute (NULL, L"open", PAYPAL_URL_XX, NULL, NULL, SW_MAXIMIZE); // open PayPal in English (default) the default browser, maximized |
150 | ShellExecute (NULL, L"open", PAYPAL_URL_XX, NULL, NULL, SW_MAXIMIZE); // open PayPal in English (default) the default browser, maximized |
| 149 | } |
151 | } |
| Line 168... | Line 170... | ||
| 168 | static char ascii_email[128]; |
170 | static char ascii_email[128]; |
| 169 | 171 | ||
| 170 | struct sockaddr_in service; |
172 | struct sockaddr_in service; |
| 171 | struct hostent *hostinfo; |
173 | struct hostent *hostinfo; |
| 172 | char *data_start; |
174 | char *data_start; |
| 173 | WSADATA wsa_data; |
- | |
| 174 | int write_index; |
175 | int write_index; |
| 175 | int read_index; |
176 | int read_index; |
| 176 | int length; |
177 | int length; |
| 177 | SOCKET s; |
178 | SOCKET s; |
| 178 | 179 | ||
| 179 | // initialize |
180 | // initialize the network subsystem if required |
| 180 | if ( |
181 | if (!Network_Init ()) |
| 181 | { |
182 | { |
| 182 | *failure_reason = LOCALIZE (L"Registration_NetworkFailure"); |
183 | *failure_reason = LOCALIZE (L"Registration_NetworkFailure"); |
| 183 | return (0); // couldn't initialize WinSock, return an error condition |
184 | return (0); // couldn't initialize WinSock, return an error condition |
| 184 | } |
185 | } |
| 185 | 186 | ||
| Line 225... | Line 226... | ||
| 225 | return (0); // unable to send HTTP query, return an error condition |
226 | return (0); // unable to send HTTP query, return an error condition |
| 226 | } |
227 | } |
| 227 | 228 | ||
| 228 | // read the reply (10 seconds timeout) |
229 | // read the reply (10 seconds timeout) |
| 229 | http_buffer[0] = 0; |
230 | http_buffer[0] = 0; |
| 230 | read_index = |
231 | read_index = RecvWithTimeout (s, 10.0f, http_buffer, sizeof (http_buffer), 0); |
| 231 | if (read_index < 1) |
232 | if (read_index < 1) |
| 232 | { |
233 | { |
| 233 | *failure_reason = LOCALIZE (L"Registration_NetworkFailure"); |
234 | *failure_reason = LOCALIZE (L"Registration_NetworkFailure"); |
| 234 | return (0); // empty or erroneous HTTP reply, return an error condition |
235 | return (0); // empty or erroneous HTTP reply, return an error condition |
| 235 | } |
236 | } |
| 236 | 237 | ||
| 237 | closesocket (s); // finished communicating, close TCP socket |
238 | closesocket (s); // finished communicating, close TCP socket |
| 238 | WSACleanup (); // and clean up WinSock |
- | |
| 239 | 239 | ||
| 240 | // terminate recv buffer and see where the useful data starts |
240 | // terminate recv buffer and see where the useful data starts |
| 241 | http_buffer[read_index] = 0; |
241 | http_buffer[read_index] = 0; |
| 242 | //MessageBoxA (NULL, http_buffer, "HTTP response", MB_OK); |
242 | //MessageBoxA (NULL, http_buffer, "HTTP response", MB_OK); |
| 243 | if ((data_start = strstr (http_buffer, "Success=")) != NULL) |
243 | if ((data_start = strstr (http_buffer, "Success=")) != NULL) |
| Line 256... | Line 256... | ||
| 256 | return (0); // server returned an error, return an error condition |
256 | return (0); // server returned an error, return an error condition |
| 257 | } |
257 | } |
| 258 | 258 | ||
| 259 | *failure_reason = LOCALIZE (L"Registration_NetworkFailure"); // this should never happen |
259 | *failure_reason = LOCALIZE (L"Registration_NetworkFailure"); // this should never happen |
| 260 | return (0); // server returned an error, return an error condition |
260 | return (0); // server returned an error, return an error condition |
| 261 | } |
- | |
| 262 | - | ||
| 263 | - | ||
| 264 | static int recv_with_timeout (int socket_id, float timeout_in_seconds, char *outbuf, size_t outbuf_size, int flags) |
- | |
| 265 | { |
- | |
| 266 | unsigned long nonblocking_mode; |
- | |
| 267 | unsigned long msec_start; |
- | |
| 268 | float timediff; |
- | |
| 269 | int total_size; |
- | |
| 270 | int recv_size; |
- | |
| 271 | - | ||
| 272 | // make socket non blocking |
- | |
| 273 | nonblocking_mode = 1; |
- | |
| 274 | ioctlsocket (socket_id, FIONBIO, &nonblocking_mode); |
- | |
| 275 | - | ||
| 276 | // loop endlessly, noting the time at which we start |
- | |
| 277 | msec_start = GetTickCount (); |
- | |
| 278 | total_size = 0; |
- | |
| 279 | for (;;) |
- | |
| 280 | { |
- | |
| 281 | // see how much time elapsed since the last time we received data |
- | |
| 282 | timediff = (GetTickCount () - msec_start) / 1000.0f; |
- | |
| 283 | if (timediff > timeout_in_seconds) |
- | |
| 284 | break; // if we've waited long enough, give up |
- | |
| 285 | - | ||
| 286 | // see if we have something to read from the socket |
- | |
| 287 | recv_size = recv (socket_id, &outbuf[total_size], outbuf_size - total_size, flags); |
- | |
| 288 | if (recv_size == 0) |
- | |
| 289 | break; // on TCP disconnection, give up too |
- | |
| 290 | else if (recv_size < 0) |
- | |
| 291 | { |
- | |
| 292 | Sleep (100); // if nothing was received then we want to wait a little before trying again, 0.1 seconds |
- | |
| 293 | continue; |
- | |
| 294 | } |
- | |
| 295 | - | ||
| 296 | total_size += recv_size; // increase the received bytes count |
- | |
| 297 | outbuf[total_size] = 0; // terminate outbuf ourselves |
- | |
| 298 | if (total_size == outbuf_size) |
- | |
| 299 | break; // if the output buffer is full, give up |
- | |
| 300 | msec_start = GetTickCount (); // and remember when we last received data (i.e. now) |
- | |
| 301 | } |
- | |
| 302 | - | ||
| 303 | return (total_size); // and return the number of bytes received |
- | |
| 304 | } |
261 | } |