/* $Id$
 *
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to you under the Apache License, Version
 * 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


#ifndef __ETCHVALUEFACTORY_H__
#define __ETCHVALUEFACTORY_H__

#include "common/EtchString.h"
#include "serialization/EtchLevel.h"
#include "serialization/EtchField.h"

class EtchStructValue;
class EtchMessage;
class EtchType;

/**
 * Interface which defines the value factory which helps
 * the idl compiler serialize and deserialize messages,
 * convert values, etc.
 */


class EtchValueFactory : public EtchObject {
public:

  /**
   * EtchObjectType for EtchValueFactory.
   */
  static const EtchObjectType* TYPE();

  /**
   * Default Constructor
   */
  EtchValueFactory();

  /**
   * Copy Constructor
   */
  EtchValueFactory(const EtchValueFactory& other);

  /**
   * Destructor
   */
  virtual ~EtchValueFactory() {

  }

  /**
   * Translates a type id into the appropriate Type object. If the type does
   * not exist, and if dynamic typing is enabled, adds it to the dynamic types.
   * @param id a type id.
   * @param result a output buffer.
   */
  virtual status_t getType(capu::uint32_t id, EtchType *&result) = 0;

  /**
   * Translates a type name into the appropriate Type object. If the type does
   * not exist, and if dynamic typing is enabled, adds it to the dynamic types.
   * @param name a type name.
   * @param result a output buffer.
   */
  virtual status_t getType(EtchString &name, EtchType *&result) = 0;

  /**
   * Adds the type if it doesn't already exist. Use this to dynamically add
   * types to a ValueFactory. The type is per instance of the ValueFactory,
   * not global. Not available if dynamic typing is locked.
   * @param type
   */
  virtual status_t addType(EtchType *type) = 0;

  /**
   * Locks the dynamic typing so that no new types may be created by addType
   * or getType.
   */
  virtual status_t lockDynamicTypes() = 0;

  /**
   * Unlocks the dynamic typing so that new types may be created by addType
   * or getType.
   */
  virtual status_t unlockDynamicTypes() = 0;


  ////////////////
  // MESSAGE ID //
  ////////////////

  /**
   * @param msg the message whose well-known message-id field is to be
   * returned.
   * @param the value of the well-known message-id field. This is a
   * unique identifier for this message on a particular transport
   * during a particular session. If there is no well-known message-id
   * field defined, or if the message-id field has not been set, then
   * return null.
   * @return ETCH_OK if successfully getted
   *         ETCH_EINVAL if msg is null
   *         ETCH_ERROR if it is not found
   */
  virtual status_t getMessageId(EtchMessage *msg, capu::int64_t &result) = 0;

  /**
   * Sets the value of the well-known message-id field. This is a
   * unique identifier for this message on a particular transport
   * during a particular session. If there is no well-known message-id
   * field defined then nothing is done. If msgid is null, then the
   * field is cleared.
   * @param msg the message whose well-known message-id field is to
   * be set.
   * @param msgid the value of the well-known message-id field.
   * @return ETCH_EINVAL if msg is null
   *         ETCH_OK otherwise
   */
  virtual status_t setMessageId(EtchMessage *msg, capu::int64_t msgid) = 0;

  /**
   * @return well-known message field for message id.
   */
  virtual EtchField get_mf__messageId() = 0;

  /////////////////
  // IN REPLY TO //
  /////////////////

  /**
   * @param msg the message whose well-known in-reply-to field is to
   * be returned.
   * @param result output buffer
   * @return ETCH_OK if successfully getted
   *         ETCH_EINVAL if msg is null
   *         ETCH_ERROR if it is not found
   */
  virtual status_t getInReplyToMessageId(EtchMessage *msg, capu::int64_t &result) = 0;

  /**
   * @param msg the message whose well-known in-reply-to field is to
   * be set.
   * @param msgid the value of the well-known in-reply-to field. If
   * there is no well-known in-reply-to field defined then nothing
   * is done. If msgid is null, then the field is cleared.
   * @return ETCH_EINVAL if msg is null
   *         ETCH_OK otherwise
   */
  virtual status_t setInReplyToMessageId(EtchMessage *msg, capu::int64_t msgid) = 0;

  /**
   * @return well-known message field for in reply to.
   */
  virtual EtchField get_mf__inReplyTo() = 0;

  //////////////////////
  // VALUE CONVERSION //
  //////////////////////

  /**
   * Converts a value to a struct value representation to be exported
   * to a tagged data output.
   * @param value a custom type defined by a service, or a well-known
   * @param result buffer to store result which contains a struct value representing the value.
   * standard type (e.g., date).
   * @return ETCH_ERROR if the type cannot be exported.
   *         ETCH_OK otherwise
   */
  virtual status_t exportCustomValue(capu::SmartPointer<EtchObject> value, EtchStructValue *&result) = 0;

  /**
   * Converts a struct value imported from a tagged data input to
   * a normal type.
   * @param value a struct value representation of a custom type, or a well known standard type.
   * @param result buffer to store result which contains a custom type, or a well known standard type.
   * @return ETCH_ERROR if the type cannot be imported.
   *         ETCH_OK otherwise
   */
  virtual status_t importCustomValue(EtchStructValue* value, capu::SmartPointer<EtchObject> &result) = 0;

  /**
   * @param c the class of a custom value.
   * @param type the class of a custom value.
   * @return ETCH_OK if the type is found correctly.
   *         ETCH_EINVAL otherwise
   */
  virtual status_t getCustomStructType(const EtchObjectType *c, EtchType *&type) = 0;

  /**
   * Returns the current string encoding.
   * @return string encoding
   */
  virtual EtchString getStringEncoding();

  /**
   * @return well-known message type for exception thrown by one-way
   * message.
   */
  virtual EtchType* get_mt__exception() = 0;

  /**
   * @return the validation level of field StructValue.put and TaggedDataOutput
   */
  virtual EtchLevel getLevel() = 0;

  /**
   * Sets the validation level of field StructValue.put and TaggedDataOutput
   * @param level
   * @return the old value
   */
  virtual EtchLevel setLevel(EtchLevel level) = 0;

};

#endif /* ETCHVALUEFACTORY_H */

