CAPI-Monitor

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

CAPI-Monitor

Beitrag von bobobo »

etwas um mittels Capi Telefonie Funktionen abzufragen
(Es funktioniert z.B. mit dem Capi-Treiber von Fritz-Boxen oder -Karten)

Code: Alles auswählen

;########################################
;author : andreas 
;minimal CAPI-Monitor ; etwas getunt für PB 4.51
;########################################
;Mehr INFO's
;http://www.capi.org/pages/downloads.php
;########################################
Global IsCapi.l, AppID.l

#CAPI_ALERT = $1
#CAPI_CONNECT = $2
#CAPI_DISCONNECT = $4
#CAPI_LISTEN = $5

#CAPI_REQ = $80; { request from application to CAPI               }
#CAPI_CONF = $81; { CAPI confirms a request                        }
#CAPI_IND = $82; { CAPI indicates an incoming event               }
#CAPI_RESP = $83; { application confirms reception if incoming e.  }

;Default value For Controller (i.e. in LISTEN_REQ)
#ctrDefault = 1

;Info-Mask For LISTEN_REQ
#imaDefault = $007F;  { = imMaskAll }
#imaCause = $0001
#imaDateTime = $0002
#imaDisplay = $0004
#imaUserUserInfo = $0008
#imaCallProgression = $0010
#imaFacility = $0020
#imaCharging = $0040
#imaMaskAll = $007F

;CIP-Mask For LISTEN_REQ
#cipDefault = $1FFF03FE;  { sets all Bits }
#cipAnyMatch = $00000001;  { in CONNECT_IND look for BC, HLC u. LLC }
#cipSpeech = $00000002;  { speech }
#cipUnrestDigitalInfo = $00000004;  { unrestricted digital information }
#cipRestDigitalInfo = $00000008;  { restricted digital information }
#cip31kHzAudio = $00000010;  { 3.1 kHz audio }
#cip70kHzAudio = $00000020;  { 7.0 kHz audio }
#cipVideo = $00000040;  { video }
#cipPacketMode = $00000080;  { packet mode }
#cip56kBits = $00000100;  { 56 kBit/s rate adaptation }
#cipUnrestDigitalInfoTA = $00000200;  { unrestricted digital information with tones/announcements }
;{ 10..15 reserved }
#cipTelephony = $00010000;  { telephony }
#cipFaxGroup3 = $00020000;  { fax group 2/3 }
#cipFaxGroup4Class1 = $00040000;  { fax group 4 class 1 }
#cipTeletexbm = $00080000;  { Teletex service (basic and mixed), fax group 4 class 2 }
#cipTeletexbp = $00100000;  { Teletex service (basic and processable) }
#cipTeletexb = $00200000;  { Teletex service (basic) }
#cipVideotex = $00400000;  { Videotex }
#cipTelex = $00800000;  { Telex }
#cipX400 = $01000000;  { message handling systems according X.400 }
#cipX200 = $02000000;  { OSI applications according X.200 }
#cip7kHzTelephony = $04000000;  { 7 kHz Telephony }
#cipF721First = $08000000;  { Video Telephony F.721, first connection }
#cipF721Second = $10000000;  { Video Telephony F.721, second connection }

;CIP-Mask2 For LISTEN_REQ
#cip2Default = 0; { reserved }

;CIP Values For CONNECT_IND
#civNoProfile = 0; { no predefined profile }
#civSpeech = 1; { speech - i.e. ISDN telephone}
#civUnrestDigitalInfo = 2; { unrestricted digital information }
#civRestDigitalInfo = 3; { restricted digital information }
#civ31kHzAudio = 4; { 3.1 kHz audio, i.e. analog telephone }
#civ70kHzAudio = 5; { 7.0 kHz audio }
#civVideo = 6; { video }
#civPacketMode = 7; { packet mode }
#civ56kBits = 8; { 56 kBit/s rate adaptation }
#civUnrestDigitalInfoTA = 9; { unrestricted digital information with tones/announcements }
;{ 10..15 reserved }
#civTelephony = 16; { telephony }
#civFaxGroup3 = 17; { fax group 2/3 }
#civFaxGroup4Class1 = 18; { fax group 4 class 1 }
#civTeletexbm = 19; { Teletex service (basic and mixed), fax group 4 class 2 }
#civTeletexbp = 20; { Teletex service (basic and processable) }
#civTeletexb = 21; { Teletex service (basic) }
#civVideotex = 22; { Videotex }
#civTelex = 23; { Telex }
#civX400 = 24; { message handling systems according X.400 }
#civX200 = 25; { OSI applications according X.200 }
#civ7kHzTelephony = 26; { 7 kHz Telephony }
#civF721First = 27; { Video Telephony F.721, first connection }
#civF721Second = 28; { Video Telephony F.721, second connection }

