Re: Support for VX9100 phonebook in svn

"Aaron G. Stemen" <[email protected]>
Newsgroups gmane.comp.mobile.bitpim.devel
Message-ID <[email protected]>
I figured out what was going on.  It was in fact saving the data to the 
phone book table in the database (thank you sqlite command line utility!).

Attached is a patch that will keep the ICE contacts in sync with the 
phone book.  I tested it out a little bit successfully.

Joe, I'm sure you will anyway, but you may want to look at the changes 
that I made to see if they should be generalized at all, or if there's a 
more efficient way of doing a couple of the steps.  Unfortunately, my 
Python background is limited to what I've done since we began working on 
support for the VX-9100.

This patch is for the code with the most recent changes in SVN that Joe 
committed a couple days ago.

-A

Aaron G. Stemen wrote:
> Okay Joe, I'm starting to draw a blank.
>
> Essentially, what I started was adding a new column to the phone book 
> table for an ICE index number.  I was trying to treat it much like the 
> speed dials, except it gets applied to the phone book entry and not 
> the phone number entry.  I'm not sure if it's actually storing the ICE 
> index in the table or not.  It at least gets past the phone book 
> import without exception.
>
> When I attempt to write to the phone, the ICE index is not returned in 
> the phone book data, so I can't attempt to update it.  I have most of 
> the code in place, with some commented out with TODO.  Would you be 
> able to take a look and see what I'm missing?
>
> Thanks!
>
> -A
>

-------------------------------------------------------------------------
Sponsored by: SourceForge.net Community Choice Awards: VOTE NOW!
Studies have shown that voting for your favorite open source project,
along with a healthy diet, reduces your potential for chronic lameness
and boredom. Vote Now at http://www.sourceforge.net/community/cca08

_______________________________________________
BitPim-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bitpim-devel
VX9100_with_ICE.patch (text/plain, 27.9 KB)
Index: src/database.py
===================================================================
--- src/database.py	(revision 4633)
+++ src/database.py	(working copy)
@@ -1020,6 +1020,7 @@
                                       'flags': ['secret'],
                                       'memos': ['memo'],
                                       'numbers': ['number', 'type', 'speeddial'],
+                                      'iceindexes': ['iceindex']
                                       # serials is in parent object
                                       })
         _knowndictproperties=basedataobject._knowndictproperties.copy()
Index: src/phonebook.py
===================================================================
--- src/phonebook.py	(revision 4633)
+++ src/phonebook.py	(working copy)
@@ -144,6 +144,7 @@
                                   'memos': ['memo'],
                                   'numbers': ['number', 'type', 'speeddial',
                                               'ringtone', 'wallpaper' ],
+                                  'iceindexes': ['iceindex'],
 ##                                  'maillist': ['entry', 'speeddial',
 ##                                               'ringtone', 'wallpaper' ],
                                   # serials is in parent object
@@ -297,6 +298,7 @@
     "Memo4", ("memos", 3, None, "memo", True),
     "Memo5", ("memos", 4, None, "memo", True),
 
+    "ICEindex", ("iceindexes", 0, None, "iceindex", False)
     ]
 
 ll=[]
@@ -553,7 +555,7 @@
 
 class PhoneWidget(wx.Panel, widgets.BitPimWidget):
     """Main phone editing/displaying widget"""
-    CURRENTFILEVERSION=2
+    CURRENTFILEVERSION=3
     # Data selector const
     _Current_Data=0
     _Historic_Data=1
@@ -1145,6 +1147,11 @@
             dict['result']['phonebook']={}
             dict['result']['categories']=[]
             
+        if version==2:
+            wx.MessageBox("BitPim can't upgrade your old phone data stored on disk, and has discarded it.  Please re-read your phonebook from the phone.  If you downgrade, please delete the phonebook directory in the BitPim data directory first", "Phonebook file format not supported", wx.OK|wx.ICON_EXCLAMATION)
+            version=3
+            dict['result']['iceindexes']=[]
+            
     def clear(self):
         self._data={}
         self.dt.OnDataUpdated()
