Subversion Repositories Games.Chess Giants

Rev

Rev 179 | Rev 186 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 179 Rev 185
Line 6... Line 6...
6
// dialog template
6
// dialog template
7
#define THIS_DIALOG DIALOG_REGISTER
7
#define THIS_DIALOG DIALOG_REGISTER
8
 
8
 
9
 
9
 
10
// global variables used in this module only
10
// global variables used in this module only
11
static wchar_t candidate_email[128] = L"";
11
static wchar_t transaction_uuid[128] = L"";
12
static unsigned __int32 candidate_code = 0; // 32 bits
-
 
13
static bool was_donatebutton_clicked = false;
12
static bool was_donatebutton_clicked = false;
-
 
13
static HWND hThisDialogWnd = NULL;
14
 
14
 
15
 
15
 
16
// prototypes of local functions
16
// prototypes of local functions
-
 
17
static void RegistrationCheckThread (void *thread_parms);
17
static int CALLBACK DialogProc_ThisDialog (HWND hWnd, unsigned int message, WPARAM wParam, LPARAM lParam);
18
static int CALLBACK DialogProc_ThisDialog (HWND hWnd, unsigned int message, WPARAM wParam, LPARAM lParam);
18
static unsigned __int32 RetrieveActivationCode (wchar_t *candidate_email, wchar_t **failure_reason);
19
static bool RetrieveActivationCode (wchar_t *candidate_email_or_uuid, unsigned int *returned_code, wchar_t **returned_email, wchar_t **failure_reason);
19
 
20
 
20
 
21
 
21
void DialogBox_Registration (void)
22
void DialogBox_Registration (void)
22
{
23
{
23
   // helper function to fire up the modal dialog box
24
   // helper function to fire up the modal dialog box
-
 
25
 
-
 
26
   // first, test if our server is reachable. We DO NOT want the user to donate if our server isn't here to receive the donation!
-
 
27
   if (!RetrieveActivationCode (NULL, NULL, NULL, NULL))
-
 
28
      return; // if it's not, don't display anything
-
 
29
 
-
 
30
   // generate a random transaction UUID for this session
-
 
31
   srand ((unsigned int) time (NULL));
-
 
32
   swprintf_s (transaction_uuid, sizeof (transaction_uuid), L"%04x%04x-%04x-%04x-%04x-%04x%04x%04x", rand (), rand (), rand (), (rand () & 0x0fff) | 0x4000, (rand () & 0x3fff) | 0x8000, rand (), rand (), rand ());
-
 
33
 
-
 
34
   // start a new thread that will ask every 10 seconds if our transaction ID has donated
-
 
35
   _beginthread (RegistrationCheckThread, 0, NULL); // fire up the thread
24
 
36
 
25
   // display the dialog box (set the parent to be the desktop)
37
   // display the dialog box (set the parent to be the desktop)
26
   DialogBox (hAppInstance, MAKEINTRESOURCE (THIS_DIALOG), NULL, DialogProc_ThisDialog);
38
   DialogBox (hAppInstance, MAKEINTRESOURCE (THIS_DIALOG), NULL, DialogProc_ThisDialog);
27
 
39
 
28
   return; // finished processing this dialog
40
   return; // finished processing this dialog
-
 
41
}
-
 
42
 
-
 
43
 
-
 
44
static void RegistrationCheckThread (void *thread_parms)
-
 
45
{
-
 
46
   // thread entrypoint for the thread that periodically checks whether transaction_uuid has just donated
-
 
47
 
-
 
48
   unsigned int returned_code; // 32 bits minimum
-
 
49
   wchar_t *returned_email;
-
 
50
 
-
 
51
   // loop endlessly
-
 
52
   for (;;)
-
 
53
   {
-
 
54
      // query the remote server for the code associated with this transaction UUID
-
 
55
      if (RetrieveActivationCode (transaction_uuid, &returned_code, &returned_email, NULL) && IsRegistrationCorrect (returned_email, returned_code))
-
 
56
         break; // stop looping as soon as we get correct values
-
 
57
 
-
 
58
      Sleep (10 * 1000); // next check in 10 seconds
-
 
59
   }
-
 
60
 
-
 
61
   // the user just registered, save activation email and activation code
-
 
62
   wcscpy_s (options.registration.user_email, WCHAR_SIZEOF (options.registration.user_email), returned_email);
-
 
63
   options.registration.activation_code = returned_code;
-
 
64
 
-
 
65
   if (IsWindow (hThisDialogWnd))
-
 
66
      ShowWindow (hThisDialogWnd, SW_HIDE); // make the dialog box disappear
-
 
67
   MessageBox (NULL, LOCALIZE (L"Registration_ThankYou"), PROGRAM_NAME, MB_ICONINFORMATION | MB_OK); // display a "thank you" message
-
 
68
   was_donatebutton_clicked = false; // prevent the reminder dialog box to open
-
 
69
   if (IsWindow (hThisDialogWnd))
-
 
70
      PostMessage (hThisDialogWnd, WM_CLOSE, 0, 0); // then close the dialog box
-
 
71
 
-
 
72
   return; // _endthread() implied
29
}
73
}
30
 
