Skip to content

Commit

Permalink
Fix Kontaktsynchronisation löscht Outlook Kontakte
Browse files Browse the repository at this point in the history
  • Loading branch information
Kruemelino committed May 28, 2023
1 parent 6b1ee21 commit 804079f
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 25 deletions.
24 changes: 16 additions & 8 deletions FBoxDial/Fritz!Box/Extended/PhonebookEx.vb
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ Public Class PhonebookEx

Friend Function GetContact(EntryID As Integer) As FBoxAPI.Contact
Return Phonebook.Contacts.Find(Function(K) K.Uniqueid.AreEqual(EntryID))
If GetContact Is Nothing Then Stop
End Function

''' <summary>
Expand Down Expand Up @@ -80,21 +81,28 @@ Public Class PhonebookEx
''' </summary>
''' <param name="Kontakt"></param>
Friend Sub AddContact(Kontakt As FBoxAPI.Contact)
With Phonebook.Contacts
' Kontakt hinzufügen
.Add(Kontakt)
End With
If Kontakt IsNot Nothing Then
With Phonebook.Contacts
' Entferne alle Kontakte mit der selben UniqueID (sollte nur einen oder keinen geben)
.RemoveAll(Function(E) E.Uniqueid.AreEqual(Kontakt.Uniqueid))

' Kontakt hinzufügen
.Add(Kontakt)
End With
End If
End Sub

''' <summary>
''' Entfernt einen Kontakt aus der Liste.
''' </summary>
''' <param name="Kontakt">Der zu entfernende Kontakt.</param>
Friend Sub DeleteKontakt(Kontakt As FBoxAPI.Contact)
With Phonebook.Contacts
' Kontake entfernen
.Remove(Kontakt)
End With
If Kontakt IsNot Nothing Then
With Phonebook.Contacts
' Kontake entfernen
.Remove(Kontakt)
End With
End If
End Sub

''' <summary>
Expand Down
30 changes: 30 additions & 0 deletions FBoxDial/Fritz!Box/FritzBoxTelefonbuch.vb
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,36 @@ Namespace Telefonbücher
End With
End Function

Friend Async Function UploadContactAndReturn(TelefonbuchID As Integer, OutlookKontakt As ContactItem) As Task(Of FBoxAPI.Contact)
With OutlookKontakt
' Überprüfe, ob es in diesem Telefonbuch bereits einen verknüpften Kontakt gibt
Dim UID As Integer = .GetUniqueID(TelefonbuchID)

Dim retVal As FBoxAPI.Contact = Nothing

' Erstelle ein entsprechendes XML-Datenobjekt und lade es hoch
If Globals.ThisAddIn.FBoxTR064.X_contact.SetPhonebookEntryUID(TelefonbuchID, .ErstelleXMLKontakt(UID), UID) Then

' Merke dir die aktuelle Zeit in dem Kontakt
.SetFBoxModTime(TelefonbuchID, UID, Now)

' Stelle die Verknüpfung her
.SetUniqueID(TelefonbuchID.ToString, UID.ToString, True)

' Lade den Kontakt nochmal herunter
retVal = Await Globals.ThisAddIn.FBoxTR064.X_contact.GetPhonebookEntryUID(TelefonbuchID, UID)

' Statusmeldung
NLogger.Info(String.Format(Localize.resRibbon.UploadSuccess, .FullName, TelefonbuchID, retVal, UID))
Else
' Statusmeldung
NLogger.Warn(String.Format(Localize.resRibbon.UploadError, .FullName, TelefonbuchID, retVal))
End If

Return retVal
End With
End Function

