// 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.
//
// Library functions related to the OEM Deal Confirmation Code.

#ifndef RLZ_WIN_LIB_MACHINE_DEAL_H_
#define RLZ_WIN_LIB_MACHINE_DEAL_H_

#include <string>
#include "rlz/lib/rlz_lib.h"

namespace rlz_lib {

class MachineDealCode {
 public:
  // Set the OEM Deal Confirmation Code (DCC). This information is used for RLZ
  // initalization. Must have write access to HKLM - SYSTEM or admin, unless
  // rlz_lib::CreateMachineState() has been successfully called.
  static bool Set(const char* dcc);

  // Get the OEM Deal Confirmation Code from the registry. Used to ping
  // the server.
  static bool Get(AccessPoint point,
                  char* dcc,
                  int dcc_size,
                  const wchar_t* sid = NULL);

  // Parses a ping response, checks if it is valid and sets the machine DCC
  // from the response. The response should also contain the current value of
  // the DCC to be considered valid.
  // Write access to HKLM (system / admin) needed, unless
  // rlz_lib::CreateMachineState() has been successfully called.
  static bool SetFromPingResponse(const char* response);

  // Gets the new DCC to set from a ping response. Returns true if the ping
  // response is valid. Sets has_new_dcc true if there is a new DCC value.
  static bool GetNewCodeFromPingResponse(const char* response,
                                         bool* has_new_dcc,
                                         char* new_dcc,
                                         int new_dcc_size);

  // Get the DCC cgi argument string to append to a daily or financial ping.
  static bool GetAsCgi(char* cgi, int cgi_size);

  // Get the machine code.
  static bool Get(char* dcc, int dcc_size);

 protected:
  // Clear the DCC value. Only for testing purposes.
  // Requires write access to HKLM, unless rlz_lib::CreateMachineState() has
  // been successfully called.
  static bool Clear();

  MachineDealCode() {}
  ~MachineDealCode() {}
};

}  // namespace rlz_lib

#endif  // RLZ_WIN_LIB_MACHINE_DEAL_H_