Index: src/phones/com_lgvx9100.py
===================================================================
--- src/phones/com_lgvx9100.py	(revision 4633)
+++ src/phones/com_lgvx9100.py	(working copy)
@@ -149,6 +149,12 @@
         # Read speed dials first -- same file format as the VX-8100
         _speeds=self._get_speeddials()
 
+        # Read the emergency contacts list
+        self.log("Reading ICE entries")
+        _ices=self.readobject(self.protocolclass.ice_file_name,
+                              self.protocolclass.iceentryfile,
+                              logtitle='Reading ICE entries')
+        
         self.log("Reading phonebook entries")
         pb_entries=self.readobject(self.protocolclass.pb_file_name,
                                    self.protocolclass.pbfile,
@@ -177,7 +183,8 @@
                 pbook[_cnt]=self.extractphonebookentry(pb_entry, pb_numbers,
                                                        _speeds, result,
                                                        _rt_ids.get(ring_pathf.items[_cnt].pathname, None),
-                                                       _wp_ids.get(picid_pathf.items[_cnt].pathname, None))
+                                                       _wp_ids.get(picid_pathf.items[_cnt].pathname, None),
+                                                       _ices)
 
                 self.progress(_cnt, self.protocolclass.NUMPHONEBOOKENTRIES, pb_entry.name)
             except common.PhoneBookBusyException:
@@ -202,7 +209,7 @@
         return pbook
 
     def extractphonebookentry(self, entry, numbers, speeds, fundamentals,
-                              rt_name, wp_name):
+                              rt_name, wp_name, ices):
         """Return a phonebook entry in BitPim format.  This is called from getphonebook."""
         res={}
         # serials
@@ -249,8 +256,21 @@
                 print "can't find ringtone for index",entry.ringtone
         # assume we are like the VX-8100 in this regard -- looks correct
         res=self._assignpbtypeandspeeddialsbytype(entry, numbers, speeds, res)
+        
+        # assign the ICE entry to the associated number to keep them in sync
+        res=self._assigniceentry(entry, numbers, ices, res)
         return res
-                    
+
+    def _assigniceentry(self, entry, numbers, ices, res):
+        res['iceindexes']=[ { 'iceindex': 0xffff } ]
+        for i in range(self.protocolclass.NUMEMERGENCYCONTACTS):
+            iceentry=ices.items[i] 
+            if iceentry.pb_index > 0 and iceentry.pb_index <= self.protocolclass.NUMPHONEBOOKENTRIES:
+                ## this is where we assign the ice index number to the number
+                if entry.entry_number0 == (iceentry.pb_index):
+                    res['iceindexes']=[ { 'iceindex': iceentry.entry_number } ]
+        return res
+    
     def _assignpbtypeandspeeddialsbytype(self, entry, numbers, speeds, res):
         # for some phones (e.g. vx8100) the speeddial numberindex is really the numbertype (now why would LG want to change this!)
         res['numbers']=[]
@@ -291,7 +311,7 @@
         ring_pathf=self.protocolclass.PathIndexFile()
         picid_pathf=self.protocolclass.PathIndexFile()
 
-        # the pbentry.dat will will be overwritten so there is no need to delete entries
+        # the pbentry.dat will be overwritten so there is no need to delete entries
         pbook = data.get('phonebook', {})
         keys = pbook.keys ()
         keys.sort ()
@@ -304,13 +324,28 @@
         pb_entries = self.protocolclass.pbfile()
         pn_entries=self.protocolclass.pnfile()
         speeddials={}
+
+        ices=self.protocolclass.iceentryfile()
+        for i in range(self.protocolclass.NUMEMERGENCYCONTACTS):
+            ices.items.append(self.protocolclass.iceentry()) 
+            
         for i in keys:
             pb_entries.items.append(self.make_entry (pn_entries, speeddials,
                                                      entry_num0, entry_num1,
                                                      pbook[i], data,
                                                      ring_pathf,_rt_index,
                                                      picid_pathf, _wp_index))
