Mini Kabibi Habibi

Current Path : C:/Users/Public/Documents/DXperience 13.1 Demos/ASP.NET/VB/WebmailClient/App_Code/
Upload File :
Current File : C:/Users/Public/Documents/DXperience 13.1 Demos/ASP.NET/VB/WebmailClient/App_Code/MailClasses.vb

Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.SessionState

Public Interface IMessage
	Property ID() As Integer
	Property Subject() As String
	Property [Date]() As DateTime
	Property [From]() As String
	Property [To]() As String
	Property Text() As String
	Property Folder() As String
	Property HasAttachment() As Boolean
	Property IsReply() As Boolean
	Property Unread() As Boolean
End Interface

Public Interface IContact
	Property ID() As Integer
	Property Name() As String
	Property Email() As String
	Property Address() As String
	Property Phone() As String
	Property Country() As String
	Property City() As String
	Property PhotoUrl() As String
	Property Collected() As Boolean
End Interface

Public Class Message
	Implements IMessage
	Private _date As DateTime
	Private _to As String

	Private privateID As Integer
	Public Property ID() As Integer Implements IMessage.ID
		Get
			Return privateID
		End Get
		Set(ByVal value As Integer)
			privateID = value
		End Set
	End Property
	Private privateSubject As String
	Public Property Subject() As String Implements IMessage.Subject
		Get
			Return privateSubject
		End Get
		Set(ByVal value As String)
			privateSubject = value
		End Set
	End Property
	Public Property [Date]() As DateTime Implements IMessage.Date
		Get
			Return _date
		End Get
		Set(ByVal value As DateTime)
			_date = value
		End Set
	End Property
	Private privateFrom As String
	Public Property From() As String Implements IMessage.From
		Get
			Return privateFrom
		End Get
		Set(ByVal value As String)
			privateFrom = value
		End Set
	End Property
	Public Property [To]() As String Implements IMessage.To
		Get
			Return _to
		End Get
		Set(ByVal value As String)
			_to = value
		End Set
	End Property
	Private privateText As String
	Public Property Text() As String Implements IMessage.Text
		Get
			Return privateText
		End Get
		Set(ByVal value As String)
			privateText = value
		End Set
	End Property
	Private privateFolder As String
	Public Property Folder() As String Implements IMessage.Folder
		Get
			Return privateFolder
		End Get
		Set(ByVal value As String)
			privateFolder = value
		End Set
	End Property
	Private privateHasAttachment As Boolean
	Public Property HasAttachment() As Boolean Implements IMessage.HasAttachment
		Get
			Return privateHasAttachment
		End Get
		Set(ByVal value As Boolean)
			privateHasAttachment = value
		End Set
	End Property
	Private privateIsReply As Boolean
	Public Property IsReply() As Boolean Implements IMessage.IsReply
		Get
			Return privateIsReply
		End Get
		Set(ByVal value As Boolean)
			privateIsReply = value
		End Set
	End Property
	Private privateUnread As Boolean
	Public Property Unread() As Boolean Implements IMessage.Unread
		Get
			Return privateUnread
		End Get
		Set(ByVal value As Boolean)
			privateUnread = value
		End Set
	End Property
End Class

