Author Archive: Jim Johnson

Adding Duration Field to Captivate Content in Adobe Connect

One common thing content publishers may notice is that Captivate content (by default) doesn’t get a ‘duration’ field in the Adobe Connect UI (as seen below in the first screenshot).  If you want this field (if it is applicable to your Captivate content), follow the steps below:

Notice no ‘Duration’ field information in the Captivate Project by default.

In order to get the duration field to populate for Captivate content (as of now with Captivate 7), you can manually add the ‘Duration’ field to the breeze-manifest.xml file before you upload / publish to Adobe Connect.

First, instead of publishing to Adobe Connect directly, you need to publish locally to the desktop using the SWF/HTML5 publish option (below):

In the Publish menu, select SWF/HTML5 option and publish locally.

 

Once you do this, you then need to navigate to the source project files and find the ‘breeze-manifest.xml‘ file that is included:

 

Navigate to where you saved the project locally and open the breeze-manifest.xml file.

 

When you open the xml file in an editor, you will see the following format (it will look different depending on your quiz content, etc):

 

By default, there will be no ‘duration’ field in the document XML node.

 

You would then add duration=”xx” ‘ to the ‘document’ XML node as follows:

 

Add ‘duration=’ to the xml as shown above and manually put your duration (in seconds).

 

You will need to manually calculate the duration of the entire Captivate presentation (again if applicable) and then put that value in here (in seconds).  When you do this, the slide count should also be visible in the published output.

Then, save the file and zip up your entire project again to a zip file (don’t zip up a folder full of the project files, but rather all the source files without a containing folder).  Upload the zip as Content manually in the Content directory.

 

You will see duration now (slides and time) in the final output.

XML API Tips: Listing Users’ Telephony Profiles

As an Administrator, often times you may want to view other users’ telephony profiles in order to troubleshoot issues or administer additional profiles, etc.  From the UI, there is no way easy way to get at other users’ audio profiles.  From the API perspective, there is one method that often goes unlooked (although it is documented).

The ‘telephony-profile-list‘ API will only show the caller’s telephony profiles unless you actually specify a principal-id in the call.  If you specify the additional ‘principal-id=XXXXXXXX‘ parameter, you will get the list of all that users’ telephony profiles.  You can then obtain the profile-id of a specific profile, and continue to fetch additional information by using the ‘telephony-profile-info’ API call to get all the fields and values you are looking for, for that specific profile.

Here is an example of how to fetch the list of other users’ telephony profiles on the system:

First, log in as an Administrator.

Then find the users’ principal-id you want to search on.

Lastly, run this call to get the list of that users’ telephony profiles:

https://my.adobeconnect.com/api/xml?action=telephony-profile-list&principal-id=12345678

Result:

<results>
<status code=”ok”/>
<telephony-profiles>
<profile profile-id=”123456789″ provider-id=”234567890″ profile-status=”enabled”>
<adaptor-id>arkadin-adaptor</adaptor-id>
<name>Arkadin</name>
<profile-name>My Arkadin Profile</profile-name>
</profile>
<profile profile-id=”987654321″ provider-id=”098765432″ profile-status=”enabled”>
<adaptor-id>intercall-adaptor</adaptor-id>
<name>InterCall</name>
<profile-name>My InterCall Profile</profile-name>
</profile>
</telephony-profiles>
</results>

XML API Tips: Identifying a Sco’s Owner

A common ask from users is how to identify the creator of a content object or meeting, etc. in Adobe Connect.  Sometimes it’s easy to decipher (from an Admin perspective) who ‘owns’ a meeting, by seeing the specific meeting (for example) in a specific user’s ‘User Meeting’ folder.  However that doesn’t necessarily mean that they ‘created’ the meeting.  Also, if a meeting is sitting in the Shared Meetings area, and you want to know who created the meeting initially, it wouldn’t be possible (via the UI).  In order to see who created the object or meeting, you can use the ‘sco-by-url’ API call.  Here’s how:

As an Administrator, log in and find the URL of the meeting or sco in question.

Then, formulate the web service call as such:

https://{connectDomain}/api/xml?action=sco-by-url&url-path=XXXXXXX

Where the url-path = the actual custom (or auto generated) url path of your meeting or content.  The format will look like this: ‘/myMeeting/’.

Here’s an example:

Call:

https://my.adobeconnect.com/api/xml?action=sco-by-url&url-path=/jimssharedmeeting/

Result:

<results>
<status code=”ok”/>
<owner-principal type=”content” principal-id=”12345678″ account-id=”87654321″ has-children=”false” is-hidden=”false” is-primary=”false” tos-status=””>
<ext-login>jimjohnson@mycompany.com</ext-login>
<login>jimjohnson@mycompany.com</login>
<name>Jim Johnson</name>
<email>jimjohnson@mycompany.com</email>
</owner-principal>
<sco sco-id=”123456789″ account-id=”87654321″ display-seq=”0″ folder-id=”12345678″ icon=”meeting” lang=”en” max-retries=”” source-sco-id=”98765432″ type=”meeting” version=”0″>
<url-path>/jimssharedmeeting/</url-path>
<date-begin>2014-03-31T09:00:00.000-04:00</date-begin>
<date-created>2014-03-31T09:10:12.220-04:00</date-created>
<date-end>2014-03-31T10:00:00.000-04:00</date-end>
<date-modified>2014-03-31T09:10:12.220-04:00</date-modified>
<name>Jim’s Shared Meeting</name>
</sco>
</results>