+        
+            iceindex = pbook[i].get('iceindex', 0xFFFF)
+            if iceindex < self.protocolclass.NUMEMERGENCYCONTACTS:
+                ice = self.protocolclass.iceentry()
+                ice.entry_assigned = 1
+                ice.entry_number = iceindex
+                ice.pb_index = entry_num0;
+                ices.items[iceindex] = ice
+
             entry_num0 += 1
+            
             if entry_num0 >= self.protocolclass.NUMPHONEBOOKENTRIES:
                 self.log ("Maximum number of phonebook entries reached")
                 break
@@ -336,11 +371,16 @@
                          ring_pathf, logtitle='Writing ringtone paths',
                          uselocalfs=DEBUG1)
         # write wallpaer index
-        self.log('Writing pciture ID')
+        self.log('Writing picture ID')
         self.writeobject(self.protocolclass.WPPathIndexFile,
                          picid_pathf, logtitle='Writing wallpaper paths',
                          uselocalfs=DEBUG1)
         # might need to update the ICE index as well
+        # write the ICE entry file
+        self.log("Writing ICE entries")
+        self.writeobject(self.protocolclass.ice_file_name,
+                         ices, logtitle='Writing ICE entries',
+                         uselocalfs=DEBUG1)
         # update speed dials
         req=self.protocolclass.speeddials()
         # slot 0 is always unused
@@ -654,6 +694,9 @@
                 # ringtones, wallpaper
                 e['ringtone']=helper.getringtone(entry.get('ringtones', []), 'call', None)
                 e['wallpaper']=helper.getwallpaper(entry.get('wallpapers', []), 'call', None)
+                
+                if entry.get('iceindexes', []) != []:
+                    e['iceindex']=entry['iceindexes'][0]['iceindex'];
 
                 results[pbentry]=e
                 
Index: src/phones/p_lgvx9100.p
===================================================================
--- src/phones/p_lgvx9100.p	(revision 4633)
+++ src/phones/p_lgvx9100.p	(working copy)
@@ -29,6 +29,8 @@
 FIRSTSPEEDDIAL=1
 LASTSPEEDDIAL=999
 
+NUMEMERGENCYCONTACTS=3
+
 BREW_FILE_SYSTEM=2
 
 INDEX_RT_TYPE=257
@@ -43,6 +45,7 @@
 
 pb_group_filename='pim/pbgroup.dat'
 pb_recordid_filename='pim/record_id.dat'
+ice_file_name   = 'pim/pbiceentry.dat'
 
 %}
 
@@ -185,3 +188,19 @@
 # record_id.dat
 PACKET RecordIdEntry:
     4 UINT idnum
+
+PACKET iceentry:
+    "ICE index entries"
+    2 UINT { 'default': 0x0000 } +entry_assigned "0 if not assigned, 1 if assigned"
+    2 UINT { 'default': 0x0000 } +entry_number "0-based ICE entry number when assigned, 0 if unassigned"
+    2 UINT { 'default': 0xFFFF } +pb_index "0-based phone book entry number"
+    82 DATA { 'default': '\x00'*82 } +dontcare
+    %{
+    def valid(self):
+        return self.entry_number<NUMEMERGENCYCONTACTS
+    %}
+    
+PACKET iceentryfile:
+    * LIST { 'elementclass': iceentry,
+             'createdefault': True,
+             'length': NUMEMERGENCYCONTACTS } +items
Index: src/phones/p_lgvx9100.py
===================================================================
--- src/phones/p_lgvx9100.py	(revision 4633)
+++ src/phones/p_lgvx9100.py	(working copy)
@@ -20,6 +20,8 @@
 FIRSTSPEEDDIAL=1
 LASTSPEEDDIAL=999
 
+NUMEMERGENCYCONTACTS=3
+
 BREW_FILE_SYSTEM=2
 
 INDEX_RT_TYPE=257
@@ -34,6 +36,7 @@
 
 pb_group_filename='pim/pbgroup.dat'
 pb_recordid_filename='pim/record_id.dat'
+ice_file_name   = 'pim/pbiceentry.dat'
 
 class indexentry(BaseProtogenClass):
     __fields=['filename', 'size', 'date', 'type', 'dunno']
