tux-droid-svn Mailing List for Tux Droid CE (Page 49)
Status: Beta
Brought to you by:
ks156
You can subscribe to this list here.
| 2007 |
Jan
|
Feb
(32) |
Mar
(108) |
Apr
(71) |
May
(38) |
Jun
(128) |
Jul
(1) |
Aug
(14) |
Sep
(77) |
Oct
(104) |
Nov
(90) |
Dec
(71) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2008 |
Jan
(81) |
Feb
(18) |
Mar
(40) |
Apr
(102) |
May
(151) |
Jun
(74) |
Jul
(151) |
Aug
(257) |
Sep
(447) |
Oct
(379) |
Nov
(404) |
Dec
(430) |
| 2009 |
Jan
(173) |
Feb
(236) |
Mar
(519) |
Apr
(300) |
May
(112) |
Jun
(232) |
Jul
(314) |
Aug
(58) |
Sep
(203) |
Oct
(293) |
Nov
(26) |
Dec
(109) |
| 2010 |
Jan
(19) |
Feb
(25) |
Mar
(33) |
Apr
(1) |
May
|
Jun
(3) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: remi <c2m...@c2...> - 2009-06-19 08:46:59
|
Author: remi
Date: 2009-06-19 10:46:48 +0200 (Fri, 19 Jun 2009)
New Revision: 4830
Modified:
software_suite_v3/smart-core/smart-server/trunk/TuxDroidServer.py
Log:
* removed a duplicated command
Modified: software_suite_v3/smart-core/smart-server/trunk/TuxDroidServer.py
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/TuxDroidServer.py 2009-06-19 08:44:24 UTC (rev 4829)
+++ software_suite_v3/smart-core/smart-server/trunk/TuxDroidServer.py 2009-06-19 08:46:48 UTC (rev 4830)
@@ -69,7 +69,6 @@
resourcesManager.addDirectoryToServe("/data/web_interface/devel/img/")
resourcesManager.addDirectoryToServe("/data/web_interface/devel/js/")
# User 01 web interface
- resourcesManager.start()
resourcesManager.addDirectoryToServe("/data/web_interface/user_01/xsl/")
resourcesManager.addDirectoryToServe("/data/web_interface/user_01/css/")
resourcesManager.addDirectoryToServe("/data/web_interface/user_01/img/")
|
|
From: remi <c2m...@c2...> - 2009-06-19 08:44:52
|
Author: remi
Date: 2009-06-19 10:44:24 +0200 (Fri, 19 Jun 2009)
New Revision: 4829
Added:
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/css/
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/frame_01_bottom.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/frame_01_middle.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/frame_01_top.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_center_activate.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_center_enable.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_left_activate.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_left_enable.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_right_activate.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_right_enable.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_closeerror_activate.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_closeerror_enable.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_configure_activate.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_configure_enable.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_startstop_activate.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_startstop_enable.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_hint_bottom.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_hint_bottom_error.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_hint_content.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_pic_tux_idle.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_active_off.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_active_on.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_100.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_20.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_40.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_60.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_80.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_oncharge.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_btn_soundoff_activate.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_btn_soundoff_enable.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_btn_soundon_activate.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_btn_soundon_enable.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_frame.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_pic_dongle.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_pic_radio.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/thumnailbar_btn_next_activate.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/thumnailbar_btn_next_enable.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/thumnailbar_btn_previous_activate.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/thumnailbar_btn_previous_enable.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/thumnailbar_view.png
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/js/
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/xsl/
Modified:
software_suite_v3/smart-core/smart-server/trunk/TuxDroidServer.py
Log:
* added skin directory for the user interface 01
* added images for the menu and the page "Live with Tux"
* registered the skin in the server
Modified: software_suite_v3/smart-core/smart-server/trunk/TuxDroidServer.py
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/TuxDroidServer.py 2009-06-18 13:53:42 UTC (rev 4828)
+++ software_suite_v3/smart-core/smart-server/trunk/TuxDroidServer.py 2009-06-19 08:44:24 UTC (rev 4829)
@@ -68,7 +68,12 @@
resourcesManager.addDirectoryToServe("/data/web_interface/devel/css/")
resourcesManager.addDirectoryToServe("/data/web_interface/devel/img/")
resourcesManager.addDirectoryToServe("/data/web_interface/devel/js/")
+ # User 01 web interface
resourcesManager.start()
+ resourcesManager.addDirectoryToServe("/data/web_interface/user_01/xsl/")
+ resourcesManager.addDirectoryToServe("/data/web_interface/user_01/css/")
+ resourcesManager.addDirectoryToServe("/data/web_interface/user_01/img/")
+ resourcesManager.addDirectoryToServe("/data/web_interface/user_01/js/")
# Start the clients manager
clientsManager.start()
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/frame_01_bottom.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/frame_01_bottom.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/frame_01_middle.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/frame_01_middle.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/frame_01_top.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/frame_01_top.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_center_activate.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_center_activate.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_center_enable.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_center_enable.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_left_activate.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_left_activate.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_left_enable.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_left_enable.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_right_activate.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_right_activate.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_right_enable.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/menu_right_enable.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_closeerror_activate.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_closeerror_activate.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_closeerror_enable.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_closeerror_enable.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_configure_activate.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_configure_activate.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_configure_enable.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_configure_enable.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_startstop_activate.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_startstop_activate.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_startstop_enable.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_btn_startstop_enable.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_hint_bottom.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_hint_bottom.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_hint_bottom_error.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_hint_bottom_error.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_hint_content.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_hint_content.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_pic_tux_idle.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/notify_pic_tux_idle.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_active_off.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_active_off.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_active_on.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_active_on.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_100.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_100.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_20.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_20.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_40.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_40.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_60.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_60.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_80.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_80.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_oncharge.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_battery_oncharge.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_btn_soundoff_activate.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_btn_soundoff_activate.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_btn_soundoff_enable.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_btn_soundoff_enable.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_btn_soundon_activate.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_btn_soundon_activate.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_btn_soundon_enable.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_btn_soundon_enable.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_frame.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_frame.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_pic_dongle.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_pic_dongle.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_pic_radio.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/status_pic_radio.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/thumnailbar_btn_next_activate.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/thumnailbar_btn_next_activate.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/thumnailbar_btn_next_enable.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/thumnailbar_btn_next_enable.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/thumnailbar_btn_previous_activate.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/thumnailbar_btn_previous_activate.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/thumnailbar_btn_previous_enable.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/thumnailbar_btn_previous_enable.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/thumnailbar_view.png
===================================================================
(Binary files differ)
Property changes on: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/img/thumnailbar_view.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
|
|
From: remi <c2m...@c2...> - 2009-06-18 14:16:38
|
Author: remi
Date: 2009-06-18 15:53:42 +0200 (Thu, 18 Jun 2009)
New Revision: 4828
Modified:
software_suite_v3/smart-core/smart-server/trunk/resources/01_drivers/01_resourceTuxOSL.py
software_suite_v3/smart-core/smart-server/trunk/resources/04_robot_content_interactions/00_resourceRobotContentInteractions.py
software_suite_v3/smart-core/smart-server/trunk/resources/05_user_configurations/00_resourceUsers.py
software_suite_v3/smart-core/smart-server/trunk/util/misc/tuxPaths.py
Log:
* added support of second language and second locutor in the user configuration.
* auto-load the voices when TuxOsl is started
* fixed file format of the resource "robot content interactions"
Modified: software_suite_v3/smart-core/smart-server/trunk/resources/01_drivers/01_resourceTuxOSL.py
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/resources/01_drivers/01_resourceTuxOSL.py 2009-06-18 08:55:41 UTC (rev 4827)
+++ software_suite_v3/smart-core/smart-server/trunk/resources/01_drivers/01_resourceTuxOSL.py 2009-06-18 13:53:42 UTC (rev 4828)
@@ -96,6 +96,17 @@
self.__tuxOSL.Start("Acapela")
time.sleep(0.5)
self.__initializeStatesInEventsHandler()
+ time.sleep(3.0)
+ # Load first voice
+ pitch = resourceUsers.getCurrentUserConfiguration()['pitch']
+ firstLocutor = resourceUsers.getCurrentUserConfiguration()['locutor1']
+ self.ttsSpeak(" ", firstLocutor, pitch)
+ time.sleep(3.0)
+ # Load second voice
+ secondLocutor = resourceUsers.getCurrentUserConfiguration()['locutor2']
+ self.ttsSpeak(" ", secondLocutor, pitch)
+ time.sleep(3.0)
+ resourceRobotContentInteractions.startMe()
if value:
t = threading.Thread(target = startTuxOsl)
t.start()
Modified: software_suite_v3/smart-core/smart-server/trunk/resources/04_robot_content_interactions/00_resourceRobotContentInteractions.py
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/resources/04_robot_content_interactions/00_resourceRobotContentInteractions.py 2009-06-18 08:55:41 UTC (rev 4827)
+++ software_suite_v3/smart-core/smart-server/trunk/resources/04_robot_content_interactions/00_resourceRobotContentInteractions.py 2009-06-18 13:53:42 UTC (rev 4828)
@@ -1,892 +1,913 @@
-# Copyright (C) 2009 C2ME Sa
-# Remi Jocaille <rem...@c2...>
-# Distributed under the terms of the GNU General Public License
-# http://www.gnu.org/copyleft/gpl.html
-
-import time
-
-PGU_CONTEXT_LAYER_USER = 0
-PGU_CONTEXT_LAYER_SCHEDULER = 1
-
-PGU_EVENT_TYPE_MESSAGE = 0
-PGU_EVENT_TYPE_ACTUATION = 1
-PGU_EVENT_TYPE_ATTITUNE = 2
-
-class PguContext(object):
- """
- """
-
- def __init__(self, pluginInterpreterContext):
- """
- """
- self.__createTime = time.time()
- self.__pluginInterpreterContext = pluginInterpreterContext
- uuid = pluginInterpreterContext.getHostUuid()
- # Get pguObject
- self.__pguObject = resourcePluginsServer.getPluginsContainer().getPluginByUuid(uuid)
- if self.__pguObject == None:
- self.__pguObject = resourceGadgetsServer.getGadgetsContainer().getGadgetByUuid(uuid)
- if self.__pguObject == None:
- self.__pguObject = resourceUgcServer.getUgcContainer().getUgcByUuid(uuid)
- # Get context layer
- self.__contextLayer = PGU_CONTEXT_LAYER_USER
- if self.__pluginInterpreterContext.getInstanceParameters().has_key("startedBy"):
- if self.__pluginInterpreterContext.getInstanceParameters()['startedBy'] == 'scheduler':
- self.__contextLayer = PGU_CONTEXT_LAYER_SCHEDULER
- self.__eventStack = []
- self.__eventStackMutex = threading.Lock()
- self.__contextComplete = False
- self.__contextCompleteMutex = threading.Lock()
- self.__startStopPauseMutex = threading.Lock()
- self.__execStarted = False
- self.__execPaused = False
-
- def getPluginInterpreterContext(self):
- """
- """
- return self.__pluginInterpreterContext
-
- def getPguUuid(self):
- """
- """
- return self.__pluginInterpreterContext.getHostUuid()
-
- def getPguName(self):
- """
- """
- return self.__pguObject.getDescription().getName()
-
- def getContextLayer(self):
- """
- """
- return self.__contextLayer
-
- def getPguObject(self):
- """
- """
- return self.__pguObject
-
- def isDaemon(self):
- """
- """
- return self.__pluginInterpreterContext.instanceIsDaemon()
-
- def getPluginCommand(self):
- """
- """
- return self.__pguObject.getCommand(
- self.__pluginInterpreterContext.getInstanceCommandName())
-
- def setContextIsComplete(self):
- """
- """
- if not self.contextIsComplete():
- print "PGU Context [%s] content is complete" % self.getPguName()
- self.__contextCompleteMutex.acquire()
- self.__contextComplete = True
- self.__contextCompleteMutex.release()
-
- def contextIsComplete(self):
- """
- """
- self.__contextCompleteMutex.acquire()
- result = self.__contextComplete
- self.__contextCompleteMutex.release()
- return result
-
- def __insertEvent(self, eventType, arguments = {}):
- """
- """
- if self.contextIsComplete():
- return
- self.__eventStackMutex.acquire()
- self.__eventStack.append({
- 'type' : eventType,
- 'arguments' : arguments,
- })
- self.__eventStackMutex.release()
- print "Inserted event in PGU context [%s] :" % self.getPguName()
- print " ", eventType
- print " ", arguments
-
- def __getEvent(self):
- """
- """
- self.__eventStackMutex.acquire()
- result = None
- if len(self.__eventStack) > 0:
- result = self.__eventStack.pop(0)
- self.__eventStackMutex.release()
- return result
-
- def insertMessage(self, message, locutor, pitch):
- """
- """
- self.__insertEvent(PGU_EVENT_TYPE_MESSAGE, {
- 'message' : message,
- 'locutor' : locutor,
- 'pitch' : pitch,
- })
-
- def insertActuation(self, actuationName, arguments = []):
- """
- """
- # Little hack for plugins audio menu
- if actuationName == "abortTts":
- self.__breakMessage()
- return
- self.__insertEvent(PGU_EVENT_TYPE_ACTUATION, {
- 'actuationName' : actuationName,
- 'actuationArguments' : arguments,
- })
-
- def insertAttitune(self, attituneName):
- """
- """
- self.__insertEvent(PGU_EVENT_TYPE_ATTITUNE, {
- 'attituneName' : attituneName,
- })
-
- def startExecution(self):
- """
- """
- if self.executionIsStarted():
- return
- expirationDelay = self.getPluginCommand().getExpirationDelay()
- if expirationDelay > 0:
- if (time.time() - self.__createTime) > expirationDelay:
- return
- self.__startStopPauseMutex.acquire()
- self.__execStarted = True
- self.__execPaused = False
- self.__startStopPauseMutex.release()
- print "Start execution of PGU context [%s]" % self.getPguName()
- self.__executionLoop()
-
- def executionIsStarted(self):
- """
- """
- self.__startStopPauseMutex.acquire()
- result = self.__execStarted
- self.__startStopPauseMutex.release()
- return result
-
- def stopExecution(self):
- """
- """
- if not self.getPluginCommand().isNotifier():
- self.__pluginInterpreterContext.abort()
- if not self.executionIsStarted():
- return
- print "Stop execution of PGU context [%s]" % self.getPguName()
- self.__startStopPauseMutex.acquire()
- self.__execStarted = False
- self.__execPaused = False
- self.__eventStackMutex.acquire()
- self.__eventStack = []
- self.__eventStackMutex.release()
- self.__startStopPauseMutex.release()
- self.__breakAttitune()
- self.__breakMessage()
- self.__breakActuation()
- print "Execution of PGU context [%s] stopped" % self.getPguName()
- if not self.getPluginCommand().isNotifier():
- if self.getContextLayer() == PGU_CONTEXT_LAYER_SCHEDULER:
- resourceTuxDriver.playSound(15, 100.0)
- else:
- resourceTuxDriver.playSound(16, 100.0)
- time.sleep(0.5)
-
- def pauseExecution(self):
- """
- """
- if not self.executionIsStarted():
- return
- if self.executionIsPaused():
- return
- print "Pause execution of PGU context [%s]" % self.getPguName()
- self.__startStopPauseMutex.acquire()
- self.__execPaused = True
- self.__startStopPauseMutex.release()
- self.__breakAttitune()
- self.__breakMessage()
- self.__breakActuation()
-
- def unpauseExecution(self):
- """
- """
- if not self.executionIsStarted():
- return
- if not self.executionIsPaused():
- return
- print "Unpause execution of PGU context [%s]" % self.getPguName()
- self.__startStopPauseMutex.acquire()
- self.__execPaused = False
- self.__startStopPauseMutex.release()
-
- def executionIsPaused(self):
- """
- """
- self.__startStopPauseMutex.acquire()
- result = self.__execPaused
- self.__startStopPauseMutex.release()
- return result
-
- def __executeAttitune(self, attituneName):
- """
- """
- resourceAttituneManager.playAttituneSync(attituneName, 0.0)
-
- def __breakAttitune(self):
- """
- """
- resourceAttituneManager.stopAttitune()
-
- def __executeMessage(self, text, locutor, pitch):
- """
- """
- if not self.executionIsStarted():
- return
- resourceTuxDriver.openMouth()
- if not self.executionIsStarted():
- resourceTuxDriver.closeMouth()
- return
- resourceTuxOSL.ttsSpeak(text, locutor, pitch)
- if not self.executionIsStarted():
- resourceTuxDriver.closeMouth()
- return
- if not eventsHandler.waitCondition(ST_NAME_TTS_SOUND_STATE, ("ON",
- None), 3.0):
- return
- if self.executionIsStarted():
- eventsHandler.waitCondition(ST_NAME_TTS_SOUND_STATE, ("OFF", None),
- 600.0)
- resourceTuxDriver.closeMouth()
-
- def __breakMessage(self):
- """
- """
- resourceTuxOSL.ttsStop()
- eventsHandler.emit(ST_NAME_TTS_SOUND_STATE, ("OFF", 0.0))
-
- def __executeActuation(self, actuationName, arguments):
- """
- """
- argsString = ""
- for argument in arguments:
- if len(argsString) > 0:
- argsString += ","
- try:
- argument = int(argument)
- argsString += str(argument)
- except:
- try:
- argument = float(argument)
- argsString += str(argument)
- except:
- argsString += '"' + str(argument) + '"'
- cmdString = "resourceTuxDriver.%s(%s)" % (actuationName, argsString)
- try:
- exec(cmdString) in globals()
- except:
- print "!!! Error in command :", cmdString
-
- def __breakActuation(self):
- """
- """
- resourceTuxDriver.clearAll()
-
- def __executionLoop(self):
- """
- """
- if not self.getPluginCommand().isNotifier():
- if self.getContextLayer() == PGU_CONTEXT_LAYER_SCHEDULER:
- resourceTuxDriver.playSound(14, 100.0)
- else:
- resourceTuxDriver.playSound(13, 100.0)
- time.sleep(0.5)
- while self.executionIsStarted():
- while self.executionIsPaused():
- time.sleep(0.1)
- nextEvent = self.__getEvent()
- if nextEvent == None:
- if self.contextIsComplete():
- self.__startStopPauseMutex.acquire()
- self.__execStarted = False
- self.__execPaused = False
- self.__startStopPauseMutex.release()
- print "Execution of PGU context [%s] stopped" % self.getPguName()
- if not self.getPluginCommand().isNotifier():
- if self.getContextLayer() == PGU_CONTEXT_LAYER_SCHEDULER:
- resourceTuxDriver.playSound(15, 100.0)
- else:
- resourceTuxDriver.playSound(16, 100.0)
- time.sleep(0.5)
- return
- else:
- print "Execute event from PGU context [%s] :" % self.getPguName()
- print " ", nextEvent['type']
- print " ", nextEvent['arguments']
- arguments = nextEvent['arguments']
- if not self.executionIsStarted():
- continue
- if nextEvent['type'] == PGU_EVENT_TYPE_MESSAGE:
- self.__executeMessage(arguments['message'],
- arguments['locutor'], arguments['pitch'])
- elif nextEvent['type'] == PGU_EVENT_TYPE_ACTUATION:
- self.__executeActuation(arguments['actuationName'],
- arguments['actuationArguments'])
- elif nextEvent['type'] == PGU_EVENT_TYPE_ATTITUNE:
- self.__executeAttitune(arguments['attituneName'])
- print "Event finished"
- time.sleep(0.1)
-
-class PguContextsManager(object):
- """
- """
-
- def __init__(self):
- """
- """
- self.__pguContexts = []
- self.__pguContextsMutex = threading.Lock()
- self.__backgroundPguContext = None
- self.__foregroundPguContext = None
- self.__backgroundPguThread = None
- self.__bfPguContextMutex = threading.Lock()
- self.__isStarted = False
- self.__startedMutex = threading.Lock()
- self.__loopThread = None
- self.__onDemandList = []
- self.__onDemandIndex = 0
- self.__lastRunStopActionTime = time.time()
- self.__lastRunStopActionTimeMutex = threading.Lock()
-
- def insertOnDemand(self, ugc):
- """
- """
- self.__onDemandList.append(ugc)
-
- def removeOnDemand(self, ugc):
- """
- """
- for odUgc in self.__onDemandList:
- if odUgc == ugc:
- self.__onDemandList.remove(ugc)
- return
-
- def __speakOnDemand(self):
- """
- """
- if len(self.__onDemandList) > 0:
- resourceTuxOSL.ttsStop()
- ugc = self.__onDemandList[self.__onDemandIndex]
- ugcTtsName = ugc.getDescription().getName()
- locutor = resourcePluginsServer.getPluginsContainer().getLocutor()
- pitch = resourcePluginsServer.getPluginsContainer().getPitch()
- resourceTuxDriver.openMouth()
- resourceTuxOSL.ttsSpeak(ugcTtsName, locutor, pitch)
- if not eventsHandler.waitCondition(ST_NAME_TTS_SOUND_STATE, ("ON",
- None), 3.0):
- return
- eventsHandler.waitCondition(ST_NAME_TTS_SOUND_STATE, ("OFF", None),
- 600.0)
- resourceTuxDriver.closeMouth()
-
- def __onDemandNext(self):
- """
- """
- self.__onDemandIndex += 1
- if self.__onDemandIndex >= len(self.__onDemandList):
- self.__onDemandIndex = 0
- resourceTuxDriver.playSound(11, 100.0)
- self.__speakOnDemand()
-
- def __onDemandPrevious(self):
- """
- """
- self.__onDemandIndex -= 1
- if self.__onDemandIndex < 0:
- self.__onDemandIndex = len(self.__onDemandList) - 1
- resourceTuxDriver.playSound(11, 100.0)
- self.__speakOnDemand()
-
- def __setStarted(self, value):
- """
- """
- self.__startedMutex.acquire()
- self.__isStarted = value
- self.__startedMutex.release()
-
- def isStarted(self):
- """
- """
- self.__startedMutex.acquire()
- result = self.__isStarted
- self.__startedMutex.release()
- return result
-
- def start(self):
- """
- """
- self.__loopThread = threading.Thread(target = self.__executionLoop)
- self.__loopThread.start()
-
- def stop(self):
- """
- """
- self.__setStarted(False)
- if self.getForegroundPguContext() != None:
- self.getForegroundPguContext().stopExecution()
- if self.__loopThread != None:
- if self.__loopThread.isAlive():
- self.__loopThread.join()
-
- def mute(self):
- """
- """
- pass
-
- def unmute(self):
- """
- """
- pass
-
- def __executionLoop(self):
- """
- """
- self.__setStarted(True)
- while self.isStarted():
- if self.backgroundPguContextIsCritical():
- time.sleep(0.5)
- continue
- # Get the next pguContext which must be in foreground
- pguContext = None
- self.__pguContextsMutex.acquire()
- if len(self.__pguContexts) > 0:
- pguContext = self.__pguContexts.pop(0)
- if pguContext != None:
- self.__setForegroundPguContext(pguContext)
- self.__pguContextsMutex.release()
- if self.getBackgroundPguContext() != None:
- # If the context is exclusive then stop the background context
- if self.getForegroundPguContext().getPluginCommand().isExclusive():
- self.getBackgroundPguContext().stopExecution()
- # Else only pause-it
- else:
- self.getBackgroundPguContext().pauseExecution()
- self.getForegroundPguContext().startExecution()
- if self.getBackgroundPguContext() != None:
- # Unpause background context
- if not self.getForegroundPguContext().getPluginCommand().isExclusive():
- self.getBackgroundPguContext().unpauseExecution()
- self.__setForegroundPguContext(None)
- else:
- self.__pguContextsMutex.release()
- time.sleep(0.5)
-
- def createPguContext(self, pluginInterpreterContext):
- """
- """
- if not self.isStarted():
- return
- # Create new pguContext
- pguContext = PguContext(pluginInterpreterContext)
- # Add the new pguContext in the system
- self.__insertPguContext(pguContext)
-
- def __startBackgroundPguContext(self):
- """
- """
- self.getBackgroundPguContext().startExecution()
-
- def __insertPguContext(self, pguContext):
- """
- """
- # Alerts and no daemon user calls must be inserted in the stack
- # as foreground.
- if (pguContext.getContextLayer() == PGU_CONTEXT_LAYER_SCHEDULER) or\
- (not pguContext.isDaemon()):
- self.__pguContextsMutex.acquire()
- for i, regPguContext in enumerate(self.__pguContexts):
- if regPguContext.getPluginCommand() == pguContext.getPluginCommand():
- # Replace the context with the same plugin command.
- self.__pguContexts[i] = pguContext
- self.__pguContextsMutex.release()
- return
- # If the context command is critical and the context is run by the
- # scheduler then stop the current context and add the context on top
- # of the stack
- if (pguContext.getPluginCommand().isCritical()) and \
- (pguContext.getContextLayer() == PGU_CONTEXT_LAYER_SCHEDULER):
- self.__pguContexts.insert(0, pguContext)
- if self.getForegroundPguContext() != None:
- self.getForegroundPguContext().stopExecution()
- # Add the new context at the bottom of the stack.
- else:
- self.__pguContexts.append(pguContext)
- self.__pguContextsMutex.release()
- # Daemon user calls must be referenced as background.
- else:
- currentBackgroundPguContext = self.getBackgroundPguContext()
- if currentBackgroundPguContext != None:
- # Stop old background context if exists
- currentBackgroundPguContext.stopExecution()
- if self.__backgroundPguThread != None:
- if self.__backgroundPguThread.isAlive():
- self.__backgroundPguThread.join()
- self.__setBackgroundPguContext(pguContext)
- self.__backgroundPguThread = threading.Thread(target = self.__startBackgroundPguContext)
- self.__backgroundPguThread.start()
-
- def getForegroundPguContext(self):
- """
- """
- self.__bfPguContextMutex.acquire()
- result = self.__foregroundPguContext
- self.__bfPguContextMutex.release()
- return result
-
- def getBackgroundPguContext(self):
- """
- """
- self.__bfPguContextMutex.acquire()
- result = self.__backgroundPguContext
- self.__bfPguContextMutex.release()
- return result
-
- def backgroundPguContextIsCritical(self):
- """
- """
- self.__bfPguContextMutex.acquire()
- result = False
- if self.__backgroundPguContext != None:
- if self.__backgroundPguContext.executionIsStarted():
- if self.__backgroundPguContext.getPluginCommand().isCritical():
- result = True
- self.__bfPguContextMutex.release()
- return result
-
- def backgroundPguContextNeedAllUserButtons(self):
- """
- """
- self.__bfPguContextMutex.acquire()
- result = False
- if self.__backgroundPguContext != None:
- if self.__backgroundPguContext.executionIsStarted():
- if self.__backgroundPguContext.getPluginCommand().needAllUserButtons():
- result = True
- self.__bfPguContextMutex.release()
- return result
-
- def __setForegroundPguContext(self, pguContext):
- """
- """
- self.__bfPguContextMutex.acquire()
- self.__foregroundPguContext = pguContext
- self.__bfPguContextMutex.release()
-
- def __setBackgroundPguContext(self, pguContext):
- """
- """
- self.__bfPguContextMutex.acquire()
- self.__backgroundPguContext = pguContext
- self.__bfPguContextMutex.release()
-
- def getPguContext(self, pluginInterpreterContext, noMutex = False):
- """
- """
- result = None
- if not noMutex:
- self.__pguContextsMutex.acquire()
- for pguContext in self.__pguContexts:
- if pguContext.getPluginInterpreterContext() == pluginInterpreterContext:
- result = pguContext
- break
- if result == None:
- if self.getForegroundPguContext() != None:
- if self.getForegroundPguContext().getPluginInterpreterContext() == pluginInterpreterContext:
- result = self.getForegroundPguContext()
- if result == None:
- if self.getBackgroundPguContext() != None:
- if self.getBackgroundPguContext().getPluginInterpreterContext() == pluginInterpreterContext:
- result = self.getBackgroundPguContext()
- if not noMutex:
- self.__pguContextsMutex.release()
- return result
-
- # ==========================================================================
- # Events from plugins execution.
- # ==========================================================================
-
- def insertMessage(self, pluginInterpreterContext, message, locutor, pitch):
- """
- """
- self.__pguContextsMutex.acquire()
- pguContext = self.getPguContext(pluginInterpreterContext, True)
- if pguContext != None:
- pguContext.insertMessage(message, locutor, pitch)
- self.__pguContextsMutex.release()
-
- def insertActuation(self, pluginInterpreterContext, actuationName,
- arguments = []):
- """
- """
- self.__pguContextsMutex.acquire()
- pguContext = self.getPguContext(pluginInterpreterContext, True)
- if pguContext != None:
- pguContext.insertActuation(actuationName, arguments)
- self.__pguContextsMutex.release()
-
- def insertAttitune(self, pluginInterpreterContext, attituneName):
- """
- """
- self.__pguContextsMutex.acquire()
- pguContext = self.getPguContext(pluginInterpreterContext, True)
- if pguContext != None:
- pguContext.insertAttitune(attituneName)
- self.__pguContextsMutex.release()
-
- def setContextIsComplete(self, pluginInterpreterContext):
- """
- """
- self.__pguContextsMutex.acquire()
- pguContext = self.getPguContext(pluginInterpreterContext, True)
- if pguContext != None:
- pguContext.setContextIsComplete()
- self.__pguContextsMutex.release()
-
- # ==========================================================================
- # Remote and robot button events
- # ==========================================================================
-
- def __setLastRunStopActionTime(self):
- """
- """
- self.__lastRunStopActionTimeMutex.acquire()
- self.__lastRunStopActionTime = time.time()
- self.__lastRunStopActionTimeMutex.release()
-
- def __getLastRunStopActionTime(self):
- """
- """
- self.__lastRunStopActionTimeMutex.acquire()
- result = self.__lastRunStopActionTime
- self.__lastRunStopActionTimeMutex.release()
- return result
-
- def __checkLastRunStopActionTime(self):
- """
- """
- if (time.time() - self.__getLastRunStopActionTime()) >= 1.5:
- self.__setLastRunStopActionTime()
- return True
- else:
- return False
-
- def __contextBtRunAbort(self, eventName, *args):
- """
- """
- # Abort foreground context if exists
- if self.getForegroundPguContext() != None:
- if self.getForegroundPguContext().executionIsStarted():
- if not self.__checkLastRunStopActionTime():
- return
- self.getForegroundPguContext().stopExecution()
- return
- # Else abort background context if exists
- if self.getBackgroundPguContext() != None:
- if self.getBackgroundPguContext().executionIsStarted():
- # Exception for plugins commands with attribute "allUserButtons"
- if self.backgroundPguContextNeedAllUserButtons():
- self.__contextBtOther(eventName, *args)
- return
- if not self.__checkLastRunStopActionTime():
- return
- self.getBackgroundPguContext().stopExecution()
- return
- # Else load current selected on demand gadget
- if len(self.__onDemandList) > 0:
- ugc = self.__onDemandList[self.__onDemandIndex]
- self.__setLastRunStopActionTime()
- ugc.start(ugc.getDefaultRunCommandName())
-
- def __contextLTPrevious(self, eventName, *args):
- """
- """
- if self.getForegroundPguContext() != None:
- return
- if self.getBackgroundPguContext() != None:
- if self.getBackgroundPguContext().executionIsStarted():
- self.__contextBtOther(eventName, *args)
- return
- self.__onDemandPrevious()
-
- def __contextRBNext(self, eventName, *args):
- """
- """
- if self.getForegroundPguContext() != None:
- return
- if self.getBackgroundPguContext() != None:
- if self.getBackgroundPguContext().executionIsStarted():
- self.__contextBtOther(eventName, *args)
- return
- self.__onDemandNext()
-
- def __contextBtMute(self, eventName, *args):
- """
- """
- if self.isStarted():
- self.stop()
- resourceTuxDriver.playSound(12, 100.0)
- self.__contextBtStandby("remote", ("K_STANDBY", 0.0))
- else:
- resourceTuxDriver.playSound(12, 100.0)
- self.start()
-
- def __contextBtStandby(self, eventName, *args):
- """
- """
- # Flush the foreground stack
- self.__pguContextsMutex.acquire()
- self.__pguContexts = []
- self.__pguContextsMutex.release()
- # Stop current foreground context
- if self.getForegroundPguContext() != None:
- self.getForegroundPguContext().stopExecution()
- # Stop current background context
- if self.getBackgroundPguContext() != None:
- self.getBackgroundPguContext().stopExecution()
-
- def __contextBtOther(self, eventName, *args):
- """
- """
- if self.getForegroundPguContext() == None:
- bgPguContext = self.getBackgroundPguContext()
- if bgPguContext != None:
- bgPguContext.getPluginInterpreterContext().sendEvent(eventName,
- args)
-
- def sendEvent(self, eventName, *args):
- """
- """
- if not self.isStarted():
- if eventName == "remote":
- if args[0] == "K_MUTE":
- self.__contextBtMute(eventName, *args)
- else:
- if eventName == "head":
- if args[0] == True:
- self.__contextBtRunAbort(eventName, *args)
- elif eventName == "left":
- if args[0] == True:
- self.__contextRBNext(eventName, *args)
- elif eventName == "right":
- if args[0] == True:
- self.__contextLTPrevious(eventName, *args)
- elif eventName == "remote":
- if args[0] == "K_OK":
- self.__contextBtRunAbort(eventName, *args)
- elif args[0] == "K_LEFT":
- self.__contextLTPrevious(eventName, *args)
- elif args[0] == "K_UP":
- self.__contextLTPrevious(eventName, *args)
- elif args[0] == "K_RIGHT":
- self.__contextRBNext(eventName, *args)
- elif args[0] == "K_DOWN":
- self.__contextRBNext(eventName, *args)
- elif args[0] == "K_MUTE":
- self.__contextBtMute(eventName, *args)
- elif args[0] == "K_STANDBY":
- self.__contextBtStandby(eventName, *args)
- else:
- self.__contextBtOther(eventName, *args)
-
-# ==============================================================================
-# ******************************************************************************
-# RESOURCE DECLARATION
-# ******************************************************************************
-# ==============================================================================
-
-# ==============================================================================
-# Declaration of the resource "robot_content_interactions".
-# ==============================================================================
-class TDSResourceRobotContentInteractions(TDSResource):
- """Resource robot_content_interactions class.
- """
-
- # ==========================================================================
- # Inherited methods from TDSResource
- # ==========================================================================
-
- # --------------------------------------------------------------------------
- # Configure the resource.
- # --------------------------------------------------------------------------
- def configure(self):
- """Configure the resource.
- """
- # General configuration (inherited from ancestor)
- self.name = "robot_content_interactions"
- self.comment = "Resource to handling the robot/content interactions."
- self.fileName = RESOURCE_FILENAME
- self.__pguContextsManager = PguContextsManager()
- # Register callback on RC and robot buttons events
- eventsHandler.getEventHandler(ST_NAME_HEAD_BUTTON).register(
- self.__onHeadBtEvent)
- eventsHandler.getEventHandler(ST_NAME_LEFT_BUTTON).register(
- self.__onLeftBtEvent)
- eventsHandler.getEventHandler(ST_NAME_RIGHT_BUTTON).register(
- self.__onRightBtEvent)
- eventsHandler.getEventHandler(ST_NAME_REMOTE_BUTTON).register(
- self.__onRCBtEvent)
-
- # --------------------------------------------------------------------------
- # Start the resource.
- # --------------------------------------------------------------------------
- def start(self):
- """Start the resource.
- """
- self.__pguContextsManager.start()
-
- # --------------------------------------------------------------------------
- # Stop the resource.
- # --------------------------------------------------------------------------
- def stop(self):
- """Stop the resource.
- """
- self.__pguContextsManager.stop()
-
- def __onHeadBtEvent(self, *args):
- """
- """
- self.__pguContextsManager.sendEvent("head", *args)
-
- def __onLeftBtEvent(self, *args):
- """
- """
- self.__pguContextsManager.sendEvent("left", *args)
-
- def __onRightBtEvent(self, *args):
- """
- """
- self.__pguContextsManager.sendEvent("right", *args)
-
- def __onRCBtEvent(self, *args):
- """
- """
- self.__pguContextsManager.sendEvent("remote", *args)
-
- # ==========================================================================
- # Public methods
- # ==========================================================================
-
- def getPguContextsManager(self):
- """
- """
- return self.__pguContextsManager
-
-# Create an instance of the resource
-resourceRobotContentInteractions = TDSResourceRobotContentInteractions(
- "resourceRobotContentInteractions")
-# Register the resource into the resources manager
-resourcesManager.addResource(resourceRobotContentInteractions)
+# Copyright (C) 2009 C2ME Sa
+# Remi Jocaille <rem...@c2...>
+# Distributed under the terms of the GNU General Public License
+# http://www.gnu.org/copyleft/gpl.html
+
+import time
+
+PGU_CONTEXT_LAYER_USER = 0
+PGU_CONTEXT_LAYER_SCHEDULER = 1
+
+PGU_EVENT_TYPE_MESSAGE = 0
+PGU_EVENT_TYPE_ACTUATION = 1
+PGU_EVENT_TYPE_ATTITUNE = 2
+
+class PguContext(object):
+ """
+ """
+
+ def __init__(self, pluginInterpreterContext):
+ """
+ """
+ self.__createTime = time.time()
+ self.__pluginInterpreterContext = pluginInterpreterContext
+ uuid = pluginInterpreterContext.getHostUuid()
+ # Get pguObject
+ self.__pguObject = resourcePluginsServer.getPluginsContainer().getPluginByUuid(uuid)
+ if self.__pguObject == None:
+ self.__pguObject = resourceGadgetsServer.getGadgetsContainer().getGadgetByUuid(uuid)
+ if self.__pguObject == None:
+ self.__pguObject = resourceUgcServer.getUgcContainer().getUgcByUuid(uuid)
+ # Get context layer
+ self.__contextLayer = PGU_CONTEXT_LAYER_USER
+ if self.__pluginInterpreterContext.getInstanceParameters().has_key("startedBy"):
+ if self.__pluginInterpreterContext.getInstanceParameters()['startedBy'] == 'scheduler':
+ self.__contextLayer = PGU_CONTEXT_LAYER_SCHEDULER
+ self.__eventStack = []
+ self.__eventStackMutex = threading.Lock()
+ self.__contextComplete = False
+ self.__contextCompleteMutex = threading.Lock()
+ self.__startStopPauseMutex = threading.Lock()
+ self.__execStarted = False
+ self.__execPaused = False
+
+ def getPluginInterpreterContext(self):
+ """
+ """
+ return self.__pluginInterpreterContext
+
+ def getPguUuid(self):
+ """
+ """
+ return self.__pluginInterpreterContext.getHostUuid()
+
+ def getPguName(self):
+ """
+ """
+ return self.__pguObject.getDescription().getName()
+
+ def getContextLayer(self):
+ """
+ """
+ return self.__contextLayer
+
+ def getPguObject(self):
+ """
+ """
+ return self.__pguObject
+
+ def isDaemon(self):
+ """
+ """
+ return self.__pluginInterpreterContext.instanceIsDaemon()
+
+ def getPluginCommand(self):
+ """
+ """
+ return self.__pguObject.getCommand(
+ self.__pluginInterpreterContext.getInstanceCommandName())
+
+ def setContextIsComplete(self):
+ """
+ """
+ if not self.contextIsComplete():
+ print "PGU Context [%s] content is complete" % self.getPguName()
+ self.__contextCompleteMutex.acquire()
+ self.__contextComplete = True
+ self.__contextCompleteMutex.release()
+
+ def contextIsComplete(self):
+ """
+ """
+ self.__contextCompleteMutex.acquire()
+ result = self.__contextComplete
+ self.__contextCompleteMutex.release()
+ return result
+
+ def __insertEvent(self, eventType, arguments = {}):
+ """
+ """
+ if self.contextIsComplete():
+ return
+ self.__eventStackMutex.acquire()
+ self.__eventStack.append({
+ 'type' : eventType,
+ 'arguments' : arguments,
+ })
+ self.__eventStackMutex.release()
+ print "Inserted event in PGU context [%s] :" % self.getPguName()
+ print " ", eventType
+ print " ", arguments
+
+ def __getEvent(self):
+ """
+ """
+ self.__eventStackMutex.acquire()
+ result = None
+ if len(self.__eventStack) > 0:
+ result = self.__eventStack.pop(0)
+ self.__eventStackMutex.release()
+ return result
+
+ def insertMessage(self, message, locutor, pitch):
+ """
+ """
+ self.__insertEvent(PGU_EVENT_TYPE_MESSAGE, {
+ 'message' : message,
+ 'locutor' : locutor,
+ 'pitch' : pitch,
+ })
+
+ def insertActuation(self, actuationName, arguments = []):
+ """
+ """
+ # Little hack for plugins audio menu
+ if actuationName == "abortTts":
+ self.__breakMessage()
+ return
+ self.__insertEvent(PGU_EVENT_TYPE_ACTUATION, {
+ 'actuationName' : actuationName,
+ 'actuationArguments' : arguments,
+ })
+
+ def insertAttitune(self, attituneName):
+ """
+ """
+ self.__insertEvent(PGU_EVENT_TYPE_ATTITUNE, {
+ 'attituneName' : attituneName,
+ })
+
+ def startExecution(self):
+ """
+ """
+ if self.executionIsStarted():
+ return
+ expirationDelay = self.getPluginCommand().getExpirationDelay()
+ if expirationDelay > 0:
+ if (time.time() - self.__createTime) > expirationDelay:
+ return
+ self.__startStopPauseMutex.acquire()
+ self.__execStarted = True
+ self.__execPaused = False
+ self.__startStopPauseMutex.release()
+ print "Start execution of PGU context [%s]" % self.getPguName()
+ self.__executionLoop()
+
+ def executionIsStarted(self):
+ """
+ """
+ self.__startStopPauseMutex.acquire()
+ result = self.__execStarted
+ self.__startStopPauseMutex.release()
+ return result
+
+ def stopExecution(self):
+ """
+ """
+ if not self.getPluginCommand().isNotifier():
+ self.__pluginInterpreterContext.abort()
+ if not self.executionIsStarted():
+ return
+ print "Stop execution of PGU context [%s]" % self.getPguName()
+ self.__startStopPauseMutex.acquire()
+ self.__execStarted = False
+ self.__execPaused = False
+ self.__eventStackMutex.acquire()
+ self.__eventStack = []
+ self.__eventStackMutex.release()
+ self.__startStopPauseMutex.release()
+ self.__breakAttitune()
+ self.__breakMessage()
+ self.__breakActuation()
+ print "Execution of PGU context [%s] stopped" % self.getPguName()
+ if not self.getPluginCommand().isNotifier():
+ if self.getContextLayer() == PGU_CONTEXT_LAYER_SCHEDULER:
+ resourceTuxDriver.playSound(15, 100.0)
+ else:
+ resourceTuxDriver.playSound(16, 100.0)
+ time.sleep(0.5)
+
+ def pauseExecution(self):
+ """
+ """
+ if not self.executionIsStarted():
+ return
+ if self.executionIsPaused():
+ return
+ print "Pause execution of PGU context [%s]" % self.getPguName()
+ self.__startStopPauseMutex.acquire()
+ self.__execPaused = True
+ self.__startStopPauseMutex.release()
+ self.__breakAttitune()
+ self.__breakMessage()
+ self.__breakActuation()
+
+ def unpauseExecution(self):
+ """
+ """
+ if not self.executionIsStarted():
+ return
+ if not self.executionIsPaused():
+ return
+ print "Unpause execution of PGU context [%s]" % self.getPguName()
+ self.__startStopPauseMutex.acquire()
+ self.__execPaused = False
+ self.__startStopPauseMutex.release()
+
+ def executionIsPaused(self):
+ """
+ """
+ self.__startStopPauseMutex.acquire()
+ result = self.__execPaused
+ self.__startStopPauseMutex.release()
+ return result
+
+ def __executeAttitune(self, attituneName):
+ """
+ """
+ resourceAttituneManager.playAttituneSync(attituneName, 0.0)
+
+ def __breakAttitune(self):
+ """
+ """
+ resourceAttituneManager.stopAttitune()
+
+ def __executeMessage(self, text, locutor, pitch):
+ """
+ """
+ if not self.executionIsStarted():
+ return
+ resourceTuxDriver.openMouth()
+ if not self.executionIsStarted():
+ resourceTuxDriver.closeMouth()
+ return
+ resourceTuxOSL.ttsSpeak(text, locutor, pitch)
+ if not self.executionIsStarted():
+ resourceTuxDriver.closeMouth()
+ return
+ if not eventsHandler.waitCondition(ST_NAME_TTS_SOUND_STATE, ("ON",
+ None), 3.0):
+ return
+ if self.executionIsStarted():
+ eventsHandler.waitCondition(ST_NAME_TTS_SOUND_STATE, ("OFF", None),
+ 600.0)
+ resourceTuxDriver.closeMouth()
+
+ def __breakMessage(self):
+ """
+ """
+ resourceTuxOSL.ttsStop()
+ eventsHandler.emit(ST_NAME_TTS_SOUND_STATE, ("OFF", 0.0))
+
+ def __executeActuation(self, actuationName, arguments):
+ """
+ """
+ argsString = ""
+ for argument in arguments:
+ if len(argsString) > 0:
+ argsString += ","
+ try:
+ argument = int(argument)
+ argsString += str(argument)
+ except:
+ try:
+ argument = float(argument)
+ argsString += str(argument)
+ except:
+ argsString += '"' + str(argument) + '"'
+ cmdString = "resourceTuxDriver.%s(%s)" % (actuationName, argsString)
+ try:
+ exec(cmdString) in globals()
+ except:
+ print "!!! Error in command :", cmdString
+
+ def __breakActuation(self):
+ """
+ """
+ resourceTuxDriver.clearAll()
+
+ def __executionLoop(self):
+ """
+ """
+ if not self.getPluginCommand().isNotifier():
+ if self.getContextLayer() == PGU_CONTEXT_LAYER_SCHEDULER:
+ resourceTuxDriver.playSound(14, 100.0)
+ else:
+ resourceTuxDriver.playSound(13, 100.0)
+ time.sleep(0.5)
+ while self.executionIsStarted():
+ while self.executionIsPaused():
+ time.sleep(0.1)
+ nextEvent = self.__getEvent()
+ if nextEvent == None:
+ if self.contextIsComplete():
+ self.__startStopPauseMutex.acquire()
+ self.__execStarted = False
+ self.__execPaused = False
+ self.__startStopPauseMutex.release()
+ print "Execution of PGU context [%s] stopped" % self.getPguName()
+ if not self.getPluginCommand().isNotifier():
+ if self.getContextLayer() == PGU_CONTEXT_LAYER_SCHEDULER:
+ resourceTuxDriver.playSound(15, 100.0)
+ else:
+ resourceTuxDriver.playSound(16, 100.0)
+ time.sleep(0.5)
+ return
+ else:
+ print "Execute event from PGU context [%s] :" % self.getPguName()
+ print " ", nextEvent['type']
+ print " ", nextEvent['arguments']
+ arguments = nextEvent['arguments']
+ if not self.executionIsStarted():
+ continue
+ if nextEvent['type'] == PGU_EVENT_TYPE_MESSAGE:
+ self.__executeMessage(arguments['message'],
+ arguments['locutor'], arguments['pitch'])
+ elif nextEvent['type'] == PGU_EVENT_TYPE_ACTUATION:
+ self.__executeActuation(arguments['actuationName'],
+ arguments['actuationArguments'])
+ elif nextEvent['type'] == PGU_EVENT_TYPE_ATTITUNE:
+ self.__executeAttitune(arguments['attituneName'])
+ print "Event finished"
+ time.sleep(0.1)
+
+class PguContextsManager(object):
+ """
+ """
+
+ def __init__(self):
+ """
+ """
+ self.__pguContexts = []
+ self.__pguContextsMutex = threading.Lock()
+ self.__backgroundPguContext = None
+ self.__foregroundPguContext = None
+ self.__backgroundPguThread = None
+ self.__bfPguContextMutex = threading.Lock()
+ self.__isStarted = False
+ self.__startedMutex = threading.Lock()
+ self.__loopThread = None
+ self.__onDemandList = []
+ self.__onDemandIndex = 0
+ self.__lastRunStopActionTime = time.time()
+ self.__lastRunStopActionTimeMutex = threading.Lock()
+
+ def insertOnDemand(self, ugc):
+ """
+ """
+ self.__onDemandList.append(ugc)
+
+ def removeOnDemand(self, ugc):
+ """
+ """
+ for odUgc in self.__onDemandList:
+ if odUgc == ugc:
+ self.__onDemandList.remove(ugc)
+ return
+
+ def __speakOnDemand(self):
+ """
+ """
+ if len(self.__onDemandList) > 0:
+ resourceTuxOSL.ttsStop()
+ ugc = self.__onDemandList[self.__onDemandIndex]
+ ugcTtsName = ugc.getDescription().getName()
+ locutor = resourcePluginsServer.getPluginsContainer().getLocutor()
+ pitch = resourcePluginsServer.getPluginsContainer().getPitch()
+ resourceTuxDriver.openMouth()
+ resourceTuxOSL.ttsSpeak(ugcTtsName, locutor, pitch)
+ if not eventsHandler.waitCondition(ST_NAME_TTS_SOUND_STATE, ("ON",
+ None), 3.0):
+ return
+ eventsHandler.waitCondition(ST_NAME_TTS_SOUND_STATE, ("OFF", None),
+ 600.0)
+ resourceTuxDriver.closeMouth()
+
+ def __onDemandNext(self):
+ """
+ """
+ self.__onDemandIndex += 1
+ if self.__onDemandIndex >= len(self.__onDemandList):
+ self.__onDemandIndex = 0
+ resourceTuxDriver.playSound(11, 100.0)
+ self.__speakOnDemand()
+
+ def __onDemandPrevious(self):
+ """
+ """
+ self.__onDemandIndex -= 1
+ if self.__onDemandIndex < 0:
+ self.__onDemandIndex = len(self.__onDemandList) - 1
+ resourceTuxDriver.playSound(11, 100.0)
+ self.__speakOnDemand()
+
+ def __setStarted(self, value):
+ """
+ """
+ self.__startedMutex.acquire()
+ self.__isStarted = value
+ self.__startedMutex.release()
+
+ def isStarted(self):
+ """
+ """
+ self.__startedMutex.acquire()
+ result = self.__isStarted
+ self.__startedMutex.release()
+ return result
+
+ def start(self):
+ """
+ """
+ self.__loopThread = threading.Thread(target = self.__executionLoop)
+ self.__loopThread.start()
+
+ def stop(self):
+ """
+ """
+ self.__setStarted(False)
+ if self.getForegroundPguContext() != None:
+ self.getForegroundPguContext().stopExecution()
+ if self.__loopThread != None:
+ if self.__loopThread.isAlive():
+ self.__loopThread.join()
+
+ def mute(self):
+ """
+ """
+ pass
+
+ def unmute(self):
+ """
+ """
+ pass
+
+ def __executionLoop(self):
+ """
+ """
+ if self.isStarted():
+ return
+ self.__setStarted(True)
+ while self.isStarted():
+ if self.backgroundPguContextIsCritical():
+ time.sleep(0.5)
+ continue
+ # Get the next pguContext which must be in foreground
+ pguContext = None
+ self.__pguContextsMutex.acquire()
+ if len(self.__pguContexts) > 0:
+ pguContext = self.__pguContexts.pop(0)
+ if pguContext != None:
+ self.__setForegroundPguContext(pguContext)
+ self.__pguContextsMutex.release()
+ if self.getBackgroundPguContext() != None:
+ # If the context is exclusive then stop the background context
+ if self.backgroundPguContextIsExclusive():
+ try:
+ self.getBackgroundPguContext().stopExecution()
+ except:
+ pass
+ # Else only pause-it
+ else:
+ self.getBackgroundPguContext().pauseExecution()
+ self.getForegroundPguContext().startExecution()
+ if self.getBackgroundPguContext() != None:
+ # Unpause background context
+ if not self.backgroundPguContextIsExclusive():
+ try:
+ self.getBackgroundPguContext().unpauseExecution()
+ except:
+ pass
+ self.__setForegroundPguContext(None)
+ else:
+ self.__pguContextsMutex.release()
+ time.sleep(0.5)
+
+ def createPguContext(self, pluginInterpreterContext):
+ """
+ """
+ if not self.isStarted():
+ return
+ # Create new pguContext
+ pguContext = PguContext(pluginInterpreterContext)
+ # Add the new pguContext in the system
+ self.__insertPguContext(pguContext)
+
+ def __startBackgroundPguContext(self):
+ """
+ """
+ self.getBackgroundPguContext().startExecution()
+
+ def __insertPguContext(self, pguContext):
+ """
+ """
+ # Alerts and no daemon user calls must be inserted in the stack
+ # as foreground.
+ if (pguContext.getContextLayer() == PGU_CONTEXT_LAYER_SCHEDULER) or\
+ (not pguContext.isDaemon()):
+ self.__pguContextsMutex.acquire()
+ for i, regPguContext in enumerate(self.__pguContexts):
+ if regPguContext.getPluginCommand() == pguContext.getPluginCommand():
+ # Replace the context with the same plugin command.
+ self.__pguContexts[i] = pguContext
+ self.__pguContextsMutex.release()
+ return
+ # If the context command is critical and the context is run by the
+ # scheduler then stop the current context and add the context on top
+ # of the stack
+ if (pguContext.getPluginCommand().isCritical()) and \
+ (pguContext.getContextLayer() == PGU_CONTEXT_LAYER_SCHEDULER):
+ self.__pguContexts.insert(0, pguContext)
+ if self.getForegroundPguContext() != None:
+ self.getForegroundPguContext().stopExecution()
+ # Add the new context at the bottom of the stack.
+ else:
+ self.__pguContexts.append(pguContext)
+ self.__pguContextsMutex.release()
+ # Daemon user calls must be referenced as background.
+ else:
+ currentBackgroundPguContext = self.getBackgroundPguContext()
+ if currentBackgroundPguContext != None:
+ # Stop old background context if exists
+ currentBackgroundPguContext.stopExecution()
+ if self.__backgroundPguThread != None:
+ if self.__backgroundPguThread.isAlive():
+ self.__backgroundPguThread.join()
+ self.__setBackgroundPguContext(pguContext)
+ self.__backgroundPguThread = threading.Thread(target = self.__startBackgroundPguContext)
+ self.__backgroundPguThread.start()
+
+ def getForegroundPguContext(self):
+ """
+ """
+ self.__bfPguContextMutex.acquire()
+ result = self.__foregroundPguContext
+ self.__bfPguContextMutex.release()
+ return result
+
+ def getBackgroundPguContext(self):
+ """
+ """
+ self.__bfPguContextMutex.acquire()
+ result = self.__backgroundPguContext
+ self.__bfPguContextMutex.release()
+ return result
+
+ def backgroundPguContextIsCritical(self):
+ """
+ """
+ self.__bfPguContextMutex.acquire()
+ result = False
+ if self.__backgroundPguContext != None:
+ if self.__backgroundPguContext.executionIsStarted():
+ if self.__backgroundPguContext.getPluginCommand().isCritical():
+ result = True
+ self.__bfPguContextMutex.release()
+ return result
+
+ def backgroundPguContextIsExclusive(self):
+ """
+ """
+ self.__bfPguContextMutex.acquire()
+ result = False
+ if self.__backgroundPguContext != None:
+ if self.__backgroundPguContext.executionIsStarted():
+ if self.__backgroundPguContext.getPluginCommand().isExclusive():
+ result = True
+ self.__bfPguContextMutex.release()
+ return result
+
+ def backgroundPguContextNeedAllUserButtons(self):
+ """
+ """
+ self.__bfPguContextMutex.acquire()
+ result = False
+ if self.__backgroundPguContext != None:
+ if self.__backgroundPguContext.executionIsStarted():
+ if self.__backgroundPguContext.getPluginCommand().needAllUserButtons():
+ result = True
+ self.__bfPguContextMutex.release()
+ return result
+
+ def __setForegroundPguContext(self, pguContext):
+ """
+ """
+ self.__bfPguContextMutex.acquire()
+ self.__foregroundPguContext = pguContext
+ self.__bfPguContextMutex.release()
+
+ def __setBackgroundPguContext(self, pguContext):
+ """
+ """
+ self.__bfPguContextMutex.acquire()
+ self.__backgroundPguContext = pguContext
+ self.__bfPguContextMutex.release()
+
+ def getPguContext(self, pluginInterpreterContext, noMutex = False):
+ """
+ """
+ result = None
+ if not noMutex:
+ self.__pguContextsMutex.acquire()
+ for pguContext in self.__pguContexts:
+ if pguContext.getPluginInterpreterContext() == pluginInterpreterContext:
+ result = pguContext
+ break
+ if result == None:
+ if self.getForegroundPguContext() != None:
+ if self.getForegroundPguContext().getPluginInterpreterContext() == pluginInterpreterContext:
+ result = self.getForegroundPguContext()
+ if result == None:
+ if self.getBackgroundPguContext() != None:
+ if self.getBackgroundPguContext().getPluginInterpreterContext() == pluginInterpreterContext:
+ result = self.getBackgroundPguContext()
+ if not noMutex:
+ self.__pguContextsMutex.release()
+ return result
+
+ # ==========================================================================
+ # Events from plugins execution.
+ # ==========================================================================
+
+ def insertMessage(self, pluginInterpreterContext, message, locutor, pitch):
+ """
+ """
+ self.__pguContextsMutex.acquire()
+ pguContext = self.getPguContext(pluginInterpreterContext, True)
+ if pguContext != None:
+ pguContext.insertMessage(message, locutor, pitch)
+ self.__pguContextsMutex.release()
+
+ def insertActuation(self, pluginInterpreterContext, actuationName,
+ arguments = []):
+ """
+ """
+ self.__pguContextsMutex.acquire()
+ pguContext = self.getPguContext(pluginInterpreterContext, True)
+ if pguContext != None:
+ pguContext.insertActuation(actuationName, arguments)
+ self.__pguContextsMutex.release()
+
+ def insertAttitune(self, pluginInterpreterContext, attituneName):
+ """
+ """
+ self.__pguContextsMutex.acquire()
+ pguContext = self.getPguContext(pluginInterpreterContext, True)
+ if pguContext != None:
+ pguContext.insertAttitune(attituneName)
+ self.__pguContextsMutex.release()
+
+ def setContextIsComplete(self, pluginInterpreterContext):
+ """
+ """
+ self.__pguContextsMutex.acquire()
+ pguContext = self.getPguContext(pluginInterpreterContext, True)
+ if pguContext != None:
+ pguContext.setContextIsComplete()
+ self.__pguContextsMutex.release()
+
+ # ==========================================================================
+ # Remote and robot button events
+ # ==========================================================================
+
+ def __setLastRunStopActionTime(self):
+ """
+ """
+ self.__lastRunStopActionTimeMutex.acquire()
+ self.__lastRunStopActionTime = time.time()
+ self.__lastRunStopActionTimeMutex.release()
+
+ def __getLastRunStopActionTime(self):
+ """
+ """
+ self.__lastRunStopActionTimeMutex.acquire()
+ result = self.__lastRunStopActionTime
+ self.__lastRunStopActionTimeMutex.release()
+ return result
+
+ def __checkLastRunStopActionTime(self):
+ """
+ """
+ if (time.time() - self.__getLastRunStopActionTime()) >= 1.5:
+ self.__setLastRunStopActionTime()
+ ...
[truncated message content] |
|
From: jerome <c2m...@c2...> - 2009-06-18 08:56:35
|
Author: jerome
Date: 2009-06-18 10:55:41 +0200 (Thu, 18 Jun 2009)
New Revision: 4827
Modified:
software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/resources/gadget.pot
software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/src/FacebookConnection.java
Log:
* Updated messages.
Modified: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/resources/gadget.pot
===================================================================
--- software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/resources/gadget.pot 2009-06-17 14:54:59 UTC (rev 4826)
+++ software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/resources/gadget.pot 2009-06-18 08:55:41 UTC (rev 4827)
@@ -25,6 +25,9 @@
msgid "You have {0} new messages"
msgstr ""
+msgid "You have {0} new message"
+msgstr ""
+
msgid "You have {0} friend requests"
msgstr ""
@@ -51,6 +54,3 @@
msgid "I'm retrieving your account informations"
msgstr ""
-
-msgid "Connect to your account and push my left wing"
-msgstr ""
Modified: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/src/FacebookConnection.java
===================================================================
--- software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/src/FacebookConnection.java 2009-06-17 14:54:59 UTC (rev 4826)
+++ software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/src/FacebookConnection.java 2009-06-18 08:55:41 UTC (rev 4827)
@@ -71,19 +71,12 @@
e.printStackTrace();
}
}
-
- // wait for user to log in and hit enter
- gdg.throwMessage("Connect to your account and push my left wing");
// fetch session key
String session = client.auth_getSession(token);
- if(session != null)
+ if(session == null)
{
- gdg.throwMessage("I'm connected to your facebook account.");
- }
- else
- {
gdg.throwMessage("I cannot get connected to your facebook account.");
}
|
|
From: remi <c2m...@c2...> - 2009-06-17 14:55:04
|
Author: remi
Date: 2009-06-17 16:54:59 +0200 (Wed, 17 Jun 2009)
New Revision: 4826
Modified:
software_suite_v3/software/plugin/plugin-webradio/trunk/executables/plugin-webradio.py
Log:
* Audio menu improvement
Modified: software_suite_v3/software/plugin/plugin-webradio/trunk/executables/plugin-webradio.py
===================================================================
--- software_suite_v3/software/plugin/plugin-webradio/trunk/executables/plugin-webradio.py 2009-06-17 14:51:18 UTC (rev 4825)
+++ software_suite_v3/software/plugin/plugin-webradio/trunk/executables/plugin-webradio.py 2009-06-17 14:54:59 UTC (rev 4826)
@@ -101,8 +101,9 @@
def __doExecute(self):
self.__defaultWebRadio()
-
+
def __speakRadioName(self, radioName):
+ self.throwActuation("abortTts")
self.throwMessage(radioName)
time.sleep(0.5)
|
|
From: remi <c2m...@c2...> - 2009-06-17 14:51:25
|
Author: remi
Date: 2009-06-17 16:51:18 +0200 (Wed, 17 Jun 2009)
New Revision: 4825
Modified:
software_suite_v3/smart-core/smart-server/trunk/resources/04_robot_content_interactions/00_resourceRobotContentInteractions.py
Log:
* added support of the plugin commands with attribute "allUserButtons"
* fixed bug with commands attribute "critical"
* added a special actuation to stop TTS sentences (plugin audio menus)
Modified: software_suite_v3/smart-core/smart-server/trunk/resources/04_robot_content_interactions/00_resourceRobotContentInteractions.py
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/resources/04_robot_content_interactions/00_resourceRobotContentInteractions.py 2009-06-17 14:48:51 UTC (rev 4824)
+++ software_suite_v3/smart-core/smart-server/trunk/resources/04_robot_content_interactions/00_resourceRobotContentInteractions.py 2009-06-17 14:51:18 UTC (rev 4825)
@@ -131,6 +131,10 @@
def insertActuation(self, actuationName, arguments = []):
"""
"""
+ # Little hack for plugins audio menu
+ if actuationName == "abortTts":
+ self.__breakMessage()
+ return
self.__insertEvent(PGU_EVENT_TYPE_ACTUATION, {
'actuationName' : actuationName,
'actuationArguments' : arguments,
@@ -453,6 +457,9 @@
"""
self.__setStarted(True)
while self.isStarted():
+ if self.backgroundPguContextIsCritical():
+ time.sleep(0.5)
+ continue
# Get the next pguContext which must be in foreground
pguContext = None
self.__pguContextsMutex.acquire()
@@ -491,11 +498,7 @@
def __startBackgroundPguContext(self):
"""
"""
- if self.getBackgroundPguContext().getPluginCommand().isCritical():
- self.stop()
self.getBackgroundPguContext().startExecution()
- if self.getBackgroundPguContext().getPluginCommand().isCritical():
- self.start()
def __insertPguContext(self, pguContext):
"""
@@ -552,6 +555,30 @@
self.__bfPguContextMutex.release()
return result
+ def backgroundPguContextIsCritical(self):
+ """
+ """
+ self.__bfPguContextMutex.acquire()
+ result = False
+ if self.__backgroundPguContext != None:
+ if self.__backgroundPguContext.executionIsStarted():
+ if self.__backgroundPguContext.getPluginCommand().isCritical():
+ result = True
+ self.__bfPguContextMutex.release()
+ return result
+
+ def backgroundPguContextNeedAllUserButtons(self):
+ """
+ """
+ self.__bfPguContextMutex.acquire()
+ result = False
+ if self.__backgroundPguContext != None:
+ if self.__backgroundPguContext.executionIsStarted():
+ if self.__backgroundPguContext.getPluginCommand().needAllUserButtons():
+ result = True
+ self.__bfPguContextMutex.release()
+ return result
+
def __setForegroundPguContext(self, pguContext):
"""
"""
@@ -651,14 +678,13 @@
def __checkLastRunStopActionTime(self):
"""
"""
- print time.time() - self.__getLastRunStopActionTime()
if (time.time() - self.__getLastRunStopActionTime()) >= 1.5:
self.__setLastRunStopActionTime()
return True
else:
return False
- def __contextBtRunAbort(self):
+ def __contextBtRunAbort(self, eventName, *args):
"""
"""
# Abort foreground context if exists
@@ -671,6 +697,10 @@
# Else abort background context if exists
if self.getBackgroundPguContext() != None:
if self.getBackgroundPguContext().executionIsStarted():
+ # Exception for plugins commands with attribute "allUserButtons"
+ if self.backgroundPguContextNeedAllUserButtons():
+ self.__contextBtOther(eventName, *args)
+ return
if not self.__checkLastRunStopActionTime():
return
self.getBackgroundPguContext().stopExecution()
@@ -747,7 +777,7 @@
else:
if eventName == "head":
if args[0] == True:
- self.__contextBtRunAbort()
+ self.__contextBtRunAbort(eventName, *args)
elif eventName == "left":
if args[0] == True:
self.__contextRBNext(eventName, *args)
@@ -756,7 +786,7 @@
self.__contextLTPrevious(eventName, *args)
elif eventName == "remote":
if args[0] == "K_OK":
- self.__contextBtRunAbort()
+ self.__contextBtRunAbort(eventName, *args)
elif args[0] == "K_LEFT":
self.__contextLTPrevious(eventName, *args)
elif args[0] == "K_UP":
|
|
From: remi <c2m...@c2...> - 2009-06-17 14:48:57
|
Author: remi
Date: 2009-06-17 16:48:51 +0200 (Wed, 17 Jun 2009)
New Revision: 4824
Modified:
software_suite_v3/smart-core/smart-server/trunk/util/applicationserver/plugin/interpreters/PluginInterpreter.py
Log:
* fixed possible bugs in the server->plugin events
Modified: software_suite_v3/smart-core/smart-server/trunk/util/applicationserver/plugin/interpreters/PluginInterpreter.py
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/util/applicationserver/plugin/interpreters/PluginInterpreter.py 2009-06-17 14:47:57 UTC (rev 4823)
+++ software_suite_v3/smart-core/smart-server/trunk/util/applicationserver/plugin/interpreters/PluginInterpreter.py 2009-06-17 14:48:51 UTC (rev 4824)
@@ -207,8 +207,11 @@
if not self.__getRun():
return
if self.__daemon:
- self.__process.stdin.write("STOP\n")
- self.__process.stdin.flush()
+ try:
+ self.__process.stdin.write("STOP\n")
+ self.__process.stdin.flush()
+ except:
+ return
timeout = 5.0
while self.__process.poll() == None:
timeout -= 0.1
@@ -238,8 +241,11 @@
eventString += eventName
for value in eventValues:
eventString += ":" + str(value)
- self.__process.stdin.write("%s\n" % eventString)
- self.__process.stdin.flush()
+ try:
+ self.__process.stdin.write("%s\n" % eventString)
+ self.__process.stdin.flush()
+ except:
+ pass
# --------------------------------------------------------------------------
# Loop to handling the stdout messages.
|
|
From: remi <c2m...@c2...> - 2009-06-17 14:48:10
|
Author: remi Date: 2009-06-17 16:47:57 +0200 (Wed, 17 Jun 2009) New Revision: 4823 Added: software_suite_v3/software/plugin/plugin-skype/ software_suite_v3/software/plugin/plugin-skype/branches/ software_suite_v3/software/plugin/plugin-skype/tags/ software_suite_v3/software/plugin/plugin-skype/trunk/ software_suite_v3/software/plugin/plugin-skype/trunk/LICENSE software_suite_v3/software/plugin/plugin-skype/trunk/build.py software_suite_v3/software/plugin/plugin-skype/trunk/builder/ software_suite_v3/software/plugin/plugin-skype/trunk/builder/PluginPackager.py software_suite_v3/software/plugin/plugin-skype/trunk/builder/__init__.py software_suite_v3/software/plugin/plugin-skype/trunk/builder/util/ software_suite_v3/software/plugin/plugin-skype/trunk/builder/util/__init__.py software_suite_v3/software/plugin/plugin-skype/trunk/builder/util/misc/ software_suite_v3/software/plugin/plugin-skype/trunk/builder/util/misc/DirectoriesAndFilesTools.py software_suite_v3/software/plugin/plugin-skype/trunk/builder/util/misc/__init__.py software_suite_v3/software/plugin/plugin-skype/trunk/builder/util/misc/version.py software_suite_v3/software/plugin/plugin-skype/trunk/builder/version.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/ software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/ software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/API/ software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/API/__init__.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/API/darwin.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/API/faked_dbus.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/API/posix.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/API/posix_dbus.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/API/posix_x11.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/API/windows.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/ software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/__init__.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/ar.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/bg.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/cs.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/cz.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/da.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/de.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/el.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/en.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/es.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/et.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/fi.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/fr.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/he.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/hu.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/it.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/ja.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/ko.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/lt.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/lv.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/nl.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/no.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/pl.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/pp.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/pt.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/ro.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/ru.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/sv.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/tr.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/Languages/x1.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/__init__.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/application.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/call.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/callchannel.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/chat.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/client.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/conversion.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/enums.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/errors.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/filetransfer.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/profile.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/settings.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/skype.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/sms.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/user.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/utils.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/voicemail.py software_suite_v3/software/plugin/plugin-skype/trunk/executables/plugin-skype.py software_suite_v3/software/plugin/plugin-skype/trunk/resources/ software_suite_v3/software/plugin/plugin-skype/trunk/resources/fr.po software_suite_v3/software/plugin/plugin-skype/trunk/resources/help.wiki software_suite_v3/software/plugin/plugin-skype/trunk/resources/icon.png software_suite_v3/software/plugin/plugin-skype/trunk/resources/plugin.pot software_suite_v3/software/plugin/plugin-skype/trunk/resources/plugin.xml Log: * added the project "skype plugin" Added: software_suite_v3/software/plugin/plugin-skype/trunk/LICENSE =================================================================== --- software_suite_v3/software/plugin/plugin-skype/trunk/LICENSE (rev 0) +++ software_suite_v3/software/plugin/plugin-skype/trunk/LICENSE 2009-06-17 14:47:57 UTC (rev 4823) @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. Added: software_suite_v3/software/plugin/plugin-skype/trunk/build.py =================================================================== --- software_suite_v3/software/plugin/plugin-skype/trunk/build.py (rev 0) +++ software_suite_v3/software/plugin/plugin-skype/trunk/build.py 2009-06-17 14:47:57 UTC (rev 4823) @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- + +# Copyleft (C) 2009 C2ME Sa +# Remi Jocaille <rem...@c2...> +# Distributed under the terms of the GNU General Public License +# http://www.gnu.org/copyleft/gpl.html + +from builder.PluginPackager import PluginPackager + +if __name__ == "__main__": + PluginPackager().createScp("plugin-skype.scp") Added: software_suite_v3/software/plugin/plugin-skype/trunk/builder/PluginPackager.py =================================================================== --- software_suite_v3/software/plugin/plugin-skype/trunk/builder/PluginPackager.py (rev 0) +++ software_suite_v3/software/plugin/plugin-skype/trunk/builder/PluginPackager.py 2009-06-17 14:47:57 UTC (rev 4823) @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- + +import version +__author__ = version.author +__date__ = version.date +__version__ = version.version +__licence__ = version.licence +del version + +# Copyleft (C) 2009 C2ME Sa +# Remi Jocaille <rem...@c2...> +# Distributed under the terms of the GNU General Public License +# http://www.gnu.org/copyleft/gpl.html + +import os +from zipfile import * + +from util.misc.DirectoriesAndFilesTools import * + +# ------------------------------------------------------------------------------ +# Class to create a SCP file from the main directory of a python plugin project. +# ------------------------------------------------------------------------------ +class PluginPackager(object): + """Class to create a SCP file from the main directory of a python plugin + project. + """ + + # -------------------------------------------------------------------------- + # Create a scp file. + # -------------------------------------------------------------------------- + def createScp(self, scpFileName): + """Create a scp file. + @param scpFileName: Smart-Core Plugin file name. + @return: The success of the file creation. + """ + self.__sourcePath = os.path.realpath("") + if not os.path.isdir(self.__sourcePath): + return False + if not os.path.isdir(os.path.join(self.__sourcePath, "executables")): + return False + if not os.path.isdir(os.path.join(self.__sourcePath, "resources")): + return False + # Get some paths + SRC_EXECUTABLES_PATH = os.path.join(self.__sourcePath, "executables") + SRC_RESOURCES_PATH = os.path.join(self.__sourcePath, "resources") + TMP_BUILD_PATH = os.path.join(self.__sourcePath, "tmp") + DEST_EXECUTABLES_PATH = os.path.join(TMP_BUILD_PATH, "executables") + DEST_RESOURCES_PATH = os.path.join(TMP_BUILD_PATH, "resources") + DEST_SCP_FILENAME = os.path.join(self.__sourcePath, scpFileName) + # Create the temporary build path + MKDirsF(TMP_BUILD_PATH) + # Copy "executables" directory + CPDir(SRC_EXECUTABLES_PATH, DEST_EXECUTABLES_PATH) + # Copy "resources" directory + CPDir(SRC_RESOURCES_PATH, DEST_RESOURCES_PATH) + # Filtering the content of temporary path + RMWithFilters(TMP_BUILD_PATH, filters = ['.svn', '.pyc']) + # Create a zip file + directory = TMP_BUILD_PATH + last_cwd = os.getcwd() + os.chdir(TMP_BUILD_PATH) + zf = ZipFile(DEST_SCP_FILENAME, 'w', compression = ZIP_DEFLATED) + def walker(zip, directory, files, root = directory): + for file in files: + file = os.path.join(directory, file) + name = file[len(TMP_BUILD_PATH) + 1:] + if os.path.isfile(file): + zip.write(file, name, ZIP_DEFLATED) + elif os.path.isdir(file): + file = os.path.join(file, "") + name = os.path.join(name, "") + zip.writestr(name, name) + os.path.walk(TMP_BUILD_PATH, walker, zf) + zf.close() + os.chdir(os.path.abspath(last_cwd)) + # Remove the temporary directory + RMDirs(TMP_BUILD_PATH) + return True Added: software_suite_v3/software/plugin/plugin-skype/trunk/builder/__init__.py =================================================================== Added: software_suite_v3/software/plugin/plugin-skype/trunk/builder/util/__init__.py =================================================================== Added: software_suite_v3/software/plugin/plugin-skype/trunk/builder/util/misc/DirectoriesAndFilesTools.py =================================================================== --- software_suite_v3/software/plugin/plugin-skype/trunk/builder/util/misc/DirectoriesAndFilesTools.py (rev 0) +++ software_suite_v3/software/plugin/plugin-skype/trunk/builder/util/misc/DirectoriesAndFilesTools.py 2009-06-17 14:47:57 UTC (rev 4823) @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- + +import version +__author__ = version.author +__date__ = version.date +__version__ = version.version +__licence__ = version.licence +del version + +# Copyleft (C) 2008 Acness World +# Remi Jocaille <rem...@c2...> +# Distributed under the terms of the GNU General Public License +# http://www.gnu.org/copyleft/gpl.html + +import os +import shutil + +if os.name == 'nt': + import win32con + import win32file + +# ============================================================================== +# Public functions +# ============================================================================== + +# ------------------------------------------------------------------------------ +# Force to create a directories tree if not exists. +# ------------------------------------------------------------------------------ +def MKDirs(path): + """Force to create a directories tree if not exists. + @param path: Directory path. + """ + if not os.path.isdir(path): + try: + os.makedirs(path) + except: + pass + +# ------------------------------------------------------------------------------ +# Force to create a directories tree after having deleted the old one. +# ------------------------------------------------------------------------------ +def MKDirsF(path): + """Force to create a directories tree after having deleted the old one. + @param path: Directory path. + """ + if os.path.isdir(path): + RMDirs(path) + os.makedirs(path) + +# ------------------------------------------------------------------------------ +# Remove directories and files recursively. +# ------------------------------------------------------------------------------ +def RMDirs(path): + """Remove directories and files recursively. + @param path: Path of the base directory. + """ + if not os.path.isdir(path): + return + for root, dirs, files in os.walk(path, topdown = False): + for d in dirs: + try: + os.removedirs(os.path.join(root, d)) + except: + pass + for f in files: + try: + if os.name == 'nt': + win32file.SetFileAttributesW(os.path.join(root, f), + win32con.FILE_ATTRIBUTE_NORMAL) + os.remove(os.path.join(root, f)) + except: + pass + if os.path.isdir(path): + try: + os.removedirs(path) + except: + pass + +# ------------------------------------------------------------------------------ +# Remove directories and files recursively with filters. +# ------------------------------------------------------------------------------ +def RMWithFilters(path, filters = ['.pyc', '.pyo']): + """Remove directories and files recursively with filters. + @param path: Path of the base directory. + @param filters: Filters as list. + """ + def checkFilter(name): + for filter in filters: + if name.lower().find(filter.lower()) == (len(name) - len(filter)): + return True + return False + + if not os.path.isdir(path): + return + + for root, dirs, files in os.walk(path, topdown = False): + for d in dirs: + if checkFilter(os.path.join(root, d)): + try: + RMDirs(os.path.join(root, d)) + except: + pass + for f in files: + if checkFilter(os.path.join(root, f)): + try: + if os.name == 'nt': + win32file.SetFileAttributesW(os.path.join(root, f), + win32con.FILE_ATTRIBUTE_NORMAL) + os.remove(os.path.join(root, f)) + except: + pass + +# ------------------------------------------------------------------------------ +# Remove a file. +# ------------------------------------------------------------------------------ +def RMFile(path): + """Remove a file. + @param path: File path. + """ + if os.path.isfile(path): + try: + if os.name == 'nt': + win32file.SetFileAttributesW(path, + win32con.FILE_ATTRIBUTE_NORMAL) + os.remove(path) + except: + pass + +# ------------------------------------------------------------------------------ +# Copy a directories tree to another directory. +# ------------------------------------------------------------------------------ +def CPDir(src, dest): + """Copy a directories tree to another directory. + @param src: Source path. + @param dest: Destination path. + """ + if not os.path.isdir(src): + return + if os.path.isdir(dest): + RMDirs(dest) + shutil.copytree(src, dest) + +# ------------------------------------------------------------------------------ +# Retrieve the OS temporary directory. +# ------------------------------------------------------------------------------ +def GetOSTMPDir(): + """Retrieve the OS temporary directory. + @return: The OS temporary directory. + """ + result = None + # On Windows + if os.name == 'nt': + result = os.environ.get('tmp') + if result == None: + result = os.environ.get('temp') + if result == None: + result = "c:\\windows\\temp" + # On linux + else: + result = "/tmp" + return result Added: software_suite_v3/software/plugin/plugin-skype/trunk/builder/util/misc/__init__.py =================================================================== Added: software_suite_v3/software/plugin/plugin-skype/trunk/builder/util/misc/version.py =================================================================== --- software_suite_v3/software/plugin/plugin-skype/trunk/builder/util/misc/version.py (rev 0) +++ software_suite_v3/software/plugin/plugin-skype/trunk/builder/util/misc/version.py 2009-06-17 14:47:57 UTC (rev 4823) @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +"""Version data for tuxisalive.lib.Util""" + +__author__ = "Remi Jocaille (rem...@c2...)" + +# Copyleft (C) 2008 C2ME Sa +# Remi Jocaille <rem...@c2...> +# Distributed under the terms of the GNU General Public License +# http://www.gnu.org/copyleft/gpl.html + +name = 'util.misc' +version = '0.0.1' +author = "Remi Jocaille (rem...@c2...)" + +description = "Utilities libraries." + +licence = "GPL" +date = "December 2008" Added: software_suite_v3/software/plugin/plugin-skype/trunk/builder/version.py =================================================================== --- software_suite_v3/software/plugin/plugin-skype/trunk/builder/version.py (rev 0) +++ software_suite_v3/software/plugin/plugin-skype/trunk/builder/version.py 2009-06-17 14:47:57 UTC (rev 4823) @@ -0,0 +1,9 @@ +# Copyleft (C) 2009 C2ME Sa +# Remi Jocaille <rem...@c2...> +# Distributed under the terms of the GNU General Public License +# http://www.gnu.org/copyleft/gpl.html + +version = '0.0.1' +author = "Remi Jocaille (rem...@c2...)" +licence = "GPL" +date = "2009" Added: software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/API/__init__.py =================================================================== --- software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/API/__init__.py (rev 0) +++ software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/API/__init__.py 2009-06-17 14:47:57 UTC (rev 4823) @@ -0,0 +1,160 @@ +''' +Low-level Skype API definitions. + +This module imports one of the: + - L{Skype4Py.API.darwin} + - L{Skype4Py.API.posix} + - L{Skype4Py.API.windows} +submodules based on the platform. +''' + +import sys +import threading +from Skype4Py.utils import * +from Skype4Py.enums import * +from Skype4Py.errors import ISkypeAPIError + + +class ICommand(object): + '''Represents an API command. Use L{ISkype.Command<skype.ISkype.Command>} to instatinate. + + To send a command to Skype, use L{ISkype.SendCommand<skype.ISkype.SendCommand>}. + ''' + + def __init__(self, Id, Command, Expected=u'', Blocking=False, Timeout=30000): + '''Use L{ISkype.Command<skype.ISkype.Command>} to instatinate the object instead. + ''' + + self.Blocking = Blocking + '''If set to True, L{ISkype.SendCommand<skype.ISkype.SendCommand>} will block until the reply is received. + @type: bool''' + + self.Command = unicode(Command) + '''Command string. + @type: unicode''' + + self.Expected = unicode(Expected) + '''Expected reply. + @type: unicode''' + + self.Id = Id + '''Command Id. + @type: int''' + + self.Reply = u'' + '''Reply after the command has been sent and Skype has replied. + @type: unicode''' + + self.Timeout = Timeout + '''Timeout in milliseconds if Blocking=True. + @type: int''' + + def __repr__(self): + return '<%s with Id=%s, Command=%s, Blocking=%s, Reply=%s>' % \ + (object.__repr__(self)[1:-1], self.Id, repr(self.Command), self.Blocking, repr(self.Reply)) + + +class _ISkypeAPIBase(threading.Thread): + def __init__(self, opts): + threading.Thread.__init__(self) + self.setDaemon(True) + self.DebugLevel = opts.pop('ApiDebugLevel', 0) + self.FriendlyName = u'Skype4Py' + self.Protocol = 5 + self.Commands = {} + self.CommandsLock = threading.Lock() + self.Handlers = [] + self.AttachmentStatus = apiAttachUnknown + + def _NotImplemented(self): + raise ISkypeAPIError('Functionality not implemented') + + def RegisterHandler(self, Handler): + for h in self.Handlers: + if h() == Handler: + return + self.Handlers.append(WeakCallableRef(Handler)) + + def UpdateHandlers(self): + self.Handlers = filter(lambda x: x(), self.Handlers) + + def NumOfHandlers(self): + self.UpdateHandlers() + return len(self.Handlers) + + def CallHandler(self, mode, arg): + for h in self.Handlers: + f = h() + if f: + f(mode, arg) + + def CommandsStackPush(self, Command): + self.CommandsLock.acquire() + if Command.Id < 0: + Command.Id = 0 + while Command.Id in self.Commands: + Command.Id += 1 + if Command.Id in self.Commands: + self.CommandsLock.release() + raise ISkypeAPIError('Command Id conflict') + self.Commands[Command.Id] = Command + self.CommandsLock.release() + + def CommandsStackPop(self, Id): + self.CommandsLock.acquire() + try: + Command = self.Commands[Id] + del self.Commands[Id] + except KeyError: + Command = None + self.CommandsLock.release() + return Command + + def Close(self): + pass + + def SetDebugLevel(self, Level): + self.DebugLevel = Level + + def DebugPrint(self, *args, **kwargs): + if self.DebugLevel >= kwargs.get('Level', 1): + print >>sys.stderr, 'Skype4Py/API', ' '.join(('%s',) * len(args)) % args + + def SetFriendlyName(self, FriendlyName): + self.FriendlyName = FriendlyName + + def SetAttachmentStatus(self, AttachmentStatus): + if AttachmentStatus != self.AttachmentStatus: + self.DebugPrint('AttachmentStatus', AttachmentStatus) + self.AttachmentStatus = AttachmentStatus + self.CallHandler('attach', AttachmentStatus) + + def Attach(self, Timeout=30000, Wait=True): + self._NotImplemented() + + def IsRunning(self): + self._NotImplemented() + + def Start(self, Minimized=False, Nosplash=False): + self._NotImplemented() + + def Shutdown(self): + self._NotImplemented() + + def SendCommand(self, Command): + self._NotImplemented() + + def ApiSecurityContextEnabled(self, Context): + self._NotImplemented() + + def EnableApiSecurityContext(self, Context): + self._NotImplemented() + + +# Select apropriate low-level Skype API module +if sys.platform[:3] == 'win': + from windows import _ISkypeAPI +elif sys.platform == 'darwin': + from darwin import _ISkypeAPI +else: + from posix import _ISkypeAPI Added: software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/API/darwin.py =================================================================== --- software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/API/darwin.py (rev 0) +++ software_suite_v3/software/plugin/plugin-skype/trunk/executables/Skype4Py/API/darwin.py 2009-06-17 14:47:57 UTC (rev 4823) @@ -0,0 +1,484 @@ +''' +Low level Skype for Mac OS X interface implemented +using Carbon distributed notifications. Uses direct +Carbon/CoreFoundation calls through ctypes module. + +This module handles the options that you can pass to +L{ISkype.__init__<skype.ISkype.__init__>} for Mac OS X +machines. + +No further options are currently supported. + +Thanks to Eion Robb for reversing Skype for Mac API protocol. +''' + +from Skype4Py.API import ICommand, _ISkypeAPIBase +from ctypes import * +from ctypes.util import find_library +from Skype4Py.errors import ISkypeAPIError +from Skype4Py.enums import * +import threading, time + + +class Carbon(object): + '''Represents the Carbon.framework. + ''' + + def __init__(self): + path = find_library('Carbon') + if path == None: + raise ImportError('Could not find Carbon.framework') + self.lib = cdll.LoadLibrary(path) + self.lib.RunCurrentEventLoop.argtypes = (c_double,) + + def RunCurrentEventLoop(self, timeout=-1): + # timeout=-1 means forever + return self.lib.RunCurrentEventLoop(timeout) + + def GetCurrentEventLoop(self): + return EventLoop(self, c_void_p(self.lib.GetCurrentEventLoop())) + + +class EventLoop(object): + '''Represents an EventLoop from Carbon.framework. + + http://developer.apple.com/documentation/Carbon/Reference/Carbon_Event_Manager_Ref/ + ''' + + def __init__(self, carb, handle): + self.carb = carb + self.handle = handle + + def quit(self): + self.carb.lib.QuitEventLoop(self.handle) + + +class CoreFoundation(object): + '''Represents the CoreFoundation.framework. + ''' + + def __init__(self): + path = find_library('CoreFoundation') + if path == None: + raise ImportError('Could not find CoreFoundation.framework') + self.lib = cdll.LoadLibrary(path) + self.cfstrs = [] + + def CFType(self, handle=0): + return CFType(self, handle=handle) + + def CFStringFromHandle(self, handle=0): + return CFString(self, handle=handle) + + def CFString(self, s=u''): + return CFString(self, string=s) + + def CFSTR(self, s): + for cfs in self.cfstrs: + if unicode(cfs) == s: + return cfs + cfs = self.CFString(s) + self.cfstrs.append(cfs) + return cfs + + def CFNumberFromHandle(self, handle=0): + return CFNumber(self, handle=handle) + + def CFNumber(self, n=0): + return CFNumber(self, number=n) + + def CFDictionaryFromHandle(self, handle=0): + return CFDictionary(self, handle=handle) + + def CFDictionary(self, d={}): + return CFDictionary(self, dictionary=d) + + def CFDistributedNotificationCenter(self): + return CFDistributedNotificationCenter(self) + + +class CFType(object): + '''Fundamental type for all CoreFoundation types. + + http://developer.apple.com/documentation/CoreFoundation/Reference/CFTypeRef/ + ''' + + def __init__(self, cf, **kwargs): + if isinstance(cf, CFType): + self.cf = cf.cf + self.handle = cf.get_handle() + if len(kwargs): + raise TypeError('unexpected additional arguments') + else: + self.cf = cf + self.handle = None + self.owner = False + self.__dict__.update(kwargs) + if self.handle != None and not isinstance(self.handle, c_void_p): + self.handle = c_void_p(self.handle) + + def retain(self): + if not self.owner: + self.cf.lib.CFRetain(self) + self.owner = True + + def is_owner(self): + return self.owner + + def get_handle(self): + return self.handle + + def __del__(self): + if self.owner: + self.cf.lib.CFRelease(self) + self.handle = None + self.cf = None + + def __repr__(self): + return '%s(handle=%s)' % (self.__class__.__name__, repr(self.handle)) + + # allows passing CF types as ctypes function parameters + _as_parameter_ = property(get_handle) + + +class CFString(CFType): + '''CoreFoundation string type. + + Supports Python unicode type only. + + http://developer.apple.com/documentation/CoreFoundation/Reference/CFStringRef/ + ''' + + def __init__(self, *args, **kwargs): + CFType.__init__(self, *args, **kwargs) + if 'string' in kwargs: + s = unicode(kwargs['string']).encode('utf8') + self.handle = c_void_p(self.cf.lib.CFStringCreateWithBytes(None, + s, len(s), 0x08000100, False)) + self.owner = True + + def __str__(self): + i = len(self) + buf = create_string_buffer(i) + self.cf.lib.CFStringGetBytes(self, 0, i, 0x08000100, c_char('?'), False, buf, i, None) + return buf.value + + def __unicode__(self): + return str(self).decode('utf8') + + def __len__(self): + return self.cf.lib.CFStringGetLength(self) + + def __repr__(self): + return 'CFString(%s)' % repr(unicode(self)) + + +class CFNumber(CFType): + '''CoreFoundation number type. + + Supports Python int type only. + + http://developer.apple.com/documentation/CoreFoundation/Reference/CFNumberRef/ + ''' + + def __init__(self, *args, **kwargs): + CFType.__init__(self, *args, **kwargs) + if 'number' in kwargs: + n = int(kwargs['number']) + self.handle = c_void_p(self.cf.lib.CFNumberCreate(None, 3, byref(c_int(n)))) + self.owner = True + + def __int__(self): + n = c_int() + if self.cf.lib.CFNumberGetValue(self, 3, byref(n)): + return n.value + return 0 + + def __repr__(self): + return 'CFNumber(%s)' % repr(int(self)) + + +class CFDictionary(CFType): + '''CoreFoundation immutable dictionary type. + + http://developer.apple.com/documentation/CoreFoundation/Reference/CFDictionaryRef/ + ''' + + def __init__(self, *args, **kwargs): + CFType.__init__(self, *args, **kwargs) + if 'dictionary' in kwargs: + d = dict(kwargs['dictionary']) + keys = (c_void_p * len(d))() + values = (c_void_p * len(d))() + i = 0 + for k, v in d.items(): + if not isinstance(k, CFType): + raise TypeError('CFDictionary: key is not a CFType') + if not isinstance(v, CFType): + raise TypeError('CFDictionary: value is not a CFType') + keys[i] = k.get_handle() + values[i] = v.get_handle() + i += 1 + self.handle = c_void_p(self.cf.lib.CFDictionaryCreate(None, keys, values, len(d), + self.cf.lib.kCFTypeDictionaryKeyCallBacks, self.cf.lib.kCFTypeDictionaryValueCallBacks)) + self.owner = True + + def get_dict(self): + n = len(self) + keys = (c_void_p * n)() + values = (c_void_p * n)() + self.cf.lib.CFDictionaryGetKeysAndValues(self, keys, values) + d = dict() + for i in xrange(n): + d[self.cf.CFType(keys[i])] = self.cf.CFType(values[i]) + return d + + def __getitem__(self, key): + return self.cf.CFType(c_void_p(self.cf.lib.CFDictionaryGetValue(self, key))) + + def __len__(self): + return self.cf.lib.CFDictionaryGetCount(self) + + +class CFDistributedNotificationCenter(CFType): + '''CoreFoundation distributed notification center type. + + http://developer.apple.com/documentation/CoreFoundation/Reference/CFNotificationCenterRef/ + ''' + + CFNotificationCallback = CFUNCTYPE(None, c_void_p, c_void_p, c_void_p, c_void_p, c_void_p) + + def __init__(self, *args, **kwargs): + CFType.__init__(self, *args, **kwargs) + self.handle = c_void_p(self.cf.lib.CFNotificationCenterGetDistributedCenter()) + # there is only one distributed notification center per application + self.owner = False + self.callbacks = {} + self._callback = self.CFNotificationCallback(self._notification_callback) + + def _notification_callback(self, center, observer, name, obj, userInfo): + observer = self.cf.CFStringFromHandle(observer) + name = self.cf.CFStringFromHandle(name) + if obj: + obj = self.cf.CFStringFromHandle(obj) + callback = self.callbacks[(unicode(observer), unicode(name))] + callback(self, observer, name, obj, + self.cf.CFDictionaryFromHandle(userInfo)) + + def add_observer(self, observer, callback, name=None, obj=None, + drop=False, coalesce=False, hold=False, immediate=False): + if not isinstance(observer, CFString): + observer = self.cf.CFString(observer) + if not callable(callback): + raise TypeError('callback must be callable') + self.callbacks[(unicode(observer), unicode(name))] = callback + if name != None and not isinstance(name, CFString): + name = self.cf.CFSTR(name) + if obj != None and not isinstance(obj, CFString): + obj = self.cf.CFSTR(obj) + if drop: + behaviour = 1 + elif coalesce: + behaviour = 2 + elif hold: + behaviour = 3 + elif immediate: + behaviour = 4 + else: + behaviour = 0 + self.cf.lib.CFNotificationCenterAddObserver(self, observer, self._callback, name, obj, behaviour) + + def remove_observer(self, observer, name=None, obj=None): + if not isinstance(observer, CFString): + observer = self.cf.CFString(observer) + if name != None and not isinstance(name, CFString): + name = self.cf.CFSTR(name) + if obj != None and not isinstance(obj, CFString): + obj = self.cf.CFSTR(obj) + self.cf.lib.CFNotificationCenterRemoveObserver(self, observer, name, obj) + try: + del self.callbacks[(unicode(observer), unicode(name))] + except KeyError: + pass + + def post_notification(self, name, obj=None, userInfo=None, immediate=False): + if not isinstance(name, CFString): + name = self.cf.CFSTR(name) + if obj != None and not isinstance(obj, CFString): + obj = self.cf.CFSTR(obj) + if userInfo != None and not isinstance(userInfo, CFDictionary): + userInfo = self.cf.CFDictionary(userInfo) + self.cf.lib.CFNotificationCenterPostNotification(self, name, obj, userInfo, immediate) + + +class _ISkypeAPI(_ISkypeAPIBase): + '''Skype for Mac API wrapper. + + Based with permission on code included in Skype Plugin for Pidgin. + http://code.google.com/p/skype4pidgin/ + ''' + + def __init__(self, handler, opts): + _ISkypeAPIBase.__init__(self, opts) + self.RegisterHandler(handler) + self.carbon = Carbon() + self.coref = CoreFoundation() + self.center = self.coref.CFDistributedNotificationCenter() + self.is_available = False + self.client_id = -1 + + def run(self): + self.DebugPrint('thread started') + self.loop = self.carbon.GetCurrentEventLoop() + self.carbon.RunCurrentEventLoop() + self.DebugPrint('thread finished') + + def Close(self): + if hasattr(self, 'loop'): + self.loop.quit() + self.DebugPrint('closed') + + def SetFriendlyName(self, FriendlyName): + self.FriendlyName = FriendlyName + if self.AttachmentStatus == apiAttachSuccess: + # reattach with the new name + self.SetAttachmentStatus(apiAttachUnknown) + self.Attach() + + def Attach(self, Timeout=30000, Wait=True): + if self.AttachmentStatus in (apiAttachPendingAuthorization, apiAttachSuccess): + return + try: + self.start() + except AssertionError: + pass + try: + self.init_observer() + self.SetAttachmentStatus(apiAttachPendingAuthorization) + self.post('SKSkypeAPIAttachRequest') + self.wait = True + def ftimeout(): + self.wait = False + t = threading.Timer(Timeout / 1000.0, ftimeout) + if Wait: + t.start() + while self.wait and self.AttachmentStatus == apiAttachPendingAuthorization: + time.sleep(1.0) + finally: + t.cancel() + if not self.wait: + self.SetAttachmentStatus(apiAttachUnknown) + raise ISkypeAPIError('Skype attach timeout') + self.SendCommand(ICommand(-1, 'PROTOCOL %s' % self.Protocol)) + + def IsRunning(self): + try: + self.start() + except AssertionError: + pass + self.init_observer() + self.is_available = False + self.post('SKSkypeAPIAvailabilityRequest') + time.sleep(1.0) + return self.is_available + + def Start(self, Minimized=False, Nosplash=False): + if not self.IsRunning(): + from subprocess import Popen + nul = file('/dev/null') + Popen(['/Applications/Skype.app/Contents/MacOS/Skype'], stdin=nul, stdout=nul, stderr=nul) + + def SendCommand(self, Command): + if not self.AttachmentStatus == apiAttachSuccess: + self.Attach(Command.Timeout) + self.CommandsStackPush(Command) + self.CallHandler('send', Command) + com = u'#%d %s' % (Command.Id, Command.Command) + if Command.Blocking: + Command._event = event = threading.Event() + else: + Command._timer = timer = threading.Timer(Command.Timeout / 1000.0, self.CommandsStackPop, (Command.Id,)) + + self.DebugPrint('->', repr(com)) + userInfo = self.coref.CFDictionary({self.coref.CFSTR('SKYPE_API_COMMAND'): self.coref.CFString(com), + self.coref.CFSTR('SKYPE_API_CLIENT_ID'): self.coref.CFNumber(self.client_id)}) + self.post('SKSkypeAPICommand', userInfo) + + if Command.Blocking: + event.wait(Command.Timeout / 1000.0) + if not event.isSet(): + raise ISkypeAPIError('Skype command timeout') + else: + timer.start() + + def init_observer(self): + if self.has_observer(): + self.delete_observer() + self.observer = self.coref.CFString(self.FriendlyName) + self.center.add_observer(self.observer, self.SKSkypeAPINotification, 'SKSkypeAPINotification', immediate=True) + self.center.add_observer(self.observer, self.SKSkypeWillQuit, 'SKSkypeWillQuit', immediate=True) + self.center.add_observer(self.observer, self.SKSkypeBecameAvailable, 'SKSkypeBecameAvailable', immediate=True) + self.center.add_observer(self.observer, self.SKAvailabilityUpdate, 'SKAvailabilityUpdate', immediate=True) + self.center.add_observer(self.observer, self.SKSkypeAttachResponse, 'SKSkypeAttachResponse', immediate=True) + + def delete_observer(self): + if not self.has_observer(): + return + self.center.remove_observer(self.observer, 'SKSkypeAPINotification') + self.center.remove_observer(self.observer, 'SKSkypeWillQuit') + self.center.remove_observer(self.observer, 'SKSkypeBecameAvailable') + self.center.remove_observer(self.observer, 'SKAvailabilityUpdate') + self.center.remove_observer(self.observer, 'SKSkypeAttachResponse') + del self.observer + + def has_observer(self): + return hasattr(self, 'observer') + + def post(self, name, userInfo=None): + if not self.has_observer(): + self.init_observer() + self.center.post_notification(name, self.observer, userInfo, immediate=True) + + def SKSkypeAPINotification(self, center, observer, name, obj, userInfo): + client_id = int(CFNumber(userInfo[self.coref.CFSTR('SKYPE_API_CLIENT_ID')])) + if client_id != 999 and (client_id == 0 or client_id != self.client_id): + return + com = unicode(CFString(userInfo[self.coref.CFSTR('SKYPE_API_NOTIFICATION_STRING')])) + self.DebugPrint('<-', repr(com)) + + if com.startswith(u'#'): + p = com.find(u' ') + Command = self.CommandsStackPop(int(com[1:p])) + if Command: + Command.Reply = com[p + 1:] + if Command.Blocking: + Command._event.set() + del Command._event + else: + Command._timer.cancel() + del Command._timer + self.CallHandler('rece', Command) + else: + self.CallHandler('rece_api', com[p + 1:]) + else: + self.CallHandler('rece_api'... [truncated message content] |
|
From: jerome <c2m...@c2...> - 2009-06-17 14:05:57
|
Author: jerome
Date: 2009-06-17 15:42:54 +0200 (Wed, 17 Jun 2009)
New Revision: 4822
Added:
software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/
software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Project1.cfg
software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Project1.dof
software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Project1.dpr
software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Project1.res
software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Unit1.dcu
software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Unit1.dfm
software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Unit1.pas
software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/resources/Facebook_connection.exe
Modified:
software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/resources/gadget.xml
software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/src/FacebookConnection.java
software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/src/FacebookGadget.java
Log:
* Added a way to get user connected to his account automatically.
Added: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Project1.cfg
===================================================================
--- software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Project1.cfg (rev 0)
+++ software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Project1.cfg 2009-06-17 13:42:54 UTC (rev 4822)
@@ -0,0 +1,35 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-LE"c:\program files\borland\delphi6\Projects\Bpl"
+-LN"c:\program files\borland\delphi6\Projects\Bpl"
Added: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Project1.dof
===================================================================
--- software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Project1.dof (rev 0)
+++ software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Project1.dof 2009-06-17 13:42:54 UTC (rev 4822)
@@ -0,0 +1,83 @@
+[FileVersion]
+Version=6.0
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+[Directories]
+OutputDir=
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=
+HostApplication=
+Launcher=
+UseLauncher=0
+DebugCWD=
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1033
+CodePage=1252
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
Added: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Project1.dpr
===================================================================
--- software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Project1.dpr (rev 0)
+++ software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Project1.dpr 2009-06-17 13:42:54 UTC (rev 4822)
@@ -0,0 +1,13 @@
+program Project1;
+
+uses
+ Forms,
+ Unit1 in 'Unit1.pas' {Form1};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.CreateForm(TForm1, Form1);
+ Application.Run;
+end.
Added: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Project1.res
===================================================================
(Binary files differ)
Property changes on: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Project1.res
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Unit1.dcu
===================================================================
(Binary files differ)
Property changes on: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Unit1.dcu
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Unit1.dfm
===================================================================
--- software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Unit1.dfm (rev 0)
+++ software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Unit1.dfm 2009-06-17 13:42:54 UTC (rev 4822)
@@ -0,0 +1,47 @@
+object Form1: TForm1
+ Left = 190
+ Top = 23
+ Width = 979
+ Height = 707
+ AlphaBlend = True
+ AlphaBlendValue = 0
+ Caption = 'Facebook Connection window'
+ Color = clBtnFace
+ Enabled = False
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ Visible = True
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object EmbeddedWB1: TEmbeddedWB
+ Left = 8
+ Top = 0
+ Width = 961
+ Height = 665
+ TabOrder = 0
+ OnDocumentComplete = EmbeddedWB1DocumentComplete
+ DisableCtrlShortcuts = 'N'
+ UserInterfaceOptions = [EnablesFormsAutoComplete, EnableThemes]
+ About = ' EmbeddedWB http://bsalsa.com/'
+ PrintOptions.Margins.Left = 19.05
+ PrintOptions.Margins.Right = 19.05
+ PrintOptions.Margins.Top = 19.05
+ PrintOptions.Margins.Bottom = 19.05
+ PrintOptions.Header = '&w&bPage &p of &P'
+ PrintOptions.HTMLHeader.Strings = (
+ '<HTML></HTML>')
+ PrintOptions.Footer = '&u&b&d'
+ PrintOptions.Orientation = poPortrait
+ ControlData = {
+ 4C000000763C0000313400000000000000000000000000000000000000000000
+ 000000004C000000000000000000000001000000E0D057007335CF11AE690800
+ 2B2E126208000000000000004C0000000114020000000000C000000000000046
+ 8000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000100000000000000000000000000000000000000}
+ end
+end
Added: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Unit1.pas
===================================================================
--- software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Unit1.pas (rev 0)
+++ software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/Facebook_connection_source/Unit1.pas 2009-06-17 13:42:54 UTC (rev 4822)
@@ -0,0 +1,161 @@
+{* This file is part of "Tux Droid Browser".
+ * Copyright 2009, kysoh
+ * Author : Conan Jerome.
+ * eMail : jer...@ky...
+ * Site : http://www.kysoh.com/
+ *
+ * "Tux Droid Browser" is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * "Tux Droid Browser" is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with "Tux Droid Browser"; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ *}
+
+unit Unit1;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, OleCtrls, SHDocVw_EWB, EwbCore, EmbeddedWB, StdCtrls, ComCtrls, ActiveX,
+ ComObj, MSHTMLEvents, MSHTML_TLB;
+
+type
+ TForm1 = class(TForm)
+ EmbeddedWB1: TEmbeddedWB;
+ procedure FormCreate(Sender: TObject);
+ procedure EmbeddedWB1DocumentComplete(ASender: TObject;
+ const pDisp: IDispatch; var URL: OleVariant);
+ procedure change(id : string ;value : string);
+ procedure send(id : String);
+
+ private
+ { Darations priv }
+ public
+ { Darations publiques }
+ end;
+
+var
+ Form1: TForm1;
+ oneTime : boolean;
+
+ login : String;
+ password : String;
+
+implementation
+
+{$R *.dfm}
+
+
+{
+ Form create.
+}
+procedure TForm1.FormCreate(Sender: TObject);
+begin
+
+ Application.Minimize;
+
+ if ParamCount < 3 then
+ Form1.Close;
+
+ login := ParamStr(2);
+ password := ParamStr(3);
+
+ oneTime := true;
+
+ self.EmbeddedWB1.DisableNavSound(true);
+ self.EmbeddedWB1.Go(ParamStr(1));
+end;
+
+
+{
+ Update document and change formulaire values.
+}
+procedure TForm1.EmbeddedWB1DocumentComplete(ASender: TObject;
+ const pDisp: IDispatch; var URL: OleVariant);
+begin
+ if oneTime then
+ begin
+ Form1.change('email', login);
+ Form1.change('pass', password);
+ oneTime := false;
+ end
+ else
+ begin
+ Form1.Close;
+ end;
+ Form1.send('login');
+end;
+
+
+
+{
+ This procedure changes an inut text value given in parameters.
+}
+procedure TForm1.change(id : string ; value : string);
+var
+ HtmlElement: IHTMLElement;
+ AllHidden: IHTMLElementCollection;
+ i:integer;
+begin
+ try
+ AllHidden := self.EmbeddedWB1.GetDocument.all.tags('input') as IHTMLElementCollection;
+ for i:=0 to AllHidden.length-1 do
+ begin
+ HtmlElement := AllHidden.item(I, '') as IHTMLElement;
+ if (lowercase(HtmlElement.getAttribute('type', 0)) = 'password') or (lowercase(HtmlElement.getAttribute('type', 0)) = 'text') then
+ begin
+ if HtmlElement.getAttribute('id', 0) = id then
+ begin
+ HtmlElement.setAttribute('value', value, 0);
+ exit;
+ end;
+ end;
+ application.ProcessMessages;
+ end;
+ except
+ end;
+
+end;
+
+
+{
+ do click on the document.
+}
+procedure TForm1.send(id : String);
+var
+ HtmlElement: IHTMLElement;
+ AllHidden: IHTMLElementCollection;
+ i:integer;
+begin
+ try
+ AllHidden := self.EmbeddedWB1.GetDocument.all.tags('input') as IHTMLElementCollection;
+ for i:=0 to AllHidden.length-1 do
+ begin
+ HtmlElement := AllHidden.item(I, '') as IHTMLElement;
+ if lowercase(HtmlElement.getAttribute('type', 0)) = 'submit' then
+ begin
+ if HtmlElement.getAttribute('id', 0) = id then
+ begin
+ HtmlElement.click;
+ exit;
+ end;
+ end;
+ application.ProcessMessages;
+ end;
+ except
+ end;
+
+
+end;
+
+end.
Added: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/resources/Facebook_connection.exe
===================================================================
(Binary files differ)
Property changes on: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/resources/Facebook_connection.exe
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/resources/gadget.xml
===================================================================
--- software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/resources/gadget.xml 2009-06-17 08:51:26 UTC (rev 4821)
+++ software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/resources/gadget.xml 2009-06-17 13:42:54 UTC (rev 4822)
@@ -14,6 +14,18 @@
<uuid>1f0f6400-49ee-11de-8a39-0800200c9a66</uuid>
</description>
<parameters>
+ <parameter
+ category="Gadget parameters"
+ name="login"
+ description="Login"
+ type="string"
+ defaultValue="your login" />
+ <parameter
+ category="Gadget parameters"
+ name="password"
+ description="Password"
+ type="string"
+ defaultValue="your password" />
<parameter
category="Gadget parameters"
name="notifyEmail"
Modified: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/src/FacebookConnection.java
===================================================================
--- software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/src/FacebookConnection.java 2009-06-17 08:51:26 UTC (rev 4821)
+++ software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/src/FacebookConnection.java 2009-06-17 13:42:54 UTC (rev 4822)
@@ -20,6 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
+import java.io.File;
import java.io.IOException;
import com.facebook.api.FacebookException;
@@ -36,7 +37,7 @@
/**
* Class constructor.
*/
- public FacebookConnection(FacebookGadget gdg, TuxAPI tux)
+ public FacebookConnection(FacebookGadget gdg, TuxAPI tux, String login, String password)
{
try
{
@@ -52,16 +53,28 @@
// Build the authentication URL for the user to fill out
String url = "http://www.facebook.com/login.php?api_key=" + FacebookConnection.api_key + "&v=1.0" + "&auth_token=" + token;
- //Open browser for user to log in
- BareBonesBrowserLaunch.openURL(url);
-
+
+ File app = new File("./resources/Facebook_connection.exe");
+
+ if(app.exists())
+ {
+
+ String[] cmd = new String[]{app.getAbsolutePath(), url, login, password};
+
+ Process log = Runtime.getRuntime().exec(cmd);
+ try
+ {
+ log.waitFor();
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace();
+ }
+ }
+
// wait for user to log in and hit enter
gdg.throwMessage("Connect to your account and push my left wing");
- tux.flippers.up();
- tux.button.left.waitPressed(60.0);
- tux.flippers.down();
-
// fetch session key
String session = client.auth_getSession(token);
Modified: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/src/FacebookGadget.java
===================================================================
--- software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/src/FacebookGadget.java 2009-06-17 08:51:26 UTC (rev 4821)
+++ software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/src/FacebookGadget.java 2009-06-17 13:42:54 UTC (rev 4822)
@@ -40,14 +40,56 @@
*/
public static class Configuration extends SimpleGadgetConfiguration{
+ private String login = "";
+ private String password = "";
+
private boolean showFriendRequests = true;
private boolean showGroupsInvites = true;
private boolean showEventsInvites = true;
private boolean showPokes = true;
private boolean notifyEmail = true;
+ /**
+ * Return the user login.
+ * @return
+ */
+ public String getLogin()
+ {
+ return this.login;
+ }
+
/**
+ * Set the user login.
+ * @param aLogin
+ */
+ public void setLogin(String aLogin)
+ {
+ this.login = aLogin;
+ }
+
+
+ /**
+ * Return tthe user password.
+ * @return
+ */
+ public String getPassword()
+ {
+ return this.password;
+ }
+
+
+ /**
+ * Set the user password.
+ * @param aPassword
+ */
+ public void setPassword(String aPassword)
+ {
+ this.password = aPassword;
+ }
+
+
+ /**
* Return true if user want to hear his email notifications.
* @return
*/
@@ -151,9 +193,9 @@
{
this.connectTuxApi();
- if(tux.radio.getConnected())
+ if(true)//tux.radio.getConnected())
{
- FacebookConnection facebook = new FacebookConnection(this, tux);
+ FacebookConnection facebook = new FacebookConnection(this, tux, this.configuration().getLogin(), this.configuration().getPassword());
FacebookFunctions functions = new FacebookFunctions(facebook);
//Get email informations.
|
|
From: jerome <c2m...@c2...> - 2009-06-17 08:51:38
|
Author: jerome Date: 2009-06-17 10:51:26 +0200 (Wed, 17 Jun 2009) New Revision: 4821 Modified: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/src/FacebookFunctions.java Log: * Fixed a bug : FB api give not all event names, so, fql queries was needed. Modified: software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/src/FacebookFunctions.java =================================================================== --- software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/src/FacebookFunctions.java 2009-06-16 12:05:14 UTC (rev 4820) +++ software_suite_v2/software/gadgets/tuxdroid-gadget-facebook/trunk/tuxdroid-gadget-facebook/src/FacebookFunctions.java 2009-06-17 08:51:26 UTC (rev 4821) @@ -1,17 +1,3 @@ -import java.io.IOException; -import java.util.EnumSet; -import java.util.Hashtable; -import java.util.List; -import java.util.Vector; - -import com.facebook.api.FacebookException; -import com.facebook.api.ProfileField; -import com.facebook.api.schema.Event; -import com.facebook.api.schema.EventsGetResponse; -import com.facebook.api.schema.FriendsGetResponse; -import com.facebook.api.schema.User; -import com.facebook.api.schema.UsersGetInfoResponse; - /* This file is part of "TuxDroid Gadget Facebook". * Copyright 2009, kysoh * Author : Conan Jerome. @@ -34,6 +20,22 @@ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ + +import java.io.IOException; +import java.util.EnumSet; +import java.util.Hashtable; +import java.util.List; +import java.util.Vector; + +import com.facebook.api.FacebookException; +import com.facebook.api.ProfileField; +import com.facebook.api.schema.Event; +import com.facebook.api.schema.EventsGetResponse; +import com.facebook.api.schema.FriendsGetResponse; +import com.facebook.api.schema.User; +import com.facebook.api.schema.UsersGetInfoResponse; + + public class FacebookFunctions { private FacebookConnection connection; @@ -321,33 +323,53 @@ Vector<String> eventsDatas = new Vector<String>(); //Getting friends uid that ask for friends. - if(eventString.contains("<eid>")) + if(eventString.contains("<eid>") || (eventString.contains("<event_invites_elt>"))) { while(eventString.contains("<eid>")) { - String friend = eventString.substring( + String event = eventString.substring( eventString.indexOf("<eid>") + "<eid>".length(), eventString.indexOf("</eid>")); - eventString = eventString.replace("<eid>" + friend + "</eid>", ""); + eventString = eventString.replace("<eid>" + event + "</eid>", ""); - eventsDatasAsLong.add(Long.valueOf(friend).longValue()); + eventsDatasAsLong.add(Long.valueOf(event).longValue()); } - //Getting events names. - connection.getClient().events_get(connection.getFacebookUserId(), eventsDatasAsLong, Long.valueOf(0), Long.valueOf(0)); - EventsGetResponse response = (EventsGetResponse) connection.getClient().getResponsePOJO(); - List<Event> events = response.getEvent(); + while(eventString.contains("<event_invites_elt>")) + { + String event = eventString.substring( + eventString.indexOf("<event_invites_elt>") + "<event_invites_elt>".length(), + eventString.indexOf("</event_invites_elt>")); + + eventString = eventString.replace("<event_invites_elt>" + event + "</event_invites_elt>", ""); + eventsDatasAsLong.add(Long.valueOf(event).longValue()); + } + //Adding the number of event invites. eventsDatas.add(String.valueOf(eventsDatasAsLong.size())); - for(Event event : events) + for(Long eid : eventsDatasAsLong) { - if(eventsDatasAsLong.contains(event.getEid())) + try { - eventsDatas.add(event.getName()); + Thread.sleep(200); + connection.getClient().fql_query("Select name from event WHERE eid=" + eid.longValue()); + String response = connection.getClient().getRawResponse(); + if(response.contains("<event>") && response.contains("<name>")) + { + String groupName = response.substring( + response.indexOf("<name>") + "<name>".length(), + response.indexOf("</name>", response.indexOf("<name>"))); + eventsDatas.add(groupName); + } } + catch(Exception fqlError) + { + eventsDatas.add("Unknown group"); + } + } if(eventsDatasAsLong.size() > 0) |
|
From: jerome <c2m...@c2...> - 2009-06-16 12:06:10
|
Author: jerome
Date: 2009-06-16 14:05:14 +0200 (Tue, 16 Jun 2009)
New Revision: 4820
Modified:
software_suite_v2/software/control_center/trunk/control_center/pom.xml
Log:
* Updated pom.xml file.
Modified: software_suite_v2/software/control_center/trunk/control_center/pom.xml
===================================================================
--- software_suite_v2/software/control_center/trunk/control_center/pom.xml 2009-06-16 11:32:57 UTC (rev 4819)
+++ software_suite_v2/software/control_center/trunk/control_center/pom.xml 2009-06-16 12:05:14 UTC (rev 4820)
@@ -4,7 +4,7 @@
<groupId>com.kysoh</groupId>
<artifactId>control_center</artifactId>
<packaging>jar</packaging>
- <version>0.2.7</version>
+ <version>0.2.8</version>
<name>Tux Control Center</name>
<url>http://www.kysoh.com</url>
<repositories>
|
|
From: jerome <c2m...@c2...> - 2009-06-16 11:34:07
|
Author: jerome
Date: 2009-06-16 13:32:57 +0200 (Tue, 16 Jun 2009)
New Revision: 4819
Modified:
software_suite_v2/software/control_center/trunk/control_center/sources/com/tuxdroid/cc/CcInterface.java
Log:
* Added alert exception for facebook gadget.
Modified: software_suite_v2/software/control_center/trunk/control_center/sources/com/tuxdroid/cc/CcInterface.java
===================================================================
--- software_suite_v2/software/control_center/trunk/control_center/sources/com/tuxdroid/cc/CcInterface.java 2009-06-15 14:56:42 UTC (rev 4818)
+++ software_suite_v2/software/control_center/trunk/control_center/sources/com/tuxdroid/cc/CcInterface.java 2009-06-16 11:32:57 UTC (rev 4819)
@@ -56,7 +56,6 @@
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
-import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.InsetsUIResource;
@@ -2806,6 +2805,11 @@
if(this.playlistDragToIndex == 0)
{
Object[] datas = fileBrowser.getDatasAsRemoteStruct(CcConstants.TYPE_GADGETS, CcCommons.view);
+ if(datas[3].toString().contains("tuxdroid-gadget-facebook"))
+ {
+ JOptionPane.showMessageDialog(null, "This gadget can not be used as alert.");
+ return;
+ }
datas = CcInterfaceFunctions.rename(datas, alertPlaylist.datasToDisplay);
CcCommons.settings.addToAlertList(datas, null);
alertPlaylist.setDatas(CcCommons.settings.getAlertListDatas());
|
|
From: remi <c2m...@c2...> - 2009-06-15 14:56:58
|
Author: remi Date: 2009-06-15 16:56:42 +0200 (Mon, 15 Jun 2009) New Revision: 4818 Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Angel.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Angry.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Asleep.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Cat.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Clock.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Confused.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Crying.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Disappointed.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Dog.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Gasp.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Kiss.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Laughing.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Laughing2.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Laughingevil.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Laughingwild.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Party.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Sad.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Sheep.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Sick.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Stickingouttongue.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Winky.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Yeah.att Removed: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticAgressif.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticBisou.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticChat.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticChien.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticConfus.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticDecu.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticEmbarasse.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticEndormi.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticRire.att Modified: software_suite_v3/software/plugin/plugin-msn/trunk/executables/EmoticonsToAttitunes.py Log: * updated attitunes Modified: software_suite_v3/software/plugin/plugin-msn/trunk/executables/EmoticonsToAttitunes.py =================================================================== --- software_suite_v3/software/plugin/plugin-msn/trunk/executables/EmoticonsToAttitunes.py 2009-06-15 12:28:40 UTC (rev 4817) +++ software_suite_v3/software/plugin/plugin-msn/trunk/executables/EmoticonsToAttitunes.py 2009-06-15 14:56:42 UTC (rev 4818) @@ -4,38 +4,65 @@ # http://www.gnu.org/copyleft/gpl.html EMOTICONS_TO_ATTITUNES = { - ':d' : "EmoticRire", - 'lol' : "EmoticRire", - 'mdr' : "EmoticRire", - #';)' : "", - #'(h)' : "", - ':@' : "EmoticAgressif", - ':s' : "EmoticConfus", - ':$' : "EmoticEmbarassé", - #":'(" : "", - #'(a)' : "", - '8o|' : "EmoticAgressif", - #'8-|' : "", - #'+o(' : "", - #'<:o)' : "", - '|-)' : "EmoticEndormi", + ':d' : "Laughing", + ':-d' : "Laughing", + '=d' : "Laughing", + 'lol' : "Laughing2", + 'mdr' : "Laughingwild", + ':(' : "Sad", + ':-(' : "Sad", + ':p' : "Stickingouttongue", + ':-p' : "Stickingouttongue", + '=p' : "Stickingouttongue", + ';)' : "Winky", + ';-)' : "Winky", + ':o' : "Gasp", + ':-o' : "Gasp", + '(h)' : "Yeah", + 'b-)' : "Yeah", + '8-)' : "Yeah", + ':@' : "Angry", + ':-@' : "Angry", + 'x(' : "Angry", + 'x-(' : "Angry", + ':s' : "Confused", + ':-s' : "Confused", + 'o_o' : "Confused", + 'o.o' : "Confused", + #':$' : "", + ":'(" : "Crying", + ":'-(" : "Crying", + '(a)' : "Angel", + '0:-)' : "Angel", + '0:)' : "Angel", + '0=)' : "Angel", + '8o|' : "Angry", + '8-|' : "Disappointed", + ':-|' : "Disappointed", + ':|' : "Disappointed", + '+o(' : "Sick", + '<:o)' : "Party", + '|-)' : "Asleep", #':-#' : "", - #':-*' : "", + ':-*' : "Kiss", #'8-)' : "", - '(l)' : "EmoticBisou", + '(l)' : "Kiss", #'(u)' : "", - '(@)' : "EmoticChat", - '(&)' : "EmoticChien", + '(@)' : "Cat", + '(&)' : "Dog", + '(bah)' : "Sheep", #'(sn)' : "", #'(s)' : "", #'(*)' : "", #'(#)' : "", - '(k)' : "EmoticBisou", + '(k)' : "Kiss", #'(r)' : "", #'(})' : "", #'({)' : "", - '(6)' : "EmoticAgressif", - #'(o)' : "", - '(f)' : "EmoticBisou", - ':|' : "EmoticDéçu", + '(6)' : "Laughingevil", + '>:)' : "Laughingevil", + '>:-)' : "Laughingevil", + '(o)' : "Clock", + '(f)' : "Kiss", + ':|' : "Disappointed", } Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Angel.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Angel.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Angry.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Angry.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Asleep.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Asleep.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Cat.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Cat.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Clock.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Clock.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Confused.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Confused.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Crying.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Crying.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Disappointed.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Disappointed.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Dog.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Dog.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Deleted: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticAgressif.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticBisou.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticChat.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticChien.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticConfus.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticDecu.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticEmbarasse.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticEndormi.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticRire.att =================================================================== (Binary files differ) Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Gasp.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Gasp.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Kiss.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Kiss.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Laughing.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Laughing.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Laughing2.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Laughing2.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Laughingevil.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Laughingevil.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Laughingwild.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Laughingwild.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Party.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Party.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Sad.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Sad.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Sheep.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Sheep.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Sick.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Sick.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Stickingouttongue.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Stickingouttongue.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Winky.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Winky.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Yeah.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/Yeah.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream |
|
From: remi <c2m...@c2...> - 2009-06-15 12:56:51
|
Author: remi Date: 2009-06-15 14:28:40 +0200 (Mon, 15 Jun 2009) New Revision: 4817 Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh01.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh02.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh03.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh04.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh05.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh06.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh07.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh08.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh09.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh10.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh11.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh12.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh13.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh14.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh15.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh16.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh17.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh18.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh19.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh20.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh21.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh22.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh23.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh24.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh25.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh26.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh27.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh28.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh29.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh30.att Removed: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior01.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior02.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior03.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior04.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior05.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior06.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior07.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior08.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior09.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior10.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior11.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior12.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior13.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior14.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior15.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior16.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior17.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior18.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior19.att software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior20.att Modified: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/executables/plugin-senseofhumor.py Log: * updated attitunes Modified: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/executables/plugin-senseofhumor.py =================================================================== --- software_suite_v3/software/plugin/plugin-senseofhumor/trunk/executables/plugin-senseofhumor.py 2009-06-15 10:39:13 UTC (rev 4816) +++ software_suite_v3/software/plugin/plugin-senseofhumor/trunk/executables/plugin-senseofhumor.py 2009-06-15 12:28:40 UTC (rev 4817) @@ -23,26 +23,37 @@ from util.SimplePlugin.SimplePlugin import SimplePlugin ATTIUNE_NAMES_LIST = [ - "Idle behavior 01", - "Idle behavior 02", - "Idle behavior 03", - "Idle behavior 04", - "Idle behavior 05", - "Idle behavior 06", - "Idle behavior 08", - "Idle behavior 09", - "Idle behavior 10", - "Idle behavior 11", - "Idle behavior 12", - "Idle behavior 13", - "Idle behavior 14", - "Idle behavior 15", - "Idle behavior 16", - "Idle behavior 17", - "Idle behavior 18", - "Idle behavior 19", - "Idle behavior 20", -] # TODO : Attitune number 07 is wrong (have the same name than the 06) + "soh01", + "soh02", + "soh03", + "soh04", + "soh05", + "soh06", + "soh7", + "soh08", + "soh09", + "soh10", + "soh11", + "soh12", + "soh13", + "soh14", + "soh15", + "soh16", + "soh17", + "soh18", + "soh19", + "soh20", + "soh21", + "soh22", + "soh23", + "soh24", + "soh25", + "soh26", + "soh27", + "soh28", + "soh29", + "soh30", +] B_DELAY_RARELY = 2000 B_DELAY_NORMAL = 500 Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior01.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior02.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior03.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior04.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior05.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior06.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior07.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior08.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior09.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior10.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior11.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior12.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior13.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior14.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior15.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior16.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior17.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior18.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior19.att =================================================================== (Binary files differ) Deleted: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/idleBehavior20.att =================================================================== (Binary files differ) Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh01.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh01.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh02.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh02.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh03.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh03.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh04.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh04.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh05.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh05.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh06.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh06.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh07.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh07.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh08.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh08.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh09.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh09.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh10.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh10.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh11.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh11.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh12.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh12.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh13.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh13.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh14.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh14.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh15.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh15.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh16.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh16.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh17.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh17.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh18.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh18.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh19.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh19.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh20.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh20.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh21.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh21.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh22.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh22.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh23.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh23.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh24.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh24.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh25.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh25.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh26.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh26.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh27.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh27.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh28.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh28.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh29.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh29.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh30.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-senseofhumor/trunk/resources/attitunes/soh30.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream |
|
From: remi <c2m...@c2...> - 2009-06-15 10:39:23
|
Author: remi
Date: 2009-06-15 12:39:13 +0200 (Mon, 15 Jun 2009)
New Revision: 4816
Modified:
software_suite_v3/smart-core/smart-server/trunk/util/player/mplayer/Mplayer.py
Log:
* removed an unneeded command
Modified: software_suite_v3/smart-core/smart-server/trunk/util/player/mplayer/Mplayer.py
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/util/player/mplayer/Mplayer.py 2009-06-15 10:24:13 UTC (rev 4815)
+++ software_suite_v3/smart-core/smart-server/trunk/util/player/mplayer/Mplayer.py 2009-06-15 10:39:13 UTC (rev 4816)
@@ -68,7 +68,6 @@
win32api.TerminateProcess(int(self.__process._handle), -1)
except:
pass
- os.system("taskkill /im mplayer.exe /f")
else:
os.system("kill -9 " + str(self.__process.pid))
self.__setRun(False)
|
|
From: remi <c2m...@c2...> - 2009-06-15 10:27:06
|
Author: remi
Date: 2009-06-15 12:24:13 +0200 (Mon, 15 Jun 2009)
New Revision: 4815
Modified:
software_suite_v3/software/plugin/plugin-weather/trunk/plugin-weather/resources/plugin.xml
Log:
* cleaning of alerts
Modified: software_suite_v3/software/plugin/plugin-weather/trunk/plugin-weather/resources/plugin.xml
===================================================================
--- software_suite_v3/software/plugin/plugin-weather/trunk/plugin-weather/resources/plugin.xml 2009-06-15 10:20:40 UTC (rev 4814)
+++ software_suite_v3/software/plugin/plugin-weather/trunk/plugin-weather/resources/plugin.xml 2009-06-15 10:24:13 UTC (rev 4815)
@@ -45,24 +45,6 @@
description="Check the weather" />
</commands>
<tasks>
- <task
- name="Start every x"
- description="Start me every x"
- command="run"
- type="every x"
- activated="false"
-
- weekMask="true,true,true,true,true,true,true"
- weekMaskType="flat"
- weekMaskVisible="true"
-
- date="0000/00/00"
- dateVisible="false"
-
- delay="00:01:00"
- delayMask="true,true,true"
- delayVisible="true"
- />
<task
name="Start every x from full hour"
description="Start me every x (From full hour)"
@@ -72,13 +54,21 @@
weekMask="true,true,true,true,true,true,true"
weekMaskType="flat"
- weekMaskVisible="true"
+ weekMaskVisible="false"
date="0000/00/00"
dateVisible="false"
- delay="00:01:00"
- delayMask="true,true,true"
+ hoursBegin="00:00:00"
+ hoursBeginMask="true,true,true"
+ hoursBeginVisible="false"
+
+ hoursEnd="23:59:00"
+ hoursEndMask="true,true,true"
+ hoursEndVisible="false"
+
+ delay="00:15:00"
+ delayMask="true,true,false"
delayVisible="true"
/>
<task
@@ -89,19 +79,12 @@
activated="false"
weekMask="true,true,true,true,true,true,true"
- weekMaskType="flat"
+ weekMaskType="weekpart"
weekMaskVisible="true"
- date="0000/00/00"
- dateVisible="false"
-
- hoursBegin="00:00:00"
- hoursBeginMask="true,true,true"
+ hoursBegin="07:00:00"
+ hoursBeginMask="true,true,false"
hoursBeginVisible="true"
-
- delay="00:01:00"
- delayMask="true,true,true"
- delayVisible="false"
/>
</tasks>
</gadget>
|
|
From: remi <c2m...@c2...> - 2009-06-15 10:21:13
|
Author: remi
Date: 2009-06-15 12:20:40 +0200 (Mon, 15 Jun 2009)
New Revision: 4814
Modified:
software_suite_v3/software/plugin/plugin-feed/trunk/plugin-feed/resources/plugin.xml
Log:
* cleaning of alerts
Modified: software_suite_v3/software/plugin/plugin-feed/trunk/plugin-feed/resources/plugin.xml
===================================================================
--- software_suite_v3/software/plugin/plugin-feed/trunk/plugin-feed/resources/plugin.xml 2009-06-15 10:14:52 UTC (rev 4813)
+++ software_suite_v3/software/plugin/plugin-feed/trunk/plugin-feed/resources/plugin.xml 2009-06-15 10:20:40 UTC (rev 4814)
@@ -50,7 +50,7 @@
description="Check the feed" />
</commands>
<tasks>
- <task
+ <task
name="Start every x"
description="Start me every x"
command="check"
@@ -58,12 +58,38 @@
activated="false"
weekMask="true,true,true,true,true,true,true"
- weekMaskType="flat"
+ weekMaskType="weekpart"
weekMaskVisible="true"
delay="00:01:00"
delayMask="true,true,true"
+ delayVisible="false"
+ />
+ <task
+ name="Start every x from full hour"
+ description="Start me every x (From full hour)"
+ command="run"
+ type="every x from full hour"
+ activated="false"
+
+ weekMask="true,true,true,true,true,true,true"
+ weekMaskType="weekpart"
+ weekMaskVisible="true"
+
+ date="0000/00/00"
+ dateVisible="false"
+
+ hoursBegin="00:00:00"
+ hoursBeginMask="true,true,true"
+ hoursBeginVisible="false"
+
+ hoursEnd="23:59:00"
+ hoursEndMask="true,true,true"
+ hoursEndVisible="false"
+
+ delay="00:15:00"
+ delayMask="true,true,false"
delayVisible="true"
- />
+ />
</tasks>
</plugin>
|
|
From: remi <c2m...@c2...> - 2009-06-15 10:15:16
|
Author: remi
Date: 2009-06-15 12:14:52 +0200 (Mon, 15 Jun 2009)
New Revision: 4813
Modified:
software_suite_v3/software/plugin/plugin-clock/trunk/resources/plugin.xml
Log:
* cleaning of alerts
Modified: software_suite_v3/software/plugin/plugin-clock/trunk/resources/plugin.xml
===================================================================
--- software_suite_v3/software/plugin/plugin-clock/trunk/resources/plugin.xml 2009-06-14 20:13:42 UTC (rev 4812)
+++ software_suite_v3/software/plugin/plugin-clock/trunk/resources/plugin.xml 2009-06-15 10:14:52 UTC (rev 4813)
@@ -23,32 +23,6 @@
</commands>
<tasks>
<task
- name="Start every x"
- description="Start me every x"
- command="run"
- type="every x"
- activated="false"
-
- weekMask="true,true,true,true,true,true,true"
- weekMaskType="flat"
- weekMaskVisible="true"
-
- date="0000/00/00"
- dateVisible="false"
-
- hoursBegin="00:00:00"
- hoursBeginMask="true,true,true"
- hoursBeginVisible="true"
-
- hoursEnd="23:59:00"
- hoursEndMask="true,true,true"
- hoursEndVisible="true"
-
- delay="00:01:00"
- delayMask="true,true,true"
- delayVisible="true"
- />
- <task
name="Start every x from full hour"
description="Start me every x (From full hour)"
command="run"
@@ -57,86 +31,8 @@
weekMask="true,true,true,true,true,true,true"
weekMaskType="flat"
- weekMaskVisible="true"
-
- date="0000/00/00"
- dateVisible="false"
-
- hoursBegin="00:00:00"
- hoursBeginMask="true,true,true"
- hoursBeginVisible="true"
-
- hoursEnd="23:59:00"
- hoursEndMask="true,true,true"
- hoursEndVisible="true"
-
- delay="00:01:00"
- delayMask="true,true,true"
- delayVisible="true"
- />
- <task
- name="Start daily at"
- description="Start me daily"
- command="run"
- type="daily at"
- activated="false"
-
- weekMask="true,true,true,true,true,true,true"
- weekMaskType="flat"
- weekMaskVisible="true"
-
- date="0000/00/00"
- dateVisible="false"
-
- hoursBegin="00:00:00"
- hoursBeginMask="true,true,true"
- hoursBeginVisible="true"
-
- hoursEnd="23:59:00"
- hoursEndMask="true,true,true"
- hoursEndVisible="true"
-
- delay="00:01:00"
- delayMask="true,true,true"
- delayVisible="false"
- />
- <task
- name="Start once at"
- description="Start me once time"
- command="run"
- type="once at"
- activated="false"
-
- weekMask="true,true,true,true,true,true,true"
- weekMaskType="flat"
weekMaskVisible="false"
- date="2009/01/01"
- dateVisible="true"
-
- hoursBegin="00:00:00"
- hoursBeginMask="true,true,true"
- hoursBeginVisible="true"
-
- hoursEnd="23:59:00"
- hoursEndMask="true,true,true"
- hoursEndVisible="false"
-
- delay="00:01:00"
- delayMask="true,true,true"
- delayVisible="false"
- />
- <task
- name="Start once delayed"
- description="Start once time with delay (Timeout)"
- command="run"
- type="once delayed"
- activated="false"
-
- weekMask="true,true,true,true,true,true,true"
- weekMaskType="flat"
- weekMaskVisible="false"
-
date="0000/00/00"
dateVisible="false"
@@ -148,8 +44,8 @@
hoursEndMask="true,true,true"
hoursEndVisible="false"
- delay="00:01:00"
- delayMask="true,true,true"
+ delay="00:15:00"
+ delayMask="true,true,false"
delayVisible="true"
/>
</tasks>
|
|
From: remi <c2m...@c2...> - 2009-06-14 20:13:51
|
Author: remi
Date: 2009-06-14 22:13:42 +0200 (Sun, 14 Jun 2009)
New Revision: 4812
Modified:
software_suite_v3/smart-core/smart-server/trunk/resources/04_robot_content_interactions/00_resourceRobotContentInteractions.py
Log:
* improved stability of the gadget start/stop (for the chiness crash test ;) )
Modified: software_suite_v3/smart-core/smart-server/trunk/resources/04_robot_content_interactions/00_resourceRobotContentInteractions.py
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/resources/04_robot_content_interactions/00_resourceRobotContentInteractions.py 2009-06-14 20:08:01 UTC (rev 4811)
+++ software_suite_v3/smart-core/smart-server/trunk/resources/04_robot_content_interactions/00_resourceRobotContentInteractions.py 2009-06-14 20:13:42 UTC (rev 4812)
@@ -178,6 +178,9 @@
self.__startStopPauseMutex.acquire()
self.__execStarted = False
self.__execPaused = False
+ self.__eventStackMutex.acquire()
+ self.__eventStack = []
+ self.__eventStackMutex.release()
self.__startStopPauseMutex.release()
self.__breakAttitune()
self.__breakMessage()
@@ -225,7 +228,6 @@
self.__startStopPauseMutex.release()
return result
-
def __executeAttitune(self, attituneName):
"""
"""
@@ -239,19 +241,29 @@
def __executeMessage(self, text, locutor, pitch):
"""
"""
+ if not self.executionIsStarted():
+ return
resourceTuxDriver.openMouth()
+ if not self.executionIsStarted():
+ resourceTuxDriver.closeMouth()
+ return
resourceTuxOSL.ttsSpeak(text, locutor, pitch)
+ if not self.executionIsStarted():
+ resourceTuxDriver.closeMouth()
+ return
if not eventsHandler.waitCondition(ST_NAME_TTS_SOUND_STATE, ("ON",
None), 3.0):
return
- eventsHandler.waitCondition(ST_NAME_TTS_SOUND_STATE, ("OFF", None),
- 600.0)
+ if self.executionIsStarted():
+ eventsHandler.waitCondition(ST_NAME_TTS_SOUND_STATE, ("OFF", None),
+ 600.0)
resourceTuxDriver.closeMouth()
def __breakMessage(self):
"""
"""
resourceTuxOSL.ttsStop()
+ eventsHandler.emit(ST_NAME_TTS_SOUND_STATE, ("OFF", 0.0))
def __executeActuation(self, actuationName, arguments):
"""
@@ -312,6 +324,8 @@
print " ", nextEvent['type']
print " ", nextEvent['arguments']
arguments = nextEvent['arguments']
+ if not self.executionIsStarted():
+ continue
if nextEvent['type'] == PGU_EVENT_TYPE_MESSAGE:
self.__executeMessage(arguments['message'],
arguments['locutor'], arguments['pitch'])
@@ -341,6 +355,8 @@
self.__loopThread = None
self.__onDemandList = []
self.__onDemandIndex = 0
+ self.__lastRunStopActionTime = time.time()
+ self.__lastRunStopActionTimeMutex = threading.Lock()
def insertOnDemand(self, ugc):
"""
@@ -550,11 +566,12 @@
self.__backgroundPguContext = pguContext
self.__bfPguContextMutex.release()
- def getPguContext(self, pluginInterpreterContext):
+ def getPguContext(self, pluginInterpreterContext, noMutex = False):
"""
"""
result = None
- self.__pguContextsMutex.acquire()
+ if not noMutex:
+ self.__pguContextsMutex.acquire()
for pguContext in self.__pguContexts:
if pguContext.getPluginInterpreterContext() == pluginInterpreterContext:
result = pguContext
@@ -567,7 +584,8 @@
if self.getBackgroundPguContext() != None:
if self.getBackgroundPguContext().getPluginInterpreterContext() == pluginInterpreterContext:
result = self.getBackgroundPguContext()
- self.__pguContextsMutex.release()
+ if not noMutex:
+ self.__pguContextsMutex.release()
return result
# ==========================================================================
@@ -577,52 +595,90 @@
def insertMessage(self, pluginInterpreterContext, message, locutor, pitch):
"""
"""
- pguContext = self.getPguContext(pluginInterpreterContext)
+ self.__pguContextsMutex.acquire()
+ pguContext = self.getPguContext(pluginInterpreterContext, True)
if pguContext != None:
pguContext.insertMessage(message, locutor, pitch)
+ self.__pguContextsMutex.release()
def insertActuation(self, pluginInterpreterContext, actuationName,
arguments = []):
"""
"""
- pguContext = self.getPguContext(pluginInterpreterContext)
+ self.__pguContextsMutex.acquire()
+ pguContext = self.getPguContext(pluginInterpreterContext, True)
if pguContext != None:
pguContext.insertActuation(actuationName, arguments)
+ self.__pguContextsMutex.release()
def insertAttitune(self, pluginInterpreterContext, attituneName):
"""
"""
- pguContext = self.getPguContext(pluginInterpreterContext)
+ self.__pguContextsMutex.acquire()
+ pguContext = self.getPguContext(pluginInterpreterContext, True)
if pguContext != None:
pguContext.insertAttitune(attituneName)
+ self.__pguContextsMutex.release()
def setContextIsComplete(self, pluginInterpreterContext):
"""
"""
- pguContext = self.getPguContext(pluginInterpreterContext)
+ self.__pguContextsMutex.acquire()
+ pguContext = self.getPguContext(pluginInterpreterContext, True)
if pguContext != None:
pguContext.setContextIsComplete()
+ self.__pguContextsMutex.release()
# ==========================================================================
# Remote and robot button events
# ==========================================================================
+ def __setLastRunStopActionTime(self):
+ """
+ """
+ self.__lastRunStopActionTimeMutex.acquire()
+ self.__lastRunStopActionTime = time.time()
+ self.__lastRunStopActionTimeMutex.release()
+
+ def __getLastRunStopActionTime(self):
+ """
+ """
+ self.__lastRunStopActionTimeMutex.acquire()
+ result = self.__lastRunStopActionTime
+ self.__lastRunStopActionTimeMutex.release()
+ return result
+
+ def __checkLastRunStopActionTime(self):
+ """
+ """
+ print time.time() - self.__getLastRunStopActionTime()
+ if (time.time() - self.__getLastRunStopActionTime()) >= 1.5:
+ self.__setLastRunStopActionTime()
+ return True
+ else:
+ return False
+
def __contextBtRunAbort(self):
"""
"""
# Abort foreground context if exists
if self.getForegroundPguContext() != None:
if self.getForegroundPguContext().executionIsStarted():
+ if not self.__checkLastRunStopActionTime():
+ return
self.getForegroundPguContext().stopExecution()
return
# Else abort background context if exists
if self.getBackgroundPguContext() != None:
if self.getBackgroundPguContext().executionIsStarted():
+ if not self.__checkLastRunStopActionTime():
+ return
self.getBackgroundPguContext().stopExecution()
return
# Else load current selected on demand gadget
if len(self.__onDemandList) > 0:
ugc = self.__onDemandList[self.__onDemandIndex]
+ self.__setLastRunStopActionTime()
ugc.start(ugc.getDefaultRunCommandName())
def __contextLTPrevious(self, eventName, *args):
|
|
From: remi <c2m...@c2...> - 2009-06-14 20:08:08
|
Author: remi
Date: 2009-06-14 22:08:01 +0200 (Sun, 14 Jun 2009)
New Revision: 4811
Modified:
software_suite_v3/smart-core/smart-server/trunk/TDSResourcesManager.py
Log:
* reversed the order of the resources stopping
Modified: software_suite_v3/smart-core/smart-server/trunk/TDSResourcesManager.py
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/TDSResourcesManager.py 2009-06-14 19:17:53 UTC (rev 4810)
+++ software_suite_v3/smart-core/smart-server/trunk/TDSResourcesManager.py 2009-06-14 20:08:01 UTC (rev 4811)
@@ -534,10 +534,11 @@
#
# --------------------------------------------------------------------------
def stop(self):
+ self.__resourcesList.reverse()
for regResource in self.__resourcesList:
- self.__logger.logInfo("Start resource [%s]" % regResource[0])
+ self.__logger.logInfo("Stop resource [%s]" % regResource[0])
regResource[1]._doStop()
- self.__logger.logInfo("Resource started [%s]" % regResource[0])
+ self.__logger.logInfo("Resource stopped [%s]" % regResource[0])
# --------------------------------------------------------------------------
#
|
|
From: remi <c2m...@c2...> - 2009-06-14 19:18:02
|
Author: remi
Date: 2009-06-14 21:17:53 +0200 (Sun, 14 Jun 2009)
New Revision: 4810
Modified:
software_suite_v3/smart-core/smart-server/trunk/util/player/mplayer/Mplayer.py
Log:
* force to kill mplayer instances on Windows
Modified: software_suite_v3/smart-core/smart-server/trunk/util/player/mplayer/Mplayer.py
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/util/player/mplayer/Mplayer.py 2009-06-14 18:08:47 UTC (rev 4809)
+++ software_suite_v3/smart-core/smart-server/trunk/util/player/mplayer/Mplayer.py 2009-06-14 19:17:53 UTC (rev 4810)
@@ -68,6 +68,7 @@
win32api.TerminateProcess(int(self.__process._handle), -1)
except:
pass
+ os.system("taskkill /im mplayer.exe /f")
else:
os.system("kill -9 " + str(self.__process.pid))
self.__setRun(False)
|
|
From: remi <c2m...@c2...> - 2009-06-14 18:08:53
|
Author: remi
Date: 2009-06-14 20:08:47 +0200 (Sun, 14 Jun 2009)
New Revision: 4809
Modified:
software_suite_v3/software/plugin/plugin-msn/trunk/executables/plugin-msn.py
Log:
* convert message to lowercase before to search imoticons inside
Modified: software_suite_v3/software/plugin/plugin-msn/trunk/executables/plugin-msn.py
===================================================================
--- software_suite_v3/software/plugin/plugin-msn/trunk/executables/plugin-msn.py 2009-06-14 18:07:14 UTC (rev 4808)
+++ software_suite_v3/software/plugin/plugin-msn/trunk/executables/plugin-msn.py 2009-06-14 18:08:47 UTC (rev 4809)
@@ -88,7 +88,7 @@
return
# Search for emoticon
for emoticon in EMOTICONS_TO_ATTITUNES.keys():
- if message.find(emoticon) != -1:
+ if message.lower().find(emoticon) != -1:
self.throwNotification("start")
self.throwActuation("playAttitune",
EMOTICONS_TO_ATTITUNES[emoticon])
|
|
From: remi <c2m...@c2...> - 2009-06-14 18:07:22
|
Author: remi Date: 2009-06-14 20:07:14 +0200 (Sun, 14 Jun 2009) New Revision: 4808 Modified: software_suite_v3/software/plugin/plugin-msn/trunk/executables/SCMSN.exe Log: * fixed bug with some utf-8 chars Modified: software_suite_v3/software/plugin/plugin-msn/trunk/executables/SCMSN.exe =================================================================== (Binary files differ) |
|
From: remi <c2m...@c2...> - 2009-06-13 14:57:42
|
Author: remi Date: 2009-06-13 16:57:29 +0200 (Sat, 13 Jun 2009) New Revision: 4807 Added: software_suite_v3/software/plugin/plugin-msn/ software_suite_v3/software/plugin/plugin-msn/branches/ software_suite_v3/software/plugin/plugin-msn/tags/ software_suite_v3/software/plugin/plugin-msn/trunk/ software_suite_v3/software/plugin/plugin-msn/trunk/LICENSE software_suite_v3/software/plugin/plugin-msn/trunk/build.py software_suite_v3/software/plugin/plugin-msn/trunk/builder/ software_suite_v3/software/plugin/plugin-msn/trunk/builder/PluginPackager.py software_suite_v3/software/plugin/plugin-msn/trunk/builder/__init__.py software_suite_v3/software/plugin/plugin-msn/trunk/builder/util/ software_suite_v3/software/plugin/plugin-msn/trunk/builder/util/__init__.py software_suite_v3/software/plugin/plugin-msn/trunk/builder/util/misc/ software_suite_v3/software/plugin/plugin-msn/trunk/builder/util/misc/DirectoriesAndFilesTools.py software_suite_v3/software/plugin/plugin-msn/trunk/builder/util/misc/__init__.py software_suite_v3/software/plugin/plugin-msn/trunk/builder/util/misc/version.py software_suite_v3/software/plugin/plugin-msn/trunk/builder/version.py software_suite_v3/software/plugin/plugin-msn/trunk/executables/ software_suite_v3/software/plugin/plugin-msn/trunk/executables/EmoticonsToAttitunes.py software_suite_v3/software/plugin/plugin-msn/trunk/executables/SCMSN.exe software_suite_v3/software/plugin/plugin-msn/trunk/executables/SCMSN.py software_suite_v3/software/plugin/plugin-msn/trunk/executables/plugin-msn.py software_suite_v3/software/plugin/plugin-msn/trunk/resources/ software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/ software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticAgressif.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticBisou.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticChat.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticChien.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticConfus.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticDecu.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticEmbarasse.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticEndormi.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticRire.att software_suite_v3/software/plugin/plugin-msn/trunk/resources/fr.po software_suite_v3/software/plugin/plugin-msn/trunk/resources/help.wiki software_suite_v3/software/plugin/plugin-msn/trunk/resources/icon.png software_suite_v3/software/plugin/plugin-msn/trunk/resources/plugin.pot software_suite_v3/software/plugin/plugin-msn/trunk/resources/plugin.xml Log: * added "MSN plugin" project Added: software_suite_v3/software/plugin/plugin-msn/trunk/LICENSE =================================================================== --- software_suite_v3/software/plugin/plugin-msn/trunk/LICENSE (rev 0) +++ software_suite_v3/software/plugin/plugin-msn/trunk/LICENSE 2009-06-13 14:57:29 UTC (rev 4807) @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. Added: software_suite_v3/software/plugin/plugin-msn/trunk/build.py =================================================================== --- software_suite_v3/software/plugin/plugin-msn/trunk/build.py (rev 0) +++ software_suite_v3/software/plugin/plugin-msn/trunk/build.py 2009-06-13 14:57:29 UTC (rev 4807) @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- + +# Copyleft (C) 2009 C2ME Sa +# Remi Jocaille <rem...@c2...> +# Distributed under the terms of the GNU General Public License +# http://www.gnu.org/copyleft/gpl.html + +from builder.PluginPackager import PluginPackager + +if __name__ == "__main__": + PluginPackager().createScp("plugin-msn.scp") Added: software_suite_v3/software/plugin/plugin-msn/trunk/builder/PluginPackager.py =================================================================== --- software_suite_v3/software/plugin/plugin-msn/trunk/builder/PluginPackager.py (rev 0) +++ software_suite_v3/software/plugin/plugin-msn/trunk/builder/PluginPackager.py 2009-06-13 14:57:29 UTC (rev 4807) @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- + +import version +__author__ = version.author +__date__ = version.date +__version__ = version.version +__licence__ = version.licence +del version + +# Copyleft (C) 2009 C2ME Sa +# Remi Jocaille <rem...@c2...> +# Distributed under the terms of the GNU General Public License +# http://www.gnu.org/copyleft/gpl.html + +import os +from zipfile import * + +from util.misc.DirectoriesAndFilesTools import * + +# ------------------------------------------------------------------------------ +# Class to create a SCP file from the main directory of a python plugin project. +# ------------------------------------------------------------------------------ +class PluginPackager(object): + """Class to create a SCP file from the main directory of a python plugin + project. + """ + + # -------------------------------------------------------------------------- + # Create a scp file. + # -------------------------------------------------------------------------- + def createScp(self, scpFileName): + """Create a scp file. + @param scpFileName: Smart-Core Plugin file name. + @return: The success of the file creation. + """ + self.__sourcePath = os.path.realpath("") + if not os.path.isdir(self.__sourcePath): + return False + if not os.path.isdir(os.path.join(self.__sourcePath, "executables")): + return False + if not os.path.isdir(os.path.join(self.__sourcePath, "resources")): + return False + # Get some paths + SRC_EXECUTABLES_PATH = os.path.join(self.__sourcePath, "executables") + SRC_RESOURCES_PATH = os.path.join(self.__sourcePath, "resources") + TMP_BUILD_PATH = os.path.join(self.__sourcePath, "tmp") + DEST_EXECUTABLES_PATH = os.path.join(TMP_BUILD_PATH, "executables") + DEST_RESOURCES_PATH = os.path.join(TMP_BUILD_PATH, "resources") + DEST_SCP_FILENAME = os.path.join(self.__sourcePath, scpFileName) + # Create the temporary build path + MKDirsF(TMP_BUILD_PATH) + # Copy "executables" directory + CPDir(SRC_EXECUTABLES_PATH, DEST_EXECUTABLES_PATH) + # Copy "resources" directory + CPDir(SRC_RESOURCES_PATH, DEST_RESOURCES_PATH) + # Filtering the content of temporary path + RMWithFilters(TMP_BUILD_PATH, filters = ['.svn', '.pyc']) + # Create a zip file + directory = TMP_BUILD_PATH + last_cwd = os.getcwd() + os.chdir(TMP_BUILD_PATH) + zf = ZipFile(DEST_SCP_FILENAME, 'w', compression = ZIP_DEFLATED) + def walker(zip, directory, files, root = directory): + for file in files: + file = os.path.join(directory, file) + name = file[len(TMP_BUILD_PATH) + 1:] + if os.path.isfile(file): + zip.write(file, name, ZIP_DEFLATED) + elif os.path.isdir(file): + file = os.path.join(file, "") + name = os.path.join(name, "") + zip.writestr(name, name) + os.path.walk(TMP_BUILD_PATH, walker, zf) + zf.close() + os.chdir(os.path.abspath(last_cwd)) + # Remove the temporary directory + RMDirs(TMP_BUILD_PATH) + return True Added: software_suite_v3/software/plugin/plugin-msn/trunk/builder/__init__.py =================================================================== Added: software_suite_v3/software/plugin/plugin-msn/trunk/builder/util/__init__.py =================================================================== Added: software_suite_v3/software/plugin/plugin-msn/trunk/builder/util/misc/DirectoriesAndFilesTools.py =================================================================== --- software_suite_v3/software/plugin/plugin-msn/trunk/builder/util/misc/DirectoriesAndFilesTools.py (rev 0) +++ software_suite_v3/software/plugin/plugin-msn/trunk/builder/util/misc/DirectoriesAndFilesTools.py 2009-06-13 14:57:29 UTC (rev 4807) @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- + +import version +__author__ = version.author +__date__ = version.date +__version__ = version.version +__licence__ = version.licence +del version + +# Copyleft (C) 2008 Acness World +# Remi Jocaille <rem...@c2...> +# Distributed under the terms of the GNU General Public License +# http://www.gnu.org/copyleft/gpl.html + +import os +import shutil + +if os.name == 'nt': + import win32con + import win32file + +# ============================================================================== +# Public functions +# ============================================================================== + +# ------------------------------------------------------------------------------ +# Force to create a directories tree if not exists. +# ------------------------------------------------------------------------------ +def MKDirs(path): + """Force to create a directories tree if not exists. + @param path: Directory path. + """ + if not os.path.isdir(path): + try: + os.makedirs(path) + except: + pass + +# ------------------------------------------------------------------------------ +# Force to create a directories tree after having deleted the old one. +# ------------------------------------------------------------------------------ +def MKDirsF(path): + """Force to create a directories tree after having deleted the old one. + @param path: Directory path. + """ + if os.path.isdir(path): + RMDirs(path) + os.makedirs(path) + +# ------------------------------------------------------------------------------ +# Remove directories and files recursively. +# ------------------------------------------------------------------------------ +def RMDirs(path): + """Remove directories and files recursively. + @param path: Path of the base directory. + """ + if not os.path.isdir(path): + return + for root, dirs, files in os.walk(path, topdown = False): + for d in dirs: + try: + os.removedirs(os.path.join(root, d)) + except: + pass + for f in files: + try: + if os.name == 'nt': + win32file.SetFileAttributesW(os.path.join(root, f), + win32con.FILE_ATTRIBUTE_NORMAL) + os.remove(os.path.join(root, f)) + except: + pass + if os.path.isdir(path): + try: + os.removedirs(path) + except: + pass + +# ------------------------------------------------------------------------------ +# Remove directories and files recursively with filters. +# ------------------------------------------------------------------------------ +def RMWithFilters(path, filters = ['.pyc', '.pyo']): + """Remove directories and files recursively with filters. + @param path: Path of the base directory. + @param filters: Filters as list. + """ + def checkFilter(name): + for filter in filters: + if name.lower().find(filter.lower()) == (len(name) - len(filter)): + return True + return False + + if not os.path.isdir(path): + return + + for root, dirs, files in os.walk(path, topdown = False): + for d in dirs: + if checkFilter(os.path.join(root, d)): + try: + RMDirs(os.path.join(root, d)) + except: + pass + for f in files: + if checkFilter(os.path.join(root, f)): + try: + if os.name == 'nt': + win32file.SetFileAttributesW(os.path.join(root, f), + win32con.FILE_ATTRIBUTE_NORMAL) + os.remove(os.path.join(root, f)) + except: + pass + +# ------------------------------------------------------------------------------ +# Remove a file. +# ------------------------------------------------------------------------------ +def RMFile(path): + """Remove a file. + @param path: File path. + """ + if os.path.isfile(path): + try: + if os.name == 'nt': + win32file.SetFileAttributesW(path, + win32con.FILE_ATTRIBUTE_NORMAL) + os.remove(path) + except: + pass + +# ------------------------------------------------------------------------------ +# Copy a directories tree to another directory. +# ------------------------------------------------------------------------------ +def CPDir(src, dest): + """Copy a directories tree to another directory. + @param src: Source path. + @param dest: Destination path. + """ + if not os.path.isdir(src): + return + if os.path.isdir(dest): + RMDirs(dest) + shutil.copytree(src, dest) + +# ------------------------------------------------------------------------------ +# Retrieve the OS temporary directory. +# ------------------------------------------------------------------------------ +def GetOSTMPDir(): + """Retrieve the OS temporary directory. + @return: The OS temporary directory. + """ + result = None + # On Windows + if os.name == 'nt': + result = os.environ.get('tmp') + if result == None: + result = os.environ.get('temp') + if result == None: + result = "c:\\windows\\temp" + # On linux + else: + result = "/tmp" + return result Added: software_suite_v3/software/plugin/plugin-msn/trunk/builder/util/misc/__init__.py =================================================================== Added: software_suite_v3/software/plugin/plugin-msn/trunk/builder/util/misc/version.py =================================================================== --- software_suite_v3/software/plugin/plugin-msn/trunk/builder/util/misc/version.py (rev 0) +++ software_suite_v3/software/plugin/plugin-msn/trunk/builder/util/misc/version.py 2009-06-13 14:57:29 UTC (rev 4807) @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +"""Version data for tuxisalive.lib.Util""" + +__author__ = "Remi Jocaille (rem...@c2...)" + +# Copyleft (C) 2008 C2ME Sa +# Remi Jocaille <rem...@c2...> +# Distributed under the terms of the GNU General Public License +# http://www.gnu.org/copyleft/gpl.html + +name = 'util.misc' +version = '0.0.1' +author = "Remi Jocaille (rem...@c2...)" + +description = "Utilities libraries." + +licence = "GPL" +date = "December 2008" Added: software_suite_v3/software/plugin/plugin-msn/trunk/builder/version.py =================================================================== --- software_suite_v3/software/plugin/plugin-msn/trunk/builder/version.py (rev 0) +++ software_suite_v3/software/plugin/plugin-msn/trunk/builder/version.py 2009-06-13 14:57:29 UTC (rev 4807) @@ -0,0 +1,9 @@ +# Copyleft (C) 2009 C2ME Sa +# Remi Jocaille <rem...@c2...> +# Distributed under the terms of the GNU General Public License +# http://www.gnu.org/copyleft/gpl.html + +version = '0.0.1' +author = "Remi Jocaille (rem...@c2...)" +licence = "GPL" +date = "2009" Added: software_suite_v3/software/plugin/plugin-msn/trunk/executables/EmoticonsToAttitunes.py =================================================================== --- software_suite_v3/software/plugin/plugin-msn/trunk/executables/EmoticonsToAttitunes.py (rev 0) +++ software_suite_v3/software/plugin/plugin-msn/trunk/executables/EmoticonsToAttitunes.py 2009-06-13 14:57:29 UTC (rev 4807) @@ -0,0 +1,41 @@ +# Copyright (C) 2009 Kysoh Sa +# Remi Jocaille <rem...@c2...> +# Distributed under the terms of the GNU General Public License +# http://www.gnu.org/copyleft/gpl.html + +EMOTICONS_TO_ATTITUNES = { + ':d' : "EmoticRire", + 'lol' : "EmoticRire", + 'mdr' : "EmoticRire", + #';)' : "", + #'(h)' : "", + ':@' : "EmoticAgressif", + ':s' : "EmoticConfus", + ':$' : "EmoticEmbarassé", + #":'(" : "", + #'(a)' : "", + '8o|' : "EmoticAgressif", + #'8-|' : "", + #'+o(' : "", + #'<:o)' : "", + '|-)' : "EmoticEndormi", + #':-#' : "", + #':-*' : "", + #'8-)' : "", + '(l)' : "EmoticBisou", + #'(u)' : "", + '(@)' : "EmoticChat", + '(&)' : "EmoticChien", + #'(sn)' : "", + #'(s)' : "", + #'(*)' : "", + #'(#)' : "", + '(k)' : "EmoticBisou", + #'(r)' : "", + #'(})' : "", + #'({)' : "", + '(6)' : "EmoticAgressif", + #'(o)' : "", + '(f)' : "EmoticBisou", + ':|' : "EmoticDéçu", +} Added: software_suite_v3/software/plugin/plugin-msn/trunk/executables/SCMSN.exe =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/executables/SCMSN.exe ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/executables/SCMSN.py =================================================================== --- software_suite_v3/software/plugin/plugin-msn/trunk/executables/SCMSN.py (rev 0) +++ software_suite_v3/software/plugin/plugin-msn/trunk/executables/SCMSN.py 2009-06-13 14:57:29 UTC (rev 4807) @@ -0,0 +1,148 @@ +# Copyright (C) 2009 C2ME Sa +# Remi Jocaille <rem...@c2...> +# Distributed under the terms of the GNU General Public License +# http://www.gnu.org/copyleft/gpl.html + +import os +import subprocess +import threading +import time + +# ------------------------------------------------------------------------------ +# SCMSN stdin/stdout bridge. +# ------------------------------------------------------------------------------ +class SCMSN(object): + """SCMSN stdin/stdout bridge. + """ + + # -------------------------------------------------------------------------- + # Constructor of the class. + # -------------------------------------------------------------------------- + def __init__(self): + """Constructor of the class. + """ + mPath, mFile = os.path.split(__file__) + self.__appSCMSN = os.path.join(mPath, 'SCMSN.exe') + self.__runMutex = threading.Lock() + self.__run = False + self.__process = None + self.__isAsync = False + self.onMessage = None + self.onError = None + + # -------------------------------------------------------------------------- + # Start SCMSN. + # -------------------------------------------------------------------------- + def start(self, useAsync = False): + """Start SCMSN. + @param useAsync: Run async or not. + """ + self.__isAsync = useAsync + if not useAsync: + self.__mainLoop() + else: + t = threading.Thread(target = self.__mainLoop) + t.start() + + # -------------------------------------------------------------------------- + # Stop SCMSN. + # -------------------------------------------------------------------------- + def stop(self): + """Stop SCMSN. + """ + if not self.__getRun(): + return + if self.__process != None: + import win32api + try: + win32api.TerminateProcess(int(self.__process._handle), -1) + except: + pass + self.__setRun(False) + self.__process = None + time.sleep(0.25) + + # -------------------------------------------------------------------------- + # Restart SCMSN. + # -------------------------------------------------------------------------- + def restart(self): + """Restart SCMSN. + """ + self.stop() + self.start(self.__isAsync) + + # -------------------------------------------------------------------------- + # Get if SCMSN is started or not. + # -------------------------------------------------------------------------- + def __getRun(self): + """Get if SCMSN is started or not. + @return: True or False. + """ + self.__runMutex.acquire() + result = self.__run + self.__runMutex.release() + return result + + # -------------------------------------------------------------------------- + # Get if SCMSN is started or not. + # -------------------------------------------------------------------------- + def isStarted(self): + """Get if SCMSN is started or not. + @return: True or False. + """ + return self.__getRun() + + # -------------------------------------------------------------------------- + # Set the run flag value. + # -------------------------------------------------------------------------- + def __setRun(self, value): + """Set the run flag value. + @param value: Flag value. <True|False> + """ + self.__runMutex.acquire() + self.__run = value + self.__runMutex.release() + + # -------------------------------------------------------------------------- + # Main loop of SCMSN. + # -------------------------------------------------------------------------- + def __mainLoop(self): + """Main loop of SCMSN. + """ + if self.__getRun(): + return + self.__setRun(True) + cmd = [ + self.__appSCMSN, + ] + self.__process = subprocess.Popen( + cmd, + stdin = subprocess.PIPE, + stdout = subprocess.PIPE, + stderr = subprocess.PIPE) + incompleteLine = "" + while self.__getRun(): + try: + buffer = self.__process.stdout.read(1) + except: + buffer = "" + if len(buffer) == 0: + continue + else: + buffer = buffer.replace("\r", "\n") + buffer = incompleteLine + buffer + bufferLines = buffer.split("\n") + if len(bufferLines) == 1: + incompleteLine = bufferLines[0] + else: + incompleteLine = bufferLines[-1] + for line in bufferLines[:-1]: + if len(line) == 0: + continue + if line.find("IMChat : ") == 0: + message = line[9:] + if self.onMessage != None: + self.onMessage(message) + elif line.find("ERROR") == 0: + if self.onError != None: + self.onError() Added: software_suite_v3/software/plugin/plugin-msn/trunk/executables/plugin-msn.py =================================================================== --- software_suite_v3/software/plugin/plugin-msn/trunk/executables/plugin-msn.py (rev 0) +++ software_suite_v3/software/plugin/plugin-msn/trunk/executables/plugin-msn.py 2009-06-13 14:57:29 UTC (rev 4807) @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2009 Kysoh Sa +# Remi Jocaille <rem...@c2...> +# Distributed under the terms of the GNU General Public License +# http://www.gnu.org/copyleft/gpl.html + +__author__ = "Remi Jocaille" +__appname__ = "MSN plugin" +__version__ = "0.0.2" +__date__ = "2009/06/13" +__license__ = "GPL" + +import os +import time +import sys +import threading + +sys.path.append(os.environ['TUXDROID_SERVER_PYTHON_UTIL']) + +from util.SimplePlugin.SimplePluginConfiguration import SimplePluginConfiguration +from util.SimplePlugin.SimplePlugin import SimplePlugin +from EmoticonsToAttitunes import EMOTICONS_TO_ATTITUNES +from SCMSN import SCMSN + +class MSNPlugin(SimplePlugin): + """This class override the SimplePlugin class to make easy + the plugin coding. + """ + + def __init__(self): + """Initialization of the class. + """ + # Call the super class + SimplePlugin.__init__(self) + self.__SCMSN = SCMSN() + self.__SCMSN.onMessage = self.__onMessage + + def start(self): + """Plugin entry point. + This method should be used to dispatch commands. + """ + if self.getCommand() == "run": + self.run() + else: + self.run() + + def run(self): + """Plugin entry point for the "run" command. + """ + self.__SCMSN.start(True) + + def __onMessage(self, message): + """Event on MSN message. + @param message: Message from IMChat. + """ + # reencode the message. + try: + u = message.decode("utf-8") + message = u.encode("cp1252", "replace") + #u = message.decode("utf-8") + #message = u.encode("cp1252", "replace") + except: + pass + # speak the text if begin is "tuxdroid>" + if message.find('tuxdroid>') == 0: + self.throwNotification("start") + self.throwMessage(message[9:]) + self.throwNotification("stop") + return + # speak the text if begin is "tuxdroid>" + if message.find('tuxdroid') == 0: + self.throwNotification("start") + self.throwMessage(message[8:]) + self.throwNotification("stop") + return + # speak the text if begin is "tuxdroid>" + if message.find('tux>') == 0: + self.throwNotification("start") + self.throwMessage(message[4:]) + self.throwNotification("stop") + return + # speak the text if begin is "tuxdroid>" + if message.find('tux') == 0: + self.throwNotification("start") + self.throwMessage(message[3:]) + self.throwNotification("stop") + return + # Search for emoticon + for emoticon in EMOTICONS_TO_ATTITUNES.keys(): + if message.find(emoticon) != -1: + self.throwNotification("start") + self.throwActuation("playAttitune", + EMOTICONS_TO_ATTITUNES[emoticon]) + self.throwNotification("stop") + return + + def onPluginStop(self): + """Callback on plugin stop. + """ + self.__SCMSN.stop() + + def onPluginEvent(self, eventName, eventValues): + """Callback on plugin event. + @param eventName: Event name. + @param eventValues: Event values. + """ + pass + +if __name__ == "__main__": + plugin = MSNPlugin() + plugin.boot(sys.argv[1:], SimplePluginConfiguration()) Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticAgressif.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticAgressif.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticBisou.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticBisou.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticChat.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticChat.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticChien.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticChien.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticConfus.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticConfus.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticDecu.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticDecu.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticEmbarasse.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticEmbarasse.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticEndormi.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticEndormi.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticRire.att =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/attitunes/EmoticRire.att ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/fr.po =================================================================== --- software_suite_v3/software/plugin/plugin-msn/trunk/resources/fr.po (rev 0) +++ software_suite_v3/software/plugin/plugin-msn/trunk/resources/fr.po 2009-06-13 14:57:29 UTC (rev 4807) @@ -0,0 +1,17 @@ +msgid "Plugin MSN" +msgstr "Plugin MSN" + +msgid "Plugin MSN." +msgstr "Plugin MSN" + +msgid "This plugin notify the messages from MSN." +msgstr "Ce plugin notifie les messages venant de MSN" + +msgid "Start MSN notifier" +msgstr "Démarrer le notificateur" + +msgid "Activation" +msgstr "Activation" + +msgid "Activate the MSN notifier" +msgstr "Activer le notificateur" Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/help.wiki =================================================================== --- software_suite_v3/software/plugin/plugin-msn/trunk/resources/help.wiki (rev 0) +++ software_suite_v3/software/plugin/plugin-msn/trunk/resources/help.wiki 2009-06-13 14:57:29 UTC (rev 4807) @@ -0,0 +1,2 @@ += Synopsis = +This plugin notify the messages from MSN. Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/icon.png =================================================================== (Binary files differ) Property changes on: software_suite_v3/software/plugin/plugin-msn/trunk/resources/icon.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/plugin.pot =================================================================== --- software_suite_v3/software/plugin/plugin-msn/trunk/resources/plugin.pot (rev 0) +++ software_suite_v3/software/plugin/plugin-msn/trunk/resources/plugin.pot 2009-06-13 14:57:29 UTC (rev 4807) @@ -0,0 +1,17 @@ +msgid "Plugin MSN" +msgstr "" + +msgid "Plugin MSN." +msgstr "" + +msgid "This plugin notify the messages from MSN." +msgstr "" + +msgid "Start MSN notifier" +msgstr "" + +msgid "Activation" +msgstr "" + +msgid "Activate the MSN notifier" +msgstr "" Added: software_suite_v3/software/plugin/plugin-msn/trunk/resources/plugin.xml =================================================================== --- software_suite_v3/software/plugin/plugin-msn/trunk/resources/plugin.xml (rev 0) +++ software_suite_v3/software/plugin/plugin-msn/trunk/resources/plugin.xml 2009-06-13 14:57:29 UTC (rev 4807) @@ -0,0 +1,39 @@ +<plugin> + <interpreter + kind="python"> + <executable>executables/plugin-msn.py</executable> + </interpreter> + <description> + <name>Plugin MSN</name> + <ttsName>Plugin MSN.</ttsName> + <description>This plugin notify the messages from MSN.</description> + <author>Rémi Jocaille</author> + <version>0.0.2</version> + <iconFile>resources/icon.png</iconFile> + <uuid>68193049-e1a8-4f8b-9a6a-bdd44cbaaafb</uuid> + <platform>windows</platform> + </description> + <parameters> + </parameters> + <commands> + <command + name="run" + description="Start MSN notifier" + daemon="true" + notifier="true" + expiration="1" /> + </commands> + <tasks> + <task + name="Activation" + description="Activate the MSN notifier" + command="run" + type="once delayed" + activated="false" + + delay="00:00:10" + delayMask="false,false,false" + delayVisible="false" + /> + </tasks> +</plugin> |
|
From: remi <c2m...@c2...> - 2009-06-12 11:04:51
|
Author: remi
Date: 2009-06-12 13:04:25 +0200 (Fri, 12 Jun 2009)
New Revision: 4806
Modified:
software_suite_v3/smart-core/smart-server/trunk/resources/00_smart_server_base/04_resourceMenu.py
software_suite_v3/smart-core/smart-server/trunk/util/logger/SimpleLogger.py
Log:
* Updated logs path on Windows
Modified: software_suite_v3/smart-core/smart-server/trunk/resources/00_smart_server_base/04_resourceMenu.py
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/resources/00_smart_server_base/04_resourceMenu.py 2009-06-12 09:38:01 UTC (rev 4805)
+++ software_suite_v3/smart-core/smart-server/trunk/resources/00_smart_server_base/04_resourceMenu.py 2009-06-12 11:04:25 UTC (rev 4806)
@@ -221,7 +221,8 @@
self.haveXsl = True
self.xslPath = "/data/web_interface/server_menu/xsl/menu.xsl"
if os.name == 'nt':
- self.__logPath = os.path.expanduser("~")
+ self.__logPath = os.path.join(os.environ['ALLUSERSPROFILE'],
+ "Kysoh", "Tux Droid", "logs")
else:
self.__logPath = "/var/log/tuxdroid"
Modified: software_suite_v3/smart-core/smart-server/trunk/util/logger/SimpleLogger.py
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/util/logger/SimpleLogger.py 2009-06-12 09:38:01 UTC (rev 4805)
+++ software_suite_v3/smart-core/smart-server/trunk/util/logger/SimpleLogger.py 2009-06-12 11:04:25 UTC (rev 4806)
@@ -55,6 +55,8 @@
if (logPath == None) or (not os.path.isdir(logPath)):
if os.name == 'nt':
self.__logPath = os.path.expanduser("~")
+ self.__logPath = os.path.join(os.environ['ALLUSERSPROFILE'],
+ "Kysoh", "Tux Droid", "logs")
else:
if not os.path.isdir("/var/log/tuxdroid"):
os.makedirs("/var/log/tuxdroid", mode=0755)
|