Product: CallPath Skills Based Routing Version: 2.02.01 Package Name: skbw1978.exe Size: 1134620 (1108Kb) Level: 1978 How to install: download the self extracting file, skbw1978.exe, to a temporary directory. Run it from any command line and follow the prompts. This will start an InstallShield Wizard to guide you through the installation process. Fixes: APAR IC29492 The SKBR hangs because agentList lock is not released after INI re-read. The implementation of masterlock needed correction to locking scheme when agent is no longer valid. SetStatus for logoff will only obtain locks if not AGENT_DELETE. APAR IC29238 The estimated wait time appears to be too high after it has been running for a while. The update of the average process time will not round up when being recalculated. The resulting value would created a higher number when multiplied by the number of calls queued. CMVC defect 9090 APAR IC29020 The boost priority thread was running when the calls were being dequeued. This resulted in an error condition when the call to be removed was not found on the expression list of calls. Further execution could result in a trap. The boost priority thread will obtain the expression lock sooner to prevent the call removal function from interacting with the boost priority thread. The call removal function will do more of its processing while the expression is locked and while the callslist is locked. CMVC defect 9050 Also, correct the processing of removing handles for agents that are logging off. Remove all handles for that agent versus one handle. CMVC defect 9128 APAR IC28841 Agent logon/logoff activity during heavy load allowed the agent to be left on a qualified agent queue even tho the agent was logged off. Under the os/2 environment this resulted in a trap. Corrected the ProcessACDLogoff function to designate that the agent was logging off so that attempts to place the agent on the qualified agent queue would fail. Other changes to avoid timing problems in case of application dropping. CMVC 9007. APAR IC28494 TadsRequestACDAction for TADS_ACD_AVAIL_IMPLICITLY or TADS_ACD_AVAIL_EXPLICITLY are eaten by SKBR and not passed on to CP Interface deamon. Corrected TadsRequestACDAction function to evaluate for all valid cases and to return TADS_NOT_SUPPORTED for cases that SKBR does not handle so that Server can forward request on to other deamons. The TADS_ACD_AVAIL_IMPLICITLY and TADS_ACD_AVAIL_EXPLICITLY are two cases not handled by SKBR. CMVC defect 8967. APAR IC28248 Rc 561 returned for SetAgentPreferences. The function determined that the skill at the end of the allowable buffer size was incorrect because it was truncated. Function now puts a diag into the SKBRERR file that will denote the skill in question and alert the user to examine the buffer size. CMVC defect 8930. APAR IY12778 Rc 510 returned for Skills Based functions due to deadlock. Solution: The logging off of agents due to DisconnectFromServer will utilize the same code as is used when an agent requests a logoff. This handles the locks better and prevents the deadlock with the setting of monitors. CMVC: 8913 APAR IC27657 Invalid estimated wait time when agents are logging off. Solution: The calculation of the estimated wait time will prevent 0 value when there are calls in the queue and the number of agents logged on is changing. A residual high value should also be eliminated by this fix. CMVC defect is 8869. APAR IC27620 Unable to access working agent list as logoff of agent occurs. Solution: The dropApps function will now call the ProcessACDLogoff function that handles locks better and should prevent the lock problem from occurring. CMVC defect is 8862. APAR IC27561 Invalid QueueSize value returned for monitored TADS_ACD_STATUS_EVENT with START_AGENT_DETAILS Solution - Correct the Skill Expression copy constructor in tadsskbr.hpp to copy the iCallsInQueue value so that the GenerateACDAgentDetails function will obtain the correct queue size value. CMVC defect is 8739. APAR IY10710 Invalid data returned from QueryPotentialCalls request. Solution - Correct the pointer increment to point to the correct data when assembling the data to be returned. CMVC defect is 8623. APAR IC27071 The MaxPendingTime was very large. Solution- The MaxPendingTime will be noted in the skbrerr log when the value is larger than 100 seconds. Defect 8614 APAR IC26625 Agent logoff during calls being enqueued causes lock wait situation. Solution - The agent logoff process is changed to attempt to get needed locks, and if during that process it cannot get a lock, it releases all locks gotten and starts the lock acquisition again. Logoff process will timeout sooner when waiting for a lock, thereby not causing other waiting processes to wait as long. This puts logoff processing at a lower priority than other processes. Defect 8369 Defect 8396 The Server name that SKBR held in uppercase did not match the Server's kept value. Solution - The retention of the server will be in lowercase and all comparisons will occur with same case. Defect 8253 The skill expression being monitored had available agent number one greater than logged on. Solution - The GenerateACDAgentDetailsEvent use the skillsexpression's available count rather than doing a local calculation. Defect 8208 OTHER was in INI file because Predictive Dialer was configured (not installed). Solution - In ValidateINIFile, upper case the token and the words OTHER and PREDICTIVE. This allows the comparison to work correctly. Defect 8205 Agent status moves to Available state due to quick timeout. Solution - Minimum value for MaxPendingTime state is now 10 seconds. This will give the agent enough time to trigger ACD_Call state when a call is received before a timeout that would change the state of the agent to the PendingInboundTimeoutState value. APAR IY07138 A call is queued instead of being given to the available agent. Solution - The available agent count was being decremented in AgentDelta function even when the agent was not currently available. This made the count be 1 too few and would result in an agent waiting, not being given a call that came in. APAR IC25746 If an Agent is removed from the INI file and TadsReadINI() is called while the agent is Logged on and monitored by an application the code could trap attempting to clean up the Agent resources. Solution - A pointer to unlock a semaphore related to the Queue that was created on the monitor of the Agent was being accessed after the Queue had been deleted. Change code to properly clean up the Queue. APAR IC25739 Symptom/Impact - When several applications perform TadsQueryACDStatus() calls to the same resource the Skills Based Routing daemon could trap intermittantly. Problem - c++ Collection Class trapping. Workaround - None. Solution - Change the method used to determine if the query is for a Skills expression or not. This eliminated calling the offending method in the Collection class. Defect 8133 Symptom/Impact - All calls to TadsRequestACDAction() api fail RC=510 (Tads_Internal_Error). Problem - Original design. Workaround - Do not issue TadsRequestACDAction(WORK_NOT_READY) with an invalid DN for the SKBR agent. Solution - Found in the case of the RequestACDAction(WORK_NOT_READY) if the telephone number provided in the API is not the same as what the agent logged on with the code would return without unlocking the appropriate semaphore. This causes all api calls that needed access to the list to fail for RC=510. Change the code to unlock the semaphore in this particular case. Defect 8125 Symptom/Impact - When there are more than 395 calls queued, a TadsModQueryACDStatus call abends. Problem - Original design. Workaround - None. Solution - In TadsModQueryACDStatus, determine if more than buffer maximum is needed. If so, return a 585 return code and supply the header only. Defect 8105 Symptom/Impact - The agents skills list was being evaluated for a second time when the agent's skills had been updated. Problem - Original design. Workaround - None. Solution - In VerifySkillsExpressionQueues, remove the extraneous traversal of the agents skills list. Only need to remove the expression from the expression list. PMR 25103 Symptom/Impact - When an agent's resume is changed to add an active skill and the TadsReadINI() api is called, the agent (in available state) is associated with the skill queues that contain that skill. If the agent is selected for a call upon being associated with the queue, no TADS_ENQUEUE_RESPONSE_EVENT was delivered to the enqueuing application. Problem - Design Problem. Workaround - None. Solution - Generate an TADS_ENQUEUE_RESPONSE upon selection of the agent from the new association with that skill queue. Defect 8089 Symptom/Impact - Want the ability to have an agent logged off if he times out. Problem - Function limitation. Workaround - None. Solution - In tmskinit.cpp, function ReadINIInboundValues, evaluate for "LOGOFF" string in PendingInboundTimeoutState in CSEBPROF.INI file. Set the global ini value to TADS_ACD_STATE_LOGGED_OFF so that in case agent times out a logoff will be initiated. PMR 6934 Symptom/Impact - Unable to easily retrieve the Queue Time and the Estimated wait time for a queue when doing TadsQueryPotentialCalls. Problem - Function limitation. Workaround - None. Solution - In CSEBPROF.INI in TADSSKBR section the system admin can specify the field "ExtendedPotentialCallData" with a value of 1. This will be interrogated by the TadsQueryPotentialCalls function, which will build a series of DBTADS_QUEUE_HDR_EXTENDED structures instead of a series of DBTADS_QUEUE_HDR structures. The new structure will have the ulQueueTime and ulEstWaitTime fields in it. The application can interrogate these field values upon return from the TadsQueryPotentialCalls function call. Defect 8068 Symptom/Impact - The estimated wait time was based on the queue time of the longest waiting call. Problem - Coding error. Workaround - None. Solution - Add function to calculate and retain the average processing time. Use it and the number of calls queued to calculate the estimated wait time. Note that before any calls have been processed, the calculated wait time will return a minimum value. As calls are processed, the wait time value will become valid. APAR IY04436 Symptom/Impact - When an Agent wishes to SetAgentPreferences() to specify only a a subset of his skills resume, the agent was not being removed from the skills expressions that he did not specify in the SetAgentPreferences API. Problem - Coding error. Workaround - None. Solution - Change to the SetAgentPreferences() API process to remove the AgentID from the skills queues that are no longer desired by the agent. APAR IC24678 Symptom/Impact - When Agent resumes are changed to delete/add agent skills to an Agent's resume who is actively processing calls in the system, SKBR could trap. Problem - Design Error Workaround - None. Solution - Change to the ReadINI() processing so that only the agent's delta is changed in QualifiedAgentList instead of doing a remove/add. The remove add was creating a corrupted agent in the List. Defect 8031 Symptom/Impact - When a skill is added to an Agent's resume in the INI file and TadsReadINI() is called, the agent is placed as qualified to handles calls from all queues that contain the added skill. However, if the Agent was in available state and calls are queued for the new skill, the agent was not selected to handle a call. Problem - Code Error. Workaround - Have agent logoff, then back on to the system. Solution - Change the TadsReadINI() processing to find a call for the agent if the agent is in available state and calls exist on the queue. Defect 8031 Symptom/Impact - When an Agent Skill,LEVEL combination is removed from the INI file and TadsReadINI() is called the agent is only removed from the specific Skill,LEVEL queue. The Agent remains in other Skill,LEVEL queues in which he previously was qualified for. Problem - Code Error. Workaround - Have agent logoff, then back on to the system. Solution - Change the TadsReadINI() processing to remove the agent from all associated skill queues that contain the removed skill. Defect 8016 Symptom/Impact - If multiple calls are in queue and an agent remains in the PENDING_INBOUND state until timeout, the agent was not being issued another call upon becoming AVAILABLE after the timeout. Problem - Code Error. Workaround - Have agent logoff, then back on to the system. Solution - Change the pending timeout processing to call find call for the agent if the PendingInboundTimeoutState parameter in the INI file is set to AVAILABLE. APAR IC24537 Symptom/Impact - Under heavy load it was possible for the SKBR code to trap while generating a PotentialCallsEvent. Problem - Code Error. Workaround - None. Solution - Add error checking to GeneratePotentialCallEvent code to check that the agent object is valid prior to accessing it. APAR IC24537 Symptom/Impact - When an application issues an TadsQueryACDStatus or receives a TadsACDStatusEvent the Available agent count could be incorrect as to how many agents are actual in the available state for that queue. Problem - Code Error. Workaround - None. Solution - Changes to the code so that the incrementing and decrementing the count of available agents remains accurate. APAR IC24533 Symptom/Impact - When an agent logs off during the transfer of an outbound power dial, it is possible for the SKBR/Dialer daemon to trap. Was being caused one thread removing the Agent for a list while another thread accessed a pointer to it. Problem - Code Error. Workaround - None. Solution - Changes to the code to reinitialize the pointer to the working agent prior to accessing the object. Defect 7575 Symptom/Impact - When an agent times out in TADS_PENDING_INBOUND state the agent should transistion to the configured state in the INI file without receiving additional calls. This was not happening correctly. Problem - Code Error. Workaround - None. Solution - Changes to the code to ensure the agent transistions to the configured state correctly. APAR IC24203 Symptom/Impact - If agent that is actively servicing calls attempts to call TadsRequestACDAction(AGENT_LOGOFF) the SKBR/Dialer daemon traps as 1 thread would remove the agent while other threads were still accessing it. Problem - Design Error Workaround - Have the Agent Application make the agent UNAVAILABLE before issuing LOGOFF. Solution - Ensure that the agent list is locked correctly in the code multiple thread are not accessing the same agent at the same time. APAR IC24204 Symptom/Impact - Under heavy load it is possible to have the SKBR/Dialer Daemon enter a deadlock state as multiple threads access the same semaphores at the same time. Problem - Design Error Workaround - None. Solution - Code change to clean up semaphore locking problems. APAR IC24205 Symptom/Impact - Under heavy load in Power Dialing mode it is possible to have 2 thread access the same Call in the system. 1 thread is removing the call at the same time that the 2nd thread is trying to use it. Once the first thread removes this from memory the second thread accesses invalid data. Problem - Design Error Workaround - None. Solution - Code change to clean up semaphore of the Call list and ensuring that the same call is not accessed by multiple threads. APAR IC24206 Symptom/Impact - The TadsGetOutboundCall() API specifies that a wait time value of -1 would block forever. This was not the case and the API would not block at all, causing a timing problem internally to the dialer, resulting in a trap. Problem - Design Error Workaround - Issue the API with another value. Solution - Code change to have the API block for 24hrs. on a call with waittime = -1. APAR IC24207 Symptom/Impact - In POWER dialing mode it is possible to have the same call (customer number) serviced by multiple IVR ports. This causes the customer do be called multiple times if a retry mechanism is enabled. Problem - Design Error Workaround - None. Solution - Code change to ensure that the call being made is marked as already being serviced by an IVR port. APAR IC24207 Symptom/Impact - If the csebprof.ini is modified to delete an actively working agent, and TadsReadINI() is then called the system traps. Problem - Design Error Workaround - Only issue TadsReadINI() on a quiesced system. Solution - Clean up the TadsReadINI() code to ensure that agent objects are not deleted out from under other threads. APAR IC23986 Symptom/Impact - When Dialer is performing multiple POWER dial calls per agent, it is possible to have 2 calls transfered to the same agent at the same time, resulting in a transfer failure on 1 of the calls. Problem - Design Error Workaround - None. Solution - Mark the Agent as selected upon receipt of the first TadsSetDialResult(ANSWERED), forcing the second to find another available agent. Defect 7419 Symptom/Impact - When only Dialer function is installed in a system, API call to TadsRequestEnqueue with reason ENQUEUE_CALL was incorrectly being accepted. The code will not return RC=551 (function_not_available) Problem - Code Error. Workaround - None. Solution - Changes to the TadsRequestEnqueue API to correctly check the functions installed prior to accepting the request. Defect 7235 Symptom/Impact - The SKBR daemon would abend on a call to TadsSetEventMonitor for TADS_AGENT_STATUS_EVENT with a resource equal to the agents directory number. Problem - Code Error. Workaround - None. Solution - Changes to the SetEventMonitor code so that a semaphore for the agent is locked prior to updating the monitor list. Defect 7128 Symptom/Impact - In previous versions of this code a call enqueued without a definitive skill level (ie. ENGLISH) had a default skill value of 10. However, if agent skills were specifically defined to be certain levels (ie. ENGLISH,5), the enqueue request would fail, if no agent had a Skill level of 10. Support for the NOT keyword in a skills expression is no longer supported beginning with this version of the code. Any skills expression can be constructed with the AND & OR keywords. Problem - Design Error. Workaround - None. Solution - Change the default values for skills that are input to the system without skill levels attached. Skills in a enqueue request that do not specify a skill level will default to an internal value of 1 so that any agent can service the request. PMR 67893 Symptom/Impact - Code abends when the AgentName field in the TADSSKBR_AGENT_RESUMES section of the INI file is missing. Problem - Design Error. Workaround - None. Solution - Put in the defensive code to eliminate the abend. Code now enforces the Maximum length of the AgentName field as documented in the API. Any AgentName field larger than 8 char- acters will now be truncated to 8. PMR 72504 Symptom/Impact - An inbound call from monitored AgentA to monitored AgentB causes the SKBR Daemon to exit abnormally on disconnect. Problem - Design Error. Workaround - None. Solution - Code was accessing invalid data on the Disconnected event. Thus in the Window NT environment the SKBR Daemon would simply terminate with no indication of a trap. PMR 70335 Symptom/Impact - Agent is placed in WORK_NOT_READY state after consultation call, even though customer is still on the line. Problem - Design Error. Workaround - None. Solution - By checking for the correct Call ID's on a disconnected event the code will now keep the Agent in ACD_CALL state if the the Agent still has the Customer on the line. PMR 71350 Symptom/Impact - SKBR does not generating Agent Status events for application monitoring for them. Problem - Program Error. Workaround - None. Solution - Problem was caused by numerous changes to this area of the code. Code has been changed to correctly generate Agent Status events. PMR 59750 Symptom/Impact - SKBR traps when reading an agents skills list longer than 256 characters. Problem - Design Issue. Workaround - Ensure the agents skill list is shorter that 256 characters. Solution - Dynamically allocate storage for the skills list being read in so it can be as long as required. PMR 70229 Symptom/Impact - SKBR was translating the DIALRES number for EnqueueResponseEvents to the LOCAL agent extension. This causes a problem in an IS-ICT scenerio where the call is enqueued to SKBR on another Switch. Problem - Design Issue. Workaround - None. Solution - Add a parameter of AgentExtTranslation = ON or OFF to the TADSSKBR section of the INI. This will enable those apps that are only in a single switch enviroment to specify that the the number to transfer to returned in the EnqueueResponse msg is translated to the agents DN. If this parameter is OFF then the fully qualified agent phone number will be returned. Files in service: csesskbr.txt csesskbr.txt bin\csesskbr.exe bin\skbrtool.exe bin\csesskbr.dat