Where is my Engagement Dashboard?

At some point you may want to use the Engagement Dashboard to track your users’ attentiveness in an Adobe Connect Meeting room, but wonder where oh where it may be…  You glance up at your Pods menu (as a host) and see it is not listed.  You may wonder why.  Well, here’s why…

If you want to use the Engagement Dashboard, one of the following scenarios has to be true:

  • You are a Seminar Host and created a Seminar Room.  Seminar Rooms have the Engagement Dashboard in the Presenter Only Area.
  • You are an Event Manager and created an Event that points to a meeting, seminar room, or virtual classroom, in the Event Management area of Adobe Connect.  If you point an Event to any meeting, virtual classroom, or seminar room, it will have the Engagement Dashboard in the Presenter Only Area.
  • You are a Training Manager AND Meeting Host and you create a Virtual Classroom (you must be both to even create a VC in the first place), it will have the Engagement Dashboard in the Presenter Only Area.
  • You are an Meeting Host AND Event Manager and you create a Meeting (just being a Meeting Host will NOT give you access to the Engagement Dashboard).  Only then will the Meeting have an Engagement Dashboard in the Presenter Only Area.

Situation where you will have a room open and you won’t have the Engagement Dashboard as a Pod option:

  • You are a Meeting Host but NOT an Event Manager as well.  You will not see the Engagement Dashboard in the available pods and it will not be in the Presenter Only Area.

Additional Resources around the Engagement Dashboard…

http://blogs.adobe.com/adobeconnect/2012/06/sneak-peek-the-engagement-dashboard.html

https://www.connectusers.com/tutorials/2013/06/rules_of_engagement/index.php

engage1

engagement2

How to stop Event pages (CQ) from being indexed

This article (and link below) is intended for Licensed (On-Premise) customers who have a standalone instance or cluster of CQ servers to serve up the Events Management piece of the Adobe Connect platform.  If you would like to stop event pages from being indexed in search engines like Google, you can follow this quick article below on adding robots.txt to the root of the CQ instances.

http://crxdelight.com/2012/02/04/how-to-protect-your-cq-instances-from-google-searches/

Adobe Connect Directory Service Integration for LDAP Sync and Authentication – Explained

The following article is intended to show how the directory service integration works with the current release of Adobe Connect 9.1 and how it relates to setting up a synchronization. I will follow this article up with another regarding Authentication.  For the most part, this is applicable for any flavor of Adobe Connect 8 or 9.  Continue reading…

Identifying Telephony Disconnects

One common request from Adobe Connect users is to find out why a user may have gotten disconnected from a conference call while using Adobe Connect.  The important thing to realize here is that Adobe Connect will only disconnect a user from a conference call (with integrated telephony adaptor in place) if that user or a host in the meeting very deliberately choses one of a couple of options to disconnect the user.

The options for the in-meeting telephony disconnects are shown below:

tel1

This is what an individual user can access to disconnect their phone.

tel2

This is what a Meeting Host can do in the Attendee List pod, to hang up a user’s line.

Other than using these options, Adobe Connect does NOT send API commands to the telephony provider to hang up a conference user.  So a common scenario we may have is to identify whether Adobe hung up a user (via a very deliberate action) or whether the user was hung up by an external action (external to Adobe Connect). We do so by looking at the Adobe logs in conjunction with the Telephony Provider’s logs (PGI, InterCall, MeetingOne, Arkadin, etc).

On the Telephony Provider side, they can also differentiate between receiving an API from Adobe to disconnect a user vs just getting notification that the line is no longer active (which happens when a user is hung up for a reason between the Provider and Adobe).

User phone connections can drop for a variety of reasons.  Cell phone reception being dropped, IP phone connections (relying on an internet connection) going up and down (VPN, etc), user accidentally hanging up their own phone, a provider or carrier setting that sets a maximum connection time that gets exceeded, or a general carrier outage or issue in between Adobe and the Provider.  This is the most common.  Sometimes we see where a specific carrier will have a routing issue or other type of problem and it will interrupt that user’s connection to the conference.  These are outside of the realm of Adobe support and what needs to happen in this case is that the users must open a ticket with their Provider and through their Provider, they can have them track the possible route of the calls through the specific carriers involved, to see where the disconnect and problem occurred.

With regards to log analysis (overview article of the applicable logs needed), here is a breakdown (example) of the two scenarios for each of the main telephony providers we serve on our Hosted and Licensed environment (sans Avaya). ( I have ‘x’ed out some items like urls, conference codes, and phone numbers ):

MeetingOne

For an Adobe responsible hangup (deliberate):

In the meeting (application.log) log we will see:

2014-01-23 08:39:02 5552 (s)2641173 TelephonyServiceConnector, Calling action: conference-call-out -
2014-01-23 08:39:02 5552 (s)2641173 Asc-Telephony IS_HANG_UP_USER Hangup a user. TS CALL-10 conference-call-out -
2014-01-23 08:39:02 5552 (s)2641173 Asc-Telephony IS_HANG_UP_USER Hangup a user. TS RESP-10 conference-call-out -

In the MeetingOne_Adaptor.log we will see:

Jan 23, 2014 8:39:02 AM com.meetingone.adobeconnect.MeetingOneAdobeConnectAdaptor hangUp
INFO: entering hangUp
confId=5471dac0-fda8-4319-b8fe-c6b2a6942e73telephonyUserId=29834e741439299a5f251ed
Jan 23, 2014 8:39:02 AM com.meetingone.adobeconnect.bridge.BridgeProxyImpl hangUp
INFO: Bridge proxy – hangUp
Jan 23, 2014 8:39:02 AM com.meetingone.adobeconnect.bridge.BridgeProxyImpl sendXML2APIServer
INFO: posting xml to http://xxxxxxxxxx:80/api/audio?token=BRZ5930ecc7e013c5e76828ba7714390c7ae1d1b8

In the TelephonyService.log we will see:

[2014-01-23 08:39:02,255] [FCSj_Worker:8] (DEBUG) rtmp.RTMPConnection – Calling telephony action on request from MeetingApp. action: conference-call-out, parameters: {telephony-user-id=29834e741439299a5f251ed, conference-id=5471dac0-fda8-4319-b8fe-c6b2a6942e73, unset=true, action=conference-call-out, adaptor-id=meetingone-adaptor}
[2014-01-23 08:39:02,768] [FCSj_Worker:8] (DEBUG) rtmp.RTMPConnection – Returning telephony action response to MeetingApp. acrion: conference-call-out, response: {code=ok}

For an external hangup (not due to Adobe):

In the meeting (application.log) log we will see:

2014-01-23 08:51:47 5552 (s)2641173 Asc-UserManager IS_SET_USER_PHONE_STATUS set user phone status  { userID=1, phoneStatus=0 } -
2014-01-23 08:51:47 5552 (s)2641173 shouldBeKilled p_userID=1 advUserDesc.isNotInLive=false -
2014-01-23 08:51:47 5552 (s)2641173 dispatchEventToClient: p_evtObj.type=userPhoneStatusChanged p_isAdvancedEvent=true -
2014-01-23 08:51:47 5552 (s)2641173 dispatchRPCEventToClient: userId=1 p_evtObj.type=userPhoneStatusChanged -

In the MeetingOne_Adaptor.log we will see:

Jan 23, 2014 8:51:47 AM com.meetingone.adobeconnect.bridge.BridgeProxyEventPump parseEvents
INFO: <?xml version=”1.0″ encoding=”UTF-8″?>
<m1_api_events>
<api_response id=”29834e74:1439299a5f2:-514b” status=”0″ >
<events>
<event source_id=”xxxxxxxxxx” source=”audio” timestamp=”2014-01-23T09:49:59.458-07:00″ id=”2706933″><type>OnHangUp</type><parameters count=”4″><int_param name=”status”>0</int_param><string_param name=”participant_id”>81652</string_param><string_param name=”room_id”></string_param><int_param name=”reason”>0</int_param></parameters></event>
</events>
</api_response>
</m1_api_events>
Jan 23, 2014 8:51:47 AM com.meetingone.adobeconnect.bridge.messageDispatcher run
INFO: processing events…
Jan 23, 2014 8:51:47 AM com.meetingone.adobeconnect.bridge.messageDispatcher run
INFO: received event OnHangUp
Jan 23, 2014 8:51:47 AM com.meetingone.adobeconnect.bridge.messageDispatcher ProcessHangupResponse
INFO: ProcessHangupResponse
Jan 23, 2014 8:51:47 AM com.meetingone.adobeconnect.bridge.BridgeProxyEventPump GetEvents
INFO: Get events

In the TelephonyService.log we will see:

[2014-01-23 08:51:47,249] [Timer-6] (DEBUG) rtmp.RTMPConnection  - Calling MeetingApp method. methodName: telephonyUserOffline, parameters: {telephony-user-id=29834e741439299a5f25157, conference-id=5471dac0-fda8-4319-b8fe-c6b2a6942e73}

 

Arkadin

For an Adobe responsible hangup (deliberate):

In the meeting (application.log) log we will see:

2014-01-24 11:47:45 42656 (s)2641173 TelephonyServiceConnector, Calling action: conference-call-out -
2014-01-24 11:47:45 42656 (s)2641173 Asc-Telephony IS_HANG_UP_USER Hangup a user. TS CALL-10 conference-call-out -
2014-01-24 11:47:45 42656 (s)2641173 Asc-Telephony IS_HANG_UP_USER Hangup a user. TS RESP-10 conference-call-out -

In the Arkadin_Adaptor.log we will see:

[11:47:45] – [Verbose] [122421585] =>Bamboo : POST: <Arka_Trans MessageId=”Adobe2285″>    <Arka_Drop UserId=”111248954663623″ ResponseURL=”https://xxxxxxx.adobeconnect.com/servlet/bamboo” ConfId=”6505088d-bf01-4b66-8b7c-35e2cf195a06\1″ MessageId=”Adobe2284″/></Arka_Trans>
[11:47:45] – [Info] [122421585] drop(122421585<6505088d-bf01-4b66-8b7c-35e2cf195a06\1>, Jim Johnson<111248954663623>)
[11:47:45] – [Verbose] [122421585] <=Adobe : hangUp(122421585, 7b15ec77-3c0a-439f-bc7f-d1fd77eb593b);
[11:47:46] – [Verbose] [122421585] =>Adobe : userOffline(7b15ec77-3c0a-439f-bc7f-d1fd77eb593b)
[11:47:46] – [Info] [122421585] PARTICIPANT_LEFT(122421585<6505088d-bf01-4b66-8b7c-35e2cf195a06\1>, Jim Johnson<111248954663623>)
[11:47:46] – [Verbose] [122421585] <=Bamboo : <Arka_NotifyUserLeave ConfId=”6505088d-bf01-4b66-8b7c-35e2cf195a06\1″ MessageId=”18″ UserId=”111248954663623″/>

In the TelephonyService.log we will see:

[2014-01-24 11:47:45,272] [FCSj_Worker:6] (DEBUG) rtmp.RTMPConnection – Calling telephony action on request from MeetingApp. action: conference-call-out, parameters: {telephony-user-id=7b15ec77-3c0a-439f-bc7f-d1fd77eb593b, conference-id=xxxxxxxxxx, unset=true, action=conference-call-out, adaptor-id=arkadin-adaptor}
[2014-01-24 11:47:45,272] [FCSj_Worker:6] (DEBUG) rtmp.RTMPConnection – Returning telephony action response to MeetingApp. acrion: conference-call-out, response: {code=ok}
[2014-01-24 11:47:46,600] [Thread :: bambooEvents] (DEBUG) rtmp.RTMPConnection – Calling MeetingApp method. methodName: telephonyUserOffline, parameters: {telephony-user-id=7b15ec77-3c0a-439f-bc7f-d1fd77eb593b, conference-id=xxxxxxxxxx}

For an external hangup (not due to Adobe):

In the meeting (application.log) log we will see:

2014-01-24 12:14:49 26224 (s)2641173 Asc-UserManager IS_SET_USER_PHONE_STATUS set user phone status { userID=2, phoneStatus=0 } -
2014-01-24 12:14:49 26224 (s)2641173 shouldBeKilled p_userID=2 advUserDesc.isNotInLive=true -
2014-01-24 12:14:49 26224 (s)2641173 dispatchEventToClient: p_evtObj.type=userPhoneStatusChanged p_isAdvancedEvent=true -
2014-01-24 12:14:49 26224 (s)2641173 dispatchRPCEventToClient: userId=2 p_evtObj.type=userPhoneStatusChanged -
2014-01-24 12:14:49 26224 (s)2641173 Remove the user 2 -
2014-01-24 12:14:49 26224 (s)2641173 Asc-UserManager IS_REMOVE_USER Removing user. { userID=2, eject=undefined } -

In the Arkadin_Adaptor.log we will see:

[12:14:49] – [Verbose] [122421585] <=Bamboo : <Arka_NotifyUserLeave ConfId=”9e73d0b5-0525-4e17-9d77-af7a1e42a0e7\1″ MessageId=”9″ UserId=”26147684307333456″/>
[12:14:49] – [Info] [122421585] PARTICIPANT_LEFT(122421585<9e73d0b5-0525-4e17-9d77-af7a1e42a0e7\1>, xxxxxxxxxx<26147684307333456>)
[12:14:49] – [Verbose] [122421585] =>Adobe : userOffline(4d267465-ebd1-4968-893c-1428e61eaa2b)

In the TelephonyService.log we will see:

[2014-01-24 12:14:49,679] [Thread :: bambooEvents] (DEBUG) rtmp.RTMPConnection – Calling MeetingApp method. methodName: telephonyUserOffline, parameters: {telephony-user-id=4d267465-ebd1-4968-893c-1428e61eaa2b, conference-id=122421585}

 

InterCall

For an Adobe responsible hangup (deliberate):

In the meeting (application.log) log we will see:

2014-01-24 12:41:38 80764 (s)2641173 TelephonyServiceConnector, Calling action: conference-call-out -
2014-01-24 12:41:38 80764 (s)2641173 Asc-Telephony IS_HANG_UP_USER Hangup a user. TS CALL-10 conference-call-out -
2014-01-24 12:41:38 80764 (s)2641173 Asc-Telephony IS_HANG_UP_USER Hangup a user. TS RESP-10 conference-call-out -

In the Intercall_Adaptor.log we will see:

