#!/usr/bin/env python
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
import sys
from qpid.connection import Connection
from qpid.util import connect
from qpid.datatypes import uuid4, Message

broker = "127.0.0.1"
port = 5672

if len(sys.argv) > 1: broker = sys.argv[1]
if len(sys.argv) > 2: port = int(sys.argv[2])

if len(sys.argv) > 3:
  print >> sys.stderr, "usage: hello-world [ <broker> [ <port> ] ]"
  sys.exit(1)

# connect to the server and start a session
conn = Connection(connect(broker, port))
conn.start()
ssn = conn.session(str(uuid4()))

# create a queue
ssn.queue_declare("test-queue")

# publish a message
dp = ssn.delivery_properties(routing_key="test-queue")
mp = ssn.message_properties(content_type="text/plain")
msg = Message(dp, mp, "Hello World!")
ssn.message_transfer(message=msg)

# subscribe to a queue
ssn.message_subscribe(destination="messages", queue="test-queue",
                      accept_mode=ssn.accept_mode.none)
incoming = ssn.incoming("messages")

# start incoming message flow
incoming.start()

# grab a message from the queue

print incoming.get(timeout=10)

# cancel the subscription and close the session and connection
ssn.message_cancel(destination="messages")
ssn.close()
conn.close()
