package uk.co.mmscomputing.application.avmisdnmonitor; import java.util.*; import java.awt.*; import javax.swing.*; import javax.swing.tree.*; import javax.swing.border.*; import uk.co.mmscomputing.concurrent.*; import uk.co.mmscomputing.util.*; import uk.co.mmscomputing.device.capi.*; import uk.co.mmscomputing.device.capi.facility.*; import uk.co.mmscomputing.device.capi.man.avm.*; public class MainApp extends UtilMainApp implements Runnable{ // inspired by: avm/kisdnwatch-01.00.08/kavmmon/ccapiinfo.h and ccapiinfo.cpp private int appid = -1; private int cntlid = 1; private int noc = 0; private boolean running = false; private JPanel panel,profilePanel; private JLabel registeredApplications; private JLabel isdnLine; private JLabel dChannel; private JLabel[] bChannels; private int ra=-1; private boolean il=false,dc=false; private boolean[] bcs=null; public MainApp(){super();} public MainApp(String title, String[] argv){ super(title,argv); } protected JPanel getCenterPanel(Properties properties)throws Exception{ registeredApplications = new JLabel(); isdnLine = new JLabel(); dChannel = new JLabel(); JPanel p=new JPanel(new GridLayout(0,2)); p.add(new JLabel("Registered Applications:")); p.add(registeredApplications); p.add(new JLabel("ISDN-Line :")); p.add(isdnLine); p.add(new JLabel("D-Channel :")); p.add(dChannel); panel = p; JPanel q=new JPanel(new BorderLayout()); q.setBorder(new EmptyBorder(10,10,10,10)); q.add(p,BorderLayout.NORTH); p = new JPanel(new BorderLayout()); p.add(new JScrollPane(q),BorderLayout.CENTER); JTabbedPane tp=new JTabbedPane(); tp.addTab("Monitor",p); profilePanel=new JPanel(new BorderLayout()); tp.addTab("Profile",profilePanel); p = new JPanel(new BorderLayout()); p.add(tp); return p; } protected void setFrameSize(JFrame frame, Rectangle bounds){ frame.setSize(450,250); } private void createProfileAndBChannelIndicators(int appid,int cntlid)throws Exception{ CapiProfile profile=new AVMProfile(jcapi.getProfile(cntlid)); DefaultMutableTreeNode rootNode=profile.toTree(); if(profile.isSupportingSupplementaryServices()){ jcapi.putMessage(appid,new SupServiceReq.GetSupportedServicesReq(appid,cntlid).getBytes()); jcapi.waitForMessage(appid); MsgIn msg=MsgIn.create(jcapi.getMessage(appid,null)); if( (msg instanceof SupServiceConf.GetSupportedServicesConf) && (((CapiConfMsg)msg).getInfo()==0) ){ rootNode.add(((SupServiceConf.GetSupportedServicesConf)msg).toTree()); } } JTree tree = new JTree(rootNode); JScrollPane treeView = new JScrollPane(tree); profilePanel.add(treeView); noc=profile.getNoOfBChannels(); bChannels = new JLabel[noc]; bcs = new boolean[noc]; for(int i=0;i<noc;i++){ panel.add(new JLabel("B-Channel ["+i+"]:")); bChannels[i]=new JLabel(); panel.add(bChannels[i]); } } public void start(){ super.start(); new Thread(this).start(); } public void stop(){ running=false; super.stop(); } protected void signalRegisteredApplicationChange(int state){ System.out.println("Applications "+state); } protected void signalISDNLineStateChange(boolean state){ System.out.println("ISDN-Line "+((state)?"UP":"down")); } protected void signalDChannelStateChange(boolean state){ System.out.println("D-Channel "+((state)?"UP":"down")); } protected void signalBChannelStateChange(int bChannel, boolean state){ System.out.println("B-Channel ["+bChannel+"] "+((state)?"UP":"down")); } protected void handleMessage(MsgIn msg){ if(msg instanceof AVMGetBChannelInfoConf){ AVMGetBChannelInfoConf avmmsg=(AVMGetBChannelInfoConf)msg; int nra=avmmsg.getRegisteredApplicationCount(); registeredApplications.setText(""+nra); if(ra!=nra){ra=nra;signalRegisteredApplicationChange(ra);} boolean nil=avmmsg.isISDNLineActive(); isdnLine.setText((nil)?"ACTIVE":"inactive"); if(il!=nil){il=nil;signalISDNLineStateChange(il);} boolean ndc=avmmsg.isDChannelActive(); dChannel.setText((ndc)?"ACTIVE":"inactive"); if(dc!=ndc){dc=ndc;signalDChannelStateChange(dc);} for(int i=0;i<noc;i++){ boolean nbc=avmmsg.isBChannelActive(i); bChannels[i].setText((nbc)?"ACTIVE":"inactive"); if(bcs[i]!=nbc){bcs[i]=nbc;signalBChannelStateChange(i,nbc);} } }else{ System.out.println(msg); } } public void run(){ try{ jcapi.checkInstalled(); String name=jcapi.getManufacturer(cntlid).toLowerCase(); if(name.indexOf("avm")>=0){ appid=jcapi.register(cntlid,2,128); try{ running=true; createProfileAndBChannelIndicators(appid,cntlid); Semaphore s=new Semaphore(0,true); byte[] buf=null; while(running){ AVMGetBChannelInfoReq req=new AVMGetBChannelInfoReq(appid,cntlid); jcapi.putMessage(appid,req.getBytes()); jcapi.waitForMessage(appid); if(!running){break;} buf=jcapi.getMessage(appid,buf); MsgIn msg=MsgIn.create(buf); handleMessage(msg); s.tryAcquire(500,TimeUnit.MILLISECONDS); } }finally{ jcapi.release(appid); } }else{ System.out.println("9\bSorry, this program works only with AVM ISDN cards!"); } }catch(InterruptedException e){ }catch(Exception e){ System.out.println("9\b"+getClass().getName()+".run:\n\t"+e); System.err.println(getClass().getName()+".run:\n\t"+e); e.printStackTrace(); } } public static void main(String[] argv){ try{ new MainApp("ISDN Monitor for AVM ISDN Cards [2006-05-05]", argv); }catch(Exception e){ e.printStackTrace(); } } }