Mini Kabibi Habibi
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