You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2017/05/18 05:36:33 UTC

[26/26] openmeetings git commit: Normalize all the line endings

Normalize all the line endings


Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo
Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/1cb3518f
Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/1cb3518f
Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/1cb3518f

Branch: refs/heads/3.3.x
Commit: 1cb3518f0d7622145f37ecb62d14f56e7126cc3d
Parents: 11e8d9d
Author: Maxim Solodovnik <so...@gmail.com>
Authored: Thu May 18 12:35:51 2017 +0700
Committer: Maxim Solodovnik <so...@gmail.com>
Committed: Thu May 18 12:35:51 2017 +0700

----------------------------------------------------------------------
 NOTICE                                          |   28 +-
 README                                          |  248 +--
 .../record/listener/async/BaseStreamWriter.java |  400 ++---
 .../data/record/listener/async/CachedEvent.java |  152 +-
 .../listener/async/StreamAudioWriter.java       |  456 ++---
 .../listener/async/StreamVideoWriter.java       |  196 +--
 .../openmeetings/core/mail/SMSHandler.java      |  236 +--
 .../core/session/SessionManager.java            |  730 ++++----
 openmeetings-core/src/site/site.xml             |   80 +-
 .../test/rtmp/LoadTestRtmpClient.java           |  344 ++--
 .../openmeetings/test/rtmp/SimulateLoad.java    |  184 +-
 .../openmeetings/db/dao/IDataProviderDao.java   |  188 +-
 .../db/dao/basic/MailMessageDao.java            |  270 +--
 .../openmeetings/db/dao/label/LabelDao.java     |  642 +++----
 .../apache/openmeetings/db/dao/room/SipDao.java |  382 ++--
 .../db/dao/server/ISessionManager.java          |  412 ++---
 .../openmeetings/db/dao/server/ServerDao.java   |  444 ++---
 .../openmeetings/db/dao/user/GroupDao.java      |  292 ++--
 .../openmeetings/db/dao/user/GroupUserDao.java  |  248 +--
 .../db/entity/basic/MailMessage.java            |  398 ++---
 .../openmeetings/db/entity/server/Server.java   |  608 +++----
 .../openmeetings/db/util/FormatHelper.java      |  162 +-
 openmeetings-db/src/site/site.xml               |   80 +-
 .../src/main/swf/base/components/miniIcons.lzx  |  132 +-
 .../main/swf/base/components/miniIconsNew.lzx   |   92 +-
 .../src/main/swf/base/components/omImage.lzx    |  104 +-
 .../src/main/swf/base/components/omMiniIcon.lzx |   74 +-
 .../swf/base/components/scrollbars/library.lzx  |   88 +-
 .../scrollbars/scrollbar_yresources.lzx         |   48 +-
 .../main/swf/base/remote/baseVideoStream.lzx    |  770 ++++-----
 .../swf/base/remote/baseVideoStreamDevice.lzx   |  344 ++--
 .../src/main/swf/base/remote/baseVideoView.lzx  |  208 +--
 .../main/swf/commonVideoViewContentSWF10.lzx    | 1630 +++++++++---------
 openmeetings-flash/src/main/swf/dragHelper.lzx  |   82 +-
 .../src/main/swf/lzrecorder/library.lzx         |   50 +-
 .../main/swf/lzrecorder/playBackVideoStream.lzx |  140 +-
 .../whiteboard/base/whiteBoardPointer.lzx       |   74 +-
 .../propertypanel/drawDocumentPanelItem.lzx     |   80 +-
 .../main/swf/networkTesting/networktesting.lzx  |  294 ++--
 .../networkTesting/tests/BaseURLLoadTest.lzx    |  292 ++--
 .../networkTesting/tests/DownloadSpeedTest.lzx  |  100 +-
 .../swf/networkTesting/tests/JitterTest.lzx     |  114 +-
 .../swf/networkTesting/tests/NetworkTest.lzx    |  256 +--
 .../main/swf/networkTesting/tests/PingTest.lzx  |   86 +-
 .../tests/PortAvailabilityTest.lzx              |  180 +-
 .../networkTesting/tests/UploadSpeedTest.lzx    |  248 +--
 .../main/swf/networkTesting/tests/library.lzx   |   74 +-
 .../src/main/swf/networkTesting/testsView.lzx   |  210 +--
 .../src/main/swf/video/baseVideoObject.lzx      | 1442 ++++++++--------
 .../main/swf/video/editRecordStreamSWF10.lzx    |  998 +++++------
 .../src/main/swf/video/library.lzx              |  140 +-
 .../main/swf/video/videoObjectPlayBroadcast.lzx |  162 +-
 .../swf/video/videoObjectPlayTestBroadcast.lzx  |   82 +-
 .../main/swf/video/videoObjectTestBroadcast.lzx |  110 +-
 .../main/swf/video/videoUserProfilePicSWF10.lzx |   72 +-
 .../src/main/swf/video/volumeSlider.lzx         |  136 +-
 openmeetings-flash/src/site/site.xml            |   78 +-
 .../backup/AppointmentConverter.java            |  108 +-
 .../AppointmentReminderTypeConverter.java       |   78 +-
 .../openmeetings/backup/DateConverter.java      |   80 +-
 .../openmeetings/backup/GroupConverter.java     |  108 +-
 .../openmeetings/backup/InlineConverter.java    |   58 +-
 .../openmeetings/backup/IntegerTransform.java   |   68 +-
 .../openmeetings/backup/LongTransform.java      |   66 +-
 .../backup/OmCalendarConverter.java             |  110 +-
 .../apache/openmeetings/backup/OmConverter.java |  112 +-
 .../openmeetings/backup/PollTypeConverter.java  |   74 +-
 .../backup/RecordingStatusConverter.java        |   94 +-
 .../openmeetings/backup/RoomConverter.java      |  108 +-
 .../openmeetings/backup/RoomTypeConverter.java  |   74 +-
 .../backup/SalutationConverter.java             |   70 +-
 .../openmeetings/backup/UserConverter.java      |  108 +-
 .../cli/ConnectionPropertiesPatcher.java        |  378 ++--
 .../org/apache/openmeetings/cli/Db2Patcher.java |   56 +-
 .../apache/openmeetings/cli/DerbyPatcher.java   |   66 +-
 .../apache/openmeetings/cli/MssqlPatcher.java   |   56 +-
 .../apache/openmeetings/cli/MysqlPatcher.java   |   58 +-
 .../apache/openmeetings/cli/OraclePatcher.java  |   64 +-
 .../openmeetings/cli/PostgresPatcher.java       |   56 +-
 .../installation/InstallationConfig.java        |  200 +--
 openmeetings-install/src/site/site.xml          |   78 +-
 .../openmeetings/screenshare/CaptureScreen.java |  474 ++---
 .../screenshare/IScreenEncoder.java             |   66 +-
 .../screenshare/RTMPClientPublish.java          |  204 +--
 .../screenshare/ScreenV1Encoder.java            |  404 ++---
 .../screenshare/gui/MouseListenerable.java      |   62 +-
 .../screenshare/gui/NumberSpinner.java          |   70 +-
 .../src/main/resources/logback.xsd              |  218 +--
 openmeetings-screenshare/src/site/site.xml      |   78 +-
 .../src/main/assembly/jrebel/red5-debug.bat     |   38 +-
 .../src/main/assembly/scripts/admin.bat         |   42 +-
 openmeetings-server/src/site/site.xml           |  280 +--
 .../src/site/stylesheets/errortable.xsl         |  134 +-
 .../src/site/xdoc/ApacheDerbyConfig.xml         |  114 +-
 .../src/site/xdoc/BitrixPlugin.xml              |   96 +-
 .../src/site/xdoc/BuildInstructions.xml         |  208 +--
 .../src/site/xdoc/BuildInstructions_3.0.x.xml   |  608 +++----
 .../src/site/xdoc/CalendarAndTimezone.xml       |  134 +-
 .../src/site/xdoc/CallForLogo.xml               |  486 +++---
 .../src/site/xdoc/Clustering.xml                |  278 +--
 .../src/site/xdoc/CommandLineAdmin.xml          |  200 +--
 .../site/xdoc/ConferenceRoomLayoutOptions.xml   |  174 +-
 .../src/site/xdoc/ConfluencePlugin.xml          |   98 +-
 .../src/site/xdoc/CustomCryptMechanism.xml      |  206 +--
 .../src/site/xdoc/CustomRoomTypeHowTo.xml       |  206 +--
 openmeetings-server/src/site/xdoc/Dashboard.xml |  138 +-
 .../src/site/xdoc/DrupalPlugin.xml              |  150 +-
 .../src/site/xdoc/EditTemplates.xml             |  128 +-
 .../src/site/xdoc/GeneralConfiguration.xml      |  626 +++----
 .../src/site/xdoc/GetVersionInfo.xml            |  144 +-
 openmeetings-server/src/site/xdoc/HotKeys.xml   |  106 +-
 .../src/site/xdoc/IBMDB2Config.xml              |  146 +-
 .../src/site/xdoc/Internationalisation.xml      |   96 +-
 .../src/site/xdoc/JUnitTesting.xml              |  170 +-
 .../src/site/xdoc/JVMPerformanceTuning.xml      |  132 +-
 .../src/site/xdoc/JiraPlugin.xml                |  102 +-
 .../src/site/xdoc/JoomlaPlugin.xml              |  118 +-
 .../src/site/xdoc/LanguageEditor.xml            |  116 +-
 .../src/site/xdoc/LdapAndADS.xml                |  190 +-
 .../src/site/xdoc/MSSQLConfig.xml               |  152 +-
 .../src/site/xdoc/ManualTesting.xml             | 1002 +++++------
 .../src/site/xdoc/MoodlePlugin.xml              |  152 +-
 .../src/site/xdoc/MySQLConfig.xml               |  152 +-
 .../src/site/xdoc/Navigation.xml                |   86 +-
 .../src/site/xdoc/OpenOfficeConverter.xml       |  108 +-
 .../src/site/xdoc/OracleConfig.xml              |  122 +-
 .../src/site/xdoc/PortSettings.xml              |  172 +-
 .../src/site/xdoc/PostgresConfig.xml            |  144 +-
 .../src/site/xdoc/RTMPSAndHTTPS.xml             |  434 ++---
 .../src/site/xdoc/RecommendedHardwareList.xml   |  118 +-
 .../src/site/xdoc/RedminePlugin.xml             |   68 +-
 .../src/site/xdoc/ReleaseGuide.xml              |  628 +++----
 .../src/site/xdoc/RestAPISample.xml             |  278 +--
 .../src/site/xdoc/RestrictedAccess.xml          |  144 +-
 .../src/site/xdoc/SakaiPlugin.xml               |  220 +--
 .../src/site/xdoc/SugarCRMPlugin.xml            |  146 +-
 .../src/site/xdoc/TimeZoneHandling.xml          |   78 +-
 openmeetings-server/src/site/xdoc/Upgrade.xml   |  192 +--
 .../src/site/xdoc/WebappNamePath.xml            |  302 ++--
 .../src/site/xdoc/WebcamResolutions.xml         |  118 +-
 .../src/site/xdoc/WebsiteGuide.xml              |  160 +-
 .../src/site/xdoc/commercial-support.xml        |  112 +-
 .../src/site/xdoc/installation.xml              |  568 +++---
 .../src/site/xdoc/red5sip-integration_2.0.xml   |  356 ++--
 .../src/site/xdoc/themes-and-branding.xml       |  122 +-
 .../src/site/xdoc/voip-sip-integration.xml      |  136 +-
 .../service/quartz/scheduler/CleanupJob.java    |  358 ++--
 openmeetings-service/src/site/site.xml          |   80 +-
 .../openmeetings/util/ConnectionProperties.java |  172 +-
 .../org/apache/openmeetings/util/DaoHelper.java |  214 +--
 .../apache/openmeetings/util/OmFileHelper.java  |  630 +++----
 .../org/apache/openmeetings/util/Version.java   |  196 +--
 .../apache/openmeetings/util/mail/MailUtil.java |   68 +-
 .../util/process/ProcessHelper.java             |  232 +--
 openmeetings-util/src/site/site.xml             |   80 +-
 .../openmeetings/web/admin/AdminBaseForm.java   |  362 ++--
 .../web/admin/SearchableDataView.java           |   90 +-
 .../web/admin/backup/BackupPanel.java           |  484 +++---
 .../web/admin/configurations/ConfigForm.java    |  286 +--
 .../web/admin/configurations/ConfigsPanel.java  |  188 +-
 .../web/admin/groups/GroupForm.java             |  500 +++---
 .../web/admin/groups/GroupUsersPanel.html       |   90 +-
 .../web/admin/groups/GroupUsersPanel.java       |  318 ++--
 .../web/admin/groups/GroupsPanel.java           |  198 +--
 .../web/admin/labels/AddLanguageDialog.java     |  230 +--
 .../web/admin/labels/LabelsForm.java            |  224 +--
 .../openmeetings/web/admin/labels/LangForm.java |  206 +--
 .../openmeetings/web/admin/ldaps/LdapForm.java  |  260 +--
 .../web/admin/ldaps/LdapsPanel.java             |  186 +-
 .../openmeetings/web/admin/rooms/RoomForm.java  |  824 ++++-----
 .../web/admin/rooms/RoomsPanel.java             |  182 +-
 .../web/admin/servers/ServerForm.java           |  280 +--
 .../web/admin/servers/ServersPanel.java         |  190 +-
 .../openmeetings/web/admin/users/UserForm.java  |  628 +++----
 .../web/app/LabelResourceLoader.java            |  130 +-
 .../web/common/ConfirmableAjaxBorder.java       |  354 ++--
 .../openmeetings/web/common/HeaderPanel.html    |   52 +-
 .../openmeetings/web/common/HeaderPanel.java    |   64 +-
 .../web/common/OmPagingNavigator.html           |   54 +-
 .../web/common/OmPagingNavigator.java           |   64 +-
 .../openmeetings/web/common/menu/MenuPanel.html |   50 +-
 .../openmeetings/web/common/menu/MenuPanel.java |  138 +-
 .../web/data/DataViewContainer.java             |  106 +-
 .../openmeetings/web/data/OmOrderByBorder.java  |   90 +-
 .../web/data/SearchableDataProvider.java        |  184 +-
 .../openmeetings/web/pages/ActivatePage.java    |  102 +-
 .../openmeetings/web/pages/NotInitedPage.html   |   64 +-
 .../openmeetings/web/pages/NotInitedPage.java   |   80 +-
 .../openmeetings/web/pages/ResetPage.html       |   50 +-
 .../openmeetings/web/pages/ResetPage.java       |   88 +-
 .../web/pages/auth/KickMessageDialog.html       |   56 +-
 .../web/pages/auth/KickMessageDialog.java       |  116 +-
 .../web/pages/auth/ResetPasswordDialog.html     |   84 +-
 .../web/pages/auth/ResetPasswordDialog.java     |  314 ++--
 .../openmeetings/web/user/AboutDialog.html      |   84 +-
 .../openmeetings/web/user/AboutDialog.java      |  114 +-
 .../openmeetings/web/user/UserInfoDialog.html   |   54 +-
 .../openmeetings/web/user/UserInfoDialog.java   |  166 +-
 .../web/user/calendar/AppointmentDialog.html    |  242 +--
 .../web/user/calendar/AppointmentDialog.java    | 1020 +++++------
 .../web/user/calendar/AppointmentModel.java     |  102 +-
 .../web/user/dashboard/MyRoomsWidget.java       |   98 +-
 .../user/dashboard/MyRoomsWidgetDescriptor.java |  102 +-
 .../web/user/dashboard/MyRoomsWidgetView.html   |   50 +-
 .../web/user/dashboard/MyRoomsWidgetView.java   |   72 +-
 .../web/user/dashboard/OmDashboardPanel.html    |   50 +-
 .../web/user/dashboard/OmDashboardPanel.java    |   72 +-
 .../web/user/dashboard/RecentRoomsWidget.java   |   98 +-
 .../dashboard/RecentRoomsWidgetDescriptor.java  |  102 +-
 .../user/dashboard/RecentRoomsWidgetView.html   |   50 +-
 .../user/dashboard/RecentRoomsWidgetView.java   |   76 +-
 .../web/user/dashboard/RssWidget.java           |   98 +-
 .../web/user/dashboard/RssWidgetDescriptor.java |  102 +-
 .../web/user/dashboard/RssWidgetView.java       |  194 +--
 .../web/user/dashboard/StartWidget.java         |   96 +-
 .../user/dashboard/StartWidgetDescriptor.java   |  102 +-
 .../web/user/dashboard/StartWidgetView.html     |   76 +-
 .../web/user/dashboard/StartWidgetView.java     |  138 +-
 .../web/user/dashboard/WelcomeWidget.java       |   96 +-
 .../user/dashboard/WelcomeWidgetDescriptor.java |  102 +-
 .../web/user/dashboard/WelcomeWidgetView.html   |   86 +-
 .../web/user/dashboard/WelcomeWidgetView.java   |  162 +-
 .../web/user/dashboard/admin/AdminWidget.java   |   98 +-
 .../dashboard/admin/AdminWidgetDescriptor.java  |  102 +-
 .../user/dashboard/admin/AdminWidgetView.html   |   58 +-
 .../user/dashboard/admin/AdminWidgetView.java   |  108 +-
 .../web/user/profile/UserProfilePanel.html      |  174 +-
 .../web/user/profile/UserProfilePanel.java      |  146 +-
 .../web/user/profile/UserSearchPanel.html       |  136 +-
 .../web/user/profile/UserSearchPanel.java       |  308 ++--
 .../openmeetings/web/user/rooms/RoomsPanel.html |  124 +-
 .../openmeetings/web/user/rooms/RoomsPanel.java |  274 +--
 .../web/user/rooms/RoomsSelectorPanel.html      |   54 +-
 .../web/user/rooms/RoomsSelectorPanel.java      |  112 +-
 .../web/user/rooms/RoomsTabbedPanel.html        |   60 +-
 .../web/user/rooms/RoomsTabbedPanel.java        |  140 +-
 .../openmeetings/web/util/AjaxDownload.java     |  256 +--
 .../src/main/webapp/conf/om_ldap.cfg            |  218 +--
 .../main/webapp/js/openmeetings_functions.js    |  128 +-
 .../src/main/webapp/languages/errorvalues.xsd   |   82 +-
 .../src/main/webapp/public/config.xsd           |  262 +--
 .../src/main/webapp/public/theme.xml            |  660 +++----
 .../src/main/webapp/public/theme.xsd            |   90 +-
 .../src/main/webapp/upload/library.xsd          |  136 +-
 openmeetings-web/src/site/site.xml              |   78 +-
 .../openmeetings/test/AbstractWicketTester.java |  154 +-
 .../test/backup/TestOldBackups.java             |  256 +--
 .../openmeetings/test/user/TestUserContact.java |  210 +--
 .../openmeetings/test/user/TestUserCount.java   |  116 +-
 .../webservice/ServerWebService.java            |  360 ++--
 .../cluster/SlaveHTTPConnectionManager.java     |  198 +--
 openmeetings-webservice/src/site/site.xml       |   80 +-
 src/site/site.xml                               |  154 +-
 253 files changed, 25570 insertions(+), 25570 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1cb3518f/NOTICE
