//****************************************************************************** // File: \wacker\tdll\Keymlist.h Created: 6/2/98 By: Dwayne M. Newsome // // Copyright 1998 by Hilgraeve Inc. --- Monroe, MI // All rights reserved // // Description: // This class manages the list of user defines key macros // // $Revision: 1 $ // $Date: 10/05/98 1:12p $ // $Id: keymlist.cpp 1.1 1998/06/11 12:03:39 dmn Exp $ // //****************************************************************************** #include #pragma hdrstop #include "stdtyp.h" #include "mc.h" #ifdef INCL_KEY_MACROS #include #include "keymlist.h" extern "C" { #include "sess_ids.h" #include "session.h" #include "sf.h" } //****************************************************************************** // Method: // operator>> // // Description: // Iostream extractor // // Arguments: // theStream - The stream to extract from // aMacroList - The macrolist to stream into // // Returns: // istream & // // Throws: // None // // Author: Dwayne M. Newsome, 6/2/98 // // istream & operator>>( istream & theStream, Emu_Key_Macro_List & aMacroList ) { aMacroList.mMacroCount = 0; theStream >> aMacroList.mMacroCount; for ( int i = 0; i < aMacroList.mMacroCount; i++ ) { theStream >> aMacroList.mMacroList[i]; } return theStream; } //****************************************************************************** // Method: // operator<< // // Description: // Iostream inserter // // Arguments: // theStream - The stream to insert into // aMacroList - The macrolist to stream out // // Returns: // istream & // // Throws: // None // // Author: Dwayne M. Newsome, 6/2/98 // // ostream & operator<<( ostream & theStream, const Emu_Key_Macro_List & aMacroList ) { theStream << aMacroList.mMacroCount << " "; for ( int i = 0; i < aMacroList.mMacroCount; i++ ) { theStream << aMacroList.mMacroList[i] << " "; } return theStream; } //****************************************************************************** // Method: // Emu_Key_Macro_List // // Description: // Constructor // // Arguments: // void // // Returns: // void // // Throws: // None // // Author: Dwayne M. Newsome, 6/2/98 // // Emu_Key_Macro_List :: Emu_Key_Macro_List( void ) : mMacroCount( 0 ) { return; } //****************************************************************************** // Method: // ~Emu_Key_Macro_List // // Description: // Destructor // // Arguments: // void // // Returns: // void // // Throws: // None // // Author: Dwayne M. Newsome, 6/2/98 // // Emu_Key_Macro_List :: ~Emu_Key_Macro_List( void ) { return; } //****************************************************************************** // Method: // operator[] // // Description: // Subscript operator // // Arguments: // aIndex - The index of the macro requested // // Returns: // Reference to the requested macro. // // Throws: // None // // Author: Dwayne M. Newsome, 6/2/98 // // Emu_Key_Macro & Emu_Key_Macro_List :: operator[]( int aIndex ) { if ( aIndex < 0 || aIndex >= mMacroCount ) { return mMacroList[eMaxKeys]; } return mMacroList[aIndex]; } //****************************************************************************** // Method: // addMacro // // Description: // Adds the specified macro to the list of macros // // Arguments: // aMacro - The macro to add // // Returns: // 0 if all is ok, -1 if max macros exist, > 0 if duplicate found. // // Throws: // None // // Author: Dwayne M. Newsome, 6/2/98 // // int Emu_Key_Macro_List :: addMacro( const Emu_Key_Macro & aMacro ) { if ( mMacroCount == eMaxKeys ) { return -1; } if ( int lIndex = find( aMacro ) >= 0 ) { return lIndex; } mMacroList[ mMacroCount ] = aMacro; mMacroCount++; return 0; } //****************************************************************************** // Method: // find // // Description: // Finds a macro in the list and retuens its index // // Arguments: // aKey - The key to locate in the list // aMacro - The macro to find in the list // // Returns: // -1 if the key or macro does not exist otherwise the index of the macro // // Throws: // None // // Author: Dwayne M. Newsome, 6/2/98 // // int Emu_Key_Macro_List :: find( const Emu_Key_Macro & aMacro ) const { return find( aMacro.mKey ); } int Emu_Key_Macro_List :: find( const KEYDEF & aKey ) const { int lIndex = -1; for ( int i = 0; i < mMacroCount; i++ ) { if ( mMacroList[i].mKey == aKey ) { lIndex = i; break; } } return lIndex; } //****************************************************************************** // Method: // load // // Description: // Loads the key list from the session file. // // Arguments: // hSession - Session handle to use // // Returns: // 0 if all is ok, -1 for an error // // Throws: // None // // Author: Dwayne M. Newsome, 6/2/98 // // int Emu_Key_Macro_List :: load( const HSESSION hSession ) { SF_HANDLE hSF = sessQuerySysFileHdl( hSession ); unsigned long lSize = 0; sfGetSessionItem( hSF, SFID_KEY_MACRO_LIST, &lSize, (void*)0 ); int lReturnCode = 0; char * lBuffer = new char[lSize]; if( sfGetSessionItem(hSF, SFID_KEY_MACRO_LIST, &lSize, lBuffer) == 0 ) { istrstream lStream( lBuffer ); lStream >> *this; } else { lReturnCode = -1; } delete[] lBuffer; return lReturnCode; } //****************************************************************************** // Method: // numberOfMacros // // Description: // returns the number of macros in the list // // Arguments: // void // // Returns: // macro count // // Throws: // None // // Author: Dwayne M. Newsome, 6/4/98 // // int Emu_Key_Macro_List :: numberOfMacros( void ) const { return mMacroCount; } //****************************************************************************** // Method: // removeMacro // // Description: // Removes the specified macro form the list // // Arguments: // aKey - The key to be removed // // Returns: // 0 if error occured, non 0 if key was removed // // Throws: // None // // Author: Dwayne M. Newsome, 6/2/98 // // int Emu_Key_Macro_List :: removeMacro( const KEYDEF & aKey ) { int lIndex = find( aKey ); if ( lIndex < 0 ) { return 0; } for ( int i = lIndex; i < mMacroCount - lIndex + 1; i++ ) { mMacroList[i] = mMacroList[i+1]; } mMacroCount--; return 1; } //****************************************************************************** // Method: // Save // // Description: // Saves the key list to the session file. // // Arguments: // hSession - Session handle to use // // Returns: // 0 if all is ok, -1 for an error // // Throws: // None // // Author: Dwayne M. Newsome, 6/2/98 // // int Emu_Key_Macro_List :: save( const HSESSION hSession ) { SF_HANDLE hSF = sessQuerySysFileHdl( hSession ); int lReturnCode = 0; strstream lStream; lStream << *this << ends << flush; if ( !lStream ) { return -1; } char * lBuffer = lStream.str(); if ( sfPutSessionItem( hSF, SFID_KEY_MACRO_LIST, strlen(lBuffer), lBuffer ) != 0 ) { lReturnCode = -1; } lStream.rdbuf()->freeze(0); return lReturnCode; } Emu_Key_Macro_List gMacroManager; #endif