Index: tools/android/forwarder2/command.cc |
diff --git a/tools/android/forwarder2/command.cc b/tools/android/forwarder2/command.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0a79a539a87624fd7e2fcb831188898b7a87a2ee |
--- /dev/null |
+++ b/tools/android/forwarder2/command.cc |
@@ -0,0 +1,84 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "tools/android/forwarder2/command.h" |
+ |
+#include <errno.h> |
+#include <stdio.h> |
+#include <stdlib.h> |
+#include <string.h> |
+ |
+#include "base/logging.h" |
+#include "base/string_number_conversions.h" |
+#include "base/string_piece.h" |
+#include "tools/android/forwarder2/socket.h" |
+ |
+using base::StringPiece; |
+ |
+namespace { |
+ |
+// Command format: |
+// _PORT:COMMAND_TYPE |
+// This is a non-null-terminated string. |
+// _PORT is a 5-char zero padded ascii number in decimal format (including the |
+// '_' char). |
+// ':' is used for separating the port and the command_type for simpler reading. |
+// COMMAND_TYPE is the enum command::Type printed as a decimal ASCII string. It |
+// is a 3-char zero padded ascii number in decimal format. |
+const int kPortStringSize = 5; |
+const int kCommandTypeStringSize = 2; |
+// Command string size also includes the ':' separator char. |
+const int kCommandStringSize = kPortStringSize + kCommandTypeStringSize + 1; |
+ |
+} // namespace |
+ |
+namespace forwarder { |
+ |
+bool ReadCommand(Socket* socket, int* port, command::Type* command_type) { |
+ char command_str[kCommandStringSize + 1]; |
+ // To make logging easier. |
+ command_str[kCommandStringSize] = '\0'; |
+ |
+ if (socket->ReadNumBytes(command_str, kCommandStringSize) != |
+ kCommandStringSize) { |
+ LOG(ERROR) << "Not enough data received from the socket."; |
+ return false; |
+ } |
+ |
+ StringPiece port_str(command_str, kPortStringSize); |
+ if (!StringToInt(port_str, port)) { |
+ LOG(ERROR) << "Could not parse the command port string: " |
+ << port_str; |
+ return false; |
+ } |
+ |
+ StringPiece command_type_str( |
+ &command_str[kPortStringSize + 1], kCommandTypeStringSize); |
+ int cmd_type; |
+ if (!StringToInt(command_type_str, &cmd_type)) { |
+ LOG(ERROR) << "Could not parse the command type string: " |
+ << command_type_str; |
+ return false; |
+ } |
+ *command_type = static_cast<command::Type>(cmd_type); |
+ return true; |
+} |
+ |
+bool SendCommand(command::Type cmd, int port, Socket* socket) { |
+ char buffer[kCommandStringSize + 1]; |
+ int len = snprintf(buffer, sizeof(buffer), "%05d:%02d", port, cmd); |
+ // Write the full command minus the leading \0 char. |
+ return socket->WriteNumBytes(buffer, len) == len; |
+} |
+ |
+bool ReceivedCommand(command::Type cmd, Socket* socket) { |
+ int port; |
+ command::Type received_cmd; |
+ if (!ReadCommand(socket, &port, &received_cmd)) { |
+ return false; |
+ } |
+ return received_cmd == cmd; |
+} |
+ |
+} // namespace forwarder |