OZ++ Sample: NetworkInterface

/******************************************************************************  *  * Copyright (c) 2015 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions, and the following disclaimer.  *  * 2. The name of the author may not be used to endorse or promote products  *    derived from this software without specific prior written permission.  *  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  *  *  *  NetworkInterface.cpp  *  *****************************************************************************/ #include <oz++/motif/ApplicationView.h> #include <oz++/motif/SashlessPanedWindow.h> #include <oz++/motif/ListBox.h> #include <oz++/motif/TableView.h> #include <oz++/NetworkInterface.h> #include <oz++/DirectoryScanner.h> #include <oz++/NetworkInterface.h> #include <oz++/SmartArray.h> namespace OZ { class MainView :public ApplicationView { private:   SmartPtr<SashlessPanedWindow> panedw;   SmartPtr<ListBox>             listBox;   SmartPtr<TableView>           table;   SmartArray<CharString*>       model;   void listupInterfaceNames(ListBox* listb)   {     try {       const char* dir = "/sys/class/net";       DirectoryScanner scanner(dir);       DirEntryList dirList;       int count = scanner.scanDir("*", dirList);       for(int i = 0; i<count; i++) {         const char* ifname = dirList.getName(i);         printf("IfName: %s\n", ifname);         CompoundString cs(ifname);         listb -> addLastItemUnselected(cs);       }     } catch (Exception& ex) {       caught(ex);     }   }   void    browse(Action& action)   {     XmListCallbackStruct* cbs =        (XmListCallbackStruct*)action.getCallData();     //item_position starts from 1.     int position = cbs -> item_position;     CompoundString cs(cbs -> item);     char* item;     cs.get(&item);     printf("item: postion=%d  item=%s\n", position, item);     //Call updateModel     updateModel(item);     XtFree(item);   }      void  updateModel(const char* ifname)   {     model.removeAllItems();       try {        NetworkInterface interface(ifname);       int n = 0;       Bytes bytes = interface.hardwareAddr();        int mtu = interface.mtu();       char value[20];       sprintf(value, "%d", mtu);       model[n++] = new CharString(interface.ifAddrString());       model[n++] = new CharString(interface.dstAddrString());       model[n++] = new CharString(interface.broadAddrString());       model[n++] = new CharString(bytes.toHexString());       model[n++] = new CharString(interface.flags());       model[n++] = new CharString(value);         } catch (Exception& ex) {           caught(ex);           }     //Call updateView     updateView();   }   void updateView()   {     table -> removeAllItems();     int size = model.getSize();     for (int i = 0; i<size; i++) {       CharString* value = model[i];       if (value) {         printf("%d %s\n", i, (const char*)(*value));         table -> setItem(i, 0, (const char*)(*value));       }     }   } public:   MainView(Application& applet, const char* name, Args& args)   :ApplicationView(applet, name, args)   {     ColumnData columnData[]  = {       {"Value", 440, XmALIGNMENT_BEGINNING},      };     RowData rowData[]  = {       {"InterfaceAddress", 160, XmALIGNMENT_END},        {"Destinationddress",  0, XmALIGNMENT_END},        {"BroadcastAddress",   0, XmALIGNMENT_END},        {"HardwareAddress",    0, XmALIGNMENT_END},        {"Flags",              0, XmALIGNMENT_END},        {"Mtu",                0, XmALIGNMENT_END},      };     Args ar;     ar.set(XmNorientation, XmHORIZONTAL);     panedw = new SashlessPanedWindow(this, "", ar);     ar.reset();     listBox = new ListBox(panedw, "", ar);     listupInterfaceNames(listBox);          listBox -> addCallback(XmNbrowseSelectionCallback, this,          (Callback)&MainView::browse, NULL);     int numColumns = XtNumber(columnData);     int numRows    = XtNumber(rowData);     ar.reset();     ar.set(XmNtableNumColumns, numColumns);     ar.set(XmNtableColumnData, (XtArgVal)columnData);     ar.set(XmNtableNumRows, numRows);     ar.set(XmNtableRowData, (XtArgVal)rowData);     table = new TableView(panedw, "", ar);     table -> removeAllItems();   }      ~MainView()    {     model.clear();   } }; } // int main(int argc, char** argv){   try {     const char*  appclass = argv[0];     Application applet(appclass, argc, argv);     Args args;     args.set(XmNgeometry, "700x240");     MainView view(applet, argv[0], args);          view.realize();     applet.run();        } catch (Exception& ex) {     caught(ex);   }   return 0; }