| Index: net/tools/testserver/xmppserver.py | 
| diff --git a/net/tools/testserver/xmppserver.py b/net/tools/testserver/xmppserver.py | 
| index e883d315d86a824e67a1c2399d70c4ed2d1e60e6..dfac6a1d8f7889b5f79155ef03a53e36a6ff63b5 100644 | 
| --- a/net/tools/testserver/xmppserver.py | 
| +++ b/net/tools/testserver/xmppserver.py | 
| @@ -488,6 +488,14 @@ class XmppServer(asyncore.dispatcher): | 
| asyncore.loop(30.0, False, socket_map) | 
| """ | 
|  | 
| +  # Used when sending a notification. | 
| +  _NOTIFICATION_STANZA = ParseXml( | 
| +    '<message>' | 
| +    '  <push xmlns="google:push">' | 
| +    '    <data/>' | 
| +    '  </push>' | 
| +    '</message>') | 
| + | 
| def __init__(self, socket_map, addr): | 
| asyncore.dispatcher.__init__(self, None, socket_map) | 
| self.create_socket(socket.AF_INET, socket.SOCK_STREAM) | 
| @@ -497,11 +505,14 @@ class XmppServer(asyncore.dispatcher): | 
| self._socket_map = socket_map | 
| self._connections = set() | 
| self._handshake_done_connections = set() | 
| +    self._notifications_enabled = True | 
|  | 
| def handle_accept(self): | 
| (sock, addr) = self.accept() | 
| xmpp_connection = XmppConnection(sock, self._socket_map, self, addr) | 
| self._connections.add(xmpp_connection) | 
| +    # Return the new XmppConnection for testing. | 
| +    return xmpp_connection | 
|  | 
| def close(self): | 
| # A copy is necessary since calling close on each connection | 
| @@ -510,6 +521,39 @@ class XmppServer(asyncore.dispatcher): | 
| connection.close() | 
| asyncore.dispatcher.close(self) | 
|  | 
| +  def EnableNotifications(self): | 
| +    self._notifications_enabled = True | 
| + | 
| +  def DisableNotifications(self): | 
| +    self._notifications_enabled = False | 
| + | 
| +  def MakeNotification(self, channel, data): | 
| +    """Makes a notification from the given channel and encoded data. | 
| + | 
| +    Args: | 
| +      channel: The channel on which to send the notification. | 
| +      data: The notification payload. | 
| +    """ | 
| +    notification_stanza = CloneXml(self._NOTIFICATION_STANZA) | 
| +    push_element = notification_stanza.getElementsByTagName('push')[0] | 
| +    push_element.setAttribute('channel', channel) | 
| +    data_element = push_element.getElementsByTagName('data')[0] | 
| +    encoded_data = base64.b64encode(data) | 
| +    data_text = notification_stanza.parentNode.createTextNode(encoded_data) | 
| +    data_element.appendChild(data_text) | 
| +    return notification_stanza | 
| + | 
| +  def SendNotification(self, channel, data): | 
| +    """Sends a notification to all connections. | 
| + | 
| +    Args: | 
| +      channel: The channel on which to send the notification. | 
| +      data: The notification payload. | 
| +    """ | 
| +    notification_stanza = self.MakeNotification(channel, data) | 
| +    self.ForwardNotification(None, notification_stanza) | 
| +    notification_stanza.unlink() | 
| + | 
| # XmppConnection delegate methods. | 
| def OnXmppHandshakeDone(self, xmpp_connection): | 
| self._handshake_done_connections.add(xmpp_connection) | 
| @@ -519,6 +563,9 @@ class XmppServer(asyncore.dispatcher): | 
| self._handshake_done_connections.discard(xmpp_connection) | 
|  | 
| def ForwardNotification(self, unused_xmpp_connection, notification_stanza): | 
| -    for connection in self._handshake_done_connections: | 
| -      print 'Sending notification to %s' % connection | 
| -      connection.ForwardNotification(notification_stanza) | 
| +    if self._notifications_enabled: | 
| +      for connection in self._handshake_done_connections: | 
| +        print 'Sending notification to %s' % connection | 
| +        connection.ForwardNotification(notification_stanza) | 
| +    else: | 
| +      print 'Notifications disabled; dropping notification' | 
|  |