2011-07-04 17:52:46 +00:00
|
|
|
// SparkleShare, a collaboration and sharing tool.
|
|
|
|
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
|
|
|
|
//
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
|
|
using System;
|
2011-10-01 21:15:46 +00:00
|
|
|
using System.Collections.Generic;
|
2011-07-04 17:52:46 +00:00
|
|
|
using System.IO;
|
2011-11-18 02:00:12 +00:00
|
|
|
using System.Text.RegularExpressions;
|
2012-02-14 16:23:08 +00:00
|
|
|
using System.Threading;
|
2011-07-04 17:52:46 +00:00
|
|
|
|
2011-10-01 21:15:46 +00:00
|
|
|
using SparkleLib;
|
|
|
|
|
2011-07-04 17:52:46 +00:00
|
|
|
namespace SparkleShare {
|
|
|
|
|
|
|
|
public enum PageType {
|
|
|
|
Setup,
|
|
|
|
Add,
|
2012-02-12 21:25:20 +00:00
|
|
|
Invite,
|
2011-07-04 17:52:46 +00:00
|
|
|
Syncing,
|
|
|
|
Error,
|
2011-09-13 00:05:45 +00:00
|
|
|
Finished,
|
|
|
|
Tutorial
|
2011-07-04 17:52:46 +00:00
|
|
|
}
|
|
|
|
|
2011-11-18 16:32:46 +00:00
|
|
|
public enum FieldState {
|
|
|
|
Enabled,
|
|
|
|
Disabled
|
|
|
|
}
|
|
|
|
|
2011-07-04 17:52:46 +00:00
|
|
|
|
|
|
|
public class SparkleSetupController {
|
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
public event ShowWindowEventHandler ShowWindowEvent;
|
|
|
|
public delegate void ShowWindowEventHandler ();
|
|
|
|
|
|
|
|
public event HideWindowEventHandler HideWindowEvent;
|
|
|
|
public delegate void HideWindowEventHandler ();
|
|
|
|
|
2011-07-04 17:52:46 +00:00
|
|
|
public event ChangePageEventHandler ChangePageEvent;
|
2011-11-28 13:40:34 +00:00
|
|
|
public delegate void ChangePageEventHandler (PageType page, string [] warnings);
|
2011-08-27 15:53:17 +00:00
|
|
|
|
|
|
|
public event UpdateProgressBarEventHandler UpdateProgressBarEvent;
|
2011-08-27 15:10:39 +00:00
|
|
|
public delegate void UpdateProgressBarEventHandler (double percentage);
|
2011-07-04 17:52:46 +00:00
|
|
|
|
2011-11-18 01:52:16 +00:00
|
|
|
public event UpdateSetupContinueButtonEventHandler UpdateSetupContinueButtonEvent;
|
|
|
|
public delegate void UpdateSetupContinueButtonEventHandler (bool button_enabled);
|
|
|
|
|
|
|
|
public event UpdateAddProjectButtonEventHandler UpdateAddProjectButtonEvent;
|
|
|
|
public delegate void UpdateAddProjectButtonEventHandler (bool button_enabled);
|
|
|
|
|
2011-10-04 23:08:37 +00:00
|
|
|
public event ChangeAddressFieldEventHandler ChangeAddressFieldEvent;
|
|
|
|
public delegate void ChangeAddressFieldEventHandler (string text,
|
|
|
|
string example_text, FieldState state);
|
|
|
|
|
|
|
|
public event ChangePathFieldEventHandler ChangePathFieldEvent;
|
2012-02-16 23:51:44 +00:00
|
|
|
public delegate void ChangePathFieldEventHandler (string text, string example_text, FieldState state);
|
2011-10-04 23:08:37 +00:00
|
|
|
|
2011-10-01 21:15:46 +00:00
|
|
|
public readonly List<SparklePlugin> Plugins = new List<SparklePlugin> ();
|
2011-10-04 23:08:37 +00:00
|
|
|
public SparklePlugin SelectedPlugin;
|
2011-10-01 21:15:46 +00:00
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
public int TutorialPageNumber { get; private set; }
|
|
|
|
public string PreviousUrl { get; private set; }
|
|
|
|
public string PreviousAddress { get; private set; }
|
|
|
|
public string PreviousPath { get; private set; }
|
|
|
|
public string SyncingFolder { get; private set; }
|
2012-02-17 00:26:27 +00:00
|
|
|
public SparkleInvite PendingInvite;
|
2012-02-16 23:51:44 +00:00
|
|
|
|
2011-09-13 00:05:45 +00:00
|
|
|
|
2011-10-05 21:23:35 +00:00
|
|
|
public int SelectedPluginIndex {
|
|
|
|
get {
|
|
|
|
return Plugins.IndexOf (SelectedPlugin);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-09-22 18:54:28 +00:00
|
|
|
public string GuessedUserName {
|
|
|
|
get {
|
|
|
|
return Program.Controller.UserName;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public string GuessedUserEmail {
|
|
|
|
get {
|
|
|
|
if (Program.Controller.UserEmail.Equals ("Unknown"))
|
|
|
|
return "";
|
|
|
|
else
|
|
|
|
return Program.Controller.UserEmail;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-09-13 00:05:45 +00:00
|
|
|
|
2011-07-04 17:52:46 +00:00
|
|
|
public SparkleSetupController ()
|
|
|
|
{
|
2012-02-16 23:51:44 +00:00
|
|
|
TutorialPageNumber = 1;
|
|
|
|
PreviousAddress = "";
|
|
|
|
PreviousPath = "";
|
|
|
|
PreviousUrl = "";
|
|
|
|
SyncingFolder = "";
|
|
|
|
|
2011-10-01 21:15:46 +00:00
|
|
|
string local_plugins_path = SparkleHelpers.CombineMore (
|
|
|
|
Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData),
|
|
|
|
"sparkleshare", "plugins");
|
|
|
|
|
2011-10-01 22:19:31 +00:00
|
|
|
if (Directory.Exists (local_plugins_path))
|
2011-10-01 21:15:46 +00:00
|
|
|
foreach (string xml_file_path in Directory.GetFiles (local_plugins_path, "*.xml"))
|
|
|
|
Plugins.Add (new SparklePlugin (xml_file_path));
|
|
|
|
|
2011-10-05 21:23:35 +00:00
|
|
|
if (Directory.Exists (Program.Controller.PluginsPath)) {
|
|
|
|
foreach (string xml_file_path in Directory.GetFiles (Program.Controller.PluginsPath, "*.xml")) {
|
2011-10-04 23:08:37 +00:00
|
|
|
if (xml_file_path.EndsWith ("own-server.xml"))
|
|
|
|
Plugins.Insert (0, new SparklePlugin (xml_file_path));
|
|
|
|
else
|
|
|
|
Plugins.Add (new SparklePlugin (xml_file_path));
|
|
|
|
}
|
|
|
|
}
|
2011-10-01 21:15:46 +00:00
|
|
|
|
2011-10-05 21:23:35 +00:00
|
|
|
SelectedPlugin = Plugins [0];
|
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
|
|
|
|
Program.Controller.InviteReceived += delegate (SparkleInvite invite) {
|
|
|
|
PendingInvite = invite;
|
|
|
|
|
|
|
|
if (ChangePageEvent != null)
|
|
|
|
ChangePageEvent (PageType.Invite, null);
|
|
|
|
|
|
|
|
if (ShowWindowEvent != null)
|
|
|
|
ShowWindowEvent ();
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
Program.Controller.ShowSetupWindowEvent += delegate (PageType page_type) {
|
2012-02-17 00:26:27 +00:00
|
|
|
if (PendingInvite != null) {
|
|
|
|
if (ShowWindowEvent != null)
|
|
|
|
ShowWindowEvent ();
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
if (ChangePageEvent != null)
|
|
|
|
ChangePageEvent (page_type, null);
|
|
|
|
|
|
|
|
if (ShowWindowEvent != null)
|
|
|
|
ShowWindowEvent ();
|
|
|
|
|
|
|
|
if (page_type == PageType.Add)
|
|
|
|
SelectedPluginChanged (SelectedPluginIndex);
|
2011-07-04 17:52:46 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
public void PageCancelled ()
|
2011-07-04 17:52:46 +00:00
|
|
|
{
|
2012-02-17 00:26:27 +00:00
|
|
|
PendingInvite = null;
|
2012-02-16 23:51:44 +00:00
|
|
|
|
|
|
|
if (HideWindowEvent != null)
|
|
|
|
HideWindowEvent ();
|
2011-07-04 17:52:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-11-18 01:52:16 +00:00
|
|
|
public void CheckSetupPage (string full_name, string email)
|
|
|
|
{
|
|
|
|
full_name = full_name.Trim ();
|
|
|
|
email = email.Trim ();
|
|
|
|
|
2011-11-29 22:02:13 +00:00
|
|
|
bool fields_valid = full_name != null && full_name.Trim().Length > 0 &&
|
|
|
|
IsValidEmail (email);
|
2011-11-18 01:52:16 +00:00
|
|
|
|
|
|
|
if (UpdateSetupContinueButtonEvent != null)
|
|
|
|
UpdateSetupContinueButtonEvent (fields_valid);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-07-04 17:52:46 +00:00
|
|
|
public void SetupPageCompleted (string full_name, string email)
|
|
|
|
{
|
2011-09-03 20:23:45 +00:00
|
|
|
Program.Controller.UserName = full_name;
|
|
|
|
Program.Controller.UserEmail = email;
|
2011-07-04 17:52:46 +00:00
|
|
|
|
2011-09-03 20:23:45 +00:00
|
|
|
Program.Controller.GenerateKeyPair ();
|
2012-01-21 22:31:19 +00:00
|
|
|
Program.Controller.ImportPrivateKey ();
|
2011-09-03 20:23:45 +00:00
|
|
|
Program.Controller.UpdateState ();
|
2011-07-04 17:52:46 +00:00
|
|
|
|
|
|
|
if (ChangePageEvent != null)
|
2011-11-28 13:40:34 +00:00
|
|
|
ChangePageEvent (PageType.Tutorial, null);
|
2011-09-13 00:05:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
public void TutorialSkipped ()
|
2011-09-13 00:05:45 +00:00
|
|
|
{
|
2012-02-16 23:51:44 +00:00
|
|
|
TutorialPageNumber = 4;
|
2011-09-13 00:05:45 +00:00
|
|
|
|
2011-09-22 18:54:28 +00:00
|
|
|
if (ChangePageEvent != null)
|
2011-11-28 13:40:34 +00:00
|
|
|
ChangePageEvent (PageType.Tutorial, null);
|
2011-09-13 00:05:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
public void TutorialPageCompleted ()
|
2011-09-13 00:05:45 +00:00
|
|
|
{
|
2012-02-16 23:51:44 +00:00
|
|
|
TutorialPageNumber++;
|
2011-09-13 00:05:45 +00:00
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
if (TutorialPageNumber == 4) {
|
|
|
|
if (HideWindowEvent != null)
|
|
|
|
HideWindowEvent ();
|
|
|
|
|
|
|
|
} else {
|
|
|
|
if (ChangePageEvent != null)
|
|
|
|
ChangePageEvent (PageType.Tutorial, null);
|
|
|
|
}
|
2011-07-04 17:52:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
public void SelectedPluginChanged (int plugin_index)
|
2011-10-05 21:23:35 +00:00
|
|
|
{
|
2012-02-16 23:51:44 +00:00
|
|
|
SelectedPlugin = Plugins [plugin_index];
|
|
|
|
|
|
|
|
if (SelectedPlugin.Address != null) {
|
|
|
|
if (ChangeAddressFieldEvent != null)
|
|
|
|
ChangeAddressFieldEvent (SelectedPlugin.Address, "", FieldState.Disabled);
|
|
|
|
|
|
|
|
} else if (SelectedPlugin.AddressExample != null) {
|
|
|
|
if (ChangeAddressFieldEvent != null)
|
|
|
|
ChangeAddressFieldEvent ("", SelectedPlugin.AddressExample, FieldState.Enabled);
|
|
|
|
} else {
|
|
|
|
if (ChangeAddressFieldEvent != null)
|
|
|
|
ChangeAddressFieldEvent ("", "", FieldState.Enabled);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (SelectedPlugin.Path != null) {
|
|
|
|
if (ChangePathFieldEvent != null)
|
|
|
|
ChangePathFieldEvent (SelectedPlugin.Path, "", FieldState.Disabled);
|
|
|
|
|
|
|
|
} else if (SelectedPlugin.PathExample != null) {
|
|
|
|
if (ChangePathFieldEvent != null)
|
|
|
|
ChangePathFieldEvent ("", SelectedPlugin.PathExample, FieldState.Enabled);
|
2011-10-05 21:23:35 +00:00
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
} else {
|
|
|
|
if (ChangePathFieldEvent != null)
|
|
|
|
ChangePathFieldEvent ("", "", FieldState.Enabled);
|
|
|
|
}
|
2011-10-05 21:23:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-11-18 01:52:16 +00:00
|
|
|
public void CheckAddPage (string address, string remote_path, int selected_plugin)
|
|
|
|
{
|
|
|
|
if (SelectedPluginIndex != selected_plugin)
|
|
|
|
SelectedPluginChanged (selected_plugin);
|
|
|
|
|
|
|
|
address = address.Trim ();
|
|
|
|
remote_path = remote_path.Trim ();
|
|
|
|
|
2011-11-29 22:02:13 +00:00
|
|
|
bool fields_valid = address != null && address.Trim().Length > 0 &&
|
|
|
|
remote_path != null && remote_path.Trim().Length > 0;
|
2011-11-18 01:52:16 +00:00
|
|
|
|
|
|
|
if (UpdateAddProjectButtonEvent != null)
|
|
|
|
UpdateAddProjectButtonEvent (fields_valid);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-10-05 21:23:35 +00:00
|
|
|
public void AddPageCompleted (string address, string path)
|
2011-07-04 17:52:46 +00:00
|
|
|
{
|
2012-02-16 23:51:44 +00:00
|
|
|
SyncingFolder = Path.GetFileNameWithoutExtension (path);
|
|
|
|
PreviousAddress = address;
|
|
|
|
PreviousPath = path;
|
2011-07-04 17:52:46 +00:00
|
|
|
|
|
|
|
if (ChangePageEvent != null)
|
2011-11-28 13:40:34 +00:00
|
|
|
ChangePageEvent (PageType.Syncing, null);
|
2011-07-04 17:52:46 +00:00
|
|
|
|
2011-11-28 13:40:34 +00:00
|
|
|
// TODO: Remove events afterwards
|
|
|
|
|
|
|
|
Program.Controller.FolderFetched += delegate (string [] warnings) {
|
2011-07-04 17:52:46 +00:00
|
|
|
if (ChangePageEvent != null)
|
2011-11-28 13:40:34 +00:00
|
|
|
ChangePageEvent (PageType.Finished, warnings);
|
2011-07-04 17:52:46 +00:00
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
PreviousAddress = "";
|
|
|
|
SyncingFolder = "";
|
|
|
|
PreviousUrl = "";
|
|
|
|
SelectedPlugin = Plugins [0];
|
2011-07-04 17:52:46 +00:00
|
|
|
};
|
|
|
|
|
2011-09-03 20:23:45 +00:00
|
|
|
Program.Controller.FolderFetchError += delegate (string remote_url) {
|
2012-02-14 16:23:08 +00:00
|
|
|
Thread.Sleep (1000);
|
2012-02-16 23:51:44 +00:00
|
|
|
PreviousUrl = remote_url;
|
2011-08-27 18:57:34 +00:00
|
|
|
|
2011-07-04 17:52:46 +00:00
|
|
|
if (ChangePageEvent != null)
|
2011-11-28 13:40:34 +00:00
|
|
|
ChangePageEvent (PageType.Error, null);
|
2011-07-04 17:52:46 +00:00
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
SyncingFolder = "";
|
2011-07-04 17:52:46 +00:00
|
|
|
};
|
2011-08-27 15:53:17 +00:00
|
|
|
|
2011-09-03 20:23:45 +00:00
|
|
|
Program.Controller.FolderFetching += delegate (double percentage) {
|
2011-08-27 15:53:17 +00:00
|
|
|
if (UpdateProgressBarEvent != null)
|
|
|
|
UpdateProgressBarEvent (percentage);
|
|
|
|
};
|
2011-07-04 17:52:46 +00:00
|
|
|
|
2011-10-05 21:23:35 +00:00
|
|
|
Program.Controller.FetchFolder (address, path);
|
2011-07-04 17:52:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-02-14 16:23:08 +00:00
|
|
|
public void InvitePageCompleted ()
|
|
|
|
{
|
2012-02-16 23:51:44 +00:00
|
|
|
SyncingFolder = Path.GetFileNameWithoutExtension (PendingInvite.RemotePath);
|
|
|
|
PreviousAddress = PendingInvite.Address;
|
2012-02-17 00:26:27 +00:00
|
|
|
// TODO: trailing slash should work
|
2012-02-16 23:51:44 +00:00
|
|
|
PreviousPath = PendingInvite.RemotePath;
|
|
|
|
|
2012-02-12 21:25:20 +00:00
|
|
|
if (ChangePageEvent != null)
|
|
|
|
ChangePageEvent (PageType.Syncing, null);
|
|
|
|
|
2012-02-14 16:23:08 +00:00
|
|
|
if (!PendingInvite.Accept ()) {
|
2012-02-12 21:25:20 +00:00
|
|
|
if (ChangePageEvent != null)
|
|
|
|
ChangePageEvent (PageType.Error, null);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2012-02-14 16:23:08 +00:00
|
|
|
|
2012-02-12 21:25:20 +00:00
|
|
|
|
|
|
|
// TODO: Remove events afterwards
|
|
|
|
|
|
|
|
Program.Controller.FolderFetched += delegate (string [] warnings) {
|
|
|
|
if (ChangePageEvent != null)
|
|
|
|
ChangePageEvent (PageType.Finished, warnings);
|
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
|
|
|
|
PreviousAddress = "";
|
|
|
|
SyncingFolder = "";
|
|
|
|
PreviousUrl = "";
|
|
|
|
SelectedPlugin = Plugins [0];
|
|
|
|
|
|
|
|
PendingInvite = null;
|
2012-02-12 21:25:20 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
Program.Controller.FolderFetchError += delegate (string remote_url) {
|
2012-02-14 16:23:08 +00:00
|
|
|
Thread.Sleep (1000);
|
2012-02-16 23:51:44 +00:00
|
|
|
PreviousUrl = remote_url;
|
2012-02-12 21:25:20 +00:00
|
|
|
|
|
|
|
if (ChangePageEvent != null)
|
|
|
|
ChangePageEvent (PageType.Error, null);
|
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
SyncingFolder = "";
|
2012-02-12 21:25:20 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
Program.Controller.FolderFetching += delegate (double percentage) {
|
|
|
|
if (UpdateProgressBarEvent != null)
|
|
|
|
UpdateProgressBarEvent (percentage);
|
|
|
|
};
|
|
|
|
|
2012-02-14 16:23:08 +00:00
|
|
|
Program.Controller.FetchFolder (PendingInvite.Address, PendingInvite.RemotePath);
|
2012-02-12 21:25:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
public void SyncingCancelled ()
|
2011-07-04 17:52:46 +00:00
|
|
|
{
|
2012-02-16 23:51:44 +00:00
|
|
|
Program.Controller.StopFetcher ();
|
|
|
|
|
2012-02-14 16:23:08 +00:00
|
|
|
if (ChangePageEvent == null)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (PendingInvite != null)
|
|
|
|
ChangePageEvent (PageType.Invite, null);
|
|
|
|
else
|
2011-11-28 13:40:34 +00:00
|
|
|
ChangePageEvent (PageType.Add, null);
|
2011-07-04 17:52:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
public void ErrorPageCompleted ()
|
2011-08-26 20:47:46 +00:00
|
|
|
{
|
2012-02-14 16:23:08 +00:00
|
|
|
if (ChangePageEvent == null)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (PendingInvite != null)
|
|
|
|
ChangePageEvent (PageType.Invite, null);
|
|
|
|
else
|
2011-11-28 13:40:34 +00:00
|
|
|
ChangePageEvent (PageType.Add, null);
|
2011-08-26 20:47:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
public void FinishPageCompleted ()
|
2011-10-04 23:08:37 +00:00
|
|
|
{
|
2012-02-16 23:51:44 +00:00
|
|
|
PreviousAddress = "";
|
|
|
|
PreviousPath = "";
|
2011-10-04 23:08:37 +00:00
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
Program.Controller.UpdateState ();
|
2011-10-04 23:08:37 +00:00
|
|
|
|
2012-02-16 23:51:44 +00:00
|
|
|
if (HideWindowEvent != null)
|
|
|
|
HideWindowEvent ();
|
2011-10-04 23:08:37 +00:00
|
|
|
}
|
2011-11-18 02:00:12 +00:00
|
|
|
|
|
|
|
|
|
|
|
private bool IsValidEmail (string email)
|
|
|
|
{
|
|
|
|
Regex regex = new Regex (@"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$",
|
|
|
|
RegexOptions.IgnoreCase);
|
|
|
|
|
|
|
|
return regex.IsMatch (email);
|
|
|
|
}
|
2011-10-04 23:08:37 +00:00
|
|
|
}
|
2011-07-04 17:52:46 +00:00
|
|
|
}
|