Subversion Repositories Projects

Rev

Blame | Last modification | View Log | RSS feed

/* Copyright (C) 2010-2011 Circuits At Home, LTD. All rights reserved.

This software may be distributed and modified under the terms of the GNU
General Public License version 2 (GPL2) as published by the Free Software
Foundation and appearing in the file GPL2.TXT included in the packaging of
this file. Please note that GPL2 Section 2[b] requires that all works based
on this software must also be made publicly available under the terms of
the GPL2 ("Copyleft").

Contact information
-------------------

Circuits At Home, LTD
Web      :  http://www.circuitsathome.com
e-mail   :  support@circuitsathome.com
*/

#include "ptpcallback.h"
#include "ptpdebug.h"

bool MultiByteValueParser::Parse(uint8_t **pp, uint16_t *pcntdn)
{
        if (!pBuf)
        {
                Notify(PSTR("Buffer pointer is NULL!\r\n"));
                return false;
        }
        for (; countDown && (*pcntdn); countDown--, (*pcntdn)--, (*pp)++)
                pBuf[valueSize-countDown] = (**pp);

        if (countDown)
                return false;

        countDown = valueSize;
        return true;
}

bool PTPListParser::Parse(uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me)
{
        switch (nStage)
        {
        case 0:
                pBuf->valueSize = lenSize;
                theParser.Initialize(pBuf);
                nStage = 1;

        case 1:
                if (!theParser.Parse(pp, pcntdn))
                        return false;
               
                arLen = 0;
                arLen = (pBuf->valueSize >= 4) ? *((uint32_t*)pBuf->pValue) : (uint32_t)(*((uint16_t*)pBuf->pValue));
                arLenCntdn = arLen;
                nStage = 2;

        case 2:
                pBuf->valueSize = valSize;
                theParser.Initialize(pBuf);
                nStage = 3;

        case 3:
                for (; arLenCntdn; arLenCntdn--)
                {
                        if (!theParser.Parse(pp, pcntdn))
                                return false;
                       
                        if (pf)
                                pf(pBuf, (arLen - arLenCntdn), me);
                }

                nStage = 0;
        }
        return true;
}