Re: VX-8700 Calendar support

Nathan Hjelm <[email protected]>
Newsgroups gmane.comp.mobile.bitpim.devel
Message-ID <[email protected]>
Ok, these patchs should work a bit better.

Changes:
- Fixed BREW2 filesystem code to not falsely determine all files with  
type != 0 are directories (many such files in nvm/num).
- VX-8700: Calendar support
- VX-8700: Set download mode when listing files (this should probably  
be done lower-- in the VX-8500 code).


-Nathan Hjelm

On May 15, 2007, at 3:38 PM, Joe Pham wrote:

>> Should I extend the DateTime class and change the _time_delta or
>> create something like a BrewDateTime class within prototypes.py or
>> prototypeslg.py (the cdate and mdate fields use the BREW epoch)?
>
> I'd suggest in prototypeslg if one such type does not already exist.
>
> -Joe Pham

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/

_______________________________________________
BitPim-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bitpim-devel
brew2.patch (application/octet-stream, 1.9 KB)
Index: phones/com_brew.py
===================================================================
--- phones/com_brew.py	(revision 4230)
+++ phones/com_brew.py	(working copy)
@@ -1000,18 +1000,18 @@
                     direntry=dir+"/"+res.entryname
                 else:
                     direntry=res.entryname
-                if files and res.type==0: # file
+                if directories and res.type==1: # directory
+                    results[direntry]={ 'name': direntry, 'type': 'directory' }
+                    if recurse>0:
+                        dirs[count]=direntry
+                        count+=1
+                elif files: # file
                     results[direntry]={ 'name': direntry, 'type': 'file',
                                     'size': res.size }
                     if res.date==0:
                         results[direntry]['date']=(0, "")
                     else:
                         results[direntry]['date']=(res.date, time.strftime("%x %X", time.localtime(res.date)))
-                elif directories and res.type: # directory
-                    results[direntry]={ 'name': direntry, 'type': 'directory' }
-                    if recurse>0:
-                        dirs[count]=direntry
-                        count+=1
         except Exception, e: # we MUST close the handle regardless or we wont be able to list the filesystem
             # reliably again without rebooting it
             req=p_brew.new_closedirectoryrequest()
Index: phones/p_brew.p
===================================================================
--- phones/p_brew.p	(revision 4230)
+++ phones/p_brew.p	(working copy)
@@ -341,7 +341,7 @@
     4 UINT handle
     4 UINT entrynumber
     4 UINT pad1 # zeros
-    4 UINT type # 0=file 1=directory
+    4 UINT type # 0=file 1=directory 15=special file?
     4 UINT mode 
     4 UINT size # garbage for directories
     8 UINT pad2 # zero
vx8700_cal.patch (application/octet-stream, 20.9 KB)
Index: phones/p_lgvx8700.p
===================================================================
--- phones/p_lgvx8700.p	(revision 4230)
+++ phones/p_lgvx8700.p	(working copy)
@@ -34,6 +33,32 @@
     "Phonebook groups"
     * LIST {'elementclass': pbgroup} +groups
 
+PACKET scheduleevent:
+    4  UINT pos "position within file, used as an event id"
+    33 USTRING {'encoding': PHONE_ENCODING, 'raiseonunterminatedread': False, 'raiseontruncate': False } description
+    4  GPSDATE cdate      # creation date
+    4  GPSDATE mdate      # modification date
+    4  LGCALDATE start
+    4  LGCALDATE end_time
+    4  LGCALDATE end_date
+    4  LGCALREPEAT repeat # complicated bit mapped field
+    1  UINT alarmindex_vibrate #LSBit of this set vibrate ON(0)/OFF(1), the 7 MSBits are the alarm index
+                              #the alarmindex is the index into the amount of time in advance of the 
+                              #event to notify the user. It is directly related to the alarmminutes 
+                              #and alarmhours below, valid values are
+                              # 8=2days, 7=1day, 6=2hours, 5=1hour, 4=15mins, 3=10mins, 2=5mins, 1=0mins, 0=NoAlarm
+    1  UINT ringtone
+    1  UINT unknown1
+    1  UINT alarmminutes  "a value of 0xFF indicates not set"
+    1  UINT alarmhours    "a value of 0xFF indicates not set"
+    1  UINT { 'default': 0 } +unknown2
+    2  UINT { 'default': 0x01FA } +unknown3
+    69 USTRING { 'default': '', 'encoding': PHONE_ENCODING, 'raiseonunterminatedread': False, 'raiseontruncate': False } +unknown4
+
+PACKET schedulefile:
+    2 UINT numactiveitems
+    * LIST {'elementclass': scheduleevent} +events
+
 PACKET ULReq:
     ""
     1 UINT { 'default': 0xFE } +cmd
