http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/examples/engine/py/recurring_timer.py ---------------------------------------------------------------------- diff --git a/examples/engine/py/recurring_timer.py b/examples/engine/py/recurring_timer.py new file mode 100755 index 0000000..c641ec6 --- /dev/null +++ b/examples/engine/py/recurring_timer.py @@ -0,0 +1,47 @@ +#!/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 time +from proton.reactors import EventLoop, Handler + +class Recurring(Handler): + def __init__(self, period): + self.eventloop = EventLoop(self) + self.period = period + self.eventloop.schedule(time.time() + self.period, subject=self) + + def on_timer(self, event): + print "Tick..." + self.eventloop.schedule(time.time() + self.period, subject=self) + + def run(self): + self.eventloop.run() + + def stop(self): + self.eventloop.stop() + +try: + app = Recurring(1.0) + app.run() +except KeyboardInterrupt: + app.stop() + print + +
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/examples/engine/py/recurring_timer_tornado.py ---------------------------------------------------------------------- diff --git a/examples/engine/py/recurring_timer_tornado.py b/examples/engine/py/recurring_timer_tornado.py new file mode 100755 index 0000000..f4ca260 --- /dev/null +++ b/examples/engine/py/recurring_timer_tornado.py @@ -0,0 +1,48 @@ +#!/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 time +from proton import Handler +from proton_tornado import TornadoLoop + +class Recurring(Handler): + def __init__(self, period): + self.eventloop = TornadoLoop(self) + self.period = period + self.eventloop.schedule(time.time() + self.period, subject=self) + + def on_timer(self, event): + print "Tick..." + self.eventloop.schedule(time.time() + self.period, subject=self) + + def run(self): + self.eventloop.run() + + def stop(self): + self.eventloop.stop() + +try: + app = Recurring(1.0) + app.run() +except KeyboardInterrupt: + app.stop() + print + + http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/examples/engine/py/selected_recv.py ---------------------------------------------------------------------- diff --git a/examples/engine/py/selected_recv.py b/examples/engine/py/selected_recv.py new file mode 100755 index 0000000..8425f3d --- /dev/null +++ b/examples/engine/py/selected_recv.py @@ -0,0 +1,40 @@ +#!/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. +# + +from proton.reactors import EventLoop, Selector +from proton.handlers import MessagingHandler + +class Recv(MessagingHandler): + def __init__(self): + super(Recv, self).__init__() + + def on_start(self, event): + conn = event.reactor.connect("localhost:5672") + conn.create_receiver("examples", options=Selector(u"colour = 'green'")) + + def on_message(self, event): + print event.message.body + +try: + EventLoop(Recv()).run() +except KeyboardInterrupt: pass + + + http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/examples/engine/py/server.py ---------------------------------------------------------------------- diff --git a/examples/engine/py/server.py b/examples/engine/py/server.py new file mode 100755 index 0000000..6ab5671 --- /dev/null +++ b/examples/engine/py/server.py @@ -0,0 +1,55 @@ +#!/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. +# + +from proton import Message +from proton.handlers import MessagingHandler +from proton.reactors import EventLoop + +class Server(MessagingHandler): + def __init__(self, host, address): + super(Server, self).__init__() + self.host = host + self.address = address + + def on_start(self, event): + self.conn = event.reactor.connect(self.host) + self.receiver = self.conn.create_receiver(self.address) + self.senders = {} + self.relay = None + + def on_connection_opened(self, event): + if event.connection.remote_offered_capabilities and 'ANONYMOUS-RELAY' in event.connection.remote_offered_capabilities: + self.relay = self.conn.create_sender(None) + + def on_message(self, event): + sender = self.relay + if not sender: + sender = self.senders.get(event.message.reply_to) + if not sender: + sender = self.conn.create_sender(event.message.reply_to) + self.senders[event.message.reply_to] = sender + sender.send_msg(Message(address=event.message.reply_to, body=event.message.body.upper())) + +try: + EventLoop(Server("localhost:5672", "examples")).run() +except KeyboardInterrupt: pass + + + http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/examples/engine/py/server_tx.py ---------------------------------------------------------------------- diff --git a/examples/engine/py/server_tx.py b/examples/engine/py/server_tx.py new file mode 100755 index 0000000..cda2d0b --- /dev/null +++ b/examples/engine/py/server_tx.py @@ -0,0 +1,77 @@ +#!/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. +# + +from proton import Message +from proton.reactors import EventLoop +from proton.handlers import MessagingHandler, TransactionHandler + +class TxRequest(TransactionHandler): + def __init__(self, response, sender, request_delivery, context): + super(TxRequest, self).__init__() + self.response = response + self.sender = sender + self.request_delivery = request_delivery + self.context = context + + def on_transaction_declared(self, event): + self.sender.send_msg(self.response, transaction=event.transaction) + self.accept(self.request_delivery, transaction=event.transaction) + event.transaction.commit() + + def on_transaction_committed(self, event): + print "Request processed successfully" + + def on_transaction_aborted(self, event): + print "Request processing aborted" + + +class TxServer(MessagingHandler): + def __init__(self, host, address): + super(TxServer, self).__init__(auto_accept=False) + self.host = host + self.address = address + + def on_start(self, event): + self.context = event.reactor.connect(self.host, reconnect=False) + self.receiver = self.context.create_receiver(self.address) + self.senders = {} + self.relay = None + + def on_message(self, event): + sender = self.relay + if not sender: + sender = self.senders.get(event.message.reply_to) + if not sender: + sender = self.context.create_sender(event.message.reply_to) + self.senders[event.message.reply_to] = sender + + response = Message(address=event.message.reply_to, body=event.message.body.upper()) + self.context.declare_transaction(handler=TxRequest(response, sender, event.delivery, self.context)) + + def on_connection_open(self, event): + if event.connection.remote_offered_capabilities and 'ANONYMOUS-RELAY' in event.connection.remote_offered_capabilities: + self.relay = self.context.create_sender(None) + +try: + EventLoop(TxServer("localhost:5672", "examples")).run() +except KeyboardInterrupt: pass + + + http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/examples/engine/py/simple_recv.py ---------------------------------------------------------------------- diff --git a/examples/engine/py/simple_recv.py b/examples/engine/py/simple_recv.py new file mode 100755 index 0000000..ea80aa6 --- /dev/null +++ b/examples/engine/py/simple_recv.py @@ -0,0 +1,42 @@ +#!/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. +# + +from proton.handlers import MessagingHandler +from proton.reactors import EventLoop + +class Recv(MessagingHandler): + def __init__(self, host, address): + super(Recv, self).__init__() + self.host = host + self.address = address + + def on_start(self, event): + conn = event.reactor.connect(self.host) + conn.create_receiver(self.address) + + def on_message(self, event): + print event.message.body + +try: + EventLoop(Recv("localhost:5672", "examples")).run() +except KeyboardInterrupt: pass + + + http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/examples/engine/py/simple_send.py ---------------------------------------------------------------------- diff --git a/examples/engine/py/simple_send.py b/examples/engine/py/simple_send.py new file mode 100755 index 0000000..bbd30ac --- /dev/null +++ b/examples/engine/py/simple_send.py @@ -0,0 +1,55 @@ +#!/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. +# + +from proton import Message +from proton.handlers import MessagingHandler +from proton.reactors import EventLoop + +class Send(MessagingHandler): + def __init__(self, host, address, messages): + super(Send, self).__init__() + self.host = host + self.address = address + self.sent = 0 + self.confirmed = 0 + self.total = messages + + def on_start(self, event): + conn = event.reactor.connect(self.host) + conn.create_sender(self.address) + + def on_credit(self, event): + while event.sender.credit and self.sent < self.total: + msg = Message(body={'sequence':(self.sent+1)}) + event.sender.send_msg(msg) + self.sent += 1 + + def on_accepted(self, event): + self.confirmed += 1 + if self.confirmed == self.total: + print "all messages confirmed" + event.connection.close() + + def on_disconnected(self, event): + self.sent = self.confirmed + +try: + EventLoop(Send("localhost:5672", "examples", 10000)).run() +except KeyboardInterrupt: pass http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/examples/engine/py/sync_client.py ---------------------------------------------------------------------- diff --git a/examples/engine/py/sync_client.py b/examples/engine/py/sync_client.py new file mode 100755 index 0000000..362385a --- /dev/null +++ b/examples/engine/py/sync_client.py @@ -0,0 +1,88 @@ +#!/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. +# + +""" +Demonstrates the client side of the synchronous request-response pattern +(also known as RPC or Remote Procecure Call) using proton. + +""" + +from proton import Message, Url, ConnectionException, Timeout +from proton.utils import BlockingConnection +from proton.handlers import IncomingMessageHandler +import sys + +class SyncRequestClient(IncomingMessageHandler): + """ + Implementation of the synchronous request-responce (aka RPC) pattern. + Create an instance and call invoke() to send a request and wait for a response. + """ + + def __init__(self, url, timeout=None): + """ + @param url: a proton.Url or a URL string of the form 'host:port/path' + host:port is used to connect, path is used to identify the remote messaging endpoint. + """ + super(SyncRequestClient, self).__init__() + self.connection = BlockingConnection(Url(url).defaults(), timeout=timeout) + self.sender = self.connection.create_sender(url.path) + # dynamic=true generates a unique address dynamically for this receiver. + # credit=1 because we want to receive 1 response message initially. + self.receiver = self.connection.create_receiver(None, dynamic=True, credit=1, handler=self) + self.response = None + + def invoke(self, request): + """Send a request, wait for and return the response""" + request.reply_to = self.reply_to + self.sender.send_msg(request) + self.connection.wait(lambda: self.response, msg="Waiting for response") + response = self.response + self.response = None # Ready for next response. + self.receiver.flow(1) # Set up credit for the next response. + return response + + @property + def reply_to(self): + """Return the dynamic address of our receiver.""" + return self.receiver.remote_source.address + + def on_message(self, event): + """Called when we receive a message for our receiver.""" + self.response = event.message # Store the response + + def close(self): + self.connection.close() + + +if __name__ == '__main__': + url = Url("0.0.0.0/examples") + if len(sys.argv) > 1: url = Url(sys.argv[1]) + + invoker = SyncRequestClient(url, timeout=2) + try: + REQUESTS= ["Twas brillig, and the slithy toves", + "Did gire and gymble in the wabe.", + "All mimsy were the borogroves,", + "And the mome raths outgrabe."] + for request in REQUESTS: + response = invoker.invoke(Message(body=request)) + print "%s => %s" % (request, response.body) + finally: + invoker.close() http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/examples/engine/py/tutorial.rst ---------------------------------------------------------------------- diff --git a/examples/engine/py/tutorial.rst b/examples/engine/py/tutorial.rst new file mode 100644 index 0000000..89eb563 --- /dev/null +++ b/examples/engine/py/tutorial.rst @@ -0,0 +1,152 @@ +============ +Hello World! +============ + +Tradition dictates that we start with hello world! However rather than +simply striving for the shortest program possible, we'll aim for a +more illustrative example while still restricting the functionality to +sending and receiving a single message. + +.. literalinclude:: helloworld.py + :lines: 21- + :linenos: + +This example uses proton in an event-driven or reactive manner. The +flow of control is an 'event loop', where the events may be triggered +by data arriving on a socket among other things and are then passed to +relevant 'handlers'. Applications are then structured as a set of +defined handlers for events of interest; to be notified of a +particular event, you define a class with an appropriately name method +on it, inform the event loop of that method which then calls it +whenever the event occurs. + +The class we define in this example, ``HelloWorld``, has methods to +handle three types of events. + +The first, ``on_connection_opened()``, is called when the connection +is opened, and when that occurs we create a receiver over which to +receive our message and a sender over which to send it. + +The second method, ``on_credit()``, is called when our sender has been +issued by the peer with 'credit', allowing it to send messages. A +credit based flow control mechanism like this ensures we only send +messages when the recipient is ready and able to receive them. This is +particularly important when the volume of messages might be large. In +our case we are just going to send one message. + +The third and final method, ``on_message()``, is called when a message +arrives. Within that method we simply print the body of the message +and then close the connection. + +This particular example assumes a broker (or similar service), which +accepts connections and routes published messages to intended +recipients. The constructor for the ``HelloWorld`` class takes the +details of the broker to connect to, and the address through which the +message is sent and received (for a broker this corresponds to a queue +or topic name). + +After an instance of ``HelloWorld`` is constructed, the event loop is +entered by the call to the ``run()`` method on the last line. This +call will return only when the loop determines there are no more +events possible (at which point our example program will then exit). + +==================== +Hello World, Direct! +==================== + +Though often used in conjunction with a broker, AMQP does not +*require* this. It also allows senders and receivers can communicate +directly if desired. + +Let's modify our example to demonstrate this. + +.. literalinclude:: helloworld_direct.py + :lines: 21- + :emphasize-lines: 17,33,38 + :linenos: + +The first difference, on line 17, is that rather than creating a +receiver on the same connection as our sender, we listen for incoming +connections by invoking the ``listen() method on the ``EventLoop`` +instance. + +Another difference is that the ``EventLoop`` instance we use is not +the default instance as was used in the original example, but one we +construct ourselves on line 38, passing in some event handlers. The +first of these is ``HelloWorldReceiver``, as used in the original +example. We pass it to the event loop, because we aren't going to +directly create the receiver here ourselves. Rather we will accept an +incoming connection on which the message will be received. This +handler would then be notified of any incoming message event on any of +the connections the event loop controls. As well as our own handler, we +specify a couple of useful handlers from the ``proton_events`` +toolkit. The ``Handshaker`` handler will ensure our server follows the +basic handshaking rules laid down by the protocol. The +``FlowController`` will issue credit for incoming messages. We won't +worry about them in more detail than that for now. + +The last difference is that we close the ``acceptor`` returned from +the ``listen()`` call as part of the handling of the connection close +event (line 33). + +So now we have our example working without a broker involved! + +========== +The Basics +========== + +TODO: These examples show reliable (at-least-once) send and receive +with reconnect ability. Need to write some explanation. Could also do +with some further cleanup. + + +.. literalinclude:: simple_recv.py + :lines: 21- + :linenos: + +.. literalinclude:: simple_send.py + :lines: 21- + :linenos: + +================ +Request/Response +================ + +A common pattern is to send a request message and expect a response +message in return. AMQP has special support for this pattern. Let's +have a look at a simple example. We'll start with the 'server', +i.e. the program that will process the request and send the +response. Note that we are still using a broker in this example. + +Our server will provide a very simple service: it will respond with +the body of the request converted to uppercase. + +.. literalinclude:: server.py + :lines: 21- + :linenos: + +The code here is not too different from the simple receiver example. When +we receive a request however, we look at the reply-to address and +create a sender for that over which to send the response. We'll cache +the senders incase we get further requests wit the same reply-to. + +Now let's create a simple client to test this service out. + +.. literalinclude:: client.py + :lines: 21- + :linenos: + +As well as sending requests, we need to be able to get back the +responses. We create a receiver for that (see line 8), but we don't +specify an address, we set the dynamic option which tells the broker +we are connected to to create a temporary address over which we can +receive our responses. + +We need to use the address allocated by the broker as the reply_to +address of our requests. To be notified when the broker has sent us +back the address to use, we add an ``on_link_remote_open()`` method to +our receiver's handler, and use that as the trigger to send our first +request. + + + http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/examples/engine/py/tx_recv.py ---------------------------------------------------------------------- diff --git a/examples/engine/py/tx_recv.py b/examples/engine/py/tx_recv.py new file mode 100755 index 0000000..a28a3df --- /dev/null +++ b/examples/engine/py/tx_recv.py @@ -0,0 +1,62 @@ +#!/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. +# + +from proton.reactors import EventLoop +from proton.handlers import TransactionalClientHandler + +class TxRecv(TransactionalClientHandler): + def __init__(self, batch_size): + super(TxRecv, self).__init__(prefetch=0) + self.current_batch = 0 + self.batch_size = batch_size + self.event_loop = EventLoop(self) + self.conn = self.event_loop.connect("localhost:5672") + self.receiver = self.conn.create_receiver("examples") + self.conn.declare_transaction(handler=self) + self.transaction = None + + def on_message(self, event): + print event.message.body + self.accept(event.delivery, self.transaction) + self.current_batch += 1 + if self.current_batch == self.batch_size: + self.transaction.commit() + self.transaction = None + + def on_transaction_declared(self, event): + self.receiver.flow(self.batch_size) + self.transaction = event.transaction + + def on_transaction_committed(self, event): + self.current_batch = 0 + self.conn.declare_transaction(handler=self) + + def on_disconnected(self, event): + self.current_batch = 0 + + def run(self): + self.event_loop.run() + +try: + TxRecv(10).run() +except KeyboardInterrupt: pass + + + http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/examples/engine/py/tx_recv_interactive.py ---------------------------------------------------------------------- diff --git a/examples/engine/py/tx_recv_interactive.py b/examples/engine/py/tx_recv_interactive.py new file mode 100755 index 0000000..a822992 --- /dev/null +++ b/examples/engine/py/tx_recv_interactive.py @@ -0,0 +1,83 @@ +#!/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 +import threading +from proton.reactors import ApplicationEvent, EventLoop +from proton.handlers import TransactionalClientHandler + +class TxRecv(TransactionalClientHandler): + def __init__(self): + super(TxRecv, self).__init__(prefetch=0) + + def on_start(self, event): + self.context = event.reactor.connect("localhost:5672") + self.receiver = self.context.create_receiver("examples") + #self.context.declare_transaction(handler=self, settle_before_discharge=False) + self.context.declare_transaction(handler=self, settle_before_discharge=True) + self.transaction = None + + def on_message(self, event): + print event.message.body + self.transaction.accept(event.delivery) + + def on_transaction_declared(self, event): + self.transaction = event.transaction + print "transaction declared" + + def on_transaction_committed(self, event): + print "transaction committed" + self.context.declare_transaction(handler=self) + + def on_transaction_aborted(self, event): + print "transaction aborted" + self.context.declare_transaction(handler=self) + + def on_commit(self, event): + self.transaction.commit() + + def on_abort(self, event): + self.transaction.abort() + + def on_fetch(self, event): + self.receiver.flow(1) + + def on_quit(self, event): + c = self.receiver.connection + self.receiver.close() + c.close() + +try: + reactor = EventLoop(TxRecv()) + events = reactor.get_event_trigger() + thread = threading.Thread(target=reactor.run) + thread.daemon=True + thread.start() + + print "Enter 'fetch', 'commit' or 'abort'" + while True: + line = sys.stdin.readline() + if line: + events.trigger(ApplicationEvent(line.strip())) + else: + break +except KeyboardInterrupt: pass + + http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/examples/engine/py/tx_send.py ---------------------------------------------------------------------- diff --git a/examples/engine/py/tx_send.py b/examples/engine/py/tx_send.py new file mode 100755 index 0000000..b2f12b2 --- /dev/null +++ b/examples/engine/py/tx_send.py @@ -0,0 +1,76 @@ +#!/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. +# + +from proton import Message +from proton.reactors import EventLoop +from proton.handlers import TransactionalClientHandler + +class TxSend(TransactionalClientHandler): + def __init__(self, messages, batch_size): + super(TxSend, self).__init__() + self.current_batch = 0 + self.committed = 0 + self.confirmed = 0 + self.total = messages + self.batch_size = batch_size + self.eventloop = EventLoop() + self.conn = self.eventloop.connect("localhost:5672", handler=self) + self.sender = self.conn.create_sender("examples") + self.conn.declare_transaction(handler=self) + self.transaction = None + + def on_transaction_declared(self, event): + self.transaction = event.transaction + self.send() + + def on_credit(self, event): + self.send() + + def send(self): + while self.transaction and self.sender.credit and self.committed < self.total: + msg = Message(body={'sequence':(self.committed+self.current_batch+1)}) + self.sender.send_msg(msg, transaction=self.transaction) + self.current_batch += 1 + if self.current_batch == self.batch_size: + self.transaction.commit() + self.transaction = None + + def on_accepted(self, event): + if event.sender == self.sender: + self.confirmed += 1 + + def on_transaction_committed(self, event): + self.committed += self.current_batch + if self.committed == self.total: + print "all messages committed" + event.connection.close() + else: + self.current_batch = 0 + self.conn.declare_transaction(handler=self) + + def on_disconnected(self, event): + self.current_batch = 0 + + def run(self): + self.eventloop.run() + +try: + TxSend(10000, 10).run() +except KeyboardInterrupt: pass http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/examples/engine/py/tx_send_sync.py ---------------------------------------------------------------------- diff --git a/examples/engine/py/tx_send_sync.py b/examples/engine/py/tx_send_sync.py new file mode 100755 index 0000000..0c50838 --- /dev/null +++ b/examples/engine/py/tx_send_sync.py @@ -0,0 +1,77 @@ +#!/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. +# + +from proton import Message +from proton.reactors import EventLoop +from proton.handlers import TransactionalClientHandler + +class TxSend(TransactionalClientHandler): + def __init__(self, messages, batch_size): + super(TxSend, self).__init__() + self.current_batch = 0 + self.confirmed = 0 + self.committed = 0 + self.total = messages + self.batch_size = batch_size + self.eventloop = EventLoop() + self.conn = self.eventloop.connect("localhost:5672", handler=self) + self.sender = self.conn.create_sender("examples") + self.conn.declare_transaction(handler=self) + self.transaction = None + + def on_transaction_declared(self, event): + self.transaction = event.transaction + self.send() + + def on_credit(self, event): + self.send() + + def send(self): + while self.transaction and self.current_batch < self.batch_size and self.sender.credit and self.committed < self.total: + msg = Message(body={'sequence':(self.committed+self.current_batch+1)}) + self.sender.send_msg(msg, transaction=self.transaction) + self.current_batch += 1 + + def on_accepted(self, event): + if event.sender == self.sender: + self.confirmed += 1 + if self.confirmed == self.batch_size: + self.transaction.commit() + self.transaction = None + self.confirmed = 0 + + def on_transaction_committed(self, event): + self.committed += self.current_batch + if self.committed == self.total: + print "all messages committed" + event.connection.close() + else: + self.current_batch = 0 + self.conn.declare_transaction(handler=self) + + def on_disconnected(self, event): + self.current_batch = 0 + + def run(self): + self.eventloop.run() + +try: + TxSend(10000, 10).run() +except KeyboardInterrupt: pass http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/Makefile ---------------------------------------------------------------------- diff --git a/tutorial/Makefile b/tutorial/Makefile deleted file mode 100644 index ec4b876..0000000 --- a/tutorial/Makefile +++ /dev/null @@ -1,153 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext - -help: - @echo "Please use \`make <target>' where <target> is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Proton.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Proton.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/Proton" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Proton" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/doctrees/environment.pickle ---------------------------------------------------------------------- diff --git a/tutorial/_build/doctrees/environment.pickle b/tutorial/_build/doctrees/environment.pickle deleted file mode 100644 index 2d7a398..0000000 Binary files a/tutorial/_build/doctrees/environment.pickle and /dev/null differ http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/doctrees/index.doctree ---------------------------------------------------------------------- diff --git a/tutorial/_build/doctrees/index.doctree b/tutorial/_build/doctrees/index.doctree deleted file mode 100644 index de2c704..0000000 Binary files a/tutorial/_build/doctrees/index.doctree and /dev/null differ http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/doctrees/tutorial.doctree ---------------------------------------------------------------------- diff --git a/tutorial/_build/doctrees/tutorial.doctree b/tutorial/_build/doctrees/tutorial.doctree deleted file mode 100644 index a093651..0000000 Binary files a/tutorial/_build/doctrees/tutorial.doctree and /dev/null differ http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/.buildinfo ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/.buildinfo b/tutorial/_build/html/.buildinfo deleted file mode 100644 index eed68be..0000000 --- a/tutorial/_build/html/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 2657ccbc7cab07e4ab00891ea70f9dd0 -tags: fbb0d17656682115ca4d033fb2f83ba1 http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_sources/index.txt ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_sources/index.txt b/tutorial/_build/html/_sources/index.txt deleted file mode 100644 index d5f5b76..0000000 --- a/tutorial/_build/html/_sources/index.txt +++ /dev/null @@ -1,15 +0,0 @@ -.. Proton documentation master file, created by - sphinx-quickstart on Thu Jul 31 10:31:05 2014. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Some Proton Examples -==================== - -Contents: - -.. toctree:: - :maxdepth: 2 - - tutorial - http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_sources/tutorial.txt ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_sources/tutorial.txt b/tutorial/_build/html/_sources/tutorial.txt deleted file mode 100644 index 89eb563..0000000 --- a/tutorial/_build/html/_sources/tutorial.txt +++ /dev/null @@ -1,152 +0,0 @@ -============ -Hello World! -============ - -Tradition dictates that we start with hello world! However rather than -simply striving for the shortest program possible, we'll aim for a -more illustrative example while still restricting the functionality to -sending and receiving a single message. - -.. literalinclude:: helloworld.py - :lines: 21- - :linenos: - -This example uses proton in an event-driven or reactive manner. The -flow of control is an 'event loop', where the events may be triggered -by data arriving on a socket among other things and are then passed to -relevant 'handlers'. Applications are then structured as a set of -defined handlers for events of interest; to be notified of a -particular event, you define a class with an appropriately name method -on it, inform the event loop of that method which then calls it -whenever the event occurs. - -The class we define in this example, ``HelloWorld``, has methods to -handle three types of events. - -The first, ``on_connection_opened()``, is called when the connection -is opened, and when that occurs we create a receiver over which to -receive our message and a sender over which to send it. - -The second method, ``on_credit()``, is called when our sender has been -issued by the peer with 'credit', allowing it to send messages. A -credit based flow control mechanism like this ensures we only send -messages when the recipient is ready and able to receive them. This is -particularly important when the volume of messages might be large. In -our case we are just going to send one message. - -The third and final method, ``on_message()``, is called when a message -arrives. Within that method we simply print the body of the message -and then close the connection. - -This particular example assumes a broker (or similar service), which -accepts connections and routes published messages to intended -recipients. The constructor for the ``HelloWorld`` class takes the -details of the broker to connect to, and the address through which the -message is sent and received (for a broker this corresponds to a queue -or topic name). - -After an instance of ``HelloWorld`` is constructed, the event loop is -entered by the call to the ``run()`` method on the last line. This -call will return only when the loop determines there are no more -events possible (at which point our example program will then exit). - -==================== -Hello World, Direct! -==================== - -Though often used in conjunction with a broker, AMQP does not -*require* this. It also allows senders and receivers can communicate -directly if desired. - -Let's modify our example to demonstrate this. - -.. literalinclude:: helloworld_direct.py - :lines: 21- - :emphasize-lines: 17,33,38 - :linenos: - -The first difference, on line 17, is that rather than creating a -receiver on the same connection as our sender, we listen for incoming -connections by invoking the ``listen() method on the ``EventLoop`` -instance. - -Another difference is that the ``EventLoop`` instance we use is not -the default instance as was used in the original example, but one we -construct ourselves on line 38, passing in some event handlers. The -first of these is ``HelloWorldReceiver``, as used in the original -example. We pass it to the event loop, because we aren't going to -directly create the receiver here ourselves. Rather we will accept an -incoming connection on which the message will be received. This -handler would then be notified of any incoming message event on any of -the connections the event loop controls. As well as our own handler, we -specify a couple of useful handlers from the ``proton_events`` -toolkit. The ``Handshaker`` handler will ensure our server follows the -basic handshaking rules laid down by the protocol. The -``FlowController`` will issue credit for incoming messages. We won't -worry about them in more detail than that for now. - -The last difference is that we close the ``acceptor`` returned from -the ``listen()`` call as part of the handling of the connection close -event (line 33). - -So now we have our example working without a broker involved! - -========== -The Basics -========== - -TODO: These examples show reliable (at-least-once) send and receive -with reconnect ability. Need to write some explanation. Could also do -with some further cleanup. - - -.. literalinclude:: simple_recv.py - :lines: 21- - :linenos: - -.. literalinclude:: simple_send.py - :lines: 21- - :linenos: - -================ -Request/Response -================ - -A common pattern is to send a request message and expect a response -message in return. AMQP has special support for this pattern. Let's -have a look at a simple example. We'll start with the 'server', -i.e. the program that will process the request and send the -response. Note that we are still using a broker in this example. - -Our server will provide a very simple service: it will respond with -the body of the request converted to uppercase. - -.. literalinclude:: server.py - :lines: 21- - :linenos: - -The code here is not too different from the simple receiver example. When -we receive a request however, we look at the reply-to address and -create a sender for that over which to send the response. We'll cache -the senders incase we get further requests wit the same reply-to. - -Now let's create a simple client to test this service out. - -.. literalinclude:: client.py - :lines: 21- - :linenos: - -As well as sending requests, we need to be able to get back the -responses. We create a receiver for that (see line 8), but we don't -specify an address, we set the dynamic option which tells the broker -we are connected to to create a temporary address over which we can -receive our responses. - -We need to use the address allocated by the broker as the reply_to -address of our requests. To be notified when the broker has sent us -back the address to use, we add an ``on_link_remote_open()`` method to -our receiver's handler, and use that as the trigger to send our first -request. - - - http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_static/ajax-loader.gif ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_static/ajax-loader.gif b/tutorial/_build/html/_static/ajax-loader.gif deleted file mode 100644 index 61faf8c..0000000 Binary files a/tutorial/_build/html/_static/ajax-loader.gif and /dev/null differ http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_static/alert_info_32.png ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_static/alert_info_32.png b/tutorial/_build/html/_static/alert_info_32.png deleted file mode 100644 index 05b4fe8..0000000 Binary files a/tutorial/_build/html/_static/alert_info_32.png and /dev/null differ http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_static/alert_warning_32.png ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_static/alert_warning_32.png b/tutorial/_build/html/_static/alert_warning_32.png deleted file mode 100644 index f13611c..0000000 Binary files a/tutorial/_build/html/_static/alert_warning_32.png and /dev/null differ http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_static/basic.css ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_static/basic.css b/tutorial/_build/html/_static/basic.css deleted file mode 100644 index 43e8baf..0000000 --- a/tutorial/_build/html/_static/basic.css +++ /dev/null @@ -1,540 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox input[type="text"] { - width: 170px; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - width: 30px; -} - -img { - border: 0; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li div.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable dl, table.indextable dd { - margin-top: 0; - margin-bottom: 0; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- general body styles --------------------------------------------------- */ - -a.headerlink { - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.field-list ul { - padding-left: 1em; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px 7px 0 7px; - background-color: #ffe; - width: 40%; - float: right; -} - -p.sidebar-title { - font-weight: bold; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px 7px 0 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -div.admonition dl { - margin-bottom: 0; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - border: 0; - border-collapse: collapse; -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.field-list td, table.field-list th { - border: 0 !important; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -dl { - margin-bottom: 15px; -} - -dd p { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dt:target, .highlighted { - background-color: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.refcount { - color: #060; -} - -.optional { - font-size: 1.3em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -td.linenos pre { - padding: 5px 0px; - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - margin-left: 0.5em; -} - -table.highlighttable td { - padding: 0 0.5em 0 0.5em; -} - -tt.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -tt.descclassname { - background-color: transparent; -} - -tt.xref, a tt { - background-color: transparent; - font-weight: bold; -} - -h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_static/bg-page.png ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_static/bg-page.png b/tutorial/_build/html/_static/bg-page.png deleted file mode 100644 index c6f3bc4..0000000 Binary files a/tutorial/_build/html/_static/bg-page.png and /dev/null differ http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_static/bullet_orange.png ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_static/bullet_orange.png b/tutorial/_build/html/_static/bullet_orange.png deleted file mode 100644 index ad5d02f..0000000 Binary files a/tutorial/_build/html/_static/bullet_orange.png and /dev/null differ http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_static/comment-bright.png ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_static/comment-bright.png b/tutorial/_build/html/_static/comment-bright.png deleted file mode 100644 index 551517b..0000000 Binary files a/tutorial/_build/html/_static/comment-bright.png and /dev/null differ http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_static/comment-close.png ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_static/comment-close.png b/tutorial/_build/html/_static/comment-close.png deleted file mode 100644 index 09b54be..0000000 Binary files a/tutorial/_build/html/_static/comment-close.png and /dev/null differ http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_static/comment.png ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_static/comment.png b/tutorial/_build/html/_static/comment.png deleted file mode 100644 index 92feb52..0000000 Binary files a/tutorial/_build/html/_static/comment.png and /dev/null differ http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_static/default.css ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_static/default.css b/tutorial/_build/html/_static/default.css deleted file mode 100644 index 21f3f50..0000000 --- a/tutorial/_build/html/_static/default.css +++ /dev/null @@ -1,256 +0,0 @@ -/* - * default.css_t - * ~~~~~~~~~~~~~ - * - * Sphinx stylesheet -- default theme. - * - * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: sans-serif; - font-size: 100%; - background-color: #11303d; - color: #000; - margin: 0; - padding: 0; -} - -div.document { - background-color: #1c4e63; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 230px; -} - -div.body { - background-color: #ffffff; - color: #000000; - padding: 0 20px 30px 20px; -} - -div.footer { - color: #ffffff; - width: 100%; - padding: 9px 0 9px 0; - text-align: center; - font-size: 75%; -} - -div.footer a { - color: #ffffff; - text-decoration: underline; -} - -div.related { - background-color: #133f52; - line-height: 30px; - color: #ffffff; -} - -div.related a { - color: #ffffff; -} - -div.sphinxsidebar { -} - -div.sphinxsidebar h3 { - font-family: 'Trebuchet MS', sans-serif; - color: #ffffff; - font-size: 1.4em; - font-weight: normal; - margin: 0; - padding: 0; -} - -div.sphinxsidebar h3 a { - color: #ffffff; -} - -div.sphinxsidebar h4 { - font-family: 'Trebuchet MS', sans-serif; - color: #ffffff; - font-size: 1.3em; - font-weight: normal; - margin: 5px 0 0 0; - padding: 0; -} - -div.sphinxsidebar p { - color: #ffffff; -} - -div.sphinxsidebar p.topless { - margin: 5px 10px 10px 10px; -} - -div.sphinxsidebar ul { - margin: 10px; - padding: 0; - color: #ffffff; -} - -div.sphinxsidebar a { - color: #98dbcc; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - - - -/* -- hyperlink styles ------------------------------------------------------ */ - -a { - color: #355f7c; - text-decoration: none; -} - -a:visited { - color: #355f7c; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - - - -/* -- body styles ----------------------------------------------------------- */ - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: 'Trebuchet MS', sans-serif; - background-color: #f2f2f2; - font-weight: normal; - color: #20435c; - border-bottom: 1px solid #ccc; - margin: 20px -20px 10px -20px; - padding: 3px 0 3px 10px; -} - -div.body h1 { margin-top: 0; font-size: 200%; } -div.body h2 { font-size: 160%; } -div.body h3 { font-size: 140%; } -div.body h4 { font-size: 120%; } -div.body h5 { font-size: 110%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #c60f0f; - font-size: 0.8em; - padding: 0 4px 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - background-color: #c60f0f; - color: white; -} - -div.body p, div.body dd, div.body li { - text-align: justify; - line-height: 130%; -} - -div.admonition p.admonition-title + p { - display: inline; -} - -div.admonition p { - margin-bottom: 5px; -} - -div.admonition pre { - margin-bottom: 5px; -} - -div.admonition ul, div.admonition ol { - margin-bottom: 5px; -} - -div.note { - background-color: #eee; - border: 1px solid #ccc; -} - -div.seealso { - background-color: #ffc; - border: 1px solid #ff6; -} - -div.topic { - background-color: #eee; -} - -div.warning { - background-color: #ffe4e4; - border: 1px solid #f66; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre { - padding: 5px; - background-color: #eeffcc; - color: #333333; - line-height: 120%; - border: 1px solid #ac9; - border-left: none; - border-right: none; -} - -tt { - background-color: #ecf0f3; - padding: 0 1px 0 1px; - font-size: 0.95em; -} - -th { - background-color: #ede; -} - -.warning tt { - background: #efc2c2; -} - -.note tt { - background: #d6d6d6; -} - -.viewcode-back { - font-family: sans-serif; -} - -div.viewcode-block:target { - background-color: #f4debf; - border-top: 1px solid #ac9; - border-bottom: 1px solid #ac9; -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_static/doctools.js ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_static/doctools.js b/tutorial/_build/html/_static/doctools.js deleted file mode 100644 index d4619fd..0000000 --- a/tutorial/_build/html/_static/doctools.js +++ /dev/null @@ -1,247 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - */ -jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); -} - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s == 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * small function to check if an array contains - * a given item. - */ -jQuery.contains = function(arr, item) { - for (var i = 0; i < arr.length; i++) { - if (arr[i] == item) - return true; - } - return false; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node) { - if (node.nodeType == 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { - var span = document.createElement("span"); - span.className = className; - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this); - }); - } - } - return this.each(function() { - highlight(this); - }); -}; - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated == 'undefined') - return string; - return (typeof translated == 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated == 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('<a class="headerlink">\u00B6</a>'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('<a class="headerlink">\u00B6</a>'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('<p class="highlight-link"><a href="javascript:Documentation.' + - 'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) == 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this == '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_static/down-pressed.png ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_static/down-pressed.png b/tutorial/_build/html/_static/down-pressed.png deleted file mode 100644 index 6f7ad78..0000000 Binary files a/tutorial/_build/html/_static/down-pressed.png and /dev/null differ http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_static/down.png ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_static/down.png b/tutorial/_build/html/_static/down.png deleted file mode 100644 index 3003a88..0000000 Binary files a/tutorial/_build/html/_static/down.png and /dev/null differ http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_static/file.png ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_static/file.png b/tutorial/_build/html/_static/file.png deleted file mode 100644 index d18082e..0000000 Binary files a/tutorial/_build/html/_static/file.png and /dev/null differ http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4b154cb/tutorial/_build/html/_static/haiku.css ---------------------------------------------------------------------- diff --git a/tutorial/_build/html/_static/haiku.css b/tutorial/_build/html/_static/haiku.css deleted file mode 100644 index 1b7c261..0000000 --- a/tutorial/_build/html/_static/haiku.css +++ /dev/null @@ -1,371 +0,0 @@ -/* - * haiku.css_t - * ~~~~~~~~~~~ - * - * Sphinx stylesheet -- haiku theme. - * - * Adapted from http://haiku-os.org/docs/Haiku-doc.css. - * Original copyright message: - * - * Copyright 2008-2009, Haiku. All rights reserved. - * Distributed under the terms of the MIT License. - * - * Authors: - * Francois Revol <[email protected]> - * Stephan Assmus <[email protected]> - * Braden Ewing <[email protected]> - * Humdinger <[email protected]> - * - * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -@import url("basic.css"); - -html { - margin: 0px; - padding: 0px; - background: #FFF url(bg-page.png) top left repeat-x; -} - -body { - line-height: 1.5; - margin: auto; - padding: 0px; - font-family: "DejaVu Sans", Arial, Helvetica, sans-serif; - min-width: 59em; - max-width: 70em; - color: #333333; -} - -div.footer { - padding: 8px; - font-size: 11px; - text-align: center; - letter-spacing: 0.5px; -} - -/* link colors and text decoration */ - -a:link { - font-weight: bold; - text-decoration: none; - color: #dc3c01; -} - -a:visited { - font-weight: bold; - text-decoration: none; - color: #892601; -} - -a:hover, a:active { - text-decoration: underline; - color: #ff4500; -} - -/* Some headers act as anchors, don't give them a hover effect */ - -h1 a:hover, a:active { - text-decoration: none; - color: #0c3762; -} - -h2 a:hover, a:active { - text-decoration: none; - color: #0c3762; -} - -h3 a:hover, a:active { - text-decoration: none; - color: #0c3762; -} - -h4 a:hover, a:active { - text-decoration: none; - color: #0c3762; -} - -a.headerlink { - color: #a7ce38; - padding-left: 5px; -} - -a.headerlink:hover { - color: #a7ce38; -} - -/* basic text elements */ - -div.content { - margin-top: 20px; - margin-left: 40px; - margin-right: 40px; - margin-bottom: 50px; - font-size: 0.9em; -} - -/* heading and navigation */ - -div.header { - position: relative; - left: 0px; - top: 0px; - height: 85px; - /* background: #eeeeee; */ - padding: 0 40px; -} -div.header h1 { - font-size: 1.6em; - font-weight: normal; - letter-spacing: 1px; - color: #0c3762; - border: 0; - margin: 0; - padding-top: 15px; -} -div.header h1 a { - font-weight: normal; - color: #0c3762; -} -div.header h2 { - font-size: 1.3em; - font-weight: normal; - letter-spacing: 1px; - text-transform: uppercase; - color: #aaa; - border: 0; - margin-top: -3px; - padding: 0; -} - -div.header img.rightlogo { - float: right; -} - - -div.title { - font-size: 1.3em; - font-weight: bold; - color: #0c3762; - border-bottom: dotted thin #e0e0e0; - margin-bottom: 25px; -} -div.topnav { - /* background: #e0e0e0; */ -} -div.topnav p { - margin-top: 0; - margin-left: 40px; - margin-right: 40px; - margin-bottom: 0px; - text-align: right; - font-size: 0.8em; -} -div.bottomnav { - background: #eeeeee; -} -div.bottomnav p { - margin-right: 40px; - text-align: right; - font-size: 0.8em; -} - -a.uplink { - font-weight: normal; -} - - -/* contents box */ - -table.index { - margin: 0px 0px 30px 30px; - padding: 1px; - border-width: 1px; - border-style: dotted; - border-color: #e0e0e0; -} -table.index tr.heading { - background-color: #e0e0e0; - text-align: center; - font-weight: bold; - font-size: 1.1em; -} -table.index tr.index { - background-color: #eeeeee; -} -table.index td { - padding: 5px 20px; -} - -table.index a:link, table.index a:visited { - font-weight: normal; - text-decoration: none; - color: #dc3c01; -} -table.index a:hover, table.index a:active { - text-decoration: underline; - color: #ff4500; -} - - -/* Haiku User Guide styles and layout */ - -/* Rounded corner boxes */ -/* Common declarations */ -div.admonition { - -webkit-border-radius: 10px; - -khtml-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; - border-style: dotted; - border-width: thin; - border-color: #dcdcdc; - padding: 10px 15px 10px 15px; - margin-bottom: 15px; - margin-top: 15px; -} -div.note { - padding: 10px 15px 10px 80px; - background: #e4ffde url(alert_info_32.png) 15px 15px no-repeat; - min-height: 42px; -} -div.warning { - padding: 10px 15px 10px 80px; - background: #fffbc6 url(alert_warning_32.png) 15px 15px no-repeat; - min-height: 42px; -} -div.seealso { - background: #e4ffde; -} - -/* More layout and styles */ -h1 { - font-size: 1.3em; - font-weight: bold; - color: #0c3762; - border-bottom: dotted thin #e0e0e0; - margin-top: 30px; -} - -h2 { - font-size: 1.2em; - font-weight: normal; - color: #0c3762; - border-bottom: dotted thin #e0e0e0; - margin-top: 30px; -} - -h3 { - font-size: 1.1em; - font-weight: normal; - color: #0c3762; - margin-top: 30px; -} - -h4 { - font-size: 1.0em; - font-weight: normal; - color: #0c3762; - margin-top: 30px; -} - -p { - text-align: justify; -} - -p.last { - margin-bottom: 0; -} - -ol { - padding-left: 20px; -} - -ul { - padding-left: 5px; - margin-top: 3px; -} - -li { - line-height: 1.3; -} - -div.content ul > li { - -moz-background-clip:border; - -moz-background-inline-policy:continuous; - -moz-background-origin:padding; - background: transparent url(bullet_orange.png) no-repeat scroll left 0.45em; - list-style-image: none; - list-style-type: none; - padding: 0 0 0 1.666em; - margin-bottom: 3px; -} - -td { - vertical-align: top; -} - -tt { - background-color: #e2e2e2; - font-size: 1.0em; - font-family: monospace; -} - -pre { - border-color: #0c3762; - border-style: dotted; - border-width: thin; - margin: 0 0 12px 0; - padding: 0.8em; - background-color: #f0f0f0; -} - -hr { - border-top: 1px solid #ccc; - border-bottom: 0; - border-right: 0; - border-left: 0; - margin-bottom: 10px; - margin-top: 20px; -} - -/* printer only pretty stuff */ -@media print { - .noprint { - display: none; - } - /* for acronyms we want their definitions inlined at print time */ - acronym[title]:after { - font-size: small; - content: " (" attr(title) ")"; - font-style: italic; - } - /* and not have mozilla dotted underline */ - acronym { - border: none; - } - div.topnav, div.bottomnav, div.header, table.index { - display: none; - } - div.content { - margin: 0px; - padding: 0px; - } - html { - background: #FFF; - } -} - -.viewcode-back { - font-family: "DejaVu Sans", Arial, Helvetica, sans-serif; -} - -div.viewcode-block:target { - background-color: #f4debf; - border-top: 1px solid #ac9; - border-bottom: 1px solid #ac9; - margin: -1px -12px; - padding: 0 12px; -} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