74
 
31
 
75
 
32
static int CALLBACK DialogProc_ThisDialog (HWND hWnd, unsigned int message, WPARAM wParam, LPARAM lParam)
76
static int CALLBACK DialogProc_ThisDialog (HWND hWnd, unsigned int message, WPARAM wParam, LPARAM lParam)
33
{
77
{
Line 35... Line 79...
35
 
79
 
36
   static wchar_t temp_string[1024];
80
   static wchar_t temp_string[1024];
37
 
81
 
38
   unsigned short wParam_hiword;
82
   unsigned short wParam_hiword;
39
   unsigned short wParam_loword;
83
   unsigned short wParam_loword;
-
 
84
   unsigned int returned_code; // 32 bits minimum
40
   wchar_t *failure_reason;
85
   wchar_t *failure_reason;
41
   int write_index;
86
   int write_index;
42
   int read_index;
87
   int read_index;
43
   int length;
88
   int length;
44
 
89
 
Line 47... Line 92...
47
   wParam_loword = LOWORD (wParam);
92
   wParam_loword = LOWORD (wParam);
48
 
93
 
49
   // have we just fired up this window ?
94
   // have we just fired up this window ?
50
   if (message == WM_INITDIALOG)
95
   if (message == WM_INITDIALOG)
51
   {
96
   {
-
 
97
      hThisDialogWnd = hWnd; // save the dialog handle
-
 
98
 
52
      // center the window
99
      // center the window
53
      CenterWindow (hWnd, hMainWnd);
100
      CenterWindow (hWnd, hMainWnd);
54
 
101
 
55
      // set dialog icons (small one for title bar & big one for task manager)
102
      // set dialog icons (small one for title bar & big one for task manager)
56
      SendMessage (hWnd, WM_SETICON, ICON_SMALL, (LPARAM) LoadIcon (hAppInstance, MAKEINTRESOURCE (ICON_MAIN)));
103
      SendMessage (hWnd, WM_SETICON, ICON_SMALL, (LPARAM) LoadIcon (hAppInstance, MAKEINTRESOURCE (ICON_MAIN)));
Line 91... Line 138...
91
         was_donatebutton_clicked = false; // once is enough
138
         was_donatebutton_clicked = false; // once is enough
92
         return (true); // prevent window close this time
139
         return (true); // prevent window close this time
93
      }
140
      }
94
      else
141
      else
95
         EndDialog (hWnd, 0); // close the dialog box
142
         EndDialog (hWnd, 0); // close the dialog box
-
 
143
 
-
 
144
      hThisDialogWnd = NULL; // this window is about to no longer have a handle, so remember it
96
   }
145
   }
97
 
146
 
98
   // else did we take action on one of the controls ?
147
   // else did we take action on one of the controls ?