Index: phones/com_lgvx8700.py
===================================================================
--- phones/com_lgvx8700.py	(revision 4230)
+++ phones/com_lgvx8700.py	(working copy)
@@ -90,15 +90,18 @@
         return False
 
     def listsubdirs(self, dir='', recurse=0):
-        # BREW2's get filesystem is used here because BREW1's does not appear not to work well on the vx8700
         return com_brew.RealBrewProtocol2.getfilesystem(self, dir, recurse, directories=1, files=0)
 
+    def listfiles(self, dir=''):
+        if self._in_DM==False and self.my_model=='VX8700':
+            # enter DM to enable file reading/writing
+            self.enter_DM()
+        return com_brew.RealBrewProtocol2.listfiles(self, dir)
+
     def getfilesystem(self, dir="", recurse=0, directories=1, files=1):
+        # BREW2's get filesystem is used here because BREW1's does not appear not to work well on the vx8700
         return com_brew.RealBrewProtocol2.getfilesystem(self, dir, recurse, directories, files)
 
-    def listfiles(self, dir=''):
-        return com_brew.RealBrewProtocol2.listfiles(self, dir)
-
     def enter_DM (self):
         # request challenge
         req = self.protocolclass.ULReq(unlock_key=0)
Index: phones/p_lgvx8700.py
===================================================================
--- phones/p_lgvx8700.py	(revision 4230)
+++ phones/p_lgvx8700.py	(working copy)
@@ -8,13 +8,12 @@
 # we are the same as lgvx9900 except as noted below
 from p_lgvx9900 import *
 from p_lgvx8500 import t9udbfile
- 
+
 # We use LSB for all integer like fields
 UINT=UINTlsb
 BOOL=BOOLlsb
 
 BREW_FILE_SYSTEM=2
-
 T9USERDBFILENAME='t9udb/t9udb_eng.dat'
 
 class pbgroup(BaseProtogenClass):
@@ -172,6 +171,442 @@
 
 
 
