///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Copyright (c) 2000-2019 Ericsson Telecom AB                               //
//                                                                           //
// All rights reserved. This program and the accompanying materials          //
// are made available under the terms of the Eclipse Public License v2.0     //
// which accompanies this distribution, and is available at                  //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html                                 //
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////
//  Module: EPTF_CLL_DsRestAPI_Storage_Definitions
// 
//  Purpose:
//    This module contains definitions of EPTF_CLL_DsRestAPI_Storage.
// 
//  Module depends on:
//    <EPTF_CLL_Base_Definitions>
//    <EPTF_CLL_Variable_Definitions>
// 
//  Current Owner:
//    Tamas Kis (ekistam)
// 
//  Last Review Date:
//    -
//
//  Detailed Comments:
//    -
//
///////////////////////////////////////////////////////////////
module EPTF_CLL_DsRestAPI_Storage_Definitions {
  import from EPTF_CLL_Base_Definitions all;
  import from EPTF_CLL_Variable_Definitions all;
  import from EPTF_CLL_HashMap_Definitions all;
  import from EPTF_CLL_Common_Definitions all;
  
  friend module EPTF_CLL_DsRestAPI_Filter_Functions;
  friend module EPTF_CLL_DsRestAPI_DSServer_Functions;

  ///////////////////////////////////////////////////////////////////////////////
  // Type: f_EPTF_CLL_DsRestAPI_Storage_PreStoredItem
  //
  // Purpose:
  //   Type for functions to call when content is saved
  //
  // Parameters:
  //   - pl_errorCode - *f_EPTF_CLL_DsRestAPI_Storage_ContentReady* - the error code
  //   - pl_dataValue - *EPTF_Var_DirectContent* - the content
  //   - userData - *EPTF_IntegerList* - the user data
  //       
  ///////////////////////////////////////////////////////////////////////////////
  type function f_EPTF_CLL_DsRestAPI_Storage_ContentReady(in integer pl_errorCode, in EPTF_Var_DirectContent pl_dataValue, in EPTF_IntegerList pl_userData) runs on self;
  
  ///////////////////////////////////////////////////////////////////////////////
  // Type: f_EPTF_CLL_DsRestAPI_Storage_PreStoredItem
  //
  // Purpose:
  //   Type for pre storage items
  //
  // Elements:
  //   - contentReady - *f_EPTF_CLL_DsRestAPI_Storage_ContentReady* - the function to call when the content arrives
  //   - userData - *EPTF_IntegerList* - the user data of the function call
  //       
  ///////////////////////////////////////////////////////////////////////////////
  type record EPTF_CLL_DsRestAPI_Storage_PreStoredItem {
    f_EPTF_CLL_DsRestAPI_Storage_ContentReady contentReady,
    EPTF_IntegerList userData
  }
  
  ///////////////////////////////////////////////////////////
  // Type: f_EPTF_CLL_DsRestAPI_Storage_PreStoredItems
  //
  // Purpose:
  //   Type for storing a list of <f_EPTF_CLL_DsRestAPI_Storage_PreStoredItem> items
  //
  // Elements:
  //   <f_EPTF_CLL_DsRestAPI_Storage_PreStoredItem>
  ///////////////////////////////////////////////////////////
  type record of EPTF_CLL_DsRestAPI_Storage_PreStoredItem EPTF_CLL_DsRestAPI_Storage_PreStoredItems;
  
  type union EPTF_CLL_DsRestAPI_Storage_Item {
    EPTF_CLL_DsRestAPI_Storage_PreStoredItems preStoredItems,
    EPTF_Var_DirectContent content
  }
  
  ///////////////////////////////////////////////////////////
  // Type: f_EPTF_CLL_DsRestAPI_Storage_Items
  //
  // Purpose:
  //   Type for storing a list of <f_EPTF_CLL_DsRestAPI_Storage_Item> items
  //
  // Elements:
  //   <f_EPTF_CLL_DsRestAPI_Storage_Item>
  ///////////////////////////////////////////////////////////
  type record of EPTF_CLL_DsRestAPI_Storage_Item f_EPTF_CLL_DsRestAPI_Storage_Items;

  ///////////////////////////////////////////////////////////////////////////////
  // Type: EPTF_DsRestAPI_Storage
  //
  // Purpose:
  //   Type for storage items
  //
  // Elements:
  //   - storedContents - *f_EPTF_CLL_DsRestAPI_Storage_Items* - the list of stored contents
  //   - nextPosition - *integer* - the next free position in the list of stored contents
  //   - hashMapId - *integer* - the id of the hashmap that stores the indexes into the list of contents
  //       
  ///////////////////////////////////////////////////////////////////////////////
  type record EPTF_DsRestAPI_Storage {
    f_EPTF_CLL_DsRestAPI_Storage_Items storedContents,
    integer nextPosition,
    integer hashMapId
  }

  ///////////////////////////////////////////////////////////
  // Type: EPTF_DsRestAPI_Storage_Storages
  //
  // Purpose:
  //   Type for storing a list of <EPTF_DsRestAPI_Storage> items
  //
  // Elements:
  //   <EPTF_DsRestAPI_Storage>
  ///////////////////////////////////////////////////////////
  type record of EPTF_DsRestAPI_Storage EPTF_DsRestAPI_Storages;

  /////////////////////////////////////////////////////////////////////////////  
  //  Type: EPTF_DsRestAPI_Storage_CT
  //
  //  Purpose:
  //    The DataSource Server UI Model component
  //
  //  Extensions:
  //    EPTF_Base_CT, EPTF_Var_CT, EPTF_Logging_CT, EPTF_DataSource_CLI_CT, EPTF_DataSourceClient_CT
  //
  //  Variables:    
  //    - v_DsRestAPI_Storage_initialized - *boolean* - represents if the storage is initialized
  //    - v_DsRestAPI_Storages - *EPTF_DsRestAPI_Storages* - the storages that store the contents
  //
  //  Ports:  
  //    -
  //  Function types:
  //    -
  //
  //  Detailed Comments:
  //      -
  /////////////////////////////////////////////////////////////////////////////
  type component EPTF_DsRestAPI_Storage_CT extends EPTF_Base_CT, EPTF_HashMap_CT {
    private var boolean v_DsRestAPI_Storage_initialized := false;
    private var EPTF_DsRestAPI_Storages v_DsRestAPI_Storages := {};
  }
}