• jars
  • NEWBIE
  • 0 Points
  • Member since 2010

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 4
    Questions
  • 12
    Replies

Hi all,

 

I've come across a problem when migrating our current CTI "connector" to the new CTI 4.0 Toolkit.

I spotted a race condition on first connection from Salesforce.com.

 

First I should mentioned that, to solve the problem with user params in older CTI toolkit versions, I had to implement a custom CTIAppExchange class with methdos LoadUserParamsFromCustomSetup and SaveUserParams.

 

The new BrowserConnection on initialization sends an "UPDATE_SID" message to the CTI Adapter. This message starts a chain of events that eventually ends up invoking my LoadUserParamsFromCustomSetup method and get the user information for the Login Form.

However, this code is running concurrently with other requests that are sent by the browser, namely, the CONNECT message.

The CONNECT message kicks up a call to our connection procedure and when this ends an OnConnection event (or OnConnectionFailed) event is fired from our side to inform of a sucessful connection. These calls result on UIRefresh() call which sends the "connection" information to the browser...

 

The problem starts when the OnConnection() event is sent before the part of the initialization code that gets te user params ran... When that happens, and until the BrowserConnector is killed and (with luck) another run doesn't fall in the race condition, the login form is always empty.

 

Here is a log entry illustrating the issue (sorry for all the garbage...):

 

