#include <PersistNode.h>
Public Member Functions | |
| PersistNode () | |
| Create an empty node. | |
| PersistNode (istream &is) | |
| Create root node and read tree from stream. | |
| ~PersistNode () | |
| Free node and all its children. | |
| void | output (ostream &os, string name) const |
| bool | readnode (istream &is) |
| bool | readtoken (istream &is, string &tok) |
| PersistNode * | addnode (const string &name) |
| void | delnode (const string &name) |
| void | addattr (const string &keyvalue) |
| void | addattr (const string &key, long value) |
| bool | hasAttr (const string &key) const |
| string | attrString (const string &key, const string &fallback="") const |
| long | attrLong (const string &key, long fallback=0) const |
| cdrMemoryStream | attrCdrStream (const string &key) const |
| PersistNode * | child (const string &key) const |
Static Public Member Functions | |
| static void | outputCdrMemoryStream (ostream &os, cdrMemoryStream &memstr, const char *prefix=NULL) |
| Writes an encoded version of the buffer to the output stream. | |
| static void | outputIOR (ostream &os, CORBA::Object_ptr obj, const char *prefix=NULL) |
| Writes an IOR to the output stream. | |
Public Attributes | |
| map< string, PersistNode * > | _child |
| map< string, string > | _attr |
Static Public Attributes | |
| static const char * | _separator = "::" |
| Separator for node names ("::"). | |
|
|
Create an empty node.
Definition at line 53 of file PersistNode.h. Referenced by addnode(). |
|
|
Create root node and read tree from stream.
Definition at line 35 of file PersistNode.cc. References readnode(). 00036 {
00037 while( readnode(is) ){}
00038 }
|
|
|
Free node and all its children.
Definition at line 40 of file PersistNode.cc. References _child. 00041 {
00042 for(map<string,PersistNode*>::iterator i=_child.begin(); i!=_child.end(); ++i)
00043 delete i->second;
00044 }
|
|
||||||||||||
|
Definition at line 146 of file PersistNode.cc. References _attr. 00147 {
00148 char buf[64];
00149 sprintf(buf,"%i",value);
00150 _attr[key]=string(buf);
00151 }
|
|
|
Definition at line 140 of file PersistNode.cc. References _attr. Referenced by readnode(). 00141 {
00142 string::size_type pos =keyvalue.find('=');
00143 _attr[keyvalue.substr(0,pos)]=(pos==string::npos?"":keyvalue.substr(pos+1));
00144 }
|
|
|
Definition at line 100 of file PersistNode.cc. References _child, _separator, and PersistNode(). Referenced by readnode(). 00101 {
00102 string::size_type pos =name.find(_separator);
00103 // get reference to Next node in the path.
00104 PersistNode*& newchild =_child[name.substr(0,pos)];
00105
00106 if(pos==string::npos) // leaf: add new leaf.
00107 {
00108 if(newchild)
00109 delete newchild; // overwrite old leaf (and its children)
00110 newchild=new PersistNode();
00111 return newchild;
00112 }
00113 else // branch: just add the branch if it's missing, and then recurse.
00114 {
00115 if(!newchild)
00116 newchild=new PersistNode();
00117 return newchild->addnode(name.substr(pos+2));
00118 }
00119 }
|
|
|
Definition at line 173 of file PersistNode.cc. 00174 {
00175 map<string,string>::const_iterator pos=_attr.find(key);
00176 if(pos==_attr.end())
00177 {
00178 DB(1,"ERROR, missing cdrStream attribute: "<<key.c_str())
00179 return cdrMemoryStream(); // eek! bad input data.
00180 }
00181 if(1==pos->second.size()%2)
00182 {
00183 DB(1,"ERROR, cdrStream attribute should have even-number of chars: "
00184 <<key.c_str())
00185 return cdrMemoryStream(); // eek! bad input data.
00186 }
00187 // OK
00188 const int len =pos->second.size()/2;
00189 CORBA::Octet* buf =new CORBA::Octet[len]; // Make a buffer of the right size
00190 char str[3];
00191 str[2]='\0';
00192 for(int i=0; i<len; ++i) // Fill it
00193 {
00194 str[0]=pos->second[2*i ];
00195 str[1]=pos->second[2*i+1];
00196 long byte=::strtol(str,NULL,16);
00197 assert(byte>=0 && byte<256);
00198 buf[i]=(CORBA::Octet)byte;
00199 }
00200 cdrMemoryStream memstr; // don't bother to clear memory.
00201 memstr.put_octet_array(buf,len); // Copy it into a cdrMemoryStream
00202 delete[] buf; // ?? use auto_ptr
00203 return memstr;
00204 }
|
|
||||||||||||
|
Definition at line 165 of file PersistNode.cc. 00166 {
00167 map<string,string>::const_iterator pos=_attr.find(key);
00168 if(pos!=_attr.end())
00169 return ::atol(pos->second.c_str());
00170 DB(20,"PersistNode failed to find key: "<<key.c_str()<<" (long)")
00171 return fallback;
00172 }
|
|
||||||||||||
|
Definition at line 157 of file PersistNode.cc. 00158 {
00159 map<string,string>::const_iterator pos=_attr.find(key);
00160 if(pos!=_attr.end())
00161 return pos->second;
00162 DB(20,"PersistNode failed to find key: "<<key.c_str()<<" (string)")
00163 return fallback;
00164 }
|
|
|
Definition at line 205 of file PersistNode.cc. References _child. Referenced by Omniifr::Repository_impl::reincarnate(). 00206 {
00207 map<string,PersistNode*>::const_iterator pos=_child.find(key);
00208 if(pos==_child.end())
00209 return NULL;
00210 else
00211 return pos->second;
00212 }
|
|
|
Definition at line 121 of file PersistNode.cc. References _child, and _separator. Referenced by readnode(). 00122 {
00123 string::size_type pos =name.find(_separator);
00124 // get reference to Next node in the path.
00125 map<string,PersistNode*>::iterator childpos =_child.find(name.substr(0,pos));
00126 if(childpos!=_child.end())
00127 {
00128 if(pos==string::npos) // leaf: delete leaf.
00129 {
00130 delete childpos->second;
00131 _child.erase(childpos);
00132 }
00133 else // branch: recurse
00134 {
00135 childpos->second->delnode(name.substr(pos+2));
00136 }
00137 }
00138 }
|
|
|
Definition at line 153 of file PersistNode.cc. References _attr.
|
|
||||||||||||
|
Definition at line 46 of file PersistNode.cc. References _attr, _child, and _separator. 00047 {
00048 if(!name.empty()) // Don't output root node.
00049 {
00050 os<<name<<'\n';
00051 for(map<string,string>::const_iterator i=_attr.begin();
00052 i!=_attr.end();
00053 ++i)
00054 {
00055 os<<" "<<i->first<<"="<<i->second<<'\n';
00056 }
00057 os<<" ;;\n";
00058 name+=_separator;
00059 }
00060 for(map<string,PersistNode*>::const_iterator i=_child.begin();
00061 i!=_child.end();
00062 ++i)
00063 {
00064 i->second->output(os,name+i->first);
00065 }
00066 }
|
|
||||||||||||||||
|
Writes an encoded version of the buffer to the output stream.
Definition at line 214 of file PersistNode.cc. 00219 {
00220 if(prefix)
00221 os<<prefix;
00222 char buf[3];
00223 CORBA::ULong len(memstr.bufSize());
00224 CORBA::Octet* ptr((CORBA::Octet*)memstr.bufPtr());
00225 for(CORBA::ULong i=0; i<len; ++i)
00226 {
00227 sprintf(buf,"%02x",ptr[i]);
00228 os.write(buf,2);
00229 }
00230 }
|
|
||||||||||||||||
|
Writes an IOR to the output stream.
Definition at line 232 of file PersistNode.cc. 00237 {
00238 if(prefix)
00239 os<<prefix;
00240 CORBA::String_var iorstr =
00241 Repository_impl::inst()._orb->object_to_string(obj);
00242 os<<iorstr.in();
00243 }
|
|
|
Definition at line 69 of file PersistNode.cc. References addattr(), addnode(), delnode(), and readtoken(). Referenced by PersistNode(). 00070 {
00071 PersistNode* node =NULL;
00072 string tok;
00073 while(true)
00074 {
00075 if(!readtoken(is,tok) || tok==";;")
00076 return bool(node);
00077 else if(node)
00078 node->addattr(tok);
00079 else if(tok[0]=='-')
00080 delnode(tok.substr(1));
00081 else
00082 node=addnode(tok);
00083 }
00084 }
|
|
||||||||||||
|
Definition at line 86 of file PersistNode.cc. Referenced by readnode(). 00087 {
00088 while(is)
00089 {
00090 is>>tok;
00091 if(tok.empty())
00092 break;
00093 if(tok[0]!='#')
00094 return true;
00095 is.ignore(INT_MAX,'\n');
00096 }
00097 return false;
00098 }
|
|
|
Definition at line 76 of file PersistNode.h. Referenced by addattr(), attrCdrStream(), attrLong(), attrString(), hasAttr(), and output(). |
|
|
Definition at line 75 of file PersistNode.h. Referenced by addnode(), child(), delnode(), output(), Omniifr::Repository_impl::reincarnate(), and ~PersistNode(). |
|
|
Separator for node names ("::").
Definition at line 33 of file PersistNode.cc. |
1.4.1