// 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.
//
// Key and value names of the location of the RLZ shared state.

#ifndef RLZ_LIB_LIB_VALUES_H_
#define RLZ_LIB_LIB_VALUES_H_

#include "base/basictypes.h"
#include "rlz/lib/rlz_enums.h"

namespace rlz_lib {

//
// Ping CGI arguments:
//
//   Events are reported as (without spaces):
//   kEventsCgiVariable = <AccessPoint1><Event1> kEventsCgiSeparator <P2><E2>...
//
//   Event responses from the server look like:
//   kEventsCgiVariable : <AccessPoint1><Event1> kEventsCgiSeparator <P2><E2>...
//
//   RLZ's are reported as (without spaces):
//   kRlzCgiVariable = <AccessPoint> <kRlzCgiIndicator> <RLZ value>
//        <kRlzCgiSeparator> <AP2><Indicator><V2><Separator> ....
//
//   RLZ responses from the server look like (without spaces):
//   kRlzCgiVariable<Access Point> :  <RLZ value>
//
//   DCC if reported should look like (without spaces):
//   kDccCgiVariable = <DCC Value>
//
//   RLS if reported should look like (without spaces):
//   kRlsCgiVariable = <RLS Value>
//
//   Machine ID if reported should look like (without spaces):
//   kMachineIdCgiVariable = <Machine ID Value>
//
//   A server response setting / confirming the DCC will look like (no spaces):
//   kDccCgiVariable : <DCC Value>
//
//   Each ping to the server must also contain kProtocolCgiArgument as well.
//
//   Pings may also contain (but not necessarily controlled by this Lib):
//   - The product signature: kProductSignatureCgiVariable = <signature>
//   - The product brand: kProductBrandCgiVariable = <brand>
//   - The product installation ID: kProductIdCgiVariable = <id>
extern const char kEventsCgiVariable[];
extern const char kStatefulEventsCgiVariable[];
extern const char kEventsCgiSeparator;

extern const char kDccCgiVariable[];
extern const char kProtocolCgiArgument[];

extern const char kProductSignatureCgiVariable[];
extern const char kProductBrandCgiVariable[];
extern const char kProductLanguageCgiVariable[];
extern const char kProductIdCgiVariable[];

extern const char kRlzCgiVariable[];
extern const char kRlzCgiSeparator[];
extern const char kRlzCgiIndicator[];

extern const char kRlsCgiVariable[];
extern const char kMachineIdCgiVariable[];
extern const char kSetDccResponseVariable[];

//
// Financial ping server information.
//

extern const char kFinancialPingPath[];
extern const char kFinancialServer[];

extern const int kFinancialPort;

extern const int64 kEventsPingInterval;
extern const int64 kNoEventsPingInterval;

extern const char kFinancialPingUserAgent[];
extern const char* kFinancialPingResponseObjects[];

//
// The names for AccessPoints and Events that we use MUST be the same
// as those used/understood by the server.
//
const char* GetAccessPointName(AccessPoint point);
bool GetAccessPointFromName(const char* name, AccessPoint* point);

const char* GetEventName(Event event);
bool GetEventFromName(const char* name, Event* event);

// The names for products are used only client-side.
const char* GetProductName(Product product);

}  // namespace rlz_lib

#endif  // RLZ_LIB_LIB_VALUES_H_
