public class RpcPacket
extends java.lang.Object
Each RPC packet consists of the following elements (as cribbed from the C++ API code and byte-level TCP/IP packet analysis done on p4 server network traffic):
Note that the order of individual fields within the overall scheme is theoretically unimportant (with the obvious exception of the preamble, which has to be first), but there may be unknown server dependencies on element order, so we try to closely follow the C++ API's ordering in our implementation.
Note that RPC packets are not in any way synonymous with TCP packets or any underlying transport layer packet mechanism -- text packets can span TCP packets or several RPC packets can be packed into a single TCP packet, for example.
Modifier and Type | Field and Description |
---|---|
static int |
DEFAULT_RPC_PACKET_BUFFER_SIZE |
static int |
RPC_LENGTH_FIELD_LENGTH
Length in bytes of the RPC packet length fields.
|
static java.lang.String |
TRACE_PREFIX |
Modifier and Type | Method and Description |
---|---|
static RpcPacket |
constructRpcPacket(RpcFunctionSpec funcName,
java.util.Map<java.lang.String,java.lang.Object> args,
ExternalEnv env)
Construct an RPC packet for a user command.
|
static RpcPacket |
constructRpcPacket(RpcFunctionSpec funcName,
java.lang.String realName,
java.lang.String[] args,
ExternalEnv env)
Construct an RPC packet for a user command.
|
static RpcPacket |
constructRpcPacket(RpcPacketPreamble preamble,
byte[] bytes,
boolean isUnicodeServer,
java.nio.charset.Charset charset)
Construct an RPC packet from the passed-in preamble, bytes, and charset.
|
static RpcPacket |
constructRpcPacket(RpcPacketPreamble preamble,
byte[] bytes,
boolean isUnicodeServer,
java.nio.charset.Charset charset,
RpcPacketFieldRule fieldRule,
IFilterCallback filterCallback)
Construct an RPC packet from the passed-in preamble, bytes, charset and fieldRule.
|
static RpcPacket |
constructRpcPacket(java.lang.String funcName,
java.util.Map<java.lang.String,java.lang.Object> args,
ExternalEnv env)
Construct an RPC packet for a user command.
|
static int |
decodeInt4(byte[] bytes)
Decode a Java int from the passed-in 4 byte Perforce encoded
integer value.
|
static byte[] |
encodeInt4(int i)
Return a four byte array ready for sending across the wire that
represents in Perforce standard wire form the integer passed in.
|
ExternalEnv |
getEnv() |
java.lang.String |
getFuncNameString() |
java.util.Map<java.lang.String,java.lang.Object> |
getMapArgs() |
int |
getPacketLength() |
java.util.Map<java.lang.String,java.lang.Object> |
getResultsMap() |
java.lang.String[] |
getStrArgs() |
void |
setEnv(ExternalEnv env) |
void |
setFuncNameString(java.lang.String funcNameString) |
void |
setMapArgs(java.util.Map<java.lang.String,java.lang.Object> mapArgs) |
void |
setPacketLength(int packetLength) |
void |
setResultsMap(java.util.Map<java.lang.String,java.lang.Object> resultsMap) |
void |
setStrArgs(java.lang.String[] strArgs) |
public static final int DEFAULT_RPC_PACKET_BUFFER_SIZE
public static final int RPC_LENGTH_FIELD_LENGTH
public static final java.lang.String TRACE_PREFIX
public static byte[] encodeInt4(int i)
Used extensively in the Perforce RPC protocol to encode ints before sending them across the wire.
i
- ipublic static int decodeInt4(byte[] bytes)
Used extensively in the Perforce RPC protocol to decode ints
coming in off the wire. Note that we have to go to some length
to convince Java that we want unsigned byte (it's amazing that
Java still doesn't have unsigned integral types...); this
helps explain the seemingly-redundant "& 0xFF"'s
in the code
below.
bytes
- bytespublic static RpcPacket constructRpcPacket(RpcFunctionSpec funcName, java.lang.String realName, java.lang.String[] args, ExternalEnv env)
funcName
- non-null function namerealName
- realNameargs
- potentially-null function arguments as a string arrayenv
- potentially-null command environmentpublic static RpcPacket constructRpcPacket(RpcFunctionSpec funcName, java.util.Map<java.lang.String,java.lang.Object> args, ExternalEnv env)
funcName
- non-null function nameargs
- potentially-null function arguments in map formenv
- potentially-null command environmentpublic static RpcPacket constructRpcPacket(java.lang.String funcName, java.util.Map<java.lang.String,java.lang.Object> args, ExternalEnv env)
funcName
- non-null function nameargs
- potentially-null function arguments in map formenv
- potentially-null command environmentpublic static RpcPacket constructRpcPacket(RpcPacketPreamble preamble, byte[] bytes, boolean isUnicodeServer, java.nio.charset.Charset charset)
preamble
- preamblebytes
- bytesisUnicodeServer
- isUnicodeServercharset
- charsetpublic static RpcPacket constructRpcPacket(RpcPacketPreamble preamble, byte[] bytes, boolean isUnicodeServer, java.nio.charset.Charset charset, RpcPacketFieldRule fieldRule, IFilterCallback filterCallback)
preamble
- preamblebytes
- bytesisUnicodeServer
- isUnicodeServercharset
- charsetfieldRule
- fieldRulefilterCallback
- filterCallbackpublic java.util.Map<java.lang.String,java.lang.Object> getResultsMap()
public void setResultsMap(java.util.Map<java.lang.String,java.lang.Object> resultsMap)
public java.lang.String getFuncNameString()
public void setFuncNameString(java.lang.String funcNameString)
public int getPacketLength()
public void setPacketLength(int packetLength)
public java.lang.String[] getStrArgs()
public void setStrArgs(java.lang.String[] strArgs)
public java.util.Map<java.lang.String,java.lang.Object> getMapArgs()
public void setMapArgs(java.util.Map<java.lang.String,java.lang.Object> mapArgs)
public ExternalEnv getEnv()
public void setEnv(ExternalEnv env)