Ejemplo n.º 1
0
 Value ValueParserBase::getValue() const
 {
     ULXR_TRACE("ValueParserBase::getValue()");
     Value *v = getTopValueState()->getValue();
     if (v != 0)
         return *v;
     else
         return Value(); // return ulxr::Void()
 }
Ejemplo n.º 2
0
bool MethodResponseParser::testEndElement(const XML_Char *name)
{
  ULXR_TRACE("MethodResponseParser::testEndElement(const XML_Char*)");

  if (states.size() <= 1)
    throw RuntimeException(ApplicationError, "abnormal program behaviour: MethodResponseParser::testEndElement() had no states left");

  std::auto_ptr<ValueState> curr(getTopValueState());
  states.pop();
  ValueState *on_top = getTopValueState();

  switch(curr->getParserState() )
  {
    case eMethodResponse:
      setComplete(true);
      assertEndElement(name, "methodResponse");
      on_top->takeValue (curr->getValue());
      if (on_top->getValue() != 0)
        method_value = *on_top->getValue();
    break;

    case eFault:
      assertEndElement(name, "fault");
      on_top->takeValue (curr->getValue());
    break;

    case eParams:
      assertEndElement(name, "params");
      on_top->takeValue (curr->getValue());
    break;

    case eParam:
      assertEndElement(name, "param");
      on_top->takeValue (curr->getValue());
    break;

    default:
      states.push(curr.release());   // put back, someone else will process
      return false;
  }

  return true;
}
Ejemplo n.º 3
0
ULXR_API_IMPL0 ValueParser::~ValueParser()
{
  ULXR_TRACE(ULXR_PCHAR("ValueParser::~ValueParser()"));

#ifdef DEBUG
  if (states.size() != 1)
    std::cerr << ulxr_i18n("########## abnormal program behaviour: states.size() != 1: ")
              << states.size()
              << std::endl;

  if (getTopValueState()->getParserState() != eNone)
    std::cerr << ulxr_i18n("########## abnormal program behaviour: getTopState()->getState() != eNone: ")
              << getTopValueState()->getParserState()
              << std::endl;
#endif

  while (states.size() != 0)
  {
    if (getTopValueState()->canDelete())
      delete getTopValueState()->getValue();
    delete getTopValueState();
    states.pop();
  }
}
Ejemplo n.º 4
0
    bool MethodCallParser::testEndElement(const XML_Char *name)
    {
        ULXR_TRACE("MethodCallParser::testEndElement(const XML_Char*)");

        if (states.size() <= 1)
            throw RuntimeException(ApplicationError, "abnormal program behaviour: MethodCallParser::testEndElement() had no states left");

        std::auto_ptr<ValueState> curr(getTopValueState());
        states.pop();

//   ULXR_TRACE("\n  current data: <"
//              << curr->getCharData() << ">");

        switch(curr->getParserState() )
        {
        case eMethodName:
            assertEndElement(name, "methodName");
            methodcall.setMethodName(curr->getCharData());
            break;

        case eMethodCall:
            assertEndElement(name, "methodCall");
            setComplete(true);
            break;

        case eParams:
            assertEndElement(name, "params");
            break;

        case eParam:
            assertEndElement(name, "param");
            if (curr->getValue() != 0)
                methodcall.addParam(*curr->getValue());
            delete curr->getValue();
            break;

        default:
            states.push(curr.release());  // put back, someone else will process
            return false;
        }

        return true;
    }
