Back

// PSLCmdParams.cpp : Implementation of CPSLCmdParams

#include "stdafx.h"
#include "PSLCmdParams.h"


CPSLCmdParams::CPSLCmdParams()
{
}

HRESULT CPSLCmdParams::OnIndexOutOfRange()
{
   return MakeException(EX_INDEXOUTOFRANGE);
}

HRESULT CPSLCmdParams::FinalConstruct()
{
   PSL_BEGIN

   InternalUpdate();

   PSL_END
}

void CPSLCmdParams::FinalRelease()
{
}

void CPSLCmdParams::InternalUpdate()
{
   CCritSecLock cs(m_csCollection);

   m_coll.clear(); // Releases interfaces and clears the collection;
               // NOTE: .NET clients catch up interfaces, so takes
               // about 30 seconds before they are garbaged by .NET;

   vector<tstring> commands;
   LPTSTR sCmd = ::GetCommandLine();
   LPTSTR ParamsPtr = NULL;

   if(sCmd[0] == '"')
      ParamsPtr = _tcschr(sCmd + 1, '"');
   else
      ParamsPtr = _tcschr(sCmd, ' ');

   if(ParamsPtr)
      ParamsPtr ++; // Point at the next symbol after space or quote;
   else
      return;

   long L = (long)_tcslen(ParamsPtr);
   LPTSTR LineEnd = ParamsPtr + L;

   TCHAR * pStart = NULL; // Position where command started;
   bool bQuoted = false;
   TCHAR symbol = 0;
   TCHAR * pCommand = new TCHAR[L];
   while(ParamsPtr < LineEnd)
   {
      symbol = ParamsPtr[0];
      if(symbol == ' ')
      {
         if(pStart)
         {
            if(!bQuoted)
            {
               _tcsncpy_s(pCommand, L, pStart, ParamsPtr - pStart);
               commands.push_back(pCommand);
               pStart = NULL;
               bQuoted = false;
            }
         }
      }
      else
         if(symbol == '"')
         {
            if(pStart)
            {
               if(bQuoted) // end of the value;
               {
                  if(ParamsPtr[1] == ' ' || ParamsPtr[1] == '\0')
                  {
                     _tcsncpy_s(pCommand, L, pStart, ParamsPtr - pStart + 1);
                     commands.push_back(pCommand);
                     pStart = NULL;
                  }
                  bQuoted = false;
               }
               else
                  bQuoted = true;
            }
            else
            {
               pStart = ParamsPtr;
               bQuoted = true;
            }
         }
         else
         {
            if(!pStart)
            {
               pStart = ParamsPtr;
               bQuoted = false;
            }
         }

      ParamsPtr ++;
   }
   if(pStart)
   {
      _tcsncpy_s(pCommand, L, pStart, ParamsPtr - pStart);
      commands.push_back(pCommand);
   }
   delete []pCommand;

   CComObject<CPSLCmdParam> * pParam = NULL;
   for(vector<tstring>::iterator i = commands.begin();i != commands.end();i ++)
   {
      CComObject<CPSLCmdParam>::CreateInstance(&pParam);
      pParam->Initialize(i->c_str());
      m_coll.push_back(CComPtr<IPSLCmdParam>(pParam));
   }
}

////////////////////////////////////////////////////////////////////////
// Interface Implementation;
////////////////////////////////////////////////////////////////////////

Top