I'm not sure how the version 10 api works, but here is how I did it on the version 9 API. I store all my data in datatables and updates every half second. Then when you need data you simply make a call to the datatable. It actually runs quite efficiently and has a very low CPU and memory load.
Public Ds As New DataSet
Public ExtTbl As DataTable = Ds.Tables.Add()
Public CnnTbl As DataTable = Ds.Tables.Add()
Public DevTbl As DataTable = Ds.Tables.Add()
Dim oCallback As New TimerCallback(AddressOf Tmr_Elapsed)
Public Tmr = New System.Threading.Timer(oCallback, Nothing, 500, 500)
Private WithEvents EnumExt As New System.ComponentModel.BackgroundWorker
'Dim oCBack As New TimerCallback(AddressOf DevTmr_Elapsed)
'Public DevTmr = New System.Threading.Timer(oCBack, Nothing, 5000, 3600000)
Dim Counter As Integer = 0
Dim DevCounter As Integer = 0
Public Cnn As String = "" 'DB connection
Public DBPwd As String = ""
Sub Tmr_Elapsed(ByVal state As Object)
Try
If TCX.Configuration.PhoneSystem.Root.Connected = False Then ps.Root.Connect()
Catch ex As Exception
Debug.Print(ex.Message)
End Try
If EnumExt.IsBusy = False Then
EnumExt.RunWorkerAsync()
'Debug.Print("refreshed")
Else
'Debug.Print("Busy")
End If
End Sub
'Sub DevTmr_Elapsed(ByVal state As Object)
' 'EnumDevices()
'End Sub
Public Sub ActiveConnections()
Dim TDS As New DataSet()
Dim ConnTbl As DataTable = TDS.Tables.Add()
ConnTbl.Columns.Add("Ext", GetType(String))
ConnTbl.Columns.Add("Change", GetType(String))
ConnTbl.Columns.Add("Status", GetType(String))
ConnTbl.Columns.Add("CallID", GetType(String))
ConnTbl.Columns.Add("Caller", GetType(String))
ConnTbl.Columns.Add("Type", GetType(String))
Dim conns As ActiveConnection() = ps.GetActiveConnections
Dim AC As ActiveConnection
For Each AC In conns
ConnTbl.Rows.Add(AC.DN.Number, AC.CallID, AC.LastChangeStatus, CInt(AC.Status), AC.ExternalParty, "Call")
Next
If Not (CnnTbl Is Nothing) Then CnnTbl.Dispose()
CnnTbl = ConnTbl
ConnTbl.Dispose()
conns = Nothing
AC = Nothing
End Sub
Private Sub EnumExt_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles EnumExt.DoWork
Dim TDS As New DataSet()
Dim ExtTable As DataTable = TDS.Tables.Add()
Dim ConnTbl As DataTable = TDS.Tables.Add()
ConnTbl.Columns.Add("Ext", GetType(String))
ConnTbl.Columns.Add("Change", GetType(String))
ConnTbl.Columns.Add("Status", GetType(String))
ConnTbl.Columns.Add("CallID", GetType(String))
ConnTbl.Columns.Add("Caller", GetType(String))
ConnTbl.Columns.Add("Type", GetType(String))
ConnTbl.Columns.Add("Outbound", GetType(String))
ExtTable.Columns.Add("Ext", GetType(String))
ExtTable.Columns.Add("Group", GetType(String))
ExtTable.Columns.Add("Desc", GetType(String))
ExtTable.Columns.Add("Reg", GetType(String))
ExtTable.Columns.Add("Status", GetType(String))
ExtTable.Columns.Add("Type", GetType(String))
ExtTable.Columns.Add("", GetType(String))
Dim d As DN() = ps.GetExtensions
For x = 0 To d.GetUpperBound(0)
Dim ext As TCX.Configuration.Extension = d(x), Grp As String = ""
If ext.Groups.Length > 0 Then Grp = ext.Groups(0).Name
Try
ExtTable.Rows.Add(d(x).Number, Grp, d(x).ToString, CInt(ext.UserStatus), CInt(d(x).IsRegistered), "Ext", "")
Catch ex As Exception
End Try
Dim conns As ActiveConnection() = d(x).GetActiveConnections()
Dim AC As ActiveConnection
For Each AC In conns
Try
ConnTbl.Rows.Add(AC.DN.Number, AC.CallID, AC.LastChangeStatus, CInt(AC.Status), AC.ExternalParty, "Call", CInt(AC.IsOutbound))
Catch ex As Exception
End Try
Next
Next
Try
ExtTbl.Dispose()
CnnTbl.Dispose()
Catch ex As Exception
End Try
ExtTbl = ExtTable
CnnTbl = ConnTbl
TDS.Dispose()
ExtTable.Dispose()
ConnTbl.Dispose()
TDS.Dispose()
End Sub
Public Sub EnumDevices()
Dim TDS As New DataSet()
Dim DeviceTbl As DataTable = TDS.Tables.Add()
DeviceTbl.Columns.Add("Ext", GetType(String))
DeviceTbl.Columns.Add("IP", GetType(String))
Dim Dev As DeviceInfo() = ps.GetDetectedDevices
Dim D As DeviceInfo
For Each D In Dev
DeviceTbl.Rows.Add(D.UserAgent, D.NetworkAddress)
Next
DevTbl.Dispose()
DevTbl = DeviceTbl
DeviceTbl.Dispose()
TDS.Dispose()
End Sub
Public Sub GetDbConnection()
Dim appDir As String = "C:\Program Files (x86)\3CX PhoneSystem\Bin\3CXPhoneSystem.ini"
Dim objReader As New System.IO.StreamReader(appDir)
Dim Txt As String = ""
Do While objReader.Peek() <> -1
Txt = objReader.ReadLine
If Strings.Left(Txt, 11) = "dbPassword=" Then
DBPwd = Strings.Right(Txt, Len(Txt) - 11)
End If
Loop
Cnn = "Server=127.0.0.1;Port=5480;Database=phonesystem;User Id=phonesystem;Password=" & DBPwd & ";"
End Sub