Ejemplo n.º 5
0
ULXR_API_IMPL(bool) ValueParser::testEndElement(const XML_Char *name)
{
  ULXR_TRACE(ULXR_PCHAR("ValueParser::testEndElement(const XML_Char*)"));

  if (states.size() <= 1)
    throw RuntimeException(ApplicationError, ulxr_i18n(ULXR_PCHAR("abnormal program behaviour: ValueParser::testEndElement() had no states left")));

  std::auto_ptr<ValueState> curr(getTopValueState());
  states.pop();
/*
  ULXR_DOUT (ULXR_GET_STRING(name)
             << ULXR_PCHAR(" = cur-val: ")
             << std::hex << (void*) curr->getValue()
             << ULXR_PCHAR(" state: ")
             << std::hex << (void*) curr->getParserState()
             << ULXR_PCHAR(" prev state: ")
             << std::hex << (void*) curr->getPrevParserState()
             << std::dec);
*/
  states.top()->setPrevParserState(curr->getParserState());
  switch(curr->getParserState() )
  {
    case eBoolean:
      assertEndElement(name, "boolean");
      getTopValueState()->takeValue(new Value(Boolean(curr->getCharData())) );
    break;

    case eInt:
      assertEndElement(name, "int");
      getTopValueState()->takeValue(new Value(Integer(curr->getCharData())) );
    break;

    case eI4:
      assertEndElement(name, "i4");
      getTopValueState()->takeValue(new Value(Integer(curr->getCharData())) );
    break;

    case eDouble:
      assertEndElement(name, "double");
      getTopValueState()->takeValue(new Value(Double(curr->getCharData())) );
    break;

    case eString:
      assertEndElement(name, "string");
      getTopValueState()->takeValue(new Value(RpcString(curr->getCharData())) );
    break;

    case eBase64:
    {
      assertEndElement(name, "base64");
      Base64 b64;
      b64.setBase64(curr->getCharData()); // move raw data!
      getTopValueState()->takeValue(new Value(b64));
    }
    break;

    case eDate:
      assertEndElement(name , "dateTime.iso8601");
      getTopValueState()->takeValue(new Value(DateTime(curr->getCharData())) );
    break;

    case eMember:
      assertEndElement(name, "member");
      getTopValueState()->takeValue (curr->getValue());
    break;

    case eName:
      assertEndElement(name, "name");
      getTopValueState()->takeName((curr->getCharData()) );
    break;

    case eValue:
      assertEndElement(name, "value");
      if (curr->getValue() == 0)     // special case
      {
        if(curr->getPrevParserState() == eArray)            // not empty Array
           getTopValueState()->takeValue (new Value(Array()));

        else if (curr->getPrevParserState() == eStruct)     // not empty Struct
           getTopValueState()->takeValue (new Value(Struct()));

        else                                                // no type tag defaults to string
          getTopValueState()->takeValue (new Value(RpcString(curr->getCharData())));
      }
      else
        getTopValueState()->takeValue (curr->getValue());
    break;

    case eStruct:
      assertEndElement(name, "struct");
      getTopValueState()->takeValue (curr->getValue());
    break;

    case eArray:
      assertEndElement(name, "array");
      getTopValueState()->takeValue (curr->getValue());
    break;

    case eData:
      assertEndElement(name, "data");
      getTopValueState()->takeValue (curr->getValue());
    break;

    default:
      states.push(curr.release());
      return false;
  }

  return true;
}
Ejemplo n.º 6
0
  ValueParser::testStartElement(const XML_Char* name, const XML_Char** /* atts */)
{
  ULXR_TRACE(ULXR_PCHAR("ValueParser::testStartElement(const XML_Char*, const char**)")
             << ULXR_PCHAR("\n  name: ")
             << ULXR_GET_STRING(name)
            );
  switch(getTopValueState()->getParserState() )
  {
    case eNone:
      if (strcmp(name, "value") == 0)
        states.push(new ValueState(eValue));
      else
        return false;
    break;

    case eValue:
      if (strcmp(name, "array") == 0)
        states.push(new ValueState(eArray));

      else if (strcmp(name, "struct") == 0)
        states.push(new ValueState(eStruct));

      else if (strcmp(name, "boolean") == 0)
        states.push(new ValueState(eBoolean));

      else if (strcmp(name, "int") == 0)
        states.push(new ValueState(eInt));

      else if (strcmp(name, "i4") == 0)
        states.push(new ValueState(eI4));

      else if (strcmp(name, "double") == 0)
        states.push(new ValueState(eDouble));

      else if (strcmp(name, "string") == 0)
        states.push(new ValueState(eString));

      else if (strcmp(name, "base64") == 0)
        states.push(new ValueState(eBase64));

      else if (strcmp(name, "dateTime.iso8601") == 0)
        states.push(new ValueState(eDate));

      else
        return false;
    break;

    case eStruct:
      if (strcmp(name, "member") == 0)
      {
        if (getTopValueState()->getValue() == 0)  // first closing member adds struct-item
          getTopValueState()->takeValue(new Value(Struct()), false);
        states.push(new MemberState(eMember, getTopValueState()->getValue()));
      }
      else
        return false;
    break;

    case eMember:
      if (strcmp(name, "name") == 0)
        states.push(new ValueState(eName));

      else if (strcmp(name, "value") == 0)
        states.push(new ValueState(eValue));

      else
        return false;

    break;

    case eArray:
      if (strcmp(name, "data") == 0)
        states.push(new ArrayState(eData));
      else
        return false;
    break;

    case eData:
      if (strcmp(name, "value") == 0)  // closing value adds data-items
        states.push(new ValueState(eValue));
      else
        return false;
    break;

    default:
        return false;
  }

  return true;
}