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) 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 UniConfKey UniSubtreeGen::keymap(const UniConfKey &key) 00038 { 00039 if (key == UniConfKey()) 00040 return subkey; 00041 else if (subkey == UniConfKey()) 00042 return key; 00043 else 00044 return UniConfKey(subkey, key); 00045 } 00046 00047 UniConfKey UniSubtreeGen::reversekeymap(const UniConfKey &key) 00048 { 00049 if (key.numsegments() >= subkey.numsegments()) 00050 return UniConfKey(key.removefirst(subkey.numsegments())); 00051 00052 return key; 00053 }