Files
epics-base/src/ca/legacy/pcas/example/directoryService/directoryServer.cc
Michael Davidsaver 2a36a3906d Stage 1 reorganization
Directory moves.

  src/RTEMS/ => src/libCom/RTEMS/
  src/as/ => src/ioc/as/
  src/bpt/ => src/ioc/bpt/
  src/ca/ => src/ca/client/
  src/cap5/ => src/ca/client/perl/
  src/cas/ => src/ca/legacy/pcas/
  src/catools/ => src/ca/client/tools/
  src/db/ => src/ioc/db/
  src/dbStatic/ => src/ioc/dbStatic/
  src/dbtools/ => src/ioc/dbtemplate/
  src/dev/softDev/ => src/std/dev/
  src/dev/testDev/ => src/std/test/
  src/excas/ => src/ca/legacy/pcas/ex/
  src/gdd/ => src/ca/legacy/gdd/
  src/makeBaseApp/ => src/template/base/
  src/makeBaseExt/ => src/template/ext/
  src/misc/ => src/ioc/misc/
  src/rec/ => src/std/rec/
  src/registry/ => src/ioc/registry/
  src/rsrv/ => src/ioc/rsrv/
  src/softIoc/ => src/std/softIoc/
  src/toolsComm/ => src/libCom/tools/
2010-12-16 15:15:52 -05:00

170 lines
3.8 KiB
C++

/*************************************************************************\
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
//
// Example EPICS CA directory server
//
#include "directoryServer.h"
#include "tsMinMax.h"
const pvInfo *pvInfo::pFirst;
//
// directoryServer::directoryServer()
//
directoryServer::directoryServer(const char * const pvPrefix, unsigned aliasCount)
{
unsigned i;
const pvInfo *pPVI;
char pvAlias[256];
const char * const pNameFmtStr = "%.100s%.20s";
const char * const pAliasFmtStr = "%.100s%.20s%u";
//
// pre-create all of the simple PVs that this server will export
//
for (pPVI = pvInfo::getFirst(); pPVI; pPVI=pPVI->getNext()) {
//
// Install canonical (root) name
//
sprintf(pvAlias, pNameFmtStr, pvPrefix, pPVI->getName());
this->installAliasName(*pPVI, pvAlias);
//
// Install numbered alias names
//
for (i=0u; i<aliasCount; i++) {
sprintf(pvAlias, pAliasFmtStr, pvPrefix,
pPVI->getName(), i);
this->installAliasName(*pPVI, pvAlias);
}
}
}
//
// directoryServer::~directoryServer()
//
directoryServer::~directoryServer()
{
}
//
// directoryServer::installAliasName()
//
void directoryServer::installAliasName(const pvInfo &info, const char *pAliasName)
{
pvEntry *pEntry;
pEntry = new pvEntry(info, *this, pAliasName);
if (pEntry) {
int resLibStatus;
resLibStatus = this->stringResTbl.add(*pEntry);
if (resLibStatus==0) {
return;
}
else {
delete pEntry;
}
}
fprintf(stderr,
"Unable to enter PV=\"%s\" Alias=\"%s\" in PV name alias hash table\n",
info.getName(), pAliasName);
}
//
// More advanced pvExistTest() isnt needed so we forward to
// original version. This avoids sun pro warnings and speeds
// up execution.
//
pvExistReturn directoryServer::pvExistTest
( const casCtx & ctx, const caNetAddr &, const char * pPVName )
{
return this->pvExistTest ( ctx, pPVName );
}
//
// directoryServer::pvExistTest()
//
pvExistReturn directoryServer::pvExistTest
( const casCtx & /* ctx */, const char * pPVName )
{
//
// lifetime of id is shorter than lifetime of pName
//
char pvNameBuf[512];
stringId id(pPVName, stringId::refString);
stringId idBuf(pvNameBuf, stringId::refString);
pvEntry *pPVE;
const char *pStr, *pLastStr;
//
// strip trailing occurrence of ".field"
// (for compatibility with EPICS
// function block database).
//
pLastStr = pPVName;
pStr = strstr (pPVName, ".");
while (pStr) {
pLastStr = pStr;
pStr += 1;
pStr = strstr (pStr, ".");
}
if (pLastStr==pPVName) {
pPVE = this->stringResTbl.lookup(id);
if (!pPVE) {
return pverDoesNotExistHere;
}
}
else {
size_t diff = pLastStr-pPVName;
diff = tsMin (diff, sizeof(pvNameBuf)-1);
memcpy (pvNameBuf, pPVName, diff);
pvNameBuf[diff] = '\0';
pLastStr = pvNameBuf;
pPVE = this->stringResTbl.lookup(idBuf);
if (!pPVE) {
//
// look for entire PV name (in case this PV isnt
// associated a function block database)
//
// lifetime of id2 is shorter than lifetime of pName
//
pPVE = this->stringResTbl.lookup(id);
if (!pPVE) {
return pverDoesNotExistHere;
}
}
}
return pvExistReturn (caNetAddr(pPVE->getInfo().getAddr()));
}
//
// directoryServer::show()
//
void directoryServer::show (unsigned level) const
{
//
// server tool specific show code goes here
//
this->stringResTbl.show(level);
//
// print information about ca server libarary
// internals
//
this->caServer::show(level);
}