;Parameter Reject For CONNECT_RESP
#rjeAcceptCall = $0000
#rjeIgnoreCall = $0001; { other devices can accept the call }
#rjeNormalClear = $0002; { hang up }
#rjeUserBusy = $0003; { busy }
#rjeIncompDest = $0007; { incompatible destination }
#rjeUndefined = $FFFF; { not Capi defined }

Structure ListenREQ
  Lenght.w
  AppID.w
  Command.b
  Subcommand.b
  Message_Number.w
  Controller.l
  InfoMask.l
  CIPMask.l
  CIPMas2.l
  CallingParty.b
  CallingPartySub.b
EndStructure

Structure AlertREQ
  Lenght.w
  AppID.w
  Command.b
  Subcommand.b
  Message_Number.w
  PLCI.l
  BCI.w
  kpf.b
  uud.b
  fda.b
EndStructure

Structure ConnectResp
  Length.w
  AppID.w
  Command.b
  Subcommand.b
  Message_Number.b
  PLCI.l
  Reject.w
  BProtocol.l
  ConnectedNumber.l
  ConnectedSubaddress.l
  LLC.b
  AdditionalInfo.b
EndStructure

Structure DisconnectReq
  Length.w
  AppID.w
  Command.b
  Subcommand.b
  Message_Number.w
  PLCI.l
  b1.b
EndStructure

Procedure SaveList(Text$)
  OpenFile(0,"Capi_Log.Log")
  FileSeek(0,Lof(0))
  WriteStringN(0,Text$)
  CloseFile(0)
EndProcedure

Procedure ReadList()
  If ReadFile(0,"Capi_Log.Log")
    Repeat
      Text$ = ReadString(0)
      If Text$ > ""
        AddGadgetItem(6,0,"")
        SetGadgetItemText(6,0,StringField(Text$,1,";"),0)
        SetGadgetItemText(6,0,StringField(Text$,2,";"),1)
        SetGadgetItemText(6,0,StringField(Text$,3,";"),2)
        SetGadgetItemText(6,0,StringField(Text$,4,";"),3)
      EndIf
    Until Text$ = ""
    CloseFile(0)
  EndIf
EndProcedure