99
   else if (message == WM_COMMAND)
148
   else if (message == WM_COMMAND)
100
   {
149
   {
Line 104... Line 153...
104
 
153
 
105
      // else did the user enter something in the edit boxes ?
154
      // else did the user enter something in the edit boxes ?
106
      else if (wParam_hiword == EN_CHANGE)
155
      else if (wParam_hiword == EN_CHANGE)
107
      {
156
      {
108
         // enable the validation button only if the PayPal email field has data
157
         // enable the validation button only if the PayPal email field has data
109
         GetDlgItemText (hWnd, EDITBOX_REGISTRATION_EMAILADDRESS, candidate_email, WCHAR_SIZEOF (candidate_email));
158
         GetDlgItemText (hWnd, EDITBOX_REGISTRATION_EMAILADDRESS, temp_string, WCHAR_SIZEOF (temp_string));
110
 
159
 
111
         // strip spaces and unprintable characters from candidate email, and bring it lowercase
160
         // strip spaces and unprintable characters from candidate email, and bring it lowercase
112
         length = wcslen (candidate_email);
161
         length = wcslen (temp_string);
113
         write_index = 0;
162
         write_index = 0;
114
         for (read_index = 0; read_index < length; read_index++)
163
         for (read_index = 0; read_index < length; read_index++)
115
            if (!iswspace (candidate_email[read_index]))
164
            if (!iswspace (temp_string[read_index]))
116
            {
165
            {
117
               candidate_email[write_index] = tolower (candidate_email[read_index]); // force lowercase
166
               temp_string[write_index] = tolower (temp_string[read_index]); // force lowercase
118
               write_index++; // keep only valid signs and discard spaces
167
               write_index++; // keep only valid signs and discard spaces
119
            }
168
            }
120
         candidate_email[write_index] = 0; // ensure string is correctly terminated
169
         temp_string[write_index] = 0; // ensure string is correctly terminated
121
 
170
 
122
         EnableWindow (GetDlgItem (hWnd, BUTTON_VALIDATECODE), ((candidate_email[0] != 0) && (wcslen (candidate_email) > 5) && (wcscmp (candidate_email, LOCALIZE (L"Registration_YourEmailHere")) != 0)
171
         EnableWindow (GetDlgItem (hWnd, BUTTON_VALIDATECODE), ((temp_string[0] != 0) && (wcslen (temp_string) > 5) && (wcscmp (temp_string, LOCALIZE (L"Registration_YourEmailHere")) != 0)
123
                                                                && (wcschr (candidate_email, L'@') != NULL) && (wcschr (candidate_email, L'.') != NULL)));
172
                                                                && (wcschr (temp_string, L'@') != NULL) && (wcschr (temp_string, L'.') != NULL)));
124
      }
173
      }
125
 
174
 
126
      // else was it the validation button ?
175
      // else was it the validation button ?
127
      else if (wParam_loword == BUTTON_VALIDATECODE)
176
      else if (wParam_loword == BUTTON_VALIDATECODE)
128
      {
177
      {
129
         // query the remote server for the code associated with this email. If it fails, ask why.
178
         // enable the validation button only if the PayPal email field has data
130
         candidate_code = RetrieveActivationCode (candidate_email, &failure_reason);
179
         GetDlgItemText (hWnd, EDITBOX_REGISTRATION_EMAILADDRESS, temp_string, WCHAR_SIZEOF (temp_string));
131
 
180
 
-
 
181
         // query the remote server for the code associated with this email. If it fails, ask why.
132
         // was there a problem retrieving the code ?
182
         if (!RetrieveActivationCode (temp_string, &returned_code, NULL, &failure_reason)
133
         if ((failure_reason != NULL) && (failure_reason[0] != 0))
183
             || ((failure_reason != NULL) && (failure_reason[0] != 0)))
134
            MessageBox (hWnd, failure_reason, PROGRAM_NAME, MB_ICONERROR | MB_OK); // registration failed. Display an error and DON'T make the dialog box disappear
184
            MessageBox (hWnd, failure_reason, PROGRAM_NAME, MB_ICONERROR | MB_OK); // registration failed. Display an error and DON'T make the dialog box disappear
135
 
185
 
136
         // else is the retrieved data correct ?
186
         // else is the retrieved data correct ?
137
         else if (IsRegistrationCorrect (candidate_email, candidate_code))
187
         else if (IsRegistrationCorrect (temp_string, returned_code))
138
         {
188
         {
139
            // if so, save activation email and activation code
189
            // if so, save activation email and activation code
140
            wcscpy_s (options.registration.user_email, WCHAR_SIZEOF (options.registration.user_email), candidate_email);
190
            wcscpy_s (options.registration.user_email, WCHAR_SIZEOF (options.registration.user_email), temp_string);
141
            options.registration.activation_code = candidate_code;
191
            options.registration.activation_code = returned_code;
142
            MessageBox (hWnd, LOCALIZE (L"Registration_ThankYou"), PROGRAM_NAME, MB_ICONINFORMATION | MB_OK);
192
            MessageBox (hWnd, LOCALIZE (L"Registration_ThankYou"), PROGRAM_NAME, MB_ICONINFORMATION | MB_OK);
143
            EndDialog (hWnd, 0); // then display a thank you dialog box and make the dialog box disappear
193
            EndDialog (hWnd, 0); // then display a thank you dialog box and make the dialog box disappear
144
         }
194
         }
145
 
195
 
146
         // else the supplied data is wrong
196
         // else the supplied data is wrong
Line 155... Line 205...
155
      else if (wParam_loword == BUTTON_DONATE)
205
      else if (wParam_loword == BUTTON_DONATE)
156
      {
206
      {
157
         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
207
         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
158
 
208
 
159
         if (wcscmp (languages[language_id].name, L"French") == 0)
209
         if (wcscmp (languages[language_id].name, L"French") == 0)
160
            ShellExecute (NULL, L"open", PAYPAL_URL_FR, NULL, NULL, SW_MAXIMIZE); // open PayPal in French in the default browser, maximized
210
            wcscpy_s (temp_string, sizeof (temp_string), PAYPAL_URL_FR); // select the French PayPal page
161
         else
211
         else
162
            ShellExecute (NULL, L"open", PAYPAL_URL_XX, NULL, NULL, SW_MAXIMIZE); // open PayPal in English (default) the default browser, maximized
212
            wcscpy_s (temp_string, sizeof (temp_string), PAYPAL_URL_XX); // select the international (English) PayPal page
-
 
213
         wcscat_s (temp_string, sizeof (temp_string), transaction_uuid); // in all cases, append the transaction UUID that our server generated for us
163
 
214
 
-
 
215
         ShellExecute (NULL, L"open", temp_string, NULL, NULL, SW_MAXIMIZE); // open PayPal in the default browser, maximized
164
         was_donatebutton_clicked = true; // remember the user clicked the Donate button
216
         was_donatebutton_clicked = true; // remember the user clicked the Donate button
165
      }
217
      }
166
 
218
 
167
      // else was it the status bar hyperlink ?
219
      // else was it the status bar hyperlink ?
168
      else if (wParam_loword == STATICTEXT_REGISTRATION_STATUSBAR)
220
      else if (wParam_loword == STATICTEXT_REGISTRATION_STATUSBAR)
Line 172... Line 224...
172
   // call the default dialog message processing function to keep things going
224
   // call the default dialog message processing function to keep things going
173
   return (false);
225
   return (false);
174
}
226
}
175
 
227
 
176
 
228
 
177
static unsigned __int32 RetrieveActivationCode (wchar_t *candidate_email, wchar_t **failure_reason)
229
static bool RetrieveActivationCode (wchar_t *candidate_email_or_uuid, unsigned int *returned_code, wchar_t **returned_email, wchar_t **failure_reason)
178
{
230
{
179
   // this function queries the remote server for registration status. If OK, the received code is returned.
231
   // this function queries the remote server for registration status. If OK, the function returns TRUE and
-
 
232
   // the code and email are returned in the returned_code and returned_email pointers, and failure_reason
180
   // On error, 0 is returned and error_string points to the cause of the error (as reported by the server)
233
   // is set to point to a NULL string. On error, FALSE is returned and failure_reason points to the cause
-
 
234
   // of the error (localized). If candidate_email_or_uuid is a NULL string, only a server reachability test
-
 
235
   // is performed.
-
 
236
 
-
 
237
   #define REGISTRATION_HOST "pmbaty.com"
181
   // which is stored in a static buffer in this very function.
238
   #define REGISTRATION_SCRIPT "/chess/whatsmycode.php"
182
 
239
 
183
   static char http_buffer[1024]; // used both for request and reply
240
   static char http_buffer[1024]; // used both for request and reply
-
 
241
   static char ascii_email_or_uuid[128];
184
   static char ascii_email[128];
242
   static wchar_t wide_email[128];
185
 
243
 
186
   struct sockaddr_in service;
244
   struct sockaddr_in service;
187
   struct hostent *hostinfo;
245
   struct hostent *hostinfo;
188
   char *data_start;
246
   char *data_start;
189
   int write_index;
247
   int write_index;
190
   int read_index;
248
   int read_index;
191
   int length;
249
   int length;
192
   SOCKET s;
250
   SOCKET s;
193
 
251
 
194
   // get our distribution server's IP address from the host name
252
   // get our distribution server's IP address from the host name
195
   hostinfo = gethostbyname ("pmbaty.com");
253
   hostinfo = gethostbyname (REGISTRATION_HOST);
196
   if (hostinfo == NULL)
254
   if (hostinfo == NULL)
197
   {
255
   {
-
 
256
      if (failure_reason != NULL)
198
      *failure_reason = LOCALIZE (L"Registration_NetworkFailure");
257
         *failure_reason = LOCALIZE (L"Registration_NetworkFailure");
199
      return (0); // couldn't resolve hostname, return an error condition
258
      return (false); // couldn't resolve hostname, return an error condition
200
   }
259
   }
201
 
260
 
202
   // fill in the sockaddr server structure with the server hostinfo data
261
   // fill in the sockaddr server structure with the server hostinfo data
203
   service.sin_family = AF_INET;
262
   service.sin_family = AF_INET;
204
   service.sin_addr.s_addr = inet_addr (inet_ntoa (*(struct in_addr *) hostinfo->h_addr_list[0]));
263
   service.sin_addr.s_addr = inet_addr (inet_ntoa (*(struct in_addr *) hostinfo->h_addr_list[0]));
205
   service.sin_port = htons (80); // connect to webserver there (port 80)
264
   service.sin_port = htons (80); // connect to webserver there (port 80)
206
 
265
 
207
   // create our socket
266
   // create our socket
208
   if ((s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
267
   if ((s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
209
   {
268
   {
-
 
269
      if (failure_reason != NULL)
210
      *failure_reason = LOCALIZE (L"Registration_NetworkFailure");
270
         *failure_reason = LOCALIZE (L"Registration_NetworkFailure");
211
      return (0); // couldn't create socket, return an error condition
271
      return (0); // couldn't create socket, return an error condition
212
   }
272
   }
213
 
273
 
214
   // connect to the distributor's webserver using that socket
274
   // connect to the distributor's webserver using that socket
215
   if (connect (s, (struct sockaddr *) &service, sizeof (service)) == -1)
275
   if (connect (s, (struct sockaddr *) &service, sizeof (service)) == -1)
216
   {
276
   {
-
 
277
      closesocket (s);
-
 
278
      if (failure_reason != NULL)
217
      *failure_reason = LOCALIZE (L"Registration_NetworkFailure");
279
         *failure_reason = LOCALIZE (L"Registration_NetworkFailure");
218
      return (0); // unable to connect to webserver, return an error condition
280
      return (0); // unable to connect to webserver, return an error condition
219
   }
281
   }
220
 
282
 
221
   // build the HTTP query and send it
283
   // build the HTTP query and send it
-
 
284
   if (candidate_email_or_uuid != NULL)
222
   ConvertTo7BitASCII (ascii_email, sizeof (ascii_email), candidate_email);
285
      ConvertTo7BitASCII (ascii_email_or_uuid, sizeof (ascii_email_or_uuid), candidate_email_or_uuid);
223
   sprintf_s (http_buffer, sizeof (http_buffer),
286
   sprintf_s (http_buffer, sizeof (http_buffer),
224
      "GET /chess/whatsmycode.php?email=%s HTTP/1.1\r\n"
287
              "GET " REGISTRATION_SCRIPT "?%s=%s HTTP/1.1\r\n"
225
      "Host: pmbaty.com\r\n"
288
              "Host: " REGISTRATION_HOST "\r\n"
226
      "Connection: close\r\n"
289
              "Connection: close\r\n"
227
      "\r\n", ascii_email);
290
              "\r\n",
-
 
291
              (candidate_email_or_uuid != NULL ? (wcschr (candidate_email_or_uuid, '@') != NULL ? "email" : "uuid") : "test"),
-
 
292
              (candidate_email_or_uuid != NULL ? ascii_email_or_uuid : "1"));
228
   length = strlen (http_buffer);
293
   length = strlen (http_buffer);
229
   write_index = send (s, http_buffer, length, 0); // send the HTTP query
294
   write_index = send (s, http_buffer, length, 0); // send the HTTP query
230
   if (write_index != length)
295
   if (write_index != length)
231
   {
296
   {
-
 
297
      closesocket (s);
-
 
298
      if (failure_reason != NULL)
232
      *failure_reason = LOCALIZE (L"Registration_NetworkFailure");
299
         *failure_reason = LOCALIZE (L"Registration_NetworkFailure");
233
      return (0); // unable to send HTTP query, return an error condition
300
      return (0); // unable to send HTTP query, return an error condition
234
   }
301
   }
235
 
302
 
236
   // read the reply (10 seconds timeout)
303
   // read the reply (10 seconds timeout)
237
   http_buffer[0] = 0;
304
   http_buffer[0] = 0;
238
   read_index = RecvWithTimeout (s, 10.0f, http_buffer, sizeof (http_buffer), 0);
305
   read_index = RecvWithTimeout (s, 10.0f, http_buffer, sizeof (http_buffer), 0);
239
   if (read_index < 1)
306
   if (read_index < 1)
240
   {
307
   {
-
 
308
      closesocket (s);
-
 
309
      if (failure_reason != NULL)
241
      *failure_reason = LOCALIZE (L"Registration_NetworkFailure");
310
         *failure_reason = LOCALIZE (L"Registration_NetworkFailure");
242
      return (0); // empty or erroneous HTTP reply, return an error condition
311
      return (0); // empty or erroneous HTTP reply, return an error condition
243
   }
312
   }
244
 
313
 
245
   closesocket (s); // finished communicating, close TCP socket
314
   closesocket (s); // finished communicating, close TCP socket
246
 
315
 
247
   // terminate recv buffer and see where the useful data starts
316
   // terminate recv buffer and see where the useful data starts
248
   http_buffer[read_index] = 0;
317
   http_buffer[read_index] = 0;
249
   //MessageBoxA (NULL, http_buffer, "HTTP response", MB_OK);
318
   //MessageBoxA (NULL, http_buffer, "HTTP response", MB_OK);
250
   if ((data_start = strstr (http_buffer, "Success=")) != NULL)
319
   if (candidate_email_or_uuid == NULL)
251
   {
320
   {
-
 
321
      if (failure_reason != NULL)
252
      *failure_reason = L""; // no error, set an empty string as the failure reason
322
         *failure_reason = L""; // no error, set an empty string as the failure reason
-
 
323
      if ((data_start = strchr (http_buffer, '\n')) != NULL)
-
 
324
         *data_start = 0; // see where the first reply line ends and break the string there
-
 
325
      return ((strncmp (http_buffer, "HTTP/", 5) == 0) && (strstr (http_buffer, " 200 ") != NULL)); // reachability test only
-
 
326
   }
-
 
327
   else if ((data_start = strstr (http_buffer, "Success=")) != NULL)
-
 
328
   {
-
 
329
      if (failure_reason != NULL)
-
 
330
         *failure_reason = L""; // no error, set an empty string as the failure reason
-
 
331
      if (returned_code != NULL)
253
      return ((unsigned __int32) _atoi64 (&data_start[strlen ("Success=")])); // and return the candidate code we got
332
         *returned_code = (unsigned int) _atoi64 (&data_start[strlen ("Success=")]);
-
 
333
      if (returned_email != NULL)
-
 
334
      {
-
 
335
         data_start = strchr (data_start, ',');
-
 
336
         if (data_start != NULL)
-
 
337
         {
-
 
338
            if (strchr (data_start, '\r') != 0)
-
 
339
               *strchr (data_start, '\r') = 0; // don't report the newline
-
 
340
            ConvertToWideChar (wide_email, WCHAR_SIZEOF (wide_email), data_start + 1);
-
 
341
            *returned_email = wide_email;
-
 
342
         }
-
 
343
         else
-
 
344
            *returned_email = L"";
-
 
345
      }
-
 
346
      return (true); // and return the candidate code we got
254
   }
347
   }
255
   else if ((data_start = strstr (http_buffer, "Error=")) != NULL)
348
   else if ((data_start = strstr (http_buffer, "Error=")) != NULL)
256
   {
349
   {
-
 
350
      if (failure_reason != NULL)
-
 
351
      {
257
      data_start += strlen ("Error=");
352
         data_start += strlen ("Error=");
258
      if (strchr (data_start, '\r') != NULL) *strchr (data_start, '\r') = 0;
353
         if (strchr (data_start, '\r') != NULL) *strchr (data_start, '\r') = 0;
259
      if (strchr (data_start, '\n') != NULL) *strchr (data_start, '\n') = 0;
354
         if (strchr (data_start, '\n') != NULL) *strchr (data_start, '\n') = 0;
260
      if      (_stricmp (data_start, "WrongEmail") == 0)         *failure_reason = LOCALIZE (L"Registration_WrongEmail");
355
         if      (_stricmp (data_start, "WrongEmail") == 0)         *failure_reason = LOCALIZE (L"Registration_WrongEmail");
261
      else if (_stricmp (data_start, "UnknownEmail") == 0)       *failure_reason = LOCALIZE (L"Registration_UnknownEmail");
356
         else if (_stricmp (data_start, "UnknownEmail") == 0)       *failure_reason = LOCALIZE (L"Registration_UnknownEmail");
262
      else if (_stricmp (data_start, "TooManyActivations") == 0) *failure_reason = LOCALIZE (L"Registration_TooManyActivations");;
357
         else if (_stricmp (data_start, "TooManyActivations") == 0) *failure_reason = LOCALIZE (L"Registration_TooManyActivations");;
-
 
358
      }
263
      return (0); // server returned an error, return an error condition
359
      return (false); // server returned an error, return an error condition
264
   }
360
   }
265
 
361
 
-
 
362
   if (failure_reason != NULL)
266
   *failure_reason = LOCALIZE (L"Registration_NetworkFailure"); // this should never happen
363
      *failure_reason = LOCALIZE (L"Registration_NetworkFailure"); // this should never happen
267
   return (0); // server returned an error, return an error condition
364
   return (false); // server returned an error, return an error condition
-
 
365
 
-
 
366
   #undef REGISTRATION_SCRIPT
-
 
367
   #undef REGISTRATION_HOST
268
}
368
}