Public Class Contact
	Implements IContact
	Private privateID As Integer
	Public Property ID() As Integer Implements IContact.ID
		Get
			Return privateID
		End Get
		Set(ByVal value As Integer)
			privateID = value
		End Set
	End Property
	Private privateName As String
	Public Property Name() As String Implements IContact.Name
		Get
			Return privateName
		End Get
		Set(ByVal value As String)
			privateName = value
		End Set
	End Property
	Private privateEmail As String
	Public Property Email() As String Implements IContact.Email
		Get
			Return privateEmail
		End Get
		Set(ByVal value As String)
			privateEmail = value
		End Set
	End Property
	Private privateAddress As String
	Public Property Address() As String Implements IContact.Address
		Get
			Return privateAddress
		End Get
		Set(ByVal value As String)
			privateAddress = value
		End Set
	End Property
	Private privatePhone As String
	Public Property Phone() As String Implements IContact.Phone
		Get
			Return privatePhone
		End Get
		Set(ByVal value As String)
			privatePhone = value
		End Set
	End Property
	Private privateCountry As String
	Public Property Country() As String Implements IContact.Country
		Get
			Return privateCountry
		End Get
		Set(ByVal value As String)
			privateCountry = value
		End Set
	End Property
	Private privateCity As String
	Public Property City() As String Implements IContact.City
		Get
			Return privateCity
		End Get
		Set(ByVal value As String)
			privateCity = value
		End Set
	End Property
	Private privatePhotoUrl As String
	Public Property PhotoUrl() As String Implements IContact.PhotoUrl
		Get
			Return privatePhotoUrl
		End Get
		Set(ByVal value As String)
			privatePhotoUrl = value
		End Set
	End Property
	Private privateCollected As Boolean
	Public Property Collected() As Boolean Implements IContact.Collected
		Get
			Return privateCollected
		End Get
		Set(ByVal value As Boolean)
			privateCollected = value
		End Set
	End Property
End Class

Public NotInheritable Class DemoModel
	Private Shared currentProvider As DataProviderBase
	Private Sub New()
	End Sub
	Public Shared ReadOnly Property DataProvider() As DataProviderBase
		Get
			If currentProvider Is Nothing Then
				currentProvider = CreateDataProvider()
			End If
			Return currentProvider
		End Get
	End Property
	Private Shared Function CreateDataProvider() As DataProviderBase
		If Utils.IsSiteMode Then
			Return New SiteModeDataProvider()
		End If
		Return New DBDataProvider()
	End Function
End Class

Public MustInherit Class DataProviderBase
	Public MustOverride ReadOnly Property Messages() As IEnumerable(Of IMessage)
	Public MustOverride ReadOnly Property UnreadMessages() As IEnumerable(Of IMessage)
	Public MustOverride ReadOnly Property Contacts() As IEnumerable(Of IContact)

	Public MustOverride Sub AddMessage(ByVal subject As String, ByVal [to] As String, ByVal text As String, ByVal folder As String)
	Public MustOverride Sub UpdateMessage(ByVal id As Integer, ByVal subject As String, ByVal [to] As String, ByVal text As String, ByVal folder As String)
	Public MustOverride Sub MarkMessagesAs(ByVal read As Boolean, ByVal ids As IEnumerable(Of Integer))
	Public MustOverride Sub DeleteMessages(ByVal ids As IEnumerable(Of Integer))

	Public MustOverride Sub AddContact(ByVal name As String, ByVal email As String, ByVal address As String, ByVal country As String, ByVal city As String, ByVal phone As String, ByVal photoUrl As String)
	Public MustOverride Sub UpdateContact(ByVal id As Integer, ByVal name As String, ByVal email As String, ByVal address As String, ByVal country As String, ByVal city As String, ByVal phone As String, ByVal photoUrl As String)
	Public MustOverride Sub DeleteContact(ByVal id As Integer)
End Class