01/25/2012 17:34:18: Connector::Connector(pUI): Created Connector object with an user interface object.
01/25/2012 17:34:18: Connector::Initialize(): Initialized object.
01/25/2012 17:34:18: CreateLoginForm()
01/25/2012 17:34:23: receiving 281 characters in message <?xml version="1.0" encoding="UTF-8"?><MESSAGE ID="UPDATE_SID">
<PARAMETER NAME="SID" VALUE="00D70000000JY7g!ARgAQNu9apLVC.Jm66lkHVEEGhs0sH8AqMzd.cnt4kBoJcD11IZEuB5bn0ky6hgZ6HrdaBqWFZFJwbfcyHZe_QFOI7FTYucG"/><PARAMETER NAME="INSTANCE" VALUE="https://na5.salesforce.com"/></MESSAGE>
01/25/2012 17:34:23: receiving 77 characters in message <?xml version="1.0" encoding="UTF-8"?><MESSAGE ID="SetCtiAppMode">
</MESSAGE>
01/25/2012 17:34:23: CCTIUserInterface::UIHandleMessage: Message received: SetCtiAppMode.  Parameters:
01/25/2012 17:34:23: CCTIUserInterface::UIHandleMessage: Message received: UPDATE_SID.  Parameters: INSTANCE=https://na5.salesforce.com; SID=00D70000000JY7g!ARgAQNu9apLVC.Jm66lkHVEEGhs0sH8AqMzd.cnt4kBoJcD11IZEuB5bn0ky6hgZ6HrdaBqWFZFJwbfcyHZe_QFOI7FTYucG;
01/25/2012 17:34:23: CCTIAppExchange::SetSessionInstanceAndSid: Setting URL to https://na5.salesforce.com/services/Soap/c/17.0
01/25/2012 17:34:24: receiving 1461 characters in message <?xml version="1.0" encoding="UTF-8"?><MESSAGE ID="CONNECT">
<PARAMETER NAME="/displayNameLabel" VALUE="Display Name"/><PARAMETER NAME="/internalNameLabel" VALUE="Internal Name"/><PARAMETER NAME="/reqDialingOptions/reqInternationalPrefix" VALUE="00023"/><PARAMETER NAME="/reqDialingOptions/reqLongDistPrefix" VALUE="0023"/><PARAMETER NAME="/reqDialingOptions/reqOutsidePrefix" VALUE="0"/><PARAMETER NAME="/reqGeneralInfo/reqAdapterUrl" VALUE="http://localhost:11000"/><PARAMETER NAME="/reqGeneralInfo/reqDescription" VALUE="Call Center Adapter"/><PARAMETER NAME="/reqGeneralInfo/reqProgId" VALUE="CTIConnector.Adapter.1"/><PARAMETER NAME="/reqGeneralInfo/reqVersion" VALUE="4.0"/><PARAMETER NAME="/serverInfo/InstanceName" VALUE="opagent573"/><PARAMETER NAME="/serverInfo/InstancePort" VALUE="1500"/><PARAMETER NAME="/serverInfo/IntegrationServerUrl" VALUE="http://blabla/integrationserveroperams"/><PARAMETER NAME="/serverInfo/InternalExtensionLength" VALUE="4"/><PARAMETER NAME="/serverInfo/LogInternalCalls" VALUE="false"/><PARAMETER NAME="/serverInfo/SearchInternalCalls" VALUE="false"/><PARAMETER NAME="/serverInfo/SiteName" VALUE="default"/><PARAMETER NAME="/Mappings/cnpjconta" VALUE="Account.CNPJ__c"/><PARAMETER NAME="/Mappings/cpfconta" VALUE="Account.CPF__pc"/><PARAMETER NAME="/Mappings/cpfcontato" VALUE="Contact.CPF__c"/><PARAMETER NAME="/Mappings/FieldsCount" VALUE="3"/></MESSAGE>
01/25/2012 17:34:24: CCTIUserInterface::UIHandleMessage: Message received: CONNECT.  Parameters: /displayNameLabel=Display Name; /internalNameLabel=Internal Name; /reqDialingOptions/reqInternationalPrefix=00023; /reqDialingOptions/reqLongDistPrefix=0023; /reqDialingOptions/reqOutsidePrefix=0; /reqGeneralInfo/reqAdapterUrl=http://localhost:11000; /reqGeneralInfo/reqDescription=Call Center Adapter; /reqGeneralInfo/reqProgId=CTIConnector.Adapter.1; /reqGeneralInfo/reqVersion=4.0; /serverInfo/InstanceName=opagent573; /serverInfo/InstancePort=1500; /serverInfo/IntegrationServerUrl=http://blabla/integrationserveroperams; /serverInfo/InternalExtensionLength=4; /serverInfo/LogInternalCalls=false; /serverInfo/SearchInternalCalls=false; /serverInfo/SiteName=default; /Mappings/cnpjconta=Account.CNPJ__c; /Mappings/cpfconta=Account.CPF__pc; /Mappings/cpfcontato=Contact.CPF__c; /Mappings/FieldsCount=3;
01/25/2012 17:34:24: Found connection parameter /displayNameLabel=Display Name.
01/25/2012 17:34:24: Found connection parameter /internalNameLabel=Internal Name.
01/25/2012 17:34:24: Found connection parameter /reqDialingOptions/reqInternationalPrefix=00023.
01/25/2012 17:34:24: Found connection parameter /reqDialingOptions/reqLongDistPrefix=0023.
01/25/2012 17:34:24: Found connection parameter /reqDialingOptions/reqOutsidePrefix=0.
01/25/2012 17:34:24: Found connection parameter /reqGeneralInfo/reqAdapterUrl=http://localhost:11000.
01/25/2012 17:34:24: Found connection parameter /reqGeneralInfo/reqDescription=Call Center Adapter.
01/25/2012 17:34:24: Found connection parameter /reqGeneralInfo/reqProgId=CTIConnector.Adapter.1.
01/25/2012 17:34:24: Found connection parameter /reqGeneralInfo/reqVersion=4.0.
01/25/2012 17:34:24: Found connection parameter /serverInfo/InstanceName=opagent573.
01/25/2012 17:34:24: Found connection parameter /serverInfo/InstancePort=1500.
01/25/2012 17:34:24: Found connection parameter /serverInfo/IntegrationServerUrl=http://blabla/integrationserveroperams.
01/25/2012 17:34:24: Found connection parameter /serverInfo/InternalExtensionLength=4.
01/25/2012 17:34:24: Found connection parameter /serverInfo/LogInternalCalls=false.
01/25/2012 17:34:24: Found connection parameter /serverInfo/SearchInternalCalls=false.
01/25/2012 17:34:24: Found connection parameter /serverInfo/SiteName=default.
01/25/2012 17:34:24: Found connection parameter /Mappings/cnpjconta=Account.CNPJ__c.
01/25/2012 17:34:24: Found connection parameter /Mappings/cpfconta=Account.CPF__pc.
01/25/2012 17:34:24: Found connection parameter /Mappings/cpfcontato=Contact.CPF__c.
01/25/2012 17:34:24: Found connection parameter /Mappings/FieldsCount=3.
01/25/2012 17:34:24: CUserInterface::CTIConnect() Adapter version 1.1 - Connect parameters: http://blabla/integrationserveroperams, opagent573:1500, default
01/25/2012 17:34:24: > Connector::Connect( http://blabla/integrationserveroperams )
01/25/2012 17:34:24: > Connector::Connect() -> Auto Wrapup is OFF
01/25/2012 17:34:24: < Connector::Connect( http://blabla/integrationserveroperams )
01/25/2012 17:34:24: OnCTIConnection called.
01/25/2012 17:34:24: Sending XML (len 400): <CTIUserInterface LOGGED_IN="false"><CTIForm><CTIEditBox ID="CUSTOM1" LABEL="Instance Name" VALUE=""/><CTIEditBox ID="AGENT_ID" LABEL="Agent Id" VALUE=""/><CTIEditBox ID="PASSWORD" PASSWORD="true" VALUE=""/><CTIEditBox ID="CUSTOM2" LABEL="Site" VALUE=""/><CTIEditBox ID="EXTENSION" VALUE=""/><CTIButton COLOR="GREEN" ID="LOGIN" LONG_STYLE="true"/></CTIForm><CTILogo/></CTIUserInterface>
01/25/2012 17:34:24: receiving 74 characters in message <?xml version="1.0" encoding="UTF-8"?><MESSAGE ID="UPDATE_XML">
</MESSAGE>
01/25/2012 17:34:24: CCTIUserInterface::UIHandleMessage: Message received: UPDATE_XML.  Parameters:
01/25/2012 17:34:24: Sending XML (len 400): <CTIUserInterface LOGGED_IN="false"><CTIForm><CTIEditBox ID="CUSTOM1" LABEL="Instance Name" VALUE=""/><CTIEditBox ID="AGENT_ID" LABEL="Agent Id" VALUE=""/><CTIEditBox ID="PASSWORD" PASSWORD="true" VALUE=""/><CTIEditBox ID="CUSTOM2" LABEL="Site" VALUE=""/><CTIEditBox ID="EXTENSION" VALUE=""/><CTIButton COLOR="GREEN" ID="LOGIN" LONG_STYLE="true"/></CTIForm><CTILogo/></CTIUserInterface>
01/25/2012 17:34:24: CCTIAppExchange::SetSessionInstanceAndSid: Setting SID to 00D70000000JY7g!ARgAQNu9apLVC.Jm66lkHVEEGhs0sH8AqMzd.cnt4kBoJcD11IZEuB5bn0ky6hgZ6HrdaBqWFZFJwbfcyHZe_QFOI7FTYucG
01/25/2012 17:34:24: CCTIAppExchange::SetSessionInstanceAndSid: Proxy set to http://titan.ascorp.net:8080:
01/25/2012 17:34:24: CCTIAppExchange::SetSessionInstanceAndSid: Setting URL to https://na5.salesforce.com/services/Soap/c/17.0
01/25/2012 17:34:24: CCTIAppExchange::UpdateSid: New user detected!  Updating cached information.
01/25/2012 17:34:24: UserId set to 005700000015PHAAA2.
01/25/2012 17:34:24: CCTIAppExchange::UpdateSid: User SOMEUSER authenticated.
01/25/2012 17:34:24: CCTIAppExchange::SetSessionInstanceAndSid: Setting URL to https://na5.salesforce.com/services/Soap/c/17.0
01/25/2012 17:34:24: CCTIAppExchange::LoadUserParamsFromCustomSetup: parameters[AGENT_ID] = agent2
01/25/2012 17:34:24: CCTIAppExchange::LoadUserParamsFromCustomSetup: parameters[CUSTOM1] = opagent573:1500
01/25/2012 17:34:24: CCTIAppExchange::LoadUserParamsFromCustomSetup: parameters[CUSTOM2] = porto
01/25/2012 17:34:24: CCTIAppExchange::LoadUserParamsFromCustomSetup: parameters[CUSTOM4] = true
01/25/2012 17:34:24: CCTIAppExchange::LoadUserParamsFromCustomSetup: parameters[EXTENSION] = 1
01/25/2012 17:34:24: CCTIAppExchange::LoadUserParamsFromCustomSetup: parameters[PASSWORD] =
01/25/2012 17:34:24: CCTIAppExchange::LoadUserParamsFromCustomSetup: parameters[] =
01/25/2012 17:34:25: CCTIAppExchange::SetSessionInstanceAndSid: Setting SID to 00D70000000JY7g!ARgAQNu9apLVC.Jm66lkHVEEGhs0sH8AqMzd.cnt4kBoJcD11IZEuB5bn0ky6hgZ6HrdaBqWFZFJwbfcyHZe_QFOI7FTYucG
01/25/2012 17:34:25: CCTIAppExchange::SetSessionInstanceAndSid: Proxy set to http://titan.ascorp.net:8080:
01/25/2012 17:34:25: CCTIAppExchange::SetSessionInstanceAndSid: Setting SID to 00D70000000JY7g!ARgAQNu9apLVC.Jm66lkHVEEGhs0sH8AqMzd.cnt4kBoJcD11IZEuB5bn0ky6hgZ6HrdaBqWFZFJwbfcyHZe_QFOI7FTYucG
01/25/2012 17:34:25: CCTIAppExchange::SetSessionInstanceAndSid: Proxy set to http://titan.ascorp.net:8080:

 I worked around this problem by setting an event on the BrowserConnector code, but this doesn't feel right since it takes a few seconds for the login form to be filled and during that time interval it is presented empty...

Nevertheless here is what I did:

//[jars@20120125: Race condition between UPDATE_SID and CONNECT messages results on login form being sent empty before custom user data is retrieved.
        //At least this is the case when a custom LoadUserParamsFromCustomSetup is implemented on a class derived from CCTIAppExchange.
        ManualResetEvent sid_event = new ManualResetEvent(true);

...


        /**
         * callback delegates
         **/
        private void ProcessRequest(IAsyncResult result)
        {
            HttpListenerContext context = httpListener.EndGetContext(result);
            HttpListenerRequest request = context.Request;
            HttpListenerResponse response = context.Response;
            NameValueCollection queryString = getQueryStringFromRequest(request);
            string requestRawUrl = request.RawUrl.ToString();

            sid_event.WaitOne();

...       
        private void initialize(object mapQueryString)
        {
            //[jars]
            sid_event.Reset();
            Logger.WriteLogEntry(Logger.LOGLEVEL_HIGH, "Initializer blocking...");
            AdapterLink.SendCommand(Constants.UpdateSidCmd, (Dictionary<string, string>)mapQueryString);
            sid_event.Set();
            Logger.WriteLogEntry(Logger.LOGLEVEL_HIGH, "Initializaer releasing...");

            MessageDispatcher.MessagePump();
        }

 

It would be nice to have a cleaner solution from Salesforce...

Hope this helps!

 

Cheers,

jars

  • January 25, 2012
  • Like
  • 0

Hello,

 

I am in the process of upgrading our current Connector product from the old Toolkit 1.54 to the lates 3.01 version.

However I am having a problem with saving data from the login form created by our application. Everything works correctly with 1.54 version, however when using the same code upgraded to 3.01 there's an error in Salesforce and no user data is saved.

 

In Salesforce's logs:

 

CTI 1.54:

 

07/06/2011 10:44:25: CCTIAppExchange::GetValueFromQuery: Got value from query: ClientName: CTI/

07/06/2011 10:44:25: CCTIAppExchangeSaveThread::ThreadSaveUserParams: Created SObjects; saving login data to Custom Setup tables.

07/06/2011 10:44:26: CCTIAppExchangeSaveThread::ThreadSaveUserParams: Save complete.

 

And data is saved OK

 

CTI 3.01:

 

07/05/2011 17:27:18: CCTIAppExchange::GetValueFromQuery: Query: Select c.ClientName From CustomSetupDefinition c Where KeyPath='CTI/AGENT_ID'

07/05/2011 17:27:18: CCTIAppExchange::GetValueFromQuery: Error getting query results: INVALID_TYPE: sObject type 'customsetupdefinition' is not supported. If you are attempting to use a custom object, be sure to append the '__c' after the entity name. Please reference your WSDL or the describe call for the appropriate names..

07/05/2011 17:27:18: CCTIAppExchange::GetValueFromQuery: Got value from query: ClientName:

07/05/2011 17:27:19: Detected assigned campaign cp_sap

07/05/2011 17:27:19: CCTIAppExchangeSaveThread::ThreadSaveUserParams: COM error setting up custom setup objects: INVALID_TYPE: sObject type 'CustomSetup' is not supported. If you are attempting to use a custom object, be sure to append the '__c' after the entity name. Please reference your WSDL or the describe call for the appropriate names..

07/05/2011 17:27:19: CCTIAppExchangeSaveThread::ThreadSaveUserParams: Created SObjects; saving login data to Custom Setup tables.

07/05/2011 17:27:19: CCTIAppExchangeSaveThread::ThreadSaveUserParams: Save complete.

 

 

I am using Developer Edition. Is this failure related to that?

 

The only info I could find relating to my issue is in the official FAQ:

 

My CTI login credentials seem to be saving themselves for admins but not for standard users. How do I fix this?

This is a known issue with the CustomSetup table we save those settings to, and there's not an easy fix for it, or else we would have done it already. Login credentials are only saved for those users with the "Customize Application" profile permission. We plan to move the credentials into the Windows Registry instead under HKEY_CURRENT_USER, but we will not do so until a later release of the CTI Toolkit. You can implement it sooner if you want, it is quite simple.

To do this, you can provide an overrided version of CCTIAppExchange -- just make a subclass of it and override CCTIUserInterface::GetAppExchange() to return your subclass instead of the base class. In your subclass, override SaveUserParams and LoadUserParamsFromCustomSetup to save them to and load them from the Windows registry instead. That will fix the problem.

 

Does this mean that in a live (production) environment we'll only be able to save "agent data" for privileged users and we must implement those overrides for the solution to run correctly?

Do we require a Client ID for this to work in toolkit 3.01?

 

Thanks for your help!

 

--

jars

  • July 06, 2011
  • Like
  • 0

Hello all,

 

I am in the process of upgrading our Salesforce Connector product to Salesforce CTI Toolkit 3.01.

 

I've seen in the release notes that there's a new message that's supposed to allow supporting DTMF ("New ADD_DIALPAD_NUMBER message to support DTMF").

The problem is that I see no example showing how to make this work. Dial pads, as far as I could see, are always associated with a given operation (DIAL, TRANSFER or CONFERENCE). I find it strange to send DTMF from a TRANSFER or CONFERENCE related dialpad.

Could somebody please redirect me to an example or explain how this new feature should be used?

 

Thanks!

 

--

jars

  • July 05, 2011
  • Like
  • 0

Hello,

 

I am migrating existing code to work with CTI Toolkit 2.0. I was able to compile and run the new version, haven't start to play around with the new features though.

 

However I took a look at the logs and found some errors for which I couldn't get any information.

Could someone help?

 

These are the relevant log entries:

 

05/25/2010 13:37:32: CreateLoginForm()
05/25/2010 13:37:32: receiving 291 characters in message <?xml version="1.0" encoding="UTF-8"?><MESSAGE ID="UPDATE_SID">
<PARAMETER NAME="INSTANCE" VALUE="https://prerelna1.pre.salesforce.com"/><PARAMETER NAME="SID" VALUE="00Dt0000000Agih!AQoAQEMzqMEwD9msgMcxWn5ziNssjIFNdxAsEFEJWc_doLPN898DFUttHfcYNYkZSlSER7zZGs.7xWPxpluY1u7dlA14Pz8Y"/></MESSAGE>
05/25/2010 13:37:32: CCTIUserInterface::UIHandleMessage: Message received: UPDATE_SID.  Parameters: INSTANCE=https://prerelna1.pre.salesforce.com; SID=00Dt0000000Agih!AQoAQEMzqMEwD9msgMcxWn5ziNssjIFNdxAsEFEJWc_doLPN898DFUttHfcYNYkZSlSER7zZGs.7xWPxpluY1u7dlA14Pz8Y;
05/25/2010 13:37:32: CCTIAppExchange::SetSessionInstanceAndSid: Setting URL to https://prerelna1.pre.salesforce.com/services/Soap/c/17.0
05/25/2010 13:37:33: CCTIAppExchange::SetSessionInstanceAndSid: Setting SID to 00Dt0000000Agih!AQoAQEMzqMEwD9msgMcxWn5ziNssjIFNdxAsEFEJWc_doLPN898DFUttHfcYNYkZSlSER7zZGs.7xWPxpluY1u7dlA14Pz8Y
05/25/2010 13:37:33: CCTIAppExchange::UpdateSid: New user detected!  Updating cached information.
05/25/2010 13:37:33: UserId set to 005t0000000uv42AAA.
05/25/2010 13:37:33: CCTIAppExchange::UpdateSid: User José Silva authenticated.
05/25/2010 13:37:33: CCTIAppExchange::SetSessionInstanceAndSid: Setting URL to https://prerelna1.pre.salesforce.com/services/Soap/c/17.0
05/25/2010 13:37:33: CCTIAppExchange::SetSessionInstanceAndSid: Setting URL to https://prerelna1.pre.salesforce.com/services/Soap/c/17.0
05/25/2010 13:37:33: CCTIAppExchange::LoadUserParamsFromCustomSetup: Error loading user params from CustomSetup: INVALID_TYPE: sObject type 'customsetup' is not supported. If you are attempting to use a custom object, be sure to append the '__c' after the entity name. Please reference your WSDL or the describe call for the appropriate names..
05/25/2010 13:37:33: CCTIAppExchange::SetSessionInstanceAndSid: Setting SID to 00Dt0000000Agih!AQoAQEMzqMEwD9msgMcxWn5ziNssjIFNdxAsEFEJWc_doLPN898DFUttHfcYNYkZSlSER7zZGs.7xWPxpluY1u7dlA14Pz8Y

...

05/25/2010 13:37:36: OnCTIConnection called.
05/25/2010 13:37:36: Sending XML (len 606): <CTIUserInterface LOGGED_IN="false"><CTIForm><CTIEditBox ID="CUSTOM1" LABEL="uCI Instance Name" VALUE=""/><CTIEditBox ID="AGENT_ID" LABEL="uCI Agent Id" VALUE=""/><CTIEditBox ID="PASSWORD" PASSWORD="true" VALUE=""/><CTIEditBox ID="CUSTOM2" LABEL="uCI Site" VALUE=""/><CTIEditBox ID="EXTENSION" VALUE=""/><CTICheckbox CHECKED="false" ID="CUSTOM4" LABEL="Automatic Login"/><CTIButton COLOR="GREEN" ID="LOGIN" LONG_STYLE="true"/></CTIForm><CTILogo IMAGE_URL="whatever"/></CTIUserInterface>
05/25/2010 13:38:05: receiving 324 characters in message <?xml version="1.0" encoding="UTF-8"?><MESSAGE ID="LOGIN">
<PARAMETER NAME="AGENT_ID" VALUE="someone"/><PARAMETER NAME="CUSTOM1" VALUE="server:1500"/><PARAMETER NAME="CUSTOM2" VALUE="porto"/><PARAMETER NAME="CUSTOM4" VALUE="false"/><PARAMETER NAME="EXTENSION" VALUE="1"/><PARAMETER NAME="PASSWORD" VALUE=""/></MESSAGE>
05/25/2010 13:38:05: CCTIUserInterface::UIHandleMessage: Message received: LOGIN.  Parameters:
05/25/2010 13:38:05: Sending XML (len 248): <CTIUserInterface LOGGED_IN="false"><CTIProgressBar ID="LOGGING_IN" LABEL=""/><CTILogo IMAGE_URL="whatever"/></CTIUserInterface>
05/25/2010 13:38:05: Sending XML (len 648): <CTIUserInterface LOGGED_IN="false"><CTIProgressBar ID="LOGGING_IN" LABEL=""/><CTIForm><CTIEditBox ID="CUSTOM1" LABEL="uCI Instance Name" VALUE=""/><CTIEditBox ID="AGENT_ID" LABEL="uCI Agent Id" VALUE=""/><CTIEditBox ID="PASSWORD" PASSWORD="true" VALUE=""/><CTIEditBox ID="CUSTOM2" LABEL="uCI Site" VALUE=""/><CTIEditBox ID="EXTENSION" VALUE=""/><CTICheckbox CHECKED="false" ID="CUSTOM4" LABEL="Automatic Login"/><CTIButton COLOR="GREEN" ID="LOGIN" LONG_STYLE="true"/></CTIForm><CTILogo IMAGE_URL="whatever"/></CTIUserInterface>
05/25/2010 13:38:05: CCTIAppExchange::GetValueFromQuery: Query: Select c.ClientName From CustomSetupDefinition c Where KeyPath='CTI/AGENT_ID'
05/25/2010 13:38:06: CCTIAppExchange::GetValueFromQuery: Error getting query results: INVALID_TYPE: sObject type 'customsetupdefinition' is not supported. If you are attempting to use a custom object, be sure to append the '__c' after the entity name. Please reference your WSDL or the describe call for the appropriate names..
05/25/2010 13:38:06: CCTIAppExchange::GetValueFromQuery: Got value from query: ClientName:
05/25/2010 13:38:06: CCTIAppExchangeSaveThread::ThreadSaveUserParams: COM error setting up custom setup objects: INVALID_TYPE: sObject type 'CustomSetup' is not supported. If you are attempting to use a custom object, be sure to append the '__c' after the entity name. Please reference your WSDL or the describe call for the appropriate names..

 

These error messages weren't appearing for CTI toolkit 1.54. What might be wrong?

 

Thanks,

jars

  • May 25, 2010
  • Like
  • 0

I have created the "Sample HTMLPage Using Open CTI" from the Open CTI Developers guide and added the "onClickToDial" Method.

When I click multiple numbers, i.e. go down through a list of contacts and click the phone number associated with the contact

The Phone numbers returned by the Method are ok until I click a number above the last number I click in the list.

Once I do this it appears the Method no longer works correctly.  I have tried multiple patterns which return multiple results.  The only consistency is the fact the phone numbers returned will not be correct unless you happen to get the pattern I tested below... Once this pattern happens, you will have the phone number be correct when you click to dial the phone number that is being repeated (1234567892).

i.e.  I have the following phone numbers in a list of contact.  All Contacts are different
1234567890
1234567891
1234567892
1234567893
1234567894

1st Click to Dial: 1234567890 Returns: 1234567890
2nd Click to Dial: 1234567891 Returns: 1234567891
3rd Click to Dial: 1234567892 Returns: 1234567892
4th Click to Dial: 1234567893 Returns: 1234567893
5th Click to Dial: 1234567894 Returns: 1234567894
Go back to the top of the list
6th Click to Dial: 1234567890 Returns: 1234567890
7th Click to Dial: 1234567891 Returns: 1234567892
8th Click to Dial: 1234567892 Returns: 1234567892
9th Click to Dial: 1234567893 Returns: 1234567892
10th Click to Dial: 1234567894 Returns: 1234567892
All other Click to Dial attempts result in phone number "1234567892" being returned until I refresh the page.  After refreshing the page, the pattern may change.

Has anyone else seen this issue...  Not sure how this has not been noticed until now.

I tried this with Open CTI API 25 and 32... Same results

Is there a specific sequence of API calls that have to be performed... maybe a History refresh after every Click to Dial

Any help would be appreciated

Thanks

Hello,

 

I'm having difficulty with CTI Toolkit 4.0 with regard to Autologin:  I turn off autologin (to the phone system) as described at https://login.salesforce.com/help/doc/en/cti_login.htm, and then I close my browser.  When I restart the browser and log in to Salesforce again, I get unexpectedly automatically logged in to the phone system.  It didn't do this with Toolkit 3.0.

 

Does anybody else have this problem, or is able to offer help towards a solution, please?

 

Thanks,

 

James.

Hi everybody,

I was wondering what may be the points I can use to push my customer to move to toolkit V4.0?

 

I already have developed a v3.0.0 toolkit in C#, move it to V3.0.1. It runs successfully. So now I have an hard time to figure out what may be the advantage for my customer to move to V4.0

I can see easily the cost :

1) need to find a free port on all computer in the organization

2) need to deploy a certificate for each computer in the organization (and probably also a mechanism to renew it, all this included in the setup).

3) more line of code under maintenance.