@@ -714,7 +717,7 @@
             self.__field_group.writetobuffer(buf)
             try: self.__field_emails
             except:
-                self.__field_emails=LIST(**{'elementclass': _gen_p_lgvx9100_113, 'length': NUMEMAILS})
+                self.__field_emails=LIST(**{'elementclass': _gen_p_lgvx9100_116, 'length': NUMEMAILS})
             self.__field_emails.writetobuffer(buf)
             try: self.__field_ringtone
             except:
@@ -726,11 +729,11 @@
             self.__field_wallpaper.writetobuffer(buf)
             try: self.__field_numbertypes
             except:
-                self.__field_numbertypes=LIST(**{'elementclass': _gen_p_lgvx9100_117, 'length': NUMPHONENUMBERS})
+                self.__field_numbertypes=LIST(**{'elementclass': _gen_p_lgvx9100_120, 'length': NUMPHONENUMBERS})
             self.__field_numbertypes.writetobuffer(buf)
             try: self.__field_numberindices
             except:
-                self.__field_numberindices=LIST(**{'elementclass': _gen_p_lgvx9100_119, 'length': NUMPHONENUMBERS})
+                self.__field_numberindices=LIST(**{'elementclass': _gen_p_lgvx9100_122, 'length': NUMPHONENUMBERS})
             self.__field_numberindices.writetobuffer(buf)
             try: self.__field_memo
             except:
@@ -770,15 +773,15 @@
             self.__field_name.readfrombuffer(buf)
             self.__field_group=UINT(**{'sizeinbytes': 2,  'default': 0 })
             self.__field_group.readfrombuffer(buf)
-            self.__field_emails=LIST(**{'elementclass': _gen_p_lgvx9100_113, 'length': NUMEMAILS})
+            self.__field_emails=LIST(**{'elementclass': _gen_p_lgvx9100_116, 'length': NUMEMAILS})
             self.__field_emails.readfrombuffer(buf)
             self.__field_ringtone=UINT(**{'sizeinbytes': 2,  'default': 0xffff })
             self.__field_ringtone.readfrombuffer(buf)
             self.__field_wallpaper=UINT(**{'sizeinbytes': 2,  'default': 0 })
             self.__field_wallpaper.readfrombuffer(buf)
-            self.__field_numbertypes=LIST(**{'elementclass': _gen_p_lgvx9100_117, 'length': NUMPHONENUMBERS})
+            self.__field_numbertypes=LIST(**{'elementclass': _gen_p_lgvx9100_120, 'length': NUMPHONENUMBERS})
             self.__field_numbertypes.readfrombuffer(buf)
-            self.__field_numberindices=LIST(**{'elementclass': _gen_p_lgvx9100_119, 'length': NUMPHONENUMBERS})
+            self.__field_numberindices=LIST(**{'elementclass': _gen_p_lgvx9100_122, 'length': NUMPHONENUMBERS})
             self.__field_numberindices.readfrombuffer(buf)
             self.__field_memo=USTRING(**{'sizeinbytes': 69,  'raiseonunterminatedread': False, 'default': '', 'encoding': PHONE_ENCODING })
             self.__field_memo.readfrombuffer(buf)
@@ -915,14 +918,14 @@
     def __getfield_emails(self):
         try: self.__field_emails
         except:
-            self.__field_emails=LIST(**{'elementclass': _gen_p_lgvx9100_113, 'length': NUMEMAILS})
+            self.__field_emails=LIST(**{'elementclass': _gen_p_lgvx9100_116, 'length': NUMEMAILS})
         return self.__field_emails.getvalue()
 
     def __setfield_emails(self, value):
         if isinstance(value,LIST):
             self.__field_emails=value
         else:
-            self.__field_emails=LIST(value,**{'elementclass': _gen_p_lgvx9100_113, 'length': NUMEMAILS})
+            self.__field_emails=LIST(value,**{'elementclass': _gen_p_lgvx9100_116, 'length': NUMEMAILS})
 
     def __delfield_emails(self): del self.__field_emails
 
@@ -963,14 +966,14 @@
     def __getfield_numbertypes(self):
         try: self.__field_numbertypes
         except:
-            self.__field_numbertypes=LIST(**{'elementclass': _gen_p_lgvx9100_117, 'length': NUMPHONENUMBERS})
+            self.__field_numbertypes=LIST(**{'elementclass': _gen_p_lgvx9100_120, 'length': NUMPHONENUMBERS})
         return self.__field_numbertypes.getvalue()
 
     def __setfield_numbertypes(self, value):
         if isinstance(value,LIST):
             self.__field_numbertypes=value
         else:
-            self.__field_numbertypes=LIST(value,**{'elementclass': _gen_p_lgvx9100_117, 'length': NUMPHONENUMBERS})
+            self.__field_numbertypes=LIST(value,**{'elementclass': _gen_p_lgvx9100_120, 'length': NUMPHONENUMBERS})
 
     def __delfield_numbertypes(self): del self.__field_numbertypes
 
@@ -979,14 +982,14 @@
     def __getfield_numberindices(self):
         try: self.__field_numberindices
         except:
-            self.__field_numberindices=LIST(**{'elementclass': _gen_p_lgvx9100_119, 'length': NUMPHONENUMBERS})
+            self.__field_numberindices=LIST(**{'elementclass': _gen_p_lgvx9100_122, 'length': NUMPHONENUMBERS})
         return self.__field_numberindices.getvalue()
 
     def __setfield_numberindices(self, value):
         if isinstance(value,LIST):
             self.__field_numberindices=value
         else:
-            self.__field_numberindices=LIST(value,**{'elementclass': _gen_p_lgvx9100_119, 'length': NUMPHONENUMBERS})
+            self.__field_numberindices=LIST(value,**{'elementclass': _gen_p_lgvx9100_122, 'length': NUMPHONENUMBERS})
 
     def __delfield_numberindices(self): del self.__field_numberindices
 
@@ -1070,7 +1073,7 @@
 
 
 
-class _gen_p_lgvx9100_113(BaseProtogenClass):
+class _gen_p_lgvx9100_116(BaseProtogenClass):
     'Anonymous inner class'
     __fields=['email']
 
@@ -1079,8 +1082,8 @@
         # What was supplied to this function
         dict.update(kwargs)
         # Parent constructor
-        super(_gen_p_lgvx9100_113,self).__init__(**dict)
-        if self.__class__ is _gen_p_lgvx9100_113:
+        super(_gen_p_lgvx9100_116,self).__init__(**dict)
+        if self.__class__ is _gen_p_lgvx9100_116:
             self._update(args,dict)
 
 
@@ -1089,7 +1092,7 @@
 
 
     def _update(self, args, kwargs):
-        super(_gen_p_lgvx9100_113,self)._update(args,kwargs)
+        super(_gen_p_lgvx9100_116,self)._update(args,kwargs)
         keys=kwargs.keys()
         for key in keys:
             if key in self.__fields:
@@ -1097,7 +1100,7 @@
                 del kwargs[key]
         # Were any unrecognized kwargs passed in?
         if __debug__:
-            self._complainaboutunusedargs(_gen_p_lgvx9100_113,kwargs)
+            self._complainaboutunusedargs(_gen_p_lgvx9100_116,kwargs)
         if len(args):
             dict2={'sizeinbytes': 49, 'encoding': PHONE_ENCODING, 'raiseonunterminatedread': False}
             dict2.update(kwargs)
@@ -1145,7 +1148,7 @@
 
 
 
-class _gen_p_lgvx9100_117(BaseProtogenClass):
+class _gen_p_lgvx9100_120(BaseProtogenClass):
     'Anonymous inner class'
     __fields=['numbertype']
 
@@ -1154,8 +1157,8 @@
         # What was supplied to this function
         dict.update(kwargs)
         # Parent constructor
-        super(_gen_p_lgvx9100_117,self).__init__(**dict)
-        if self.__class__ is _gen_p_lgvx9100_117:
+        super(_gen_p_lgvx9100_120,self).__init__(**dict)
+        if self.__class__ is _gen_p_lgvx9100_120:
             self._update(args,dict)
 
 
