BSTR CMUSHclientDoc::ExportXML(short Type, LPCTSTR Name) { CString strResult; CString strName = Name; // trim spaces, force name to lower-case CheckObjectName (strName, false); char * p = NULL; try { CMemFile f; // open memory file for writing CArchive ar(&f, CArchive::store); // see if trigger exists, if not return EMPTY switch (Type) { case 0: // trigger { CTrigger * t; if (GetTriggerMap ().Lookup (strName, t)) { Save_Header_XML (ar, "triggers", false); Save_One_Trigger_XML (ar, t); Save_Footer_XML (ar, "triggers"); } // end of item existing } break; case 1: // alias { CAlias * t; if (GetAliasMap ().Lookup (strName, t)) { Save_Header_XML (ar, "aliases", false); Save_One_Alias_XML (ar, t); Save_Footer_XML (ar, "aliases"); } // end of item existing } break; case 2: // timer { CTimer * t; if (GetTimerMap ().Lookup (strName, t)) { Save_Header_XML (ar, "timers", false); Save_One_Timer_XML (ar, t); Save_Footer_XML (ar, "timers"); } // end of item existing } break; case 3: // macro { for (int i = 0; i < NUMITEMS (strMacroDescriptions); i++) { if (strMacroDescriptions [i].CompareNoCase (strName) == 0) { Save_Header_XML (ar, "macros", false); Save_One_Macro_XML (ar, i); Save_Footer_XML (ar, "macros"); } // end of item existing } // end of finding which one } break; case 4: // variable { CVariable * t; if (GetVariableMap ().Lookup (strName, t)) { Save_Header_XML (ar, "variables", false); Save_One_Variable_XML (ar, t); Save_Footer_XML (ar, "variables"); } // end of item existing } break; case 5: // keypad { for (int i = 0; i < NUMITEMS (strKeypadNames); i++) { if (strKeypadNames [i].CompareNoCase (strName) == 0) { Save_Header_XML (ar, "keypad", false); Save_One_Keypad_XML (ar, i); Save_Footer_XML (ar, "keypad"); } // end of item existing } // end of finding which one } break; } // end of switch ar.Close(); int nLength = f.GetLength (); p = (char *) f.Detach (); strResult = CString (p, nLength); free (p); // remove memory allocated in CMemFile p = NULL; } // end of try block catch (CException* e) { if (p) free (p); // remove memory allocated in CMemFile e->Delete(); strResult.Empty (); } // end of catch return strResult.AllocSysString(); } // end of CMUSHclientDoc::ExportXML
BOOL CMUSHclientDoc::EvaluateCommand (const CString & full_input, const bool bCountThem, bool & bOmitFromLog, const bool bTest) { CString str; POSITION pos; CString input = full_input; CAliasList AliasList; // get rid of any carriage returns input.Replace ("\r", ""); // ignore blank lines ?? is this wise? if (input.IsEmpty ()) return false; // ------------------------- SPEED WALKING ------------------------------ // see if they are doing speed walking if (m_enable_speed_walk && input.Left (m_speed_walk_prefix.GetLength ()) == m_speed_walk_prefix) { CString strEvaluatedSpeedwalk = DoEvaluateSpeedwalk (input.Mid (m_speed_walk_prefix.GetLength ())); if (!strEvaluatedSpeedwalk.IsEmpty ()) { if (strEvaluatedSpeedwalk [0] == '*') // error in speedwalk string? { ::UMessageBox (strEvaluatedSpeedwalk.Mid (1)); return true; } // let them know if they are foolishly trying to send to a closed connection if (CheckConnected ()) return true; SendMsg (strEvaluatedSpeedwalk, m_display_my_input, true, // queue it LoggingInput ()); } return false; } // end of having a speed-walk string // here if not speed walking // --------------------------- ALIASES ------------------------------ bool bEchoAlias = m_display_my_input; OneShotItemMap mapOneShotItems; if (m_enable_aliases) { m_CurrentPlugin = NULL; if (ProcessOneAliasSequence (input, bCountThem, bOmitFromLog, bEchoAlias, AliasList, mapOneShotItems)) return true; // do plugins for (pos = m_PluginList.GetHeadPosition (); pos; ) { m_CurrentPlugin = m_PluginList.GetNext (pos); if (m_CurrentPlugin->m_bEnabled) if (ProcessOneAliasSequence (input, bCountThem, bOmitFromLog, bEchoAlias, AliasList, mapOneShotItems)) { m_CurrentPlugin = NULL; return true; } } // end of doing each plugin m_CurrentPlugin = NULL; // not in a plugin any more } // end of aliases enabled // if no alias matched at all, just send the raw command if (AliasList.IsEmpty ()) { // let them know if they are foolishly trying to send to a closed connection if (CheckConnected ()) return true; // don't reconnect on a deliberate QUIT if (input.CompareNoCase (m_macros [MAC_QUIT]) == 0) m_bDisconnectOK = true; // don't want reconnect on quit SendMsg (input, m_display_my_input, false, LoggingInput ()); // send now return FALSE; } // execute any scripts associated with aliases we found bool bFoundIt; CAlias * existing_alias_item; CAlias * alias_item; CString strAliasName; for (pos = AliasList.GetHeadPosition (); pos; ) { alias_item = AliasList.GetNext (pos); bFoundIt = false; // check that alias still exists, in case a script deleted it - and also // to work out which plugin it is in m_CurrentPlugin = NULL; // main aliases - if main scripting active for (POSITION pos = GetAliasMap ().GetStartPosition (); !bFoundIt && pos; ) { GetAliasMap ().GetNextAssoc (pos, strAliasName, existing_alias_item); if (existing_alias_item == alias_item) { bFoundIt = true; // execute Alias script ExecuteAliasScript (alias_item, input); } } // end of scanning main aliases // do plugins for (POSITION plugin_pos = m_PluginList.GetHeadPosition (); !bFoundIt && plugin_pos; ) { m_CurrentPlugin = m_PluginList.GetNext (plugin_pos); if (m_CurrentPlugin->m_bEnabled) for (POSITION pos = GetAliasMap ().GetStartPosition (); !bFoundIt && pos; ) { GetAliasMap ().GetNextAssoc (pos, strAliasName, existing_alias_item); if (existing_alias_item == alias_item) { bFoundIt = true; // execute Alias script ExecuteAliasScript (alias_item, input); } } // end of scanning plugin aliases } // end of doing plugins list } // end of list of aliass that fired // now that we have run all scripts etc., delete one-shot aliases int iDeletedCount = 0; int iDeletedNonTemporaryCount = 0; for (OneShotItemMap::const_iterator one_shot_it = mapOneShotItems.begin (); one_shot_it != mapOneShotItems.end (); one_shot_it++) { CAlias * alias_item; CString strAliasName = one_shot_it->sItemKey.c_str (); m_CurrentPlugin = one_shot_it->pWhichPlugin; // set back to correct plugin if (!GetAliasMap ().Lookup (strAliasName, alias_item)) continue; // can't if executing a script if (alias_item->bExecutingScript) continue; if (!m_CurrentPlugin && !alias_item->bTemporary) iDeletedNonTemporaryCount++; iDeletedCount++; // the alias seems to exist - delete its pointer delete alias_item; // now delete its entry GetAliasMap ().RemoveKey (strAliasName); } // end of deleting one-shot items if (iDeletedCount > 0) { SortAliases (); if (iDeletedNonTemporaryCount > 0) // plugin mods don't really count SetModifiedFlag (TRUE); // document has changed } m_CurrentPlugin = NULL; return FALSE; } // end of CMUSHclientDoc::EvaluateCommand