00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <pandabase.h>
00020 #include <notify.h>
00021 #include <dconfig.h>
00022
00023 #include "test_bam.h"
00024
00025
00026 TypeHandle Person::_type_handle;
00027 TypeHandle Parent::_type_handle;
00028 TypeHandle Child::_type_handle;
00029
00030 ConfigureFn(config_util)
00031 {
00032 TypedObject::init_type();
00033 ReferenceCount::init_type();
00034 TypedReferenceCount::init_type();
00035 init_system_type_handles();
00036 FactoryParam::init_type();
00037 Datagram::init_type();
00038 TypedWritable::init_type();
00039 WritableParam::init_type();
00040 BamReaderParam::init_type();
00041 TypedWritableReferenceCount::init_type();
00042
00043 Person::init_type();
00044 Parent::init_type();
00045 Child::init_type();
00046
00047 BamReader::get_factory()->register_factory(Person::get_class_type(), Person::make_person);
00048 BamReader::get_factory()->register_factory(Parent::get_class_type(), Parent::make_parent);
00049 BamReader::get_factory()->register_factory(Child::get_class_type(), Child::make_child);
00050 }
00051
00052 void Person::
00053 write_datagram(BamWriter* manager, Datagram &me)
00054 {
00055
00056 me.add_string(_name);
00057
00058 me.add_uint8(myGender);
00059 manager->write_pointer(me, _bro);
00060 manager->write_pointer(me, _sis);
00061 }
00062
00063 TypedWritable* Person::
00064 make_person(const FactoryParams ¶ms)
00065 {
00066 Person *me = new Person;
00067 DatagramIterator scan;
00068 BamReader *manager;
00069
00070 parse_params(params, scan, manager);
00071 me->fillin(me, scan, manager);
00072 return me;
00073 }
00074
00075 void Person::
00076 fillin(Person* me, DatagramIterator& scan, BamReader* manager)
00077 {
00078 _name = scan.get_string();
00079 myGender = scan.get_uint8();
00080 manager->read_pointer(scan);
00081 manager->read_pointer(scan);
00082 }
00083
00084 int Person::
00085 complete_pointers(TypedWritable **p_list, BamReader *)
00086 {
00087 _bro = (p_list[0] == TypedWritable::Null) ? (Person*)NULL : DCAST(Person, p_list[0]);
00088 _sis = (p_list[1] == TypedWritable::Null) ? (Person*)NULL : DCAST(Person, p_list[1]);
00089 return 2;
00090 }
00091
00092 void Person::
00093 print_relationships(void){
00094 nout << "My name is " << _name << endl;
00095 if (_bro != NULL)
00096 nout << "My brother is " << _bro->name() << endl;
00097 if (_sis != NULL)
00098 nout << "My sister is " << _sis->name() << endl;
00099 }
00100
00101 void Parent::
00102 write_datagram(BamWriter* manager, Datagram &me)
00103 {
00104 Person::write_datagram(manager, me);
00105 manager->write_pointer(me, _son);
00106 manager->write_pointer(me, _daughter);
00107 }
00108
00109 TypedWritable* Parent::
00110 make_parent(const FactoryParams ¶ms)
00111 {
00112 Parent *me = new Parent;
00113 DatagramIterator scan;
00114 BamReader *manager;
00115
00116 parse_params(params, scan, manager);
00117 me->fillin(me, scan, manager);
00118 return me;
00119 }
00120
00121 void Parent::
00122 fillin(Parent* me, DatagramIterator& scan, BamReader* manager)
00123 {
00124 Person::fillin(me, scan, manager);
00125 manager->read_pointer(scan);
00126 manager->read_pointer(scan);
00127 }
00128
00129 int Parent::
00130 complete_pointers(TypedWritable *p_list, BamReader *manager)
00131 {
00132 int start = Person::complete_pointers(p_list, manager);
00133 _son = (p_list[start] == TypedWritable::Null) ? (Child*)NULL : DCAST(Child, p_list[2]);
00134 _daughter = (p_list[start+1] == TypedWritable::Null) ? (Child*)NULL : DCAST(Child, p_list[3]);
00135 return start+2;
00136 }
00137
00138 void Parent::
00139 setSon(Child* son)
00140 {
00141 if (son->isMale()) _son = son;
00142 }
00143 void Parent::
00144 setDaughter(Child* daughter)
00145 {
00146 if (!daughter->isMale()) _daughter = daughter;
00147 }
00148
00149
00150 void Parent::
00151 print_relationships(void){
00152 Person::print_relationships();
00153 if (_son != NULL)
00154 nout << "My son is " << _son->name() << endl;
00155 if (_daughter != NULL)
00156 nout << "My daughter is " << _daughter->name() << endl;
00157 }
00158
00159 void Child::
00160 write_datagram(BamWriter* manager, Datagram &me)
00161 {
00162 Person::write_datagram(manager, me);
00163 manager->write_pointer(me, _dad);
00164 manager->write_pointer(me, _mom);
00165 }
00166
00167 TypedWritable* Child::
00168 make_child(const FactoryParams ¶ms)
00169 {
00170 Child *me = new Child;
00171 DatagramIterator scan;
00172 BamReader *manager;
00173
00174 parse_params(params, scan, manager);
00175 me->fillin(me, scan, manager);
00176 me->fillin(me, scan, manager);
00177
00178 return me;
00179 }
00180
00181 void Child::
00182 fillin(Child* me, DatagramIterator& scan, BamReader* manager)
00183 {
00184 Person::fillin(me, scan, manager);
00185 manager->read_pointer(scan);
00186 manager->read_pointer(scan);
00187 }
00188
00189 int Child::
00190 complete_pointers(TypedWritable ** p_list, BamReader *manager)
00191 {
00192 int start = Person::complete_pointers(p_list, manager);
00193 _dad = (p_list[start] == TypedWritable::Null) ? (Parent*)NULL : DCAST(Parent, p_list[2]);
00194 _mom = (p_list[start+1] == TypedWritable::Null) ? (Parent*)NULL : DCAST(Parent, p_list[3]);
00195 return start+2;
00196 }
00197
00198
00199 void Child::
00200 setFather(Parent* dad)
00201 {
00202 if (dad->isMale()) _dad = dad;
00203 }
00204
00205 void Child::
00206 setMother(Parent* mom)
00207 {
00208 if (!mom->isMale()) _mom = mom;
00209 }
00210
00211 void Child::
00212 print_relationships(void){
00213 Person::print_relationships();
00214 if (_dad != NULL)
00215 nout << "My dad is " << _dad->name() << endl;
00216 if (_mom != NULL)
00217 nout << "My mom is " << _mom->name() << endl;
00218 }