// consoleCallback handles the processing of locally-defined commands
const char *SimDynamicDataPlugin::consoleCallback(CMDConsole *, 
                                          int         iCmd,
                                          int         argc,
                                          const char *argv[])
{
   char szDup[BUFSIZ];

   switch (iCmd)
   {
      // RegisterDataBlock is used to create a new instance of a 
      // known data block type
      case RegisterDataBlock:
         if (argc == 3)
         {
            if (strlen(argv[1]) >= DATANAME_MAX_LENGTH)
            {
               console->printf("registerDataBlock: name too long");
            }
            else
            {
               int ret = registerDataBlock(argv[1], argv[2]);

               switch (ret)
               {
                  case DATAERROR_NOTIMPL:
                     console->printf("registerDataBlock: not implemented");
                     break;

                  case DATAERROR_NOTFOUND:
                     console->printf("registerDataBlock: data type not found");
                     break;

                  case DATAERROR_UNKNOWN:
                     console->printf("registerDataBlock: unknown error");
                     break;

                  case DATAERROR_EXISTS:
                     console->printf("registerDataBlock: named data block exists");
                     break;
               }
            }
         }
         else
         {
            console->printf("registerDataBlock <name> <type>");
         }
         break;

      // RegisterDataBlock is used to create a new instance of a 
      // known data block type
      case RegisterStaticDataBlock:
         if (argc == 3)
         {
            if (strlen(argv[1]) >= DATANAME_MAX_LENGTH)
            {
               console->printf("registerDataBlock: name too long");
            }
            else
            {
               int ret = registerStaticDataBlock(argv[1], argv[2]);

               switch (ret)
               {
                  case DATAERROR_NOTIMPL:
                     console->printf("registerStaticDataBlock: not implemented");
                     break;

                  case DATAERROR_NOTFOUND:
                     console->printf("registerStaticDataBlock: data type not found");
                     break;

                  case DATAERROR_UNKNOWN:
                     console->printf("registerStaticDataBlock: unknown error");
                     break;

                  case DATAERROR_EXISTS:
                     console->printf("registerStaticDataBlock: named data block exists");
                     break;
               }
            }
         }
         else
         {
            console->printf("registerStaticDataBlock <name> <type>");
         }
         break;

      // EditDataBlock will either bring the requested data block into
      // scope, or create the requested data block if it was not found
      case EditDataBlock :
         if (argc == 3)
         {
            if (strlen(argv[1]) >= DATANAME_MAX_LENGTH)
            {
               console->printf("editDataBlock: name too long");
            }
            else
            {
               vec_data::iterator iter;
               strcpy(szDup, argv[1]);

               if ((iter = findData(strupr(szDup))) != data.end())
               {
                  pDataCurrent = (Data *)(*iter);
               }

               else
               {
                  int ret;

                  ret = registerDataBlock(argv[1], argv[2]);

                  switch (ret)
                  {
                     case DATAERROR_NOTIMPL:
                        console->printf("editDataBlock: not implemented");
                        break;

                     case DATAERROR_NOTFOUND:
                        console->printf("editDataBlock: data type not found");
                        break;

                     case DATAERROR_UNKNOWN:
                        console->printf("editDataBlock: unknown error");
                        break;
                  }
               }
            }
         }
         else
         {
            console->printf("editDataBlock <name> <type>");
         }
         break;

      // SetData is used to set the values of elements within an in-scope
      // data block
      case SetData:
      {
         Element            *element;
         vec_elem::iterator  iter;
         int                 iRow = 0, iCol = 0, ret;

         if (argc > 2)
         {
            if (pDataCurrent == NULL)
            {
               ret = DATAERROR_NOCURRENT;
            }

            else
            {
               // See if this is a subscripted element
               ret = subscript(argv[1], iRow, iCol);

               if (ret == DATAERROR_NOERROR)
               {
                  strcpy(szDup, argv[1]);
                  if ((iter  = pDataCurrent->findElem(strupr(szDup))) 
                            != pDataCurrent->elements.end())
                  {
                     element = (Element *)(*iter);

                     ret = verifySubscripts(element, argc - 2, iRow, iCol);

                     if (ret == DATAERROR_NOERROR)
                     {
                        ret = setData(element, &argv[2], argc - 2, iRow, iCol);
                     }
                  }
                  else
                  {
                     ret = DATAERROR_NOTFOUND;
                  }
               }
            }

            switch (ret)
            {
               case DATAERROR_NOCURRENT:
                  console->printf("setData: no current record");
                  break;

               case DATAERROR_NOTFOUND:
                  console->printf("setData: data field: %s not found", argv[1]);
                  break;

               case DATAERROR_INDEXOOB:
                  console->printf("setData: index out of bounds");
                  break;

               case DATAERROR_NOSUBSCRIPT:
                  console->printf("setData: cannot access multidimensional array without subscript");
                  break;

               case DATAERROR_SYNTAX:
                  console->printf("setData: syntax error (badly formed)");
                  break;
            }
         }
         else
         {
            console->printf("setData <name> <value>");
         }
      }
      break;
   }

   return 0;
}
Пример #2
0
void DataBlockRepository::registerDataBlockForEvent(const std::string& s, MappedEvent* e)
{
    e->setDataBlockId(registerDataBlock(s));
}