|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||
java.lang.Objectcom.perforce.p4java.impl.mapbased.rpc.connection.RpcConnection
public abstract class RpcConnection
Main abstract class for sending and receiving packets (etc.) to and from the Perforce server. There is currently only one known subclass, RpcStreamConnection, which implements the connection using java.io streams on top of sockets.
Note that charset conversion should never be necessary on connections to non-Unicode servers, as any bytes in the incoming stream that are marked as "text" should be interpreted as ASCII (seven or eight bits). Unfortunately, in Java land, there's no such thing as non-interpreted bytes -- bytes are converted to strings according to *some* charset or other (and Java uses UTF-16 as the native encoding for strings under the covers). This explains why we always do a conversion below -- if we didn't use an explicit "from" charset, the current JVM's charset would be used, which would quite probably be wrong. Similar observations apply for conversions in the other direction -- all conversions must be with an explicit charset in case the JVM's charset isn't the one we actually need.
Note that, in general, we "know" that the Perforce server on the other end of this connection is -- or should be -- a Unicode server by the fact that the incoming clientCharset is not null. This probably isn't infallible, but it's supposed to be true, so we use it as a proxy for IServer.supportsUnicode().
See http://computer.perforce.com/newwiki/index.php?title=P4Java_and_Charset_Support for a detailed discussion of P4Java and server charset issues...
| Field Summary | |
|---|---|
protected Charset |
clientCharset
|
protected RpcConnectionFlowControl |
flowController
|
protected String |
hostName
|
protected int |
hostPort
|
protected boolean |
isUnicodeServer
|
static Charset |
NON_UNICODE_SERVER_CHARSET
Charset assumed when the server is non in Unicode mode. |
static String |
NON_UNICODE_SERVER_CHARSET_NAME
The name of the assumed non-Unicode server charset. |
protected Properties |
props
|
protected ServerStats |
stats
|
static String |
TRACE_PREFIX
|
static Charset |
UNICODE_SERVER_CHARSET
The charset used internally by a Perforce Unicode-enabled server. |
static String |
UNICODE_SERVER_CHARSET_NAME
The name of the assumed Unicode server internal charset. |
protected boolean |
usingCompression
|
| Constructor Summary | |
|---|---|
RpcConnection(String serverHost,
int serverPort,
Properties props,
ServerStats stats,
Charset clientCharset)
Create a Perforce RPC connection to a given host and port number pair. |
|
| Method Summary | |
|---|---|
abstract void |
disconnect(RpcPacketDispatcher dispatcher)
Disconnect this server. |
Charset |
getClientCharset()
|
RpcConnectionFlowControl |
getFlowController()
|
String |
getHostName()
|
int |
getHostPort()
|
protected byte[] |
getNormalizedBytes(String str)
Encode the passed-in string properly for the server. |
protected String |
getNormalizedString(byte[] bytes)
Decode the passed-in bytes from the server into a suitable string. |
Properties |
getProps()
|
abstract RpcPacket |
getRpcPacket()
Get the next RPC packet from the receive queue. |
ServerStats |
getStats()
|
abstract int |
getSystemRecvBufferSize()
Return the system (i.e. |
abstract int |
getSystemSendBufferSize()
Return the system (i.e. |
boolean |
isUnicodeServer()
|
boolean |
isUsingCompression()
|
byte[] |
marshalPacketField(String key,
Object value)
Marshal a packet field into a key value byte array pair. |
protected byte[] |
marshalPacketValue(Object value)
Marshal a packet field value onto a byte array and return that array. |
abstract long |
putRpcPacket(RpcPacket rpcPacket)
Put a Perforce RPC packet onto the output stream. |
abstract long |
putRpcPackets(RpcPacket[] rpcPackets)
Put an array of RPC packets. |
void |
setClientCharset(Charset charset)
|
void |
setFlowController(RpcConnectionFlowControl flowController)
|
void |
setHostName(String hostName)
|
void |
setHostPort(int hostPort)
|
void |
setProps(Properties props)
|
void |
setStats(ServerStats stats)
|
void |
setUnicodeServer(boolean isUnicodeServer)
|
void |
setUsingCompression(boolean usingCompression)
|
void |
useConnectionCompression()
If called, will set this connection to use (GZIP) compression for all traffic on this connection from this point on. |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
public static final String TRACE_PREFIX
public static final Charset UNICODE_SERVER_CHARSET
Do not change this unless you want all hell to break loose.
public static final String UNICODE_SERVER_CHARSET_NAME
public static final Charset NON_UNICODE_SERVER_CHARSET
public static final String NON_UNICODE_SERVER_CHARSET_NAME
protected Properties props
protected RpcConnectionFlowControl flowController
protected ServerStats stats
protected Charset clientCharset
protected String hostName
protected int hostPort
protected boolean usingCompression
protected boolean isUnicodeServer
| Constructor Detail |
|---|
public RpcConnection(String serverHost,
int serverPort,
Properties props,
ServerStats stats,
Charset clientCharset)
throws ConnectionException
This method will also implicitly connect to the server. Note that new connections are never using connection compression -- this has to come as an explicit command from the server after the connection has been established.
serverHost - non-null Perforce server host name or IP address.serverPort - Perforce server host port number.props - if not null, use the Properties for any connection- or
implementation-specific values (such as buffer sizes, etc.).stats - if not null, attempt to fill in these connection stats appropriately.clientCharset - if non-null, sets the connection's idea of what the current
client charset is. If null, CharsetDefs.DEFAULT is used.
ConnectionException - if any user-reportable error occurred under the covers.| Method Detail |
|---|
public abstract void disconnect(RpcPacketDispatcher dispatcher)
throws ConnectionException
ConnectionException
public abstract long putRpcPacket(RpcPacket rpcPacket)
throws ConnectionException
Returns the number of bytes actually sent to the Perforce server, which may not bear any relationship at all to the size of the passed-in packet.
ConnectionException
public abstract long putRpcPackets(RpcPacket[] rpcPackets)
throws ConnectionException
ConnectionException
public abstract RpcPacket getRpcPacket()
throws ConnectionException
Will wait until either a timeout occurs (if the stream's been set up appropriately), the underlying stream returns EOF or error, or we get a complete packet.
ConnectionExceptionpublic abstract int getSystemSendBufferSize()
public abstract int getSystemRecvBufferSize()
public byte[] marshalPacketField(String key,
Object value)
protected byte[] marshalPacketValue(Object value)
For strings and similar types (e.g. StringBuilder, StringBuffer), we may need to do a translation to the server charset (normally UTF-8) before enbyteifying the underlying value. Other field types are sent as-is, and are assumed to have been encoded properly upstream (and are almost always just file contents).
Note: if the value object passed in is a ByteBuffer, it must have been flipped ready for use; this method will (of course) have predictable side effects on that ByteBuffer.
public void useConnectionCompression()
throws ConnectionException
ConnectionExceptionprotected byte[] getNormalizedBytes(String str)
FIXME: use proper encoding / decoding with error handling -- HR.
str -
protected String getNormalizedString(byte[] bytes)
FIXME: use proper encoding / decoding with error handling -- HR.
bytes -
public boolean isUsingCompression()
public RpcConnectionFlowControl getFlowController()
public void setFlowController(RpcConnectionFlowControl flowController)
public Properties getProps()
public void setProps(Properties props)
public Charset getClientCharset()
public void setClientCharset(Charset charset)
public ServerStats getStats()
public void setStats(ServerStats stats)
public String getHostName()
public void setHostName(String hostName)
public int getHostPort()
public void setHostPort(int hostPort)
public void setUsingCompression(boolean usingCompression)
public boolean isUnicodeServer()
public void setUnicodeServer(boolean isUnicodeServer)
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||