@@ -1164,7 +1167,7 @@
 
 
     def _update(self, args, kwargs):
-        super(_gen_p_lgvx9100_117,self)._update(args,kwargs)
+        super(_gen_p_lgvx9100_120,self)._update(args,kwargs)
         keys=kwargs.keys()
         for key in keys:
             if key in self.__fields:
@@ -1172,7 +1175,7 @@
                 del kwargs[key]
         # Were any unrecognized kwargs passed in?
         if __debug__:
-            self._complainaboutunusedargs(_gen_p_lgvx9100_117,kwargs)
+            self._complainaboutunusedargs(_gen_p_lgvx9100_120,kwargs)
         if len(args):
             dict2={'sizeinbytes': 1,  'default': 0 }
             dict2.update(kwargs)
@@ -1220,7 +1223,7 @@
 
 
 
-class _gen_p_lgvx9100_119(BaseProtogenClass):
+class _gen_p_lgvx9100_122(BaseProtogenClass):
     'Anonymous inner class'
     __fields=['numberindex']
 
@@ -1229,8 +1232,8 @@
         # What was supplied to this function
         dict.update(kwargs)
         # Parent constructor
-        super(_gen_p_lgvx9100_119,self).__init__(**dict)
-        if self.__class__ is _gen_p_lgvx9100_119:
+        super(_gen_p_lgvx9100_122,self).__init__(**dict)
+        if self.__class__ is _gen_p_lgvx9100_122:
             self._update(args,dict)
 
 
@@ -1239,7 +1242,7 @@
 
 
     def _update(self, args, kwargs):
-        super(_gen_p_lgvx9100_119,self)._update(args,kwargs)
+        super(_gen_p_lgvx9100_122,self)._update(args,kwargs)
         keys=kwargs.keys()
         for key in keys:
             if key in self.__fields:
@@ -1247,7 +1250,7 @@
                 del kwargs[key]
         # Were any unrecognized kwargs passed in?
         if __debug__:
-            self._complainaboutunusedargs(_gen_p_lgvx9100_119,kwargs)
+            self._complainaboutunusedargs(_gen_p_lgvx9100_122,kwargs)
         if len(args):
             dict2={'sizeinbytes': 2,  'default': 0xffff }
             dict2.update(kwargs)
@@ -2109,3 +2112,232 @@
 
 
 