...

But what are the gains?

 

Maybe it is good only for people starting from scratch?

 

Thanks

 

Eric

Hi everyone,

with the new toolkit 4.0, and its new architecture, is it possible to remove the adapter from the computer of the user, and to centralize it on a server?

At least it require:

 1) that the browser can connect to non local URL to fetch the XML stream.

 2) that the AdapterLib be thread safe if we want to share multiple session in the same process.

 

And maybe other points.

 

Is it a supported scenario in 4.0? And if not, will it be a supported scenario in a future version? When ?

 

Thanks

 

Eric

Hello,

 

I am in the process of upgrading our current Connector product from the old Toolkit 1.54 to the lates 3.01 version.

However I am having a problem with saving data from the login form created by our application. Everything works correctly with 1.54 version, however when using the same code upgraded to 3.01 there's an error in Salesforce and no user data is saved.

 

In Salesforce's logs:

 

CTI 1.54:

 

07/06/2011 10:44:25: CCTIAppExchange::GetValueFromQuery: Got value from query: ClientName: CTI/

07/06/2011 10:44:25: CCTIAppExchangeSaveThread::ThreadSaveUserParams: Created SObjects; saving login data to Custom Setup tables.

07/06/2011 10:44:26: CCTIAppExchangeSaveThread::ThreadSaveUserParams: Save complete.

 

