blob: adb21549a21d0add209c6f48ff7b79edc2f4c873 [file] [log] [blame]
/* $Id$
*
* 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.
*/
#ifndef __ETCHPLAINMAILBOX_H__
#define __ETCHPLAINMAILBOX_H__
#include "capu/os/Mutex.h"
#include "support/EtchMailbox.h"
#include "util/EtchCircularQueue.h"
#include "transport/EtchMailboxManager.h"
class EtchPlainMailbox : public EtchMailbox{
public:
/**
* Default Constructor
* @param mailboxManager
* @param messageId
*/
EtchPlainMailbox(EtchMailboxManager* mailboxManager, EtchLong messageId);
/**
* Destructor
*/
virtual ~EtchPlainMailbox();
/**
* @return the message id of this mailbox.
*/
EtchLong getMessageId();
/**
* @See EtchMailbox
*/
status_t message(capu::SmartPointer<EtchWho> sender, capu::SmartPointer<EtchMessage> msg);
/**
* @param the next message to be read from the mailbox, or null if
* the mailbox is empty and closed. Wait forever for such a message
* to be delivered.
*/
status_t read(EtchMailbox::EtchElement*& result);
/**
* @param maxDelay the maximum amount of time in milliseconds to
* wait to read a message from an empty mailbox. 0 means wait
* forever, -1 means don't wait at all.
* @param the message read from the mailbox, or null if the mailbox
* is empty and closed, or if the time limit was exceeeded.
*/
status_t read(EtchMailbox::EtchElement *& result, capu::int32_t maxDelay);
/**
* Closes the mailbox so that no more messages can be delivered.
* Queued messages remain to be read. Reading an empty closed
* mailbox returns null.
* @param true if this call closed the mailbox (that is, if action was
* taken), false if the mailbox was already closed.
*/
status_t closeDelivery(capu::bool_t withNotification = true);
/**
* Closes the mailbox so that no more messages will be delivered or
* read. Any remaining queued messages are delivered to a default
* handler.
* @return ETCH_OK if this call closed the mailbox (that is, if action was
* taken), ETCH_ERROR if the mailbox was already closed.
*/
status_t closeRead();
/**
* Registers a Notify interface implementation to receive a callback
* when a mailbox's status is changed.
* @param notify a Notify interface implementation to report the
* delivery status to.
* @param state a state value to pass thru to the Notify interface
* implementation.
* @param maxDelay the maximum amount of time in milliseconds to
* wait for delivery of a message to the mailbox. 0 means wait
* forever. The mailbox is closed upon timeout.
* @return ETCH_OK registration was successfully, ETCH_ERROR otherwise
*/
status_t registerNotify(EtchMailbox::EtchNotify* notify, EtchObject* state, capu::int32_t maxDelay);
/**
* Unregisters a Notify interface implementation from receiving a callback
* when a mailbox's status is changed. Cancels any timeout.
* @param notify a Notify interface implementation which was previously
* registered.
* @return ETCH_OK unregistration was successfully, ETCH_ERROR otherwise
*/
status_t unregisterNotify(EtchMailbox::EtchNotify* notify);
/**
* @return true if the mailbox is empty.
*/
capu::bool_t isEmpty();
/**
* @return true if the mailbox is closed.
*/
capu::bool_t isClosed();
/**
* @return true if the mailbox is full.
*/
capu::bool_t isFull();
/**
*
* @return mailbox manager
*/
EtchMailboxManager* getMailboxManager();
private:
EtchMailboxManager* mMailboxManager;
EtchMailbox::EtchNotify* mNotify;
EtchObject* mState;
EtchLong mMessageId;
capu::bool_t mAlarmSet;
EtchCircularQueue mQueue;
capu::Mutex mMutex;
void fireNotify();
};
#endif /* ETCHPLAINMAILBOX_H */