src/configuration/AxisConfiguration.cpp (461 lines of code) (raw):

#include "FileFunctions.hpp" #include "AxisConfiguration.hpp" #include "MissingCFunctions.hpp" #include "AxisConfigurationLibraries.hpp" // Client -a c:\wscc -o obj\bin -m on -th transport.dll -c channel.dll -cs sslChannel.dll -x xerces.dll -cl client.log int main( int argc, char * argv[]) { LIST sDLLNames; int iConfigInfoArray[eConfigMax]; CHOICELIST sChoiceList[] = { {PLATFORM_TRANSPORTHTTP_PATH, "HTTP Transport library", AXCONF_TRANSPORTHTTP_TAGNAME, eHTTPTransport, eClient}, {PLATFORM_CHANNEL_PATH, "HTTP Channel library", AXCONF_CHANNEL_HTTP_TAGNAME, eHTTPChannel, eClient}, #if WIN32 {"HTTPSSLChannel.dll", "HTTP SSL Channel library", AXCONF_SSLCHANNEL_HTTP_TAGNAME, eHTTPSSLChannel, eClient}, #else {"libhttp_channelssl.so", "HTTP SSL Channel library", AXCONF_SSLCHANNEL_HTTP_TAGNAME, eHTTPSSLChannel, eClient}, #endif {PLATFORM_XMLPARSER_PATH, "Axis XML Parser library", AXCONF_XMLPARSER_TAGNAME, eXMLParser, eClientAndServer}, {"SMTPTRANSPORT", "SMTP Transport library", AXCONF_TRANSPORTSMTP_TAGNAME, eSMTPTransport, eClientAndServer}, {"LOG", "client trace log path (only required if you want client trace)", AXCONF_CLIENTLOGPATH_TAGNAME, eClientLog, eClient}, {"WSDD", "client WSDD path", AXCONF_CLIENTWSDDFILEPATH_TAGNAME, eClientWSDD, eClient}, {"LOG", "server trace log path (only required if you want server trace)", AXCONF_LOGPATH_TAGNAME, eServerLog, eServer}, {"WSDD", "server WSDD path", AXCONF_WSDDFILEPATH_TAGNAME, eServerWSDD, eServer}, {"", "root directory", AXCONF_NODENAME_TAGNAME, eUnknown, eServer}, {"", "offset to libraries", AXCONF_LISTENPORT_TAGNAME, eUnknown, eServer}, {"", "SSL Options", AXCONF_SECUREINFO_TAGNAME, eSSLOptions, eClientAndServer}, {"", "progress information", 0, eUnknown, eEmpty}, {"", "merge", 0, eUnknown, eEmpty}, {"", "Axis configuration directory", 0, eUnknown, eEmpty}, {"", "backup existing axiscpp.conf file", 0, eUnknown, eEmpty}, {"", "query missing files", 0, eUnknown, eEmpty}}; bool bSuccess = false; LIST sFileNameList; char * psDefaultParamList[eConfigMax]; #if WIN32 char cSlash = '\\'; char * pszPackageName = "axis-c-1.6-Win32-bin\\bin"; #else char cSlash = '/'; char * pszPackageName = "axis-c-1.6-Linux-bin/bin"; #endif char szAxisCpp_Deploy[256]; Initialise( &sDLLNames, iConfigInfoArray, &sFileNameList, (char **) psDefaultParamList, szAxisCpp_Deploy, (int) sizeof( szAxisCpp_Deploy)); switch( ReadConfigOptions( argc, argv, (char **) psDefaultParamList, cSlash)) { case eEmpty: { Instructions( pszPackageName); break; } case eClient: { char szAxis_Bin[256]; char szAxis_Bin_Default[256]; cout << "Axis Client Configuration" << endl; cout << "=========================" << endl; GetHomeAndLibrary( &sDLLNames, szAxisCpp_Deploy, szAxis_Bin, szAxis_Bin_Default, &sFileNameList, (char **) psDefaultParamList, pszPackageName); int iChoiceCount = 0; while( sChoiceList[iChoiceCount].eConfigType != eUnknown) { if( sChoiceList[iChoiceCount].eConfig & eClient) { if( (sChoiceList[iChoiceCount].eConfigType == eClientLog || sChoiceList[iChoiceCount].eConfigType == eServerLog)) { char szLog[256]; bool bAskForFilename = false; szLog[0] = '\0'; if( sChoiceList[iChoiceCount].eConfigType == eClientLog) { if( psDefaultParamList[eClientLog] == NULL) { if( StringCompare( psDefaultParamList[eQueryMissingFiles], "ON")) { cout << "Enter name of client trace/log file: "; bAskForFilename = true; } } else { if( psDefaultParamList[eClientLog] != NULL) { strcpy( szLog, psDefaultParamList[eClientLog]); } else { strcpy( szLog, "IGNORE"); } } } else { if( psDefaultParamList[eServerLog] == NULL) { cout << "Enter name of server trace/log file: "; bAskForFilename = true; } else { strcpy( szLog, psDefaultParamList[eServerLog]); } } char szFilename[512]; if( szLog[0] == '\0') { cin >> szLog; } if( StringCompare( "IGNORE", szLog)) { iConfigInfoArray[sChoiceList[iChoiceCount].eConfigType] = PopulateNewDLLNameInfo( &sDLLNames, NULL, NULL, true); } else { if( strlen( szAxisCpp_Deploy) > 0) { #if WIN32 sprintf( szFilename, "%s\\%s", szAxisCpp_Deploy, szLog); #else sprintf( szFilename, "%s/%s", szAxisCpp_Deploy, szLog); #endif } else { sprintf( szFilename, "%s", szLog); } iConfigInfoArray[sChoiceList[iChoiceCount].eConfigType] = PopulateNewDLLNameInfo( &sDLLNames, szLog, szFilename, true); } } else { SelectFileFromList( sChoiceList, iChoiceCount, &sDLLNames, iConfigInfoArray, (char **) psDefaultParamList, &sFileNameList, szAxisCpp_Deploy); } } iChoiceCount++; } if( psDefaultParamList[eSSLOptions] != NULL) { iConfigInfoArray[eSSLOptions] = PopulateNewDLLNameInfo( &sDLLNames, NULL, psDefaultParamList[eSSLOptions], true); } if( psDefaultParamList[eAxisConfigDir] != NULL) { iConfigInfoArray[eAxisConfigDir] = PopulateNewDLLNameInfo( &sDLLNames, NULL, psDefaultParamList[eAxisConfigDir], true); } bSuccess = true; break; } case eServer: { char szAxis_Bin[256]; char szAxis_Bin_Default[256]; cout << "Axis Server Configuration" << endl; cout << "=========================" << endl; GetHomeAndLibrary( &sDLLNames, szAxisCpp_Deploy, szAxis_Bin, szAxis_Bin_Default, &sFileNameList, (char **) psDefaultParamList, pszPackageName); bSuccess = true; break; } case eClientAndServer: { cout << "Axis Client and Server Configuration" << endl; bSuccess = true; break; } } if( bSuccess) { if( psDefaultParamList[eAxisConfigDir] == NULL) { WriteAxisConfigFile( &sDLLNames, iConfigInfoArray, sChoiceList, StringCompare( psDefaultParamList[eMerge], "on"), szAxisCpp_Deploy, cSlash, StringCompare( psDefaultParamList[eBackup], "true")); } else { WriteAxisConfigFile( &sDLLNames, iConfigInfoArray, sChoiceList, StringCompare( psDefaultParamList[eMerge], "on"), psDefaultParamList[eAxisConfigDir], cSlash, StringCompare( psDefaultParamList[eBackup], "true")); } } Destroy( &sDLLNames, &sFileNameList, (char **) psDefaultParamList); return (int) bSuccess; } ECONFIG ReadConfigOptions( int iParamCount, char * pParamArray[], char ** ppsDefaultParamList, char cSlash) { ECONFIG eConfig = eEmpty; OPTIONLIST sOptions[] = {{eHTTPTransport, "TH"}, {eHTTPChannel, "C"}, {eHTTPSSLChannel, "CS"}, {eXMLParser, "X"}, {eSMTPTransport, "TS"}, {eClientLog, "CL"}, {eClientWSDD, "CW"}, {eServerLog, "SL"}, {eRootDirectory, "A"}, {eOffsetToLibs, "O"}, {eServerWSDD, "SW"}, {eSSLOptions, "SO"}, {eProgressInfo, "PI"}, {eAxisConfigDir, "ACD"}, {eBackup, "B"}, {eQueryMissingFiles, "QMF"}, {eMerge, "M"}}; ppsDefaultParamList[eMerge] = (char *) malloc( strlen( "off ")); ppsDefaultParamList[eProgressInfo] = (char *) malloc( strlen( "normal ")); ppsDefaultParamList[eBackup] = (char *) malloc( strlen( "true ")); ppsDefaultParamList[eQueryMissingFiles] = (char *) malloc( strlen( "on ")); strcpy( ppsDefaultParamList[eMerge], "off"); strcpy( ppsDefaultParamList[eProgressInfo], "normal"); strcpy( ppsDefaultParamList[eBackup], "true"); strcpy( ppsDefaultParamList[eQueryMissingFiles], "on"); for( int iCount = 0; iCount < iParamCount; iCount++) { if( StringCompare( pParamArray[iCount], "Client")) { eConfig = (ECONFIG)((int) eConfig | eClient); } else if( StringCompare( pParamArray[iCount], "Server")) { eConfig = (ECONFIG)((int) eConfig | eServer); } else if( StringCompare( pParamArray[iCount], "Both")) { eConfig = (ECONFIG)((int) eConfig | eClientAndServer); } if( *pParamArray[iCount] == '-') { bool bOptionFound = false; int iIndex = 0; do { if( !(bOptionFound = StringCompare( (pParamArray[iCount] + 1), sOptions[iIndex].pszOption))) { iIndex++; } } while( iIndex < (eConfigMax - 1) && !bOptionFound); if( bOptionFound) { if( ppsDefaultParamList[sOptions[iIndex].eConfType] != NULL) { free( (void *) ppsDefaultParamList[sOptions[iIndex].eConfType]); } iCount++; if( iCount < iParamCount) { if( ppsDefaultParamList[eOffsetToLibs] != NULL && ppsDefaultParamList[eRootDirectory] != NULL && !(sOptions[iIndex].eConfType == eClientLog || sOptions[iIndex].eConfType == eServerLog || sOptions[iIndex].eConfType == eBackup || sOptions[iIndex].eConfType == eMerge || sOptions[iIndex].eConfType == eQueryMissingFiles || sOptions[iIndex].eConfType == eSSLOptions) && strchr( pParamArray[iCount], cSlash) == NULL) { std::string sLocation; sLocation = ppsDefaultParamList[eRootDirectory]; sLocation += cSlash; sLocation += ppsDefaultParamList[eOffsetToLibs]; sLocation += cSlash; sLocation += pParamArray[iCount]; ppsDefaultParamList[sOptions[iIndex].eConfType] = (char *) malloc( sLocation.length() + 1); strcpy( ppsDefaultParamList[sOptions[iIndex].eConfType], sLocation.c_str()); } else { ppsDefaultParamList[sOptions[iIndex].eConfType] = (char *) malloc( strlen( pParamArray[iCount]) + 1); strcpy( ppsDefaultParamList[sOptions[iIndex].eConfType], pParamArray[iCount]); } } } else { cout << "Option: " << pParamArray[iCount] << " has been ignored." << endl; } } } return eConfig; } void GetHomeAndLibrary( LIST * psDLLNames, char * pszAxisCpp_Deploy, char * pszAxis_Bin, char * pszAxis_Bin_Default, LIST * psFileNameList, char ** ppsDefaultParamList, char * pszPackageName) { char * pszCurrentAxisCppDeployEnv = getenv( "AXISCPP_DEPLOY"); if( ppsDefaultParamList[eAxisConfigDir] == NULL) { if( ppsDefaultParamList[eRootDirectory] == NULL) { #if WIN32 cout << "Type in the Axis fully qualified directory path (e.g. C:\\Axis)" << endl << "used when Axis was unzipped (NB: this directory must also contain the" << endl << "axiscpp.conf file)."; #else cout << "Type in the Axis fully qualified directory path (e.g. /home/Axis)" << endl << "used when Axis was unzipped (NB: this directory must also contain the" << endl << "etc/axiscpp.conf file)."; #endif if( pszCurrentAxisCppDeployEnv != NULL) { cout << " Type '*' to used the existing value of the environment" << endl; cout << "variable (i.e. '" << pszCurrentAxisCppDeployEnv << "')."; } cout << endl << "AXISCPP_DEPLOY = "; cin >> pszAxisCpp_Deploy; if( *pszAxisCpp_Deploy == '*' && pszCurrentAxisCppDeployEnv != NULL) { strcpy( pszAxisCpp_Deploy, pszCurrentAxisCppDeployEnv); } } else { strcpy( pszAxisCpp_Deploy, ppsDefaultParamList[eRootDirectory]); } if( ppsDefaultParamList[eOffsetToLibs] != NULL) { strcpy( pszAxis_Bin, ppsDefaultParamList[eOffsetToLibs]); if( !CheckAxisBinDirectoryExists( pszAxisCpp_Deploy, pszAxis_Bin, pszAxis_Bin_Default, psDLLNames, psFileNameList)) { cout << "Axis binaries directory not found." << endl; free( (void *) ppsDefaultParamList[eOffsetToLibs]); ppsDefaultParamList[eOffsetToLibs] = NULL; } } strcpy( pszAxis_Bin_Default, pszPackageName); if( ppsDefaultParamList[eOffsetToLibs] == NULL) { if( pszCurrentAxisCppDeployEnv == NULL) { cout << endl << "Instruction:" << endl << "You will need to create an environment variable called " << endl << "\"AXISCPP_DEPLOY\" and set it to " << pszAxisCpp_Deploy << "." << endl << "On the command line this would be:-" << endl #if WIN32 << "SET AXISCPP_DEPLOY=" << pszAxisCpp_Deploy << endl; #else << "EXPORT AXISCPP_DEPLOY=" << pszAxisCpp_Deploy << endl; #endif } cout << endl; do { #if WIN32 cout << "Type in the directory where the Axis libraries (e.g. axis_client.dll) can be" << endl << "found. (If you type '*', it will use the default '" << pszAxis_Bin_Default << "')." << endl; #else cout << "Type in the directory where the Axis libraries (e.g. axis_client.so) can be" << endl << "found. (If you type '*', it will use the default '" << pszAxis_Bin_Default << "')." << endl; #endif cout << "Axis binaries directory = "; cin >> pszAxis_Bin; if( !strcmp( pszAxis_Bin, "*")) { strcpy( pszAxis_Bin, pszAxis_Bin_Default); } } while( !CheckAxisBinDirectoryExists( pszAxisCpp_Deploy, pszAxis_Bin, pszAxis_Bin_Default, psDLLNames, psFileNameList)); } } cout << endl << "Begin to configure the AXISCPP.CONF file." << endl; } void SelectFileFromList( CHOICELIST * psChoiceList, int iChoiceCount, LIST * psDLLNames, int * piConfigInfoArray, char ** ppsDefaultParamList, LIST * psFileNameList, char * pszAxisCpp_Deploy) { cout << endl << "Select the filename for the " << psChoiceList[iChoiceCount].pszElementDescription << "." << endl; int iDLLCount = 0; LIST sDLLOffsetList; bool bHTTPTransportFound = false; memset( &sDLLOffsetList, 0, sizeof( LIST)); do { char * pszUpper = new char[strlen( psChoiceList[iChoiceCount].pszElement) + 1]; strcpy( pszUpper, psChoiceList[iChoiceCount].pszElement); StringToUpper( pszUpper); char * pszExtn = strchr( pszUpper, '.'); if( pszExtn != NULL) { *pszExtn = '\0'; } while( iDLLCount < psDLLNames->iCount) { DLLNAMEINFO * pszDLLNameInfo = ((DLLNAMEINFO *) psDLLNames->ppArray[iDLLCount]); if( pszDLLNameInfo->pszDLLName != NULL && strstr( pszDLLNameInfo->pszDLLName, pszUpper) != NULL) { int * piDLLOffset = (int *) GetNextListElement( &sDLLOffsetList, sizeof( int)); *piDLLOffset = iDLLCount; cout << sDLLOffsetList.iCount << ".\t" << pszDLLNameInfo->pszDLLFilename << endl; } iDLLCount++; } free( pszUpper); if( ppsDefaultParamList[psChoiceList[iChoiceCount].eConfigType] != NULL && FileExists( ppsDefaultParamList[psChoiceList[iChoiceCount].eConfigType])) { piConfigInfoArray[psChoiceList[iChoiceCount].eConfigType] = PopulateNewDLLNameInfo( psDLLNames, NULL, ppsDefaultParamList[psChoiceList[iChoiceCount].eConfigType], true); bHTTPTransportFound = true; cout << "Choices have been overridden by input parameter." << endl; } else { if( StringCompare( ppsDefaultParamList[eQueryMissingFiles], "ON")) { if( sDLLOffsetList.iCount > 0) { if( sDLLOffsetList.iCount > 1) { cout << "Select an index between 1 and " << sDLLOffsetList.iCount << " : "; int iChoice; cin >> iChoice; if( iChoice < 1 || iChoice > sDLLOffsetList.iCount) { cout << "Number was out of range." << endl; } else { ((DLLNAMEINFO *) psDLLNames->ppArray[*((int *) sDLLOffsetList.ppArray[iChoice - 1])])->bAddToClientConfig = true; piConfigInfoArray[psChoiceList[iChoiceCount].eConfigType] = *((int *) sDLLOffsetList.ppArray[iChoice - 1]); bHTTPTransportFound = true; } } else { cout << "Automatically selected " << ((DLLNAMEINFO *) psDLLNames->ppArray[*((int *) sDLLOffsetList.ppArray[0])])->pszDLLFilename << endl; ((DLLNAMEINFO *) psDLLNames->ppArray[*((int *) sDLLOffsetList.ppArray[0])])->bAddToClientConfig = true; piConfigInfoArray[psChoiceList[iChoiceCount].eConfigType] = *((int *) sDLLOffsetList.ppArray[0]); bHTTPTransportFound = true; } } else { cout << "There are no recognised file names for the type of file/library." << endl << "You will have to modify the configuration file namually." << endl << endl; bHTTPTransportFound = true; } } else { bHTTPTransportFound = true; } } } while( !bHTTPTransportFound); for( int iCount = 0; iCount < sDLLOffsetList.iCount; iCount++) { free( sDLLOffsetList.ppArray[iCount]); } } void AddFilenameToList( LIST * psFileNameList, char * pszFilename) { char * psList = (char *) GetNextListElement( psFileNameList, (int) strlen( pszFilename) + 1); strcpy( psList, pszFilename); } bool FileExists( char * pszFilename) { FILE * fp = fopen( pszFilename, "r"); bool bSuccess = false; if( fp != NULL) { fclose( fp); bSuccess = true; } return bSuccess; }