And data is saved OK

 

CTI 3.01:

 

07/05/2011 17:27:18: CCTIAppExchange::GetValueFromQuery: Query: Select c.ClientName From CustomSetupDefinition c Where KeyPath='CTI/AGENT_ID'

07/05/2011 17:27:18: CCTIAppExchange::GetValueFromQuery: Error getting query results: INVALID_TYPE: sObject type 'customsetupdefinition' is not supported. If you are attempting to use a custom object, be sure to append the '__c' after the entity name. Please reference your WSDL or the describe call for the appropriate names..

07/05/2011 17:27:18: CCTIAppExchange::GetValueFromQuery: Got value from query: ClientName:

07/05/2011 17:27:19: Detected assigned campaign cp_sap

07/05/2011 17:27:19: CCTIAppExchangeSaveThread::ThreadSaveUserParams: COM error setting up custom setup objects: INVALID_TYPE: sObject type 'CustomSetup' is not supported. If you are attempting to use a custom object, be sure to append the '__c' after the entity name. Please reference your WSDL or the describe call for the appropriate names..

07/05/2011 17:27:19: CCTIAppExchangeSaveThread::ThreadSaveUserParams: Created SObjects; saving login data to Custom Setup tables.

07/05/2011 17:27:19: CCTIAppExchangeSaveThread::ThreadSaveUserParams: Save complete.

 

 

