Re: PalmDB requests and bug report

Rick Price <[email protected]> Wed, 27 Sep 2006 22:26:53 -0400 (Eastern Daylight Time)
Newsgroups gmane.comp.handhelds.palm.progect
Message-ID <[email protected]>

On Wed, 27 Sep 2006, "Jeff Mikels" wrote:

> Is there a way for me to get SVN upload access? I'd like to submit my
> changes to your indentations and additions to comments/documentation where I
> can.

Sure, I need your SourceForge ID.

If you are going to put in documentation, you should create a new 
directory for it under the main PalmDB directory.

Rick


>
>
>
> On 9/27/06, Rick Price <[email protected]> wrote:
>>
>> Hi Jeff,
>>
>> I created a ToDo plugin for you, to help get you started (and I checked it
>> into SVN).
>>
>> It is called PalmToDoPlugin.py.
>>
>> I have not tried to compile it, and it is incomplete, but it should get
>> you started on your way. I put comments in where I expect you to have to
>> change things.
>>
>> If you have to do any more than configure how to crack the Palm task
>> header, contact me, because I missed something I don't expect you to have
>> to know...
>>
>> You can change the copyright to anything you want, I just copied the
>> Progect plugin and removed things you shouldn't need.
>>
>> And it includes the abominable tab/spaces :).
>>
>> Have Fun
>> Rick
>>
>>
>> On Wed, 27 Sep 2006, Rick Price wrote:
>>
>>>
>>>
>>> On Tue, 26 Sep 2006, "Jeff Mikels" wrote:
>>>
>>>> I should have said "unpack" or "crack" instead of decrypt. That was
>> silly of
>>>> me.
>>>
>>> No problem, when I reread your email after writing most of my reply, I
>>> realized what you had meant.
>>>
>>> Basically it was a bad day, and I wasn't really paying attention as I
>> read
>>> it.
>>>
>>>>
>>>> Anyway, about the plugin, the xml produced from the tododb by the basic
>>>> plugin is perfect except for the payload.
>>>>
>>>
>>> Yea, that makes sense, that is what is supposed to happen.
>>>
>>>> The todo db has 3 bytes, then a string for the description, then a
>> string
>>>> for the note. I'm pretty sure those three bytes are for the category
>> int,
>>>> the date, the deleted flag, and the completed flag.
>>>
>>> Some of this is already unpacked for you AFAIK. I think the category
>> int,
>>> and the deleted and so on flags are part of the header we unpack but I
>>> would have to check.
>>>
>>>>
>>>> It won't be difficult at all to implement, but I'm having trouble
>> figuring
>>>> out the API (yes, it's the latest SVN) and python's unpack doesn't have
>> the
>>>> option for variable length null terminated strings. What do you use?
>>>
>>> I believe I just cracked the string on the 0 at the end of the string. I
>>> believe the function is split(), and you pass zero in for the char
>>> somehow.
>>>
>>> I think the appropriate thing would be something like:
>>>
>>> Text,Note=incomingString.split('\0')
>>>
>>> You have to be careful when there isn't a note on the end, but I think
>>> there *should* always be a double zero in that case, in which case the
>>> above code should work.
>>>
>>>>
>>>>
>>>>
>>>> Help me out though, do I need anything more than this?
>>>>
>>>> class ToDoRecordPlugin(PalmDB.Plugins.BasePlugin.DataRecord):
>>>>    def getPDBCreatorID(self):
>>>>        return 'todo'
>>>>    def getPalmApplicationName(self):
>>>>        return 'ToDo'
>>>
>>> This part seems fine.
>>>
>>>>
>>>>    def _crackPayload(self,dstr):
>>>>        [code here]
>>>>
>>>
>>> This part is where you should have overridden the call to create the
>>> object that is for each Palm record, that object implements
>> _crackPayload.
>>> I'm hoping to have the time to do it quickly to show you how. It should
>>> only take 15 minutes to half an hour for me to write the skeleton for
>> the
>>> plugin for you.
>>>
>>> Then you can implement _crackPayload and be done with it.
>>>
>>>
>>> Once the dust settles, would you have time to write a quick howto?
>>>
>>> Since you didn't design things, you should be in a better position to
>>> start the document, I can expand on things for you as required.
>>>
>>>>
>>>>
>>>> Oh, one more thing, your whitespace is quite inconsistent in your code.
>> You
>>>> have spaces and tabs all over the place.
>>>
>>> Yes, I would dearly love to find a good Python reformatter program.
>>>
>>> Rick
>>>
>>>
>>>>
>>>> On 9/26/06, Rick Price <[email protected]> wrote:
>>>>>
>>>>>
>>>>>
>>>>> On Tue, 26 Sep 2006, "Jeff Mikels" wrote:
>>>>>
>>>>>> I'm having a problem with the crackPalmDate function
>>>>>>
>>>>>> (I'm using svn code)
>>>>>>
>>>>>> PILOT_TIME_DELTA = 2082844800L
>>>>>> def crackPalmDate(variable):
>>>>>>        if variable == 0:
>>>>>>            return None
>>>>>>        else:
>>>>>>            return datetime.datetime.fromtimestamp
>>>>> (variable-PILOT_TIME_DELTA)
>>>>>>
>>>>>> I often get a ValueError because variable-PILOT_TIME_DELTA is
>> sometimes
>>>>> a
>>>>>> negative number. I've changed the code to be...
>>>>>>
>>>>>> PILOT_TIME_DELTA = 2082844800L
>>>>>> def crackPalmDate(variable):
>>>>>>        if variable == 0 or variable < PILOT_TIME_DELTA:
>>>>>>            return None
>>>>>>        else:
>>>>>>            return datetime.datetime.fromtimestamp
>>>>>> (variable-PILOT_TIME_DELTA)
>>>>>>
>>>>>> Is this a problem?
>>>>>
>>>>> No, I don't think so, except that if the variable is before the
>>>>> PILOT_TIME_DELTA surprises could possibly happen in the Palm...
>>>>>
>>>>> The reasoning behind my code (and it could be flawed), is that we want
>> to
>>>>> know if there really wasn't a value there, like in SQL. So since I
>> didn't
>>>>> think that the value would ever be zero (or below zero), using zero
>> for
>>>>> NULL seemed like a perfect solution.
>>>>>
>>>>> If that is not true, then we may need to rethink how things work.
>>>>>
>>>>> Can you send me a patch with your changes so I can incorporate it?
>>>>>
>>>>> Do make sure you have the latest code from SVN, I haven't changed it
>> for a
>>>>> few weeks, but it's best to make sure you have the latest.
>>>>>
>>>>>>
>>>>>>
>>>>>> Additionally, I'd like to create a "plugin" for the todo database,
>> but
>>>>> I'm
>>>>>> not sure how to go about doing it. The Base Plugin class is working
>>>>>> perfectly but the payload needs to be decrypted properly. How can I
>>>>> create a
>>>>>> plugin that only overloads the payload functions and have it loaded
>> when
>>>>>> necessary?
>>>>>>
>>>>>
>>>>> Well, I like plugins that are loaded automagically and that can be
>>>>> distributed separately, but in this case, I decided to keep it simple
>> and
>>>>> have you declare the plugin to the code.
>>>>>
>>>>> I also figured that we would just roll the plugins (not created by me)
>>>>> into the release, since just about anything someone makes will be
>> useful
>>>>> to others.
>>>>>
>>>>> [ If you use the library for something proprietary, you would just
>> call
>>>>> the plugin notification code, and keep your code separate. ]
>>>>>
>>>>> In the file PluginManager.py, you will find the functions
>>>>> registerPDBPlugin and deRegisterPDBPlugin. These are the functions you
>> use
>>>>> to register your plugin with the framework.
>>>>>
>>>>> At the bottom of the file, I use the standard functions to register my
>>>>> Progect plugin.
>>>>>
>>>>>
>>>>> Now, I'm not really sure what you mean by decrypted.
>>>>>
>>>>> If you mean you need to translate the XML that *would* have been
>> generated
>>>>> into something more useful, the code knows how to apply XSLT
>> stylesheets
>>>>> for you; both coming and going. It can also do some simple
>> transformations
>>>>> like gzip.
>>>>>
>>>>> If you need to output to say a binary or text format, I think it can
>> be
>>>>> done, but I would have to look at the code again to explain how.
>>>>>
>>>>>
>>>>> I really think I misdesigned the plugin somehow as well, but I can't
>>>>> really describe what I mean except to say this (because I haven't
>> thought
>>>>> it through yet):
>>>>> * Some classes do more than one thing - very bad
>>>>> * The symptom is that the plugin is difficult to use.
>>>>> * I expect that writing/reading formats other than XML will
>>>>> be more difficult than it should be (as in binary or text).
>>>>>
>>>>>
>>>>> If you can describe what you are doing to me, then maybe I can give
>> you
>>>>> some suggestions.
>>>>>
>>>>> I'm going to have to redesign the code _again_ because of not getting
>> the
>>>>> plugin code right, but I will try and remain compatible, or at least
>> make
>>>>> it so much easier to use that it's not hard for you to update your
>> code.
>>>>>
>>>>>
>>>>> If you mean how do I crack the Palm task format, I can certainly help
>> you
>>>>> with that too. Basically the plugin you create returns an object that
>>>>> knows what to do with the raw data as passed in by the framework.
>>>>>
>>>>> You will need to find documentation on the Palm task format, I am
>> pretty
>>>>> sure it can be found easily with Google.
>>>>>
>>>>> In this case, you would probably just subclass the default plugin so
>> that
>>>>> it returns a special Task object that knows how to crack the payload
>> for
>>>>> tasks, and puts the values into a dictionary.
>>>>>
>>>>> I believe the class ProgectRecord in plugins/ProgectPlugin.py is the
>>>>> closest thing to what you want. And the important method to create is
>>>>> _crackPayload.
>>>>>
>>>>> The problem is, that the Progect format is quite complex, and we are
>>>>> forcing a tree into rows. So the Progect class is probably not a good
>>>>> example of how to do something simple (or not a good example at
>> all...).
>>>>>
>>>>> For something like the task database, you should have almost _no_ work
>> to
>>>>> do, and so don't let the extreme complexity of the Progect plugin
>> scare
>>>>> you off.
>>>>>
>>>>> I can't predict how much work cracking a task would be, but I would
>> hope
>>>>> it would be under a hundred lines of Python code all told, and simple
>> code
>>>>> at that.
>>>>>
>>>>> Generating and reading the XML would happen automatically if I
>> remember
>>>>> correctly, so the big problem is being able to crack and pack the task
>>>>> format. (that is, the payload, because we crack the record header for
>>>>> you).
>>>>>
>>>>> I would be more than happy to give you a hand with this task, while I
>> am
>>>>> overloaded at work for the next day or so, perhaps we can talk via IM
>> or
>>>>> on the phone. Even email would be fine, if you can help me understand
>> your
>>>>> problem a little better.
>>>>>
>>>>> I can then explain how I think it can be accomplished easily with the
>>>>> framework.
>>>>>
>>>>> I will certainly try to do this for anyone who wants to use the
>> framework,
>>>>> but having the task format converted to and from XML is an important
>>>>> feature for the framework and is therefore a priority for me.
>>>>>
>>>>>
>>>>> Rick
>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> On 9/7/06, Rick Price <[email protected]> wrote:
>>>>>>>
>>>>>>> Okay, I just managed to get the Python PalmDB library to go from a
>>>>> Progect
>>>>>>> file to XML and back again without dropping anything really obvious.
>>>>>>>
>>>>>>> Anyone who wants to check out the Subversion code is welcome to do
>> so.
>>>>>>>
>>>>>>> I think I need to do a major rewrite at some point in the next
>> little
>>>>> bit,
>>>>>>> but first I will setup some conversions to popular programs that
>>>>>>> read/write XML.
>>>>>>>
>>>>>>> First on the list is going to be treeline since I use it right now
>> and
>>>>> the
>>>>>>>
>>>>>>> format seems to be basically sane.
>>>>>>>
>>>>>>> I will then probably try to do something with Omni Outliner for the
>>>>> Mac.
>>>>>>>
>>>>>>> That will probably require fixing a bug in the library that seems to
>>>>> show
>>>>>>> up on the Mac.
>>>>>>>
>>>>>>> After that, I will see what I can do based on popularity.
>>>>>>>
>>>>>>>
>>>>>>> Once I have treeline support working, and it's not too ugly to run,
>> I
>>>>> will
>>>>>>> make a release of Python PalmDB so people can start to use it.
>>>>>>>
>>>>>>> I will release again I would guess after I get Omni Outliner support
>>>>>>> working.
>>>>>>>
>>>>>>> Any questions, just email me.
>>>>>>>
>>>>>>> Rick
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Remember to visit Polls, Files and Bookmarks sections at
>>>>>>> http://groups.yahoo.com/group/progect. You are welcome to vote,
>> upload
>>>>>>> your files and submit bookmarks.
>>>>>>> Yahoo! Groups Links
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Jeff Mikels
>>>>>> leading people one step closer to Jesus
>>>>>> http://jeff.mikels.cc
>>>>>> http://thesouthsidechurch.org
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Jeff Mikels
>>>>>> leading people one step closer to Jesus
>>>>>> http://jeff.mikels.cc
>>>>>> http://thesouthsidechurch.org
>>>>>>
>>>>>>
>>>>>> [Non-text portions of this message have been removed]
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> Remember to visit Polls, Files and Bookmarks sections at
>>>>> http://groups.yahoo.com/group/progect. You are welcome to vote, upload
>>>>> your files and submit bookmarks.
>>>>> Yahoo! Groups Links
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Jeff Mikels
>>>> leading people one step closer to Jesus
>>>> http://jeff.mikels.cc
>>>> http://thesouthsidechurch.org
>>>>
>>>>
>>>> [Non-text portions of this message have been removed]
>>>>
>>>>
>>>
>>
>>
>>
>> Remember to visit Polls, Files and Bookmarks sections at
>> http://groups.yahoo.com/group/progect. You are welcome to vote, upload
>> your files and submit bookmarks.
>> Yahoo! Groups Links
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>
>
> -- 
> Jeff Mikels
> leading people one step closer to Jesus
> http://jeff.mikels.cc
> http://thesouthsidechurch.org
>
>
> [Non-text portions of this message have been removed]
>
>



Remember to visit Polls, Files and Bookmarks sections at http://groups.yahoo.com/group/progect. You are welcome to vote, upload your files and submit bookmarks. 
Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/progect/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/progect/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:[email protected] 
    mailto:[email protected]

<*> To unsubscribe from this group, send an email to:
    [email protected]

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/