/*
* Copyright (c) 2008-2009, Motorola, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* - Neither the name of the Motorola, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
package javax.obex;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* The Operation
interface provides ways to manipulate a single
* OBEX PUT or GET operation. The implementation of this interface sends OBEX
* packets as they are built. If during the operation the peer in the operation
* ends the operation, an IOException
is thrown on the next read
* from the input stream, write to the output stream, or call to
* sendHeaders()
.
*
* Definition of methods inherited from ContentConnection
*
*
* getEncoding()
will always return null
.
* getLength()
will return the length specified by the OBEX Length
* header or -1 if the OBEX Length header was not included.
* getType()
will return the value specified in the OBEX Type
* header or null
if the OBEX Type header was not included.
*
* How Headers are Handled *
* As headers are received, they may be retrieved through the
* getReceivedHeaders()
method. If new headers are set during the
* operation, the new headers will be sent during the next packet exchange.
*
* PUT example *
*
* void putObjectViaOBEX(ClientSession conn, HeaderSet head, byte[] obj) throws IOException { * // Include the length header * head.setHeader(head.LENGTH, new Long(obj.length)); * // Initiate the PUT request * Operation op = conn.put(head); * // Open the output stream to put the object to it * DataOutputStream out = op.openDataOutputStream(); * // Send the object to the server * out.write(obj); * // End the transaction * out.close(); * op.close(); * } **
* GET example *
*
* byte[] getObjectViaOBEX(ClientSession conn, HeaderSet head) throws IOException { * // Send the initial GET request to the server * Operation op = conn.get(head); * // Retrieve the length of the object being sent back * int length = op.getLength(); * // Create space for the object * byte[] obj = new byte[length]; * // Get the object from the input stream * DataInputStream in = trans.openDataInputStream(); * in.read(obj); * // End the transaction * in.close(); * op.close(); * return obj; * } ** *
close()
the OutputStream
returned from
* openOutputStream()
or openDataOutputStream()
will
* signal that the request is done. (In OBEX terms, the End-Of-Body header
* should be sent and the final bit in the request will be set.) At this point,
* the reply from the server may begin to be processed. A call to
* getResponseCode()
will do an implicit close on the
* OutputStream
and therefore signal that the request is done.
* openInputStream()
or openDataInputStream()
will
* signal that the request is done. (In OBEX terms, the final bit in the request
* will be set.) A call to getResponseCode()
will cause an implicit
* close on the InputStream
. No further data may be read at this
* point.
* @hide
*/
public interface Operation {
/**
* Sends an ABORT message to the server. By calling this method, the
* corresponding input and output streams will be closed along with this
* object. No headers are sent in the abort request. This will end the
* operation since close()
will be called by this method.
* @throws IOException if the transaction has already ended or if an OBEX
* server calls this method
*/
void abort() throws IOException;
/**
* Returns the headers that have been received during the operation.
* Modifying the object returned has no effect on the headers that are sent
* or retrieved.
* @return the headers received during this Operation
* @throws IOException if this Operation
has been closed
*/
HeaderSet getReceivedHeader() throws IOException;
/**
* Specifies the headers that should be sent in the next OBEX message that
* is sent.
* @param headers the headers to send in the next message
* @throws IOException if this Operation
has been closed or the
* transaction has ended and no further messages will be exchanged
* @throws IllegalArgumentException if headers
was not created
* by a call to ServerRequestHandler.createHeaderSet()
* or ClientSession.createHeaderSet()
* @throws NullPointerException if headers
if null
*/
void sendHeaders(HeaderSet headers) throws IOException;
/**
* Returns the response code received from the server. Response codes are
* defined in the ResponseCodes
class.
* @see ResponseCodes
* @return the response code retrieved from the server
* @throws IOException if an error occurred in the transport layer during
* the transaction; if this object was created by an OBEX server
*/
int getResponseCode() throws IOException;
String getEncoding();
long getLength();
int getHeaderLength();
String getType();
InputStream openInputStream() throws IOException;
DataInputStream openDataInputStream() throws IOException;
OutputStream openOutputStream() throws IOException;
DataOutputStream openDataOutputStream() throws IOException;
void close() throws IOException;
int getMaxPacketSize();
}