I am using Developer Edition. Is this failure related to that?

 

The only info I could find relating to my issue is in the official FAQ:

 

My CTI login credentials seem to be saving themselves for admins but not for standard users. How do I fix this?

This is a known issue with the CustomSetup table we save those settings to, and there's not an easy fix for it, or else we would have done it already. Login credentials are only saved for those users with the "Customize Application" profile permission. We plan to move the credentials into the Windows Registry instead under HKEY_CURRENT_USER, but we will not do so until a later release of the CTI Toolkit. You can implement it sooner if you want, it is quite simple.

To do this, you can provide an overrided version of CCTIAppExchange -- just make a subclass of it and override CCTIUserInterface::GetAppExchange() to return your subclass instead of the base class. In your subclass, override SaveUserParams and LoadUserParamsFromCustomSetup to save them to and load them from the Windows registry instead. That will fix the problem.

 

Does this mean that in a live (production) environment we'll only be able to save "agent data" for privileged users and we must implement those overrides for the solution to run correctly?

Do we require a Client ID for this to work in toolkit 3.01?

 

Thanks for your help!

 

--

jars

  • July 06, 2011
  • Like
  • 0

Hello all,

 

I am in the process of upgrading our Salesforce Connector product to Salesforce CTI Toolkit 3.01.

 

