Change ErrorCode into an enum class.

This change is needed in order for us to be able to import ErrorCode
symbols from chromeos_update_engine into chromeos_update_manager.
Unfortunately, shifting from plain 'enum' into an 'enum class' means
that the compiler treats the new class as a distinct type from int,
which in turn means that plenty of seamless arithmetic/bitwise
operations we used for manipulating error code values throughout the
code needed to be retrofitted with static_cast operators.

In the future, we should consider imposing a proper abstraction on
update engine error codes that'll prevent mingling with value encoding
directly and prevent such nastiness. It'll also make things more
coherent (types, semantics) and safer.

BUG=chromium:358329
TEST=Unit tests.

Change-Id: Ie55fa566b764cdab6c4785d995fb6daee4cb32d3
Reviewed-on: https://chromium-review.googlesource.com/203209
Tested-by: Gilad Arnold <garnold@chromium.org>
Reviewed-by: Alex Deymo <deymo@chromium.org>
Commit-Queue: Gilad Arnold <garnold@chromium.org>
diff --git a/omaha_request_action.cc b/omaha_request_action.cc
index 9e43385..5955157 100644
--- a/omaha_request_action.cc
+++ b/omaha_request_action.cc
@@ -166,7 +166,8 @@
     // is not success.
     string error_code;
     if (event->result != OmahaEvent::kResultSuccess) {
-      error_code = base::StringPrintf(" errorcode=\"%d\"", event->error_code);
+      error_code = base::StringPrintf(" errorcode=\"%d\"",
+                                      static_cast<int>(event->error_code));
     }
     app_body = base::StringPrintf(
         "        <event eventtype=\"%d\" eventresult=\"%d\"%s></event>\n",
@@ -412,7 +413,7 @@
   if (ping_only_ &&
       !ShouldPing(ping_active_days_) &&
       !ShouldPing(ping_roll_call_days_)) {
-    processor_->ActionComplete(this, kErrorCodeSuccess);
+    processor_->ActionComplete(this, ErrorCode::kSuccess);
     return;
   }
 
@@ -535,7 +536,7 @@
   scoped_ptr<xmlXPathObject, ScopedPtrXmlXPathObjectFree>
       xpath_nodeset(GetNodeSet(doc, ConstXMLStr(kUpdatecheckNodeXpath)));
   if (!xpath_nodeset.get()) {
-    completer->set_code(kErrorCodeOmahaResponseInvalid);
+    completer->set_code(ErrorCode::kOmahaResponseInvalid);
     return false;
   }
 
@@ -603,7 +604,7 @@
   // Get status.
   if (!xmlHasProp(update_check_node, ConstXMLStr("status"))) {
     LOG(ERROR) << "Omaha Response missing status";
-    completer->set_code(kErrorCodeOmahaResponseInvalid);
+    completer->set_code(ErrorCode::kOmahaResponseInvalid);
     return false;
   }
 
@@ -612,13 +613,13 @@
     LOG(INFO) << "No update.";
     output_object->update_exists = false;
     SetOutputObject(*output_object);
-    completer->set_code(kErrorCodeSuccess);
+    completer->set_code(ErrorCode::kSuccess);
     return false;
   }
 
   if (status != "ok") {
     LOG(ERROR) << "Unknown Omaha response status: " << status;
-    completer->set_code(kErrorCodeOmahaResponseInvalid);
+    completer->set_code(ErrorCode::kOmahaResponseInvalid);
     return false;
   }
 
@@ -634,7 +635,7 @@
   scoped_ptr<xmlXPathObject, ScopedPtrXmlXPathObjectFree>
       xpath_nodeset(GetNodeSet(doc, ConstXMLStr(kUpdateUrlNodeXPath)));
   if (!xpath_nodeset.get()) {
-    completer->set_code(kErrorCodeOmahaResponseInvalid);
+    completer->set_code(ErrorCode::kOmahaResponseInvalid);
     return false;
   }
 
@@ -649,7 +650,7 @@
     const string codebase(XmlGetProperty(url_node, "codebase"));
     if (codebase.empty()) {
       LOG(ERROR) << "Omaha Response URL has empty codebase";
-      completer->set_code(kErrorCodeOmahaResponseInvalid);
+      completer->set_code(ErrorCode::kOmahaResponseInvalid);
       return false;
     }
     output_object->payload_urls.push_back(codebase);
@@ -668,7 +669,7 @@
   scoped_ptr<xmlXPathObject, ScopedPtrXmlXPathObjectFree>
       xpath_nodeset(GetNodeSet(doc, ConstXMLStr(kPackageNodeXPath)));
   if (!xpath_nodeset.get()) {
-    completer->set_code(kErrorCodeOmahaResponseInvalid);
+    completer->set_code(ErrorCode::kOmahaResponseInvalid);
     return false;
   }
 
@@ -687,7 +688,7 @@
   LOG(INFO) << "Omaha Response package name = " << package_name;
   if (package_name.empty()) {
     LOG(ERROR) << "Omaha Response has empty package name";
-    completer->set_code(kErrorCodeOmahaResponseInvalid);
+    completer->set_code(ErrorCode::kOmahaResponseInvalid);
     return false;
   }
 
@@ -701,7 +702,7 @@
   off_t size = ParseInt(XmlGetProperty(package_node, "size"));
   if (size <= 0) {
     LOG(ERROR) << "Omaha Response has invalid payload size: " << size;
-    completer->set_code(kErrorCodeOmahaResponseInvalid);
+    completer->set_code(ErrorCode::kOmahaResponseInvalid);
     return false;
   }
   output_object->size = size;
