Hi,
I have courses with Scorm activities that are long 1 hour. If a user looses temporarily his internet connection or if the moodle session is timeout, then the scorm activity continues normally, but the tracking data are not saved on moodle database because the connection between moodle and scorm is lost. In fact, the user can conclude the scorm activity, but the activity is not completed and it restarts from the page before the connection lost. The user doesn't know that the connection was lost and he discovers that the activity is not completed only at the end of it!
Is it possible to alert the user when the connection between moodle and scorm is lost?
I did some tests and I see that when the connection is lost, the LMSCommit is errorcode 101, as you can see below:
Here the SCORM API Activity Log
Tue, 11 Aug 2015 09:53:58 GMT: Moodle SCORM 1.2 API Loaded, Activity: Modulo 2, SCO: item
Tue, 11 Aug 2015 09:53:59 GMT: LMSInitialize("", "") => 0
Tue, 11 Aug 2015 09:53:59 GMT: LMSGetValue("cmi.suspend_data") - N4IgJiBcCsCMCc8DMAGANCANlATBgblANrqxo4C6GADlKPgJYCmA7gCICuATgIYAuDAPYA7KHHgZMPAM58AasxZMwAZUwMwTXBmnrNKvvybS6IFKcbSGfZVD5cOTDAGNBAW2qYmNiJABmPJjSTAC+GLAWDFY+dg5OIK4eXjH+gcFhIDiR0baQ9o4u7p7euQFBoSEZAI50lUAAA== => 0
Tue, 11 Aug 2015 09:54:06 GMT: LMSSetValue("cmi.core.session_time", "00:00:00") => 0
Tue, 11 Aug 2015 09:54:06 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsCMCc8DMB2ANCANlATBgblANoAMasaOAuhgA5SiYCGAzgC4BqAlgKYDuPMAGVMXMD1wFefACIBXAE5M2XAPYA7KHHgYWo8ULbKeLBiBJn8XFlzaCobBXJ4YAxqoC2tTDzsRIAGZMmCw8AL4YsJbWtvaQjs5unt6+cUEh4Rg40TZ+Dk4uIO5ePnmBwaFhVRgAjgxVQAA") => 0
Tue, 11 Aug 2015 09:54:14 GMT: LMSSetValue("cmi.core.session_time", "00:00:07") => 0
Tue, 11 Aug 2015 09:54:14 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsBMDs8AcA2ANCANlWGBuUA2gAxoCMasAuhgA5SiYCGAzgC4BqAlgKYDuPMAGVMXMDxz5efACIBXAE5M2XAPYA7KPAwtR4oW2U8WDEMVN4uLLm0FQ2CuTwwBjVQFtamHrYiQAZkyYLDwAvhhkFlY2dpAOTq4eXj6xgcFhGLBR1r72js4gbp7euQFBIaGVGACODJVAA==") => 0
Tue, 11 Aug 2015 09:54:14 GMT: LMSSetValue("cmi.core.score.min", "0") => 0
Tue, 11 Aug 2015 09:54:14 GMT: LMSSetValue("cmi.core.score.max", "100") => 0
Tue, 11 Aug 2015 09:54:14 GMT: LMSSetValue("cmi.core.score.raw", "4.48") => 0
Tue, 11 Aug 2015 09:54:14 GMT: LMSSetValue("cmi.core.lesson_status", "failed") => 0
Tue, 11 Aug 2015 09:54:14 GMT: LMSSetValue("cmi.core.session_time", "00:00:07") => 0
Tue, 11 Aug 2015 09:54:14 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsBMDsBOADADgDQgDZVpgblANrLoCM6sAupgA5ShYCGAzgC4BqAlgKYDuPMAGUsXMD1wFefACIBXAE5M2XAPYA7KPEwtR4oW2U8WDEMlP4uLLm0FQ2CuT0wBjVQFtaWHrYiQAZkxYLDwAvphkFlY2dpAOTq4eXj6xgcFhmLBR1r72js4gbp7euQFBIaGVmACODJVAA==") => 0
Tue, 11 Aug 2015 09:54:15 GMT: Commit("", "") => 0
Tue, 11 Aug 2015 09:54:15 GMT: LMSCommit("AJAXResult", "true") => 0
Tue, 11 Aug 2015 09:54:15 GMT: LMSCommit("result", "true") => 0
Tue, 11 Aug 2015 09:54:15 GMT: LMSCommit("errorCode", "0") => 0
Tue, 11 Aug 2015 09:54:31 GMT: LMSSetValue("cmi.core.session_time", "00:00:24") => 0
Tue, 11 Aug 2015 09:54:31 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsAssCYAM0A0IA2UHoG5QG0lUBGVBAXXQAcpQMBDAZwBcA1ASwFMB3LsAMoYOYLtjzceAEQCuAJwYsOAewB22AMzomw0QJaKuTOiCQncHJhxb8oLOTK7oAxsoC21DFxsRIAMwYMJi4AX3QSc0trW0h7Rxd3T28YgKDQ9ARIqx87BycQVw8vHP9A4JCK9ABHOgqgAAA==") => 0
Tue, 11 Aug 2015 09:54:46 GMT: LMSSetValue("cmi.core.session_time", "00:00:39") => 0
Tue, 11 Aug 2015 09:54:46 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCs0JwA4DMAmANCANldIBuUA2gAxoCMaKAuhgA5SiYCGAzgC4BqAlgKYDuPMAGVMXMDxwY8vPgBEArgCcmbLgHsAdlCRwMLUeKFsVPFgxDFz0llzaCobRfJ4YAxmoC2tTDzsRIAGZMmCw8AL4YZFZcNn4OTi4g7l4+cYHBoREgKNGx9pCOzm6e3r75QSHhYVkAjgzVQAA") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.core.session_time", "00:00:40") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsBsAMskBoQBsoCZUDcoG15kBGZTAXVQAcpQ0BDAZwBcA1ASwFMB3TsAZTTswnLLi7cAIgFcATvWbsA9gDsoAZgCcqRkJH9mCzo1oh4pnO0btmfKM1nTOqAMZKAtlTSdbESADN6NEZOAF9UYgsrGztIBydXDy8fWMDgsNRMKOtfe0dnEDdPb1yAoJDwkHVsmL94gqLk0rSK0MqAR1o2oAA==") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.core.session_time", "00:00:40") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsBsAMB2JAaEAbKAmNA3KA2vCgIwpYC6aADlKOgIYDOALgGoCWApgO5dgBldBzBcoAZjzceAEQCuAJwYsOAewB2EgJxomw0QJbKuTOiHhncHJhxb8oLBXK5oAxqoC21dFzsRIAGYM6ExcAL5oJJbWtvaQjs5unt6+cUEh4WhY0TZ+Dk4uIO5ePnmBwaERIOI5sf4JhcUpZemVYVUAjnTtQAA") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.core.score.min", "0") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.core.score.max", "100") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.core.score.raw", "5.97") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.core.lesson_status", "failed") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.core.session_time", "00:00:40") => 0
Tue, 11 Aug 2015 09:54:47 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsBsAMAOesA0IA2UDM6BuUA2vKgIyoBMq2AuugA5SgYCGAzgC4BqAlgKYB3PmADKGHmD458/AQBEArgCcWHHgHsAdjgCc6NuMkiOqvmyYh4FvDzY8OwqByUK+6AMbqAtvQx8HEJAAZiwYbHwAvuik1rb2jpDOrh7evv4JIWGR6BSxdgFOLm4gnj5+BcGh4VEg2HnxgUnFpWkVmdURNQCOTJ1AAA=") => 0
Tue, 11 Aug 2015 09:54:47 GMT: Commit("", "") => 0
Tue, 11 Aug 2015 09:54:48 GMT: LMSCommit("AJAXResult", "true") => 0
Tue, 11 Aug 2015 09:54:48 GMT: LMSCommit("result", "true") => 0
Tue, 11 Aug 2015 09:54:48 GMT: LMSCommit("errorCode", "0") => 0
Tue, 11 Aug 2015 09:55:03 GMT: LMSSetValue("cmi.core.session_time", "00:00:56") => 0
Tue, 11 Aug 2015 09:55:03 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsDsBsAmaAGANCANlAzBgblANroCMaiaOAuhgA5SiYCGAzgC4BqAlgKYDuvMAGVM3ML1wE+/ACIBXAE7N23APYA7KNGgZWYicPYrerRiBTn83Vt3ZCo7RfN4YAxmoC2dTL3sRIADNmTFZeAF8MUisbOwdIJxd3Lx8/eODQiIxEGNt/R2dXEA9vX3ygkLDIkBxcuIDEopLU8oyq8OqAR0YOoA") => 0
Tue, 11 Aug 2015 09:55:18 GMT: LMSSetValue("cmi.core.session_time", "00:01:12") => 0
Tue, 11 Aug 2015 09:55:18 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCsCcCMsAc8A0IA2UDM6BuUA2gAypoBMq2AuugA5SgYCGAzgC4BqAlgKYDuvMAGUM3MLxz4+/ACIBXAE7N23APYA7KAHY0IVmInD2K3q0YhiFvN1bd2QqO0Xze6AMZqAtnQy8HEJAAZswYrLwAvujw1rb2jpDOrh7evv4JIWGR6OSxdgFOLm4gnj5+BcGh4VEg2HnxgUnFpWkVmdURNQCOjJ1AAA=") => 0
Tue, 11 Aug 2015 09:55:34 GMT: LMSSetValue("cmi.core.session_time", "00:01:27") => 0
Tue, 11 Aug 2015 09:55:34 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcBsAMDsBOAjAJgDQgDZQMyYDcoBtWdZdDXAXUwAcpQsBDAZwBcA1ASwFMB3XmADKWbmF55CffgBEArgCdm7bgHsAdlAAc8TKzETh7Fb1aMQsCwW6tu7IVHaL5vTAGM1AWzpZeDiEgAM2YsVl4AX0xka1t7R0hnVw9vX38EkLDIzFRYuwCnFzcQTx8/AuDQ8KiQXDz4wKTi0rSKzOqImoBHRk6gAA=") => 0
...*** HERE THE SESSION IS TIMEOUT ***...
Tue, 11 Aug 2015 14:51:56 GMT: LMSSetValue("cmi.core.session_time", "04:57:50") => 0
Tue, 11 Aug 2015 14:51:57 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcDMsCcSBs8A0IA2UAsWAblANoAMG0GATBpngLpYAOUo2AhgM4AuAagEsApgHchYAMrYBYIVACsRYSIAiAVwBOHHgID2AOyjQA7LFRIsXabIk9tQrmxBknhAVwE9xUHhrVCsAGNdAFtmbCEvCEgAMw5sLiEAXyxoV3dPb0hffyDQ8MisuITkrGp0jyifPwCQYLCIqtj4xJSQeArM6Jza+oKm4tasPE6mnryGwujB0pB5UazxuvzGopbkpLaARzZNoAAA==") => 0
Tue, 11 Aug 2015 14:51:57 GMT: LMSSetValue("cmi.core.score.min", "0") => 0
Tue, 11 Aug 2015 14:51:57 GMT: LMSSetValue("cmi.core.score.max", "100") => 0
Tue, 11 Aug 2015 14:51:57 GMT: LMSSetValue("cmi.core.score.raw", "8.96") => 0
Tue, 11 Aug 2015 14:51:58 GMT: LMSSetValue("cmi.core.lesson_status", "failed") => 0
Tue, 11 Aug 2015 14:51:58 GMT: LMSSetValue("cmi.core.session_time", "04:57:51") => 0
Tue, 11 Aug 2015 14:51:58 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcDMBOaBWFA2ANCANlF2AblANoAMm0mATJvJgCyYoC62ADlKDgIYDOAFwBqASwCmAdzFgAyjhFgx+IuIkARAK4AnHgJEB7AHZRoAdljpE2PvMUyBusXy4gyLwiL4iB0qAK0aYtgAxvoAtuw4Yj4QkABmPDh8YgC+2NDunt6+kP6BIeGR0TkJSanY1JleMX4BQSChEVE18YnJaSDwVdmxefWNRS2l7dgM3S19BU3FscPlICjjOZMNhc0lbakpHQCOXNtAAA") => 0
Tue, 11 Aug 2015 14:52:00 GMT: Commit("", "") => 0
Tue, 11 Aug 2015 14:52:00 GMT: LMSCommit("AJAXResult", " ") => 0
Tue, 11 Aug 2015 14:52:00 GMT: LMSCommit("result", "false") => 0
Tue, 11 Aug 2015 14:52:00 GMT: LMSCommit("errorCode", "101") => 0
Tue, 11 Aug 2015 14:52:16 GMT: LMSSetValue("cmi.core.session_time", "04:58:09") => 0
Tue, 11 Aug 2015 14:52:16 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcAsAGAnPATLANCANlArNgG5QDaim0mamAzJvJvgLrYAOUoOAhgM4AuANQCWAUwDuosAGUcwsKILEx4gCIBXAE7d+wgPYA7KNADssc9l5yF0/jtG9OIRE6LDew/lKj9N60dgAxnoAtmw4ol4QkABm3Di8ogC+2NCu7p7ekL7+QaHhkVlxCcnYaOkeUT5+ASDBYRFVsfGJKSC0FZnRObX1BU3FrdjwnU09eQ2F0YOlIPijWeN1+Y1FLclJbQCOnJtAAAA==") => 0
Tue, 11 Aug 2015 14:52:25 GMT: LMSSetValue("cmi.core.session_time", "04:58:18") => 0
Tue, 11 Aug 2015 14:52:25 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcAscBsAmWAaEAbKBWTAblANoAM606K6AzOvOrgLqYAOUoWAhgM4AuANQCWAUwDuIsAGUsQsCLyFRYgCIBXAE5c+QgPYA7KNADssAJzHMPWfKl9tInhxClnBITyF9JUPhrUimADGugC2rFgi3hCQAGZcWDwiAL6Y0G4eXj6QfgHBYRFR2fGJKZgoGZ7Rvv6BICHhkdVxCUmpIDSVWTG5dQ2FzSVtmPBdzb35jUUxQ2UguGPZE/UFTcWtc0iLPbWTA+ulyUeYAI4cR0AAA=") => 0
Tue, 11 Aug 2015 14:52:26 GMT: LMSSetValue("cmi.core.session_time", "04:58:19") => 0
Tue, 11 Aug 2015 14:52:26 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcAs0CccAMAaEAbKBWTAblANobToBM6AzOvOrgLqYAOUoWAhgM4AuAagEsApgHdhYAMpZBYYVABshEaIAiAVwBOnXoID2AOyjQA7LCQnM3GXMm8dw7uxCpnBQd0G8JUXpvXCmADGegC2LFjC3hCQAGacWNzCAL6Y0G4eXj6QfgHBYRFR2fGJKZgUGZ7Rvv6BICHhkdVxCUmpINSVWTG5dQ2FzSVtmPBdzb35jUUxQ2UguGPZE/UFTcWtcwqLPbWTA+ulyUeYAI7sR0AAA=") => 0
Tue, 11 Aug 2015 14:52:26 GMT: LMSSetValue("cmi.core.score.min", "0") => 0
Tue, 11 Aug 2015 14:52:26 GMT: LMSSetValue("cmi.core.score.max", "100") => 0
Tue, 11 Aug 2015 14:52:27 GMT: LMSSetValue("cmi.core.score.raw", "10.45") => 0
Tue, 11 Aug 2015 14:52:27 GMT: LMSSetValue("cmi.core.lesson_status", "failed") => 0
Tue, 11 Aug 2015 14:52:27 GMT: LMSSetValue("cmi.core.session_time", "04:58:20") => 0
Tue, 11 Aug 2015 14:52:27 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcAsAmADAdlsgNCANlAbNgG5QDaW0mimAzJvJgKyb4C62ADlKDgIYDOAFwBqASwCmAd3FgAyjlFhxBYhMkARAK4AnXoNEB7AHZRo6AJyps/BUtmC94/txDIXRUf1GCZUQds1xbABjAwBbDhxxHwhIADNeHH5xAF9saHdPb19If0CQ8MjonISk1OxETK8YvwCgkFCIqJr4xOS0kBoq7Ni8+sailtL27Hhulr6CpuLY4fKQRnGcyYbC5pK2+fwl3rqpwY2ylOPsAEduY6AA=") => 0
Tue, 11 Aug 2015 14:52:29 GMT: Commit("", "") => 0
Tue, 11 Aug 2015 14:52:29 GMT: LMSCommit("AJAXResult", " ") => 0
Tue, 11 Aug 2015 14:52:29 GMT: LMSCommit("result", "false") => 0
Tue, 11 Aug 2015 14:52:29 GMT: LMSCommit("errorCode", "101") => 0
Tue, 11 Aug 2015 14:52:44 GMT: LMSSetValue("cmi.core.session_time", "04:58:38") => 0
Tue, 11 Aug 2015 14:52:45 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcAsBmWAGA7NANCANlAbNgG5QDaKmWATJopvJgKyb4C62ADlKDgIYDOAFwBqASwCmAd3FgAyjlFhxBYhMkARAK4AnXoNEB7AHZRoaAJxns/BUtmC94/txAoXRUf1GCZUQds1xbABjAwBbDhxxHwhIADNeHH5xAF9saHdPb19If0CQ8MjonISk1OwqTK8YvwCgkFCIqJr4xOS0kEQq7Ni8+sailtL27Hhulr6CpuLY4fKQRnGcyYbC5pK2+fwl3rqpwY2ylOPsAEduY6AA=") => 0
Tue, 11 Aug 2015 14:53:01 GMT: LMSSetValue("cmi.core.session_time", "04:58:54") => 0
Tue, 11 Aug 2015 14:53:01 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcAsBWeAmAbLANCANlN2AblANoAMm0mKmAzJvJopmgLrYAOUoOAhgM4AXAGoBLAKYB3cWADKOUWHH4iEyQBEArgCdeg0QHsAdlGgB2AJy1GIfgqWzBe8f24gybwqP6jBMqILamuLYAMYGALYcOOJ+EJAAZrw4/OIAvtjQnt6+/pCBwWGR0bF5SSnp2CjZPnEBQSEg4VExdYnJqRkgtDW58QWNzSVt5Z3Y8L1tA0UtpfGjlSCIk3nTTcWtZR2LaCv9DTPDWxVpp9gAjtynQAA==") => 0
Tue, 11 Aug 2015 14:53:11 GMT: LMSSetValue("cmi.core.session_time", "04:59:05") => 0
Tue, 11 Aug 2015 14:53:12 GMT: LMSSetValue("cmi.suspend_data", "N4IgJiBcCMAcAsA2ArNATNANCANlR2AblANoAMmWamAzJvJspogLrYAOUoOAhgM4AXAGoBLAKYB3MWADKOEWDH4i4iQBEArgCceAkQHsAdlGgB2AJzwGIPvMUyBusXy4gyrwiL4iB0qAK0NMWwAY30AW3YcMV8ISAAzHhw+MQBfbGgPLx8/SACg0IiomNzE5LTsNCzvWP9A4JAwyOjahKSU9JAaapy4/Iam4tayjux4Htb+wuaSuJGKkGQJ3KnGopbS9oXEZb766aHN8tST7ABHLhOgAAA==") => 0
Tue, 11 Aug 2015 14:53:12 GMT: LMSSetValue("cmi.core.exit", "suspend") => 0
Tue, 11 Aug 2015 14:53:13 GMT: LMSFinish("AJAXResult", " ") => 0
Tue, 11 Aug 2015 14:53:14 GMT: LMSFinish("result", "false") => 0
Tue, 11 Aug 2015 14:53:14 GMT: LMSFinish("", "") => 0
I woud like that if LMSCommit("errorCode", "101") then I alert the user with a javascript popup that he must logout and reconnect to moodle.
How can I catch the errorCode 101?
Should I modify a moodle file (which one?) or a scorm package file?
I use Scorm 1.2 developed with iSpringPro and moodle 2.3.4.
Thank you for your help!