I've seen in the release notes that there's a new message that's supposed to allow supporting DTMF ("New ADD_DIALPAD_NUMBER message to support DTMF").

The problem is that I see no example showing how to make this work. Dial pads, as far as I could see, are always associated with a given operation (DIAL, TRANSFER or CONFERENCE). I find it strange to send DTMF from a TRANSFER or CONFERENCE related dialpad.

Could somebody please redirect me to an example or explain how this new feature should be used?

 

Thanks!

 

--

jars

  • July 05, 2011
  • Like
  • 0

Hello,

 

I am migrating existing code to work with CTI Toolkit 2.0. I was able to compile and run the new version, haven't start to play around with the new features though.

 

However I took a look at the logs and found some errors for which I couldn't get any information.

Could someone help?

 

These are the relevant log entries:

 

05/25/2010 13:37:32: CreateLoginForm()
05/25/2010 13:37:32: receiving 291 characters in message <?xml version="1.0" encoding="UTF-8"?><MESSAGE ID="UPDATE_SID">
<PARAMETER NAME="INSTANCE" VALUE="https://prerelna1.pre.salesforce.com"/><PARAMETER NAME="SID" VALUE="00Dt0000000Agih!AQoAQEMzqMEwD9msgMcxWn5ziNssjIFNdxAsEFEJWc_doLPN898DFUttHfcYNYkZSlSER7zZGs.7xWPxpluY1u7dlA14Pz8Y"/></MESSAGE>
05/25/2010 13:37:32: CCTIUserInterface::UIHandleMessage: Message received: UPDATE_SID.  Parameters: INSTANCE=https://prerelna1.pre.salesforce.com; SID=00Dt0000000Agih!AQoAQEMzqMEwD9msgMcxWn5ziNssjIFNdxAsEFEJWc_doLPN898DFUttHfcYNYkZSlSER7zZGs.7xWPxpluY1u7dlA14Pz8Y;
05/25/2010 13:37:32: CCTIAppExchange::SetSessionInstanceAndSid: Setting URL to https://prerelna1.pre.salesforce.com/services/Soap/c/17.0
05/25/2010 13:37:33: CCTIAppExchange::SetSessionInstanceAndSid: Setting SID to 00Dt0000000Agih!AQoAQEMzqMEwD9msgMcxWn5ziNssjIFNdxAsEFEJWc_doLPN898DFUttHfcYNYkZSlSER7zZGs.7xWPxpluY1u7dlA14Pz8Y
05/25/2010 13:37:33: CCTIAppExchange::UpdateSid: New user detected!  Updating cached information.
05/25/2010 13:37:33: UserId set to 005t0000000uv42AAA.
05/25/2010 13:37:33: CCTIAppExchange::UpdateSid: User José Silva authenticated.
05/25/2010 13:37:33: CCTIAppExchange::SetSessionInstanceAndSid: Setting URL to https://prerelna1.pre.salesforce.com/services/Soap/c/17.0
05/25/2010 13:37:33: CCTIAppExchange::SetSessionInstanceAndSid: Setting URL to https://prerelna1.pre.salesforce.com/services/Soap/c/17.0
05/25/2010 13:37:33: CCTIAppExchange::LoadUserParamsFromCustomSetup: Error loading user params from CustomSetup: INVALID_TYPE: sObject type 'customsetup' is not supported. If you are attempting to use a custom object, be sure to append the '__c' after the entity name. Please reference your WSDL or the describe call for the appropriate names..
05/25/2010 13:37:33: CCTIAppExchange::SetSessionInstanceAndSid: Setting SID to 00Dt0000000Agih!AQoAQEMzqMEwD9msgMcxWn5ziNssjIFNdxAsEFEJWc_doLPN898DFUttHfcYNYkZSlSER7zZGs.7xWPxpluY1u7dlA14Pz8Y

