// 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.
//
// Functions exported by the RLZ DLL.

#include "rlz/lib/rlz_lib.h"

#define RLZ_DLL_EXPORT extern "C" __declspec(dllexport)

RLZ_DLL_EXPORT bool RecordProductEvent(rlz_lib::Product product,
                                       rlz_lib::AccessPoint point,
                                       rlz_lib::Event event_id) {
  return rlz_lib::RecordProductEvent(product, point, event_id);
}

RLZ_DLL_EXPORT bool GetProductEventsAsCgi(rlz_lib::Product product,
                                          char* unescaped_cgi,
                                          size_t unescaped_cgi_size) {
  return rlz_lib::GetProductEventsAsCgi(product, unescaped_cgi,
                                        unescaped_cgi_size);
}
RLZ_DLL_EXPORT bool ClearAllProductEvents(rlz_lib::Product product) {
  return rlz_lib::ClearAllProductEvents(product);
}

RLZ_DLL_EXPORT bool ClearProductEvent(rlz_lib::Product product,
                                      rlz_lib::AccessPoint point,
                                      rlz_lib::Event event_id) {
  return rlz_lib::ClearProductEvent(product, point, event_id);
}

RLZ_DLL_EXPORT bool GetAccessPointRlz(rlz_lib::AccessPoint point,
                                      char* rlz,
                                      size_t rlz_size) {
  return rlz_lib::GetAccessPointRlz(point, rlz, rlz_size);
}

RLZ_DLL_EXPORT bool SetAccessPointRlz(rlz_lib::AccessPoint point,
                                      const char* new_rlz) {
  return rlz_lib::SetAccessPointRlz(point, new_rlz);
}

RLZ_DLL_EXPORT bool CreateMachineState() {
  return rlz_lib::CreateMachineState();
}

RLZ_DLL_EXPORT bool SetMachineDealCode(const char* dcc) {
  return rlz_lib::SetMachineDealCode(dcc);
}

RLZ_DLL_EXPORT bool GetMachineDealCodeAsCgi(char* cgi, size_t cgi_size) {
  return rlz_lib::GetMachineDealCodeAsCgi(cgi, cgi_size);
}

RLZ_DLL_EXPORT bool GetMachineDealCode2(char* dcc, size_t dcc_size) {
  return rlz_lib::GetMachineDealCode(dcc, dcc_size);
}

RLZ_DLL_EXPORT bool GetPingParams(rlz_lib::Product product,
                                  const rlz_lib::AccessPoint* access_points,
                                  char* unescaped_cgi,
                                  size_t unescaped_cgi_size) {
  return rlz_lib::GetPingParams(product, access_points, unescaped_cgi,
                                unescaped_cgi_size);
}

RLZ_DLL_EXPORT bool ParsePingResponse(rlz_lib::Product product,
                                      const char* response) {
  return rlz_lib::ParsePingResponse(product, response);
}

RLZ_DLL_EXPORT bool IsPingResponseValid(const char* response,
                                        int* checksum_idx) {
  return rlz_lib::IsPingResponseValid(response, checksum_idx);
}

RLZ_DLL_EXPORT bool SetMachineDealCodeFromPingResponse(const char* response) {
  return rlz_lib::SetMachineDealCodeFromPingResponse(response);
}

RLZ_DLL_EXPORT bool SendFinancialPing(rlz_lib::Product product,
                                      const rlz_lib::AccessPoint* access_points,
                                      const char* product_signature,
                                      const char* product_brand,
                                      const char* product_id,
                                      const char* product_lang,
                                      bool exclude_machine_id) {
  return rlz_lib::SendFinancialPing(product, access_points, product_signature,
      product_brand, product_id, product_lang, exclude_machine_id);
}

RLZ_DLL_EXPORT bool SendFinancialPingNoDelay(
    rlz_lib::Product product,
    const rlz_lib::AccessPoint* access_points,
    const char* product_signature,
    const char* product_brand,
    const char* product_id,
    const char* product_lang,
    bool exclude_machine_id) {
  return rlz_lib::SendFinancialPing(product, access_points, product_signature,
      product_brand, product_id, product_lang, exclude_machine_id, true);
}

RLZ_DLL_EXPORT void ClearProductState(
    rlz_lib::Product product, const rlz_lib::AccessPoint* access_points) {
  return rlz_lib::ClearProductState(product, access_points);
}