+class scheduleevent(BaseProtogenClass):
+    __fields=['pos', 'description', 'cdate', 'mdate', 'start', 'end_time', 'end_date', 'repeat', 'alarmindex_vibrate', 'ringtone', 'unknown1', 'alarmminutes', 'alarmhours', 'unknown2', 'unknown3', 'unknown4']
+
+    def __init__(self, *args, **kwargs):
+        dict={}
+        # What was supplied to this function
+        dict.update(kwargs)
+        # Parent constructor
+        super(scheduleevent,self).__init__(**dict)
+        if self.__class__ is scheduleevent:
+            self._update(args,dict)
+
+
+    def getfields(self):
+        return self.__fields
+
+
+    def _update(self, args, kwargs):
+        super(scheduleevent,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(scheduleevent,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()
+        self.__field_pos.writetobuffer(buf)
+        self.__field_description.writetobuffer(buf)
+        self.__field_cdate.writetobuffer(buf)
+        self.__field_mdate.writetobuffer(buf)
+        self.__field_start.writetobuffer(buf)
+        self.__field_end_time.writetobuffer(buf)
+        self.__field_end_date.writetobuffer(buf)
+        self.__field_repeat.writetobuffer(buf)
+        self.__field_alarmindex_vibrate.writetobuffer(buf)
+        self.__field_ringtone.writetobuffer(buf)
+        self.__field_unknown1.writetobuffer(buf)
+        self.__field_alarmminutes.writetobuffer(buf)
+        self.__field_alarmhours.writetobuffer(buf)
+        try: self.__field_unknown2
+        except:
+            self.__field_unknown2=UINT(**{'sizeinbytes': 1,  'default': 0 })
+        self.__field_unknown2.writetobuffer(buf)
+        try: self.__field_unknown3
+        except:
+            self.__field_unknown3=UINT(**{'sizeinbytes': 2,  'default': 0x01FA })
+        self.__field_unknown3.writetobuffer(buf)
+        try: self.__field_unknown4
+        except:
+            self.__field_unknown4=USTRING(**{'sizeinbytes': 69,  'default': '', 'encoding': PHONE_ENCODING, 'raiseonunterminatedread': False, 'raiseontruncate': False })
+        self.__field_unknown4.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_pos=UINT(**{'sizeinbytes': 4})
+        self.__field_pos.readfrombuffer(buf)
+        self.__field_description=USTRING(**{'sizeinbytes': 33, 'encoding': PHONE_ENCODING, 'raiseonunterminatedread': False, 'raiseontruncate': False })
+        self.__field_description.readfrombuffer(buf)
+        self.__field_cdate=GPSDATE(**{'sizeinbytes': 4})
+        self.__field_cdate.readfrombuffer(buf)
+        self.__field_mdate=GPSDATE(**{'sizeinbytes': 4})
+        self.__field_mdate.readfrombuffer(buf)
+        self.__field_start=LGCALDATE(**{'sizeinbytes': 4})
+        self.__field_start.readfrombuffer(buf)
+        self.__field_end_time=LGCALDATE(**{'sizeinbytes': 4})
+        self.__field_end_time.readfrombuffer(buf)
+        self.__field_end_date=LGCALDATE(**{'sizeinbytes': 4})
+        self.__field_end_date.readfrombuffer(buf)
+        self.__field_repeat=LGCALREPEAT(**{'sizeinbytes': 4})
+        self.__field_repeat.readfrombuffer(buf)
+        self.__field_alarmindex_vibrate=UINT(**{'sizeinbytes': 1})
+        self.__field_alarmindex_vibrate.readfrombuffer(buf)
+        self.__field_ringtone=UINT(**{'sizeinbytes': 1})
+        self.__field_ringtone.readfrombuffer(buf)
+        self.__field_unknown1=UINT(**{'sizeinbytes': 1})
+        self.__field_unknown1.readfrombuffer(buf)
+        self.__field_alarmminutes=UINT(**{'sizeinbytes': 1})
+        self.__field_alarmminutes.readfrombuffer(buf)
+        self.__field_alarmhours=UINT(**{'sizeinbytes': 1})
+        self.__field_alarmhours.readfrombuffer(buf)
+        self.__field_unknown2=UINT(**{'sizeinbytes': 1,  'default': 0 })
+        self.__field_unknown2.readfrombuffer(buf)
+        self.__field_unknown3=UINT(**{'sizeinbytes': 2,  'default': 0x01FA })
+        self.__field_unknown3.readfrombuffer(buf)
+        self.__field_unknown4=USTRING(**{'sizeinbytes': 69,  'default': '', 'encoding': PHONE_ENCODING, 'raiseonunterminatedread': False, 'raiseontruncate': False })
+        self.__field_unknown4.readfrombuffer(buf)
+        self._bufferendoffset=buf.getcurrentoffset()
+
+
+    def __getfield_pos(self):
+        return self.__field_pos.getvalue()
+
+    def __setfield_pos(self, value):
+        if isinstance(value,UINT):
+            self.__field_pos=value
+        else:
+            self.__field_pos=UINT(value,**{'sizeinbytes': 4})
+
+    def __delfield_pos(self): del self.__field_pos
+
+    pos=property(__getfield_pos, __setfield_pos, __delfield_pos, "position within file, used as an event id")
+
+    def __getfield_description(self):
+        return self.__field_description.getvalue()
+
+    def __setfield_description(self, value):
+        if isinstance(value,USTRING):
+            self.__field_description=value
+        else:
+            self.__field_description=USTRING(value,**{'sizeinbytes': 33, 'encoding': PHONE_ENCODING, 'raiseonunterminatedread': False, 'raiseontruncate': False })
+
+    def __delfield_description(self): del self.__field_description
+
+    description=property(__getfield_description, __setfield_description, __delfield_description, None)
+
+    def __getfield_cdate(self):
+        return self.__field_cdate.getvalue()
+
+    def __setfield_cdate(self, value):
+        if isinstance(value,GPSDATE):
+            self.__field_cdate=value
+        else:
+            self.__field_cdate=GPSDATE(value,**{'sizeinbytes': 4})
+
+    def __delfield_cdate(self): del self.__field_cdate
+
+    cdate=property(__getfield_cdate, __setfield_cdate, __delfield_cdate, None)
+
+    def __getfield_mdate(self):
+        return self.__field_mdate.getvalue()
+
+    def __setfield_mdate(self, value):
+        if isinstance(value,GPSDATE):
+            self.__field_mdate=value
+        else:
+            self.__field_mdate=GPSDATE(value,**{'sizeinbytes': 4})
+
+    def __delfield_mdate(self): del self.__field_mdate
+
+    mdate=property(__getfield_mdate, __setfield_mdate, __delfield_mdate, None)
+
+    def __getfield_start(self):
+        return self.__field_start.getvalue()
+
+    def __setfield_start(self, value):
+        if isinstance(value,LGCALDATE):
+            self.__field_start=value
+        else:
+            self.__field_start=LGCALDATE(value,**{'sizeinbytes': 4})
+
+    def __delfield_start(self): del self.__field_start
+
+    start=property(__getfield_start, __setfield_start, __delfield_start, None)
+
+    def __getfield_end_time(self):
+        return self.__field_end_time.getvalue()
+
+    def __setfield_end_time(self, value):
+        if isinstance(value,LGCALDATE):
+            self.__field_end_time=value
+        else:
+            self.__field_end_time=LGCALDATE(value,**{'sizeinbytes': 4})
+
+    def __delfield_end_time(self): del self.__field_end_time
+
+    end_time=property(__getfield_end_time, __setfield_end_time, __delfield_end_time, None)
+
+    def __getfield_end_date(self):
+        return self.__field_end_date.getvalue()
+
+    def __setfield_end_date(self, value):
+        if isinstance(value,LGCALDATE):
+            self.__field_end_date=value
+        else:
+            self.__field_end_date=LGCALDATE(value,**{'sizeinbytes': 4})
+
+    def __delfield_end_date(self): del self.__field_end_date
+
+    end_date=property(__getfield_end_date, __setfield_end_date, __delfield_end_date, None)
+
+    def __getfield_repeat(self):
+        return self.__field_repeat.getvalue()
+
+    def __setfield_repeat(self, value):
+        if isinstance(value,LGCALREPEAT):
+            self.__field_repeat=value
+        else:
+            self.__field_repeat=LGCALREPEAT(value,**{'sizeinbytes': 4})
+
+    def __delfield_repeat(self): del self.__field_repeat
+
+    repeat=property(__getfield_repeat, __setfield_repeat, __delfield_repeat, None)
+
+    def __getfield_alarmindex_vibrate(self):
+        return self.__field_alarmindex_vibrate.getvalue()
+
+    def __setfield_alarmindex_vibrate(self, value):
+        if isinstance(value,UINT):
+            self.__field_alarmindex_vibrate=value
+        else:
+            self.__field_alarmindex_vibrate=UINT(value,**{'sizeinbytes': 1})
+
+    def __delfield_alarmindex_vibrate(self): del self.__field_alarmindex_vibrate
+
+    alarmindex_vibrate=property(__getfield_alarmindex_vibrate, __setfield_alarmindex_vibrate, __delfield_alarmindex_vibrate, None)
+
+    def __getfield_ringtone(self):
+        return self.__field_ringtone.getvalue()
+
+    def __setfield_ringtone(self, value):
+        if isinstance(value,UINT):
+            self.__field_ringtone=value
+        else:
+            self.__field_ringtone=UINT(value,**{'sizeinbytes': 1})
+
+    def __delfield_ringtone(self): del self.__field_ringtone
+
+    ringtone=property(__getfield_ringtone, __setfield_ringtone, __delfield_ringtone, None)
+
+    def __getfield_unknown1(self):
+        return self.__field_unknown1.getvalue()
+
+    def __setfield_unknown1(self, value):
+        if isinstance(value,UINT):
+            self.__field_unknown1=value
+        else:
+            self.__field_unknown1=UINT(value,**{'sizeinbytes': 1})
+
+    def __delfield_unknown1(self): del self.__field_unknown1
+
+    unknown1=property(__getfield_unknown1, __setfield_unknown1, __delfield_unknown1, None)
+
+    def __getfield_alarmminutes(self):
+        return self.__field_alarmminutes.getvalue()
+
+    def __setfield_alarmminutes(self, value):
+        if isinstance(value,UINT):
+            self.__field_alarmminutes=value
+        else:
+            self.__field_alarmminutes=UINT(value,**{'sizeinbytes': 1})
+
+    def __delfield_alarmminutes(self): del self.__field_alarmminutes
+
+    alarmminutes=property(__getfield_alarmminutes, __setfield_alarmminutes, __delfield_alarmminutes, "a value of 0xFF indicates not set")
+
+    def __getfield_alarmhours(self):
+        return self.__field_alarmhours.getvalue()
+
+    def __setfield_alarmhours(self, value):
+        if isinstance(value,UINT):
+            self.__field_alarmhours=value
+        else:
+            self.__field_alarmhours=UINT(value,**{'sizeinbytes': 1})
+
+    def __delfield_alarmhours(self): del self.__field_alarmhours
+
+    alarmhours=property(__getfield_alarmhours, __setfield_alarmhours, __delfield_alarmhours, "a value of 0xFF indicates not set")
+
+    def __getfield_unknown2(self):
+        try: self.__field_unknown2
+        except:
+            self.__field_unknown2=UINT(**{'sizeinbytes': 1,  'default': 0 })
+        return self.__field_unknown2.getvalue()
+
+    def __setfield_unknown2(self, value):
+        if isinstance(value,UINT):
+            self.__field_unknown2=value
+        else:
+            self.__field_unknown2=UINT(value,**{'sizeinbytes': 1,  'default': 0 })
+
+    def __delfield_unknown2(self): del self.__field_unknown2
+
+    unknown2=property(__getfield_unknown2, __setfield_unknown2, __delfield_unknown2, None)
+
+    def __getfield_unknown3(self):
+        try: self.__field_unknown3
+        except:
+            self.__field_unknown3=UINT(**{'sizeinbytes': 2,  'default': 0x01FA })
+        return self.__field_unknown3.getvalue()
+
+    def __setfield_unknown3(self, value):
+        if isinstance(value,UINT):
+            self.__field_unknown3=value
+        else:
+            self.__field_unknown3=UINT(value,**{'sizeinbytes': 2,  'default': 0x01FA })
+
+    def __delfield_unknown3(self): del self.__field_unknown3
+
+    unknown3=property(__getfield_unknown3, __setfield_unknown3, __delfield_unknown3, None)
+
+    def __getfield_unknown4(self):
+        try: self.__field_unknown4
+        except:
+            self.__field_unknown4=USTRING(**{'sizeinbytes': 69,  'default': '', 'encoding': PHONE_ENCODING, 'raiseonunterminatedread': False, 'raiseontruncate': False })
+        return self.__field_unknown4.getvalue()
+
+    def __setfield_unknown4(self, value):
+        if isinstance(value,USTRING):
+            self.__field_unknown4=value
+        else:
+            self.__field_unknown4=USTRING(value,**{'sizeinbytes': 69,  'default': '', 'encoding': PHONE_ENCODING, 'raiseonunterminatedread': False, 'raiseontruncate': False })
+
+    def __delfield_unknown4(self): del self.__field_unknown4
+
+    unknown4=property(__getfield_unknown4, __setfield_unknown4, __delfield_unknown4, None)
+
+    def iscontainer(self):
+        return True
+
+    def containerelements(self):
+        yield ('pos', self.__field_pos, "position within file, used as an event id")
+        yield ('description', self.__field_description, None)
+        yield ('cdate', self.__field_cdate, None)
+        yield ('mdate', self.__field_mdate, None)
+        yield ('start', self.__field_start, None)
+        yield ('end_time', self.__field_end_time, None)
+        yield ('end_date', self.__field_end_date, None)
+        yield ('repeat', self.__field_repeat, None)
+        yield ('alarmindex_vibrate', self.__field_alarmindex_vibrate, None)
+        yield ('ringtone', self.__field_ringtone, None)
+        yield ('unknown1', self.__field_unknown1, None)
+        yield ('alarmminutes', self.__field_alarmminutes, "a value of 0xFF indicates not set")
+        yield ('alarmhours', self.__field_alarmhours, "a value of 0xFF indicates not set")
+        yield ('unknown2', self.__field_unknown2, None)
+        yield ('unknown3', self.__field_unknown3, None)
+        yield ('unknown4', self.__field_unknown4, None)
+
+
+
+
+class schedulefile(BaseProtogenClass):
+    __fields=['numactiveitems', 'events']
+
+    def __init__(self, *args, **kwargs):
+        dict={}
+        # What was supplied to this function
+        dict.update(kwargs)
+        # Parent constructor
+        super(schedulefile,self).__init__(**dict)
+        if self.__class__ is schedulefile:
+            self._update(args,dict)
+
+
+    def getfields(self):
+        return self.__fields
+
+
+    def _update(self, args, kwargs):
+        super(schedulefile,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(schedulefile,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()
+        self.__field_numactiveitems.writetobuffer(buf)
+        try: self.__field_events
+        except:
+            self.__field_events=LIST(**{'elementclass': scheduleevent})
+        self.__field_events.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_numactiveitems=UINT(**{'sizeinbytes': 2})
+        self.__field_numactiveitems.readfrombuffer(buf)
+        self.__field_events=LIST(**{'elementclass': scheduleevent})
+        self.__field_events.readfrombuffer(buf)
+        self._bufferendoffset=buf.getcurrentoffset()
+
+
+    def __getfield_numactiveitems(self):
+        return self.__field_numactiveitems.getvalue()
+
+    def __setfield_numactiveitems(self, value):
+        if isinstance(value,UINT):
+            self.__field_numactiveitems=value
+        else:
+            self.__field_numactiveitems=UINT(value,**{'sizeinbytes': 2})
+
+    def __delfield_numactiveitems(self): del self.__field_numactiveitems
+
+    numactiveitems=property(__getfield_numactiveitems, __setfield_numactiveitems, __delfield_numactiveitems, None)
+
+    def __getfield_events(self):
+        try: self.__field_events
+        except:
+            self.__field_events=LIST(**{'elementclass': scheduleevent})
+        return self.__field_events.getvalue()
+
+    def __setfield_events(self, value):
+        if isinstance(value,LIST):
+            self.__field_events=value
+        else:
+            self.__field_events=LIST(value,**{'elementclass': scheduleevent})
+
+    def __delfield_events(self): del self.__field_events
+
+    events=property(__getfield_events, __setfield_events, __delfield_events, None)
+
+    def iscontainer(self):
+        return True
+
+    def containerelements(self):
+        yield ('numactiveitems', self.__field_numactiveitems, None)
+        yield ('events', self.__field_events, None)
+
+
+
+
 class ULReq(BaseProtogenClass):
     ""
     __fields=['cmd', 'unlock_code', 'unlock_key', 'zero']
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.