/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include <roap/RoapMessageHandler.h>
#include <util/xml/DomExpatAgent.h>
#include <util/xml/XMLDocumentImpl.h>
#include <util/domcore/NodeListImpl.h>
#include <util/domcore/DOMString.h>
#include <ofstream.h>
using namespace ustl;

/**see RoapMessageHandler.h */
RoapMessageHandler::RoapMessageHandler()
{
    mDoc = NULL;
}

/**see RoapMessageHandler.h */
XMLDocumentImpl* RoapMessageHandler::createClientMsg(RoapMessageHandler::msgType type)
{
    /* load template from files temporarily, FIX ME later */
    string msgTemplate;
    switch (type)
    {
        case RoapMessageHandler::DeviceHello:
            msgTemplate.append("deviceHello.xml");
            break;
        case RoapMessageHandler::RegistrationRequest:
            msgTemplate.append("deviceHello.xml");        
            break;
        case RoapMessageHandler::RORequest:
            msgTemplate.append("deviceHello.xml");      
            break;
        default:
            return NULL;
    }
    ifstream xmlStream(msgTemplate.c_str());
    XMLDocumentImpl* xmlDoc = new XMLDocumentImpl();
    DomExpatAgent domExpatAgent1(xmlDoc);
    if (domExpatAgent1.generateDocumentFromXML(&xmlStream))
    {
        return xmlDoc;
    }
    else
    {
        delete(xmlDoc);
        return NULL;
    }
}

