WvStreams
unisubtreegen.cc
00001 /*
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
00004  * 
00005  * A UniConfGen for returning only a particular subtree of a given generator.
00006  */
00007 #include "unisubtreegen.h"
00008 #include "wvbuf.h"
00009 #include "wvtclstring.h"
00010 #include "wvmoniker.h"
00011 #include "wvlinkerhack.h"
00012 
00013 WV_LINK(UniSubtreeGen);
00014 
00015 
00016 static IUniConfGen *creator(WvStringParm s, IObject *_obj)
00017 {
00018     WvConstInPlaceBuf buf(s, s.len());
00019     WvString one(wvtcl_getword(buf)), two(wvtcl_getword(buf));
00020 
00021     if (!one) one = "";
00022     if (!two) two = "";
00023     
00024     return new UniSubtreeGen(wvcreate<IUniConfGen>(one), two);
00025 }
00026 
00027 static WvMoniker<IUniConfGen> subtreereg("subtree", creator);
00028 
00029 
00030 UniSubtreeGen::UniSubtreeGen(IUniConfGen *gen, const UniConfKey &_subkey)
00031     : UniFilterGen(gen), subkey(_subkey)
00032 {
00033     // nothing special
00034 }
00035 
00036 
00037 bool UniSubtreeGen::keymap(const UniConfKey &unmapped_key, UniConfKey &mapped_key)
00038 {
00039     if (unmapped_key.isempty())
00040         mapped_key = subkey;
00041     else
00042         mapped_key = UniConfKey(subkey, unmapped_key);
00043     return true;
00044 }
00045 
00046 bool UniSubtreeGen::reversekeymap(const UniConfKey &mapped_key, UniConfKey &unmapped_key)
00047 {
00048     UniConfKey _unmapped_key;
00049     bool result = subkey.suborsame(mapped_key, _unmapped_key);
00050     if (result)
00051         unmapped_key = _unmapped_key;
00052     return result;
00053 }