[2014-01-24 12:41:38,208] [FCSj_Worker:11] (DEBUG) Intercall.IntercallConference – FCSj_Worker:11:com.macromedia.breeze_ext.telephony.Intercall.IntercallConference:hangUp:Intercall-1.3:intercall-adaptor:Conference Code: xxxxxxxxx
[2014-01-24 12:41:38,208] [FCSj_Worker:11] (DEBUG) Intercall.IntercallConference – FCSj_Worker:11:com.macromedia.breeze_ext.telephony.Intercall.IntercallConference:hangUp:Intercall-1.3:intercall-adaptor:Conversation Id: xxxxxx.adobeconnect.com_intercall-adaptor_323_-555337
[2014-01-24 12:41:38,208] [FCSj_Worker:11] (DEBUG) Intercall.IntercallConference – FCSj_Worker:11:com.macromedia.breeze_ext.telephony.Intercall.IntercallConference:hangUp:Intercall-1.3:intercall-adaptor:Connect part Id: Jim Johnson_196253313@1-xxx-xxx-xxxx
[2014-01-24 12:41:38,208] [FCSj_Worker:11] (DEBUG) Intercall.IntercallConference – FCSj_Worker:11:com.macromedia.breeze_ext.telephony.Intercall.IntercallConference:hangUp:Intercall-1.3:intercall-adaptor:Intercall part Id: 1
[2014-01-24 12:41:38,208] [FCSj_Worker:11] (DEBUG) Intercall.IntercallConference – FCSj_Worker:11:com.macromedia.breeze_ext.telephony.Intercall.IntercallConference:hangUp:Intercall-1.3:intercall-adaptor:Hanging up user

In the TelephonyService.log we will see:

[2014-01-24 12:41:38,208] [FCSj_Worker:11] (DEBUG) rtmp.RTMPConnection – Calling telephony action on request from MeetingApp. action: conference-call-out, parameters: {telephony-user-id=Jim Johnson_196253313@1-xxx-xxx-xxxx, conference-id=xxxxxx.adobeconnect.com_intercall-adaptor_323_-555337, unset=true, action=conference-call-out, adaptor-id=intercall-adaptor}
[2014-01-24 12:41:38,302] [FCSj_Worker:11] (DEBUG) rtmp.RTMPConnection – Returning telephony action response to MeetingApp. acrion: conference-call-out, response: {code=ok}

For an external hangup (not due to Adobe):

In the meeting (application.log) log we will see:

2014-01-27 11:09:58 99308 (s)2641173 Asc-UserManager IS_SET_USER_PHONE_STATUS set user phone status { userID=2, phoneStatus=0 } -
2014-01-27 11:09:58 99308 (s)2641173 shouldBeKilled p_userID=2 advUserDesc.isNotInLive=true -
2014-01-27 11:09:58 99308 (s)2641173 dispatchEventToClient: p_evtObj.type=userPhoneStatusChanged p_isAdvancedEvent=true -
2014-01-27 11:09:58 99308 (s)2641173 dispatchRPCEventToClient: userId=2 p_evtObj.type=userPhoneStatusChanged -
2014-01-27 11:09:58 99308 (s)2641173 Remove the user 2 -
2014-01-27 11:09:58 99308 (s)2641173 Asc-UserManager IS_REMOVE_USER Removing user. { userID=2, eject=undefined } -

In the Intercall_Adaptor.log we will see:

[2014-01-27 11:09:58,902] [http-bio-9443-exec-6] (DEBUG) Intercall.IntercallEventHandler – http-bio-9443-exec-6:com.macromedia.breeze_ext.telephony.Intercall.IntercallEventHandler:onEvent:Intercall-1.3::Event received:
[2014-01-27 11:09:58,902] [http-bio-9443-exec-6] (DEBUG) Intercall.IntercallEventHandler – http-bio-9443-exec-6:com.macromedia.breeze_ext.telephony.Intercall.IntercallEventHandler:onEvent:Intercall-1.3::Got events for conversation xxxxxx.adobeconnect.com_intercall-adaptor_251_-523503: com.intercall.www.CCAPICallback.xsd.spi.event.ParticipantLeftEvent@ceebb956
[2014-01-27 11:09:58,902] [http-bio-9443-exec-6] (DEBUG) Intercall.IntercallCallback – http-bio-9443-exec-6:com.macromedia.breeze_ext.telephony.Intercall.IntercallCallback:onParticipantLeftEvent:Intercall-1.3:intercall-adaptor:Now handling ParticipantLeftEvent for conversation ID xxxxxx.adobeconnect.com_intercall-adaptor_251_-523503
[2014-01-27 11:09:58,902] [http-bio-9443-exec-6] (DEBUG) Intercall.IntercallConference – http-bio-9443-exec-6:com.macromedia.breeze_ext.telephony.Intercall.IntercallConference:removeParticipant:Intercall-1.3:intercall-adaptor:Conference Code:xxxxxxxx
[2014-01-27 11:09:58,902] [http-bio-9443-exec-6] (DEBUG) Intercall.IntercallConference – http-bio-9443-exec-6:com.macromedia.breeze_ext.telephony.Intercall.IntercallConference:removeParticipant:Intercall-1.3:intercall-adaptor:Conversation Id: xxxxxx.adobeconnect.com_intercall-adaptor_251_-523503
[2014-01-27 11:09:58,902] [http-bio-9443-exec-6] (DEBUG) Intercall.IntercallConference – http-bio-9443-exec-6:com.macromedia.breeze_ext.telephony.Intercall.IntercallConference:removeParticipant:Intercall-1.3:intercall-adaptor:ConnectPartId: 3
[2014-01-27 11:09:58,902] [http-bio-9443-exec-6] (DEBUG) Intercall.IntercallConference – http-bio-9443-exec-6:com.macromedia.breeze_ext.telephony.Intercall.IntercallConference:removeParticipant:Intercall-1.3:intercall-adaptor:Removing this participant