''' <summary>
''' Startet das Hochladen mehrerer Outlook-Kontakte mittels asynchroner Aufgaben (<see cref="Task"/>).
''' </summary>
Expand Down
63 changes: 46 additions & 17 deletions FBoxDial/Kontakte/KontaktFunktionen.vb
Original file line number Diff line number Diff line change
Expand Up @@ -790,7 +790,7 @@ Friend Module KontaktFunktionen
''' Synchronisiert einen Kontaktordner <paramref name="OutlookOrdner"/> mit einem Fritz!Box Telefonbuch (<paramref name="FBoxTBuch"/>)
''' </summary>
''' <param name="OutlookOrdner">Der zu synchrinisierende Outlook Ordner</param>
''' <param name="FBoxTBuch">Das zu synchrinisierende Fritz!Box Telefonbuch</param>
''' <param name="FBoxTBuch">Das zu synchronisierende Fritz!Box Telefonbuch</param>
''' <param name="Modus">Der Synchronisationsmodus. Hier wird festgelegt, in welche Richtung die Daten bei Änderungen verschoben werden.</param>
''' <param name="ct">CancellationToken zum Abbruch der Routine</param>
''' <param name="Progress">Anbieter für Statusupdates</param>
Expand All @@ -801,6 +801,9 @@ Friend Module KontaktFunktionen
Dim TaskList As New List(Of Task)

Dim FBKontakte As New List(Of FBoxAPI.Contact)

'Dim DelKontakte As New List(Of ContactItem)

FBKontakte.AddRange(FBoxTBuch.GetContacts)

' Schleife durch jedes Element dieses Ordners.
Expand All @@ -816,7 +819,12 @@ Friend Module KontaktFunktionen
If uID.AreEqual(-1) Then
Progress?.Report($"Kontakt '{ .FullName}' auf der Fritz!Box erzeugt ...")
' Es gibt keinen Kontakt auf der Fritz!Box
TaskList.Add(Task.Run(Sub() Telefonbücher.SetTelefonbuchEintrag(FBoxTBuch.ID, .Self)))

' Lade den Kontakt hoch und füge ihn in das lokal heruntergeladene Telefonbuch ein
TaskList.Add(Task.Run(Async Function()
FBoxTBuch.AddContact(Await Telefonbücher.UploadContactAndReturn(FBoxTBuch.ID, .Self))
End Function))

Else
' Es gibt einen Kontakt im Fritz!Box Telefonbuch
Dim FBoxKontakt As FBoxAPI.Contact = FBoxTBuch.GetContact(uID)
Expand All @@ -829,8 +837,10 @@ Friend Module KontaktFunktionen
Case SyncMode.OutlookToFritzBox
Progress?.Report($"Kontakt '{ .FullName}' auf der Fritz!Box überschrieben (uID {FBoxKontakt.Uniqueid}) ...")

' Kontakt auf der Fritz!Box ersetzen
TaskList.Add(Task.Run(Sub() Telefonbücher.SetTelefonbuchEintrag(FBoxTBuch.ID, .Self)))
' Kontakt auf der Fritz!Box ersetzen und füge ihn in das lokal heruntergeladene Telefonbuch ein (wird überschrieben)
TaskList.Add(Task.Run(Async Function()
FBoxTBuch.AddContact(Await Telefonbücher.UploadContactAndReturn(FBoxTBuch.ID, .Self))
End Function))

Case SyncMode.FritzBoxToOutlook
Progress?.Report($"Kontakt '{ .FullName}' in Outlook überschrieben (uID {FBoxKontakt.Uniqueid}) ...")
Expand Down Expand Up @@ -911,10 +921,12 @@ Friend Module KontaktFunktionen
''' Synchronisiert einen einzelnen Outlook Kontakt <paramref name="olContact"/> mit einem Fritz!Box Telefonbuch.
''' </summary>
''' <param name="olContact">Der zu synchrinisierende Outlook Kontakt</param>
''' <param name="olFolder">Der Ordner in dem sich der zu synchrinisierende Outlook Kontakt befindet</param>
''' <param name="olFolder">Der Ordner in dem sich der zu synchronisierende Outlook Kontakt befindet</param>
<Extension> Friend Async Sub Synchronisierer(olContact As ContactItem, olFolder As MAPIFolder)

Dim olOrdner As OutlookOrdner = XMLData.POptionen.OutlookOrdner.Find(olFolder, OutlookOrdnerVerwendung.FBoxSync)
Dim Telefonbuch As PhonebookEx
Dim FBKontakt As FBoxAPI.Contact = Nothing

If olOrdner?.FBoxSyncOptions?.ValidData IsNot Nothing Then

Expand All @@ -925,10 +937,14 @@ Friend Module KontaktFunktionen
Dim uID As Integer = .GetUniqueID(olOrdner.FBoxSyncOptions.FBoxSyncID)
Dim bID As Integer = olOrdner.FBoxSyncOptions.FBoxSyncID

' Ermittle das lokal heruntergeladene Telefonbuch

If uID.AreEqual(-1) Then
NLogger.Info($"Kontakt '{ .FullName.RemoveLineBreaks}' auf der Fritz!Box erzeugt ...")
' Es gibt keinen Kontakt auf der Fritz!Box
Telefonbücher.SetTelefonbuchEintrag(bID, olContact)

' Lade den Kontakt hoch und füge ihn in das lokal heruntergeladene Telefonbuch ein
FBKontakt = Await Telefonbücher.UploadContactAndReturn(bID, olContact)
Else
' Es gibt einen Kontakt im Fritz!Box Telefonbuch

Expand All @@ -953,7 +969,7 @@ Friend Module KontaktFunktionen
NLogger.Info($"Kontakt '{ .FullName.RemoveLineBreaks}' auf der Fritz!Box überschrieben (uID {FBoxKontakt.Uniqueid})...")

' Kontakt auf der Fritz!Box ersetzen
Telefonbücher.SetTelefonbuchEintrag(bID, olContact)
FBKontakt = Await Telefonbücher.UploadContactAndReturn(bID, olContact)

End If

Expand All @@ -962,10 +978,24 @@ Friend Module KontaktFunktionen
' Nein ... Ein Kontakt sollte vorhanden sein...
NLogger.Info($"Kontakt '{ .FullName.RemoveLineBreaks}' auf der Fritz!Box nicht vorhanden. (uID {uID}) Erstelle einen neuen Kontakt auf der Fritz!Box...")

