/*
 * Worldvisions Weaver Software:
 *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
 *
 * WvProtoStream test.  Defines a simple language consisting of the commands
 * and states "one", "two", "three", and "four".  See if you can get to state
 * three!  Hours of fun for the whole family!
 *
 */

#include "wvprotostream.h"
#include "wvlog.h"


class ProtoTest : public WvProtoStream
{
public:
    ProtoTest(WvStream *_cloned, WvLog *_debuglog);
    virtual void do_state(Token &t1);
    virtual void switch_state(int newstate);
};


enum States {
    None = 0,
    One,
    Two,
    Three,
    Four,
};


const char *toks[] = {
    "quit",
    "one",
    "Two",
    "THREE",
    "four",
    NULL
};


ProtoTest::ProtoTest(WvStream *_cloned, WvLog *_debuglog)
	: WvProtoStream(_cloned, _debuglog)
{
    switch_state(One);
}


void ProtoTest::do_state(Token &t1)
{
    enum States tok = (States)tokanal(t1, toks, false);

    if (tok < 0)
	print("ERROR Unknown command (%s)\n", t1.data);
    else
	switch_state(tok);
}


void ProtoTest::switch_state(int newstate)
{
    switch ((States)newstate)
    {
    case Three:
	if (state != Two)
	{
	    print("ERROR Only from state two!\n");
	    break;
	}
	
	// else fall through!

    case One:
    case Two:
    case Four:
	print("GO %s (%s)\n", newstate, toks[newstate]);
	break;
	
    case None:
	close();
	break;
    }

    state = newstate;
}


int main()
{
    WvLog log("prototest");
    ProtoTest ps(wvcon, &log);
    
    log("Starting...\n");
    
    while (ps.isok())
    {
	if (ps.select(100))
	    ps.callback();
    }

    ps.cloned = NULL;
}
