Improve ChecksumCalculator

- Expose the checksum sizes through public constants to allow
  users to preallocate static arrays for those
- Get rid of a slower memcpy() operations in checksum calculation

Change-Id: Ieaa92fce7b32b75a5db0f94d505c917ecfa16f74
diff --git a/shared/OpenglCodecCommon/ChecksumCalculator.cpp b/shared/OpenglCodecCommon/ChecksumCalculator.cpp
index 7bd8211..8983524 100644
--- a/shared/OpenglCodecCommon/ChecksumCalculator.cpp
+++ b/shared/OpenglCodecCommon/ChecksumCalculator.cpp
@@ -20,24 +20,13 @@
 
 // Checklist when implementing new protocol:
 // 1. update CHECKSUMHELPER_MAX_VERSION
-// 2. update maxChecksumSize()
+// 2. update ChecksumCalculator::Sizes enum
 // 3. update checksumByteSize()
 // 4. update addBuffer, writeChecksum, resetChecksum, validate
 
 // change CHECKSUMHELPER_MAX_VERSION when you want to update the protocol version
 #define CHECKSUMHELPER_MAX_VERSION 1
 
-// checksum buffer size
-// Please add a new checksum buffer size when implementing a new protocol,
-// as well as modifying the maxChecksumSize function.
-static const size_t kV1ChecksumSize = 8;
-
-static size_t maxChecksumSize() {
-    return 0 > kV1ChecksumSize ? 0 : kV1ChecksumSize;
-}
-
-static const size_t kMaxChecksumSize = maxChecksumSize();
-
 // utility macros to create checksum string at compilation time
 #define CHECKSUMHELPER_VERSION_STR_PREFIX "ANDROID_EMU_CHECKSUM_HELPER_v"
 #define CHECKSUMHELPER_MACRO_TO_STR(x) #x
@@ -134,17 +123,22 @@
         resetChecksum();
         return false;
     }
-    // buffers for computing the checksum
-    unsigned char sChecksumBuffer[kMaxChecksumSize];
+    bool isValid;
     switch (m_version) {
         case 1: {
-            uint32_t val = computeV1Checksum();
-            memcpy(sChecksumBuffer, &val, sizeof(val));
-            memcpy(sChecksumBuffer+sizeof(val), &m_numRead, sizeof(m_numRead));
+            const uint32_t val = computeV1Checksum();
+            isValid = 0 == memcmp(&val, expectedChecksum, sizeof(val)) &&
+                      0 == memcmp(&m_numRead,
+                                  static_cast<const char*>(expectedChecksum) +
+                                          sizeof(val),
+                                  sizeof(m_numRead));
+
             break;
         }
+        default:
+            isValid = true;  // No checksum is a valid checksum.
+            break;
     }
-    bool isValid = !memcmp(sChecksumBuffer, expectedChecksum, checksumSize);
     m_numRead++;
     resetChecksum();
     return isValid;