In the TelephonyService.log we will see:

 [2014-01-27 11:09:58,902] [http-bio-9443-exec-6] (DEBUG) rtmp.RTMPConnection  - Calling MeetingApp method. methodName: telephonyUserOffline, parameters: {telephony-user-id=3, conference-id=xxxxxx.adobeconnect.com_intercall-adaptor_251_-523503}

PGI

For an Adobe responsible hangup (deliberate):

In the meeting (application.log) log we will see:

2014-01-27 11:35:33 120876 (s)2641173 Asc-Telephony IS_HANG_UP_USER Hangup a user. TS CALL-10 conference-call-out -
2014-01-27 11:35:33 120876 (s)2641173 Asc-UserManager IS_SET_USER_PHONE_STATUS set user phone status { userID=2, phoneStatus=0 } -

In the Premiere_Adaptor.log we will see:

[2014-01-27 11:35:33,628] [FCSj_Worker:15] (DEBUG) gateway.PTekGateway – PREMIERE TEL v800.000[FCSj_Worker:15]com.macromedia.breeze_ext.premiere.gateway.PTekGateway.hangUp:628:hangUp request received for confId:xxxxxx telephonyUserId:2501-129866748
[2014-01-27 11:35:33,629] [FCSj_Worker:15] (DEBUG) gateway.PTekConnection – PREMIERE TEL v800.000[premiere-adaptor][FCSj_Worker:15]com.macromedia.breeze_ext.premiere.gateway.Util$LoggingOutputStream.flush:162:
<PremiereConferencing ID=”xxxxxx” MsgID=”107″ PW=”xxxxxxxx” WebID=”xxxxxx” WebPW=”xxxxxxxx”>
<HangupParticipant ConfID=”xxxxxx” PartID=”2501-129866748″/>
</PremiereConferencing>
[2014-01-27 11:35:33,913] [Thread-677] (DEBUG) gateway.ConnectionHandler – PREMIERE TEL v800.000[premiere-adaptor][Thread-677]com.macromedia.breeze_ext.premiere.gateway.Util$LoggingOutputStream.flush:162:
<PremiereConferencing>
<UnsolicitedPartInfo>
<Result ErrorCode=”0″/>
<Participant ANI=”xxxxxxxxxx” ConfID=”xxxxxx” Connected=”False” DNIS=”xxxxxxxxxx” EndDate=”20140127″ EndTime=”173533″ Hold=”False” InQA=”False” IsQATalker=”False” ListenLevel=”0″ ListenOnly=”False” Mute=”False” PartID=”2501-129866748″ PartType=”Normal” StartDate=”20140127″ StartTime=”173417″ SubConfID=”” VoiceLevel=”0″/>
</UnsolicitedPartInfo>
</PremiereConferencing>

In the TelephonyService.log we will see:

[2014-01-27 11:35:33,628] [FCSj_Worker:15] (DEBUG) rtmp.RTMPConnection – Calling telephony action on request from MeetingApp. action: conference-call-out, parameters: {telephony-user-id=2501-129866748, conference-id=xxxxxx, unset=true, action=conference-call-out, adaptor-id=premiere-adaptor}
[2014-01-27 11:35:33,913] [Thread-677] (DEBUG) rtmp.RTMPConnection – Calling MeetingApp method. methodName: telephonyUserOffline, parameters: {telephony-user-id=2501-129866748, conference-id=xxxxxx}

For an external hangup (not due to Adobe):

In the meeting (application.log) log we will see:

2014-01-27 11:38:03 120876 (s)2641173 Asc-UserManager IS_SET_USER_PHONE_STATUS set user phone status { userID=3, phoneStatus=0 } -
2014-01-27 11:38:03 120876 (s)2641173 shouldBeKilled p_userID=3 advUserDesc.isNotInLive=true -
2014-01-27 11:38:03 120876 (s)2641173 dispatchEventToClient: p_evtObj.type=userPhoneStatusChanged p_isAdvancedEvent=true -
2014-01-27 11:38:03 120876 (s)2641173 dispatchRPCEventToClient: userId=3 p_evtObj.type=userPhoneStatusChanged -
2014-01-27 11:38:03 120876 (s)2641173 Remove the user 3 -
2014-01-27 11:38:03 120876 (s)2641173 Asc-UserManager IS_REMOVE_USER Removing user. { userID=3, eject=undefined } -