Procedure TimerProc(hwnd,msg,wParam,lParam)
  Protected Retval.l,IsMessage.l
  Retval = 0
  *CapiBuffer = AllocateMemory(3072)
  IsMessage = CallFunction(0,"CAPI_GET_MESSAGE",AppID,@*CapiBuffer)
  If IsMessage = 0
    If PeekB(*CapiBuffer+4) = #CAPI_DISCONNECT;Verbindung getrennt
      ;--auf Wiedersehen sagen
      Disconnect.DisconnectReq
      Disconnect\Length = SizeOf(DisconnectReq)
      Disconnect\AppID = AppID
      Disconnect\Command = #CAPI_DISCONNECT
      Disconnect\Subcommand = #CAPI_RESP
      Disconnect\Message_Number = 0
      Disconnect\PLCI = PeekL(*CapiBuffer+8)
      CallFunction(0,"CAPI_PUT_MESSAGE",AppID,Disconnect)
      SetGadgetText(1,"Warte auf Anruf")
      
    EndIf
    If PeekB(*CapiBuffer+4) = #CAPI_CONNECT
      LaengeMSN = PeekB(*CapiBuffer+14);Länge der MSN
      Gerufene_Nummer$ = PeekS(*CapiBuffer+16,LaengeMSN-1)
      Laenge_Anrufernummer = PeekB(*CapiBuffer+(LaengeMSN+15));Länge der Rufnummer des Anrufers
      Anrufer_Nummer$ = "0"+PeekS(*CapiBuffer+(LaengeMSN+18),Laenge_Anrufernummer)
      SetGadgetText(1,"Online")
      AddGadgetItem(6,0,"")
      SetGadgetItemText(6,0,Gerufene_Nummer$,0)
      SetGadgetItemText(6,0,Anrufer_Nummer$,1)
      SetGadgetItemText(6,0,FormatDate("%hh:%ii:%ss", Date()),2)
      SetGadgetItemText(6,0,FormatDate("%dd"+"."+"%mm"+"."+"%yyyy", Date()),3)
      SaveList(Gerufene_Nummer$+";"+Anrufer_Nummer$+";"+FormatDate("%hh:%ii:%ss", Date())+";"+FormatDate("%dd"+"."+"%mm"+"."+"%yyyy", Date()))
      
      ;--Alerting einschalten:
      AlertREQ.AlertREQ
      AlertREQ\Lenght = SizeOf(AlertREQ)
      AlertREQ\AppID = AppID
      AlertREQ\Command = #CAPI_ALERT
      AlertREQ\Subcommand = #CAPI_REQ
      AlertREQ\Message_Number = 0
      AlertREQ\PLCI = PeekL(*CapiBuffer+8)
      AlertREQ\BCI = 0
      AlertREQ\kpf = 0
      AlertREQ\uud = 0
      AlertREQ\fda = 0
      CallFunction(0,"CAPI_PUT_MESSAGE",AppID,AlertREQ)
      
      ;--Antworten
      ConnectResp.ConnectResp
      ConnectResp\Length = SizeOf(ConnectResp)
      ConnectResp\AppID = AppID
      ConnectResp\Command = #CAPI_CONNECT
      ConnectResp\Subcommand = #CAPI_RESP
      ConnectResp\Message_Number = 0
      ConnectResp\PLCI = PeekL(*CapiBuffer+8)
      ConnectResp\Reject = #rjeAcceptCall
      ConnectResp\BProtocol = 0
      ConnectResp\ConnectedNumber = 0
      ConnectResp\ConnectedSubaddress = 0
      ConnectResp\LLC = 0
      ConnectResp\AdditionalInfo = 0
      CallFunction(0,"CAPI_PUT_MESSAGE",AppID,ConnectResp)
    EndIf
    
  EndIf
  FreeMemory(*CapiBuffer)
  ProcedureReturn RetVal
EndProcedure

If OpenWindow(0,0,0,400,300,"minimal Capimonitor",#PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  ButtonGadget(0, 10, 10, 200, 20, "Ende")
  TextGadget(1, 10, 40,250,20,"Warte auf Anruf")
  ListIconGadget(6, 10,60,380,200,"MSN",76,#PB_ListIcon_GridLines)
  AddGadgetColumn(6, 1,"Anrufer",120)
  AddGadgetColumn(6, 2,"Zeit",90)
  AddGadgetColumn(6, 3,"Datum",90)
  ReadList()
  IsCapi = OpenLibrary(0,"Capi2032.dll")
  If IsCapi
    CallFunction(0,"CAPI_REGISTER",3072,2,7,2048,@AppID)
    ;3072 Byte Puffergröße
    ;Max. 2 logische Verbindungen
    ;Max. 7 Datenblocks
    ;Max. 2048 Byte Daten
    ListenReq.ListenREQ
    ListenReq\Lenght = SizeOf(ListenREQ)
    ListenReq\AppID = AppID
    ListenReq\Command = #CAPI_LISTEN
    ListenReq\Subcommand = #CAPI_REQ
    ListenReq\Message_Number = 0
    ListenReq\Controller = #ctrDefault
    ListenReq\InfoMask = #imaDefault
    ListenReq\CIPMask = #cipAnyMatch
    ListenReq\CIPMas2 = #cip2Default
    ListenReq\CallingParty = 0
    ListenReq\CallingPartySub = 0
    CallFunction(0,"CAPI_PUT_MESSAGE",AppID,@ListenReq)
  Else
    SetGadgetText(1,"No CAPI")
  EndIf
  
  SetTimer_(WindowID(0),1,500,@TimerProc())
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            KillTimer_(WindowID(0),1)
            If IsCapi
              CallFunction(0,"CAPI_RELEASE",AppID)
              CloseLibrary(0)
            EndIf
            SendMessage_(WindowID(0),#WM_CLOSE,0,0)
        EndSelect
      Case #PB_Event_CloseWindow
        quit = 1
    EndSelect
  Until quit = 1
EndIf
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.