Telefonbücher.SetTelefonbuchEintrag(bID, olContact)
FBKontakt = Await Telefonbücher.UploadContactAndReturn(bID, olContact)
End If

End If

' Ein Kontakt wurde auf die Fritz!Box hochgeladen oder ersetzt
If FBKontakt IsNot Nothing Then
' Ermittle das zugehörige lokale Telefonbuch
Telefonbuch = Globals.ThisAddIn.PhoneBookXML.Where(Function(Buch) Buch.ID.AreEqual(bID))?.First

If Telefonbuch IsNot Nothing Then
Telefonbuch.AddContact(FBKontakt)
Else
NLogger.Warn($"Das lokale Telefonbuch mit der ID {bID}, indem der Kontakt { .FullName.RemoveLineBreaks} synchronisiert werden soll, ist nicht vorhanden.")
End If

End If

End With
End If
End Sub
Expand Down Expand Up @@ -996,9 +1026,7 @@ Friend Module KontaktFunktionen
''' Startet die automatische Synchronisation bei Outlook-Start.
''' </summary>
Friend Async Sub StartAutoSync()
Dim progressIndicator = New Progress(Of String)(Sub(status)
NLogger.Info(status)
End Sub)
Dim progressIndicator = New Progress(Of String)(Sub(status) NLogger.Info(status))

Dim TaskList As New List(Of Task(Of Integer))

Expand All @@ -1007,14 +1035,14 @@ Friend Module KontaktFunktionen
Dim FBoxTelefonbuch As PhonebookEx = Globals.ThisAddIn.PhoneBookXML.Where(Function(TB) TB.ID.AreEqual(Ordner.FBoxSyncOptions.FBoxSyncID)).First
If FBoxTelefonbuch IsNot Nothing Then

'If Not FBoxTelefonbuch.NurName OrElse Not Await FBoxTelefonbuch.UpdatePhonebook() Then
NLogger.Info($"Starte die automatische Syncronisation des Outlook-Ordners {Ordner.Name} mit {FBoxTelefonbuch.Name}")

TaskList.Add(Task.Run(Function() Synchronisierer(Ordner.MAPIFolder, FBoxTelefonbuch, SyncMode.FritzBoxToOutlook, Nothing, progressIndicator)))
'End If

End If

' Die einzelnen Vorgänge müssen nacheinander erfolgen, da es sonst zu einer WebException kommt: Die zugrunde liegende Verbindung wurde geschlossen: Für den geschützten SSL/TLS-Kanal konnte keine Vertrauensstellung hergestellt werden.
' Die einzelnen Vorgänge müssen nacheinander erfolgen, da es sonst zu einer WebException kommt:
' Die zugrunde liegende Verbindung wurde geschlossen: Für den geschützten SSL/TLS-Kanal konnte keine Vertrauensstellung hergestellt werden.
If TaskList.Any Then Await TaskList.Last
Next
NLogger.Info($"Automatische Syncronisation abgeschlossen: {(Await Task.WhenAll(TaskList)).Sum}")
Expand Down Expand Up @@ -1547,6 +1575,7 @@ Friend Module KontaktFunktionen
''' <param name="XMLKontakt"></param>
Friend Sub ÜberschreibeKontakt(olKontakt As ContactItem, XMLKontakt As FBoxAPI.Contact)
If olKontakt IsNot Nothing AndAlso XMLKontakt IsNot Nothing Then
' TODO: Eventuell vorhandene Daten im Outlook-Kontakt löschen
XMLKontakt.XMLKontaktOutlook(olKontakt)

' Indizere den Kontakt, wenn der Ordner, in den er gespeichert werden soll, auch zur Kontaktsuche verwendet werden soll
Expand All @@ -1559,10 +1588,10 @@ Friend Module KontaktFunktionen
''' <summary>
''' Ermittelt die UniqueID des verknüpften Fritz!Box Telefonbucheintrages.
''' </summary>
''' <param name="olKontakte">Der Outlook-Kontakt, aus dem die UniqueID ausgelesen werden soll.</param>
''' <param name="olKontakt">Der Outlook-Kontakt, aus dem die UniqueID ausgelesen werden soll.</param>
''' <param name="TelefonbuchID">Die ID des zugehörigen Telefonbuches.</param>
<Extension> Friend Function GetUniqueID(olKontakte As ContactItem, TelefonbuchID As Integer) As Integer
With olKontakte
<Extension> Friend Function GetUniqueID(olKontakt As ContactItem, TelefonbuchID As Integer) As Integer
With olKontakt

' Überprüfe, ob es in diesem Kontakt Daten zu einem Eintrag in einem Telefonbuch gibt
Dim colArgs() As Object = CType(.PropertyAccessor.GetProperties(DASLTagFBTelBuch), Object())
Expand Down

0 comments on commit 804079f

Please sign in to comment.