@@ -723,7 +724,7 @@
   scoped_ptr<xmlXPathObject, ScopedPtrXmlXPathObjectFree>
       xpath_manifest_nodeset(GetNodeSet(doc, ConstXMLStr(kManifestNodeXPath)));
   if (!xpath_manifest_nodeset.get()) {
-    completer->set_code(kErrorCodeOmahaResponseInvalid);
+    completer->set_code(ErrorCode::kOmahaResponseInvalid);
     return false;
   }
 
@@ -737,7 +738,7 @@
   output_object->version = XmlGetProperty(manifest_node, kTagVersion);
   if (output_object->version.empty()) {
     LOG(ERROR) << "Omaha Response does not have version in manifest!";
-    completer->set_code(kErrorCodeOmahaResponseInvalid);
+    completer->set_code(ErrorCode::kOmahaResponseInvalid);
     return false;
   }
 
@@ -748,7 +749,7 @@
   scoped_ptr<xmlXPathObject, ScopedPtrXmlXPathObjectFree>
       xpath_action_nodeset(GetNodeSet(doc, ConstXMLStr(kActionNodeXPath)));
   if (!xpath_action_nodeset.get()) {
-    completer->set_code(kErrorCodeOmahaResponseInvalid);
+    completer->set_code(ErrorCode::kOmahaResponseInvalid);
     return false;
   }
 
@@ -772,14 +773,14 @@
 
   if (!pie_action_node) {
     LOG(ERROR) << "Omaha Response has no postinstall event action";
-    completer->set_code(kErrorCodeOmahaResponseInvalid);
+    completer->set_code(ErrorCode::kOmahaResponseInvalid);
     return false;
   }
 
   output_object->hash = XmlGetProperty(pie_action_node, kTagSha256);
   if (output_object->hash.empty()) {
     LOG(ERROR) << "Omaha Response has empty sha256 value";
-    completer->set_code(kErrorCodeOmahaResponseInvalid);
+    completer->set_code(ErrorCode::kOmahaResponseInvalid);
     return false;
   }
 
@@ -830,7 +831,7 @@
       LOG(INFO) << "Signalling Crash Reporter.";
       utils::ScheduleCrashReporterUpload();
     }
-    completer.set_code(kErrorCodeSuccess);
+    completer.set_code(ErrorCode::kSuccess);
     return;
   }
 
@@ -842,7 +843,7 @@
       code = 999;
     }
     completer.set_code(static_cast<ErrorCode>(
-        kErrorCodeOmahaRequestHTTPResponseBase + code));
+        static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + code));
     return;
   }
 
@@ -852,8 +853,8 @@
   if (!doc.get()) {
     LOG(ERROR) << "Omaha response not valid XML";
     completer.set_code(response_buffer_.empty() ?
-                       kErrorCodeOmahaRequestEmptyResponseError :
-                       kErrorCodeOmahaRequestXMLParseError);
+                       ErrorCode::kOmahaRequestEmptyResponseError :
+                       ErrorCode::kOmahaRequestXMLParseError);
     return;
   }
 
@@ -870,7 +871,7 @@
   if (!HasOutputPipe()) {
     // Just set success to whether or not the http transfer succeeded,
     // which must be true at this point in the code.
-    completer.set_code(kErrorCodeSuccess);
+    completer.set_code(ErrorCode::kSuccess);
     return;
   }
 
@@ -882,7 +883,7 @@
 
   if (ShouldIgnoreUpdate(output_object)) {
     output_object.update_exists = false;
-    completer.set_code(kErrorCodeOmahaUpdateIgnoredPerPolicy);
+    completer.set_code(ErrorCode::kOmahaUpdateIgnoredPerPolicy);
     return;
   }
 
@@ -942,7 +943,7 @@
   if (ShouldDeferDownload(&output_object)) {
     output_object.update_exists = false;
     LOG(INFO) << "Ignoring Omaha updates as updates are deferred by policy.";
-    completer.set_code(kErrorCodeOmahaUpdateDeferredPerPolicy);
+    completer.set_code(ErrorCode::kOmahaUpdateDeferredPerPolicy);
     return;
   }
 
@@ -950,10 +951,10 @@
     output_object.update_exists = false;
     LOG(INFO) << "Ignoring Omaha updates in order to backoff our retry "
               << "attempts";
-    completer.set_code(kErrorCodeOmahaUpdateDeferredForBackoff);
+    completer.set_code(ErrorCode::kOmahaUpdateDeferredForBackoff);
     return;
   }
-  completer.set_code(kErrorCodeSuccess);
+  completer.set_code(ErrorCode::kSuccess);
 }
 
 void OmahaRequestAction::OnLookupPayloadViaP2PCompleted(const string& url) {
@@ -1303,7 +1304,7 @@
 
   // Regular update attempt.
   switch (code) {
-  case kErrorCodeSuccess:
+  case ErrorCode::kSuccess:
     // OK, we parsed the response successfully but that does
     // necessarily mean that an update is available.
     if (HasOutputPipe()) {
@@ -1319,17 +1320,17 @@
     }
     break;
 
-  case kErrorCodeOmahaUpdateIgnoredPerPolicy:
+  case ErrorCode::kOmahaUpdateIgnoredPerPolicy:
     result = metrics::CheckResult::kUpdateAvailable;
     reaction = metrics::CheckReaction::kIgnored;
     break;
 
-  case kErrorCodeOmahaUpdateDeferredPerPolicy:
+  case ErrorCode::kOmahaUpdateDeferredPerPolicy:
     result = metrics::CheckResult::kUpdateAvailable;
     reaction = metrics::CheckReaction::kDeferring;
     break;
 
-  case kErrorCodeOmahaUpdateDeferredForBackoff:
+  case ErrorCode::kOmahaUpdateDeferredForBackoff:
     result = metrics::CheckResult::kUpdateAvailable;
     reaction = metrics::CheckReaction::kBackingOff;
     break;