Public Class DBDataProvider
	Inherits DataProviderBase
	Public Overrides ReadOnly Property Messages() As IEnumerable(Of IMessage)
		Get
			Return GetDataContext().DBMessages
		End Get
	End Property
	Public Overrides ReadOnly Property UnreadMessages() As IEnumerable(Of IMessage)
		Get
			Return Messages.Where(Function(m) m.Unread)
		End Get
	End Property
	Public Overrides ReadOnly Property Contacts() As IEnumerable(Of IContact)
		Get
			Return GetDataContext().DBContacts
		End Get
	End Property

	Protected Function GetDataContext() As WebmailClientDataContext
		Return New WebmailClientDataContext()
	End Function

	Public Overrides Sub AddMessage(ByVal subject As String, ByVal [to] As String, ByVal text As String, ByVal folder As String)
		Dim context = GetDataContext()
		context.DBMessages.InsertOnSubmit(New DBMessage() With {.Date = DateTime.Now, .Subject = subject, .From = Utils.ThomasEmail, .To = [to], .Text = text, .Folder = folder})
		context.SubmitChanges()
	End Sub


	Public Overrides Sub UpdateMessage(ByVal id As Integer, ByVal subject As String, ByVal [to] As String, ByVal text As String, ByVal folder As String)
		Dim context = GetDataContext()
		Dim m = context.DBMessages.FirstOrDefault(Function(i) i.ID = id)
		If m Is Nothing Then
			Return
		End If
		m.Date = DateTime.Now
		m.Subject = subject
		m.From = Utils.ThomasEmail
		m.To = [to]
		m.Text = text
		m.Folder = folder
		context.SubmitChanges()
	End Sub
	Public Overrides Sub MarkMessagesAs(ByVal read As Boolean, ByVal ids As IEnumerable(Of Integer))
		Dim context = GetDataContext()
		For Each m In context.DBMessages.Where(Function(i) ids.Contains(i.ID))
			m.Unread = Not read
		Next m
		context.SubmitChanges()
	End Sub
	Public Overrides Sub DeleteMessages(ByVal ids As IEnumerable(Of Integer))
		Dim context = GetDataContext()
		context.DBMessages.DeleteAllOnSubmit(context.DBMessages.Where(Function(i) ids.Contains(i.ID)))
		context.SubmitChanges()
	End Sub
	Public Overrides Sub AddContact(ByVal name As String, ByVal email As String, ByVal address As String, ByVal country As String, ByVal city As String, ByVal phone As String, ByVal photoUrl As String)
		Dim context = GetDataContext()
		context.DBContacts.InsertOnSubmit(New DBContact() With {.Name = name, .Email = email, .Address = address, .Country = country, .City = city, .Phone = phone, .PhotoUrl = photoUrl})
		context.SubmitChanges()
	End Sub
	Public Overrides Sub UpdateContact(ByVal id As Integer, ByVal name As String, ByVal email As String, ByVal address As String, ByVal country As String, ByVal city As String, ByVal phone As String, ByVal photoUrl As String)
		Dim context = GetDataContext()
		Dim c = context.DBContacts.FirstOrDefault(Function(i) i.ID = id)
		If c Is Nothing Then
			Return
		End If
		c.Name = name
		c.Email = email
		c.Address = address
		c.Country = country
		c.City = city
		c.Phone = phone
		If (Not String.IsNullOrEmpty(photoUrl)) Then
			c.PhotoUrl = photoUrl
		End If
		context.SubmitChanges()
	End Sub
	Public Overrides Sub DeleteContact(ByVal id As Integer)
		Dim context = GetDataContext()
		Dim c = context.DBContacts.FirstOrDefault(Function(i) i.ID = id)
		If c Is Nothing Then
			Return
		End If
		context.DBContacts.DeleteOnSubmit(c)
		context.SubmitChanges()
	End Sub
End Class

