00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include"positiondb.h"
00032 #include"position-clmsg.h"
00033 #include<node-core.h>
00034 #include<iostream>
00035
00036 static class PositionDBClass : public TclClass {
00037 public:
00038 PositionDBClass() : TclClass("PlugIn/PositionDB") {}
00039 TclObject* create(int, const char*const*) {
00040 return (new PositionDB());
00041 }
00042 } class_positiondb;
00043
00044
00045
00046 std::map<nsaddr_t, Position*> PositionDB::posmap;
00047
00048 PositionDB::PositionDB()
00049 {
00050 bind("debug_",&debug_);
00051 }
00052
00053
00054 int PositionDB::command(int argc, const char*const* argv)
00055 {
00056 Tcl& tcl = Tcl::instance();
00057 if(argc == 2)
00058 {
00059
00060
00061 }
00062 else if(argc == 4)
00063 {
00064 if(strcasecmp(argv[1], "addpos") == 0)
00065 {
00066 int index = atoi(argv[2]);
00067 Position* pp = dynamic_cast<Position*>(tcl.lookup(argv[3]));
00068 assert(pp == getPosition());
00069 posmap[index] = pp;
00070 return TCL_OK;
00071 }
00072 }
00073 return PlugIn::command(argc, argv);
00074 }
00075
00076 double PositionDB::getDistance(nsaddr_t srcid, nsaddr_t dstid)
00077 {
00078 std::map<int,Position*>::iterator srcit, dstit;
00079
00080 srcit = posmap.find(srcid);
00081 dstit = posmap.find(dstid);
00082
00083 if ( ( srcit == posmap.end()) || ( dstit == posmap.end()) )
00084 {
00085
00086 return -1;
00087 }
00088 else
00089 {
00090 return (srcit->second)->getDist(dstit->second);
00091 }
00092 }
00093
00094
00095 int PositionDB::recvSyncClMsg(ClMessage* m)
00096 {
00097
00098 if (m->type() == CLMSG_POSITION_GET_DIST)
00099 {
00100
00101 ClMsgPositionGetDist* mgd;
00102 mgd = dynamic_cast<ClMsgPositionGetDist*>(m);
00103 assert(mgd);
00104
00105 mgd->returnDist(getDistance(mgd->getId1(),mgd->getId2()));
00106 }
00107
00108
00109 return 0;
00110 }