OSCARLib Frage

  • Allgemein

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    OSCARLib Frage

    Hallo Zusammen,

    ich experimentiere zurzeit etwas mit der OSCARLib herum. Allerdings hab ich da ein kleines Problem. Evtl. ist das auch keine Sache die speziell die OSCARLib betrifft daher bitte ich es zu Entschuldigen wenn das hier das falsche Forum sein sollte.

    Also ich fang mal an:

    Wenn ich das richtig verstanden habe muss man bei der Lib für alles ein Handler erstellen.

    Das sieht jetzt momentan bei mir so aus:

    VB.NET-Quellcode

    1. 'Add Handler
    2. AddHandler _session.LoginFailed, AddressOf _login_Failed
    3. AddHandler _session.LoginCompleted, AddressOf _login_Completed
    4. AddHandler _session.ContactListFinished, AddressOf _login_ContactListFinished
    5. AddHandler _session.StatusUpdate, AddressOf _session_StatusUpdate
    6. AddHandler _session.WarningMessage, AddressOf _session_WarningMessage
    7. AddHandler _session.AuthorizationRequestReceived, AddressOf _auth_RequestReceived
    8. AddHandler _session.AuthorizationResponseReceived, AddressOf _auth_ResponseReceived
    9. AddHandler _session.FutureAuthorizationReceived, AddressOf _auth_FutureReceived
    10. AddHandler _session.Statuses.UserInfoReceived, AddressOf _status_UserInfoReceived
    11. AddHandler _session.Statuses.UserStatusReceived, AddressOf _status_UserStatusReceived
    12. AddHandler _session.Statuses.UserOffline, AddressOf _status_UserOffline


    Jetzt weiß ich aber nicht wie prüfen kann ob etwas schon "fertig" ist da das ja alles im einem extra Thread läuft.

    Bsp.:

    VB.NET-Quellcode

    1. Private Sub _status_UserStatusReceived(ByVal sender As Object, ByVal userinfo As UserInfo)
    2. If userinfo.ICQUserStatus = ICQStatus.Online Then
    3. _users.Add(userinfo.ScreenName & " | " & "Online")
    4. Else
    5. _users.Add(userinfo.ScreenName & " | " & "Offline")
    6. End If
    7. End Sub


    Erstes kann daraus schon mal nicht auf die GUI zugreifen, daher schreibe ich es in ein List Of (String). Aber ich weiß jetzt ja nicht wenn das abgeschlossen ist.
    Klar könnte ich jetzt hier mit while schleifen arbeiten, aber da muss es doch eine schönere Lösung geben. (?)

    Vollständigkeit halber hier der komplette Code
    (Hier habs ich mal mit while schleifen versucht. Tut auch aber ist halt keine saubere Lösung finde ich) :

    Spoiler anzeigen


    VB.NET-Quellcode

    1. Public Class Form1
    2. Inherits QRibbonForm
    3. Dim _session As New Session(My.Settings.UIN, My.Settings.Password)
    4. Dim _users As New List(Of String)
    5. Dim _complete As Boolean = False
    6. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    7. If _session.LoggedIn = False Then
    8. _session.Logoff()
    9. End If
    10. End Sub
    11. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    12. 'Add Handler
    13. AddHandler _session.LoginFailed, AddressOf _login_Failed
    14. AddHandler _session.LoginCompleted, AddressOf _login_Completed
    15. AddHandler _session.ContactListFinished, AddressOf _login_ContactListFinished
    16. AddHandler _session.StatusUpdate, AddressOf _session_StatusUpdate
    17. AddHandler _session.WarningMessage, AddressOf _session_WarningMessage
    18. AddHandler _session.AuthorizationRequestReceived, AddressOf _auth_RequestReceived
    19. AddHandler _session.AuthorizationResponseReceived, AddressOf _auth_ResponseReceived
    20. AddHandler _session.FutureAuthorizationReceived, AddressOf _auth_FutureReceived
    21. AddHandler _session.Statuses.UserInfoReceived, AddressOf _status_UserInfoReceived
    22. AddHandler _session.Statuses.UserStatusReceived, AddressOf _status_UserStatusReceived
    23. AddHandler _session.Statuses.UserOffline, AddressOf _status_UserOffline
    24. _session.SetDefaultIdentification()
    25. _session.Logon(My.Settings.login_server, My.Settings.login_port)
    26. While _session.LoggedIn = False
    27. End While
    28. Label_status.Text = "Online"
    29. For Each _buddy As SSIBuddy In _session.SSI.GetSSIBuddyList
    30. _session.Statuses.RequestBasicUserInfo(_buddy.Name, BasicUserInfoRequest.OnlineInfo)
    31. Next
    32. While _complete = False
    33. End While
    34. For Each _user In _users
    35. lv_users.Items.Add(_user)
    36. Next
    37. End Sub
    38. Private Sub _login_Failed(ByVal sess As Session, ByVal errorcode As LoginErrorCode)
    39. MessageBox.Show("Failed to Login: " & errorcode.ToString)
    40. End Sub
    41. Private Sub _login_Completed(ByVal sess As Session)
    42. MessageBox.Show("Login Complete")
    43. End Sub
    44. Private Sub _login_ContactListFinished(ByVal sess As Session, ByVal lastModificationDate As Date)
    45. _session.ActivateBuddyList()
    46. End Sub
    47. Private Sub _session_StatusUpdate(ByVal sess As Session, ByVal message As String)
    48. Throw New NotImplementedException
    49. End Sub
    50. Private Sub _auth_RequestReceived(ByVal sess As Session, ByVal screenname As String, ByVal reason As String)
    51. Throw New NotImplementedException
    52. End Sub
    53. Private Sub _session_WarningMessage(ByVal sess As Session, ByVal errorcode As ServerErrorCode)
    54. Throw New NotImplementedException
    55. End Sub
    56. Private Sub _auth_ResponseReceived(ByVal sess As Session, ByVal screenname As String, ByVal authorizationGranted As Boolean, ByVal reason As String)
    57. Throw New NotImplementedException
    58. End Sub
    59. Private Sub _auth_FutureReceived(ByVal sess As Session, ByVal screenname As String, ByVal reason As String)
    60. Throw New NotImplementedException
    61. End Sub
    62. Private Sub _status_UserInfoReceived(ByVal sender As Object, ByVal info As UserInfoResponse)
    63. Throw New NotImplementedException
    64. End Sub
    65. Private Sub _status_UserStatusReceived(ByVal sender As Object, ByVal userinfo As UserInfo)
    66. If userinfo.ICQUserStatus = ICQStatus.Online Then
    67. _users.Add(userinfo.ScreenName & " | " & "Online")
    68. Else
    69. _users.Add(userinfo.ScreenName & " | " & "Offline")
    70. End If
    71. _complete = True
    72. End Sub
    73. Private Sub _status_UserOffline(ByVal sender As Object, ByVal userinfo As UserInfo)
    74. Throw New NotImplementedException
    75. End Sub
    76. End Class




    Ich weiß das ist nicht so wirklich gut erklärt, aber ich hoffe ihr versteht was mein Problem ist. Vielen Dank.

    Gruß Seji
    ich hätte das mit einem Invoke gemacht(oder natürlich in einer Extra Klasse alles nochmal neu mit den Events...)

    VB.NET-Quellcode

    1. Private Delegate Sub UserStatusReceived(ByVal sender As Object, ByVal userinfo As UserInfo)
    2. Private Sub _status_UserStatusReceived(ByVal sender As Object, ByVal userinfo As UserInfo)
    3. If Me.InvokeRequired Then
    4. Me.Invoke(New UserStatusReceived(AddressOf _status_UserStatusReceived),New Object() {sender,userinfo})
    5. Else
    6. If userinfo.ICQUserStatus = ICQStatus.Online Then
    7. _users.Add(userinfo.ScreenName & " | " & "Online")
    8. Else
    9. _users.Add(userinfo.ScreenName & " | " & "Offline")
    10. End If
    11. End If
    12. End Sub

    _users ist nun deine ListBox
    guck dir den(/die) Code(veränderungen) an und verstehe ihn(/diese), dann sollte es dir auch möglich sein das ganze auf die anderen Events zu übertragen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hallo,

    vielen dank für dein schneller Antwort. Ich werde mir das mal anschauen.
    Allerdings ist mir nicht ganz klar wozu dieses Delegate Sub gut ist. Benötige ich das damit der Invoke funktioniert?

    Gruß Seji

    EDIT: Sry gut Delegate Sub benötige ich um den Invoke zu fahren. Jetzt geht er aber in den Handler immer zweimal (was ja logisch ist -> invoke ruft das ja nochmal auf) aber eigentlich dürfte er da doch wegen dem Else nicht reingehen, oder?
    er geht wegen dem Else beim ersten mal nicht rein, beim zweiten mal sollte dies jedohc der Fall sein ;)...
    außerdem wäre es anstatt dem Delegaten auch möglich die EventArgs zu verwenden(evtl. UserStatusReceivedEventArgs?!)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Also EventArgs hab ich keine gesehen bei der Lib. Allerdings geht der mir 4x durch wodurch er dann zweimal im Else landet. Aber warum ist mir nicht klar.

    Code again:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Qios.DevSuite.Components.Ribbon
    2. Imports csammisrun.OscarLib
    3. Public Class Form1
    4. Inherits QRibbonForm
    5. Public _session As New Session(My.Settings.UIN, My.Settings.Password)
    6. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    7. If _session.LoggedIn = False Then
    8. _session.Logoff()
    9. End If
    10. End Sub
    11. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    12. 'Add Handler
    13. AddHandler _session.LoginFailed, AddressOf _login_Failed
    14. AddHandler _session.LoginCompleted, AddressOf _login_Completed
    15. AddHandler _session.ContactListFinished, AddressOf _login_ContactListFinished
    16. AddHandler _session.StatusUpdate, AddressOf _session_StatusUpdate
    17. AddHandler _session.WarningMessage, AddressOf _session_WarningMessage
    18. AddHandler _session.AuthorizationRequestReceived, AddressOf _auth_RequestReceived
    19. AddHandler _session.AuthorizationResponseReceived, AddressOf _auth_ResponseReceived
    20. AddHandler _session.FutureAuthorizationReceived, AddressOf _auth_FutureReceived
    21. AddHandler _session.Statuses.UserInfoReceived, AddressOf _status_UserInfoReceived
    22. AddHandler _session.Statuses.UserStatusReceived, AddressOf _status_UserStatusReceived
    23. AddHandler _session.Statuses.UserOffline, AddressOf _status_UserOffline
    24. lv_users.Items.Clear()
    25. _session.SetDefaultIdentification()
    26. _session.Logon(My.Settings.login_server, My.Settings.login_port)
    27. End Sub
    28. Private Sub _login_Failed(ByVal sess As Session, ByVal errorcode As LoginErrorCode)
    29. MessageBox.Show("Failed to Login: " & errorcode.ToString)
    30. End Sub
    31. Private Delegate Sub LoginCompleted(ByVal sess As Session)
    32. Private Sub _login_Completed(ByVal sess As Session)
    33. If Me.InvokeRequired Then
    34. Me.Invoke(New LoginCompleted(AddressOf _login_Completed), New Object() {sess})
    35. Else
    36. Label_status.Text = "Online"
    37. End If
    38. End Sub
    39. Private Sub _login_ContactListFinished(ByVal sess As Session, ByVal lastModificationDate As Date)
    40. _session.ActivateBuddyList()
    41. For Each _buddy As SSIBuddy In _session.SSI.GetSSIBuddyList
    42. _session.Statuses.RequestBasicUserInfo(_buddy.Name, BasicUserInfoRequest.OnlineInfo)
    43. Next
    44. End Sub
    45. Private Sub _session_StatusUpdate(ByVal sess As Session, ByVal message As String)
    46. Throw New NotImplementedException
    47. End Sub
    48. Private Sub _auth_RequestReceived(ByVal sess As Session, ByVal screenname As String, ByVal reason As String)
    49. Throw New NotImplementedException
    50. End Sub
    51. Private Sub _session_WarningMessage(ByVal sess As Session, ByVal errorcode As ServerErrorCode)
    52. Throw New NotImplementedException
    53. End Sub
    54. Private Sub _auth_ResponseReceived(ByVal sess As Session, ByVal screenname As String, ByVal authorizationGranted As Boolean, ByVal reason As String)
    55. Throw New NotImplementedException
    56. End Sub
    57. Private Sub _auth_FutureReceived(ByVal sess As Session, ByVal screenname As String, ByVal reason As String)
    58. Throw New NotImplementedException
    59. End Sub
    60. Private Sub _status_UserInfoReceived(ByVal sender As Object, ByVal info As UserInfoResponse)
    61. MsgBox(info.Info.ICQUserStatus.ToString)
    62. End Sub
    63. Private Delegate Sub UserStatusReceived(ByVal sender As Object, ByVal userinfo As UserInfo)
    64. Private Sub _status_UserStatusReceived(ByVal sender As Object, ByVal userinfo As UserInfo)
    65. If Me.InvokeRequired Then
    66. Me.Invoke(New UserStatusReceived(AddressOf _status_UserStatusReceived), New Object() {sender, userinfo})
    67. Else
    68. lv_users.Items.Add(userinfo.ScreenName & " | " & "Online")
    69. End If
    70. End Sub
    71. Private Delegate Sub UserOffline(ByVal sender As Object, ByVal userinfo As UserInfo)
    72. Private Sub _status_UserOffline(ByVal sender As Object, ByVal userinfo As UserInfo)
    73. If Me.InvokeRequired Then
    74. Me.Invoke(New UserOffline(AddressOf _status_UserOffline), New Object() {sender, userinfo})
    75. Else
    76. lv_users.Items.Add(userinfo.ScreenName & " | " & "Offline")
    77. End If
    78. End Sub
    79. Private Sub lv_users_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lv_users.MouseDoubleClick
    80. message.Label_user_remote.Text = lv_users.SelectedItem.ToString.Split("|")(0).ToString.Trim
    81. message.Show()
    82. End Sub
    83. End Class


    Gruß Seji
    woher weißt du, dass es vier mal passiert? Aufgrund von Haltepunkten, oder Aufgrund dessen was im Formular passiert?
    Das sieht mir nämlich viel mehr nach einem(mehr oder weniger) Fehler in der Lib aus...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hm also beim login passt es, nur bei der Kontaktliste macht er den loop.

    Habs jetzt so gelöst:

    VB.NET-Quellcode

    1. Dim _exit As Boolean = False
    2. If Me.InvokeRequired Then
    3. Me.Invoke(New UserStatusReceived(AddressOf _status_UserStatusReceived), New Object() {sender, userinfo})
    4. Else
    5. For Each _user In lv_users.Items
    6. If _user.ToString = userinfo.ScreenName & " | " & "Online" Then
    7. _exit = True
    8. Exit For
    9. End If
    10. Next
    11. If _exit = False Then
    12. lv_users.Items.Add(userinfo.ScreenName & " | " & "Online")
    13. End If
    14. _exit = False
    15. End If


    Aber ich denke ich komm so jetzt erstmal weiter. Also vielen Dank!!

    Gruß Seji

    VB.NET-Quellcode

    1. If lv_users.Items.Contains(userinfo.ScreenName & " | " & "Online") = False Then
    2. lv_useres.Items.Add(userinfo.ScreenName & " | " & "Online")
    3. End If
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---