...

05/25/2010 13:37:36: OnCTIConnection called.
05/25/2010 13:37:36: Sending XML (len 606): <CTIUserInterface LOGGED_IN="false"><CTIForm><CTIEditBox ID="CUSTOM1" LABEL="uCI Instance Name" VALUE=""/><CTIEditBox ID="AGENT_ID" LABEL="uCI Agent Id" VALUE=""/><CTIEditBox ID="PASSWORD" PASSWORD="true" VALUE=""/><CTIEditBox ID="CUSTOM2" LABEL="uCI Site" VALUE=""/><CTIEditBox ID="EXTENSION" VALUE=""/><CTICheckbox CHECKED="false" ID="CUSTOM4" LABEL="Automatic Login"/><CTIButton COLOR="GREEN" ID="LOGIN" LONG_STYLE="true"/></CTIForm><CTILogo IMAGE_URL="whatever"/></CTIUserInterface>
05/25/2010 13:38:05: receiving 324 characters in message <?xml version="1.0" encoding="UTF-8"?><MESSAGE ID="LOGIN">
<PARAMETER NAME="AGENT_ID" VALUE="someone"/><PARAMETER NAME="CUSTOM1" VALUE="server:1500"/><PARAMETER NAME="CUSTOM2" VALUE="porto"/><PARAMETER NAME="CUSTOM4" VALUE="false"/><PARAMETER NAME="EXTENSION" VALUE="1"/><PARAMETER NAME="PASSWORD" VALUE=""/></MESSAGE>
05/25/2010 13:38:05: CCTIUserInterface::UIHandleMessage: Message received: LOGIN.  Parameters:
05/25/2010 13:38:05: Sending XML (len 248): <CTIUserInterface LOGGED_IN="false"><CTIProgressBar ID="LOGGING_IN" LABEL=""/><CTILogo IMAGE_URL="whatever"/></CTIUserInterface>
05/25/2010 13:38:05: Sending XML (len 648): <CTIUserInterface LOGGED_IN="false"><CTIProgressBar ID="LOGGING_IN" LABEL=""/><CTIForm><CTIEditBox ID="CUSTOM1" LABEL="uCI Instance Name" VALUE=""/><CTIEditBox ID="AGENT_ID" LABEL="uCI Agent Id" VALUE=""/><CTIEditBox ID="PASSWORD" PASSWORD="true" VALUE=""/><CTIEditBox ID="CUSTOM2" LABEL="uCI Site" VALUE=""/><CTIEditBox ID="EXTENSION" VALUE=""/><CTICheckbox CHECKED="false" ID="CUSTOM4" LABEL="Automatic Login"/><CTIButton COLOR="GREEN" ID="LOGIN" LONG_STYLE="true"/></CTIForm><CTILogo IMAGE_URL="whatever"/></CTIUserInterface>
05/25/2010 13:38:05: CCTIAppExchange::GetValueFromQuery: Query: Select c.ClientName From CustomSetupDefinition c Where KeyPath='CTI/AGENT_ID'
05/25/2010 13:38:06: CCTIAppExchange::GetValueFromQuery: Error getting query results: INVALID_TYPE: sObject type 'customsetupdefinition' is not supported. If you are attempting to use a custom object, be sure to append the '__c' after the entity name. Please reference your WSDL or the describe call for the appropriate names..
05/25/2010 13:38:06: CCTIAppExchange::GetValueFromQuery: Got value from query: ClientName:
05/25/2010 13:38:06: CCTIAppExchangeSaveThread::ThreadSaveUserParams: COM error setting up custom setup objects: INVALID_TYPE: sObject type 'CustomSetup' is not supported. If you are attempting to use a custom object, be sure to append the '__c' after the entity name. Please reference your WSDL or the describe call for the appropriate names..

 

These error messages weren't appearing for CTI toolkit 1.54. What might be wrong?

 

Thanks,

jars

  • May 25, 2010
  • Like
  • 0