|
||||||||||
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 String |
fingerprint
|
protected RpcConnectionFlowControl |
flowController
|
protected String |
hostIp
|
protected String |
hostName
|
protected int |
hostPort
|
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 boolean |
secure
|
protected ServerStats |
stats
|
static String |
TRACE_PREFIX
|
protected boolean |
trusted
|
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 |
unicodeServer
|
protected static String |
UNKNOWN_SERVER_HOST
|
protected static int |
UNKNOWN_SERVER_PORT
|
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. |
|
RpcConnection(String serverHost,
int serverPort,
Properties props,
ServerStats stats,
Charset clientCharset,
boolean secure)
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()
|
String |
getFingerprint()
|
RpcConnectionFlowControl |
getFlowController()
|
String |
getHostIp()
|
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. |
abstract RpcPacket |
getRpcPacket(RpcPacketFieldRule fieldRule,
IFilterCallback filterCallback)
Get the next RPC packet from the receive queue with an optional rule to handle the RPC packet fields. |
abstract String |
getServerIpPort()
Get the server's IP and port used for the RPC connection. |
ServerStats |
getStats()
|
abstract int |
getSystemRecvBufferSize()
Return the system (i.e. |
abstract int |
getSystemSendBufferSize()
Return the system (i.e. |
boolean |
isSecure()
|
boolean |
isTrusted()
|
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 |
setFingerprint(String fingerprint)
|
void |
setFlowController(RpcConnectionFlowControl flowController)
|
void |
setHostIp(String hostIp)
|
void |
setHostName(String hostName)
|
void |
setHostPort(int hostPort)
|
void |
setProps(Properties props)
|
void |
setSecure(boolean secure)
|
void |
setStats(ServerStats stats)
|
void |
setTrusted(boolean trusted)
|
void |
setUnicodeServer(boolean unicodeServer)
|
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 static final String UNKNOWN_SERVER_HOST
protected static final int UNKNOWN_SERVER_PORT
protected Properties props
protected RpcConnectionFlowControl flowController
protected ServerStats stats
protected Charset clientCharset
protected String hostIp
protected String hostName
protected int hostPort
protected boolean usingCompression
protected boolean unicodeServer
protected boolean secure
protected String fingerprint
protected boolean trusted
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.public RpcConnection(String serverHost, int serverPort, Properties props, ServerStats stats, Charset clientCharset, boolean secure) 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.secure
- indicate whether the connection is secure (SSL) or not.
ConnectionException
- if any user-reportable error occurred under the covers.Method Detail |
---|
public abstract String getServerIpPort()
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.
ConnectionException
public abstract RpcPacket getRpcPacket(RpcPacketFieldRule fieldRule, IFilterCallback filterCallback) throws ConnectionException
ConnectionException
public 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
ConnectionException
protected 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 getHostIp()
public void setHostIp(String hostIp)
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 unicodeServer)
public boolean isSecure()
public void setSecure(boolean secure)
public String getFingerprint()
public void setFingerprint(String fingerprint)
public boolean isTrusted()
public void setTrusted(boolean trusted)
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |