void CProxySettings::OnOK() {
    CString proxyUser, proxyPassword;
    CString s1;
    _bstr_t bst;
    bool cancelSave = false;
    OutlookConfig* conf = (OutlookConfig*)getConfig();

    GetDlgItemText(IDC_PROXY_EDIT_USER,proxyUser);
    GetDlgItemText(IDC_PROXY_EDIT_PASS,proxyPassword);

    if( (checkEnable.GetCheck() == BST_CHECKED) && (checkAuth.GetCheck() == BST_CHECKED)) {
        if (proxyUser == "") {
            s1.LoadString(IDS_ERROR_PROXY_USERNAME);
            wsafeMessageBox(s1);
            cancelSave = true;
            goto finally;
        };
        if (proxyPassword == "") {
            s1.LoadString(IDS_ERROR_PROXY_PASSWORD);
            wsafeMessageBox(s1);
            cancelSave = true;
            goto finally;
        };
    }

    if(checkEnable.GetCheck() == BST_CHECKED)
        conf->getAccessConfig().setUseProxy(TRUE);
    else
        conf->getAccessConfig().setUseProxy(FALSE);

    if(checkAuth.GetCheck() == BST_CHECKED) {
        // Note: use 'toMultibyte' which uses charset UTF-8.
        char* tmp = toMultibyte(proxyUser.GetBuffer());
        if (tmp) {
            conf->getAccessConfig().setProxyUsername(tmp);
            delete [] tmp;
        }
        // Note: use 'toMultibyte' which uses charset UTF-8.
        tmp = toMultibyte(proxyPassword.GetBuffer());
        if (tmp) {
            conf->getAccessConfig().setProxyPassword(tmp);
            delete [] tmp;
        }
    }
    else {
        conf->getAccessConfig().setProxyUsername("");
        conf->getAccessConfig().setProxyPassword("");
    }

    // save values
finally:
    if(!cancelSave) {
        conf->save();

        CDialog::OnOK();
    }

}
/**
 * Error messages prompted to the user are managed only inside this function.
 * A message box will be displayed, based on the error code passed.
 * if messagebox has question? returns the answer
 */
int manageSyncErrorMsg(long code) {

    CString s1("");
	UINT msgboxFlags = 0;
	bool showMessage = true;
	
	switch(code) {

        case WIN_ERR_NONE: {                            // 0: No error
            return -1;
        }
        case WIN_ERR_GENERIC: {                         // 1: Generic error -> see log.
            s1.LoadString(IDS_ERROR_SYNC_NOT_COMPLETED);
            break;
        }
        case WIN_ERR_SYNC_CANCELED: {                   // 2: Aborted -> no msgbox
            return -1;
        }        
        case WIN_ERR_THREAD_TERMINATED:                 // 4 -> force exit the plugin!
        {
            s1.LoadString(IDS_ERROR_SYNC_TERMINATED);
            wsafeMessageBox(s1.GetBuffer());
            return -1;
        }
        case WIN_ERR_FULL_SYNC_CANCELED: {              // 5 -> deprecated, no msgbox
            return -1;
        }
        case WIN_ERR_UNEXPECTED_EXCEPTION:              // 6
        case WIN_ERR_UNEXPECTED_STL_EXCEPTION:          // 7
        {
            s1.LoadString(IDS_UNEXPECTED_EXCEPTION);
            break;
        }
        case WIN_ERR_SERVER_QUOTA_EXCEEDED:             // 8: Server quota exceeded
        {
            s1.LoadString(IDS_MEDIA_QUOTA_EXCEEDED);
            break;
        }
        case WIN_ERR_LOCAL_STORAGE_FULL:                // 9: Local storage full
        {
            s1.LoadString(IDS_MEDIA_STORAGE_FULL);
            break;
        }
        case WIN_ERR_DROPPED_ITEMS:                     // 10: Dropped items on Client
        {
            s1.LoadString(IDS_CODE_DROPPED_ITEMS); 
            break;
        }
        case WIN_ERR_DROPPED_ITEMS_SERVER:              // 11: Dropped items on Server
        {
            s1.LoadString(IDS_CODE_DROPPED_ITEMS_SERVER); 
            break;
        }
        case WIN_ERR_NO_SOURCES:                        // 12: No sources to sync
        {
            s1.LoadString(IDS_CODE_NO_SOURCES); 
            break;
        }
        case WIN_ERR_SAPI_NOT_SUPPORTED: {              // 13: Source (sapi) not supported
            return -1;
        }
        case WIN_ERR_INVALID_CREDENTIALS:               // 401
        case WIN_ERR_PROXY_AUTH_REQUIRED:               // 407
        {
            s1.LoadString(IDS_CODE_INVALID_CREDENTIALS_401);
            break;
        }
        case WIN_ERR_REMOTE_NAME_NOT_FOUND:             // 404
        {
            s1.LoadString(IDS_CODE_NOTFOUND_404); 
            break;
        }
        case WIN_ERR_WRONG_HOST_NAME:                   // 2001
        case WIN_ERR_NETWORK_ERROR:                     // 2050
        {
            s1.LoadString(IDS_CODE_NETWORK_ERROR_2007); 
            break;
        }

		case WIN_ERR_PAYMENT_REQUIRED: // special case: PAYMENT Required for sync, managed with an in teractive dialog box.Not here.
			showMessage = false;
			break;

        //
        // DEPRECATED
        //
        case WIN_ERR_FATAL_OL_EXCEPTION:                // 3 -> force exit the plugin!
        {
            s1.LoadString(IDS_ERROR_SYNC_TERMINATED);
            wsafeMessageBox(s1.GetBuffer());
            return -1;
        }
        case 403:
            s1.LoadString(IDS_CODE_FORBIDDEN_403);    
            break;
        case 417:       // Retry later
            s1.LoadString(IDS_CODE_SERVER_BUSY); 
            break;

        case 2061:      // Server timeout
            s1.LoadString(IDS_ERR_SERVER_TIMOUT); 
            break;
        case 2007:
        case 2029:
        case 2060:      // Server path is wrong
            s1.LoadString(IDS_CODE_NETWORK_ERROR_2007); 
            break;
        case 2052:
            s1.LoadString(IDS_CODE_SERVER_ERROR_2052); 
            break;

        default: 
            break;
    }

    //
    // Display the messagebox with error to the user.
    //
    if(s1 == "") {
        s1.LoadString(IDS_ERROR_SYNC_NOT_COMPLETED);
    }

	if ( showMessage ) 
		return wsafeMessageBox(s1.GetBuffer(), 0, msgboxFlags);

	return 0;

}