void CSysVarReactor::sysVarChanged(const ACHAR *varName, Adesk::Boolean success)
{
if (canUseSysVar) // см. функцию commandWillStart
{
if (_tcsstr(varName, CONTROLVAR)) // поменялась именно переменная, которую отслеживает сервер
{
resbuf buf;
acedGetVar(CONTROLVAR, &buf);
if (_tcscmp(answerValue, buf.resval.rstring) != 0) // это пришел запрос
{
answerValue = buf.resval.rstring; //answerValue - строковая переменная
if (!answerValue.IsEmpty())
{
CString mapa = MAPB; // карта шифрования
for (int i = 0; i < answerValue.GetLength(); i++)
{
CString newCharSymb = answerValue[i];
int pos = mapa.FindOneOf(newCharSymb);
answerValue.SetAt(i, MAPC[pos]); // формируем строку ответа по другой карте шифрования
}
resbuf *rb = acutBuildList(RTSTR, answerValue.GetString(), RTNONE);
acedSetVar(CONTROLVAR, rb); // выплюнули ответ (тут уже клиентская arx получает ответ и если всё плохо выгружается из автокада)
acutRelRb(rb);
vzhyhk = !pSecurity->isSecured(moduleType); // проверка работоспособности конкретного модуля
if (vzhyhk) // вжуууух. тут начитается магия ))). вернее, магия начинается после того, как закончит работать эта функция (по крайней мере, сообщение acedAlert появляется первым)
{// пользователь должен знать, почему наступила Ж*ПА :)
acedAlert(pSecurity->getPossibleError().GetString());
}
}
}
}
}
AcEditorReactor::sysVarChanged(varName, success);
}
void CSysVarReactor::commandWillStart(const ACHAR *cmdStr)
{
moduleType = EMPTY; // переменная, отвечающая за тип модуля
CString lowerCaseStr = cmdStr;
lowerCaseStr.MakeLower();
//-> проверяем, с каких символов начинается команда. нас интересуют только НАШИ команды
if ( (lowerCaseStr.Find(_T("sm_")) == 0) || (lowerCaseStr.Find(_T("fm_")) == 0) )
{
moduleType = SAMARA_FATAMORGANA;
}
else if ( (lowerCaseStr.Find(_T("plpr_")) == 0) || (lowerCaseStr.Find(_T("pl_")) == 0) )
{
moduleType = SURFACE_PLANNING;
}
else if (lowerCaseStr.Find(_T("vx_")) == 0)
{
moduleType = BLOCK_MODEL;
}
else if (lowerCaseStr.Find(_T("bvr_")) == 0)
{
moduleType = DRIL_N_BLAST;
}
//<-
if (moduleType != EMPTY)
canUseSysVar = true; // это наш клиент. иначе sysVarChanged работает в холостую
AcEditorReactor::commandWillStart(cmdStr);
}
void CSysVarReactor::commandEnded(const ACHAR* cmdStr)
{
canUseSysVar = false;
AcEditorReactor::commandEnded(cmdStr);
}
void CSysVarReactor::commandCancelled(const ACHAR* cmdStr)
{
canUseSysVar = false;
AcEditorReactor::commandCancelled(cmdStr);
}
void CSysVarReactor::commandFailed(const ACHAR* cmdStr)
{
canUseSysVar = false;
AcEditorReactor::commandFailed(cmdStr);
}