Changes to the table management functions yet again to change the
implementation to a more elegant solution that won't fail when devices
are disabled. The omission of null fields is also no longer required
since the table printing now provides a choice on whether null fields
are shown or not. Null fields are fields that = 0/empty/False.

Change-Id: Ib3576f25d14143c160eb066dd954d6f84f84b358
diff --git a/cli/table.py b/cli/table.py
index 6db53bc..c3cf94d 100644
--- a/cli/table.py
+++ b/cli/table.py
@@ -90,7 +90,7 @@
 
 
 def print_pb_list_as_table(header, items, fields_to_omit=None,
-                           printfn=_printfn, dividers=10):
+                           printfn=_printfn, dividers=10, show_nulls=False):
     from cli.utils import pb2dict
 
     t = TablePrinter()
@@ -99,59 +99,44 @@
 
         def add(_row, pb, prefix='', number=0):
             d = pb2dict(pb)
-            l=[]
-            for field in sorted(pb._fields, key=lambda f: f.number):
-                l.append(field.name)
-            for field in d:
-                if field not in l:
-                    l.append(field)
-
-            field_number = 0
-            #for field in pb._fields:
-            for field in sorted(d, key=lambda f: l.index(f)):
-                #fname = prefix + field.name
-                fname = prefix + field
+            if show_nulls:
+                fields = pb.DESCRIPTOR.fields
+            else:
+                fields = pb._fields
+            for field in fields:
+                fname = prefix + field.name
                 if fname in fields_to_omit:
                     continue
-                #value = getattr(pb, field.name)
-                value = getattr(pb, field)
+                value = getattr(pb, field.name)
                 if isinstance(value, Message):
                     add(_row, value, fname + '.',
-                        100 * (number + field_number))
-                        #100 * (number + field.number))
+                        100 * (number + field.number))
                 else:
-                    t.add_cell(_row, number + field_number, fname,
-                               d.get(field))
-                    #t.add_cell(_row, number + field.number, fname,
-                    #           d.get(field.name))
-                field_number += 1
+                    t.add_cell(_row, number + field.number, fname,
+                               d.get(field.name))
 
         add(row, obj)
 
     t.print_table(header, printfn, dividers)
 
 
-def print_pb_as_table(header, pb, fields_to_omit={}, printfn=_printfn):
+def print_pb_as_table(header, pb, fields_to_omit={}, printfn=_printfn,
+                      show_nulls=False):
     from cli.utils import pb2dict
 
     t = TablePrinter()
 
     def pr(_pb, prefix=''):
         d = pb2dict(_pb)
-        l=[]
-        for field in sorted(pb._fields, key=lambda f: f.number):
-            l.append(field.name)
-        for field in d:
-            if field not in l:
-                l.append(field)
-        #for field in sorted(_pb._fields, key=lambda f: f.number):
-        for field in sorted(d, key=lambda f: l.index(f)):
-            #fname = prefix + field.name
-            fname = prefix + field
+        if show_nulls:
+            fields = _pb.DESCRIPTOR.fields
+        else:
+            fields = _pb._fields
+        for field in sorted(fields, key=lambda f: f.number):
+            fname = prefix + field.name
             if fname in fields_to_omit:
                 continue
-            #value = getattr(_pb, field.name)
-            value = getattr(_pb, field)
+            value = getattr(_pb, field.name)
             if isinstance(value, Message):
                 pr(value, fname + '.')
             elif isinstance(value, RepeatedCompositeFieldContainer):
@@ -162,8 +147,7 @@
             else:
                 row = t.number_of_rows()
                 t.add_cell(row, 0, 'field', fname)
-                #t.add_cell(row, 1, 'value', d.get(field.name))
-                t.add_cell(row, 1, 'value', d.get(field))
+                t.add_cell(row, 1, 'value', d.get(field.name))
 
     pr(pb)