In the Premiere_Adaptor.log we will see:

<Participant ANI=”xxxxxxxxxx” ConfID=”xxxxxxx” Connected=”False” DNIS=”xxxxxxxxxx” EndDate=”20140127″ EndTime=”173803″ Hold=”False” InQA=”False” IsQATalker=”False” ListenLevel=”0″ ListenOnly=”False” Mute=”False” PartID=”2501-130152300″ PartType=”Normal” StartDate=”20140127″ StartTime=”173634″ SubConfID=”” VoiceLevel=”0″/>
</UnsolicitedPartInfo>
</PremiereConferencing>
[2014-01-27 11:38:04,019] [Thread-677] (INFO ) gateway.ConnectionHandler  - PREMIERE TEL v800.000[premiere-adaptor][Thread-677]com.macromedia.breeze_ext.premiere.gateway.ConnectionHandler.onUnsolicitedPartInfoMsg:337:Got error code: 0

In the TelephonyService.log we will see:

 [2014-01-27 11:38:04,019] [Thread-677] (DEBUG) rtmp.RTMPConnection  - Calling MeetingApp method. methodName: telephonyUserOffline, parameters: {telephony-user-id=2501-130152300, conference-id=4040116}

 

LDAP Sync Log File Access

Scenario: You may be an Adobe Connect Administrator and want to access the LDAP sync logs to see who has been (via an LDAP sync) brought into Adobe Connect, removed from Adobe Connect, or has been added or removed from a group membership, and when.  The problem is that these logs are only accessible for the most part, on the server itself by a server admin who can log into the Configuration Console on the localhost and access them manually via the Directory Service area of the console.  This is not accessible from outside of the actual Connect server.

The solution is to use the API to find all the LDAP sync logs on the system (which are actually treated as content) and access them with just an Administrator username and password to the system.  Here’s how:

1) Log into the Adobe Connect interface as user with Administrator priviledges.
2) Assuming your Licensed account-id has not been changed, it will be ’7′ so you can make the following API call:

http://{serverURL}/api/xml?action=sco-expanded-contents&sco-id=7&filter-icon=logos

Where 7 is the account ID and you filter on ‘icon=logos’ (not sure why)…

Result will look like this (example response):

<results>
<status code=”ok”/>
<expanded-scos>
<sco depth=”2″ sco-id=”12345” folder-id=”11005″ type=”content” icon=”logos” lang=”en” source-sco-id=”” display-seq=”0″ source-sco-type=”” source-sco-icon=”” content-source-sco-icon=”” duration=””>
<name>{ds-sync}</name>
<url-path>/p5u78ftvvsi/</url-path>
<date-created>2013-10-29T20:10:17.660-04:00</date-created>
<date-modified>2014-01-14T21:42:27.150-05:00</date-modified>
</sco>
</expanded-scos>
</results>

The name of the item should be {ds-sync} (short for Directory Service Synchronization).

3) Then use the following call to get all sync logs under that folder:

http://{serverURL}/api/xml?action=sco-expanded-contents&sco-id=12345

Where the sco-id is the one from the first call and will be the sco-id of the sync folder (so yours will be different than my example of 12345)

It will list all sync logs with their scos (like below).

They all have a name format of: {sync-sco-preview} + the date.
They all have an icon=archive

4) Look for the one you want, and then navigate to the file via the URL (value in RED in the response below).

Example response:

<results>
<status code=”ok”/>
<expanded-scos>
<sco depth=”0″ sco-id=”12345″ folder-id=”11005″ type=”content” icon=”logos” lang=”en” source-sco-id=”” display-seq=”0″ source-sco-type=”” source-sco-icon=”” content-source-sco-icon=”” duration=””>
<name>{ds-sync}</name>
<url-path>/p5u78ftvvsi/</url-path>
<date-created>2013-10-29T20:10:17.660-04:00</date-created>
<date-modified>2014-01-14T21:42:27.150-05:00</date-modified>
</sco>
<sco depth=”1″ sco-id=”26150″ folder-id=”12345″ type=”content” icon=”archive” lang=”en” source-sco-id=”” display-seq=”0″ source-sco-type=”” source-sco-icon=”” content-source-sco-icon=”” duration=””>
<name>{sync-sco-preview} [2014-01-14 18:23:35.47]</name>
<url-path>/p26150/</url-path>
<date-created>2014-01-14T21:23:35.470-05:00</date-created>
<date-modified>2014-01-14T21:23:35.470-05:00</date-modified>
</sco>
<sco depth=”1″ sco-id=”26017″ folder-id=”12345″ type=”content” icon=”archive” lang=”en” source-sco-id=”” display-seq=”0″ source-sco-type=”” source-sco-icon=”” content-source-sco-icon=”” duration=””>
<name>{sync-sco-preview} [2014-01-14 06:37:23.88]</name>
<url-path>/p26017/</url-path>
<date-created>2014-01-14T09:37:23.880-05:00</date-created>
<date-modified>2014-01-14T09:37:23.880-05:00</date-modified>
</sco>
…….
</expanded-scos>
</results>

 