+class iceentry(BaseProtogenClass):
+    "ICE index entries"
+    __fields=['entry_assigned', 'entry_number', 'pb_index', 'dontcare']
+
+    def __init__(self, *args, **kwargs):
+        dict={}
+        # What was supplied to this function
+        dict.update(kwargs)
+        # Parent constructor
+        super(iceentry,self).__init__(**dict)
+        if self.__class__ is iceentry:
+            self._update(args,dict)
+
+
+    def getfields(self):
+        return self.__fields
+
+
+    def _update(self, args, kwargs):
+        super(iceentry,self)._update(args,kwargs)
+        keys=kwargs.keys()
+        for key in keys:
+            if key in self.__fields:
+                setattr(self, key, kwargs[key])
+                del kwargs[key]
+        # Were any unrecognized kwargs passed in?
+        if __debug__:
+            self._complainaboutunusedargs(iceentry,kwargs)
+        if len(args): raise TypeError('Unexpected arguments supplied: '+`args`)
+        # Make all P fields that haven't already been constructed
+
+
+    def writetobuffer(self,buf,autolog=True,logtitle="<written data>"):
+        'Writes this packet to the supplied buffer'
+        self._bufferstartoffset=buf.getcurrentoffset()
+        try: self.__field_entry_assigned
+        except:
+            self.__field_entry_assigned=UINT(**{'sizeinbytes': 2,  'default': 0x0000 })
+        self.__field_entry_assigned.writetobuffer(buf)
+        try: self.__field_entry_number
+        except:
+            self.__field_entry_number=UINT(**{'sizeinbytes': 2,  'default': 0x0000 })
+        self.__field_entry_number.writetobuffer(buf)
+        try: self.__field_pb_index
+        except:
+            self.__field_pb_index=UINT(**{'sizeinbytes': 2,  'default': 0xFFFF })
+        self.__field_pb_index.writetobuffer(buf)
+        try: self.__field_dontcare
+        except:
+            self.__field_dontcare=DATA(**{'sizeinbytes': 82,  'default': '\x00'*82 })
+        self.__field_dontcare.writetobuffer(buf)
+        self._bufferendoffset=buf.getcurrentoffset()
+        if autolog and self._bufferstartoffset==0: self.autologwrite(buf, logtitle=logtitle)
+
+
+    def readfrombuffer(self,buf,autolog=True,logtitle="<read data>"):
+        'Reads this packet from the supplied buffer'
+        self._bufferstartoffset=buf.getcurrentoffset()
+        if autolog and self._bufferstartoffset==0: self.autologread(buf, logtitle=logtitle)
+        self.__field_entry_assigned=UINT(**{'sizeinbytes': 2,  'default': 0x0000 })
+        self.__field_entry_assigned.readfrombuffer(buf)
+        self.__field_entry_number=UINT(**{'sizeinbytes': 2,  'default': 0x0000 })
+        self.__field_entry_number.readfrombuffer(buf)
+        self.__field_pb_index=UINT(**{'sizeinbytes': 2,  'default': 0xFFFF })
+        self.__field_pb_index.readfrombuffer(buf)
+        self.__field_dontcare=DATA(**{'sizeinbytes': 82,  'default': '\x00'*82 })
+        self.__field_dontcare.readfrombuffer(buf)
+        self._bufferendoffset=buf.getcurrentoffset()
+
+
+    def __getfield_entry_assigned(self):
+        try: self.__field_entry_assigned
+        except:
+            self.__field_entry_assigned=UINT(**{'sizeinbytes': 2,  'default': 0x0000 })
+        return self.__field_entry_assigned.getvalue()
+
+    def __setfield_entry_assigned(self, value):
+        if isinstance(value,UINT):
+            self.__field_entry_assigned=value
+        else:
+            self.__field_entry_assigned=UINT(value,**{'sizeinbytes': 2,  'default': 0x0000 })
+
+    def __delfield_entry_assigned(self): del self.__field_entry_assigned
+
+    entry_assigned=property(__getfield_entry_assigned, __setfield_entry_assigned, __delfield_entry_assigned, "0 if not assigned, 1 if assigned")
+
+    def __getfield_entry_number(self):
+        try: self.__field_entry_number
+        except:
+            self.__field_entry_number=UINT(**{'sizeinbytes': 2,  'default': 0x0000 })
+        return self.__field_entry_number.getvalue()
+
+    def __setfield_entry_number(self, value):
+        if isinstance(value,UINT):
+            self.__field_entry_number=value
+        else:
+            self.__field_entry_number=UINT(value,**{'sizeinbytes': 2,  'default': 0x0000 })
+
+    def __delfield_entry_number(self): del self.__field_entry_number
+
+    entry_number=property(__getfield_entry_number, __setfield_entry_number, __delfield_entry_number, "0-based ICE entry number when assigned, 0 if unassigned")
+
+    def __getfield_pb_index(self):
+        try: self.__field_pb_index
+        except:
+            self.__field_pb_index=UINT(**{'sizeinbytes': 2,  'default': 0xFFFF })
+        return self.__field_pb_index.getvalue()
+
+    def __setfield_pb_index(self, value):
+        if isinstance(value,UINT):
+            self.__field_pb_index=value
+        else:
+            self.__field_pb_index=UINT(value,**{'sizeinbytes': 2,  'default': 0xFFFF })
+
+    def __delfield_pb_index(self): del self.__field_pb_index
+
+    pb_index=property(__getfield_pb_index, __setfield_pb_index, __delfield_pb_index, "0-based phone book entry number")
+
+    def __getfield_dontcare(self):
+        try: self.__field_dontcare
+        except:
+            self.__field_dontcare=DATA(**{'sizeinbytes': 82,  'default': '\x00'*82 })
+        return self.__field_dontcare.getvalue()
+
+    def __setfield_dontcare(self, value):
+        if isinstance(value,DATA):
+            self.__field_dontcare=value
+        else:
+            self.__field_dontcare=DATA(value,**{'sizeinbytes': 82,  'default': '\x00'*82 })
+
+    def __delfield_dontcare(self): del self.__field_dontcare
+
+    dontcare=property(__getfield_dontcare, __setfield_dontcare, __delfield_dontcare, None)
+
+    def iscontainer(self):
+        return True
+
+    def containerelements(self):
+        yield ('entry_assigned', self.__field_entry_assigned, "0 if not assigned, 1 if assigned")
+        yield ('entry_number', self.__field_entry_number, "0-based ICE entry number when assigned, 0 if unassigned")
+        yield ('pb_index', self.__field_pb_index, "0-based phone book entry number")
+        yield ('dontcare', self.__field_dontcare, None)
+
+    def valid(self):
+        return self.entry_number<NUMEMERGENCYCONTACTS
+
+
+
+
+class iceentryfile(BaseProtogenClass):
+    __fields=['items']
+
+    def __init__(self, *args, **kwargs):
+        dict={}
+        # What was supplied to this function
+        dict.update(kwargs)
+        # Parent constructor
+        super(iceentryfile,self).__init__(**dict)
+        if self.__class__ is iceentryfile:
+            self._update(args,dict)
+
+
+    def getfields(self):
+        return self.__fields
+
+
+    def _update(self, args, kwargs):
+        super(iceentryfile,self)._update(args,kwargs)
+        keys=kwargs.keys()
+        for key in keys:
+            if key in self.__fields:
+                setattr(self, key, kwargs[key])
+                del kwargs[key]
+        # Were any unrecognized kwargs passed in?
+        if __debug__:
+            self._complainaboutunusedargs(iceentryfile,kwargs)
+        if len(args):
+            dict2={ 'elementclass': iceentry,             'createdefault': True,             'length': NUMEMERGENCYCONTACTS }
+            dict2.update(kwargs)
+            kwargs=dict2
+            self.__field_items=LIST(*args,**dict2)
+        # Make all P fields that haven't already been constructed
+
+
+    def writetobuffer(self,buf,autolog=True,logtitle="<written data>"):
+        'Writes this packet to the supplied buffer'
+        self._bufferstartoffset=buf.getcurrentoffset()
+        try: self.__field_items
+        except:
+            self.__field_items=LIST(**{ 'elementclass': iceentry,             'createdefault': True,             'length': NUMEMERGENCYCONTACTS })
+        self.__field_items.writetobuffer(buf)
+        self._bufferendoffset=buf.getcurrentoffset()
+        if autolog and self._bufferstartoffset==0: self.autologwrite(buf, logtitle=logtitle)
+
+
+    def readfrombuffer(self,buf,autolog=True,logtitle="<read data>"):
+        'Reads this packet from the supplied buffer'
+        self._bufferstartoffset=buf.getcurrentoffset()
+        if autolog and self._bufferstartoffset==0: self.autologread(buf, logtitle=logtitle)
+        self.__field_items=LIST(**{ 'elementclass': iceentry,             'createdefault': True,             'length': NUMEMERGENCYCONTACTS })
+        self.__field_items.readfrombuffer(buf)
+        self._bufferendoffset=buf.getcurrentoffset()
+
+
+    def __getfield_items(self):
+        try: self.__field_items
+        except:
+            self.__field_items=LIST(**{ 'elementclass': iceentry,             'createdefault': True,             'length': NUMEMERGENCYCONTACTS })
+        return self.__field_items.getvalue()
+
+    def __setfield_items(self, value):
+        if isinstance(value,LIST):
+            self.__field_items=value
+        else:
+            self.__field_items=LIST(value,**{ 'elementclass': iceentry,             'createdefault': True,             'length': NUMEMERGENCYCONTACTS })
+
+    def __delfield_items(self): del self.__field_items
+
+    items=property(__getfield_items, __setfield_items, __delfield_items, None)
+
+    def iscontainer(self):
+        return True
+
+    def containerelements(self):
+        yield ('items', self.__field_items, None)
+
+
+
+
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.