----------------------------------------------------------------------
diff --git a/NOTICE b/NOTICE
index 6685a3f..eddf910 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,14 +1,14 @@
-Apache OpenMeetings
-Copyright 2011-2017 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-This product includes icons from FamFamFam Icon Set Silk.
-http://www.famfamfam.com/lab/icons/silk/
-
-This product includes icons from Yusuke Kamiyamane.
-http://p.yusukekamiyamane.com/
-
-This product includes free icons from FatCow.
-http://www.fatcow.com/free-icons
+Apache OpenMeetings
+Copyright 2011-2017 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+This product includes icons from FamFamFam Icon Set Silk.
+http://www.famfamfam.com/lab/icons/silk/
+
+This product includes icons from Yusuke Kamiyamane.
+http://p.yusukekamiyamane.com/
+
+This product includes free icons from FatCow.
+http://www.fatcow.com/free-icons

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1cb3518f/README
----------------------------------------------------------------------
diff --git a/README b/README
index 6747d28..fb4c599 100644
--- a/README
+++ b/README
@@ -1,124 +1,124 @@
-Apache OpenMeetings - README
-Licensed under Apache License 2.0 - http://www.apache.org/licenses/LICENSE-2.0
---------------------------------------------------------------------------------
-
-About
-=====
-Apache OpenMeetings provides video conferencing, instant messaging, white board,
-collaborative document editing and other groupware tools using API functions of 
-the Red5 Streaming Server for Remoting and Streaming. 
-
-Release Notes 3.2.1
-=============
-see CHANGELOG file for detailed log
-
-Service release 1 for 3.2.0, provides following improvements:
-
-Room
-* Video is more stable
-* Office files download is fixed
-* Multi-upload is added
-* External video works as expected
-* WB drawing on slides works as expected
-
-Chat
-* chat is made resizable
-* multiple issues in chat are fixed
-* typing indicator is added
-
-Calendar
-* date/time validator is improved
-* whole group can be invited by admin to event
-
-Other fixes and improvements, 49 issues were fixed
-
-
-=============
-_Integration with Asterisk_
-SIP/VOIP integration with Asterisk was refactored. 
-Confbridge application is now used instead of Meetme for the conferences.
-Sound quality and SIP transport stability was significantly improved.
-Basic support for video is added (is unstable and in beta version stage now).
-See also: http://openmeetings.apache.org/red5sip-integration_2.1.html
-
-_Improving the sound and video quality_
-All the audio/video related components now use SWF11 for broadcasting and 
-receiving audio and video signals. 
-Echo cancellation can be enabled in the config. 
-H264 video codec is now used instead of H263 to enable SIP video support.
-
-_Private and moderated chat_
-Ability to send private chat messages in the room is added as well as the chat 
-moderation funmctionality.
-
-_SMS sending module_
-Possibility to send SMS message as a meeting reminder is added.
-See also: https://cwiki.apache.org/confluence/display/OPENMEETINGS/SMS+Sending+Module
-
-_Network testing tool/script_
-Network testing tool is implemented and its link is added to the login page.
-See also: https://cwiki.apache.org/confluence/display/OPENMEETINGS/Connection+testing+tool
-
-_Improvements in the mail sending process_
-Now e-mails are re-send again in case of unsuccessfull result at the first 
-attempt or OpenMeetings re-start before the sending. 
-SMTP setting updates now takes effect just after they saving whereas previously 
-they started to work after the OpenMeetings re-start only.
-
-_Calendar_
-Messages about the meeting updates are sent only when substantial changes were made. 
-Multiple external attendees can be added as one operation, it's now possible to 
-specify user name for external guests (user will appear with this name in the user 
-list in the room). 
-
-_Room Interface_
-Possibility to get invitation link without sending an e-mail was added. 
-Confirmation dialog for exclusive audio no longer appears.
-Hot key is added to be able to "rearrange" video windows in the room. 
-Volume slider on the video pod toolbar was added.
-
-_Recordings and screen sharing improvements_
-Some improvements for the screen sharing and recordings quality and stability 
-were made.
-
-_Cluster capabilities_
-In the beta stage: OpenMeetings  can be configured in the cluster environment and 
-is ready for the testing, but development has not been fnished yet. 
-See also: http://openmeetings.apache.org/Clustering.html,
-https://cwiki.apache.org/confluence/display/OPENMEETINGS/Cluster+Master-Slave+overview
-
-_Admin/Calendar HTML5 UI_
-Additional HTML5 Wicket based UI (fully customizable with CSS) is added for 
-static screens as a proof of the concept.
-
-Getting Started
-===============
-Please visit the project website for the latest information:
-    http://openmeetings.apache.org/
-    
-Documentation for Installation and Upgrade:
-    http://openmeetings.apache.org/installation.html
-    http://openmeetings.apache.org/Upgrade.html
-
-Along with the developer mailing list archive:
-    http://openmeetings.apache.org/mail-lists.html
-    
-    
-System Requirements
-===================
-You need a platform that supports Sun Java SE 6.
-
-
-Building and running
-====================
-To build from source code:
-
-  - Requirements:
-    Sources compilation require Sun Java SE 8.
-    The project is built with Apache Maven 3.3.9 or later.
-  
-  - To build the OpenMeetings project run ant in the root directory:
-     ant
-    
-For a detailed documentation on how to build from source and options see:
-    http://openmeetings.apache.org/BuildInstructions.html
+Apache OpenMeetings - README
+Licensed under Apache License 2.0 - http://www.apache.org/licenses/LICENSE-2.0
+--------------------------------------------------------------------------------
+
+About
+=====
+Apache OpenMeetings provides video conferencing, instant messaging, white board,
+collaborative document editing and other groupware tools using API functions of 
+the Red5 Streaming Server for Remoting and Streaming. 
+
+Release Notes 3.2.1
+=============
+see CHANGELOG file for detailed log
+
+Service release 1 for 3.2.0, provides following improvements:
+
+Room
+* Video is more stable
+* Office files download is fixed
+* Multi-upload is added
+* External video works as expected
+* WB drawing on slides works as expected
+
+Chat
+* chat is made resizable
+* multiple issues in chat are fixed
+* typing indicator is added
+
+Calendar
+* date/time validator is improved
+* whole group can be invited by admin to event
+
+Other fixes and improvements, 49 issues were fixed
+
+
+=============
+_Integration with Asterisk_
+SIP/VOIP integration with Asterisk was refactored. 
+Confbridge application is now used instead of Meetme for the conferences.
+Sound quality and SIP transport stability was significantly improved.
+Basic support for video is added (is unstable and in beta version stage now).
+See also: http://openmeetings.apache.org/red5sip-integration_2.1.html
+
+_Improving the sound and video quality_
+All the audio/video related components now use SWF11 for broadcasting and 
+receiving audio and video signals. 
+Echo cancellation can be enabled in the config. 
+H264 video codec is now used instead of H263 to enable SIP video support.
+
+_Private and moderated chat_
+Ability to send private chat messages in the room is added as well as the chat 
+moderation funmctionality.
+
+_SMS sending module_
+Possibility to send SMS message as a meeting reminder is added.
+See also: https://cwiki.apache.org/confluence/display/OPENMEETINGS/SMS+Sending+Module
+
+_Network testing tool/script_
+Network testing tool is implemented and its link is added to the login page.
+See also: https://cwiki.apache.org/confluence/display/OPENMEETINGS/Connection+testing+tool
+
+_Improvements in the mail sending process_
+Now e-mails are re-send again in case of unsuccessfull result at the first 
+attempt or OpenMeetings re-start before the sending. 
+SMTP setting updates now takes effect just after they saving whereas previously 
+they started to work after the OpenMeetings re-start only.
+
+_Calendar_
+Messages about the meeting updates are sent only when substantial changes were made. 
+Multiple external attendees can be added as one operation, it's now possible to 
+specify user name for external guests (user will appear with this name in the user 
+list in the room). 
+
+_Room Interface_
+Possibility to get invitation link without sending an e-mail was added. 
+Confirmation dialog for exclusive audio no longer appears.
+Hot key is added to be able to "rearrange" video windows in the room. 
+Volume slider on the video pod toolbar was added.
+
+_Recordings and screen sharing improvements_
+Some improvements for the screen sharing and recordings quality and stability 
+were made.
+
+_Cluster capabilities_
+In the beta stage: OpenMeetings  can be configured in the cluster environment and 
+is ready for the testing, but development has not been fnished yet. 
+See also: http://openmeetings.apache.org/Clustering.html,
+https://cwiki.apache.org/confluence/display/OPENMEETINGS/Cluster+Master-Slave+overview
+
+_Admin/Calendar HTML5 UI_
+Additional HTML5 Wicket based UI (fully customizable with CSS) is added for 
+static screens as a proof of the concept.
+
+Getting Started
+===============
+Please visit the project website for the latest information:
+    http://openmeetings.apache.org/
+    
+Documentation for Installation and Upgrade:
+    http://openmeetings.apache.org/installation.html
+    http://openmeetings.apache.org/Upgrade.html
+
+Along with the developer mailing list archive:
+    http://openmeetings.apache.org/mail-lists.html
+    
+    
+System Requirements
+===================
+You need a platform that supports Sun Java SE 6.
+
+
+Building and running
+====================
+To build from source code:
+
+  - Requirements:
+    Sources compilation require Sun Java SE 8.
+    The project is built with Apache Maven 3.3.9 or later.
+  
+  - To build the OpenMeetings project run ant in the root directory:
+     ant
+    
+For a detailed documentation on how to build from source and options see:
+    http://openmeetings.apache.org/BuildInstructions.html

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1cb3518f/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/BaseStreamWriter.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/BaseStreamWriter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/BaseStreamWriter.java
index de93393..1520204 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/BaseStreamWriter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/BaseStreamWriter.java
@@ -1,200 +1,200 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.core.data.record.listener.async;
-
-import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_FLV;
-import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Date;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.openmeetings.db.dao.record.RecordingMetaDataDao;
-import org.apache.openmeetings.db.entity.record.RecordingMetaData;
-import org.apache.openmeetings.db.entity.record.RecordingMetaData.Status;
-import org.apache.openmeetings.util.OmFileHelper;
-import org.red5.io.IStreamableFile;
-import org.red5.io.ITagWriter;
-import org.red5.logging.Red5LoggerFactory;
-import org.red5.server.api.scope.IScope;
-import org.red5.server.api.service.IStreamableFileService;
-import org.red5.server.api.stream.IStreamableFileFactory;
-import org.red5.server.stream.StreamableFileFactory;
-import org.red5.server.util.ScopeUtils;
-import org.slf4j.Logger;
-
-public abstract class BaseStreamWriter implements Runnable {
-	private static final Logger log = Red5LoggerFactory.getLogger(BaseStreamWriter.class, webAppRootKey);
-	private final static int MINUTE_MULTIPLIER = 60 * 1000;
-	public final static int TIME_TO_WAIT_FOR_FRAME = 15 * MINUTE_MULTIPLIER;
-	protected int startTimeStamp = -1;
-	protected long initialDelta = 0;
-
-	// thread is running
-	private boolean running = false;
-	// thread is stopped
-	private boolean stopping = false;
-	// thread will be stopped as soon as the queue is empty
-	private boolean dostopping = false;
-
-	protected ITagWriter writer = null;
-
-	protected Long metaDataId = null;
-
-	protected Date startedSessionTimeDate = null;
-
-	protected File file;
-
-	protected IScope scope;
-
-	protected boolean isScreenData = false;
-
-	protected String streamName = "";
-	protected final RecordingMetaDataDao metaDataDao;
-	private final BlockingQueue<CachedEvent> queue = new LinkedBlockingQueue<>();
-
-	public BaseStreamWriter(String streamName, IScope scope, Long metaDataId, boolean isScreenData, RecordingMetaDataDao metaDataDao) {
-		startedSessionTimeDate = new Date();
-		this.isScreenData = isScreenData;
-		this.streamName = streamName;
-		this.metaDataId = metaDataId;
-		this.metaDataDao = metaDataDao;
-		this.scope = scope;
-		try {
-			init();
-		} catch (IOException ex) {
-			log.error("##REC:: [BaseStreamWriter] Could not init Thread", ex);
-		}
-		RecordingMetaData metaData = metaDataDao.get(metaDataId);
-		metaData.setStreamStatus(Status.STARTED);
-		metaDataDao.update(metaData);
-
-		open();
-	}
-
-	/**
-	 * Initialization
-	 *
-	 * @throws IOException
-	 *             I/O exception
-	 */
-	private void init() throws IOException {
-		file = new File(OmFileHelper.getStreamsSubDir(scope.getName()), OmFileHelper.getName(streamName, EXTENSION_FLV));
-
-		IStreamableFileFactory factory = (IStreamableFileFactory) ScopeUtils.getScopeService(scope, IStreamableFileFactory.class,
-				StreamableFileFactory.class);
-
-		if (!file.isFile()) {
-			// Maybe the (previously existing) file has been deleted
-			file.createNewFile();
-
-		} else if (!file.canWrite()) {
-			throw new IOException("The file is read-only");
-		}
-
-		IStreamableFileService service = factory.getService(file);
-		IStreamableFile flv = service.getStreamableFile(file);
-		writer = flv.getWriter();
-	}
-
-	private void open() {
-		running = true;
-		new Thread(this, "Recording " + file.getName()).start();
-	}
-
-	public void stop() {
-		dostopping = true;
-	}
-
-	@Override
-	public void run() {
-		log.debug("##REC:: stream writer started");
-		long lastPackedRecieved = System.currentTimeMillis() + TIME_TO_WAIT_FOR_FRAME;
-		long counter = 0;
-		while (!stopping) {
-			try {
-				CachedEvent item = queue.poll(100, TimeUnit.MICROSECONDS);
-				if (item != null) {
-					log.trace("##REC:: got packet");
-					lastPackedRecieved = System.currentTimeMillis();
-					if (dostopping) {
-						log.trace("metadatId: {} :: Recording stopped but still packets to write to file!", metaDataId);
-					}
-
-					packetReceived(item);
-				} else if (dostopping || lastPackedRecieved + TIME_TO_WAIT_FOR_FRAME < System.currentTimeMillis()) {
-					log.debug(String.format("##REC:: none packets received for: %s minutes, exiting", (System.currentTimeMillis() - lastPackedRecieved) / MINUTE_MULTIPLIER));
-					stopping = true;
-					closeStream();
-				}
-				if (++counter % 5000 == 0) {
-					log.debug("##REC:: Stream writer is still listening:: " + file.getName());
-				}
-			} catch (InterruptedException e) {
-				log.error("##REC:: [run]", e);
-			}
-		}
-		log.debug("##REC:: stream writer stopped");
-	}
-
-	/**
-	 * Write the actual packet data to the disk and do calculate any needed additional information
-	 *
-	 * @param streampacket
-	 */
-	public abstract void packetReceived(CachedEvent streampacket);
-
-	protected abstract void internalCloseStream();
-	/**
-	 * called when the stream is finished written on the disk
-	 */
-	public void closeStream() {
-		try {
-			writer.close();
-		} catch (Exception err) {
-			log.error("[closeStream, close writer]", err);
-		}
-		internalCloseStream();
-		// Write the complete Bit to the meta data, the converter task will wait for this bit!
-		try {
-			RecordingMetaData metaData = metaDataDao.get(metaDataId);
-			log.debug("##REC:: Stream Status was: {} has been written for: {}", metaData.getStreamStatus(), metaDataId);
-			metaData.setStreamStatus(Status.STOPPED);
-			metaDataDao.update(metaData);
-		} catch (Exception err) {
-			log.error("##REC:: [closeStream, complete Bit]", err);
-		}
-	}
-
-	public void append(CachedEvent streampacket) {
-		if (!running) {
-			throw new IllegalStateException("Append called before the Thread was started!");
-		}
-		try {
-			queue.put(streampacket);
-			log.trace("##REC:: Q put, successful: " + queue.size());
-		} catch (InterruptedException ignored) {
-			log.error("##REC:: [append]", ignored);
-		}
-	}
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.core.data.record.listener.async;
+
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_FLV;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Date;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.openmeetings.db.dao.record.RecordingMetaDataDao;
+import org.apache.openmeetings.db.entity.record.RecordingMetaData;
+import org.apache.openmeetings.db.entity.record.RecordingMetaData.Status;
+import org.apache.openmeetings.util.OmFileHelper;
+import org.red5.io.IStreamableFile;
+import org.red5.io.ITagWriter;
+import org.red5.logging.Red5LoggerFactory;
+import org.red5.server.api.scope.IScope;
+import org.red5.server.api.service.IStreamableFileService;
+import org.red5.server.api.stream.IStreamableFileFactory;
+import org.red5.server.stream.StreamableFileFactory;
+import org.red5.server.util.ScopeUtils;
+import org.slf4j.Logger;
+
+public abstract class BaseStreamWriter implements Runnable {
+	private static final Logger log = Red5LoggerFactory.getLogger(BaseStreamWriter.class, webAppRootKey);
+	private final static int MINUTE_MULTIPLIER = 60 * 1000;
+	public final static int TIME_TO_WAIT_FOR_FRAME = 15 * MINUTE_MULTIPLIER;
+	protected int startTimeStamp = -1;
+	protected long initialDelta = 0;
+
+	// thread is running
+	private boolean running = false;
+	// thread is stopped
+	private boolean stopping = false;
+	// thread will be stopped as soon as the queue is empty
+	private boolean dostopping = false;
+
+	protected ITagWriter writer = null;
+
+	protected Long metaDataId = null;
+
+	protected Date startedSessionTimeDate = null;
+
+	protected File file;
+
+	protected IScope scope;
+
+	protected boolean isScreenData = false;
+
+	protected String streamName = "";
+	protected final RecordingMetaDataDao metaDataDao;
+	private final BlockingQueue<CachedEvent> queue = new LinkedBlockingQueue<>();
+
+	public BaseStreamWriter(String streamName, IScope scope, Long metaDataId, boolean isScreenData, RecordingMetaDataDao metaDataDao) {
+		startedSessionTimeDate = new Date();
+		this.isScreenData = isScreenData;
+		this.streamName = streamName;
+		this.metaDataId = metaDataId;
+		this.metaDataDao = metaDataDao;
+		this.scope = scope;
+		try {
+			init();
+		} catch (IOException ex) {
+			log.error("##REC:: [BaseStreamWriter] Could not init Thread", ex);
+		}
+		RecordingMetaData metaData = metaDataDao.get(metaDataId);
+		metaData.setStreamStatus(Status.STARTED);
+		metaDataDao.update(metaData);
+
+		open();
+	}
+
+	/**
+	 * Initialization
+	 *
+	 * @throws IOException
+	 *             I/O exception
+	 */
+	private void init() throws IOException {
+		file = new File(OmFileHelper.getStreamsSubDir(scope.getName()), OmFileHelper.getName(streamName, EXTENSION_FLV));
+
+		IStreamableFileFactory factory = (IStreamableFileFactory) ScopeUtils.getScopeService(scope, IStreamableFileFactory.class,
+				StreamableFileFactory.class);
+
+		if (!file.isFile()) {
+			// Maybe the (previously existing) file has been deleted
+			file.createNewFile();
+
+		} else if (!file.canWrite()) {
+			throw new IOException("The file is read-only");
+		}
+
+		IStreamableFileService service = factory.getService(file);
+		IStreamableFile flv = service.getStreamableFile(file);
+		writer = flv.getWriter();
+	}
+
+	private void open() {
+		running = true;
+		new Thread(this, "Recording " + file.getName()).start();
+	}
+
+	public void stop() {
+		dostopping = true;
+	}
+
+	@Override
+	public void run() {
+		log.debug("##REC:: stream writer started");
+		long lastPackedRecieved = System.currentTimeMillis() + TIME_TO_WAIT_FOR_FRAME;
+		long counter = 0;
+		while (!stopping) {
+			try {
+				CachedEvent item = queue.poll(100, TimeUnit.MICROSECONDS);
+				if (item != null) {
+					log.trace("##REC:: got packet");
+					lastPackedRecieved = System.currentTimeMillis();
+					if (dostopping) {
+						log.trace("metadatId: {} :: Recording stopped but still packets to write to file!", metaDataId);
+					}
+
+					packetReceived(item);
+				} else if (dostopping || lastPackedRecieved + TIME_TO_WAIT_FOR_FRAME < System.currentTimeMillis()) {
+					log.debug(String.format("##REC:: none packets received for: %s minutes, exiting", (System.currentTimeMillis() - lastPackedRecieved) / MINUTE_MULTIPLIER));
+					stopping = true;
+					closeStream();
+				}
+				if (++counter % 5000 == 0) {
+					log.debug("##REC:: Stream writer is still listening:: " + file.getName());
+				}
+			} catch (InterruptedException e) {
+				log.error("##REC:: [run]", e);
+			}
+		}
+		log.debug("##REC:: stream writer stopped");
+	}
+
+	/**
+	 * Write the actual packet data to the disk and do calculate any needed additional information
+	 *
+	 * @param streampacket
+	 */
+	public abstract void packetReceived(CachedEvent streampacket);
+
+	protected abstract void internalCloseStream();
+	/**
+	 * called when the stream is finished written on the disk
+	 */
+	public void closeStream() {
+		try {
+			writer.close();
+		} catch (Exception err) {
+			log.error("[closeStream, close writer]", err);
+		}
+		internalCloseStream();
+		// Write the complete Bit to the meta data, the converter task will wait for this bit!
+		try {
+			RecordingMetaData metaData = metaDataDao.get(metaDataId);
+			log.debug("##REC:: Stream Status was: {} has been written for: {}", metaData.getStreamStatus(), metaDataId);
+			metaData.setStreamStatus(Status.STOPPED);
+			metaDataDao.update(metaData);
+		} catch (Exception err) {
+			log.error("##REC:: [closeStream, complete Bit]", err);
+		}
+	}
+
+	public void append(CachedEvent streampacket) {
+		if (!running) {
+			throw new IllegalStateException("Append called before the Thread was started!");
+		}
+		try {
+			queue.put(streampacket);
+			log.trace("##REC:: Q put, successful: " + queue.size());
+		} catch (InterruptedException ignored) {
+			log.error("##REC:: [append]", ignored);
+		}
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1cb3518f/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/CachedEvent.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/CachedEvent.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/CachedEvent.java
index 433cf80..4184290 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/CachedEvent.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/CachedEvent.java
@@ -1,76 +1,76 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.core.data.record.listener.async;
-
-import java.util.Date;
-
-import org.apache.mina.core.buffer.IoBuffer;
-import org.red5.server.api.stream.IStreamPacket;
-import org.red5.server.net.rtmp.event.VideoData.FrameType;
-
-public class CachedEvent implements IStreamPacket {
-	private byte dataType;
-	private int timestamp; //this is the timeStamp, showing the time elapsed since the microphone was turned on
-	private IoBuffer data;
-	private Date currentTime; //this is the actually current timeStamp when the packet with audio data did enter the server
-	private FrameType frameType = FrameType.UNKNOWN;
-
-	public Date getCurrentTime() {
-		return currentTime;
-	}
-
-	public void setCurrentTime(Date currentTime) {
-		this.currentTime = currentTime;
-	}
-
-	public void setDataType(byte dataType) {
-		this.dataType = dataType;
-	}
-
-	public void setTimestamp(int timestamp) {
-		this.timestamp = timestamp;
-	}
-
-	public void setData(IoBuffer data) {
-		this.data = data;
-	}
-
-	@Override
-	public byte getDataType() {
-		return dataType;
-	}
-
-	@Override
-	public int getTimestamp() {
-		return timestamp;
-	}
-
-	@Override
-	public IoBuffer getData() {
-		return data;
-	}
-
-	public FrameType getFrameType() {
-		return frameType;
-	}
-
-	public void setFrameType(FrameType frameType) {
-		this.frameType = frameType;
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.core.data.record.listener.async;
+
+import java.util.Date;
+
+import org.apache.mina.core.buffer.IoBuffer;
+import org.red5.server.api.stream.IStreamPacket;
+import org.red5.server.net.rtmp.event.VideoData.FrameType;
+
+public class CachedEvent implements IStreamPacket {
+	private byte dataType;
+	private int timestamp; //this is the timeStamp, showing the time elapsed since the microphone was turned on
+	private IoBuffer data;
+	private Date currentTime; //this is the actually current timeStamp when the packet with audio data did enter the server
+	private FrameType frameType = FrameType.UNKNOWN;
+
+	public Date getCurrentTime() {
+		return currentTime;
+	}
+
+	public void setCurrentTime(Date currentTime) {
+		this.currentTime = currentTime;
+	}
+
+	public void setDataType(byte dataType) {
+		this.dataType = dataType;
+	}
+
+	public void setTimestamp(int timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	public void setData(IoBuffer data) {
+		this.data = data;
+	}
+
+	@Override
+	public byte getDataType() {
+		return dataType;
+	}
+
+	@Override
+	public int getTimestamp() {
+		return timestamp;
+	}
+
+	@Override
+	public IoBuffer getData() {
+		return data;
+	}
+
+	public FrameType getFrameType() {
+		return frameType;
+	}
+
+	public void setFrameType(FrameType frameType) {
+		this.frameType = frameType;
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1cb3518f/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/StreamAudioWriter.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/StreamAudioWriter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/StreamAudioWriter.java
index a7391a6..736fea6 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/StreamAudioWriter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/StreamAudioWriter.java
@@ -1,228 +1,228 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.core.data.record.listener.async;
-
-import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
-import static org.red5.io.IoConstants.TYPE_AUDIO;
-import static org.red5.server.net.rtmp.event.VideoData.FrameType.KEYFRAME;
-
-import java.util.Date;
-
-import org.apache.mina.core.buffer.IoBuffer;
-import org.apache.openmeetings.db.dao.record.RecordingMetaDataDao;
-import org.apache.openmeetings.db.dao.record.RecordingMetaDeltaDao;
-import org.apache.openmeetings.db.entity.record.RecordingMetaData;
-import org.apache.openmeetings.db.entity.record.RecordingMetaDelta;
-import org.red5.io.ITag;
-import org.red5.io.flv.impl.Tag;
-import org.red5.logging.Red5LoggerFactory;
-import org.red5.server.api.scope.IScope;
-import org.slf4j.Logger;
-
-public class StreamAudioWriter extends BaseStreamWriter {
-	private static final Logger log = Red5LoggerFactory.getLogger(StreamAudioWriter.class, webAppRootKey);
-
-	private int duration = 0;
-
-	private Integer lastTimeStamp = -1;
-	private Date lastcurrentTime = null;
-
-	private int lastStreamPacketTimeStamp = -1;
-
-	private long byteCount = 0;
-
-	// Autowire is not possible
-	protected final RecordingMetaDeltaDao metaDeltaDao;
-
-	private boolean isInterview = false;
-
-	public StreamAudioWriter(String streamName, IScope scope, Long metaDataId, boolean isScreenData,
-			boolean isInterview, RecordingMetaDataDao metaDataDao, RecordingMetaDeltaDao metaDeltaDao) {
-		super(streamName, scope, metaDataId, isScreenData, metaDataDao);
-
-		this.metaDeltaDao = metaDeltaDao;
-		this.isInterview = isInterview;
-	}
-
-	@Override
-	public void packetReceived(CachedEvent streampacket) {
-		try {
-			// We only care about audio at this moment
-			if (isInterview || TYPE_AUDIO == streampacket.getDataType()) {
-				if (streampacket.getTimestamp() <= 0) {
-					log.warn("##REC:: Negative TimeStamp");
-					return;
-				}
-				// we should not skip audio data in case it is Audio only interview
-				if (isInterview && isScreenData && startTimeStamp == -1 && KEYFRAME != streampacket.getFrameType()) {
-					//skip until keyframe
-					log.trace("##REC:: no KEYFRAME, skipping");
-					return;
-				}
-				IoBuffer data = streampacket.getData().asReadOnlyBuffer();
-				if (data.limit() == 0) {
-					log.trace("##REC:: data.limit() == 0 ");
-					return;
-				}
-
-				byteCount += data.limit();
-
-				lastcurrentTime = streampacket.getCurrentTime();
-				int timeStamp = streampacket.getTimestamp();
-				Date virtualTime = streampacket.getCurrentTime();
-
-				if (startTimeStamp == -1) {
-					// Calculate the delta between the initial start and the first audio-packet data
-
-					initialDelta = virtualTime.getTime() - startedSessionTimeDate.getTime();
-
-					RecordingMetaDelta metaDelta = new RecordingMetaDelta();
-
-					metaDelta.setDeltaTime(initialDelta);
-					metaDelta.setMetaDataId(metaDataId);
-					metaDelta.setTimeStamp(0);
-					metaDelta.setDebugStatus("INIT AUDIO");
-					metaDelta.setStartPadding(true);
-					metaDelta.setEndPadding(false);
-					metaDelta.setDataLengthPacket(data.limit());
-					metaDelta.setReceivedAudioDataLength(byteCount);
-					metaDelta.setStartTime(startedSessionTimeDate);
-					metaDelta.setPacketTimeStamp(streampacket.getTimestamp());
-
-					Long deltaTimeStamp = virtualTime.getTime() - startedSessionTimeDate.getTime();
-
-					metaDelta.setDuration(0);
-
-					Long missingTime = deltaTimeStamp - 0;
-
-					metaDelta.setMissingTime(missingTime);
-
-					metaDelta.setCurrentTime(virtualTime);
-					metaDelta.setDeltaTimeStamp(deltaTimeStamp);
-					metaDelta.setStartTimeStamp(startTimeStamp);
-
-					metaDeltaDao.add(metaDelta);
-
-					// That will be not bigger then long value
-					startTimeStamp = streampacket.getTimestamp();
-				
-					RecordingMetaData metaData = metaDataDao.get(metaDataId);
-					metaData.setRecordStart(virtualTime);
-					metaDataDao.update(metaData);
-				}
-
-				lastStreamPacketTimeStamp = streampacket.getTimestamp();
-
-				timeStamp -= startTimeStamp;
-
-				// Offset at the beginning is calculated above
-				long deltaTime = lastTimeStamp == -1 ? 0 : timeStamp - lastTimeStamp;
-
-				Long preLastTimeStamp = Long.parseLong(lastTimeStamp.toString());
-
-				lastTimeStamp = timeStamp;
-
-				if (deltaTime > 75) {
-					RecordingMetaDelta metaDelta = new RecordingMetaDelta();
-
-					metaDelta.setDeltaTime(deltaTime);
-					metaDelta.setMetaDataId(metaDataId);
-					metaDelta.setTimeStamp(timeStamp);
-					metaDelta.setDebugStatus("RUN AUDIO");
-					metaDelta.setStartPadding(false);
-					metaDelta.setLastTimeStamp(preLastTimeStamp);
-					metaDelta.setEndPadding(false);
-					metaDelta.setDataLengthPacket(data.limit());
-					metaDelta.setReceivedAudioDataLength(byteCount);
-					metaDelta.setStartTime(startedSessionTimeDate);
-					metaDelta.setPacketTimeStamp(streampacket.getTimestamp());
-
-					Date current_date = new Date();
-					Long deltaTimeStamp = current_date.getTime() - startedSessionTimeDate.getTime();
-
-					duration = Math.max(duration, timeStamp + writer.getOffset());
-					metaDelta.setDuration(duration);
-
-					Long missingTime = deltaTimeStamp - timeStamp;
-
-					metaDelta.setMissingTime(missingTime);
-
-					metaDelta.setCurrentTime(current_date);
-					metaDelta.setDeltaTimeStamp(deltaTimeStamp);
-					metaDelta.setStartTimeStamp(startTimeStamp);
-
-					metaDeltaDao.add(metaDelta);
-				}
-
-				log.trace("##REC:: timeStamp :: " + timeStamp);
-				ITag tag = new Tag();
-				tag.setDataType(streampacket.getDataType());
-
-				// log.debug("data.limit() :: "+data.limit());
-				tag.setBodySize(data.limit());
-				tag.setTimestamp(timeStamp);
-				tag.setBody(data);
-
-				writer.writeTag(tag);
-
-			}
-		} catch (Exception e) {
-			log.error("##REC:: [packetReceived]", e);
-		}
-	}
-
-	@Override
-	protected void internalCloseStream() {
-		try {
-			// We do not add any End Padding or count the gaps for the
-			// Screen Data, cause there is no!
-
-			Date virtualTime = lastcurrentTime;
-			log.debug("##REC:: virtualTime: " + virtualTime);
-			log.debug("##REC:: startedSessionTimeDate: " + startedSessionTimeDate);
-
-			long deltaRecordingTime = virtualTime == null ? 0 : virtualTime.getTime() - startedSessionTimeDate.getTime();
-
-			log.debug("##REC:: lastTimeStamp :closeStream: " + lastTimeStamp);
-			log.debug("##REC:: lastStreamPacketTimeStamp :closeStream: " + lastStreamPacketTimeStamp);
-			log.debug("##REC:: deltaRecordingTime :closeStream: " + deltaRecordingTime);
-
-			long deltaTimePaddingEnd = deltaRecordingTime - lastTimeStamp - initialDelta;
-
-			log.debug("##REC:: deltaTimePaddingEnd :: " + deltaTimePaddingEnd);
-
-			RecordingMetaDelta metaDelta = new RecordingMetaDelta();
-
-			metaDelta.setDeltaTime(deltaTimePaddingEnd);
-			metaDelta.setMetaDataId(metaDataId);
-			metaDelta.setTimeStamp(lastTimeStamp);
-			metaDelta.setDebugStatus("END AUDIO");
-			metaDelta.setStartPadding(false);
-			metaDelta.setEndPadding(true);
-			metaDelta.setDataLengthPacket(null);
-			metaDelta.setReceivedAudioDataLength(byteCount);
-			metaDelta.setStartTime(startedSessionTimeDate);
-			metaDelta.setCurrentTime(new Date());
-
-			metaDeltaDao.add(metaDelta);
-		} catch (Exception err) {
-			log.error("##REC:: [internalCloseStream]", err);
-		}
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.core.data.record.listener.async;
+
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.red5.io.IoConstants.TYPE_AUDIO;
+import static org.red5.server.net.rtmp.event.VideoData.FrameType.KEYFRAME;
+
+import java.util.Date;
+
+import org.apache.mina.core.buffer.IoBuffer;
+import org.apache.openmeetings.db.dao.record.RecordingMetaDataDao;
+import org.apache.openmeetings.db.dao.record.RecordingMetaDeltaDao;
+import org.apache.openmeetings.db.entity.record.RecordingMetaData;
+import org.apache.openmeetings.db.entity.record.RecordingMetaDelta;
+import org.red5.io.ITag;
+import org.red5.io.flv.impl.Tag;
+import org.red5.logging.Red5LoggerFactory;
+import org.red5.server.api.scope.IScope;
+import org.slf4j.Logger;
+
+public class StreamAudioWriter extends BaseStreamWriter {
+	private static final Logger log = Red5LoggerFactory.getLogger(StreamAudioWriter.class, webAppRootKey);
+
+	private int duration = 0;
+
+	private Integer lastTimeStamp = -1;
+	private Date lastcurrentTime = null;
+
+	private int lastStreamPacketTimeStamp = -1;
+
+	private long byteCount = 0;
+
+	// Autowire is not possible
+	protected final RecordingMetaDeltaDao metaDeltaDao;
+
+	private boolean isInterview = false;
+
+	public StreamAudioWriter(String streamName, IScope scope, Long metaDataId, boolean isScreenData,
+			boolean isInterview, RecordingMetaDataDao metaDataDao, RecordingMetaDeltaDao metaDeltaDao) {
+		super(streamName, scope, metaDataId, isScreenData, metaDataDao);
+
+		this.metaDeltaDao = metaDeltaDao;
+		this.isInterview = isInterview;
+	}
+
+	@Override
+	public void packetReceived(CachedEvent streampacket) {
+		try {
+			// We only care about audio at this moment
+			if (isInterview || TYPE_AUDIO == streampacket.getDataType()) {
+				if (streampacket.getTimestamp() <= 0) {
+					log.warn("##REC:: Negative TimeStamp");
+					return;
+				}
+				// we should not skip audio data in case it is Audio only interview
+				if (isInterview && isScreenData && startTimeStamp == -1 && KEYFRAME != streampacket.getFrameType()) {
+					//skip until keyframe
+					log.trace("##REC:: no KEYFRAME, skipping");
+					return;
+				}
+				IoBuffer data = streampacket.getData().asReadOnlyBuffer();
+				if (data.limit() == 0) {
+					log.trace("##REC:: data.limit() == 0 ");
+					return;
+				}
+
+				byteCount += data.limit();
+
+				lastcurrentTime = streampacket.getCurrentTime();
+				int timeStamp = streampacket.getTimestamp();
+				Date virtualTime = streampacket.getCurrentTime();
+
+				if (startTimeStamp == -1) {
+					// Calculate the delta between the initial start and the first audio-packet data
+
+					initialDelta = virtualTime.getTime() - startedSessionTimeDate.getTime();
+
+					RecordingMetaDelta metaDelta = new RecordingMetaDelta();
+
+					metaDelta.setDeltaTime(initialDelta);
+					metaDelta.setMetaDataId(metaDataId);
+					metaDelta.setTimeStamp(0);
+					metaDelta.setDebugStatus("INIT AUDIO");
+					metaDelta.setStartPadding(true);
+					metaDelta.setEndPadding(false);
+					metaDelta.setDataLengthPacket(data.limit());
+					metaDelta.setReceivedAudioDataLength(byteCount);
+					metaDelta.setStartTime(startedSessionTimeDate);
+					metaDelta.setPacketTimeStamp(streampacket.getTimestamp());
+
+					Long deltaTimeStamp = virtualTime.getTime() - startedSessionTimeDate.getTime();
+
+					metaDelta.setDuration(0);
+
+					Long missingTime = deltaTimeStamp - 0;
+
+					metaDelta.setMissingTime(missingTime);
+
+					metaDelta.setCurrentTime(virtualTime);
+					metaDelta.setDeltaTimeStamp(deltaTimeStamp);
+					metaDelta.setStartTimeStamp(startTimeStamp);
+
+					metaDeltaDao.add(metaDelta);
+
+					// That will be not bigger then long value
+					startTimeStamp = streampacket.getTimestamp();
+				
+					RecordingMetaData metaData = metaDataDao.get(metaDataId);
+					metaData.setRecordStart(virtualTime);
+					metaDataDao.update(metaData);
+				}
+
+				lastStreamPacketTimeStamp = streampacket.getTimestamp();
+
+				timeStamp -= startTimeStamp;
+
+				// Offset at the beginning is calculated above
+				long deltaTime = lastTimeStamp == -1 ? 0 : timeStamp - lastTimeStamp;
+
+				Long preLastTimeStamp = Long.parseLong(lastTimeStamp.toString());
+
+				lastTimeStamp = timeStamp;
+
+				if (deltaTime > 75) {
+					RecordingMetaDelta metaDelta = new RecordingMetaDelta();
+
+					metaDelta.setDeltaTime(deltaTime);
+					metaDelta.setMetaDataId(metaDataId);
+					metaDelta.setTimeStamp(timeStamp);
+					metaDelta.setDebugStatus("RUN AUDIO");
+					metaDelta.setStartPadding(false);
+					metaDelta.setLastTimeStamp(preLastTimeStamp);
+					metaDelta.setEndPadding(false);
+					metaDelta.setDataLengthPacket(data.limit());
+					metaDelta.setReceivedAudioDataLength(byteCount);
+					metaDelta.setStartTime(startedSessionTimeDate);
+					metaDelta.setPacketTimeStamp(streampacket.getTimestamp());
+
+					Date current_date = new Date();
+					Long deltaTimeStamp = current_date.getTime() - startedSessionTimeDate.getTime();
+
+					duration = Math.max(duration, timeStamp + writer.getOffset());
+					metaDelta.setDuration(duration);
+
+					Long missingTime = deltaTimeStamp - timeStamp;
+
+					metaDelta.setMissingTime(missingTime);
+
+					metaDelta.setCurrentTime(current_date);
+					metaDelta.setDeltaTimeStamp(deltaTimeStamp);
+					metaDelta.setStartTimeStamp(startTimeStamp);
+
+					metaDeltaDao.add(metaDelta);
+				}
+
+				log.trace("##REC:: timeStamp :: " + timeStamp);
+				ITag tag = new Tag();
+				tag.setDataType(streampacket.getDataType());
+
+				// log.debug("data.limit() :: "+data.limit());
+				tag.setBodySize(data.limit());
+				tag.setTimestamp(timeStamp);
+				tag.setBody(data);
+
+				writer.writeTag(tag);
+
+			}
+		} catch (Exception e) {
+			log.error("##REC:: [packetReceived]", e);
+		}
+	}
+
+	@Override
+	protected void internalCloseStream() {
+		try {
+			// We do not add any End Padding or count the gaps for the
+			// Screen Data, cause there is no!
+
+			Date virtualTime = lastcurrentTime;
+			log.debug("##REC:: virtualTime: " + virtualTime);
+			log.debug("##REC:: startedSessionTimeDate: " + startedSessionTimeDate);
+
+			long deltaRecordingTime = virtualTime == null ? 0 : virtualTime.getTime() - startedSessionTimeDate.getTime();
+
+			log.debug("##REC:: lastTimeStamp :closeStream: " + lastTimeStamp);
+			log.debug("##REC:: lastStreamPacketTimeStamp :closeStream: " + lastStreamPacketTimeStamp);
+			log.debug("##REC:: deltaRecordingTime :closeStream: " + deltaRecordingTime);
+
+			long deltaTimePaddingEnd = deltaRecordingTime - lastTimeStamp - initialDelta;
+
+			log.debug("##REC:: deltaTimePaddingEnd :: " + deltaTimePaddingEnd);
+
+			RecordingMetaDelta metaDelta = new RecordingMetaDelta();
+
+			metaDelta.setDeltaTime(deltaTimePaddingEnd);
+			metaDelta.setMetaDataId(metaDataId);
+			metaDelta.setTimeStamp(lastTimeStamp);
+			metaDelta.setDebugStatus("END AUDIO");
+			metaDelta.setStartPadding(false);
+			metaDelta.setEndPadding(true);
+			metaDelta.setDataLengthPacket(null);
+			metaDelta.setReceivedAudioDataLength(byteCount);
+			metaDelta.setStartTime(startedSessionTimeDate);
+			metaDelta.setCurrentTime(new Date());
+
+			metaDeltaDao.add(metaDelta);
+		} catch (Exception err) {
+			log.error("##REC:: [internalCloseStream]", err);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1cb3518f/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/StreamVideoWriter.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/StreamVideoWriter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/StreamVideoWriter.java
index 169379d..8596042 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/StreamVideoWriter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/record/listener/async/StreamVideoWriter.java
@@ -1,98 +1,98 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.core.data.record.listener.async;
-
-import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
-import static org.red5.server.net.rtmp.event.VideoData.FrameType.KEYFRAME;
-
-import java.util.Date;
-
-import org.apache.mina.core.buffer.IoBuffer;
-import org.apache.openmeetings.db.dao.record.RecordingMetaDataDao;
-import org.apache.openmeetings.db.entity.record.RecordingMetaData;
-import org.red5.io.ITag;
-import org.red5.io.flv.impl.Tag;
-import org.red5.logging.Red5LoggerFactory;
-import org.red5.server.api.scope.IScope;
-import org.slf4j.Logger;
-
-public class StreamVideoWriter extends BaseStreamWriter {
-	private static final Logger log = Red5LoggerFactory.getLogger(StreamVideoWriter.class, webAppRootKey);
-	private Date startedSessionScreenTimeDate = null;
-
-	public StreamVideoWriter(String streamName, IScope scope, Long metaDataId, boolean isScreenData,
-			RecordingMetaDataDao metaDataDao) {
-
-		super(streamName, scope, metaDataId, isScreenData, metaDataDao);
-	}
-
-	@Override
-	public void packetReceived(CachedEvent streampacket) {
-		try {
-			int timeStamp = streampacket.getTimestamp();
-			log.trace("incoming timeStamp :: " + timeStamp);
-			if (startTimeStamp == -1 && KEYFRAME != streampacket.getFrameType()) {
-				//skip until keyframe
-				log.trace("no KEYFRAME, skipping ::" + streampacket.getFrameType());
-				return;
-			}
-			if (timeStamp <= 0) {
-				log.warn("Negative TimeStamp");
-				return;
-			}
-			IoBuffer data = streampacket.getData().asReadOnlyBuffer();
-			if (data.limit() == 0) {
-				log.trace("Data.limit() == 0");
-				return;
-			}
-			Date virtualTime = streampacket.getCurrentTime();
-
-			if (startedSessionScreenTimeDate == null) {
-				startedSessionScreenTimeDate = virtualTime;
-
-				RecordingMetaData metaData = metaDataDao.get(metaDataId);
-				metaData.setRecordStart(virtualTime);
-				metaDataDao.update(metaData);
-			}
-
-			if (startTimeStamp == -1) {
-				// That will be not bigger then long value
-				startTimeStamp = timeStamp;
-			}
-
-			timeStamp -= startTimeStamp;
-
-			log.trace("timeStamp :: " + timeStamp);
-			ITag tag = new Tag();
-			tag.setDataType(streampacket.getDataType());
-
-			tag.setBodySize(data.limit());
-			tag.setTimestamp(timeStamp);
-			tag.setBody(data);
-
-			writer.writeTag(tag);
-		} catch (Exception e) {
-			log.error("[packetReceived]", e);
-		}
-	}
-
-	@Override
-	protected void internalCloseStream() {
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.core.data.record.listener.async;
+
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.red5.server.net.rtmp.event.VideoData.FrameType.KEYFRAME;
+
+import java.util.Date;
+
+import org.apache.mina.core.buffer.IoBuffer;
+import org.apache.openmeetings.db.dao.record.RecordingMetaDataDao;
+import org.apache.openmeetings.db.entity.record.RecordingMetaData;
+import org.red5.io.ITag;
+import org.red5.io.flv.impl.Tag;
+import org.red5.logging.Red5LoggerFactory;
+import org.red5.server.api.scope.IScope;
+import org.slf4j.Logger;
+
+public class StreamVideoWriter extends BaseStreamWriter {
+	private static final Logger log = Red5LoggerFactory.getLogger(StreamVideoWriter.class, webAppRootKey);
+	private Date startedSessionScreenTimeDate = null;
+
+	public StreamVideoWriter(String streamName, IScope scope, Long metaDataId, boolean isScreenData,
+			RecordingMetaDataDao metaDataDao) {
+
+		super(streamName, scope, metaDataId, isScreenData, metaDataDao);
+	}
+
+	@Override
+	public void packetReceived(CachedEvent streampacket) {
+		try {
+			int timeStamp = streampacket.getTimestamp();
+			log.trace("incoming timeStamp :: " + timeStamp);
+			if (startTimeStamp == -1 && KEYFRAME != streampacket.getFrameType()) {
+				//skip until keyframe
+				log.trace("no KEYFRAME, skipping ::" + streampacket.getFrameType());
+				return;
+			}
+			if (timeStamp <= 0) {
+				log.warn("Negative TimeStamp");
+				return;
+			}
+			IoBuffer data = streampacket.getData().asReadOnlyBuffer();
+			if (data.limit() == 0) {
+				log.trace("Data.limit() == 0");
+				return;
+			}
+			Date virtualTime = streampacket.getCurrentTime();
+
+			if (startedSessionScreenTimeDate == null) {
+				startedSessionScreenTimeDate = virtualTime;
+
+				RecordingMetaData metaData = metaDataDao.get(metaDataId);
+				metaData.setRecordStart(virtualTime);
+				metaDataDao.update(metaData);
+			}
+
+			if (startTimeStamp == -1) {
+				// That will be not bigger then long value
+				startTimeStamp = timeStamp;
+			}
+
+			timeStamp -= startTimeStamp;
+
+			log.trace("timeStamp :: " + timeStamp);
+			ITag tag = new Tag();
+			tag.setDataType(streampacket.getDataType());
+
+			tag.setBodySize(data.limit());
+			tag.setTimestamp(timeStamp);
+			tag.setBody(data);
+
+			writer.writeTag(tag);
+		} catch (Exception e) {
+			log.error("[packetReceived]", e);
+		}
+	}
+
+	@Override
+	protected void internalCloseStream() {
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1cb3518f/openmeetings-core/src/main/java/org/apache/openmeetings/core/mail/SMSHandler.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/mail/SMSHandler.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/mail/SMSHandler.java
index 89d62b4..bf17d61 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/mail/SMSHandler.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/mail/SMSHandler.java
@@ -1,118 +1,118 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.core.mail;
-
-import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
-import org.apache.openmeetings.util.OpenmeetingsVariables;
-import org.red5.logging.Red5LoggerFactory;
-import org.slf4j.Logger;
-import org.smslib.Message.MessageEncodings;
-import org.smslib.OutboundMessage;
-import org.smslib.Service;
-import org.smslib.http.BulkSmsHTTPGateway;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.task.TaskExecutor;
-
-/**
- * 
- * @author iarkh
- * 
- */
-
-public class SMSHandler {
-
-	private static final Logger log = Red5LoggerFactory.getLogger(
-			SMSHandler.class, OpenmeetingsVariables.webAppRootKey);
-
-	@Autowired
-	protected ConfigurationDao configurationDao;
-	@Autowired
-	protected TaskExecutor taskExecutor;
-
-	private BulkSmsHTTPGateway gateway = null;
-	
-	private boolean checkBalance() throws Exception {
-		if (gateway == null) {
-			String smsProvider = configurationDao.getConfValue("sms.provider", String.class, null);
-			String smsUsername = configurationDao.getConfValue("sms.username", String.class, null);
-			String smsUserpass = configurationDao.getConfValue("sms.userpass", String.class, null);
-
-			if (smsProvider == null || smsProvider.length() == 0 ||
-					smsUsername == null || smsUsername.length() == 0) {
-				log.error("SMS Provider is not configured properly!");
-				return false;
-			}
-			gateway = new BulkSmsHTTPGateway(smsProvider, smsUsername, smsUserpass);
-			gateway.setOutbound(true);
-			Service.getInstance().addGateway(gateway);
-			Service.getInstance().startService();
-		}
-		return gateway.queryBalance() >= 1; 
-	}
-	
-	public boolean sendSMS(String phone, String subj, long languageId) {
-		try {
-			taskExecutor.execute(new SMSSenderTask(phone, subj, languageId));
-			return true;
-		} catch (Exception ex) {
-			log.error("sendSMS", ex);
-			return false;
-		}
-	}
-	
-	protected class SMSSenderTask implements Runnable {
-		private final String phone;
-		private final String subject;
-		private long languageId;
-
-		public SMSSenderTask(String phone, String subject, long languageId) {
-			this.phone = phone;
-			this.subject = subject;
-			this.languageId = languageId;
-		}
-
-		@Override
-		public void run() {
-			this.send();
-		}
-
-		/**
-		 * Sending an SMS with the given values.
-		 * @return <code>true</code> if sms was sent successfully, <code>false</code> otherwise.
-		 */
-		public boolean send() {
-			try {
-				log.debug("SMS sending to: " + phone + ", subject is: " + subject);
-				if (checkBalance()) {
-					OutboundMessage msg = new OutboundMessage(phone, subject);
-					if (languageId != 1) {
-						msg.setEncoding(MessageEncodings.ENCUCS2);
-					}
-					return Service.getInstance().sendMessage(msg);
-				} else {
-					log.error("Error: insufficient funds on SMS provider account!");
-					return false; 
-				}
-			} catch (Exception ex) {
-				log.error("Error sending sms: ", ex);
-				return false;
-			} 
-		}
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.core.mail;
+
+import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
+import org.apache.openmeetings.util.OpenmeetingsVariables;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+import org.smslib.Message.MessageEncodings;
+import org.smslib.OutboundMessage;
+import org.smslib.Service;
+import org.smslib.http.BulkSmsHTTPGateway;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.task.TaskExecutor;
+
+/**
+ * 
+ * @author iarkh
+ * 
+ */
+
+public class SMSHandler {
+
+	private static final Logger log = Red5LoggerFactory.getLogger(
+			SMSHandler.class, OpenmeetingsVariables.webAppRootKey);
+
+	@Autowired
+	protected ConfigurationDao configurationDao;
+	@Autowired
+	protected TaskExecutor taskExecutor;
+
+	private BulkSmsHTTPGateway gateway = null;
+	
+	private boolean checkBalance() throws Exception {
+		if (gateway == null) {
+			String smsProvider = configurationDao.getConfValue("sms.provider", String.class, null);
+			String smsUsername = configurationDao.getConfValue("sms.username", String.class, null);
+			String smsUserpass = configurationDao.getConfValue("sms.userpass", String.class, null);
+
+			if (smsProvider == null || smsProvider.length() == 0 ||
+					smsUsername == null || smsUsername.length() == 0) {
+				log.error("SMS Provider is not configured properly!");
+				return false;
+			}
+			gateway = new BulkSmsHTTPGateway(smsProvider, smsUsername, smsUserpass);
+			gateway.setOutbound(true);
+			Service.getInstance().addGateway(gateway);
+			Service.getInstance().startService();
+		}
+		return gateway.queryBalance() >= 1; 
+	}
+	
+	public boolean sendSMS(String phone, String subj, long languageId) {
+		try {
+			taskExecutor.execute(new SMSSenderTask(phone, subj, languageId));
+			return true;
+		} catch (Exception ex) {
+			log.error("sendSMS", ex);
+			return false;
+		}
+	}
+	
+	protected class SMSSenderTask implements Runnable {
+		private final String phone;
+		private final String subject;
+		private long languageId;
+
+		public SMSSenderTask(String phone, String subject, long languageId) {
+			this.phone = phone;
+			this.subject = subject;
+			this.languageId = languageId;
+		}
+
+		@Override
+		public void run() {
+			this.send();
+		}
+
+		/**
+		 * Sending an SMS with the given values.
+		 * @return <code>true</code> if sms was sent successfully, <code>false</code> otherwise.
+		 */
+		public boolean send() {
+			try {
+				log.debug("SMS sending to: " + phone + ", subject is: " + subject);
+				if (checkBalance()) {
+					OutboundMessage msg = new OutboundMessage(phone, subject);
+					if (languageId != 1) {
+						msg.setEncoding(MessageEncodings.ENCUCS2);
+					}
+					return Service.getInstance().sendMessage(msg);
+				} else {
+					log.error("Error: insufficient funds on SMS provider account!");
+					return false; 
+				}
+			} catch (Exception ex) {
+				log.error("Error sending sms: ", ex);
+				return false;
+			} 
+		}
+	}
+}