Public Class SiteModeDataProvider
	Inherits DataProviderBase
	Private Shared dbMessages_Renamed As List(Of Message)
	Private Shared dbContacts_Renamed As List(Of Contact)

	Protected Shared ReadOnly Property DBMessages() As List(Of Message)
		Get
			If dbMessages_Renamed Is Nothing Then
				dbMessages_Renamed = CreateDBMessageList()
			End If
			Return dbMessages_Renamed
		End Get
	End Property
	Protected Shared ReadOnly Property DBContacts() As List(Of Contact)
		Get
			If dbContacts_Renamed Is Nothing Then
				dbContacts_Renamed = CreateDBContactList()
			End If
			Return dbContacts_Renamed
		End Get
	End Property

	Private Shared Function CreateDBMessageList() As List(Of Message)
		Return New WebmailClientDataContext().DBMessages.Select(Function(m) New Message() With {.ID = m.ID, .Date = m.Date, .Subject = m.Subject, .From = m.From, .To = m.To, .Text = m.Text, .Folder = m.Folder, .Unread = m.Unread, .HasAttachment = m.HasAttachment, .IsReply = m.IsReply}).ToList()
	End Function

	Private Shared Function CreateDBContactList() As List(Of Contact)
		Return New WebmailClientDataContext().DBContacts.Select(Function(c) New Contact() With {.ID = c.ID, .Name = c.Name, .Email = c.Email, .Address = c.Address, .Country = c.Country, .City = c.City, .Phone = c.Phone, .PhotoUrl = c.PhotoUrl, .Collected = c.Collected}).ToList()
	End Function

	Private messages_Renamed As List(Of Message)
	Private contacts_Renamed As List(Of Contact)

	Public Sub New()
		Utils.StartClearExpiredFilesBackgroundThread()
	End Sub

	Private ReadOnly Property Context() As HttpContext
		Get
			Return HttpContext.Current
		End Get
	End Property
	Private ReadOnly Property Session() As HttpSessionState
		Get
			Return Context.Session
		End Get
	End Property

	Protected ReadOnly Property SessionMessages() As List(Of Message)
		Get
			Dim key = "07A5E5BF-4C38-4C6C-A324-B81D24730AAD"
			If Session(key) Is Nothing Then
				Session(key) = New List(Of Message)()
			End If
			Return CType(Session(key), List(Of Message))
		End Get
	End Property

	Protected ReadOnly Property DeletedDBMessagesKeys() As List(Of Integer)
		Get
			Dim key = "4200605D-F2A3-4192-90CC-F11E739654FC"
			If Session(key) Is Nothing Then
				Session(key) = New List(Of Integer)()
			End If
			Return CType(Session(key), List(Of Integer))
		End Get
	End Property

	Protected ReadOnly Property UnreadMessagesKeys() As List(Of Integer)
		Get
			Dim key = "7B2D4B7E-5A7B-457B-B9D5-6821F55DE59E"
			If Session(key) Is Nothing Then
				Session(key) = DBMessages.Where(Function(m) m.Unread).Select(Function(i) i.ID).ToList()
			End If
			Return CType(Session(key), List(Of Integer))
		End Get
	End Property

	Protected ReadOnly Property SessionContacts() As List(Of Contact)
		Get
			Dim key = "068191AC-A820-483E-B450-8AD9DD1A51A7"
			If Session(key) Is Nothing Then
				Session(key) = New List(Of Contact)()
			End If
			Return CType(Session(key), List(Of Contact))
		End Get
	End Property

	Protected ReadOnly Property DeletedDBContactsKeys() As List(Of Integer)
		Get
			Dim key = "07B7041A-9416-4267-B9DB-BF53FAB64D3C"
			If Session(key) Is Nothing Then
				Session(key) = New List(Of Integer)()
			End If
			Return CType(Session(key), List(Of Integer))
		End Get
	End Property

	Public Overrides ReadOnly Property Messages() As IEnumerable(Of IMessage)
		Get
			If messages_Renamed Is Nothing Then
				messages_Renamed = LoadMessages()
			End If
			Return messages_Renamed
		End Get
	End Property

	Public Overrides ReadOnly Property UnreadMessages() As IEnumerable(Of IMessage)
		Get
			Return Messages.Where(Function(m) UnreadMessagesKeys.Contains(m.ID))
		End Get
	End Property

	Public Overrides ReadOnly Property Contacts() As IEnumerable(Of IContact)
		Get
			If contacts_Renamed Is Nothing Then
				contacts_Renamed = LoadContacts()
			End If
			Return contacts_Renamed
		End Get
	End Property

	Protected Function LoadMessages() As List(Of Message)
		Dim list = New List(Of Message)()
		For Each dbMessage In DBMessages
			Dim sessionMessage = SessionMessages.FirstOrDefault(Function(m) m.ID = dbMessage.ID)
			If sessionMessage Is Nothing AndAlso (Not DeletedDBMessagesKeys.Contains(dbMessage.ID)) Then
				list.Add(dbMessage)
			End If
		Next dbMessage
		list.AddRange(SessionMessages)
		Return list
	End Function

	Protected Function LoadContacts() As List(Of Contact)
		Dim list = New List(Of Contact)()
		For Each dbContact In DBContacts
			Dim sessionContact = SessionContacts.FirstOrDefault(Function(c) c.ID = dbContact.ID)
			If sessionContact Is Nothing AndAlso (Not DeletedDBContactsKeys.Contains(dbContact.ID)) Then
				list.Add(dbContact)
			End If
		Next dbContact
		list.AddRange(SessionContacts)
		Return list
	End Function

	Protected Sub ForceReloadMessages()
		Me.messages_Renamed = Nothing
	End Sub

	Protected Sub ForceReloadContacts()
		Me.contacts_Renamed = Nothing
	End Sub

	Public Overrides Sub AddMessage(ByVal subject As String, ByVal [to] As String, ByVal text As String, ByVal folder As String)
		SessionMessages.Add(New Message() With {.ID = Math.Max(DBMessages.Max(Function(m) m.ID), Messages.Max(Function(m) m.ID)) + 1, .Date = DateTime.Now, .Subject = subject, .From = Utils.ThomasEmail, .To = [to], .Text = text, .Folder = folder})
		ForceReloadMessages()
	End Sub

	Public Overrides Sub UpdateMessage(ByVal id As Integer, ByVal subject As String, ByVal [to] As String, ByVal text As String, ByVal folder As String)
		Dim m = SessionMessages.FirstOrDefault(Function(i) i.ID = id)
		If m Is Nothing Then
			m = DBMessages.FirstOrDefault(Function(i) i.ID = id)
			If m Is Nothing Then
				Return
			End If
			SessionMessages.Add(m)
		End If
		m.Date = DateTime.Now
		m.Subject = subject
		m.From = Utils.ThomasEmail
		m.To = [to]
		m.Text = text
		m.Folder = folder
		ForceReloadMessages()
	End Sub

	Public Overrides Sub MarkMessagesAs(ByVal read As Boolean, ByVal ids As IEnumerable(Of Integer))
		For Each id In ids
			Dim contains = UnreadMessagesKeys.Contains(id)
			If read AndAlso contains Then
				UnreadMessagesKeys.Remove(id)
			ElseIf (Not read) AndAlso (Not contains) Then
				UnreadMessagesKeys.Add(id)
			End If
		Next id
	End Sub

	Public Overrides Sub DeleteMessages(ByVal ids As IEnumerable(Of Integer))
		For Each id In ids
			Dim sessionMessage = SessionMessages.FirstOrDefault(Function(m) m.ID = id)
			If sessionMessage IsNot Nothing Then
				SessionMessages.Remove(sessionMessage)
			Else
				DeletedDBMessagesKeys.Add(id)
			End If
		Next id
		MarkMessagesAs(True, ids)
		ForceReloadMessages()
	End Sub

	Public Overrides Sub AddContact(ByVal name As String, ByVal email As String, ByVal address As String, ByVal country As String, ByVal city As String, ByVal phone As String, ByVal photoUrl As String)
		SessionContacts.Add(New Contact() With {.ID = Math.Max(DBContacts.Max(Function(c) c.ID), Contacts.Max(Function(c) c.ID)) + 1, .Name = name, .Email = email, .Address = address, .Country = country, .City = city, .Phone = phone, .PhotoUrl = photoUrl})
		ForceReloadContacts()
	End Sub

	Public Overrides Sub UpdateContact(ByVal id As Integer, ByVal name As String, ByVal email As String, ByVal address As String, ByVal country As String, ByVal city As String, ByVal phone As String, ByVal photoUrl As String)
		Dim c = SessionContacts.FirstOrDefault(Function(i) i.ID = id)
		If c Is Nothing Then
			c = DBContacts.FirstOrDefault(Function(i) i.ID = id)
			If c Is Nothing Then
				Return
			End If
			SessionContacts.Add(c)
		End If
		c.Name = name
		c.Email = email
		c.Address = address
		c.Country = country
		c.City = city
		c.Phone = phone
		If (Not String.IsNullOrEmpty(photoUrl)) Then
			c.PhotoUrl = photoUrl
		End If
		ForceReloadContacts()
	End Sub

	Public Overrides Sub DeleteContact(ByVal id As Integer)
		Dim sessionContact = SessionContacts.FirstOrDefault(Function(c) c.ID = id)
		If sessionContact IsNot Nothing Then
			SessionContacts.Remove(sessionContact)
		End If
		DeletedDBContactsKeys.Add(id)
		ForceReloadContacts()
	End Sub

End Class