XML API Tips: Obtaining Quotas for Seminar Licenses

A while back I blogged about how to create a Seminar Session via the XML API in Adobe Connect 9.1 (view original blog here).  A question has since come up around how to obtain the quota for a Seminar License, so you know what to put in for the seminar-expected-load value in the acl-field-update call in the last step of that article.

You can obtain the Seminar License quotas for your different licenses by running this API call:

https://{myConnectURL}/api/xml?action=sco-seminar-licenses-list&sco-id=XXXXXXX

where sco-id = the sco-id of the SHARED SEMINARS folder (or the ‘seminars’ tree-id of the shortcut ‘seminars’).

Example Result (showing an example where there are 2 Licenses):

<results>
<status code=”ok”/>
<seminar-licenses>
<sco>
<begindate>2011-12-02T01:00:01.000+00:00</begindate>
<date-begin>2011-12-01T20:00:01.000-05:00</date-begin>
<date-created>2011-12-02T23:47:02.353-05:00</date-created>
<date-end>2016-12-01T19:59:59.000-05:00</date-end>
<date-modified>2013-11-29T10:53:56.590-05:00</date-modified>
<display-seq>0</display-seq>
<duration>XXXXXXXX</duration>
<enddate>2016-12-02T00:59:59.000+00:00</enddate>
<folder-id>XXXXXXXX</folder-id>
<icon>folder</icon>
<is-expired>false</is-expired>
<is-folder>1</is-folder>
<is-seminar>false</is-seminar>
<name>My Seminar License 1</name>
<quota>1000</quota>
<sco-id>XXXXXXXX</sco-id>
<type>folder</type>
<url-path>/fXXXXXXXX/</url-path>
</sco>
<sco>
<begindate>2011-12-02T01:00:01.000+00:00</begindate>
<date-begin>2011-12-01T20:00:01.000-05:00</date-begin>
<date-created>2011-12-02T23:47:04.490-05:00</date-created>
<date-end>2016-12-01T19:59:59.000-05:00</date-end>
<date-modified>2013-11-29T10:54:04.010-05:00</date-modified>
<display-seq>0</display-seq>
<duration>XXXXXXXX</duration>
<enddate>2016-12-02T00:59:59.000+00:00</enddate>
<folder-id>XXXXXXXX</folder-id>
<icon>folder</icon>
<is-expired>false</is-expired>
<is-folder>1</is-folder>
<is-seminar>false</is-seminar>
<name>My Seminar License 2</name>
<quota>1500</quota>
<sco-id>XXXXXXXX</sco-id>
<type>folder</type>
<url-path>/XXXXXXXX/</url-path>
</sco>
</seminar-licenses>
</results>

Again, there are multiple ways of getting the id of the main Seminars folder.  One quick one is :

https://{myConnectURL}/api/xml?action=sco-shortcuts

and pull the value from either in blue (the will both be the same):

<sco tree-id=”XXXXXXX” sco-id=”XXXXXXX” type=”seminars”>
<domain-name>http://{myConnectURL}</domain-name>
</sco>

Another is:

https://{myConnectURL}/api/xml?action=sco-expanded-contents&sco-id=XXXXXXXX&filter-type=tree

where the sco-id is = the account-id

and pull the value in blue:

<sco depth=”1″ sco-id=”XXXXXXX” folder-id=”XXXXXX” type=”tree” icon=”folder” lang=”en” source-sco-id=”” display-seq=”0″ source-sco-type=”” source-sco-icon=”” content-source-sco-icon=”” duration=””>
<name>Shared Seminars</name>
<url-path>/XXXXXXX/</url-path>
<date-created>2011-12-02T23:46:53.563-05:00</date-created>
<date-modified>2013-11-29T10:54:03.053-05:00</date-modified>
</sco>

Passing in the Passcode for Meeting in the URL

If for whatever reason, you needed to pass in the Meeting Passcode for an Adobe Connect meeting room via the URL (yes this has been asked by Connect users in the past), there is one way to do this for 2 of the 3 meeting access levels that exist in Adobe Connect (that accept Guests).

When you setup an Adobe Connect meeting room and assign it a ‘Meeting Passcode‘, that parameter and value can be expressed as ‘meeting-passcode=xxxxxx‘ in the URL string of the Meeting itself.  You also need to make sure you have the meeting setup so that it is either:

Only registered users and accepted guests may enter the room‘ or ‘Anyone who has the URL for the meeting can enter the room

Those are the only 2 options for Access level that allow Guest access.  The ‘Only’ level will prompt the host to accept or decline the guest’s request to enter.  The ‘Anyone’ level will simply let the user right in (see below for the Passcode and Access level settings).

passcode

 

 

To pass a user directly into an Adobe Connect Meeting room that has a passcode, you can use the following formatted URL:

http://myConnectDomain/myMeetingURL?guestName=Jim&meeting-passcode=breeze

where ?guestName=XXXXX is appended to give the guest an identity in the room
where &meeting-passcode=XXXXX is appended to pass in the Meeting Passcode